diff -Nru vulkan-1.1.70+dfsg1/BUILD.md vulkan-1.1.73+dfsg/BUILD.md --- vulkan-1.1.70+dfsg1/BUILD.md 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/BUILD.md 2018-04-27 11:24:19.000000000 +0000 @@ -1,119 +1,238 @@ # Build Instructions -This document contains the instructions for building this repository on Linux and Windows. -This repository does not contain a Vulkan-capable driver. -Before proceeding, it is strongly recommended that you obtain a Vulkan driver from your graphics hardware vendor -and install it. +Instructions for building this repository on Linux, Windows, Android, and MacOS. + +## Index + +1. [Contributing](#contributing-to-the-repository) +2. [Repository Set-Up](#repository-set-up) +3. [Windows Build](#building-on-windows) +4. [Linux Build](#building-on-linux) +5. [Android Build](#building-on-android) +6. [MacOS build](#building-on-macos) + +## Contributing to the Repository + +If you intend to contribute, the preferred work flow is for you to develop +your contribution in a fork of this repository in your GitHub account and +then submit a pull request. +Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file in this repository for more details. + +## Repository Set-Up -## Contributing +### Display Drivers -If you intend to contribute, the preferred work flow is for you to develop your contribution -in a fork of this repo in your GitHub account and then submit a pull request. -Please see the [CONTRIBUTING](CONTRIBUTING.md) file in this repository for more details. +This repository does not contain a Vulkan-capable driver. +Before proceeding, it is strongly recommended that you obtain a Vulkan driver from your +graphics hardware vendor and install it properly. -## Git the Bits +### Download the Repository To create your local git repository: -``` -git clone https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers -``` - -## Linux Build - -The build process uses CMake to generate makefiles for this project. -The build generates the loader, layers, and tests. - -This repo has been built and tested on the two most recent Ubuntu LTS versions. Currently, the oldest supported -version is Ubuntu 14.04, meaning that the minimum supported compiler versions are GCC 4.8.2 and Clang 3.4, although -earlier versions may work. + + git clone https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers + +## Building On Windows + +### Windows Build Requirements + +Windows 7+ with the following software packages: + +- Microsoft Visual Studio 2013 Update 4 Professional, VS2015 (any version), or VS2017 (any version). +- [CMake](http://www.cmake.org/download/) + - Tell the installer to "Add CMake to the system PATH" environment variable. +- [Python 3](https://www.python.org/downloads) + - Select to install the optional sub-package to add Python to the system PATH + environment variable. + - Ensure the `pip` module is installed (it should be by default) + - Python3.3 or later is necessary for the Windows py.exe launcher that is used to select python3 + rather than python2 if both are installed +- [Git](http://git-scm.com/download/win) + - Tell the installer to allow it to be used for "Developer Prompt" as well as "Git Bash". + - Tell the installer to treat line endings "as is" (i.e. both DOS and Unix-style line endings). + - Install both the 32-bit and 64-bit versions, as the 64-bit installer does not install the + 32-bit libraries and tools. +- Notes for using [Cygwin](https://www.cygwin.com) + - First, in a Cygwin shell: + - `./update_external_sources.sh --no-build` + - Then, in a Visual Studio Developer Command Prompt: + - Ensure python3.x and CMake in are in the path + - Run `update_external_sources.bat --no-sync` + - Run build_windows_targets.bat cmake + +### Windows Build - Microsoft Visual Studio + +1. Open a Developer Command Prompt for VS201x +2. Change directory to `Vulkan-LoaderAndValidationLayers` -- the root of the cloned git repository +3. Run `update_external_sources.bat` -- this will download and build external components +4. Create a `build` directory, change into that directory, and run cmake + +For example, for VS2017 (generators for other versions are [specified here](#cmake-visual-studio-generators)): + + cmake -G "Visual Studio 15 2017 Win64" .. + +This will create a Windows solution file named `VULKAN.sln` in the build directory. + +Launch Visual Studio and open the "VULKAN.sln" solution file in the build folder. +You may select "Debug" or "Release" from the Solution Configurations drop-down list. +Start a build by selecting the Build->Build Solution menu item. +This solution copies the loader it built to each program's build directory +to ensure that the program uses the loader built from this solution. + +#### The Update External Sources Batch File + +Employing [optional parameters](#update-external-sources-optional-parameters) +to the **update_external_sources.bat** script can streamline repository set-up. + +### Windows Tests and Demos + +After making any changes to the repository, you should perform some quick sanity tests, +including the run_all_tests Powershell script and the cube demo with validation enabled. + +To run the validation test script, open a Powershell Console, +change to the build/tests directory, and run: + +For Release builds: + + .\run_all_tests.ps1 + +For Debug builds: + + .\run_all_tests.ps1 -Debug + +This script will run the following tests: + +- `vk_loader_validation_tests`: + Vulkan loader handle wrapping, allocation callback, and loader/layer interface tests +- `vk_layer_validation_tests`: + Test Vulkan validation layers +- `vkvalidatelayerdoc`: + Tests that validation database is up-to-date and is synchronized with the validation source code + +To run the Cube demo with validation in a Debug build configuration: + +- In the MSVC solution explorer, right-click on the `cube` project and select + `Set As Startup Project` +- Right click on cube again, select properties->Debugging->Command Arguments, change to + `--validate`, and save +- From the main menu, select Debug->Start Debugging, or from the toolbar click + `Local Windows Debugger` + +Other demos that can be found in the build/demos directory are: + +- `vulkaninfo`: Report GPU properties +- `smoketest`: A "smoke" test using more complex Vulkan rendering + +### Windows Notes + +#### CMake Visual Studio Generators + +The above example used Visual Studio 2017, and specified its generator as "Visual Studio 15 2017 Win64". +The chosen generator should match your Visual Studio version. Appropriate Visual Studio generators include: + +| Build Platform | 64-bit Generator | 32-bit Generator | +|------------------------------|-------------------------------|-------------------------| +| Microsoft Visual Studio 2013 | "Visual Studio 12 2013 Win64" | "Visual Studio 12 2013" | +| Microsoft Visual Studio 2015 | "Visual Studio 14 2015 Win64" | "Visual Studio 14 2015" | +| Microsoft Visual Studio 2017 | "Visual Studio 15 2017 Win64" | "Visual Studio 15 2017" | + +#### The Vulkan Loader Library + +Vulkan programs must be able to find and use the vulkan-1.dll library. +While several of the test and demo projects in the Windows solution set this up automatically, doing so manually may be necessary for custom projects or solutions. +Make sure the library is either installed in the C:\Windows\System32 folder, or that the PATH environment variable includes the folder where the library resides. + +To run Vulkan programs you must tell the Vulkan Loader where to find the libraries. +This is described in a `LoaderAndLayerInterface` document in the `loader` folder in this repository. +This describes both how ICDs and layers should be properly packaged, and how developers can point to ICDs and layers within their builds. + +## Building On Linux + +### Linux Build Requirements + +This repository has been built and tested on the two most recent Ubuntu LTS versions. +Currently, the oldest supported version is Ubuntu 14.04, meaning that the minimum supported compiler versions are GCC 4.8.2 and Clang 3.4, although earlier versions may work. It should be straightforward to adapt this repository to other Linux distributions. +**Required Package List:** + + sudo apt-get install git cmake build-essential libx11-xcb-dev libxkbcommon-dev libmirclient-dev libwayland-dev libxrandr-dev + +### Linux Build + +Example debug build (Note that the update\_external\_sources script used below builds external tools into predefined locations. +See **Loader and Validation Layer Dependencies** for more information and other options): + +1. In a Linux terminal, `cd Vulkan-LoaderAndValidationLayers` -- the root of the + cloned git repository +2. Execute `./update_external_sources.sh` -- this will download and build external components +3. Create a `build` directory, change into that directory, and run cmake: + + mkdir build + cd build + cmake -DCMAKE_BUILD_TYPE=Debug .. + +4. Run `make -j8` to begin the build + +If your build system supports ccache, you can enable that via CMake option `-DUSE_CCACHE=On` + +#### The Update External Sources script + +Employing [optional parameters](#update-external-sources-optional-parameters) +to the **update_external_sources.sh** script can streamline repository set-up. + +#### Using the new loader and layers + + export LD_LIBRARY_PATH=/build/loader + export VK_LAYER_PATH=/build/layers -These packages are needed to build this repository: -``` -sudo apt-get install git cmake build-essential bison libx11-xcb-dev libxkbcommon-dev libmirclient-dev libwayland-dev libxrandr-dev -``` - -Example debug build (Note that the update\_external\_sources script used below builds external tools into predefined locations. See **Loader and Validation Layer Dependencies** for more information and other options): -``` -cd Vulkan-LoaderAndValidationLayers # cd to the root of the cloned git repository -./update_external_sources.sh -cmake -H. -Bdbuild -DCMAKE_BUILD_TYPE=Debug -cd dbuild -make -``` - -If your build system supports ccache, you can enable that via cmake option `-DUSE_CCACHE=On` - -If you have installed a Vulkan driver obtained from your graphics hardware vendor, the install process should -have configured the driver so that the Vulkan loader can find and load it. - -If you want to use the loader and layers that you have just built: -``` -export LD_LIBRARY_PATH=/dbuild/loader -export VK_LAYER_PATH=/dbuild/layers -``` You can run the `vulkaninfo` application to see which driver, loader and layers are being used. -The `LoaderAndLayerInterface` document in the `loader` folder in this repository is a specification that -describes both how ICDs and layers should be properly -packaged, and how developers can point to ICDs and layers within their builds. +The `LoaderAndLayerInterface` document in the `loader` folder in this repository +is a specification that describes both how ICDs and layers should be properly packaged, +and how developers can point to ICDs and layers within their builds. ### WSI Support Build Options -By default, the Vulkan Loader and Validation Layers are built with support for all 4 Vulkan-defined WSI display systems, Xcb, Xlib, Wayland, and Mir. It is recommended to build these modules with support for these -display systems to maximize their usability across Linux platforms. -If it is necessary to build these modules without support for one of the display systems, the appropriate CMake option of the form BUILD_WSI_xxx_SUPPORT can be set to OFF. See the top-level CMakeLists.txt file for more info. + +By default, the Vulkan Loader and Validation Layers are built with support for all 4 Vulkan-defined WSI display servers: Xcb, Xlib, Wayland, and Mir. +It is recommended to build the repository components with support for these display servers to maximize their usability across Linux platforms. +If it is necessary to build these modules without support for one of the display servers, the appropriate CMake option of the form `BUILD_WSI_xxx_SUPPORT` can be set to `OFF`. +See the top-level CMakeLists.txt file for more info. ### Linux Install to System Directories -Installing the files resulting from your build to the systems directories is optional since -environment variables can usually be used instead to locate the binaries. +Installing the files resulting from your build to the systems directories is optional since environment variables can usually be used instead to locate the binaries. There are also risks with interfering with binaries installed by packages. -If you are certain that you would like to install your binaries to system directories, -you can proceed with these instructions. +If you are certain that you would like to install your binaries to system directories, you can proceed with these instructions. -Assuming that you've built the code as described above and the current directory is still `dbuild`, -you can execute: +Assuming that you've built the code as described above and the current directory is still `build`, you can execute: -``` -sudo make install -``` + sudo make install This command installs files to: -* `/usr/local/include/vulkan`: Vulkan include files -* `/usr/local/lib`: Vulkan loader and layers shared objects -* `/usr/local/bin`: vulkaninfo application -* `/usr/local/etc/vulkan/explicit_layer.d`: Layer JSON files +- `/usr/local/include/vulkan`: Vulkan include files +- `/usr/local/lib`: Vulkan loader and layers shared objects +- `/usr/local/bin`: vulkaninfo application +- `/usr/local/etc/vulkan/explicit_layer.d`: Layer JSON files You may need to run `ldconfig` in order to refresh the system loader search cache on some Linux systems. -The list of installed files appears in the build directory in a file named `install_manifest.txt`. -You can easily remove the installed files with: +You can further customize the installation location by setting additional CMake variables to override their defaults. +For example, if you would like to install to `/tmp/build` instead of `/usr/local`, on your CMake command line specify: -``` -cat install_manifest.txt | sudo xargs rm -``` - -You can further customize the installation location by setting additional CMake variables -to override their defaults. -For example, if you would like to install to `/tmp/build` instead of `/usr/local`, specify: - -``` --DCMAKE_INSTALL_PREFIX=/tmp/build --DDEST_DIR=/tmp/build -``` - -on your CMake command line and run `make install` as before. -The install step places the files in `/tmp/build`. - -Using the `CMAKE_INSTALL_PREFIX` to customize the install location also modifies the -loader search paths to include searching for layers in the specified install location. -In this example, setting `CMAKE_INSTALL_PREFIX` to `/tmp/build` causes the loader to -search `/tmp/build/etc/vulkan/explicit_layer.d` and `/tmp/build/share/vulkan/explicit_layer.d` + -DCMAKE_INSTALL_PREFIX=/tmp/build + -DDEST_DIR=/tmp/build + +Then run `make install` as before. The install step places the files in `/tmp/build`. + +Using the `CMAKE_INSTALL_PREFIX` to customize the install location also modifies +the loader search paths to include searching for layers in the specified install location. +In this example, setting `CMAKE_INSTALL_PREFIX` to `/tmp/build` causes the loader to search +`/tmp/build/etc/vulkan/explicit_layer.d` and `/tmp/build/share/vulkan/explicit_layer.d` for the layer JSON files. -The loader also searches the "standard" system locations of `/etc/vulkan/explicit_layer.d` -and `/usr/share/vulkan/explicit_layer.d` after searching the two locations under `/tmp/build`. +The loader also searches the "standard" system locations of `/etc/vulkan/explicit_layer.d` and +`/usr/share/vulkan/explicit_layer.d` after searching the two locations under `/tmp/build`. You can further customize the installation directories by using the CMake variables `CMAKE_INSTALL_SYSCONFDIR` to rename the `etc` directory and `CMAKE_INSTALL_DATADIR` @@ -122,133 +241,98 @@ See the CMake documentation for more details on using these variables to further customize your installation. -Also see the `LoaderAndLayerInterface` document in the `loader` folder in this repository for more -information about loader operation. +Also see the `LoaderAndLayerInterface` document in the `loader` folder in this +repository for more information about loader operation. -Note that some executables in this repository (e.g., `cube`) use the "rpath" linker directive -to load the Vulkan loader from the build directory, `dbuild` in this example. -This means that even after installing the loader to the system directories, these executables -still use the loader from the build directory. +Note that some executables in this repository (e.g., `cube`) use the "rpath" linker directive to +load the Vulkan loader from the build directory, `build` in this example. +This means that even after installing the loader to the system directories, these executables still +use the loader from the build directory. -### Linux 32-bit support +### Linux Uninstall -Usage of this repository's contents in 32-bit Linux environments is not officially supported. -However, since this repository is supported on 32-bit Windows, these modules should generally -work on 32-bit Linux. +To uninstall the files from the system directories, you can execute: -Here are some notes for building 32-bit targets on a 64-bit Ubuntu "reference" platform: + sudo make uninstall -If not already installed, install the following 32-bit development libraries: +### Linux Tests and Demos -`gcc-multilib g++-multilib libx11-dev:i386` +After making any changes to the repository, you should perform some quick sanity tests, including +the run_all_tests shell script and the cube demo with validation enabled. -This list may vary depending on your distro and which windowing systems you are building for. +To run the **validation test script**, in a terminal change to the build/tests directory and run: -Set up your environment for building 32-bit targets: + VK_LAYER_PATH=../layers ./run_all_tests.sh -``` -export ASFLAGS=--32 -export CFLAGS=-m32 -export CXXFLAGS=-m32 -export PKG_CONFIG_LIBDIR=/usr/lib/i386-linux-gnu -``` - -Again, your PKG_CONFIG configuration may be different, depending on your distro. - -If the libraries in the `external` directory have already been built -for 64-bit targets, -delete or "clean" this directory and rebuild it with -the above settings using the `update_external_sources` shell script. -This is required because the libraries in `external` must be built for -32-bit in order to be usable by the rest of the components in the repository. +This script will run the following tests: -Finally, rebuild the repository using `cmake` and `make`, as explained above. +- `vk_loader_validation_tests`: Tests Vulkan Loader handle wrapping +- `vk_layer_validation_tests`: Test Vulkan validation layers +- `vkvalidatelayerdoc`: Tests that validation database is in up-to-date and in synchronization with + the validation source code -## Validation Test +To run the **Cube demo** with validation, in a terminal change to the `build/demos` +directory and run: -The test executables can be found in the dbuild/tests directory. -Some of the tests that are available: -- vk\_layer\_validation\_tests: Test Vulkan layers. + VK_LAYER_PATH=../layers ./cube --validate -There are also a few shell and Python scripts that run test collections (eg, -`run_all_tests.sh`). +Other demos that can be found in the `build/demos` directory are: -## Linux Demos +- `vulkaninfo`: report GPU properties +- `smoketest`: A "smoke" test using more complex Vulkan rendering -Some demos that can be found in the dbuild/demos directory are: -- vulkaninfo: report GPU properties -- cube: a textured spinning cube -- smoke/smoke: A "smoke" test using a more complex Vulkan demo +You can select which WSI subsystem is used to build the demos using a CMake option +called DEMOS_WSI_SELECTION. +Supported options are XCB (default), XLIB, WAYLAND, and MIR. +Note that you must build using the corresponding BUILD_WSI_*_SUPPORT enabled at the +base repository level (all SUPPORT options are ON by default). +For instance, creating a build that will use Xlib to build the demos, +your CMake command line might look like: -You can select which WSI subsystem is used to build the demos using a cmake option called DEMOS_WSI_SELECTION. -Supported options are XCB (default), XLIB, WAYLAND, and MIR. Note that you must build using the corresponding BUILD_WSI_*_SUPPORT enabled at the base repo level (all SUPPORT options are ON by default). -For instance, creating a build that will use Xlib to build the demos, your cmake command line might look like: + cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=Debug -DDEMOS_WSI_SELECTION=XLIB -cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=Debug -DDEMOS_WSI_SELECTION=XLIB +### Linux Notes -## Windows System Requirements +#### Linux 32-bit support -Windows 7+ with additional required software packages: +Usage of this repository's contents in 32-bit Linux environments is not officially supported. +However, since this repository is supported on 32-bit Windows, +these modules should generally work on 32-bit Linux. -- Microsoft Visual Studio 2013 Professional. Note: it is possible that lesser/older versions may work, but that has not been tested. -- [CMake](http://www.cmake.org/download/). Notes: - - Tell the installer to "Add CMake to the system PATH" environment variable. -- [Python 3](https://www.python.org/downloads). Notes: - - Select to install the optional sub-package to add Python to the system PATH environment variable. - - Ensure the pip module is installed (it should be by default) - - Need python3.3 or later to get the Windows py.exe launcher that is used to get python3 rather than python2 if both are installed on Windows - - 32 bit python works -- [Git](http://git-scm.com/download/win). - - Note: If you use Cygwin, you can normally use Cygwin's "git.exe", and "update\_external\_sources.sh --no-build" does support Cygwin's git. However, in order to use the "update\_external\_sources.bat" script, you must have this version. - - Tell the installer to allow it to be used for "Developer Prompt" as well as "Git Bash". - - Tell the installer to treat line endings "as is" (i.e. both DOS and Unix-style line endings). - - Install each a 32-bit and a 64-bit version, as the 64-bit installer does not install the 32-bit libraries and tools. -- glslang is required for demos and tests. - - [You can download and configure it (in a peer directory) here](https://github.com/KhronosGroup/glslang/blob/master/README.md) - - A windows batch file has been included that will pull and build the correct version. Run it from Developer Command Prompt for VS2013 like so: - - update\_external\_sources.bat --build-glslang (Note: see **Loader and Validation Layer Dependencies** below for other options) - -## Windows Build - MSVC - -Before building on Windows, you may want to modify the customize section in loader/loader.rc to so as to -set the version numbers and build description for your build. Doing so will set the information displayed -for the Properties->Details tab of the loader vulkan-1.dll file that is built. - -Build all Windows targets after installing required software and cloning the Loader and Validation Layer repo as described above by completing the following steps in a "Developer Command Prompt for VS2013" window (Note that the update\_external\_sources script used below builds external tools into predefined locations. See **Loader and Validation Layer Dependencies** for more information and other options): -``` -cd Vulkan-LoaderAndValidationLayers # cd to the root of the cloned git repository -update_external_sources.bat -build_windows_targets.bat -``` +Here are some notes for building 32-bit targets on a 64-bit Ubuntu "reference" platform: -At this point, you can use Windows Explorer to launch Visual Studio by double-clicking on the "VULKAN.sln" file in the \build folder. Once Visual Studio comes up, you can select "Debug" or "Release" from a drop-down list. You can start a build with either the menu (Build->Build Solution), or a keyboard shortcut (Ctrl+Shift+B). As part of the build process, Python scripts will create additional Visual Studio files and projects, along with additional source files. All of these auto-generated files are under the "build" folder. +If not already installed, install the following 32-bit development libraries: -Vulkan programs must be able to find and use the vulkan-1.dll library. Make sure it is either installed in the C:\Windows\System32 folder, or the PATH environment variable includes the folder that it is located in. +`gcc-multilib g++-multilib libx11-dev:i386` -To run Vulkan programs you must tell the icd loader where to find the libraries. -This is described in a `LoaderAndLayerInterface` document in the `loader` folder in this repository. -This specification describes both how ICDs and layers should be properly -packaged, and how developers can point to ICDs and layers within their builds. +This list may vary depending on your distribution and which windowing systems you are building for. -### Using Cygwin Git +Set up your environment for building 32-bit targets: -If you are using Cygwin git instead of win32-native git, you can use the *sh* script to sync using Cygwin's git (but not also build), then use the *bat* script to build (but not also sync). + export ASFLAGS=--32 + export CFLAGS=-m32 + export CXXFLAGS=-m32 + export PKG_CONFIG_LIBDIR=/usr/lib/i386-linux-gnu + +Again, your PKG_CONFIG configuration may be different, depending on your distribution. + +If the libraries in the `external` directory have already been built for 64-bit targets, +delete or "clean" this directory and rebuild it with the above settings using the +`update_external_sources` shell script. +This is required because the libraries in `external` must be built for 32-bit in order +to be usable by the rest of the components in the repository. -In a cygwin shell do this: -``` -./update_external_sources.sh --no-build -``` +Finally, rebuild the repository using `cmake` and `make`, as explained above. -Then in a Visual Studio Developer Command Prompt shell do this: -``` -update_external_sources.bat --no-sync -``` +## Building On Android -## Android Build Install the required tools for Linux and Windows covered above, then add the following. -### Android Studio + +### Android Build Requirements + - Install [Android Studio 2.3](https://developer.android.com/studio/index.html) or later. -- From the "Welcome to Android Studio" splash screen, add the following components using Configure > SDK Manager: +- From the "Welcome to Android Studio" splash screen, add the following components using + Configure > SDK Manager: - SDK Platforms > Android 6.0 and newer - SDK Tools > Android SDK Build-Tools - SDK Tools > Android SDK Platform-Tools @@ -256,177 +340,373 @@ - SDK Tools > NDK #### Add Android specifics to environment + For each of the below, you may need to specify a different build-tools version, as Android Studio will roll it forward fairly regularly. On Linux: -``` -export ANDROID_SDK_HOME=$HOME/Android/sdk -export ANDROID_NDK_HOME=$HOME/Android/sdk/ndk-bundle -export PATH=$ANDROID_SDK_HOME:$PATH -export PATH=$ANDROID_NDK_HOME:$PATH -export PATH=$ANDROID_SDK_HOME/build-tools/23.0.3:$PATH -``` + + export ANDROID_SDK_HOME=$HOME/Android/sdk + export ANDROID_NDK_HOME=$HOME/Android/sdk/ndk-bundle + export PATH=$ANDROID_SDK_HOME:$PATH + export PATH=$ANDROID_NDK_HOME:$PATH + export PATH=$ANDROID_SDK_HOME/build-tools/23.0.3:$PATH + On Windows: -``` -set ANDROID_SDK_HOME=%LOCALAPPDATA%\Android\sdk -set ANDROID_NDK_HOME=%LOCALAPPDATA%\Android\sdk\ndk-bundle -set PATH=%LOCALAPPDATA%\Android\sdk\ndk-bundle;%PATH% -``` + + set ANDROID_SDK_HOME=%LOCALAPPDATA%\Android\sdk + set ANDROID_NDK_HOME=%LOCALAPPDATA%\Android\sdk\ndk-bundle + set PATH=%LOCALAPPDATA%\Android\sdk\ndk-bundle;%PATH% + On OSX: -``` -export ANDROID_SDK_HOME=$HOME/Library/Android/sdk -export ANDROID_NDK_HOME=$HOME/Library/Android/sdk/ndk-bundle -export PATH=$ANDROID_NDK_PATH:$PATH -export PATH=$ANDROID_SDK_HOME/build-tools/23.0.3:$PATH -``` -Note: If jarsigner is missing from your platform, you can find it in the Android Studio install or in your Java installation. If you do not have Java, you can get it with something like the following: -``` -sudo apt-get install openjdk-8-jdk -``` - -### Additional OSX System Requirements -Tested on OSX version 10.12.4 - - Setup Homebrew and components -- Follow instructions on [brew.sh](http://brew.sh) to get homebrew installed. -``` -/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" -``` + + export ANDROID_SDK_HOME=$HOME/Library/Android/sdk + export ANDROID_NDK_HOME=$HOME/Library/Android/sdk/ndk-bundle + export PATH=$ANDROID_NDK_PATH:$PATH + export PATH=$ANDROID_SDK_HOME/build-tools/23.0.3:$PATH + +Note: If `jarsigner` is missing from your platform, you can find it in the +Android Studio install or in your Java installation. +If you do not have Java, you can get it with something like the following: + + sudo apt-get install openjdk-8-jdk + +#### Additional OSX System Requirements + +Tested on OSX version 10.13.3 + +Setup Homebrew and components + +- Follow instructions on [brew.sh](http://brew.sh) to get Homebrew installed. + + /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" + - Ensure Homebrew is at the beginning of your PATH: -``` -export PATH=/usr/local/bin:$PATH -``` -- Add packages with the following (may need refinement) -``` -brew install cmake python python3 git -``` -### Build steps for Android - -There are two options for building the Android layers. One using the SPIRV tools -provided as part of the Android NDK or build using upstream sources. -To build with SPIRV tools from the NDK, remove the build-android/third_party directory created -by running update_external_sources_android.sh, (or never run update_external_sources_android.sh). -Use the following script to build everything in the repo for Android, including validation layers, tests, demos, and APK packaging: -This script does retrieve and use the upstream SPRIV tools. -``` -cd build-android -./build_all.sh -``` + + export PATH=/usr/local/bin:$PATH + +- Add packages with the following: + + brew install cmake python + +### Android Build + +There are two options for building the Android layers. +Either using the SPIRV tools provided as part of the Android NDK, or using upstream sources. +To build with SPIRV tools from the NDK, remove the build-android/third_party directory created by +running update_external_sources_android.sh, (or avoid running update_external_sources_android.sh). +Use the following script to build everything in the repository for Android, including validation +layers, tests, demos, and APK packaging: This script does retrieve and use the upstream SPRIV tools. + + cd build-android + ./build_all.sh + Resulting validation layer binaries will be in build-android/libs. Test and demo APKs can be installed on production devices with: -``` -./install_all.sh [-s ] -``` + + ./install_all.sh [-s ] + Note that there are no equivalent scripts on Windows yet, that work needs to be completed. The following per platform commands can be used for layer only builds: + #### Linux and OSX + Follow the setup steps for Linux or OSX above, then from your terminal: -``` -cd build-android -./update_external_sources_android.sh --no-build -./android-generate.sh -ndk-build -j $(sysctl -n hw.ncpu) -``` + + cd build-android + ./update_external_sources_android.sh --no-build + ./android-generate.sh + ndk-build -j4 + #### Windows + Follow the setup steps for Windows above, then from Developer Command Prompt for VS2013: -``` -cd build-android -update_external_sources_android.bat -android-generate.bat -ndk-build -``` -#### Android tests + + cd build-android + update_external_sources_android.bat + android-generate.bat + ndk-build + +### Android Tests and Demos + +After making any changes to the repository you should perform some quick sanity tests, +including the layer validation tests and the cube and smoke demos with validation enabled. + +#### Run Layer Validation Tests + Use the following steps to build, install, and run the layer validation tests for Android: -``` -cd build-android -./build_all.sh -adb install -r bin/VulkanLayerValidationTests.apk -adb shell am start com.example.VulkanLayerValidationTests/android.app.NativeActivity -``` + + cd build-android + ./build_all.sh + adb install -r bin/VulkanLayerValidationTests.apk + adb shell am start com.example.VulkanLayerValidationTests/android.app.NativeActivity + Alternatively, you can use the test_APK script to install and run the layer validation tests: -``` -test_APK.sh -s -p -f -``` -#### Android demos + + test_APK.sh -s -p -f + +#### Run Cube and Smoke with Validation + Use the following steps to build, install, and run Cube and Smoke for Android: -``` -cd build-android -./build_all.sh -adb install -r ../demos/android/cube/bin/cube.apk -adb shell am start com.example.Cube/android.app.NativeActivity -``` -To build, install, and run Cube with validation layers, first build layers using steps above, then run: -``` -cd build-android -./build_all.sh -adb install -r ../demos/android/cube-with-layers/bin/cube-with-layers.apk -# Run without validation enabled: -adb shell am start com.example.CubeWithLayers/android.app.NativeActivity -# Run with validation enabled: -adb shell am start -a android.intent.action.MAIN -c android-intent.category.LAUNCH -n com.example.CubeWithLayers/android.app.NativeActivity --es args "--validate" -``` -vkjson_info for Android is built as an executable for devices with root access. - -To use, simply push it to the device and run it: -``` -./build_all.sh -adb push obj/local//vkjson_info /data/tmp/ -adb shell /data/tmp/vkjson_info -``` -The resulting json file will be found in: -``` -/sdcard/Android/.json -``` -To build, install, and run the Smoke demo for Android, run the following, and any -prompts that come back from the script: -``` -./update_external_sources.sh --glslang -cd demos/smoke/android -export ANDROID_SDK_HOME= -export ANDROID_NDK_HOME= -./build-and-install -adb shell am start -a android.intent.action.MAIN -c android-intent.category.LAUNCH -n com.example.Smoke/android.app.NativeActivity --es args "--validate" -``` + + cd build-android + ./build_all.sh + adb install -r ../demos/android/cube/bin/cube.apk + adb shell am start com.example.Cube/android.app.NativeActivity + +To build, install, and run Cube with validation layers, +first build layers using steps above, then run: + + cd build-android + ./build_all.sh + adb install -r ../demos/android/cube-with-layers/bin/cube-with-layers.apk + +##### Run without validation enabled + + adb shell am start com.example.CubeWithLayers/android.app.NativeActivity + +##### Run with validation enabled + + adb shell am start -a android.intent.action.MAIN -c android-intent.category.LAUNCH -n com.example.CubeWithLayers/android.app.NativeActivity --es args "--validate" + +To build, install, and run the Smoke demo for Android, run the following, and any prompts that come back from the script: + + ./update_external_sources.sh --glslang + cd demos/smoke/android + export ANDROID_SDK_HOME= + export ANDROID_NDK_HOME= + ./build-and-install + adb shell am start -a android.intent.action.MAIN -c android-intent.category.LAUNCH -n com.example.Smoke/android.app.NativeActivity --es args "--validate" + +## Building on MacOS + +### MacOS Build Requirements + +Tested on OSX version 10.12.6 + +Setup Homebrew and components + +- Follow instructions on [brew.sh](http://brew.sh) to get Homebrew installed. + + /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" + +- Ensure Homebrew is at the beginning of your PATH: + + export PATH=/usr/local/bin:$PATH + +- Add packages with the following (may need refinement) + + brew install cmake python python3 git + +### Clone the Repository + +Clone the Vulkan-LoaderAndValidationLayers repository: + + git clone https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers.git + +### Get the External Libraries + +Change to the cloned directory (`cd Vulkan-LoaderAndValidationLayers`) and run the script: + + ./update_external_sources.sh + +This script downloads and builds the `glslang` and `MoltenVK` repositories. + +### MacOS build + +#### CMake Generators + +This repository uses CMake to generate build or project files that are +then used to build the repository. +The CMake generators explicitly supported in this repository are: + +- Unix Makefiles +- Xcode + +#### Building with the Unix Makefiles Generator + +This generator is the default generator, so all that is needed for a debug +build is: + + mkdir build + cd build + cmake -DCMAKE_BUILD_TYPE=Debug .. + make + +To speed up the build on a multi-core machine, use the `-j` option for `make` +to specify the number of cores to use for the build. +For example: + + make -j4 + +You can now run the demo applications from the command line: + + open demos/cube.app + open demos/cubepp.app + open demos/smoketest.app + open demos/vulkaninfo.app + +Or you can locate them from `Finder` and launch them from there. + +##### The Install Target and RPATH + +The applications you just built are "bundled applications", but the executables +are using the `RPATH` mechanism to locate runtime dependencies that are still +in your build tree. + +To see this, run this command from your `build` directory: + + otool -l demos/cube.app/Contents/MacOS/cube + +and note that the `cube` executable contains loader commands: + +- `LC_LOAD_DYLIB` to load `libvulkan.1.dylib` via an `@rpath` +- `LC_RPATH` that contains an absolute path to the build location of the Vulkan loader + +This makes the bundled application "non-transportable", meaning that it won't run +unless the Vulkan loader is on that specific absolute path. +This is useful for debugging the loader or other components built in this repository, +but not if you want to move the application to another machine or remove your build tree. + +To address this problem, run: + + make install + +This step "cleans up" the `RPATH` to remove any external references +and performs other bundle fix-ups. +After running `make install`, re-run the `otool` command again and note: + +- `LC_LOAD_DYLIB` is now `@executable_path/../MacOS/libvulkan.1.dylib` +- `LC_RPATH` is no longer present + +The "bundle fix-up" operation also puts a copy of the Vulkan loader into the bundle, +making the bundle completely self-contained and self-referencing. + +Note that the "install" target has a very different meaning compared to the Linux +"make install" target. +The Linux "install" copies the targets to system directories. +In MacOS, "install" means fixing up application bundles. +In both cases, the "install" target operations clean up the `RPATH`. + +##### The Non-bundled vulkaninfo Application + +There is also a non-bundled version of the `vulkaninfo` application that you can +run from the command line: + + demos/vulkaninfo + +If you run this before you run "make install", vulkaninfo's RPATH is already set +to point to the Vulkan loader in the build tree, so it has no trouble finding it. +But the loader will not find the MoltenVK driver and you'll see a message about an +incompatible driver. To remedy this: + + VK_ICD_FILENAMES=../external/MoltenVK/Package/Latest/MoltenVK/macOS/MoltenVK_icd.json demos/vulkaninfo + +If you run `vulkaninfo` after doing a "make install", the `RPATH` in the `vulkaninfo` application +got removed and the OS needs extra help to locate the Vulkan loader: + + DYLD_LIBRARY_PATH=loader VK_ICD_FILENAMES=../external/MoltenVK/Package/Latest/MoltenVK/macOS/MoltenVK_icd.json demos/vulkaninfo + +#### Building with the Xcode Generator + +To create and open an Xcode project: + + mkdir build-xcode + cd build-xcode + cmake -GXcode .. + open VULKAN.xcodeproj + +Within Xcode, you can select Debug or Release builds in the project's Build Settings. +You can also select individual schemes for working with specific applications like `cube`. ## Ninja Builds - All Platforms -The [Qt Creator IDE](https://qt.io/download-open-source/#section-2) can open a root CMakeList.txt as a project directly, and it provides tools within Creator to configure and generate Vulkan SDK build files for one to many targets concurrently, resolving configuration issues as needed. Alternatively, when invoking CMake use the -G Codeblocks Ninja option to generate Ninja build files to be used as project files for QtCreator -- Follow the steps defined elsewhere for the OS using the update\_external\_sources script or as shown in **Loader and Validation Layer Dependencies** below -- Open, configure, and build the glslang CMakeList.txt files. Note that building the glslang project will provide access to spirv-tools and spirv-headers. -- Then do the same with the Vulkan-LoaderAndValidationLayers CMakeList.txt file. -- In order to debug with QtCreator, a [Microsoft WDK: eg WDK 10](http://go.microsoft.com/fwlink/p/?LinkId=526733) is required. Note that installing the WDK breaks the MSVC vcvarsall.bat build scripts provided by MSVC, requiring that the LIB, INCLUDE, and PATH env variables be set to the WDK paths by some other means +The [Qt Creator IDE](https://qt.io/download-open-source/#section-2) can open a root CMakeList.txt +as a project directly, and it provides tools within Creator to configure and generate Vulkan SDK +build files for one to many targets concurrently. +Alternatively, when invoking CMake, use the `-G "Codeblocks - Ninja"` option to generate Ninja build +files to be used as project files for QtCreator + +- Follow the steps defined elsewhere for the OS using the update\_external\_sources script or as + shown in **Loader and Validation Layer Dependencies** below +- Open, configure, and build the glslang CMakeList.txt files. Note that building the glslang + project will provide access to spirv-tools and spirv-headers +- Then do the same with the Vulkan-LoaderAndValidationLayers CMakeList.txt file +- In order to debug with QtCreator, a + [Microsoft WDK: eg WDK 10](http://go.microsoft.com/fwlink/p/?LinkId=526733) is required. + +Note that installing the WDK breaks the MSVC vcvarsall.bat build scripts provided by MSVC, +requiring that the LIB, INCLUDE, and PATHenv variables be set to the WDK paths by some other means + +## Update External Sources Optional Parameters + +This script will default to building 64-bit _and_ 32-bit versions of debug _and_ release +configurations, which can take a substantial amount of time. +However, it supports the following options to select a particular build configuration which can +reduce the time needed for repository set-up: + +| Command Line Option | Function | +|----------------------|----------------------------------------------| +| --32 | Build 32-bit targets only | +| --64 | Build 64-bit targets only | +| --release | Perform release builds only | +| --debug | Perform debug builds only | +| --no-build | Sync without building targets | +| --no-sync | Skip repository sync step | + +For example, to target a Windows 64-bit debug development configuration, invoke the batch file as follows: + +`update_external_sources.bat --64 --debug` + +Similarly, invoking the same configuration for Linux would be: + +`update_external_sources.sh --64 --debug` ## Loader and Validation Layer Dependencies -The glslang repo is required to build and run Loader and Validation Layer components. It is not a git sub-module of Vulkan-LoaderAndValidationLayers but Vulkan-LoaderAndValidationLayers is linked to a specific revision of gslang. This can be automatically cloned and built to predefined locations with the update\_external\_sources scripts. If a custom configuration is required, do the following steps: -1) clone the repo: +The glslang repository is required to build and run Loader and Validation Layer components. +It is not a git sub-module of Vulkan-LoaderAndValidationLayers but Vulkan-LoaderAndValidationLayers +is linked to a specific revision of glslang. +This can be automatically cloned and built to predefined locations with the +`update_external_sources` scripts. +If a custom configuration is required, do the following steps: + +1) clone the repository: - git clone https://github.com/KhronosGroup/glslang.git + `git clone https://github.com/KhronosGroup/glslang.git` -2) checkout the correct version of the tree based on the contents of the glslang\_revision file at the root of the Vulkan-LoaderAndValidationLayers tree (do the same anytime that Vulkan-LoaderAndValidationLayers is updated from remote) +2) checkout the correct version of the tree based on the contents of the +glslang\_revision file at the root of the Vulkan-LoaderAndValidationLayers tree +(do the same anytime that Vulkan-LoaderAndValidationLayers is updated from remote) -_on windows_ + - On Windows - git checkout < [path to Vulkan-LoaderAndValidationLayers]\glslang_revision [in glslang repo] + ```script + git checkout < [path to Vulkan-LoaderAndValidationLayers]\glslang_revision [in glslang repo] + ``` -*non windows* + - Non Windows - git checkout `cat [path to Vulkan-LoaderAndValidationLayers]\glslang_revision` [in glslang repo] + ```script + git checkout `cat [path to Vulkan-LoaderAndValidationLayers]\glslang_revision` [in glslang repo] + ``` -3) Configure the glslang source tree with cmake and build it with your IDE of choice +3) Configure the glslang source tree with CMake and build it with your IDE of choice -4) Enable the CUSTOM\_GLSLANG\_BIN\_PATH and CUSTOM\_SPIRV\_TOOLS\_BIN\_PATH options in the Vulkan-LoaderAndValidationLayers cmake configuration and point the GLSLANG\_BINARY\_PATH and SPIRV\_TOOLS\_BINARY\_PATH variables to the correct location +4) Enable the `CUSTOM_GLSLANG_BIN_PATH` and `CUSTOM_SPIRV_TOOLS_BIN_PATH` options in the Vulkan-LoaderAndValidationLayers + CMake configuration and point the `GLSLANG_BINARY_PATH` and `SPIRV_TOOLS_BINARY_PATH` variables to the correct location -5) If building on Windows with MSVC, set DISABLE\_BUILDTGT\_DIR\_DECORATION to _On_. If building on Windows, but without MSVC set DISABLE\_BUILD\_PATH\_DECORATION to _On_ +5) If building on Windows with MSVC, set `DISABLE_BUILDTGT_DIR_DECORATION` to _On_. + If building on Windows, but without MSVC set `DISABLE_BUILD_PATH_DECORATION` to _On_ -## Optional software packages: +## Optional software packages -- [Cygwin for windows](https://www.cygwin.com/). Notes: - - Cygwin provides some Linux-like tools, which are valuable for obtaining the source code, and running CMake. - Especially valuable are the BASH shell and git packages. - - If you don't want to use Cygwin, there are other shells and environments that can be used. - You can also use a Git package that doesn't come from Cygwin. +- [Cygwin for windows](https://www.cygwin.com/) + - Cygwin provides some Linux-like tools, which can be valuable for working with the repository, + such as the BASH shell and git packages + - With appropriate adjustments, it is possible to use other shells and environments as well -- [Ninja on all platforms](https://github.com/ninja-build/ninja/releases). [The Ninja-build project](ninja-build.org). [Ninja Users Manual](ninja-build.org/manual.html) +- [Ninja on all platforms](https://github.com/ninja-build/ninja/releases) +- [The Ninja-build project](https://ninja-build.org) +- [Ninja Users Manual](https://ninja-build.org/manual.html) - [QtCreator as IDE for CMake builds on all platforms](https://qt.io/download-open-source/#section-2) diff -Nru vulkan-1.1.70+dfsg1/CMakeLists.txt vulkan-1.1.73+dfsg/CMakeLists.txt --- vulkan-1.1.70+dfsg1/CMakeLists.txt 2018-03-12 13:03:34.000000000 +0000 +++ vulkan-1.1.73+dfsg/CMakeLists.txt 2018-05-04 08:50:24.000000000 +0000 @@ -2,6 +2,10 @@ # refer to the root source directory of the project as ${VULKAN_SOURCE_DIR} and # to the root binary directory of the project as ${VULKAN_BINARY_DIR}. cmake_minimum_required(VERSION 2.8.11) + +# This must come before the project command. +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "Minimum OS X deployment version") + project (VULKAN) # set (CMAKE_VERBOSE_MAKEFILE 1) @@ -24,16 +28,26 @@ endif(CCACHE_FOUND) endif() +if(APPLE) + # CMake versions 3 or later need CMAKE_MACOSX_RPATH defined. + # This avoids the CMP0042 policy message. + set(CMAKE_MACOSX_RPATH 1) + # The "install" target for MacOS fixes up bundles in place. + set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}) +endif() + # Enable cmake folders set_property(GLOBAL PROPERTY USE_FOLDERS ON) set(LVL_TARGET_FOLDER lvl_cmake_targets) -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") +if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Darwin") set(FALLBACK_CONFIG_DIRS "/etc/xdg" CACHE STRING "Search path to use when XDG_CONFIG_DIRS is unset or empty or the current process is SUID/SGID. Default is freedesktop compliant.") set(FALLBACK_DATA_DIRS "/usr/local/share:/usr/share" CACHE STRING "Search path to use when XDG_DATA_DIRS is unset or empty or the current process is SUID/SGID. Default is freedesktop compliant.") +endif() +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") include(FindPkgConfig) option(BUILD_WSI_XCB_SUPPORT "Build XCB WSI support" ON) option(BUILD_WSI_XLIB_SUPPORT "Build Xlib WSI support" ON) @@ -80,7 +94,11 @@ set(COMMON_COMPILE_FLAGS "${COMMON_COMPILE_FLAGS} -Wimplicit-fallthrough=0") endif() - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 ${COMMON_COMPILE_FLAGS}") + if (APPLE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_COMPILE_FLAGS}") + else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 ${COMMON_COMPILE_FLAGS}") + endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_COMPILE_FLAGS} -std=c++11 -fno-rtti") if (UNIX) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") @@ -136,7 +154,11 @@ option(BUILD_TESTS "Build tests" ON) option(BUILD_LAYERS "Build layers" ON) option(BUILD_DEMOS "Build demos" ON) -option(BUILD_VKJSON "Build vkjson" ON) +if (APPLE) + option(BUILD_VKJSON "Build vkjson" OFF) +else() + option(BUILD_VKJSON "Build vkjson" ON) +endif() option(BUILD_ICD "Build icd" ON) option(CUSTOM_GLSLANG_BIN_ROOT "Use the user defined GLSLANG_BINARY_ROOT" OFF) option(CUSTOM_SPIRV_TOOLS_BIN_ROOT "Use the user defined SPIRV_TOOLS*BINARY_ROOT paths" OFF) @@ -332,10 +354,12 @@ endmacro() # Custom target for generated vulkan helper file dependencies +set(generate_helper_files_DEPENDS) +if(BUILD_LAYERS) + LIST(APPEND generate_helper_files_DEPENDS spirv_tools_commit_id.h) +endif() add_custom_target(generate_helper_files DEPENDS vk_enum_string_helper.h - vk_struct_size_helper.h - vk_struct_size_helper.c vk_safe_struct.h vk_safe_struct.cpp vk_object_types.h @@ -343,7 +367,7 @@ vk_dispatch_table_helper.h vk_extension_helper.h vk_typemap_helper.h - spirv_tools_commit_id.h + ${generate_helper_files_DEPENDS} ) set_target_properties(generate_helper_files PROPERTIES FOLDER ${LVL_TARGET_FOLDER}) @@ -352,13 +376,13 @@ run_vk_xml_generate(dispatch_table_helper_generator.py vk_dispatch_table_helper.h) run_vk_xml_generate(helper_file_generator.py vk_safe_struct.h) run_vk_xml_generate(helper_file_generator.py vk_safe_struct.cpp) -run_vk_xml_generate(helper_file_generator.py vk_struct_size_helper.h) -run_vk_xml_generate(helper_file_generator.py vk_struct_size_helper.c) run_vk_xml_generate(helper_file_generator.py vk_enum_string_helper.h) run_vk_xml_generate(helper_file_generator.py vk_object_types.h) run_vk_xml_generate(helper_file_generator.py vk_extension_helper.h) run_vk_xml_generate(helper_file_generator.py vk_typemap_helper.h) -run_external_revision_generate(${EXTERNAL_SOURCE_ROOT}/glslang/External/spirv-tools SPIRV_TOOLS_COMMIT_ID spirv_tools_commit_id.h) +if(BUILD_LAYERS) + run_external_revision_generate(${EXTERNAL_SOURCE_ROOT}/glslang/External/spirv-tools SPIRV_TOOLS_COMMIT_ID spirv_tools_commit_id.h) +endif() diff -Nru vulkan-1.1.70+dfsg1/common/vulkan_wrapper.cpp vulkan-1.1.73+dfsg/common/vulkan_wrapper.cpp --- vulkan-1.1.70+dfsg1/common/vulkan_wrapper.cpp 2018-03-08 07:03:43.000000000 +0000 +++ vulkan-1.1.73+dfsg/common/vulkan_wrapper.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -31,6 +31,8 @@ vkEnumeratePhysicalDevices = reinterpret_cast(dlsym(libvulkan, "vkEnumeratePhysicalDevices")); vkGetPhysicalDeviceFeatures = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceFeatures")); + vkGetPhysicalDeviceFeatures2 = + reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceFeatures2")); vkGetPhysicalDeviceFormatProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceFormatProperties")); vkGetPhysicalDeviceImageFormatProperties = reinterpret_cast( @@ -254,6 +256,7 @@ PFN_vkDestroyInstance vkDestroyInstance; PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; +PFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2; PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; diff -Nru vulkan-1.1.70+dfsg1/common/vulkan_wrapper.h vulkan-1.1.73+dfsg/common/vulkan_wrapper.h --- vulkan-1.1.70+dfsg1/common/vulkan_wrapper.h 2018-03-08 07:03:43.000000000 +0000 +++ vulkan-1.1.73+dfsg/common/vulkan_wrapper.h 2018-04-27 11:24:19.000000000 +0000 @@ -34,6 +34,7 @@ extern PFN_vkDestroyInstance vkDestroyInstance; extern PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; extern PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; +extern PFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2; extern PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; extern PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; extern PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; diff -Nru vulkan-1.1.70+dfsg1/CONTRIBUTING.md vulkan-1.1.73+dfsg/CONTRIBUTING.md --- vulkan-1.1.70+dfsg1/CONTRIBUTING.md 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/CONTRIBUTING.md 2018-04-27 11:24:19.000000000 +0000 @@ -124,6 +124,9 @@ contains checks that require some amount of application state to carry out. In contrast, the parameter validation layer contains checks that require (mostly) no state at all. Please inquire if you are unsure of the location for your contribution. The other layers (threading, object_tracker, unique_objects) 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. ### **Contributor License Agreement (CLA)** diff -Nru vulkan-1.1.70+dfsg1/debian/changelog vulkan-1.1.73+dfsg/debian/changelog --- vulkan-1.1.70+dfsg1/debian/changelog 2018-03-15 13:29:07.000000000 +0000 +++ vulkan-1.1.73+dfsg/debian/changelog 2018-05-04 12:13:49.000000000 +0000 @@ -1,8 +1,17 @@ -vulkan (1.1.70+dfsg1-1~gpu16.04.1) xenial; urgency=medium +vulkan (1.1.73+dfsg-1~gpu16.04.1) xenial; urgency=medium * Copied from debian - -- Rico Tzschichholz Thu, 15 Mar 2018 14:29:07 +0100 + -- Rico Tzschichholz Fri, 04 May 2018 14:13:49 +0200 + +vulkan (1.1.73+dfsg-1) unstable; urgency=medium + + * New upstream release. + * Move layers from libvulkan-dev to libvulkan1. (Closes: #891582) + * control: Add python3-distutils to build-depends. (Closes: #896796) + * Refresh patches. + + -- Timo Aaltonen Fri, 04 May 2018 13:18:00 +0300 vulkan (1.1.70+dfsg1-1) unstable; urgency=medium diff -Nru vulkan-1.1.70+dfsg1/debian/control vulkan-1.1.73+dfsg/debian/control --- vulkan-1.1.70+dfsg1/debian/control 2018-03-08 15:06:57.000000000 +0000 +++ vulkan-1.1.73+dfsg/debian/control 2018-05-04 12:13:49.000000000 +0000 @@ -21,8 +21,10 @@ Package: libvulkan1 Architecture: linux-any Depends: ${shlibs:Depends}, ${misc:Depends} -Breaks: vulkan-loader -Replaces: vulkan-loader +Breaks: vulkan-loader, + libvulkan-dev (<< 1.1.70+dfsg1-2), +Replaces: vulkan-loader, + libvulkan-dev (<< 1.1.70+dfsg1-2), Multi-Arch: same Description: Vulkan loader library The Loader implements the main VK library. It handles layer management and diff -Nru vulkan-1.1.70+dfsg1/debian/libvulkan1.dirs vulkan-1.1.73+dfsg/debian/libvulkan1.dirs --- vulkan-1.1.70+dfsg1/debian/libvulkan1.dirs 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/debian/libvulkan1.dirs 2018-04-27 11:24:53.000000000 +0000 @@ -0,0 +1,2 @@ +etc/vulkan/explicit_layer.d +etc/vulkan/implicit_layer.d diff -Nru vulkan-1.1.70+dfsg1/debian/libvulkan1.install vulkan-1.1.73+dfsg/debian/libvulkan1.install --- vulkan-1.1.70+dfsg1/debian/libvulkan1.install 2018-03-08 15:06:57.000000000 +0000 +++ vulkan-1.1.73+dfsg/debian/libvulkan1.install 2018-04-27 11:24:53.000000000 +0000 @@ -1 +1,4 @@ usr/lib/*/lib*.so.* +usr/lib/*/libVkLayer*.so +usr/share/vulkan/explicit_layer.d +usr/share/vulkan/implicit_layer.d diff -Nru vulkan-1.1.70+dfsg1/debian/libvulkan-dev.dirs vulkan-1.1.73+dfsg/debian/libvulkan-dev.dirs --- vulkan-1.1.70+dfsg1/debian/libvulkan-dev.dirs 2018-03-08 15:06:57.000000000 +0000 +++ vulkan-1.1.73+dfsg/debian/libvulkan-dev.dirs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -etc/vulkan/explicit_layer.d -etc/vulkan/implicit_layer.d diff -Nru vulkan-1.1.70+dfsg1/debian/libvulkan-dev.install vulkan-1.1.73+dfsg/debian/libvulkan-dev.install --- vulkan-1.1.70+dfsg1/debian/libvulkan-dev.install 2018-03-08 15:06:57.000000000 +0000 +++ vulkan-1.1.73+dfsg/debian/libvulkan-dev.install 2018-04-27 11:24:53.000000000 +0000 @@ -1,6 +1,3 @@ usr/include/vulkan usr/lib/*/libvulkan.so -usr/lib/*/libVkLayer*.so usr/lib/*/pkgconfig/vulkan.pc -usr/share/vulkan/explicit_layer.d -usr/share/vulkan/implicit_layer.d diff -Nru vulkan-1.1.70+dfsg1/debian/patches/demos-dont-build-cube.diff vulkan-1.1.73+dfsg/debian/patches/demos-dont-build-cube.diff --- vulkan-1.1.70+dfsg1/debian/patches/demos-dont-build-cube.diff 2018-03-08 15:06:57.000000000 +0000 +++ vulkan-1.1.73+dfsg/debian/patches/demos-dont-build-cube.diff 2018-04-27 11:49:54.000000000 +0000 @@ -10,9 +10,9 @@ --- a/demos/CMakeLists.txt +++ b/demos/CMakeLists.txt -@@ -124,8 +124,8 @@ target_link_libraries(${API_LOWERCASE}in - - if(NOT WIN32) +@@ -180,8 +180,8 @@ if(APPLE) + include(macOS/cube/cube.cmake) + elseif(NOT WIN32) if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL ${CMAKE_HOST_SYSTEM_PROCESSOR}) - add_executable(cube cube.c ${PROJECT_SOURCE_DIR}/demos/cube.vert ${PROJECT_SOURCE_DIR}/demos/cube.frag cube.vert.inc cube.frag.inc) - target_link_libraries(cube ${LIBRARIES}) @@ -21,9 +21,9 @@ endif() else() if (CMAKE_CL_64) -@@ -140,8 +140,8 @@ endif() - - if(NOT WIN32) +@@ -201,8 +201,8 @@ if(APPLE) + include(macOS/cubepp/cubepp.cmake) + elseif(NOT WIN32) if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL ${CMAKE_HOST_SYSTEM_PROCESSOR}) - add_executable(cubepp cube.cpp ${PROJECT_SOURCE_DIR}/demos/cube.vert ${PROJECT_SOURCE_DIR}/demos/cube.frag cube.vert.inc cube.frag.inc) - target_link_libraries(cubepp ${LIBRARIES}) diff -Nru vulkan-1.1.70+dfsg1/debian/patches/use-known-sha.diff vulkan-1.1.73+dfsg/debian/patches/use-known-sha.diff --- vulkan-1.1.70+dfsg1/debian/patches/use-known-sha.diff 2018-03-08 15:06:57.000000000 +0000 +++ vulkan-1.1.73+dfsg/debian/patches/use-known-sha.diff 2018-04-27 11:50:03.000000000 +0000 @@ -1,6 +1,6 @@ --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -325,8 +325,8 @@ macro(run_external_revision_generate sou +@@ -348,8 +348,8 @@ macro(run_external_revision_generate sou # NOTE: If you modify this call to use --rev_file instead of --git_dir (to read the commit ID from a file instead of # parsing from a Git repository), you probably also want to add the revision file to the list of DEPENDS on the # subsequent line (to ensure that the script is re-run when the revision file is modified). diff -Nru vulkan-1.1.70+dfsg1/debian/patches/use-mxgot-for-mips64.patch vulkan-1.1.73+dfsg/debian/patches/use-mxgot-for-mips64.patch --- vulkan-1.1.70+dfsg1/debian/patches/use-mxgot-for-mips64.patch 2018-03-08 15:06:57.000000000 +0000 +++ vulkan-1.1.73+dfsg/debian/patches/use-mxgot-for-mips64.patch 2018-04-27 11:49:58.000000000 +0000 @@ -3,7 +3,7 @@ --- a/layers/CMakeLists.txt +++ b/layers/CMakeLists.txt -@@ -170,6 +170,12 @@ if (CMAKE_C_COMPILER_ID MATCHES "Clang") +@@ -211,6 +211,12 @@ if (CMAKE_C_COMPILER_ID MATCHES "Clang") COMPILE_FLAGS "-Wno-unused-const-variable") endif() diff -Nru vulkan-1.1.70+dfsg1/demos/android/jni/Android.mk vulkan-1.1.73+dfsg/demos/android/jni/Android.mk --- vulkan-1.1.70+dfsg1/demos/android/jni/Android.mk 2018-03-08 07:03:43.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/android/jni/Android.mk 2018-04-27 11:24:19.000000000 +0000 @@ -25,7 +25,8 @@ LOCAL_C_INCLUDES += $(SRC_DIR)/include \ $(DEMO_DIR)/android/include \ $(SRC_DIR)/libs \ - $(SRC_DIR)/common + $(SRC_DIR)/common \ + $(SRC_DIR)/build-android/generated/include LOCAL_CFLAGS += -DVK_USE_PLATFORM_ANDROID_KHR --include=$(SRC_DIR)/common/vulkan_wrapper.h LOCAL_WHOLE_STATIC_LIBRARIES += android_native_app_glue LOCAL_LDLIBS := -llog -landroid diff -Nru vulkan-1.1.70+dfsg1/demos/CMakeLists.txt vulkan-1.1.73+dfsg/demos/CMakeLists.txt --- vulkan-1.1.70+dfsg1/demos/CMakeLists.txt 2018-03-12 13:03:34.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/CMakeLists.txt 2018-05-04 08:50:24.000000000 +0000 @@ -72,6 +72,8 @@ include_directories ("${PROJECT_SOURCE_DIR}/icd/common") link_libraries(${API_LOWERCASE} m) +elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + add_definitions(-DVK_USE_PLATFORM_MACOS_MVK) else() message(FATAL_ERROR "Unsupported Platform!") endif() @@ -136,14 +138,47 @@ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CRT_SECURE_NO_WARNINGS -D_USE_MATH_DEFINES") endif() +# MacOS setup common to all demos +if(APPLE) + include(macOS/common.cmake) +endif() + include_directories( ${DEMO_INCLUDE_DIRS} ) -add_executable(${API_LOWERCASE}info vulkaninfo.c) +###################################################################################### +# vulkaninfo +if(WIN32) + add_executable(${API_LOWERCASE}info vulkaninfo.c vulkaninfo.rc) +else() + add_executable(${API_LOWERCASE}info vulkaninfo.c) +endif() target_link_libraries(${API_LOWERCASE}info ${LIBRARIES}) +if(APPLE) + set_target_properties(${API_LOWERCASE}info PROPERTIES + INSTALL_RPATH "@loader_path/../lib" + ) + install(TARGETS ${API_LOWERCASE}info DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +endif() + +# Create vulkaninfo application bundle for MacOS +if(APPLE) + include(macOS/vulkaninfo/vulkaninfo.cmake) +endif() + +if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + if(INSTALL_LVL_FILES) + install(TARGETS ${API_LOWERCASE}info DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() +endif() -if(NOT WIN32) +###################################################################################### +# cube + +if(APPLE) + include(macOS/cube/cube.cmake) +elseif(NOT WIN32) if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL ${CMAKE_HOST_SYSTEM_PROCESSOR}) add_executable(cube cube.c ${PROJECT_SOURCE_DIR}/demos/cube.vert ${PROJECT_SOURCE_DIR}/demos/cube.frag cube.vert.inc cube.frag.inc) target_link_libraries(cube ${LIBRARIES}) @@ -159,7 +194,12 @@ target_link_libraries(cube ${LIBRARIES}) endif() -if(NOT WIN32) +###################################################################################### +# cubepp + +if(APPLE) + include(macOS/cubepp/cubepp.cmake) +elseif(NOT WIN32) if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL ${CMAKE_HOST_SYSTEM_PROCESSOR}) add_executable(cubepp cube.cpp ${PROJECT_SOURCE_DIR}/demos/cube.vert ${PROJECT_SOURCE_DIR}/demos/cube.frag cube.vert.inc cube.frag.inc) target_link_libraries(cubepp ${LIBRARIES}) @@ -175,14 +215,12 @@ target_link_libraries(cubepp ${LIBRARIES}) endif() +###################################################################################### +# smoke + if ((${CMAKE_SYSTEM_PROCESSOR} STREQUAL ${CMAKE_HOST_SYSTEM_PROCESSOR})) - if ((DEMOS_WSI_SELECTION STREQUAL "XCB") OR (DEMOS_WSI_SELECTION STREQUAL "WAYLAND") OR WIN32 OR (CMAKE_SYSTEM_NAME STREQUAL "Android")) + if ((DEMOS_WSI_SELECTION STREQUAL "XCB") OR (DEMOS_WSI_SELECTION STREQUAL "WAYLAND") OR WIN32 OR + (CMAKE_SYSTEM_NAME STREQUAL "Android") OR (CMAKE_SYSTEM_NAME STREQUAL "Darwin")) add_subdirectory(smoke) endif() endif() - -if(UNIX) - if(INSTALL_LVL_FILES) - install(TARGETS ${API_LOWERCASE}info DESTINATION ${CMAKE_INSTALL_BINDIR}) - endif() -endif() diff -Nru vulkan-1.1.70+dfsg1/demos/cube.c vulkan-1.1.73+dfsg/demos/cube.c --- vulkan-1.1.70+dfsg1/demos/cube.c 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/cube.c 2018-04-27 11:24:19.000000000 +0000 @@ -331,7 +331,7 @@ struct wl_keyboard *keyboard; #elif defined(VK_USE_PLATFORM_MIR_KHR) #elif defined(VK_USE_PLATFORM_ANDROID_KHR) - ANativeWindow *window; + struct ANativeWindow *window; #elif (defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)) void *window; #endif @@ -339,6 +339,7 @@ bool prepared; bool use_staging_buffer; bool separate_present_queue; + bool is_minimized; bool VK_KHR_incremental_present_enabled; @@ -532,16 +533,14 @@ #elif defined(ANDROID) - if (msgFlags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) { + if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) { __android_log_print(ANDROID_LOG_INFO, APP_SHORT_NAME, "%s", message); - } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { - __android_log_print(ANDROID_LOG_WARN, APP_SHORT_NAME, "%s", message); - } else if (msgFlags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) { + } else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) { __android_log_print(ANDROID_LOG_WARN, APP_SHORT_NAME, "%s", message); - } else if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { + } else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { __android_log_print(ANDROID_LOG_ERROR, APP_SHORT_NAME, "%s", message); - } else if (msgFlags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) { - __android_log_print(ANDROID_LOG_DEBUG, APP_SHORT_NAME, "%s", message); + } else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) { + __android_log_print(ANDROID_LOG_VERBOSE, APP_SHORT_NAME, "%s", message); } else { __android_log_print(ANDROID_LOG_INFO, APP_SHORT_NAME, "%s", message); } @@ -1210,6 +1209,13 @@ demo->height = surfCapabilities.currentExtent.height; } + if (demo->width == 0 || demo->height == 0) { + demo->is_minimized = true; + return; + } else { + demo->is_minimized = false; + } + // The FIFO present mode is guaranteed by the spec to be supported // and to have no tearing. It's a great default present mode to use. VkPresentModeKHR swapchainPresentMode = VK_PRESENT_MODE_FIFO_KHR; @@ -2140,15 +2146,16 @@ static void demo_prepare(struct demo *demo) { VkResult U_ASSERT_ONLY err; - - const VkCommandPoolCreateInfo cmd_pool_info = { - .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, - .pNext = NULL, - .queueFamilyIndex = demo->graphics_queue_family_index, - .flags = 0, - }; - err = vkCreateCommandPool(demo->device, &cmd_pool_info, NULL, &demo->cmd_pool); - assert(!err); + if (demo->cmd_pool == VK_NULL_HANDLE) { + const VkCommandPoolCreateInfo cmd_pool_info = { + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, + .pNext = NULL, + .queueFamilyIndex = demo->graphics_queue_family_index, + .flags = 0, + }; + err = vkCreateCommandPool(demo->device, &cmd_pool_info, NULL, &demo->cmd_pool); + assert(!err); + } const VkCommandBufferAllocateInfo cmd = { .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, @@ -2169,6 +2176,12 @@ assert(!err); demo_prepare_buffers(demo); + + if (demo->is_minimized) { + demo->prepared = false; + return; + } + demo_prepare_depth(demo); demo_prepare_textures(demo); demo_prepare_cube_data_buffers(demo); @@ -2246,41 +2259,44 @@ } } - for (i = 0; i < demo->swapchainImageCount; i++) { - vkDestroyFramebuffer(demo->device, demo->swapchain_image_resources[i].framebuffer, NULL); - } - vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL); - - vkDestroyPipeline(demo->device, demo->pipeline, NULL); - vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL); - vkDestroyRenderPass(demo->device, demo->render_pass, NULL); - vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL); - vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL); - - for (i = 0; i < DEMO_TEXTURE_COUNT; i++) { - vkDestroyImageView(demo->device, demo->textures[i].view, NULL); - vkDestroyImage(demo->device, demo->textures[i].image, NULL); - vkFreeMemory(demo->device, demo->textures[i].mem, NULL); - vkDestroySampler(demo->device, demo->textures[i].sampler, NULL); - } - demo->fpDestroySwapchainKHR(demo->device, demo->swapchain, NULL); - - vkDestroyImageView(demo->device, demo->depth.view, NULL); - vkDestroyImage(demo->device, demo->depth.image, NULL); - vkFreeMemory(demo->device, demo->depth.mem, NULL); - - for (i = 0; i < demo->swapchainImageCount; i++) { - vkDestroyImageView(demo->device, demo->swapchain_image_resources[i].view, NULL); - vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->swapchain_image_resources[i].cmd); - vkDestroyBuffer(demo->device, demo->swapchain_image_resources[i].uniform_buffer, NULL); - vkFreeMemory(demo->device, demo->swapchain_image_resources[i].uniform_memory, NULL); - } - free(demo->swapchain_image_resources); - free(demo->queue_props); - vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL); + // If the window is currently minimized, demo_resize has already done some cleanup for us. + if (!demo->is_minimized) { + for (i = 0; i < demo->swapchainImageCount; i++) { + vkDestroyFramebuffer(demo->device, demo->swapchain_image_resources[i].framebuffer, NULL); + } + vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL); + + vkDestroyPipeline(demo->device, demo->pipeline, NULL); + vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL); + vkDestroyRenderPass(demo->device, demo->render_pass, NULL); + vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL); + vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL); + + for (i = 0; i < DEMO_TEXTURE_COUNT; i++) { + vkDestroyImageView(demo->device, demo->textures[i].view, NULL); + vkDestroyImage(demo->device, demo->textures[i].image, NULL); + vkFreeMemory(demo->device, demo->textures[i].mem, NULL); + vkDestroySampler(demo->device, demo->textures[i].sampler, NULL); + } + demo->fpDestroySwapchainKHR(demo->device, demo->swapchain, NULL); + + vkDestroyImageView(demo->device, demo->depth.view, NULL); + vkDestroyImage(demo->device, demo->depth.image, NULL); + vkFreeMemory(demo->device, demo->depth.mem, NULL); + + for (i = 0; i < demo->swapchainImageCount; i++) { + vkDestroyImageView(demo->device, demo->swapchain_image_resources[i].view, NULL); + vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->swapchain_image_resources[i].cmd); + vkDestroyBuffer(demo->device, demo->swapchain_image_resources[i].uniform_buffer, NULL); + vkFreeMemory(demo->device, demo->swapchain_image_resources[i].uniform_memory, NULL); + } + free(demo->swapchain_image_resources); + free(demo->queue_props); + vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL); - if (demo->separate_present_queue) { - vkDestroyCommandPool(demo->device, demo->present_cmd_pool, NULL); + if (demo->separate_present_queue) { + vkDestroyCommandPool(demo->device, demo->present_cmd_pool, NULL); + } } vkDeviceWaitIdle(demo->device); vkDestroyDevice(demo->device, NULL); @@ -2317,6 +2333,9 @@ // Don't react to resize until after first initialization. if (!demo->prepared) { + if (demo->is_minimized) { + demo_prepare(demo); + } return; } // In order to properly resize the window, we must re-create the swapchain @@ -2355,6 +2374,7 @@ vkFreeMemory(demo->device, demo->swapchain_image_resources[i].uniform_memory, NULL); } vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL); + demo->cmd_pool = VK_NULL_HANDLE; if (demo->separate_present_queue) { vkDestroyCommandPool(demo->device, demo->present_cmd_pool, NULL); } @@ -2693,6 +2713,14 @@ demo_draw(demo); demo->curFrame++; } +#elif defined(VK_USE_PLATFORM_MACOS_MVK) +static void demo_run(struct demo *demo) { + demo_draw(demo); + demo->curFrame++; + if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount) { + demo->quit = TRUE; + } +} #elif defined(VK_USE_PLATFORM_MIR_KHR) #elif defined(VK_USE_PLATFORM_DISPLAY_KHR) static VkResult demo_create_display_surface(struct demo *demo) { @@ -2874,6 +2902,8 @@ char **instance_validation_layers = NULL; demo->enabled_extension_count = 0; demo->enabled_layer_count = 0; + demo->is_minimized = false; + demo->cmd_pool = VK_NULL_HANDLE; char *instance_validation_layers_alt1[] = {"VK_LAYER_LUNARG_standard_validation"}; @@ -3118,7 +3148,7 @@ /* Make initial call to query gpu_count, then second call for gpu info*/ err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count, NULL); - assert(!err && gpu_count > 0); + assert(!err); if (gpu_count > 0) { VkPhysicalDevice *physical_devices = malloc(sizeof(VkPhysicalDevice) * gpu_count); @@ -3326,7 +3356,7 @@ createInfo.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR; createInfo.pNext = NULL; createInfo.flags = 0; - createInfo.window = (ANativeWindow *)(demo->window); + createInfo.window = (struct ANativeWindow *)(demo->window); err = vkCreateAndroidSurfaceKHR(demo->inst, &createInfo, NULL, &demo->surface); #elif defined(VK_USE_PLATFORM_XLIB_KHR) @@ -3802,9 +3832,7 @@ } #elif defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK) -static void demo_main(struct demo *demo, void *view) { - const char *argv[] = {"CubeSample"}; - int argc = sizeof(argv) / sizeof(char *); +static void demo_main(struct demo *demo, void *view, int argc, const char *argv[]) { demo_init(demo, argc, (char **)argv); demo->window = view; @@ -3813,14 +3841,6 @@ demo->spin_angle = 0.4f; } -static void demo_update_and_draw(struct demo *demo) { - // Wait for work to finish before updating MVP. - vkDeviceWaitIdle(demo->device); - demo_update_data_buffer(demo); - - demo_draw(demo); -} - #elif defined(VK_USE_PLATFORM_ANDROID_KHR) #include #include diff -Nru vulkan-1.1.70+dfsg1/demos/cube.cpp vulkan-1.1.73+dfsg/demos/cube.cpp --- vulkan-1.1.70+dfsg1/demos/cube.cpp 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/cube.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -261,6 +261,8 @@ #elif defined(VK_USE_PLATFORM_WAYLAND_KHR) void run(); void create_window(); +#elif defined(VK_USE_PLATFORM_MACOS_MVK) + void run(); #elif defined(VK_USE_PLATFORM_MIR_KHR) #elif defined(VK_USE_PLATFORM_DISPLAY_KHR) vk::Result create_display_surface(); @@ -292,6 +294,8 @@ wl_pointer *pointer; wl_keyboard *keyboard; #elif defined(VK_USE_PLATFORM_MIR_KHR) +#elif (defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)) + void *window; #endif vk::SurfaceKHR surface; @@ -1105,6 +1109,16 @@ platformSurfaceExtFound = 1; extension_names[enabled_extension_count++] = VK_KHR_DISPLAY_EXTENSION_NAME; } +#elif defined(VK_USE_PLATFORM_IOS_MVK) + if (!strcmp(VK_MVK_IOS_SURFACE_EXTENSION_NAME, instance_extensions[i].extensionName)) { + platformSurfaceExtFound = 1; + extension_names[enabled_extension_count++] = VK_MVK_IOS_SURFACE_EXTENSION_NAME; + } +#elif defined(VK_USE_PLATFORM_MACOS_MVK) + if (!strcmp(VK_MVK_MACOS_SURFACE_EXTENSION_NAME, instance_extensions[i].extensionName)) { + platformSurfaceExtFound = 1; + extension_names[enabled_extension_count++] = VK_MVK_MACOS_SURFACE_EXTENSION_NAME; + } #endif assert(enabled_extension_count < 64); @@ -1151,6 +1165,20 @@ "Do you have a compatible Vulkan installable client driver (ICD) installed?\n" "Please look at the Getting Started guide for additional information.\n", "vkCreateInstance Failure"); +#elif defined(VK_USE_PLATFORM_IOS_MVK) + ERR_EXIT("vkEnumerateInstanceExtensionProperties failed to find the " VK_MVK_IOS_SURFACE_EXTENSION_NAME + " extension.\n\nDo you have a compatible " + "Vulkan installable client driver (ICD) installed?\nPlease " + "look at the Getting Started guide for additional " + "information.\n", + "vkCreateInstance Failure"); +#elif defined(VK_USE_PLATFORM_MACOS_MVK) + ERR_EXIT("vkEnumerateInstanceExtensionProperties failed to find the " VK_MVK_MACOS_SURFACE_EXTENSION_NAME + " extension.\n\nDo you have a compatible " + "Vulkan installable client driver (ICD) installed?\nPlease " + "look at the Getting Started guide for additional " + "information.\n", + "vkCreateInstance Failure"); #endif } auto const app = vk::ApplicationInfo() @@ -1189,7 +1217,6 @@ uint32_t gpu_count; result = inst.enumeratePhysicalDevices(&gpu_count, nullptr); VERIFY(result == vk::Result::eSuccess); - assert(gpu_count > 0); if (gpu_count > 0) { std::unique_ptr physical_devices(new vk::PhysicalDevice[gpu_count]); @@ -1283,6 +1310,20 @@ auto result = inst.createXcbSurfaceKHR(&createInfo, nullptr, &surface); VERIFY(result == vk::Result::eSuccess); } +#elif defined(VK_USE_PLATFORM_IOS_MVK) + { + auto const createInfo = vk::IOSSurfaceCreateInfoMVK().setPView(nullptr); + + auto result = inst.createIOSSurfaceMVK(&createInfo, nullptr, &surface); + VERIFY(result == vk::Result::eSuccess); + } +#elif defined(VK_USE_PLATFORM_MACOS_MVK) + { + auto const createInfo = vk::MacOSSurfaceCreateInfoMVK().setPView(window); + + auto result = inst.createMacOSSurfaceMVK(&createInfo, nullptr, &surface); + VERIFY(result == vk::Result::eSuccess); + } #elif defined(VK_USE_PLATFORM_DISPLAY_KHR) { auto result = create_display_surface(); @@ -2261,6 +2302,10 @@ } bool Demo::loadTexture(const char *filename, uint8_t *rgba_data, vk::SubresourceLayout *layout, int32_t *width, int32_t *height) { +#if (defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)) + filename = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@(filename)].UTF8String; +#endif + FILE *fPtr = fopen(filename, "rb"); if (!fPtr) { return false; @@ -2624,6 +2669,14 @@ wl_shell_surface_set_toplevel(shell_surface); wl_shell_surface_set_title(shell_surface, APP_SHORT_NAME); } +#elif defined(VK_USE_PLATFORM_MACOS_MVK) +void Demo::run() { + draw(); + curFrame++; + if (frameCount != UINT32_MAX && curFrame == frameCount) { + quit = true; + } +} #elif defined(VK_USE_PLATFORM_MIR_KHR) #elif defined(VK_USE_PLATFORM_DISPLAY_KHR) @@ -2926,6 +2979,18 @@ return validation_error; } +#elif defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK) + +// Global function invoked from NS or UI views and controllers to create demo +static void demo_main(struct Demo &demo, void *view, int argc, const char *argv[]) { + + demo.init(argc, (char **)argv); + demo.window = view; + demo.init_vk_swapchain(); + demo.prepare(); + demo.spin_angle = 0.4f; +} + #else #error "Platform not supported" #endif diff -Nru vulkan-1.1.70+dfsg1/demos/cube.frag vulkan-1.1.73+dfsg/demos/cube.frag --- vulkan-1.1.70+dfsg1/demos/cube.frag 2017-11-08 08:23:02.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/cube.frag 2018-04-27 11:24:19.000000000 +0000 @@ -24,7 +24,15 @@ layout (binding = 1) uniform sampler2D tex; layout (location = 0) in vec4 texcoord; +layout (location = 1) in vec3 frag_pos; layout (location = 0) out vec4 uFragColor; + +const vec3 lightDir= vec3(0.424, 0.566, 0.707); + void main() { - uFragColor = texture(tex, texcoord.xy); + vec3 dX = dFdx(frag_pos); + vec3 dY = dFdy(frag_pos); + vec3 normal = normalize(cross(dX,dY)); + float light = max(0.0, dot(lightDir, normal)); + uFragColor = light * texture(tex, texcoord.xy); } diff -Nru vulkan-1.1.70+dfsg1/demos/cube.vert vulkan-1.1.73+dfsg/demos/cube.vert --- vulkan-1.1.70+dfsg1/demos/cube.vert 2018-03-08 07:03:43.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/cube.vert 2018-04-27 11:24:19.000000000 +0000 @@ -28,9 +28,11 @@ } ubuf; layout (location = 0) out vec4 texcoord; +layout (location = 1) out vec3 frag_pos; void main() { texcoord = ubuf.attr[gl_VertexIndex]; gl_Position = ubuf.MVP * ubuf.position[gl_VertexIndex]; + frag_pos = gl_Position.xyz; } diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/common.cmake vulkan-1.1.73+dfsg/demos/macOS/common.cmake --- vulkan-1.1.70+dfsg1/demos/macOS/common.cmake 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/common.cmake 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,39 @@ +# Set up common settings for building all demos on Apple platforms. + +# Source for the MoltenVK ICD library and JSON file +set(MOLTENVK_DIR "${PROJECT_SOURCE_DIR}/external/MoltenVK") + +# MoltenVK JSON File + +# Modify the ICD JSON file to adjust the library path. +# The ICD JSON file goes in the Resources/vulkan/icd.d directory, so adjust the +# library_path to the relative path to the Frameworks directory in the bundle.. +# The regex does: substitute ':"' with: +# ': "../../../Frameworks/' +add_custom_target(MoltenVK_icd-staging-json ALL + COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/staging-json + COMMAND sed -e "/\"library_path\":/s$:[[:space:]]*\"[[:space:]]*[\\.\\/]*$: \"..\\/..\\/..\\/Frameworks\\/$" + ${MOLTENVK_DIR}/MoltenVK/icd/MoltenVK_icd.json > + ${CMAKE_CURRENT_BINARY_DIR}/staging-json/MoltenVK_icd.json + VERBATIM + DEPENDS "${MOLTENVK_DIR}/MoltenVK/icd/MoltenVK_icd.json" +) +set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/staging-json/MoltenVK_icd.json PROPERTIES + GENERATED TRUE +) + +find_library(COCOA NAMES Cocoa) + +# Locate Interface Builder Tool, needed to build things like Storyboards outside of Xcode. +if (NOT ${CMAKE_GENERATOR} MATCHES "^Xcode.*") + # Make sure we can find the 'ibtool' program. If we can NOT find it we + # skip generation of this project + find_program(IBTOOL ibtool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin") + if (${IBTOOL} STREQUAL "IBTOOL-NOTFOUND") + message(SEND_ERROR + "ibtool can not be found and is needed to compile the .xib files. " + "It should have been installed with the Apple developer tools. " + "The default system paths were searched in addition to ${OSX_DEVELOPER_ROOT}/usr/bin." + ) + endif() +endif() diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cube/AppDelegate.h vulkan-1.1.73+dfsg/demos/macOS/cube/AppDelegate.h --- vulkan-1.1.70+dfsg1/demos/macOS/cube/AppDelegate.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cube/AppDelegate.h 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,23 @@ +/* + * AppDelegate.h + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import + +@interface AppDelegate : NSObject + +@end diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cube/AppDelegate.m vulkan-1.1.73+dfsg/demos/macOS/cube/AppDelegate.m --- vulkan-1.1.70+dfsg1/demos/macOS/cube/AppDelegate.m 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cube/AppDelegate.m 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,39 @@ +/* + * AppDelegate.m + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + // Insert code here to initialize your application +} + +- (void)applicationWillTerminate:(NSNotification *)aNotification { + // Insert code here to tear down your application +} + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender { + return YES; +} + +@end diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cube/cube.cmake vulkan-1.1.73+dfsg/demos/macOS/cube/cube.cmake --- vulkan-1.1.70+dfsg1/demos/macOS/cube/cube.cmake 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cube/cube.cmake 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,98 @@ +# Cube Application Bundle + +set(cube_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cube/main.m + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cube/AppDelegate.m + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cube/DemoViewController.m +) +set(cube_HDRS + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cube/AppDelegate.h + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cube/DemoViewController.h +) +set(cube_RESOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/lunarg.ppm + ${CMAKE_CURRENT_BINARY_DIR}/staging-json/MoltenVK_icd.json + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cube/Resources/LunarGIcon.icns +) + +# Have Xcode handle the Storyboard +if(${CMAKE_GENERATOR} MATCHES "^Xcode.*") + set(cube_RESOURCES ${cube_RESOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cube/Resources/Main.storyboard + ) +endif() + +add_executable(cube MACOSX_BUNDLE + ${cube_SRCS} + ${cube_HDRS} + ${cube_RESOURCES} + cube.vert.inc cube.frag.inc +) + +# Handle the Storyboard ourselves +if(NOT ${CMAKE_GENERATOR} MATCHES "^Xcode.*") + # Compile the storyboard file with the ibtool. + add_custom_command(TARGET cube POST_BUILD + COMMAND ${IBTOOL} --errors --warnings --notices --output-format human-readable-text + --compile ${CMAKE_CURRENT_BINARY_DIR}/cube.app/Contents/Resources/Main.storyboardc + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cube/Resources/Main.storyboard + COMMENT "Compiling storyboard" + ) +endif() + +add_dependencies(cube MoltenVK_icd-staging-json) + +# Include demo source code dir because the MacOS cube's Objective-C source includes +# the "original" cube application C source code. +# Also include the MoltenVK helper files. +target_include_directories(cube PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${MOLTENVK_DIR}/MoltenVK/include +) + +target_link_libraries(cube ${LIBRARIES} "-framework Cocoa -framework QuartzCore") + +set_target_properties(cube PROPERTIES + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cube/Info.plist +) + +# The RESOURCE target property cannot be used in conjunction with the MACOSX_PACKAGE_LOCATION +# property. We need fine-grained control over the Resource directory, so we have to specify +# the destination of all the resource files on a per-destination-directory basis. +# If all the files went into the top-level Resource directory, then we could simply set +# the RESOURCE property to a list of all the resource files. +set_source_files_properties(${cube_RESOURCES} PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources" +) +set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/staging-json/MoltenVK_icd.json" PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources/vulkan/icd.d" +) + +# Copy the MoltenVK lib into the bundle. +if(${CMAKE_GENERATOR} MATCHES "^Xcode.*") + add_custom_command(TARGET cube POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "${MOLTENVK_DIR}/MoltenVK/MacOS/libMoltenVK.dylib" + ${CMAKE_CURRENT_BINARY_DIR}/$/cube.app/Contents/Frameworks/libMoltenVK.dylib + DEPENDS vulkan + ) +else() + add_custom_command(TARGET cube POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "${MOLTENVK_DIR}/MoltenVK/MacOS/libMoltenVK.dylib" + ${CMAKE_CURRENT_BINARY_DIR}/cube.app/Contents/Frameworks/libMoltenVK.dylib + DEPENDS vulkan + ) +endif() + +# Fix up the library search path in the executable to find (loader) libraries in the bundle. +install(CODE " + include(BundleUtilities) + fixup_bundle(${CMAKE_INSTALL_PREFIX}/demos/cube.app \"\" \"\") + " COMPONENT Runtime +) + +# Not sure this is needed. When activated, it makes a symlink from +# libvulkan.dylib to libvulkan.1.dylib (which in turn symlinks to libvulkan.1.0.xx.dylib.) +# install(FILES +# "${CMAKE_BINARY_DIR}/loader/libvulkan.dylib" +# DESTINATION "demos/cube.app/Contents/MacOS" +# COMPONENT Runtime) diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cube/DemoViewController.h vulkan-1.1.73+dfsg/demos/macOS/cube/DemoViewController.h --- vulkan-1.1.70+dfsg1/demos/macOS/cube/DemoViewController.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cube/DemoViewController.h 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,33 @@ +/* + * DemoViewController.h + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import + +#pragma mark - +#pragma mark DemoViewController + +/** The main view controller for the demo storyboard. */ +@interface DemoViewController : NSViewController +@end + +#pragma mark - +#pragma mark DemoView + +/** The Metal-compatibile view for the demo Storyboard. */ +@interface DemoView : NSView +@end diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cube/DemoViewController.m vulkan-1.1.73+dfsg/demos/macOS/cube/DemoViewController.m --- vulkan-1.1.70+dfsg1/demos/macOS/cube/DemoViewController.m 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cube/DemoViewController.m 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,118 @@ +/* + * DemoViewController.m + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import "DemoViewController.h" +#import + +#include + +#include "cube.c" + +#pragma mark - +#pragma mark DemoViewController + +@implementation DemoViewController { + CVDisplayLinkRef _displayLink; + struct demo demo; + NSTimer* _timer; +} + +- (void)dealloc { + demo_cleanup(&demo); + CVDisplayLinkRelease(_displayLink); + [super dealloc]; +} + +/** Since this is a single-view app, initialize Vulkan during view loading. */ +- (void)viewDidLoad { + [super viewDidLoad]; + + self.view.wantsLayer = YES; // Back the view with a layer created by the makeBackingLayer method. + + // Convert incoming args to "C" argc/argv strings + NSArray *args = [[NSProcessInfo processInfo] arguments]; + const char** argv = (const char**) alloca(sizeof(char*) * args.count); + for(unsigned int i = 0; i < args.count; i++) { + NSString *s = args[i]; + argv[i] = s.UTF8String; + } + + demo_main(&demo, self.view, args.count, argv); + + // Monitor the rendering loop for a quit condition + _timer = [NSTimer scheduledTimerWithTimeInterval: 0.2 + target: self + selector: @selector(onTick:) + userInfo: self + repeats: YES]; + + // Start the rendering loop + CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink); + CVDisplayLinkSetOutputCallback(_displayLink, &DisplayLinkCallback, &demo); + CVDisplayLinkStart(_displayLink); + +} + +// Close the window if the demo is in a Quit state +-(void)onTick:(NSTimer*)timer { + if (demo.quit) { + [[[self view] window] close]; + } +} + +#pragma mark Display loop callback function + +/** Rendering loop callback function for use with a CVDisplayLink. */ +static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, + const CVTimeStamp* outputTime, + CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* target) { + struct demo* demo = (struct demo*)target; + demo_run(demo); + if (demo->quit) { + CVDisplayLinkStop(displayLink); + CVDisplayLinkRelease(displayLink); + } + return kCVReturnSuccess; +} + +@end + +#pragma mark - +#pragma mark DemoView + +@implementation DemoView + +/** Indicates that the view wants to draw using the backing layer instead of using drawRect:. */ +- (BOOL)wantsUpdateLayer { + return YES; +} + +/** Returns a Metal-compatible layer. */ ++ (Class)layerClass { + return [CAMetalLayer class]; +} + +/** If the wantsLayer property is set to YES, this method will be invoked to return a layer instance. */ +- (CALayer*)makeBackingLayer { + CALayer* layer = [self.class.layerClass layer]; + CGSize viewScale = [self convertSizeToBacking:CGSizeMake(1.0, 1.0)]; + layer.contentsScale = MIN(viewScale.width, viewScale.height); + return layer; +} + +@end diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cube/Info.plist vulkan-1.1.73+dfsg/demos/macOS/cube/Info.plist --- vulkan-1.1.70+dfsg1/demos/macOS/cube/Info.plist 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cube/Info.plist 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,38 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleGetInfoString + Cube + CFBundleIconFile + LunarGIcon.icns + CFBundleIdentifier + com.lunarg.cube + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLongVersionString + 1.0 + CFBundleName + Cube + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + CSResourcesFileMapped + + NSHumanReadableCopyright + Copyright (c) 2018 The Khronos Group Inc. LunarG Inc. All rights reserved. + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + + \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cube/main.m vulkan-1.1.73+dfsg/demos/macOS/cube/main.m --- vulkan-1.1.70+dfsg1/demos/macOS/cube/main.m 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cube/main.m 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,21 @@ +/* + * main.m + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import + +int main(int argc, const char* argv[]) { return NSApplicationMain(argc, argv); } Binary files /tmp/tmpTy0BwM/F1_a9fSeD2/vulkan-1.1.70+dfsg1/demos/macOS/cube/Resources/LunarGIcon.icns and /tmp/tmpTy0BwM/pRYgf26cki/vulkan-1.1.73+dfsg/demos/macOS/cube/Resources/LunarGIcon.icns differ diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cube/Resources/Main.storyboard vulkan-1.1.73+dfsg/demos/macOS/cube/Resources/Main.storyboard --- vulkan-1.1.70+dfsg1/demos/macOS/cube/Resources/Main.storyboard 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cube/Resources/Main.storyboard 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cubepp/AppDelegate.h vulkan-1.1.73+dfsg/demos/macOS/cubepp/AppDelegate.h --- vulkan-1.1.70+dfsg1/demos/macOS/cubepp/AppDelegate.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cubepp/AppDelegate.h 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,23 @@ +/* + * AppDelegate.h + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import + +@interface AppDelegate : NSObject + +@end diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cubepp/AppDelegate.mm vulkan-1.1.73+dfsg/demos/macOS/cubepp/AppDelegate.mm --- vulkan-1.1.70+dfsg1/demos/macOS/cubepp/AppDelegate.mm 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cubepp/AppDelegate.mm 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,39 @@ +/* + * AppDelegate.m + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + // Insert code here to initialize your application +} + +- (void)applicationWillTerminate:(NSNotification *)aNotification { + // Insert code here to tear down your application +} + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender { + return YES; +} + +@end diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cubepp/cubepp.cmake vulkan-1.1.73+dfsg/demos/macOS/cubepp/cubepp.cmake --- vulkan-1.1.70+dfsg1/demos/macOS/cubepp/cubepp.cmake 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cubepp/cubepp.cmake 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,104 @@ +# Cube Application Bundle + +set(cubepp_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cubepp/main.mm + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cubepp/AppDelegate.mm + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cubepp/DemoViewController.mm +) +set(cubepp_HDRS + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cubepp/AppDelegate.h + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cubepp/DemoViewController.h +) +set(cubepp_RESOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/lunarg.ppm + ${CMAKE_CURRENT_BINARY_DIR}/staging-json/MoltenVK_icd.json + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cubepp/Resources/LunarGIcon.icns +) + +# Have Xcode handle the Storyboard +if(${CMAKE_GENERATOR} MATCHES "^Xcode.*") + set(cubepp_RESOURCES ${cubepp_RESOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cubepp/Resources/Main.storyboard + ) +endif() + +add_executable(cubepp MACOSX_BUNDLE + ${cubepp_SRCS} + ${cubepp_HDRS} + ${cubepp_RESOURCES} + cube.vert.inc cube.frag.inc +) + +# Handle the Storyboard ourselves +if(NOT ${CMAKE_GENERATOR} MATCHES "^Xcode.*") + # Compile the storyboard file with the ibtool. + add_custom_command(TARGET cubepp POST_BUILD + COMMAND ${IBTOOL} --errors --warnings --notices --output-format human-readable-text + --compile ${CMAKE_CURRENT_BINARY_DIR}/cubepp.app/Contents/Resources/Main.storyboardc + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cubepp/Resources/Main.storyboard + COMMENT "Compiling storyboard" + ) +endif() + +add_dependencies(cubepp MoltenVK_icd-staging-json) + +# Include demo source code dir because the MacOS cubepp's Objective-C source includes +# the "original" cubepp application C++ source code. +# Also include the MoltenVK helper files. +target_include_directories(cubepp PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${MOLTENVK_DIR}/MoltenVK/include +) + +target_link_libraries(cubepp ${LIBRARIES} "-framework Cocoa -framework QuartzCore") + +set_target_properties(cubepp PROPERTIES + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/macOS/cubepp/Info.plist +) + +# The RESOURCE target property cannot be used in conjunction with the MACOSX_PACKAGE_LOCATION +# property. We need fine-grained control over the Resource directory, so we have to specify +# the destination of all the resource files on a per-destination-directory basis. +# If all the files went into the top-level Resource directory, then we could simply set +# the RESOURCE property to a list of all the resource files. +set_source_files_properties(${cubepp_RESOURCES} PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources" +) +set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/staging-json/MoltenVK_icd.json" PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources/vulkan/icd.d" +) + +# Direct the MoltenVK library to the right place. +install(FILES "${MOLTENVK_DIR}/MoltenVK/MacOS/libMoltenVK.dylib" + DESTINATION "demos/cubepp.app/Contents/Frameworks" + COMPONENT Runtime +) + +# Copy the MoltenVK lib into the bundle. +if(${CMAKE_GENERATOR} MATCHES "^Xcode.*") + add_custom_command(TARGET cubepp POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "${MOLTENVK_DIR}/MoltenVK/MacOS/libMoltenVK.dylib" + ${CMAKE_CURRENT_BINARY_DIR}/$/cubepp.app/Contents/Frameworks/libMoltenVK.dylib + DEPENDS vulkan + ) +else() + add_custom_command(TARGET cubepp POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "${MOLTENVK_DIR}/MoltenVK/MacOS/libMoltenVK.dylib" + ${CMAKE_CURRENT_BINARY_DIR}/cubepp.app/Contents/Frameworks/libMoltenVK.dylib + DEPENDS vulkan + ) +endif() + +# Fix up the library search path in the executable to find (loader) libraries in the bundle. +install(CODE " + include(BundleUtilities) + fixup_bundle(${CMAKE_INSTALL_PREFIX}/demos/cubepp.app \"\" \"\") + " COMPONENT Runtime +) + +# Not sure this is needed. When activated, it makes a symlink from +# libvulkan.dylib to libvulkan.1.dylib (which in turn symlinks to libvulkan.1.0.xx.dylib.) +# install(FILES +# "${CMAKE_BINARY_DIR}/loader/libvulkan.dylib" +# DESTINATION "demos/cubepp.app/Contents/MacOS" +# COMPONENT Runtime) diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cubepp/DemoViewController.h vulkan-1.1.73+dfsg/demos/macOS/cubepp/DemoViewController.h --- vulkan-1.1.70+dfsg1/demos/macOS/cubepp/DemoViewController.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cubepp/DemoViewController.h 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,33 @@ +/* + * DemoViewController.h + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import + +#pragma mark - +#pragma mark DemoViewController + +/** The main view controller for the demo storyboard. */ +@interface DemoViewController : NSViewController +@end + +#pragma mark - +#pragma mark DemoView + +/** The Metal-compatibile view for the demo Storyboard. */ +@interface DemoView : NSView +@end diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cubepp/DemoViewController.mm vulkan-1.1.73+dfsg/demos/macOS/cubepp/DemoViewController.mm --- vulkan-1.1.70+dfsg1/demos/macOS/cubepp/DemoViewController.mm 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cubepp/DemoViewController.mm 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,117 @@ +/* + * DemoViewController.m + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import "DemoViewController.h" +#import + +#include + +#include "cube.cpp" + +#pragma mark - +#pragma mark DemoViewController + +@implementation DemoViewController { + CVDisplayLinkRef _displayLink; + struct Demo demo; + NSTimer* _timer; +} + +- (void)dealloc { + demo.cleanup(); + CVDisplayLinkRelease(_displayLink); + [super dealloc]; +} + +/** Since this is a single-view app, initialize Vulkan during view loading. */ +- (void)viewDidLoad { + [super viewDidLoad]; + + self.view.wantsLayer = YES; // Back the view with a layer created by the makeBackingLayer method. + + // Convert incoming args to "C" argc/argv strings + NSArray *args = [[NSProcessInfo processInfo] arguments]; + const char** argv = (const char**) alloca(sizeof(char*) * args.count); + for(unsigned int i = 0; i < args.count; i++) { + NSString *s = args[i]; + argv[i] = s.UTF8String; + } + + demo_main(demo, self.view, args.count, argv); + + // Monitor the rendering loop for a quit condition + _timer = [NSTimer scheduledTimerWithTimeInterval: 0.2 + target: self + selector: @selector(onTick:) + userInfo: self + repeats: YES]; + + // Start the rendering loop + CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink); + CVDisplayLinkSetOutputCallback(_displayLink, &DisplayLinkCallback, &demo); + CVDisplayLinkStart(_displayLink); +} + +// Close the window if the demo is in a Quit state +-(void)onTick:(NSTimer*)timer { + if (demo.quit) { + [[[self view] window] close]; + } +} + +#pragma mark Display loop callback function + +/** Rendering loop callback function for use with a CVDisplayLink. */ +static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, + const CVTimeStamp* outputTime, + CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* target) { + struct Demo* demo = (struct Demo*)target; + demo->run(); + if (demo->quit) { + CVDisplayLinkStop(displayLink); + CVDisplayLinkRelease(displayLink); + } + return kCVReturnSuccess; +} + +@end + +#pragma mark - +#pragma mark DemoView + +@implementation DemoView + +/** Indicates that the view wants to draw using the backing layer instead of using drawRect:. */ +- (BOOL)wantsUpdateLayer { + return YES; +} + +/** Returns a Metal-compatible layer. */ ++ (Class)layerClass { + return [CAMetalLayer class]; +} + +/** If the wantsLayer property is set to YES, this method will be invoked to return a layer instance. */ +- (CALayer*)makeBackingLayer { + CALayer* layer = [self.class.layerClass layer]; + CGSize viewScale = [self convertSizeToBacking:CGSizeMake(1.0, 1.0)]; + layer.contentsScale = MIN(viewScale.width, viewScale.height); + return layer; +} + +@end diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cubepp/Info.plist vulkan-1.1.73+dfsg/demos/macOS/cubepp/Info.plist --- vulkan-1.1.70+dfsg1/demos/macOS/cubepp/Info.plist 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cubepp/Info.plist 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,38 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleGetInfoString + Cubepp + CFBundleIconFile + LunarGIcon.icns + CFBundleIdentifier + com.lunarg.cubepp + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLongVersionString + 1.0 + CFBundleName + Cubepp + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + CSResourcesFileMapped + + NSHumanReadableCopyright + Copyright (c) 2018 The Khronos Group Inc. LunarG Inc. All rights reserved. + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + + \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cubepp/main.mm vulkan-1.1.73+dfsg/demos/macOS/cubepp/main.mm --- vulkan-1.1.70+dfsg1/demos/macOS/cubepp/main.mm 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cubepp/main.mm 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,21 @@ +/* + * main.m + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import + +int main(int argc, const char* argv[]) { return NSApplicationMain(argc, argv); } Binary files /tmp/tmpTy0BwM/F1_a9fSeD2/vulkan-1.1.70+dfsg1/demos/macOS/cubepp/Resources/LunarGIcon.icns and /tmp/tmpTy0BwM/pRYgf26cki/vulkan-1.1.73+dfsg/demos/macOS/cubepp/Resources/LunarGIcon.icns differ diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/cubepp/Resources/Main.storyboard vulkan-1.1.73+dfsg/demos/macOS/cubepp/Resources/Main.storyboard --- vulkan-1.1.70+dfsg1/demos/macOS/cubepp/Resources/Main.storyboard 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/cubepp/Resources/Main.storyboard 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/tmpTy0BwM/F1_a9fSeD2/vulkan-1.1.70+dfsg1/demos/macOS/vulkaninfo/Resources/LunarGIcon.icns and /tmp/tmpTy0BwM/pRYgf26cki/vulkan-1.1.73+dfsg/demos/macOS/vulkaninfo/Resources/LunarGIcon.icns differ diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/vulkaninfo/vulkaninfo.cmake vulkan-1.1.73+dfsg/demos/macOS/vulkaninfo/vulkaninfo.cmake --- vulkan-1.1.70+dfsg1/demos/macOS/vulkaninfo/vulkaninfo.cmake 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/vulkaninfo/vulkaninfo.cmake 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,53 @@ +# Vulkaninfo Application Bundle + +# We already have a "vulkaninfo" target, so create a new target with a different name +# and use the OUTPUT_NAME property to rename the target to the desired name. +# The standalone binary is called "vulkaninfo" and the bundle is called "vulkaninfo.app". +# Note that the executable is a script that launches Terminal to see the output. +add_executable(vulkaninfo-bundle MACOSX_BUNDLE + vulkaninfo.c + ${CMAKE_CURRENT_BINARY_DIR}/staging-json/MoltenVK_icd.json + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/vulkaninfo/vulkaninfo.sh + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/vulkaninfo/Resources/LunarGIcon.icns +) +set_target_properties(vulkaninfo-bundle PROPERTIES + OUTPUT_NAME vulkaninfo + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/macOS/vulkaninfo/Info.plist +) +target_link_libraries(vulkaninfo-bundle ${LIBRARIES}) +add_dependencies(vulkaninfo-bundle MoltenVK_icd-staging-json) +set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/macOS/vulkaninfo/vulkaninfo.sh PROPERTIES + MACOSX_PACKAGE_LOCATION "MacOS" +) +set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/macOS/vulkaninfo/Resources/LunarGIcon.icns PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources" +) +# Direct the MoltenVK library to the right place. +install(FILES "${MOLTENVK_DIR}/MoltenVK/MacOS/libMoltenVK.dylib" + DESTINATION "demos/vulkaninfo.app/Contents/Frameworks" + COMPONENT Runtime +) +# Xcode projects need some extra help with what would be install steps. +if(${CMAKE_GENERATOR} MATCHES "^Xcode.*") + add_custom_command(TARGET vulkaninfo-bundle POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "${MOLTENVK_DIR}/MoltenVK/MacOS/libMoltenVK.dylib" + ${CMAKE_CURRENT_BINARY_DIR}/$/vulkaninfo.app/Contents/Frameworks/libMoltenVK.dylib + DEPENDS vulkan + ) +else() + add_custom_command(TARGET vulkaninfo-bundle POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "${MOLTENVK_DIR}/MoltenVK/MacOS/libMoltenVK.dylib" + ${CMAKE_CURRENT_BINARY_DIR}/vulkaninfo.app/Contents/Frameworks/libMoltenVK.dylib + DEPENDS vulkan + ) +endif() + +# Fix up the library search path in the executable to find (loader) libraries in the bundle. +# When fixup_bundle() is passed a bundle in the first argument, it looks at the Info.plist file +# to determine the BundleExecutable. In this case, the executable is a script, which can't be fixed up. +# Instead pass it the explicit name of the executable. +install(CODE " + include(BundleUtilities) + fixup_bundle(${CMAKE_INSTALL_PREFIX}/demos/vulkaninfo.app/Contents/MacOS/vulkaninfo \"\" \"\") + " COMPONENT Runtime +) diff -Nru vulkan-1.1.70+dfsg1/demos/macOS/vulkaninfo/vulkaninfo.sh vulkan-1.1.73+dfsg/demos/macOS/vulkaninfo/vulkaninfo.sh --- vulkan-1.1.70+dfsg1/demos/macOS/vulkaninfo/vulkaninfo.sh 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/macOS/vulkaninfo/vulkaninfo.sh 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,3 @@ +#!/bin/bash +BASEDIR=`dirname $0` +open /Applications/Utilities/Terminal.app $BASEDIR/vulkaninfo diff -Nru vulkan-1.1.70+dfsg1/demos/smoke/CMakeLists.txt vulkan-1.1.73+dfsg/demos/smoke/CMakeLists.txt --- vulkan-1.1.70+dfsg1/demos/smoke/CMakeLists.txt 2018-03-08 15:06:23.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/smoke/CMakeLists.txt 2018-04-27 11:24:19.000000000 +0000 @@ -52,7 +52,12 @@ set(libraries PRIVATE ${CMAKE_THREAD_LIBS_INIT}) if(TARGET vulkan) - list(APPEND definitions PRIVATE -DUNINSTALLED_LOADER="$") + if(APPLE) + # For macOS, the "uninstalled" location is in the bundle + list(APPEND definitions PRIVATE -DUNINSTALLED_LOADER="./libvulkan.1.dylib") + else() + list(APPEND definitions PRIVATE -DUNINSTALLED_LOADER="$") + endif() endif() if(WIN32) @@ -60,7 +65,7 @@ list(APPEND definitions PRIVATE -DWIN32_LEAN_AND_MEAN) list(APPEND sources ShellWin32.cpp ShellWin32.h) -else() +elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") list(APPEND libraries PRIVATE -ldl -lrt) if(BUILD_WSI_XCB_SUPPORT AND DEMOS_WSI_SELECTION STREQUAL "XCB") @@ -78,15 +83,99 @@ list(APPEND includes PRIVATE ${WAYLAND_CLIENT_INCLUDE_DIR}) list(APPEND libraries PRIVATE ${WAYLAND_CLIENT_LIBRARIES}) endif() +elseif(APPLE) + set(LIBRARIES) + list(APPEND sources + macOS/AppDelegate.h macOS/AppDelegate.m + macOS/DemoViewController.h macOS/DemoViewController.mm + macOS/main.m macOS/ShellMVK.cpp macOS/ShellMVK.h + ) + list(APPEND includes + ${CMAKE_CURRENT_SOURCE_DIR} + ${MOLTENVK_DIR}/MoltenVK/include) + list(APPEND libraries + "-framework Cocoa -framework QuartzCore") + set(smoketest_RESOURCES + ${CMAKE_BINARY_DIR}/demos/staging-json/MoltenVK_icd.json + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/Resources/LunarGIcon.icns + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/Resources/Main.storyboard + ) + set_source_files_properties(${CMAKE_BINARY_DIR}/demos/staging-json/MoltenVK_icd.json PROPERTIES + GENERATED TRUE + ) + # Have Xcode handle the Storyboard + if(${CMAKE_GENERATOR} MATCHES "^Xcode.*") + list(APPEND sources + macOS/Resources/Main.storyboard + ) + endif() endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/..) -add_executable(smoketest ${sources}) +add_executable(smoketest MACOSX_BUNDLE ${sources} ${smoketest_RESOURCES}) target_compile_definitions(smoketest ${definitions}) target_include_directories(smoketest ${includes}) target_link_libraries(smoketest ${libraries}) +if(APPLE) + # Handle the Storyboard ourselves + if(NOT ${CMAKE_GENERATOR} MATCHES "^Xcode.*") + # Compile the storyboard file with the ibtool. + add_custom_command(TARGET smoketest POST_BUILD + COMMAND ${IBTOOL} --errors --warnings --notices --output-format human-readable-text + --compile ${CMAKE_CURRENT_BINARY_DIR}/../smoketest.app/Contents/Resources/Main.storyboardc + ${CMAKE_CURRENT_SOURCE_DIR}/macOS/Resources/Main.storyboard + COMMENT "Compiling storyboard" + ) + endif() + + add_dependencies(smoketest MoltenVK_icd-staging-json) + + set_target_properties(smoketest PROPERTIES + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/macOS/Info.plist + ) + set_source_files_properties(${smoketest_RESOURCES} PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources" + ) + set_source_files_properties("${CMAKE_BINARY_DIR}/demos/staging-json/MoltenVK_icd.json" PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources/vulkan/icd.d" + ) + + # Direct the MoltenVK library to the right place. + install(FILES "${MOLTENVK_DIR}/MoltenVK/MacOS/libMoltenVK.dylib" + DESTINATION "demos/smoketest.app/Contents/Frameworks" + COMPONENT Runtime + ) + + # Xcode projects need some extra help with what would be install steps. + # Vulkan lib needs to be copied manually since smoke does not link it. + if(${CMAKE_GENERATOR} MATCHES "^Xcode.*") + add_custom_command(TARGET smoketest POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "$" + ${CMAKE_CURRENT_BINARY_DIR}/../$/smoketest.app/Contents/MacOS/libvulkan.1.dylib + COMMAND ${CMAKE_COMMAND} -E copy "${MOLTENVK_DIR}/MoltenVK/MacOS/libMoltenVK.dylib" + ${CMAKE_CURRENT_BINARY_DIR}/../$/smoketest.app/Contents/Frameworks/libMoltenVK.dylib + DEPENDS vulkan + ) + else() + add_custom_command(TARGET smoketest POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "$" + ${CMAKE_CURRENT_BINARY_DIR}/../smoketest.app/Contents/MacOS/libvulkan.1.dylib + COMMAND ${CMAKE_COMMAND} -E copy "${MOLTENVK_DIR}/MoltenVK/MacOS/libMoltenVK.dylib" + ${CMAKE_CURRENT_BINARY_DIR}/../smoketest.app/Contents/Frameworks/libMoltenVK.dylib + DEPENDS vulkan + ) + endif() + + # Fix up the library search path in the executable to find (loader) libraries in the bundle. + install(CODE " + include(BundleUtilities) + fixup_bundle(${CMAKE_INSTALL_PREFIX}/demos/smoketest.app \"\" \"\") + " COMPONENT Runtime + ) +endif() + if(UNIX) if(INSTALL_LVL_FILES) install(TARGETS smoketest DESTINATION ${CMAKE_INSTALL_BINDIR}) diff -Nru vulkan-1.1.70+dfsg1/demos/smoke/generate-dispatch-table.py vulkan-1.1.73+dfsg/demos/smoke/generate-dispatch-table.py --- vulkan-1.1.70+dfsg1/demos/smoke/generate-dispatch-table.py 2017-11-08 08:23:02.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/smoke/generate-dispatch-table.py 2018-04-27 11:24:19.000000000 +0000 @@ -295,6 +295,14 @@ Command(name='DebugReportMessageEXT', dispatch='VkInstance'), ]) +vk_mvk_ios_surface = Extension(name='VK_MVK_ios_surface', version=1, guard='VK_USE_PLATFORM_IOS_MVK', commands=[ + Command(name='CreateIOSSurfaceMVK', dispatch='VkInstance'), +]) + +vk_mvk_macos_surface = Extension(name='VK_MVK_macos_surface', version=1, guard='VK_USE_PLATFORM_MACOS_MVK', commands=[ + Command(name='CreateMacOSSurfaceMVK', dispatch='VkInstance'), +]) + extensions = [ vk_core, vk_khr_surface, @@ -308,6 +316,8 @@ vk_khr_android_surface, vk_khr_win32_surface, vk_ext_debug_report, + vk_mvk_ios_surface, + vk_mvk_macos_surface, ] def generate_header(guard): diff -Nru vulkan-1.1.70+dfsg1/demos/smoke/macOS/AppDelegate.h vulkan-1.1.73+dfsg/demos/smoke/macOS/AppDelegate.h --- vulkan-1.1.70+dfsg1/demos/smoke/macOS/AppDelegate.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/smoke/macOS/AppDelegate.h 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,23 @@ +/* + * AppDelegate.h + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import + +@interface AppDelegate : NSObject + +@end diff -Nru vulkan-1.1.70+dfsg1/demos/smoke/macOS/AppDelegate.m vulkan-1.1.73+dfsg/demos/smoke/macOS/AppDelegate.m --- vulkan-1.1.70+dfsg1/demos/smoke/macOS/AppDelegate.m 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/smoke/macOS/AppDelegate.m 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,39 @@ +/* + * AppDelegate.m + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + // Insert code here to initialize your application +} + +- (void)applicationWillTerminate:(NSNotification *)aNotification { + // Insert code here to tear down your application +} + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender { + return YES; +} + +@end diff -Nru vulkan-1.1.70+dfsg1/demos/smoke/macOS/DemoViewController.h vulkan-1.1.73+dfsg/demos/smoke/macOS/DemoViewController.h --- vulkan-1.1.70+dfsg1/demos/smoke/macOS/DemoViewController.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/smoke/macOS/DemoViewController.h 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,33 @@ +/* + * DemoViewController.h + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import + +#pragma mark - +#pragma mark DemoViewController + +/** The main view controller for the demo storyboard. */ +@interface DemoViewController : NSViewController +@end + +#pragma mark - +#pragma mark DemoView + +/** The Metal-compatibile view for the demo Storyboard. */ +@interface DemoView : NSView +@end diff -Nru vulkan-1.1.70+dfsg1/demos/smoke/macOS/DemoViewController.mm vulkan-1.1.73+dfsg/demos/smoke/macOS/DemoViewController.mm --- vulkan-1.1.70+dfsg1/demos/smoke/macOS/DemoViewController.mm 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/smoke/macOS/DemoViewController.mm 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,126 @@ +/* + * DemoViewController.mm + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import "DemoViewController.h" +#import + +#include "ShellMVK.h" +#include "Smoke.h" + +#pragma mark - +#pragma mark DemoViewController + +@implementation DemoViewController { + CVDisplayLinkRef _displayLink; + ShellMVK* _shell; + Game* _game; +} + +- (void)dealloc { + delete _shell; + delete _game; + CVDisplayLinkRelease(_displayLink); + [super dealloc]; +} + +/** Since this is a single-view app, initialize Vulkan during view loading. */ +- (void)viewDidLoad { + [super viewDidLoad]; + + self.view.wantsLayer = YES; // Back the view with a layer created by the makeBackingLayer method. + + std::vector args; + // args.push_back("-p"); // Uncomment to use push constants + // args.push_back("-s"); // Uncomment to use a single thread + _game = new Smoke(args); + + _shell = new ShellMVK(*_game); + _shell->run(self.view); + + CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink); + CVDisplayLinkSetOutputCallback(_displayLink, &DisplayLinkCallback, _shell); + CVDisplayLinkStart(_displayLink); +} + +#pragma mark Display loop callback function + +/** Rendering loop callback function for use with a CVDisplayLink. */ +static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, + CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* target) { + ((ShellMVK*)target)->update_and_draw(); + return kCVReturnSuccess; +} + +- (void)viewDidAppear { + self.view.window.initialFirstResponder = self.view; +} + +// Delegated from the view as first responder. +- (void)keyDown:(NSEvent*)theEvent { + Game::Key key; + switch (theEvent.keyCode) { + case 53: + key = Game::KEY_ESC; + break; + case 126: + key = Game::KEY_UP; + break; + case 125: + key = Game::KEY_DOWN; + break; + case 49: + key = Game::KEY_SPACE; + break; + default: + key = Game::KEY_UNKNOWN; + break; + } + + _game->on_key(key); +} + +@end + +#pragma mark - +#pragma mark DemoView + +@implementation DemoView + +/** Indicates that the view wants to draw using the backing layer instead of using drawRect:. */ +- (BOOL)wantsUpdateLayer { + return YES; +} + +/** Returns a Metal-compatible layer. */ ++ (Class)layerClass { + return [CAMetalLayer class]; +} + +/** If the wantsLayer property is set to YES, this method will be invoked to return a layer instance. */ +- (CALayer*)makeBackingLayer { + CALayer* layer = [self.class.layerClass layer]; + CGSize viewScale = [self convertSizeToBacking:CGSizeMake(1.0, 1.0)]; + layer.contentsScale = MIN(viewScale.width, viewScale.height); + return layer; +} + +- (BOOL)acceptsFirstResponder { + return YES; +} + +@end diff -Nru vulkan-1.1.70+dfsg1/demos/smoke/macOS/main.m vulkan-1.1.73+dfsg/demos/smoke/macOS/main.m --- vulkan-1.1.70+dfsg1/demos/smoke/macOS/main.m 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/smoke/macOS/main.m 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,21 @@ +/* + * main.m + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * 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. + */ + +#import + +int main(int argc, const char* argv[]) { return NSApplicationMain(argc, argv); } Binary files /tmp/tmpTy0BwM/F1_a9fSeD2/vulkan-1.1.70+dfsg1/demos/smoke/macOS/Resources/LunarGIcon.icns and /tmp/tmpTy0BwM/pRYgf26cki/vulkan-1.1.73+dfsg/demos/smoke/macOS/Resources/LunarGIcon.icns differ diff -Nru vulkan-1.1.70+dfsg1/demos/smoke/macOS/Resources/Main.storyboard vulkan-1.1.73+dfsg/demos/smoke/macOS/Resources/Main.storyboard --- vulkan-1.1.70+dfsg1/demos/smoke/macOS/Resources/Main.storyboard 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/smoke/macOS/Resources/Main.storyboard 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru vulkan-1.1.70+dfsg1/demos/smoke/macOS/ShellMVK.cpp vulkan-1.1.73+dfsg/demos/smoke/macOS/ShellMVK.cpp --- vulkan-1.1.70+dfsg1/demos/smoke/macOS/ShellMVK.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/smoke/macOS/ShellMVK.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2016-2018 The Brenwill Workshop Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "ShellMVK.h" +#include +#include +#include +#include +#include +#include "Helpers.h" +#include "Game.h" + +PosixTimer::PosixTimer() { + _tsBase = mach_absolute_time(); + mach_timebase_info_data_t timebase; + mach_timebase_info(&timebase); + _tsPeriod = (double)timebase.numer / (double)timebase.denom; +} + +double PosixTimer::get() { return (double)(mach_absolute_time() - _tsBase) * _tsPeriod / 1e9; } + +ShellMVK::ShellMVK(Game& game) : Shell(game) { + _timer = PosixTimer(); + _current_time = _timer.get(); + _profile_start_time = _current_time; + _profile_present_count = 0; + +#ifdef VK_USE_PLATFORM_IOS_MVK + instance_extensions_.push_back(VK_MVK_IOS_SURFACE_EXTENSION_NAME); +#endif +#ifdef VK_USE_PLATFORM_MACOS_MVK + instance_extensions_.push_back(VK_MVK_MACOS_SURFACE_EXTENSION_NAME); +#endif + + init_vk(); +} + +ShellMVK::~ShellMVK() { + destroy_context(); + cleanup_vk(); +} + +PFN_vkGetInstanceProcAddr ShellMVK::load_vk() { + const char filename[] = "libvulkan.1.dylib"; + void* handle = NULL; + void* symbol = NULL; + +#ifdef UNINSTALLED_LOADER + // Try to load the loader from the defined location. + handle = dlopen(UNINSTALLED_LOADER, RTLD_LAZY); +#endif + // If still no loader, try in the bundle executable directory. + if (!handle) { + unsigned int bufferSize = 512; + std::vector buffer(bufferSize + 1); + if (_NSGetExecutablePath(&buffer[0], &bufferSize)) { + buffer.resize(bufferSize); + _NSGetExecutablePath(&buffer[0], &bufferSize); + } + std::string s = &buffer[0]; + size_t i = s.rfind("smoketest"); + s.replace(i, std::string::npos, filename); + handle = dlopen(s.c_str(), RTLD_LAZY); + } + // If still no luck, try the default system libs with the default lib name. + if (!handle) handle = dlopen(filename, RTLD_LAZY); + + if (handle) symbol = dlsym(handle, "vkGetInstanceProcAddr"); + + if (!handle || !symbol) { + std::stringstream ss; + ss << "failed to load " << dlerror(); + + if (handle) dlclose(handle); + + throw std::runtime_error(ss.str()); + } + + return reinterpret_cast(symbol); +} + +bool ShellMVK::can_present(VkPhysicalDevice phy, uint32_t queue_family) { return true; } + +VkSurfaceKHR ShellMVK::create_surface(VkInstance instance) { + VkSurfaceKHR surface; + + VkResult err; +#ifdef VK_USE_PLATFORM_IOS_MVK + VkIOSSurfaceCreateInfoMVK surface_info; + surface_info.sType = VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK; + surface_info.pNext = NULL; + surface_info.flags = 0; + surface_info.pView = _view; + err = vk::CreateIOSSurfaceMVK(instance, &surface_info, NULL, &surface); +#endif +#ifdef VK_USE_PLATFORM_MACOS_MVK + VkMacOSSurfaceCreateInfoMVK surface_info; + surface_info.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK; + surface_info.pNext = NULL; + surface_info.flags = 0; + surface_info.pView = _view; + err = vk::CreateMacOSSurfaceMVK(instance, &surface_info, NULL, &surface); +#endif + assert(!err); + + return surface; +} + +void ShellMVK::update_and_draw() { + acquire_back_buffer(); + + double t = _timer.get(); + add_game_time(static_cast(t - _current_time)); + + present_back_buffer(); + + _current_time = t; + + _profile_present_count++; + if (_current_time - _profile_start_time >= 5.0) { + const double fps = _profile_present_count / (_current_time - _profile_start_time); + std::stringstream ss; + ss << _profile_present_count << " presents in " << _current_time - _profile_start_time << " seconds " + << "(FPS: " << fps << ")"; + log(LOG_INFO, ss.str().c_str()); + + _profile_start_time = _current_time; + _profile_present_count = 0; + } +} + +void ShellMVK::run(void* view) { + _view = view; // not retained + create_context(); + resize_swapchain(settings_.initial_width, settings_.initial_height); +} diff -Nru vulkan-1.1.70+dfsg1/demos/smoke/macOS/ShellMVK.h vulkan-1.1.73+dfsg/demos/smoke/macOS/ShellMVK.h --- vulkan-1.1.70+dfsg1/demos/smoke/macOS/ShellMVK.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/smoke/macOS/ShellMVK.h 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2016-2018 The Brenwill Workshop Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef SHELL_MVK_H +#define SHELL_MVK_H + +#include +#include "Shell.h" +#include + +class PosixTimer { + public: + double get(); + PosixTimer(); + + protected: + uint64_t _tsBase; + double _tsPeriod; +}; + +class ShellMVK : public Shell { + public: + ShellMVK(Game& game); + ~ShellMVK(); + + void run(void* view); + void update_and_draw(); + + void run() { run(nullptr); }; + void quit() {} + + protected: + void* _view; + PosixTimer _timer; + double _current_time; + double _profile_start_time; + int _profile_present_count; + + PFN_vkGetInstanceProcAddr load_vk(); + bool can_present(VkPhysicalDevice phy, uint32_t queue_family); + + VkSurfaceKHR create_surface(VkInstance instance); +}; + +#endif // SHELL_MVK_H diff -Nru vulkan-1.1.70+dfsg1/demos/smoke/Main.cpp vulkan-1.1.73+dfsg/demos/smoke/Main.cpp --- vulkan-1.1.70+dfsg1/demos/smoke/Main.cpp 2018-03-08 07:03:43.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/smoke/Main.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -25,10 +25,12 @@ Game *create_game(const std::vector &args) { return new Smoke(args); } #endif +#if !defined(VK_USE_PLATFORM_MACOS_MVK) Game *create_game(int argc, char **argv) { std::vector args(argv, argv + argc); return new Smoke(args); } +#endif } // namespace diff -Nru vulkan-1.1.70+dfsg1/demos/vulkaninfo.c vulkan-1.1.73+dfsg/demos/vulkaninfo.c --- vulkan-1.1.70+dfsg1/demos/vulkaninfo.c 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/vulkaninfo.c 2018-04-27 11:24:19.000000000 +0000 @@ -53,7 +53,7 @@ #include -#define ERR(err) printf("%s:%d: failed with %s\n", __FILE__, __LINE__, VkResultString(err)); +#define ERR(err) fprintf(stderr, "%s:%d: failed with %s\n", __FILE__, __LINE__, VkResultString(err)); #ifdef _WIN32 @@ -80,6 +80,7 @@ do { \ ERR(err); \ fflush(stdout); \ + fflush(stderr); \ WAIT_FOR_CONSOLE_DESTROY; \ exit(-1); \ } while (0) @@ -105,6 +106,11 @@ void *pNext; }; +struct pNextChainBuildingBlockInfo { + VkStructureType sType; + uint32_t mem_size; +}; + struct LayerExtensionList { VkLayerProperties layer_properties; uint32_t extension_count; @@ -473,6 +479,43 @@ return false; } +static bool CheckPhysicalDeviceExtensionIncluded(const char *extension_to_check, VkExtensionProperties *extension_list, + uint32_t extension_count) { + for (uint32_t i = 0; i < extension_count; ++i) { + if (!strcmp(extension_to_check, extension_list[i].extensionName)) { + return true; + } + } + return false; +} + +static void buildpNextChain(struct VkStructureHeader *first, const struct pNextChainBuildingBlockInfo *chain_info, + uint32_t chain_info_len) { + struct VkStructureHeader *place = first; + + for (uint32_t i = 0; i < chain_info_len; i++) { + place->pNext = malloc(chain_info[i].mem_size); + if (!place->pNext) { + ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); + } + place = place->pNext; + place->sType = chain_info[i].sType; + } + + place->pNext = NULL; +} + +static void freepNextChain(struct VkStructureHeader *first) { + struct VkStructureHeader *place = first; + struct VkStructureHeader *next = NULL; + + while (place) { + next = place->pNext; + free(place); + place = next; + } +} + static void ExtractVersion(uint32_t version, uint32_t *major, uint32_t *minor, uint32_t *patch) { *major = version >> 22; *minor = (version >> 12) & 0x3ff; @@ -663,7 +706,6 @@ fprintf(out, "\t\n"); fprintf(out, "\t\n"); fprintf(out, "\t\t\n"); fprintf(out, "\t\t
\n"); @@ -703,11 +745,13 @@ //---Build a list of extensions to load--- - const char *info_instance_extensions[] = {VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, - VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME, - VK_KHR_SURFACE_EXTENSION_NAME, + const char *info_instance_extensions[] = {VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME, + VK_KHR_DISPLAY_EXTENSION_NAME, + VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME, + VK_KHR_SURFACE_EXTENSION_NAME, + VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME, #ifdef VK_USE_PLATFORM_WIN32_KHR VK_KHR_WIN32_SURFACE_EXTENSION_NAME #elif VK_USE_PLATFORM_XCB_KHR @@ -764,7 +808,7 @@ VkResult U_ASSERT_ONLY err; err = vkCreateInstance(&inst_info, NULL, &inst->instance); if (err == VK_ERROR_INCOMPATIBLE_DRIVER) { - printf("Cannot create Vulkan instance.\n"); + fprintf(stderr, "Cannot create Vulkan instance.\n"); ERR_EXIT(err); } else if (err) { ERR_EXIT(err); @@ -819,8 +863,22 @@ if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, gpu->inst->inst_extensions_count)) { + struct pNextChainBuildingBlockInfo chain_info[] = { + {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT, + .mem_size = sizeof(VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT)}, + {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR, + .mem_size = sizeof(VkPhysicalDevicePointClippingPropertiesKHR)}, + {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, + .mem_size = sizeof(VkPhysicalDevicePushDescriptorPropertiesKHR)}, + {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT, + .mem_size = sizeof(VkPhysicalDeviceDiscardRectanglePropertiesEXT)}, + {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR, + .mem_size = sizeof(VkPhysicalDeviceMultiviewPropertiesKHR)}}; + + uint32_t chain_info_len = ARRAY_SIZE(chain_info); + gpu->props2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR; - gpu->props2.pNext = NULL; + buildpNextChain((struct VkStructureHeader *)&gpu->props2, chain_info, chain_info_len); inst->vkGetPhysicalDeviceProperties2KHR(gpu->obj, &gpu->props2); } @@ -857,17 +915,36 @@ ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); } for (i = 0; i < gpu->queue_count; ++i) { - float *queue_priorities = malloc(gpu->queue_props[i].queueCount * sizeof(float)); + float *queue_priorities = NULL; + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + queue_priorities = malloc(gpu->queue_props2[i].queueFamilyProperties.queueCount * sizeof(float)); + } else { + queue_priorities = malloc(gpu->queue_props[i].queueCount * sizeof(float)); + } if (!queue_priorities) { ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); } - memset(queue_priorities, 0, gpu->queue_props[i].queueCount * sizeof(float)); + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + memset(queue_priorities, 0, gpu->queue_props2[i].queueFamilyProperties.queueCount * sizeof(float)); + } else { + memset(queue_priorities, 0, gpu->queue_props[i].queueCount * sizeof(float)); + } gpu->queue_reqs[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; gpu->queue_reqs[i].pNext = NULL; gpu->queue_reqs[i].flags = 0; gpu->queue_reqs[i].queueFamilyIndex = i; - gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount; + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + gpu->queue_reqs[i].queueCount = gpu->queue_props2[i].queueFamilyProperties.queueCount; + } else { + gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount; + } + gpu->queue_reqs[i].pQueuePriorities = queue_priorities; } @@ -882,8 +959,22 @@ inst->vkGetPhysicalDeviceMemoryProperties2KHR(gpu->obj, &gpu->memory_props2); + struct pNextChainBuildingBlockInfo chain_info[] = { + {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR, + .mem_size = sizeof(VkPhysicalDevice16BitStorageFeaturesKHR)}, + {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR, + .mem_size = sizeof(VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)}, + {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR, + .mem_size = sizeof(VkPhysicalDeviceVariablePointerFeaturesKHR)}, + {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, + .mem_size = sizeof(VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT)}, + {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR, + .mem_size = sizeof(VkPhysicalDeviceMultiviewFeaturesKHR)}}; + + uint32_t chain_info_len = ARRAY_SIZE(chain_info); + gpu->features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; - gpu->features2.pNext = NULL; + buildpNextChain((struct VkStructureHeader *)&gpu->features2, chain_info, chain_info_len); inst->vkGetPhysicalDeviceFeatures2KHR(gpu->obj, &gpu->features2); } @@ -894,6 +985,11 @@ static void AppGpuDestroy(struct AppGpu *gpu) { free(gpu->device_extensions); + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + freepNextChain(gpu->features2.pNext); + } + for (uint32_t i = 0; i < gpu->queue_count; ++i) { free((void *)gpu->queue_reqs[i].pQueuePriorities); } @@ -903,6 +999,8 @@ if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, gpu->inst->inst_extensions_count)) { free(gpu->queue_props2); + + freepNextChain(gpu->props2.pNext); } } @@ -940,8 +1038,7 @@ // Register window class: if (!RegisterClassEx(&win_class)) { // It didn't work, so try to give a useful error: - printf("Failed to register the window class!\n"); - fflush(stdout); + fprintf(stderr, "Failed to register the window class!\n"); exit(1); } // Create window with the registered class: @@ -961,8 +1058,7 @@ NULL); // no extra parameters if (!inst->h_wnd) { // It didn't work, so try to give a useful error: - printf("Failed to create a window!\n"); - fflush(stdout); + fprintf(stderr, "Failed to create a window!\n"); exit(1); } } @@ -1066,8 +1162,7 @@ inst->xlib_display = XOpenDisplay(NULL); if (inst->xlib_display == NULL) { - printf("XLib failed to connect to the X server.\nExiting ...\n"); - fflush(stdout); + fprintf(stderr, "XLib failed to connect to the X server.\nExiting ...\n"); exit(1); } @@ -1248,29 +1343,21 @@ } if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) { fprintf(out, "\t\t\t\t\t\t
VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR
\n"); - } - else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR) { + } else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR) { fprintf(out, "\t\t\t\t\t\t
VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR
\n"); - } - else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR) { + } else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR) { fprintf(out, "\t\t\t\t\t\t
VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR
\n"); - } - else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR) { + } else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR) { fprintf(out, "\t\t\t\t\t\t
VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR
\n"); - } - else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR) { + } else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR) { fprintf(out, "\t\t\t\t\t\t
VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR
\n"); - } - else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR) { + } else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR) { fprintf(out, "\t\t\t\t\t
VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR
\n"); - } - else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR) { + } else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR) { fprintf(out, "\t\t\t\t\t\t
VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR
\n"); - } - else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR) { + } else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR) { fprintf(out, "\t\t\t\t\t\t
VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR
\n"); - } - else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR) { + } else if (inst->surface_capabilities.currentTransform & VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR) { fprintf(out, "\t\t\t\t\t\t
VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR
\n"); } fprintf(out, "\t\t\t\t\t\n"); @@ -1396,7 +1483,7 @@ fprintf(out, "\t\t\t\t\t\n"); } else if (human_readable_output) { printf("\nVkSurfaceCapabilities2EXT:\n"); - printf("==========================\n\n"); + printf("==========================\n"); printf("\tsupportedSurfaceCounters:\n"); if (inst->surface_capabilities2_ext.supportedSurfaceCounters == 0) { printf("\t\tNone\n"); @@ -1611,185 +1698,272 @@ #endif static void AppGpuDumpFeatures(const struct AppGpu *gpu, FILE *out) { - const VkPhysicalDeviceFeatures *features = &gpu->features; + VkPhysicalDeviceFeatures features; + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + const VkPhysicalDeviceFeatures *features2_const = &gpu->features2.features; + features = *features2_const; + } else { + const VkPhysicalDeviceFeatures *features_const = &gpu->features; + features = *features_const; + } if (html_output) { fprintf(out, "\t\t\t\t\t
VkPhysicalDeviceFeatures\n"); - fprintf(out, "\t\t\t\t\t\t
alphaToOne =
%u
\n", features->alphaToOne ); - fprintf(out, "\t\t\t\t\t\t
depthBiasClamp =
%u
\n", features->depthBiasClamp ); - fprintf(out, "\t\t\t\t\t\t
depthBounds =
%u
\n", features->depthBounds ); - fprintf(out, "\t\t\t\t\t\t
depthClamp =
%u
\n", features->depthClamp ); - fprintf(out, "\t\t\t\t\t\t
drawIndirectFirstInstance =
%u
\n", features->drawIndirectFirstInstance ); - fprintf(out, "\t\t\t\t\t\t
dualSrcBlend =
%u
\n", features->dualSrcBlend ); - fprintf(out, "\t\t\t\t\t\t
fillModeNonSolid =
%u
\n", features->fillModeNonSolid ); - fprintf(out, "\t\t\t\t\t\t
fragmentStoresAndAtomics =
%u
\n", features->fragmentStoresAndAtomics ); - fprintf(out, "\t\t\t\t\t\t
fullDrawIndexUint32 =
%u
\n", features->fullDrawIndexUint32 ); - fprintf(out, "\t\t\t\t\t\t
geometryShader =
%u
\n", features->geometryShader ); - fprintf(out, "\t\t\t\t\t\t
imageCubeArray =
%u
\n", features->imageCubeArray ); - fprintf(out, "\t\t\t\t\t\t
independentBlend =
%u
\n", features->independentBlend ); - fprintf(out, "\t\t\t\t\t\t
inheritedQueries =
%u
\n", features->inheritedQueries ); - fprintf(out, "\t\t\t\t\t\t
largePoints =
%u
\n", features->largePoints ); - fprintf(out, "\t\t\t\t\t\t
logicOp =
%u
\n", features->logicOp ); - fprintf(out, "\t\t\t\t\t\t
multiDrawIndirect =
%u
\n", features->multiDrawIndirect ); - fprintf(out, "\t\t\t\t\t\t
multiViewport =
%u
\n", features->multiViewport ); - fprintf(out, "\t\t\t\t\t\t
occlusionQueryPrecise =
%u
\n", features->occlusionQueryPrecise ); - fprintf(out, "\t\t\t\t\t\t
pipelineStatisticsQuery =
%u
\n", features->pipelineStatisticsQuery ); - fprintf(out, "\t\t\t\t\t\t
robustBufferAccess =
%u
\n", features->robustBufferAccess ); - fprintf(out, "\t\t\t\t\t\t
samplerAnisotropy =
%u
\n", features->samplerAnisotropy ); - fprintf(out, "\t\t\t\t\t\t
sampleRateShading =
%u
\n", features->sampleRateShading ); - fprintf(out, "\t\t\t\t\t\t
shaderClipDistance =
%u
\n", features->shaderClipDistance ); - fprintf(out, "\t\t\t\t\t\t
shaderCullDistance =
%u
\n", features->shaderCullDistance ); - fprintf(out, "\t\t\t\t\t\t
shaderFloat64 =
%u
\n", features->shaderFloat64 ); - fprintf(out, "\t\t\t\t\t\t
shaderImageGatherExtended =
%u
\n", features->shaderImageGatherExtended ); - fprintf(out, "\t\t\t\t\t\t
shaderInt16 =
%u
\n", features->shaderInt16 ); - fprintf(out, "\t\t\t\t\t\t
shaderInt64 =
%u
\n", features->shaderInt64 ); - fprintf(out, "\t\t\t\t\t\t
shaderResourceMinLod =
%u
\n", features->shaderResourceMinLod ); - fprintf(out, "\t\t\t\t\t\t
shaderResourceResidency =
%u
\n", features->shaderResourceResidency ); - fprintf(out, "\t\t\t\t\t\t
shaderSampledImageArrayDynamicIndexing =
%u
\n", features->shaderSampledImageArrayDynamicIndexing ); - fprintf(out, "\t\t\t\t\t\t
shaderStorageBufferArrayDynamicIndexing =
%u
\n", features->shaderStorageBufferArrayDynamicIndexing); - fprintf(out, "\t\t\t\t\t\t
shaderStorageImageArrayDynamicIndexing =
%u
\n", features->shaderStorageImageArrayDynamicIndexing ); - fprintf(out, "\t\t\t\t\t\t
shaderStorageImageExtendedFormats =
%u
\n", features->shaderStorageImageExtendedFormats ); - fprintf(out, "\t\t\t\t\t\t
shaderStorageImageMultisample =
%u
\n", features->shaderStorageImageMultisample ); - fprintf(out, "\t\t\t\t\t\t
shaderStorageImageReadWithoutFormat =
%u
\n", features->shaderStorageImageReadWithoutFormat ); - fprintf(out, "\t\t\t\t\t\t
shaderStorageImageWriteWithoutFormat =
%u
\n", features->shaderStorageImageWriteWithoutFormat ); - fprintf(out, "\t\t\t\t\t\t
shaderTessellationAndGeometryPointSize =
%u
\n", features->shaderTessellationAndGeometryPointSize ); - fprintf(out, "\t\t\t\t\t\t
shaderUniformBufferArrayDynamicIndexing =
%u
\n", features->shaderUniformBufferArrayDynamicIndexing); - fprintf(out, "\t\t\t\t\t\t
sparseBinding =
%u
\n", features->sparseBinding ); - fprintf(out, "\t\t\t\t\t\t
sparseResidency2Samples =
%u
\n", features->sparseResidency2Samples ); - fprintf(out, "\t\t\t\t\t\t
sparseResidency4Samples =
%u
\n", features->sparseResidency4Samples ); - fprintf(out, "\t\t\t\t\t\t
sparseResidency8Samples =
%u
\n", features->sparseResidency8Samples ); - fprintf(out, "\t\t\t\t\t\t
sparseResidency16Samples =
%u
\n", features->sparseResidency16Samples ); - fprintf(out, "\t\t\t\t\t\t
sparseResidencyAliased =
%u
\n", features->sparseResidencyAliased ); - fprintf(out, "\t\t\t\t\t\t
sparseResidencyBuffer =
%u
\n", features->sparseResidencyBuffer ); - fprintf(out, "\t\t\t\t\t\t
sparseResidencyImage2D =
%u
\n", features->sparseResidencyImage2D ); - fprintf(out, "\t\t\t\t\t\t
sparseResidencyImage3D =
%u
\n", features->sparseResidencyImage3D ); - fprintf(out, "\t\t\t\t\t\t
tessellationShader =
%u
\n", features->tessellationShader ); - fprintf(out, "\t\t\t\t\t\t
textureCompressionASTC_LDR =
%u
\n", features->textureCompressionASTC_LDR ); - fprintf(out, "\t\t\t\t\t\t
textureCompressionBC =
%u
\n", features->textureCompressionBC ); - fprintf(out, "\t\t\t\t\t\t
textureCompressionETC2 =
%u
\n", features->textureCompressionETC2 ); - fprintf(out, "\t\t\t\t\t\t
variableMultisampleRate =
%u
\n", features->variableMultisampleRate ); - fprintf(out, "\t\t\t\t\t\t
vertexPipelineStoresAndAtomics =
%u
\n", features->vertexPipelineStoresAndAtomics ); - fprintf(out, "\t\t\t\t\t\t
wideLines =
%u
\n", features->wideLines ); + fprintf(out, "\t\t\t\t\t\t
alphaToOne =
%u
\n", features.alphaToOne ); + fprintf(out, "\t\t\t\t\t\t
depthBiasClamp =
%u
\n", features.depthBiasClamp ); + fprintf(out, "\t\t\t\t\t\t
depthBounds =
%u
\n", features.depthBounds ); + fprintf(out, "\t\t\t\t\t\t
depthClamp =
%u
\n", features.depthClamp ); + fprintf(out, "\t\t\t\t\t\t
drawIndirectFirstInstance =
%u
\n", features.drawIndirectFirstInstance ); + fprintf(out, "\t\t\t\t\t\t
dualSrcBlend =
%u
\n", features.dualSrcBlend ); + fprintf(out, "\t\t\t\t\t\t
fillModeNonSolid =
%u
\n", features.fillModeNonSolid ); + fprintf(out, "\t\t\t\t\t\t
fragmentStoresAndAtomics =
%u
\n", features.fragmentStoresAndAtomics ); + fprintf(out, "\t\t\t\t\t\t
fullDrawIndexUint32 =
%u
\n", features.fullDrawIndexUint32 ); + fprintf(out, "\t\t\t\t\t\t
geometryShader =
%u
\n", features.geometryShader ); + fprintf(out, "\t\t\t\t\t\t
imageCubeArray =
%u
\n", features.imageCubeArray ); + fprintf(out, "\t\t\t\t\t\t
independentBlend =
%u
\n", features.independentBlend ); + fprintf(out, "\t\t\t\t\t\t
inheritedQueries =
%u
\n", features.inheritedQueries ); + fprintf(out, "\t\t\t\t\t\t
largePoints =
%u
\n", features.largePoints ); + fprintf(out, "\t\t\t\t\t\t
logicOp =
%u
\n", features.logicOp ); + fprintf(out, "\t\t\t\t\t\t
multiDrawIndirect =
%u
\n", features.multiDrawIndirect ); + fprintf(out, "\t\t\t\t\t\t
multiViewport =
%u
\n", features.multiViewport ); + fprintf(out, "\t\t\t\t\t\t
occlusionQueryPrecise =
%u
\n", features.occlusionQueryPrecise ); + fprintf(out, "\t\t\t\t\t\t
pipelineStatisticsQuery =
%u
\n", features.pipelineStatisticsQuery ); + fprintf(out, "\t\t\t\t\t\t
robustBufferAccess =
%u
\n", features.robustBufferAccess ); + fprintf(out, "\t\t\t\t\t\t
samplerAnisotropy =
%u
\n", features.samplerAnisotropy ); + fprintf(out, "\t\t\t\t\t\t
sampleRateShading =
%u
\n", features.sampleRateShading ); + fprintf(out, "\t\t\t\t\t\t
shaderClipDistance =
%u
\n", features.shaderClipDistance ); + fprintf(out, "\t\t\t\t\t\t
shaderCullDistance =
%u
\n", features.shaderCullDistance ); + fprintf(out, "\t\t\t\t\t\t
shaderFloat64 =
%u
\n", features.shaderFloat64 ); + fprintf(out, "\t\t\t\t\t\t
shaderImageGatherExtended =
%u
\n", features.shaderImageGatherExtended ); + fprintf(out, "\t\t\t\t\t\t
shaderInt16 =
%u
\n", features.shaderInt16 ); + fprintf(out, "\t\t\t\t\t\t
shaderInt64 =
%u
\n", features.shaderInt64 ); + fprintf(out, "\t\t\t\t\t\t
shaderResourceMinLod =
%u
\n", features.shaderResourceMinLod ); + fprintf(out, "\t\t\t\t\t\t
shaderResourceResidency =
%u
\n", features.shaderResourceResidency ); + fprintf(out, "\t\t\t\t\t\t
shaderSampledImageArrayDynamicIndexing =
%u
\n", features.shaderSampledImageArrayDynamicIndexing ); + fprintf(out, "\t\t\t\t\t\t
shaderStorageBufferArrayDynamicIndexing =
%u
\n", features.shaderStorageBufferArrayDynamicIndexing); + fprintf(out, "\t\t\t\t\t\t
shaderStorageImageArrayDynamicIndexing =
%u
\n", features.shaderStorageImageArrayDynamicIndexing ); + fprintf(out, "\t\t\t\t\t\t
shaderStorageImageExtendedFormats =
%u
\n", features.shaderStorageImageExtendedFormats ); + fprintf(out, "\t\t\t\t\t\t
shaderStorageImageMultisample =
%u
\n", features.shaderStorageImageMultisample ); + fprintf(out, "\t\t\t\t\t\t
shaderStorageImageReadWithoutFormat =
%u
\n", features.shaderStorageImageReadWithoutFormat ); + fprintf(out, "\t\t\t\t\t\t
shaderStorageImageWriteWithoutFormat =
%u
\n", features.shaderStorageImageWriteWithoutFormat ); + fprintf(out, "\t\t\t\t\t\t
shaderTessellationAndGeometryPointSize =
%u
\n", features.shaderTessellationAndGeometryPointSize ); + fprintf(out, "\t\t\t\t\t\t
shaderUniformBufferArrayDynamicIndexing =
%u
\n", features.shaderUniformBufferArrayDynamicIndexing); + fprintf(out, "\t\t\t\t\t\t
sparseBinding =
%u
\n", features.sparseBinding ); + fprintf(out, "\t\t\t\t\t\t
sparseResidency2Samples =
%u
\n", features.sparseResidency2Samples ); + fprintf(out, "\t\t\t\t\t\t
sparseResidency4Samples =
%u
\n", features.sparseResidency4Samples ); + fprintf(out, "\t\t\t\t\t\t
sparseResidency8Samples =
%u
\n", features.sparseResidency8Samples ); + fprintf(out, "\t\t\t\t\t\t
sparseResidency16Samples =
%u
\n", features.sparseResidency16Samples ); + fprintf(out, "\t\t\t\t\t\t
sparseResidencyAliased =
%u
\n", features.sparseResidencyAliased ); + fprintf(out, "\t\t\t\t\t\t
sparseResidencyBuffer =
%u
\n", features.sparseResidencyBuffer ); + fprintf(out, "\t\t\t\t\t\t
sparseResidencyImage2D =
%u
\n", features.sparseResidencyImage2D ); + fprintf(out, "\t\t\t\t\t\t
sparseResidencyImage3D =
%u
\n", features.sparseResidencyImage3D ); + fprintf(out, "\t\t\t\t\t\t
tessellationShader =
%u
\n", features.tessellationShader ); + fprintf(out, "\t\t\t\t\t\t
textureCompressionASTC_LDR =
%u
\n", features.textureCompressionASTC_LDR ); + fprintf(out, "\t\t\t\t\t\t
textureCompressionBC =
%u
\n", features.textureCompressionBC ); + fprintf(out, "\t\t\t\t\t\t
textureCompressionETC2 =
%u
\n", features.textureCompressionETC2 ); + fprintf(out, "\t\t\t\t\t\t
variableMultisampleRate =
%u
\n", features.variableMultisampleRate ); + fprintf(out, "\t\t\t\t\t\t
vertexPipelineStoresAndAtomics =
%u
\n", features.vertexPipelineStoresAndAtomics ); + fprintf(out, "\t\t\t\t\t\t
wideLines =
%u
\n", features.wideLines ); fprintf(out, "\t\t\t\t\t
\n"); } else if (human_readable_output) { printf("VkPhysicalDeviceFeatures:\n"); printf("=========================\n"); - printf("\talphaToOne = %u\n", features->alphaToOne ); - printf("\tdepthBiasClamp = %u\n", features->depthBiasClamp ); - printf("\tdepthBounds = %u\n", features->depthBounds ); - printf("\tdepthClamp = %u\n", features->depthClamp ); - printf("\tdrawIndirectFirstInstance = %u\n", features->drawIndirectFirstInstance ); - printf("\tdualSrcBlend = %u\n", features->dualSrcBlend ); - printf("\tfillModeNonSolid = %u\n", features->fillModeNonSolid ); - printf("\tfragmentStoresAndAtomics = %u\n", features->fragmentStoresAndAtomics ); - printf("\tfullDrawIndexUint32 = %u\n", features->fullDrawIndexUint32 ); - printf("\tgeometryShader = %u\n", features->geometryShader ); - printf("\timageCubeArray = %u\n", features->imageCubeArray ); - printf("\tindependentBlend = %u\n", features->independentBlend ); - printf("\tinheritedQueries = %u\n", features->inheritedQueries ); - printf("\tlargePoints = %u\n", features->largePoints ); - printf("\tlogicOp = %u\n", features->logicOp ); - printf("\tmultiDrawIndirect = %u\n", features->multiDrawIndirect ); - printf("\tmultiViewport = %u\n", features->multiViewport ); - printf("\tocclusionQueryPrecise = %u\n", features->occlusionQueryPrecise ); - printf("\tpipelineStatisticsQuery = %u\n", features->pipelineStatisticsQuery ); - printf("\trobustBufferAccess = %u\n", features->robustBufferAccess ); - printf("\tsamplerAnisotropy = %u\n", features->samplerAnisotropy ); - printf("\tsampleRateShading = %u\n", features->sampleRateShading ); - printf("\tshaderClipDistance = %u\n", features->shaderClipDistance ); - printf("\tshaderCullDistance = %u\n", features->shaderCullDistance ); - printf("\tshaderFloat64 = %u\n", features->shaderFloat64 ); - printf("\tshaderImageGatherExtended = %u\n", features->shaderImageGatherExtended ); - printf("\tshaderInt16 = %u\n", features->shaderInt16 ); - printf("\tshaderInt64 = %u\n", features->shaderInt64 ); - printf("\tshaderSampledImageArrayDynamicIndexing = %u\n", features->shaderSampledImageArrayDynamicIndexing ); - printf("\tshaderStorageBufferArrayDynamicIndexing = %u\n", features->shaderStorageBufferArrayDynamicIndexing); - printf("\tshaderStorageImageArrayDynamicIndexing = %u\n", features->shaderStorageImageArrayDynamicIndexing ); - printf("\tshaderStorageImageExtendedFormats = %u\n", features->shaderStorageImageExtendedFormats ); - printf("\tshaderStorageImageMultisample = %u\n", features->shaderStorageImageMultisample ); - printf("\tshaderStorageImageReadWithoutFormat = %u\n", features->shaderStorageImageReadWithoutFormat ); - printf("\tshaderStorageImageWriteWithoutFormat = %u\n", features->shaderStorageImageWriteWithoutFormat ); - printf("\tshaderTessellationAndGeometryPointSize = %u\n", features->shaderTessellationAndGeometryPointSize ); - printf("\tshaderUniformBufferArrayDynamicIndexing = %u\n", features->shaderUniformBufferArrayDynamicIndexing); - printf("\tsparseBinding = %u\n", features->sparseBinding ); - printf("\tsparseResidency2Samples = %u\n", features->sparseResidency2Samples ); - printf("\tsparseResidency4Samples = %u\n", features->sparseResidency4Samples ); - printf("\tsparseResidency8Samples = %u\n", features->sparseResidency8Samples ); - printf("\tsparseResidency16Samples = %u\n", features->sparseResidency16Samples ); - printf("\tsparseResidencyAliased = %u\n", features->sparseResidencyAliased ); - printf("\tsparseResidencyBuffer = %u\n", features->sparseResidencyBuffer ); - printf("\tsparseResidencyImage2D = %u\n", features->sparseResidencyImage2D ); - printf("\tsparseResidencyImage3D = %u\n", features->sparseResidencyImage3D ); - printf("\tshaderResourceMinLod = %u\n", features->shaderResourceMinLod ); - printf("\tshaderResourceResidency = %u\n", features->shaderResourceResidency ); - printf("\ttessellationShader = %u\n", features->tessellationShader ); - printf("\ttextureCompressionASTC_LDR = %u\n", features->textureCompressionASTC_LDR ); - printf("\ttextureCompressionBC = %u\n", features->textureCompressionBC ); - printf("\ttextureCompressionETC2 = %u\n", features->textureCompressionETC2 ); - printf("\tvariableMultisampleRate = %u\n", features->variableMultisampleRate ); - printf("\tvertexPipelineStoresAndAtomics = %u\n", features->vertexPipelineStoresAndAtomics ); - printf("\twideLines = %u\n", features->wideLines ); + printf("\talphaToOne = %u\n", features.alphaToOne ); + printf("\tdepthBiasClamp = %u\n", features.depthBiasClamp ); + printf("\tdepthBounds = %u\n", features.depthBounds ); + printf("\tdepthClamp = %u\n", features.depthClamp ); + printf("\tdrawIndirectFirstInstance = %u\n", features.drawIndirectFirstInstance ); + printf("\tdualSrcBlend = %u\n", features.dualSrcBlend ); + printf("\tfillModeNonSolid = %u\n", features.fillModeNonSolid ); + printf("\tfragmentStoresAndAtomics = %u\n", features.fragmentStoresAndAtomics ); + printf("\tfullDrawIndexUint32 = %u\n", features.fullDrawIndexUint32 ); + printf("\tgeometryShader = %u\n", features.geometryShader ); + printf("\timageCubeArray = %u\n", features.imageCubeArray ); + printf("\tindependentBlend = %u\n", features.independentBlend ); + printf("\tinheritedQueries = %u\n", features.inheritedQueries ); + printf("\tlargePoints = %u\n", features.largePoints ); + printf("\tlogicOp = %u\n", features.logicOp ); + printf("\tmultiDrawIndirect = %u\n", features.multiDrawIndirect ); + printf("\tmultiViewport = %u\n", features.multiViewport ); + printf("\tocclusionQueryPrecise = %u\n", features.occlusionQueryPrecise ); + printf("\tpipelineStatisticsQuery = %u\n", features.pipelineStatisticsQuery ); + printf("\trobustBufferAccess = %u\n", features.robustBufferAccess ); + printf("\tsamplerAnisotropy = %u\n", features.samplerAnisotropy ); + printf("\tsampleRateShading = %u\n", features.sampleRateShading ); + printf("\tshaderClipDistance = %u\n", features.shaderClipDistance ); + printf("\tshaderCullDistance = %u\n", features.shaderCullDistance ); + printf("\tshaderFloat64 = %u\n", features.shaderFloat64 ); + printf("\tshaderImageGatherExtended = %u\n", features.shaderImageGatherExtended ); + printf("\tshaderInt16 = %u\n", features.shaderInt16 ); + printf("\tshaderInt64 = %u\n", features.shaderInt64 ); + printf("\tshaderSampledImageArrayDynamicIndexing = %u\n", features.shaderSampledImageArrayDynamicIndexing ); + printf("\tshaderStorageBufferArrayDynamicIndexing = %u\n", features.shaderStorageBufferArrayDynamicIndexing); + printf("\tshaderStorageImageArrayDynamicIndexing = %u\n", features.shaderStorageImageArrayDynamicIndexing ); + printf("\tshaderStorageImageExtendedFormats = %u\n", features.shaderStorageImageExtendedFormats ); + printf("\tshaderStorageImageMultisample = %u\n", features.shaderStorageImageMultisample ); + printf("\tshaderStorageImageReadWithoutFormat = %u\n", features.shaderStorageImageReadWithoutFormat ); + printf("\tshaderStorageImageWriteWithoutFormat = %u\n", features.shaderStorageImageWriteWithoutFormat ); + printf("\tshaderTessellationAndGeometryPointSize = %u\n", features.shaderTessellationAndGeometryPointSize ); + printf("\tshaderUniformBufferArrayDynamicIndexing = %u\n", features.shaderUniformBufferArrayDynamicIndexing); + printf("\tsparseBinding = %u\n", features.sparseBinding ); + printf("\tsparseResidency2Samples = %u\n", features.sparseResidency2Samples ); + printf("\tsparseResidency4Samples = %u\n", features.sparseResidency4Samples ); + printf("\tsparseResidency8Samples = %u\n", features.sparseResidency8Samples ); + printf("\tsparseResidency16Samples = %u\n", features.sparseResidency16Samples ); + printf("\tsparseResidencyAliased = %u\n", features.sparseResidencyAliased ); + printf("\tsparseResidencyBuffer = %u\n", features.sparseResidencyBuffer ); + printf("\tsparseResidencyImage2D = %u\n", features.sparseResidencyImage2D ); + printf("\tsparseResidencyImage3D = %u\n", features.sparseResidencyImage3D ); + printf("\tshaderResourceMinLod = %u\n", features.shaderResourceMinLod ); + printf("\tshaderResourceResidency = %u\n", features.shaderResourceResidency ); + printf("\ttessellationShader = %u\n", features.tessellationShader ); + printf("\ttextureCompressionASTC_LDR = %u\n", features.textureCompressionASTC_LDR ); + printf("\ttextureCompressionBC = %u\n", features.textureCompressionBC ); + printf("\ttextureCompressionETC2 = %u\n", features.textureCompressionETC2 ); + printf("\tvariableMultisampleRate = %u\n", features.variableMultisampleRate ); + printf("\tvertexPipelineStoresAndAtomics = %u\n", features.vertexPipelineStoresAndAtomics ); + printf("\twideLines = %u\n", features.wideLines ); } if (json_output) { printf(",\n"); printf("\t\"VkPhysicalDeviceFeatures\": {\n"); - printf("\t\t\"alphaToOne\": %u,\n", features->alphaToOne); - printf("\t\t\"depthBiasClamp\": %u,\n", features->depthBiasClamp); - printf("\t\t\"depthBounds\": %u,\n", features->depthBounds); - printf("\t\t\"depthClamp\": %u,\n", features->depthClamp); - printf("\t\t\"drawIndirectFirstInstance\": %u,\n", features->drawIndirectFirstInstance); - printf("\t\t\"dualSrcBlend\": %u,\n", features->dualSrcBlend); - printf("\t\t\"fillModeNonSolid\": %u,\n", features->fillModeNonSolid); - printf("\t\t\"fragmentStoresAndAtomics\": %u,\n", features->fragmentStoresAndAtomics); - printf("\t\t\"fullDrawIndexUint32\": %u,\n", features->fullDrawIndexUint32); - printf("\t\t\"geometryShader\": %u,\n", features->geometryShader); - printf("\t\t\"imageCubeArray\": %u,\n", features->imageCubeArray); - printf("\t\t\"independentBlend\": %u,\n", features->independentBlend); - printf("\t\t\"inheritedQueries\": %u,\n", features->inheritedQueries); - printf("\t\t\"largePoints\": %u,\n", features->largePoints); - printf("\t\t\"logicOp\": %u,\n", features->logicOp); - printf("\t\t\"multiDrawIndirect\": %u,\n", features->multiDrawIndirect); - printf("\t\t\"multiViewport\": %u,\n", features->multiViewport); - printf("\t\t\"occlusionQueryPrecise\": %u,\n", features->occlusionQueryPrecise); - printf("\t\t\"pipelineStatisticsQuery\": %u,\n", features->pipelineStatisticsQuery); - printf("\t\t\"robustBufferAccess\": %u,\n", features->robustBufferAccess); - printf("\t\t\"samplerAnisotropy\": %u,\n", features->samplerAnisotropy); - printf("\t\t\"sampleRateShading\": %u,\n", features->sampleRateShading); - printf("\t\t\"shaderClipDistance\": %u,\n", features->shaderClipDistance); - printf("\t\t\"shaderCullDistance\": %u,\n", features->shaderCullDistance); - printf("\t\t\"shaderFloat64\": %u,\n", features->shaderFloat64); - printf("\t\t\"shaderImageGatherExtended\": %u,\n", features->shaderImageGatherExtended); - printf("\t\t\"shaderInt16\": %u,\n", features->shaderInt16); - printf("\t\t\"shaderInt64\": %u,\n", features->shaderInt64); - printf("\t\t\"shaderResourceMinLod\": %u,\n", features->shaderResourceMinLod); - printf("\t\t\"shaderResourceResidency\": %u,\n", features->shaderResourceResidency); - printf("\t\t\"shaderSampledImageArrayDynamicIndexing\": %u,\n", features->shaderSampledImageArrayDynamicIndexing); - printf("\t\t\"shaderStorageBufferArrayDynamicIndexing\": %u,\n", features->shaderStorageBufferArrayDynamicIndexing); - printf("\t\t\"shaderStorageImageArrayDynamicIndexing\": %u,\n", features->shaderStorageImageArrayDynamicIndexing); - printf("\t\t\"shaderStorageImageExtendedFormats\": %u,\n", features->shaderStorageImageExtendedFormats); - printf("\t\t\"shaderStorageImageMultisample\": %u,\n", features->shaderStorageImageMultisample); - printf("\t\t\"shaderStorageImageReadWithoutFormat\": %u,\n", features->shaderStorageImageReadWithoutFormat); - printf("\t\t\"shaderStorageImageWriteWithoutFormat\": %u,\n", features->shaderStorageImageWriteWithoutFormat); - printf("\t\t\"shaderTessellationAndGeometryPointSize\": %u,\n", features->shaderTessellationAndGeometryPointSize); - printf("\t\t\"shaderUniformBufferArrayDynamicIndexing\": %u,\n", features->shaderUniformBufferArrayDynamicIndexing); - printf("\t\t\"sparseBinding\": %u,\n", features->sparseBinding); - printf("\t\t\"sparseResidency2Samples\": %u,\n", features->sparseResidency2Samples); - printf("\t\t\"sparseResidency4Samples\": %u,\n", features->sparseResidency4Samples); - printf("\t\t\"sparseResidency8Samples\": %u,\n", features->sparseResidency8Samples); - printf("\t\t\"sparseResidency16Samples\": %u,\n", features->sparseResidency16Samples); - printf("\t\t\"sparseResidencyAliased\": %u,\n", features->sparseResidencyAliased); - printf("\t\t\"sparseResidencyBuffer\": %u,\n", features->sparseResidencyBuffer); - printf("\t\t\"sparseResidencyImage2D\": %u,\n", features->sparseResidencyImage2D); - printf("\t\t\"sparseResidencyImage3D\": %u,\n", features->sparseResidencyImage3D); - printf("\t\t\"tessellationShader\": %u,\n", features->tessellationShader); - printf("\t\t\"textureCompressionASTC_LDR\": %u,\n", features->textureCompressionASTC_LDR); - printf("\t\t\"textureCompressionBC\": %u,\n", features->textureCompressionBC); - printf("\t\t\"textureCompressionETC2\": %u,\n", features->textureCompressionETC2); - printf("\t\t\"variableMultisampleRate\": %u,\n", features->variableMultisampleRate); - printf("\t\t\"vertexPipelineStoresAndAtomics\": %u,\n", features->vertexPipelineStoresAndAtomics); - printf("\t\t\"wideLines\": %u\n", features->wideLines); + printf("\t\t\"alphaToOne\": %u,\n", features.alphaToOne); + printf("\t\t\"depthBiasClamp\": %u,\n", features.depthBiasClamp); + printf("\t\t\"depthBounds\": %u,\n", features.depthBounds); + printf("\t\t\"depthClamp\": %u,\n", features.depthClamp); + printf("\t\t\"drawIndirectFirstInstance\": %u,\n", features.drawIndirectFirstInstance); + printf("\t\t\"dualSrcBlend\": %u,\n", features.dualSrcBlend); + printf("\t\t\"fillModeNonSolid\": %u,\n", features.fillModeNonSolid); + printf("\t\t\"fragmentStoresAndAtomics\": %u,\n", features.fragmentStoresAndAtomics); + printf("\t\t\"fullDrawIndexUint32\": %u,\n", features.fullDrawIndexUint32); + printf("\t\t\"geometryShader\": %u,\n", features.geometryShader); + printf("\t\t\"imageCubeArray\": %u,\n", features.imageCubeArray); + printf("\t\t\"independentBlend\": %u,\n", features.independentBlend); + printf("\t\t\"inheritedQueries\": %u,\n", features.inheritedQueries); + printf("\t\t\"largePoints\": %u,\n", features.largePoints); + printf("\t\t\"logicOp\": %u,\n", features.logicOp); + printf("\t\t\"multiDrawIndirect\": %u,\n", features.multiDrawIndirect); + printf("\t\t\"multiViewport\": %u,\n", features.multiViewport); + printf("\t\t\"occlusionQueryPrecise\": %u,\n", features.occlusionQueryPrecise); + printf("\t\t\"pipelineStatisticsQuery\": %u,\n", features.pipelineStatisticsQuery); + printf("\t\t\"robustBufferAccess\": %u,\n", features.robustBufferAccess); + printf("\t\t\"samplerAnisotropy\": %u,\n", features.samplerAnisotropy); + printf("\t\t\"sampleRateShading\": %u,\n", features.sampleRateShading); + printf("\t\t\"shaderClipDistance\": %u,\n", features.shaderClipDistance); + printf("\t\t\"shaderCullDistance\": %u,\n", features.shaderCullDistance); + printf("\t\t\"shaderFloat64\": %u,\n", features.shaderFloat64); + printf("\t\t\"shaderImageGatherExtended\": %u,\n", features.shaderImageGatherExtended); + printf("\t\t\"shaderInt16\": %u,\n", features.shaderInt16); + printf("\t\t\"shaderInt64\": %u,\n", features.shaderInt64); + printf("\t\t\"shaderResourceMinLod\": %u,\n", features.shaderResourceMinLod); + printf("\t\t\"shaderResourceResidency\": %u,\n", features.shaderResourceResidency); + printf("\t\t\"shaderSampledImageArrayDynamicIndexing\": %u,\n", features.shaderSampledImageArrayDynamicIndexing); + printf("\t\t\"shaderStorageBufferArrayDynamicIndexing\": %u,\n", features.shaderStorageBufferArrayDynamicIndexing); + printf("\t\t\"shaderStorageImageArrayDynamicIndexing\": %u,\n", features.shaderStorageImageArrayDynamicIndexing); + printf("\t\t\"shaderStorageImageExtendedFormats\": %u,\n", features.shaderStorageImageExtendedFormats); + printf("\t\t\"shaderStorageImageMultisample\": %u,\n", features.shaderStorageImageMultisample); + printf("\t\t\"shaderStorageImageReadWithoutFormat\": %u,\n", features.shaderStorageImageReadWithoutFormat); + printf("\t\t\"shaderStorageImageWriteWithoutFormat\": %u,\n", features.shaderStorageImageWriteWithoutFormat); + printf("\t\t\"shaderTessellationAndGeometryPointSize\": %u,\n", features.shaderTessellationAndGeometryPointSize); + printf("\t\t\"shaderUniformBufferArrayDynamicIndexing\": %u,\n", features.shaderUniformBufferArrayDynamicIndexing); + printf("\t\t\"sparseBinding\": %u,\n", features.sparseBinding); + printf("\t\t\"sparseResidency2Samples\": %u,\n", features.sparseResidency2Samples); + printf("\t\t\"sparseResidency4Samples\": %u,\n", features.sparseResidency4Samples); + printf("\t\t\"sparseResidency8Samples\": %u,\n", features.sparseResidency8Samples); + printf("\t\t\"sparseResidency16Samples\": %u,\n", features.sparseResidency16Samples); + printf("\t\t\"sparseResidencyAliased\": %u,\n", features.sparseResidencyAliased); + printf("\t\t\"sparseResidencyBuffer\": %u,\n", features.sparseResidencyBuffer); + printf("\t\t\"sparseResidencyImage2D\": %u,\n", features.sparseResidencyImage2D); + printf("\t\t\"sparseResidencyImage3D\": %u,\n", features.sparseResidencyImage3D); + printf("\t\t\"tessellationShader\": %u,\n", features.tessellationShader); + printf("\t\t\"textureCompressionASTC_LDR\": %u,\n", features.textureCompressionASTC_LDR); + printf("\t\t\"textureCompressionBC\": %u,\n", features.textureCompressionBC); + printf("\t\t\"textureCompressionETC2\": %u,\n", features.textureCompressionETC2); + printf("\t\t\"variableMultisampleRate\": %u,\n", features.variableMultisampleRate); + printf("\t\t\"vertexPipelineStoresAndAtomics\": %u,\n", features.vertexPipelineStoresAndAtomics); + printf("\t\t\"wideLines\": %u\n", features.wideLines); printf("\t}"); } + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + void *place = gpu->features2.pNext; + while (place) { + struct VkStructureHeader *structure = (struct VkStructureHeader*) place; + if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR && CheckPhysicalDeviceExtensionIncluded(VK_KHR_16BIT_STORAGE_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDevice16BitStorageFeaturesKHR *b16_store_features = (VkPhysicalDevice16BitStorageFeaturesKHR*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t
VkPhysicalDevice16BitStorageFeatures\n"); + fprintf(out, "\t\t\t\t\t\t
storageBuffer16BitAccess =
%u
\n", b16_store_features->storageBuffer16BitAccess ); + fprintf(out, "\t\t\t\t\t\t
uniformAndStorageBuffer16BitAccess =
%u
\n", b16_store_features->uniformAndStorageBuffer16BitAccess); + fprintf(out, "\t\t\t\t\t\t
storagePushConstant16 =
%u
\n", b16_store_features->storagePushConstant16 ); + fprintf(out, "\t\t\t\t\t\t
storageInputOutput16 =
%u
\n", b16_store_features->storageInputOutput16 ); + fprintf(out, "\t\t\t\t\t
\n"); + } else if (human_readable_output) { + printf("\nVkPhysicalDevice16BitStorageFeatures:\n"); + printf("=====================================\n"); + printf("\tstorageBuffer16BitAccess = %u\n", b16_store_features->storageBuffer16BitAccess ); + printf("\tuniformAndStorageBuffer16BitAccess = %u\n", b16_store_features->uniformAndStorageBuffer16BitAccess); + printf("\tstoragePushConstant16 = %u\n", b16_store_features->storagePushConstant16 ); + printf("\tstorageInputOutput16 = %u\n", b16_store_features->storageInputOutput16 ); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR && CheckPhysicalDeviceExtensionIncluded(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR *sampler_ycbcr_features = (VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t
VkPhysicalDeviceSamplerYcbcrConversionFeatures\n"); + fprintf(out, "\t\t\t\t\t\t
samplerYcbcrConversion =
%u
\n", sampler_ycbcr_features->samplerYcbcrConversion); + fprintf(out, "\t\t\t\t\t
\n"); + } else if (human_readable_output) { + printf("\nVkPhysicalDeviceSamplerYcbcrConversionFeatures:\n"); + printf("===============================================\n"); + printf("\tsamplerYcbcrConversion = %u\n", sampler_ycbcr_features->samplerYcbcrConversion); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR && CheckPhysicalDeviceExtensionIncluded(VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDeviceVariablePointerFeaturesKHR *var_pointer_features = (VkPhysicalDeviceVariablePointerFeaturesKHR*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t
VkPhysicalDeviceVariablePointerFeatures\n"); + fprintf(out, "\t\t\t\t\t\t
variablePointersStorageBuffer =
%u
\n", var_pointer_features->variablePointersStorageBuffer); + fprintf(out, "\t\t\t\t\t\t
variablePointers =
%u
\n", var_pointer_features->variablePointers ); + fprintf(out, "\t\t\t\t\t
\n"); + } else if (human_readable_output) { + printf("\nVkPhysicalDeviceVariablePointerFeatures:\n"); + printf("========================================\n"); + printf("\tvariablePointersStorageBuffer = %u\n", var_pointer_features->variablePointersStorageBuffer); + printf("\tvariablePointers = %u\n", var_pointer_features->variablePointers ); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT && CheckPhysicalDeviceExtensionIncluded(VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *blend_op_adv_features = (VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t
VkPhysicalDeviceBlendOperationAdvancedFeatures\n"); + fprintf(out, "\t\t\t\t\t\t
advancedBlendCoherentOperations =
%u
\n", blend_op_adv_features->advancedBlendCoherentOperations); + fprintf(out, "\t\t\t\t\t
\n"); + } else if (human_readable_output) { + printf("\nVkPhysicalDeviceBlendOperationAdvancedFeatures:\n"); + printf("===============================================\n"); + printf("\tadvancedBlendCoherentOperations = %u\n", blend_op_adv_features->advancedBlendCoherentOperations); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR && CheckPhysicalDeviceExtensionIncluded(VK_KHR_MULTIVIEW_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDeviceMultiviewFeaturesKHR *multiview_features = (VkPhysicalDeviceMultiviewFeaturesKHR*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t
VkPhysicalDeviceMultiviewFeatures\n"); + fprintf(out, "\t\t\t\t\t\t
multiview =
%u
\n", multiview_features->multiview ); + fprintf(out, "\t\t\t\t\t\t
multiviewGeometryShader =
%u
\n", multiview_features->multiviewGeometryShader ); + fprintf(out, "\t\t\t\t\t\t
multiviewTessellationShader =
%u
\n", multiview_features->multiviewTessellationShader); + fprintf(out, "\t\t\t\t\t
\n"); + } + else if (human_readable_output) { + printf("\nVkPhysicalDeviceMultiviewFeatures:\n"); + printf("==================================\n"); + printf("\tmultiview = %u\n", multiview_features->multiview ); + printf("\tmultiviewGeometryShader = %u\n", multiview_features->multiviewGeometryShader ); + printf("\tmultiviewTessellationShader = %u\n", multiview_features->multiviewTessellationShader); + } + } + place = structure->pNext; + } + } } static void AppDumpSparseProps(const VkPhysicalDeviceSparseProperties *sparse_props, FILE *out) { @@ -2192,8 +2366,17 @@ } static void AppGpuDumpProps(const struct AppGpu *gpu, FILE *out) { - const VkPhysicalDeviceProperties *props = &gpu->props; - const uint32_t apiVersion = props->apiVersion; + VkPhysicalDeviceProperties props; + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + const VkPhysicalDeviceProperties *props2_const = &gpu->props2.properties; + props = *props2_const; + } else { + const VkPhysicalDeviceProperties *props_const = &gpu->props; + props = *props_const; + } + const uint32_t apiVersion = props.apiVersion; const uint32_t major = VK_VERSION_MAJOR(apiVersion); const uint32_t minor = VK_VERSION_MINOR(apiVersion); const uint32_t patch = VK_VERSION_PATCH(apiVersion); @@ -2201,33 +2384,37 @@ if (html_output) { fprintf(out, "\t\t\t\t\t
VkPhysicalDeviceProperties\n"); fprintf(out, "\t\t\t\t\t\t
apiVersion =
0x%" PRIxLEAST32 "
(
%d.%d.%d
)
\n", apiVersion, major, minor, patch); - fprintf(out, "\t\t\t\t\t\t
driverVersion =
%u
(
0x%" PRIxLEAST32 "
)
\n", props->driverVersion, props->driverVersion); - fprintf(out, "\t\t\t\t\t\t
vendorID =
0x%04x
\n", props->vendorID); - fprintf(out, "\t\t\t\t\t\t
deviceID =
0x%04x
\n", props->deviceID); - fprintf(out, "\t\t\t\t\t\t
deviceType = %s
\n", VkPhysicalDeviceTypeString(props->deviceType)); - fprintf(out, "\t\t\t\t\t\t
deviceName = %s
\n", props->deviceName); + fprintf(out, "\t\t\t\t\t\t
driverVersion =
%u
(
0x%" PRIxLEAST32 "
)
\n", props.driverVersion, props.driverVersion); + fprintf(out, "\t\t\t\t\t\t
vendorID =
0x%04x
\n", props.vendorID); + fprintf(out, "\t\t\t\t\t\t
deviceID =
0x%04x
\n", props.deviceID); + fprintf(out, "\t\t\t\t\t\t
deviceType = %s
\n", VkPhysicalDeviceTypeString(props.deviceType)); + fprintf(out, "\t\t\t\t\t\t
deviceName = %s
\n", props.deviceName); fprintf(out, "\t\t\t\t\t
\n"); } else if (human_readable_output) { printf("VkPhysicalDeviceProperties:\n"); printf("===========================\n"); printf("\tapiVersion = 0x%" PRIxLEAST32 " (%d.%d.%d)\n", apiVersion, major, minor, patch); - printf("\tdriverVersion = %u (0x%" PRIxLEAST32 ")\n", props->driverVersion, props->driverVersion); - printf("\tvendorID = 0x%04x\n", props->vendorID); - printf("\tdeviceID = 0x%04x\n", props->deviceID); - printf("\tdeviceType = %s\n", VkPhysicalDeviceTypeString(props->deviceType)); - printf("\tdeviceName = %s\n", props->deviceName); + printf("\tdriverVersion = %u (0x%" PRIxLEAST32 ")\n", props.driverVersion, props.driverVersion); + printf("\tvendorID = 0x%04x\n", props.vendorID); + printf("\tdeviceID = 0x%04x\n", props.deviceID); + printf("\tdeviceType = %s\n", VkPhysicalDeviceTypeString(props.deviceType)); + printf("\tdeviceName = %s\n", props.deviceName); } if (json_output) { printf(",\n"); printf("\t\"VkPhysicalDeviceProperties\": {\n"); printf("\t\t\"apiVersion\": %u,\n", apiVersion); - printf("\t\t\"deviceID\": %u,\n", props->deviceID); - printf("\t\t\"deviceName\": \"%s\",\n", props->deviceName); - printf("\t\t\"deviceType\": %u,\n", props->deviceType); - printf("\t\t\"driverVersion\": %u", props->driverVersion); + printf("\t\t\"deviceID\": %u,\n", props.deviceID); + printf("\t\t\"deviceName\": \"%s\",\n", props.deviceName); + printf("\t\t\"deviceType\": %u,\n", props.deviceType); + printf("\t\t\"driverVersion\": %u", props.driverVersion); } - AppDumpLimits(&gpu->props.limits, out); + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, gpu->inst->inst_extensions_count)) { + AppDumpLimits(&gpu->props2.properties.limits, out); + } else { + AppDumpLimits(&gpu->props.limits, out); + } // Dump pipeline cache UUIDs to json if (json_output) { @@ -2238,20 +2425,102 @@ printf(","); } printf("\n"); - printf("\t\t\t%u", props->pipelineCacheUUID[i]); + printf("\t\t\t%u", props.pipelineCacheUUID[i]); } printf("\n"); printf("\t\t]"); } - AppDumpSparseProps(&gpu->props.sparseProperties, out); + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, gpu->inst->inst_extensions_count)) { + AppDumpSparseProps(&gpu->props2.properties.sparseProperties, out); + } else { + AppDumpSparseProps(&gpu->props.sparseProperties, out); + } if (json_output) { printf(",\n"); - printf("\t\t\"vendorID\": %u\n", props->vendorID); + printf("\t\t\"vendorID\": %u\n", props.vendorID); printf("\t}"); } + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + void *place = gpu->props2.pNext; + while (place) { + struct VkStructureHeader *structure = (struct VkStructureHeader*) place; + if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT && CheckPhysicalDeviceExtensionIncluded(VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT *blend_op_adv_props = (VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t
VkPhysicalDeviceBlendOperationAdvancedProperties\n"); + fprintf(out, "\t\t\t\t\t\t
advancedBlendMaxColorAttachments =
%u
\n", blend_op_adv_props->advancedBlendMaxColorAttachments ); + fprintf(out, "\t\t\t\t\t\t
advancedBlendIndependentBlend =
%u
\n", blend_op_adv_props->advancedBlendIndependentBlend ); + fprintf(out, "\t\t\t\t\t\t
advancedBlendNonPremultipliedSrcColor =
%u
\n", blend_op_adv_props->advancedBlendNonPremultipliedSrcColor); + fprintf(out, "\t\t\t\t\t\t
advancedBlendNonPremultipliedDstColor =
%u
\n", blend_op_adv_props->advancedBlendNonPremultipliedDstColor); + fprintf(out, "\t\t\t\t\t\t
advancedBlendCorrelatedOverlap =
%u
\n", blend_op_adv_props->advancedBlendCorrelatedOverlap ); + fprintf(out, "\t\t\t\t\t\t
advancedBlendAllOperations =
%u
\n", blend_op_adv_props->advancedBlendAllOperations ); + fprintf(out, "\t\t\t\t\t
\n"); + } else if (human_readable_output) { + printf("\nVkPhysicalDeviceBlendOperationAdvancedProperties:\n"); + printf("=================================================\n"); + printf("\tadvancedBlendMaxColorAttachments = %u\n", blend_op_adv_props->advancedBlendMaxColorAttachments ); + printf("\tadvancedBlendIndependentBlend = %u\n", blend_op_adv_props->advancedBlendIndependentBlend ); + printf("\tadvancedBlendNonPremultipliedSrcColor = %u\n", blend_op_adv_props->advancedBlendNonPremultipliedSrcColor); + printf("\tadvancedBlendNonPremultipliedDstColor = %u\n", blend_op_adv_props->advancedBlendNonPremultipliedDstColor); + printf("\tadvancedBlendCorrelatedOverlap = %u\n", blend_op_adv_props->advancedBlendCorrelatedOverlap ); + printf("\tadvancedBlendAllOperations = %u\n", blend_op_adv_props->advancedBlendAllOperations ); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR && CheckPhysicalDeviceExtensionIncluded(VK_KHR_MAINTENANCE2_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDevicePointClippingPropertiesKHR *pt_clip_props = (VkPhysicalDevicePointClippingPropertiesKHR*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t
VkPhysicalDevicePointClippingProperties\n"); + fprintf(out, "\t\t\t\t\t\t
pointClippingBehavior =
%u
\n", pt_clip_props->pointClippingBehavior); + fprintf(out, "\t\t\t\t\t
\n"); + } else if (human_readable_output) { + printf("\nVkPhysicalDevicePointClippingProperties:\n"); + printf("========================================\n"); + printf("\tpointClippingBehavior = %u\n", pt_clip_props->pointClippingBehavior); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR && CheckPhysicalDeviceExtensionIncluded(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDevicePushDescriptorPropertiesKHR *push_desc_props = (VkPhysicalDevicePushDescriptorPropertiesKHR*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t
VkPhysicalDevicePushDescriptorProperties\n"); + fprintf(out, "\t\t\t\t\t\t
maxPushDescriptors =
%u
\n", push_desc_props->maxPushDescriptors); + fprintf(out, "\t\t\t\t\t
\n"); + } else if (human_readable_output) { + printf("\nVkPhysicalDevicePushDescriptorProperties:\n"); + printf("=========================================\n"); + printf("\tmaxPushDescriptors = %u\n", push_desc_props->maxPushDescriptors); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT && CheckPhysicalDeviceExtensionIncluded(VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDeviceDiscardRectanglePropertiesEXT *discard_rect_props = (VkPhysicalDeviceDiscardRectanglePropertiesEXT*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t
VkPhysicalDeviceDiscardRectangleProperties\n"); + fprintf(out, "\t\t\t\t\t\t
maxDiscardRectangles =
%u
\n", discard_rect_props->maxDiscardRectangles); + fprintf(out, "\t\t\t\t\t
\n"); + } else if (human_readable_output) { + printf("\nVkPhysicalDeviceDiscardRectangleProperties:\n"); + printf("=========================================\n"); + printf("\tmaxDiscardRectangles = %u\n", discard_rect_props->maxDiscardRectangles); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR && CheckPhysicalDeviceExtensionIncluded(VK_KHR_MULTIVIEW_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDeviceMultiviewPropertiesKHR *multiview_props = (VkPhysicalDeviceMultiviewPropertiesKHR*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t
VkPhysicalDeviceMultiviewProperties\n"); + fprintf(out, "\t\t\t\t\t\t
maxMultiviewInstanceIndex =
%u
\n", multiview_props->maxMultiviewInstanceIndex); + fprintf(out, "\t\t\t\t\t\t
maxMultiviewViewCount =
%u
\n", multiview_props->maxMultiviewViewCount ); + fprintf(out, "\t\t\t\t\t
\n"); + } + else if (human_readable_output) { + printf("\nVkPhysicalDeviceMultiviewProperties:\n"); + printf("=========================================\n"); + printf("\tmaxMultiviewInstanceIndex = %u\n", multiview_props->maxMultiviewInstanceIndex); + printf("\tmaxMultiviewViewCount = %u\n", multiview_props->maxMultiviewViewCount ); + } + } + place = structure->pNext; + } + } + fflush(out); fflush(stdout); } @@ -2330,7 +2599,16 @@ } static void AppGpuDumpQueueProps(const struct AppGpu *gpu, uint32_t id, FILE *out) { - const VkQueueFamilyProperties *props = &gpu->queue_props[id]; + VkQueueFamilyProperties props; + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + const VkQueueFamilyProperties *props2_const = &gpu->queue_props2[id].queueFamilyProperties; + props = *props2_const; + } else { + const VkQueueFamilyProperties *props_const = &gpu->queue_props[id]; + props = *props_const; + } if (html_output) { fprintf(out, "\t\t\t\t\t
VkQueueFamilyProperties[
%d
]
\n", id); @@ -2342,47 +2620,47 @@ } if (html_output || human_readable_output) { char *sep = ""; // separator character - if (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) { + if (props.queueFlags & VK_QUEUE_GRAPHICS_BIT) { fprintf(out, "GRAPHICS"); sep = " | "; } - if (props->queueFlags & VK_QUEUE_COMPUTE_BIT) { + if (props.queueFlags & VK_QUEUE_COMPUTE_BIT) { fprintf(out, "%sCOMPUTE", sep); sep = " | "; } - if (props->queueFlags & VK_QUEUE_TRANSFER_BIT) { + if (props.queueFlags & VK_QUEUE_TRANSFER_BIT) { fprintf(out, "%sTRANSFER", sep); sep = " | "; } - if (props->queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) { + if (props.queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) { fprintf(out, "%sSPARSE", sep); } } if (html_output) { fprintf(out, "
\n"); - fprintf(out, "\t\t\t\t\t\t
queueCount =
%u
\n", props->queueCount); - fprintf(out, "\t\t\t\t\t\t
timestampValidBits =
%u
\n", props->timestampValidBits); + fprintf(out, "\t\t\t\t\t\t
queueCount =
%u
\n", props.queueCount); + fprintf(out, "\t\t\t\t\t\t
timestampValidBits =
%u
\n", props.timestampValidBits); fprintf(out, "\t\t\t\t\t\t
minImageTransferGranularity = (
%d
,
%d
,
%d
)
\n", - props->minImageTransferGranularity.width, props->minImageTransferGranularity.height, props->minImageTransferGranularity.depth); + props.minImageTransferGranularity.width, props.minImageTransferGranularity.height, props.minImageTransferGranularity.depth); fprintf(out, "\t\t\t\t\t\n"); } else if (human_readable_output) { printf("\n"); - printf("\tqueueCount = %u\n", props->queueCount); - printf("\ttimestampValidBits = %u\n", props->timestampValidBits); - printf("\tminImageTransferGranularity = (%d, %d, %d)\n", props->minImageTransferGranularity.width, - props->minImageTransferGranularity.height, props->minImageTransferGranularity.depth); + printf("\tqueueCount = %u\n", props.queueCount); + printf("\ttimestampValidBits = %u\n", props.timestampValidBits); + printf("\tminImageTransferGranularity = (%d, %d, %d)\n", props.minImageTransferGranularity.width, + props.minImageTransferGranularity.height, props.minImageTransferGranularity.depth); } if (json_output) { printf("\t\t{\n"); printf("\t\t\t\"minImageTransferGranularity\": {\n"); - printf("\t\t\t\t\"depth\": %u,\n", props->minImageTransferGranularity.depth); - printf("\t\t\t\t\"height\": %u,\n", props->minImageTransferGranularity.height); - printf("\t\t\t\t\"width\": %u\n", props->minImageTransferGranularity.width); + printf("\t\t\t\t\"depth\": %u,\n", props.minImageTransferGranularity.depth); + printf("\t\t\t\t\"height\": %u,\n", props.minImageTransferGranularity.height); + printf("\t\t\t\t\"width\": %u\n", props.minImageTransferGranularity.width); printf("\t\t\t},\n"); - printf("\t\t\t\"queueCount\": %u,\n", props->queueCount); - printf("\t\t\t\"queueFlags\": %u,\n", props->queueFlags); - printf("\t\t\t\"timestampValidBits\": %u\n", props->timestampValidBits); + printf("\t\t\t\"queueCount\": %u,\n", props.queueCount); + printf("\t\t\t\"queueFlags\": %u,\n", props.queueFlags); + printf("\t\t\t\"timestampValidBits\": %u\n", props.timestampValidBits); printf("\t\t}"); } @@ -2414,26 +2692,35 @@ } static void AppGpuDumpMemoryProps(const struct AppGpu *gpu, FILE *out) { - const VkPhysicalDeviceMemoryProperties *props = &gpu->memory_props; + VkPhysicalDeviceMemoryProperties props; + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + const VkPhysicalDeviceMemoryProperties *props2_const = &gpu->memory_props2.memoryProperties; + props = *props2_const; + } else { + const VkPhysicalDeviceMemoryProperties *props_const = &gpu->memory_props; + props = *props_const; + } if (html_output) { fprintf(out, "\t\t\t\t\t
VkPhysicalDeviceMemoryProperties\n"); - fprintf(out, "\t\t\t\t\t\t
memoryHeapCount =
%u
", props->memoryHeapCount); - if (props->memoryHeapCount > 0) { + fprintf(out, "\t\t\t\t\t\t
memoryHeapCount =
%u
", props.memoryHeapCount); + if (props.memoryHeapCount > 0) { fprintf(out, "\n"); } } else if (human_readable_output) { printf("VkPhysicalDeviceMemoryProperties:\n"); printf("=================================\n"); - printf("\tmemoryHeapCount = %u\n", props->memoryHeapCount); + printf("\tmemoryHeapCount = %u\n", props.memoryHeapCount); } if (json_output) { printf(",\n"); printf("\t\"VkPhysicalDeviceMemoryProperties\": {\n"); printf("\t\t\"memoryHeaps\": ["); } - for (uint32_t i = 0; i < props->memoryHeapCount; ++i) { - const VkDeviceSize memSize = props->memoryHeaps[i].size; + for (uint32_t i = 0; i < props.memoryHeapCount; ++i) { + const VkDeviceSize memSize = props.memoryHeaps[i].size; char *mem_size_human_readable = HumanReadable((const size_t)memSize); if (html_output) { @@ -2447,7 +2734,7 @@ } free(mem_size_human_readable); - const VkMemoryHeapFlags heap_flags = props->memoryHeaps[i].flags; + const VkMemoryHeapFlags heap_flags = props.memoryHeaps[i].flags; if (html_output) { fprintf(out, "\t\t\t\t\t\t\t\t
flags\n"); fprintf(out, "\t\t\t\t\t\t\t\t\t
"); @@ -2471,44 +2758,44 @@ } } if (html_output) { - if (props->memoryHeapCount > 0) { + if (props.memoryHeapCount > 0) { fprintf(out, "\t\t\t\t\t\t"); } fprintf(out, "
\n"); } if (json_output) { - if (props->memoryHeapCount > 0) { + if (props.memoryHeapCount > 0) { printf("\n\t\t"); } printf("]"); } if (html_output) { - fprintf(out, "\t\t\t\t\t\t
memoryTypeCount =
%u
", props->memoryTypeCount); - if (props->memoryTypeCount > 0) { + fprintf(out, "\t\t\t\t\t\t
memoryTypeCount =
%u
", props.memoryTypeCount); + if (props.memoryTypeCount > 0) { fprintf(out, "\n"); } } else if (human_readable_output) { - printf("\tmemoryTypeCount = %u\n", props->memoryTypeCount); + printf("\tmemoryTypeCount = %u\n", props.memoryTypeCount); } if (json_output) { printf(",\n"); printf("\t\t\"memoryTypes\": ["); } - for (uint32_t i = 0; i < props->memoryTypeCount; ++i) { + for (uint32_t i = 0; i < props.memoryTypeCount; ++i) { if (html_output) { fprintf(out, "\t\t\t\t\t\t\t
memoryTypes[
%u
]
\n", i); - fprintf(out, "\t\t\t\t\t\t\t\t
heapIndex =
%u
\n", props->memoryTypes[i].heapIndex); - fprintf(out, "\t\t\t\t\t\t\t\t
propertyFlags =
0x%" PRIxLEAST32 "
", props->memoryTypes[i].propertyFlags); - if (props->memoryTypes[i].propertyFlags == 0) { + fprintf(out, "\t\t\t\t\t\t\t\t
heapIndex =
%u
\n", props.memoryTypes[i].heapIndex); + fprintf(out, "\t\t\t\t\t\t\t\t
propertyFlags =
0x%" PRIxLEAST32 "
", props.memoryTypes[i].propertyFlags); + if (props.memoryTypes[i].propertyFlags == 0) { fprintf(out, "
\n"); } else { fprintf(out, "\n"); } } else if (human_readable_output) { printf("\tmemoryTypes[%u] :\n", i); - printf("\t\theapIndex = %u\n", props->memoryTypes[i].heapIndex); - printf("\t\tpropertyFlags = 0x%" PRIxLEAST32 ":\n", props->memoryTypes[i].propertyFlags); + printf("\t\theapIndex = %u\n", props.memoryTypes[i].heapIndex); + printf("\t\tpropertyFlags = 0x%" PRIxLEAST32 ":\n", props.memoryTypes[i].propertyFlags); } if (json_output) { if (i > 0) { @@ -2516,20 +2803,20 @@ } printf("\n"); printf("\t\t\t{\n"); - printf("\t\t\t\t\"heapIndex\": %u,\n", props->memoryTypes[i].heapIndex); - printf("\t\t\t\t\"propertyFlags\": %u\n", props->memoryTypes[i].propertyFlags); + printf("\t\t\t\t\"heapIndex\": %u,\n", props.memoryTypes[i].heapIndex); + printf("\t\t\t\t\"propertyFlags\": %u\n", props.memoryTypes[i].propertyFlags); printf("\t\t\t}"); } // Print each named flag to html or std output if it is set - const VkFlags flags = props->memoryTypes[i].propertyFlags; + const VkFlags flags = props.memoryTypes[i].propertyFlags; if (html_output) { if (flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) fprintf(out, "\t\t\t\t\t\t\t\t\t
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
\n"); if (flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) fprintf(out, "\t\t\t\t\t\t\t\t\t
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
\n"); if (flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) fprintf(out, "\t\t\t\t\t\t\t\t\t
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
\n"); if (flags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) fprintf(out, "\t\t\t\t\t\t\t\t\t
VK_MEMORY_PROPERTY_HOST_CACHED_BIT
\n"); if (flags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) fprintf(out, "\t\t\t\t\t\t\t\t\t
VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT
\n"); - if (props->memoryTypes[i].propertyFlags > 0) fprintf(out, "\t\t\t\t\t\t\t\t
\n"); + if (props.memoryTypes[i].propertyFlags > 0) fprintf(out, "\t\t\t\t\t\t\t\t
\n"); fprintf(out, "\t\t\t\t\t\t\t
\n"); } else if (human_readable_output) { if (flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) printf("\t\t\tVK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT\n"); @@ -2540,14 +2827,14 @@ } } if (html_output) { - if (props->memoryTypeCount > 0) { + if (props.memoryTypeCount > 0) { fprintf(out, "\t\t\t\t\t\t"); } fprintf(out, "
\n"); fprintf(out, "\t\t\t\t\t
\n"); } if (json_output) { - if (props->memoryTypeCount > 0) { + if (props.memoryTypeCount > 0) { printf("\n\t\t"); } printf("]\n"); @@ -2618,6 +2905,160 @@ } } +static void AppGroupDump(const VkPhysicalDeviceGroupProperties *group, const uint32_t id, const struct AppInstance *inst, + FILE *out) { + if (html_output) { + fprintf(out, "\t\t\t\t
Device Group Properties (Group %u)\n", id); + fprintf(out, "\t\t\t\t\t
physicalDeviceCount =
%u
\n", + group->physicalDeviceCount); + } else if (human_readable_output) { + printf("\tDevice Group Properties (Group %u) :\n", id); + printf("\t\tphysicalDeviceCount = %u\n", group->physicalDeviceCount); + } + + // Keep a record of all physical device properties to give the user clearer information as output. + VkPhysicalDeviceProperties *props = malloc(sizeof(props[0]) * group->physicalDeviceCount); + if (!props) { + ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); + } + for (uint32_t i = 0; i < group->physicalDeviceCount; ++i) { + vkGetPhysicalDeviceProperties(group->physicalDevices[i], &props[i]); + } + + // Output information to the user. + for (uint32_t i = 0; i < group->physicalDeviceCount; ++i) { + if (html_output) { + fprintf(out, "\t\t\t\t\t\t
%s (ID:
%d
)
\n", + props[i].deviceName, i); + } else if (human_readable_output) { + printf("\n\t\t\t%s (ID: %d)\n", props[i].deviceName, i); + } + } + + if (html_output) { + fprintf(out, "\t\t\t\t\t
\n"); + } + + if (html_output) { + fprintf(out, "\t\t\t\t\t
subsetAllocation =
%u
\n", + group->subsetAllocation); + } else if (human_readable_output) { + printf("\n\t\tsubsetAllocation = %u\n", group->subsetAllocation); + } + + if (html_output) { + fprintf(out, "\t\t\t\t
\n"); + } + + // Build create info for logical device made from all physical devices in this group. + const char *extensions_list[] = {VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_SWAPCHAIN_EXTENSION_NAME, + VK_KHR_DEVICE_GROUP_EXTENSION_NAME}; + + VkDeviceGroupDeviceCreateInfoKHR dg_ci = {.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHR, + .pNext = NULL, + .physicalDeviceCount = group->physicalDeviceCount, + .pPhysicalDevices = group->physicalDevices}; + + VkDeviceQueueCreateInfo q_ci = { + .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, .pNext = NULL, .queueFamilyIndex = 0, .queueCount = 1}; + + VkDeviceCreateInfo device_ci = {.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, + .pNext = &dg_ci, + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &q_ci, + .enabledExtensionCount = ARRAY_SIZE(extensions_list), + .ppEnabledExtensionNames = extensions_list}; + + VkDevice logical_device = VK_NULL_HANDLE; + + VkResult err = vkCreateDevice(group->physicalDevices[0], &device_ci, NULL, &logical_device); + + if (!err) { + if (html_output) { + fprintf(out, "\t\t\t\t
Device Group Present Capabilities (Group %d)\n", id); + } else if (human_readable_output) { + printf("\n\tDevice Group Present Capabilities (Group %d) :\n", id); + } + + VkDeviceGroupPresentCapabilitiesKHR group_capabilities = {.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR, + .pNext = NULL}; + + // If the KHR_device_group extension is present, write the capabilities of the logical device into a struct for later output + // to user. + PFN_vkGetDeviceGroupPresentCapabilitiesKHR vkGetDeviceGroupPresentCapabilitiesKHR = + (PFN_vkGetDeviceGroupPresentCapabilitiesKHR)vkGetInstanceProcAddr(inst->instance, + "vkGetDeviceGroupPresentCapabilitiesKHR"); + vkGetDeviceGroupPresentCapabilitiesKHR(logical_device, &group_capabilities); + + for (uint32_t i = 0; i < group->physicalDeviceCount; i++) { + if (html_output) { + fprintf(out, "\t\t\t\t\t
%s (ID:
%d
)
\n", + props[i].deviceName, i); + fprintf(out, "\t\t\t\t\t
Can present images from the following devices:\n"); + if (group_capabilities.presentMask[i] != 0) { + for (uint32_t j = 0; j < group->physicalDeviceCount; ++j) { + uint32_t mask = 1 << j; + if (group_capabilities.presentMask[i] & mask) { + fprintf(out, "\t\t\t\t\t\t
%s (ID:
%d
)
\n", + props[j].deviceName, j); + } + } + } else { + fprintf(out, "\t\t\t\t\t\t
None
\n"); + } + fprintf(out, "\t\t\t\t\t
\n"); + } else if (human_readable_output) { + printf("\n\t\t%s (ID: %d)\n", props[i].deviceName, i); + printf("\t\tCan present images from the following devices:\n"); + if (group_capabilities.presentMask[i] != 0) { + for (uint32_t j = 0; j < group->physicalDeviceCount; ++j) { + uint32_t mask = 1 << j; + if (group_capabilities.presentMask[i] & mask) { + printf("\t\t\t%s (ID: %d)\n", props[j].deviceName, j); + } + } + } else { + printf("\t\t\tNone\n"); + } + printf("\n"); + } + } + + if (html_output) { + fprintf(out, "\t\t\t\t\t
Present modes\n"); + if (group_capabilities.modes & VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR) + fprintf(out, "\t\t\t\t\t\t
VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR
\n"); + if (group_capabilities.modes & VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR) + fprintf(out, "\t\t\t\t\t\t
VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR
\n"); + if (group_capabilities.modes & VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR) + fprintf(out, "\t\t\t\t\t\t
VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR
\n"); + if (group_capabilities.modes & VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR) + fprintf( + out, + "\t\t\t\t\t\t
VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR
\n"); + fprintf(out, "\t\t\t\t\t
\n"); + } else if (human_readable_output) { + printf("\t\tPresent modes:\n"); + if (group_capabilities.modes & VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR) + printf("\t\t\tVK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR\n"); + if (group_capabilities.modes & VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR) + printf("\t\t\tVK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR\n"); + if (group_capabilities.modes & VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR) + printf("\t\t\tVK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR\n"); + if (group_capabilities.modes & VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR) + printf("\t\t\tVK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR\n"); + } + + if (html_output) { + fprintf(out, "\t\t\t\t
\n"); + } + } + + // Clean up after ourselves. + free(props); + vkDestroyDevice(logical_device, NULL); +} + #ifdef _WIN32 // Enlarges the console window to have a large scrollback size. static void ConsoleEnlarge() { @@ -2850,7 +3291,8 @@ bool has_display = true; const char *display_var = getenv("DISPLAY"); if (display_var == NULL || strlen(display_var) == 0) { - printf("'DISPLAY' environment variable not set... skipping surface info\n"); + fprintf(stderr, "'DISPLAY' environment variable not set... skipping surface info\n"); + fflush(stderr); has_display = false; } #endif @@ -2940,6 +3382,47 @@ } //--------- + if (CheckExtensionEnabled(VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME, inst.inst_extensions, inst.inst_extensions_count)) { + PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR = + (PFN_vkEnumeratePhysicalDeviceGroupsKHR)vkGetInstanceProcAddr(inst.instance, "vkEnumeratePhysicalDeviceGroupsKHR"); + + uint32_t group_count; + err = vkEnumeratePhysicalDeviceGroupsKHR(inst.instance, &group_count, NULL); + if (err) { + ERR_EXIT(err); + } + + VkPhysicalDeviceGroupProperties *groups = malloc(sizeof(groups[0]) * group_count); + if (!groups) { + ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); + } + + err = vkEnumeratePhysicalDeviceGroupsKHR(inst.instance, &group_count, groups); + if (err) { + ERR_EXIT(err); + } + + if (html_output) { + fprintf(out, "\t\t\t
Groups\n"); + } else if (human_readable_output) { + printf("\nGroups :\n"); + printf("========\n"); + } + + for (uint32_t i = 0; i < group_count; ++i) { + AppGroupDump(&groups[i], i, &inst, out); + if (human_readable_output) { + printf("\n\n"); + } + } + + if (html_output) { + fprintf(out, "\t\t\t
\n"); + } + + free(groups); + } + for (uint32_t i = 0; i < gpu_count; ++i) { if (json_output && selected_gpu != i) { // Toggle json_output to allow html output without json output diff -Nru vulkan-1.1.70+dfsg1/demos/vulkaninfo.rc vulkan-1.1.73+dfsg/demos/vulkaninfo.rc --- vulkan-1.1.70+dfsg1/demos/vulkaninfo.rc 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/demos/vulkaninfo.rc 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,98 @@ +// +// Copyright (c) 2018 The Khronos Group Inc. +// Copyright (c) 2018 Valve Corporation +// Copyright (c) 2018 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: Lenny Komow +// + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// Start customize section +// Edit this section for your build +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +#define VERSION_MAJOR 1 +#define VERSION_MINOR 0 +#define VERSION_PATCH 1111 +#define VERSION_BUILDNO 2222 + +#define VERSION_BUILD_DESCRIPTION "Dev Build" + +// All builds except release builds should set this to 0. +// Release builds should set this to 1. +#define VERSION_IS_RELEASEBUILD 0 + + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// End of customize section +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +#include "winres.h" + +#define VER_FILE_VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_BUILDNO + +#define STRINGIZE2(s) #s +#define STRINGIZE(s) STRINGIZE2(s) + +#if VERSION_IS_RELEASEBUILD==1 + #define VER_FILE_DESCRIPTION_STR "Vulkan Info" + #define VER_FILE_VERSION_STR STRINGIZE(VERSION_MAJOR) \ + "." STRINGIZE(VERSION_MINOR) \ + "." STRINGIZE(VERSION_PATCH) \ + "." STRINGIZE(VERSION_BUILDNO) +#else + #define VER_FILE_DESCRIPTION_STR "Vulkan Info - " VERSION_BUILD_DESCRIPTION + #define VER_FILE_VERSION_STR STRINGIZE(VERSION_MAJOR) \ + "." STRINGIZE(VERSION_MINOR) \ + "." STRINGIZE(VERSION_PATCH) \ + "." STRINGIZE(VERSION_BUILDNO) \ + "." VERSION_BUILD_DESCRIPTION +#endif + + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VER_FILE_VERSION + PRODUCTVERSION VER_FILE_VERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + + FILEOS 0x00000L + FILETYPE VFT_DLL + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "04090000" + BEGIN + VALUE "FileDescription", VER_FILE_DESCRIPTION_STR + VALUE "FileVersion", VER_FILE_VERSION_STR + VALUE "LegalCopyright", "Copyright (C) 2015-2018" + VALUE "ProductName", "Vulkan Runtime" + VALUE "ProductVersion", VER_FILE_VERSION_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 0000 + END +END diff -Nru vulkan-1.1.70+dfsg1/external/glslang/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/CMakeLists.txt 2018-04-27 11:46:26.000000000 +0000 @@ -9,6 +9,14 @@ # Adhere to GNU filesystem layout conventions include(GNUInstallDirs) +option(BUILD_SHARED_LIBS "Build Shared Libraries" OFF) + +set(LIB_TYPE STATIC) + +if(BUILD_SHARED_LIBS) + set(LIB_TYPE SHARED) +endif() + option(SKIP_GLSLANG_INSTALL "Skip installation" ${SKIP_GLSLANG_INSTALL}) if(NOT ${SKIP_GLSLANG_INSTALL}) set(ENABLE_GLSLANG_INSTALL ON) @@ -94,9 +102,12 @@ if(ENABLE_OPT) message(STATUS "optimizer enabled") - add_definitions(-DENABLE_OPT) -elseif(ENABLE_HLSL) - message(STATUS "spirv-tools not linked - illegal SPIRV may be generated for HLSL") + add_definitions(-DENABLE_OPT=1) +else() + if(ENABLE_HLSL) + message(STATUS "spirv-tools not linked - illegal SPIRV may be generated for HLSL") + endif() + add_definitions(-DENABLE_OPT=0) endif() add_subdirectory(glslang) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/Android.mk vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/Android.mk --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/Android.mk 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/Android.mk 2018-04-27 11:46:32.000000000 +0000 @@ -27,6 +27,7 @@ source/util/bit_stream.cpp \ source/util/parse_number.cpp \ source/util/string_utils.cpp \ + source/util/timer.cpp \ source/val/basic_block.cpp \ source/val/construct.cpp \ source/val/function.cpp \ @@ -38,6 +39,7 @@ source/validate_atomics.cpp \ source/validate_barriers.cpp \ source/validate_bitwise.cpp \ + source/validate_builtins.cpp \ source/validate_capability.cpp \ source/validate_cfg.cpp \ source/validate_composites.cpp \ @@ -63,10 +65,12 @@ source/opt/cfg.cpp \ source/opt/cfg_cleanup_pass.cpp \ source/opt/ccp_pass.cpp \ + source/opt/common_uniform_elim_pass.cpp \ source/opt/compact_ids_pass.cpp \ source/opt/composite.cpp \ - source/opt/common_uniform_elim_pass.cpp \ + source/opt/const_folding_rules.cpp \ source/opt/constants.cpp \ + source/opt/copy_prop_arrays.cpp \ source/opt/dead_branch_elim_pass.cpp \ source/opt/dead_insert_elim_pass.cpp \ source/opt/dead_variable_elimination.cpp \ @@ -92,12 +96,17 @@ source/opt/instruction_list.cpp \ source/opt/ir_context.cpp \ source/opt/ir_loader.cpp \ + source/opt/licm_pass.cpp \ source/opt/local_access_chain_convert_pass.cpp \ source/opt/local_redundancy_elimination.cpp \ source/opt/local_single_block_elim_pass.cpp \ source/opt/local_single_store_elim_pass.cpp \ source/opt/local_ssa_elim_pass.cpp \ source/opt/loop_descriptor.cpp \ + source/opt/loop_peeling.cpp \ + source/opt/loop_unroller.cpp \ + source/opt/loop_unswitch_pass.cpp \ + source/opt/loop_utils.cpp \ source/opt/mem_pass.cpp \ source/opt/merge_return_pass.cpp \ source/opt/module.cpp \ @@ -109,10 +118,15 @@ source/opt/redundancy_elimination.cpp \ source/opt/remove_duplicates_pass.cpp \ source/opt/replace_invalid_opc.cpp \ + source/opt/scalar_analysis.cpp \ + source/opt/scalar_analysis_simplification.cpp \ source/opt/scalar_replacement_pass.cpp \ source/opt/set_spec_constant_default_value_pass.cpp \ + source/opt/simplification_pass.cpp \ + source/opt/ssa_rewrite_pass.cpp \ source/opt/strength_reduction_pass.cpp \ source/opt/strip_debug_info_pass.cpp \ + source/opt/strip_reflect_info_pass.cpp \ source/opt/type_manager.cpp \ source/opt/types.cpp \ source/opt/unify_const_pass.cpp \ @@ -120,10 +134,15 @@ source/opt/workaround1209.cpp # Locations of grammar files. +# +# TODO(dneto): Build a single set of tables that embeds versioning differences on +# a per-item basis. That must happen before SPIR-V 1.4, etc. +# https://github.com/KhronosGroup/SPIRV-Tools/issues/1195 SPV_CORE10_GRAMMAR=$(SPVHEADERS_LOCAL_PATH)/include/spirv/1.0/spirv.core.grammar.json SPV_CORE11_GRAMMAR=$(SPVHEADERS_LOCAL_PATH)/include/spirv/1.1/spirv.core.grammar.json SPV_CORE12_GRAMMAR=$(SPVHEADERS_LOCAL_PATH)/include/spirv/1.2/spirv.core.grammar.json -SPV_CORELATEST_GRAMMAR=$(SPV_CORE12_GRAMMAR) +SPV_COREUNIFIED1_GRAMMAR=$(SPVHEADERS_LOCAL_PATH)/include/spirv/unified1/spirv.core.grammar.json +SPV_CORELATEST_GRAMMAR=$(SPV_COREUNIFIED1_GRAMMAR) SPV_GLSL_GRAMMAR=$(SPVHEADERS_LOCAL_PATH)/include/spirv/1.2/extinst.glsl.std.450.grammar.json SPV_OPENCL_GRAMMAR=$(SPVHEADERS_LOCAL_PATH)/include/spirv/1.2/extinst.opencl.std.100.grammar.json # TODO(dneto): I expect the DebugInfo grammar file to eventually migrate to SPIRV-Headers @@ -167,9 +186,26 @@ --core-insts-output=$(1)/core.insts-1.2.inc \ --operand-kinds-output=$(1)/operand.kinds-1.2.inc @echo "[$(TARGET_ARCH_ABI)] Grammar v1.2 : instructions & operands <= grammar JSON files" -$(LOCAL_PATH)/source/opcode.cpp: $(1)/core.insts-1.0.inc $(1)/core.insts-1.1.inc $(1)/core.insts-1.2.inc -$(LOCAL_PATH)/source/operand.cpp: $(1)/operand.kinds-1.0.inc $(1)/operand.kinds-1.1.inc $(1)/operand.kinds-1.2.inc -$(LOCAL_PATH)/source/ext_inst.cpp: $(1)/glsl.std.450.insts.inc $(1)/opencl.std.insts.inc +$(1)/core.insts-unified1.inc $(1)/operand.kinds-unified1.inc: \ + $(LOCAL_PATH)/utils/generate_grammar_tables.py \ + $(SPV_COREUNIFIED1_GRAMMAR) \ + $(SPV_DEBUGINFO_GRAMMAR) + @$(HOST_PYTHON) $(LOCAL_PATH)/utils/generate_grammar_tables.py \ + --spirv-core-grammar=$(SPV_COREUNIFIED1_GRAMMAR) \ + --extinst-debuginfo-grammar=$(SPV_DEBUGINFO_GRAMMAR) \ + --core-insts-output=$(1)/core.insts-unified1.inc \ + --operand-kinds-output=$(1)/operand.kinds-unified1.inc + @echo "[$(TARGET_ARCH_ABI)] Grammar v1.3 (from unified1) : instructions & operands <= grammar JSON files" +$(LOCAL_PATH)/source/opcode.cpp: $(1)/core.insts-1.0.inc $(1)/core.insts-1.1.inc $(1)/core.insts-1.2.inc $(1)/core.insts-unified1.inc +$(LOCAL_PATH)/source/operand.cpp: $(1)/operand.kinds-1.0.inc $(1)/operand.kinds-1.1.inc $(1)/operand.kinds-1.2.inc $(1)/operand.kinds-unified1.inc +$(LOCAL_PATH)/source/ext_inst.cpp: \ + $(1)/glsl.std.450.insts.inc \ + $(1)/opencl.std.insts.inc \ + $(1)/debuginfo.insts.inc \ + $(1)/spv-amd-gcn-shader.insts.inc \ + $(1)/spv-amd-shader-ballot.insts.inc \ + $(1)/spv-amd-shader-explicit-vertex-parameter.insts.inc \ + $(1)/spv-amd-shader-trinary-minmax.insts.inc endef $(eval $(call gen_spvtools_grammar_tables,$(SPVTOOLS_OUT_PATH))) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/.appveyor.yml vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/.appveyor.yml --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/.appveyor.yml 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/.appveyor.yml 2018-04-27 11:46:32.000000000 +0000 @@ -8,7 +8,7 @@ # Put it first so we get its feedback first. os: - Visual Studio 2017 - - Visual Studio 2015 + - Visual Studio 2013 platform: - x64 @@ -33,7 +33,7 @@ matrix: fast_finish: true # Show final status immediately if a test fails. exclude: - - os: Visual Studio 2015 + - os: Visual Studio 2013 configuration: Debug # scripts that run after cloning repository @@ -50,7 +50,7 @@ - git clone --depth=1 https://github.com/google/effcee.git external/effcee - git clone --depth=1 https://github.com/google/re2.git external/re2 # Set path and environment variables for the current Visual Studio version - - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2015" (call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64) + - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2013" (call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86_amd64) - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2017" (call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_amd64) build: @@ -59,7 +59,7 @@ build_script: - mkdir build && cd build - - cmake -GNinja -DSPIRV_BUILD_COMPRESSION=ON -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DCMAKE_INSTALL_PREFIX=install .. + - cmake -GNinja -DSPIRV_BUILD_COMPRESSION=ON -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DCMAKE_INSTALL_PREFIX=install -DRE2_BUILD_TESTING=OFF .. - ninja install test_script: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/CHANGES vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/CHANGES --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/CHANGES 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/CHANGES 2018-04-27 11:46:32.000000000 +0000 @@ -1,7 +1,106 @@ Revision history for SPIRV-Tools -v2018.1-dev 2018-02-02 - - Start v2018.1-dev +v2018.3-dev 2018-04-06 + - General: + - Support SPV_EXT_descriptor_indexing + - Support SPV_GOOGLE_decorate_string + - Support SPV_GOOGLE_hlsl_functionality1 + - Support SPV_NV_shader_subgroup_partitioned + - Use "unified1" grammar from SPIRV-Headers + - Simplify support for new extensions. Assembler, disassembler, and simple validation + support is automatic if new tokens are introduced with appropriate extension + attributes in the "unified1" SPIR-V core grammar. + - Disassembler: Emit more digits on floating point, to reliably reproduce all + significand bits. (Use std::max_digits10 instead of std::digits10) + - Optimizer: + - Add --strip-reflect + - Add --time-report + - Merge-return now works with structured control flow. + - New (faster) SSA rewriter to convert local loads and stores to SSA IDs and phis. + Can replace load/store elimination passes. + - Fix instruction folding case: insertion that feeds and extract, when the extract + remains. + - Copy propagate arrays, in simple cases. + - Better handling of OpImageTexelPointer + - Add loop peeling internal utility. + - Initial utilities for scalar evolution. + - Validator: + - Check Vulkan built-in variables + - Check Vulkan-specific atomic result type rule. + - Relax control barrier check for SPIR-V 1.3. Fixes #1427 + - Check OpPhi. + - Stop checking sizes derived from spec-constants. + - Re-enable checks for OpUConvert. + - Fixes: + #898: Linker properly removes FuncParamAttr from imported symbols. + #924, #1174: Fix handling of decoration groups in optimizer, linker. + #1404: Don't optimize away the compute compute workgroup size constant. + #1407: Remove a bad assertion + #1456: Fix bug in SSA rewriter related to variables updated in loops. + +v2018.2 2018-03-07 + - General: + - Support SPIR-V 1.3 and Vulkan 1.1. + - Default target environment is now SPIR-V 1.3. For command-line tools, + use the --target-env option to override the default. Examples: + # Generate a SPIR-V 1.0 binary instead of SPIR-V 1.3 + spirv-as --target-env spv1.0 a.spvasm -o a.spv + spirv-as --target-env vulkan1.0 a.spvasm -o a.spv + # Validate as Vulkan 1.0 + spirv-val --target-env vulkan1.0 a.spv + - Support SPV_GOOGLE_decorate_string and SPV_GOOGLE_hlsl_functionality1 + - Fixes: + - Fix Android.mk build. Compilation was failing due to missing definitions of + SpvCapabilityFloat16ImageAMD and other enumerated values. + - Optimizer: Avoid generating duplicate names when merging types. + - #1375: Validator: SPV_AMD_gpu_shaer_half_float implicitly allows declaration + of the 16-bit floating point type. + - #1376: Optimizer: Avoid folding half-precision float. + +v2018.1 2018-03-02 + - General: + - Support Visual Studio 2013 again. (Continue support for VS 2015 and VS 2017.) + - Support building SPIRV-Tools as a shared library. + - Improve the HLSL legalization optimization recipe. #1311 + - Optimizer: + - General speedups. + - Remove generic dead code elimination functionality from transforms: + --eliminate-local-single-block + --eliminate-local-single-store + --eliminate-local-multi-store + To recover the previous behaviour, a recipe using those transforms should now + also invoke the --eliminate-dead-code-aggressive transform. + - Improve folding, including coverage for floating point, OpSelect, and arithmetic + with non-trivial constant operands. + - Add loop-invariant code motion pass. + - Add loop-unrolling pass, for honouring unroll hits. + - Add loop-unswitch pass. + - Add instruction simplification pass. + - Aggressive dead code elimination: Understands capability hierarchy when finding + instructions it can eliminate (combinators). (PR #1268) + - CCP can now fold floating point arithmetic. #1311 + - Validator: + - Validate barrier instructions. + - Check Vulkan-specific rules for atomics. + - Check Vulkan prohibition of Location or Component decorations on BuiltIn variables. + - Linker: + - Add --verify-ids option + - Add option to allow a resulting module to be partially linked. + - Handle OpModuleProcessed (instructions in SPIR-V layout section 7c) + - Fixes: + - #1265: Optimizer: Fix use-after free bug in if-conversion. (Fix object lifecycle bug + in type manager.) + - #1282: Fix new warnings found by GCC 8.0.1. + - #1285: Optimizer: Fix random failures during inlining. (Dangling references in DefUseManager) + - #1295: Optimizer: Fix incorrect handling of Phi nodes in CCP. + - #1300: Fix CCP: avoid bad CCP transitions and unsettled values. + - #1304: Avoid static-duration variables of class type (with constructors). + - #1323: Fix folding of an insert composite feeding a composite extract. + - #1339: Fix CCP: Handle OpConstantNull boolean values as conditions. + - #1341: DCEInst: Keep atomic instructions (and some others with side effects). + - #1354: Don't fold integer division. + - #1357: Support OpConstantNull in folding. + - #1361: CCP: Fix handling of non-constant module-scope values v2018.0 2018-02-02 - General diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/cmake/SPIRV-Tools.pc.in vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/cmake/SPIRV-Tools.pc.in --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/cmake/SPIRV-Tools.pc.in 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/cmake/SPIRV-Tools.pc.in 2018-04-27 11:46:32.000000000 +0000 @@ -1,7 +1,7 @@ prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=${prefix} -libdir=${prefix}/lib64 -includedir=${prefix}/include +libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ +includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ Name: SPIRV-Tools Description: Tools for SPIR-V diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/cmake/SPIRV-Tools-shared.pc.in vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/cmake/SPIRV-Tools-shared.pc.in --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/cmake/SPIRV-Tools-shared.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/cmake/SPIRV-Tools-shared.pc.in 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,12 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ +includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ + +Name: SPIRV-Tools +Description: Tools for SPIR-V +Version: @CURRENT_VERSION@ +URL: https://github.com/KhronosGroup/SPIRV-Tools + +Libs: -L${libdir} @SPIRV_SHARED_LIBRARIES@ +Cflags: -I${includedir} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/CMakeLists.txt 2018-04-27 11:46:32.000000000 +0000 @@ -34,6 +34,7 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") add_definitions(-DSPIRV_LINUX) + set(SPIRV_TIMER_ENABLED ON) elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") add_definitions(-DSPIRV_WINDOWS) elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN") @@ -42,12 +43,16 @@ add_definitions(-DSPIRV_MAC) elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") add_definitions(-DSPIRV_ANDROID) + set(SPIRV_TIMER_ENABLED ON) elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD") add_definitions(-DSPIRV_FREEBSD) else() message(FATAL_ERROR "Your platform '${CMAKE_SYSTEM_NAME}' is not supported!") endif() +if (${SPIRV_TIMER_ENABLED}) + add_definitions(-DSPIRV_TIMER_ENABLED) +endif() if ("${CMAKE_BUILD_TYPE}" STREQUAL "") message(STATUS "No build type selected, default to Debug") @@ -222,6 +227,7 @@ endif() set(SPIRV_LIBRARIES "-lSPIRV-Tools -lSPIRV-Tools-link -lSPIRV-Tools-opt") +set(SPIRV_SHARED_LIBRARIES "-lSPIRV-Tools-shared") if(SPIRV_BUILD_COMPRESSION) set(SPIRV_LIBRARIES "${SPIRV_LIBRARIES} -lSPIRV-Tools-comp") endif(SPIRV_BUILD_COMPRESSION) @@ -229,19 +235,34 @@ # Build pkg-config file # Use a first-class target so it's regenerated when relevant files are updated. add_custom_target(spirv-tools-pkg-config ALL - COMMAND cmake -DCHANGES_FILE=${CMAKE_CURRENT_SOURCE_DIR}/CHANGES + COMMAND ${CMAKE_COMMAND} + -DCHANGES_FILE=${CMAKE_CURRENT_SOURCE_DIR}/CHANGES -DTEMPLATE_FILE=${CMAKE_CURRENT_SOURCE_DIR}/cmake/SPIRV-Tools.pc.in -DOUT_FILE=${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools.pc -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} + -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} -DSPIRV_LIBRARIES=${SPIRV_LIBRARIES} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/write_pkg_config.cmake DEPENDS "CHANGES" "cmake/SPIRV-Tools.pc.in" "cmake/write_pkg_config.cmake") +add_custom_target(spirv-tools-shared-pkg-config ALL + COMMAND ${CMAKE_COMMAND} + -DCHANGES_FILE=${CMAKE_CURRENT_SOURCE_DIR}/CHANGES + -DTEMPLATE_FILE=${CMAKE_CURRENT_SOURCE_DIR}/cmake/SPIRV-Tools-shared.pc.in + -DOUT_FILE=${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools-shared.pc + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} + -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} + -DSPIRV_SHARED_LIBRARIES=${SPIRV_SHARED_LIBRARIES} + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/write_pkg_config.cmake + DEPENDS "CHANGES" "cmake/SPIRV-Tools-shared.pc.in" "cmake/write_pkg_config.cmake") # Install pkg-config file if (ENABLE_SPIRV_TOOLS_INSTALL) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools.pc + ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools-shared.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) endif() diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/commit-sha vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/commit-sha --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/commit-sha 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/commit-sha 2018-04-27 11:46:36.000000000 +0000 @@ -1 +1 @@ -9e19fc0f31ceaf1f6bc907dbf17dcfded85f2ce8 +26a698c34788bb69123a1f3789970a16cf4d9641 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/CMakeLists.txt 2018-04-27 11:46:32.000000000 +0000 @@ -66,43 +66,53 @@ endforeach() endif() - # Find Effcee and RE2, for testing. - # Optional for now, but eventually we'll make this required. - - # First find RE2, since Effcee depends on it. - # If already configured, then use that. Otherwise, prefer to find it under 're2' - # in this directory. - if (NOT TARGET re2) - # If we are configuring RE2, then turn off its testing. It takes a long time and - # does not add much value for us. If an enclosing project configured RE2, then it - # has already chosen whether to enable RE2 tesitng. - set(RE2_BUILD_TESTING OFF CACHE STRING "Run RE2 Tests") - if (NOT RE2_SOURCE_DIR) - if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/re2) - set(RE2_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/re2" CACHE STRING "RE2 source dir" ) - endif() + set(SPIRV_ENABLE_EFFCEE ON) + if (MSVC) + if (MSVC_VERSION LESS 1900) + message(STATUS "SPIRV-Tools: Need Visual Studio 2015 or later for Effcee and RE2") + set(SPIRV_ENABLE_EFFCEE OFF) endif() endif() - if (NOT TARGET effcee) - # Expect to find effcee in this directory. - if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/effcee) - # If we're configuring RE2 (via Effcee), then turn off RE2 testing. - if (NOT TARGET re2) - set(RE2_BUILD_TESTING OFF) + if (SPIRV_ENABLE_EFFCEE) + # Find Effcee and RE2, for testing. + # Optional for now, but eventually we'll make this required. + + # First find RE2, since Effcee depends on it. + # If already configured, then use that. Otherwise, prefer to find it under 're2' + # in this directory. + if (NOT TARGET re2) + # If we are configuring RE2, then turn off its testing. It takes a long time and + # does not add much value for us. If an enclosing project configured RE2, then it + # has already chosen whether to enable RE2 tesitng. + set(RE2_BUILD_TESTING OFF CACHE STRING "Run RE2 Tests") + if (NOT RE2_SOURCE_DIR) + if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/re2) + set(RE2_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/re2" CACHE STRING "RE2 source dir" ) + endif() endif() - if (MSVC) - # SPIRV-Tools uses the shared CRT with MSVC. Tell Effcee to do the same. - set(EFFCEE_ENABLE_SHARED_CRT ON) + endif() + + if (NOT TARGET effcee) + # Expect to find effcee in this directory. + if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/effcee) + # If we're configuring RE2 (via Effcee), then turn off RE2 testing. + if (NOT TARGET re2) + set(RE2_BUILD_TESTING OFF) + endif() + if (MSVC) + # SPIRV-Tools uses the shared CRT with MSVC. Tell Effcee to do the same. + set(EFFCEE_ENABLE_SHARED_CRT ON) + endif() + add_subdirectory(effcee) + set_property(TARGET effcee PROPERTY FOLDER Effcee) + # Turn off warnings for effcee and re2 + set_property(TARGET effcee APPEND PROPERTY COMPILE_OPTIONS -w) + set_property(TARGET re2 APPEND PROPERTY COMPILE_OPTIONS -w) endif() - add_subdirectory(effcee) - set_property(TARGET effcee PROPERTY FOLDER Effcee) - # Turn off warnings for effcee and re2 - set_property(TARGET effcee APPEND PROPERTY COMPILE_OPTIONS -w) - set_property(TARGET re2 APPEND PROPERTY COMPILE_OPTIONS -w) endif() + # TODO(dneto): Eventually, require this. endif() - # TODO(dneto): Eventually, require this. if (TARGET effcee) message(STATUS "SPIRV-Tools: Effcee is configured") else() diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.core.grammar.json vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.core.grammar.json --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.core.grammar.json 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.core.grammar.json 2018-04-27 11:46:33.000000000 +0000 @@ -3013,6 +3013,15 @@ "capabilities" : [ "SparseResidency" ] }, { + "opname" : "OpDecorateId", + "opcode" : 332, + "operands" : [ + { "kind" : "IdRef", "name" : "'Target'" }, + { "kind" : "Decoration" } + ], + "extensions" : [ "SPV_GOOGLE_hlsl_functionality1" ] + }, + { "opname" : "OpSubgroupBallotKHR", "opcode" : 4421, "operands" : [ @@ -3277,6 +3286,25 @@ { "kind" : "IdRef", "name" : "'Data'" } ], "capabilities" : [ "SubgroupImageBlockIOINTEL" ] + }, + { + "opname" : "OpDecorateStringGOOGLE", + "opcode" : 5632, + "operands" : [ + { "kind" : "IdRef", "name" : "'Target'" }, + { "kind" : "Decoration" } + ], + "extensions" : [ "SPV_GOOGLE_decorate_string" ] + }, + { + "opname" : "OpMemberDecorateStringGOOGLE", + "opcode" : 5633, + "operands" : [ + { "kind" : "IdRef", "name" : "'Struct Type'" }, + { "kind" : "LiteralInteger", "name" : "'Member'" }, + { "kind" : "Decoration" } + ], + "extensions" : [ "SPV_GOOGLE_decorate_string" ] } ], "operand_kinds" : [ @@ -4836,6 +4864,22 @@ "parameters" : [ { "kind" : "LiteralInteger", "name" : "'Offset'" } ] + }, + { + "enumerant" : "HlslCounterBufferGOOGLE", + "value" : 5634, + "parameters" : [ + { "kind" : "IdRef", "name" : "'Counter Buffer'" } + ], + "extensions" : [ "SPV_GOOGLE_hlsl_functionality1" ] + }, + { + "enumerant" : "HlslSemanticGOOGLE", + "value" : 5635, + "parameters" : [ + { "kind" : "LiteralString", "name" : "'Semantic'" } + ], + "extensions" : [ "SPV_GOOGLE_hlsl_functionality1" ] } ] }, @@ -5005,7 +5049,7 @@ { "enumerant" : "SubgroupSize", "value" : 36, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "SubgroupBallotKHR" ] }, { "enumerant" : "SubgroupMaxSize", @@ -5030,7 +5074,7 @@ { "enumerant" : "SubgroupLocalInvocationId", "value" : 41, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "SubgroupBallotKHR" ] }, { "enumerant" : "VertexIndex", diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.h 2018-04-27 11:46:33.000000000 +0000 @@ -1,5 +1,5 @@ /* -** Copyright (c) 2014-2017 The Khronos Group Inc. +** Copyright (c) 2014-2018 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a copy ** of this software and/or associated documentation files (the "Materials"), @@ -387,6 +387,8 @@ SpvDecorationPassthroughNV = 5250, SpvDecorationViewportRelativeNV = 5252, SpvDecorationSecondaryViewportRelativeNV = 5256, + SpvDecorationHlslCounterBufferGOOGLE = 5634, + SpvDecorationHlslSemanticGOOGLE = 5635, SpvDecorationMax = 0x7fffffff, } SpvDecoration; @@ -957,6 +959,7 @@ SpvOpAtomicFlagTestAndSet = 318, SpvOpAtomicFlagClear = 319, SpvOpImageSparseRead = 320, + SpvOpDecorateId = 332, SpvOpSubgroupBallotKHR = 4421, SpvOpSubgroupFirstInvocationKHR = 4422, SpvOpSubgroupAllKHR = 4428, @@ -981,6 +984,8 @@ SpvOpSubgroupBlockWriteINTEL = 5576, SpvOpSubgroupImageBlockReadINTEL = 5577, SpvOpSubgroupImageBlockWriteINTEL = 5578, + SpvOpDecorateStringGOOGLE = 5632, + SpvOpMemberDecorateStringGOOGLE = 5633, SpvOpMax = 0x7fffffff, } SpvOp; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.hpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.hpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.hpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.hpp 2018-04-27 11:46:33.000000000 +0000 @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2017 The Khronos Group Inc. +// Copyright (c) 2014-2018 The Khronos Group Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), @@ -383,6 +383,8 @@ DecorationPassthroughNV = 5250, DecorationViewportRelativeNV = 5252, DecorationSecondaryViewportRelativeNV = 5256, + DecorationHlslCounterBufferGOOGLE = 5634, + DecorationHlslSemanticGOOGLE = 5635, DecorationMax = 0x7fffffff, }; @@ -953,6 +955,7 @@ OpAtomicFlagTestAndSet = 318, OpAtomicFlagClear = 319, OpImageSparseRead = 320, + OpDecorateId = 332, OpSubgroupBallotKHR = 4421, OpSubgroupFirstInvocationKHR = 4422, OpSubgroupAllKHR = 4428, @@ -977,6 +980,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, OpMax = 0x7fffffff, }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.hpp11 vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.hpp11 --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.hpp11 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.hpp11 2018-04-27 11:46:33.000000000 +0000 @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2017 The Khronos Group Inc. +// Copyright (c) 2014-2018 The Khronos Group Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), @@ -383,6 +383,8 @@ PassthroughNV = 5250, ViewportRelativeNV = 5252, SecondaryViewportRelativeNV = 5256, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, Max = 0x7fffffff, }; @@ -953,6 +955,7 @@ OpAtomicFlagTestAndSet = 318, OpAtomicFlagClear = 319, OpImageSparseRead = 320, + OpDecorateId = 332, OpSubgroupBallotKHR = 4421, OpSubgroupFirstInvocationKHR = 4422, OpSubgroupAllKHR = 4428, @@ -977,6 +980,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, Max = 0x7fffffff, }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.json vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.json --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.json 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.json 2018-04-27 11:46:33.000000000 +0000 @@ -6,7 +6,7 @@ "Comment": [ [ - "Copyright (c) 2014-2017 The Khronos Group Inc.", + "Copyright (c) 2014-2018 The Khronos Group Inc.", "", "Permission is hereby granted, free of charge, to any person obtaining a copy", "of this software and/or associated documentation files (the \"Materials\"),", @@ -422,7 +422,9 @@ "OverrideCoverageNV": 5248, "PassthroughNV": 5250, "ViewportRelativeNV": 5252, - "SecondaryViewportRelativeNV": 5256 + "SecondaryViewportRelativeNV": 5256, + "HlslCounterBufferGOOGLE": 5634, + "HlslSemanticGOOGLE": 5635 } }, { @@ -983,6 +985,7 @@ "OpAtomicFlagTestAndSet": 318, "OpAtomicFlagClear": 319, "OpImageSparseRead": 320, + "OpDecorateId": 332, "OpSubgroupBallotKHR": 4421, "OpSubgroupFirstInvocationKHR": 4422, "OpSubgroupAllKHR": 4428, @@ -1006,7 +1009,9 @@ "OpSubgroupBlockReadINTEL": 5575, "OpSubgroupBlockWriteINTEL": 5576, "OpSubgroupImageBlockReadINTEL": 5577, - "OpSubgroupImageBlockWriteINTEL": 5578 + "OpSubgroupImageBlockWriteINTEL": 5578, + "OpDecorateStringGOOGLE": 5632, + "OpMemberDecorateStringGOOGLE": 5633 } } ] diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.lua vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.lua --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.lua 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.lua 2018-04-27 11:46:33.000000000 +0000 @@ -1,4 +1,4 @@ --- Copyright (c) 2014-2017 The Khronos Group Inc. +-- Copyright (c) 2014-2018 The Khronos Group Inc. -- -- Permission is hereby granted, free of charge, to any person obtaining a copy -- of this software and/or associated documentation files (the "Materials"), @@ -356,6 +356,8 @@ PassthroughNV = 5250, ViewportRelativeNV = 5252, SecondaryViewportRelativeNV = 5256, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, }, BuiltIn = { @@ -914,6 +916,7 @@ OpAtomicFlagTestAndSet = 318, OpAtomicFlagClear = 319, OpImageSparseRead = 320, + OpDecorateId = 332, OpSubgroupBallotKHR = 4421, OpSubgroupFirstInvocationKHR = 4422, OpSubgroupAllKHR = 4428, @@ -938,6 +941,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, }, } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.py vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.py --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.py 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.0/spirv.py 2018-04-27 11:46:33.000000000 +0000 @@ -1,4 +1,4 @@ -# Copyright (c) 2014-2017 The Khronos Group Inc. +# Copyright (c) 2014-2018 The Khronos Group Inc. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and/or associated documentation files (the "Materials"), @@ -356,6 +356,8 @@ 'PassthroughNV' : 5250, 'ViewportRelativeNV' : 5252, 'SecondaryViewportRelativeNV' : 5256, + 'HlslCounterBufferGOOGLE' : 5634, + 'HlslSemanticGOOGLE' : 5635, }, 'BuiltIn' : { @@ -914,6 +916,7 @@ 'OpAtomicFlagTestAndSet' : 318, 'OpAtomicFlagClear' : 319, 'OpImageSparseRead' : 320, + 'OpDecorateId' : 332, 'OpSubgroupBallotKHR' : 4421, 'OpSubgroupFirstInvocationKHR' : 4422, 'OpSubgroupAllKHR' : 4428, @@ -938,6 +941,8 @@ 'OpSubgroupBlockWriteINTEL' : 5576, 'OpSubgroupImageBlockReadINTEL' : 5577, 'OpSubgroupImageBlockWriteINTEL' : 5578, + 'OpDecorateStringGOOGLE' : 5632, + 'OpMemberDecorateStringGOOGLE' : 5633, }, } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.core.grammar.json vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.core.grammar.json --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.core.grammar.json 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.core.grammar.json 2018-04-27 11:46:33.000000000 +0000 @@ -3115,6 +3115,15 @@ ] }, { + "opname" : "OpDecorateId", + "opcode" : 332, + "operands" : [ + { "kind" : "IdRef", "name" : "'Target'" }, + { "kind" : "Decoration" } + ], + "extensions" : [ "SPV_GOOGLE_hlsl_functionality1" ] + }, + { "opname" : "OpSubgroupBallotKHR", "opcode" : 4421, "operands" : [ @@ -3379,6 +3388,25 @@ { "kind" : "IdRef", "name" : "'Data'" } ], "capabilities" : [ "SubgroupImageBlockIOINTEL" ] + }, + { + "opname" : "OpDecorateStringGOOGLE", + "opcode" : 5632, + "operands" : [ + { "kind" : "IdRef", "name" : "'Target'" }, + { "kind" : "Decoration" } + ], + "extensions" : [ "SPV_GOOGLE_decorate_string" ] + }, + { + "opname" : "OpMemberDecorateStringGOOGLE", + "opcode" : 5633, + "operands" : [ + { "kind" : "IdRef", "name" : "'Struct Type'" }, + { "kind" : "LiteralInteger", "name" : "'Member'" }, + { "kind" : "Decoration" } + ], + "extensions" : [ "SPV_GOOGLE_decorate_string" ] } ], "operand_kinds" : [ @@ -4984,6 +5012,22 @@ "parameters" : [ { "kind" : "LiteralInteger", "name" : "'Offset'" } ] + }, + { + "enumerant" : "HlslCounterBufferGOOGLE", + "value" : 5634, + "parameters" : [ + { "kind" : "IdRef", "name" : "'Counter Buffer'" } + ], + "extensions" : [ "SPV_GOOGLE_hlsl_functionality1" ] + }, + { + "enumerant" : "HlslSemanticGOOGLE", + "value" : 5635, + "parameters" : [ + { "kind" : "LiteralString", "name" : "'Semantic'" } + ], + "extensions" : [ "SPV_GOOGLE_hlsl_functionality1" ] } ] }, @@ -5153,7 +5197,7 @@ { "enumerant" : "SubgroupSize", "value" : 36, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "SubgroupBallotKHR" ] }, { "enumerant" : "SubgroupMaxSize", @@ -5178,7 +5222,7 @@ { "enumerant" : "SubgroupLocalInvocationId", "value" : 41, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "SubgroupBallotKHR" ] }, { "enumerant" : "VertexIndex", diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.h 2018-04-27 11:46:33.000000000 +0000 @@ -1,5 +1,5 @@ /* -** Copyright (c) 2014-2017 The Khronos Group Inc. +** Copyright (c) 2014-2018 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a copy ** of this software and/or associated documentation files (the "Materials"), @@ -392,6 +392,8 @@ SpvDecorationPassthroughNV = 5250, SpvDecorationViewportRelativeNV = 5252, SpvDecorationSecondaryViewportRelativeNV = 5256, + SpvDecorationHlslCounterBufferGOOGLE = 5634, + SpvDecorationHlslSemanticGOOGLE = 5635, SpvDecorationMax = 0x7fffffff, } SpvDecoration; @@ -979,6 +981,7 @@ SpvOpNamedBarrierInitialize = 328, SpvOpMemoryNamedBarrier = 329, SpvOpModuleProcessed = 330, + SpvOpDecorateId = 332, SpvOpSubgroupBallotKHR = 4421, SpvOpSubgroupFirstInvocationKHR = 4422, SpvOpSubgroupAllKHR = 4428, @@ -1003,6 +1006,8 @@ SpvOpSubgroupBlockWriteINTEL = 5576, SpvOpSubgroupImageBlockReadINTEL = 5577, SpvOpSubgroupImageBlockWriteINTEL = 5578, + SpvOpDecorateStringGOOGLE = 5632, + SpvOpMemberDecorateStringGOOGLE = 5633, SpvOpMax = 0x7fffffff, } SpvOp; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.hpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.hpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.hpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.hpp 2018-04-27 11:46:33.000000000 +0000 @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2017 The Khronos Group Inc. +// Copyright (c) 2014-2018 The Khronos Group Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), @@ -388,6 +388,8 @@ DecorationPassthroughNV = 5250, DecorationViewportRelativeNV = 5252, DecorationSecondaryViewportRelativeNV = 5256, + DecorationHlslCounterBufferGOOGLE = 5634, + DecorationHlslSemanticGOOGLE = 5635, DecorationMax = 0x7fffffff, }; @@ -975,6 +977,7 @@ OpNamedBarrierInitialize = 328, OpMemoryNamedBarrier = 329, OpModuleProcessed = 330, + OpDecorateId = 332, OpSubgroupBallotKHR = 4421, OpSubgroupFirstInvocationKHR = 4422, OpSubgroupAllKHR = 4428, @@ -999,6 +1002,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, OpMax = 0x7fffffff, }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.hpp11 vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.hpp11 --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.hpp11 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.hpp11 2018-04-27 11:46:33.000000000 +0000 @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2017 The Khronos Group Inc. +// Copyright (c) 2014-2018 The Khronos Group Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), @@ -388,6 +388,8 @@ PassthroughNV = 5250, ViewportRelativeNV = 5252, SecondaryViewportRelativeNV = 5256, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, Max = 0x7fffffff, }; @@ -975,6 +977,7 @@ OpNamedBarrierInitialize = 328, OpMemoryNamedBarrier = 329, OpModuleProcessed = 330, + OpDecorateId = 332, OpSubgroupBallotKHR = 4421, OpSubgroupFirstInvocationKHR = 4422, OpSubgroupAllKHR = 4428, @@ -999,6 +1002,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, Max = 0x7fffffff, }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.json vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.json --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.json 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.json 2018-04-27 11:46:33.000000000 +0000 @@ -6,7 +6,7 @@ "Comment": [ [ - "Copyright (c) 2014-2017 The Khronos Group Inc.", + "Copyright (c) 2014-2018 The Khronos Group Inc.", "", "Permission is hereby granted, free of charge, to any person obtaining a copy", "of this software and/or associated documentation files (the \"Materials\"),", @@ -427,7 +427,9 @@ "OverrideCoverageNV": 5248, "PassthroughNV": 5250, "ViewportRelativeNV": 5252, - "SecondaryViewportRelativeNV": 5256 + "SecondaryViewportRelativeNV": 5256, + "HlslCounterBufferGOOGLE": 5634, + "HlslSemanticGOOGLE": 5635 } }, { @@ -1003,6 +1005,7 @@ "OpNamedBarrierInitialize": 328, "OpMemoryNamedBarrier": 329, "OpModuleProcessed": 330, + "OpDecorateId": 332, "OpSubgroupBallotKHR": 4421, "OpSubgroupFirstInvocationKHR": 4422, "OpSubgroupAllKHR": 4428, @@ -1026,7 +1029,9 @@ "OpSubgroupBlockReadINTEL": 5575, "OpSubgroupBlockWriteINTEL": 5576, "OpSubgroupImageBlockReadINTEL": 5577, - "OpSubgroupImageBlockWriteINTEL": 5578 + "OpSubgroupImageBlockWriteINTEL": 5578, + "OpDecorateStringGOOGLE": 5632, + "OpMemberDecorateStringGOOGLE": 5633 } } ] diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.lua vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.lua --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.lua 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.lua 2018-04-27 11:46:33.000000000 +0000 @@ -1,4 +1,4 @@ --- Copyright (c) 2014-2017 The Khronos Group Inc. +-- Copyright (c) 2014-2018 The Khronos Group Inc. -- -- Permission is hereby granted, free of charge, to any person obtaining a copy -- of this software and/or associated documentation files (the "Materials"), @@ -361,6 +361,8 @@ PassthroughNV = 5250, ViewportRelativeNV = 5252, SecondaryViewportRelativeNV = 5256, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, }, BuiltIn = { @@ -936,6 +938,7 @@ OpNamedBarrierInitialize = 328, OpMemoryNamedBarrier = 329, OpModuleProcessed = 330, + OpDecorateId = 332, OpSubgroupBallotKHR = 4421, OpSubgroupFirstInvocationKHR = 4422, OpSubgroupAllKHR = 4428, @@ -960,6 +963,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, }, } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.py vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.py --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.py 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.1/spirv.py 2018-04-27 11:46:33.000000000 +0000 @@ -1,4 +1,4 @@ -# Copyright (c) 2014-2017 The Khronos Group Inc. +# Copyright (c) 2014-2018 The Khronos Group Inc. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and/or associated documentation files (the "Materials"), @@ -361,6 +361,8 @@ 'PassthroughNV' : 5250, 'ViewportRelativeNV' : 5252, 'SecondaryViewportRelativeNV' : 5256, + 'HlslCounterBufferGOOGLE' : 5634, + 'HlslSemanticGOOGLE' : 5635, }, 'BuiltIn' : { @@ -936,6 +938,7 @@ 'OpNamedBarrierInitialize' : 328, 'OpMemoryNamedBarrier' : 329, 'OpModuleProcessed' : 330, + 'OpDecorateId' : 332, 'OpSubgroupBallotKHR' : 4421, 'OpSubgroupFirstInvocationKHR' : 4422, 'OpSubgroupAllKHR' : 4428, @@ -960,6 +963,8 @@ 'OpSubgroupBlockWriteINTEL' : 5576, 'OpSubgroupImageBlockReadINTEL' : 5577, 'OpSubgroupImageBlockWriteINTEL' : 5578, + 'OpDecorateStringGOOGLE' : 5632, + 'OpMemberDecorateStringGOOGLE' : 5633, }, } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.core.grammar.json vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.core.grammar.json --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.core.grammar.json 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.core.grammar.json 2018-04-27 11:46:33.000000000 +0000 @@ -3395,6 +3395,25 @@ { "kind" : "IdRef", "name" : "'Data'" } ], "capabilities" : [ "SubgroupImageBlockIOINTEL" ] + }, + { + "opname" : "OpDecorateStringGOOGLE", + "opcode" : 5632, + "operands" : [ + { "kind" : "IdRef", "name" : "'Target'" }, + { "kind" : "Decoration" } + ], + "extensions" : [ "SPV_GOOGLE_decorate_string" ] + }, + { + "opname" : "OpMemberDecorateStringGOOGLE", + "opcode" : 5633, + "operands" : [ + { "kind" : "IdRef", "name" : "'Struct Type'" }, + { "kind" : "LiteralInteger", "name" : "'Member'" }, + { "kind" : "Decoration" } + ], + "extensions" : [ "SPV_GOOGLE_decorate_string" ] } ], "operand_kinds" : [ @@ -5041,6 +5060,22 @@ "parameters" : [ { "kind" : "LiteralInteger", "name" : "'Offset'" } ] + }, + { + "enumerant" : "HlslCounterBufferGOOGLE", + "value" : 5634, + "parameters" : [ + { "kind" : "IdRef", "name" : "'Counter Buffer'" } + ], + "extensions" : [ "SPV_GOOGLE_hlsl_functionality1" ] + }, + { + "enumerant" : "HlslSemanticGOOGLE", + "value" : 5635, + "parameters" : [ + { "kind" : "LiteralString", "name" : "'Semantic'" } + ], + "extensions" : [ "SPV_GOOGLE_hlsl_functionality1" ] } ] }, @@ -5210,7 +5245,7 @@ { "enumerant" : "SubgroupSize", "value" : 36, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "SubgroupBallotKHR" ] }, { "enumerant" : "SubgroupMaxSize", @@ -5235,7 +5270,7 @@ { "enumerant" : "SubgroupLocalInvocationId", "value" : 41, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "SubgroupBallotKHR" ] }, { "enumerant" : "VertexIndex", diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.h 2018-04-27 11:46:33.000000000 +0000 @@ -1,5 +1,5 @@ /* -** Copyright (c) 2014-2017 The Khronos Group Inc. +** Copyright (c) 2014-2018 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a copy ** of this software and/or associated documentation files (the "Materials"), @@ -397,6 +397,8 @@ SpvDecorationPassthroughNV = 5250, SpvDecorationViewportRelativeNV = 5252, SpvDecorationSecondaryViewportRelativeNV = 5256, + SpvDecorationHlslCounterBufferGOOGLE = 5634, + SpvDecorationHlslSemanticGOOGLE = 5635, SpvDecorationMax = 0x7fffffff, } SpvDecoration; @@ -1010,6 +1012,8 @@ SpvOpSubgroupBlockWriteINTEL = 5576, SpvOpSubgroupImageBlockReadINTEL = 5577, SpvOpSubgroupImageBlockWriteINTEL = 5578, + SpvOpDecorateStringGOOGLE = 5632, + SpvOpMemberDecorateStringGOOGLE = 5633, SpvOpMax = 0x7fffffff, } SpvOp; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.hpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.hpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.hpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.hpp 2018-04-27 11:46:33.000000000 +0000 @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2017 The Khronos Group Inc. +// Copyright (c) 2014-2018 The Khronos Group Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), @@ -393,6 +393,8 @@ DecorationPassthroughNV = 5250, DecorationViewportRelativeNV = 5252, DecorationSecondaryViewportRelativeNV = 5256, + DecorationHlslCounterBufferGOOGLE = 5634, + DecorationHlslSemanticGOOGLE = 5635, DecorationMax = 0x7fffffff, }; @@ -1006,6 +1008,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, OpMax = 0x7fffffff, }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.hpp11 vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.hpp11 --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.hpp11 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.hpp11 2018-04-27 11:46:33.000000000 +0000 @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2017 The Khronos Group Inc. +// Copyright (c) 2014-2018 The Khronos Group Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), @@ -393,6 +393,8 @@ PassthroughNV = 5250, ViewportRelativeNV = 5252, SecondaryViewportRelativeNV = 5256, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, Max = 0x7fffffff, }; @@ -1006,6 +1008,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, Max = 0x7fffffff, }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.json vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.json --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.json 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.json 2018-04-27 11:46:33.000000000 +0000 @@ -6,7 +6,7 @@ "Comment": [ [ - "Copyright (c) 2014-2017 The Khronos Group Inc.", + "Copyright (c) 2014-2018 The Khronos Group Inc.", "", "Permission is hereby granted, free of charge, to any person obtaining a copy", "of this software and/or associated documentation files (the \"Materials\"),", @@ -432,7 +432,9 @@ "OverrideCoverageNV": 5248, "PassthroughNV": 5250, "ViewportRelativeNV": 5252, - "SecondaryViewportRelativeNV": 5256 + "SecondaryViewportRelativeNV": 5256, + "HlslCounterBufferGOOGLE": 5634, + "HlslSemanticGOOGLE": 5635 } }, { @@ -1033,7 +1035,9 @@ "OpSubgroupBlockReadINTEL": 5575, "OpSubgroupBlockWriteINTEL": 5576, "OpSubgroupImageBlockReadINTEL": 5577, - "OpSubgroupImageBlockWriteINTEL": 5578 + "OpSubgroupImageBlockWriteINTEL": 5578, + "OpDecorateStringGOOGLE": 5632, + "OpMemberDecorateStringGOOGLE": 5633 } } ] diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.lua vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.lua --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.lua 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.lua 2018-04-27 11:46:33.000000000 +0000 @@ -1,4 +1,4 @@ --- Copyright (c) 2014-2017 The Khronos Group Inc. +-- Copyright (c) 2014-2018 The Khronos Group Inc. -- -- Permission is hereby granted, free of charge, to any person obtaining a copy -- of this software and/or associated documentation files (the "Materials"), @@ -366,6 +366,8 @@ PassthroughNV = 5250, ViewportRelativeNV = 5252, SecondaryViewportRelativeNV = 5256, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, }, BuiltIn = { @@ -967,6 +969,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, }, } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.py vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.py --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.py 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/1.2/spirv.py 2018-04-27 11:46:33.000000000 +0000 @@ -1,4 +1,4 @@ -# Copyright (c) 2014-2017 The Khronos Group Inc. +# Copyright (c) 2014-2018 The Khronos Group Inc. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and/or associated documentation files (the "Materials"), @@ -366,6 +366,8 @@ 'PassthroughNV' : 5250, 'ViewportRelativeNV' : 5252, 'SecondaryViewportRelativeNV' : 5256, + 'HlslCounterBufferGOOGLE' : 5634, + 'HlslSemanticGOOGLE' : 5635, }, 'BuiltIn' : { @@ -967,6 +969,8 @@ 'OpSubgroupBlockWriteINTEL' : 5576, 'OpSubgroupImageBlockReadINTEL' : 5577, 'OpSubgroupImageBlockWriteINTEL' : 5578, + 'OpDecorateStringGOOGLE' : 5632, + 'OpMemberDecorateStringGOOGLE' : 5633, }, } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/spir-v.xml vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/spir-v.xml --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/spir-v.xml 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/spir-v.xml 2018-04-27 11:46:33.000000000 +0000 @@ -104,6 +104,7 @@ + - + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.core.grammar.json vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.core.grammar.json --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.core.grammar.json 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.core.grammar.json 2018-04-27 11:46:33.000000000 +0000 @@ -26,8 +26,8 @@ ], "magic_number" : "0x07230203", "major_version" : 1, - "minor_version" : 2, - "revision" : 3, + "minor_version" : 3, + "revision" : 1, "instructions" : [ { "opname" : "OpNop", @@ -3144,9 +3144,458 @@ { "kind" : "IdRef", "name" : "'Target'" }, { "kind" : "Decoration" } ], + "extensions" : [ "SPV_GOOGLE_hlsl_functionality1" ], "version" : "1.2" }, { + "opname" : "OpGroupNonUniformElect", + "opcode" : 333, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" } + ], + "capabilities" : [ "GroupNonUniform" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformAll", + "opcode" : 334, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Predicate'" } + ], + "capabilities" : [ "GroupNonUniformVote" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformAny", + "opcode" : 335, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Predicate'" } + ], + "capabilities" : [ "GroupNonUniformVote" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformAllEqual", + "opcode" : 336, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" } + ], + "capabilities" : [ "GroupNonUniformVote" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformBroadcast", + "opcode" : 337, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'Id'" } + ], + "capabilities" : [ "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformBroadcastFirst", + "opcode" : 338, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" } + ], + "capabilities" : [ "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformBallot", + "opcode" : 339, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Predicate'" } + ], + "capabilities" : [ "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformInverseBallot", + "opcode" : 340, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" } + ], + "capabilities" : [ "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformBallotBitExtract", + "opcode" : 341, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'Index'" } + ], + "capabilities" : [ "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformBallotBitCount", + "opcode" : 342, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" } + ], + "capabilities" : [ "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformBallotFindLSB", + "opcode" : 343, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" } + ], + "capabilities" : [ "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformBallotFindMSB", + "opcode" : 344, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" } + ], + "capabilities" : [ "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformShuffle", + "opcode" : 345, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'Id'" } + ], + "capabilities" : [ "GroupNonUniformShuffle" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformShuffleXor", + "opcode" : 346, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'Mask'" } + ], + "capabilities" : [ "GroupNonUniformShuffle" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformShuffleUp", + "opcode" : 347, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'Delta'" } + ], + "capabilities" : [ "GroupNonUniformShuffleRelative" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformShuffleDown", + "opcode" : 348, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'Delta'" } + ], + "capabilities" : [ "GroupNonUniformShuffleRelative" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformIAdd", + "opcode" : 349, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformFAdd", + "opcode" : 350, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformIMul", + "opcode" : 351, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformFMul", + "opcode" : 352, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformSMin", + "opcode" : 353, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformUMin", + "opcode" : 354, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformFMin", + "opcode" : 355, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformSMax", + "opcode" : 356, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformUMax", + "opcode" : 357, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformFMax", + "opcode" : 358, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformBitwiseAnd", + "opcode" : 359, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformBitwiseOr", + "opcode" : 360, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformBitwiseXor", + "opcode" : 361, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformLogicalAnd", + "opcode" : 362, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformLogicalOr", + "opcode" : 363, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformLogicalXor", + "opcode" : 364, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "GroupOperation", "name" : "'Operation'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'ClusterSize'", "quantifier" : "?" } + ], + "capabilities" : [ "GroupNonUniformArithmetic", "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformQuadBroadcast", + "opcode" : 365, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'Index'" } + ], + "capabilities" : [ "GroupNonUniformQuad" ], + "version" : "1.3" + }, + { + "opname" : "OpGroupNonUniformQuadSwap", + "opcode" : 366, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdScope", "name" : "'Execution'" }, + { "kind" : "IdRef", "name" : "'Value'" }, + { "kind" : "IdRef", "name" : "'Direction'" } + ], + "capabilities" : [ "GroupNonUniformQuad" ], + "version" : "1.3" + }, + { "opname" : "OpSubgroupBallotKHR", "opcode" : 4421, "operands" : [ @@ -3154,7 +3603,9 @@ { "kind" : "IdResult" }, { "kind" : "IdRef", "name" : "'Predicate'" } ], - "capabilities" : [ "SubgroupBallotKHR" ] + "capabilities" : [ "SubgroupBallotKHR" ], + "extensions" : [ "SPV_KHR_shader_ballot" ], + "version" : "None" }, { "opname" : "OpSubgroupFirstInvocationKHR", @@ -3164,7 +3615,9 @@ { "kind" : "IdResult" }, { "kind" : "IdRef", "name" : "'Value'" } ], - "capabilities" : [ "SubgroupBallotKHR" ] + "capabilities" : [ "SubgroupBallotKHR" ], + "extensions" : [ "SPV_KHR_shader_ballot" ], + "version" : "None" }, { "opname" : "OpSubgroupAllKHR", @@ -3174,7 +3627,11 @@ { "kind" : "IdResult" }, { "kind" : "IdRef", "name" : "'Predicate'" } ], - "capabilities" : [ "SubgroupVoteKHR" ] + "extensions" : [ + "SPV_KHR_subgroup_vote" + ], + "capabilities" : [ "SubgroupVoteKHR" ], + "version" : "None" }, { "opname" : "OpSubgroupAnyKHR", @@ -3184,7 +3641,11 @@ { "kind" : "IdResult" }, { "kind" : "IdRef", "name" : "'Predicate'" } ], - "capabilities" : [ "SubgroupVoteKHR" ] + "extensions" : [ + "SPV_KHR_subgroup_vote" + ], + "capabilities" : [ "SubgroupVoteKHR" ], + "version" : "None" }, { "opname" : "OpSubgroupAllEqualKHR", @@ -3194,7 +3655,11 @@ { "kind" : "IdResult" }, { "kind" : "IdRef", "name" : "'Predicate'" } ], - "capabilities" : [ "SubgroupVoteKHR" ] + "extensions" : [ + "SPV_KHR_subgroup_vote" + ], + "capabilities" : [ "SubgroupVoteKHR" ], + "version" : "None" }, { "opname" : "OpSubgroupReadInvocationKHR", @@ -3206,6 +3671,7 @@ { "kind" : "IdRef", "name" : "'Index'" } ], "capabilities" : [ "SubgroupBallotKHR" ], + "extensions" : [ "SPV_KHR_shader_ballot" ], "version" : "None" }, { @@ -3219,6 +3685,7 @@ { "kind" : "IdRef", "name" : "'X'" } ], "capabilities" : [ "Groups" ], + "extensions" : [ "SPV_AMD_shader_ballot" ], "version" : "None" }, { @@ -3232,6 +3699,7 @@ { "kind" : "IdRef", "name" : "'X'" } ], "capabilities" : [ "Groups" ], + "extensions" : [ "SPV_AMD_shader_ballot" ], "version" : "None" }, { @@ -3245,6 +3713,7 @@ { "kind" : "IdRef", "name" : "'X'" } ], "capabilities" : [ "Groups" ], + "extensions" : [ "SPV_AMD_shader_ballot" ], "version" : "None" }, { @@ -3258,6 +3727,7 @@ { "kind" : "IdRef", "name" : "'X'" } ], "capabilities" : [ "Groups" ], + "extensions" : [ "SPV_AMD_shader_ballot" ], "version" : "None" }, { @@ -3271,6 +3741,7 @@ { "kind" : "IdRef", "name" : "'X'" } ], "capabilities" : [ "Groups" ], + "extensions" : [ "SPV_AMD_shader_ballot" ], "version" : "None" }, { @@ -3284,6 +3755,7 @@ { "kind" : "IdRef", "name" : "'X'" } ], "capabilities" : [ "Groups" ], + "extensions" : [ "SPV_AMD_shader_ballot" ], "version" : "None" }, { @@ -3297,6 +3769,7 @@ { "kind" : "IdRef", "name" : "'X'" } ], "capabilities" : [ "Groups" ], + "extensions" : [ "SPV_AMD_shader_ballot" ], "version" : "None" }, { @@ -3310,6 +3783,7 @@ { "kind" : "IdRef", "name" : "'X'" } ], "capabilities" : [ "Groups" ], + "extensions" : [ "SPV_AMD_shader_ballot" ], "version" : "None" }, { @@ -3322,6 +3796,7 @@ { "kind" : "IdRef", "name" : "'Coordinate'" } ], "capabilities" : [ "FragmentMaskAMD" ], + "extensions" : [ "SPV_AMD_shader_fragment_mask" ], "version" : "None" }, { @@ -3335,6 +3810,7 @@ { "kind" : "IdRef", "name" : "'Fragment Index'" } ], "capabilities" : [ "FragmentMaskAMD" ], + "extensions" : [ "SPV_AMD_shader_fragment_mask" ], "version" : "None" }, { @@ -3430,6 +3906,39 @@ ], "capabilities" : [ "SubgroupImageBlockIOINTEL" ], "version" : "None" + }, + { + "opname" : "OpDecorateStringGOOGLE", + "opcode" : 5632, + "operands" : [ + { "kind" : "IdRef", "name" : "'Target'" }, + { "kind" : "Decoration" } + ], + "extensions" : [ "SPV_GOOGLE_decorate_string" ], + "version" : "None" + }, + { + "opname" : "OpMemberDecorateStringGOOGLE", + "opcode" : 5633, + "operands" : [ + { "kind" : "IdRef", "name" : "'Struct Type'" }, + { "kind" : "LiteralInteger", "name" : "'Member'" }, + { "kind" : "Decoration" } + ], + "extensions" : [ "SPV_GOOGLE_decorate_string" ], + "version" : "None" + }, + { + "opname" : "OpGroupNonUniformPartitionNV", + "opcode" : 5296, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdRef", "name" : "'Value'" } + ], + "capabilities" : [ "GroupNonUniformPartitionedNV" ], + "extensions" : [ "SPV_NV_shader_subgroup_partitioned" ], + "version" : "None" } ], "operand_kinds" : [ @@ -4060,12 +4569,14 @@ "enumerant" : "PostDepthCoverage", "value" : 4446, "capabilities" : [ "SampleMaskPostDepthCoverage" ], + "extensions" : [ "SPV_KHR_post_depth_coverage" ], "version" : "None" }, { "enumerant" : "StencilRefReplacingEXT", "value" : 5027, "capabilities" : [ "StencilExportEXT" ], + "extensions" : [ "SPV_EXT_shader_stencil_export" ], "version" : "None" } ] @@ -4136,7 +4647,7 @@ "SPV_KHR_variable_pointers" ], "capabilities" : [ "Shader" ], - "version" : "None" + "version" : "1.3" } ] }, @@ -5032,6 +5543,7 @@ { "enumerant" : "ExplicitInterpAMD", "value" : 4999, + "extensions" : [ "SPV_AMD_shader_explicit_vertex_parameter" ], "version" : "None" }, { @@ -5060,6 +5572,29 @@ "parameters" : [ { "kind" : "LiteralInteger", "name" : "'Offset'" } ] + }, + { + "enumerant" : "NonUniformEXT", + "value" : 5300, + "capabilities" : [ "ShaderNonUniformEXT" ] + }, + { + "enumerant" : "HlslCounterBufferGOOGLE", + "value" : 5634, + "parameters" : [ + { "kind" : "IdRef", "name" : "'Counter Buffer'" } + ], + "extensions" : [ "SPV_GOOGLE_hlsl_functionality1" ], + "version" : "None" + }, + { + "enumerant" : "HlslSemanticGOOGLE", + "value" : 5635, + "parameters" : [ + { "kind" : "LiteralString", "name" : "'Semantic'" } + ], + "extensions" : [ "SPV_GOOGLE_hlsl_functionality1" ], + "version" : "None" } ] }, @@ -5229,7 +5764,7 @@ { "enumerant" : "SubgroupSize", "value" : 36, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "GroupNonUniform", "SubgroupBallotKHR" ] }, { "enumerant" : "SubgroupMaxSize", @@ -5239,7 +5774,7 @@ { "enumerant" : "NumSubgroups", "value" : 38, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "GroupNonUniform" ] }, { "enumerant" : "NumEnqueuedSubgroups", @@ -5249,12 +5784,12 @@ { "enumerant" : "SubgroupId", "value" : 40, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "GroupNonUniform" ] }, { "enumerant" : "SubgroupLocalInvocationId", "value" : 41, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "GroupNonUniform", "SubgroupBallotKHR" ] }, { "enumerant" : "VertexIndex", @@ -5267,104 +5802,152 @@ "capabilities" : [ "Shader" ] }, { + "enumerant" : "SubgroupEqMask", + "value" : 4416, + "capabilities" : [ "SubgroupBallotKHR", "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { + "enumerant" : "SubgroupGeMask", + "value" : 4417, + "capabilities" : [ "SubgroupBallotKHR", "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { + "enumerant" : "SubgroupGtMask", + "value" : 4418, + "capabilities" : [ "SubgroupBallotKHR", "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { + "enumerant" : "SubgroupLeMask", + "value" : 4419, + "capabilities" : [ "SubgroupBallotKHR", "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { + "enumerant" : "SubgroupLtMask", + "value" : 4420, + "capabilities" : [ "SubgroupBallotKHR", "GroupNonUniformBallot" ], + "version" : "1.3" + }, + { "enumerant" : "SubgroupEqMaskKHR", "value" : 4416, - "capabilities" : [ "SubgroupBallotKHR" ], - "version" : "None" + "capabilities" : [ "SubgroupBallotKHR", "GroupNonUniformBallot" ], + "extensions" : [ "SPV_KHR_shader_ballot" ], + "version" : "1.3" }, { "enumerant" : "SubgroupGeMaskKHR", "value" : 4417, - "capabilities" : [ "SubgroupBallotKHR" ], - "version" : "None" + "capabilities" : [ "SubgroupBallotKHR", "GroupNonUniformBallot" ], + "extensions" : [ "SPV_KHR_shader_ballot" ], + "version" : "1.3" }, { "enumerant" : "SubgroupGtMaskKHR", "value" : 4418, - "capabilities" : [ "SubgroupBallotKHR" ], - "version" : "None" + "capabilities" : [ "SubgroupBallotKHR", "GroupNonUniformBallot" ], + "extensions" : [ "SPV_KHR_shader_ballot" ], + "version" : "1.3" }, { "enumerant" : "SubgroupLeMaskKHR", "value" : 4419, - "capabilities" : [ "SubgroupBallotKHR" ], - "version" : "None" + "capabilities" : [ "SubgroupBallotKHR", "GroupNonUniformBallot" ], + "extensions" : [ "SPV_KHR_shader_ballot" ], + "version" : "1.3" }, { "enumerant" : "SubgroupLtMaskKHR", "value" : 4420, - "capabilities" : [ "SubgroupBallotKHR" ], - "version" : "None" + "capabilities" : [ "SubgroupBallotKHR", "GroupNonUniformBallot" ], + "extensions" : [ "SPV_KHR_shader_ballot" ], + "version" : "1.3" }, { "enumerant" : "BaseVertex", "value" : 4424, "capabilities" : [ "DrawParameters" ], - "version" : "None" + "extensions" : [ "SPV_KHR_shader_draw_parameters" ], + "version" : "1.3" }, { "enumerant" : "BaseInstance", "value" : 4425, "capabilities" : [ "DrawParameters" ], - "version" : "None" + "extensions" : [ "SPV_KHR_shader_draw_parameters" ], + "version" : "1.3" }, { "enumerant" : "DrawIndex", "value" : 4426, "capabilities" : [ "DrawParameters" ], - "version" : "None" + "extensions" : [ "SPV_KHR_shader_draw_parameters" ], + "version" : "1.3" }, { "enumerant" : "DeviceIndex", "value" : 4438, "capabilities" : [ "DeviceGroup" ], - "version" : "None" + "extensions" : [ "SPV_KHR_device_group" ], + "version" : "1.3" }, { "enumerant" : "ViewIndex", "value" : 4440, "capabilities" : [ "MultiView" ], - "version" : "None" + "extensions" : [ "SPV_KHR_multiview" ], + "version" : "1.3" }, { "enumerant" : "BaryCoordNoPerspAMD", "value" : 4992, + "extensions" : [ "SPV_AMD_shader_explicit_vertex_parameter" ], "version" : "None" }, { "enumerant" : "BaryCoordNoPerspCentroidAMD", "value" : 4993, + "extensions" : [ "SPV_AMD_shader_explicit_vertex_parameter" ], "version" : "None" }, { "enumerant" : "BaryCoordNoPerspSampleAMD", "value" : 4994, + "extensions" : [ "SPV_AMD_shader_explicit_vertex_parameter" ], "version" : "None" }, { "enumerant" : "BaryCoordSmoothAMD", "value" : 4995, + "extensions" : [ "SPV_AMD_shader_explicit_vertex_parameter" ], "version" : "None" }, { "enumerant" : "BaryCoordSmoothCentroidAMD", "value" : 4996, + "extensions" : [ "SPV_AMD_shader_explicit_vertex_parameter" ], "version" : "None" }, { "enumerant" : "BaryCoordSmoothSampleAMD", "value" : 4997, + "extensions" : [ "SPV_AMD_shader_explicit_vertex_parameter" ], "version" : "None" }, { "enumerant" : "BaryCoordPullModelAMD", "value" : 4998, + "extensions" : [ "SPV_AMD_shader_explicit_vertex_parameter" ], "version" : "None" }, { "enumerant" : "FragStencilRefEXT", "value" : 5014, "capabilities" : [ "StencilExportEXT" ], + "extensions" : [ "SPV_EXT_shader_stencil_export" ], "version" : "None" }, { @@ -5401,6 +5984,7 @@ "enumerant" : "FullyCoveredEXT", "value" : 5264, "capabilities" : [ "FragmentFullyCoveredEXT" ], + "extensions" : [ "SPV_EXT_fragment_fully_covered" ], "version" : "None" } ] @@ -5438,17 +6022,38 @@ { "enumerant" : "Reduce", "value" : 0, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "GroupNonUniformArithmetic", "GroupNonUniformBallot" ] }, { "enumerant" : "InclusiveScan", "value" : 1, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "GroupNonUniformArithmetic", "GroupNonUniformBallot" ] }, { "enumerant" : "ExclusiveScan", "value" : 2, - "capabilities" : [ "Kernel" ] + "capabilities" : [ "Kernel", "GroupNonUniformArithmetic", "GroupNonUniformBallot" ] + }, + { + "enumerant" : "ClusteredReduce", + "value" : 3, + "capabilities" : [ "GroupNonUniformClustered" ], + "version" : "1.3" + }, + { + "enumerant" : "PartitionedReduceNV", + "value" : 6, + "capabilities" : [ "GroupNonUniformPartitionedNV" ] + }, + { + "enumerant" : "PartitionedInclusiveScanNV", + "value" : 7, + "capabilities" : [ "GroupNonUniformPartitionedNV" ] + }, + { + "enumerant" : "PartitionedExclusiveScanNV", + "value" : 8, + "capabilities" : [ "GroupNonUniformPartitionedNV" ] } ] }, @@ -5765,6 +6370,53 @@ "version" : "1.1" }, { + "enumerant" : "GroupNonUniform", + "value" : 61, + "version" : "1.3" + }, + { + "enumerant" : "GroupNonUniformVote", + "value" : 62, + "capabilities" : [ "GroupNonUniform" ], + "version" : "1.3" + }, + { + "enumerant" : "GroupNonUniformArithmetic", + "value" : 63, + "capabilities" : [ "GroupNonUniform" ], + "version" : "1.3" + }, + { + "enumerant" : "GroupNonUniformBallot", + "value" : 64, + "capabilities" : [ "GroupNonUniform" ], + "version" : "1.3" + }, + { + "enumerant" : "GroupNonUniformShuffle", + "value" : 65, + "capabilities" : [ "GroupNonUniform" ], + "version" : "1.3" + }, + { + "enumerant" : "GroupNonUniformShuffleRelative", + "value" : 66, + "capabilities" : [ "GroupNonUniform" ], + "version" : "1.3" + }, + { + "enumerant" : "GroupNonUniformClustered", + "value" : 67, + "capabilities" : [ "GroupNonUniform" ], + "version" : "1.3" + }, + { + "enumerant" : "GroupNonUniformQuad", + "value" : 68, + "capabilities" : [ "GroupNonUniform" ], + "version" : "1.3" + }, + { "enumerant" : "SubgroupBallotKHR", "value" : 4423, "extensions" : [ "SPV_KHR_shader_ballot" ], @@ -5775,7 +6427,7 @@ "value" : 4427, "capabilities" : [ "Shader" ], "extensions" : [ "SPV_KHR_shader_draw_parameters" ], - "version" : "None" + "version" : "1.3" }, { "enumerant" : "SubgroupVoteKHR", @@ -5787,13 +6439,13 @@ "enumerant" : "StorageBuffer16BitAccess", "value" : 4433, "extensions" : [ "SPV_KHR_16bit_storage" ], - "version" : "None" + "version" : "1.3" }, { "enumerant" : "StorageUniformBufferBlock16", "value" : 4433, "extensions" : [ "SPV_KHR_16bit_storage" ], - "version" : "None" + "version" : "1.3" }, { "enumerant" : "UniformAndStorageBuffer16BitAccess", @@ -5803,7 +6455,7 @@ "StorageUniformBufferBlock16" ], "extensions" : [ "SPV_KHR_16bit_storage" ], - "version" : "None" + "version" : "1.3" }, { "enumerant" : "StorageUniform16", @@ -5813,45 +6465,46 @@ "StorageUniformBufferBlock16" ], "extensions" : [ "SPV_KHR_16bit_storage" ], - "version" : "None" + "version" : "1.3" }, { "enumerant" : "StoragePushConstant16", "value" : 4435, "extensions" : [ "SPV_KHR_16bit_storage" ], - "version" : "None" + "version" : "1.3" }, { "enumerant" : "StorageInputOutput16", "value" : 4436, "extensions" : [ "SPV_KHR_16bit_storage" ], - "version" : "None" + "version" : "1.3" }, { "enumerant" : "DeviceGroup", "value" : 4437, - "version" : "None" + "extensions" : [ "SPV_KHR_device_group" ], + "version" : "1.3" }, { "enumerant" : "MultiView", "value" : 4439, "capabilities" : [ "Shader" ], "extensions" : [ "SPV_KHR_multiview" ], - "version" : "None" + "version" : "1.3" }, { "enumerant" : "VariablePointersStorageBuffer", "value" : 4441, "capabilities" : [ "Shader" ], "extensions" : [ "SPV_KHR_variable_pointers" ], - "version" : "None" + "version" : "1.3" }, { "enumerant" : "VariablePointers", "value" : 4442, "capabilities" : [ "VariablePointersStorageBuffer" ], "extensions" : [ "SPV_KHR_variable_pointers" ], - "version" : "None" + "version" : "1.3" }, { "enumerant" : "AtomicStorageOps", @@ -5866,6 +6519,13 @@ "version" : "None" }, { + "enumerant" : "Float16ImageAMD", + "value" : 5008, + "capabilities" : [ "Shader" ], + "extensions" : [ "SPV_AMD_gpu_shader_half_float_fetch" ], + "version" : "None" + }, + { "enumerant" : "ImageGatherBiasLodAMD", "value" : 5009, "capabilities" : [ "Shader" ], @@ -5950,6 +6610,90 @@ "version" : "None" }, { + "enumerant" : "ShaderNonUniformEXT", + "value" : 5301, + "capabilities" : [ "Shader" ], + "extensions" : [ "SPV_EXT_descriptor_indexing" ], + "version" : "None" + }, + { + "enumerant" : "RuntimeDescriptorArrayEXT", + "value" : 5302, + "capabilities" : [ "Shader" ], + "extensions" : [ "SPV_EXT_descriptor_indexing" ], + "version" : "None" + }, + { + "enumerant" : "InputAttachmentArrayDynamicIndexingEXT", + "value" : 5303, + "capabilities" : [ "InputAttachment" ], + "extensions" : [ "SPV_EXT_descriptor_indexing" ], + "version" : "None" + }, + { + "enumerant" : "UniformTexelBufferArrayDynamicIndexingEXT", + "value" : 5304, + "capabilities" : [ "SampledBuffer" ], + "extensions" : [ "SPV_EXT_descriptor_indexing" ], + "version" : "None" + }, + { + "enumerant" : "StorageTexelBufferArrayDynamicIndexingEXT", + "value" : 5305, + "capabilities" : [ "ImageBuffer" ], + "extensions" : [ "SPV_EXT_descriptor_indexing" ], + "version" : "None" + }, + { + "enumerant" : "UniformBufferArrayNonUniformIndexingEXT", + "value" : 5306, + "capabilities" : [ "ShaderNonUniformEXT" ], + "extensions" : [ "SPV_EXT_descriptor_indexing" ], + "version" : "None" + }, + { + "enumerant" : "SampledImageArrayNonUniformIndexingEXT", + "value" : 5307, + "capabilities" : [ "ShaderNonUniformEXT" ], + "extensions" : [ "SPV_EXT_descriptor_indexing" ], + "version" : "None" + }, + { + "enumerant" : "StorageBufferArrayNonUniformIndexingEXT", + "value" : 5308, + "capabilities" : [ "ShaderNonUniformEXT" ], + "extensions" : [ "SPV_EXT_descriptor_indexing" ], + "version" : "None" + }, + { + "enumerant" : "StorageImageArrayNonUniformIndexingEXT", + "value" : 5309, + "capabilities" : [ "ShaderNonUniformEXT" ], + "extensions" : [ "SPV_EXT_descriptor_indexing" ], + "version" : "None" + }, + { + "enumerant" : "InputAttachmentArrayNonUniformIndexingEXT", + "value" : 5310, + "capabilities" : [ "InputAttachment", "ShaderNonUniformEXT" ], + "extensions" : [ "SPV_EXT_descriptor_indexing" ], + "version" : "None" + }, + { + "enumerant" : "UniformTexelBufferArrayNonUniformIndexingEXT", + "value" : 5311, + "capabilities" : [ "SampledBuffer", "ShaderNonUniformEXT" ], + "extensions" : [ "SPV_EXT_descriptor_indexing" ], + "version" : "None" + }, + { + "enumerant" : "StorageTexelBufferArrayNonUniformIndexingEXT", + "value" : 5312, + "capabilities" : [ "ImageBuffer", "ShaderNonUniformEXT" ], + "extensions" : [ "SPV_EXT_descriptor_indexing" ], + "version" : "None" + }, + { "enumerant" : "SubgroupShuffleINTEL", "value" : 5568, "extensions" : [ "SPV_INTEL_subgroups" ], @@ -5966,6 +6710,12 @@ "value" : 5570, "extensions" : [ "SPV_INTEL_subgroups" ], "version" : "None" + }, + { + "enumerant" : "GroupNonUniformPartitionedNV", + "value" : 5297, + "extensions" : [ "SPV_NV_shader_subgroup_partitioned" ], + "version" : "None" } ] }, diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.h 2018-04-27 11:46:33.000000000 +0000 @@ -50,12 +50,12 @@ typedef unsigned int SpvId; -#define SPV_VERSION 0x10200 -#define SPV_REVISION 3 +#define SPV_VERSION 0x10300 +#define SPV_REVISION 1 static const unsigned int SpvMagicNumber = 0x07230203; -static const unsigned int SpvVersion = 0x00010200; -static const unsigned int SpvRevision = 3; +static const unsigned int SpvVersion = 0x00010300; +static const unsigned int SpvRevision = 1; static const unsigned int SpvOpCodeMask = 0xffff; static const unsigned int SpvWordCountShift = 16; @@ -397,6 +397,9 @@ SpvDecorationPassthroughNV = 5250, SpvDecorationViewportRelativeNV = 5252, SpvDecorationSecondaryViewportRelativeNV = 5256, + SpvDecorationNonUniformEXT = 5300, + SpvDecorationHlslCounterBufferGOOGLE = 5634, + SpvDecorationHlslSemanticGOOGLE = 5635, SpvDecorationMax = 0x7fffffff, } SpvDecoration; @@ -442,10 +445,15 @@ SpvBuiltInSubgroupLocalInvocationId = 41, SpvBuiltInVertexIndex = 42, SpvBuiltInInstanceIndex = 43, + SpvBuiltInSubgroupEqMask = 4416, SpvBuiltInSubgroupEqMaskKHR = 4416, + SpvBuiltInSubgroupGeMask = 4417, SpvBuiltInSubgroupGeMaskKHR = 4417, + SpvBuiltInSubgroupGtMask = 4418, SpvBuiltInSubgroupGtMaskKHR = 4418, + SpvBuiltInSubgroupLeMask = 4419, SpvBuiltInSubgroupLeMaskKHR = 4419, + SpvBuiltInSubgroupLtMask = 4420, SpvBuiltInSubgroupLtMaskKHR = 4420, SpvBuiltInBaseVertex = 4424, SpvBuiltInBaseInstance = 4425, @@ -568,6 +576,10 @@ SpvGroupOperationReduce = 0, SpvGroupOperationInclusiveScan = 1, SpvGroupOperationExclusiveScan = 2, + SpvGroupOperationClusteredReduce = 3, + SpvGroupOperationPartitionedReduceNV = 6, + SpvGroupOperationPartitionedInclusiveScanNV = 7, + SpvGroupOperationPartitionedExclusiveScanNV = 8, SpvGroupOperationMax = 0x7fffffff, } SpvGroupOperation; @@ -648,6 +660,14 @@ SpvCapabilitySubgroupDispatch = 58, SpvCapabilityNamedBarrier = 59, SpvCapabilityPipeStorage = 60, + SpvCapabilityGroupNonUniform = 61, + SpvCapabilityGroupNonUniformVote = 62, + SpvCapabilityGroupNonUniformArithmetic = 63, + SpvCapabilityGroupNonUniformBallot = 64, + SpvCapabilityGroupNonUniformShuffle = 65, + SpvCapabilityGroupNonUniformShuffleRelative = 66, + SpvCapabilityGroupNonUniformClustered = 67, + SpvCapabilityGroupNonUniformQuad = 68, SpvCapabilitySubgroupBallotKHR = 4423, SpvCapabilityDrawParameters = 4427, SpvCapabilitySubgroupVoteKHR = 4431, @@ -663,6 +683,7 @@ SpvCapabilityVariablePointers = 4442, SpvCapabilityAtomicStorageOps = 4445, SpvCapabilitySampleMaskPostDepthCoverage = 4447, + SpvCapabilityFloat16ImageAMD = 5008, SpvCapabilityImageGatherBiasLodAMD = 5009, SpvCapabilityFragmentMaskAMD = 5010, SpvCapabilityStencilExportEXT = 5013, @@ -675,6 +696,19 @@ SpvCapabilityShaderStereoViewNV = 5259, SpvCapabilityPerViewAttributesNV = 5260, SpvCapabilityFragmentFullyCoveredEXT = 5265, + SpvCapabilityGroupNonUniformPartitionedNV = 5297, + SpvCapabilityShaderNonUniformEXT = 5301, + SpvCapabilityRuntimeDescriptorArrayEXT = 5302, + SpvCapabilityInputAttachmentArrayDynamicIndexingEXT = 5303, + SpvCapabilityUniformTexelBufferArrayDynamicIndexingEXT = 5304, + SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT = 5305, + SpvCapabilityUniformBufferArrayNonUniformIndexingEXT = 5306, + SpvCapabilitySampledImageArrayNonUniformIndexingEXT = 5307, + SpvCapabilityStorageBufferArrayNonUniformIndexingEXT = 5308, + SpvCapabilityStorageImageArrayNonUniformIndexingEXT = 5309, + SpvCapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310, + SpvCapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311, + SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312, SpvCapabilitySubgroupShuffleINTEL = 5568, SpvCapabilitySubgroupBufferBlockIOINTEL = 5569, SpvCapabilitySubgroupImageBlockIOINTEL = 5570, @@ -988,6 +1022,40 @@ SpvOpModuleProcessed = 330, SpvOpExecutionModeId = 331, SpvOpDecorateId = 332, + SpvOpGroupNonUniformElect = 333, + SpvOpGroupNonUniformAll = 334, + SpvOpGroupNonUniformAny = 335, + SpvOpGroupNonUniformAllEqual = 336, + SpvOpGroupNonUniformBroadcast = 337, + SpvOpGroupNonUniformBroadcastFirst = 338, + SpvOpGroupNonUniformBallot = 339, + SpvOpGroupNonUniformInverseBallot = 340, + SpvOpGroupNonUniformBallotBitExtract = 341, + SpvOpGroupNonUniformBallotBitCount = 342, + SpvOpGroupNonUniformBallotFindLSB = 343, + SpvOpGroupNonUniformBallotFindMSB = 344, + SpvOpGroupNonUniformShuffle = 345, + SpvOpGroupNonUniformShuffleXor = 346, + SpvOpGroupNonUniformShuffleUp = 347, + SpvOpGroupNonUniformShuffleDown = 348, + SpvOpGroupNonUniformIAdd = 349, + SpvOpGroupNonUniformFAdd = 350, + SpvOpGroupNonUniformIMul = 351, + SpvOpGroupNonUniformFMul = 352, + SpvOpGroupNonUniformSMin = 353, + SpvOpGroupNonUniformUMin = 354, + SpvOpGroupNonUniformFMin = 355, + SpvOpGroupNonUniformSMax = 356, + SpvOpGroupNonUniformUMax = 357, + SpvOpGroupNonUniformFMax = 358, + SpvOpGroupNonUniformBitwiseAnd = 359, + SpvOpGroupNonUniformBitwiseOr = 360, + SpvOpGroupNonUniformBitwiseXor = 361, + SpvOpGroupNonUniformLogicalAnd = 362, + SpvOpGroupNonUniformLogicalOr = 363, + SpvOpGroupNonUniformLogicalXor = 364, + SpvOpGroupNonUniformQuadBroadcast = 365, + SpvOpGroupNonUniformQuadSwap = 366, SpvOpSubgroupBallotKHR = 4421, SpvOpSubgroupFirstInvocationKHR = 4422, SpvOpSubgroupAllKHR = 4428, @@ -1004,6 +1072,7 @@ SpvOpGroupSMaxNonUniformAMD = 5007, SpvOpFragmentMaskFetchAMD = 5011, SpvOpFragmentFetchAMD = 5012, + SpvOpGroupNonUniformPartitionNV = 5296, SpvOpSubgroupShuffleINTEL = 5571, SpvOpSubgroupShuffleDownINTEL = 5572, SpvOpSubgroupShuffleUpINTEL = 5573, @@ -1012,6 +1081,8 @@ SpvOpSubgroupBlockWriteINTEL = 5576, SpvOpSubgroupImageBlockReadINTEL = 5577, SpvOpSubgroupImageBlockWriteINTEL = 5578, + SpvOpDecorateStringGOOGLE = 5632, + SpvOpMemberDecorateStringGOOGLE = 5633, SpvOpMax = 0x7fffffff, } SpvOp; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.hpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.hpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.hpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.hpp 2018-04-27 11:46:33.000000000 +0000 @@ -46,12 +46,12 @@ typedef unsigned int Id; -#define SPV_VERSION 0x10200 -#define SPV_REVISION 3 +#define SPV_VERSION 0x10300 +#define SPV_REVISION 1 static const unsigned int MagicNumber = 0x07230203; -static const unsigned int Version = 0x00010200; -static const unsigned int Revision = 3; +static const unsigned int Version = 0x00010300; +static const unsigned int Revision = 1; static const unsigned int OpCodeMask = 0xffff; static const unsigned int WordCountShift = 16; @@ -393,6 +393,9 @@ DecorationPassthroughNV = 5250, DecorationViewportRelativeNV = 5252, DecorationSecondaryViewportRelativeNV = 5256, + DecorationNonUniformEXT = 5300, + DecorationHlslCounterBufferGOOGLE = 5634, + DecorationHlslSemanticGOOGLE = 5635, DecorationMax = 0x7fffffff, }; @@ -438,10 +441,15 @@ BuiltInSubgroupLocalInvocationId = 41, BuiltInVertexIndex = 42, BuiltInInstanceIndex = 43, + BuiltInSubgroupEqMask = 4416, BuiltInSubgroupEqMaskKHR = 4416, + BuiltInSubgroupGeMask = 4417, BuiltInSubgroupGeMaskKHR = 4417, + BuiltInSubgroupGtMask = 4418, BuiltInSubgroupGtMaskKHR = 4418, + BuiltInSubgroupLeMask = 4419, BuiltInSubgroupLeMaskKHR = 4419, + BuiltInSubgroupLtMask = 4420, BuiltInSubgroupLtMaskKHR = 4420, BuiltInBaseVertex = 4424, BuiltInBaseInstance = 4425, @@ -564,6 +572,10 @@ GroupOperationReduce = 0, GroupOperationInclusiveScan = 1, GroupOperationExclusiveScan = 2, + GroupOperationClusteredReduce = 3, + GroupOperationPartitionedReduceNV = 6, + GroupOperationPartitionedInclusiveScanNV = 7, + GroupOperationPartitionedExclusiveScanNV = 8, GroupOperationMax = 0x7fffffff, }; @@ -644,6 +656,14 @@ CapabilitySubgroupDispatch = 58, CapabilityNamedBarrier = 59, CapabilityPipeStorage = 60, + CapabilityGroupNonUniform = 61, + CapabilityGroupNonUniformVote = 62, + CapabilityGroupNonUniformArithmetic = 63, + CapabilityGroupNonUniformBallot = 64, + CapabilityGroupNonUniformShuffle = 65, + CapabilityGroupNonUniformShuffleRelative = 66, + CapabilityGroupNonUniformClustered = 67, + CapabilityGroupNonUniformQuad = 68, CapabilitySubgroupBallotKHR = 4423, CapabilityDrawParameters = 4427, CapabilitySubgroupVoteKHR = 4431, @@ -659,6 +679,7 @@ CapabilityVariablePointers = 4442, CapabilityAtomicStorageOps = 4445, CapabilitySampleMaskPostDepthCoverage = 4447, + CapabilityFloat16ImageAMD = 5008, CapabilityImageGatherBiasLodAMD = 5009, CapabilityFragmentMaskAMD = 5010, CapabilityStencilExportEXT = 5013, @@ -671,6 +692,19 @@ CapabilityShaderStereoViewNV = 5259, CapabilityPerViewAttributesNV = 5260, CapabilityFragmentFullyCoveredEXT = 5265, + CapabilityGroupNonUniformPartitionedNV = 5297, + CapabilityShaderNonUniformEXT = 5301, + CapabilityRuntimeDescriptorArrayEXT = 5302, + CapabilityInputAttachmentArrayDynamicIndexingEXT = 5303, + CapabilityUniformTexelBufferArrayDynamicIndexingEXT = 5304, + CapabilityStorageTexelBufferArrayDynamicIndexingEXT = 5305, + CapabilityUniformBufferArrayNonUniformIndexingEXT = 5306, + CapabilitySampledImageArrayNonUniformIndexingEXT = 5307, + CapabilityStorageBufferArrayNonUniformIndexingEXT = 5308, + CapabilityStorageImageArrayNonUniformIndexingEXT = 5309, + CapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310, + CapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311, + CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312, CapabilitySubgroupShuffleINTEL = 5568, CapabilitySubgroupBufferBlockIOINTEL = 5569, CapabilitySubgroupImageBlockIOINTEL = 5570, @@ -984,6 +1018,40 @@ OpModuleProcessed = 330, OpExecutionModeId = 331, OpDecorateId = 332, + OpGroupNonUniformElect = 333, + OpGroupNonUniformAll = 334, + OpGroupNonUniformAny = 335, + OpGroupNonUniformAllEqual = 336, + OpGroupNonUniformBroadcast = 337, + OpGroupNonUniformBroadcastFirst = 338, + OpGroupNonUniformBallot = 339, + OpGroupNonUniformInverseBallot = 340, + OpGroupNonUniformBallotBitExtract = 341, + OpGroupNonUniformBallotBitCount = 342, + OpGroupNonUniformBallotFindLSB = 343, + OpGroupNonUniformBallotFindMSB = 344, + OpGroupNonUniformShuffle = 345, + OpGroupNonUniformShuffleXor = 346, + OpGroupNonUniformShuffleUp = 347, + OpGroupNonUniformShuffleDown = 348, + OpGroupNonUniformIAdd = 349, + OpGroupNonUniformFAdd = 350, + OpGroupNonUniformIMul = 351, + OpGroupNonUniformFMul = 352, + OpGroupNonUniformSMin = 353, + OpGroupNonUniformUMin = 354, + OpGroupNonUniformFMin = 355, + OpGroupNonUniformSMax = 356, + OpGroupNonUniformUMax = 357, + OpGroupNonUniformFMax = 358, + OpGroupNonUniformBitwiseAnd = 359, + OpGroupNonUniformBitwiseOr = 360, + OpGroupNonUniformBitwiseXor = 361, + OpGroupNonUniformLogicalAnd = 362, + OpGroupNonUniformLogicalOr = 363, + OpGroupNonUniformLogicalXor = 364, + OpGroupNonUniformQuadBroadcast = 365, + OpGroupNonUniformQuadSwap = 366, OpSubgroupBallotKHR = 4421, OpSubgroupFirstInvocationKHR = 4422, OpSubgroupAllKHR = 4428, @@ -1000,6 +1068,7 @@ OpGroupSMaxNonUniformAMD = 5007, OpFragmentMaskFetchAMD = 5011, OpFragmentFetchAMD = 5012, + OpGroupNonUniformPartitionNV = 5296, OpSubgroupShuffleINTEL = 5571, OpSubgroupShuffleDownINTEL = 5572, OpSubgroupShuffleUpINTEL = 5573, @@ -1008,6 +1077,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, OpMax = 0x7fffffff, }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.hpp11 vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.hpp11 --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.hpp11 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.hpp11 2018-04-27 11:46:33.000000000 +0000 @@ -46,12 +46,12 @@ typedef unsigned int Id; -#define SPV_VERSION 0x10200 -#define SPV_REVISION 3 +#define SPV_VERSION 0x10300 +#define SPV_REVISION 1 static const unsigned int MagicNumber = 0x07230203; -static const unsigned int Version = 0x00010200; -static const unsigned int Revision = 3; +static const unsigned int Version = 0x00010300; +static const unsigned int Revision = 1; static const unsigned int OpCodeMask = 0xffff; static const unsigned int WordCountShift = 16; @@ -393,6 +393,9 @@ PassthroughNV = 5250, ViewportRelativeNV = 5252, SecondaryViewportRelativeNV = 5256, + NonUniformEXT = 5300, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, Max = 0x7fffffff, }; @@ -438,10 +441,15 @@ SubgroupLocalInvocationId = 41, VertexIndex = 42, InstanceIndex = 43, + SubgroupEqMask = 4416, SubgroupEqMaskKHR = 4416, + SubgroupGeMask = 4417, SubgroupGeMaskKHR = 4417, + SubgroupGtMask = 4418, SubgroupGtMaskKHR = 4418, + SubgroupLeMask = 4419, SubgroupLeMaskKHR = 4419, + SubgroupLtMask = 4420, SubgroupLtMaskKHR = 4420, BaseVertex = 4424, BaseInstance = 4425, @@ -564,6 +572,10 @@ Reduce = 0, InclusiveScan = 1, ExclusiveScan = 2, + ClusteredReduce = 3, + PartitionedReduceNV = 6, + PartitionedInclusiveScanNV = 7, + PartitionedExclusiveScanNV = 8, Max = 0x7fffffff, }; @@ -644,6 +656,14 @@ SubgroupDispatch = 58, NamedBarrier = 59, PipeStorage = 60, + GroupNonUniform = 61, + GroupNonUniformVote = 62, + GroupNonUniformArithmetic = 63, + GroupNonUniformBallot = 64, + GroupNonUniformShuffle = 65, + GroupNonUniformShuffleRelative = 66, + GroupNonUniformClustered = 67, + GroupNonUniformQuad = 68, SubgroupBallotKHR = 4423, DrawParameters = 4427, SubgroupVoteKHR = 4431, @@ -659,6 +679,7 @@ VariablePointers = 4442, AtomicStorageOps = 4445, SampleMaskPostDepthCoverage = 4447, + Float16ImageAMD = 5008, ImageGatherBiasLodAMD = 5009, FragmentMaskAMD = 5010, StencilExportEXT = 5013, @@ -671,6 +692,19 @@ ShaderStereoViewNV = 5259, PerViewAttributesNV = 5260, FragmentFullyCoveredEXT = 5265, + GroupNonUniformPartitionedNV = 5297, + ShaderNonUniformEXT = 5301, + RuntimeDescriptorArrayEXT = 5302, + InputAttachmentArrayDynamicIndexingEXT = 5303, + UniformTexelBufferArrayDynamicIndexingEXT = 5304, + StorageTexelBufferArrayDynamicIndexingEXT = 5305, + UniformBufferArrayNonUniformIndexingEXT = 5306, + SampledImageArrayNonUniformIndexingEXT = 5307, + StorageBufferArrayNonUniformIndexingEXT = 5308, + StorageImageArrayNonUniformIndexingEXT = 5309, + InputAttachmentArrayNonUniformIndexingEXT = 5310, + UniformTexelBufferArrayNonUniformIndexingEXT = 5311, + StorageTexelBufferArrayNonUniformIndexingEXT = 5312, SubgroupShuffleINTEL = 5568, SubgroupBufferBlockIOINTEL = 5569, SubgroupImageBlockIOINTEL = 5570, @@ -984,6 +1018,40 @@ OpModuleProcessed = 330, OpExecutionModeId = 331, OpDecorateId = 332, + OpGroupNonUniformElect = 333, + OpGroupNonUniformAll = 334, + OpGroupNonUniformAny = 335, + OpGroupNonUniformAllEqual = 336, + OpGroupNonUniformBroadcast = 337, + OpGroupNonUniformBroadcastFirst = 338, + OpGroupNonUniformBallot = 339, + OpGroupNonUniformInverseBallot = 340, + OpGroupNonUniformBallotBitExtract = 341, + OpGroupNonUniformBallotBitCount = 342, + OpGroupNonUniformBallotFindLSB = 343, + OpGroupNonUniformBallotFindMSB = 344, + OpGroupNonUniformShuffle = 345, + OpGroupNonUniformShuffleXor = 346, + OpGroupNonUniformShuffleUp = 347, + OpGroupNonUniformShuffleDown = 348, + OpGroupNonUniformIAdd = 349, + OpGroupNonUniformFAdd = 350, + OpGroupNonUniformIMul = 351, + OpGroupNonUniformFMul = 352, + OpGroupNonUniformSMin = 353, + OpGroupNonUniformUMin = 354, + OpGroupNonUniformFMin = 355, + OpGroupNonUniformSMax = 356, + OpGroupNonUniformUMax = 357, + OpGroupNonUniformFMax = 358, + OpGroupNonUniformBitwiseAnd = 359, + OpGroupNonUniformBitwiseOr = 360, + OpGroupNonUniformBitwiseXor = 361, + OpGroupNonUniformLogicalAnd = 362, + OpGroupNonUniformLogicalOr = 363, + OpGroupNonUniformLogicalXor = 364, + OpGroupNonUniformQuadBroadcast = 365, + OpGroupNonUniformQuadSwap = 366, OpSubgroupBallotKHR = 4421, OpSubgroupFirstInvocationKHR = 4422, OpSubgroupAllKHR = 4428, @@ -1000,6 +1068,7 @@ OpGroupSMaxNonUniformAMD = 5007, OpFragmentMaskFetchAMD = 5011, OpFragmentFetchAMD = 5012, + OpGroupNonUniformPartitionNV = 5296, OpSubgroupShuffleINTEL = 5571, OpSubgroupShuffleDownINTEL = 5572, OpSubgroupShuffleUpINTEL = 5573, @@ -1008,6 +1077,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, Max = 0x7fffffff, }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.json vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.json --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.json 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.json 2018-04-27 11:46:33.000000000 +0000 @@ -51,8 +51,8 @@ ] ], "MagicNumber": 119734787, - "Version": 66048, - "Revision": 3, + "Version": 66304, + "Revision": 1, "OpCodeMask": 65535, "WordCountShift": 16 }, @@ -432,7 +432,10 @@ "OverrideCoverageNV": 5248, "PassthroughNV": 5250, "ViewportRelativeNV": 5252, - "SecondaryViewportRelativeNV": 5256 + "SecondaryViewportRelativeNV": 5256, + "NonUniformEXT": 5300, + "HlslCounterBufferGOOGLE": 5634, + "HlslSemanticGOOGLE": 5635 } }, { @@ -481,10 +484,15 @@ "SubgroupLocalInvocationId": 41, "VertexIndex": 42, "InstanceIndex": 43, + "SubgroupEqMask": 4416, "SubgroupEqMaskKHR": 4416, + "SubgroupGeMask": 4417, "SubgroupGeMaskKHR": 4417, + "SubgroupGtMask": 4418, "SubgroupGtMaskKHR": 4418, + "SubgroupLeMask": 4419, "SubgroupLeMaskKHR": 4419, + "SubgroupLtMask": 4420, "SubgroupLtMaskKHR": 4420, "BaseVertex": 4424, "BaseInstance": 4425, @@ -584,7 +592,11 @@ { "Reduce": 0, "InclusiveScan": 1, - "ExclusiveScan": 2 + "ExclusiveScan": 2, + "ClusteredReduce": 3, + "PartitionedReduceNV": 6, + "PartitionedInclusiveScanNV": 7, + "PartitionedExclusiveScanNV": 8 } }, { @@ -669,6 +681,14 @@ "SubgroupDispatch": 58, "NamedBarrier": 59, "PipeStorage": 60, + "GroupNonUniform": 61, + "GroupNonUniformVote": 62, + "GroupNonUniformArithmetic": 63, + "GroupNonUniformBallot": 64, + "GroupNonUniformShuffle": 65, + "GroupNonUniformShuffleRelative": 66, + "GroupNonUniformClustered": 67, + "GroupNonUniformQuad": 68, "SubgroupBallotKHR": 4423, "DrawParameters": 4427, "SubgroupVoteKHR": 4431, @@ -684,6 +704,7 @@ "VariablePointers": 4442, "AtomicStorageOps": 4445, "SampleMaskPostDepthCoverage": 4447, + "Float16ImageAMD": 5008, "ImageGatherBiasLodAMD": 5009, "FragmentMaskAMD": 5010, "StencilExportEXT": 5013, @@ -696,6 +717,19 @@ "ShaderStereoViewNV": 5259, "PerViewAttributesNV": 5260, "FragmentFullyCoveredEXT": 5265, + "GroupNonUniformPartitionedNV": 5297, + "ShaderNonUniformEXT": 5301, + "RuntimeDescriptorArrayEXT": 5302, + "InputAttachmentArrayDynamicIndexingEXT": 5303, + "UniformTexelBufferArrayDynamicIndexingEXT": 5304, + "StorageTexelBufferArrayDynamicIndexingEXT": 5305, + "UniformBufferArrayNonUniformIndexingEXT": 5306, + "SampledImageArrayNonUniformIndexingEXT": 5307, + "StorageBufferArrayNonUniformIndexingEXT": 5308, + "StorageImageArrayNonUniformIndexingEXT": 5309, + "InputAttachmentArrayNonUniformIndexingEXT": 5310, + "UniformTexelBufferArrayNonUniformIndexingEXT": 5311, + "StorageTexelBufferArrayNonUniformIndexingEXT": 5312, "SubgroupShuffleINTEL": 5568, "SubgroupBufferBlockIOINTEL": 5569, "SubgroupImageBlockIOINTEL": 5570 @@ -1012,6 +1046,40 @@ "OpModuleProcessed": 330, "OpExecutionModeId": 331, "OpDecorateId": 332, + "OpGroupNonUniformElect": 333, + "OpGroupNonUniformAll": 334, + "OpGroupNonUniformAny": 335, + "OpGroupNonUniformAllEqual": 336, + "OpGroupNonUniformBroadcast": 337, + "OpGroupNonUniformBroadcastFirst": 338, + "OpGroupNonUniformBallot": 339, + "OpGroupNonUniformInverseBallot": 340, + "OpGroupNonUniformBallotBitExtract": 341, + "OpGroupNonUniformBallotBitCount": 342, + "OpGroupNonUniformBallotFindLSB": 343, + "OpGroupNonUniformBallotFindMSB": 344, + "OpGroupNonUniformShuffle": 345, + "OpGroupNonUniformShuffleXor": 346, + "OpGroupNonUniformShuffleUp": 347, + "OpGroupNonUniformShuffleDown": 348, + "OpGroupNonUniformIAdd": 349, + "OpGroupNonUniformFAdd": 350, + "OpGroupNonUniformIMul": 351, + "OpGroupNonUniformFMul": 352, + "OpGroupNonUniformSMin": 353, + "OpGroupNonUniformUMin": 354, + "OpGroupNonUniformFMin": 355, + "OpGroupNonUniformSMax": 356, + "OpGroupNonUniformUMax": 357, + "OpGroupNonUniformFMax": 358, + "OpGroupNonUniformBitwiseAnd": 359, + "OpGroupNonUniformBitwiseOr": 360, + "OpGroupNonUniformBitwiseXor": 361, + "OpGroupNonUniformLogicalAnd": 362, + "OpGroupNonUniformLogicalOr": 363, + "OpGroupNonUniformLogicalXor": 364, + "OpGroupNonUniformQuadBroadcast": 365, + "OpGroupNonUniformQuadSwap": 366, "OpSubgroupBallotKHR": 4421, "OpSubgroupFirstInvocationKHR": 4422, "OpSubgroupAllKHR": 4428, @@ -1028,6 +1096,7 @@ "OpGroupSMaxNonUniformAMD": 5007, "OpFragmentMaskFetchAMD": 5011, "OpFragmentFetchAMD": 5012, + "OpGroupNonUniformPartitionNV": 5296, "OpSubgroupShuffleINTEL": 5571, "OpSubgroupShuffleDownINTEL": 5572, "OpSubgroupShuffleUpINTEL": 5573, @@ -1035,7 +1104,9 @@ "OpSubgroupBlockReadINTEL": 5575, "OpSubgroupBlockWriteINTEL": 5576, "OpSubgroupImageBlockReadINTEL": 5577, - "OpSubgroupImageBlockWriteINTEL": 5578 + "OpSubgroupImageBlockWriteINTEL": 5578, + "OpDecorateStringGOOGLE": 5632, + "OpMemberDecorateStringGOOGLE": 5633 } } ] diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.lua vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.lua --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.lua 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.lua 2018-04-27 11:46:33.000000000 +0000 @@ -41,8 +41,8 @@ spv = { MagicNumber = 0x07230203, - Version = 0x00010200, - Revision = 3, + Version = 0x00010300, + Revision = 1, OpCodeMask = 0xffff, WordCountShift = 16, @@ -366,6 +366,9 @@ PassthroughNV = 5250, ViewportRelativeNV = 5252, SecondaryViewportRelativeNV = 5256, + NonUniformEXT = 5300, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, }, BuiltIn = { @@ -410,10 +413,15 @@ SubgroupLocalInvocationId = 41, VertexIndex = 42, InstanceIndex = 43, + SubgroupEqMask = 4416, SubgroupEqMaskKHR = 4416, + SubgroupGeMask = 4417, SubgroupGeMaskKHR = 4417, + SubgroupGtMask = 4418, SubgroupGtMaskKHR = 4418, + SubgroupLeMask = 4419, SubgroupLeMaskKHR = 4419, + SubgroupLtMask = 4420, SubgroupLtMaskKHR = 4420, BaseVertex = 4424, BaseInstance = 4425, @@ -529,6 +537,10 @@ Reduce = 0, InclusiveScan = 1, ExclusiveScan = 2, + ClusteredReduce = 3, + PartitionedReduceNV = 6, + PartitionedInclusiveScanNV = 7, + PartitionedExclusiveScanNV = 8, }, KernelEnqueueFlags = { @@ -606,6 +618,14 @@ SubgroupDispatch = 58, NamedBarrier = 59, PipeStorage = 60, + GroupNonUniform = 61, + GroupNonUniformVote = 62, + GroupNonUniformArithmetic = 63, + GroupNonUniformBallot = 64, + GroupNonUniformShuffle = 65, + GroupNonUniformShuffleRelative = 66, + GroupNonUniformClustered = 67, + GroupNonUniformQuad = 68, SubgroupBallotKHR = 4423, DrawParameters = 4427, SubgroupVoteKHR = 4431, @@ -621,6 +641,7 @@ VariablePointers = 4442, AtomicStorageOps = 4445, SampleMaskPostDepthCoverage = 4447, + Float16ImageAMD = 5008, ImageGatherBiasLodAMD = 5009, FragmentMaskAMD = 5010, StencilExportEXT = 5013, @@ -633,6 +654,19 @@ ShaderStereoViewNV = 5259, PerViewAttributesNV = 5260, FragmentFullyCoveredEXT = 5265, + GroupNonUniformPartitionedNV = 5297, + ShaderNonUniformEXT = 5301, + RuntimeDescriptorArrayEXT = 5302, + InputAttachmentArrayDynamicIndexingEXT = 5303, + UniformTexelBufferArrayDynamicIndexingEXT = 5304, + StorageTexelBufferArrayDynamicIndexingEXT = 5305, + UniformBufferArrayNonUniformIndexingEXT = 5306, + SampledImageArrayNonUniformIndexingEXT = 5307, + StorageBufferArrayNonUniformIndexingEXT = 5308, + StorageImageArrayNonUniformIndexingEXT = 5309, + InputAttachmentArrayNonUniformIndexingEXT = 5310, + UniformTexelBufferArrayNonUniformIndexingEXT = 5311, + StorageTexelBufferArrayNonUniformIndexingEXT = 5312, SubgroupShuffleINTEL = 5568, SubgroupBufferBlockIOINTEL = 5569, SubgroupImageBlockIOINTEL = 5570, @@ -945,6 +979,40 @@ OpModuleProcessed = 330, OpExecutionModeId = 331, OpDecorateId = 332, + OpGroupNonUniformElect = 333, + OpGroupNonUniformAll = 334, + OpGroupNonUniformAny = 335, + OpGroupNonUniformAllEqual = 336, + OpGroupNonUniformBroadcast = 337, + OpGroupNonUniformBroadcastFirst = 338, + OpGroupNonUniformBallot = 339, + OpGroupNonUniformInverseBallot = 340, + OpGroupNonUniformBallotBitExtract = 341, + OpGroupNonUniformBallotBitCount = 342, + OpGroupNonUniformBallotFindLSB = 343, + OpGroupNonUniformBallotFindMSB = 344, + OpGroupNonUniformShuffle = 345, + OpGroupNonUniformShuffleXor = 346, + OpGroupNonUniformShuffleUp = 347, + OpGroupNonUniformShuffleDown = 348, + OpGroupNonUniformIAdd = 349, + OpGroupNonUniformFAdd = 350, + OpGroupNonUniformIMul = 351, + OpGroupNonUniformFMul = 352, + OpGroupNonUniformSMin = 353, + OpGroupNonUniformUMin = 354, + OpGroupNonUniformFMin = 355, + OpGroupNonUniformSMax = 356, + OpGroupNonUniformUMax = 357, + OpGroupNonUniformFMax = 358, + OpGroupNonUniformBitwiseAnd = 359, + OpGroupNonUniformBitwiseOr = 360, + OpGroupNonUniformBitwiseXor = 361, + OpGroupNonUniformLogicalAnd = 362, + OpGroupNonUniformLogicalOr = 363, + OpGroupNonUniformLogicalXor = 364, + OpGroupNonUniformQuadBroadcast = 365, + OpGroupNonUniformQuadSwap = 366, OpSubgroupBallotKHR = 4421, OpSubgroupFirstInvocationKHR = 4422, OpSubgroupAllKHR = 4428, @@ -961,6 +1029,7 @@ OpGroupSMaxNonUniformAMD = 5007, OpFragmentMaskFetchAMD = 5011, OpFragmentFetchAMD = 5012, + OpGroupNonUniformPartitionNV = 5296, OpSubgroupShuffleINTEL = 5571, OpSubgroupShuffleDownINTEL = 5572, OpSubgroupShuffleUpINTEL = 5573, @@ -969,6 +1038,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, }, } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.py vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.py --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.py 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/include/spirv/unified1/spirv.py 2018-04-27 11:46:33.000000000 +0000 @@ -41,8 +41,8 @@ spv = { 'MagicNumber' : 0x07230203, - 'Version' : 0x00010200, - 'Revision' : 3, + 'Version' : 0x00010300, + 'Revision' : 1, 'OpCodeMask' : 0xffff, 'WordCountShift' : 16, @@ -366,6 +366,9 @@ 'PassthroughNV' : 5250, 'ViewportRelativeNV' : 5252, 'SecondaryViewportRelativeNV' : 5256, + 'NonUniformEXT' : 5300, + 'HlslCounterBufferGOOGLE' : 5634, + 'HlslSemanticGOOGLE' : 5635, }, 'BuiltIn' : { @@ -410,10 +413,15 @@ 'SubgroupLocalInvocationId' : 41, 'VertexIndex' : 42, 'InstanceIndex' : 43, + 'SubgroupEqMask' : 4416, 'SubgroupEqMaskKHR' : 4416, + 'SubgroupGeMask' : 4417, 'SubgroupGeMaskKHR' : 4417, + 'SubgroupGtMask' : 4418, 'SubgroupGtMaskKHR' : 4418, + 'SubgroupLeMask' : 4419, 'SubgroupLeMaskKHR' : 4419, + 'SubgroupLtMask' : 4420, 'SubgroupLtMaskKHR' : 4420, 'BaseVertex' : 4424, 'BaseInstance' : 4425, @@ -529,6 +537,10 @@ 'Reduce' : 0, 'InclusiveScan' : 1, 'ExclusiveScan' : 2, + 'ClusteredReduce' : 3, + 'PartitionedReduceNV' : 6, + 'PartitionedInclusiveScanNV' : 7, + 'PartitionedExclusiveScanNV' : 8, }, 'KernelEnqueueFlags' : { @@ -606,6 +618,14 @@ 'SubgroupDispatch' : 58, 'NamedBarrier' : 59, 'PipeStorage' : 60, + 'GroupNonUniform' : 61, + 'GroupNonUniformVote' : 62, + 'GroupNonUniformArithmetic' : 63, + 'GroupNonUniformBallot' : 64, + 'GroupNonUniformShuffle' : 65, + 'GroupNonUniformShuffleRelative' : 66, + 'GroupNonUniformClustered' : 67, + 'GroupNonUniformQuad' : 68, 'SubgroupBallotKHR' : 4423, 'DrawParameters' : 4427, 'SubgroupVoteKHR' : 4431, @@ -621,6 +641,7 @@ 'VariablePointers' : 4442, 'AtomicStorageOps' : 4445, 'SampleMaskPostDepthCoverage' : 4447, + 'Float16ImageAMD' : 5008, 'ImageGatherBiasLodAMD' : 5009, 'FragmentMaskAMD' : 5010, 'StencilExportEXT' : 5013, @@ -633,6 +654,19 @@ 'ShaderStereoViewNV' : 5259, 'PerViewAttributesNV' : 5260, 'FragmentFullyCoveredEXT' : 5265, + 'GroupNonUniformPartitionedNV' : 5297, + 'ShaderNonUniformEXT' : 5301, + 'RuntimeDescriptorArrayEXT' : 5302, + 'InputAttachmentArrayDynamicIndexingEXT' : 5303, + 'UniformTexelBufferArrayDynamicIndexingEXT' : 5304, + 'StorageTexelBufferArrayDynamicIndexingEXT' : 5305, + 'UniformBufferArrayNonUniformIndexingEXT' : 5306, + 'SampledImageArrayNonUniformIndexingEXT' : 5307, + 'StorageBufferArrayNonUniformIndexingEXT' : 5308, + 'StorageImageArrayNonUniformIndexingEXT' : 5309, + 'InputAttachmentArrayNonUniformIndexingEXT' : 5310, + 'UniformTexelBufferArrayNonUniformIndexingEXT' : 5311, + 'StorageTexelBufferArrayNonUniformIndexingEXT' : 5312, 'SubgroupShuffleINTEL' : 5568, 'SubgroupBufferBlockIOINTEL' : 5569, 'SubgroupImageBlockIOINTEL' : 5570, @@ -945,6 +979,40 @@ 'OpModuleProcessed' : 330, 'OpExecutionModeId' : 331, 'OpDecorateId' : 332, + 'OpGroupNonUniformElect' : 333, + 'OpGroupNonUniformAll' : 334, + 'OpGroupNonUniformAny' : 335, + 'OpGroupNonUniformAllEqual' : 336, + 'OpGroupNonUniformBroadcast' : 337, + 'OpGroupNonUniformBroadcastFirst' : 338, + 'OpGroupNonUniformBallot' : 339, + 'OpGroupNonUniformInverseBallot' : 340, + 'OpGroupNonUniformBallotBitExtract' : 341, + 'OpGroupNonUniformBallotBitCount' : 342, + 'OpGroupNonUniformBallotFindLSB' : 343, + 'OpGroupNonUniformBallotFindMSB' : 344, + 'OpGroupNonUniformShuffle' : 345, + 'OpGroupNonUniformShuffleXor' : 346, + 'OpGroupNonUniformShuffleUp' : 347, + 'OpGroupNonUniformShuffleDown' : 348, + 'OpGroupNonUniformIAdd' : 349, + 'OpGroupNonUniformFAdd' : 350, + 'OpGroupNonUniformIMul' : 351, + 'OpGroupNonUniformFMul' : 352, + 'OpGroupNonUniformSMin' : 353, + 'OpGroupNonUniformUMin' : 354, + 'OpGroupNonUniformFMin' : 355, + 'OpGroupNonUniformSMax' : 356, + 'OpGroupNonUniformUMax' : 357, + 'OpGroupNonUniformFMax' : 358, + 'OpGroupNonUniformBitwiseAnd' : 359, + 'OpGroupNonUniformBitwiseOr' : 360, + 'OpGroupNonUniformBitwiseXor' : 361, + 'OpGroupNonUniformLogicalAnd' : 362, + 'OpGroupNonUniformLogicalOr' : 363, + 'OpGroupNonUniformLogicalXor' : 364, + 'OpGroupNonUniformQuadBroadcast' : 365, + 'OpGroupNonUniformQuadSwap' : 366, 'OpSubgroupBallotKHR' : 4421, 'OpSubgroupFirstInvocationKHR' : 4422, 'OpSubgroupAllKHR' : 4428, @@ -961,6 +1029,7 @@ 'OpGroupSMaxNonUniformAMD' : 5007, 'OpFragmentMaskFetchAMD' : 5011, 'OpFragmentFetchAMD' : 5012, + 'OpGroupNonUniformPartitionNV' : 5296, 'OpSubgroupShuffleINTEL' : 5571, 'OpSubgroupShuffleDownINTEL' : 5572, 'OpSubgroupShuffleUpINTEL' : 5573, @@ -969,6 +1038,8 @@ 'OpSubgroupBlockWriteINTEL' : 5576, 'OpSubgroupImageBlockReadINTEL' : 5577, 'OpSubgroupImageBlockWriteINTEL' : 5578, + 'OpDecorateStringGOOGLE' : 5632, + 'OpMemberDecorateStringGOOGLE' : 5633, }, } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/README.md vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/README.md --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/README.md 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/README.md 2018-04-27 11:46:33.000000000 +0000 @@ -71,10 +71,11 @@ and can be used to test a PR, or even to include the results in the PR. This is not required though. -The header-generation project is under the `buildHeaders` directory. -Use CMake to build the project, in a `buildHeaders/build` subdirectory. -There is a bash script at `buildHeaders/bin/makeHeaders` that shows how to use the built +The header-generation project is under the `tools/buildHeaders` directory. +Use CMake to build the project, in a `build` subdirectory (under `tools/buildHeaders`). +There is then a bash script at `bin/makeHeaders` that shows how to use the built header-generator binary to generate the headers from the JSON grammar. +(Execute `bin/makeHeaders` from the `tools/buildHeaders` directory.) Notes: - this generator is used in a broader context within Khronos to generate the specification, diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/tools/buildHeaders/header.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/tools/buildHeaders/header.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/external/spirv-headers/tools/buildHeaders/header.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/external/spirv-headers/tools/buildHeaders/header.cpp 2018-04-27 11:46:33.000000000 +0000 @@ -68,9 +68,9 @@ TPrinter(); static const int DocMagicNumber = 0x07230203; - static const int DocVersion = 0x00010200; - static const int DocRevision = 3; - #define DocRevisionString "3" + static const int DocVersion = 0x00010300; + static const int DocRevision = 1; + #define DocRevisionString "1" static const std::string DocCopyright; static const std::string DocComment1; static const std::string DocComment2; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/include/spirv-tools/libspirv.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/include/spirv-tools/libspirv.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/include/spirv-tools/libspirv.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/include/spirv-tools/libspirv.h 2018-04-27 11:46:32.000000000 +0000 @@ -24,6 +24,24 @@ #include #include +#if defined(SPIRV_TOOLS_SHAREDLIB) +#if defined(_WIN32) +#if defined(SPIRV_TOOLS_IMPLEMENTATION) +#define SPIRV_TOOLS_EXPORT __declspec(dllexport) +#else +#define SPIRV_TOOLS_EXPORT __declspec(dllimport) +#endif +#else +#if defined(SPIRV_TOOLS_IMPLEMENTATION) +#define SPIRV_TOOLS_EXPORT __attribute__((visibility("default"))) +#else +#define SPIRV_TOOLS_EXPORT +#endif +#endif +#else +#define SPIRV_TOOLS_EXPORT +#endif + // Helpers #define SPV_BIT(shift) (1 << (shift)) @@ -55,6 +73,7 @@ SPV_ERROR_INVALID_CAPABILITY = -13, SPV_ERROR_INVALID_DATA = -14, // Indicates data rules validation failure. SPV_ERROR_MISSING_EXTENSION = -15, + SPV_ERROR_WRONG_VERSION = -16, // Indicates wrong SPIR-V version SPV_FORCE_32_BIT_ENUM(spv_result_t) } spv_result_t; @@ -358,12 +377,12 @@ // Returns the SPIRV-Tools software version as a null-terminated string. // The contents of the underlying storage is valid for the remainder of // the process. -const char* spvSoftwareVersionString(); +SPIRV_TOOLS_EXPORT const char* spvSoftwareVersionString(void); // Returns a null-terminated string containing the name of the project, // the software version string, and commit details. // The contents of the underlying storage is valid for the remainder of // the process. -const char* spvSoftwareVersionDetailsString(); +SPIRV_TOOLS_EXPORT const char* spvSoftwareVersionDetailsString(void); // Certain target environments impose additional restrictions on SPIR-V, so it's // often necessary to specify which one applies. SPV_ENV_UNIVERSAL means @@ -391,6 +410,8 @@ // cl_khr_il_program, latest revision. SPV_ENV_OPENCL_EMBEDDED_2_1, // OpenCL Embedded Profile 2.1 latest revision. SPV_ENV_OPENCL_EMBEDDED_2_2, // OpenCL Embedded Profile 2.2 latest revision. + SPV_ENV_UNIVERSAL_1_3, // SPIR-V 1.3 latest revision, no other restrictions. + SPV_ENV_VULKAN_1_1, // Vulkan 1.0 latest revision. } spv_target_env; // SPIR-V Validator can be parameterized with the following Universal Limits. @@ -406,27 +427,28 @@ } spv_validator_limit; // Returns a string describing the given SPIR-V target environment. -const char* spvTargetEnvDescription(spv_target_env env); +SPIRV_TOOLS_EXPORT const char* spvTargetEnvDescription(spv_target_env env); // Creates a context object. Returns null if env is invalid. -spv_context spvContextCreate(spv_target_env env); +SPIRV_TOOLS_EXPORT spv_context spvContextCreate(spv_target_env env); // Destroys the given context object. -void spvContextDestroy(spv_context context); +SPIRV_TOOLS_EXPORT void spvContextDestroy(spv_context context); // Creates a Validator options object with default options. Returns a valid // options object. The object remains valid until it is passed into // spvValidatorOptionsDestroy. -spv_validator_options spvValidatorOptionsCreate(); +SPIRV_TOOLS_EXPORT spv_validator_options spvValidatorOptionsCreate(void); // Destroys the given Validator options object. -void spvValidatorOptionsDestroy(spv_validator_options options); +SPIRV_TOOLS_EXPORT void spvValidatorOptionsDestroy( + spv_validator_options options); // Records the maximum Universal Limit that is considered valid in the given // Validator options object. argument must be a valid options object. -void spvValidatorOptionsSetUniversalLimit(spv_validator_options options, - spv_validator_limit limit_type, - uint32_t limit); +SPIRV_TOOLS_EXPORT void spvValidatorOptionsSetUniversalLimit( + spv_validator_options options, spv_validator_limit limit_type, + uint32_t limit); // Record whether or not the validator should relax the rules on types for // stores to structs. When relaxed, it will allow a type mismatch as long as @@ -438,8 +460,8 @@ // // 2) the decorations that affect the memory layout are identical for both // types. Other decorations are not relevant. -void spvValidatorOptionsSetRelaxStoreStruct(spv_validator_options options, - bool val); +SPIRV_TOOLS_EXPORT void spvValidatorOptionsSetRelaxStoreStruct( + spv_validator_options options, bool val); // Records whether or not the validator should relax the rules on pointer usage // in logical addressing mode. @@ -447,77 +469,79 @@ // When relaxed, it will allow the following usage cases of pointers: // 1) OpVariable allocating an object whose type is a pointer type // 2) OpReturnValue returning a pointer value -void spvValidatorOptionsSetRelaxLogicalPointer(spv_validator_options options, - bool val); +SPIRV_TOOLS_EXPORT void spvValidatorOptionsSetRelaxLogicalPointer( + spv_validator_options options, bool val); // Encodes the given SPIR-V assembly text to its binary representation. The // length parameter specifies the number of bytes for text. Encoded binary will // be stored into *binary. Any error will be written into *diagnostic if // diagnostic is non-null. The generated binary is independent of the context // and may outlive it. -spv_result_t spvTextToBinary(const spv_const_context context, const char* text, - const size_t length, spv_binary* binary, - spv_diagnostic* diagnostic); +SPIRV_TOOLS_EXPORT spv_result_t spvTextToBinary(const spv_const_context context, + const char* text, + const size_t length, + spv_binary* binary, + spv_diagnostic* diagnostic); // Encodes the given SPIR-V assembly text to its binary representation. Same as // spvTextToBinary but with options. The options parameter is a bit field of // spv_text_to_binary_options_t. -spv_result_t spvTextToBinaryWithOptions(const spv_const_context context, - const char* text, const size_t length, - const uint32_t options, - spv_binary* binary, - spv_diagnostic* diagnostic); +SPIRV_TOOLS_EXPORT spv_result_t spvTextToBinaryWithOptions( + const spv_const_context context, const char* text, const size_t length, + const uint32_t options, spv_binary* binary, spv_diagnostic* diagnostic); // Frees an allocated text stream. This is a no-op if the text parameter // is a null pointer. -void spvTextDestroy(spv_text text); +SPIRV_TOOLS_EXPORT void spvTextDestroy(spv_text text); // Decodes the given SPIR-V binary representation to its assembly text. The // word_count parameter specifies the number of words for binary. The options // parameter is a bit field of spv_binary_to_text_options_t. Decoded text will // be stored into *text. Any error will be written into *diagnostic if // diagnostic is non-null. -spv_result_t spvBinaryToText(const spv_const_context context, - const uint32_t* binary, const size_t word_count, - const uint32_t options, spv_text* text, - spv_diagnostic* diagnostic); +SPIRV_TOOLS_EXPORT spv_result_t spvBinaryToText(const spv_const_context context, + const uint32_t* binary, + const size_t word_count, + const uint32_t options, + spv_text* text, + spv_diagnostic* diagnostic); // Frees a binary stream from memory. This is a no-op if binary is a null // pointer. -void spvBinaryDestroy(spv_binary binary); +SPIRV_TOOLS_EXPORT void spvBinaryDestroy(spv_binary binary); // Validates a SPIR-V binary for correctness. Any errors will be written into // *diagnostic if diagnostic is non-null. -spv_result_t spvValidate(const spv_const_context context, - const spv_const_binary binary, - spv_diagnostic* diagnostic); +SPIRV_TOOLS_EXPORT spv_result_t spvValidate(const spv_const_context context, + const spv_const_binary binary, + spv_diagnostic* diagnostic); // Validates a SPIR-V binary for correctness. Uses the provided Validator // options. Any errors will be written into *diagnostic if diagnostic is // non-null. -spv_result_t spvValidateWithOptions(const spv_const_context context, - const spv_const_validator_options options, - const spv_const_binary binary, - spv_diagnostic* diagnostic); +SPIRV_TOOLS_EXPORT spv_result_t spvValidateWithOptions( + const spv_const_context context, const spv_const_validator_options options, + const spv_const_binary binary, spv_diagnostic* diagnostic); // Validates a raw SPIR-V binary for correctness. Any errors will be written // into *diagnostic if diagnostic is non-null. -spv_result_t spvValidateBinary(const spv_const_context context, - const uint32_t* words, const size_t num_words, - spv_diagnostic* diagnostic); +SPIRV_TOOLS_EXPORT spv_result_t +spvValidateBinary(const spv_const_context context, const uint32_t* words, + const size_t num_words, spv_diagnostic* diagnostic); // Creates a diagnostic object. The position parameter specifies the location in // the text/binary stream. The message parameter, copied into the diagnostic // object, contains the error message to display. -spv_diagnostic spvDiagnosticCreate(const spv_position position, - const char* message); +SPIRV_TOOLS_EXPORT spv_diagnostic +spvDiagnosticCreate(const spv_position position, const char* message); // Destroys a diagnostic object. This is a no-op if diagnostic is a null // pointer. -void spvDiagnosticDestroy(spv_diagnostic diagnostic); +SPIRV_TOOLS_EXPORT void spvDiagnosticDestroy(spv_diagnostic diagnostic); // Prints the diagnostic to stderr. -spv_result_t spvDiagnosticPrint(const spv_diagnostic diagnostic); +SPIRV_TOOLS_EXPORT spv_result_t +spvDiagnosticPrint(const spv_diagnostic diagnostic); // The binary parser interface. @@ -550,11 +574,10 @@ // also emits a diagnostic. If a callback returns anything other than // SPV_SUCCESS, then that status code is returned, no further callbacks are // issued, and no additional diagnostics are emitted. -spv_result_t spvBinaryParse(const spv_const_context context, void* user_data, - const uint32_t* words, const size_t num_words, - spv_parsed_header_fn_t parse_header, - spv_parsed_instruction_fn_t parse_instruction, - spv_diagnostic* diagnostic); +SPIRV_TOOLS_EXPORT spv_result_t spvBinaryParse( + const spv_const_context context, void* user_data, const uint32_t* words, + const size_t num_words, spv_parsed_header_fn_t parse_header, + spv_parsed_instruction_fn_t parse_instruction, spv_diagnostic* diagnostic); #ifdef __cplusplus } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/include/spirv-tools/linker.hpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/include/spirv-tools/linker.hpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/include/spirv-tools/linker.hpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/include/spirv-tools/linker.hpp 2018-04-27 11:46:32.000000000 +0000 @@ -26,7 +26,10 @@ class LinkerOptions { public: - LinkerOptions() : create_library_(false), verify_ids_(false) {} + LinkerOptions() + : create_library_(false), + verify_ids_(false), + allow_partial_linkage_(false) {} // Returns whether a library or an executable should be produced by the // linking phase. @@ -50,9 +53,20 @@ // context. void SetVerifyIds(bool verify_ids) { verify_ids_ = verify_ids; } + // Returns whether to allow for imported symbols to have no corresponding + // exported symbols + bool GetAllowPartialLinkage() const { return allow_partial_linkage_; } + + // Sets whether to allow for imported symbols to have no corresponding + // exported symbols + void SetAllowPartialLinkage(bool allow_partial_linkage) { + allow_partial_linkage_ = allow_partial_linkage; + } + private: bool create_library_; bool verify_ids_; + bool allow_partial_linkage_; }; // Links one or more SPIR-V modules into a new SPIR-V module. That is, combine diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/include/spirv-tools/optimizer.hpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/include/spirv-tools/optimizer.hpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/include/spirv-tools/optimizer.hpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/include/spirv-tools/optimizer.hpp 2018-04-27 11:46:32.000000000 +0000 @@ -119,6 +119,11 @@ // output is sent to the |out| output stream. Optimizer& SetPrintAll(std::ostream* out); + // Sets the option to print the resource utilization of each pass. If |out| + // is null, then no output is generated. Otherwise, output is sent to the + // |out| output stream. + Optimizer& SetTimeReport(std::ostream* out); + private: struct Impl; // Opaque struct for holding internal data. std::unique_ptr impl_; // Unique pointer to internal data. @@ -133,6 +138,13 @@ // Section 3.32.2 of the SPIR-V spec) of the SPIR-V module to be optimized. Optimizer::PassToken CreateStripDebugInfoPass(); +// Creates a strip-reflect-info pass. +// A strip-reflect-info pass removes all reflections instructions. +// For now, this is limited to removing decorations defined in +// SPV_GOOGLE_hlsl_functionality1. The coverage may expand in +// the future. +Optimizer::PassToken CreateStripReflectInfoPass(); + // Creates an eliminate-dead-functions pass. // An eliminate-dead-functions pass will remove all functions that are not in // the call trees rooted at entry points and exported functions. These @@ -446,16 +458,19 @@ // that are not referenced. Optimizer::PassToken CreateDeadVariableEliminationPass(); -// Create merge return pass. -// This pass replaces all returns with unconditional branches to a new block -// containing a return. If necessary, this new block will contain a PHI node to -// select the correct return value. -// -// This pass does not consider unreachable code, nor does it perform any other -// optimizations. +// create merge return pass. +// changes functions that have multiple return statements so they have a single +// return statement. +// +// for structured control flow it is assumed that the only unreachable blocks in +// the function are trivial merge and continue blocks. +// +// a trivial merge block contains the label and an opunreachable instructions, +// nothing else. a trivial continue block contain a label and an opbranch to +// the header, nothing else. // -// This pass does not currently support structured control flow. It bails out if -// the shader capability is detected. +// these conditions are guaranteed to be met after running dead-branch +// elimination. Optimizer::PassToken CreateMergeReturnPass(); // Create value numbering pass. @@ -463,6 +478,17 @@ // same value, and remove the redundant ones. Optimizer::PassToken CreateLocalRedundancyEliminationPass(); +// Create LICM pass. +// This pass will look for invariant instructions inside loops and hoist them to +// the loops preheader. +Optimizer::PassToken CreateLoopInvariantCodeMotionPass(); + +// Creates a loop unswitch pass. +// This pass will look for loop independent branch conditions and move the +// condition out of the loop and version the loop based on the taken branch. +// Works best after LICM and local multi store elimination pass. +Optimizer::PassToken CreateLoopUnswitchPass(); + // Create global value numbering pass. // This pass will look for instructions where the same value is computed on all // paths leading to the instruction. Those instructions are deleted. @@ -504,6 +530,28 @@ // current shader stage by constants. Has no effect on non-shader modules. Optimizer::PassToken CreateReplaceInvalidOpcodePass(); +// Creates a pass that simplifies instructions using the instruction folder. +Optimizer::PassToken CreateSimplificationPass(); + +// Create loop unroller pass. +// Creates a pass to unroll loops which have the "Unroll" loop control +// mask set. The loops must meet a specific criteria in order to be unrolled +// safely this criteria is checked before doing the unroll by the +// LoopUtils::CanPerformUnroll method. Any loop that does not meet the criteria +// won't be unrolled. See CanPerformUnroll LoopUtils.h for more information. +Optimizer::PassToken CreateLoopUnrollPass(bool fully_unroll, int factor = 0); + +// Create the SSA rewrite pass. +// This pass converts load/store operations on function local variables into +// operations on SSA IDs. This allows SSA optimizers to act on these variables. +// Only variables that are local to the function and of supported types are +// processed (see IsSSATargetVar for details). +Optimizer::PassToken CreateSSARewritePass(); + +// Create copy propagate arrays pass. +// This pass looks to copy propagate memory references for arrays. It looks +// for specific code patterns to recognize array copies. +Optimizer::PassToken CreateCopyPropagateArraysPass(); } // namespace spvtools #endif // SPIRV_TOOLS_OPTIMIZER_HPP_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/README.md vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/README.md --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/README.md 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/README.md 2018-04-27 11:46:32.000000000 +0000 @@ -22,7 +22,7 @@ See the [SPIR-V Registry][spirv-registry] for the SPIR-V specification, headers, and XML registry. -## Verisoning SPIRV-Tools +## Versioning SPIRV-Tools See [`CHANGES`](CHANGES) for a high level summary of recent changes, by version. @@ -43,7 +43,7 @@ ### Assembler, binary parser, and disassembler -* Support for SPIR-V 1.0, 1.1, 1.2 +* Support for SPIR-V 1.0, 1.1, 1.2, and 1.3 * Based on SPIR-V syntax described by JSON grammar files in the [SPIRV-Headers](spirv-headers) repository. * Support for extended instruction sets: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/assembly_grammar.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/assembly_grammar.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/assembly_grammar.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/assembly_grammar.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -39,7 +39,8 @@ /// @param[out] pValue where the resulting value is written /// /// @return result code -spv_result_t spvTextParseMaskOperand(const spv_operand_table operandTable, +spv_result_t spvTextParseMaskOperand(spv_target_env env, + const spv_operand_table operandTable, const spv_operand_type_t type, const char* textValue, uint32_t* pValue) { if (textValue == nullptr) return SPV_ERROR_INVALID_TEXT; @@ -60,7 +61,7 @@ end = std::find(begin, text_end, separator); spv_operand_desc entry = nullptr; - if (spvOperandTableNameLookup(operandTable, type, begin, end - begin, + if (spvOperandTableNameLookup(env, operandTable, type, begin, end - begin, &entry)) { return SPV_ERROR_INVALID_TEXT; } @@ -171,26 +172,45 @@ return operandTable_ && opcodeTable_ && extInstTable_; } +CapabilitySet AssemblyGrammar::filterCapsAgainstTargetEnv( + const SpvCapability* cap_array, uint32_t count) const { + CapabilitySet cap_set; + for (uint32_t i = 0; i < count; ++i) { + spv_operand_desc cap_desc = {}; + if (SPV_SUCCESS == lookupOperand(SPV_OPERAND_TYPE_CAPABILITY, + static_cast(cap_array[i]), + &cap_desc)) { + // spvOperandTableValueLookup() filters capabilities internally + // according to the current target environment by itself. So we + // should be safe to add this capability if the lookup succeeds. + cap_set.Add(cap_array[i]); + } + } + return cap_set; +} + spv_result_t AssemblyGrammar::lookupOpcode(const char* name, spv_opcode_desc* desc) const { - return spvOpcodeTableNameLookup(opcodeTable_, name, desc); + return spvOpcodeTableNameLookup(target_env_, opcodeTable_, name, desc); } spv_result_t AssemblyGrammar::lookupOpcode(SpvOp opcode, spv_opcode_desc* desc) const { - return spvOpcodeTableValueLookup(opcodeTable_, opcode, desc); + return spvOpcodeTableValueLookup(target_env_, opcodeTable_, opcode, desc); } spv_result_t AssemblyGrammar::lookupOperand(spv_operand_type_t type, const char* name, size_t name_len, spv_operand_desc* desc) const { - return spvOperandTableNameLookup(operandTable_, type, name, name_len, desc); + return spvOperandTableNameLookup(target_env_, operandTable_, type, name, + name_len, desc); } spv_result_t AssemblyGrammar::lookupOperand(spv_operand_type_t type, uint32_t operand, spv_operand_desc* desc) const { - return spvOperandTableValueLookup(operandTable_, type, operand, desc); + return spvOperandTableValueLookup(target_env_, operandTable_, type, operand, + desc); } spv_result_t AssemblyGrammar::lookupSpecConstantOpcode(const char* name, @@ -220,7 +240,8 @@ spv_result_t AssemblyGrammar::parseMaskOperand(const spv_operand_type_t type, const char* textValue, uint32_t* pValue) const { - return spvTextParseMaskOperand(operandTable_, type, textValue, pValue); + return spvTextParseMaskOperand(target_env_, operandTable_, type, textValue, + pValue); } spv_result_t AssemblyGrammar::lookupExtInst(spv_ext_inst_type_t type, const char* textValue, @@ -237,6 +258,6 @@ void AssemblyGrammar::pushOperandTypesForMask( const spv_operand_type_t type, const uint32_t mask, spv_operand_pattern_t* pattern) const { - spvPushOperandTypesForMask(operandTable_, type, mask, pattern); + spvPushOperandTypesForMask(target_env_, operandTable_, type, mask, pattern); } } // namespace libspirv diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/assembly_grammar.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/assembly_grammar.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/assembly_grammar.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/assembly_grammar.h 2018-04-27 11:46:32.000000000 +0000 @@ -15,6 +15,7 @@ #ifndef LIBSPIRV_ASSEMBLY_GRAMMAR_H_ #define LIBSPIRV_ASSEMBLY_GRAMMAR_H_ +#include "enum_set.h" #include "latest_version_spirv_header.h" #include "operand.h" #include "spirv-tools/libspirv.h" @@ -38,6 +39,11 @@ // Returns the SPIR-V target environment. spv_target_env target_env() const { return target_env_; } + // Removes capabilities not available in the current target environment and + // returns the rest. + CapabilitySet filterCapsAgainstTargetEnv(const SpvCapability* cap_array, + uint32_t count) const; + // Fills in the desc parameter with the information about the opcode // of the given name. Returns SPV_SUCCESS if the opcode was found, and // SPV_ERROR_INVALID_LOOKUP if the opcode does not exist. @@ -60,6 +66,17 @@ spv_result_t lookupOperand(spv_operand_type_t type, uint32_t operand, spv_operand_desc* desc) const; + // Finds operand entry in the grammar table and returns its name. + // Returns "Unknown" if not found. + const char* lookupOperandName(spv_operand_type_t type, + uint32_t operand) const { + spv_operand_desc desc = nullptr; + if (lookupOperand(type, operand, &desc) != SPV_SUCCESS || !desc) { + return "Unknown"; + } + return desc->name; + } + // Finds the opcode for the given OpSpecConstantOp opcode name. The name // should not have the "Op" prefix. For example, "IAdd" corresponds to // the integer add opcode for OpSpecConstantOp. On success, returns diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/binary.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/binary.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/binary.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/binary.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -25,9 +25,9 @@ #include "assembly_grammar.h" #include "diagnostic.h" #include "ext_inst.h" +#include "latest_version_spirv_header.h" #include "opcode.h" #include "operand.h" -#include "spirv/1.2/spirv.h" #include "spirv_constant.h" #include "spirv_endian.h" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/cfa.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/cfa.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/cfa.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/cfa.h 2018-04-27 11:46:32.000000000 +0000 @@ -331,7 +331,7 @@ augmented_succ.push_back(pseudo_exit_block); augmented_succ.insert(augmented_succ.end(), succ->begin(), succ->end()); } -}; +} } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/CMakeLists.txt 2018-04-27 11:46:32.000000000 +0000 @@ -66,7 +66,7 @@ add_custom_command(OUTPUT ${VIMSYNTAX_FILE} COMMAND ${PYTHON_EXECUTABLE} ${VIMSYNTAX_PROCESSING_SCRIPT} --spirv-core-grammar=${GRAMMAR_JSON_FILE} - --exinst-debuginfo-grammar=${DEBUGINFO_GRAMMAR_JSON_FILE} + --extinst-debuginfo-grammar=${DEBUGINFO_GRAMMAR_JSON_FILE} --extinst-glsl-grammar=${GLSL_GRAMMAR_JSON_FILE} --extinst-opencl-grammar=${OPENCL_GRAMMAR_JSON_FILE} >${VIMSYNTAX_FILE} @@ -130,13 +130,10 @@ set_property(TARGET spirv-tools-header-${NAME} PROPERTY FOLDER "SPIRV-Tools build") endmacro(spvtools_extinst_lang_headers) - -spvtools_core_tables("1.0") -spvtools_core_tables("1.1") -spvtools_core_tables("1.2") -spvtools_enum_string_mapping("1.2") -spvtools_opencl_tables("1.2") -spvtools_glsl_tables("1.2") +spvtools_core_tables("unified1") +spvtools_enum_string_mapping("unified1") +spvtools_opencl_tables("unified1") +spvtools_glsl_tables("unified1") spvtools_vendor_tables("spv-amd-shader-explicit-vertex-parameter") spvtools_vendor_tables("spv-amd-shader-trinary-minmax") spvtools_vendor_tables("spv-amd-gcn-shader") @@ -144,7 +141,7 @@ spvtools_vendor_tables("debuginfo") spvtools_extinst_lang_headers("DebugInfo" ${DEBUGINFO_GRAMMAR_JSON_FILE}) -spvtools_vimsyntax("1.2" "1.0") +spvtools_vimsyntax("unified1" "1.0") add_custom_target(spirv-tools-vimsyntax DEPENDS ${VIMSYNTAX_FILE}) set_property(TARGET spirv-tools-vimsyntax PROPERTY FOLDER "SPIRV-Tools utilities") @@ -224,6 +221,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}/util/hex_float.h ${CMAKE_CURRENT_SOURCE_DIR}/util/parse_number.h ${CMAKE_CURRENT_SOURCE_DIR}/util/string_utils.h + ${CMAKE_CURRENT_SOURCE_DIR}/util/timer.h ${CMAKE_CURRENT_SOURCE_DIR}/assembly_grammar.h ${CMAKE_CURRENT_SOURCE_DIR}/binary.h ${CMAKE_CURRENT_SOURCE_DIR}/cfa.h @@ -286,6 +284,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}/validate_atomics.cpp ${CMAKE_CURRENT_SOURCE_DIR}/validate_barriers.cpp ${CMAKE_CURRENT_SOURCE_DIR}/validate_bitwise.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/validate_builtins.cpp ${CMAKE_CURRENT_SOURCE_DIR}/validate_capability.cpp ${CMAKE_CURRENT_SOURCE_DIR}/validate_cfg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/validate_composites.cpp @@ -309,6 +308,12 @@ ${CMAKE_CURRENT_SOURCE_DIR}/val/instruction.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/validation_state.cpp) +if (${SPIRV_TIMER_ENABLED}) + set(SPIRV_SOURCES + ${SPIRV_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/util/timer.cpp) +endif() + # The software_version.cpp file includes build-version.inc. # Rebuild the software_version.cpp object file if it is older than # build-version.inc or whenever build-version.inc itself is out of @@ -334,8 +339,23 @@ set_property(TARGET ${SPIRV_TOOLS} PROPERTY FOLDER "SPIRV-Tools libraries") spvtools_check_symbol_exports(${SPIRV_TOOLS}) +add_library(${SPIRV_TOOLS}-shared SHARED ${SPIRV_SOURCES}) +spvtools_default_compile_options(${SPIRV_TOOLS}-shared) +target_include_directories(${SPIRV_TOOLS}-shared + PUBLIC ${spirv-tools_SOURCE_DIR}/include + PRIVATE ${spirv-tools_BINARY_DIR} + PRIVATE ${SPIRV_HEADER_INCLUDE_DIR} + ) +set_target_properties(${SPIRV_TOOLS}-shared PROPERTIES CXX_VISIBILITY_PRESET hidden) +set_property(TARGET ${SPIRV_TOOLS}-shared PROPERTY FOLDER "SPIRV-Tools libraries") +spvtools_check_symbol_exports(${SPIRV_TOOLS}-shared) +target_compile_definitions(${SPIRV_TOOLS}-shared + PRIVATE SPIRV_TOOLS_IMPLEMENTATION + PUBLIC SPIRV_TOOLS_SHAREDLIB +) + if(ENABLE_SPIRV_TOOLS_INSTALL) - install(TARGETS ${SPIRV_TOOLS} + install(TARGETS ${SPIRV_TOOLS} ${SPIRV_TOOLS}-shared RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/enum_string_mapping.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/enum_string_mapping.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/enum_string_mapping.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/enum_string_mapping.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -14,7 +14,9 @@ #include "enum_string_mapping.h" +#include #include +#include #include #include diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/enum_string_mapping.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/enum_string_mapping.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/enum_string_mapping.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/enum_string_mapping.h 2018-04-27 11:46:32.000000000 +0000 @@ -17,20 +17,19 @@ #include -#include "spirv/1.1/spirv.h" - #include "extensions.h" +#include "latest_version_spirv_header.h" namespace libspirv { // Finds Extension enum corresponding to |str|. Returns false if not found. -bool GetExtensionFromString(const std::string& str, Extension* extension); +bool GetExtensionFromString(const char* str, Extension* extension); // Returns text string corresponding to |extension|. -std::string ExtensionToString(Extension extension); +const char* ExtensionToString(Extension extension); // Returns text string corresponding to |capability|. -std::string CapabilityToString(SpvCapability capability); +const char* CapabilityToString(SpvCapability capability); } // namespace libspirv diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/ext_inst.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/ext_inst.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/ext_inst.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/ext_inst.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -79,6 +79,8 @@ case SPV_ENV_OPENGL_4_2: case SPV_ENV_OPENGL_4_3: case SPV_ENV_OPENGL_4_5: + case SPV_ENV_UNIVERSAL_1_3: + case SPV_ENV_VULKAN_1_1: *pExtInstTable = &kTable_1_0; return SPV_SUCCESS; default: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/link/linker.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/link/linker.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/link/linker.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/link/linker.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -37,8 +37,8 @@ namespace spvtools { -using ir::IRContext; using ir::Instruction; +using ir::IRContext; using ir::Module; using ir::Operand; using opt::PassManager; @@ -110,7 +110,8 @@ static spv_result_t GetImportExportPairs( const MessageConsumer& consumer, const ir::IRContext& linked_context, const DefUseManager& def_use_manager, - const DecorationManager& decoration_manager, LinkageTable* linkings_to_do); + const DecorationManager& decoration_manager, bool allow_partial_linkage, + LinkageTable* linkings_to_do); // Checks that for each pair of import and export, the import and export have // the same type as well as the same decorations. @@ -134,7 +135,7 @@ // TODO(pierremoreau): Run a pass for removing dead instructions, for example // OpName for prototypes of imported funcions. static spv_result_t RemoveLinkageSpecificInstructions( - const MessageConsumer& consumer, bool create_executable, + const MessageConsumer& consumer, const LinkerOptions& options, const LinkageTable& linkings_to_do, DecorationManager* decoration_manager, ir::IRContext* linked_context); @@ -222,9 +223,10 @@ // Phase 4: Find the import/export pairs LinkageTable linkings_to_do; - res = GetImportExportPairs( - consumer, linked_context, *linked_context.get_def_use_mgr(), - *linked_context.get_decoration_mgr(), &linkings_to_do); + res = GetImportExportPairs(consumer, linked_context, + *linked_context.get_def_use_mgr(), + *linked_context.get_decoration_mgr(), + options.GetAllowPartialLinkage(), &linkings_to_do); if (res != SPV_SUCCESS) return res; // Phase 5: Ensure the import and export have the same types and decorations. @@ -246,9 +248,9 @@ // Phase 8: Remove linkage specific instructions, such as import/export // attributes, linkage capability, etc. if applicable - res = RemoveLinkageSpecificInstructions( - consumer, !options.GetCreateLibrary(), linkings_to_do, - linked_context.get_decoration_mgr(), &linked_context); + res = RemoveLinkageSpecificInstructions(consumer, options, linkings_to_do, + linked_context.get_decoration_mgr(), + &linked_context); if (res != SPV_SUCCESS) return res; // Phase 9: Compact the IDs used in the module @@ -446,6 +448,24 @@ std::unique_ptr(inst.Clone(linked_context))); for (const auto& module : input_modules) + for (const auto& inst : module->debugs3()) + linked_module->AddDebug3Inst( + std::unique_ptr(inst.Clone(linked_context))); + + // If the generated module uses SPIR-V 1.1 or higher, add an + // OpModuleProcessed instruction about the linking step. + if (linked_module->version() >= 0x10100) { + const std::string processed_string("Linked by SPIR-V Tools Linker"); + const size_t words_nb = + processed_string.size() / 4u + (processed_string.size() % 4u != 0u); + std::vector processed_words(words_nb, 0u); + std::memcpy(processed_words.data(), processed_string.data(), words_nb * 4u); + linked_module->AddDebug3Inst(std::unique_ptr( + new Instruction(linked_context, SpvOpModuleProcessed, 0u, 0u, + {{SPV_OPERAND_TYPE_LITERAL_STRING, processed_words}}))); + } + + for (const auto& module : input_modules) for (const auto& inst : module->annotations()) linked_module->AddAnnotationInst( std::unique_ptr(inst.Clone(linked_context))); @@ -481,7 +501,8 @@ static spv_result_t GetImportExportPairs( const MessageConsumer& consumer, const ir::IRContext& linked_context, const DefUseManager& def_use_manager, - const DecorationManager& decoration_manager, LinkageTable* linkings_to_do) { + const DecorationManager& decoration_manager, bool allow_partial_linkage, + LinkageTable* linkings_to_do) { spv_position_t position = {}; if (linkings_to_do == nullptr) @@ -561,7 +582,7 @@ std::vector possible_exports; const auto& exp = exports.find(import.name); if (exp != exports.end()) possible_exports = exp->second; - if (possible_exports.empty()) + if (possible_exports.empty() && !allow_partial_linkage) return libspirv::DiagnosticStream(position, consumer, SPV_ERROR_INVALID_BINARY) << "Unresolved external reference to \"" << import.name << "\"."; @@ -571,7 +592,8 @@ << "Too many external references, " << possible_exports.size() << ", were found for \"" << import.name << "\"."; - linkings_to_do->emplace_back(import, possible_exports.front()); + if (!possible_exports.empty()) + linkings_to_do->emplace_back(import, possible_exports.front()); } return SPV_SUCCESS; @@ -623,7 +645,7 @@ } static spv_result_t RemoveLinkageSpecificInstructions( - const MessageConsumer& consumer, bool create_executable, + const MessageConsumer& consumer, const LinkerOptions& options, const LinkageTable& linkings_to_do, DecorationManager* decoration_manager, ir::IRContext* linked_context) { spv_position_t position = {}; @@ -650,19 +672,13 @@ for (const auto& linking_entry : linkings_to_do) { for (const auto parameter_id : linking_entry.imported_symbol.parameter_ids) { - for (ir::Instruction* decoration : - decoration_manager->GetDecorationsFor(parameter_id, false)) { - switch (decoration->opcode()) { - case SpvOpDecorate: - case SpvOpMemberDecorate: - if (decoration->GetSingleWordInOperand(1u) == - SpvDecorationFuncParamAttr) - linked_context->KillInst(decoration); - break; - default: - break; - } - } + decoration_manager->RemoveDecorationsFrom( + parameter_id, [](const Instruction& inst) { + return (inst.opcode() == SpvOpDecorate || + inst.opcode() == SpvOpMemberDecorate) && + inst.GetSingleWordInOperand(1u) == + SpvDecorationFuncParamAttr; + }); } } @@ -689,21 +705,40 @@ } } + // If partial linkage is allowed, we need an efficient way to check whether + // an imported ID had a corresponding export symbol. As uses of the imported + // symbol have already been replaced by the exported symbol, use the exported + // symbol ID. + // TODO(pierremoreau): This will not work if the decoration is applied + // through a group, but the linker does not support that + // either. + std::unordered_set imports; + if (options.GetAllowPartialLinkage()) { + imports.reserve(linkings_to_do.size()); + for (const auto& linking_entry : linkings_to_do) + imports.emplace(linking_entry.exported_symbol.id); + } + // Remove import linkage attributes auto next = linked_context->annotation_begin(); for (auto inst = next; inst != linked_context->annotation_end(); inst = next) { ++next; + // If this is an import annotation: + // * if we do not allow partial linkage, remove all import annotations; + // * otherwise, remove the annotation only if there was a corresponding + // export. if (inst->opcode() == SpvOpDecorate && inst->GetSingleWordOperand(1u) == SpvDecorationLinkageAttributes && - inst->GetSingleWordOperand(3u) == SpvLinkageTypeImport) { + inst->GetSingleWordOperand(3u) == SpvLinkageTypeImport && + (!options.GetAllowPartialLinkage() || + imports.find(inst->GetSingleWordOperand(0u)) != imports.end())) { linked_context->KillInst(&*inst); } } - // Remove export linkage attributes and Linkage capability if making an - // executable - if (create_executable) { + // Remove export linkage attributes if making an executable + if (!options.GetCreateLibrary()) { next = linked_context->annotation_begin(); for (auto inst = next; inst != linked_context->annotation_end(); inst = next) { @@ -714,7 +749,11 @@ linked_context->KillInst(&*inst); } } + } + // Remove Linkage capability if making an executable and partial linkage is + // not allowed + if (!options.GetCreateLibrary() && !options.GetAllowPartialLinkage()) { for (auto& inst : linked_context->capabilities()) if (inst.GetSingleWordInOperand(0u) == SpvCapabilityLinkage) { linked_context->KillInst(&inst); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/name_mapper.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/name_mapper.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/name_mapper.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/name_mapper.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -23,8 +23,8 @@ #include #include "spirv-tools/libspirv.h" -#include "spirv/1.2/spirv.h" +#include "latest_version_spirv_header.h" #include "parsed_operand.h" namespace { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opcode.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opcode.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opcode.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opcode.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -32,16 +32,10 @@ uint32_t len; }; -#include "core.insts-1.0.inc" // defines kOpcodeTableEntries_1_0 -#include "core.insts-1.1.inc" // defines kOpcodeTableEntries_1_1 -#include "core.insts-1.2.inc" // defines kOpcodeTableEntries_1_2 - -static const spv_opcode_table_t kTable_1_0 = { - ARRAY_SIZE(kOpcodeTableEntries_1_0), kOpcodeTableEntries_1_0}; -static const spv_opcode_table_t kTable_1_1 = { - ARRAY_SIZE(kOpcodeTableEntries_1_1), kOpcodeTableEntries_1_1}; -static const spv_opcode_table_t kTable_1_2 = { - ARRAY_SIZE(kOpcodeTableEntries_1_2), kOpcodeTableEntries_1_2}; +#include "core.insts-unified1.inc" // defines kOpcodeTableEntries_1_3 + +static const spv_opcode_table_t kOpcodeTable = {ARRAY_SIZE(kOpcodeTableEntries), + kOpcodeTableEntries}; // Represents a vendor tool entry in the SPIR-V XML Regsitry. struct VendorTool { @@ -81,43 +75,18 @@ } } -spv_result_t spvOpcodeTableGet(spv_opcode_table* pInstTable, - spv_target_env env) { +spv_result_t spvOpcodeTableGet(spv_opcode_table* pInstTable, spv_target_env) { if (!pInstTable) return SPV_ERROR_INVALID_POINTER; // Descriptions of each opcode. Each entry describes the format of the // instruction that follows a particular opcode. - switch (env) { - case SPV_ENV_UNIVERSAL_1_0: - case SPV_ENV_VULKAN_1_0: - case SPV_ENV_OPENCL_1_2: - case SPV_ENV_OPENCL_EMBEDDED_1_2: - case SPV_ENV_OPENCL_2_0: - case SPV_ENV_OPENCL_EMBEDDED_2_0: - case SPV_ENV_OPENCL_2_1: - case SPV_ENV_OPENCL_EMBEDDED_2_1: - case SPV_ENV_OPENGL_4_0: - case SPV_ENV_OPENGL_4_1: - case SPV_ENV_OPENGL_4_2: - case SPV_ENV_OPENGL_4_3: - case SPV_ENV_OPENGL_4_5: - *pInstTable = &kTable_1_0; - return SPV_SUCCESS; - case SPV_ENV_UNIVERSAL_1_1: - *pInstTable = &kTable_1_1; - return SPV_SUCCESS; - case SPV_ENV_UNIVERSAL_1_2: - case SPV_ENV_OPENCL_2_2: - case SPV_ENV_OPENCL_EMBEDDED_2_2: - *pInstTable = &kTable_1_2; - return SPV_SUCCESS; - } - assert(0 && "Unknown spv_target_env in spvOpcodeTableGet()"); - return SPV_ERROR_INVALID_TABLE; + *pInstTable = &kOpcodeTable; + return SPV_SUCCESS; } -spv_result_t spvOpcodeTableNameLookup(const spv_opcode_table table, +spv_result_t spvOpcodeTableNameLookup(spv_target_env env, + const spv_opcode_table table, const char* name, spv_opcode_desc* pEntry) { if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER; @@ -125,14 +94,24 @@ // TODO: This lookup of the Opcode table is suboptimal! Binary sort would be // preferable but the table requires sorting on the Opcode name, but it's - // static - // const initialized and matches the order of the spec. + // static const initialized and matches the order of the spec. const size_t nameLength = strlen(name); for (uint64_t opcodeIndex = 0; opcodeIndex < table->count; ++opcodeIndex) { - if (nameLength == strlen(table->entries[opcodeIndex].name) && - !strncmp(name, table->entries[opcodeIndex].name, nameLength)) { + const spv_opcode_desc_t& entry = table->entries[opcodeIndex]; + // We considers the current opcode as available as long as + // 1. The target environment satisfies the minimal requirement of the + // opcode; or + // 2. There is at least one extension enabling this opcode. + // + // Note that the second rule assumes the extension enabling this instruction + // is indeed requested in the SPIR-V code; checking that should be + // validator's work. + if ((spvVersionForTargetEnv(env) >= entry.minVersion || + entry.numExtensions > 0u) && + nameLength == strlen(entry.name) && + !strncmp(name, entry.name, nameLength)) { // NOTE: Found out Opcode! - *pEntry = &table->entries[opcodeIndex]; + *pEntry = &entry; return SPV_SUCCESS; } } @@ -140,7 +119,8 @@ return SPV_ERROR_INVALID_LOOKUP; } -spv_result_t spvOpcodeTableValueLookup(const spv_opcode_table table, +spv_result_t spvOpcodeTableValueLookup(spv_target_env env, + const spv_opcode_table table, const SpvOp opcode, spv_opcode_desc* pEntry) { if (!table) return SPV_ERROR_INVALID_TABLE; @@ -148,14 +128,34 @@ const auto beg = table->entries; const auto end = table->entries + table->count; - spv_opcode_desc_t value{"", opcode, 0, nullptr, 0, {}, 0, 0}; + + spv_opcode_desc_t needle = {"", opcode, 0, nullptr, 0, {}, + false, false, 0, nullptr, ~0u}; + auto comp = [](const spv_opcode_desc_t& lhs, const spv_opcode_desc_t& rhs) { return lhs.opcode < rhs.opcode; }; - auto it = std::lower_bound(beg, end, value, comp); - if (it != end && it->opcode == opcode) { - *pEntry = it; - return SPV_SUCCESS; + + // We need to loop here because there can exist multiple symbols for the same + // opcode value, and they can be introduced in different target environments, + // which means they can have different minimal version requirements. + // Assumes the underlying table is already sorted ascendingly according to + // opcode value. + for (auto it = std::lower_bound(beg, end, needle, comp); + it != end && it->opcode == opcode; ++it) { + // We considers the current opcode as available as long as + // 1. The target environment satisfies the minimal requirement of the + // opcode; or + // 2. There is at least one extension enabling this opcode. + // + // Note that the second rule assumes the extension enabling this instruction + // is indeed requested in the SPIR-V code; checking that should be + // validator's work. + if (spvVersionForTargetEnv(env) >= it->minVersion || + it->numExtensions > 0u) { + *pEntry = it; + return SPV_SUCCESS; + } } return SPV_ERROR_INVALID_LOOKUP; @@ -179,17 +179,14 @@ } const char* spvOpcodeString(const SpvOp opcode) { - // Use the latest SPIR-V version, which should be backward-compatible with all - // previous ones. - - const auto beg = kOpcodeTableEntries_1_2; - const auto end = - kOpcodeTableEntries_1_2 + ARRAY_SIZE(kOpcodeTableEntries_1_2); - spv_opcode_desc_t value{"", opcode, 0, nullptr, 0, {}, 0, 0}; + const auto beg = kOpcodeTableEntries; + const auto end = kOpcodeTableEntries + ARRAY_SIZE(kOpcodeTableEntries); + spv_opcode_desc_t needle = {"", opcode, 0, nullptr, 0, {}, + false, false, 0, nullptr, ~0u}; auto comp = [](const spv_opcode_desc_t& lhs, const spv_opcode_desc_t& rhs) { return lhs.opcode < rhs.opcode; }; - auto it = std::lower_bound(beg, end, value, comp); + auto it = std::lower_bound(beg, end, needle, comp); if (it != end && it->opcode == opcode) { return it->name; } @@ -209,6 +206,19 @@ } } +int32_t spvOpcodeIsSpecConstant(const SpvOp opcode) { + switch (opcode) { + case SpvOpSpecConstantTrue: + case SpvOpSpecConstantFalse: + case SpvOpSpecConstant: + case SpvOpSpecConstantComposite: + case SpvOpSpecConstantOp: + return true; + default: + return false; + } +} + int32_t spvOpcodeIsConstant(const SpvOp opcode) { switch (opcode) { case SpvOpConstantTrue: @@ -330,6 +340,8 @@ case SpvOpMemberDecorate: case SpvOpGroupDecorate: case SpvOpGroupMemberDecorate: + case SpvOpDecorateStringGOOGLE: + case SpvOpMemberDecorateStringGOOGLE: return true; default: break; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opcode.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opcode.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opcode.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opcode.h 2018-04-27 11:46:32.000000000 +0000 @@ -37,12 +37,14 @@ // Finds the named opcode in the given opcode table. On success, returns // SPV_SUCCESS and writes a handle of the table entry into *entry. -spv_result_t spvOpcodeTableNameLookup(const spv_opcode_table table, +spv_result_t spvOpcodeTableNameLookup(spv_target_env, + const spv_opcode_table table, const char* name, spv_opcode_desc* entry); // Finds the opcode by enumerant in the given opcode table. On success, returns // SPV_SUCCESS and writes a handle of the table entry into *entry. -spv_result_t spvOpcodeTableValueLookup(const spv_opcode_table table, +spv_result_t spvOpcodeTableValueLookup(spv_target_env, + const spv_opcode_table table, const SpvOp opcode, spv_opcode_desc* entry); @@ -61,6 +63,10 @@ // non-zero otherwise. int32_t spvOpcodeIsScalarType(const SpvOp opcode); +// Determines if the given opcode is a specialization constant. Returns zero if +// false, non-zero otherwise. +int32_t spvOpcodeIsSpecConstant(const SpvOp opcode); + // Determines if the given opcode is a constant. Returns zero if false, non-zero // otherwise. int32_t spvOpcodeIsConstant(const SpvOp opcode); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/operand.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/operand.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/operand.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/operand.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -19,57 +19,29 @@ #include #include "macro.h" +#include "spirv_constant.h" -#include "operand.kinds-1.0.inc" -#include "operand.kinds-1.1.inc" -#include "operand.kinds-1.2.inc" - -static const spv_operand_table_t kTable_1_0 = { - ARRAY_SIZE(pygen_variable_OperandInfoTable_1_0), - pygen_variable_OperandInfoTable_1_0}; -static const spv_operand_table_t kTable_1_1 = { - ARRAY_SIZE(pygen_variable_OperandInfoTable_1_1), - pygen_variable_OperandInfoTable_1_1}; -static const spv_operand_table_t kTable_1_2 = { - ARRAY_SIZE(pygen_variable_OperandInfoTable_1_2), - pygen_variable_OperandInfoTable_1_2}; +// For now, assume unified1 contains up to SPIR-V 1.3 and no later +// SPIR-V version. +// TODO(dneto): Make one set of tables, but with version tags on a +// per-item basis. https://github.com/KhronosGroup/SPIRV-Tools/issues/1195 + +#include "operand.kinds-unified1.inc" + +static const spv_operand_table_t kOperandTable = { + ARRAY_SIZE(pygen_variable_OperandInfoTable), + pygen_variable_OperandInfoTable}; spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable, - spv_target_env env) { + spv_target_env) { if (!pOperandTable) return SPV_ERROR_INVALID_POINTER; - switch (env) { - case SPV_ENV_UNIVERSAL_1_0: - case SPV_ENV_VULKAN_1_0: - case SPV_ENV_OPENCL_1_2: - case SPV_ENV_OPENCL_EMBEDDED_1_2: - case SPV_ENV_OPENCL_2_0: - case SPV_ENV_OPENCL_EMBEDDED_2_0: - case SPV_ENV_OPENCL_2_1: - case SPV_ENV_OPENCL_EMBEDDED_2_1: - case SPV_ENV_OPENGL_4_0: - case SPV_ENV_OPENGL_4_1: - case SPV_ENV_OPENGL_4_2: - case SPV_ENV_OPENGL_4_3: - case SPV_ENV_OPENGL_4_5: - *pOperandTable = &kTable_1_0; - return SPV_SUCCESS; - case SPV_ENV_UNIVERSAL_1_1: - *pOperandTable = &kTable_1_1; - return SPV_SUCCESS; - case SPV_ENV_UNIVERSAL_1_2: - case SPV_ENV_OPENCL_2_2: - case SPV_ENV_OPENCL_EMBEDDED_2_2: - *pOperandTable = &kTable_1_2; - return SPV_SUCCESS; - } - assert(0 && "Unknown spv_target_env in spvOperandTableGet()"); - return SPV_ERROR_INVALID_TABLE; + *pOperandTable = &kOperandTable; + return SPV_SUCCESS; } -#undef ARRAY_SIZE - -spv_result_t spvOperandTableNameLookup(const spv_operand_table table, +spv_result_t spvOperandTableNameLookup(spv_target_env env, + const spv_operand_table table, const spv_operand_type_t type, const char* name, const size_t nameLength, @@ -82,7 +54,17 @@ if (type != group.type) continue; for (uint64_t index = 0; index < group.count; ++index) { const auto& entry = group.entries[index]; - if (nameLength == strlen(entry.name) && + // We considers the current operand as available as long as + // 1. The target environment satisfies the minimal requirement of the + // operand; or + // 2. There is at least one extension enabling this operand. + // + // Note that the second rule assumes the extension enabling this operand + // is indeed requested in the SPIR-V code; checking that should be + // validator's work. + if ((spvVersionForTargetEnv(env) >= entry.minVersion || + entry.numExtensions > 0u) && + nameLength == strlen(entry.name) && !strncmp(entry.name, name, nameLength)) { *pEntry = &entry; return SPV_SUCCESS; @@ -93,20 +75,50 @@ return SPV_ERROR_INVALID_LOOKUP; } -spv_result_t spvOperandTableValueLookup(const spv_operand_table table, +spv_result_t spvOperandTableValueLookup(spv_target_env env, + const spv_operand_table table, const spv_operand_type_t type, const uint32_t value, spv_operand_desc* pEntry) { if (!table) return SPV_ERROR_INVALID_TABLE; if (!pEntry) return SPV_ERROR_INVALID_POINTER; + spv_operand_desc_t needle = {"", value, 0, nullptr, 0, nullptr, {}, ~0u}; + + auto comp = [](const spv_operand_desc_t& lhs, const spv_operand_desc_t& rhs) { + return lhs.value < rhs.value; + }; + for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) { const auto& group = table->types[typeIndex]; if (type != group.type) continue; - for (uint64_t index = 0; index < group.count; ++index) { - const auto& entry = group.entries[index]; - if (value == entry.value) { - *pEntry = &entry; + + const auto beg = group.entries; + const auto end = group.entries + group.count; + + // We need to loop here because there can exist multiple symbols for the + // same operand value, and they can be introduced in different target + // environments, which means they can have different minimal version + // requirements. For example, SubgroupEqMaskKHR can exist in any SPIR-V + // version as long as the SPV_KHR_shader_ballot extension is there; but + // starting from SPIR-V 1.3, SubgroupEqMask, which has the same numeric + // value as SubgroupEqMaskKHR, is available in core SPIR-V without extension + // requirements. + // Assumes the underlying table is already sorted ascendingly according to + // opcode value. + for (auto it = std::lower_bound(beg, end, needle, comp); + it != end && it->value == value; ++it) { + // We considers the current operand as available as long as + // 1. The target environment satisfies the minimal requirement of the + // operand; or + // 2. There is at least one extension enabling this operand. + // + // Note that the second rule assumes the extension enabling this operand + // is indeed requested in the SPIR-V code; checking that should be + // validator's work. + if (spvVersionForTargetEnv(env) >= it->minVersion || + it->numExtensions > 0u) { + *pEntry = it; return SPV_SUCCESS; } } @@ -238,7 +250,8 @@ } } -void spvPushOperandTypesForMask(const spv_operand_table operandTable, +void spvPushOperandTypesForMask(spv_target_env env, + const spv_operand_table operandTable, const spv_operand_type_t type, const uint32_t mask, spv_operand_pattern_t* pattern) { @@ -248,7 +261,7 @@ candidate_bit >>= 1) { if (candidate_bit & mask) { spv_operand_desc entry = nullptr; - if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type, + if (SPV_SUCCESS == spvOperandTableValueLookup(env, operandTable, type, candidate_bit, &entry)) { spvPushOperandTypes(entry->operandTypes, pattern); } @@ -405,6 +418,9 @@ case SpvOpSelectionMerge: case SpvOpDecorate: case SpvOpMemberDecorate: + case SpvOpDecorateId: + case SpvOpDecorateStringGOOGLE: + case SpvOpMemberDecorateStringGOOGLE: case SpvOpTypeStruct: case SpvOpBranch: case SpvOpLoopMerge: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/operand.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/operand.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/operand.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/operand.h 2018-04-27 11:46:32.000000000 +0000 @@ -38,7 +38,8 @@ // Finds the named operand in the table. The type parameter specifies the // operand's group. A handle of the operand table entry for this operand will // be written into *entry. -spv_result_t spvOperandTableNameLookup(const spv_operand_table table, +spv_result_t spvOperandTableNameLookup(spv_target_env, + const spv_operand_table table, const spv_operand_type_t type, const char* name, const size_t name_length, @@ -47,7 +48,8 @@ // Finds the operand with value in the table. The type parameter specifies the // operand's group. A handle of the operand table entry for this operand will // be written into *entry. -spv_result_t spvOperandTableValueLookup(const spv_operand_table table, +spv_result_t spvOperandTableValueLookup(spv_target_env, + const spv_operand_table table, const spv_operand_type_t type, const uint32_t value, spv_operand_desc* entry); @@ -85,7 +87,8 @@ // appear after operands for a more significant bit. // // If a set bit is unknown, then we assume it has no operands. -void spvPushOperandTypesForMask(const spv_operand_table operand_table, +void spvPushOperandTypesForMask(spv_target_env, + const spv_operand_table operand_table, const spv_operand_type_t mask_type, const uint32_t mask, spv_operand_pattern_t* pattern); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/aggressive_dead_code_elim_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/aggressive_dead_code_elim_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/aggressive_dead_code_elim_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/aggressive_dead_code_elim_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -433,6 +433,15 @@ else if (liveInst->opcode() == SpvOpFunctionParameter) { ProcessLoad(liveInst->result_id()); } + // We treat an OpImageTexelPointer as a load of the pointer, and + // that value is manipulated to get the result. + else if (liveInst->opcode() == SpvOpImageTexelPointer) { + uint32_t varId; + (void)GetPtr(liveInst, &varId); + if (varId != 0) { + ProcessLoad(varId); + } + } worklist_.pop(); } @@ -478,12 +487,23 @@ } void AggressiveDCEPass::InitializeModuleScopeLiveInstructions() { + // Keep all execution modes. for (auto& exec : get_module()->execution_modes()) { AddToWorklist(&exec); } + // Keep all entry points. for (auto& entry : get_module()->entry_points()) { AddToWorklist(&entry); } + // Keep workgroup size. + for (auto& anno : get_module()->annotations()) { + if (anno.opcode() == SpvOpDecorate) { + if (anno.GetSingleWordInOperand(1u) == SpvDecorationBuiltIn && + anno.GetSingleWordInOperand(2u) == SpvBuiltInWorkgroupSize) { + AddToWorklist(&anno); + } + } + } } Pass::Status AggressiveDCEPass::ProcessImpl() { @@ -684,6 +704,16 @@ "SPV_AMD_gpu_shader_int16", "SPV_KHR_post_depth_coverage", "SPV_KHR_shader_atomic_counter_ops", + "SPV_EXT_shader_stencil_export", + "SPV_EXT_shader_viewport_index_layer", + "SPV_AMD_shader_image_load_store_lod", + "SPV_AMD_shader_fragment_mask", + "SPV_EXT_fragment_fully_covered", + "SPV_AMD_gpu_shader_half_float_fetch", + "SPV_GOOGLE_decorate_string", + "SPV_GOOGLE_hlsl_functionality1", + "SPV_NV_shader_subgroup_partitioned", + "SPV_EXT_descriptor_indexing", }); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/aggressive_dead_code_elim_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/aggressive_dead_code_elim_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/aggressive_dead_code_elim_pass.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/aggressive_dead_code_elim_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -66,8 +66,8 @@ // Returns true if |inst| is dead. bool IsDead(ir::Instruction* inst); - // Adds entry points and execution modes to the worklist for processing with - // the first function. + // Adds entry points, execution modes and workgroup size decorations to the + // worklist for processing with the first function. void InitializeModuleScopeLiveInstructions(); // Add |inst| to worklist_ and live_insts_. diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/basic_block.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/basic_block.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/basic_block.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/basic_block.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -14,6 +14,7 @@ #include "basic_block.h" #include "function.h" +#include "ir_context.h" #include "module.h" #include "reflect.h" @@ -89,6 +90,14 @@ return nullptr; } +void BasicBlock::KillAllInsts(bool killLabel) { + ForEachInst([killLabel](ir::Instruction* ip) { + if (killLabel || ip->opcode() != SpvOpLabel) { + ip->context()->KillInst(ip); + } + }); +} + void BasicBlock::ForEachSuccessorLabel( const std::function& f) const { const auto br = &insts_.back(); @@ -181,13 +190,38 @@ } std::ostream& operator<<(std::ostream& str, const BasicBlock& block) { - block.ForEachInst([&str](const ir::Instruction* inst) { - str << *inst; + str << block.PrettyPrint(); + return str; +} + +std::string BasicBlock::PrettyPrint(uint32_t options) const { + std::ostringstream str; + ForEachInst([&str, options](const ir::Instruction* inst) { + str << inst->PrettyPrint(options); if (!IsTerminatorInst(inst->opcode())) { str << std::endl; } }); - return str; + return str.str(); +} + +BasicBlock* BasicBlock::SplitBasicBlock(IRContext* context, uint32_t label_id, + iterator iter) { + assert(!insts_.empty()); + + BasicBlock* new_block = new BasicBlock(MakeUnique( + context, SpvOpLabel, 0, label_id, std::initializer_list{})); + + new_block->insts_.Splice(new_block->end(), &insts_, iter, end()); + new_block->SetParent(GetParent()); + + if (context->AreAnalysesValid(ir::IRContext::kAnalysisInstrToBlockMapping)) { + new_block->ForEachInst([new_block, context](ir::Instruction* inst) { + context->set_instr_block(inst, new_block); + }); + } + + return new_block; } } // namespace ir diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/basic_block.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/basic_block.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/basic_block.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/basic_block.h 2018-04-27 11:46:32.000000000 +0000 @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -171,6 +172,23 @@ // Returns true if this basic block exits this function or aborts execution. bool IsReturnOrAbort() const { return ctail()->IsReturnOrAbort(); } + // Kill all instructions in this block. Whether or not to kill the label is + // indicated by |killLabel|. + void KillAllInsts(bool killLabel); + + // Splits this basic block into two. Returns a new basic block with label + // |labelId| containing the instructions from |iter| onwards. Instructions + // prior to |iter| remain in this basic block. + BasicBlock* SplitBasicBlock(IRContext* context, uint32_t label_id, + iterator iter); + + // Pretty-prints this basic block into a std::string by printing every + // instruction in it. + // + // |options| are the disassembly options. SPV_BINARY_TO_TEXT_OPTION_NO_HEADER + // is always added to |options|. + std::string PrettyPrint(uint32_t options = 0u) const; + private: // The enclosing function. Function* function_; @@ -252,9 +270,16 @@ inline bool BasicBlock::WhileEachPhiInst( const std::function& f, bool run_on_debug_line_insts) { - for (auto& inst : insts_) { - if (inst.opcode() != SpvOpPhi) break; - if (!inst.WhileEachInst(f, run_on_debug_line_insts)) return false; + if (insts_.empty()) { + return true; + } + + Instruction* inst = &insts_.front(); + while (inst != nullptr) { + Instruction* next_instruction = inst->NextNode(); + if (inst->opcode() != SpvOpPhi) break; + if (!inst->WhileEachInst(f, run_on_debug_line_insts)) return false; + inst = next_instruction; } return true; } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/block_merge_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/block_merge_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/block_merge_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/block_merge_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -69,8 +69,24 @@ continue; } - // Merge blocks. ir::Instruction* merge_inst = bi->GetMergeInst(); + if (pred_is_header && lab_id != merge_inst->GetSingleWordInOperand(0u)) { + // If this is a header block and the successor is not its merge, we must + // be careful about which blocks we are willing to merge together. + // OpLoopMerge must be followed by a conditional or unconditional branch. + // The merge must be a loop merge because a selection merge cannot be + // followed by an unconditional branch. + ir::BasicBlock* succ_block = context()->get_instr_block(lab_id); + SpvOp succ_term_op = succ_block->terminator()->opcode(); + assert(merge_inst->opcode() == SpvOpLoopMerge); + if (succ_term_op != SpvOpBranch && + succ_term_op != SpvOpBranchConditional) { + ++bi; + continue; + } + } + + // Merge blocks. context()->KillInst(br); auto sbi = bi; for (; sbi != func->end(); ++sbi) @@ -121,27 +137,9 @@ return IsMerge(block->id()); } -void BlockMergePass::Initialize(ir::IRContext* c) { - InitializeProcessing(c); - - // Initialize extension whitelist - InitExtensions(); -}; - -bool BlockMergePass::AllExtensionsSupported() const { - // If any extension not in whitelist, return false - for (auto& ei : get_module()->extensions()) { - const char* extName = - reinterpret_cast(&ei.GetInOperand(0).words[0]); - if (extensions_whitelist_.find(extName) == extensions_whitelist_.end()) - return false; - } - return true; -} +void BlockMergePass::Initialize(ir::IRContext* c) { InitializeProcessing(c); } Pass::Status BlockMergePass::ProcessImpl() { - // Do not process if any disallowed extensions are enabled - if (!AllExtensionsSupported()) return Status::SuccessWithoutChange; // Process all entry point functions. ProcessFunction pfn = [this](ir::Function* fp) { return MergeBlocks(fp); }; bool modified = ProcessEntryPointCallTree(pfn, get_module()); @@ -155,33 +153,5 @@ return ProcessImpl(); } -void BlockMergePass::InitExtensions() { - extensions_whitelist_.clear(); - extensions_whitelist_.insert({ - "SPV_AMD_shader_explicit_vertex_parameter", - "SPV_AMD_shader_trinary_minmax", - "SPV_AMD_gcn_shader", - "SPV_KHR_shader_ballot", - "SPV_AMD_shader_ballot", - "SPV_AMD_gpu_shader_half_float", - "SPV_KHR_shader_draw_parameters", - "SPV_KHR_subgroup_vote", - "SPV_KHR_16bit_storage", - "SPV_KHR_device_group", - "SPV_KHR_multiview", - "SPV_NVX_multiview_per_view_attributes", - "SPV_NV_viewport_array2", - "SPV_NV_stereo_view_rendering", - "SPV_NV_sample_mask_override_coverage", - "SPV_NV_geometry_shader_passthrough", - "SPV_AMD_texture_gather_bias_lod", - "SPV_KHR_storage_buffer_storage_class", - "SPV_KHR_variable_pointers", - "SPV_AMD_gpu_shader_int16", - "SPV_KHR_post_depth_coverage", - "SPV_KHR_shader_atomic_counter_ops", - }); -} - } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/block_merge_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/block_merge_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/block_merge_pass.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/block_merge_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -48,12 +48,6 @@ // with no other predecessors. Merge these blocks into a single block. bool MergeBlocks(ir::Function* func); - // Initialize extensions whitelist - void InitExtensions(); - - // Return true if all extensions in this module are allowed by this pass. - bool AllExtensionsSupported() const; - // Returns true if |block| (or |id|) contains a merge instruction. bool IsHeader(ir::BasicBlock* block); bool IsHeader(uint32_t id); @@ -65,9 +59,6 @@ void Initialize(ir::IRContext* c); Pass::Status ProcessImpl(); - - // Extensions supported by this pass. - std::unordered_set extensions_whitelist_; }; } // namespace opt diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/build_module.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/build_module.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/build_module.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/build_module.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -31,7 +31,7 @@ reinterpret_cast(builder)->SetModuleHeader( magic, version, generator, id_bound, reserved); return SPV_SUCCESS; -}; +} // Processes a parsed instruction for IrLoader. Meets the interface requirement // of spvBinaryParse(). @@ -40,7 +40,7 @@ return SPV_SUCCESS; } return SPV_ERROR_INVALID_BINARY; -}; +} } // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/ccp_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/ccp_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/ccp_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/ccp_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -81,9 +81,10 @@ return MarkInstructionVarying(phi); } } else { - // If any argument is not a constant, the Phi produces nothing - // interesting for now. The propagator will callback again, if needed. - return SSAPropagator::kNotInteresting; + // The incoming value has no recorded value and is therefore not + // interesting. A not interesting value joined with any other value is the + // other value. + continue; } } @@ -142,6 +143,15 @@ return SSAPropagator::kInteresting; } + // Conservatively mark this instruction as varying if any input id is varying. + if (!instr->WhileEachInId([this](uint32_t* op_id) { + auto iter = values_.find(*op_id); + if (iter != values_.end() && IsVaryingValue(iter->second)) return false; + return true; + })) { + return MarkInstructionVarying(instr); + } + // If not, see if there is a least one unknown operand to the instruction. If // so, we might be able to fold it later. if (!instr->WhileEachInId([this](uint32_t* op_id) { @@ -182,9 +192,15 @@ uint32_t pred_val_id = it->second; const analysis::Constant* c = const_mgr_->FindDeclaredConstant(pred_val_id); assert(c && "Expected to find a constant declaration for a known value."); - const analysis::BoolConstant* val = c->AsBoolConstant(); - dest_label = val->value() ? instr->GetSingleWordOperand(1) - : instr->GetSingleWordOperand(2); + // Undef values should have returned as varying above. + assert(c->AsBoolConstant() || c->AsNullConstant()); + if (c->AsNullConstant()) { + dest_label = instr->GetSingleWordOperand(2u); + } else { + const analysis::BoolConstant* val = c->AsBoolConstant(); + dest_label = val->value() ? instr->GetSingleWordOperand(1) + : instr->GetSingleWordOperand(2); + } } else { // For an OpSwitch, extract the value taken by the switch selector and check // which of the target literals it matches. The branch associated with that @@ -208,12 +224,20 @@ const analysis::Constant* c = const_mgr_->FindDeclaredConstant(select_val_id); assert(c && "Expected to find a constant declaration for a known value."); - const analysis::IntConstant* val = c->AsIntConstant(); + // TODO: support 64-bit integer switches. + uint32_t constant_cond = 0; + if (const analysis::IntConstant* val = c->AsIntConstant()) { + constant_cond = val->words()[0]; + } else { + // Undef values should have returned varying above. + assert(c->AsNullConstant()); + constant_cond = 0; + } // Start assuming that the selector will take the default value; dest_label = instr->GetSingleWordOperand(1); for (uint32_t i = 2; i < instr->NumOperands(); i += 2) { - if (val->words()[0] == instr->GetSingleWordOperand(i)) { + if (constant_cond == instr->GetSingleWordOperand(i)) { dest_label = instr->GetSingleWordOperand(i + 1); break; } @@ -251,6 +275,11 @@ } bool CCPPass::PropagateConstants(ir::Function* fp) { + // Mark function parameters as varying. + fp->ForEachParam([this](const ir::Instruction* inst) { + values_[inst->result_id()] = kVaryingSSAId; + }); + const auto visit_fn = [this](ir::Instruction* instr, ir::BasicBlock** dest_bb) { return VisitInstruction(instr, dest_bb); @@ -258,6 +287,7 @@ propagator_ = std::unique_ptr(new SSAPropagator(context(), visit_fn)); + if (propagator_->Run(fp)) { return ReplaceValues(); } @@ -273,10 +303,13 @@ // Populate the constant table with values from constant declarations in the // module. The values of each OpConstant declaration is the identity // assignment (i.e., each constant is its own value). - for (const auto& inst : context()->module()->GetConstants()) { - // Skip specialization constants. - if (inst->IsConstant()) { - values_[inst->result_id()] = inst->result_id(); + for (const auto& inst : get_module()->types_values()) { + // Record compile time constant ids. Treat all other global values as + // varying. + if (inst.IsConstant()) { + values_[inst.result_id()] = inst.result_id(); + } else { + values_[inst.result_id()] = kVaryingSSAId; } } } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/cfg.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/cfg.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/cfg.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/cfg.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -14,6 +14,7 @@ #include "cfg.h" #include "cfa.h" +#include "ir_builder.h" #include "ir_context.h" #include "module.h" @@ -56,7 +57,9 @@ const ir::BasicBlock* pred_blk = block(id); bool has_branch = false; pred_blk->ForEachSuccessorLabel([&has_branch, blk_id](uint32_t succ) { - if (succ == blk_id) has_branch = true; + if (succ == blk_id) { + has_branch = true; + } }); if (has_branch) updated_pred_list.push_back(id); } @@ -87,6 +90,19 @@ root, get_structured_successors, ignore_block, post_order, ignore_edge); } +void CFG::ForEachBlockInReversePostOrder( + BasicBlock* bb, const std::function& f) { + std::vector po; + std::unordered_set seen; + ComputePostOrderTraversal(bb, &po, &seen); + + for (auto current_bb = po.rbegin(); current_bb != po.rend(); ++current_bb) { + if (!IsPseudoExitBlock(*current_bb) && !IsPseudoEntryBlock(*current_bb)) { + f(*current_bb); + } + } +} + void CFG::ComputeStructuredSuccessors(ir::Function* func) { block2structured_succs_.clear(); for (auto& blk : *func) { @@ -98,18 +114,197 @@ // successor if there is one. uint32_t mbid = blk.MergeBlockIdIfAny(); if (mbid != 0) { - block2structured_succs_[&blk].push_back(id2block_[mbid]); + block2structured_succs_[&blk].push_back(block(mbid)); uint32_t cbid = blk.ContinueBlockIdIfAny(); - if (cbid != 0) block2structured_succs_[&blk].push_back(id2block_[cbid]); + if (cbid != 0) { + block2structured_succs_[&blk].push_back(block(cbid)); + } } // Add true successors. const auto& const_blk = blk; const_blk.ForEachSuccessorLabel([&blk, this](const uint32_t sbid) { - block2structured_succs_[&blk].push_back(id2block_[sbid]); + block2structured_succs_[&blk].push_back(block(sbid)); }); } } +void CFG::ComputePostOrderTraversal(BasicBlock* bb, vector* order, + unordered_set* seen) { + seen->insert(bb); + static_cast(bb)->ForEachSuccessorLabel( + [&order, &seen, this](const uint32_t sbid) { + BasicBlock* succ_bb = id2block_[sbid]; + if (!seen->count(succ_bb)) { + ComputePostOrderTraversal(succ_bb, order, seen); + } + }); + order->push_back(bb); +} + +BasicBlock* CFG::SplitLoopHeader(ir::BasicBlock* bb) { + assert(bb->GetLoopMergeInst() && "Expecting bb to be the header of a loop."); + + Function* fn = bb->GetParent(); + IRContext* context = fn->context(); + + // Find the insertion point for the new bb. + Function::iterator header_it = std::find_if( + fn->begin(), fn->end(), + [bb](BasicBlock& block_in_func) { return &block_in_func == bb; }); + assert(header_it != fn->end()); + + const std::vector& pred = preds(bb->id()); + // Find the back edge + ir::BasicBlock* latch_block = nullptr; + Function::iterator latch_block_iter = header_it; + while (++latch_block_iter != fn->end()) { + // If blocks are in the proper order, then the only branch that appears + // after the header is the latch. + if (std::find(pred.begin(), pred.end(), latch_block_iter->id()) != + pred.end()) { + break; + } + } + assert(latch_block_iter != fn->end() && "Could not find the latch."); + latch_block = &*latch_block_iter; + + RemoveSuccessorEdges(bb); + + // Create the new header bb basic bb. + // Leave the phi instructions behind. + auto iter = bb->begin(); + while (iter->opcode() == SpvOpPhi) { + ++iter; + } + + std::unique_ptr newBlock( + bb->SplitBasicBlock(context, context->TakeNextId(), iter)); + + // Insert the new bb in the correct position + auto insert_pos = header_it; + ++insert_pos; + ir::BasicBlock* new_header = &*insert_pos.InsertBefore(std::move(newBlock)); + new_header->SetParent(fn); + uint32_t new_header_id = new_header->id(); + context->AnalyzeDefUse(new_header->GetLabelInst()); + + // Update cfg + RegisterBlock(new_header); + + // Update bb mappings. + context->set_instr_block(new_header->GetLabelInst(), new_header); + new_header->ForEachInst([new_header, context](ir::Instruction* inst) { + context->set_instr_block(inst, new_header); + }); + + // Adjust the OpPhi instructions as needed. + bb->ForEachPhiInst([latch_block, bb, new_header, context](Instruction* phi) { + std::vector preheader_phi_ops; + std::vector header_phi_ops; + + // Identify where the original inputs to original OpPhi belong: header or + // preheader. + for (uint32_t i = 0; i < phi->NumInOperands(); i += 2) { + uint32_t def_id = phi->GetSingleWordInOperand(i); + uint32_t branch_id = phi->GetSingleWordInOperand(i + 1); + if (branch_id == latch_block->id()) { + header_phi_ops.push_back({SPV_OPERAND_TYPE_ID, {def_id}}); + header_phi_ops.push_back({SPV_OPERAND_TYPE_ID, {branch_id}}); + } else { + preheader_phi_ops.push_back(def_id); + preheader_phi_ops.push_back(branch_id); + } + } + + // Create a phi instruction if and only if the preheader_phi_ops has more + // than one pair. + if (preheader_phi_ops.size() > 2) { + opt::InstructionBuilder builder( + context, &*bb->begin(), + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping); + + ir::Instruction* new_phi = + builder.AddPhi(phi->type_id(), preheader_phi_ops); + + // Add the OpPhi to the header bb. + header_phi_ops.push_back({SPV_OPERAND_TYPE_ID, {new_phi->result_id()}}); + header_phi_ops.push_back({SPV_OPERAND_TYPE_ID, {bb->id()}}); + } else { + // An OpPhi with a single entry is just a copy. In this case use the same + // instruction in the new header. + header_phi_ops.push_back({SPV_OPERAND_TYPE_ID, {preheader_phi_ops[0]}}); + header_phi_ops.push_back({SPV_OPERAND_TYPE_ID, {bb->id()}}); + } + + phi->RemoveFromList(); + std::unique_ptr phi_owner(phi); + phi->SetInOperands(std::move(header_phi_ops)); + new_header->begin()->InsertBefore(std::move(phi_owner)); + context->set_instr_block(phi, new_header); + context->AnalyzeUses(phi); + }); + + // Add a branch to the new header. + opt::InstructionBuilder branch_builder( + context, bb, + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping); + bb->AddInstruction(MakeUnique( + context, SpvOpBranch, 0, 0, + std::initializer_list{ + {SPV_OPERAND_TYPE_ID, {new_header->id()}}})); + context->AnalyzeUses(bb->terminator()); + context->set_instr_block(bb->terminator(), bb); + label2preds_[new_header->id()].push_back(bb->id()); + + // Update the latch to branch to the new header. + latch_block->ForEachSuccessorLabel([bb, new_header_id](uint32_t* id) { + if (*id == bb->id()) { + *id = new_header_id; + } + }); + ir::Instruction* latch_branch = latch_block->terminator(); + context->AnalyzeUses(latch_branch); + label2preds_[new_header->id()].push_back(latch_block->id()); + + auto& block_preds = label2preds_[bb->id()]; + auto latch_pos = + std::find(block_preds.begin(), block_preds.end(), latch_block->id()); + assert(latch_pos != block_preds.end() && "The cfg was invalid."); + block_preds.erase(latch_pos); + + // Update the loop descriptors + if (context->AreAnalysesValid(ir::IRContext::kAnalysisLoopAnalysis)) { + LoopDescriptor* loop_desc = context->GetLoopDescriptor(bb->GetParent()); + Loop* loop = (*loop_desc)[bb->id()]; + + loop->AddBasicBlock(new_header_id); + loop->SetHeaderBlock(new_header); + loop_desc->SetBasicBlockToLoop(new_header_id, loop); + + loop->RemoveBasicBlock(bb->id()); + loop->SetPreHeaderBlock(bb); + + Loop* parent_loop = loop->GetParent(); + if (parent_loop != nullptr) { + parent_loop->AddBasicBlock(bb->id()); + loop_desc->SetBasicBlockToLoop(bb->id(), parent_loop); + } else { + loop_desc->SetBasicBlockToLoop(bb->id(), nullptr); + } + } + return new_header; +} + +unordered_set CFG::FindReachableBlocks(BasicBlock* start) { + std::unordered_set reachable_blocks; + ForEachBlockInReversePostOrder(start, [&reachable_blocks](BasicBlock* bb) { + reachable_blocks.insert(bb); + }); + return reachable_blocks; +} + } // namespace ir } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/cfg.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/cfg.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/cfg.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/cfg.h 2018-04-27 11:46:32.000000000 +0000 @@ -17,8 +17,10 @@ #include "basic_block.h" +#include #include #include +#include namespace spvtools { namespace ir { @@ -33,6 +35,7 @@ // Return the list of predecesors for basic block with label |blkid|. // TODO(dnovillo): Move this to ir::BasicBlock. const std::vector& preds(uint32_t blk_id) const { + assert(label2preds_.count(blk_id)); return label2preds_.at(blk_id); } @@ -68,6 +71,12 @@ void ComputeStructuredOrder(ir::Function* func, ir::BasicBlock* root, std::list* order); + // Applies |f| to the basic block in reverse post order starting with |bb|. + // Note that basic blocks that cannot be reached from |bb| node will not be + // processed. + void ForEachBlockInReversePostOrder( + BasicBlock* bb, const std::function& f); + // Registers |blk| as a basic block in the cfg, this also updates the // predecessor lists of each successor of |blk|. void RegisterBlock(ir::BasicBlock* blk) { @@ -76,6 +85,21 @@ AddEdges(blk); } + // Removes from the CFG any mapping for the basic block id |blk_id|. + void ForgetBlock(const ir::BasicBlock* blk) { + id2block_.erase(blk->id()); + label2preds_.erase(blk->id()); + RemoveSuccessorEdges(blk); + } + + void RemoveEdge(uint32_t pred_blk_id, uint32_t succ_blk_id) { + auto pred_it = label2preds_.find(succ_blk_id); + if (pred_it == label2preds_.end()) return; + auto& preds_list = pred_it->second; + auto it = std::find(preds_list.begin(), preds_list.end(), pred_blk_id); + if (it != preds_list.end()) preds_list.erase(it); + } + // Registers |blk| to all of its successors. void AddEdges(ir::BasicBlock* blk); @@ -89,6 +113,21 @@ // the basic block id |blk_id|. void RemoveNonExistingEdges(uint32_t blk_id); + // Remove all edges that leave |bb|. + void RemoveSuccessorEdges(const ir::BasicBlock* bb) { + bb->ForEachSuccessorLabel( + [bb, this](uint32_t succ_id) { RemoveEdge(bb->id(), succ_id); }); + } + + // Divides |block| into two basic blocks. The first block will have the same + // id as |block| and will become a preheader for the loop. The other block + // is a new block that will be the new loop header. + // + // Returns a pointer to the new loop header. + BasicBlock* SplitLoopHeader(ir::BasicBlock* bb); + + std::unordered_set FindReachableBlocks(BasicBlock* start); + private: using cbb_ptr = const ir::BasicBlock*; @@ -101,6 +140,13 @@ // ignored by DFS. void ComputeStructuredSuccessors(ir::Function* func); + // Computes the post-order traversal of the cfg starting at |bb| skipping + // nodes in |seen|. The order of the traversal is appended to |order|, and + // all nodes in the traversal are added to |seen|. + void ComputePostOrderTraversal(BasicBlock* bb, + std::vector* order, + std::unordered_set* seen); + // Module for this CFG. ir::Module* module_; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/CMakeLists.txt 2018-04-27 11:46:32.000000000 +0000 @@ -22,7 +22,9 @@ common_uniform_elim_pass.h compact_ids_pass.h composite.h + const_folding_rules.h constants.h + copy_prop_arrays.h dead_branch_elim_pass.h dead_insert_elim_pass.h dead_variable_elimination.h @@ -45,8 +47,11 @@ inline_pass.h insert_extract_elim.h instruction.h + instruction_list.h + ir_builder.h ir_context.h ir_loader.h + licm_pass.h local_access_chain_convert_pass.h local_redundancy_elimination.h local_single_block_elim_pass.h @@ -54,7 +59,11 @@ local_ssa_elim_pass.h log.h loop_descriptor.h + loop_peeling.h + loop_unroller.h loop_utils.h + loop_unswitch_pass.h + make_unique.h mem_pass.h merge_return_pass.h module.h @@ -68,10 +77,15 @@ reflect.h remove_duplicates_pass.h replace_invalid_opc.h + scalar_analysis.h + scalar_analysis_nodes.h scalar_replacement_pass.h set_spec_constant_default_value_pass.h + simplification_pass.h + ssa_rewrite_pass.h strength_reduction_pass.h strip_debug_info_pass.h + strip_reflect_info_pass.h tree_iterator.h type_manager.h types.h @@ -89,7 +103,9 @@ common_uniform_elim_pass.cpp compact_ids_pass.cpp composite.cpp + const_folding_rules.cpp constants.cpp + copy_prop_arrays.cpp dead_branch_elim_pass.cpp dead_insert_elim_pass.cpp dead_variable_elimination.cpp @@ -115,13 +131,17 @@ instruction_list.cpp ir_context.cpp ir_loader.cpp + licm_pass.cpp local_access_chain_convert_pass.cpp local_redundancy_elimination.cpp local_single_block_elim_pass.cpp local_single_store_elim_pass.cpp local_ssa_elim_pass.cpp loop_descriptor.cpp + loop_peeling.cpp loop_utils.cpp + loop_unroller.cpp + loop_unswitch_pass.cpp mem_pass.cpp merge_return_pass.cpp module.cpp @@ -133,10 +153,15 @@ redundancy_elimination.cpp remove_duplicates_pass.cpp replace_invalid_opc.cpp + scalar_analysis.cpp + scalar_analysis_simplification.cpp scalar_replacement_pass.cpp set_spec_constant_default_value_pass.cpp + simplification_pass.cpp + ssa_rewrite_pass.cpp strength_reduction_pass.cpp strip_debug_info_pass.cpp + strip_reflect_info_pass.cpp type_manager.cpp types.cpp unify_const_pass.cpp diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/common_uniform_elim_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/common_uniform_elim_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/common_uniform_elim_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/common_uniform_elim_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -488,7 +488,7 @@ // Initialize extension whitelist InitExtensions(); -}; +} bool CommonUniformElimPass::AllExtensionsSupported() const { // If any extension not in whitelist, return false @@ -564,6 +564,16 @@ "SPV_AMD_gpu_shader_int16", "SPV_KHR_post_depth_coverage", "SPV_KHR_shader_atomic_counter_ops", + "SPV_EXT_shader_stencil_export", + "SPV_EXT_shader_viewport_index_layer", + "SPV_AMD_shader_image_load_store_lod", + "SPV_AMD_shader_fragment_mask", + "SPV_EXT_fragment_fully_covered", + "SPV_AMD_gpu_shader_half_float_fetch", + "SPV_GOOGLE_decorate_string", + "SPV_GOOGLE_hlsl_functionality1", + "SPV_NV_shader_subgroup_partitioned", + "SPV_EXT_descriptor_indexing", }); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/constants.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/constants.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/constants.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/constants.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -22,6 +22,76 @@ namespace opt { namespace analysis { +float Constant::GetFloat() const { + assert(type()->AsFloat() != nullptr && type()->AsFloat()->width() == 32); + + if (const FloatConstant* fc = AsFloatConstant()) { + return fc->GetFloatValue(); + } else { + assert(AsNullConstant() && "Must be a floating point constant."); + return 0.0f; + } +} + +double Constant::GetDouble() const { + assert(type()->AsFloat() != nullptr && type()->AsFloat()->width() == 64); + + if (const FloatConstant* fc = AsFloatConstant()) { + return fc->GetDoubleValue(); + } else { + assert(AsNullConstant() && "Must be a floating point constant."); + return 0.0; + } +} + +uint32_t Constant::GetU32() const { + assert(type()->AsInteger() != nullptr); + assert(type()->AsInteger()->width() == 32); + + if (const IntConstant* ic = AsIntConstant()) { + return ic->GetU32BitValue(); + } else { + assert(AsNullConstant() && "Must be an integer constant."); + return 0u; + } +} + +uint64_t Constant::GetU64() const { + assert(type()->AsInteger() != nullptr); + assert(type()->AsInteger()->width() == 64); + + if (const IntConstant* ic = AsIntConstant()) { + return ic->GetU64BitValue(); + } else { + assert(AsNullConstant() && "Must be an integer constant."); + return 0u; + } +} + +int32_t Constant::GetS32() const { + assert(type()->AsInteger() != nullptr); + assert(type()->AsInteger()->width() == 32); + + if (const IntConstant* ic = AsIntConstant()) { + return ic->GetS32BitValue(); + } else { + assert(AsNullConstant() && "Must be an integer constant."); + return 0; + } +} + +int64_t Constant::GetS64() const { + assert(type()->AsInteger() != nullptr); + assert(type()->AsInteger()->width() == 64); + + if (const IntConstant* ic = AsIntConstant()) { + return ic->GetS64BitValue(); + } else { + assert(AsNullConstant() && "Must be an integer constant."); + return 0; + } +} + ConstantManager::ConstantManager(ir::IRContext* ctx) : ctx_(ctx) { // Populate the constant table with values from constant declarations in the // module. The values of each OpConstant declaration is the identity @@ -35,6 +105,22 @@ return context()->get_type_mgr()->GetType(inst->type_id()); } +std::vector ConstantManager::GetOperandConstants( + ir::Instruction* inst) const { + std::vector constants; + for (uint32_t i = 0; i < inst->NumInOperands(); i++) { + const ir::Operand* operand = &inst->GetInOperand(i); + if (operand->type != SPV_OPERAND_TYPE_ID) { + constants.push_back(nullptr); + } else { + uint32_t id = operand->words[0]; + const analysis::Constant* constant = FindDeclaredConstant(id); + constants.push_back(constant); + } + } + return constants; +} + std::vector ConstantManager::GetConstantsFromIds( const std::vector& ids) const { std::vector constants; @@ -72,7 +158,9 @@ if (pos == nullptr) pos = &iter; return BuildInstructionAndAddToModule(c, pos); } else { - return context()->get_def_use_mgr()->GetDef(decl_id); + auto def = context()->get_def_use_mgr()->GetDef(decl_id); + assert(def != nullptr); + return def; } } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/constants.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/constants.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/constants.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/constants.h 2018-04-27 11:46:32.000000000 +0000 @@ -26,6 +26,7 @@ #include "module.h" #include "type_manager.h" #include "types.h" +#include "util/hex_float.h" namespace spvtools { namespace opt { @@ -82,6 +83,30 @@ virtual const ArrayConstant* AsArrayConstant() const { return nullptr; } virtual const NullConstant* AsNullConstant() const { return nullptr; } + // Returns the float representation of the constant. Must be a 32 bit + // Float type. + float GetFloat() const; + + // Returns the double representation of the constant. Must be a 64 bit + // Float type. + double GetDouble() const; + + // Returns uint32_t representation of the constant. Must be a 32 bit + // Integer type. + uint32_t GetU32() const; + + // Returns uint64_t representation of the constant. Must be a 64 bit + // Integer type. + uint64_t GetU64() const; + + // Returns int32_t representation of the constant. Must be a 32 bit + // Integer type. + int32_t GetS32() const; + + // Returns int64_t representation of the constant. Must be a 64 bit + // Integer type. + int64_t GetS64() const; + const Type* type() const { return type_; } protected: @@ -101,6 +126,18 @@ // Returns a const reference of the value of this constant in 32-bit words. virtual const std::vector& words() const { return words_; } + // Returns true if the value is zero. + bool IsZero() const { + bool is_zero = true; + for (uint32_t v : words()) { + if (v != 0) { + is_zero = false; + break; + } + } + return is_zero; + } + protected: ScalarConstant(const Type* ty, const std::vector& w) : Constant(ty), words_(w) {} @@ -134,15 +171,20 @@ return words()[0]; } - bool IsZero() const { - bool is_zero = true; - for (uint32_t v : words()) { - if (v != 0) { - is_zero = false; - break; - } - } - return is_zero; + int64_t GetS64BitValue() const { + // Relies on unsigned values smaller than 64-bit being sign extended. See + // section 2.2.1 of the SPIR-V spec. + assert(words().size() == 2); + return static_cast(words()[1]) << 32 | + static_cast(words()[0]); + } + + uint64_t GetU64BitValue() const { + // Relies on unsigned values smaller than 64-bit being zero extended. See + // section 2.2.1 of the SPIR-V spec. + assert(words().size() == 2); + return static_cast(words()[1]) << 32 | + static_cast(words()[0]); } // Make a copy of this IntConstant instance. @@ -172,6 +214,27 @@ std::unique_ptr Copy() const override { return std::unique_ptr(CopyFloatConstant().release()); } + + // Returns the float value of |this|. The type of |this| must be |Float| with + // width of 32. + float GetFloatValue() const { + assert(type()->AsFloat()->width() == 32 && + "Not a 32-bit floating point value."); + spvutils::FloatProxy a(words()[0]); + return a.getAsFloat(); + } + + // Returns the double value of |this|. The type of |this| must be |Float| + // with width of 64. + double GetDoubleValue() const { + assert(type()->AsFloat()->width() == 64 && + "Not a 32-bit floating point value."); + uint64_t combined_words = words()[1]; + combined_words = combined_words << 32; + combined_words |= words()[0]; + spvutils::FloatProxy a(combined_words); + return a.getAsFloat(); + } }; // Bool type constant. @@ -204,7 +267,7 @@ CompositeConstant* AsCompositeConstant() override { return this; } const CompositeConstant* AsCompositeConstant() const override { return this; } - // Returns a const reference of the components holded in this composite + // Returns a const reference of the components held in this composite // constant. virtual const std::vector& GetComponents() const { return components_; @@ -269,7 +332,7 @@ return std::unique_ptr(CopyVectorConstant().release()); } - const Type* component_type() { return component_type_; } + const Type* component_type() const { return component_type_; } private: const Type* component_type_; @@ -485,6 +548,10 @@ std::vector GetConstantsFromIds( const std::vector& ids) const; + // Returns a vector of constants representing each in operand. If an operand + // is not constant its entry is nullptr. + std::vector GetOperandConstants(ir::Instruction* inst) const; + // Records a mapping between |inst| and the constant value generated by it. // It returns true if a new Constant was successfully mapped, false if |inst| // generates no constant values. @@ -496,6 +563,14 @@ return false; } + void RemoveId(uint32_t id) { + auto it = id_to_const_val_.find(id); + if (it != id_to_const_val_.end()) { + const_val_to_id_.erase(it->second); + id_to_const_val_.erase(it); + } + } + // Records a new mapping between |inst| and |const_value|. This updates the // two mappings |id_to_const_val_| and |const_val_to_id_|. void MapConstantToInst(const Constant* const_value, ir::Instruction* inst) { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/const_folding_rules.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/const_folding_rules.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/const_folding_rules.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/const_folding_rules.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,488 @@ +// Copyright (c) 2018 Google LLC +// +// 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. + +#include "const_folding_rules.h" + +namespace spvtools { +namespace opt { + +namespace { +const uint32_t kExtractCompositeIdInIdx = 0; + +// Folds an OpcompositeExtract where input is a composite constant. +ConstantFoldingRule FoldExtractWithConstants() { + return [](ir::Instruction* inst, + const std::vector& constants) + -> const analysis::Constant* { + const analysis::Constant* c = constants[kExtractCompositeIdInIdx]; + if (c == nullptr) { + return nullptr; + } + + for (uint32_t i = 1; i < inst->NumInOperands(); ++i) { + uint32_t element_index = inst->GetSingleWordInOperand(i); + if (c->AsNullConstant()) { + // Return Null for the return type. + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + analysis::TypeManager* type_mgr = context->get_type_mgr(); + return const_mgr->GetConstant(type_mgr->GetType(inst->type_id()), {}); + } + + auto cc = c->AsCompositeConstant(); + assert(cc != nullptr); + auto components = cc->GetComponents(); + c = components[element_index]; + } + return c; + }; +} + +ConstantFoldingRule FoldVectorShuffleWithConstants() { + return [](ir::Instruction* inst, + const std::vector& constants) + -> const analysis::Constant* { + assert(inst->opcode() == SpvOpVectorShuffle); + const analysis::Constant* c1 = constants[0]; + const analysis::Constant* c2 = constants[1]; + if (c1 == nullptr || c2 == nullptr) { + return nullptr; + } + + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + const analysis::Type* element_type = c1->type()->AsVector()->element_type(); + + std::vector c1_components; + if (const analysis::VectorConstant* vec_const = c1->AsVectorConstant()) { + c1_components = vec_const->GetComponents(); + } else { + assert(c1->AsNullConstant()); + const analysis::Constant* element = + const_mgr->GetConstant(element_type, {}); + c1_components.resize(c1->type()->AsVector()->element_count(), element); + } + std::vector c2_components; + if (const analysis::VectorConstant* vec_const = c2->AsVectorConstant()) { + c2_components = vec_const->GetComponents(); + } else { + assert(c2->AsNullConstant()); + const analysis::Constant* element = + const_mgr->GetConstant(element_type, {}); + c2_components.resize(c2->type()->AsVector()->element_count(), element); + } + + std::vector ids; + for (uint32_t i = 2; i < inst->NumInOperands(); ++i) { + uint32_t index = inst->GetSingleWordInOperand(i); + if (index < c1_components.size()) { + ir::Instruction* member_inst = + const_mgr->GetDefiningInstruction(c1_components[index]); + ids.push_back(member_inst->result_id()); + } else { + ir::Instruction* member_inst = const_mgr->GetDefiningInstruction( + c2_components[index - c1_components.size()]); + ids.push_back(member_inst->result_id()); + } + } + + analysis::TypeManager* type_mgr = context->get_type_mgr(); + return const_mgr->GetConstant(type_mgr->GetType(inst->type_id()), ids); + }; +} // namespace + +ConstantFoldingRule FoldCompositeWithConstants() { + // Folds an OpCompositeConstruct where all of the inputs are constants to a + // constant. A new constant is created if necessary. + return [](ir::Instruction* inst, + const std::vector& constants) + -> const analysis::Constant* { + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + analysis::TypeManager* type_mgr = context->get_type_mgr(); + const analysis::Type* new_type = type_mgr->GetType(inst->type_id()); + + std::vector ids; + for (const analysis::Constant* element_const : constants) { + if (element_const == nullptr) { + return nullptr; + } + uint32_t element_id = const_mgr->FindDeclaredConstant(element_const); + if (element_id == 0) { + return nullptr; + } + ids.push_back(element_id); + } + return const_mgr->GetConstant(new_type, ids); + }; +} + +// The interface for a function that returns the result of applying a scalar +// floating-point binary operation on |a| and |b|. The type of the return value +// will be |type|. The input constants must also be of type |type|. +using UnaryScalarFoldingRule = std::function; + +// The interface for a function that returns the result of applying a scalar +// floating-point binary operation on |a| and |b|. The type of the return value +// will be |type|. The input constants must also be of type |type|. +using BinaryScalarFoldingRule = std::function; + +// Returns an std::vector containing the elements of |constant|. The type of +// |constant| must be |Vector|. +std::vector GetVectorComponents( + const analysis::Constant* constant, analysis::ConstantManager* const_mgr) { + std::vector components; + const analysis::VectorConstant* a = constant->AsVectorConstant(); + const analysis::Vector* vector_type = constant->type()->AsVector(); + assert(vector_type != nullptr); + if (a != nullptr) { + for (uint32_t i = 0; i < vector_type->element_count(); ++i) { + components.push_back(a->GetComponents()[i]); + } + } else { + const analysis::Type* element_type = vector_type->element_type(); + const analysis::Constant* element_null_const = + const_mgr->GetConstant(element_type, {}); + for (uint32_t i = 0; i < vector_type->element_count(); ++i) { + components.push_back(element_null_const); + } + } + return components; +} + +// Returns a |ConstantFoldingRule| that folds unary floating point scalar ops +// using |scalar_rule| and unary float point vectors ops by applying +// |scalar_rule| to the elements of the vector. The |ConstantFoldingRule| +// that is returned assumes that |constants| contains 1 entry. If they are +// not |nullptr|, then their type is either |Float| or |Integer| or a |Vector| +// whose element type is |Float| or |Integer|. +ConstantFoldingRule FoldFPUnaryOp(UnaryScalarFoldingRule scalar_rule) { + return [scalar_rule](ir::Instruction* inst, + const std::vector& constants) + -> const analysis::Constant* { + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + analysis::TypeManager* type_mgr = context->get_type_mgr(); + const analysis::Type* result_type = type_mgr->GetType(inst->type_id()); + const analysis::Vector* vector_type = result_type->AsVector(); + + if (!inst->IsFloatingPointFoldingAllowed()) { + return nullptr; + } + + if (constants[0] == nullptr) { + return nullptr; + } + + if (vector_type != nullptr) { + std::vector a_components; + std::vector results_components; + + a_components = GetVectorComponents(constants[0], const_mgr); + + // Fold each component of the vector. + for (uint32_t i = 0; i < a_components.size(); ++i) { + results_components.push_back(scalar_rule(vector_type->element_type(), + a_components[i], const_mgr)); + if (results_components[i] == nullptr) { + return nullptr; + } + } + + // Build the constant object and return it. + std::vector ids; + for (const analysis::Constant* member : results_components) { + ids.push_back(const_mgr->GetDefiningInstruction(member)->result_id()); + } + return const_mgr->GetConstant(vector_type, ids); + } else { + return scalar_rule(result_type, constants[0], const_mgr); + } + }; +} + +// Returns a |ConstantFoldingRule| that folds floating point scalars using +// |scalar_rule| and vectors of floating point by applying |scalar_rule| to the +// elements of the vector. The |ConstantFoldingRule| that is returned assumes +// that |constants| contains 2 entries. If they are not |nullptr|, then their +// type is either |Float| or a |Vector| whose element type is |Float|. +ConstantFoldingRule FoldFPBinaryOp(BinaryScalarFoldingRule scalar_rule) { + return [scalar_rule](ir::Instruction* inst, + const std::vector& constants) + -> const analysis::Constant* { + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + analysis::TypeManager* type_mgr = context->get_type_mgr(); + const analysis::Type* result_type = type_mgr->GetType(inst->type_id()); + const analysis::Vector* vector_type = result_type->AsVector(); + + if (!inst->IsFloatingPointFoldingAllowed()) { + return nullptr; + } + + if (constants[0] == nullptr || constants[1] == nullptr) { + return nullptr; + } + + if (vector_type != nullptr) { + std::vector a_components; + std::vector b_components; + std::vector results_components; + + a_components = GetVectorComponents(constants[0], const_mgr); + b_components = GetVectorComponents(constants[1], const_mgr); + + // Fold each component of the vector. + for (uint32_t i = 0; i < a_components.size(); ++i) { + results_components.push_back(scalar_rule(vector_type->element_type(), + a_components[i], + b_components[i], const_mgr)); + if (results_components[i] == nullptr) { + return nullptr; + } + } + + // Build the constant object and return it. + std::vector ids; + for (const analysis::Constant* member : results_components) { + ids.push_back(const_mgr->GetDefiningInstruction(member)->result_id()); + } + return const_mgr->GetConstant(vector_type, ids); + } else { + return scalar_rule(result_type, constants[0], constants[1], const_mgr); + } + }; +} + +// This macro defines a |UnaryScalarFoldingRule| that performs float to +// integer conversion. +// TODO(greg-lunarg): Support for 64-bit integer types. +UnaryScalarFoldingRule FoldFToIOp() { + return [](const analysis::Type* result_type, const analysis::Constant* a, + analysis::ConstantManager* const_mgr) -> const analysis::Constant* { + assert(result_type != nullptr && a != nullptr); + const analysis::Integer* integer_type = result_type->AsInteger(); + const analysis::Float* float_type = a->type()->AsFloat(); + assert(float_type != nullptr); + assert(integer_type != nullptr); + if (integer_type->width() != 32) return nullptr; + if (float_type->width() == 32) { + float fa = a->GetFloat(); + uint32_t result = integer_type->IsSigned() + ? static_cast(static_cast(fa)) + : static_cast(fa); + std::vector words = {result}; + return const_mgr->GetConstant(result_type, words); + } else if (float_type->width() == 64) { + double fa = a->GetDouble(); + uint32_t result = integer_type->IsSigned() + ? static_cast(static_cast(fa)) + : static_cast(fa); + std::vector words = {result}; + return const_mgr->GetConstant(result_type, words); + } + return nullptr; + }; +} + +// This macro defines a |UnaryScalarFoldingRule| that performs integer to +// float conversion. +// TODO(greg-lunarg): Support for 64-bit integer types. +UnaryScalarFoldingRule FoldIToFOp() { + return [](const analysis::Type* result_type, const analysis::Constant* a, + analysis::ConstantManager* const_mgr) -> const analysis::Constant* { + assert(result_type != nullptr && a != nullptr); + const analysis::Integer* integer_type = a->type()->AsInteger(); + const analysis::Float* float_type = result_type->AsFloat(); + assert(float_type != nullptr); + assert(integer_type != nullptr); + if (integer_type->width() != 32) return nullptr; + uint32_t ua = a->GetU32(); + if (float_type->width() == 32) { + float result_val = integer_type->IsSigned() + ? static_cast(static_cast(ua)) + : static_cast(ua); + spvutils::FloatProxy result(result_val); + std::vector words = {result.data()}; + return const_mgr->GetConstant(result_type, words); + } else if (float_type->width() == 64) { + double result_val = integer_type->IsSigned() + ? static_cast(static_cast(ua)) + : static_cast(ua); + spvutils::FloatProxy result(result_val); + std::vector words = result.GetWords(); + return const_mgr->GetConstant(result_type, words); + } + return nullptr; + }; +} + +// This macro defines a |BinaryScalarFoldingRule| that applies |op|. The +// operator |op| must work for both float and double, and use syntax "f1 op f2". +#define FOLD_FPARITH_OP(op) \ + [](const analysis::Type* result_type, const analysis::Constant* a, \ + const analysis::Constant* b, \ + analysis::ConstantManager* const_mgr) -> const analysis::Constant* { \ + assert(result_type != nullptr && a != nullptr && b != nullptr); \ + assert(result_type == a->type() && result_type == b->type()); \ + const analysis::Float* float_type = result_type->AsFloat(); \ + assert(float_type != nullptr); \ + if (float_type->width() == 32) { \ + float fa = a->GetFloat(); \ + float fb = b->GetFloat(); \ + spvutils::FloatProxy result(fa op fb); \ + std::vector words = result.GetWords(); \ + return const_mgr->GetConstant(result_type, words); \ + } else if (float_type->width() == 64) { \ + double fa = a->GetDouble(); \ + double fb = b->GetDouble(); \ + spvutils::FloatProxy result(fa op fb); \ + std::vector words = result.GetWords(); \ + return const_mgr->GetConstant(result_type, words); \ + } \ + return nullptr; \ + } + +// Define the folding rule for conversion between floating point and integer +ConstantFoldingRule FoldFToI() { return FoldFPUnaryOp(FoldFToIOp()); } +ConstantFoldingRule FoldIToF() { return FoldFPUnaryOp(FoldIToFOp()); } + +// Define the folding rules for subtraction, addition, multiplication, and +// division for floating point values. +ConstantFoldingRule FoldFSub() { return FoldFPBinaryOp(FOLD_FPARITH_OP(-)); } +ConstantFoldingRule FoldFAdd() { return FoldFPBinaryOp(FOLD_FPARITH_OP(+)); } +ConstantFoldingRule FoldFMul() { return FoldFPBinaryOp(FOLD_FPARITH_OP(*)); } +ConstantFoldingRule FoldFDiv() { return FoldFPBinaryOp(FOLD_FPARITH_OP(/)); } + +bool CompareFloatingPoint(bool op_result, bool op_unordered, + bool need_ordered) { + if (need_ordered) { + // operands are ordered and Operand 1 is |op| Operand 2 + return !op_unordered && op_result; + } else { + // operands are unordered or Operand 1 is |op| Operand 2 + return op_unordered || op_result; + } +} + +// This macro defines a |BinaryScalarFoldingRule| that applies |op|. The +// operator |op| must work for both float and double, and use syntax "f1 op f2". +#define FOLD_FPCMP_OP(op, ord) \ + [](const analysis::Type* result_type, const analysis::Constant* a, \ + const analysis::Constant* b, \ + analysis::ConstantManager* const_mgr) -> const analysis::Constant* { \ + assert(result_type != nullptr && a != nullptr && b != nullptr); \ + assert(result_type->AsBool()); \ + assert(a->type() == b->type()); \ + const analysis::Float* float_type = a->type()->AsFloat(); \ + assert(float_type != nullptr); \ + if (float_type->width() == 32) { \ + float fa = a->GetFloat(); \ + float fb = b->GetFloat(); \ + bool result = CompareFloatingPoint( \ + fa op fb, std::isnan(fa) || std::isnan(fb), ord); \ + std::vector words = {uint32_t(result)}; \ + return const_mgr->GetConstant(result_type, words); \ + } else if (float_type->width() == 64) { \ + double fa = a->GetDouble(); \ + double fb = b->GetDouble(); \ + bool result = CompareFloatingPoint( \ + fa op fb, std::isnan(fa) || std::isnan(fb), ord); \ + std::vector words = {uint32_t(result)}; \ + return const_mgr->GetConstant(result_type, words); \ + } \ + return nullptr; \ + } + +// Define the folding rules for ordered and unordered comparison for floating +// point values. +ConstantFoldingRule FoldFOrdEqual() { + return FoldFPBinaryOp(FOLD_FPCMP_OP(==, true)); +} +ConstantFoldingRule FoldFUnordEqual() { + return FoldFPBinaryOp(FOLD_FPCMP_OP(==, false)); +} +ConstantFoldingRule FoldFOrdNotEqual() { + return FoldFPBinaryOp(FOLD_FPCMP_OP(!=, true)); +} +ConstantFoldingRule FoldFUnordNotEqual() { + return FoldFPBinaryOp(FOLD_FPCMP_OP(!=, false)); +} +ConstantFoldingRule FoldFOrdLessThan() { + return FoldFPBinaryOp(FOLD_FPCMP_OP(<, true)); +} +ConstantFoldingRule FoldFUnordLessThan() { + return FoldFPBinaryOp(FOLD_FPCMP_OP(<, false)); +} +ConstantFoldingRule FoldFOrdGreaterThan() { + return FoldFPBinaryOp(FOLD_FPCMP_OP(>, true)); +} +ConstantFoldingRule FoldFUnordGreaterThan() { + return FoldFPBinaryOp(FOLD_FPCMP_OP(>, false)); +} +ConstantFoldingRule FoldFOrdLessThanEqual() { + return FoldFPBinaryOp(FOLD_FPCMP_OP(<=, true)); +} +ConstantFoldingRule FoldFUnordLessThanEqual() { + return FoldFPBinaryOp(FOLD_FPCMP_OP(<=, false)); +} +ConstantFoldingRule FoldFOrdGreaterThanEqual() { + return FoldFPBinaryOp(FOLD_FPCMP_OP(>=, true)); +} +ConstantFoldingRule FoldFUnordGreaterThanEqual() { + return FoldFPBinaryOp(FOLD_FPCMP_OP(>=, false)); +} +} // namespace + +spvtools::opt::ConstantFoldingRules::ConstantFoldingRules() { + // Add all folding rules to the list for the opcodes to which they apply. + // Note that the order in which rules are added to the list matters. If a rule + // applies to the instruction, the rest of the rules will not be attempted. + // Take that into consideration. + + rules_[SpvOpCompositeConstruct].push_back(FoldCompositeWithConstants()); + + rules_[SpvOpCompositeExtract].push_back(FoldExtractWithConstants()); + + rules_[SpvOpConvertFToS].push_back(FoldFToI()); + rules_[SpvOpConvertFToU].push_back(FoldFToI()); + rules_[SpvOpConvertSToF].push_back(FoldIToF()); + rules_[SpvOpConvertUToF].push_back(FoldIToF()); + + rules_[SpvOpFAdd].push_back(FoldFAdd()); + rules_[SpvOpFDiv].push_back(FoldFDiv()); + rules_[SpvOpFMul].push_back(FoldFMul()); + rules_[SpvOpFSub].push_back(FoldFSub()); + + rules_[SpvOpFOrdEqual].push_back(FoldFOrdEqual()); + rules_[SpvOpFUnordEqual].push_back(FoldFUnordEqual()); + rules_[SpvOpFOrdNotEqual].push_back(FoldFOrdNotEqual()); + rules_[SpvOpFUnordNotEqual].push_back(FoldFUnordNotEqual()); + rules_[SpvOpFOrdLessThan].push_back(FoldFOrdLessThan()); + rules_[SpvOpFUnordLessThan].push_back(FoldFUnordLessThan()); + rules_[SpvOpFOrdGreaterThan].push_back(FoldFOrdGreaterThan()); + rules_[SpvOpFUnordGreaterThan].push_back(FoldFUnordGreaterThan()); + rules_[SpvOpFOrdLessThanEqual].push_back(FoldFOrdLessThanEqual()); + rules_[SpvOpFUnordLessThanEqual].push_back(FoldFUnordLessThanEqual()); + rules_[SpvOpFOrdGreaterThanEqual].push_back(FoldFOrdGreaterThanEqual()); + rules_[SpvOpFUnordGreaterThanEqual].push_back(FoldFUnordGreaterThanEqual()); + + rules_[SpvOpVectorShuffle].push_back(FoldVectorShuffleWithConstants()); +} +} // namespace opt +} // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/const_folding_rules.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/const_folding_rules.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/const_folding_rules.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/const_folding_rules.h 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,84 @@ +// Copyright (c) 2018 Google LLC +// +// 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. + +#ifndef LIBSPIRV_OPT_CONST_FOLDING_RULES_H_ +#define LIBSPIRV_OPT_CONST_FOLDING_RULES_H_ + +#include + +#include "constants.h" +#include "def_use_manager.h" +#include "folding_rules.h" +#include "ir_builder.h" +#include "ir_context.h" +#include "latest_version_spirv_header.h" + +namespace spvtools { +namespace opt { + +// Constant Folding Rules: +// +// The folding mechanism is built around the concept of a |ConstantFoldingRule|. +// A constant folding rule is a function that implements a method of simplifying +// an instruction to a constant. +// +// The inputs to a folding rule are: +// |inst| - the instruction to be simplified. +// |constants| - if an in-operands is an id of a constant, then the +// corresponding value in |constants| contains that +// constant value. Otherwise, the corresponding entry in +// |constants| is |nullptr|. +// +// A constant folding rule returns a pointer to an Constant if |inst| can be +// simplified using this rule. Otherwise, it returns |nullptr|. +// +// See const_folding_rules.cpp for examples on how to write a constant folding +// rule. +// +// Be sure to add new constant folding rules to the table of constant folding +// rules in the constructor for ConstantFoldingRules. The new rule should be +// added to the list for every opcode that it applies to. Note that earlier +// rules in the list are given priority. That is, if an earlier rule is able to +// fold an instruction, the later rules will not be attempted. + +using ConstantFoldingRule = std::function& constants)>; + +class ConstantFoldingRules { + public: + ConstantFoldingRules(); + + // Returns true if there is at least 1 folding rule for |opcode|. + bool HasFoldingRule(SpvOp opcode) const { return rules_.count(opcode); } + + // Returns an vector of constant folding rules for |opcode|. + const std::vector& GetRulesForOpcode( + SpvOp opcode) const { + auto it = rules_.find(opcode); + if (it != rules_.end()) { + return it->second; + } + return empty_vector_; + } + + private: + std::unordered_map> rules_; + std::vector empty_vector_; +}; + +} // namespace opt +} // namespace spvtools + +#endif // LIBSPIRV_OPT_CONST_FOLDING_RULES_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/copy_prop_arrays.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/copy_prop_arrays.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/copy_prop_arrays.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/copy_prop_arrays.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,848 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include "copy_prop_arrays.h" +#include "ir_builder.h" + +namespace { +const uint32_t kLoadPointerInOperand = 0; +const uint32_t kStorePointerInOperand = 0; +const uint32_t kStoreObjectInOperand = 1; +const uint32_t kCompositeExtractObjectInOperand = 0; +} // namespace + +namespace spvtools { +namespace opt { + +Pass::Status CopyPropagateArrays::Process(ir::IRContext* ctx) { + InitializeProcessing(ctx); + + bool modified = false; + for (ir::Function& function : *get_module()) { + ir::BasicBlock* entry_bb = &*function.begin(); + + for (auto var_inst = entry_bb->begin(); var_inst->opcode() == SpvOpVariable; + ++var_inst) { + if (!IsPointerToArrayType(var_inst->type_id())) { + continue; + } + + // Find the only store to the entire memory location, if it exists. + ir::Instruction* store_inst = FindStoreInstruction(&*var_inst); + + if (!store_inst) { + continue; + } + + std::unique_ptr source_object = + FindSourceObjectIfPossible(&*var_inst, store_inst); + + if (source_object != nullptr) { + if (CanUpdateUses(&*var_inst, source_object->GetPointerTypeId())) { + modified = true; + PropagateObject(&*var_inst, source_object.get(), store_inst); + } + } + } + } + return (modified ? Status::SuccessWithChange : Status::SuccessWithoutChange); +} + +std::unique_ptr +CopyPropagateArrays::FindSourceObjectIfPossible(ir::Instruction* var_inst, + ir::Instruction* store_inst) { + assert(var_inst->opcode() == SpvOpVariable && "Expecting a variable."); + + // Check that the variable is a composite object where |store_inst| + // dominates all of its loads. + if (!store_inst) { + return nullptr; + } + + // Look at the loads to ensure they are dominated by the store. + if (!HasValidReferencesOnly(var_inst, store_inst)) { + return nullptr; + } + + // If so, look at the store to see if it is the copy of an object. + std::unique_ptr source = GetSourceObjectIfAny( + store_inst->GetSingleWordInOperand(kStoreObjectInOperand)); + + if (!source) { + return nullptr; + } + + // Ensure that |source| does not change between the point at which it is + // loaded, and the position in which |var_inst| is loaded. + // + // For now we will go with the easy to implement approach, and check that the + // entire variable (not just the specific component) is never written to. + + if (!HasNoStores(source->GetVariable())) { + return nullptr; + } + return source; +} + +ir::Instruction* CopyPropagateArrays::FindStoreInstruction( + const ir::Instruction* var_inst) const { + ir::Instruction* store_inst = nullptr; + get_def_use_mgr()->WhileEachUser( + var_inst, [&store_inst, var_inst](ir::Instruction* use) { + if (use->opcode() == SpvOpStore && + use->GetSingleWordInOperand(kStorePointerInOperand) == + var_inst->result_id()) { + if (store_inst == nullptr) { + store_inst = use; + } else { + store_inst = nullptr; + return false; + } + } + return true; + }); + return store_inst; +} + +void CopyPropagateArrays::PropagateObject(ir::Instruction* var_inst, + MemoryObject* source, + ir::Instruction* insertion_point) { + assert(var_inst->opcode() == SpvOpVariable && + "This function propagates variables."); + + ir::Instruction* new_access_chain = + BuildNewAccessChain(insertion_point, source); + context()->KillNamesAndDecorates(var_inst); + UpdateUses(var_inst, new_access_chain); +} + +ir::Instruction* CopyPropagateArrays::BuildNewAccessChain( + ir::Instruction* insertion_point, + CopyPropagateArrays::MemoryObject* source) const { + InstructionBuilder builder(context(), insertion_point, + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping); + + if (source->AccessChain().size() == 0) { + return source->GetVariable(); + } + + return builder.AddAccessChain(source->GetPointerTypeId(), + source->GetVariable()->result_id(), + source->AccessChain()); +} + +bool CopyPropagateArrays::HasNoStores(ir::Instruction* ptr_inst) { + return get_def_use_mgr()->WhileEachUser( + ptr_inst, [this](ir::Instruction* use) { + if (use->opcode() == SpvOpLoad) { + return true; + } else if (use->opcode() == SpvOpAccessChain) { + return HasNoStores(use); + } else if (use->IsDecoration() || use->opcode() == SpvOpName) { + return true; + } else if (use->opcode() == SpvOpStore) { + return false; + } else if (use->opcode() == SpvOpImageTexelPointer) { + return true; + } + // Some other instruction. Be conservative. + return false; + }); +} + +bool CopyPropagateArrays::HasValidReferencesOnly(ir::Instruction* ptr_inst, + ir::Instruction* store_inst) { + ir::BasicBlock* store_block = context()->get_instr_block(store_inst); + opt::DominatorAnalysis* dominator_analysis = + context()->GetDominatorAnalysis(store_block->GetParent(), *cfg()); + + return get_def_use_mgr()->WhileEachUser( + ptr_inst, + [this, store_inst, dominator_analysis, ptr_inst](ir::Instruction* use) { + if (use->opcode() == SpvOpLoad || + use->opcode() == SpvOpImageTexelPointer) { + // TODO: If there are many load in the same BB as |store_inst| the + // time to do the multiple traverses can add up. Consider collecting + // those loads and doing a single traversal. + return dominator_analysis->Dominates(store_inst, use); + } else if (use->opcode() == SpvOpAccessChain) { + return HasValidReferencesOnly(use, store_inst); + } else if (use->IsDecoration() || use->opcode() == SpvOpName) { + return true; + } else if (use->opcode() == SpvOpStore) { + // If we are storing to part of the object it is not an candidate. + return ptr_inst->opcode() == SpvOpVariable && + store_inst->GetSingleWordInOperand(kStorePointerInOperand) == + ptr_inst->result_id(); + } + // Some other instruction. Be conservative. + return false; + }); +} + +std::unique_ptr +CopyPropagateArrays::GetSourceObjectIfAny(uint32_t result) { + ir::Instruction* result_inst = context()->get_def_use_mgr()->GetDef(result); + + switch (result_inst->opcode()) { + case SpvOpLoad: + return BuildMemoryObjectFromLoad(result_inst); + case SpvOpCompositeExtract: + return BuildMemoryObjectFromExtract(result_inst); + case SpvOpCompositeConstruct: + return BuildMemoryObjectFromCompositeConstruct(result_inst); + case SpvOpCopyObject: + return GetSourceObjectIfAny(result_inst->GetSingleWordInOperand(0)); + case SpvOpCompositeInsert: + return BuildMemoryObjectFromInsert(result_inst); + default: + return nullptr; + } +} + +std::unique_ptr +CopyPropagateArrays::BuildMemoryObjectFromLoad(ir::Instruction* load_inst) { + std::vector components_in_reverse; + analysis::DefUseManager* def_use_mgr = context()->get_def_use_mgr(); + + ir::Instruction* current_inst = def_use_mgr->GetDef( + load_inst->GetSingleWordInOperand(kLoadPointerInOperand)); + + // Build the access chain for the memory object by collecting the indices used + // in the OpAccessChain instructions. If we find a variable index, then + // return |nullptr| because we cannot know for sure which memory location is + // used. + // + // It is built in reverse order because the different |OpAccessChain| + // instructions are visited in reverse order from which they are applied. + while (current_inst->opcode() == SpvOpAccessChain) { + for (uint32_t i = current_inst->NumInOperands() - 1; i >= 1; --i) { + uint32_t element_index_id = current_inst->GetSingleWordInOperand(i); + components_in_reverse.push_back(element_index_id); + } + current_inst = def_use_mgr->GetDef(current_inst->GetSingleWordInOperand(0)); + } + + // If the address in the load is not constructed from an |OpVariable| + // instruction followed by a series of |OpAccessChain| instructions, then + // return |nullptr| because we cannot identify the owner or access chain + // exactly. + if (current_inst->opcode() != SpvOpVariable) { + return nullptr; + } + + // Build the memory object. Use |rbegin| and |rend| to put the access chain + // back in the correct order. + return std::unique_ptr( + new MemoryObject(current_inst, components_in_reverse.rbegin(), + components_in_reverse.rend())); +} + +std::unique_ptr +CopyPropagateArrays::BuildMemoryObjectFromExtract( + ir::Instruction* extract_inst) { + assert(extract_inst->opcode() == SpvOpCompositeExtract && + "Expecting an OpCompositeExtract instruction."); + analysis::ConstantManager* const_mgr = context()->get_constant_mgr(); + + std::unique_ptr result = GetSourceObjectIfAny( + extract_inst->GetSingleWordInOperand(kCompositeExtractObjectInOperand)); + + if (result) { + analysis::Integer int_type(32, false); + const analysis::Type* uint32_type = + context()->get_type_mgr()->GetRegisteredType(&int_type); + + std::vector components; + // Convert the indices in the extract instruction to a series of ids that + // can be used by the |OpAccessChain| instruction. + for (uint32_t i = 1; i < extract_inst->NumInOperands(); ++i) { + uint32_t index = extract_inst->GetSingleWordInOperand(1); + const analysis::Constant* index_const = + const_mgr->GetConstant(uint32_type, {index}); + components.push_back( + const_mgr->GetDefiningInstruction(index_const)->result_id()); + } + result->GetMember(components); + return result; + } + return nullptr; +} + +std::unique_ptr +CopyPropagateArrays::BuildMemoryObjectFromCompositeConstruct( + ir::Instruction* conststruct_inst) { + assert(conststruct_inst->opcode() == SpvOpCompositeConstruct && + "Expecting an OpCompositeConstruct instruction."); + + // If every operand in the instruction are part of the same memory object, and + // are being combined in the same order, then the result is the same as the + // parent. + + std::unique_ptr memory_object = + GetSourceObjectIfAny(conststruct_inst->GetSingleWordInOperand(0)); + + if (!memory_object) { + return nullptr; + } + + if (!memory_object->IsMember()) { + return nullptr; + } + + analysis::ConstantManager* const_mgr = context()->get_constant_mgr(); + const analysis::Constant* last_access = + const_mgr->FindDeclaredConstant(memory_object->AccessChain().back()); + if (!last_access || + (!last_access->AsIntConstant() && !last_access->AsNullConstant())) { + return nullptr; + } + + if (last_access->GetU32() != 0) { + return nullptr; + } + + memory_object->GetParent(); + + if (memory_object->GetNumberOfMembers() != + conststruct_inst->NumInOperands()) { + return nullptr; + } + + for (uint32_t i = 1; i < conststruct_inst->NumInOperands(); ++i) { + std::unique_ptr member_object = + GetSourceObjectIfAny(conststruct_inst->GetSingleWordInOperand(i)); + + if (!member_object->IsMember()) { + return nullptr; + } + + if (!memory_object->Contains(member_object.get())) { + return nullptr; + } + + last_access = + const_mgr->FindDeclaredConstant(member_object->AccessChain().back()); + if (!last_access || !last_access->AsIntConstant()) { + return nullptr; + } + + if (last_access->GetU32() != i) { + return nullptr; + } + } + return memory_object; +} + +std::unique_ptr +CopyPropagateArrays::BuildMemoryObjectFromInsert(ir::Instruction* insert_inst) { + assert(insert_inst->opcode() == SpvOpCompositeInsert && + "Expecting an OpCompositeInsert instruction."); + + analysis::DefUseManager* def_use_mgr = context()->get_def_use_mgr(); + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::ConstantManager* const_mgr = context()->get_constant_mgr(); + const analysis::Type* result_type = type_mgr->GetType(insert_inst->type_id()); + + uint32_t number_of_elements = 0; + if (const analysis::Struct* struct_type = result_type->AsStruct()) { + number_of_elements = + static_cast(struct_type->element_types().size()); + } else if (const analysis::Array* array_type = result_type->AsArray()) { + const analysis::Constant* length_const = + const_mgr->FindDeclaredConstant(array_type->LengthId()); + assert(length_const->AsIntConstant()); + number_of_elements = length_const->AsIntConstant()->GetU32(); + } else if (const analysis::Vector* vector_type = result_type->AsVector()) { + number_of_elements = vector_type->element_count(); + } else if (const analysis::Matrix* matrix_type = result_type->AsMatrix()) { + number_of_elements = matrix_type->element_count(); + } + + if (number_of_elements == 0) { + return nullptr; + } + + if (insert_inst->NumInOperands() != 3) { + return nullptr; + } + + if (insert_inst->GetSingleWordInOperand(2) != number_of_elements - 1) { + return nullptr; + } + + std::unique_ptr memory_object = + GetSourceObjectIfAny(insert_inst->GetSingleWordInOperand(0)); + + if (!memory_object) { + return nullptr; + } + + if (!memory_object->IsMember()) { + return nullptr; + } + + const analysis::Constant* last_access = + const_mgr->FindDeclaredConstant(memory_object->AccessChain().back()); + if (!last_access || !last_access->AsIntConstant()) { + return nullptr; + } + + if (last_access->GetU32() != number_of_elements - 1) { + return nullptr; + } + + memory_object->GetParent(); + + ir::Instruction* current_insert = + def_use_mgr->GetDef(insert_inst->GetSingleWordInOperand(1)); + for (uint32_t i = number_of_elements - 1; i > 0; --i) { + if (current_insert->opcode() != SpvOpCompositeInsert) { + return nullptr; + } + + if (current_insert->NumInOperands() != 3) { + return nullptr; + } + + if (current_insert->GetSingleWordInOperand(2) != i - 1) { + return nullptr; + } + + std::unique_ptr current_memory_object = + GetSourceObjectIfAny(current_insert->GetSingleWordInOperand(0)); + + if (!current_memory_object) { + return nullptr; + } + + if (!current_memory_object->IsMember()) { + return nullptr; + } + + if (memory_object->AccessChain().size() + 1 != + current_memory_object->AccessChain().size()) { + return nullptr; + } + + if (!memory_object->Contains(current_memory_object.get())) { + return nullptr; + } + + const analysis::Constant* current_last_access = + const_mgr->FindDeclaredConstant( + current_memory_object->AccessChain().back()); + if (!current_last_access || !current_last_access->AsIntConstant()) { + return nullptr; + } + + if (current_last_access->GetU32() != i - 1) { + return nullptr; + } + current_insert = + def_use_mgr->GetDef(current_insert->GetSingleWordInOperand(1)); + } + + return memory_object; +} + +bool CopyPropagateArrays::IsPointerToArrayType(uint32_t type_id) { + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::Pointer* pointer_type = type_mgr->GetType(type_id)->AsPointer(); + if (pointer_type) { + return pointer_type->pointee_type()->kind() == analysis::Type::kArray || + pointer_type->pointee_type()->kind() == analysis::Type::kImage; + } + return false; +} + +bool CopyPropagateArrays::CanUpdateUses(ir::Instruction* original_ptr_inst, + uint32_t type_id) { + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::ConstantManager* const_mgr = context()->get_constant_mgr(); + analysis::DefUseManager* def_use_mgr = context()->get_def_use_mgr(); + + analysis::Type* type = type_mgr->GetType(type_id); + if (type->AsRuntimeArray()) { + return false; + } + + if (!type->AsStruct() && !type->AsArray() && !type->AsPointer()) { + // If the type is not an aggregate, then the desired type must be the + // same as the current type. No work to do, and we can do that. + return true; + } + + return def_use_mgr->WhileEachUse( + original_ptr_inst, + [this, type_mgr, const_mgr, type](ir::Instruction* use, uint32_t) { + switch (use->opcode()) { + case SpvOpLoad: { + analysis::Pointer* pointer_type = type->AsPointer(); + uint32_t new_type_id = + type_mgr->GetId(pointer_type->pointee_type()); + + if (new_type_id != use->type_id()) { + return CanUpdateUses(use, new_type_id); + } + return true; + } + case SpvOpAccessChain: { + analysis::Pointer* pointer_type = type->AsPointer(); + const analysis::Type* pointee_type = pointer_type->pointee_type(); + + std::vector access_chain; + for (uint32_t i = 1; i < use->NumInOperands(); ++i) { + const analysis::Constant* index_const = + const_mgr->FindDeclaredConstant( + use->GetSingleWordInOperand(i)); + if (index_const) { + access_chain.push_back(index_const->AsIntConstant()->GetU32()); + } else { + // Variable index means the type is a type where every element + // is the same type. Use element 0 to get the type. + access_chain.push_back(0); + } + } + + const analysis::Type* new_pointee_type = + type_mgr->GetMemberType(pointee_type, access_chain); + opt::analysis::Pointer pointerTy(new_pointee_type, + pointer_type->storage_class()); + uint32_t new_pointer_type_id = + context()->get_type_mgr()->GetTypeInstruction(&pointerTy); + + if (new_pointer_type_id != use->type_id()) { + return CanUpdateUses(use, new_pointer_type_id); + } + return true; + } + case SpvOpCompositeExtract: { + std::vector access_chain; + for (uint32_t i = 1; i < use->NumInOperands(); ++i) { + access_chain.push_back(use->GetSingleWordInOperand(i)); + } + + const analysis::Type* new_type = + type_mgr->GetMemberType(type, access_chain); + uint32_t new_type_id = type_mgr->GetTypeInstruction(new_type); + + if (new_type_id != use->type_id()) { + return CanUpdateUses(use, new_type_id); + } + return true; + } + case SpvOpStore: + // Can't handle changing the type of a store. There are too many + // other things that might need to change as well. Not worth the + // effort. Punting for now. + + // TODO (s-perron): This can be handled by expanding the store into + // a series of extracts, composite constructs, and a store. + return true; + case SpvOpImageTexelPointer: + case SpvOpName: + return true; + default: + return use->IsDecoration(); + } + }); +} +void CopyPropagateArrays::UpdateUses(ir::Instruction* original_ptr_inst, + ir::Instruction* new_ptr_inst) { + // TODO (s-perron): Keep the def-use manager up to date. Not done now because + // it can cause problems for the |ForEachUse| traversals. Can be use by + // keeping a list of instructions that need updating, and then updating them + // in |PropagateObject|. + + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::ConstantManager* const_mgr = context()->get_constant_mgr(); + analysis::DefUseManager* def_use_mgr = context()->get_def_use_mgr(); + + std::vector > uses; + def_use_mgr->ForEachUse(original_ptr_inst, + [&uses](ir::Instruction* use, uint32_t index) { + uses.push_back({use, index}); + }); + + for (auto pair : uses) { + ir::Instruction* use = pair.first; + uint32_t index = pair.second; + analysis::Pointer* pointer_type = nullptr; + switch (use->opcode()) { + case SpvOpLoad: { + // Replace the actual use. + context()->ForgetUses(use); + use->SetOperand(index, {new_ptr_inst->result_id()}); + + // Update the type. + pointer_type = type_mgr->GetType(new_ptr_inst->type_id())->AsPointer(); + uint32_t new_type_id = type_mgr->GetId(pointer_type->pointee_type()); + if (new_type_id != use->type_id()) { + use->SetResultType(new_type_id); + context()->AnalyzeUses(use); + UpdateUses(use, use); + } else { + context()->AnalyzeUses(use); + } + } break; + case SpvOpAccessChain: { + // Update the actual use. + context()->ForgetUses(use); + use->SetOperand(index, {new_ptr_inst->result_id()}); + + // Update the result type. + pointer_type = type_mgr->GetType(new_ptr_inst->type_id())->AsPointer(); + const analysis::Type* pointee_type = pointer_type->pointee_type(); + + // Convert the ids on the OpAccessChain to indices that can be used to + // get the specific member. + std::vector access_chain; + for (uint32_t i = 1; i < use->NumInOperands(); ++i) { + const analysis::Constant* index_const = + const_mgr->FindDeclaredConstant(use->GetSingleWordInOperand(i)); + if (index_const) { + access_chain.push_back(index_const->AsIntConstant()->GetU32()); + } else { + // Variable index means the type is an type where every element + // is the same type. Use element 0 to get the type. + access_chain.push_back(0); + } + } + const analysis::Type* new_pointee_type = + type_mgr->GetMemberType(pointee_type, access_chain); + + // Now build a pointer to the type of the member. + opt::analysis::Pointer new_pointer_type(new_pointee_type, + pointer_type->storage_class()); + uint32_t new_pointer_type_id = + context()->get_type_mgr()->GetTypeInstruction(&new_pointer_type); + + if (new_pointer_type_id != use->type_id()) { + use->SetResultType(new_pointer_type_id); + context()->AnalyzeUses(use); + UpdateUses(use, use); + } else { + context()->AnalyzeUses(use); + } + } break; + case SpvOpCompositeExtract: { + // Update the actual use. + context()->ForgetUses(use); + use->SetOperand(index, {new_ptr_inst->result_id()}); + + std::vector access_chain; + for (uint32_t i = 1; i < use->NumInOperands(); ++i) { + access_chain.push_back(use->GetSingleWordInOperand(i)); + } + + const analysis::Type* type = type_mgr->GetType(new_ptr_inst->type_id()); + const analysis::Type* new_type = + type_mgr->GetMemberType(type, access_chain); + uint32_t new_type_id = type_mgr->GetTypeInstruction(new_type); + + if (new_type_id != use->type_id()) { + use->SetResultType(new_type_id); + context()->AnalyzeUses(use); + UpdateUses(use, use); + } else { + context()->AnalyzeUses(use); + } + } break; + case SpvOpStore: + // If the use is the pointer, then it is the single store to that + // variable. We do not want to replace it. Instead, it will become + // dead after all of the loads are removed, and ADCE will get rid of it. + // + // If the use is the object being stored, we will create a copy of the + // object turning it into the correct type. The copy is done by + // decomposing the object into the base type, which must be the same, + // and then rebuilding them. + if (index == 1) { + ir::Instruction* target_pointer = def_use_mgr->GetDef( + use->GetSingleWordInOperand(kStorePointerInOperand)); + pointer_type = + type_mgr->GetType(target_pointer->type_id())->AsPointer(); + uint32_t copy = + GenerateCopy(original_ptr_inst, + type_mgr->GetId(pointer_type->pointee_type()), use); + + context()->ForgetUses(use); + use->SetInOperand(index, {copy}); + context()->AnalyzeUses(use); + } + break; + case SpvOpImageTexelPointer: + // We treat an OpImageTexelPointer as a load. The result type should + // always have the Image storage class, and should not need to be + // updated. + + // Replace the actual use. + context()->ForgetUses(use); + use->SetOperand(index, {new_ptr_inst->result_id()}); + context()->AnalyzeUses(use); + break; + default: + assert(false && "Don't know how to rewrite instruction"); + break; + } + } +} + +uint32_t CopyPropagateArrays::GenerateCopy( + ir::Instruction* object_inst, uint32_t new_type_id, + ir::Instruction* insertion_position) { + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::ConstantManager* const_mgr = context()->get_constant_mgr(); + + uint32_t original_type_id = object_inst->type_id(); + if (original_type_id == new_type_id) { + return object_inst->result_id(); + } + + opt::InstructionBuilder ir_builder( + context(), insertion_position, + ir::IRContext::kAnalysisInstrToBlockMapping | + ir::IRContext::kAnalysisDefUse); + + analysis::Type* original_type = type_mgr->GetType(original_type_id); + analysis::Type* new_type = type_mgr->GetType(new_type_id); + + if (const analysis::Array* original_array_type = original_type->AsArray()) { + uint32_t original_element_type_id = + type_mgr->GetId(original_array_type->element_type()); + + analysis::Array* new_array_type = new_type->AsArray(); + assert(new_array_type != nullptr && "Can't copy an array to a non-array."); + uint32_t new_element_type_id = + type_mgr->GetId(new_array_type->element_type()); + + std::vector element_ids; + const analysis::Constant* length_const = + const_mgr->FindDeclaredConstant(original_array_type->LengthId()); + assert(length_const->AsIntConstant()); + uint32_t array_length = length_const->AsIntConstant()->GetU32(); + for (uint32_t i = 0; i < array_length; i++) { + ir::Instruction* extract = ir_builder.AddCompositeExtract( + original_element_type_id, object_inst->result_id(), {i}); + element_ids.push_back( + GenerateCopy(extract, new_element_type_id, insertion_position)); + } + + return ir_builder.AddCompositeConstruct(new_type_id, element_ids) + ->result_id(); + } else if (const analysis::Struct* original_struct_type = + original_type->AsStruct()) { + analysis::Struct* new_struct_type = new_type->AsStruct(); + + const std::vector& original_types = + original_struct_type->element_types(); + const std::vector& new_types = + new_struct_type->element_types(); + std::vector element_ids; + for (uint32_t i = 0; i < original_types.size(); i++) { + ir::Instruction* extract = ir_builder.AddCompositeExtract( + type_mgr->GetId(original_types[i]), object_inst->result_id(), {i}); + element_ids.push_back(GenerateCopy(extract, type_mgr->GetId(new_types[i]), + insertion_position)); + } + return ir_builder.AddCompositeConstruct(new_type_id, element_ids) + ->result_id(); + } else { + // If we do not have an aggregate type, then we have a problem. Either we + // found multiple instances of the same type, or we are copying to an + // incompatible type. Either way the code is illegal. + assert(false && + "Don't know how to copy this type. Code is likely illegal."); + } + return 0; +} + +void CopyPropagateArrays::MemoryObject::GetMember( + const std::vector& access_chain) { + access_chain_.insert(access_chain_.end(), access_chain.begin(), + access_chain.end()); +} + +uint32_t CopyPropagateArrays::MemoryObject::GetNumberOfMembers() { + ir::IRContext* context = variable_inst_->context(); + analysis::TypeManager* type_mgr = context->get_type_mgr(); + + const analysis::Type* type = type_mgr->GetType(variable_inst_->type_id()); + type = type->AsPointer()->pointee_type(); + + std::vector access_indices = GetAccessIds(); + type = type_mgr->GetMemberType(type, access_indices); + + if (const analysis::Struct* struct_type = type->AsStruct()) { + return static_cast(struct_type->element_types().size()); + } else if (const analysis::Array* array_type = type->AsArray()) { + const analysis::Constant* length_const = + context->get_constant_mgr()->FindDeclaredConstant( + array_type->LengthId()); + assert(length_const->AsIntConstant()); + return length_const->AsIntConstant()->GetU32(); + } else if (const analysis::Vector* vector_type = type->AsVector()) { + return vector_type->element_count(); + } else if (const analysis::Matrix* matrix_type = type->AsMatrix()) { + return matrix_type->element_count(); + } else { + return 0; + } +} + +template +CopyPropagateArrays::MemoryObject::MemoryObject(ir::Instruction* var_inst, + iterator begin, iterator end) + : variable_inst_(var_inst), access_chain_(begin, end) {} + +std::vector CopyPropagateArrays::MemoryObject::GetAccessIds() const { + analysis::ConstantManager* const_mgr = + variable_inst_->context()->get_constant_mgr(); + + std::vector access_indices; + for (uint32_t id : AccessChain()) { + const analysis::Constant* element_index_const = + const_mgr->FindDeclaredConstant(id); + if (!element_index_const) { + access_indices.push_back(0); + } else { + assert(element_index_const->AsIntConstant()); + access_indices.push_back(element_index_const->AsIntConstant()->GetU32()); + } + } + return access_indices; +} + +bool CopyPropagateArrays::MemoryObject::Contains( + CopyPropagateArrays::MemoryObject* other) { + if (this->GetVariable() != other->GetVariable()) { + return false; + } + + if (AccessChain().size() > other->AccessChain().size()) { + return false; + } + + for (uint32_t i = 0; i < AccessChain().size(); i++) { + if (AccessChain()[i] != other->AccessChain()[i]) { + return false; + } + } + return true; +} + +} // namespace opt +} // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/copy_prop_arrays.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/copy_prop_arrays.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/copy_prop_arrays.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/copy_prop_arrays.h 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,231 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#ifndef LIBSPIRV_OPT_COPY_PROP_H_ +#define LIBSPIRV_OPT_COPY_PROP_H_ + +#include "mem_pass.h" + +namespace spvtools { +namespace opt { + +// This pass implements a simple array copy propagation. It does not do a full +// array data flow. It looks for simple cases that meet the following +// conditions: +// +// 1) The source must never be stored to. +// 2) The target must be stored to exactly once. +// 3) The store to the target must be a store to the entire array, and be a +// copy of the entire source. +// 4) All loads of the target must be dominated by the store. +// +// The hard part is keeping all of the types correct. We do not want to +// have to do too large a search to update everything, which may not be +// possible, do we give up if we see any instruction that might be hard to +// update. + +class CopyPropagateArrays : public MemPass { + public: + const char* name() const override { return "copy-propagate-arrays"; } + Status Process(ir::IRContext*) override; + + ir::IRContext::Analysis GetPreservedAnalyses() override { + return ir::IRContext::kAnalysisDefUse | ir::IRContext::kAnalysisCFG | + ir::IRContext::kAnalysisInstrToBlockMapping | + ir::IRContext::kAnalysisLoopAnalysis | + ir::IRContext::kAnalysisDecorations | + ir::IRContext::kAnalysisDominatorAnalysis | + ir::IRContext::kAnalysisNameMap; + } + + private: + // The class used to identify a particular memory object. This memory object + // will be owned by a particular variable, meaning that the memory is part of + // that variable. It could be the entire variable or a member of the + // variable. + class MemoryObject { + public: + // Construction a memory object that is owned by |var_inst|. The iterator + // |begin| and |end| traverse a container of integers that identify which + // member of |var_inst| this memory object will represent. These integers + // are interpreted the same way they would be in an |OpAccessChain| + // instruction. + template + MemoryObject(ir::Instruction* var_inst, iterator begin, iterator end); + + // Change |this| to now point to the member identified by |access_chain| + // (starting from the current member). The elements in |access_chain| are + // interpreted the same as the indices in the |OpAccessChain| + // instruction. + void GetMember(const std::vector& access_chain); + + // Change |this| to now represent the first enclosing object to which it + // belongs. (Remove the last element off the access_chain). It is invalid + // to call this function if |this| does not represent a member of its owner. + void GetParent() { + assert(IsMember()); + access_chain_.pop_back(); + } + + // Returns true if |this| represents a member of its owner, and not the + // entire variable. + bool IsMember() const { return !access_chain_.empty(); } + + // Returns the number of members in the object represented by |this|. If + // |this| does not represent a composite type, the return value will be 0. + uint32_t GetNumberOfMembers(); + + // Returns the owning variable that the memory object is contained in. + ir::Instruction* GetVariable() const { return variable_inst_; } + + // Returns a vector of integers that can be used to access the specific + // member that |this| represents starting from the owning variable. These + // values are to be interpreted the same way the indices are in an + // |OpAccessChain| instruction. + const std::vector& AccessChain() const { return access_chain_; } + + // Returns the type id of the pointer type that can be used to point to this + // memory object. + uint32_t GetPointerTypeId() const { + analysis::TypeManager* type_mgr = + GetVariable()->context()->get_type_mgr(); + const analysis::Pointer* pointer_type = + type_mgr->GetType(GetVariable()->type_id())->AsPointer(); + const analysis::Type* var_type = pointer_type->pointee_type(); + const analysis::Type* member_type = + type_mgr->GetMemberType(var_type, GetAccessIds()); + uint32_t member_type_id = type_mgr->GetId(member_type); + assert(member_type != 0); + uint32_t member_pointer_type_id = type_mgr->FindPointerToType( + member_type_id, pointer_type->storage_class()); + return member_pointer_type_id; + } + + // Returns the storage class of the memory object. + SpvStorageClass GetStorageClass() const { + analysis::TypeManager* type_mgr = + GetVariable()->context()->get_type_mgr(); + const analysis::Pointer* pointer_type = + type_mgr->GetType(GetVariable()->type_id())->AsPointer(); + return pointer_type->storage_class(); + } + + // Returns true if |other| represents memory that is contains inside of the + // memory represented by |this|. + bool Contains(MemoryObject* other); + + private: + // The variable that owns this memory object. + ir::Instruction* variable_inst_; + + // The access chain to reach the particular member the memory object + // represents. It should be interpreted the same way the indices in an + // |OpAccessChain| are interpreted. + std::vector access_chain_; + std::vector GetAccessIds() const; + }; + + // Returns the memory object being stored to |var_inst| in the store + // instruction |store_inst|, if one exists, that can be used in place of + // |var_inst| in all of the loads of |var_inst|. This code is conservative + // and only identifies very simple cases. If no such memory object can be + // found, the return value is |nullptr|. + std::unique_ptr FindSourceObjectIfPossible( + ir::Instruction* var_inst, ir::Instruction* store_inst); + + // Replaces all loads of |var_inst| with a load from |source| instead. + // |insertion_pos| is a position where it is possible to construct the + // address of |source| and also dominates all of the loads of |var_inst|. + void PropagateObject(ir::Instruction* var_inst, MemoryObject* source, + ir::Instruction* insertion_pos); + + // Returns true if all of the references to |ptr_inst| can be rewritten and + // are dominated by |store_inst|. + bool HasValidReferencesOnly(ir::Instruction* ptr_inst, + ir::Instruction* store_inst); + + // Returns a memory object that at one time was equivalent to the value in + // |result|. If no such memory object exists, the return value is |nullptr|. + std::unique_ptr GetSourceObjectIfAny(uint32_t result); + + // Returns the memory object that is loaded by |load_inst|. If a memory + // object cannot be identified, the return value is |nullptr|. The opcode of + // |load_inst| must be |OpLoad|. + std::unique_ptr BuildMemoryObjectFromLoad( + ir::Instruction* load_inst); + + // Returns the memory object that at some point was equivalent to the result + // of |extract_inst|. If a memory object cannot be identified, the return + // value is |nullptr|. The opcode of |extract_inst| must be + // |OpCompositeExtract|. + std::unique_ptr BuildMemoryObjectFromExtract( + ir::Instruction* extract_inst); + + // Returns the memory object that at some point was equivalent to the result + // of |construct_inst|. If a memory object cannot be identified, the return + // value is |nullptr|. The opcode of |constuct_inst| must be + // |OpCompositeConstruct|. + std::unique_ptr BuildMemoryObjectFromCompositeConstruct( + ir::Instruction* conststruct_inst); + + // Returns the memory object that at some point was equivalent to the result + // of |insert_inst|. If a memory object cannot be identified, the return + // value is |nullptr\. The opcode of |insert_inst| must be + // |OpCompositeInsert|. This function looks for a series of + // |OpCompositeInsert| instructions that insert the elements one at a time in + // order from beginning to end. + std::unique_ptr BuildMemoryObjectFromInsert( + ir::Instruction* insert_inst); + + // Return true if |type_id| is a pointer type whose pointee type is an array. + bool IsPointerToArrayType(uint32_t type_id); + + // Returns true of there are not stores using |ptr_inst| or something derived + // from it. + bool HasNoStores(ir::Instruction* ptr_inst); + + // Creates an |OpAccessChain| instruction whose result is a pointer the memory + // represented by |source|. The new instruction will be placed before + // |insertion_point|. |insertion_point| must be part of a function. Returns + // the new instruction. + ir::Instruction* BuildNewAccessChain(ir::Instruction* insertion_point, + MemoryObject* source) const; + + // Rewrites all uses of |original_ptr| to use |new_pointer_inst| updating + // types of other instructions as needed. This function should not be called + // if |CanUpdateUses(original_ptr_inst, new_pointer_inst->type_id())| returns + // false. + void UpdateUses(ir::Instruction* original_ptr_inst, + ir::Instruction* new_pointer_inst); + + // Return true if |UpdateUses| is able to change all of the uses of + // |original_ptr_inst| to |type_id| and still have valid code. + bool CanUpdateUses(ir::Instruction* original_ptr_inst, uint32_t type_id); + + // Returns the id whose value is the same as |object_to_copy| except its type + // is |new_type_id|. Any instructions need to generate this value will be + // inserted before |insertion_position|. + uint32_t GenerateCopy(ir::Instruction* object_to_copy, uint32_t new_type_id, + ir::Instruction* insertion_position); + + // Returns a store to |var_inst| that writes to the entire variable, and is + // the only store that does so. Note it does not look through OpAccessChain + // instruction, so partial stores are not considered. + ir::Instruction* FindStoreInstruction(const ir::Instruction* var_inst) const; +}; + +} // namespace opt +} // namespace spvtools + +#endif // LIBSPIRV_OPT_COPY_PROP_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dead_branch_elim_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dead_branch_elim_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dead_branch_elim_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dead_branch_elim_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -211,12 +211,17 @@ operands.push_back(inst->GetOperand(0u)); operands.push_back(inst->GetOperand(1u)); // Iterate through the incoming labels and determine which to keep - // and/or modify. + // and/or modify. If there in an unreachable continue block, there will + // be an edge from that block to the header. We need to keep it to + // maintain the structured control flow. If the header has more that 2 + // incoming edges, then the OpPhi must have an entry for that edge. + // However, if there is only one other incoming edge, the OpPhi can be + // eliminated. for (uint32_t i = 1; i < inst->NumInOperands(); i += 2) { ir::BasicBlock* inc = GetParentBlock(inst->GetSingleWordInOperand(i)); auto cont_iter = unreachable_continues.find(inc); if (cont_iter != unreachable_continues.end() && - cont_iter->second == &block) { + cont_iter->second == &block && inst->NumInOperands() > 4) { if (get_def_use_mgr() ->GetDef(inst->GetSingleWordInOperand(i - 1)) ->opcode() == SpvOpUndef) { @@ -250,7 +255,8 @@ modified = true; uint32_t continue_id = block.ContinueBlockIdIfAny(); if (!backedge_added && continue_id != 0 && - unreachable_continues.count(GetParentBlock(continue_id))) { + unreachable_continues.count(GetParentBlock(continue_id)) && + operands.size() > 4) { // Changed the backedge to branch from the continue block instead // of a successor of the continue block. Add an entry to the phi to // provide an undef for the continue block. Since the successor of @@ -361,20 +367,6 @@ void DeadBranchElimPass::Initialize(ir::IRContext* c) { InitializeProcessing(c); - - // Initialize extension whitelist - InitExtensions(); -}; - -bool DeadBranchElimPass::AllExtensionsSupported() const { - // If any extension not in whitelist, return false - for (auto& ei : get_module()->extensions()) { - const char* extName = - reinterpret_cast(&ei.GetInOperand(0).words[0]); - if (extensions_whitelist_.find(extName) == extensions_whitelist_.end()) - return false; - } - return true; } Pass::Status DeadBranchElimPass::ProcessImpl() { @@ -383,8 +375,6 @@ // TODO(greg-lunarg): Add support for OpGroupDecorate for (auto& ai : get_module()->annotations()) if (ai.opcode() == SpvOpGroupDecorate) return Status::SuccessWithoutChange; - // Do not process if any disallowed extensions are enabled - if (!AllExtensionsSupported()) return Status::SuccessWithoutChange; // Process all entry point functions ProcessFunction pfn = [this](ir::Function* fp) { return EliminateDeadBranches(fp); @@ -400,33 +390,5 @@ return ProcessImpl(); } -void DeadBranchElimPass::InitExtensions() { - extensions_whitelist_.clear(); - extensions_whitelist_.insert({ - "SPV_AMD_shader_explicit_vertex_parameter", - "SPV_AMD_shader_trinary_minmax", - "SPV_AMD_gcn_shader", - "SPV_KHR_shader_ballot", - "SPV_AMD_shader_ballot", - "SPV_AMD_gpu_shader_half_float", - "SPV_KHR_shader_draw_parameters", - "SPV_KHR_subgroup_vote", - "SPV_KHR_16bit_storage", - "SPV_KHR_device_group", - "SPV_KHR_multiview", - "SPV_NVX_multiview_per_view_attributes", - "SPV_NV_viewport_array2", - "SPV_NV_stereo_view_rendering", - "SPV_NV_sample_mask_override_coverage", - "SPV_NV_geometry_shader_passthrough", - "SPV_AMD_texture_gather_bias_lod", - "SPV_KHR_storage_buffer_storage_class", - "SPV_KHR_variable_pointers", - "SPV_AMD_gpu_shader_int16", - "SPV_KHR_post_depth_coverage", - "SPV_KHR_shader_atomic_counter_ops", - }); -} - } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dead_branch_elim_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dead_branch_elim_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dead_branch_elim_pass.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dead_branch_elim_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -128,17 +128,8 @@ const std::unordered_map& unreachable_continues); - // Initialize extensions whitelist - void InitExtensions(); - - // Return true if all extensions in this module are allowed by this pass. - bool AllExtensionsSupported() const; - void Initialize(ir::IRContext* c); Pass::Status ProcessImpl(); - - // Extensions supported by this pass. - std::unordered_set extensions_whitelist_; }; } // namespace opt diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dead_insert_elim_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dead_insert_elim_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dead_insert_elim_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dead_insert_elim_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -138,18 +138,31 @@ // If insert chain ended with phi, do recursive call on each operand if (insInst->opcode() != SpvOpPhi) return; // Mark phi visited to prevent potential infinite loop. If phi is already - // visited, return to avoid infinite loop - if (!visitedPhis_.insert(insInst->result_id()).second) return; - uint32_t icnt = 0; - insInst->ForEachInId([&icnt, &pExtIndices, &extOffset, this](uint32_t* idp) { - if (icnt % 2 == 0) { - ir::Instruction* pi = get_def_use_mgr()->GetDef(*idp); - MarkInsertChain(pi, pExtIndices, extOffset); - } - ++icnt; - }); - // Unmark phi when done visiting - visitedPhis_.erase(insInst->result_id()); + // visited, return to avoid infinite loop. + auto iter = visitedPhis_.find(insInst->result_id()); + if (iter == visitedPhis_.end()) { + iter = visitedPhis_.emplace(insInst->result_id(), true).first; + } else if (iter->second) { + return; + } else { + iter->second = true; + } + + // Phis may have duplicate inputs values for different edges, prune incoming + // ids lists before recursing. + std::vector ids; + for (uint32_t i = 0; i < insInst->NumInOperands(); i += 2) { + ids.push_back(insInst->GetSingleWordInOperand(i)); + } + std::sort(ids.begin(), ids.end()); + auto new_end = std::unique(ids.begin(), ids.end()); + for (auto id_iter = ids.begin(); id_iter != new_end; ++id_iter) { + ir::Instruction* pi = get_def_use_mgr()->GetDef(*id_iter); + MarkInsertChain(pi, pExtIndices, extOffset); + } + + // Unmark phi when done visiting. + iter->second = false; } bool DeadInsertElimPass::EliminateDeadInserts(ir::Function* func) { @@ -244,25 +257,9 @@ void DeadInsertElimPass::Initialize(ir::IRContext* c) { InitializeProcessing(c); - - // Initialize extension whitelist - InitExtensions(); -}; - -bool DeadInsertElimPass::AllExtensionsSupported() const { - // If any extension not in whitelist, return false - for (auto& ei : get_module()->extensions()) { - const char* extName = - reinterpret_cast(&ei.GetInOperand(0).words[0]); - if (extensions_whitelist_.find(extName) == extensions_whitelist_.end()) - return false; - } - return true; } Pass::Status DeadInsertElimPass::ProcessImpl() { - // Do not process if any disallowed extensions are enabled - if (!AllExtensionsSupported()) return Status::SuccessWithoutChange; // Process all entry point functions. ProcessFunction pfn = [this](ir::Function* fp) { return EliminateDeadInserts(fp); @@ -278,33 +275,5 @@ return ProcessImpl(); } -void DeadInsertElimPass::InitExtensions() { - extensions_whitelist_.clear(); - extensions_whitelist_.insert({ - "SPV_AMD_shader_explicit_vertex_parameter", - "SPV_AMD_shader_trinary_minmax", - "SPV_AMD_gcn_shader", - "SPV_KHR_shader_ballot", - "SPV_AMD_shader_ballot", - "SPV_AMD_gpu_shader_half_float", - "SPV_KHR_shader_draw_parameters", - "SPV_KHR_subgroup_vote", - "SPV_KHR_16bit_storage", - "SPV_KHR_device_group", - "SPV_KHR_multiview", - "SPV_NVX_multiview_per_view_attributes", - "SPV_NV_viewport_array2", - "SPV_NV_stereo_view_rendering", - "SPV_NV_sample_mask_override_coverage", - "SPV_NV_geometry_shader_passthrough", - "SPV_AMD_texture_gather_bias_lod", - "SPV_KHR_storage_buffer_storage_class", - "SPV_KHR_variable_pointers", - "SPV_AMD_gpu_shader_int16", - "SPV_KHR_post_depth_coverage", - "SPV_KHR_shader_atomic_counter_ops", - }); -} - } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dead_insert_elim_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dead_insert_elim_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dead_insert_elim_pass.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dead_insert_elim_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -36,7 +36,7 @@ class DeadInsertElimPass : public MemPass { public: DeadInsertElimPass(); - const char* name() const override { return "eliminate-dead-insert"; } + const char* name() const override { return "eliminate-dead-inserts"; } Status Process(ir::IRContext*) override; private: @@ -63,9 +63,6 @@ // arrays are not currently eliminated. bool EliminateDeadInsertsOnePass(ir::Function* func); - // Initialize extensions whitelist - void InitExtensions(); - // Return true if all extensions in this module are allowed by this pass. bool AllExtensionsSupported() const; @@ -76,10 +73,7 @@ std::unordered_set liveInserts_; // Visited phis as insert chain is traversed; used to avoid infinite loop - std::unordered_set visitedPhis_; - - // Extensions supported by this pass. - std::unordered_set extensions_whitelist_; + std::unordered_map visitedPhis_; }; } // namespace opt diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/decoration_manager.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/decoration_manager.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/decoration_manager.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/decoration_manager.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -18,14 +18,126 @@ #include #include +#include "ir_context.h" + namespace spvtools { namespace opt { namespace analysis { -void DecorationManager::RemoveDecorationsFrom(uint32_t id) { - auto const ids_iter = id_to_decoration_insts_.find(id); +void DecorationManager::RemoveDecorationsFrom( + uint32_t id, std::function pred) { + const auto ids_iter = id_to_decoration_insts_.find(id); if (ids_iter == id_to_decoration_insts_.end()) return; - id_to_decoration_insts_.erase(ids_iter); + + TargetData& decorations_info = ids_iter->second; + auto context = module_->context(); + std::vector insts_to_kill; + const bool is_group = !decorations_info.decorate_insts.empty(); + + // Schedule all direct decorations for removal if instructed as such by + // |pred|. + for (ir::Instruction* inst : decorations_info.direct_decorations) + if (pred(*inst)) insts_to_kill.push_back(inst); + + // For all groups being directly applied to |id|, remove |id| (and the + // literal if |inst| is an OpGroupMemberDecorate) from the instruction + // applying the group. + std::unordered_set indirect_decorations_to_remove; + for (ir::Instruction* inst : decorations_info.indirect_decorations) { + assert(inst->opcode() == SpvOpGroupDecorate || + inst->opcode() == SpvOpGroupMemberDecorate); + + std::vector group_decorations_to_keep; + const uint32_t group_id = inst->GetSingleWordInOperand(0u); + const auto group_iter = id_to_decoration_insts_.find(group_id); + assert(group_iter != id_to_decoration_insts_.end() && + "Unknown decoration group"); + const auto& group_decorations = group_iter->second.direct_decorations; + for (ir::Instruction* decoration : group_decorations) { + if (!pred(*decoration)) group_decorations_to_keep.push_back(decoration); + } + + // If all decorations should be kept, move to the next group + if (group_decorations_to_keep.size() == group_decorations.size()) continue; + + // Otherwise, remove |id| from the targets of |group_id| + const uint32_t stride = inst->opcode() == SpvOpGroupDecorate ? 1u : 2u; + bool was_modified = false; + for (uint32_t i = 1u; i < inst->NumInOperands();) { + if (inst->GetSingleWordInOperand(i) != id) { + i += stride; + continue; + } + + const uint32_t last_operand_index = inst->NumInOperands() - stride; + if (i < last_operand_index) + inst->GetInOperand(i) = inst->GetInOperand(last_operand_index); + // Remove the associated literal, if it exists. + if (stride == 2u) { + if (i < last_operand_index) + inst->GetInOperand(i + 1u) = + inst->GetInOperand(last_operand_index + 1u); + inst->RemoveInOperand(last_operand_index + 1u); + } + inst->RemoveInOperand(last_operand_index); + was_modified = true; + } + + // If the instruction has no targets left, remove the instruction + // altogether. + if (inst->NumInOperands() == 1u) { + indirect_decorations_to_remove.emplace(inst); + insts_to_kill.push_back(inst); + } else if (was_modified) { + context->ForgetUses(inst); + indirect_decorations_to_remove.emplace(inst); + context->AnalyzeUses(inst); + } + + // If only some of the decorations should be kept, clone them and apply + // them directly to |id|. + if (!group_decorations_to_keep.empty()) { + for (ir::Instruction* decoration : group_decorations_to_keep) { + // simply clone decoration and change |group_id| to |id| + std::unique_ptr new_inst( + decoration->Clone(module_->context())); + new_inst->SetInOperand(0, {id}); + module_->AddAnnotationInst(std::move(new_inst)); + auto decoration_iter = --module_->annotation_end(); + context->AnalyzeUses(&*decoration_iter); + } + } + } + + auto& indirect_decorations = decorations_info.indirect_decorations; + indirect_decorations.erase( + std::remove_if( + indirect_decorations.begin(), indirect_decorations.end(), + [&indirect_decorations_to_remove](const ir::Instruction* inst) { + return indirect_decorations_to_remove.count(inst); + }), + indirect_decorations.end()); + + for (ir::Instruction* inst : insts_to_kill) context->KillInst(inst); + insts_to_kill.clear(); + + // Schedule all instructions applying the group for removal if this group no + // longer applies decorations, either directly or indirectly. + if (is_group && decorations_info.direct_decorations.empty() && + decorations_info.indirect_decorations.empty()) { + for (ir::Instruction* inst : decorations_info.decorate_insts) + insts_to_kill.push_back(inst); + } + for (ir::Instruction* inst : insts_to_kill) context->KillInst(inst); + + if (decorations_info.direct_decorations.empty() && + decorations_info.indirect_decorations.empty() && + decorations_info.decorate_insts.empty()) { + id_to_decoration_insts_.erase(ids_iter); + + // Remove the OpDecorationGroup defining this group. + if (is_group) context->KillInst(context->get_def_use_mgr()->GetDef(id)); + } } std::vector DecorationManager::GetDecorationsFor( @@ -44,32 +156,39 @@ using InstructionList = std::vector; using DecorationSet = std::set; - const InstructionList decorationsFor1 = GetDecorationsFor(id1, false); - const InstructionList decorationsFor2 = GetDecorationsFor(id2, false); + const InstructionList decorations_for1 = GetDecorationsFor(id1, false); + const InstructionList decorations_for2 = GetDecorationsFor(id2, false); // This function splits the decoration instructions into different sets, - // based on their opcode; only OpDecorate, OpDecorateId and OpMemberDecorate - // are considered, the other opcodes are ignored. + // based on their opcode; only OpDecorate, OpDecorateId, + // OpDecorateStringGOOGLE, and OpMemberDecorate are considered, the other + // opcodes are ignored. const auto fillDecorationSets = - [](const InstructionList& decorationList, DecorationSet* decorateSet, - DecorationSet* decorateIdSet, DecorationSet* memberDecorateSet) { - for (const ir::Instruction* inst : decorationList) { - std::u32string decorationPayload; + [](const InstructionList& decoration_list, DecorationSet* decorate_set, + DecorationSet* decorate_id_set, DecorationSet* decorate_string_set, + DecorationSet* member_decorate_set) { + for (const ir::Instruction* inst : decoration_list) { + std::u32string decoration_payload; // Ignore the opcode and the target as we do not want them to be // compared. - for (uint32_t i = 1u; i < inst->NumInOperands(); ++i) - for (uint32_t word : inst->GetInOperand(i).words) - decorationPayload.push_back(word); + for (uint32_t i = 1u; i < inst->NumInOperands(); ++i) { + for (uint32_t word : inst->GetInOperand(i).words) { + decoration_payload.push_back(word); + } + } switch (inst->opcode()) { case SpvOpDecorate: - decorateSet->emplace(std::move(decorationPayload)); + decorate_set->emplace(std::move(decoration_payload)); break; case SpvOpMemberDecorate: - memberDecorateSet->emplace(std::move(decorationPayload)); + member_decorate_set->emplace(std::move(decoration_payload)); break; case SpvOpDecorateId: - decorateIdSet->emplace(std::move(decorationPayload)); + decorate_id_set->emplace(std::move(decoration_payload)); + break; + case SpvOpDecorateStringGOOGLE: + decorate_string_set->emplace(std::move(decoration_payload)); break; default: break; @@ -77,21 +196,28 @@ } }; - DecorationSet decorateSetFor1; - DecorationSet decorateIdSetFor1; - DecorationSet memberDecorateSetFor1; - fillDecorationSets(decorationsFor1, &decorateSetFor1, &decorateIdSetFor1, - &memberDecorateSetFor1); - - DecorationSet decorateSetFor2; - DecorationSet decorateIdSetFor2; - DecorationSet memberDecorateSetFor2; - fillDecorationSets(decorationsFor2, &decorateSetFor2, &decorateIdSetFor2, - &memberDecorateSetFor2); - - return decorateSetFor1 == decorateSetFor2 && - decorateIdSetFor1 == decorateIdSetFor2 && - memberDecorateSetFor1 == memberDecorateSetFor2; + DecorationSet decorate_set_for1; + DecorationSet decorate_id_set_for1; + DecorationSet decorate_string_set_for1; + DecorationSet member_decorate_set_for1; + fillDecorationSets(decorations_for1, &decorate_set_for1, + &decorate_id_set_for1, &decorate_string_set_for1, + &member_decorate_set_for1); + + DecorationSet decorate_set_for2; + DecorationSet decorate_id_set_for2; + DecorationSet decorate_string_set_for2; + DecorationSet member_decorate_set_for2; + fillDecorationSets(decorations_for2, &decorate_set_for2, + &decorate_id_set_for2, &decorate_string_set_for2, + &member_decorate_set_for2); + + const bool result = decorate_set_for1 == decorate_set_for2 && + decorate_id_set_for1 == decorate_id_set_for2 && + member_decorate_set_for1 == member_decorate_set_for2 && + // Compare string sets last in case the strings are long. + decorate_string_set_for1 == decorate_string_set_for2; + return result; } // TODO(pierremoreau): If OpDecorateId is referencing an OpConstant, one could @@ -104,6 +230,7 @@ case SpvOpDecorate: case SpvOpMemberDecorate: case SpvOpDecorateId: + case SpvOpDecorateStringGOOGLE: break; default: return false; @@ -122,17 +249,6 @@ void DecorationManager::AnalyzeDecorations() { if (!module_) return; - // Collect all group ids. - for (const ir::Instruction& inst : module_->annotations()) { - switch (inst.opcode()) { - case SpvOpDecorationGroup: - group_to_decoration_insts_.insert({inst.result_id(), {}}); - break; - default: - break; - } - } - // For each group and instruction, collect all their decoration instructions. for (ir::Instruction& inst : module_->annotations()) { AddDecoration(&inst); @@ -142,35 +258,25 @@ switch (inst->opcode()) { case SpvOpDecorate: case SpvOpDecorateId: + case SpvOpDecorateStringGOOGLE: case SpvOpMemberDecorate: { - auto const target_id = inst->GetSingleWordInOperand(0u); - auto const group_iter = group_to_decoration_insts_.find(target_id); - if (group_iter != group_to_decoration_insts_.end()) - group_iter->second.push_back(inst); - else - id_to_decoration_insts_[target_id].push_back(inst); + const auto target_id = inst->GetSingleWordInOperand(0u); + id_to_decoration_insts_[target_id].direct_decorations.push_back(inst); break; } case SpvOpGroupDecorate: - for (uint32_t i = 1u; i < inst->NumInOperands(); ++i) { - auto const target_id = inst->GetSingleWordInOperand(i); - auto const group_iter = group_to_decoration_insts_.find(target_id); - if (group_iter != group_to_decoration_insts_.end()) - group_iter->second.push_back(inst); - else - id_to_decoration_insts_[target_id].push_back(inst); - } - break; - case SpvOpGroupMemberDecorate: - for (uint32_t i = 1u; i < inst->NumInOperands(); i += 2u) { - auto const target_id = inst->GetSingleWordInOperand(i); - auto const group_iter = group_to_decoration_insts_.find(target_id); - if (group_iter != group_to_decoration_insts_.end()) - group_iter->second.push_back(inst); - else - id_to_decoration_insts_[target_id].push_back(inst); + case SpvOpGroupMemberDecorate: { + const uint32_t start = inst->opcode() == SpvOpGroupDecorate ? 1u : 2u; + const uint32_t stride = start; + for (uint32_t i = start; i < inst->NumInOperands(); i += stride) { + const auto target_id = inst->GetSingleWordInOperand(i); + TargetData& target_data = id_to_decoration_insts_[target_id]; + target_data.indirect_decorations.push_back(inst); } + const auto target_id = inst->GetSingleWordInOperand(0u); + id_to_decoration_insts_[target_id].decorate_insts.push_back(inst); break; + } default: break; } @@ -180,46 +286,33 @@ std::vector DecorationManager::InternalGetDecorationsFor( uint32_t id, bool include_linkage) { std::vector decorations; - std::stack ids_to_process; - - const auto process = [&ids_to_process, &decorations](T inst) { - if (inst->opcode() == SpvOpGroupDecorate || - inst->opcode() == SpvOpGroupMemberDecorate) - ids_to_process.push(inst->GetSingleWordInOperand(0u)); - else - decorations.push_back(inst); - }; const auto ids_iter = id_to_decoration_insts_.find(id); // |id| has no decorations if (ids_iter == id_to_decoration_insts_.end()) return decorations; - // Process |id|'s decorations. Some of them might be groups, in which case - // add them to the stack. - for (ir::Instruction* inst : ids_iter->second) { - const bool is_linkage = - inst->opcode() == SpvOpDecorate && - inst->GetSingleWordInOperand(1u) == SpvDecorationLinkageAttributes; - if (include_linkage || !is_linkage) process(inst); - } - - // If the stack is not empty, then it contains groups ID: retrieve their - // decorations and process them. If any of those decorations is applying a - // group, push that group ID onto the stack. - while (!ids_to_process.empty()) { - const uint32_t id_to_process = ids_to_process.top(); - ids_to_process.pop(); - - // Retrieve the decorations of that group - const auto group_iter = group_to_decoration_insts_.find(id_to_process); - if (group_iter != group_to_decoration_insts_.end()) { - // Process all the decorations applied by the group. - for (T inst : group_iter->second) process(inst); - } else { - // Something went wrong. - assert(false); - return std::vector(); - } + const TargetData& target_data = ids_iter->second; + + const auto process_direct_decorations = + [include_linkage, + &decorations](const std::vector& direct_decorations) { + for (ir::Instruction* inst : direct_decorations) { + const bool is_linkage = inst->opcode() == SpvOpDecorate && + inst->GetSingleWordInOperand(1u) == + SpvDecorationLinkageAttributes; + if (include_linkage || !is_linkage) decorations.push_back(inst); + } + }; + + // Process |id|'s decorations. + process_direct_decorations(ids_iter->second.direct_decorations); + + // Process the decorations of all groups applied to |id|. + for (const ir::Instruction* inst : target_data.indirect_decorations) { + const uint32_t group_id = inst->GetSingleWordInOperand(0u); + const auto group_iter = id_to_decoration_insts_.find(group_id); + assert(group_iter != id_to_decoration_insts_.end() && "Unknown group ID"); + process_direct_decorations(group_iter->second.direct_decorations); } return decorations; @@ -237,6 +330,7 @@ break; case SpvOpDecorate: case SpvOpDecorateId: + case SpvOpDecorateStringGOOGLE: if (inst->GetSingleWordInOperand(1) == decoration) { if (!f(*inst)) return false; } @@ -257,23 +351,33 @@ }); } -void DecorationManager::CloneDecorations( - uint32_t from, uint32_t to, std::function f) { - assert(f && "Missing function parameter f"); - auto const decoration_list = id_to_decoration_insts_.find(from); +void DecorationManager::CloneDecorations(uint32_t from, uint32_t to) { + const auto decoration_list = id_to_decoration_insts_.find(from); if (decoration_list == id_to_decoration_insts_.end()) return; - for (ir::Instruction* inst : decoration_list->second) { + auto context = module_->context(); + for (ir::Instruction* inst : decoration_list->second.direct_decorations) { + // simply clone decoration and change |target-id| to |to| + std::unique_ptr new_inst(inst->Clone(module_->context())); + new_inst->SetInOperand(0, {to}); + module_->AddAnnotationInst(std::move(new_inst)); + auto decoration_iter = --module_->annotation_end(); + context->AnalyzeUses(&*decoration_iter); + } + // We need to copy the list of instructions as ForgetUses and AnalyzeUses are + // going to modify it. + std::vector indirect_decorations = + decoration_list->second.indirect_decorations; + for (ir::Instruction* inst : indirect_decorations) { switch (inst->opcode()) { case SpvOpGroupDecorate: - f(*inst, false); + context->ForgetUses(inst); // add |to| to list of decorated id's inst->AddOperand( ir::Operand(spv_operand_type_t::SPV_OPERAND_TYPE_ID, {to})); - id_to_decoration_insts_[to].push_back(inst); - f(*inst, true); + context->AnalyzeUses(inst); break; case SpvOpGroupMemberDecorate: { - f(*inst, false); + context->ForgetUses(inst); // for each (id == from), add (to, literal) as operands const uint32_t num_operands = inst->NumOperands(); for (uint32_t i = 1; i < num_operands; i += 2) { @@ -285,21 +389,7 @@ inst->AddOperand(std::move(op)); } } - id_to_decoration_insts_[to].push_back(inst); - f(*inst, true); - break; - } - case SpvOpDecorate: - case SpvOpMemberDecorate: - case SpvOpDecorateId: { - // simply clone decoration and change |target-id| to |to| - std::unique_ptr new_inst( - inst->Clone(module_->context())); - new_inst->SetInOperand(0, {to}); - id_to_decoration_insts_[to].push_back(new_inst.get()); - module_->AddAnnotationInst(std::move(new_inst)); - auto decoration_iter = --module_->annotation_end(); - f(*decoration_iter, true); + context->AnalyzeUses(inst); break; } default: @@ -309,44 +399,39 @@ } void DecorationManager::RemoveDecoration(ir::Instruction* inst) { + const auto remove_from_container = [inst](std::vector& v) { + v.erase(std::remove(v.begin(), v.end(), inst), v.end()); + }; + switch (inst->opcode()) { case SpvOpDecorate: case SpvOpDecorateId: + case SpvOpDecorateStringGOOGLE: case SpvOpMemberDecorate: { - auto const target_id = inst->GetSingleWordInOperand(0u); - RemoveInstructionFromTarget(inst, target_id); + const auto target_id = inst->GetSingleWordInOperand(0u); + auto const iter = id_to_decoration_insts_.find(target_id); + if (iter == id_to_decoration_insts_.end()) return; + remove_from_container(iter->second.direct_decorations); } break; case SpvOpGroupDecorate: - for (uint32_t i = 1u; i < inst->NumInOperands(); ++i) { - auto const target_id = inst->GetSingleWordInOperand(i); - RemoveInstructionFromTarget(inst, target_id); + case SpvOpGroupMemberDecorate: { + const uint32_t stride = inst->opcode() == SpvOpGroupDecorate ? 1u : 2u; + for (uint32_t i = 1u; i < inst->NumInOperands(); i += stride) { + const auto target_id = inst->GetSingleWordInOperand(i); + auto const iter = id_to_decoration_insts_.find(target_id); + if (iter == id_to_decoration_insts_.end()) continue; + remove_from_container(iter->second.indirect_decorations); } - break; - case SpvOpGroupMemberDecorate: - for (uint32_t i = 1u; i < inst->NumInOperands(); i += 2u) { - auto const target_id = inst->GetSingleWordInOperand(i); - RemoveInstructionFromTarget(inst, target_id); - } - break; + const auto group_id = inst->GetSingleWordInOperand(0u); + auto const iter = id_to_decoration_insts_.find(group_id); + if (iter == id_to_decoration_insts_.end()) return; + remove_from_container(iter->second.decorate_insts); + } break; default: break; } } -void DecorationManager::RemoveInstructionFromTarget(ir::Instruction* inst, - const uint32_t target_id) { - auto const group_iter = group_to_decoration_insts_.find(target_id); - if (group_iter != group_to_decoration_insts_.end()) { - auto& insts = group_iter->second; - insts.erase(std::remove(insts.begin(), insts.end(), inst), insts.end()); - } else { - auto target_list_iter = id_to_decoration_insts_.find(target_id); - if (target_list_iter != id_to_decoration_insts_.end()) { - auto& insts = target_list_iter->second; - insts.erase(std::remove(insts.begin(), insts.end(), inst), insts.end()); - } - } -} } // namespace analysis } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/decoration_manager.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/decoration_manager.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/decoration_manager.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/decoration_manager.h 2018-04-27 11:46:32.000000000 +0000 @@ -17,6 +17,7 @@ #include #include +#include #include #include "instruction.h" @@ -35,10 +36,19 @@ } DecorationManager() = delete; - // Removes all decorations from |id|, which should not be a group ID. - void RemoveDecorationsFrom(uint32_t id); + // Removes all decorations from |id| (either directly or indirectly) for + // which |pred| returns true. + // If |id| is a group ID, OpGroupDecorate and OpGroupMemberDecorate will be + // removed if they have no targets left, and OpDecorationGroup will be + // removed if the group is not applied to anyone and contains no decorations. + void RemoveDecorationsFrom(uint32_t id, + std::function pred = + [](const ir::Instruction&) { return true; }); // Removes all decorations from the result id of |inst|. + // + // NOTE: This is only meant to be called from ir_context, as only metadata + // will be removed, and no actual instruction. void RemoveDecoration(ir::Instruction* inst); // Returns a vector of all decorations affecting |id|. If a group is applied @@ -80,22 +90,12 @@ // The cloned decorations are assigned to the given id |to| and are // added to the module. The purpose is to decorate cloned instructions. // This function does not check if the id |to| is already decorated. - // Function |f| can be used to update context information and is called - // with |false|, before an instruction is going to be changed and - // with |true| afterwards. - void CloneDecorations(uint32_t from, uint32_t to, - std::function f); + void CloneDecorations(uint32_t from, uint32_t to); // Informs the decoration manager of a new decoration that it needs to track. void AddDecoration(ir::Instruction* inst); private: - // Removes the instruction from the set of decorations targeting |target_id|. - void RemoveInstructionFromTarget(ir::Instruction* inst, - const uint32_t target_id); - - using IdToDecorationInstsMap = - std::unordered_map>; // Analyzes the defs and uses in the given |module| and populates data // structures in this class. Does nothing if |module| is nullptr. void AnalyzeDecorations(); @@ -103,14 +103,29 @@ template std::vector InternalGetDecorationsFor(uint32_t id, bool include_linkage); - // Mapping from ids to the instructions applying a decoration to them. In - // other words, for each id you get all decoration instructions referencing - // that id, be it directly (SpvOpDecorate, SpvOpMemberDecorate and - // SpvOpDecorateId), or indirectly (SpvOpGroupDecorate, + // Tracks decoration information of an ID. + struct TargetData { + std::vector direct_decorations; // All decorate + // instructions applied + // to the tracked ID. + std::vector indirect_decorations; // All instructions + // applying a group to + // the tracked ID. + std::vector decorate_insts; // All decorate instructions + // applying the decorations + // of the tracked ID to + // targets. + // It is empty if the + // tracked ID is not a + // group. + }; + + // Mapping from ids to the instructions applying a decoration to those ids. + // In other words, for each id you get all decoration instructions + // referencing that id, be it directly (SpvOpDecorate, SpvOpMemberDecorate + // and SpvOpDecorateId), or indirectly (SpvOpGroupDecorate, // SpvOpMemberGroupDecorate). - IdToDecorationInstsMap id_to_decoration_insts_; - // Mapping from group ids to all the decoration instructions they apply. - IdToDecorationInstsMap group_to_decoration_insts_; + std::unordered_map id_to_decoration_insts_; // The enclosing module. ir::Module* module_; }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/def_use_manager.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/def_use_manager.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/def_use_manager.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/def_use_manager.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -14,6 +14,8 @@ #include "def_use_manager.h" +#include + #include "log.h" #include "reflect.h" @@ -71,6 +73,17 @@ AnalyzeInstUse(inst); } +void DefUseManager::UpdateDefUse(ir::Instruction* inst) { + const uint32_t def_id = inst->result_id(); + if (def_id != 0) { + auto iter = id_to_def_.find(def_id); + if (iter == id_to_def_.end()) { + AnalyzeInstDef(inst); + } + } + AnalyzeInstUse(inst); +} + ir::Instruction* DefUseManager::GetDef(uint32_t id) { auto iter = id_to_def_.find(id); if (iter == id_to_def_.end()) return nullptr; @@ -256,6 +269,16 @@ } if (lhs.id_to_users_ != rhs.id_to_users_) { + for (auto p : lhs.id_to_users_) { + if (rhs.id_to_users_.count(p) == 0) { + return false; + } + } + for (auto p : rhs.id_to_users_) { + if (lhs.id_to_users_.count(p) == 0) { + return false; + } + } return false; } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/def_use_manager.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/def_use_manager.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/def_use_manager.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/def_use_manager.h 2018-04-27 11:46:32.000000000 +0000 @@ -214,6 +214,10 @@ return !(lhs == rhs); } + // If |inst| has not already been analysed, then analyses its defintion and + // uses. + void UpdateDefUse(ir::Instruction* inst); + private: using InstToUsedIdsMap = std::unordered_map>; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dominator_analysis.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dominator_analysis.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dominator_analysis.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dominator_analysis.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -16,6 +16,8 @@ #include +#include "ir_context.h" + namespace spvtools { namespace opt { @@ -37,5 +39,35 @@ return block; } +bool DominatorAnalysisBase::Dominates(ir::Instruction* a, + ir::Instruction* b) const { + if (!a || !b) { + return false; + } + + if (a == b) { + return true; + } + + ir::BasicBlock* bb_a = a->context()->get_instr_block(a); + ir::BasicBlock* bb_b = b->context()->get_instr_block(b); + + if (bb_a != bb_b) { + return tree_.Dominates(bb_a, bb_b); + } + + for (ir::Instruction& inst : *bb_a) { + if (&inst == a) { + return true; + } else if (&inst == b) { + return false; + } + } + assert(false && + "We did not find the load or store in the block they are " + "supposed to be in."); + return false; +} + } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dominator_analysis.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dominator_analysis.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dominator_analysis.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dominator_analysis.h 2018-04-27 11:46:32.000000000 +0000 @@ -47,6 +47,9 @@ return tree_.Dominates(a, b); } + // Returns true if instruction |a| dominates instruction |b|. + bool Dominates(ir::Instruction* a, ir::Instruction* b) const; + // Returns true if BasicBlock |a| strictly dominates BasicBlock |b|. inline bool StrictlyDominates(const ir::BasicBlock* a, const ir::BasicBlock* b) const { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dominator_tree.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dominator_tree.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dominator_tree.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dominator_tree.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -196,8 +196,6 @@ } } } else { - // Technically, this is not needed, but it unifies - // the handling of dominator and postdom tree later on. successors_[dummy_start_node].push_back(f.entry().get()); predecessors_[f.entry().get()].push_back( const_cast(dummy_start_node)); @@ -357,7 +355,10 @@ first->parent_ = second; second->children_.push_back(first); } + ResetDFNumbering(); +} +void DominatorTree::ResetDFNumbering() { int index = 0; auto preFunc = [&index](const DominatorTreeNode* node) { const_cast(node)->dfs_num_pre_ = ++index; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dominator_tree.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dominator_tree.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/dominator_tree.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/dominator_tree.h 2018-04-27 11:46:32.000000000 +0000 @@ -15,6 +15,7 @@ #ifndef LIBSPIRV_OPT_DOMINATOR_ANALYSIS_TREE_H_ #define LIBSPIRV_OPT_DOMINATOR_ANALYSIS_TREE_H_ +#include #include #include #include @@ -195,7 +196,9 @@ } // Returns true if the basic block id |a| is reachable by this tree. - bool ReachableFromRoots(uint32_t a) const; + bool ReachableFromRoots(uint32_t a) const { + return GetTreeNode(a) != nullptr; + } // Returns true if this tree is a post dominator tree. bool IsPostDominator() const { return postdominator_; } @@ -224,6 +227,19 @@ return true; } + // Applies the std::function |func| to all nodes in the dominator tree from + // |node| downwards. The boolean return from |func| is used to determine + // whether or not the children should also be traversed. Tree nodes are + // visited in a depth first pre-order. + void VisitChildrenIf(std::function func, + iterator node) { + if (func(&*node)) { + for (auto n : *node) { + VisitChildrenIf(func, n->df_begin()); + } + } + } + // Returns the DominatorTreeNode associated with the basic block |bb|. // If the |bb| is unknown to the dominator tree, it returns null. inline DominatorTreeNode* GetTreeNode(ir::BasicBlock* bb) { @@ -254,11 +270,14 @@ return &node_iter->second; } - private: // Adds the basic block |bb| to the tree structure if it doesn't already // exist. DominatorTreeNode* GetOrInsertNode(ir::BasicBlock* bb); + // Recomputes the DF numbering of the tree. + void ResetDFNumbering(); + + private: // Wrapper function which gets the list of pairs of each BasicBlocks to its // immediately dominating BasicBlock and stores the result in the the edges // parameter. diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/feature_manager.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/feature_manager.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/feature_manager.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/feature_manager.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -24,6 +24,7 @@ void FeatureManager::Analyze(ir::Module* module) { AddExtensions(module); AddCapabilities(module); + AddExtInstImportIds(module); } void FeatureManager::AddExtensions(ir::Module* module) { @@ -31,7 +32,7 @@ const std::string name = reinterpret_cast(ext.GetInOperand(0u).words.data()); libspirv::Extension extension; - if (libspirv::GetExtensionFromString(name, &extension)) { + if (libspirv::GetExtensionFromString(name.c_str(), &extension)) { extensions_.Add(extension); } } @@ -56,5 +57,9 @@ } } +void FeatureManager::AddExtInstImportIds(ir::Module* module) { + extinst_importid_GLSLstd450_ = module->GetExtInstImportId("GLSL.std.450"); +} + } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/feature_manager.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/feature_manager.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/feature_manager.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/feature_manager.h 2018-04-27 11:46:32.000000000 +0000 @@ -41,6 +41,15 @@ // Analyzes |module| and records enabled extensions and capabilities. void Analyze(ir::Module* module); + libspirv::CapabilitySet* GetCapabilities() { return &capabilities_; } + const libspirv::CapabilitySet* GetCapabilities() const { + return &capabilities_; + } + + uint32_t GetExtInstImportId_GLSLstd450() const { + return extinst_importid_GLSLstd450_; + } + private: // Analyzes |module| and records enabled extensions. void AddExtensions(ir::Module* module); @@ -52,6 +61,9 @@ // Analyzes |module| and records enabled capabilities. void AddCapabilities(ir::Module* module); + // Analyzes |module| and records imported external instruction sets. + void AddExtInstImportIds(ir::Module* module); + // Auxiliary object for querying SPIR-V grammar facts. const libspirv::AssemblyGrammar& grammar_; @@ -60,6 +72,9 @@ // The enabled capabilities. libspirv::CapabilitySet capabilities_; + + // Common external instruction import ids, cached for performance. + uint32_t extinst_importid_GLSLstd450_ = 0; }; } // namespace opt diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/fold.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/fold.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/fold.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/fold.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -14,15 +14,16 @@ #include "fold.h" +#include +#include +#include + +#include "const_folding_rules.h" #include "def_use_manager.h" #include "folding_rules.h" #include "ir_builder.h" #include "ir_context.h" -#include -#include -#include - namespace spvtools { namespace opt { @@ -182,10 +183,10 @@ } } -bool FoldInstructionInternal(ir::Instruction* inst, - std::function id_map) { +bool FoldInstructionInternal(ir::Instruction* inst) { ir::IRContext* context = inst->context(); - ir::Instruction* folded_inst = FoldInstructionToConstant(inst, id_map); + auto identity_map = [](uint32_t id) { return id; }; + ir::Instruction* folded_inst = FoldInstructionToConstant(inst, identity_map); if (folded_inst != nullptr) { inst->SetOpcode(SpvOpCopyObject); inst->SetInOperands({{SPV_OPERAND_TYPE_ID, {folded_inst->result_id()}}}); @@ -193,21 +194,10 @@ } SpvOp opcode = inst->opcode(); - analysis::ConstantManager* const_manger = context->get_constant_mgr(); + analysis::ConstantManager* const_manager = context->get_constant_mgr(); - std::vector constants; - for (uint32_t i = 0; i < inst->NumInOperands(); i++) { - const ir::Operand* operand = &inst->GetInOperand(i); - if (operand->type != SPV_OPERAND_TYPE_ID) { - constants.push_back(nullptr); - } else { - uint32_t id = id_map(operand->words[0]); - inst->SetInOperand(i, {id}); - const analysis::Constant* constant = - const_manger->FindDeclaredConstant(id); - constants.push_back(constant); - } - } + std::vector constants = + const_manager->GetOperandConstants(inst); static FoldingRules* rules = new FoldingRules(); for (FoldingRule rule : rules->GetRulesForOpcode(opcode)) { @@ -220,6 +210,11 @@ } // namespace +const ConstantFoldingRules& GetConstantFoldingRules() { + static ConstantFoldingRules* rules = new ConstantFoldingRules(); + return *rules; +} + // Returns the result of performing an operation on scalar constant operands. // This function extracts the operand values as 32 bit words and returns the // result in 32 bit word. Scalar constants with longer than 32-bit width are @@ -461,7 +456,7 @@ } switch (opcode) { - // Logical + // Logical case SpvOp::SpvOpLogicalOr: for (uint32_t i = 0; i < 2; i++) { if (constants[i] != nullptr) { @@ -604,13 +599,13 @@ ir::Instruction* FoldInstructionToConstant( ir::Instruction* inst, std::function id_map) { - if (!inst->IsFoldable()) { - return nullptr; - } - ir::IRContext* context = inst->context(); analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + if (!inst->IsFoldableByFoldScalar() && + !GetConstantFoldingRules().HasFoldingRule(inst->opcode())) { + return nullptr; + } // Collect the values of the constant parameters. std::vector constants; bool missing_constants = false; @@ -618,23 +613,38 @@ &id_map](uint32_t* op_id) { uint32_t id = id_map(*op_id); const analysis::Constant* const_op = const_mgr->FindDeclaredConstant(id); - if (!const_op || !IsFoldableConstant(const_op)) { + if (!const_op) { constants.push_back(nullptr); missing_constants = true; - return; + } else { + constants.push_back(const_op); } - constants.push_back(const_op); }); + if (GetConstantFoldingRules().HasFoldingRule(inst->opcode())) { + const analysis::Constant* folded_const = nullptr; + for (auto rule : + GetConstantFoldingRules().GetRulesForOpcode(inst->opcode())) { + folded_const = rule(inst, constants); + if (folded_const != nullptr) { + ir::Instruction* const_inst = + const_mgr->GetDefiningInstruction(folded_const); + // May be a new instruction that needs to be analysed. + context->UpdateDefUse(const_inst); + return const_inst; + } + } + } + uint32_t result_val = 0; bool successful = false; // If all parameters are constant, fold the instruction to a constant. - if (!missing_constants) { + if (!missing_constants && inst->IsFoldableByFoldScalar()) { result_val = FoldScalars(inst->opcode(), constants); successful = true; } - if (!successful) { + if (!successful && inst->IsFoldableByFoldScalar()) { successful = FoldIntegerOpToConstant(inst, id_map, &result_val); } @@ -643,7 +653,6 @@ const_mgr->GetConstant(const_mgr->GetType(inst), {result_val}); return const_mgr->GetDefiningInstruction(result_const); } - return nullptr; } @@ -660,29 +669,14 @@ return false; } -ir::Instruction* FoldInstruction(ir::Instruction* inst, - std::function id_map) { - ir::IRContext* context = inst->context(); +bool FoldInstruction(ir::Instruction* inst) { bool modified = false; - std::unique_ptr folded_inst(inst->Clone(context)); - while (FoldInstructionInternal(&*folded_inst, id_map)) { + ir::Instruction* folded_inst(inst); + while (folded_inst->opcode() != SpvOpCopyObject && + FoldInstructionInternal(&*folded_inst)) { modified = true; } - - if (modified) { - if (folded_inst->opcode() == SpvOpCopyObject) { - analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); - return def_use_mgr->GetDef(folded_inst->GetSingleWordInOperand(0)); - } else { - InstructionBuilder ir_builder( - context, inst, - ir::IRContext::kAnalysisDefUse | - ir::IRContext::kAnalysisInstrToBlockMapping); - folded_inst->SetResultId(context->TakeNextId()); - return ir_builder.AddInstruction(std::move(folded_inst)); - } - } - return nullptr; + return modified; } } // namespace opt diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/fold.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/fold.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/fold.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/fold.h 2018-04-27 11:46:32.000000000 +0000 @@ -15,15 +15,19 @@ #ifndef LIBSPIRV_UTIL_FOLD_H_ #define LIBSPIRV_UTIL_FOLD_H_ -#include "constants.h" -#include "def_use_manager.h" - #include #include +#include "const_folding_rules.h" +#include "constants.h" +#include "def_use_manager.h" + namespace spvtools { namespace opt { +// Returns a reference to the ConstnatFoldingRules instance. +const ConstantFoldingRules& GetConstantFoldingRules(); + // Returns the result of folding a scalar instruction with the given |opcode| // and |operands|. Each entry in |operands| is a pointer to an // analysis::Constant instance, which should've been created with the constant @@ -75,26 +79,18 @@ ir::Instruction* FoldInstructionToConstant( ir::Instruction* inst, std::function id_map); -// Tries to fold |inst| to a simpler instruction that computes the same value, -// when the input ids to |inst| have been substituted using |id_map|. Returns a -// pointer to the simplified instruction if successful. If necessary, a new -// instruction is created and placed in the global values section, for -// constants, or after |inst| for other instructions. -// -// |inst| must be an instruction that exists in the body of a function. -// -// |id_map| is a function that takes one result id and returns another. It can -// be used for things like CCP where it is known that some ids contain a -// constant, but the instruction itself has not been updated yet. This can map -// those ids to the appropriate constants. -ir::Instruction* FoldInstruction(ir::Instruction* inst, - std::function id_map); - -// The same as above when |id_map| is the identity function. -inline ir::Instruction* FoldInstruction(ir::Instruction* inst) { - auto identity_map = [](uint32_t id) { return id; }; - return FoldInstruction(inst, identity_map); -} +// Returns true if |inst| can be folded into a simpler instruction. +// If |inst| can be simplified, |inst| is overwritten with the simplified +// instruction reusing the same result id. +// +// If |inst| is simplified, it is possible that the resulting code in invalid +// because the instruction is in a bad location. Callers of this function have +// to handle the following cases: +// +// 1) An OpPhi becomes and OpCopyObject - If there are OpPhi instruction after +// |inst| in a basic block then this is invalid. The caller must fix this +// up. +bool FoldInstruction(ir::Instruction* inst); } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/folding_rules.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/folding_rules.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/folding_rules.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/folding_rules.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -13,6 +13,7 @@ // limitations under the License. #include "folding_rules.h" +#include "latest_version_glsl_std_450_header.h" namespace spvtools { namespace opt { @@ -21,6 +22,1195 @@ const uint32_t kExtractCompositeIdInIdx = 0; const uint32_t kInsertObjectIdInIdx = 0; const uint32_t kInsertCompositeIdInIdx = 1; +const uint32_t kExtInstSetIdInIdx = 0; +const uint32_t kExtInstInstructionInIdx = 1; +const uint32_t kFMixXIdInIdx = 2; +const uint32_t kFMixYIdInIdx = 3; + +// Returns the element width of |type|. +uint32_t ElementWidth(const analysis::Type* type) { + if (const analysis::Vector* vec_type = type->AsVector()) { + return ElementWidth(vec_type->element_type()); + } else if (const analysis::Float* float_type = type->AsFloat()) { + return float_type->width(); + } else { + assert(type->AsInteger()); + return type->AsInteger()->width(); + } +} + +// Returns true if |type| is Float or a vector of Float. +bool HasFloatingPoint(const analysis::Type* type) { + if (type->AsFloat()) { + return true; + } else if (const analysis::Vector* vec_type = type->AsVector()) { + return vec_type->element_type()->AsFloat() != nullptr; + } + + return false; +} + +// Returns false if |val| is NaN, infinite or subnormal. +template +bool IsValidResult(T val) { + int classified = std::fpclassify(val); + switch (classified) { + case FP_NAN: + case FP_INFINITE: + case FP_SUBNORMAL: + return false; + default: + return true; + } +} + +const analysis::Constant* ConstInput( + const std::vector& constants) { + return constants[0] ? constants[0] : constants[1]; +} + +ir::Instruction* NonConstInput(ir::IRContext* context, + const analysis::Constant* c, + ir::Instruction* inst) { + uint32_t in_op = c ? 1u : 0u; + return context->get_def_use_mgr()->GetDef( + inst->GetSingleWordInOperand(in_op)); +} + +// Returns the negation of |c|. |c| must be a 32 or 64 bit floating point +// constant. +uint32_t NegateFloatingPointConstant(analysis::ConstantManager* const_mgr, + const analysis::Constant* c) { + assert(c); + assert(c->type()->AsFloat()); + uint32_t width = c->type()->AsFloat()->width(); + assert(width == 32 || width == 64); + std::vector words; + if (width == 64) { + spvutils::FloatProxy result(c->GetDouble() * -1.0); + words = result.GetWords(); + } else { + spvutils::FloatProxy result(c->GetFloat() * -1.0f); + words = result.GetWords(); + } + + const analysis::Constant* negated_const = + const_mgr->GetConstant(c->type(), std::move(words)); + return const_mgr->GetDefiningInstruction(negated_const)->result_id(); +} + +std::vector ExtractInts(uint64_t val) { + std::vector words; + words.push_back(static_cast(val)); + words.push_back(static_cast(val >> 32)); + return words; +} + +// Negates the integer constant |c|. Returns the id of the defining instruction. +uint32_t NegateIntegerConstant(analysis::ConstantManager* const_mgr, + const analysis::Constant* c) { + assert(c); + assert(c->type()->AsInteger()); + uint32_t width = c->type()->AsInteger()->width(); + assert(width == 32 || width == 64); + std::vector words; + if (width == 64) { + uint64_t uval = static_cast(0 - c->GetU64()); + words = ExtractInts(uval); + } else { + words.push_back(static_cast(0 - c->GetU32())); + } + + const analysis::Constant* negated_const = + const_mgr->GetConstant(c->type(), std::move(words)); + return const_mgr->GetDefiningInstruction(negated_const)->result_id(); +} + +// Negates the vector constant |c|. Returns the id of the defining instruction. +uint32_t NegateVectorConstant(analysis::ConstantManager* const_mgr, + const analysis::Constant* c) { + assert(const_mgr && c); + assert(c->type()->AsVector()); + if (c->AsNullConstant()) { + // 0.0 vs -0.0 shouldn't matter. + return const_mgr->GetDefiningInstruction(c)->result_id(); + } else { + const analysis::Type* component_type = + c->AsVectorConstant()->component_type(); + std::vector words; + for (auto& comp : c->AsVectorConstant()->GetComponents()) { + if (component_type->AsFloat()) { + words.push_back(NegateFloatingPointConstant(const_mgr, comp)); + } else { + assert(component_type->AsInteger()); + words.push_back(NegateIntegerConstant(const_mgr, comp)); + } + } + + const analysis::Constant* negated_const = + const_mgr->GetConstant(c->type(), std::move(words)); + return const_mgr->GetDefiningInstruction(negated_const)->result_id(); + } +} + +// Negates |c|. Returns the id of the defining instruction. +uint32_t NegateConstant(analysis::ConstantManager* const_mgr, + const analysis::Constant* c) { + if (c->type()->AsVector()) { + return NegateVectorConstant(const_mgr, c); + } else if (c->type()->AsFloat()) { + return NegateFloatingPointConstant(const_mgr, c); + } else { + assert(c->type()->AsInteger()); + return NegateIntegerConstant(const_mgr, c); + } +} + +// Takes the reciprocal of |c|. |c|'s type must be Float or a vector of Float. +// Returns 0 if the reciprocal is NaN, infinite or subnormal. +uint32_t Reciprocal(analysis::ConstantManager* const_mgr, + const analysis::Constant* c) { + assert(const_mgr && c); + assert(c->type()->AsFloat()); + + uint32_t width = c->type()->AsFloat()->width(); + assert(width == 32 || width == 64); + std::vector words; + if (width == 64) { + spvutils::FloatProxy result(1.0 / c->GetDouble()); + if (!IsValidResult(result.getAsFloat())) return 0; + words = result.GetWords(); + } else { + spvutils::FloatProxy result(1.0f / c->GetFloat()); + if (!IsValidResult(result.getAsFloat())) return 0; + words = result.GetWords(); + } + + const analysis::Constant* negated_const = + const_mgr->GetConstant(c->type(), std::move(words)); + return const_mgr->GetDefiningInstruction(negated_const)->result_id(); +} + +// Replaces fdiv where second operand is constant with fmul. +FoldingRule ReciprocalFDiv() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFDiv); + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + if (!inst->IsFloatingPointFoldingAllowed()) return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + if (constants[1] != nullptr) { + uint32_t id = 0; + if (const analysis::VectorConstant* vector_const = + constants[1]->AsVectorConstant()) { + std::vector neg_ids; + for (auto& comp : vector_const->GetComponents()) { + id = Reciprocal(const_mgr, comp); + if (id == 0) return false; + neg_ids.push_back(id); + } + const analysis::Constant* negated_const = + const_mgr->GetConstant(constants[1]->type(), std::move(neg_ids)); + id = const_mgr->GetDefiningInstruction(negated_const)->result_id(); + } else if (constants[1]->AsFloatConstant()) { + id = Reciprocal(const_mgr, constants[1]); + if (id == 0) return false; + } else { + // Don't fold a null constant. + return false; + } + inst->SetOpcode(SpvOpFMul); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {inst->GetSingleWordInOperand(0u)}}, + {SPV_OPERAND_TYPE_ID, {id}}}); + return true; + } + + return false; + }; +} + +// Elides consecutive negate instructions. +FoldingRule MergeNegateArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFNegate || inst->opcode() == SpvOpSNegate); + (void)constants; + ir::IRContext* context = inst->context(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + if (HasFloatingPoint(type) && !inst->IsFloatingPointFoldingAllowed()) + return false; + + ir::Instruction* op_inst = + context->get_def_use_mgr()->GetDef(inst->GetSingleWordInOperand(0u)); + if (HasFloatingPoint(type) && !op_inst->IsFloatingPointFoldingAllowed()) + return false; + + if (op_inst->opcode() == inst->opcode()) { + // Elide negates. + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {op_inst->GetSingleWordInOperand(0u)}}}); + return true; + } + + return false; + }; +} + +// Merges negate into a mul or div operation if that operation contains a +// constant operand. +// Cases: +// -(x * 2) = x * -2 +// -(2 * x) = x * -2 +// -(x / 2) = x / -2 +// -(2 / x) = -2 / x +FoldingRule MergeNegateMulDivArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFNegate || inst->opcode() == SpvOpSNegate); + (void)constants; + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + if (HasFloatingPoint(type) && !inst->IsFloatingPointFoldingAllowed()) + return false; + + ir::Instruction* op_inst = + context->get_def_use_mgr()->GetDef(inst->GetSingleWordInOperand(0u)); + if (HasFloatingPoint(type) && !op_inst->IsFloatingPointFoldingAllowed()) + return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + SpvOp opcode = op_inst->opcode(); + if (opcode == SpvOpFMul || opcode == SpvOpFDiv || opcode == SpvOpIMul || + opcode == SpvOpSDiv || opcode == SpvOpUDiv) { + std::vector op_constants = + const_mgr->GetOperandConstants(op_inst); + // Merge negate into mul or div if one operand is constant. + if (op_constants[0] || op_constants[1]) { + bool zero_is_variable = op_constants[0] == nullptr; + const analysis::Constant* c = ConstInput(op_constants); + uint32_t neg_id = NegateConstant(const_mgr, c); + uint32_t non_const_id = zero_is_variable + ? op_inst->GetSingleWordInOperand(0u) + : op_inst->GetSingleWordInOperand(1u); + // Change this instruction to a mul/div. + inst->SetOpcode(op_inst->opcode()); + if (opcode == SpvOpFDiv || opcode == SpvOpUDiv || opcode == SpvOpSDiv) { + uint32_t op0 = zero_is_variable ? non_const_id : neg_id; + uint32_t op1 = zero_is_variable ? neg_id : non_const_id; + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {op0}}, {SPV_OPERAND_TYPE_ID, {op1}}}); + } else { + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, {non_const_id}}, + {SPV_OPERAND_TYPE_ID, {neg_id}}}); + } + return true; + } + } + + return false; + }; +} + +// Merges negate into a add or sub operation if that operation contains a +// constant operand. +// Cases: +// -(x + 2) = -2 - x +// -(2 + x) = -2 - x +// -(x - 2) = 2 - x +// -(2 - x) = x - 2 +FoldingRule MergeNegateAddSubArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFNegate || inst->opcode() == SpvOpSNegate); + (void)constants; + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + if (HasFloatingPoint(type) && !inst->IsFloatingPointFoldingAllowed()) + return false; + + ir::Instruction* op_inst = + context->get_def_use_mgr()->GetDef(inst->GetSingleWordInOperand(0u)); + if (HasFloatingPoint(type) && !op_inst->IsFloatingPointFoldingAllowed()) + return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + if (op_inst->opcode() == SpvOpFAdd || op_inst->opcode() == SpvOpFSub || + op_inst->opcode() == SpvOpIAdd || op_inst->opcode() == SpvOpISub) { + std::vector op_constants = + const_mgr->GetOperandConstants(op_inst); + if (op_constants[0] || op_constants[1]) { + bool zero_is_variable = op_constants[0] == nullptr; + bool is_add = (op_inst->opcode() == SpvOpFAdd) || + (op_inst->opcode() == SpvOpIAdd); + bool swap_operands = !is_add || zero_is_variable; + bool negate_const = is_add; + const analysis::Constant* c = ConstInput(op_constants); + uint32_t const_id = 0; + if (negate_const) { + const_id = NegateConstant(const_mgr, c); + } else { + const_id = zero_is_variable ? op_inst->GetSingleWordInOperand(1u) + : op_inst->GetSingleWordInOperand(0u); + } + + // Swap operands if necessary and make the instruction a subtraction. + uint32_t op0 = + zero_is_variable ? op_inst->GetSingleWordInOperand(0u) : const_id; + uint32_t op1 = + zero_is_variable ? const_id : op_inst->GetSingleWordInOperand(1u); + if (swap_operands) std::swap(op0, op1); + inst->SetOpcode(HasFloatingPoint(type) ? SpvOpFSub : SpvOpISub); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {op0}}, {SPV_OPERAND_TYPE_ID, {op1}}}); + return true; + } + } + + return false; + }; +} + +// Returns true if |c| has a zero element. +bool HasZero(const analysis::Constant* c) { + if (c->AsNullConstant()) { + return true; + } + if (const analysis::VectorConstant* vec_const = c->AsVectorConstant()) { + for (auto& comp : vec_const->GetComponents()) + if (HasZero(comp)) return true; + } else { + assert(c->AsScalarConstant()); + return c->AsScalarConstant()->IsZero(); + } + + return false; +} + +// Performs |input1| |opcode| |input2| and returns the merged constant result +// id. Returns 0 if the result is not a valid value. The input types must be +// Float. +uint32_t PerformFloatingPointOperation(analysis::ConstantManager* const_mgr, + SpvOp opcode, + const analysis::Constant* input1, + const analysis::Constant* input2) { + const analysis::Type* type = input1->type(); + assert(type->AsFloat()); + uint32_t width = type->AsFloat()->width(); + assert(width == 32 || width == 64); + std::vector words; +#define FOLD_OP(op) \ + if (width == 64) { \ + spvutils::FloatProxy val = \ + input1->GetDouble() op input2->GetDouble(); \ + double dval = val.getAsFloat(); \ + if (!IsValidResult(dval)) return 0; \ + words = val.GetWords(); \ + } else { \ + spvutils::FloatProxy val = \ + input1->GetFloat() op input2->GetFloat(); \ + float fval = val.getAsFloat(); \ + if (!IsValidResult(fval)) return 0; \ + words = val.GetWords(); \ + } + switch (opcode) { + case SpvOpFMul: + FOLD_OP(*); + break; + case SpvOpFDiv: + if (HasZero(input2)) return 0; + FOLD_OP(/); + break; + case SpvOpFAdd: + FOLD_OP(+); + break; + case SpvOpFSub: + FOLD_OP(-); + break; + default: + assert(false && "Unexpected operation"); + break; + } +#undef FOLD_OP + const analysis::Constant* merged_const = const_mgr->GetConstant(type, words); + return const_mgr->GetDefiningInstruction(merged_const)->result_id(); +} + +// Performs |input1| |opcode| |input2| and returns the merged constant result +// id. Returns 0 if the result is not a valid value. The input types must be +// Integers. +uint32_t PerformIntegerOperation(analysis::ConstantManager* const_mgr, + SpvOp opcode, const analysis::Constant* input1, + const analysis::Constant* input2) { + assert(input1->type()->AsInteger()); + const analysis::Integer* type = input1->type()->AsInteger(); + uint32_t width = type->AsInteger()->width(); + assert(width == 32 || width == 64); + std::vector words; +#define FOLD_OP(op) \ + if (width == 64) { \ + if (type->IsSigned()) { \ + int64_t val = input1->GetS64() op input2->GetS64(); \ + words = ExtractInts(static_cast(val)); \ + } else { \ + uint64_t val = input1->GetU64() op input2->GetU64(); \ + words = ExtractInts(val); \ + } \ + } else { \ + if (type->IsSigned()) { \ + int32_t val = input1->GetS32() op input2->GetS32(); \ + words.push_back(static_cast(val)); \ + } else { \ + uint32_t val = input1->GetU32() op input2->GetU32(); \ + words.push_back(val); \ + } \ + } + switch (opcode) { + case SpvOpIMul: + FOLD_OP(*); + break; + case SpvOpSDiv: + case SpvOpUDiv: + assert(false && "Should not merge integer division"); + break; + case SpvOpIAdd: + FOLD_OP(+); + break; + case SpvOpISub: + FOLD_OP(-); + break; + default: + assert(false && "Unexpected operation"); + break; + } +#undef FOLD_OP + const analysis::Constant* merged_const = const_mgr->GetConstant(type, words); + return const_mgr->GetDefiningInstruction(merged_const)->result_id(); +} + +// Performs |input1| |opcode| |input2| and returns the merged constant result +// id. Returns 0 if the result is not a valid value. The input types must be +// Integers, Floats or Vectors of such. +uint32_t PerformOperation(analysis::ConstantManager* const_mgr, SpvOp opcode, + const analysis::Constant* input1, + const analysis::Constant* input2) { + assert(input1 && input2); + assert(input1->type() == input2->type()); + const analysis::Type* type = input1->type(); + std::vector words; + if (const analysis::Vector* vector_type = type->AsVector()) { + const analysis::Type* ele_type = vector_type->element_type(); + for (uint32_t i = 0; i != vector_type->element_count(); ++i) { + uint32_t id = 0; + + const analysis::Constant* input1_comp = nullptr; + if (const analysis::VectorConstant* input1_vector = + input1->AsVectorConstant()) { + input1_comp = input1_vector->GetComponents()[i]; + } else { + assert(input1->AsNullConstant()); + input1_comp = const_mgr->GetConstant(ele_type, {}); + } + + const analysis::Constant* input2_comp = nullptr; + if (const analysis::VectorConstant* input2_vector = + input2->AsVectorConstant()) { + input2_comp = input2_vector->GetComponents()[i]; + } else { + assert(input2->AsNullConstant()); + input2_comp = const_mgr->GetConstant(ele_type, {}); + } + + if (ele_type->AsFloat()) { + id = PerformFloatingPointOperation(const_mgr, opcode, input1_comp, + input2_comp); + } else { + assert(ele_type->AsInteger()); + id = PerformIntegerOperation(const_mgr, opcode, input1_comp, + input2_comp); + } + if (id == 0) return 0; + words.push_back(id); + } + const analysis::Constant* merged_const = + const_mgr->GetConstant(type, words); + return const_mgr->GetDefiningInstruction(merged_const)->result_id(); + } else if (type->AsFloat()) { + return PerformFloatingPointOperation(const_mgr, opcode, input1, input2); + } else { + assert(type->AsInteger()); + return PerformIntegerOperation(const_mgr, opcode, input1, input2); + } +} + +// Merges consecutive multiplies where each contains one constant operand. +// Cases: +// 2 * (x * 2) = x * 4 +// 2 * (2 * x) = x * 4 +// (x * 2) * 2 = x * 4 +// (2 * x) * 2 = x * 4 +FoldingRule MergeMulMulArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFMul || inst->opcode() == SpvOpIMul); + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + if (HasFloatingPoint(type) && !inst->IsFloatingPointFoldingAllowed()) + return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + // Determine the constant input and the variable input in |inst|. + const analysis::Constant* const_input1 = ConstInput(constants); + if (!const_input1) return false; + ir::Instruction* other_inst = NonConstInput(context, constants[0], inst); + if (HasFloatingPoint(type) && !other_inst->IsFloatingPointFoldingAllowed()) + return false; + + if (other_inst->opcode() == inst->opcode()) { + std::vector other_constants = + const_mgr->GetOperandConstants(other_inst); + const analysis::Constant* const_input2 = ConstInput(other_constants); + if (!const_input2) return false; + + bool other_first_is_variable = other_constants[0] == nullptr; + uint32_t merged_id = PerformOperation(const_mgr, inst->opcode(), + const_input1, const_input2); + if (merged_id == 0) return false; + + uint32_t non_const_id = other_first_is_variable + ? other_inst->GetSingleWordInOperand(0u) + : other_inst->GetSingleWordInOperand(1u); + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, {non_const_id}}, + {SPV_OPERAND_TYPE_ID, {merged_id}}}); + return true; + } + + return false; + }; +} + +// Merges divides into subsequent multiplies if each instruction contains one +// constant operand. Does not support integer operations. +// Cases: +// 2 * (x / 2) = x * 1 +// 2 * (2 / x) = 4 / x +// (x / 2) * 2 = x * 1 +// (2 / x) * 2 = 4 / x +FoldingRule MergeMulDivArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFMul); + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + if (!inst->IsFloatingPointFoldingAllowed()) return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + const analysis::Constant* const_input1 = ConstInput(constants); + if (!const_input1) return false; + ir::Instruction* other_inst = NonConstInput(context, constants[0], inst); + if (!other_inst->IsFloatingPointFoldingAllowed()) return false; + + if (other_inst->opcode() == SpvOpFDiv) { + std::vector other_constants = + const_mgr->GetOperandConstants(other_inst); + const analysis::Constant* const_input2 = ConstInput(other_constants); + if (!const_input2 || HasZero(const_input2)) return false; + + bool other_first_is_variable = other_constants[0] == nullptr; + // If the variable value is the second operand of the divide, multiply + // the constants together. Otherwise divide the constants. + uint32_t merged_id = PerformOperation( + const_mgr, + other_first_is_variable ? other_inst->opcode() : inst->opcode(), + const_input1, const_input2); + if (merged_id == 0) return false; + + uint32_t non_const_id = other_first_is_variable + ? other_inst->GetSingleWordInOperand(0u) + : other_inst->GetSingleWordInOperand(1u); + + // If the variable value is on the second operand of the div, then this + // operation is a div. Otherwise it should be a multiply. + inst->SetOpcode(other_first_is_variable ? inst->opcode() + : other_inst->opcode()); + if (other_first_is_variable) { + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, {non_const_id}}, + {SPV_OPERAND_TYPE_ID, {merged_id}}}); + } else { + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, {merged_id}}, + {SPV_OPERAND_TYPE_ID, {non_const_id}}}); + } + return true; + } + + return false; + }; +} + +// Merges multiply of constant and negation. +// Cases: +// (-x) * 2 = x * -2 +// 2 * (-x) = x * -2 +FoldingRule MergeMulNegateArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFMul || inst->opcode() == SpvOpIMul); + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + bool uses_float = HasFloatingPoint(type); + if (uses_float && !inst->IsFloatingPointFoldingAllowed()) return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + const analysis::Constant* const_input1 = ConstInput(constants); + if (!const_input1) return false; + ir::Instruction* other_inst = NonConstInput(context, constants[0], inst); + if (uses_float && !other_inst->IsFloatingPointFoldingAllowed()) + return false; + + if (other_inst->opcode() == SpvOpFNegate || + other_inst->opcode() == SpvOpSNegate) { + uint32_t neg_id = NegateConstant(const_mgr, const_input1); + + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {other_inst->GetSingleWordInOperand(0u)}}, + {SPV_OPERAND_TYPE_ID, {neg_id}}}); + return true; + } + + return false; + }; +} + +// Merges consecutive divides if each instruction contains one constant operand. +// Does not support integer division. +// Cases: +// 2 / (x / 2) = 4 / x +// 4 / (2 / x) = 2 * x +// (4 / x) / 2 = 2 / x +// (x / 2) / 2 = x / 4 +FoldingRule MergeDivDivArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFDiv); + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + if (!inst->IsFloatingPointFoldingAllowed()) return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + const analysis::Constant* const_input1 = ConstInput(constants); + if (!const_input1 || HasZero(const_input1)) return false; + ir::Instruction* other_inst = NonConstInput(context, constants[0], inst); + if (!other_inst->IsFloatingPointFoldingAllowed()) return false; + + bool first_is_variable = constants[0] == nullptr; + if (other_inst->opcode() == inst->opcode()) { + std::vector other_constants = + const_mgr->GetOperandConstants(other_inst); + const analysis::Constant* const_input2 = ConstInput(other_constants); + if (!const_input2 || HasZero(const_input2)) return false; + + bool other_first_is_variable = other_constants[0] == nullptr; + + SpvOp merge_op = inst->opcode(); + if (other_first_is_variable) { + // Constants magnify. + merge_op = SpvOpFMul; + } + + // This is an x / (*) case. Swap the inputs. Doesn't harm multiply + // because it is commutative. + if (first_is_variable) std::swap(const_input1, const_input2); + uint32_t merged_id = + PerformOperation(const_mgr, merge_op, const_input1, const_input2); + if (merged_id == 0) return false; + + uint32_t non_const_id = other_first_is_variable + ? other_inst->GetSingleWordInOperand(0u) + : other_inst->GetSingleWordInOperand(1u); + + SpvOp op = inst->opcode(); + if (!first_is_variable && !other_first_is_variable) { + // Effectively div of 1/x, so change to multiply. + op = SpvOpFMul; + } + + uint32_t op1 = merged_id; + uint32_t op2 = non_const_id; + if (first_is_variable && other_first_is_variable) std::swap(op1, op2); + inst->SetOpcode(op); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {op1}}, {SPV_OPERAND_TYPE_ID, {op2}}}); + return true; + } + + return false; + }; +} + +// Fold multiplies succeeded by divides where each instruction contains a +// constant operand. Does not support integer divide. +// Cases: +// 4 / (x * 2) = 2 / x +// 4 / (2 * x) = 2 / x +// (x * 4) / 2 = x * 2 +// (4 * x) / 2 = x * 2 +FoldingRule MergeDivMulArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFDiv); + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + if (!inst->IsFloatingPointFoldingAllowed()) return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + const analysis::Constant* const_input1 = ConstInput(constants); + if (!const_input1 || HasZero(const_input1)) return false; + ir::Instruction* other_inst = NonConstInput(context, constants[0], inst); + if (!other_inst->IsFloatingPointFoldingAllowed()) return false; + + bool first_is_variable = constants[0] == nullptr; + if (other_inst->opcode() == SpvOpFMul) { + std::vector other_constants = + const_mgr->GetOperandConstants(other_inst); + const analysis::Constant* const_input2 = ConstInput(other_constants); + if (!const_input2) return false; + + bool other_first_is_variable = other_constants[0] == nullptr; + + // This is an x / (*) case. Swap the inputs. + if (first_is_variable) std::swap(const_input1, const_input2); + uint32_t merged_id = PerformOperation(const_mgr, inst->opcode(), + const_input1, const_input2); + if (merged_id == 0) return false; + + uint32_t non_const_id = other_first_is_variable + ? other_inst->GetSingleWordInOperand(0u) + : other_inst->GetSingleWordInOperand(1u); + + uint32_t op1 = merged_id; + uint32_t op2 = non_const_id; + if (first_is_variable) std::swap(op1, op2); + + // Convert to multiply + if (first_is_variable) inst->SetOpcode(other_inst->opcode()); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {op1}}, {SPV_OPERAND_TYPE_ID, {op2}}}); + return true; + } + + return false; + }; +} + +// Fold divides of a constant and a negation. +// Cases: +// (-x) / 2 = x / -2 +// 2 / (-x) = 2 / -x +FoldingRule MergeDivNegateArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFDiv || inst->opcode() == SpvOpSDiv || + inst->opcode() == SpvOpUDiv); + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + bool uses_float = HasFloatingPoint(type); + if (uses_float && !inst->IsFloatingPointFoldingAllowed()) return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + const analysis::Constant* const_input1 = ConstInput(constants); + if (!const_input1) return false; + ir::Instruction* other_inst = NonConstInput(context, constants[0], inst); + if (uses_float && !other_inst->IsFloatingPointFoldingAllowed()) + return false; + + bool first_is_variable = constants[0] == nullptr; + if (other_inst->opcode() == SpvOpFNegate || + other_inst->opcode() == SpvOpSNegate) { + uint32_t neg_id = NegateConstant(const_mgr, const_input1); + + if (first_is_variable) { + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {other_inst->GetSingleWordInOperand(0u)}}, + {SPV_OPERAND_TYPE_ID, {neg_id}}}); + } else { + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {neg_id}}, + {SPV_OPERAND_TYPE_ID, {other_inst->GetSingleWordInOperand(0u)}}}); + } + return true; + } + + return false; + }; +} + +// Folds addition of a constant and a negation. +// Cases: +// (-x) + 2 = 2 - x +// 2 + (-x) = 2 - x +FoldingRule MergeAddNegateArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFAdd || inst->opcode() == SpvOpIAdd); + ir::IRContext* context = inst->context(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + bool uses_float = HasFloatingPoint(type); + if (uses_float && !inst->IsFloatingPointFoldingAllowed()) return false; + + const analysis::Constant* const_input1 = ConstInput(constants); + if (!const_input1) return false; + ir::Instruction* other_inst = NonConstInput(context, constants[0], inst); + if (uses_float && !other_inst->IsFloatingPointFoldingAllowed()) + return false; + + if (other_inst->opcode() == SpvOpSNegate || + other_inst->opcode() == SpvOpFNegate) { + inst->SetOpcode(HasFloatingPoint(type) ? SpvOpFSub : SpvOpISub); + uint32_t const_id = constants[0] ? inst->GetSingleWordInOperand(0u) + : inst->GetSingleWordInOperand(1u); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {const_id}}, + {SPV_OPERAND_TYPE_ID, {other_inst->GetSingleWordInOperand(0u)}}}); + return true; + } + return false; + }; +} + +// Folds subtraction of a constant and a negation. +// Cases: +// (-x) - 2 = -2 - x +// 2 - (-x) = x + 2 +FoldingRule MergeSubNegateArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFSub || inst->opcode() == SpvOpISub); + ir::IRContext* context = inst->context(); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + bool uses_float = HasFloatingPoint(type); + if (uses_float && !inst->IsFloatingPointFoldingAllowed()) return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + const analysis::Constant* const_input1 = ConstInput(constants); + if (!const_input1) return false; + ir::Instruction* other_inst = NonConstInput(context, constants[0], inst); + if (uses_float && !other_inst->IsFloatingPointFoldingAllowed()) + return false; + + if (other_inst->opcode() == SpvOpSNegate || + other_inst->opcode() == SpvOpFNegate) { + uint32_t op1 = 0; + uint32_t op2 = 0; + SpvOp opcode = inst->opcode(); + if (constants[0] != nullptr) { + op1 = other_inst->GetSingleWordInOperand(0u); + op2 = inst->GetSingleWordInOperand(0u); + opcode = HasFloatingPoint(type) ? SpvOpFAdd : SpvOpIAdd; + } else { + op1 = NegateConstant(const_mgr, const_input1); + op2 = other_inst->GetSingleWordInOperand(0u); + } + + inst->SetOpcode(opcode); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {op1}}, {SPV_OPERAND_TYPE_ID, {op2}}}); + return true; + } + return false; + }; +} + +// Folds addition of an addition where each operation has a constant operand. +// Cases: +// (x + 2) + 2 = x + 4 +// (2 + x) + 2 = x + 4 +// 2 + (x + 2) = x + 4 +// 2 + (2 + x) = x + 4 +FoldingRule MergeAddAddArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFAdd || inst->opcode() == SpvOpIAdd); + ir::IRContext* context = inst->context(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + bool uses_float = HasFloatingPoint(type); + if (uses_float && !inst->IsFloatingPointFoldingAllowed()) return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + const analysis::Constant* const_input1 = ConstInput(constants); + if (!const_input1) return false; + ir::Instruction* other_inst = NonConstInput(context, constants[0], inst); + if (uses_float && !other_inst->IsFloatingPointFoldingAllowed()) + return false; + + if (other_inst->opcode() == SpvOpFAdd || + other_inst->opcode() == SpvOpIAdd) { + std::vector other_constants = + const_mgr->GetOperandConstants(other_inst); + const analysis::Constant* const_input2 = ConstInput(other_constants); + if (!const_input2) return false; + + ir::Instruction* non_const_input = + NonConstInput(context, other_constants[0], other_inst); + uint32_t merged_id = PerformOperation(const_mgr, inst->opcode(), + const_input1, const_input2); + if (merged_id == 0) return false; + + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {non_const_input->result_id()}}, + {SPV_OPERAND_TYPE_ID, {merged_id}}}); + return true; + } + return false; + }; +} + +// Folds addition of a subtraction where each operation has a constant operand. +// Cases: +// (x - 2) + 2 = x + 0 +// (2 - x) + 2 = 4 - x +// 2 + (x - 2) = x + 0 +// 2 + (2 - x) = 4 - x +FoldingRule MergeAddSubArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFAdd || inst->opcode() == SpvOpIAdd); + ir::IRContext* context = inst->context(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + bool uses_float = HasFloatingPoint(type); + if (uses_float && !inst->IsFloatingPointFoldingAllowed()) return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + const analysis::Constant* const_input1 = ConstInput(constants); + if (!const_input1) return false; + ir::Instruction* other_inst = NonConstInput(context, constants[0], inst); + if (uses_float && !other_inst->IsFloatingPointFoldingAllowed()) + return false; + + if (other_inst->opcode() == SpvOpFSub || + other_inst->opcode() == SpvOpISub) { + std::vector other_constants = + const_mgr->GetOperandConstants(other_inst); + const analysis::Constant* const_input2 = ConstInput(other_constants); + if (!const_input2) return false; + + bool first_is_variable = other_constants[0] == nullptr; + SpvOp op = inst->opcode(); + uint32_t op1 = 0; + uint32_t op2 = 0; + if (first_is_variable) { + // Subtract constants. Non-constant operand is first. + op1 = other_inst->GetSingleWordInOperand(0u); + op2 = PerformOperation(const_mgr, other_inst->opcode(), const_input1, + const_input2); + } else { + // Add constants. Constant operand is first. Change the opcode. + op1 = PerformOperation(const_mgr, inst->opcode(), const_input1, + const_input2); + op2 = other_inst->GetSingleWordInOperand(1u); + op = other_inst->opcode(); + } + if (op1 == 0 || op2 == 0) return false; + + inst->SetOpcode(op); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {op1}}, {SPV_OPERAND_TYPE_ID, {op2}}}); + return true; + } + return false; + }; +} + +// Folds subtraction of an addition where each operand has a constant operand. +// Cases: +// (x + 2) - 2 = x + 0 +// (2 + x) - 2 = x + 0 +// 2 - (x + 2) = 0 - x +// 2 - (2 + x) = 0 - x +FoldingRule MergeSubAddArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFSub || inst->opcode() == SpvOpISub); + ir::IRContext* context = inst->context(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + bool uses_float = HasFloatingPoint(type); + if (uses_float && !inst->IsFloatingPointFoldingAllowed()) return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + const analysis::Constant* const_input1 = ConstInput(constants); + if (!const_input1) return false; + ir::Instruction* other_inst = NonConstInput(context, constants[0], inst); + if (uses_float && !other_inst->IsFloatingPointFoldingAllowed()) + return false; + + if (other_inst->opcode() == SpvOpFAdd || + other_inst->opcode() == SpvOpIAdd) { + std::vector other_constants = + const_mgr->GetOperandConstants(other_inst); + const analysis::Constant* const_input2 = ConstInput(other_constants); + if (!const_input2) return false; + + ir::Instruction* non_const_input = + NonConstInput(context, other_constants[0], other_inst); + + // If the first operand of the sub is not a constant, swap the constants + // so the subtraction has the correct operands. + if (constants[0] == nullptr) std::swap(const_input1, const_input2); + // Subtract the constants. + uint32_t merged_id = PerformOperation(const_mgr, inst->opcode(), + const_input1, const_input2); + SpvOp op = inst->opcode(); + uint32_t op1 = 0; + uint32_t op2 = 0; + if (constants[0] == nullptr) { + // Non-constant operand is first. Change the opcode. + op1 = non_const_input->result_id(); + op2 = merged_id; + op = other_inst->opcode(); + } else { + // Constant operand is first. + op1 = merged_id; + op2 = non_const_input->result_id(); + } + if (op1 == 0 || op2 == 0) return false; + + inst->SetOpcode(op); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {op1}}, {SPV_OPERAND_TYPE_ID, {op2}}}); + return true; + } + return false; + }; +} + +// Folds subtraction of a subtraction where each operand has a constant operand. +// Cases: +// (x - 2) - 2 = x - 4 +// (2 - x) - 2 = 0 - x +// 2 - (x - 2) = 4 - x +// 2 - (2 - x) = x + 0 +FoldingRule MergeSubSubArithmetic() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFSub || inst->opcode() == SpvOpISub); + ir::IRContext* context = inst->context(); + const analysis::Type* type = + context->get_type_mgr()->GetType(inst->type_id()); + analysis::ConstantManager* const_mgr = context->get_constant_mgr(); + bool uses_float = HasFloatingPoint(type); + if (uses_float && !inst->IsFloatingPointFoldingAllowed()) return false; + + uint32_t width = ElementWidth(type); + if (width != 32 && width != 64) return false; + + const analysis::Constant* const_input1 = ConstInput(constants); + if (!const_input1) return false; + ir::Instruction* other_inst = NonConstInput(context, constants[0], inst); + if (uses_float && !other_inst->IsFloatingPointFoldingAllowed()) + return false; + + if (other_inst->opcode() == SpvOpFSub || + other_inst->opcode() == SpvOpISub) { + std::vector other_constants = + const_mgr->GetOperandConstants(other_inst); + const analysis::Constant* const_input2 = ConstInput(other_constants); + if (!const_input2) return false; + + ir::Instruction* non_const_input = + NonConstInput(context, other_constants[0], other_inst); + + // Merge the constants. + uint32_t merged_id = 0; + SpvOp merge_op = inst->opcode(); + if (other_constants[0] == nullptr) { + merge_op = uses_float ? SpvOpFAdd : SpvOpIAdd; + } else if (constants[0] == nullptr) { + std::swap(const_input1, const_input2); + } + merged_id = + PerformOperation(const_mgr, merge_op, const_input1, const_input2); + if (merged_id == 0) return false; + + SpvOp op = inst->opcode(); + if (constants[0] != nullptr && other_constants[0] != nullptr) { + // Change the operation. + op = uses_float ? SpvOpFAdd : SpvOpIAdd; + } + + uint32_t op1 = 0; + uint32_t op2 = 0; + if ((constants[0] == nullptr) ^ (other_constants[0] == nullptr)) { + op1 = merged_id; + op2 = non_const_input->result_id(); + } else { + op1 = non_const_input->result_id(); + op2 = merged_id; + } + + inst->SetOpcode(op); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {op1}}, {SPV_OPERAND_TYPE_ID, {op2}}}); + return true; + } + return false; + }; +} FoldingRule IntMultipleBy1() { return [](ir::Instruction* inst, @@ -31,17 +1221,159 @@ continue; } const analysis::IntConstant* int_constant = constants[i]->AsIntConstant(); - if (int_constant->GetU32BitValue() == 1) { - inst->SetOpcode(SpvOpCopyObject); - inst->SetInOperands( - {{SPV_OPERAND_TYPE_ID, {inst->GetSingleWordInOperand(1 - i)}}}); - return true; + if (int_constant) { + uint32_t width = ElementWidth(int_constant->type()); + if (width != 32 && width != 64) return false; + bool is_one = (width == 32) ? int_constant->GetU32BitValue() == 1u + : int_constant->GetU64BitValue() == 1ull; + if (is_one) { + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {inst->GetSingleWordInOperand(1 - i)}}}); + return true; + } } } return false; }; } +FoldingRule CompositeConstructFeedingExtract() { + return [](ir::Instruction* inst, + const std::vector&) { + // If the input to an OpCompositeExtract is an OpCompositeConstruct, + // then we can simply use the appropriate element in the construction. + assert(inst->opcode() == SpvOpCompositeExtract && + "Wrong opcode. Should be OpCompositeExtract."); + analysis::DefUseManager* def_use_mgr = inst->context()->get_def_use_mgr(); + analysis::TypeManager* type_mgr = inst->context()->get_type_mgr(); + uint32_t cid = inst->GetSingleWordInOperand(kExtractCompositeIdInIdx); + ir::Instruction* cinst = def_use_mgr->GetDef(cid); + + if (cinst->opcode() != SpvOpCompositeConstruct) { + return false; + } + + std::vector operands; + analysis::Type* composite_type = type_mgr->GetType(cinst->type_id()); + if (composite_type->AsVector() == nullptr) { + // Get the element being extracted from the OpCompositeConstruct + // Since it is not a vector, it is simple to extract the single element. + uint32_t element_index = inst->GetSingleWordInOperand(1); + uint32_t element_id = cinst->GetSingleWordInOperand(element_index); + operands.push_back({SPV_OPERAND_TYPE_ID, {element_id}}); + + // Add the remaining indices for extraction. + for (uint32_t i = 2; i < inst->NumInOperands(); ++i) { + operands.push_back({SPV_OPERAND_TYPE_LITERAL_INTEGER, + {inst->GetSingleWordInOperand(i)}}); + } + + } else { + // With vectors we have to handle the case where it is concatenating + // vectors. + assert(inst->NumInOperands() == 2 && + "Expecting a vector of scalar values."); + + uint32_t element_index = inst->GetSingleWordInOperand(1); + for (uint32_t construct_index = 0; + construct_index < cinst->NumInOperands(); ++construct_index) { + uint32_t element_id = cinst->GetSingleWordInOperand(construct_index); + ir::Instruction* element_def = def_use_mgr->GetDef(element_id); + analysis::Vector* element_type = + type_mgr->GetType(element_def->type_id())->AsVector(); + if (element_type) { + uint32_t vector_size = element_type->element_count(); + if (vector_size < element_index) { + // The element we want comes after this vector. + element_index -= vector_size; + } else { + // We want an element of this vector. + operands.push_back({SPV_OPERAND_TYPE_ID, {element_id}}); + operands.push_back( + {SPV_OPERAND_TYPE_LITERAL_INTEGER, {element_index}}); + break; + } + } else { + if (element_index == 0) { + // This is a scalar, and we this is the element we are extracting. + operands.push_back({SPV_OPERAND_TYPE_ID, {element_id}}); + break; + } else { + // Skip over this scalar value. + --element_index; + } + } + } + } + + // If there were no extra indices, then we have the final object. No need + // to extract even more. + if (operands.size() == 1) { + inst->SetOpcode(SpvOpCopyObject); + } + + inst->SetInOperands(std::move(operands)); + return true; + }; +} + +FoldingRule CompositeExtractFeedingConstruct() { + // If the OpCompositeConstruct is simply putting back together elements that + // where extracted from the same souce, we can simlpy reuse the source. + // + // This is a common code pattern because of the way that scalar replacement + // works. + return [](ir::Instruction* inst, + const std::vector&) { + assert(inst->opcode() == SpvOpCompositeConstruct && + "Wrong opcode. Should be OpCompositeConstruct."); + analysis::DefUseManager* def_use_mgr = inst->context()->get_def_use_mgr(); + uint32_t original_id = 0; + + // Check each element to make sure they are: + // - extractions + // - extracting the same position they are inserting + // - all extract from the same id. + for (uint32_t i = 0; i < inst->NumInOperands(); ++i) { + uint32_t element_id = inst->GetSingleWordInOperand(i); + ir::Instruction* element_inst = def_use_mgr->GetDef(element_id); + + if (element_inst->opcode() != SpvOpCompositeExtract) { + return false; + } + + if (element_inst->NumInOperands() != 2) { + return false; + } + + if (element_inst->GetSingleWordInOperand(1) != i) { + return false; + } + + if (i == 0) { + original_id = + element_inst->GetSingleWordInOperand(kExtractCompositeIdInIdx); + } else if (original_id != element_inst->GetSingleWordInOperand( + kExtractCompositeIdInIdx)) { + return false; + } + } + + // The last check it to see that the object being extracted from is the + // correct type. + ir::Instruction* original_inst = def_use_mgr->GetDef(original_id); + if (original_inst->type_id() != inst->type_id()) { + return false; + } + + // Simplify by using the original object. + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, {original_id}}}); + return true; + }; +} + FoldingRule InsertFeedingExtract() { return [](ir::Instruction* inst, const std::vector&) { @@ -80,20 +1412,20 @@ // Extracting the value that was inserted along with values for the base // composite. Cannot do anything. - if (i + 1 == cinst->NumInOperands()) { + if (i == inst->NumInOperands()) { return false; } // Extracting an element of the value that was inserted. Extract from // that value directly. - if (i == inst->NumInOperands()) { + if (i + 1 == cinst->NumInOperands()) { std::vector operands; operands.push_back( {SPV_OPERAND_TYPE_ID, {cinst->GetSingleWordInOperand(kInsertObjectIdInIdx)}}); - for (i = i + 1; i < cinst->NumInOperands(); ++i) { + for (; i < inst->NumInOperands(); ++i) { operands.push_back({SPV_OPERAND_TYPE_LITERAL_INTEGER, - {cinst->GetSingleWordInOperand(i)}}); + {inst->GetSingleWordInOperand(i)}}); } inst->SetInOperands(std::move(operands)); return true; @@ -113,6 +1445,373 @@ return true; }; } + +// When a VectorShuffle is feeding an Extract, we can extract from one of the +// operands of the VectorShuffle. We just need to adjust the index in the +// extract instruction. +FoldingRule VectorShuffleFeedingExtract() { + return [](ir::Instruction* inst, + const std::vector&) { + assert(inst->opcode() == SpvOpCompositeExtract && + "Wrong opcode. Should be OpCompositeExtract."); + analysis::DefUseManager* def_use_mgr = inst->context()->get_def_use_mgr(); + analysis::TypeManager* type_mgr = inst->context()->get_type_mgr(); + uint32_t cid = inst->GetSingleWordInOperand(kExtractCompositeIdInIdx); + ir::Instruction* cinst = def_use_mgr->GetDef(cid); + + if (cinst->opcode() != SpvOpVectorShuffle) { + return false; + } + + // Find the size of the first vector operand of the VectorShuffle + ir::Instruction* first_input = + def_use_mgr->GetDef(cinst->GetSingleWordInOperand(0)); + analysis::Type* first_input_type = + type_mgr->GetType(first_input->type_id()); + assert(first_input_type->AsVector() && + "Input to vector shuffle should be vectors."); + uint32_t first_input_size = first_input_type->AsVector()->element_count(); + + // Get index of the element the vector shuffle is placing in the position + // being extracted. + uint32_t new_index = + cinst->GetSingleWordInOperand(2 + inst->GetSingleWordInOperand(1)); + + // Get the id of the of the vector the elemtent comes from, and update the + // index if needed. + uint32_t new_vector = 0; + if (new_index < first_input_size) { + new_vector = cinst->GetSingleWordInOperand(0); + } else { + new_vector = cinst->GetSingleWordInOperand(1); + new_index -= first_input_size; + } + + // Update the extract instruction. + inst->SetInOperand(kExtractCompositeIdInIdx, {new_vector}); + inst->SetInOperand(1, {new_index}); + return true; + }; +} + +FoldingRule RedundantPhi() { + // An OpPhi instruction where all values are the same or the result of the phi + // itself, can be replaced by the value itself. + return + [](ir::Instruction* inst, const std::vector&) { + assert(inst->opcode() == SpvOpPhi && "Wrong opcode. Should be OpPhi."); + + ir::IRContext* context = inst->context(); + analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); + + uint32_t incoming_value = 0; + + for (uint32_t i = 0; i < inst->NumInOperands(); i += 2) { + uint32_t op_id = inst->GetSingleWordInOperand(i); + if (op_id == inst->result_id()) { + continue; + } + + ir::Instruction* op_inst = def_use_mgr->GetDef(op_id); + if (op_inst->opcode() == SpvOpUndef) { + // TODO: We should be able to still use op_id if we know that + // the definition of op_id dominates |inst|. + return false; + } + + if (incoming_value == 0) { + incoming_value = op_id; + } else if (op_id != incoming_value) { + // Found two possible value. Can't simplify. + return false; + } + } + + if (incoming_value == 0) { + // Code looks invalid. Don't do anything. + return false; + } + + // We have a single incoming value. Simplify using that value. + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, {incoming_value}}}); + return true; + }; +} + +FoldingRule RedundantSelect() { + // An OpSelect instruction where both values are the same or the condition is + // constant can be replaced by one of the values + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpSelect && + "Wrong opcode. Should be OpSelect."); + assert(inst->NumInOperands() == 3); + assert(constants.size() == 3); + + uint32_t true_id = inst->GetSingleWordInOperand(1); + uint32_t false_id = inst->GetSingleWordInOperand(2); + + if (true_id == false_id) { + // Both results are the same, condition doesn't matter + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, {true_id}}}); + return true; + } else if (constants[0]) { + const analysis::Type* type = constants[0]->type(); + if (type->AsBool()) { + // Scalar constant value, select the corresponding value. + inst->SetOpcode(SpvOpCopyObject); + if (constants[0]->AsNullConstant() || + !constants[0]->AsBoolConstant()->value()) { + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, {false_id}}}); + } else { + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, {true_id}}}); + } + return true; + } else { + assert(type->AsVector()); + if (constants[0]->AsNullConstant()) { + // All values come from false id. + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, {false_id}}}); + return true; + } else { + // Convert to a vector shuffle. + std::vector ops; + ops.push_back({SPV_OPERAND_TYPE_ID, {true_id}}); + ops.push_back({SPV_OPERAND_TYPE_ID, {false_id}}); + const analysis::VectorConstant* vector_const = + constants[0]->AsVectorConstant(); + uint32_t size = + static_cast(vector_const->GetComponents().size()); + for (uint32_t i = 0; i != size; ++i) { + const analysis::Constant* component = + vector_const->GetComponents()[i]; + if (component->AsNullConstant() || + !component->AsBoolConstant()->value()) { + // Selecting from the false vector which is the second input + // vector to the shuffle. Offset the index by |size|. + ops.push_back({SPV_OPERAND_TYPE_LITERAL_INTEGER, {i + size}}); + } else { + // Selecting from true vector which is the first input vector to + // the shuffle. + ops.push_back({SPV_OPERAND_TYPE_LITERAL_INTEGER, {i}}); + } + } + + inst->SetOpcode(SpvOpVectorShuffle); + inst->SetInOperands(std::move(ops)); + return true; + } + } + } + + return false; + }; +} + +enum class FloatConstantKind { Unknown, Zero, One }; + +FloatConstantKind getFloatConstantKind(const analysis::Constant* constant) { + if (constant == nullptr) { + return FloatConstantKind::Unknown; + } + + assert(HasFloatingPoint(constant->type()) && "Unexpected constant type"); + + if (constant->AsNullConstant()) { + return FloatConstantKind::Zero; + } else if (const analysis::VectorConstant* vc = + constant->AsVectorConstant()) { + const std::vector& components = + vc->GetComponents(); + assert(!components.empty()); + + FloatConstantKind kind = getFloatConstantKind(components[0]); + + for (size_t i = 1; i < components.size(); ++i) { + if (getFloatConstantKind(components[i]) != kind) { + return FloatConstantKind::Unknown; + } + } + + return kind; + } else if (const analysis::FloatConstant* fc = constant->AsFloatConstant()) { + if (fc->IsZero()) return FloatConstantKind::Zero; + + uint32_t width = fc->type()->AsFloat()->width(); + if (width != 32 && width != 64) return FloatConstantKind::Unknown; + + double value = (width == 64) ? fc->GetDoubleValue() : fc->GetFloatValue(); + + if (value == 0.0) { + return FloatConstantKind::Zero; + } else if (value == 1.0) { + return FloatConstantKind::One; + } else { + return FloatConstantKind::Unknown; + } + } else { + return FloatConstantKind::Unknown; + } +} + +FoldingRule RedundantFAdd() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFAdd && "Wrong opcode. Should be OpFAdd."); + assert(constants.size() == 2); + + if (!inst->IsFloatingPointFoldingAllowed()) { + return false; + } + + FloatConstantKind kind0 = getFloatConstantKind(constants[0]); + FloatConstantKind kind1 = getFloatConstantKind(constants[1]); + + if (kind0 == FloatConstantKind::Zero || kind1 == FloatConstantKind::Zero) { + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, + {inst->GetSingleWordInOperand( + kind0 == FloatConstantKind::Zero ? 1 : 0)}}}); + return true; + } + + return false; + }; +} + +FoldingRule RedundantFSub() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFSub && "Wrong opcode. Should be OpFSub."); + assert(constants.size() == 2); + + if (!inst->IsFloatingPointFoldingAllowed()) { + return false; + } + + FloatConstantKind kind0 = getFloatConstantKind(constants[0]); + FloatConstantKind kind1 = getFloatConstantKind(constants[1]); + + if (kind0 == FloatConstantKind::Zero) { + inst->SetOpcode(SpvOpFNegate); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {inst->GetSingleWordInOperand(1)}}}); + return true; + } + + if (kind1 == FloatConstantKind::Zero) { + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {inst->GetSingleWordInOperand(0)}}}); + return true; + } + + return false; + }; +} + +FoldingRule RedundantFMul() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFMul && "Wrong opcode. Should be OpFMul."); + assert(constants.size() == 2); + + if (!inst->IsFloatingPointFoldingAllowed()) { + return false; + } + + FloatConstantKind kind0 = getFloatConstantKind(constants[0]); + FloatConstantKind kind1 = getFloatConstantKind(constants[1]); + + if (kind0 == FloatConstantKind::Zero || kind1 == FloatConstantKind::Zero) { + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, + {inst->GetSingleWordInOperand( + kind0 == FloatConstantKind::Zero ? 0 : 1)}}}); + return true; + } + + if (kind0 == FloatConstantKind::One || kind1 == FloatConstantKind::One) { + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands({{SPV_OPERAND_TYPE_ID, + {inst->GetSingleWordInOperand( + kind0 == FloatConstantKind::One ? 1 : 0)}}}); + return true; + } + + return false; + }; +} + +FoldingRule RedundantFDiv() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpFDiv && "Wrong opcode. Should be OpFDiv."); + assert(constants.size() == 2); + + if (!inst->IsFloatingPointFoldingAllowed()) { + return false; + } + + FloatConstantKind kind0 = getFloatConstantKind(constants[0]); + FloatConstantKind kind1 = getFloatConstantKind(constants[1]); + + if (kind0 == FloatConstantKind::Zero) { + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {inst->GetSingleWordInOperand(0)}}}); + return true; + } + + if (kind1 == FloatConstantKind::One) { + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, {inst->GetSingleWordInOperand(0)}}}); + return true; + } + + return false; + }; +} + +FoldingRule RedundantFMix() { + return [](ir::Instruction* inst, + const std::vector& constants) { + assert(inst->opcode() == SpvOpExtInst && + "Wrong opcode. Should be OpExtInst."); + + if (!inst->IsFloatingPointFoldingAllowed()) { + return false; + } + + uint32_t instSetId = + inst->context()->get_feature_mgr()->GetExtInstImportId_GLSLstd450(); + + if (inst->GetSingleWordInOperand(kExtInstSetIdInIdx) == instSetId && + inst->GetSingleWordInOperand(kExtInstInstructionInIdx) == + GLSLstd450FMix) { + assert(constants.size() == 5); + + FloatConstantKind kind4 = getFloatConstantKind(constants[4]); + + if (kind4 == FloatConstantKind::Zero || kind4 == FloatConstantKind::One) { + inst->SetOpcode(SpvOpCopyObject); + inst->SetInOperands( + {{SPV_OPERAND_TYPE_ID, + {inst->GetSingleWordInOperand(kind4 == FloatConstantKind::Zero + ? kFMixXIdInIdx + : kFMixYIdInIdx)}}}); + return true; + } + } + + return false; + }; +} + } // namespace spvtools::opt::FoldingRules::FoldingRules() { @@ -121,9 +1820,63 @@ // applies to the instruction, the rest of the rules will not be attempted. // Take that into consideration. - rules[SpvOpIMul].push_back(IntMultipleBy1()); + rules_[SpvOpCompositeConstruct].push_back(CompositeExtractFeedingConstruct()); + + rules_[SpvOpCompositeExtract].push_back(InsertFeedingExtract()); + rules_[SpvOpCompositeExtract].push_back(CompositeConstructFeedingExtract()); + rules_[SpvOpCompositeExtract].push_back(VectorShuffleFeedingExtract()); + + rules_[SpvOpExtInst].push_back(RedundantFMix()); + + rules_[SpvOpFAdd].push_back(RedundantFAdd()); + rules_[SpvOpFAdd].push_back(MergeAddNegateArithmetic()); + rules_[SpvOpFAdd].push_back(MergeAddAddArithmetic()); + rules_[SpvOpFAdd].push_back(MergeAddSubArithmetic()); + + rules_[SpvOpFDiv].push_back(RedundantFDiv()); + rules_[SpvOpFDiv].push_back(ReciprocalFDiv()); + rules_[SpvOpFDiv].push_back(MergeDivDivArithmetic()); + rules_[SpvOpFDiv].push_back(MergeDivMulArithmetic()); + rules_[SpvOpFDiv].push_back(MergeDivNegateArithmetic()); + + rules_[SpvOpFMul].push_back(RedundantFMul()); + rules_[SpvOpFMul].push_back(MergeMulMulArithmetic()); + rules_[SpvOpFMul].push_back(MergeMulDivArithmetic()); + rules_[SpvOpFMul].push_back(MergeMulNegateArithmetic()); + + rules_[SpvOpFNegate].push_back(MergeNegateArithmetic()); + rules_[SpvOpFNegate].push_back(MergeNegateAddSubArithmetic()); + rules_[SpvOpFNegate].push_back(MergeNegateMulDivArithmetic()); + + rules_[SpvOpFSub].push_back(RedundantFSub()); + rules_[SpvOpFSub].push_back(MergeSubNegateArithmetic()); + rules_[SpvOpFSub].push_back(MergeSubAddArithmetic()); + rules_[SpvOpFSub].push_back(MergeSubSubArithmetic()); - rules[SpvOpCompositeExtract].push_back(InsertFeedingExtract()); + rules_[SpvOpIAdd].push_back(MergeAddNegateArithmetic()); + rules_[SpvOpIAdd].push_back(MergeAddAddArithmetic()); + rules_[SpvOpIAdd].push_back(MergeAddSubArithmetic()); + + rules_[SpvOpIMul].push_back(IntMultipleBy1()); + rules_[SpvOpIMul].push_back(MergeMulMulArithmetic()); + rules_[SpvOpIMul].push_back(MergeMulNegateArithmetic()); + + rules_[SpvOpISub].push_back(MergeSubNegateArithmetic()); + rules_[SpvOpISub].push_back(MergeSubAddArithmetic()); + rules_[SpvOpISub].push_back(MergeSubSubArithmetic()); + + rules_[SpvOpPhi].push_back(RedundantPhi()); + + rules_[SpvOpSDiv].push_back(MergeDivNegateArithmetic()); + + rules_[SpvOpSNegate].push_back(MergeNegateArithmetic()); + rules_[SpvOpSNegate].push_back(MergeNegateMulDivArithmetic()); + rules_[SpvOpSNegate].push_back(MergeNegateAddSubArithmetic()); + + rules_[SpvOpSelect].push_back(RedundantSelect()); + + rules_[SpvOpUDiv].push_back(MergeDivNegateArithmetic()); } + } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/folding_rules.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/folding_rules.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/folding_rules.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/folding_rules.h 2018-04-27 11:46:32.000000000 +0000 @@ -63,15 +63,15 @@ FoldingRules(); const std::vector& GetRulesForOpcode(SpvOp opcode) { - auto it = rules.find(opcode); - if (it != rules.end()) { + auto it = rules_.find(opcode); + if (it != rules_.end()) { return it->second; } return empty_vector_; } private: - std::unordered_map> rules; + std::unordered_map> rules_; std::vector empty_vector_; }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/function.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/function.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/function.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/function.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -14,32 +14,30 @@ #include "function.h" -#include "make_unique.h" - #include +#include namespace spvtools { namespace ir { -Function* Function::Clone(IRContext* context) const { +Function* Function::Clone(IRContext* ctx) const { Function* clone = - new Function(std::unique_ptr(DefInst().Clone(context))); + new Function(std::unique_ptr(DefInst().Clone(ctx))); clone->params_.reserve(params_.size()); ForEachParam( - [clone, context](const Instruction* inst) { - clone->AddParameter(std::unique_ptr(inst->Clone(context))); + [clone, ctx](const Instruction* inst) { + clone->AddParameter(std::unique_ptr(inst->Clone(ctx))); }, true); clone->blocks_.reserve(blocks_.size()); for (const auto& b : blocks_) { - std::unique_ptr bb(b->Clone(context)); + std::unique_ptr bb(b->Clone(ctx)); bb->SetParent(clone); clone->AddBasicBlock(std::move(bb)); } - clone->SetFunctionEnd( - std::unique_ptr(EndInst()->Clone(context))); + clone->SetFunctionEnd(std::unique_ptr(EndInst()->Clone(ctx))); return clone; } @@ -77,14 +75,34 @@ ->ForEachInst(f, run_on_debug_line_insts); } +BasicBlock* Function::InsertBasicBlockAfter( + std::unique_ptr&& new_block, BasicBlock* position) { + for (auto bb_iter = begin(); bb_iter != end(); ++bb_iter) { + if (&*bb_iter == position) { + new_block->SetParent(this); + ++bb_iter; + bb_iter = bb_iter.InsertBefore(std::move(new_block)); + return &*bb_iter; + } + } + assert(false && "Could not find insertion point."); + return nullptr; +} + std::ostream& operator<<(std::ostream& str, const Function& func) { - func.ForEachInst([&str](const ir::Instruction* inst) { - str << *inst; + str << func.PrettyPrint(); + return str; +} + +std::string Function::PrettyPrint(uint32_t options) const { + std::ostringstream str; + ForEachInst([&str, options](const ir::Instruction* inst) { + str << inst->PrettyPrint(options); if (inst->opcode() != SpvOpFunctionEnd) { str << std::endl; } }); - return str; + return str.str(); } } // namespace ir diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/function.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/function.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/function.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/function.h 2018-04-27 11:46:32.000000000 +0000 @@ -15,6 +15,7 @@ #ifndef LIBSPIRV_OPT_CONSTRUCTS_H_ #define LIBSPIRV_OPT_CONSTRUCTS_H_ +#include #include #include #include @@ -27,6 +28,7 @@ namespace spvtools { namespace ir { +class CFG; class IRContext; class Module; @@ -59,6 +61,10 @@ inline void AddParameter(std::unique_ptr p); // Appends a basic block to this function. inline void AddBasicBlock(std::unique_ptr b); + // Appends a basic block to this function at the position |ip|. + inline void AddBasicBlock(std::unique_ptr b, iterator ip); + template + inline void AddBasicBlocks(T begin, T end, iterator ip); // Saves the given function end instruction. inline void SetFunctionEnd(std::unique_ptr end_inst); @@ -87,6 +93,13 @@ return const_iterator(&blocks_, blocks_.cend()); } + // Returns an iterator to the basic block |id|. + iterator FindBlock(uint32_t bb_id) { + return std::find_if(begin(), end(), [bb_id](const ir::BasicBlock& it_bb) { + return bb_id == it_bb.id(); + }); + } + // Runs the given function |f| on each instruction in this function, and // optionally on debug line instructions that might precede them. void ForEachInst(const std::function& f, @@ -99,6 +112,18 @@ void ForEachParam(const std::function& f, bool run_on_debug_line_insts = false) const; + // Returns the context of the current function. + IRContext* context() const { return def_inst_->context(); } + + BasicBlock* InsertBasicBlockAfter(std::unique_ptr&& new_block, + BasicBlock* position); + + // Pretty-prints all the basic blocks in this function into a std::string. + // + // |options| are the disassembly options. SPV_BINARY_TO_TEXT_OPTION_NO_HEADER + // is always added to |options|. + std::string PrettyPrint(uint32_t options = 0u) const; + private: // The enclosing module. Module* module_; @@ -123,7 +148,18 @@ } inline void Function::AddBasicBlock(std::unique_ptr b) { - blocks_.emplace_back(std::move(b)); + AddBasicBlock(std::move(b), end()); +} + +inline void Function::AddBasicBlock(std::unique_ptr b, + iterator ip) { + ip.InsertBefore(std::move(b)); +} + +template +inline void Function::AddBasicBlocks(T src_begin, T src_end, iterator ip) { + blocks_.insert(ip.Get(), std::make_move_iterator(src_begin), + std::make_move_iterator(src_end)); } inline void Function::SetFunctionEnd(std::unique_ptr end_inst) { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/if_conversion.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/if_conversion.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/if_conversion.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/if_conversion.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -128,7 +128,7 @@ // for this block. If there is no common dominator, then we cannot transform // any phi in this basic block. *common = dominators->CommonDominator(inc0, inc1); - if (!*common) return false; + if (!*common || cfg()->IsPseudoEntryBlock(*common)) return false; ir::Instruction* branch = (*common)->terminator(); if (branch->opcode() != SpvOpBranchConditional) return false; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/if_conversion.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/if_conversion.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/if_conversion.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/if_conversion.h 2018-04-27 11:46:32.000000000 +0000 @@ -33,7 +33,7 @@ return ir::IRContext::kAnalysisDefUse | ir::IRContext::kAnalysisDominatorAnalysis | ir::IRContext::kAnalysisInstrToBlockMapping | - ir::IRContext::kAnalysisCFG; + ir::IRContext::kAnalysisCFG | ir::IRContext::kAnalysisNameMap; } private: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/inline_exhaustive_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/inline_exhaustive_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/inline_exhaustive_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/inline_exhaustive_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -59,9 +59,7 @@ return modified; } -void InlineExhaustivePass::Initialize(ir::IRContext* c) { - InitializeInline(c); -}; +void InlineExhaustivePass::Initialize(ir::IRContext* c) { InitializeInline(c); } Pass::Status InlineExhaustivePass::ProcessImpl() { // Attempt exhaustive inlining on each entry point function in module diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/inline_opaque_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/inline_opaque_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/inline_opaque_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/inline_opaque_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -92,7 +92,7 @@ return modified; } -void InlineOpaquePass::Initialize(ir::IRContext* c) { InitializeInline(c); }; +void InlineOpaquePass::Initialize(ir::IRContext* c) { InitializeInline(c); } Pass::Status InlineOpaquePass::ProcessImpl() { // Do opaque inlining on each function in entry point call tree diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/inline_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/inline_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/inline_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/inline_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -136,8 +136,7 @@ std::unique_ptr var_inst( callee_var_itr->Clone(callee_var_itr->context())); uint32_t newId = TakeNextId(); - get_decoration_mgr()->CloneDecorations(callee_var_itr->result_id(), newId, - update_def_use_mgr_); + get_decoration_mgr()->CloneDecorations(callee_var_itr->result_id(), newId); var_inst->SetResultId(newId); (*callee2caller)[callee_var_itr->result_id()] = newId; new_vars->push_back(std::move(var_inst)); @@ -150,9 +149,8 @@ std::vector>* new_vars) { uint32_t returnVarId = 0; const uint32_t calleeTypeId = calleeFn->type_id(); - const ir::Instruction* calleeType = - get_def_use_mgr()->id_to_defs().find(calleeTypeId)->second; - if (calleeType->opcode() != SpvOpTypeVoid) { + analysis::Type* calleeType = context()->get_type_mgr()->GetType(calleeTypeId); + if (calleeType->AsVoid() == nullptr) { // Find or create ptr to callee return type. uint32_t returnVarTypeId = context()->get_type_mgr()->FindPointerToType( calleeTypeId, SpvStorageClassFunction); @@ -166,8 +164,7 @@ {SpvStorageClassFunction}}})); new_vars->push_back(std::move(var_inst)); } - get_decoration_mgr()->CloneDecorations(calleeFn->result_id(), returnVarId, - update_def_use_mgr_); + get_decoration_mgr()->CloneDecorations(calleeFn->result_id(), returnVarId); return returnVarId; } @@ -180,30 +177,30 @@ std::unordered_map* postCallSB, std::unordered_map* preCallSB, std::unique_ptr* block_ptr) { - (*inst)->ForEachInId([&postCallSB, &preCallSB, &block_ptr, - this](uint32_t* iid) { - const auto mapItr = (*postCallSB).find(*iid); - if (mapItr == (*postCallSB).end()) { - const auto mapItr2 = (*preCallSB).find(*iid); - if (mapItr2 != (*preCallSB).end()) { - // Clone pre-call same-block ops, map result id. - const ir::Instruction* inInst = mapItr2->second; - std::unique_ptr sb_inst( - inInst->Clone(inInst->context())); - CloneSameBlockOps(&sb_inst, postCallSB, preCallSB, block_ptr); - const uint32_t rid = sb_inst->result_id(); - const uint32_t nid = this->TakeNextId(); - get_decoration_mgr()->CloneDecorations(rid, nid, update_def_use_mgr_); - sb_inst->SetResultId(nid); - (*postCallSB)[rid] = nid; - *iid = nid; - (*block_ptr)->AddInstruction(std::move(sb_inst)); - } - } else { - // Reset same-block op operand. - *iid = mapItr->second; - } - }); + (*inst)->ForEachInId( + [&postCallSB, &preCallSB, &block_ptr, this](uint32_t* iid) { + const auto mapItr = (*postCallSB).find(*iid); + if (mapItr == (*postCallSB).end()) { + const auto mapItr2 = (*preCallSB).find(*iid); + if (mapItr2 != (*preCallSB).end()) { + // Clone pre-call same-block ops, map result id. + const ir::Instruction* inInst = mapItr2->second; + std::unique_ptr sb_inst( + inInst->Clone(inInst->context())); + CloneSameBlockOps(&sb_inst, postCallSB, preCallSB, block_ptr); + const uint32_t rid = sb_inst->result_id(); + const uint32_t nid = this->TakeNextId(); + get_decoration_mgr()->CloneDecorations(rid, nid); + sb_inst->SetResultId(nid); + (*postCallSB)[rid] = nid; + *iid = nid; + (*block_ptr)->AddInstruction(std::move(sb_inst)); + } + } else { + // Reset same-block op operand. + *iid = mapItr->second; + } + }); } void InlinePass::GenInlineCode( @@ -219,6 +216,11 @@ // Post-call same-block op ids std::unordered_map postCallSB; + // Invalidate the def-use chains. They are not kept up to date while + // inlining. However, certain calls try to keep them up-to-date if they are + // valid. These operations can fail. + context()->InvalidateAnalyses(ir::IRContext::kAnalysisDefUse); + ir::Function* calleeFn = id2function_[call_inst_itr->GetSingleWordOperand( kSpvFunctionCallFunctionId)]; @@ -318,8 +320,10 @@ if (firstBlock) { // Copy contents of original caller block up to call instruction. for (auto cii = call_block_itr->begin(); cii != call_inst_itr; - ++cii) { - std::unique_ptr cp_inst(cii->Clone(context())); + cii = call_block_itr->begin()) { + ir::Instruction* inst = &*cii; + inst->RemoveFromList(); + std::unique_ptr cp_inst(inst); // Remember same-block ops for possible regeneration. if (IsSameBlockOp(&*cp_inst)) { auto* sb_inst_ptr = cp_inst.get(); @@ -426,9 +430,10 @@ AddLoad(calleeTypeId, resId, returnVarId, &new_blk_ptr); } // Copy remaining instructions from caller block. - auto cii = call_inst_itr; - for (++cii; cii != call_block_itr->end(); ++cii) { - std::unique_ptr cp_inst(cii->Clone(context())); + for (ir::Instruction* inst = call_inst_itr->NextNode(); inst; + inst = call_inst_itr->NextNode()) { + inst->RemoveFromList(); + std::unique_ptr cp_inst(inst); // If multiple blocks generated, regenerate any same-block // instruction that has not been seen in this last block. if (multiBlocks) { @@ -473,7 +478,7 @@ callee2caller[rid] = nid; } cp_inst->SetResultId(nid); - get_decoration_mgr()->CloneDecorations(rid, nid, update_def_use_mgr_); + get_decoration_mgr()->CloneDecorations(rid, nid); } new_blk_ptr->AddInstruction(std::move(cp_inst)); } break; @@ -644,9 +649,6 @@ void InlinePass::InitializeInline(ir::IRContext* c) { InitializeProcessing(c); - // Don't bother updating the DefUseManger - update_def_use_mgr_ = [](ir::Instruction&, bool) {}; - false_id_ = 0; // clear collections @@ -666,7 +668,7 @@ // Compute inlinability if (IsInlinableFunction(&fn)) inlinable_.insert(fn.result_id()); } -}; +} InlinePass::InlinePass() {} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/inline_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/inline_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/inline_pass.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/inline_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -24,7 +24,6 @@ #include #include "decoration_manager.h" -#include "def_use_manager.h" #include "module.h" #include "pass.h" @@ -159,9 +158,6 @@ // Initialize state for optimization of |module| void InitializeInline(ir::IRContext* c); - // Update the DefUseManager when cloning decorations. - std::function update_def_use_mgr_; - // Map from function's result id to function. std::unordered_map id2function_; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/insert_extract_elim.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/insert_extract_elim.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/insert_extract_elim.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/insert_extract_elim.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -96,7 +96,7 @@ } } else if (cinst->opcode() == SpvOpExtInst && cinst->GetSingleWordInOperand(kExtInstSetIdInIdx) == - get_module()->GetExtInstImportId("GLSL.std.450") && + get_feature_mgr()->GetExtInstImportId_GLSLstd450() && cinst->GetSingleWordInOperand(kExtInstInstructionInIdx) == GLSLstd450FMix) { // If mixing value component is 0 or 1 we just match with x or y. @@ -199,25 +199,9 @@ void InsertExtractElimPass::Initialize(ir::IRContext* c) { InitializeProcessing(c); - - // Initialize extension whitelist - InitExtensions(); -}; - -bool InsertExtractElimPass::AllExtensionsSupported() const { - // If any extension not in whitelist, return false - for (auto& ei : get_module()->extensions()) { - const char* extName = - reinterpret_cast(&ei.GetInOperand(0).words[0]); - if (extensions_whitelist_.find(extName) == extensions_whitelist_.end()) - return false; - } - return true; } Pass::Status InsertExtractElimPass::ProcessImpl() { - // Do not process if any disallowed extensions are enabled - if (!AllExtensionsSupported()) return Status::SuccessWithoutChange; // Process all entry point functions. ProcessFunction pfn = [this](ir::Function* fp) { return EliminateInsertExtract(fp); @@ -233,33 +217,5 @@ return ProcessImpl(); } -void InsertExtractElimPass::InitExtensions() { - extensions_whitelist_.clear(); - extensions_whitelist_.insert({ - "SPV_AMD_shader_explicit_vertex_parameter", - "SPV_AMD_shader_trinary_minmax", - "SPV_AMD_gcn_shader", - "SPV_KHR_shader_ballot", - "SPV_AMD_shader_ballot", - "SPV_AMD_gpu_shader_half_float", - "SPV_KHR_shader_draw_parameters", - "SPV_KHR_subgroup_vote", - "SPV_KHR_16bit_storage", - "SPV_KHR_device_group", - "SPV_KHR_multiview", - "SPV_NVX_multiview_per_view_attributes", - "SPV_NV_viewport_array2", - "SPV_NV_stereo_view_rendering", - "SPV_NV_sample_mask_override_coverage", - "SPV_NV_geometry_shader_passthrough", - "SPV_AMD_texture_gather_bias_lod", - "SPV_KHR_storage_buffer_storage_class", - "SPV_KHR_variable_pointers", - "SPV_AMD_gpu_shader_int16", - "SPV_KHR_post_depth_coverage", - "SPV_KHR_shader_atomic_counter_ops", - }); -} - } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/insert_extract_elim.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/insert_extract_elim.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/insert_extract_elim.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/insert_extract_elim.h 2018-04-27 11:46:32.000000000 +0000 @@ -51,17 +51,8 @@ // CompositeConstruct or ConstantComposite. bool EliminateInsertExtract(ir::Function* func); - // Initialize extensions whitelist - void InitExtensions(); - - // Return true if all extensions in this module are allowed by this pass. - bool AllExtensionsSupported() const; - void Initialize(ir::IRContext* c); Pass::Status ProcessImpl(); - - // Extensions supported by this pass. - std::unordered_set extensions_whitelist_; }; } // namespace opt diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/instruction.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/instruction.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/instruction.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/instruction.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -12,11 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include "instruction.h" + #include #include "disassemble.h" #include "fold.h" -#include "instruction.h" #include "ir_context.h" #include "reflect.h" @@ -157,8 +158,8 @@ Instruction* Instruction::GetBaseAddress() const { assert((IsLoad() || opcode() == SpvOpStore || opcode() == SpvOpAccessChain || - opcode() == SpvOpInBoundsAccessChain || - opcode() == SpvOpCopyObject) && + opcode() == SpvOpInBoundsAccessChain || opcode() == SpvOpCopyObject || + opcode() == SpvOpImageTexelPointer) && "GetBaseAddress should only be called on instructions that take a " "pointer or image."); uint32_t base = GetSingleWordInOperand(kLoadBaseIndex); @@ -470,6 +471,11 @@ } bool Instruction::IsFoldable() const { + return IsFoldableByFoldScalar() || + opt::GetConstantFoldingRules().HasFoldingRule(opcode()); +} + +bool Instruction::IsFoldableByFoldScalar() const { if (!opt::IsFoldableOpcode(opcode())) { return false; } @@ -477,6 +483,22 @@ return opt::IsFoldableType(type); } +bool Instruction::IsFloatingPointFoldingAllowed() const { + // TODO: Add the rules for kernels. For now it will be pessimistic. + if (!context_->get_feature_mgr()->HasCapability(SpvCapabilityShader)) { + return false; + } + + bool is_nocontract = false; + context_->get_decoration_mgr()->WhileEachDecoration( + opcode_, SpvDecorationNoContraction, + [&is_nocontract](const ir::Instruction&) { + is_nocontract = true; + return false; + }); + return !is_nocontract; +} + std::string Instruction::PrettyPrint(uint32_t options) const { // Convert the module to binary. std::vector module_binary; @@ -499,5 +521,80 @@ return str; } +bool Instruction::IsOpcodeCodeMotionSafe() const { + switch (opcode_) { + case SpvOpVectorExtractDynamic: + case SpvOpVectorInsertDynamic: + case SpvOpVectorShuffle: + case SpvOpConvertFToU: + case SpvOpConvertFToS: + case SpvOpConvertSToF: + case SpvOpConvertUToF: + case SpvOpUConvert: + case SpvOpSConvert: + case SpvOpFConvert: + case SpvOpQuantizeToF16: + case SpvOpBitcast: + case SpvOpSNegate: + case SpvOpFNegate: + case SpvOpIAdd: + case SpvOpFAdd: + case SpvOpISub: + case SpvOpFSub: + case SpvOpIMul: + case SpvOpFMul: + case SpvOpUDiv: + case SpvOpSDiv: + case SpvOpFDiv: + case SpvOpUMod: + case SpvOpSRem: + case SpvOpSMod: + case SpvOpFRem: + case SpvOpFMod: + case SpvOpVectorTimesScalar: + case SpvOpMatrixTimesScalar: + case SpvOpVectorTimesMatrix: + case SpvOpMatrixTimesVector: + case SpvOpMatrixTimesMatrix: + case SpvOpLogicalEqual: + case SpvOpLogicalNotEqual: + case SpvOpLogicalOr: + case SpvOpLogicalAnd: + case SpvOpLogicalNot: + case SpvOpIEqual: + case SpvOpINotEqual: + case SpvOpUGreaterThan: + case SpvOpSGreaterThan: + case SpvOpUGreaterThanEqual: + case SpvOpSGreaterThanEqual: + case SpvOpULessThan: + case SpvOpSLessThan: + case SpvOpULessThanEqual: + case SpvOpSLessThanEqual: + case SpvOpFOrdEqual: + case SpvOpFUnordEqual: + case SpvOpFOrdNotEqual: + case SpvOpFUnordNotEqual: + case SpvOpFOrdLessThan: + case SpvOpFUnordLessThan: + case SpvOpFOrdGreaterThan: + case SpvOpFUnordGreaterThan: + case SpvOpFOrdLessThanEqual: + case SpvOpFUnordLessThanEqual: + case SpvOpFOrdGreaterThanEqual: + case SpvOpFUnordGreaterThanEqual: + case SpvOpShiftRightLogical: + case SpvOpShiftRightArithmetic: + case SpvOpShiftLeftLogical: + case SpvOpBitwiseOr: + case SpvOpBitwiseXor: + case SpvOpBitwiseAnd: + case SpvOpNot: + return true; + default: + return false; + } +} + } // namespace ir } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/instruction.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/instruction.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/instruction.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/instruction.h 2018-04-27 11:46:32.000000000 +0000 @@ -186,6 +186,7 @@ return NumInOperandWords() + TypeResultIdCount(); } // Gets the |index|-th logical operand. + inline Operand& GetOperand(uint32_t index); inline const Operand& GetOperand(uint32_t index) const; // Adds |operand| to the list of operands of this instruction. // It is the responsibility of the caller to make sure @@ -218,6 +219,9 @@ return static_cast(operands_.size() - TypeResultIdCount()); } uint32_t NumInOperandWords() const; + Operand& GetInOperand(uint32_t index) { + return GetOperand(index + TypeResultIdCount()); + } const Operand& GetInOperand(uint32_t index) const { return GetOperand(index + TypeResultIdCount()); } @@ -368,6 +372,15 @@ // constant value. bool IsFoldable() const; + // Returns true if |this| is an instruction which could be folded into a + // constant value by |FoldScalar|. + bool IsFoldableByFoldScalar() const; + + // Returns true if we are allowed to fold or otherwise manipulate the + // instruction that defines |id| in the given context. This includes not + // handling NaN values. + bool IsFloatingPointFoldingAllowed() const; + inline bool operator==(const Instruction&) const; inline bool operator!=(const Instruction&) const; inline bool operator<(const Instruction&) const; @@ -380,6 +393,9 @@ // Spec constant. inline bool IsConstant() const; + // Returns true if |this| is an instruction with an opcode safe to move + bool IsOpcodeCodeMotionSafe() const; + // Pretty-prints |inst|. // // Provides the disassembly of a specific instruction. Utilizes |inst|'s @@ -446,10 +462,15 @@ return unique_id() < other.unique_id(); } +inline Operand& Instruction::GetOperand(uint32_t index) { + assert(index < operands_.size() && "operand index out of bound"); + return operands_[index]; +} + inline const Operand& Instruction::GetOperand(uint32_t index) const { assert(index < operands_.size() && "operand index out of bound"); return operands_[index]; -}; +} inline void Instruction::AddOperand(Operand&& operand) { operands_.push_back(std::move(operand)); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/ir_builder.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/ir_builder.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/ir_builder.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/ir_builder.h 2018-04-27 11:46:32.000000000 +0000 @@ -16,9 +16,9 @@ #define LIBSPIRV_OPT_IR_BUILDER_H_ #include "opt/basic_block.h" +#include "opt/constants.h" #include "opt/instruction.h" #include "opt/ir_context.h" - namespace spvtools { namespace opt { @@ -105,6 +105,44 @@ return AddInstruction(std::move(new_branch)); } + // Creates a new switch instruction and the associated selection merge + // instruction if requested. + // The id |selector_id| is the id of the selector instruction, must be of + // type int. + // The id |default_id| is the id of the default basic block to branch to. + // The vector |targets| is the pair of literal/branch id. + // The id |merge_id| is the id of the merge basic block for the selection + // merge instruction. If |merge_id| equals kInvalidId then no selection merge + // instruction will be created. + // The value |selection_control| is the selection control flag for the + // selection merge instruction. + // Note that the user must make sure the final basic block is + // well formed. + ir::Instruction* AddSwitch( + uint32_t selector_id, uint32_t default_id, + const std::vector, uint32_t>>& targets, + uint32_t merge_id = kInvalidId, + uint32_t selection_control = SpvSelectionControlMaskNone) { + if (merge_id != kInvalidId) { + AddSelectionMerge(merge_id, selection_control); + } + std::vector operands; + operands.emplace_back( + ir::Operand{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {selector_id}}); + operands.emplace_back( + ir::Operand{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {default_id}}); + for (auto& target : targets) { + operands.emplace_back( + ir::Operand{spv_operand_type_t::SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER, + target.first}); + operands.emplace_back(ir::Operand{spv_operand_type_t::SPV_OPERAND_TYPE_ID, + {target.second}}); + } + std::unique_ptr new_switch( + new ir::Instruction(GetContext(), SpvOpSwitch, 0, 0, operands)); + return AddInstruction(std::move(new_switch)); + } + // Creates a phi instruction. // The id |type| must be the id of the phi instruction's type. // The vector |incomings| must be a sequence of pairs of inst(new ir::Instruction( + GetContext(), SpvOpIAdd, type, GetContext()->TakeNextId(), + {{SPV_OPERAND_TYPE_ID, {op1}}, {SPV_OPERAND_TYPE_ID, {op2}}})); + return AddInstruction(std::move(inst)); + } + + // Creates a less than instruction for unsigned integer. + // The id |op1| is the left hand side of the operation. + // The id |op2| is the right hand side of the operation. + // It is assumed that |op1| and |op2| have the same underlying type. + ir::Instruction* AddULessThan(uint32_t op1, uint32_t op2) { + analysis::Bool bool_type; + uint32_t type = GetContext()->get_type_mgr()->GetId(&bool_type); + std::unique_ptr inst(new ir::Instruction( + GetContext(), SpvOpULessThan, type, GetContext()->TakeNextId(), + {{SPV_OPERAND_TYPE_ID, {op1}}, {SPV_OPERAND_TYPE_ID, {op2}}})); + return AddInstruction(std::move(inst)); + } + + // Creates a less than instruction for signed integer. + // The id |op1| is the left hand side of the operation. + // The id |op2| is the right hand side of the operation. + // It is assumed that |op1| and |op2| have the same underlying type. + ir::Instruction* AddSLessThan(uint32_t op1, uint32_t op2) { + analysis::Bool bool_type; + uint32_t type = GetContext()->get_type_mgr()->GetId(&bool_type); + std::unique_ptr inst(new ir::Instruction( + GetContext(), SpvOpSLessThan, type, GetContext()->TakeNextId(), + {{SPV_OPERAND_TYPE_ID, {op1}}, {SPV_OPERAND_TYPE_ID, {op2}}})); + return AddInstruction(std::move(inst)); + } + + // Creates an OpILessThan or OpULessThen instruction depending on the sign of + // |op1|. The id |op1| is the left hand side of the operation. The id |op2| is + // the right hand side of the operation. It is assumed that |op1| and |op2| + // have the same underlying type. + ir::Instruction* AddLessThan(uint32_t op1, uint32_t op2) { + ir::Instruction* op1_insn = context_->get_def_use_mgr()->GetDef(op1); + analysis::Type* type = + GetContext()->get_type_mgr()->GetType(op1_insn->type_id()); + analysis::Integer* int_type = type->AsInteger(); + assert(int_type && "Operand is not of int type"); + + if (int_type->IsSigned()) + return AddSLessThan(op1, op2); + else + return AddULessThan(op1, op2); + } + // Creates a select instruction. // |type| must match the types of |true_value| and |false_value|. It is up to // the caller to ensure that |cond| is a correct type (bool or vector of @@ -136,6 +229,12 @@ return AddInstruction(std::move(select)); } + // Adds a signed int32 constant to the binary. + // The |value| parameter is the constant value to be added. + ir::Instruction* Add32BitSignedIntegerConstant(int32_t value) { + return Add32BitConstantInteger(value, true); + } + // Create a composite construct. // |type| should be a composite type and the number of elements it has should // match the size od |ids|. @@ -151,6 +250,47 @@ GetContext()->TakeNextId(), ops)); return AddInstruction(std::move(construct)); } + // Adds an unsigned int32 constant to the binary. + // The |value| parameter is the constant value to be added. + ir::Instruction* Add32BitUnsignedIntegerConstant(uint32_t value) { + return Add32BitConstantInteger(value, false); + } + + // Adds either a signed or unsigned 32 bit integer constant to the binary + // depedning on the |sign|. If |sign| is true then the value is added as a + // signed constant otherwise as an unsigned constant. If |sign| is false the + // value must not be a negative number. + template + ir::Instruction* Add32BitConstantInteger(T value, bool sign) { + // Assert that we are not trying to store a negative number in an unsigned + // type. + if (!sign) + assert(value >= 0 && + "Trying to add a signed integer with an unsigned type!"); + + analysis::Integer int_type{32, sign}; + + // Get or create the integer type. This rebuilds the type and manages the + // memory for the rebuilt type. + uint32_t type_id = + GetContext()->get_type_mgr()->GetTypeInstruction(&int_type); + + // Get the memory managed type so that it is safe to be stored by + // GetConstant. + analysis::Type* rebuilt_type = + GetContext()->get_type_mgr()->GetType(type_id); + + // Even if the value is negative we need to pass the bit pattern as a + // uint32_t to GetConstant. + uint32_t word = value; + + // Create the constant value. + const opt::analysis::Constant* constant = + GetContext()->get_constant_mgr()->GetConstant(rebuilt_type, {word}); + + // Create the OpConstant instruction using the type and the value. + return GetContext()->get_constant_mgr()->GetDefiningInstruction(constant); + } ir::Instruction* AddCompositeExtract( uint32_t type, uint32_t id_of_composite, @@ -167,6 +307,29 @@ GetContext()->TakeNextId(), operands)); return AddInstruction(std::move(new_inst)); } + + // Creates an unreachable instruction. + ir::Instruction* AddUnreachable() { + std::unique_ptr select( + new ir::Instruction(GetContext(), SpvOpUnreachable, 0, 0, + std::initializer_list{})); + return AddInstruction(std::move(select)); + } + + ir::Instruction* AddAccessChain(uint32_t type_id, uint32_t base_ptr_id, + std::vector ids) { + std::vector operands; + operands.push_back({SPV_OPERAND_TYPE_ID, {base_ptr_id}}); + + for (uint32_t index_id : ids) { + operands.push_back({SPV_OPERAND_TYPE_ID, {index_id}}); + } + + std::unique_ptr new_inst( + new ir::Instruction(GetContext(), SpvOpAccessChain, type_id, + GetContext()->TakeNextId(), operands)); + return AddInstruction(std::move(new_inst)); + } // Inserts the new instruction before the insertion point. ir::Instruction* AddInstruction(std::unique_ptr&& insn) { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/ir_context.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/ir_context.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/ir_context.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/ir_context.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -42,6 +42,12 @@ if (set & kAnalysisLoopAnalysis) { ResetLoopAnalysis(); } + if (set & kAnalysisNameMap) { + BuildIdToNameMap(); + } + if (set & kAnalysisScalarEvolution) { + BuildScalarEvolutionAnalysis(); + } } void IRContext::InvalidateAnalysesExceptFor( @@ -70,6 +76,9 @@ dominator_trees_.clear(); post_dominator_trees_.clear(); } + if (analyses_to_invalidate & kAnalysisNameMap) { + id_to_name_.reset(nullptr); + } valid_analyses_ = Analysis(valid_analyses_ & ~analyses_to_invalidate); } @@ -100,6 +109,12 @@ type_mgr_->RemoveId(inst->result_id()); } + if (constant_mgr_ && ir::IsConstantInst(inst->opcode())) { + constant_mgr_->RemoveId(inst->result_id()); + } + + RemoveFromIdToName(inst); + Instruction* next_instruction = nullptr; if (inst->IsInAList()) { next_instruction = inst->NextNode(); @@ -183,17 +198,25 @@ return false; } } + if (AreAnalysesValid(kAnalysisInstrToBlockMapping)) { for (auto& func : *module()) { for (auto& block : func) { if (!block.WhileEachInst([this, &block](ir::Instruction* inst) { - if (get_instr_block(inst) != &block) return false; + if (get_instr_block(inst) != &block) { + return false; + } return true; })) return false; } } } + + if (!CheckCFG()) { + return false; + } + return true; } @@ -206,6 +229,7 @@ get_decoration_mgr()->RemoveDecoration(inst); } } + RemoveFromIdToName(inst); } void IRContext::AnalyzeUses(Instruction* inst) { @@ -217,6 +241,10 @@ get_decoration_mgr()->AddDecoration(inst); } } + if (id_to_name_ && + (inst->opcode() == SpvOpName || inst->opcode() == SpvOpMemberName)) { + id_to_name_->insert({inst->GetSingleWordInOperand(0), inst}); + } } void IRContext::KillNamesAndDecorates(uint32_t id) { @@ -227,19 +255,12 @@ KillInst(inst); } - Instruction* debug_inst = &*debug2_begin(); - while (debug_inst) { - bool killed_inst = false; - if (debug_inst->opcode() == SpvOpMemberName || - debug_inst->opcode() == SpvOpName) { - if (debug_inst->GetSingleWordInOperand(0) == id) { - debug_inst = KillInst(debug_inst); - killed_inst = true; - } - } - if (!killed_inst) { - debug_inst = debug_inst->NextNode(); - } + std::vector name_to_kill; + for (auto name : GetNames(id)) { + name_to_kill.push_back(name.second); + } + for (ir::Instruction* name_inst : name_to_kill) { + KillInst(name_inst); } } @@ -254,6 +275,33 @@ combinator_ops_[0].insert({ SpvOpNop, SpvOpUndef, + SpvOpConstant, + SpvOpConstantTrue, + SpvOpConstantFalse, + SpvOpConstantComposite, + SpvOpConstantSampler, + SpvOpConstantNull, + SpvOpTypeVoid, + SpvOpTypeBool, + SpvOpTypeInt, + SpvOpTypeFloat, + SpvOpTypeVector, + SpvOpTypeMatrix, + SpvOpTypeImage, + SpvOpTypeSampler, + SpvOpTypeSampledImage, + SpvOpTypeArray, + SpvOpTypeRuntimeArray, + SpvOpTypeStruct, + SpvOpTypeOpaque, + SpvOpTypePointer, + SpvOpTypeFunction, + SpvOpTypeEvent, + SpvOpTypeDeviceEvent, + SpvOpTypeReserveId, + SpvOpTypeQueue, + SpvOpTypePipe, + SpvOpTypeForwardPointer, SpvOpVariable, SpvOpImageTexelPointer, SpvOpLoad, @@ -474,9 +522,8 @@ } void IRContext::InitializeCombinators() { - for (auto& capability : module()->capabilities()) { - AddCombinatorsForCapability(capability.GetSingleWordInOperand(0)); - } + get_feature_mgr()->GetCapabilities()->ForEach( + [this](SpvCapability cap) { AddCombinatorsForCapability(cap); }); for (auto& extension : module()->ext_inst_imports()) { AddCombinatorsForExtension(&extension); @@ -485,6 +532,19 @@ valid_analyses_ |= kAnalysisCombinators; } +void IRContext::RemoveFromIdToName(const Instruction* inst) { + if (id_to_name_ && + (inst->opcode() == SpvOpName || inst->opcode() == SpvOpMemberName)) { + auto range = id_to_name_->equal_range(inst->GetSingleWordInOperand(0)); + for (auto it = range.first; it != range.second; ++it) { + if (it->second == inst) { + id_to_name_->erase(it); + break; + } + } + } +} + ir::LoopDescriptor* IRContext::GetLoopDescriptor(const ir::Function* f) { if (!AreAnalysesValid(kAnalysisLoopAnalysis)) { ResetLoopAnalysis(); @@ -528,5 +588,56 @@ return &post_dominator_trees_[f]; } +bool ir::IRContext::CheckCFG() { + std::unordered_map> real_preds; + if (!AreAnalysesValid(kAnalysisCFG)) { + return true; + } + + for (ir::Function& function : *module()) { + for (const auto& bb : function) { + bb.ForEachSuccessorLabel([&bb, &real_preds](const uint32_t lab_id) { + real_preds[lab_id].push_back(bb.id()); + }); + } + + for (auto& bb : function) { + std::vector preds = cfg()->preds(bb.id()); + std::vector real = real_preds[bb.id()]; + std::sort(preds.begin(), preds.end()); + std::sort(real.begin(), real.end()); + + bool same = true; + if (preds.size() != real.size()) { + same = false; + } + + for (size_t i = 0; i < real.size() && same; i++) { + if (preds[i] != real[i]) { + same = false; + } + } + + if (!same) { + std::cerr << "Predecessors for " << bb.id() << " are different:\n"; + + std::cerr << "Real:"; + for (uint32_t i : real) { + std::cerr << ' ' << i; + } + std::cerr << std::endl; + + std::cerr << "Recorded:"; + for (uint32_t i : preds) { + std::cerr << ' ' << i; + } + std::cerr << std::endl; + } + if (!same) return false; + } + } + + return true; +} } // namespace ir } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/ir_context.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/ir_context.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/ir_context.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/ir_context.h 2018-04-27 11:46:32.000000000 +0000 @@ -24,6 +24,7 @@ #include "feature_manager.h" #include "loop_descriptor.h" #include "module.h" +#include "scalar_analysis.h" #include "type_manager.h" #include @@ -57,7 +58,9 @@ kAnalysisCFG = 1 << 4, kAnalysisDominatorAnalysis = 1 << 5, kAnalysisLoopAnalysis = 1 << 6, - kAnalysisEnd = 1 << 7 + kAnalysisNameMap = 1 << 7, + kAnalysisScalarEvolution = 1 << 8, + kAnalysisEnd = 1 << 9 }; friend inline Analysis operator|(Analysis lhs, Analysis rhs); @@ -75,7 +78,8 @@ def_use_mgr_(nullptr), valid_analyses_(kAnalysisNone), constant_mgr_(nullptr), - type_mgr_(nullptr) { + type_mgr_(nullptr), + id_to_name_(nullptr) { libspirv::SetContextMessageConsumer(syntax_context_, consumer_); module_->SetContext(this); } @@ -89,8 +93,8 @@ consumer_(std::move(c)), def_use_mgr_(nullptr), valid_analyses_(kAnalysisNone), - constant_mgr_(nullptr), - type_mgr_(nullptr) { + type_mgr_(nullptr), + id_to_name_(nullptr) { libspirv::SetContextMessageConsumer(syntax_context_, consumer_); module_->SetContext(this); InitializeCombinators(); @@ -256,6 +260,24 @@ return type_mgr_.get(); } + // Returns a pointer to the scalar evolution analysis. If it is invalid it + // will be rebuilt first. + opt::ScalarEvolutionAnalysis* GetScalarEvolutionAnalysis() { + if (!AreAnalysesValid(kAnalysisScalarEvolution)) { + BuildScalarEvolutionAnalysis(); + } + return scalar_evolution_analysis_.get(); + } + + // Build the map from the ids to the OpName and OpMemberName instruction + // associated with it. + inline void BuildIdToNameMap(); + + // Returns a range of instrucions that contain all of the OpName and + // OpMemberNames associated with the given id. + inline IteratorRange::iterator> + GetNames(uint32_t id); + // Sets the message consumer to the given |consumer|. |consumer| which will be // invoked every time there is a message to be communicated to the outside. void SetMessageConsumer(spvtools::MessageConsumer c) { @@ -399,6 +421,10 @@ // Returns the grammar for this context. const libspirv::AssemblyGrammar& grammar() const { return grammar_; } + // If |inst| has not yet been analysed by the def-use manager, then analyse + // its definitions and uses. + inline void UpdateDefUse(Instruction* inst); + private: // Builds the def-use manager from scratch, even if it was already valid. void BuildDefUseManager() { @@ -429,6 +455,11 @@ valid_analyses_ = valid_analyses_ | kAnalysisCFG; } + void BuildScalarEvolutionAnalysis() { + scalar_evolution_analysis_.reset(new opt::ScalarEvolutionAnalysis(this)); + valid_analyses_ = valid_analyses_ | kAnalysisScalarEvolution; + } + // Removes all computed dominator and post-dominator trees. This will force // the context to rebuild the trees on demand. void ResetDominatorAnalysis() { @@ -461,6 +492,13 @@ // Add the combinator opcode for the given extension to combinator_ops_. void AddCombinatorsForExtension(ir::Instruction* extension); + // Remove |inst| from |id_to_name_| if it is in map. + void RemoveFromIdToName(const Instruction* inst); + + // Returns true if it is suppose to be valid but it is incorrect. Returns + // true if the cfg is invalidated. + bool CheckCFG(); + // The SPIR-V syntax context containing grammar tables for opcodes and // operands. spv_context syntax_context_; @@ -519,6 +557,12 @@ // Type manager for |module_|. std::unique_ptr type_mgr_; + + // A map from an id to its corresponding OpName and OpMemberName instructions. + std::unique_ptr> id_to_name_; + + // The cache scalar evolution analysis node. + std::unique_ptr scalar_evolution_analysis_; }; inline ir::IRContext::Analysis operator|(ir::IRContext::Analysis lhs, @@ -691,6 +735,11 @@ } void IRContext::AddDebug2Inst(std::unique_ptr&& d) { + if (AreAnalysesValid(kAnalysisNameMap)) { + if (d->opcode() == SpvOpName || d->opcode() == SpvOpMemberName) { + id_to_name_->insert({d->result_id(), d.get()}); + } + } module()->AddDebug2Inst(std::move(d)); } @@ -707,10 +756,16 @@ void IRContext::AddType(std::unique_ptr&& t) { module()->AddType(std::move(t)); + if (AreAnalysesValid(kAnalysisDefUse)) { + get_def_use_mgr()->AnalyzeInstDef(&*(--types_values_end())); + } } void IRContext::AddGlobalValue(std::unique_ptr&& v) { module()->AddGlobalValue(std::move(v)); + if (AreAnalysesValid(kAnalysisDefUse)) { + get_def_use_mgr()->AnalyzeInstDef(&*(--types_values_end())); + } } void IRContext::AddFunction(std::unique_ptr&& f) { @@ -723,6 +778,32 @@ } } +void IRContext::UpdateDefUse(Instruction* inst) { + if (AreAnalysesValid(kAnalysisDefUse)) { + get_def_use_mgr()->UpdateDefUse(inst); + } +} + +void IRContext::BuildIdToNameMap() { + id_to_name_.reset(new std::multimap()); + for (Instruction& debug_inst : debugs2()) { + if (debug_inst.opcode() == SpvOpMemberName || + debug_inst.opcode() == SpvOpName) { + id_to_name_->insert({debug_inst.GetSingleWordInOperand(0), &debug_inst}); + } + } + valid_analyses_ = valid_analyses_ | kAnalysisNameMap; +} + +IteratorRange::iterator> +IRContext::GetNames(uint32_t id) { + if (!AreAnalysesValid(kAnalysisNameMap)) { + BuildIdToNameMap(); + } + auto result = id_to_name_->equal_range(id); + return make_range(std::move(result.first), std::move(result.second)); +} + } // namespace ir } // namespace spvtools #endif // SPIRV_TOOLS_IR_CONTEXT_H diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/iterator.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/iterator.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/iterator.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/iterator.h 2018-04-27 11:46:32.000000000 +0000 @@ -99,6 +99,14 @@ inline typename std::enable_if::type Erase(); + // Returns the underlying iterator. + UnderlyingIterator Get() const { return iterator_; } + + // Returns a valid end iterator for the underlying container. + UptrVectorIterator End() const { + return UptrVectorIterator(container_, container_->end()); + } + private: UptrVector* container_; // The container we are manipulating. UnderlyingIterator iterator_; // The raw iterator from the container. diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/licm_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/licm_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/licm_pass.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/licm_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,125 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include "opt/licm_pass.h" +#include "opt/module.h" +#include "opt/pass.h" + +#include +#include + +namespace spvtools { +namespace opt { + +Pass::Status LICMPass::Process(ir::IRContext* c) { + InitializeProcessing(c); + bool modified = false; + + if (c != nullptr) { + modified = ProcessIRContext(); + } + + return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; +} + +bool LICMPass::ProcessIRContext() { + bool modified = false; + ir::Module* module = get_module(); + + // Process each function in the module + for (ir::Function& f : *module) { + modified |= ProcessFunction(&f); + } + return modified; +} + +bool LICMPass::ProcessFunction(ir::Function* f) { + bool modified = false; + ir::LoopDescriptor* loop_descriptor = context()->GetLoopDescriptor(f); + + // Process each loop in the function + for (ir::Loop& loop : *loop_descriptor) { + // Ignore nested loops, as we will process them in order in ProcessLoop + if (loop.IsNested()) { + continue; + } + modified |= ProcessLoop(&loop, f); + } + return modified; +} + +bool LICMPass::ProcessLoop(ir::Loop* loop, ir::Function* f) { + bool modified = false; + + // Process all nested loops first + for (ir::Loop* nested_loop : *loop) { + modified |= ProcessLoop(nested_loop, f); + } + + std::vector loop_bbs{}; + modified |= AnalyseAndHoistFromBB(loop, f, loop->GetHeaderBlock(), &loop_bbs); + + for (size_t i = 0; i < loop_bbs.size(); ++i) { + ir::BasicBlock* bb = loop_bbs[i]; + // do not delete the element + modified |= AnalyseAndHoistFromBB(loop, f, bb, &loop_bbs); + } + + return modified; +} + +bool LICMPass::AnalyseAndHoistFromBB(ir::Loop* loop, ir::Function* f, + ir::BasicBlock* bb, + std::vector* loop_bbs) { + bool modified = false; + std::function hoist_inst = + [this, &loop, &modified](ir::Instruction* inst) { + if (loop->ShouldHoistInstruction(this->context(), inst)) { + HoistInstruction(loop, inst); + modified = true; + } + }; + + if (IsImmediatelyContainedInLoop(loop, f, bb)) { + bb->ForEachInst(hoist_inst, false); + } + + opt::DominatorAnalysis* dom_analysis = + context()->GetDominatorAnalysis(f, *cfg()); + opt::DominatorTree& dom_tree = dom_analysis->GetDomTree(); + + for (opt::DominatorTreeNode* child_dom_tree_node : + *dom_tree.GetTreeNode(bb)) { + if (loop->IsInsideLoop(child_dom_tree_node->bb_)) { + loop_bbs->push_back(child_dom_tree_node->bb_); + } + } + + return modified; +} + +bool LICMPass::IsImmediatelyContainedInLoop(ir::Loop* loop, ir::Function* f, + ir::BasicBlock* bb) { + ir::LoopDescriptor* loop_descriptor = context()->GetLoopDescriptor(f); + return loop == (*loop_descriptor)[bb->id()]; +} + +void LICMPass::HoistInstruction(ir::Loop* loop, ir::Instruction* inst) { + ir::BasicBlock* pre_header_bb = loop->GetOrCreatePreHeaderBlock(); + inst->InsertBefore(std::move(&(*pre_header_bb->tail()))); + context()->set_instr_block(inst, pre_header_bb); +} + +} // namespace opt +} // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/licm_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/licm_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/licm_pass.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/licm_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,68 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#ifndef SOURCE_OPT_LICM_PASS_H_ +#define SOURCE_OPT_LICM_PASS_H_ + +#include "opt/basic_block.h" +#include "opt/instruction.h" +#include "opt/loop_descriptor.h" +#include "opt/pass.h" + +#include + +namespace spvtools { +namespace opt { + +class LICMPass : public Pass { + public: + LICMPass() {} + + const char* name() const override { return "loop-invariant-code-motion"; } + Status Process(ir::IRContext*) override; + + private: + // Searches the IRContext for functions and processes each, moving invariants + // outside loops within the function where possible + // Returns true if a change was made to a function within the IRContext + bool ProcessIRContext(); + + // Checks the function for loops, calling ProcessLoop on each one found. + // Returns true if a change was made to the function, false otherwise. + bool ProcessFunction(ir::Function* f); + + // Checks for invariants in the loop and attempts to move them to the loops + // preheader. Works from inner loop to outer when nested loops are found. + // Returns true if a change was made to the loop, false otherwise. + bool ProcessLoop(ir::Loop* loop, ir::Function* f); + + // Analyses each instruction in |bb|, hoisting invariants to |pre_header_bb|. + // Each child of |bb| wrt to |dom_tree| is pushed to |loop_bbs| + bool AnalyseAndHoistFromBB(ir::Loop* loop, ir::Function* f, + ir::BasicBlock* bb, + std::vector* loop_bbs); + + // Returns true if |bb| is immediately contained in |loop| + bool IsImmediatelyContainedInLoop(ir::Loop* loop, ir::Function* f, + ir::BasicBlock* bb); + + // Move the instruction to the given BasicBlock + // This method will update the instruction to block mapping for the context + void HoistInstruction(ir::Loop* loop, ir::Instruction* inst); +}; + +} // namespace opt +} // namespace spvtools + +#endif // SOURCE_OPT_LICM_PASS_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_access_chain_convert_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_access_chain_convert_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_access_chain_convert_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_access_chain_convert_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -256,7 +256,7 @@ // Initialize extension whitelist InitExtensions(); -}; +} bool LocalAccessChainConvertPass::AllExtensionsSupported() const { // If any extension not in whitelist, return false @@ -324,6 +324,16 @@ "SPV_AMD_gpu_shader_int16", "SPV_KHR_post_depth_coverage", "SPV_KHR_shader_atomic_counter_ops", + "SPV_EXT_shader_stencil_export", + "SPV_EXT_shader_viewport_index_layer", + "SPV_AMD_shader_image_load_store_lod", + "SPV_AMD_shader_fragment_mask", + "SPV_EXT_fragment_fully_covered", + "SPV_AMD_gpu_shader_half_float_fetch", + "SPV_GOOGLE_decorate_string", + "SPV_GOOGLE_hlsl_functionality1", + "SPV_NV_shader_subgroup_partitioned", + "SPV_EXT_descriptor_indexing", }); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_redundancy_elimination.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_redundancy_elimination.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_redundancy_elimination.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_redundancy_elimination.h 2018-04-27 11:46:32.000000000 +0000 @@ -38,7 +38,8 @@ ir::IRContext::kAnalysisInstrToBlockMapping | ir::IRContext::kAnalysisDecorations | ir::IRContext::kAnalysisCombinators | ir::IRContext::kAnalysisCFG | - ir::IRContext::kAnalysisDominatorAnalysis; + ir::IRContext::kAnalysisDominatorAnalysis | + ir::IRContext::kAnalysisNameMap; } protected: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_single_block_elim_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_single_block_elim_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_single_block_elim_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_single_block_elim_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -50,7 +50,6 @@ bool LocalSingleBlockLoadStoreElimPass::LocalSingleBlockLoadStoreElim( ir::Function* func) { // Perform local store/load and load/load elimination on each block - std::vector dead_instructions; bool modified = false; for (auto bi = func->begin(); bi != func->end(); ++bi) { var2store_.clear(); @@ -72,7 +71,6 @@ if (pinned_vars_.find(varId) == pinned_vars_.end()) { auto si = var2store_.find(varId); if (si != var2store_.end()) { - dead_instructions.push_back(si->second); } } var2store_[varId] = &*ii; @@ -106,7 +104,6 @@ // replace load's result id and delete load context()->KillNamesAndDecorates(&*ii); context()->ReplaceAllUsesWith(ii->result_id(), replId); - dead_instructions.push_back(&*ii); modified = true; } else { if (ptrInst->opcode() == SpvOpVariable) @@ -125,38 +122,6 @@ break; } } - - while (!dead_instructions.empty()) { - ir::Instruction* inst = dead_instructions.back(); - dead_instructions.pop_back(); - DCEInst(inst, [&dead_instructions](ir::Instruction* other_inst) { - auto i = std::find(dead_instructions.begin(), dead_instructions.end(), - other_inst); - if (i != dead_instructions.end()) { - dead_instructions.erase(i); - } - }); - } - - // Go back and delete useless stores in block - // TODO(greg-lunarg): Consider moving DCE into separate pass - std::vector dead_stores; - for (auto ii = bi->begin(); ii != bi->end(); ++ii) { - if (ii->opcode() != SpvOpStore) continue; - if (IsLiveStore(&*ii)) continue; - dead_stores.push_back(&*ii); - } - - while (!dead_stores.empty()) { - ir::Instruction* inst = dead_stores.back(); - dead_stores.pop_back(); - DCEInst(inst, [&dead_stores](ir::Instruction* other_inst) { - auto i = std::find(dead_stores.begin(), dead_stores.end(), other_inst); - if (i != dead_stores.end()) { - dead_stores.erase(i); - } - }); - } } return modified; } @@ -173,7 +138,7 @@ // Initialize extensions whitelist InitExtensions(); -}; +} bool LocalSingleBlockLoadStoreElimPass::AllExtensionsSupported() const { // If any extension not in whitelist, return false @@ -239,6 +204,16 @@ "SPV_AMD_gpu_shader_int16", "SPV_KHR_post_depth_coverage", "SPV_KHR_shader_atomic_counter_ops", + "SPV_EXT_shader_stencil_export", + "SPV_EXT_shader_viewport_index_layer", + "SPV_AMD_shader_image_load_store_lod", + "SPV_AMD_shader_fragment_mask", + "SPV_EXT_fragment_fully_covered", + "SPV_AMD_gpu_shader_half_float_fetch", + "SPV_GOOGLE_decorate_string", + "SPV_GOOGLE_hlsl_functionality1", + "SPV_NV_shader_subgroup_partitioned", + "SPV_EXT_descriptor_indexing", }); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_single_store_elim_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_single_store_elim_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_single_store_elim_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_single_store_elim_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -184,7 +184,6 @@ bool modified = false; for (auto bi = func->begin(); bi != func->end(); ++bi) { uint32_t instIdx = 0; - std::vector dead_instructions; for (auto ii = bi->begin(); ii != bi->end(); ++ii, ++instIdx) { if (ii->opcode() != SpvOpLoad) continue; uint32_t varId; @@ -208,55 +207,6 @@ // and add load to removal list context()->KillNamesAndDecorates(&*ii); context()->ReplaceAllUsesWith(ii->result_id(), replId); - dead_instructions.push_back(&*ii); - modified = true; - } - - // Define the function that will update the data structures as instructions - // are deleted. - auto update_function = [&dead_instructions, - this](ir::Instruction* other_inst) { - // Update dead_instructions. - auto i = std::find(dead_instructions.begin(), dead_instructions.end(), - other_inst); - if (i != dead_instructions.end()) { - dead_instructions.erase(i); - } - - // Update the variable-to-store map if any of its members is DCE'd. - uint32_t id; - if (other_inst->opcode() == SpvOpStore) GetPtr(other_inst, &id); - if (other_inst->opcode() == SpvOpVariable) - id = other_inst->result_id(); - else - return; - - auto store = ssa_var2store_.find(id); - if (store != ssa_var2store_.end()) { - ssa_var2store_.erase(store); - } - }; - - while (!dead_instructions.empty()) { - ir::Instruction* inst = dead_instructions.back(); - dead_instructions.pop_back(); - DCEInst(inst, update_function); - } - } - return modified; -} - -bool LocalSingleStoreElimPass::SingleStoreDCE() { - bool modified = false; - std::unordered_set already_deleted; - for (auto v : ssa_var2store_) { - // check that it hasn't already been DCE'd - if (already_deleted.find(v.second) != already_deleted.end()) continue; - if (non_ssa_vars_.find(v.first) != non_ssa_vars_.end()) continue; - if (!IsLiveVar(v.first)) { - DCEInst(v.second, [&already_deleted](ir::Instruction* inst) { - already_deleted.insert(inst); - }); modified = true; } } @@ -268,7 +218,6 @@ SingleStoreAnalyze(func); if (ssa_var2store_.empty()) return false; modified |= SingleStoreProcess(func); - modified |= SingleStoreDCE(); return modified; } @@ -293,7 +242,7 @@ // Initialize extension whitelist InitExtensions(); -}; +} bool LocalSingleStoreElimPass::AllExtensionsSupported() const { // If any extension not in whitelist, return false @@ -358,6 +307,16 @@ "SPV_AMD_gpu_shader_int16", "SPV_KHR_post_depth_coverage", "SPV_KHR_shader_atomic_counter_ops", + "SPV_EXT_shader_stencil_export", + "SPV_EXT_shader_viewport_index_layer", + "SPV_AMD_shader_image_load_store_lod", + "SPV_AMD_shader_fragment_mask", + "SPV_EXT_fragment_fully_covered", + "SPV_AMD_gpu_shader_half_float_fetch", + "SPV_GOOGLE_decorate_string", + "SPV_GOOGLE_hlsl_functionality1", + "SPV_NV_shader_subgroup_partitioned", + "SPV_EXT_descriptor_indexing", }); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_single_store_elim_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_single_store_elim_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_single_store_elim_pass.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_single_store_elim_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -85,11 +85,6 @@ // if any instructions are modified. bool SingleStoreProcess(ir::Function* func); - // Remove all stores to useless SSA variables. Remove useless - // access chains and variables as well. Assumes SingleStoreAnalyze - // and SingleStoreProcess has been run. - bool SingleStoreDCE(); - // Do "single-store" optimization of function variables defined only // with a single non-access-chain store in |func|. Replace all their // non-access-chain loads with the value that is stored and eliminate diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_ssa_elim_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_ssa_elim_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_ssa_elim_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_ssa_elim_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -18,50 +18,17 @@ #include "cfa.h" #include "iterator.h" +#include "ssa_rewrite_pass.h" namespace spvtools { namespace opt { -bool LocalMultiStoreElimPass::EliminateMultiStoreLocal(ir::Function* func) { - // Add Phi instructions to the function. - if (InsertPhiInstructions(func) == Status::SuccessWithoutChange) return false; - - // Remove all target variable stores. - bool modified = false; - for (auto bi = func->begin(); bi != func->end(); ++bi) { - std::vector dead_instructions; - for (auto ii = bi->begin(); ii != bi->end(); ++ii) { - if (ii->opcode() != SpvOpStore) continue; - uint32_t varId; - (void)GetPtr(&*ii, &varId); - if (!IsTargetVar(varId)) continue; - assert(!HasLoads(varId)); - dead_instructions.push_back(&*ii); - modified = true; - } - - while (!dead_instructions.empty()) { - ir::Instruction* inst = dead_instructions.back(); - dead_instructions.pop_back(); - DCEInst(inst, [&dead_instructions](ir::Instruction* other_inst) { - auto i = std::find(dead_instructions.begin(), dead_instructions.end(), - other_inst); - if (i != dead_instructions.end()) { - dead_instructions.erase(i); - } - }); - } - } - - return modified; -} - void LocalMultiStoreElimPass::Initialize(ir::IRContext* c) { InitializeProcessing(c); // Initialize extension whitelist InitExtensions(); -}; +} bool LocalMultiStoreElimPass::AllExtensionsSupported() const { // If any extension not in whitelist, return false @@ -75,10 +42,6 @@ } Pass::Status LocalMultiStoreElimPass::ProcessImpl() { - // Assumes all control flow structured. - // TODO(greg-lunarg): Do SSA rewrite for non-structured control flow - if (!context()->get_feature_mgr()->HasCapability(SpvCapabilityShader)) - return Status::SuccessWithoutChange; // Assumes relaxed logical addressing only (see instruction.h) // TODO(greg-lunarg): Add support for physical addressing if (context()->get_feature_mgr()->HasCapability(SpvCapabilityAddresses)) @@ -92,7 +55,7 @@ if (!AllExtensionsSupported()) return Status::SuccessWithoutChange; // Process functions ProcessFunction pfn = [this](ir::Function* fp) { - return EliminateMultiStoreLocal(fp); + return SSARewriter(this).RewriteFunctionIntoSSA(fp); }; bool modified = ProcessEntryPointCallTree(pfn, get_module()); return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; @@ -131,6 +94,16 @@ "SPV_AMD_gpu_shader_int16", "SPV_KHR_post_depth_coverage", "SPV_KHR_shader_atomic_counter_ops", + "SPV_EXT_shader_stencil_export", + "SPV_EXT_shader_viewport_index_layer", + "SPV_AMD_shader_image_load_store_lod", + "SPV_AMD_shader_fragment_mask", + "SPV_EXT_fragment_fully_covered", + "SPV_AMD_gpu_shader_half_float_fetch", + "SPV_GOOGLE_decorate_string", + "SPV_GOOGLE_hlsl_functionality1", + "SPV_NV_shader_subgroup_partitioned", + "SPV_EXT_descriptor_indexing", }); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_ssa_elim_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_ssa_elim_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/local_ssa_elim_pass.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/local_ssa_elim_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -56,13 +56,6 @@ // Return true if all extensions in this module are allowed by this pass. bool AllExtensionsSupported() const; - // Remove remaining loads and stores of function scope variables only - // referenced with non-access-chain loads and stores from function |func|. - // Insert Phi functions where necessary. Running LocalAccessChainRemoval, - // SingleBlockLocalElim and SingleStoreLocalElim beforehand will improve - // the runtime and effectiveness of this function. - bool EliminateMultiStoreLocal(ir::Function* func); - void Initialize(ir::IRContext* c); Pass::Status ProcessImpl(); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_descriptor.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_descriptor.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_descriptor.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_descriptor.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -13,11 +13,13 @@ // limitations under the License. #include "opt/loop_descriptor.h" +#include #include #include #include #include +#include "constants.h" #include "opt/cfg.h" #include "opt/dominator_tree.h" #include "opt/ir_builder.h" @@ -29,24 +31,174 @@ namespace spvtools { namespace ir { +// Takes in a phi instruction |induction| and the loop |header| and returns the +// step operation of the loop. +ir::Instruction* Loop::GetInductionStepOperation( + const ir::Instruction* induction) const { + // Induction must be a phi instruction. + assert(induction->opcode() == SpvOpPhi); + + ir::Instruction* step = nullptr; + + opt::analysis::DefUseManager* def_use_manager = context_->get_def_use_mgr(); + + // Traverse the incoming operands of the phi instruction. + for (uint32_t operand_id = 1; operand_id < induction->NumInOperands(); + operand_id += 2) { + // Incoming edge. + ir::BasicBlock* incoming_block = + context_->cfg()->block(induction->GetSingleWordInOperand(operand_id)); + + // Check if the block is dominated by header, and thus coming from within + // the loop. + if (IsInsideLoop(incoming_block)) { + step = def_use_manager->GetDef( + induction->GetSingleWordInOperand(operand_id - 1)); + break; + } + } + + if (!step || !IsSupportedStepOp(step->opcode())) { + return nullptr; + } + + // The induction variable which binds the loop must only be modified once. + uint32_t lhs = step->GetSingleWordInOperand(0); + uint32_t rhs = step->GetSingleWordInOperand(1); + + // One of the left hand side or right hand side of the step instruction must + // be the induction phi and the other must be an OpConstant. + if (lhs != induction->result_id() && rhs != induction->result_id()) { + return nullptr; + } + + if (def_use_manager->GetDef(lhs)->opcode() != SpvOp::SpvOpConstant && + def_use_manager->GetDef(rhs)->opcode() != SpvOp::SpvOpConstant) { + return nullptr; + } + + return step; +} + +// Returns true if the |step| operation is an induction variable step operation +// which is currently handled. +bool Loop::IsSupportedStepOp(SpvOp step) const { + switch (step) { + case SpvOp::SpvOpISub: + case SpvOp::SpvOpIAdd: + return true; + default: + return false; + } +} + +bool Loop::IsSupportedCondition(SpvOp condition) const { + switch (condition) { + // < + case SpvOp::SpvOpULessThan: + case SpvOp::SpvOpSLessThan: + // > + case SpvOp::SpvOpUGreaterThan: + case SpvOp::SpvOpSGreaterThan: + + // >= + case SpvOp::SpvOpSGreaterThanEqual: + case SpvOp::SpvOpUGreaterThanEqual: + // <= + case SpvOp::SpvOpSLessThanEqual: + case SpvOp::SpvOpULessThanEqual: + + return true; + default: + return false; + } +} + +int64_t Loop::GetResidualConditionValue(SpvOp condition, int64_t initial_value, + int64_t step_value, + size_t number_of_iterations, + size_t factor) { + int64_t remainder = + initial_value + (number_of_iterations % factor) * step_value; + + // We subtract or add one as the above formula calculates the remainder if the + // loop where just less than or greater than. Adding or subtracting one should + // give a functionally equivalent value. + switch (condition) { + case SpvOp::SpvOpSGreaterThanEqual: + case SpvOp::SpvOpUGreaterThanEqual: { + remainder -= 1; + break; + } + case SpvOp::SpvOpSLessThanEqual: + case SpvOp::SpvOpULessThanEqual: { + remainder += 1; + break; + } + + default: + break; + } + return remainder; +} + +// Extract the initial value from the |induction| OpPhi instruction and store it +// in |value|. If the function couldn't find the initial value of |induction| +// return false. +bool Loop::GetInductionInitValue(const ir::Instruction* induction, + int64_t* value) const { + ir::Instruction* constant_instruction = nullptr; + opt::analysis::DefUseManager* def_use_manager = context_->get_def_use_mgr(); + + for (uint32_t operand_id = 0; operand_id < induction->NumInOperands(); + operand_id += 2) { + ir::BasicBlock* bb = context_->cfg()->block( + induction->GetSingleWordInOperand(operand_id + 1)); + + if (!IsInsideLoop(bb)) { + constant_instruction = def_use_manager->GetDef( + induction->GetSingleWordInOperand(operand_id)); + } + } + + if (!constant_instruction) return false; + + const opt::analysis::Constant* constant = + context_->get_constant_mgr()->FindDeclaredConstant( + constant_instruction->result_id()); + if (!constant) return false; + + if (value) { + const opt::analysis::Integer* type = + constant->AsIntConstant()->type()->AsInteger(); + + if (type->IsSigned()) { + *value = constant->AsIntConstant()->GetS32BitValue(); + } else { + *value = constant->AsIntConstant()->GetU32BitValue(); + } + } + + return true; +} + Loop::Loop(IRContext* context, opt::DominatorAnalysis* dom_analysis, BasicBlock* header, BasicBlock* continue_target, BasicBlock* merge_target) - : loop_header_(header), + : context_(context), + loop_header_(header), loop_continue_(continue_target), loop_merge_(merge_target), loop_preheader_(nullptr), - parent_(nullptr) { + parent_(nullptr), + loop_is_marked_for_removal_(false) { assert(context); assert(dom_analysis); - loop_preheader_ = FindLoopPreheader(context, dom_analysis); - AddBasicBlockToLoop(header); - AddBasicBlockToLoop(continue_target); + loop_preheader_ = FindLoopPreheader(dom_analysis); } -BasicBlock* Loop::FindLoopPreheader(IRContext* ir_context, - opt::DominatorAnalysis* dom_analysis) { - CFG* cfg = ir_context->cfg(); +BasicBlock* Loop::FindLoopPreheader(opt::DominatorAnalysis* dom_analysis) { + CFG* cfg = context_->cfg(); opt::DominatorTree& dom_tree = dom_analysis->GetDomTree(); opt::DominatorTreeNode* header_node = dom_tree.GetTreeNode(loop_header_); @@ -85,120 +237,27 @@ } bool Loop::IsInsideLoop(Instruction* inst) const { - const BasicBlock* parent_block = inst->context()->get_instr_block(inst); + const BasicBlock* parent_block = context_->get_instr_block(inst); if (!parent_block) return false; return IsInsideLoop(parent_block); } bool Loop::IsBasicBlockInLoopSlow(const BasicBlock* bb) { assert(bb->GetParent() && "The basic block does not belong to a function"); - IRContext* context = bb->GetParent()->GetParent()->context(); - opt::DominatorAnalysis* dom_analysis = - context->GetDominatorAnalysis(bb->GetParent(), *context->cfg()); - if (!dom_analysis->Dominates(GetHeaderBlock(), bb)) return false; + context_->GetDominatorAnalysis(bb->GetParent(), *context_->cfg()); + if (dom_analysis->IsReachable(bb) && + !dom_analysis->Dominates(GetHeaderBlock(), bb)) + return false; - opt::PostDominatorAnalysis* postdom_analysis = - context->GetPostDominatorAnalysis(bb->GetParent(), *context->cfg()); - if (!postdom_analysis->Dominates(GetMergeBlock(), bb)) return false; return true; } -BasicBlock* Loop::GetOrCreatePreHeaderBlock(ir::IRContext* context) { +BasicBlock* Loop::GetOrCreatePreHeaderBlock() { if (loop_preheader_) return loop_preheader_; - Function* fn = loop_header_->GetParent(); - // Find the insertion point for the preheader. - Function::iterator header_it = - std::find_if(fn->begin(), fn->end(), - [this](BasicBlock& bb) { return &bb == loop_header_; }); - assert(header_it != fn->end()); - - // Create the preheader basic block. - loop_preheader_ = &*header_it.InsertBefore(std::unique_ptr( - new ir::BasicBlock(std::unique_ptr(new ir::Instruction( - context, SpvOpLabel, 0, context->TakeNextId(), {}))))); - loop_preheader_->SetParent(fn); - uint32_t loop_preheader_id = loop_preheader_->id(); - - // Redirect the branches and patch the phi: - // - For each phi instruction in the header: - // - If the header has only 1 out-of-loop incoming branch: - // - Change the incomning branch to be the preheader. - // - If the header has more than 1 out-of-loop incoming branch: - // - Create a new phi in the preheader, gathering all out-of-loops - // incoming values; - // - Patch the header phi instruction to use the preheader phi - // instruction; - // - Redirect all edges coming from outside the loop to the preheader. - opt::InstructionBuilder builder( - context, loop_preheader_, - ir::IRContext::kAnalysisDefUse | - ir::IRContext::kAnalysisInstrToBlockMapping); - // Patch all the phi instructions. - loop_header_->ForEachPhiInst([&builder, context, this](Instruction* phi) { - std::vector preheader_phi_ops; - std::vector header_phi_ops; - for (uint32_t i = 0; i < phi->NumInOperands(); i += 2) { - uint32_t def_id = phi->GetSingleWordInOperand(i); - uint32_t branch_id = phi->GetSingleWordInOperand(i + 1); - if (IsInsideLoop(branch_id)) { - header_phi_ops.push_back(def_id); - header_phi_ops.push_back(branch_id); - } else { - preheader_phi_ops.push_back(def_id); - preheader_phi_ops.push_back(branch_id); - } - } - - Instruction* preheader_insn_def = nullptr; - // Create a phi instruction if and only if the preheader_phi_ops has more - // than one pair. - if (preheader_phi_ops.size() > 2) - preheader_insn_def = builder.AddPhi(phi->type_id(), preheader_phi_ops); - else - preheader_insn_def = - context->get_def_use_mgr()->GetDef(preheader_phi_ops[0]); - // Build the new incoming edge. - header_phi_ops.push_back(preheader_insn_def->result_id()); - header_phi_ops.push_back(loop_preheader_->id()); - // Rewrite operands of the header's phi instruction. - uint32_t idx = 0; - for (; idx < header_phi_ops.size(); idx++) - phi->SetInOperand(idx, {header_phi_ops[idx]}); - // Remove extra operands, from last to first (more efficient). - for (uint32_t j = phi->NumInOperands() - 1; j >= idx; j--) - phi->RemoveInOperand(j); - }); - // Branch from the preheader to the header. - builder.AddBranch(loop_header_->id()); - - // Redirect all out of loop branches to the header to the preheader. - CFG* cfg = context->cfg(); - cfg->RegisterBlock(loop_preheader_); - for (uint32_t pred_id : cfg->preds(loop_header_->id())) { - if (pred_id == loop_preheader_->id()) continue; - if (IsInsideLoop(pred_id)) continue; - BasicBlock* pred = cfg->block(pred_id); - pred->ForEachSuccessorLabel([this, loop_preheader_id](uint32_t* id) { - if (*id == loop_header_->id()) *id = loop_preheader_id; - }); - cfg->AddEdge(pred_id, loop_preheader_id); - } - // Delete predecessors that are no longer predecessors of the loop header. - cfg->RemoveNonExistingEdges(loop_header_->id()); - // Update the loop descriptors. - if (HasParent()) { - GetParent()->AddBasicBlock(loop_preheader_); - context->GetLoopDescriptor(fn)->SetBasicBlockToLoop(loop_preheader_->id(), - GetParent()); - } - - context->InvalidateAnalysesExceptFor( - builder.GetPreservedAnalysis() | - ir::IRContext::Analysis::kAnalysisLoopAnalysis | - ir::IRContext::kAnalysisCFG); - + CFG* cfg = context_->cfg(); + loop_header_ = cfg->SplitLoopHeader(loop_header_); return loop_preheader_; } @@ -220,12 +279,6 @@ void Loop::SetMergeBlock(BasicBlock* merge) { #ifndef NDEBUG assert(merge->GetParent() && "The basic block does not belong to a function"); - CFG& cfg = *merge->GetParent()->GetParent()->context()->cfg(); - - for (uint32_t pred : cfg.preds(merge->id())) { - assert(IsInsideLoop(pred) && - "A predecessor of the merge block does not belong to the loop"); - } #endif // NDEBUG assert(!IsInsideLoop(merge) && "The merge block is in the loop"); @@ -235,9 +288,23 @@ } } -void Loop::GetExitBlocks(IRContext* context, - std::unordered_set* exit_blocks) const { - ir::CFG* cfg = context->cfg(); +void Loop::SetPreHeaderBlock(BasicBlock* preheader) { + if (preheader) { + assert(!IsInsideLoop(preheader) && "The preheader block is in the loop"); + assert(preheader->tail()->opcode() == SpvOpBranch && + "The preheader block does not unconditionally branch to the header " + "block"); + assert(preheader->tail()->GetSingleWordOperand(0) == + GetHeaderBlock()->id() && + "The preheader block does not unconditionally branch to the header " + "block"); + } + loop_preheader_ = preheader; +} + +void Loop::GetExitBlocks(std::unordered_set* exit_blocks) const { + ir::CFG* cfg = context_->cfg(); + exit_blocks->clear(); for (uint32_t bb_id : GetBlocks()) { const spvtools::ir::BasicBlock* bb = cfg->block(bb_id); @@ -250,9 +317,10 @@ } void Loop::GetMergingBlocks( - IRContext* context, std::unordered_set* merging_blocks) const { + std::unordered_set* merging_blocks) const { assert(GetMergeBlock() && "This loop is not structured"); - ir::CFG* cfg = context->cfg(); + ir::CFG* cfg = context_->cfg(); + merging_blocks->clear(); std::stack to_visit; to_visit.push(GetMergeBlock()); @@ -268,13 +336,52 @@ } } +namespace { + +static inline bool IsBasicBlockSafeToClone(IRContext* context, BasicBlock* bb) { + for (ir::Instruction& inst : *bb) { + if (!inst.IsBranch() && !context->IsCombinatorInstruction(&inst)) + return false; + } + + return true; +} + +} // namespace + +bool Loop::IsSafeToClone() const { + ir::CFG& cfg = *context_->cfg(); + + for (uint32_t bb_id : GetBlocks()) { + BasicBlock* bb = cfg.block(bb_id); + assert(bb); + if (!IsBasicBlockSafeToClone(context_, bb)) return false; + } + + // Look at the merge construct. + if (GetHeaderBlock()->GetLoopMergeInst()) { + std::unordered_set blocks; + GetMergingBlocks(&blocks); + blocks.erase(GetMergeBlock()->id()); + for (uint32_t bb_id : blocks) { + BasicBlock* bb = cfg.block(bb_id); + assert(bb); + if (!IsBasicBlockSafeToClone(context_, bb)) return false; + } + } + + return true; +} + bool Loop::IsLCSSA() const { - IRContext* context = GetHeaderBlock()->GetParent()->GetParent()->context(); - ir::CFG* cfg = context->cfg(); - opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); + ir::CFG* cfg = context_->cfg(); + opt::analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); std::unordered_set exit_blocks; - GetExitBlocks(context, &exit_blocks); + GetExitBlocks(&exit_blocks); + + // Declare ir_context so we can capture context_ in the below lambda + ir::IRContext* ir_context = context_; for (uint32_t bb_id : GetBlocks()) { for (Instruction& insn : *cfg->block(bb_id)) { @@ -283,8 +390,8 @@ // - In an exit block and in a phi instruction. if (!def_use_mgr->WhileEachUser( &insn, - [&exit_blocks, context, this](ir::Instruction* use) -> bool { - BasicBlock* parent = context->get_instr_block(use); + [&exit_blocks, ir_context, this](ir::Instruction* use) -> bool { + BasicBlock* parent = ir_context->get_instr_block(use); assert(parent && "Invalid analysis"); if (IsInsideLoop(parent)) return true; if (use->opcode() != SpvOpPhi) return false; @@ -296,7 +403,48 @@ return true; } -LoopDescriptor::LoopDescriptor(const Function* f) : loops_() { +bool Loop::ShouldHoistInstruction(IRContext* context, Instruction* inst) { + return AreAllOperandsOutsideLoop(context, inst) && + inst->IsOpcodeCodeMotionSafe(); +} + +bool Loop::AreAllOperandsOutsideLoop(IRContext* context, Instruction* inst) { + opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); + bool all_outside_loop = true; + + const std::function operand_outside_loop = + [this, &def_use_mgr, &all_outside_loop](uint32_t* id) { + if (this->IsInsideLoop(def_use_mgr->GetDef(*id))) { + all_outside_loop = false; + return; + } + }; + + inst->ForEachInId(operand_outside_loop); + return all_outside_loop; +} + +void Loop::ComputeLoopStructuredOrder( + std::vector* ordered_loop_blocks, bool include_pre_header, + bool include_merge) const { + ir::CFG& cfg = *context_->cfg(); + + // Reserve the memory: all blocks in the loop + extra if needed. + ordered_loop_blocks->reserve(GetBlocks().size() + include_pre_header + + include_merge); + + if (include_pre_header && GetPreHeaderBlock()) + ordered_loop_blocks->push_back(loop_preheader_); + cfg.ForEachBlockInReversePostOrder( + loop_header_, [ordered_loop_blocks, this](BasicBlock* bb) { + if (IsInsideLoop(bb)) ordered_loop_blocks->push_back(bb); + }); + if (include_merge && GetMergeBlock()) + ordered_loop_blocks->push_back(loop_merge_); +} + +LoopDescriptor::LoopDescriptor(const Function* f) + : loops_(), dummy_top_loop_(nullptr) { PopulateList(f); } @@ -317,6 +465,17 @@ ir::make_range(dom_tree.post_begin(), dom_tree.post_end())) { Instruction* merge_inst = node.bb_->GetLoopMergeInst(); if (merge_inst) { + bool all_backedge_unreachable = true; + for (uint32_t pid : context->cfg()->preds(node.bb_->id())) { + if (dom_analysis->IsReachable(pid) && + dom_analysis->Dominates(node.bb_->id(), pid)) { + all_backedge_unreachable = false; + break; + } + } + if (all_backedge_unreachable) + continue; // ignore this one, we actually never branch back. + // The id of the merge basic block of this loop. uint32_t merge_bb_id = merge_inst->GetSingleWordOperand(0); @@ -362,7 +521,7 @@ make_range(node.df_begin(), node.df_end())) { // Check if we are in the loop. if (dom_tree.Dominates(dom_merge_node, &loop_node)) continue; - current_loop->AddBasicBlockToLoop(loop_node.bb_); + current_loop->AddBasicBlock(loop_node.bb_); basic_block_to_loop_.insert( std::make_pair(loop_node.bb_->id(), current_loop)); } @@ -373,6 +532,329 @@ } } +ir::BasicBlock* Loop::FindConditionBlock() const { + const ir::Function& function = *loop_merge_->GetParent(); + ir::BasicBlock* condition_block = nullptr; + + const opt::DominatorAnalysis* dom_analysis = + context_->GetDominatorAnalysis(&function, *context_->cfg()); + ir::BasicBlock* bb = dom_analysis->ImmediateDominator(loop_merge_); + + if (!bb) return nullptr; + + const ir::Instruction& branch = *bb->ctail(); + + // Make sure the branch is a conditional branch. + if (branch.opcode() != SpvOpBranchConditional) return nullptr; + + // Make sure one of the two possible branches is to the merge block. + if (branch.GetSingleWordInOperand(1) == loop_merge_->id() || + branch.GetSingleWordInOperand(2) == loop_merge_->id()) { + condition_block = bb; + } + + return condition_block; +} + +bool Loop::FindNumberOfIterations(const ir::Instruction* induction, + const ir::Instruction* branch_inst, + size_t* iterations_out, + int64_t* step_value_out, + int64_t* init_value_out) const { + // From the branch instruction find the branch condition. + opt::analysis::DefUseManager* def_use_manager = context_->get_def_use_mgr(); + + // Condition instruction from the OpConditionalBranch. + ir::Instruction* condition = + def_use_manager->GetDef(branch_inst->GetSingleWordOperand(0)); + + assert(IsSupportedCondition(condition->opcode())); + + // Get the constant manager from the ir context. + opt::analysis::ConstantManager* const_manager = context_->get_constant_mgr(); + + // Find the constant value used by the condition variable. Exit out if it + // isn't a constant int. + const opt::analysis::Constant* upper_bound = + const_manager->FindDeclaredConstant(condition->GetSingleWordOperand(3)); + if (!upper_bound) return false; + + // Must be integer because of the opcode on the condition. + int64_t condition_value = 0; + + const opt::analysis::Integer* type = + upper_bound->AsIntConstant()->type()->AsInteger(); + + if (type->IsSigned()) { + condition_value = upper_bound->AsIntConstant()->GetS32BitValue(); + } else { + condition_value = upper_bound->AsIntConstant()->GetU32BitValue(); + } + + // Find the instruction which is stepping through the loop. + ir::Instruction* step_inst = GetInductionStepOperation(induction); + if (!step_inst) return false; + + // Find the constant value used by the condition variable. + const opt::analysis::Constant* step_constant = + const_manager->FindDeclaredConstant(step_inst->GetSingleWordOperand(3)); + if (!step_constant) return false; + + // Must be integer because of the opcode on the condition. + int64_t step_value = 0; + + const opt::analysis::Integer* step_type = + step_constant->AsIntConstant()->type()->AsInteger(); + + if (step_type->IsSigned()) { + step_value = step_constant->AsIntConstant()->GetS32BitValue(); + } else { + step_value = step_constant->AsIntConstant()->GetU32BitValue(); + } + + // If this is a subtraction step we should negate the step value. + if (step_inst->opcode() == SpvOp::SpvOpISub) { + step_value = -step_value; + } + + // Find the inital value of the loop and make sure it is a constant integer. + int64_t init_value = 0; + if (!GetInductionInitValue(induction, &init_value)) return false; + + // If iterations is non null then store the value in that. + int64_t num_itrs = GetIterations(condition->opcode(), condition_value, + init_value, step_value); + + // If the loop body will not be reached return false. + if (num_itrs <= 0) { + return false; + } + + if (iterations_out) { + assert(static_cast(num_itrs) <= std::numeric_limits::max()); + *iterations_out = static_cast(num_itrs); + } + + if (step_value_out) { + *step_value_out = step_value; + } + + if (init_value_out) { + *init_value_out = init_value; + } + + return true; +} + +// We retrieve the number of iterations using the following formula, diff / +// |step_value| where diff is calculated differently according to the +// |condition| and uses the |condition_value| and |init_value|. If diff / +// |step_value| is NOT cleanly divisable then we add one to the sum. +int64_t Loop::GetIterations(SpvOp condition, int64_t condition_value, + int64_t init_value, int64_t step_value) const { + int64_t diff = 0; + + switch (condition) { + case SpvOp::SpvOpSLessThan: + case SpvOp::SpvOpULessThan: { + // If the condition is not met to begin with the loop will never iterate. + if (!(init_value < condition_value)) return 0; + + diff = condition_value - init_value; + + // If the operation is a less then operation then the diff and step must + // have the same sign otherwise the induction will never cross the + // condition (either never true or always true). + if ((diff < 0 && step_value > 0) || (diff > 0 && step_value < 0)) { + return 0; + } + + break; + } + case SpvOp::SpvOpSGreaterThan: + case SpvOp::SpvOpUGreaterThan: { + // If the condition is not met to begin with the loop will never iterate. + if (!(init_value > condition_value)) return 0; + + diff = init_value - condition_value; + + // If the operation is a greater than operation then the diff and step + // must have opposite signs. Otherwise the condition will always be true + // or will never be true. + if ((diff < 0 && step_value < 0) || (diff > 0 && step_value > 0)) { + return 0; + } + + break; + } + + case SpvOp::SpvOpSGreaterThanEqual: + case SpvOp::SpvOpUGreaterThanEqual: { + // If the condition is not met to begin with the loop will never iterate. + if (!(init_value >= condition_value)) return 0; + + // We subract one to make it the same as SpvOpGreaterThan as it is + // functionally equivalent. + diff = init_value - (condition_value - 1); + + // If the operation is a greater than operation then the diff and step + // must have opposite signs. Otherwise the condition will always be true + // or will never be true. + if ((diff > 0 && step_value > 0) || (diff < 0 && step_value < 0)) { + return 0; + } + + break; + } + + case SpvOp::SpvOpSLessThanEqual: + case SpvOp::SpvOpULessThanEqual: { + // If the condition is not met to begin with the loop will never iterate. + if (!(init_value <= condition_value)) return 0; + + // We add one to make it the same as SpvOpLessThan as it is functionally + // equivalent. + diff = (condition_value + 1) - init_value; + + // If the operation is a less than operation then the diff and step must + // have the same sign otherwise the induction will never cross the + // condition (either never true or always true). + if ((diff < 0 && step_value > 0) || (diff > 0 && step_value < 0)) { + return 0; + } + + break; + } + + default: + assert(false && + "Could not retrieve number of iterations from the loop condition. " + "Condition is not supported."); + } + + // Take the abs of - step values. + step_value = llabs(step_value); + diff = llabs(diff); + int64_t result = diff / step_value; + + if (diff % step_value != 0) { + result += 1; + } + return result; +} + +// Returns the list of induction variables within the loop. +void Loop::GetInductionVariables( + std::vector& induction_variables) const { + for (ir::Instruction& inst : *loop_header_) { + if (inst.opcode() == SpvOp::SpvOpPhi) { + induction_variables.push_back(&inst); + } + } +} + +ir::Instruction* Loop::FindConditionVariable( + const ir::BasicBlock* condition_block) const { + // Find the branch instruction. + const ir::Instruction& branch_inst = *condition_block->ctail(); + + ir::Instruction* induction = nullptr; + // Verify that the branch instruction is a conditional branch. + if (branch_inst.opcode() == SpvOp::SpvOpBranchConditional) { + // From the branch instruction find the branch condition. + opt::analysis::DefUseManager* def_use_manager = context_->get_def_use_mgr(); + + // Find the instruction representing the condition used in the conditional + // branch. + ir::Instruction* condition = + def_use_manager->GetDef(branch_inst.GetSingleWordOperand(0)); + + // Ensure that the condition is a less than operation. + if (condition && IsSupportedCondition(condition->opcode())) { + // The left hand side operand of the operation. + ir::Instruction* variable_inst = + def_use_manager->GetDef(condition->GetSingleWordOperand(2)); + + // Make sure the variable instruction used is a phi. + if (!variable_inst || variable_inst->opcode() != SpvOpPhi) return nullptr; + + // Make sure the phi instruction only has two incoming blocks. Each + // incoming block will be represented by two in operands in the phi + // instruction, the value and the block which that value came from. We + // assume the cannocalised phi will have two incoming values, one from the + // preheader and one from the continue block. + size_t max_supported_operands = 4; + if (variable_inst->NumInOperands() == max_supported_operands) { + // The operand index of the first incoming block label. + uint32_t operand_label_1 = 1; + + // The operand index of the second incoming block label. + uint32_t operand_label_2 = 3; + + // Make sure one of them is the preheader. + if (variable_inst->GetSingleWordInOperand(operand_label_1) != + loop_preheader_->id() && + variable_inst->GetSingleWordInOperand(operand_label_2) != + loop_preheader_->id()) { + return nullptr; + } + + // And make sure that the other is the latch block. + if (variable_inst->GetSingleWordInOperand(operand_label_1) != + loop_continue_->id() && + variable_inst->GetSingleWordInOperand(operand_label_2) != + loop_continue_->id()) { + return nullptr; + } + } else { + return nullptr; + } + + if (!FindNumberOfIterations(variable_inst, &branch_inst, nullptr)) + return nullptr; + induction = variable_inst; + } + } + + return induction; +} + +// Add and remove loops which have been marked for addition and removal to +// maintain the state of the loop descriptor class. +void LoopDescriptor::PostModificationCleanup() { + LoopContainerType loops_to_remove_; + for (ir::Loop* loop : loops_) { + if (loop->IsMarkedForRemoval()) { + loops_to_remove_.push_back(loop); + if (loop->HasParent()) { + loop->GetParent()->RemoveChildLoop(loop); + } + } + } + + for (ir::Loop* loop : loops_to_remove_) { + loops_.erase(std::find(loops_.begin(), loops_.end(), loop)); + } + + for (auto& pair : loops_to_add_) { + ir::Loop* parent = pair.first; + ir::Loop* loop = pair.second; + + if (parent) { + loop->SetParent(nullptr); + parent->AddNestedLoop(loop); + + for (uint32_t block_id : loop->GetBlocks()) { + parent->AddBasicBlock(block_id); + } + } + + loops_.emplace_back(loop); + } + + loops_to_add_.clear(); +} + void LoopDescriptor::ClearLoops() { for (Loop* loop : loops_) { delete loop; @@ -380,5 +862,47 @@ loops_.clear(); } +// Adds a new loop nest to the descriptor set. +ir::Loop* LoopDescriptor::AddLoopNest(std::unique_ptr new_loop) { + ir::Loop* loop = new_loop.release(); + if (!loop->HasParent()) dummy_top_loop_.nested_loops_.push_back(loop); + // Iterate from inner to outer most loop, adding basic block to loop mapping + // as we go. + for (ir::Loop& current_loop : + make_range(iterator::begin(loop), iterator::end(nullptr))) { + loops_.push_back(¤t_loop); + for (uint32_t bb_id : current_loop.GetBlocks()) + basic_block_to_loop_.insert(std::make_pair(bb_id, ¤t_loop)); + } + + return loop; +} + +void LoopDescriptor::RemoveLoop(ir::Loop* loop) { + ir::Loop* parent = loop->GetParent() ? loop->GetParent() : &dummy_top_loop_; + parent->nested_loops_.erase(std::find(parent->nested_loops_.begin(), + parent->nested_loops_.end(), loop)); + std::for_each( + loop->nested_loops_.begin(), loop->nested_loops_.end(), + [loop](ir::Loop* sub_loop) { sub_loop->SetParent(loop->GetParent()); }); + parent->nested_loops_.insert(parent->nested_loops_.end(), + loop->nested_loops_.begin(), + loop->nested_loops_.end()); + for (uint32_t bb_id : loop->GetBlocks()) { + ir::Loop* l = FindLoopForBasicBlock(bb_id); + if (l == loop) { + SetBasicBlockToLoop(bb_id, l->GetParent()); + } else { + ForgetBasicBlock(bb_id); + } + } + + LoopContainerType::iterator it = + std::find(loops_.begin(), loops_.end(), loop); + assert(it != loops_.end()); + delete loop; + loops_.erase(it); +} + } // namespace ir } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_descriptor.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_descriptor.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_descriptor.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_descriptor.h 2018-04-27 11:46:32.000000000 +0000 @@ -24,6 +24,7 @@ #include #include "opt/basic_block.h" +#include "opt/module.h" #include "opt/tree_iterator.h" namespace spvtools { @@ -46,16 +47,20 @@ using const_iterator = ChildrenList::const_iterator; using BasicBlockListTy = std::unordered_set; - Loop() - : loop_header_(nullptr), + explicit Loop(IRContext* context) + : context_(context), + loop_header_(nullptr), loop_continue_(nullptr), loop_merge_(nullptr), loop_preheader_(nullptr), - parent_(nullptr) {} + parent_(nullptr), + loop_is_marked_for_removal_(false) {} Loop(IRContext* context, opt::DominatorAnalysis* analysis, BasicBlock* header, BasicBlock* continue_target, BasicBlock* merge_target); + ~Loop() {} + // Iterators over the immediate sub-loops. inline iterator begin() { return nested_loops_.begin(); } inline iterator end() { return nested_loops_.end(); } @@ -112,25 +117,28 @@ // Returns the loop pre-header. inline const BasicBlock* GetPreHeaderBlock() const { return loop_preheader_; } + // Sets |preheader| as the loop preheader block. A preheader block must have + // the following properties: + // - |merge| must not be in the loop; + // - have an unconditional branch to the loop header. + void SetPreHeaderBlock(BasicBlock* preheader); // Returns the loop pre-header, if there is no suitable preheader it will be // created. - BasicBlock* GetOrCreatePreHeaderBlock(ir::IRContext* context); + BasicBlock* GetOrCreatePreHeaderBlock(); // Returns true if this loop contains any nested loops. inline bool HasNestedLoops() const { return nested_loops_.size() != 0; } - // Fills |exit_blocks| with all basic blocks that are not in the loop and has - // at least one predecessor in the loop. - void GetExitBlocks(IRContext* context, - std::unordered_set* exit_blocks) const; + // Clears and fills |exit_blocks| with all basic blocks that are not in the + // loop and has at least one predecessor in the loop. + void GetExitBlocks(std::unordered_set* exit_blocks) const; - // Fills |merging_blocks| with all basic blocks that are post-dominated by the - // merge block. The merge block must exist. + // Clears and fills |merging_blocks| with all basic blocks that are + // post-dominated by the merge block. The merge block must exist. // The set |merging_blocks| will only contain the merge block if it is // unreachable. - void GetMergingBlocks(IRContext* context, - std::unordered_set* merging_blocks) const; + void GetMergingBlocks(std::unordered_set* merging_blocks) const; // Returns true if the loop is in a Loop Closed SSA form. // In LCSSA form, all in-loop definitions are used in the loop or in phi @@ -145,6 +153,8 @@ return lvl; } + inline size_t NumImmediateChildren() const { return nested_loops_.size(); } + // Adds |nested| as a nested loop of this loop. Automatically register |this| // as the parent of |nested|. inline void AddNestedLoop(Loop* nested) { @@ -181,6 +191,30 @@ // Returns true if the instruction |inst| is inside this loop. bool IsInsideLoop(Instruction* inst) const; + // Adds the Basic Block |bb| to this loop and its parents. + void AddBasicBlock(const BasicBlock* bb) { AddBasicBlock(bb->id()); } + + // Adds the Basic Block with |id| to this loop and its parents. + void AddBasicBlock(uint32_t id) { + for (Loop* loop = this; loop != nullptr; loop = loop->parent_) { + loop->loop_basic_blocks_.insert(id); + } + } + + // Removes the Basic Block id |bb_id| from this loop and its parents. + // It the user responsibility to make sure the removed block is not a merge, + // header or continue block. + void RemoveBasicBlock(uint32_t bb_id) { + for (Loop* loop = this; loop != nullptr; loop = loop->parent_) { + loop->loop_basic_blocks_.erase(bb_id); + } + } + + // Removes all the basic blocks from the set of basic blocks within the loop. + // This does not affect any of the stored pointers to the header, preheader, + // merge, or continue blocks. + void ClearBlocks() { loop_basic_blocks_.clear(); } + // Adds the Basic Block |bb| this loop and its parents. void AddBasicBlockToLoop(const BasicBlock* bb) { assert(IsBasicBlockInLoopSlow(bb) && @@ -189,18 +223,119 @@ AddBasicBlock(bb); } - // Adds the Basic Block |bb| this loop and its parents. - void AddBasicBlock(const BasicBlock* bb) { - for (Loop* loop = this; loop != nullptr; loop = loop->parent_) { - loop_basic_blocks_.insert(bb->id()); + // Returns the list of induction variables within the loop. + void GetInductionVariables(std::vector& inductions) const; + + // This function uses the |condition| to find the induction variable which is + // used by the loop condition within the loop. This only works if the loop is + // bound by a single condition and single induction variable. + ir::Instruction* FindConditionVariable(const ir::BasicBlock* condition) const; + + // Returns the number of iterations within a loop when given the |induction| + // variable and the loop |condition| check. It stores the found number of + // iterations in the output parameter |iterations| and optionally, the step + // value in |step_value| and the initial value of the induction variable in + // |init_value|. + bool FindNumberOfIterations(const ir::Instruction* induction, + const ir::Instruction* condition, + size_t* iterations, + int64_t* step_amount = nullptr, + int64_t* init_value = nullptr) const; + + // Returns the value of the OpLoopMerge control operand as a bool. Loop + // control can be None(0), Unroll(1), or DontUnroll(2). This function returns + // true if it is set to Unroll. + inline bool HasUnrollLoopControl() const { + assert(loop_header_); + if (!loop_header_->GetLoopMergeInst()) return false; + + return loop_header_->GetLoopMergeInst()->GetSingleWordOperand(2) == 1; + } + + // Finds the conditional block with a branch to the merge and continue blocks + // within the loop body. + ir::BasicBlock* FindConditionBlock() const; + + // Remove the child loop form this loop. + inline void RemoveChildLoop(Loop* loop) { + nested_loops_.erase( + std::find(nested_loops_.begin(), nested_loops_.end(), loop)); + loop->SetParent(nullptr); + } + + // Mark this loop to be removed later by a call to + // LoopDescriptor::PostModificationCleanup. + inline void MarkLoopForRemoval() { loop_is_marked_for_removal_ = true; } + + // Returns whether or not this loop has been marked for removal. + inline bool IsMarkedForRemoval() const { return loop_is_marked_for_removal_; } + + // Returns true if all nested loops have been marked for removal. + inline bool AreAllChildrenMarkedForRemoval() const { + for (const Loop* child : nested_loops_) { + if (!child->IsMarkedForRemoval()) { + return false; + } } + return true; } + // Checks if the loop contains any instruction that will prevent it from being + // cloned. If the loop is structured, the merge construct is also considered. + bool IsSafeToClone() const; + // Sets the parent loop of this loop, that is, a loop which contains this loop // as a nested child loop. inline void SetParent(Loop* parent) { parent_ = parent; } + // Returns true is the instruction is invariant and safe to move wrt loop + bool ShouldHoistInstruction(IRContext* context, Instruction* inst); + + // Returns true if all operands of inst are in basic blocks not contained in + // loop + bool AreAllOperandsOutsideLoop(IRContext* context, Instruction* inst); + + // Extract the initial value from the |induction| variable and store it in + // |value|. If the function couldn't find the initial value of |induction| + // return false. + bool GetInductionInitValue(const ir::Instruction* induction, + int64_t* value) const; + + // Takes in a phi instruction |induction| and the loop |header| and returns + // the step operation of the loop. + ir::Instruction* GetInductionStepOperation( + const ir::Instruction* induction) const; + + // Returns true if we can deduce the number of loop iterations in the step + // operation |step|. IsSupportedCondition must also be true for the condition + // instruction. + bool IsSupportedStepOp(SpvOp step) const; + + // Returns true if we can deduce the number of loop iterations in the + // condition operation |condition|. IsSupportedStepOp must also be true for + // the step instruction. + bool IsSupportedCondition(SpvOp condition) const; + + // Creates the list of the loop's basic block in structured order and store + // the result in |ordered_loop_blocks|. If |include_pre_header| is true, the + // pre-header block will also be included at the beginning of the list if it + // exist. If |include_merge| is true, the merge block will also be included at + // the end of the list if it exist. + void ComputeLoopStructuredOrder( + std::vector* ordered_loop_blocks, + bool include_pre_header = false, bool include_merge = false) const; + + // Given the loop |condition|, |initial_value|, |step_value|, the trip count + // |number_of_iterations|, and the |unroll_factor| requested, get the new + // condition value for the residual loop. + static int64_t GetResidualConditionValue(SpvOp condition, + int64_t initial_value, + int64_t step_value, + size_t number_of_iterations, + size_t unroll_factor); + private: + IRContext* context_; // The block which marks the start of the loop. BasicBlock* loop_header_; @@ -229,8 +364,7 @@ bool IsBasicBlockInLoopSlow(const BasicBlock* bb); // Returns the loop preheader if it exists, returns nullptr otherwise. - BasicBlock* FindLoopPreheader(IRContext* context, - opt::DominatorAnalysis* dom_analysis); + BasicBlock* FindLoopPreheader(opt::DominatorAnalysis* dom_analysis); // Sets |latch| as the loop unique continue block. No checks are performed // here. @@ -238,6 +372,17 @@ // Sets |merge| as the loop merge block. No checks are performed here. inline void SetMergeBlockImpl(BasicBlock* merge) { loop_merge_ = merge; } + // Each differnt loop |condition| affects how we calculate the number of + // iterations using the |condition_value|, |init_value|, and |step_values| of + // the induction variable. This method will return the number of iterations in + // a loop with those values for a given |condition|. + int64_t GetIterations(SpvOp condition, int64_t condition_value, + int64_t init_value, int64_t step_value) const; + + // This is to allow for loops to be removed mid iteration without invalidating + // the iterators. + bool loop_is_marked_for_removal_; + // This is only to allow LoopDescriptor::dummy_top_loop_ to add top level // loops as child. friend class LoopDescriptor; @@ -259,13 +404,14 @@ // Disable copy constructor, to avoid double-free on destruction. LoopDescriptor(const LoopDescriptor&) = delete; // Move constructor. - LoopDescriptor(LoopDescriptor&& other) { + LoopDescriptor(LoopDescriptor&& other) : dummy_top_loop_(nullptr) { // We need to take ownership of the Loop objects in the other // LoopDescriptor, to avoid double-free. loops_ = std::move(other.loops_); other.loops_.clear(); basic_block_to_loop_ = std::move(other.basic_block_to_loop_); other.basic_block_to_loop_.clear(); + dummy_top_loop_ = std::move(other.dummy_top_loop_); } // Destructor @@ -310,10 +456,43 @@ basic_block_to_loop_[bb_id] = loop; } + // Mark the loop |loop_to_add| as needing to be added when the user calls + // PostModificationCleanup. |parent| may be null. + inline void AddLoop(ir::Loop* loop_to_add, ir::Loop* parent) { + loops_to_add_.emplace_back(std::make_pair(parent, loop_to_add)); + } + + // Should be called to preserve the LoopAnalysis after loops have been marked + // for addition with AddLoop or MarkLoopForRemoval. + void PostModificationCleanup(); + + // Removes the basic block id |bb_id| from the block to loop mapping. + inline void ForgetBasicBlock(uint32_t bb_id) { + basic_block_to_loop_.erase(bb_id); + } + + // Adds the loop |new_loop| and all its nested loops to the descriptor set. + // The object takes ownership of all the loops. + ir::Loop* AddLoopNest(std::unique_ptr new_loop); + + // Remove the loop |loop|. + void RemoveLoop(ir::Loop* loop); + + void SetAsTopLoop(ir::Loop* loop) { + assert(std::find(dummy_top_loop_.begin(), dummy_top_loop_.end(), loop) == + dummy_top_loop_.end() && + "already registered"); + dummy_top_loop_.nested_loops_.push_back(loop); + } + + Loop* GetDummyRootLoop() { return &dummy_top_loop_; } + const Loop* GetDummyRootLoop() const { return &dummy_top_loop_; } + private: // TODO(dneto): This should be a vector of unique_ptr. But VisualStudio 2013 // is unable to compile it. using LoopContainerType = std::vector; + using LoopsToAddContainerType = std::vector>; // Creates loop descriptors for the function |f|. void PopulateList(const Function* f); @@ -331,9 +510,15 @@ // A list of all the loops in the function. This variable owns the Loop // objects. LoopContainerType loops_; + // Dummy root: this "loop" is only there to help iterators creation. Loop dummy_top_loop_; + std::unordered_map basic_block_to_loop_; + + // List of the loops marked for addition when PostModificationCleanup is + // called. + LoopsToAddContainerType loops_to_add_; }; } // namespace ir diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_peeling.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_peeling.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_peeling.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_peeling.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,563 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include +#include +#include +#include +#include + +#include "ir_builder.h" +#include "ir_context.h" +#include "loop_descriptor.h" +#include "loop_peeling.h" +#include "loop_utils.h" + +namespace spvtools { +namespace opt { + +void LoopPeeling::DuplicateAndConnectLoop( + LoopUtils::LoopCloningResult* clone_results) { + ir::CFG& cfg = *context_->cfg(); + analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + + assert(CanPeelLoop() && "Cannot peel loop!"); + + std::vector ordered_loop_blocks; + ir::BasicBlock* pre_header = loop_->GetOrCreatePreHeaderBlock(); + + loop_->ComputeLoopStructuredOrder(&ordered_loop_blocks); + + cloned_loop_ = loop_utils_.CloneLoop(clone_results, ordered_loop_blocks); + + // Add the basic block to the function. + ir::Function::iterator it = + loop_utils_.GetFunction()->FindBlock(pre_header->id()); + assert(it != loop_utils_.GetFunction()->end() && + "Pre-header not found in the function."); + loop_utils_.GetFunction()->AddBasicBlocks( + clone_results->cloned_bb_.begin(), clone_results->cloned_bb_.end(), ++it); + + // Make the |loop_|'s preheader the |cloned_loop_| one. + ir::BasicBlock* cloned_header = cloned_loop_->GetHeaderBlock(); + pre_header->ForEachSuccessorLabel( + [cloned_header](uint32_t* succ) { *succ = cloned_header->id(); }); + + // Update cfg. + cfg.RemoveEdge(pre_header->id(), loop_->GetHeaderBlock()->id()); + cloned_loop_->SetPreHeaderBlock(pre_header); + loop_->SetPreHeaderBlock(nullptr); + + // When cloning the loop, we didn't cloned the merge block, so currently + // |cloned_loop_| shares the same block as |loop_|. + // We mutate all branches from |cloned_loop_| block to |loop_|'s merge into a + // branch to |loop_|'s header (so header will also be the merge of + // |cloned_loop_|). + uint32_t cloned_loop_exit = 0; + for (uint32_t pred_id : cfg.preds(loop_->GetMergeBlock()->id())) { + if (loop_->IsInsideLoop(pred_id)) continue; + ir::BasicBlock* bb = cfg.block(pred_id); + assert(cloned_loop_exit == 0 && "The loop has multiple exits."); + cloned_loop_exit = bb->id(); + bb->ForEachSuccessorLabel([this](uint32_t* succ) { + if (*succ == loop_->GetMergeBlock()->id()) + *succ = loop_->GetHeaderBlock()->id(); + }); + } + + // Update cfg. + cfg.RemoveNonExistingEdges(loop_->GetMergeBlock()->id()); + cfg.AddEdge(cloned_loop_exit, loop_->GetHeaderBlock()->id()); + + // Patch the phi of the original loop header: + // - Set the loop entry branch to come from the cloned loop exit block; + // - Set the initial value of the phi using the corresponding cloned loop + // exit values. + // + // We patch the iterating value initializers of the original loop using the + // corresponding cloned loop exit values. Connects the cloned loop iterating + // values to the original loop. This make sure that the initial value of the + // second loop starts with the last value of the first loop. + // + // For example, loops like: + // + // int z = 0; + // for (int i = 0; i++ < M; i += cst1) { + // if (cond) + // z += cst2; + // } + // + // Will become: + // + // int z = 0; + // int i = 0; + // for (; i++ < M; i += cst1) { + // if (cond) + // z += cst2; + // } + // for (; i++ < M; i += cst1) { + // if (cond) + // z += cst2; + // } + loop_->GetHeaderBlock()->ForEachPhiInst([cloned_loop_exit, def_use_mgr, + clone_results, + this](ir::Instruction* phi) { + for (uint32_t i = 0; i < phi->NumInOperands(); i += 2) { + if (!loop_->IsInsideLoop(phi->GetSingleWordInOperand(i + 1))) { + phi->SetInOperand(i, + {clone_results->value_map_.at( + exit_value_.at(phi->result_id())->result_id())}); + phi->SetInOperand(i + 1, {cloned_loop_exit}); + def_use_mgr->AnalyzeInstUse(phi); + return; + } + } + }); + + // Force the creation of a new preheader for the original loop and set it as + // the merge block for the cloned loop. + cloned_loop_->SetMergeBlock(loop_->GetOrCreatePreHeaderBlock()); +} + +void LoopPeeling::InsertCanonicalInductionVariable() { + ir::BasicBlock::iterator insert_point = + GetClonedLoop()->GetLatchBlock()->tail(); + if (GetClonedLoop()->GetLatchBlock()->GetMergeInst()) { + --insert_point; + } + InstructionBuilder builder(context_, &*insert_point, + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping); + ir::Instruction* uint_1_cst = + builder.Add32BitConstantInteger(1, int_type_->IsSigned()); + // Create the increment. + // Note that we do "1 + 1" here, one of the operand should the phi + // value but we don't have it yet. The operand will be set latter. + ir::Instruction* iv_inc = builder.AddIAdd( + uint_1_cst->type_id(), uint_1_cst->result_id(), uint_1_cst->result_id()); + + builder.SetInsertPoint(&*GetClonedLoop()->GetHeaderBlock()->begin()); + + canonical_induction_variable_ = builder.AddPhi( + uint_1_cst->type_id(), + {builder.Add32BitConstantInteger(0, int_type_->IsSigned()) + ->result_id(), + GetClonedLoop()->GetPreHeaderBlock()->id(), iv_inc->result_id(), + GetClonedLoop()->GetLatchBlock()->id()}); + // Connect everything. + iv_inc->SetInOperand(0, {canonical_induction_variable_->result_id()}); + + // Update def/use manager. + context_->get_def_use_mgr()->AnalyzeInstUse(iv_inc); + + // If do-while form, use the incremented value. + if (do_while_form_) { + canonical_induction_variable_ = iv_inc; + } +} + +void LoopPeeling::GetIteratorUpdateOperations( + const ir::Loop* loop, ir::Instruction* iterator, + std::unordered_set* operations) { + opt::analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + operations->insert(iterator); + iterator->ForEachInId([def_use_mgr, loop, operations, this](uint32_t* id) { + ir::Instruction* insn = def_use_mgr->GetDef(*id); + if (insn->opcode() == SpvOpLabel) { + return; + } + if (operations->count(insn)) { + return; + } + if (!loop->IsInsideLoop(insn)) { + return; + } + GetIteratorUpdateOperations(loop, insn, operations); + }); +} + +// Gather the set of blocks for all the path from |entry| to |root|. +static void GetBlocksInPath(uint32_t block, uint32_t entry, + std::unordered_set* blocks_in_path, + const ir::CFG& cfg) { + for (uint32_t pid : cfg.preds(block)) { + if (blocks_in_path->insert(pid).second) { + if (pid != entry) { + GetBlocksInPath(pid, entry, blocks_in_path, cfg); + } + } + } +} + +bool LoopPeeling::IsConditionCheckSideEffectFree() const { + ir::CFG& cfg = *context_->cfg(); + + // The "do-while" form does not cause issues, the algorithm takes into account + // the first iteration. + if (!do_while_form_) { + uint32_t condition_block_id = cfg.preds(loop_->GetMergeBlock()->id())[0]; + + std::unordered_set blocks_in_path; + + blocks_in_path.insert(condition_block_id); + GetBlocksInPath(condition_block_id, loop_->GetHeaderBlock()->id(), + &blocks_in_path, cfg); + + for (uint32_t bb_id : blocks_in_path) { + ir::BasicBlock* bb = cfg.block(bb_id); + if (!bb->WhileEachInst([this](ir::Instruction* insn) { + if (insn->IsBranch()) return true; + switch (insn->opcode()) { + case SpvOpLabel: + case SpvOpSelectionMerge: + case SpvOpLoopMerge: + return true; + default: + break; + } + return context_->IsCombinatorInstruction(insn); + })) { + return false; + } + } + } + + return true; +} + +void LoopPeeling::GetIteratingExitValues() { + ir::CFG& cfg = *context_->cfg(); + + loop_->GetHeaderBlock()->ForEachPhiInst([this](ir::Instruction* phi) { + exit_value_[phi->result_id()] = nullptr; + }); + + if (!loop_->GetMergeBlock()) { + return; + } + if (cfg.preds(loop_->GetMergeBlock()->id()).size() != 1) { + return; + } + opt::analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + + uint32_t condition_block_id = cfg.preds(loop_->GetMergeBlock()->id())[0]; + + auto& header_pred = cfg.preds(loop_->GetHeaderBlock()->id()); + do_while_form_ = std::find(header_pred.begin(), header_pred.end(), + condition_block_id) != header_pred.end(); + if (do_while_form_) { + loop_->GetHeaderBlock()->ForEachPhiInst( + [condition_block_id, def_use_mgr, this](ir::Instruction* phi) { + std::unordered_set operations; + + for (uint32_t i = 0; i < phi->NumInOperands(); i += 2) { + if (condition_block_id == phi->GetSingleWordInOperand(i + 1)) { + exit_value_[phi->result_id()] = + def_use_mgr->GetDef(phi->GetSingleWordInOperand(i)); + } + } + }); + } else { + DominatorTree* dom_tree = + &context_->GetDominatorAnalysis(loop_utils_.GetFunction(), cfg) + ->GetDomTree(); + ir::BasicBlock* condition_block = cfg.block(condition_block_id); + + loop_->GetHeaderBlock()->ForEachPhiInst( + [dom_tree, condition_block, this](ir::Instruction* phi) { + std::unordered_set operations; + + // Not the back-edge value, check if the phi instruction is the only + // possible candidate. + GetIteratorUpdateOperations(loop_, phi, &operations); + + for (ir::Instruction* insn : operations) { + if (insn == phi) { + continue; + } + if (dom_tree->Dominates(context_->get_instr_block(insn), + condition_block)) { + return; + } + } + exit_value_[phi->result_id()] = phi; + }); + } +} + +void LoopPeeling::FixExitCondition( + const std::function& condition_builder) { + ir::CFG& cfg = *context_->cfg(); + + uint32_t condition_block_id = 0; + for (uint32_t id : cfg.preds(GetClonedLoop()->GetMergeBlock()->id())) { + if (GetClonedLoop()->IsInsideLoop(id)) { + condition_block_id = id; + break; + } + } + assert(condition_block_id != 0 && "2nd loop in improperly connected"); + + ir::BasicBlock* condition_block = cfg.block(condition_block_id); + ir::Instruction* exit_condition = condition_block->terminator(); + assert(exit_condition->opcode() == SpvOpBranchConditional); + ir::BasicBlock::iterator insert_point = condition_block->tail(); + if (condition_block->GetMergeInst()) { + --insert_point; + } + + exit_condition->SetInOperand(0, {condition_builder(&*insert_point)}); + + uint32_t to_continue_block_idx = + GetClonedLoop()->IsInsideLoop(exit_condition->GetSingleWordInOperand(1)) + ? 1 + : 2; + exit_condition->SetInOperand( + 1, {exit_condition->GetSingleWordInOperand(to_continue_block_idx)}); + exit_condition->SetInOperand(2, {GetClonedLoop()->GetMergeBlock()->id()}); + + // Update def/use manager. + context_->get_def_use_mgr()->AnalyzeInstUse(exit_condition); +} + +ir::BasicBlock* LoopPeeling::CreateBlockBefore(ir::BasicBlock* bb) { + analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + ir::CFG& cfg = *context_->cfg(); + assert(cfg.preds(bb->id()).size() == 1 && "More than one predecessor"); + + std::unique_ptr new_bb = MakeUnique( + std::unique_ptr(new ir::Instruction( + context_, SpvOpLabel, 0, context_->TakeNextId(), {}))); + new_bb->SetParent(loop_utils_.GetFunction()); + // Update the loop descriptor. + ir::Loop* in_loop = (*loop_utils_.GetLoopDescriptor())[bb]; + if (in_loop) { + in_loop->AddBasicBlock(new_bb.get()); + loop_utils_.GetLoopDescriptor()->SetBasicBlockToLoop(new_bb->id(), in_loop); + } + + context_->set_instr_block(new_bb->GetLabelInst(), new_bb.get()); + def_use_mgr->AnalyzeInstDefUse(new_bb->GetLabelInst()); + + ir::BasicBlock* bb_pred = cfg.block(cfg.preds(bb->id())[0]); + bb_pred->tail()->ForEachInId([bb, &new_bb](uint32_t* id) { + if (*id == bb->id()) { + *id = new_bb->id(); + } + }); + cfg.RemoveEdge(bb_pred->id(), bb->id()); + cfg.AddEdge(bb_pred->id(), new_bb->id()); + def_use_mgr->AnalyzeInstUse(&*bb_pred->tail()); + + // Update the incoming branch. + bb->ForEachPhiInst([&new_bb, def_use_mgr](ir::Instruction* phi) { + phi->SetInOperand(1, {new_bb->id()}); + def_use_mgr->AnalyzeInstUse(phi); + }); + InstructionBuilder(context_, new_bb.get(), + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping) + .AddBranch(bb->id()); + cfg.AddEdge(new_bb->id(), bb->id()); + + // Add the basic block to the function. + ir::Function::iterator it = loop_utils_.GetFunction()->FindBlock(bb->id()); + assert(it != loop_utils_.GetFunction()->end() && + "Basic block not found in the function."); + ir::BasicBlock* ret = new_bb.get(); + loop_utils_.GetFunction()->AddBasicBlock(std::move(new_bb), it); + return ret; +} + +ir::BasicBlock* LoopPeeling::ProtectLoop(ir::Loop* loop, + ir::Instruction* condition, + ir::BasicBlock* if_merge) { + ir::BasicBlock* if_block = loop->GetOrCreatePreHeaderBlock(); + // Will no longer be a pre-header because of the if. + loop->SetPreHeaderBlock(nullptr); + // Kill the branch to the header. + context_->KillInst(&*if_block->tail()); + + InstructionBuilder builder(context_, if_block, + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping); + builder.AddConditionalBranch(condition->result_id(), + loop->GetHeaderBlock()->id(), if_merge->id(), + if_merge->id()); + + return if_block; +} + +void LoopPeeling::PeelBefore(uint32_t peel_factor) { + assert(CanPeelLoop() && "Cannot peel loop"); + LoopUtils::LoopCloningResult clone_results; + + // Clone the loop and insert the cloned one before the loop. + DuplicateAndConnectLoop(&clone_results); + + // Add a canonical induction variable "canonical_induction_variable_". + InsertCanonicalInductionVariable(); + + InstructionBuilder builder(context_, + &*cloned_loop_->GetPreHeaderBlock()->tail(), + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping); + ir::Instruction* factor = + builder.Add32BitConstantInteger(peel_factor, int_type_->IsSigned()); + + ir::Instruction* has_remaining_iteration = builder.AddLessThan( + factor->result_id(), loop_iteration_count_->result_id()); + ir::Instruction* max_iteration = builder.AddSelect( + factor->type_id(), has_remaining_iteration->result_id(), + factor->result_id(), loop_iteration_count_->result_id()); + + // Change the exit condition of the cloned loop to be (exit when become + // false): + // "canonical_induction_variable_" < min("factor", "loop_iteration_count_") + FixExitCondition([max_iteration, this](ir::Instruction* insert_before_point) { + return InstructionBuilder(context_, insert_before_point, + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping) + .AddLessThan(canonical_induction_variable_->result_id(), + max_iteration->result_id()) + ->result_id(); + }); + + // "Protect" the second loop: the second loop can only be executed if + // |has_remaining_iteration| is true (i.e. factor < loop_iteration_count_). + ir::BasicBlock* if_merge_block = loop_->GetMergeBlock(); + loop_->SetMergeBlock(CreateBlockBefore(loop_->GetMergeBlock())); + // Prevent the second loop from being executed if we already executed all the + // required iterations. + ir::BasicBlock* if_block = + ProtectLoop(loop_, has_remaining_iteration, if_merge_block); + // Patch the phi of the merge block. + if_merge_block->ForEachPhiInst( + [&clone_results, if_block, this](ir::Instruction* phi) { + // if_merge_block had previously only 1 predecessor. + uint32_t incoming_value = phi->GetSingleWordInOperand(0); + auto def_in_loop = clone_results.value_map_.find(incoming_value); + if (def_in_loop != clone_results.value_map_.end()) + incoming_value = def_in_loop->second; + phi->AddOperand( + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {incoming_value}}); + phi->AddOperand( + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {if_block->id()}}); + context_->get_def_use_mgr()->AnalyzeInstUse(phi); + }); + + context_->InvalidateAnalysesExceptFor( + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping | + ir::IRContext::kAnalysisLoopAnalysis | ir::IRContext::kAnalysisCFG); +} + +void LoopPeeling::PeelAfter(uint32_t peel_factor) { + assert(CanPeelLoop() && "Cannot peel loop"); + LoopUtils::LoopCloningResult clone_results; + + // Clone the loop and insert the cloned one before the loop. + DuplicateAndConnectLoop(&clone_results); + + // Add a canonical induction variable "canonical_induction_variable_". + InsertCanonicalInductionVariable(); + + InstructionBuilder builder(context_, + &*cloned_loop_->GetPreHeaderBlock()->tail(), + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping); + ir::Instruction* factor = + builder.Add32BitConstantInteger(peel_factor, int_type_->IsSigned()); + + ir::Instruction* has_remaining_iteration = builder.AddLessThan( + factor->result_id(), loop_iteration_count_->result_id()); + + // Change the exit condition of the cloned loop to be (exit when become + // false): + // "canonical_induction_variable_" + "factor" < "loop_iteration_count_" + FixExitCondition([factor, this](ir::Instruction* insert_before_point) { + InstructionBuilder cond_builder( + context_, insert_before_point, + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping); + // Build the following check: canonical_induction_variable_ + factor < + // iteration_count + return cond_builder + .AddLessThan(cond_builder + .AddIAdd(canonical_induction_variable_->type_id(), + canonical_induction_variable_->result_id(), + factor->result_id()) + ->result_id(), + loop_iteration_count_->result_id()) + ->result_id(); + }); + + // "Protect" the first loop: the first loop can only be executed if + // factor < loop_iteration_count_. + + // The original loop's pre-header was the cloned loop merge block. + GetClonedLoop()->SetMergeBlock( + CreateBlockBefore(GetOriginalLoop()->GetPreHeaderBlock())); + // Use the second loop preheader as if merge block. + + // Prevent the first loop if only the peeled loop needs it. + ir::BasicBlock* if_block = + ProtectLoop(cloned_loop_, has_remaining_iteration, + GetOriginalLoop()->GetPreHeaderBlock()); + + // Patch the phi of the header block. + // We added an if to enclose the first loop and because the phi node are + // connected to the exit value of the first loop, the definition no longer + // dominate the preheader. + // We had to the preheader (our if merge block) the required phi instruction + // and patch the header phi. + GetOriginalLoop()->GetHeaderBlock()->ForEachPhiInst( + [&clone_results, if_block, this](ir::Instruction* phi) { + opt::analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + + auto find_value_idx = [](ir::Instruction* phi_inst, ir::Loop* loop) { + uint32_t preheader_value_idx = + !loop->IsInsideLoop(phi_inst->GetSingleWordInOperand(1)) ? 0 : 2; + return preheader_value_idx; + }; + + ir::Instruction* cloned_phi = + def_use_mgr->GetDef(clone_results.value_map_.at(phi->result_id())); + uint32_t cloned_preheader_value = cloned_phi->GetSingleWordInOperand( + find_value_idx(cloned_phi, GetClonedLoop())); + + ir::Instruction* new_phi = + InstructionBuilder(context_, + &*GetOriginalLoop()->GetPreHeaderBlock()->tail(), + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping) + .AddPhi(phi->type_id(), + {phi->GetSingleWordInOperand( + find_value_idx(phi, GetOriginalLoop())), + GetClonedLoop()->GetMergeBlock()->id(), + cloned_preheader_value, if_block->id()}); + + phi->SetInOperand(find_value_idx(phi, GetOriginalLoop()), + {new_phi->result_id()}); + def_use_mgr->AnalyzeInstUse(phi); + }); + + context_->InvalidateAnalysesExceptFor( + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping | + ir::IRContext::kAnalysisLoopAnalysis | ir::IRContext::kAnalysisCFG); +} + +} // namespace opt +} // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_peeling.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_peeling.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_peeling.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_peeling.h 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,223 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#ifndef SOURCE_OPT_LOOP_PEELING_H_ +#define SOURCE_OPT_LOOP_PEELING_H_ + +#include +#include +#include +#include +#include +#include +#include + +#include "opt/ir_context.h" +#include "opt/loop_descriptor.h" +#include "opt/loop_utils.h" + +namespace spvtools { +namespace opt { + +// Utility class to perform the peeling of a given loop. +// The loop peeling transformation make a certain amount of a loop iterations to +// be executed either before (peel before) or after (peel after) the transformed +// loop. +// +// For peeling cases the transformation does the following steps: +// - It clones the loop and inserts the cloned loop before the original loop; +// - It connects all iterating values of the cloned loop with the +// corresponding original loop values so that the second loop starts with +// the appropriate values. +// - It inserts a new induction variable "i" is inserted into the cloned that +// starts with the value 0 and increment by step of one. +// +// The last step is specific to each case: +// - Peel before: the transformation is to peel the "N" first iterations. +// The exit condition of the cloned loop is changed so that the loop +// exits when "i < N" becomes false. The original loop is then protected to +// only execute if there is any iteration left to do. +// - Peel after: the transformation is to peel the "N" last iterations, +// then the exit condition of the cloned loop is changed so that the loop +// exits when "i + N < max_iteration" becomes false, where "max_iteration" +// is the upper bound of the loop. The cloned loop is then protected to +// only execute if there is any iteration left to do no covered by the +// second. +// +// To be peelable: +// - The loop must be in LCSSA form; +// - The loop must not contain any breaks; +// - The loop must not have any ambiguous iterators updates (see +// "CanPeelLoop"). +// The method "CanPeelLoop" checks that those constrained are met. +// +// FIXME(Victor): Allow the utility it accept an canonical induction variable +// rather than automatically create one. +// FIXME(Victor): When possible, evaluate the initial value of the second loop +// iterating values rather than using the exit value of the first loop. +// FIXME(Victor): Make the utility work-out the upper bound without having to +// provide it. This should become easy once the scalar evolution is in. +class LoopPeeling { + public: + // LoopPeeling constructor. + // |loop| is the loop to peel. + // |loop_iteration_count| is the instruction holding the |loop| iteration + // count, must be invariant for |loop| and must be of an int 32 type (signed + // or unsigned). + LoopPeeling(ir::IRContext* context, ir::Loop* loop, + ir::Instruction* loop_iteration_count) + : context_(context), + loop_utils_(context, loop), + loop_(loop), + loop_iteration_count_(!loop->IsInsideLoop(loop_iteration_count) + ? loop_iteration_count + : nullptr), + int_type_(nullptr), + canonical_induction_variable_(nullptr) { + if (loop_iteration_count_) { + int_type_ = context_->get_type_mgr() + ->GetType(loop_iteration_count_->type_id()) + ->AsInteger(); + } + GetIteratingExitValues(); + } + + // Returns true if the loop can be peeled. + // To be peelable, all operation involved in the update of the loop iterators + // must not dominates the exit condition. This restriction is a work around to + // not miss compile code like: + // + // for (int i = 0; i + 1 < N; i++) {} + // for (int i = 0; ++i < N; i++) {} + // + // The increment will happen before the test on the exit condition leading to + // very look-a-like code. + // + // This restriction will not apply if a loop rotate is applied before (i.e. + // becomes a do-while loop). + bool CanPeelLoop() const { + ir::CFG& cfg = *context_->cfg(); + + if (!loop_iteration_count_) { + return false; + } + if (!int_type_) { + return false; + } + if (int_type_->width() != 32) { + return false; + } + if (!loop_->IsLCSSA()) { + return false; + } + if (!loop_->GetMergeBlock()) { + return false; + } + if (cfg.preds(loop_->GetMergeBlock()->id()).size() != 1) { + return false; + } + if (!IsConditionCheckSideEffectFree()) { + return false; + } + + return !std::any_of(exit_value_.cbegin(), exit_value_.cend(), + [](std::pair it) { + return it.second == nullptr; + }); + } + + // Moves the execution of the |factor| first iterations of the loop into a + // dedicated loop. + void PeelBefore(uint32_t factor); + + // Moves the execution of the |factor| last iterations of the loop into a + // dedicated loop. + void PeelAfter(uint32_t factor); + + // Returns the cloned loop. + ir::Loop* GetClonedLoop() { return cloned_loop_; } + // Returns the original loop. + ir::Loop* GetOriginalLoop() { return loop_; } + + private: + ir::IRContext* context_; + LoopUtils loop_utils_; + // The original loop. + ir::Loop* loop_; + // The initial |loop_| upper bound. + ir::Instruction* loop_iteration_count_; + // The int type to use for the canonical_induction_variable_. + analysis::Integer* int_type_; + // The cloned loop. + ir::Loop* cloned_loop_; + // This is set to true when the exit and back-edge branch instruction is the + // same. + bool do_while_form_; + + // The canonical induction variable of the cloned loop. The induction variable + // is initialized to 0 and incremented by step of 1. + ir::Instruction* canonical_induction_variable_; + + // Map between loop iterators and exit values. Loop iterators + std::unordered_map exit_value_; + + // Duplicate |loop_| and place the new loop before the cloned loop. Iterating + // values from the cloned loop are then connected to the original loop as + // initializer. + void DuplicateAndConnectLoop(LoopUtils::LoopCloningResult* clone_results); + + // Insert the canonical induction variable into the first loop as a simplified + // counter. + void InsertCanonicalInductionVariable(); + + // Fixes the exit condition of the before loop. The function calls + // |condition_builder| to get the condition to use in the conditional branch + // of the loop exit. The loop will be exited if the condition evaluate to + // true. |condition_builder| takes an ir::Instruction* that represent the + // insertion point. + void FixExitCondition( + const std::function& condition_builder); + + // Gathers all operations involved in the update of |iterator| into + // |operations|. + void GetIteratorUpdateOperations( + const ir::Loop* loop, ir::Instruction* iterator, + std::unordered_set* operations); + + // Gathers exiting iterator values. The function builds a map between each + // iterating value in the loop (a phi instruction in the loop header) and its + // SSA value when it exit the loop. If no exit value can be accurately found, + // it is map to nullptr (see comment on CanPeelLoop). + void GetIteratingExitValues(); + + // Returns true if a for-loop has no instruction with effects before the + // condition check. + bool IsConditionCheckSideEffectFree() const; + + // Creates a new basic block and insert it between |bb| and the predecessor of + // |bb|. + ir::BasicBlock* CreateBlockBefore(ir::BasicBlock* bb); + + // Inserts code to only execute |loop| only if the given |condition| is true. + // |if_merge| is a suitable basic block to be used by the if condition as + // merge block. + // The function returns the if block protecting the loop. + ir::BasicBlock* ProtectLoop(ir::Loop* loop, ir::Instruction* condition, + ir::BasicBlock* if_merge); +}; + +} // namespace opt +} // namespace spvtools + +#endif // SOURCE_OPT_LOOP_PEELING_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_unroller.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_unroller.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_unroller.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_unroller.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,1057 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include "opt/loop_unroller.h" +#include +#include +#include +#include "opt/ir_builder.h" +#include "opt/loop_utils.h" + +// Implements loop util unrolling functionality for fully and partially +// unrolling loops. Given a factor it will duplicate the loop that many times, +// appending each one to the end of the old loop and removing backedges, to +// create a new unrolled loop. +// +// 1 - User calls LoopUtils::FullyUnroll or LoopUtils::PartiallyUnroll with a +// loop they wish to unroll. LoopUtils::CanPerformUnroll is used to +// validate that a given loop can be unrolled. That method (along with the +// constructor of loop) checks that the IR is in the expected canonicalised +// format. +// +// 2 - The LoopUtils methods create a LoopUnrollerUtilsImpl object to actually +// perform the unrolling. This implements helper methods to copy the loop basic +// blocks and remap the ids of instructions used inside them. +// +// 3 - The core of LoopUnrollerUtilsImpl is the Unroll method, this method +// actually performs the loop duplication. It does this by creating a +// LoopUnrollState object and then copying the loop as given by the factor +// parameter. The LoopUnrollState object retains the state of the unroller +// between the loop body copies as each iteration needs information on the last +// to adjust the phi induction variable, adjust the OpLoopMerge instruction in +// the main loop header, and change the previous continue block to point to the +// new header and the new continue block to the main loop header. +// +// 4 - If the loop is to be fully unrolled then it is simply closed after step +// 3, with the OpLoopMerge being deleted, the backedge removed, and the +// condition blocks folded. +// +// 5 - If it is being partially unrolled: if the unrolling factor leaves the +// loop with an even number of bodies with respect to the number of loop +// iterations then step 3 is all that is needed. If it is uneven then we need to +// duplicate the loop completely and unroll the duplicated loop to cover the +// residual part and adjust the first loop to cover only the "even" part. For +// instance if you request an unroll factor of 3 on a loop with 10 iterations +// then copying the body three times would leave you with three bodies in the +// loop +// where the loop still iterates over each 4 times. So we make two loops one +// iterating once then a second loop of three iterating 3 times. + +namespace spvtools { +namespace opt { +namespace { + +// Loop control constant value for DontUnroll flag. +static const uint32_t kLoopControlDontUnrollIndex = 2; + +// Operand index of the loop control parameter of the OpLoopMerge. +static const uint32_t kLoopControlIndex = 2; + +// This utility class encapsulates some of the state we need to maintain between +// loop unrolls. Specifically it maintains key blocks and the induction variable +// in the current loop duplication step and the blocks from the previous one. +// This is because each step of the unroll needs to use data from both the +// preceding step and the original loop. +struct LoopUnrollState { + LoopUnrollState() + : previous_phi_(nullptr), + previous_continue_block_(nullptr), + previous_condition_block_(nullptr), + new_phi(nullptr), + new_continue_block(nullptr), + new_condition_block(nullptr), + new_header_block(nullptr) {} + + // Initialize from the loop descriptor class. + LoopUnrollState(ir::Instruction* induction, ir::BasicBlock* continue_block, + ir::BasicBlock* condition, + std::vector&& phis) + : previous_phi_(induction), + previous_continue_block_(continue_block), + previous_condition_block_(condition), + new_phi(nullptr), + new_continue_block(nullptr), + new_condition_block(nullptr), + new_header_block(nullptr) { + previous_phis_ = std::move(phis); + } + + // Swap the state so that the new nodes are now the previous nodes. + void NextIterationState() { + previous_phi_ = new_phi; + previous_continue_block_ = new_continue_block; + previous_condition_block_ = new_condition_block; + previous_phis_ = std::move(new_phis_); + + // Clear new nodes. + new_phi = nullptr; + new_continue_block = nullptr; + new_condition_block = nullptr; + new_header_block = nullptr; + + // Clear new block/instruction maps. + new_blocks.clear(); + new_inst.clear(); + ids_to_new_inst.clear(); + } + + // The induction variable from the immediately preceding loop body. + ir::Instruction* previous_phi_; + + // All the phi nodes from the previous loop iteration. + std::vector previous_phis_; + + std::vector new_phis_; + // The previous continue block. The backedge will be removed from this and + // added to the new continue block. + ir::BasicBlock* previous_continue_block_; + + // The previous condition block. This may be folded to flatten the loop. + ir::BasicBlock* previous_condition_block_; + + // The new induction variable. + ir::Instruction* new_phi; + + // The new continue block. + ir::BasicBlock* new_continue_block; + + // The new condition block. + ir::BasicBlock* new_condition_block; + + // The new header block. + ir::BasicBlock* new_header_block; + + // A mapping of new block ids to the original blocks which they were copied + // from. + std::unordered_map new_blocks; + + // A mapping of the original instruction ids to the instruction ids to their + // copies. + std::unordered_map new_inst; + + std::unordered_map ids_to_new_inst; +}; + +// This class implements the actual unrolling. It uses a LoopUnrollState to +// maintain the state of the unrolling inbetween steps. +class LoopUnrollerUtilsImpl { + public: + using BasicBlockListTy = std::vector>; + + LoopUnrollerUtilsImpl(ir::IRContext* c, ir::Function* function) + : context_(c), + function_(*function), + loop_condition_block_(nullptr), + loop_induction_variable_(nullptr), + number_of_loop_iterations_(0), + loop_step_value_(0), + loop_init_value_(0) {} + + // Unroll the |loop| by given |factor| by copying the whole body |factor| + // times. The resulting basicblock structure will remain a loop. + void PartiallyUnroll(ir::Loop*, size_t factor); + + // If partially unrolling the |loop| would leave the loop with too many bodies + // for its number of iterations then this method should be used. This method + // will duplicate the |loop| completely, making the duplicated loop the + // successor of the original's merge block. The original loop will have its + // condition changed to loop over the residual part and the duplicate will be + // partially unrolled. The resulting structure will be two loops. + void PartiallyUnrollResidualFactor(ir::Loop* loop, size_t factor); + + // Fully unroll the |loop| by copying the full body by the total number of + // loop iterations, folding all conditions, and removing the backedge from the + // continue block to the header. + void FullyUnroll(ir::Loop* loop); + + // Get the ID of the variable in the |phi| paired with |label|. + uint32_t GetPhiDefID(const ir::Instruction* phi, uint32_t label) const; + + // Close the loop by removing the OpLoopMerge from the |loop| header block and + // making the backedge point to the merge block. + void CloseUnrolledLoop(ir::Loop* loop); + + // Remove the OpConditionalBranch instruction inside |conditional_block| used + // to branch to either exit or continue the loop and replace it with an + // unconditional OpBranch to block |new_target|. + void FoldConditionBlock(ir::BasicBlock* condtion_block, uint32_t new_target); + + // Add all blocks_to_add_ to function_ at the |insert_point|. + void AddBlocksToFunction(const ir::BasicBlock* insert_point); + + // Duplicates the |old_loop|, cloning each body and remaping the ids without + // removing instructions or changing relative structure. Result will be stored + // in |new_loop|. + void DuplicateLoop(ir::Loop* old_loop, ir::Loop* new_loop); + + inline size_t GetLoopIterationCount() const { + return number_of_loop_iterations_; + } + + // Extracts the initial state information from the |loop|. + void Init(ir::Loop* loop); + + // Replace the uses of each induction variable outside the loop with the final + // value of the induction variable before the loop exit. To reflect the proper + // state of a fully unrolled loop. + void ReplaceInductionUseWithFinalValue(ir::Loop* loop); + + // Remove all the instructions in the invalidated_instructions_ vector. + void RemoveDeadInstructions(); + + // Replace any use of induction variables outwith the loop with the final + // value of the induction variable in the unrolled loop. + void ReplaceOutsideLoopUseWithFinalValue(ir::Loop* loop); + + // Set the LoopControl operand of the OpLoopMerge instruction to be + // DontUnroll. + void MarkLoopControlAsDontUnroll(ir::Loop* loop) const; + + private: + // Remap all the in |basic_block| to new IDs and keep the mapping of new ids + // to old + // ids. |loop| is used to identify special loop blocks (header, continue, + // ect). + void AssignNewResultIds(ir::BasicBlock* basic_block); + + // Using the map built by AssignNewResultIds, for each instruction in + // |basic_block| use + // that map to substitute the IDs used by instructions (in the operands) with + // the new ids. + void RemapOperands(ir::BasicBlock* basic_block); + + // Copy the whole body of the loop, all blocks dominated by the |loop| header + // and not dominated by the |loop| merge. The copied body will be linked to by + // the old |loop| continue block and the new body will link to the |loop| + // header via the new continue block. |eliminate_conditions| is used to decide + // whether or not to fold all the condition blocks other than the last one. + void CopyBody(ir::Loop* loop, bool eliminate_conditions); + + // Copy a given |block_to_copy| in the |loop| and record the mapping of the + // old/new ids. |preserve_instructions| determines whether or not the method + // will modify (other than result_id) instructions which are copied. + void CopyBasicBlock(ir::Loop* loop, const ir::BasicBlock* block_to_copy, + bool preserve_instructions); + + // The actual implementation of the unroll step. Unrolls |loop| by given + // |factor| by copying the body by |factor| times. Also propagates the + // induction variable value throughout the copies. + void Unroll(ir::Loop* loop, size_t factor); + + // Fills the loop_blocks_inorder_ field with the ordered list of basic blocks + // as computed by the method ComputeLoopOrderedBlocks. + void ComputeLoopOrderedBlocks(ir::Loop* loop); + + // Adds the blocks_to_add_ to both the |loop| and to the parent of |loop| if + // the parent exists. + void AddBlocksToLoop(ir::Loop* loop) const; + + // After the partially unroll step the phi instructions in the header block + // will be in an illegal format. This function makes the phis legal by making + // the edge from the latch block come from the new latch block and the value + // to be the actual value of the phi at that point. + void LinkLastPhisToStart(ir::Loop* loop) const; + + // A pointer to the IRContext. Used to add/remove instructions and for usedef + // chains. + ir::IRContext* context_; + + // A reference the function the loop is within. + ir::Function& function_; + + // A list of basic blocks to be added to the loop at the end of an unroll + // step. + BasicBlockListTy blocks_to_add_; + + // List of instructions which are now dead and can be removed. + std::vector invalidated_instructions_; + + // Maintains the current state of the transform between calls to unroll. + LoopUnrollState state_; + + // An ordered list containing the loop basic blocks. + std::vector loop_blocks_inorder_; + + // The block containing the condition check which contains a conditional + // branch to the merge and continue block. + ir::BasicBlock* loop_condition_block_; + + // The induction variable of the loop. + ir::Instruction* loop_induction_variable_; + + // Phis used in the loop need to be remapped to use the actual result values + // and then be remapped at the end. + std::vector loop_phi_instructions_; + + // The number of loop iterations that the loop would preform pre-unroll. + size_t number_of_loop_iterations_; + + // The amount that the loop steps each iteration. + int64_t loop_step_value_; + + // The value the loop starts stepping from. + int64_t loop_init_value_; +}; + +/* + * Static helper functions. + */ + +// Retrieve the index of the OpPhi instruction |phi| which corresponds to the +// incoming |block| id. +static uint32_t GetPhiIndexFromLabel(const ir::BasicBlock* block, + const ir::Instruction* phi) { + for (uint32_t i = 1; i < phi->NumInOperands(); i += 2) { + if (block->id() == phi->GetSingleWordInOperand(i)) { + return i; + } + } + assert(false && "Could not find operand in instruction."); + return 0; +} + +void LoopUnrollerUtilsImpl::Init(ir::Loop* loop) { + loop_condition_block_ = loop->FindConditionBlock(); + + // When we reinit the second loop during PartiallyUnrollResidualFactor we need + // to use the cached value from the duplicate step as the dominator tree + // basded solution, loop->FindConditionBlock, requires all the nodes to be + // connected up with the correct branches. They won't be at this point. + if (!loop_condition_block_) { + loop_condition_block_ = state_.new_condition_block; + } + assert(loop_condition_block_); + + loop_induction_variable_ = loop->FindConditionVariable(loop_condition_block_); + assert(loop_induction_variable_); + + bool found = loop->FindNumberOfIterations( + loop_induction_variable_, &*loop_condition_block_->ctail(), + &number_of_loop_iterations_, &loop_step_value_, &loop_init_value_); + (void)found; // To silence unused variable warning on release builds. + assert(found); + + // Blocks are stored in an unordered set of ids in the loop class, we need to + // create the dominator ordered list. + ComputeLoopOrderedBlocks(loop); +} + +// This function is used to partially unroll the loop when the factor provided +// would normally lead to an illegal optimization. Instead of just unrolling the +// loop it creates two loops and unrolls one and adjusts the condition on the +// other. The end result being that the new loop pair iterates over the correct +// number of bodies. +void LoopUnrollerUtilsImpl::PartiallyUnrollResidualFactor(ir::Loop* loop, + size_t factor) { + std::unique_ptr new_label{new ir::Instruction( + context_, SpvOp::SpvOpLabel, 0, context_->TakeNextId(), {})}; + std::unique_ptr new_exit_bb{ + new ir::BasicBlock(std::move(new_label))}; + + // Save the id of the block before we move it. + uint32_t new_merge_id = new_exit_bb->id(); + + // Add the block the list of blocks to add, we want this merge block to be + // right at the start of the new blocks. + blocks_to_add_.push_back(std::move(new_exit_bb)); + ir::BasicBlock* new_exit_bb_raw = blocks_to_add_[0].get(); + ir::Instruction& original_conditional_branch = *loop_condition_block_->tail(); + // Duplicate the loop, providing access to the blocks of both loops. + // This is a naked new due to the VS2013 requirement of not having unique + // pointers in vectors, as it will be inserted into a vector with + // loop_descriptor.AddLoop. + ir::Loop* new_loop = new ir::Loop(*loop); + + // Clear the basic blocks of the new loop. + new_loop->ClearBlocks(); + + DuplicateLoop(loop, new_loop); + + // Add the blocks to the function. + AddBlocksToFunction(loop->GetMergeBlock()); + blocks_to_add_.clear(); + + // Create a new merge block for the first loop. + InstructionBuilder builder{context_, new_exit_bb_raw}; + // Make the first loop branch to the second. + builder.AddBranch(new_loop->GetHeaderBlock()->id()); + + loop_condition_block_ = state_.new_condition_block; + loop_induction_variable_ = state_.new_phi; + // Unroll the new loop by the factor with the usual -1 to account for the + // existing block iteration. + Unroll(new_loop, factor); + + LinkLastPhisToStart(new_loop); + AddBlocksToLoop(new_loop); + + // Add the new merge block to the back of the list of blocks to be added. It + // needs to be the last block added to maintain dominator order in the binary. + blocks_to_add_.push_back( + std::unique_ptr(new_loop->GetMergeBlock())); + + // Add the blocks to the function. + AddBlocksToFunction(loop->GetMergeBlock()); + + // Reset the usedef analysis. + context_->InvalidateAnalysesExceptFor( + ir::IRContext::Analysis::kAnalysisLoopAnalysis); + opt::analysis::DefUseManager* def_use_manager = context_->get_def_use_mgr(); + + // The loop condition. + ir::Instruction* condition_check = def_use_manager->GetDef( + original_conditional_branch.GetSingleWordOperand(0)); + + // This should have been checked by the LoopUtils::CanPerformUnroll function + // before entering this. + assert(loop->IsSupportedCondition(condition_check->opcode())); + + // We need to account for the initial body when calculating the remainder. + int64_t remainder = ir::Loop::GetResidualConditionValue( + condition_check->opcode(), loop_init_value_, loop_step_value_, + number_of_loop_iterations_, factor); + + assert(remainder > std::numeric_limits::min() && + remainder < std::numeric_limits::max()); + + ir::Instruction* new_constant = nullptr; + + // If the remainder is negative then we add a signed constant, otherwise just + // add an unsigned constant. + if (remainder < 0) { + new_constant = + builder.Add32BitSignedIntegerConstant(static_cast(remainder)); + } else { + new_constant = builder.Add32BitUnsignedIntegerConstant( + static_cast(remainder)); + } + + uint32_t constant_id = new_constant->result_id(); + + // Update the condition check. + condition_check->SetInOperand(1, {constant_id}); + + // Update the next phi node. The phi will have a constant value coming in from + // the preheader block. For the duplicated loop we need to update the constant + // to be the amount of iterations covered by the first loop and the incoming + // block to be the first loops new merge block. + std::vector new_inductions; + new_loop->GetInductionVariables(new_inductions); + + std::vector old_inductions; + loop->GetInductionVariables(old_inductions); + for (size_t index = 0; index < new_inductions.size(); ++index) { + ir::Instruction* new_induction = new_inductions[index]; + ir::Instruction* old_induction = old_inductions[index]; + // Get the index of the loop initalizer, the value coming in from the + // preheader. + uint32_t initalizer_index = + GetPhiIndexFromLabel(new_loop->GetPreHeaderBlock(), old_induction); + + // Replace the second loop initalizer with the phi from the first + new_induction->SetInOperand(initalizer_index - 1, + {old_induction->result_id()}); + new_induction->SetInOperand(initalizer_index, {new_merge_id}); + + // If the use of the first loop induction variable is outside of the loop + // then replace that use with the second loop induction variable. + uint32_t second_loop_induction = new_induction->result_id(); + auto replace_use_outside_of_loop = [loop, second_loop_induction]( + ir::Instruction* user, + uint32_t operand_index) { + if (!loop->IsInsideLoop(user)) { + user->SetOperand(operand_index, {second_loop_induction}); + } + }; + + context_->get_def_use_mgr()->ForEachUse(old_induction, + replace_use_outside_of_loop); + } + + context_->InvalidateAnalysesExceptFor( + ir::IRContext::Analysis::kAnalysisLoopAnalysis); + + context_->ReplaceAllUsesWith(loop->GetMergeBlock()->id(), new_merge_id); + + ir::LoopDescriptor& loop_descriptor = + *context_->GetLoopDescriptor(&function_); + + loop_descriptor.AddLoop(new_loop, loop->GetParent()); + + RemoveDeadInstructions(); +} + +// Mark this loop as DontUnroll as it will already be unrolled and it may not +// be safe to unroll a previously partially unrolled loop. +void LoopUnrollerUtilsImpl::MarkLoopControlAsDontUnroll(ir::Loop* loop) const { + ir::Instruction* loop_merge_inst = loop->GetHeaderBlock()->GetLoopMergeInst(); + assert(loop_merge_inst && + "Loop merge instruction could not be found after entering unroller " + "(should have exited before this)"); + loop_merge_inst->SetInOperand(kLoopControlIndex, + {kLoopControlDontUnrollIndex}); +} + +// Duplicate the |loop| body |factor| - 1 number of times while keeping the loop +// backedge intact. This will leave the loop with |factor| number of bodies +// after accounting for the initial body. +void LoopUnrollerUtilsImpl::Unroll(ir::Loop* loop, size_t factor) { + // If we unroll a loop partially it will not be safe to unroll it further. + // This is due to the current method of calculating the number of loop + // iterations. + MarkLoopControlAsDontUnroll(loop); + + std::vector inductions; + loop->GetInductionVariables(inductions); + state_ = LoopUnrollState{loop_induction_variable_, loop->GetLatchBlock(), + loop_condition_block_, std::move(inductions)}; + for (size_t i = 0; i < factor - 1; ++i) { + CopyBody(loop, true); + } +} + +void LoopUnrollerUtilsImpl::RemoveDeadInstructions() { + // Remove the dead instructions. + for (ir::Instruction* inst : invalidated_instructions_) { + context_->KillInst(inst); + } +} + +void LoopUnrollerUtilsImpl::ReplaceInductionUseWithFinalValue(ir::Loop* loop) { + context_->InvalidateAnalysesExceptFor( + ir::IRContext::Analysis::kAnalysisLoopAnalysis); + std::vector inductions; + loop->GetInductionVariables(inductions); + + for (size_t index = 0; index < inductions.size(); ++index) { + uint32_t trip_step_id = GetPhiDefID(state_.previous_phis_[index], + state_.previous_continue_block_->id()); + context_->ReplaceAllUsesWith(inductions[index]->result_id(), trip_step_id); + invalidated_instructions_.push_back(inductions[index]); + } +} + +// Fully unroll the loop by partially unrolling it by the number of loop +// iterations minus one for the body already accounted for. +void LoopUnrollerUtilsImpl::FullyUnroll(ir::Loop* loop) { + // We unroll the loop by number of iterations in the loop. + Unroll(loop, number_of_loop_iterations_); + + // The first condition block is preserved until now so it can be copied. + FoldConditionBlock(loop_condition_block_, 1); + + // Delete the OpLoopMerge and remove the backedge to the header. + CloseUnrolledLoop(loop); + + // Mark the loop for later deletion. This allows us to preserve the loop + // iterators but still disregard dead loops. + loop->MarkLoopForRemoval(); + + // If the loop has a parent add the new blocks to the parent. + if (loop->GetParent()) { + AddBlocksToLoop(loop->GetParent()); + } + + // Add the blocks to the function. + AddBlocksToFunction(loop->GetMergeBlock()); + + ReplaceInductionUseWithFinalValue(loop); + + RemoveDeadInstructions(); + // Invalidate all analyses. + context_->InvalidateAnalysesExceptFor( + ir::IRContext::Analysis::kAnalysisLoopAnalysis); +} + +// Copy a given basic block, give it a new result_id, and store the new block +// and the id mapping in the state. |preserve_instructions| is used to determine +// whether or not this function should edit instructions other than the +// |result_id|. +void LoopUnrollerUtilsImpl::CopyBasicBlock(ir::Loop* loop, + const ir::BasicBlock* itr, + bool preserve_instructions) { + // Clone the block exactly, including the IDs. + ir::BasicBlock* basic_block = itr->Clone(context_); + basic_block->SetParent(itr->GetParent()); + + // Assign each result a new unique ID and keep a mapping of the old ids to + // the new ones. + AssignNewResultIds(basic_block); + + // If this is the continue block we are copying. + if (itr == loop->GetLatchBlock()) { + // Make the OpLoopMerge point to this block for the continue. + if (!preserve_instructions) { + ir::Instruction* merge_inst = loop->GetHeaderBlock()->GetLoopMergeInst(); + merge_inst->SetInOperand(1, {basic_block->id()}); + } + + state_.new_continue_block = basic_block; + } + + // If this is the header block we are copying. + if (itr == loop->GetHeaderBlock()) { + state_.new_header_block = basic_block; + + if (!preserve_instructions) { + // Remove the loop merge instruction if it exists. + ir::Instruction* merge_inst = basic_block->GetLoopMergeInst(); + if (merge_inst) invalidated_instructions_.push_back(merge_inst); + } + } + + // If this is the condition block we are copying. + if (itr == loop_condition_block_) { + state_.new_condition_block = basic_block; + } + + // Add this block to the list of blocks to add to the function at the end of + // the unrolling process. + blocks_to_add_.push_back(std::unique_ptr(basic_block)); + + // Keep tracking the old block via a map. + state_.new_blocks[itr->id()] = basic_block; +} + +void LoopUnrollerUtilsImpl::CopyBody(ir::Loop* loop, + bool eliminate_conditions) { + // Copy each basic block in the loop, give them new ids, and save state + // information. + for (const ir::BasicBlock* itr : loop_blocks_inorder_) { + CopyBasicBlock(loop, itr, false); + } + + // Set the previous continue block to point to the new header. + ir::Instruction& continue_branch = *state_.previous_continue_block_->tail(); + continue_branch.SetInOperand(0, {state_.new_header_block->id()}); + + // As the algorithm copies the original loop blocks exactly, the tail of the + // latch block on iterations after the first one will be a branch to the new + // header and not the actual loop header. The last continue block in the loop + // should always be a backedge to the global header. + ir::Instruction& new_continue_branch = *state_.new_continue_block->tail(); + new_continue_branch.SetInOperand(0, {loop->GetHeaderBlock()->id()}); + + std::vector inductions; + loop->GetInductionVariables(inductions); + for (size_t index = 0; index < inductions.size(); ++index) { + ir::Instruction* master_copy = inductions[index]; + + assert(master_copy->result_id() != 0); + ir::Instruction* induction_clone = + state_.ids_to_new_inst[state_.new_inst[master_copy->result_id()]]; + + state_.new_phis_.push_back(induction_clone); + assert(induction_clone->result_id() != 0); + + if (!state_.previous_phis_.empty()) { + state_.new_inst[master_copy->result_id()] = GetPhiDefID( + state_.previous_phis_[index], state_.previous_continue_block_->id()); + } else { + // Do not replace the first phi block ids. + state_.new_inst[master_copy->result_id()] = master_copy->result_id(); + } + } + + if (eliminate_conditions && + state_.new_condition_block != loop_condition_block_) { + FoldConditionBlock(state_.new_condition_block, 1); + } + + // Only reference to the header block is the backedge in the latch block, + // don't change this. + state_.new_inst[loop->GetHeaderBlock()->id()] = loop->GetHeaderBlock()->id(); + + for (auto& pair : state_.new_blocks) { + RemapOperands(pair.second); + } + + for (ir::Instruction* dead_phi : state_.new_phis_) + invalidated_instructions_.push_back(dead_phi); + + // Swap the state so the new is now the previous. + state_.NextIterationState(); +} + +uint32_t LoopUnrollerUtilsImpl::GetPhiDefID(const ir::Instruction* phi, + uint32_t label) const { + for (uint32_t operand = 3; operand < phi->NumOperands(); operand += 2) { + if (phi->GetSingleWordOperand(operand) == label) { + return phi->GetSingleWordOperand(operand - 1); + } + } + assert(false && "Could not find a phi index matching the provided label"); + return 0; +} + +void LoopUnrollerUtilsImpl::FoldConditionBlock(ir::BasicBlock* condition_block, + uint32_t operand_label) { + // Remove the old conditional branch to the merge and continue blocks. + ir::Instruction& old_branch = *condition_block->tail(); + uint32_t new_target = old_branch.GetSingleWordOperand(operand_label); + + context_->KillInst(&old_branch); + // Add the new unconditional branch to the merge block. + InstructionBuilder builder{context_, condition_block}; + builder.AddBranch(new_target); +} + +void LoopUnrollerUtilsImpl::CloseUnrolledLoop(ir::Loop* loop) { + // Remove the OpLoopMerge instruction from the function. + ir::Instruction* merge_inst = loop->GetHeaderBlock()->GetLoopMergeInst(); + invalidated_instructions_.push_back(merge_inst); + + // Remove the final backedge to the header and make it point instead to the + // merge block. + state_.previous_continue_block_->tail()->SetInOperand( + 0, {loop->GetMergeBlock()->id()}); + + // Remove all induction variables as the phis will now be invalid. Replace all + // uses with the constant initializer value (all uses of phis will be in + // the first iteration with the subsequent phis already having been removed). + std::vector inductions; + loop->GetInductionVariables(inductions); + + // We can use the state instruction mechanism to replace all internal loop + // values within the first loop trip (as the subsequent ones will be updated + // by the copy function) with the value coming in from the preheader and then + // use context ReplaceAllUsesWith for the uses outside the loop with the final + // trip phi value. + state_.new_inst.clear(); + for (ir::Instruction* induction : inductions) { + uint32_t initalizer_id = + GetPhiDefID(induction, loop->GetPreHeaderBlock()->id()); + + state_.new_inst[induction->result_id()] = initalizer_id; + } + + for (ir::BasicBlock* block : loop_blocks_inorder_) { + RemapOperands(block); + } +} + +// Uses the first loop to create a copy of the loop with new IDs. +void LoopUnrollerUtilsImpl::DuplicateLoop(ir::Loop* old_loop, + ir::Loop* new_loop) { + std::vector new_block_order; + + // Copy every block in the old loop. + for (const ir::BasicBlock* itr : loop_blocks_inorder_) { + CopyBasicBlock(old_loop, itr, true); + new_block_order.push_back(blocks_to_add_.back().get()); + } + + // Clone the merge block, give it a new id and record it in the state. + ir::BasicBlock* new_merge = old_loop->GetMergeBlock()->Clone(context_); + new_merge->SetParent(old_loop->GetMergeBlock()->GetParent()); + AssignNewResultIds(new_merge); + state_.new_blocks[old_loop->GetMergeBlock()->id()] = new_merge; + + // Remap the operands of every instruction in the loop to point to the new + // copies. + for (auto& pair : state_.new_blocks) { + RemapOperands(pair.second); + } + + loop_blocks_inorder_ = std::move(new_block_order); + + AddBlocksToLoop(new_loop); + + new_loop->SetHeaderBlock(state_.new_header_block); + new_loop->SetLatchBlock(state_.new_continue_block); + new_loop->SetMergeBlock(new_merge); +} + +// Whenever the utility copies a block it stores it in a tempory buffer, this +// function adds the buffer into the ir::Function. The blocks will be inserted +// after the block |insert_point|. +void LoopUnrollerUtilsImpl::AddBlocksToFunction( + const ir::BasicBlock* insert_point) { + for (auto basic_block_iterator = function_.begin(); + basic_block_iterator != function_.end(); ++basic_block_iterator) { + if (basic_block_iterator->id() == insert_point->id()) { + basic_block_iterator.InsertBefore(&blocks_to_add_); + return; + } + } + + assert( + false && + "Could not add basic blocks to function as insert point was not found."); +} + +// Assign all result_ids in |basic_block| instructions to new IDs and preserve +// the mapping of new ids to old ones. +void LoopUnrollerUtilsImpl::AssignNewResultIds(ir::BasicBlock* basic_block) { + // Label instructions aren't covered by normal traversal of the + // instructions. + uint32_t new_label_id = context_->TakeNextId(); + + // Assign a new id to the label. + state_.new_inst[basic_block->GetLabelInst()->result_id()] = new_label_id; + basic_block->GetLabelInst()->SetResultId(new_label_id); + + for (ir::Instruction& inst : *basic_block) { + uint32_t old_id = inst.result_id(); + + // Ignore stores etc. + if (old_id == 0) { + continue; + } + + // Give the instruction a new id. + inst.SetResultId(context_->TakeNextId()); + + // Save the mapping of old_id -> new_id. + state_.new_inst[old_id] = inst.result_id(); + // Check if this instruction is the induction variable. + if (loop_induction_variable_->result_id() == old_id) { + // Save a pointer to the new copy of it. + state_.new_phi = &inst; + } + state_.ids_to_new_inst[inst.result_id()] = &inst; + } +} + +// For all instructions in |basic_block| check if the operands used are from a +// copied instruction and if so swap out the operand for the copy of it. +void LoopUnrollerUtilsImpl::RemapOperands(ir::BasicBlock* basic_block) { + for (ir::Instruction& inst : *basic_block) { + auto remap_operands_to_new_ids = [this](uint32_t* id) { + auto itr = state_.new_inst.find(*id); + + if (itr != state_.new_inst.end()) { + *id = itr->second; + } + }; + + inst.ForEachInId(remap_operands_to_new_ids); + } +} + +// Generate the ordered list of basic blocks in the |loop| and cache it for +// later use. +void LoopUnrollerUtilsImpl::ComputeLoopOrderedBlocks(ir::Loop* loop) { + loop_blocks_inorder_.clear(); + loop->ComputeLoopStructuredOrder(&loop_blocks_inorder_); +} + +// Adds the blocks_to_add_ to both the loop and to the parent. +void LoopUnrollerUtilsImpl::AddBlocksToLoop(ir::Loop* loop) const { + // Add the blocks to this loop. + for (auto& block_itr : blocks_to_add_) { + loop->AddBasicBlock(block_itr.get()); + } + + // Add the blocks to the parent as well. + if (loop->GetParent()) AddBlocksToLoop(loop->GetParent()); +} + +void LoopUnrollerUtilsImpl::LinkLastPhisToStart(ir::Loop* loop) const { + std::vector inductions; + loop->GetInductionVariables(inductions); + + for (size_t i = 0; i < inductions.size(); ++i) { + ir::Instruction* last_phi_in_block = state_.previous_phis_[i]; + + uint32_t phi_index = GetPhiIndexFromLabel(state_.previous_continue_block_, + last_phi_in_block); + uint32_t phi_variable = + last_phi_in_block->GetSingleWordInOperand(phi_index - 1); + uint32_t phi_label = last_phi_in_block->GetSingleWordInOperand(phi_index); + + ir::Instruction* phi = inductions[i]; + phi->SetInOperand(phi_index - 1, {phi_variable}); + phi->SetInOperand(phi_index, {phi_label}); + } +} + +// Duplicate the |loop| body |factor| number of times while keeping the loop +// backedge intact. +void LoopUnrollerUtilsImpl::PartiallyUnroll(ir::Loop* loop, size_t factor) { + Unroll(loop, factor); + LinkLastPhisToStart(loop); + AddBlocksToLoop(loop); + AddBlocksToFunction(loop->GetMergeBlock()); + RemoveDeadInstructions(); +} + +/* + * End LoopUtilsImpl. + */ + +} // namespace + +/* + * + * Begin Utils. + * + * */ + +bool LoopUtils::CanPerformUnroll() { + // The loop is expected to be in structured order. + if (!loop_->GetHeaderBlock()->GetMergeInst()) { + return false; + } + + // Find check the loop has a condition we can find and evaluate. + const ir::BasicBlock* condition = loop_->FindConditionBlock(); + if (!condition) return false; + + // Check that we can find and process the induction variable. + const ir::Instruction* induction = loop_->FindConditionVariable(condition); + if (!induction || induction->opcode() != SpvOpPhi) return false; + + // Check that we can find the number of loop iterations. + if (!loop_->FindNumberOfIterations(induction, &*condition->ctail(), nullptr)) + return false; + + // Make sure the continue block is a unconditional branch to the header + // block. + const ir::Instruction& branch = *loop_->GetLatchBlock()->ctail(); + bool branching_assumption = + branch.opcode() == SpvOpBranch && + branch.GetSingleWordInOperand(0) == loop_->GetHeaderBlock()->id(); + if (!branching_assumption) { + return false; + } + + std::vector inductions; + loop_->GetInductionVariables(inductions); + + // Ban breaks within the loop. + const std::vector& merge_block_preds = + context_->cfg()->preds(loop_->GetMergeBlock()->id()); + if (merge_block_preds.size() != 1) { + return false; + } + + // Ban continues within the loop. + const std::vector& continue_block_preds = + context_->cfg()->preds(loop_->GetLatchBlock()->id()); + if (continue_block_preds.size() != 1) { + return false; + } + + // Ban returns in the loop. + // Iterate over all the blocks within the loop and check that none of them + // exit the loop. + for (uint32_t label_id : loop_->GetBlocks()) { + const ir::BasicBlock* block = context_->cfg()->block(label_id); + if (block->ctail()->opcode() == SpvOp::SpvOpKill || + block->ctail()->opcode() == SpvOp::SpvOpReturn || + block->ctail()->opcode() == SpvOp::SpvOpReturnValue) { + return false; + } + } + // Can only unroll inner loops. + if (!loop_->AreAllChildrenMarkedForRemoval()) { + return false; + } + + return true; +} + +bool LoopUtils::PartiallyUnroll(size_t factor) { + if (factor == 1 || !CanPerformUnroll()) return false; + + // Create the unroller utility. + LoopUnrollerUtilsImpl unroller{context_, + loop_->GetHeaderBlock()->GetParent()}; + unroller.Init(loop_); + + // If the unrolling factor is larger than or the same size as the loop just + // fully unroll the loop. + if (factor >= unroller.GetLoopIterationCount()) { + unroller.FullyUnroll(loop_); + return true; + } + + // If the loop unrolling factor is an residual number of iterations we need to + // let run the loop for the residual part then let it branch into the unrolled + // remaining part. We add one when calucating the remainder to take into + // account the one iteration already in the loop. + if (unroller.GetLoopIterationCount() % factor != 0) { + unroller.PartiallyUnrollResidualFactor(loop_, factor); + } else { + unroller.PartiallyUnroll(loop_, factor); + } + + return true; +} + +bool LoopUtils::FullyUnroll() { + if (!CanPerformUnroll()) return false; + + std::vector inductions; + loop_->GetInductionVariables(inductions); + + LoopUnrollerUtilsImpl unroller{context_, + loop_->GetHeaderBlock()->GetParent()}; + + unroller.Init(loop_); + unroller.FullyUnroll(loop_); + + return true; +} + +void LoopUtils::Finalize() { + // Clean up the loop descriptor to preserve the analysis. + + ir::LoopDescriptor* LD = context_->GetLoopDescriptor(&function_); + LD->PostModificationCleanup(); +} + +/* + * + * Begin Pass. + * + */ + +Pass::Status LoopUnroller::Process(ir::IRContext* c) { + context_ = c; + bool changed = false; + for (ir::Function& f : *c->module()) { + ir::LoopDescriptor* LD = context_->GetLoopDescriptor(&f); + for (ir::Loop& loop : *LD) { + LoopUtils loop_utils{c, &loop}; + if (!loop.HasUnrollLoopControl() || !loop_utils.CanPerformUnroll()) { + continue; + } + + if (fully_unroll_) { + loop_utils.FullyUnroll(); + } else { + loop_utils.PartiallyUnroll(unroll_factor_); + } + changed = true; + } + LD->PostModificationCleanup(); + } + + return changed ? Status::SuccessWithChange : Status::SuccessWithoutChange; +} + +} // namespace opt +} // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_unroller.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_unroller.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_unroller.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_unroller.h 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,41 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#ifndef SOURCE_OPT_LOOP_UNROLLER_H_ +#define SOURCE_OPT_LOOP_UNROLLER_H_ +#include "opt/pass.h" + +namespace spvtools { +namespace opt { + +class LoopUnroller : public Pass { + public: + LoopUnroller() : Pass(), fully_unroll_(true), unroll_factor_(0) {} + LoopUnroller(bool fully_unroll, int unroll_factor) + : Pass(), fully_unroll_(fully_unroll), unroll_factor_(unroll_factor) {} + + const char* name() const override { return "Loop unroller"; } + + Status Process(ir::IRContext* context) override; + + private: + ir::IRContext* context_; + bool fully_unroll_; + int unroll_factor_; +}; + +} // namespace opt +} // namespace spvtools + +#endif // SOURCE_OPT_LOOP_UNROLLER_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_unswitch_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_unswitch_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_unswitch_pass.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_unswitch_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,906 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include "loop_unswitch_pass.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "basic_block.h" +#include "dominator_tree.h" +#include "fold.h" +#include "function.h" +#include "instruction.h" +#include "ir_builder.h" +#include "ir_context.h" +#include "loop_descriptor.h" + +#include "loop_utils.h" + +namespace spvtools { +namespace opt { +namespace { + +static const uint32_t kTypePointerStorageClassInIdx = 0; +static const uint32_t kBranchCondTrueLabIdInIdx = 1; +static const uint32_t kBranchCondFalseLabIdInIdx = 2; + +} // anonymous namespace + +namespace { + +// This class handle the unswitch procedure for a given loop. +// The unswitch will not happen if: +// - The loop has any instruction that will prevent it; +// - The loop invariant condition is not uniform. +class LoopUnswitch { + public: + LoopUnswitch(ir::IRContext* context, ir::Function* function, ir::Loop* loop, + ir::LoopDescriptor* loop_desc) + : function_(function), + loop_(loop), + loop_desc_(*loop_desc), + context_(context), + switch_block_(nullptr) {} + + // Returns true if the loop can be unswitched. + // Can be unswitch if: + // - The loop has no instructions that prevents it (such as barrier); + // - The loop has one conditional branch or switch that do not depends on the + // loop; + // - The loop invariant condition is uniform; + bool CanUnswitchLoop() { + if (switch_block_) return true; + if (loop_->IsSafeToClone()) return false; + + ir::CFG& cfg = *context_->cfg(); + + for (uint32_t bb_id : loop_->GetBlocks()) { + ir::BasicBlock* bb = cfg.block(bb_id); + if (bb->terminator()->IsBranch() && + bb->terminator()->opcode() != SpvOpBranch) { + if (IsConditionLoopInvariant(bb->terminator())) { + switch_block_ = bb; + break; + } + } + } + + return switch_block_; + } + + // Return the iterator to the basic block |bb|. + ir::Function::iterator FindBasicBlockPosition(ir::BasicBlock* bb_to_find) { + ir::Function::iterator it = function_->FindBlock(bb_to_find->id()); + assert(it != function_->end() && "Basic Block not found"); + return it; + } + + // Creates a new basic block and insert it into the function |fn| at the + // position |ip|. This function preserves the def/use and instr to block + // managers. + ir::BasicBlock* CreateBasicBlock(ir::Function::iterator ip) { + analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + + ir::BasicBlock* bb = &*ip.InsertBefore(std::unique_ptr( + new ir::BasicBlock(std::unique_ptr(new ir::Instruction( + context_, SpvOpLabel, 0, context_->TakeNextId(), {}))))); + bb->SetParent(function_); + def_use_mgr->AnalyzeInstDef(bb->GetLabelInst()); + context_->set_instr_block(bb->GetLabelInst(), bb); + + return bb; + } + + // Unswitches |loop_|. + void PerformUnswitch() { + assert(CanUnswitchLoop() && + "Cannot unswitch if there is not constant condition"); + assert(loop_->GetPreHeaderBlock() && "This loop has no pre-header block"); + assert(loop_->IsLCSSA() && "This loop is not in LCSSA form"); + + ir::CFG& cfg = *context_->cfg(); + DominatorTree* dom_tree = + &context_->GetDominatorAnalysis(function_, *context_->cfg()) + ->GetDomTree(); + analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + LoopUtils loop_utils(context_, loop_); + + ////////////////////////////////////////////////////////////////////////////// + // Step 1: Create the if merge block for structured modules. + // To do so, the |loop_| merge block will become the if's one and we + // create a merge for the loop. This will limit the amount of duplicated + // code the structured control flow imposes. + // For non structured program, the new loop will be connected to + // the old loop's exit blocks. + ////////////////////////////////////////////////////////////////////////////// + + // Get the merge block if it exists. + ir::BasicBlock* if_merge_block = loop_->GetMergeBlock(); + // The merge block is only created if the loop has a unique exit block. We + // have this guarantee for structured loops, for compute loop it will + // trivially help maintain both a structured-like form and LCSAA. + ir::BasicBlock* loop_merge_block = + if_merge_block + ? CreateBasicBlock(FindBasicBlockPosition(if_merge_block)) + : nullptr; + if (loop_merge_block) { + // Add the instruction and update managers. + opt::InstructionBuilder builder( + context_, loop_merge_block, + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping); + builder.AddBranch(if_merge_block->id()); + builder.SetInsertPoint(&*loop_merge_block->begin()); + cfg.RegisterBlock(loop_merge_block); + def_use_mgr->AnalyzeInstDef(loop_merge_block->GetLabelInst()); + // Update CFG. + if_merge_block->ForEachPhiInst( + [loop_merge_block, &builder, this](ir::Instruction* phi) { + ir::Instruction* cloned = phi->Clone(context_); + builder.AddInstruction(std::unique_ptr(cloned)); + phi->SetInOperand(0, {cloned->result_id()}); + phi->SetInOperand(1, {loop_merge_block->id()}); + for (uint32_t j = phi->NumInOperands() - 1; j > 1; j--) + phi->RemoveInOperand(j); + }); + // Copy the predecessor list (will get invalidated otherwise). + std::vector preds = cfg.preds(if_merge_block->id()); + for (uint32_t pid : preds) { + if (pid == loop_merge_block->id()) continue; + ir::BasicBlock* p_bb = cfg.block(pid); + p_bb->ForEachSuccessorLabel( + [if_merge_block, loop_merge_block](uint32_t* id) { + if (*id == if_merge_block->id()) *id = loop_merge_block->id(); + }); + cfg.AddEdge(pid, loop_merge_block->id()); + } + cfg.RemoveNonExistingEdges(if_merge_block->id()); + // Update loop descriptor. + if (ir::Loop* ploop = loop_->GetParent()) { + ploop->AddBasicBlock(loop_merge_block); + loop_desc_.SetBasicBlockToLoop(loop_merge_block->id(), ploop); + } + + // Update the dominator tree. + DominatorTreeNode* loop_merge_dtn = + dom_tree->GetOrInsertNode(loop_merge_block); + DominatorTreeNode* if_merge_block_dtn = + dom_tree->GetOrInsertNode(if_merge_block); + loop_merge_dtn->parent_ = if_merge_block_dtn->parent_; + loop_merge_dtn->children_.push_back(if_merge_block_dtn); + loop_merge_dtn->parent_->children_.push_back(loop_merge_dtn); + if_merge_block_dtn->parent_->children_.erase(std::find( + if_merge_block_dtn->parent_->children_.begin(), + if_merge_block_dtn->parent_->children_.end(), if_merge_block_dtn)); + + loop_->SetMergeBlock(loop_merge_block); + } + + //////////////////////////////////////////////////////////////////////////// + // Step 2: Build a new preheader for |loop_|, use the old one + // for the constant branch. + //////////////////////////////////////////////////////////////////////////// + + ir::BasicBlock* if_block = loop_->GetPreHeaderBlock(); + // If this preheader is the parent loop header, + // we need to create a dedicated block for the if. + ir::BasicBlock* loop_pre_header = + CreateBasicBlock(++FindBasicBlockPosition(if_block)); + opt::InstructionBuilder(context_, loop_pre_header, + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping) + .AddBranch(loop_->GetHeaderBlock()->id()); + + if_block->tail()->SetInOperand(0, {loop_pre_header->id()}); + + // Update loop descriptor. + if (ir::Loop* ploop = loop_desc_[if_block]) { + ploop->AddBasicBlock(loop_pre_header); + loop_desc_.SetBasicBlockToLoop(loop_pre_header->id(), ploop); + } + + // Update the CFG. + cfg.RegisterBlock(loop_pre_header); + def_use_mgr->AnalyzeInstDef(loop_pre_header->GetLabelInst()); + cfg.AddEdge(if_block->id(), loop_pre_header->id()); + cfg.RemoveNonExistingEdges(loop_->GetHeaderBlock()->id()); + + loop_->GetHeaderBlock()->ForEachPhiInst( + [loop_pre_header, if_block](ir::Instruction* phi) { + phi->ForEachInId([loop_pre_header, if_block](uint32_t* id) { + if (*id == if_block->id()) { + *id = loop_pre_header->id(); + } + }); + }); + loop_->SetPreHeaderBlock(loop_pre_header); + + // Update the dominator tree. + DominatorTreeNode* loop_pre_header_dtn = + dom_tree->GetOrInsertNode(loop_pre_header); + DominatorTreeNode* if_block_dtn = dom_tree->GetTreeNode(if_block); + loop_pre_header_dtn->parent_ = if_block_dtn; + assert( + if_block_dtn->children_.size() == 1 && + "A loop preheader should only have the header block as a child in the " + "dominator tree"); + loop_pre_header_dtn->children_.push_back(if_block_dtn->children_[0]); + if_block_dtn->children_.clear(); + if_block_dtn->children_.push_back(loop_pre_header_dtn); + + // Make domination queries valid. + dom_tree->ResetDFNumbering(); + + // Compute an ordered list of basic block to clone: loop blocks + pre-header + // + merge block. + loop_->ComputeLoopStructuredOrder(&ordered_loop_blocks_, true, true); + + ///////////////////////////// + // Do the actual unswitch: // + // - Clone the loop // + // - Connect exits // + // - Specialize the loop // + ///////////////////////////// + + ir::Instruction* iv_condition = &*switch_block_->tail(); + SpvOp iv_opcode = iv_condition->opcode(); + ir::Instruction* condition = + def_use_mgr->GetDef(iv_condition->GetOperand(0).words[0]); + + analysis::ConstantManager* cst_mgr = context_->get_constant_mgr(); + const analysis::Type* cond_type = + context_->get_type_mgr()->GetType(condition->type_id()); + + // Build the list of value for which we need to clone and specialize the + // loop. + std::vector> constant_branch; + // Special case for the original loop + ir::Instruction* original_loop_constant_value; + ir::BasicBlock* original_loop_target; + if (iv_opcode == SpvOpBranchConditional) { + constant_branch.emplace_back( + cst_mgr->GetDefiningInstruction(cst_mgr->GetConstant(cond_type, {0})), + nullptr); + original_loop_constant_value = + cst_mgr->GetDefiningInstruction(cst_mgr->GetConstant(cond_type, {1})); + } else { + // We are looking to take the default branch, so we can't provide a + // specific value. + original_loop_constant_value = nullptr; + for (uint32_t i = 2; i < iv_condition->NumInOperands(); i += 2) { + constant_branch.emplace_back( + cst_mgr->GetDefiningInstruction(cst_mgr->GetConstant( + cond_type, iv_condition->GetInOperand(i).words)), + nullptr); + } + } + + // Get the loop landing pads. + std::unordered_set if_merging_blocks; + std::function is_from_original_loop; + if (loop_->GetHeaderBlock()->GetLoopMergeInst()) { + if_merging_blocks.insert(if_merge_block->id()); + is_from_original_loop = [this](uint32_t id) { + return loop_->IsInsideLoop(id) || loop_->GetMergeBlock()->id() == id; + }; + } else { + loop_->GetExitBlocks(&if_merging_blocks); + is_from_original_loop = [this](uint32_t id) { + return loop_->IsInsideLoop(id); + }; + } + + for (auto& specialisation_pair : constant_branch) { + ir::Instruction* specialisation_value = specialisation_pair.first; + ////////////////////////////////////////////////////////// + // Step 3: Duplicate |loop_|. + ////////////////////////////////////////////////////////// + LoopUtils::LoopCloningResult clone_result; + + ir::Loop* cloned_loop = + loop_utils.CloneLoop(&clone_result, ordered_loop_blocks_); + specialisation_pair.second = cloned_loop->GetPreHeaderBlock(); + + //////////////////////////////////// + // Step 4: Specialize the loop. // + //////////////////////////////////// + + { + std::unordered_set dead_blocks; + std::unordered_set unreachable_merges; + SimplifyLoop( + ir::make_range( + ir::UptrVectorIterator( + &clone_result.cloned_bb_, clone_result.cloned_bb_.begin()), + ir::UptrVectorIterator( + &clone_result.cloned_bb_, clone_result.cloned_bb_.end())), + cloned_loop, condition, specialisation_value, &dead_blocks); + + // We tagged dead blocks, create the loop before we invalidate any basic + // block. + cloned_loop = + CleanLoopNest(cloned_loop, dead_blocks, &unreachable_merges); + CleanUpCFG( + ir::UptrVectorIterator( + &clone_result.cloned_bb_, clone_result.cloned_bb_.begin()), + dead_blocks, unreachable_merges); + + /////////////////////////////////////////////////////////// + // Step 5: Connect convergent edges to the landing pads. // + /////////////////////////////////////////////////////////// + + for (uint32_t merge_bb_id : if_merging_blocks) { + ir::BasicBlock* merge = context_->cfg()->block(merge_bb_id); + // We are in LCSSA so we only care about phi instructions. + merge->ForEachPhiInst([is_from_original_loop, &dead_blocks, + &clone_result](ir::Instruction* phi) { + uint32_t num_in_operands = phi->NumInOperands(); + for (uint32_t i = 0; i < num_in_operands; i += 2) { + uint32_t pred = phi->GetSingleWordInOperand(i + 1); + if (is_from_original_loop(pred)) { + pred = clone_result.value_map_.at(pred); + if (!dead_blocks.count(pred)) { + uint32_t incoming_value_id = phi->GetSingleWordInOperand(i); + // Not all the incoming value are coming from the loop. + ValueMapTy::iterator new_value = + clone_result.value_map_.find(incoming_value_id); + if (new_value != clone_result.value_map_.end()) { + incoming_value_id = new_value->second; + } + phi->AddOperand({SPV_OPERAND_TYPE_ID, {incoming_value_id}}); + phi->AddOperand({SPV_OPERAND_TYPE_ID, {pred}}); + } + } + } + }); + } + } + function_->AddBasicBlocks(clone_result.cloned_bb_.begin(), + clone_result.cloned_bb_.end(), + ++FindBasicBlockPosition(if_block)); + } + + // Same as above but specialize the existing loop + { + std::unordered_set dead_blocks; + std::unordered_set unreachable_merges; + SimplifyLoop(ir::make_range(function_->begin(), function_->end()), loop_, + condition, original_loop_constant_value, &dead_blocks); + + for (uint32_t merge_bb_id : if_merging_blocks) { + ir::BasicBlock* merge = context_->cfg()->block(merge_bb_id); + // LCSSA, so we only care about phi instructions. + // If we the phi is reduced to a single incoming branch, do not + // propagate it to preserve LCSSA. + PatchPhis(merge, dead_blocks, true); + } + if (if_merge_block) { + bool has_live_pred = false; + for (uint32_t pid : cfg.preds(if_merge_block->id())) { + if (!dead_blocks.count(pid)) { + has_live_pred = true; + break; + } + } + if (!has_live_pred) unreachable_merges.insert(if_merge_block->id()); + } + original_loop_target = loop_->GetPreHeaderBlock(); + // We tagged dead blocks, prune the loop descriptor from any dead loops. + // After this call, |loop_| can be nullptr (i.e. the unswitch killed this + // loop). + loop_ = CleanLoopNest(loop_, dead_blocks, &unreachable_merges); + + CleanUpCFG(function_->begin(), dead_blocks, unreachable_merges); + } + + ///////////////////////////////////// + // Finally: connect the new loops. // + ///////////////////////////////////// + + // Delete the old jump + context_->KillInst(&*if_block->tail()); + opt::InstructionBuilder builder(context_, if_block); + if (iv_opcode == SpvOpBranchConditional) { + assert(constant_branch.size() == 1); + builder.AddConditionalBranch( + condition->result_id(), original_loop_target->id(), + constant_branch[0].second->id(), + if_merge_block ? if_merge_block->id() : kInvalidId); + } else { + std::vector, uint32_t>> targets; + for (auto& t : constant_branch) { + targets.emplace_back(t.first->GetInOperand(0).words, t.second->id()); + } + + builder.AddSwitch(condition->result_id(), original_loop_target->id(), + targets, + if_merge_block ? if_merge_block->id() : kInvalidId); + } + + switch_block_ = nullptr; + ordered_loop_blocks_.clear(); + + context_->InvalidateAnalysesExceptFor( + ir::IRContext::Analysis::kAnalysisLoopAnalysis); + } + + // Returns true if the unswitch killed the original |loop_|. + bool WasLoopKilled() const { return loop_ == nullptr; } + + private: + using ValueMapTy = std::unordered_map; + using BlockMapTy = std::unordered_map; + + ir::Function* function_; + ir::Loop* loop_; + ir::LoopDescriptor& loop_desc_; + ir::IRContext* context_; + + ir::BasicBlock* switch_block_; + // Map between instructions and if they are dynamically uniform. + std::unordered_map dynamically_uniform_; + // The loop basic blocks in structured order. + std::vector ordered_loop_blocks_; + + // Returns the next usable id for the context. + uint32_t TakeNextId() { return context_->TakeNextId(); } + + // Patches |bb|'s phi instruction by removing incoming value from unexisting + // or tagged as dead branches. + void PatchPhis(ir::BasicBlock* bb, + const std::unordered_set& dead_blocks, + bool preserve_phi) { + ir::CFG& cfg = *context_->cfg(); + + std::vector phi_to_kill; + const std::vector& bb_preds = cfg.preds(bb->id()); + auto is_branch_dead = [&bb_preds, &dead_blocks](uint32_t id) { + return dead_blocks.count(id) || + std::find(bb_preds.begin(), bb_preds.end(), id) == bb_preds.end(); + }; + bb->ForEachPhiInst([&phi_to_kill, &is_branch_dead, preserve_phi, + this](ir::Instruction* insn) { + uint32_t i = 0; + while (i < insn->NumInOperands()) { + uint32_t incoming_id = insn->GetSingleWordInOperand(i + 1); + if (is_branch_dead(incoming_id)) { + // Remove the incoming block id operand. + insn->RemoveInOperand(i + 1); + // Remove the definition id operand. + insn->RemoveInOperand(i); + continue; + } + i += 2; + } + // If there is only 1 remaining edge, propagate the value and + // kill the instruction. + if (insn->NumInOperands() == 2 && !preserve_phi) { + phi_to_kill.push_back(insn); + context_->ReplaceAllUsesWith(insn->result_id(), + insn->GetSingleWordInOperand(0)); + } + }); + for (ir::Instruction* insn : phi_to_kill) { + context_->KillInst(insn); + } + } + + // Removes any block that is tagged as dead, if the block is in + // |unreachable_merges| then all block's instructions are replaced by a + // OpUnreachable. + void CleanUpCFG(ir::UptrVectorIterator bb_it, + const std::unordered_set& dead_blocks, + const std::unordered_set& unreachable_merges) { + ir::CFG& cfg = *context_->cfg(); + + while (bb_it != bb_it.End()) { + ir::BasicBlock& bb = *bb_it; + + if (unreachable_merges.count(bb.id())) { + if (bb.begin() != bb.tail() || + bb.terminator()->opcode() != SpvOpUnreachable) { + // Make unreachable, but leave the label. + bb.KillAllInsts(false); + opt::InstructionBuilder(context_, &bb).AddUnreachable(); + cfg.RemoveNonExistingEdges(bb.id()); + } + ++bb_it; + } else if (dead_blocks.count(bb.id())) { + cfg.ForgetBlock(&bb); + // Kill this block. + bb.KillAllInsts(true); + bb_it = bb_it.Erase(); + } else { + cfg.RemoveNonExistingEdges(bb.id()); + ++bb_it; + } + } + } + + // Return true if |c_inst| is a Boolean constant and set |cond_val| with the + // value that |c_inst| + bool GetConstCondition(const ir::Instruction* c_inst, bool* cond_val) { + bool cond_is_const; + switch (c_inst->opcode()) { + case SpvOpConstantFalse: { + *cond_val = false; + cond_is_const = true; + } break; + case SpvOpConstantTrue: { + *cond_val = true; + cond_is_const = true; + } break; + default: { cond_is_const = false; } break; + } + return cond_is_const; + } + + // Simplifies |loop| assuming the instruction |to_version_insn| takes the + // value |cst_value|. |block_range| is an iterator range returning the loop + // basic blocks in a structured order (dominator first). + // The function will ignore basic blocks returned by |block_range| if they + // does not belong to the loop. + // The set |dead_blocks| will contain all the dead basic blocks. + // + // Requirements: + // - |loop| must be in the LCSSA form; + // - |cst_value| must be constant or null (to represent the default target + // of an OpSwitch). + void SimplifyLoop( + ir::IteratorRange> block_range, + ir::Loop* loop, ir::Instruction* to_version_insn, + ir::Instruction* cst_value, std::unordered_set* dead_blocks) { + ir::CFG& cfg = *context_->cfg(); + analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + + std::function ignore_node; + ignore_node = [loop](uint32_t bb_id) { return !loop->IsInsideLoop(bb_id); }; + + std::vector> use_list; + def_use_mgr->ForEachUse( + to_version_insn, [&use_list, &ignore_node, this]( + ir::Instruction* inst, uint32_t operand_index) { + ir::BasicBlock* bb = context_->get_instr_block(inst); + + if (!bb || ignore_node(bb->id())) { + // Out of the loop, the specialization does not apply any more. + return; + } + use_list.emplace_back(inst, operand_index); + }); + + // First pass: inject the specialized value into the loop (and only the + // loop). + for (auto use : use_list) { + ir::Instruction* inst = use.first; + uint32_t operand_index = use.second; + ir::BasicBlock* bb = context_->get_instr_block(inst); + + // If it is not a branch, simply inject the value. + if (!inst->IsBranch()) { + // To also handle switch, cst_value can be nullptr: this case + // means that we are looking to branch to the default target of + // the switch. We don't actually know its value so we don't touch + // it if it not a switch. + if (cst_value) { + inst->SetOperand(operand_index, {cst_value->result_id()}); + def_use_mgr->AnalyzeInstUse(inst); + } + } + + // The user is a branch, kill dead branches. + uint32_t live_target = 0; + std::unordered_set dead_branches; + switch (inst->opcode()) { + case SpvOpBranchConditional: { + assert(cst_value && "No constant value to specialize !"); + bool branch_cond = false; + if (GetConstCondition(cst_value, &branch_cond)) { + uint32_t true_label = + inst->GetSingleWordInOperand(kBranchCondTrueLabIdInIdx); + uint32_t false_label = + inst->GetSingleWordInOperand(kBranchCondFalseLabIdInIdx); + live_target = branch_cond ? true_label : false_label; + uint32_t dead_target = !branch_cond ? true_label : false_label; + cfg.RemoveEdge(bb->id(), dead_target); + } + break; + } + case SpvOpSwitch: { + live_target = inst->GetSingleWordInOperand(1); + if (cst_value) { + if (!cst_value->IsConstant()) break; + const ir::Operand& cst = cst_value->GetInOperand(0); + for (uint32_t i = 2; i < inst->NumInOperands(); i += 2) { + const ir::Operand& literal = inst->GetInOperand(i); + if (literal == cst) { + live_target = inst->GetSingleWordInOperand(i + 1); + break; + } + } + } + for (uint32_t i = 1; i < inst->NumInOperands(); i += 2) { + uint32_t id = inst->GetSingleWordInOperand(i); + if (id != live_target) { + cfg.RemoveEdge(bb->id(), id); + } + } + } + default: + break; + } + if (live_target != 0) { + // Check for the presence of the merge block. + if (ir::Instruction* merge = bb->GetMergeInst()) + context_->KillInst(merge); + context_->KillInst(&*bb->tail()); + opt::InstructionBuilder builder( + context_, bb, + ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping); + builder.AddBranch(live_target); + } + } + + // Go through the loop basic block and tag all blocks that are obviously + // dead. + std::unordered_set visited; + for (ir::BasicBlock& bb : block_range) { + if (ignore_node(bb.id())) continue; + visited.insert(bb.id()); + + // Check if this block is dead, if so tag it as dead otherwise patch phi + // instructions. + bool has_live_pred = false; + for (uint32_t pid : cfg.preds(bb.id())) { + if (!dead_blocks->count(pid)) { + has_live_pred = true; + break; + } + } + if (!has_live_pred) { + dead_blocks->insert(bb.id()); + const ir::BasicBlock& cbb = bb; + // Patch the phis for any back-edge. + cbb.ForEachSuccessorLabel( + [dead_blocks, &visited, &cfg, this](uint32_t id) { + if (!visited.count(id) || dead_blocks->count(id)) return; + ir::BasicBlock* succ = cfg.block(id); + PatchPhis(succ, *dead_blocks, false); + }); + continue; + } + // Update the phi instructions, some incoming branch have/will disappear. + PatchPhis(&bb, *dead_blocks, /* preserve_phi = */ false); + } + } + + // Returns true if the header is not reachable or tagged as dead or if we + // never loop back. + bool IsLoopDead(ir::BasicBlock* header, ir::BasicBlock* latch, + const std::unordered_set& dead_blocks) { + if (!header || dead_blocks.count(header->id())) return true; + if (!latch || dead_blocks.count(latch->id())) return true; + for (uint32_t pid : context_->cfg()->preds(header->id())) { + if (!dead_blocks.count(pid)) { + // Seems reachable. + return false; + } + } + return true; + } + + // Cleans the loop nest under |loop| and reflect changes to the loop + // descriptor. This will kill all descriptors that represent dead loops. + // If |loop_| is killed, it will be set to nullptr. + // Any merge blocks that become unreachable will be added to + // |unreachable_merges|. + // The function returns the pointer to |loop| or nullptr if the loop was + // killed. + ir::Loop* CleanLoopNest(ir::Loop* loop, + const std::unordered_set& dead_blocks, + std::unordered_set* unreachable_merges) { + // This represent the pair of dead loop and nearest alive parent (nullptr if + // no parent). + std::unordered_map dead_loops; + auto get_parent = [&dead_loops](ir::Loop* l) -> ir::Loop* { + std::unordered_map::iterator it = + dead_loops.find(l); + if (it != dead_loops.end()) return it->second; + return nullptr; + }; + + bool is_main_loop_dead = + IsLoopDead(loop->GetHeaderBlock(), loop->GetLatchBlock(), dead_blocks); + if (is_main_loop_dead) { + if (ir::Instruction* merge = loop->GetHeaderBlock()->GetLoopMergeInst()) { + context_->KillInst(merge); + } + dead_loops[loop] = loop->GetParent(); + } else + dead_loops[loop] = loop; + // For each loop, check if we killed it. If we did, find a suitable parent + // for its children. + for (ir::Loop& sub_loop : + ir::make_range(++opt::TreeDFIterator(loop), + opt::TreeDFIterator())) { + if (IsLoopDead(sub_loop.GetHeaderBlock(), sub_loop.GetLatchBlock(), + dead_blocks)) { + if (ir::Instruction* merge = + sub_loop.GetHeaderBlock()->GetLoopMergeInst()) { + context_->KillInst(merge); + } + dead_loops[&sub_loop] = get_parent(&sub_loop); + } else { + // The loop is alive, check if its merge block is dead, if it is, tag it + // as required. + if (sub_loop.GetMergeBlock()) { + uint32_t merge_id = sub_loop.GetMergeBlock()->id(); + if (dead_blocks.count(merge_id)) { + unreachable_merges->insert(sub_loop.GetMergeBlock()->id()); + } + } + } + } + if (!is_main_loop_dead) dead_loops.erase(loop); + + // Remove dead blocks from live loops. + for (uint32_t bb_id : dead_blocks) { + ir::Loop* l = loop_desc_[bb_id]; + if (l) { + l->RemoveBasicBlock(bb_id); + loop_desc_.ForgetBasicBlock(bb_id); + } + } + + std::for_each( + dead_loops.begin(), dead_loops.end(), + [&loop, this]( + std::unordered_map::iterator::reference it) { + if (it.first == loop) loop = nullptr; + loop_desc_.RemoveLoop(it.first); + }); + + return loop; + } + + // Returns true if |var| is dynamically uniform. + // Note: this is currently approximated as uniform. + bool IsDynamicallyUniform(ir::Instruction* var, const ir::BasicBlock* entry, + const DominatorTree& post_dom_tree) { + assert(post_dom_tree.IsPostDominator()); + analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + + auto it = dynamically_uniform_.find(var->result_id()); + + if (it != dynamically_uniform_.end()) return it->second; + + analysis::DecorationManager* dec_mgr = context_->get_decoration_mgr(); + + bool& is_uniform = dynamically_uniform_[var->result_id()]; + is_uniform = false; + + dec_mgr->WhileEachDecoration(var->result_id(), SpvDecorationUniform, + [&is_uniform](const ir::Instruction&) { + is_uniform = true; + return false; + }); + if (is_uniform) { + return is_uniform; + } + + ir::BasicBlock* parent = context_->get_instr_block(var); + if (!parent) { + return is_uniform = true; + } + + if (!post_dom_tree.Dominates(parent->id(), entry->id())) { + return is_uniform = false; + } + if (var->opcode() == SpvOpLoad) { + const uint32_t PtrTypeId = + def_use_mgr->GetDef(var->GetSingleWordInOperand(0))->type_id(); + const ir::Instruction* PtrTypeInst = def_use_mgr->GetDef(PtrTypeId); + uint32_t storage_class = + PtrTypeInst->GetSingleWordInOperand(kTypePointerStorageClassInIdx); + if (storage_class != SpvStorageClassUniform && + storage_class != SpvStorageClassUniformConstant) { + return is_uniform = false; + } + } else { + if (!context_->IsCombinatorInstruction(var)) { + return is_uniform = false; + } + } + + return is_uniform = var->WhileEachInId([entry, &post_dom_tree, + this](const uint32_t* id) { + return IsDynamicallyUniform(context_->get_def_use_mgr()->GetDef(*id), + entry, post_dom_tree); + }); + } + + // Returns true if |insn| is constant and dynamically uniform within the loop. + bool IsConditionLoopInvariant(ir::Instruction* insn) { + assert(insn->IsBranch()); + assert(insn->opcode() != SpvOpBranch); + analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + + ir::Instruction* condition = + def_use_mgr->GetDef(insn->GetOperand(0).words[0]); + return !loop_->IsInsideLoop(condition) && + IsDynamicallyUniform( + condition, function_->entry().get(), + context_->GetPostDominatorAnalysis(function_, *context_->cfg()) + ->GetDomTree()); + } +}; + +} // namespace + +Pass::Status LoopUnswitchPass::Process(ir::IRContext* c) { + InitializeProcessing(c); + + bool modified = false; + ir::Module* module = c->module(); + + // Process each function in the module + for (ir::Function& f : *module) { + modified |= ProcessFunction(&f); + } + + return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; +} + +bool LoopUnswitchPass::ProcessFunction(ir::Function* f) { + bool modified = false; + std::unordered_set processed_loop; + + ir::LoopDescriptor& loop_descriptor = *context()->GetLoopDescriptor(f); + + bool loop_changed = true; + while (loop_changed) { + loop_changed = false; + for (ir::Loop& loop : + ir::make_range(++opt::TreeDFIterator( + loop_descriptor.GetDummyRootLoop()), + opt::TreeDFIterator())) { + if (processed_loop.count(&loop)) continue; + processed_loop.insert(&loop); + + LoopUnswitch unswitcher(context(), f, &loop, &loop_descriptor); + while (!unswitcher.WasLoopKilled() && unswitcher.CanUnswitchLoop()) { + if (!loop.IsLCSSA()) { + LoopUtils(context(), &loop).MakeLoopClosedSSA(); + } + modified = true; + loop_changed = true; + unswitcher.PerformUnswitch(); + } + if (loop_changed) break; + } + } + + return modified; +} + +} // namespace opt +} // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_unswitch_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_unswitch_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_unswitch_pass.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_unswitch_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,43 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#ifndef LIBSPIRV_OPT_LOOP_UNSWITCH_PASS_H_ +#define LIBSPIRV_OPT_LOOP_UNSWITCH_PASS_H_ + +#include "opt/loop_descriptor.h" +#include "opt/pass.h" + +namespace spvtools { +namespace opt { + +// Implements the loop unswitch optimization. +// The loop unswitch hoists invariant "if" statements if the conditions are +// constant within the loop and clones the loop for each branch. +class LoopUnswitchPass : public Pass { + public: + const char* name() const override { return "loop-unswitch"; } + + // Processes the given |module|. Returns Status::Failure if errors occur when + // processing. Returns the corresponding Status::Success if processing is + // succesful to indicate whether changes have been made to the modue. + Pass::Status Process(ir::IRContext* context) override; + + private: + bool ProcessFunction(ir::Function* f); +}; + +} // namespace opt +} // namespace spvtools + +#endif // !LIBSPIRV_OPT_LOOP_UNSWITCH_PASS_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_utils.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_utils.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_utils.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_utils.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -18,6 +18,7 @@ #include #include +#include "cfa.h" #include "opt/cfg.h" #include "opt/ir_builder.h" #include "opt/ir_context.h" @@ -331,7 +332,7 @@ // Gathers the set of basic block that are not in this loop and have at least // one predecessor in the loop and one not in the loop. std::unordered_set exit_bb_set; - loop_->GetExitBlocks(context_, &exit_bb_set); + loop_->GetExitBlocks(&exit_bb_set); std::unordered_set new_loop_exits; bool made_change = false; @@ -448,7 +449,7 @@ std::unordered_set exit_bb; { std::unordered_set exit_bb_id; - loop_->GetExitBlocks(context_, &exit_bb_id); + loop_->GetExitBlocks(&exit_bb_id); for (uint32_t bb_id : exit_bb_id) { exit_bb.insert(cfg.block(bb_id)); } @@ -463,7 +464,7 @@ // further than the merge block. if (loop_->GetMergeBlock()) { std::unordered_set merging_bb_id; - loop_->GetMergingBlocks(context_, &merging_bb_id); + loop_->GetMergingBlocks(&merging_bb_id); merging_bb_id.erase(loop_->GetMergeBlock()->id()); // Reset the exit set, now only the merge block is the exit. exit_bb.clear(); @@ -481,5 +482,121 @@ ir::IRContext::Analysis::kAnalysisLoopAnalysis); } +ir::Loop* LoopUtils::CloneLoop( + LoopCloningResult* cloning_result, + const std::vector& ordered_loop_blocks) const { + analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + + std::unique_ptr new_loop = MakeUnique(context_); + if (loop_->HasParent()) new_loop->SetParent(loop_->GetParent()); + + ir::CFG& cfg = *context_->cfg(); + + // Clone and place blocks in a SPIR-V compliant order (dominators first). + for (ir::BasicBlock* old_bb : ordered_loop_blocks) { + // For each basic block in the loop, we clone it and register the mapping + // between old and new ids. + ir::BasicBlock* new_bb = old_bb->Clone(context_); + new_bb->SetParent(&function_); + new_bb->GetLabelInst()->SetResultId(context_->TakeNextId()); + def_use_mgr->AnalyzeInstDef(new_bb->GetLabelInst()); + context_->set_instr_block(new_bb->GetLabelInst(), new_bb); + cloning_result->cloned_bb_.emplace_back(new_bb); + + cloning_result->old_to_new_bb_[old_bb->id()] = new_bb; + cloning_result->new_to_old_bb_[new_bb->id()] = old_bb; + cloning_result->value_map_[old_bb->id()] = new_bb->id(); + + if (loop_->IsInsideLoop(old_bb)) new_loop->AddBasicBlock(new_bb); + + for (auto& inst : *new_bb) { + if (inst.HasResultId()) { + uint32_t old_result_id = inst.result_id(); + inst.SetResultId(context_->TakeNextId()); + cloning_result->value_map_[old_result_id] = inst.result_id(); + + // Only look at the defs for now, uses are not updated yet. + def_use_mgr->AnalyzeInstDef(&inst); + } + } + } + + // All instructions (including all labels) have been cloned, + // remap instruction operands id with the new ones. + for (std::unique_ptr& bb_ref : cloning_result->cloned_bb_) { + ir::BasicBlock* bb = bb_ref.get(); + + for (ir::Instruction& insn : *bb) { + insn.ForEachInId([cloning_result](uint32_t* old_id) { + // If the operand is defined in the loop, remap the id. + auto id_it = cloning_result->value_map_.find(*old_id); + if (id_it != cloning_result->value_map_.end()) { + *old_id = id_it->second; + } + }); + // Only look at what the instruction uses. All defs are register, so all + // should be fine now. + def_use_mgr->AnalyzeInstUse(&insn); + context_->set_instr_block(&insn, bb); + } + cfg.RegisterBlock(bb); + } + + PopulateLoopNest(new_loop.get(), *cloning_result); + + return new_loop.release(); +} + +void LoopUtils::PopulateLoopNest( + ir::Loop* new_loop, const LoopCloningResult& cloning_result) const { + std::unordered_map loop_mapping; + loop_mapping[loop_] = new_loop; + + if (loop_->HasParent()) loop_->GetParent()->AddNestedLoop(new_loop); + PopulateLoopDesc(new_loop, loop_, cloning_result); + + for (ir::Loop& sub_loop : + ir::make_range(++opt::TreeDFIterator(loop_), + opt::TreeDFIterator())) { + ir::Loop* cloned = new ir::Loop(context_); + if (ir::Loop* parent = loop_mapping[sub_loop.GetParent()]) + parent->AddNestedLoop(cloned); + loop_mapping[&sub_loop] = cloned; + PopulateLoopDesc(cloned, &sub_loop, cloning_result); + } + + loop_desc_->AddLoopNest(std::unique_ptr(new_loop)); +} + +// Populates |new_loop| descriptor according to |old_loop|'s one. +void LoopUtils::PopulateLoopDesc( + ir::Loop* new_loop, ir::Loop* old_loop, + const LoopCloningResult& cloning_result) const { + for (uint32_t bb_id : old_loop->GetBlocks()) { + ir::BasicBlock* bb = cloning_result.old_to_new_bb_.at(bb_id); + new_loop->AddBasicBlock(bb); + } + new_loop->SetHeaderBlock( + cloning_result.old_to_new_bb_.at(old_loop->GetHeaderBlock()->id())); + if (old_loop->GetLatchBlock()) + new_loop->SetLatchBlock( + cloning_result.old_to_new_bb_.at(old_loop->GetLatchBlock()->id())); + if (old_loop->GetMergeBlock()) { + auto it = + cloning_result.old_to_new_bb_.find(old_loop->GetMergeBlock()->id()); + ir::BasicBlock* bb = it != cloning_result.old_to_new_bb_.end() + ? it->second + : old_loop->GetMergeBlock(); + new_loop->SetMergeBlock(bb); + } + if (old_loop->GetPreHeaderBlock()) { + auto it = + cloning_result.old_to_new_bb_.find(old_loop->GetPreHeaderBlock()->id()); + if (it != cloning_result.old_to_new_bb_.end()) { + new_loop->SetPreHeaderBlock(it->second); + } + } +} + } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_utils.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_utils.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/loop_utils.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/loop_utils.h 2018-04-27 11:46:32.000000000 +0000 @@ -12,26 +12,47 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef LIBSPIRV_OPT_LOOP_UTILS_H_ -#define LIBSPIRV_OPT_LOOP_UTILS_H_ +#ifndef SOURCE_OPT_LOOP_UTILS_H_ +#define SOURCE_OPT_LOOP_UTILS_H_ +#include +#include +#include +#include "opt/ir_context.h" +#include "opt/loop_descriptor.h" namespace spvtools { -namespace ir { -class Loop; -class IRContext; -} // namespace ir - namespace opt { -// Set of basic loop transformation. +// LoopUtils is used to encapsulte loop optimizations and from the passes which +// use them. Any pass which needs a loop optimization should do it through this +// or through a pass which is using this. class LoopUtils { public: + // Holds a auxiliary results of the loop cloning procedure. + struct LoopCloningResult { + using ValueMapTy = std::unordered_map; + using BlockMapTy = std::unordered_map; + + // Mapping between the original loop ids and the new one. + ValueMapTy value_map_; + // Mapping between original loop blocks to the cloned one. + BlockMapTy old_to_new_bb_; + // Mapping between the cloned loop blocks to original one. + BlockMapTy new_to_old_bb_; + // List of cloned basic block. + std::vector> cloned_bb_; + }; + LoopUtils(ir::IRContext* context, ir::Loop* loop) - : context_(context), loop_(loop) {} + : context_(context), + loop_desc_( + context->GetLoopDescriptor(loop->GetHeaderBlock()->GetParent())), + loop_(loop), + function_(*loop_->GetHeaderBlock()->GetParent()) {} - // The make the current loop in the loop closed SSA form. - // In the loop closed SSA, all loop exiting values goes through a dedicate SSA + // The converts the current loop to loop closed SSA form. + // In the loop closed SSA, all loop exiting values go through a dedicated Phi // instruction. For instance: // // for (...) { @@ -64,12 +85,74 @@ // Preserves: CFG, def/use and instruction to block mapping. void CreateLoopDedicatedExits(); + // Clone |loop_| and remap its instructions. Newly created blocks + // will be added to the |cloning_result.cloned_bb_| list, correctly ordered to + // be inserted into a function. + // It is assumed that |ordered_loop_blocks| is compatible with the result of + // |Loop::ComputeLoopStructuredOrder|. If the preheader and merge block are in + // the list they will also be cloned. If not, the resulting loop will share + // them with the original loop. + // The function preserves the def/use, cfg and instr to block analyses. + // The cloned loop nest will be added to the loop descriptor and will have + // ownership. + ir::Loop* CloneLoop( + LoopCloningResult* cloning_result, + const std::vector& ordered_loop_blocks) const; + + // Perfom a partial unroll of |loop| by given |factor|. This will copy the + // body of the loop |factor| times. So a |factor| of one would give a new loop + // with the original body plus one unrolled copy body. + bool PartiallyUnroll(size_t factor); + + // Fully unroll |loop|. + bool FullyUnroll(); + + // This function validates that |loop| meets the assumptions made by the + // implementation of the loop unroller. As the implementation accommodates + // more types of loops this function can reduce its checks. + // + // The conditions checked to ensure the loop can be unrolled are as follows: + // 1. That the loop is in structured order. + // 2. That the continue block is a branch to the header. + // 3. That the only phi used in the loop is the induction variable. + // TODO(stephen@codeplay.com): This is a temporary mesure, after the loop is + // converted into LCSAA form and has a single entry and exit we can rewrite + // the other phis. + // 4. That this is an inner most loop, or that loops contained within this + // loop have already been fully unrolled. + // 5. That each instruction in the loop is only used within the loop. + // (Related to the above phi condition). + bool CanPerformUnroll(); + + // Maintains the loop descriptor object after the unroll functions have been + // called, otherwise the analysis should be invalidated. + void Finalize(); + + // Returns the context associate to |loop_|. + ir::IRContext* GetContext() { return context_; } + // Returns the loop descriptor owning |loop_|. + ir::LoopDescriptor* GetLoopDescriptor() { return loop_desc_; } + // Returns the loop on which the object operates on. + ir::Loop* GetLoop() const { return loop_; } + // Returns the function that |loop_| belong to. + ir::Function* GetFunction() const { return &function_; } + private: ir::IRContext* context_; + ir::LoopDescriptor* loop_desc_; ir::Loop* loop_; + ir::Function& function_; + + // Populates the loop nest of |new_loop| according to |loop_| nest. + void PopulateLoopNest(ir::Loop* new_loop, + const LoopCloningResult& cloning_result) const; + + // Populates |new_loop| descriptor according to |old_loop|'s one. + void PopulateLoopDesc(ir::Loop* new_loop, ir::Loop* old_loop, + const LoopCloningResult& cloning_result) const; }; } // namespace opt } // namespace spvtools -#endif // LIBSPIRV_OPT_LOOP_UTILS_H_ +#endif // SOURCE_OPT_LOOP_UTILS_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/mem_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/mem_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/mem_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/mem_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -18,6 +18,7 @@ #include "basic_block.h" #include "cfa.h" +#include "dominator_analysis.h" #include "ir_context.h" #include "iterator.h" @@ -27,9 +28,7 @@ namespace { const uint32_t kCopyObjectOperandInIdx = 0; -const uint32_t kLoadPtrIdInIdx = 0; const uint32_t kLoopMergeMergeBlockIdInIdx = 0; -const uint32_t kStorePtrIdInIdx = 0; const uint32_t kStoreValIdInIdx = 1; const uint32_t kTypePointerStorageClassInIdx = 0; const uint32_t kTypePointerTypeIdInIdx = 1; @@ -118,10 +117,11 @@ } ir::Instruction* MemPass::GetPtr(ir::Instruction* ip, uint32_t* varId) { - const SpvOp op = ip->opcode(); - assert(op == SpvOpStore || op == SpvOpLoad); - const uint32_t ptrId = ip->GetSingleWordInOperand( - op == SpvOpStore ? kStorePtrIdInIdx : kLoadPtrIdInIdx); + assert(ip->opcode() == SpvOpStore || ip->opcode() == SpvOpLoad || + ip->opcode() == SpvOpImageTexelPointer); + + // All of these opcode place the pointer in position 0. + const uint32_t ptrId = ip->GetSingleWordInOperand(0); return GetPtr(ptrId, varId); } @@ -136,11 +136,7 @@ } void MemPass::KillAllInsts(ir::BasicBlock* bp, bool killLabel) { - bp->ForEachInst([this, killLabel](ir::Instruction* ip) { - if (killLabel || ip->opcode() != SpvOpLabel) { - context()->KillInst(ip); - } - }); + bp->KillAllInsts(killLabel); } bool MemPass::HasLoads(uint32_t varId) const { @@ -221,8 +217,10 @@ // For all operands with no remaining uses, add their instruction // to the dead instruction queue. for (auto id : ids) - if (HasOnlyNamesAndDecorates(id)) - deadInsts.push(get_def_use_mgr()->GetDef(id)); + if (HasOnlyNamesAndDecorates(id)) { + ir::Instruction* odi = get_def_use_mgr()->GetDef(id); + if (context()->IsCombinatorInstruction(odi)) deadInsts.push(odi); + } // if a load was deleted and it was the variable's // last load, add all its stores to dead queue if (varId != 0 && !IsLiveVar(varId)) AddStores(varId, &deadInsts); @@ -246,33 +244,11 @@ void MemPass::InitSSARewrite(ir::Function* func) { // Clear collections. - seen_target_vars_.clear(); - seen_non_target_vars_.clear(); visitedBlocks_.clear(); - type2undefs_.clear(); - supported_ref_vars_.clear(); - label2ssa_map_.clear(); + block_defs_map_.clear(); phis_to_patch_.clear(); - - // Collect target (and non-) variable sets. Remove variables with - // non-load/store refs from target variable set - for (auto& blk : *func) { - for (auto& inst : blk) { - switch (inst.opcode()) { - case SpvOpStore: - case SpvOpLoad: { - uint32_t varId; - (void)GetPtr(&inst, &varId); - if (!IsTargetVar(varId)) break; - if (HasOnlySupportedRefs(varId)) break; - seen_non_target_vars_.insert(varId); - seen_target_vars_.erase(varId); - } break; - default: - break; - } - } - } + dominator_ = context()->GetDominatorAnalysis(func, *cfg()); + CollectTargetVars(func); } bool MemPass::IsLiveAfter(uint32_t var_id, uint32_t label) const { @@ -285,14 +261,6 @@ return true; } -void MemPass::SSABlockInitSinglePred(ir::BasicBlock* block_ptr) { - // Copy map entry from single predecessor - const uint32_t label = block_ptr->id(); - const uint32_t predLabel = cfg()->preds(label).front(); - assert(visitedBlocks_.find(predLabel) != visitedBlocks_.end()); - label2ssa_map_[label] = label2ssa_map_[predLabel]; -} - uint32_t MemPass::Type2Undef(uint32_t type_id) { const auto uitr = type2undefs_.find(type_id); if (uitr != type2undefs_.end()) return uitr->second; @@ -305,8 +273,38 @@ return undefId; } -void MemPass::SSABlockInitLoopHeader( +void MemPass::CollectLiveVars(uint32_t block_label, + std::map* live_vars) { + // Walk up the dominator chain starting at |block_label| looking for variables + // defined at each block in the chain. Since we are only interested for the + // most recent value for each live variable, we only add a + // pair to |live_vars| if this is the first time we find the variable in the + // chain. + for (ir::BasicBlock* block = cfg()->block(block_label); block != nullptr; + block = dominator_->ImmediateDominator(block)) { + for (const auto& var_val : block_defs_map_[block->id()]) { + auto live_vars_it = live_vars->find(var_val.first); + if (live_vars_it == live_vars->end()) live_vars->insert(var_val); + } + } +} + +uint32_t MemPass::GetCurrentValue(uint32_t var_id, uint32_t block_label) { + // Walk up the dominator chain starting at |block_label| looking for the + // current value of variable |var_id|. The first block we find containing a + // definition for |var_id| is the one we are interested in. + for (ir::BasicBlock* block = cfg()->block(block_label); block != nullptr; + block = dominator_->ImmediateDominator(block)) { + const auto& block_defs = block_defs_map_[block->id()]; + const auto& var_val_it = block_defs.find(var_id); + if (var_val_it != block_defs.end()) return var_val_it->second; + } + return 0; +} + +bool MemPass::SSABlockInitLoopHeader( std::list::iterator block_itr) { + bool modified = false; const uint32_t label = (*block_itr)->id(); // Determine the back-edge label. @@ -332,11 +330,9 @@ // platforms. std::map liveVars; for (uint32_t predLabel : cfg()->preds(label)) { - for (auto var_val : label2ssa_map_[predLabel]) { - uint32_t varId = var_val.first; - liveVars[varId] = var_val.second; - } + CollectLiveVars(predLabel, &liveVars); } + // Add all stored variables in loop. Set their default value id to zero. for (auto bi = block_itr; (*bi)->id() != mergeLabel; ++bi) { ir::BasicBlock* bp = *bi; @@ -367,13 +363,13 @@ for (uint32_t predLabel : cfg()->preds(label)) { // Skip back edge predecessor. if (predLabel == backLabel) continue; - const auto var_val_itr = label2ssa_map_[predLabel].find(varId); + uint32_t current_value = GetCurrentValue(varId, predLabel); // Missing (undef) values always cause difference with (defined) value - if (var_val_itr == label2ssa_map_[predLabel].end()) { + if (current_value == 0) { needsPhi = true; break; } - if (var_val_itr->second != val0Id) { + if (current_value != val0Id) { needsPhi = true; break; } @@ -384,7 +380,7 @@ // If val is the same for all predecessors, enter it in map if (!needsPhi) { - label2ssa_map_[label].insert(var_val); + block_defs_map_[label].insert(var_val); continue; } @@ -393,6 +389,7 @@ // use the variable id. We will patch this after visiting back // edge predecessor. For predecessors that do not define a value, // use undef. + modified = true; std::vector phi_in_operands; uint32_t typeId = GetPointeeTypeId(get_def_use_mgr()->GetDef(varId)); for (uint32_t predLabel : cfg()->preds(label)) { @@ -400,11 +397,11 @@ if (predLabel == backLabel) { valId = varId; } else { - const auto var_val_itr = label2ssa_map_[predLabel].find(varId); - if (var_val_itr == label2ssa_map_[predLabel].end()) + uint32_t current_value = GetCurrentValue(varId, predLabel); + if (current_value == 0) valId = Type2Undef(typeId); else - valId = var_val_itr->second; + valId = current_value; } phi_in_operands.push_back( {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {valId}}); @@ -422,11 +419,13 @@ context()->set_instr_block(&*newPhi, *block_itr); insertItr = insertItr.InsertBefore(std::move(newPhi)); ++insertItr; - label2ssa_map_[label].insert({varId, phiId}); + block_defs_map_[label].insert({varId, phiId}); } + return modified; } -void MemPass::SSABlockInitMultiPred(ir::BasicBlock* block_ptr) { +bool MemPass::SSABlockInitMultiPred(ir::BasicBlock* block_ptr) { + bool modified = false; const uint32_t label = block_ptr->id(); // Collect all live variables and a default value for each across all // predecesors. Must be ordered map because phis are generated based on @@ -434,11 +433,9 @@ std::map liveVars; for (uint32_t predLabel : cfg()->preds(label)) { assert(visitedBlocks_.find(predLabel) != visitedBlocks_.end()); - for (auto var_val : label2ssa_map_[predLabel]) { - const uint32_t varId = var_val.first; - liveVars[varId] = var_val.second; - } + CollectLiveVars(predLabel, &liveVars); } + // For each live variable, look for a difference in values across // predecessors that would require a phi and insert one. auto insertItr = block_ptr->begin(); @@ -448,33 +445,35 @@ const uint32_t val0Id = var_val.second; bool differs = false; for (uint32_t predLabel : cfg()->preds(label)) { - const auto var_val_itr = label2ssa_map_[predLabel].find(varId); + uint32_t current_value = GetCurrentValue(varId, predLabel); // Missing values cause a difference because we'll need to create an // undef for that predecessor. - if (var_val_itr == label2ssa_map_[predLabel].end()) { + if (current_value == 0) { differs = true; break; } - if (var_val_itr->second != val0Id) { + if (current_value != val0Id) { differs = true; break; } } // If val is the same for all predecessors, enter it in map if (!differs) { - label2ssa_map_[label].insert(var_val); + block_defs_map_[label].insert(var_val); continue; } + + modified = true; + // Val differs across predecessors. Add phi op to block and add its result // id to the map. std::vector phi_in_operands; const uint32_t typeId = GetPointeeTypeId(get_def_use_mgr()->GetDef(varId)); for (uint32_t predLabel : cfg()->preds(label)) { - const auto var_val_itr = label2ssa_map_[predLabel].find(varId); + uint32_t current_value = GetCurrentValue(varId, predLabel); // If variable not defined on this path, use undef - const uint32_t valId = (var_val_itr != label2ssa_map_[predLabel].end()) - ? var_val_itr->second - : Type2Undef(typeId); + const uint32_t valId = + (current_value > 0) ? current_value : Type2Undef(typeId); phi_in_operands.push_back( {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {valId}}); phi_in_operands.push_back( @@ -487,19 +486,18 @@ context()->set_instr_block(&*newPhi, block_ptr); insertItr = insertItr.InsertBefore(std::move(newPhi)); ++insertItr; - label2ssa_map_[label].insert({varId, phiId}); + block_defs_map_[label].insert({varId, phiId}); } + return modified; } -void MemPass::SSABlockInit(std::list::iterator block_itr) { +bool MemPass::SSABlockInit(std::list::iterator block_itr) { const size_t numPreds = cfg()->preds((*block_itr)->id()).size(); - if (numPreds == 0) return; - if (numPreds == 1) - SSABlockInitSinglePred(*block_itr); - else if ((*block_itr)->IsLoopHeader()) - SSABlockInitLoopHeader(block_itr); + if (numPreds == 0) return false; + if ((*block_itr)->IsLoopHeader()) + return SSABlockInitLoopHeader(block_itr); else - SSABlockInitMultiPred(*block_itr); + return SSABlockInitMultiPred(*block_itr); } bool MemPass::IsTargetVar(uint32_t varId) { @@ -546,13 +544,14 @@ ++cnt; }); assert(idx != phiItr->NumInOperands()); + // Replace temporary phi operand with variable's value in backedge block // map. Use undef if variable not in map. const uint32_t varId = phiItr->GetSingleWordInOperand(idx); - const auto valItr = label2ssa_map_[back_id].find(varId); + uint32_t current_value = GetCurrentValue(varId, back_id); uint32_t valId = - (valItr != label2ssa_map_[back_id].end()) - ? valItr->second + (current_value > 0) + ? current_value : Type2Undef(GetPointeeTypeId(get_def_use_mgr()->GetDef(varId))); phiItr->SetInOperand(idx, {valId}); // Analyze uses now that they are complete @@ -560,13 +559,15 @@ } } -Pass::Status MemPass::InsertPhiInstructions(ir::Function* func) { +bool MemPass::InsertPhiInstructions(ir::Function* func) { // TODO(dnovillo) the current Phi placement mechanism assumes structured // control-flow. This should be generalized // (https://github.com/KhronosGroup/SPIRV-Tools/issues/893). assert(context()->get_feature_mgr()->HasCapability(SpvCapabilityShader) && "This only works on structured control flow"); + bool modified = false; + // Initialize the data structures used to insert Phi instructions. InitSSARewrite(func); @@ -582,9 +583,11 @@ continue; } - // Initialize this block's label2ssa_map_ entry using predecessor maps. - // Then process all stores and loads of targeted variables. - SSABlockInit(bi); + // Process all stores and loads of targeted variables. + if (SSABlockInit(bi)) { + modified = true; + } + ir::BasicBlock* bp = *bi; const uint32_t label = bp->id(); ir::Instruction* inst = &*bp->begin(); @@ -596,7 +599,7 @@ (void)GetPtr(inst, &varId); if (!IsTargetVar(varId)) break; // Register new stored value for the variable - label2ssa_map_[label][varId] = + block_defs_map_[label][varId] = inst->GetSingleWordInOperand(kStoreValIdInIdx); } break; case SpvOpVariable: { @@ -605,24 +608,21 @@ uint32_t varId = inst->result_id(); if (!IsTargetVar(varId)) break; // Register new stored value for the variable - label2ssa_map_[label][varId] = + block_defs_map_[label][varId] = inst->GetSingleWordInOperand(kVariableInitIdInIdx); } break; case SpvOpLoad: { uint32_t varId; (void)GetPtr(inst, &varId); if (!IsTargetVar(varId)) break; - uint32_t replId = 0; - const auto ssaItr = label2ssa_map_.find(label); - if (ssaItr != label2ssa_map_.end()) { - const auto valItr = ssaItr->second.find(varId); - if (valItr != ssaItr->second.end()) replId = valItr->second; - } - // If variable is not defined, use undef + modified = true; + uint32_t replId = GetCurrentValue(varId, label); + // If the variable is not defined, use undef. if (replId == 0) { replId = Type2Undef(GetPointeeTypeId(get_def_use_mgr()->GetDef(varId))); } + // Replace load's id with the last stored value id for variable // and delete load. Kill any names or decorates using id before // replacing to prevent incorrect replacement in those instructions. @@ -649,7 +649,7 @@ if (header != 0) PatchPhis(header, label); } - return Status::SuccessWithChange; + return modified; } // Remove all |phi| operands coming from unreachable blocks (i.e., blocks not in @@ -849,5 +849,32 @@ return modified; } +void MemPass::CollectTargetVars(ir::Function* func) { + seen_target_vars_.clear(); + seen_non_target_vars_.clear(); + supported_ref_vars_.clear(); + type2undefs_.clear(); + + // Collect target (and non-) variable sets. Remove variables with + // non-load/store refs from target variable set + for (auto& blk : *func) { + for (auto& inst : blk) { + switch (inst.opcode()) { + case SpvOpStore: + case SpvOpLoad: { + uint32_t varId; + (void)GetPtr(&inst, &varId); + if (!IsTargetVar(varId)) break; + if (HasOnlySupportedRefs(varId)) break; + seen_non_target_vars_.insert(varId); + seen_target_vars_.erase(varId); + } break; + default: + break; + } + } + } +} + } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/mem_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/mem_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/mem_pass.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/mem_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -14,8 +14,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef LIBSPIRV_OPT_OPT_PASS_H_ -#define LIBSPIRV_OPT_OPT_PASS_H_ +#ifndef LIBSPIRV_OPT_MEM_PASS_H_ +#define LIBSPIRV_OPT_MEM_PASS_H_ #include #include @@ -27,6 +27,7 @@ #include "basic_block.h" #include "def_use_manager.h" +#include "dominator_analysis.h" #include "module.h" #include "pass.h" @@ -40,6 +41,34 @@ MemPass(); virtual ~MemPass() = default; + // Returns an undef value for the given |var_id|'s type. + uint32_t GetUndefVal(uint32_t var_id) { + return Type2Undef(GetPointeeTypeId(get_def_use_mgr()->GetDef(var_id))); + } + + // Given a load or store |ip|, return the pointer instruction. + // Also return the base variable's id in |varId|. If no base variable is + // found, |varId| will be 0. + ir::Instruction* GetPtr(ir::Instruction* ip, uint32_t* varId); + + // Return true if |varId| is a previously identified target variable. + // Return false if |varId| is a previously identified non-target variable. + // + // Non-target variables are variable of function scope of a target type that + // are accessed with constant-index access chains. not accessed with + // non-constant-index access chains. Also cache non-target variables. + // + // If variable is not cached, return true if variable is a function scope + // variable of target type, false otherwise. Updates caches of target and + // non-target variables. + bool IsTargetVar(uint32_t varId); + + // Collect target SSA variables. This traverses all the loads and stores in + // function |func| looking for variables that can be replaced with SSA IDs. It + // populates the sets |seen_target_vars_|, |seen_non_target_vars_| and + // |supported_ref_vars_|. + void CollectTargetVars(ir::Function* func); + protected: // Returns true if |typeInst| is a scalar type // or a vector or matrix @@ -62,11 +91,6 @@ // found, |varId| will be 0. ir::Instruction* GetPtr(uint32_t ptrId, uint32_t* varId); - // Given a load or store |ip|, return the pointer instruction. - // Also return the base variable's id in |varId|. If no base variable is - // found, |varId| will be 0. - ir::Instruction* GetPtr(ir::Instruction* ip, uint32_t* varId); - // Return true if all uses of |id| are only name or decorate ops. bool HasOnlyNamesAndDecorates(uint32_t id) const; @@ -102,18 +126,6 @@ return (op == SpvOpDecorate || op == SpvOpDecorateId); } - // Return true if |varId| is a previously identified target variable. - // Return false if |varId| is a previously identified non-target variable. - // - // Non-target variables are variable of function scope of a target type that - // are accessed with constant-index access chains. not accessed with - // non-constant-index access chains. Also cache non-target variables. - // - // If variable is not cached, return true if variable is a function scope - // variable of target type, false otherwise. Updates caches of target and - // non-target variables. - bool IsTargetVar(uint32_t varId); - // Return undef in function for type. Create and insert an undef after the // first non-variable in the function if it doesn't already exist. Add // undef to function undef map. @@ -121,8 +133,8 @@ // Insert Phi instructions in the CFG of |func|. This removes extra // load/store operations to local storage while preserving the SSA form of the - // code. - Pass::Status InsertPhiInstructions(ir::Function* func); + // code. Returns true if the code was modified. + bool InsertPhiInstructions(ir::Function* func); // Cache of verified target vars std::unordered_set seen_target_vars_; @@ -150,32 +162,31 @@ // function |func|, specifically block predecessors and target variables. void InitSSARewrite(ir::Function* func); - // Initialize label2ssa_map_ entry for block |block_ptr| with single - // predecessor. - void SSABlockInitSinglePred(ir::BasicBlock* block_ptr); - - // Initialize label2ssa_map_ entry for loop header block pointed to + // Initialize block_defs_map_ entry for loop header block pointed to // |block_itr| by merging entries from all predecessors. If any value // ids differ for any variable across predecessors, create a phi function // in the block and use that value id for the variable in the new map. // Assumes all predecessors have been visited by EliminateLocalMultiStore // except the back edge. Use a dummy value in the phi for the back edge // until the back edge block is visited and patch the phi value then. - void SSABlockInitLoopHeader(std::list::iterator block_itr); + // Returns true if the code was modified. + bool SSABlockInitLoopHeader(std::list::iterator block_itr); - // Initialize label2ssa_map_ entry for multiple predecessor block - // |block_ptr| by merging label2ssa_map_ entries for all predecessors. + // Initialize block_defs_map_ entry for multiple predecessor block + // |block_ptr| by merging block_defs_map_ entries for all predecessors. // If any value ids differ for any variable across predecessors, create // a phi function in the block and use that value id for the variable in // the new map. Assumes all predecessors have been visited by // EliminateLocalMultiStore. - void SSABlockInitMultiPred(ir::BasicBlock* block_ptr); + // Returns true if the code was modified. + bool SSABlockInitMultiPred(ir::BasicBlock* block_ptr); // Initialize the label2ssa_map entry for a block pointed to by |block_itr|. // Insert phi instructions into block when necessary. All predecessor // blocks must have been visited by EliminateLocalMultiStore except for // backedges. - void SSABlockInit(std::list::iterator block_itr); + // Returns true if the code was modified. + bool SSABlockInit(std::list::iterator block_itr); // Return true if variable is loaded in block with |label| or in any // succeeding block in structured order. @@ -193,10 +204,30 @@ void RemovePhiOperands(ir::Instruction* phi, std::unordered_set reachable_blocks); - // Map from block's label id to a map of a variable to its value at the - // end of the block. + // Collects a map of all the live variables and their values along the path of + // dominator parents starting at |block_label|. Each entry + // |live_vars[var_id]| returns the latest value of |var_id| along that + // dominator path. Note that the mapping |live_vars| is never cleared, + // multiple calls to this function will accumulate new + // mappings. This is done to support the logic in + // MemPass::SSABlockInitLoopHeader. + void CollectLiveVars(uint32_t block_label, + std::map* live_vars); + + // Returns the ID of the most current value taken by variable |var_id| on the + // dominator path starting at |block_id|. This walks the dominator parents + // starting at |block_id| and returns the first value it finds for |var_id|. + // If no value for |var_id| is found along the dominator path, this returns 0. + uint32_t GetCurrentValue(uint32_t var_id, uint32_t block_label); + + // Dominator information. + DominatorAnalysis* dominator_; + + // Each entry |block_defs_map_[block_id]| contains a map {variable_id, + // value_id} associating all the variables |variable_id| stored in |block_id| + // to their respective value |value_id|. std::unordered_map> - label2ssa_map_; + block_defs_map_; // Set of label ids of visited blocks std::unordered_set visitedBlocks_; @@ -216,4 +247,4 @@ } // namespace opt } // namespace spvtools -#endif // LIBSPIRV_OPT_OPT_PASS_H_ +#endif // LIBSPIRV_OPT_MEM_PASS_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/merge_return_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/merge_return_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/merge_return_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/merge_return_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -15,7 +15,10 @@ #include "merge_return_pass.h" #include "instruction.h" +#include "ir_builder.h" #include "ir_context.h" +#include "make_unique.h" +#include "reflect.h" namespace spvtools { namespace opt { @@ -23,110 +26,635 @@ Pass::Status MergeReturnPass::Process(ir::IRContext* irContext) { InitializeProcessing(irContext); - // TODO (alanbaker): Support structured control flow. Bail out in the - // meantime. - if (context()->get_feature_mgr()->HasCapability(SpvCapabilityShader)) - return Status::SuccessWithoutChange; - bool modified = false; + bool is_shader = + context()->get_feature_mgr()->HasCapability(SpvCapabilityShader); for (auto& function : *get_module()) { - std::vector returnBlocks = CollectReturnBlocks(&function); - modified |= MergeReturnBlocks(&function, returnBlocks); + std::vector return_blocks = CollectReturnBlocks(&function); + if (return_blocks.size() <= 1) continue; + + function_ = &function; + return_flag_ = nullptr; + return_value_ = nullptr; + final_return_block_ = nullptr; + + modified = true; + if (is_shader) { + ProcessStructured(&function, return_blocks); + } else { + MergeReturnBlocks(&function, return_blocks); + } } return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; } +void MergeReturnPass::ProcessStructured( + ir::Function* function, const std::vector& return_blocks) { + std::list order; + cfg()->ComputeStructuredOrder(function, &*function->begin(), &order); + + // Create the new return block + CreateReturnBlock(); + + // Create the return + CreateReturn(final_return_block_); + + cfg()->RegisterBlock(final_return_block_); + + state_.clear(); + state_.emplace_back(nullptr, nullptr); + for (auto block : order) { + if (cfg()->IsPseudoEntryBlock(block) || cfg()->IsPseudoExitBlock(block)) { + continue; + } + + auto blockId = block->GetLabelInst()->result_id(); + if (blockId == CurrentState().CurrentMergeId()) { + // Pop the current state as we've hit the merge + state_.pop_back(); + } + + ProcessStructuredBlock(block); + + // Generate state for next block + if (ir::Instruction* mergeInst = block->GetMergeInst()) { + ir::Instruction* loopMergeInst = block->GetLoopMergeInst(); + if (!loopMergeInst) loopMergeInst = state_.back().LoopMergeInst(); + state_.emplace_back(loopMergeInst, mergeInst); + } + } + + // Predicate successors of the original return blocks as necessary. + PredicateBlocks(return_blocks); + + // We have not kept the dominator tree up-to-date. + // Invalidate it at this point to make sure it will be rebuilt. + context()->RemoveDominatorAnalysis(function); + AddNewPhiNodes(); +} + +void MergeReturnPass::CreateReturnBlock() { + // Create a label for the new return block + std::unique_ptr return_label( + new ir::Instruction(context(), SpvOpLabel, 0u, TakeNextId(), {})); + + // Create the new basic block + std::unique_ptr return_block( + new ir::BasicBlock(std::move(return_label))); + function_->AddBasicBlock(std::move(return_block)); + final_return_block_ = &*(--function_->end()); + context()->AnalyzeDefUse(final_return_block_->GetLabelInst()); + context()->set_instr_block(final_return_block_->GetLabelInst(), + final_return_block_); + final_return_block_->SetParent(function_); +} + +void MergeReturnPass::CreateReturn(ir::BasicBlock* block) { + AddReturnValue(); + + if (return_value_) { + // Load and return the final return value + uint32_t loadId = TakeNextId(); + block->AddInstruction(MakeUnique( + context(), SpvOpLoad, function_->type_id(), loadId, + std::initializer_list{ + {SPV_OPERAND_TYPE_ID, {return_value_->result_id()}}})); + ir::Instruction* var_inst = block->terminator(); + context()->AnalyzeDefUse(var_inst); + context()->set_instr_block(var_inst, block); + + block->AddInstruction(MakeUnique( + context(), SpvOpReturnValue, 0, 0, + std::initializer_list{{SPV_OPERAND_TYPE_ID, {loadId}}})); + context()->AnalyzeDefUse(block->terminator()); + context()->set_instr_block(block->terminator(), block); + } else { + block->AddInstruction(MakeUnique(context(), SpvOpReturn)); + context()->AnalyzeDefUse(block->terminator()); + context()->set_instr_block(block->terminator(), block); + } +} + +void MergeReturnPass::ProcessStructuredBlock(ir::BasicBlock* block) { + SpvOp tail_opcode = block->tail()->opcode(); + if (tail_opcode == SpvOpReturn || tail_opcode == SpvOpReturnValue) { + if (!return_flag_) { + AddReturnFlag(); + } + } + + if (tail_opcode == SpvOpReturn || tail_opcode == SpvOpReturnValue || + tail_opcode == SpvOpUnreachable) { + if (CurrentState().InLoop()) { + // Can always break out of innermost loop + BranchToBlock(block, CurrentState().LoopMergeId()); + } else if (CurrentState().InStructuredFlow()) { + BranchToBlock(block, CurrentState().CurrentMergeId()); + } else { + BranchToBlock(block, final_return_block_->id()); + } + } +} + +void MergeReturnPass::BranchToBlock(ir::BasicBlock* block, uint32_t target) { + if (block->tail()->opcode() == SpvOpReturn || + block->tail()->opcode() == SpvOpReturnValue) { + RecordReturned(block); + RecordReturnValue(block); + } + + // Fix up existing phi nodes. + // + // A new edge is being added from |block| to |target|, so go through + // |target|'s phi nodes add an undef incoming value for |block|. + ir::BasicBlock* target_block = context()->get_instr_block(target); + target_block->ForEachPhiInst([this, block](ir::Instruction* inst) { + uint32_t undefId = Type2Undef(inst->type_id()); + inst->AddOperand({SPV_OPERAND_TYPE_ID, {undefId}}); + inst->AddOperand({SPV_OPERAND_TYPE_ID, {block->id()}}); + context()->UpdateDefUse(inst); + }); + + const auto& target_pred = cfg()->preds(target); + if (target_pred.size() == 1) { + MarkForNewPhiNodes(target_block, + context()->get_instr_block(target_pred[0])); + } + + ir::Instruction* return_inst = block->terminator(); + return_inst->SetOpcode(SpvOpBranch); + return_inst->ReplaceOperands({{SPV_OPERAND_TYPE_ID, {target}}}); + context()->get_def_use_mgr()->AnalyzeInstDefUse(return_inst); + cfg()->AddEdge(block->id(), target); +} + +void MergeReturnPass::CreatePhiNodesForInst(ir::BasicBlock* merge_block, + uint32_t predecessor, + ir::Instruction& inst) { + opt::DominatorAnalysis* dom_tree = + context()->GetDominatorAnalysis(merge_block->GetParent(), *cfg()); + ir::BasicBlock* inst_bb = context()->get_instr_block(&inst); + + if (inst.result_id() != 0) { + std::vector users_to_update; + context()->get_def_use_mgr()->ForEachUser( + &inst, + [&users_to_update, &dom_tree, inst_bb, this](ir::Instruction* user) { + if (!dom_tree->Dominates(inst_bb, context()->get_instr_block(user))) { + users_to_update.push_back(user); + } + }); + + if (users_to_update.empty()) { + return; + } + + // There is at least one values that needs to be replaced. + // First create the OpPhi instruction. + InstructionBuilder builder(context(), &*merge_block->begin(), + ir::IRContext::kAnalysisDefUse); + uint32_t undef_id = Type2Undef(inst.type_id()); + std::vector phi_operands; + + // Add the operands for the defining instructions. + phi_operands.push_back(inst.result_id()); + phi_operands.push_back(predecessor); + + // Add undef from all other blocks. + std::vector preds = cfg()->preds(merge_block->id()); + for (uint32_t pred_id : preds) { + if (pred_id != predecessor) { + phi_operands.push_back(undef_id); + phi_operands.push_back(pred_id); + } + } + + ir::Instruction* new_phi = builder.AddPhi(inst.type_id(), phi_operands); + uint32_t result_of_phi = new_phi->result_id(); + + // Update all of the users to use the result of the new OpPhi. + for (ir::Instruction* user : users_to_update) { + user->ForEachInId([&inst, result_of_phi](uint32_t* id) { + if (*id == inst.result_id()) { + *id = result_of_phi; + } + }); + context()->AnalyzeUses(user); + } + } +} + +void MergeReturnPass::PredicateBlocks( + const std::vector& return_blocks) { + // The CFG is being modified as the function proceeds so avoid caching + // successors. + std::vector stack; + auto add_successors = [this, &stack](ir::BasicBlock* block) { + const ir::BasicBlock* const_block = + const_cast(block); + const_block->ForEachSuccessorLabel([this, &stack](const uint32_t idx) { + stack.push_back(context()->get_instr_block(idx)); + }); + }; + + std::unordered_set seen; + std::unordered_set predicated; + for (auto b : return_blocks) { + seen.clear(); + add_successors(b); + + while (!stack.empty()) { + ir::BasicBlock* block = stack.back(); + assert(block); + stack.pop_back(); + + if (block == b) continue; + if (block == final_return_block_) continue; + if (!seen.insert(block).second) continue; + if (!predicated.insert(block).second) continue; + + // Skip structured subgraphs. + ir::BasicBlock* next = block; + while (next->GetMergeInst()) { + next = context()->get_instr_block(next->MergeBlockIdIfAny()); + } + add_successors(next); + PredicateBlock(block, next, &predicated); + } + } +} + +bool MergeReturnPass::RequiresPredication( + const ir::BasicBlock* block, const ir::BasicBlock* tail_block) const { + // This is intentionally conservative. + // TODO(alanbaker): re-visit this when more performance data is available. + if (block != tail_block) return true; + + bool requires_predicate = false; + block->ForEachInst([&requires_predicate](const ir::Instruction* inst) { + if (inst->opcode() != SpvOpPhi && inst->opcode() != SpvOpLabel && + !ir::IsTerminatorInst(inst->opcode())) { + requires_predicate = true; + } + }); + return requires_predicate; +} + +void MergeReturnPass::PredicateBlock( + ir::BasicBlock* block, ir::BasicBlock* tail_block, + std::unordered_set* predicated) { + if (!RequiresPredication(block, tail_block)) { + return; + } + + // Make sure the cfg is build here. If we don't then it becomes very hard to + // know which new blocks need to be updated. + context()->BuildInvalidAnalyses(ir::IRContext::kAnalysisCFG); + + // When predicating, be aware of whether this block is a header block, a merge + // block or both. + // + // If this block is a merge block, ensure the appropriate header stays + // up-to-date with any changes (i.e. points to the pre-header). + // + // If this block is a header block, predicate the entire structured subgraph. + // This can act recursively. + + // If |block| is a loop head, then the back edge must jump to the original + // code, not the new header. + if (block->GetLoopMergeInst()) { + cfg()->SplitLoopHeader(block); + } + + // Leave the phi instructions behind. + auto iter = block->begin(); + while (iter->opcode() == SpvOpPhi) { + ++iter; + } + + // Forget about the edges leaving block. They will be removed. + cfg()->RemoveSuccessorEdges(block); + + std::unique_ptr new_block( + block->SplitBasicBlock(context(), TakeNextId(), iter)); + ir::BasicBlock* old_body = + function_->InsertBasicBlockAfter(std::move(new_block), block); + predicated->insert(old_body); + + if (tail_block == block) { + tail_block = old_body; + } + + const ir::BasicBlock* const_old_body = + static_cast(old_body); + const_old_body->ForEachSuccessorLabel( + [old_body, block, this](const uint32_t label) { + ir::BasicBlock* target_bb = context()->get_instr_block(label); + if (MarkedSinglePred(target_bb) == block) { + MarkForNewPhiNodes(target_bb, old_body); + } + }); + + std::unique_ptr new_merge_block(new ir::BasicBlock( + MakeUnique(context(), SpvOpLabel, 0, TakeNextId(), + std::initializer_list{}))); + + ir::BasicBlock* new_merge = + function_->InsertBasicBlockAfter(std::move(new_merge_block), tail_block); + predicated->insert(new_merge); + new_merge->SetParent(function_); + + // Register the new labels. + get_def_use_mgr()->AnalyzeInstDef(old_body->GetLabelInst()); + context()->set_instr_block(old_body->GetLabelInst(), old_body); + get_def_use_mgr()->AnalyzeInstDef(new_merge->GetLabelInst()); + context()->set_instr_block(new_merge->GetLabelInst(), new_merge); + + // Move the tail branch into the new merge and fix the mapping. If a single + // block is being predicated then its branch was moved to the old body + // previously. + std::unique_ptr inst; + ir::Instruction* i = tail_block->terminator(); + cfg()->RemoveSuccessorEdges(tail_block); + get_def_use_mgr()->ClearInst(i); + inst.reset(std::move(i)); + inst->RemoveFromList(); + new_merge->end().InsertBefore(std::move(inst)); + get_def_use_mgr()->AnalyzeInstUse(new_merge->terminator()); + context()->set_instr_block(new_merge->terminator(), new_merge); + + // Add a branch to the new merge. If we jumped multiple blocks, the branch is + // added to tail_block, otherwise the branch belongs in old_body. + tail_block->AddInstruction(MakeUnique( + context(), SpvOpBranch, 0, 0, + std::initializer_list{ + {SPV_OPERAND_TYPE_ID, {new_merge->id()}}})); + get_def_use_mgr()->AnalyzeInstUse(tail_block->terminator()); + context()->set_instr_block(tail_block->terminator(), tail_block); + + // Within the new header we need the following: + // 1. Load of the return status flag + // 2. Declare the merge block + // 3. Branch to new merge (true) or old body (false) + + // 1. Load of the return status flag + analysis::Bool bool_type; + uint32_t bool_id = context()->get_type_mgr()->GetId(&bool_type); + assert(bool_id != 0); + uint32_t load_id = TakeNextId(); + block->AddInstruction(MakeUnique( + context(), SpvOpLoad, bool_id, load_id, + std::initializer_list{ + {SPV_OPERAND_TYPE_ID, {return_flag_->result_id()}}})); + get_def_use_mgr()->AnalyzeInstDefUse(block->terminator()); + context()->set_instr_block(block->terminator(), block); + + // 2. Declare the merge block + block->AddInstruction( + MakeUnique(context(), SpvOpSelectionMerge, 0, 0, + std::initializer_list{ + {SPV_OPERAND_TYPE_ID, {new_merge->id()}}, + {SPV_OPERAND_TYPE_SELECTION_CONTROL, + {SpvSelectionControlMaskNone}}})); + get_def_use_mgr()->AnalyzeInstUse(block->terminator()); + context()->set_instr_block(block->terminator(), block); + + // 3. Branch to new merge (true) or old body (false) + block->AddInstruction(MakeUnique( + context(), SpvOpBranchConditional, 0, 0, + std::initializer_list{ + {SPV_OPERAND_TYPE_ID, {load_id}}, + {SPV_OPERAND_TYPE_ID, {new_merge->id()}}, + {SPV_OPERAND_TYPE_ID, {old_body->id()}}})); + get_def_use_mgr()->AnalyzeInstUse(block->terminator()); + context()->set_instr_block(block->terminator(), block); + + assert(old_body->begin() != old_body->end()); + assert(block->begin() != block->end()); + assert(new_merge->begin() != new_merge->end()); + + // Update the cfg + cfg()->AddEdges(block); + cfg()->RegisterBlock(old_body); + if (old_body != tail_block) { + cfg()->AddEdges(tail_block); + } + cfg()->RegisterBlock(new_merge); + MarkForNewPhiNodes(new_merge, tail_block); +} + +void MergeReturnPass::RecordReturned(ir::BasicBlock* block) { + if (block->tail()->opcode() != SpvOpReturn && + block->tail()->opcode() != SpvOpReturnValue) + return; + + assert(return_flag_ && "Did not generate the return flag variable."); + + if (!constant_true_) { + analysis::Bool temp; + const analysis::Bool* bool_type = + context()->get_type_mgr()->GetRegisteredType(&temp)->AsBool(); + + analysis::ConstantManager* const_mgr = context()->get_constant_mgr(); + const analysis::Constant* true_const = + const_mgr->GetConstant(bool_type, {true}); + constant_true_ = const_mgr->GetDefiningInstruction(true_const); + context()->UpdateDefUse(constant_true_); + } + + std::unique_ptr return_store(new ir::Instruction( + context(), SpvOpStore, 0, 0, + std::initializer_list{ + {SPV_OPERAND_TYPE_ID, {return_flag_->result_id()}}, + {SPV_OPERAND_TYPE_ID, {constant_true_->result_id()}}})); + + ir::Instruction* store_inst = + &*block->tail().InsertBefore(std::move(return_store)); + context()->set_instr_block(store_inst, block); + context()->AnalyzeDefUse(store_inst); +} + +void MergeReturnPass::RecordReturnValue(ir::BasicBlock* block) { + auto terminator = *block->tail(); + if (terminator.opcode() != SpvOpReturnValue) { + return; + } + + assert(return_value_ && + "Did not generate the variable to hold the return value."); + + std::unique_ptr value_store(new ir::Instruction( + context(), SpvOpStore, 0, 0, + std::initializer_list{ + {SPV_OPERAND_TYPE_ID, {return_value_->result_id()}}, + {SPV_OPERAND_TYPE_ID, {terminator.GetSingleWordInOperand(0u)}}})); + + ir::Instruction* store_inst = + &*block->tail().InsertBefore(std::move(value_store)); + context()->set_instr_block(store_inst, block); + context()->AnalyzeDefUse(store_inst); +} + +void MergeReturnPass::AddReturnValue() { + if (return_value_) return; + + uint32_t return_type_id = function_->type_id(); + if (get_def_use_mgr()->GetDef(return_type_id)->opcode() == SpvOpTypeVoid) + return; + + uint32_t return_ptr_type = context()->get_type_mgr()->FindPointerToType( + return_type_id, SpvStorageClassFunction); + + uint32_t var_id = TakeNextId(); + std::unique_ptr returnValue(new ir::Instruction( + context(), SpvOpVariable, return_ptr_type, var_id, + std::initializer_list{ + {SPV_OPERAND_TYPE_STORAGE_CLASS, {SpvStorageClassFunction}}})); + + auto insert_iter = function_->begin()->begin(); + insert_iter.InsertBefore(std::move(returnValue)); + ir::BasicBlock* entry_block = &*function_->begin(); + return_value_ = &*entry_block->begin(); + context()->AnalyzeDefUse(return_value_); + context()->set_instr_block(return_value_, entry_block); +} + +void MergeReturnPass::AddReturnFlag() { + if (return_flag_) return; + + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::ConstantManager* const_mgr = context()->get_constant_mgr(); + + analysis::Bool temp; + uint32_t bool_id = type_mgr->GetTypeInstruction(&temp); + analysis::Bool* bool_type = type_mgr->GetType(bool_id)->AsBool(); + + const analysis::Constant* false_const = + const_mgr->GetConstant(bool_type, {false}); + uint32_t const_false_id = + const_mgr->GetDefiningInstruction(false_const)->result_id(); + + uint32_t bool_ptr_id = + type_mgr->FindPointerToType(bool_id, SpvStorageClassFunction); + + uint32_t var_id = TakeNextId(); + std::unique_ptr returnFlag(new ir::Instruction( + context(), SpvOpVariable, bool_ptr_id, var_id, + std::initializer_list{ + {SPV_OPERAND_TYPE_STORAGE_CLASS, {SpvStorageClassFunction}}, + {SPV_OPERAND_TYPE_ID, {const_false_id}}})); + + auto insert_iter = function_->begin()->begin(); + + insert_iter.InsertBefore(std::move(returnFlag)); + ir::BasicBlock* entry_block = &*function_->begin(); + return_flag_ = &*entry_block->begin(); + context()->AnalyzeDefUse(return_flag_); + context()->set_instr_block(return_flag_, entry_block); +} + std::vector MergeReturnPass::CollectReturnBlocks( ir::Function* function) { - std::vector returnBlocks; + std::vector return_blocks; for (auto& block : *function) { ir::Instruction& terminator = *block.tail(); if (terminator.opcode() == SpvOpReturn || terminator.opcode() == SpvOpReturnValue) { - returnBlocks.push_back(&block); + return_blocks.push_back(&block); } } - - return returnBlocks; + return return_blocks; } -bool MergeReturnPass::MergeReturnBlocks( - ir::Function* function, const std::vector& returnBlocks) { - if (returnBlocks.size() <= 1) { +void MergeReturnPass::MergeReturnBlocks( + ir::Function* function, const std::vector& return_blocks) { + if (return_blocks.size() <= 1) { // No work to do. - return false; + return; } - std::vector uses_to_update; - - // Create a label for the new return block - std::unique_ptr returnLabel( - new ir::Instruction(context(), SpvOpLabel, 0u, TakeNextId(), {})); - uint32_t returnId = returnLabel->result_id(); - - // Create the new basic block. - std::unique_ptr returnBlock( - new ir::BasicBlock(std::move(returnLabel))); - function->AddBasicBlock(std::move(returnBlock)); - ir::Function::iterator retBlockIter = --function->end(); - - // Register the definition of the return and mark it to update its uses. - get_def_use_mgr()->AnalyzeInstDef(retBlockIter->GetLabelInst()); - uses_to_update.push_back(retBlockIter->GetLabelInst()); - + CreateReturnBlock(); + uint32_t return_id = final_return_block_->id(); + auto ret_block_iter = --function->end(); // Create the PHI for the merged block (if necessary). // Create new return. - std::vector phiOps; - for (auto block : returnBlocks) { + std::vector phi_ops; + for (auto block : return_blocks) { if (block->tail()->opcode() == SpvOpReturnValue) { - phiOps.push_back( + phi_ops.push_back( {SPV_OPERAND_TYPE_ID, {block->tail()->GetSingleWordInOperand(0u)}}); - phiOps.push_back({SPV_OPERAND_TYPE_ID, {block->id()}}); + phi_ops.push_back({SPV_OPERAND_TYPE_ID, {block->id()}}); } } - if (!phiOps.empty()) { + if (!phi_ops.empty()) { // Need a PHI node to select the correct return value. - uint32_t phiResultId = TakeNextId(); - uint32_t phiTypeId = function->type_id(); - std::unique_ptr phiInst(new ir::Instruction( - context(), SpvOpPhi, phiTypeId, phiResultId, phiOps)); - retBlockIter->AddInstruction(std::move(phiInst)); - ir::BasicBlock::iterator phiIter = retBlockIter->tail(); + uint32_t phi_result_id = TakeNextId(); + uint32_t phi_type_id = function->type_id(); + std::unique_ptr phi_inst(new ir::Instruction( + context(), SpvOpPhi, phi_type_id, phi_result_id, phi_ops)); + ret_block_iter->AddInstruction(std::move(phi_inst)); + ir::BasicBlock::iterator phiIter = ret_block_iter->tail(); - std::unique_ptr returnInst( + std::unique_ptr return_inst( new ir::Instruction(context(), SpvOpReturnValue, 0u, 0u, - {{SPV_OPERAND_TYPE_ID, {phiResultId}}})); - retBlockIter->AddInstruction(std::move(returnInst)); - ir::BasicBlock::iterator ret = retBlockIter->tail(); + {{SPV_OPERAND_TYPE_ID, {phi_result_id}}})); + ret_block_iter->AddInstruction(std::move(return_inst)); + ir::BasicBlock::iterator ret = ret_block_iter->tail(); // Register the phi def and mark instructions for use updates. - get_def_use_mgr()->AnalyzeInstDef(&*phiIter); - uses_to_update.push_back(&*ret); - uses_to_update.push_back(&*phiIter); + get_def_use_mgr()->AnalyzeInstDefUse(&*phiIter); + get_def_use_mgr()->AnalyzeInstDef(&*ret); } else { - std::unique_ptr returnInst( + std::unique_ptr return_inst( new ir::Instruction(context(), SpvOpReturn)); - retBlockIter->AddInstruction(std::move(returnInst)); + ret_block_iter->AddInstruction(std::move(return_inst)); } // Replace returns with branches - for (auto block : returnBlocks) { - context()->KillInst(&*block->tail()); - std::unique_ptr new_instruction( - new ir::Instruction(context(), SpvOpBranch, 0, - 0, {{SPV_OPERAND_TYPE_ID, {returnId}}})); - block->AddInstruction(std::move(new_instruction)); - uses_to_update.push_back(&*block->tail()); - uses_to_update.push_back(block->GetLabelInst()); + for (auto block : return_blocks) { + context()->ForgetUses(block->terminator()); + block->tail()->SetOpcode(SpvOpBranch); + block->tail()->ReplaceOperands({{SPV_OPERAND_TYPE_ID, {return_id}}}); + get_def_use_mgr()->AnalyzeInstUse(block->terminator()); + get_def_use_mgr()->AnalyzeInstUse(block->GetLabelInst()); + } + + get_def_use_mgr()->AnalyzeInstDefUse(ret_block_iter->GetLabelInst()); +} + +void MergeReturnPass::AddNewPhiNodes() { + opt::DominatorAnalysis* dom_tree = + context()->GetDominatorAnalysis(function_, *cfg()); + std::list order; + cfg()->ComputeStructuredOrder(function_, &*function_->begin(), &order); + + for (ir::BasicBlock* bb : order) { + AddNewPhiNodes(bb, new_merge_nodes_[bb], + dom_tree->ImmediateDominator(bb)->id()); } +} - for (auto& inst : uses_to_update) { - context()->AnalyzeUses(inst); +void MergeReturnPass::AddNewPhiNodes(ir::BasicBlock* bb, ir::BasicBlock* pred, + uint32_t header_id) { + opt::DominatorAnalysis* dom_tree = + context()->GetDominatorAnalysis(function_, *cfg()); + // Insert as a stopping point. We do not have to add anything in the block or + // above because the header dominates |bb|. + + ir::BasicBlock* current_bb = pred; + while (current_bb != nullptr && current_bb->id() != header_id) { + for (ir::Instruction& inst : *current_bb) { + CreatePhiNodesForInst(bb, pred->id(), inst); + } + current_bb = dom_tree->ImmediateDominator(current_bb); } +} - return true; +void MergeReturnPass::MarkForNewPhiNodes(ir::BasicBlock* block, + ir::BasicBlock* single_original_pred) { + new_merge_nodes_[block] = single_original_pred; } } // namespace opt diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/merge_return_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/merge_return_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/merge_return_pass.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/merge_return_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -17,36 +17,288 @@ #include "basic_block.h" #include "function.h" -#include "pass.h" +#include "mem_pass.h" +#include #include namespace spvtools { namespace opt { +/******************************************************************************* + * + * Handling Structured Control Flow: + * + * Structured control flow guarantees that the CFG will reconverge at a given + * point (the merge block). Within structured control flow, all blocks must be + * post-dominated by the merge block, except return blocks and break blocks. + * A break block is a block that branches to the innermost loop's merge block. + * + * Beyond this, we further assume that all unreachable blocks have been + * cleanedup. This means that the only unreachable blocks are those necessary + * for valid structured control flow. + * + * Algorithm: + * + * If a return is encountered, it should record that: i) the function has + * "returned" and ii) the value of the return. The return should be replaced + * with a branch. If current block is not within structured control flow, this + * is the final return. This block should branch to the new return block (its + * direct successor). If the current block is within structured control flow, + * the branch destination should be the innermost loop's merge (if it exists) + * or the merge block of the immediate structured control flow. If the merge + * block produces any live values it will need to be predicated. While the merge + * is nested in structured control flow, the predication path should branch to + * the next best merge block available. Once structured control flow has been + * exited, remaining blocks must be predicated with new structured control flow + * (OpSelectionMerge). These should be nested correctly in case of straight line + * branching to reach the final return block. + * + * In the final return block, the return value should be loaded and returned. + * Memory promotion passes should be able to promote the newly introduced + * variables ("has returned" and "return value"). + * + * Predicating the Final Merge: + * + * At each merge block predication needs to be introduced (optimization: only if + * that block produces value live beyond it). This needs to be done carefully. + * The merge block should be split into multiple blocks. + * + * 1 (header) + * / \ + * (ret) 2 3 (merge) + * + * || + * \/ + * + * 1 (header) + * / \ + * 2 | + * \ / + * 3 (merge for 1, new header) + * / \ + * | 3 (old body) + * \ / + * (ret) 4 (new merge) + * + * In the above (simple) example, the return originally in |2| is passed through + * the merge. That merge is predicated such that the old body of the block is + * the else branch. The branch condition is based on the value of the "has + * returned" variable. In more complicated examples (blocks between |1| and + * |3|), the SSA would need to fixed up due the newly reconvergent path at the + * merge for |1|. Assuming |3| originally was also a return block, the old body + * of |3| should also store the return value for that case. The return value in + * |4| just requires loading the return value variable. + * + ******************************************************************************/ + // Documented in optimizer.hpp -class MergeReturnPass : public Pass { +class MergeReturnPass : public MemPass { public: - MergeReturnPass() = default; - const char* name() const override { return "merge-return-pass"; } + MergeReturnPass() + : function_(nullptr), + return_flag_(nullptr), + return_value_(nullptr), + constant_true_(nullptr), + final_return_block_(nullptr) {} + + const char* name() const override { return "merge-return"; } Status Process(ir::IRContext*) override; ir::IRContext::Analysis GetPreservedAnalyses() override { - return ir::IRContext::kAnalysisDefUse; + // return ir::IRContext::kAnalysisDefUse; + return ir::IRContext::kAnalysisNone; } private: + // This class is used to store the a loop merge instruction and a selection + // merge instruction. The intended use is that is represent the inner most + // contain selection construct and the inner most loop construct. + class StructuredControlState { + public: + StructuredControlState(ir::Instruction* loop, ir::Instruction* merge) + : loop_merge_(loop), current_merge_(merge) {} + + StructuredControlState(const StructuredControlState&) = default; + + bool InLoop() const { return loop_merge_; } + bool InStructuredFlow() const { return CurrentMergeId() != 0; } + + uint32_t CurrentMergeId() const { + return current_merge_ ? current_merge_->GetSingleWordInOperand(0u) : 0u; + } + + uint32_t CurrentMergeHeader() const { + return current_merge_ ? current_merge_->context() + ->get_instr_block(current_merge_) + ->id() + : 0; + } + + uint32_t LoopMergeId() const { + return loop_merge_ ? loop_merge_->GetSingleWordInOperand(0u) : 0u; + } + + uint32_t CurrentLoopHeader() const { + return loop_merge_ + ? loop_merge_->context()->get_instr_block(loop_merge_)->id() + : 0; + } + + ir::Instruction* LoopMergeInst() const { return loop_merge_; } + + private: + ir::Instruction* loop_merge_; + ir::Instruction* current_merge_; + }; + // Returns all BasicBlocks terminated by OpReturn or OpReturnValue in // |function|. std::vector CollectReturnBlocks(ir::Function* function); - // Returns |true| if returns were merged, |false| otherwise. - // // Creates a new basic block with a single return. If |function| returns a // value, a phi node is created to select the correct value to return. // Replaces old returns with an unconditional branch to the new block. - bool MergeReturnBlocks(ir::Function* function, + void MergeReturnBlocks(ir::Function* function, const std::vector& returnBlocks); + + // Merges the return instruction in |function| so that it has a single return + // statement. It is assumed that |function| has structured control flow, and + // that |return_blocks| is a list of all of the basic blocks in |function| + // that have a return. + void ProcessStructured(ir::Function* function, + const std::vector& return_blocks); + + // Changes an OpReturn* or OpUnreachable instruction at the end of |block| + // into a store to |return_flag_|, a store to |return_value_| (if necessary), + // and a branch to the appropriate merge block. + // + // Is is assumed that |AddReturnValue| have already been called to created the + // variable to store a return value if there is one. + // + // Note this will break the semantics. To fix this, PredicateBlock will have + // to be called on the merge block the branch targets. + void ProcessStructuredBlock(ir::BasicBlock* block); + + // Creates a variable used to store whether or not the control flow has + // traversed a block that used to have a return. A pointer to the instruction + // declaring the variable is stored in |return_flag_|. + void AddReturnFlag(); + + // Creates the variable used to store the return value when passing through + // a block that use to contain an OpReturnValue. + void AddReturnValue(); + + // Adds a store that stores true to |return_flag_| immediately before the + // terminator of |block|. It is assumed that |AddReturnFlag| has already been + // called. + void RecordReturned(ir::BasicBlock* block); + + // Adds an instruction that stores the value being returned in the + // OpReturnValue in |block|. The value is stored to |return_value_|, and the + // store is placed before the OpReturnValue. + // + // If |block| does not contain an OpReturnValue, then this function has no + // effect. If |block| contains an OpReturnValue, then |AddReturnValue| must + // have already been called to create the variable to store to. + void RecordReturnValue(ir::BasicBlock* block); + + // Adds an unconditional branch in |block| that branches to |target|. It also + // adds stores to |return_flag_| and |return_value_| as needed. + // |AddReturnFlag| and |AddReturnValue| must have already been called. + void BranchToBlock(ir::BasicBlock* block, uint32_t target); + + // Returns true if we need to pridicate |block| where |tail_block| is the + // merge point. (See |PredicateBlocks|). There is no need to predicate if + // there is no code that could be executed. + bool RequiresPredication(const ir::BasicBlock* block, + const ir::BasicBlock* tail_block) const; + + // For every basic block that is reachable from a basic block in + // |return_blocks|, extra code is added to jump around any code that should + // not be executed because the original code would have already returned. This + // involves adding new selections constructs to jump around these + // instructions. + void PredicateBlocks(const std::vector& return_blocks); + + // Add the predication code (see |PredicateBlocks|) to |tail_block| if it + // requires predication. |tail_block| and any new blocks that are known to + // not require predication will be added to |predicated|. + void PredicateBlock(ir::BasicBlock* block, ir::BasicBlock* tail_block, + std::unordered_set* predicated); + + // Add an |OpReturn| or |OpReturnValue| to the end of |block|. If an + // |OpReturnValue| is needed, the return value is loaded from |return_value_|. + void CreateReturn(ir::BasicBlock* block); + + // Creates a block at the end of the function that will become the single + // return block at the end of the pass. + void CreateReturnBlock(); + + // Creates a Phi node in |merge_block| for the result of |inst| coming from + // |predecessor|. Any uses of the result of |inst| that are no longer + // dominated by |inst|, are replaced with the result of the new |OpPhi| + // instruction. + void CreatePhiNodesForInst(ir::BasicBlock* merge_block, uint32_t predecessor, + ir::Instruction& inst); + + // Traverse the nodes in |new_merge_nodes_|, and adds the OpPhi instructions + // that are needed to make the code correct. It is assumed that at this point + // there are no unreachable blocks in the control flow graph. + void AddNewPhiNodes(); + + // Creates any new phi nodes that are needed in |bb| now that |pred| is no + // longer the only block that preceedes |bb|. |header_id| is the id of the + // basic block for the loop or selection construct that merges at |bb|. + void AddNewPhiNodes(ir::BasicBlock* bb, ir::BasicBlock* pred, + uint32_t header_id); + + // Saves |block| to a list of basic block that will require OpPhi nodes to be + // added by calling |AddNewPhiNodes|. It is assumed that |block| used to have + // a single predecessor, |single_original_pred|, but now has more. + void MarkForNewPhiNodes(ir::BasicBlock* block, + ir::BasicBlock* single_original_pred); + + // Return the original single predcessor of |block| if it was flagged as + // having a single predecessor. |nullptr| is returned otherwise. + ir::BasicBlock* MarkedSinglePred(ir::BasicBlock* block) { + auto it = new_merge_nodes_.find(block); + if (it != new_merge_nodes_.end()) { + return it->second; + } else { + return nullptr; + } + } + + StructuredControlState& CurrentState() { return state_.back(); } + + // A stack used to keep track of the innermost contain loop and selection + // constructs. + std::vector state_; + + // The current function being transformed. + ir::Function* function_; + + // The |OpVariable| instruction defining a boolean variable used to keep track + // of whether or not the function is trying to return. + ir::Instruction* return_flag_; + + // The |OpVariable| instruction defining a variabled to used to keep track of + // the value that was returned when passing through a block that use to + // contain an |OpReturnValue|. + ir::Instruction* return_value_; + + // The instruction defining the boolean constant true. + ir::Instruction* constant_true_; + + // The basic block that is suppose to become the contain the only return value + // after processing the current function. + ir::BasicBlock* final_return_block_; + // This map contains the set of nodes that use to have a single predcessor, + // but now have more. They will need new OpPhi nodes. For each of the nodes, + // it is mapped to it original single predcessor. It is assumed there are no + // values that will need a phi on the new edges. + std::unordered_map new_merge_nodes_; }; } // namespace opt diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/module.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/module.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/module.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/module.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -30,7 +30,7 @@ if (IsTypeInst(inst.opcode())) type_insts.push_back(&inst); } return type_insts; -}; +} std::vector Module::GetTypes() const { std::vector type_insts; @@ -38,7 +38,7 @@ if (IsTypeInst(inst.opcode())) type_insts.push_back(&inst); } return type_insts; -}; +} std::vector Module::GetConstants() { std::vector const_insts; @@ -46,7 +46,7 @@ if (IsConstantInst(inst.opcode())) const_insts.push_back(&inst); } return const_insts; -}; +} std::vector Module::GetConstants() const { std::vector const_insts; @@ -54,7 +54,7 @@ if (IsConstantInst(inst.opcode())) const_insts.push_back(&inst); } return const_insts; -}; +} uint32_t Module::GetGlobalValue(SpvOp opcode) const { for (auto& inst : types_values_) { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/optimizer.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/optimizer.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/optimizer.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/optimizer.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -18,6 +18,7 @@ #include "make_unique.h" #include "pass_manager.h" #include "passes.h" +#include "simplification_pass.h" namespace spvtools { @@ -89,24 +90,40 @@ // or enable more copy propagation. Optimizer& Optimizer::RegisterLegalizationPasses() { return - // Make sure uses and definitions are in the same function. - RegisterPass(CreateInlineExhaustivePass()) + // Remove unreachable block so that merge return works. + RegisterPass(CreateDeadBranchElimPass()) + // Merge the returns so we can inline. + .RegisterPass(CreateMergeReturnPass()) + // Make sure uses and definitions are in the same function. + .RegisterPass(CreateInlineExhaustivePass()) // Make private variable function scope .RegisterPass(CreateEliminateDeadFunctionsPass()) .RegisterPass(CreatePrivateToLocalPass()) + // Propagate the value stored to the loads in very simple cases. + .RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()) + .RegisterPass(CreateLocalSingleStoreElimPass()) + .RegisterPass(CreateAggressiveDCEPass()) // Split up aggragates so they are easier to deal with. .RegisterPass(CreateScalarReplacementPass()) // Remove loads and stores so everything is in intermediate values. // Takes care of copy propagation of non-members. .RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()) .RegisterPass(CreateLocalSingleStoreElimPass()) + .RegisterPass(CreateAggressiveDCEPass()) .RegisterPass(CreateLocalMultiStoreElimPass()) + .RegisterPass(CreateAggressiveDCEPass()) + // Propagate constants to get as many constant conditions on branches + // as possible. + .RegisterPass(CreateCCPPass()) + .RegisterPass(CreateDeadBranchElimPass()) // Copy propagate members. Cleans up code sequences generated by - // scalar replacement. + // scalar replacement. Also important for removing OpPhi nodes. + .RegisterPass(CreateSimplificationPass()) .RegisterPass(CreateInsertExtractElimPass()) + .RegisterPass(CreateAggressiveDCEPass()) + .RegisterPass(CreateCopyPropagateArraysPass()) // May need loop unrolling here see // https://github.com/Microsoft/DirectXShaderCompiler/pull/930 - .RegisterPass(CreateDeadBranchElimPass()) // Get rid of unused code that contain traces of illegal code // or unused references to unbound external objects .RegisterPass(CreateDeadInsertElimPass()) @@ -118,18 +135,25 @@ .RegisterPass(CreateMergeReturnPass()) .RegisterPass(CreateInlineExhaustivePass()) .RegisterPass(CreateAggressiveDCEPass()) + .RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()) + .RegisterPass(CreateLocalSingleStoreElimPass()) + .RegisterPass(CreateAggressiveDCEPass()) .RegisterPass(CreateScalarReplacementPass()) .RegisterPass(CreateLocalAccessChainConvertPass()) .RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()) .RegisterPass(CreateLocalSingleStoreElimPass()) + .RegisterPass(CreateAggressiveDCEPass()) .RegisterPass(CreateLocalMultiStoreElimPass()) + .RegisterPass(CreateAggressiveDCEPass()) .RegisterPass(CreateCCPPass()) .RegisterPass(CreateAggressiveDCEPass()) .RegisterPass(CreateRedundancyEliminationPass()) .RegisterPass(CreateInsertExtractElimPass()) .RegisterPass(CreateDeadInsertElimPass()) .RegisterPass(CreateDeadBranchElimPass()) + .RegisterPass(CreateSimplificationPass()) .RegisterPass(CreateIfConversionPass()) + .RegisterPass(CreateCopyPropagateArraysPass()) .RegisterPass(CreateAggressiveDCEPass()) .RegisterPass(CreateBlockMergePass()) .RegisterPass(CreateRedundancyEliminationPass()) @@ -149,9 +173,11 @@ .RegisterPass(CreateLocalAccessChainConvertPass()) .RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()) .RegisterPass(CreateLocalSingleStoreElimPass()) + .RegisterPass(CreateAggressiveDCEPass()) .RegisterPass(CreateInsertExtractElimPass()) .RegisterPass(CreateDeadInsertElimPass()) .RegisterPass(CreateLocalMultiStoreElimPass()) + .RegisterPass(CreateAggressiveDCEPass()) .RegisterPass(CreateCCPPass()) .RegisterPass(CreateAggressiveDCEPass()) .RegisterPass(CreateDeadBranchElimPass()) @@ -192,6 +218,11 @@ return *this; } +Optimizer& Optimizer::SetTimeReport(std::ostream* out) { + impl_->pass_manager.SetTimeReport(out); + return *this; +} + Optimizer::PassToken CreateNullPass() { return MakeUnique(MakeUnique()); } @@ -201,6 +232,11 @@ MakeUnique()); } +Optimizer::PassToken CreateStripReflectInfoPass() { + return MakeUnique( + MakeUnique()); +} + Optimizer::PassToken CreateEliminateDeadFunctionsPass() { return MakeUnique( MakeUnique()); @@ -341,6 +377,15 @@ MakeUnique()); } +Optimizer::PassToken CreateLoopInvariantCodeMotionPass() { + return MakeUnique(MakeUnique()); +} + +Optimizer::PassToken CreateLoopUnswitchPass() { + return MakeUnique( + MakeUnique()); +} + Optimizer::PassToken CreateRedundancyEliminationPass() { return MakeUnique( MakeUnique()); @@ -379,4 +424,25 @@ return MakeUnique( MakeUnique()); } + +Optimizer::PassToken CreateSimplificationPass() { + return MakeUnique( + MakeUnique()); +} + +Optimizer::PassToken CreateLoopUnrollPass(bool fully_unroll, int factor) { + return MakeUnique( + MakeUnique(fully_unroll, factor)); +} + +Optimizer::PassToken CreateSSARewritePass() { + return MakeUnique( + MakeUnique()); +} + +Optimizer::PassToken CreateCopyPropagateArraysPass() { + return MakeUnique( + MakeUnique()); +} + } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/passes.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/passes.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/passes.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/passes.h 2018-04-27 11:46:32.000000000 +0000 @@ -23,6 +23,7 @@ #include "cfg_cleanup_pass.h" #include "common_uniform_elim_pass.h" #include "compact_ids_pass.h" +#include "copy_prop_arrays.h" #include "dead_branch_elim_pass.h" #include "dead_insert_elim_pass.h" #include "dead_variable_elimination.h" @@ -35,11 +36,14 @@ #include "inline_exhaustive_pass.h" #include "inline_opaque_pass.h" #include "insert_extract_elim.h" +#include "licm_pass.h" #include "local_access_chain_convert_pass.h" #include "local_redundancy_elimination.h" #include "local_single_block_elim_pass.h" #include "local_single_store_elim_pass.h" #include "local_ssa_elim_pass.h" +#include "loop_unroller.h" +#include "loop_unswitch_pass.h" #include "merge_return_pass.h" #include "null_pass.h" #include "private_to_local_pass.h" @@ -48,9 +52,10 @@ #include "replace_invalid_opc.h" #include "scalar_replacement_pass.h" #include "set_spec_constant_default_value_pass.h" +#include "ssa_rewrite_pass.h" #include "strength_reduction_pass.h" #include "strip_debug_info_pass.h" +#include "strip_reflect_info_pass.h" #include "unify_const_pass.h" #include "workaround1209.h" - #endif // LIBSPIRV_OPT_PASSES_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/pass.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -82,6 +82,10 @@ return context()->get_decoration_mgr(); } + FeatureManager* get_feature_mgr() const { + return context()->get_feature_mgr(); + } + // Returns a pointer to the current module for this pass. ir::Module* get_module() const { return context_->module(); } @@ -126,6 +130,9 @@ return ir::IRContext::kAnalysisNone; } + // Return type id for |ptrInst|'s pointee + uint32_t GetPointeeTypeId(const ir::Instruction* ptrInst) const; + protected: // Initialize basic data structures for the pass. This sets up the def-use // manager, module and other attributes. @@ -136,9 +143,6 @@ // succesful to indicate whether changes are made to the module. virtual Status Process(ir::IRContext* context) = 0; - // Return type id for |ptrInst|'s pointee - uint32_t GetPointeeTypeId(const ir::Instruction* ptrInst) const; - // Return the next available SSA id and increment it. uint32_t TakeNextId() { return context_->TakeNextId(); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/pass_manager.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/pass_manager.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/pass_manager.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/pass_manager.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -19,6 +19,7 @@ #include "ir_context.h" #include "spirv-tools/libspirv.hpp" +#include "util/timer.h" namespace spvtools { @@ -41,8 +42,10 @@ } }; + SPIRV_TIMER_DESCRIPTION(time_report_stream_, /* measure_mem_usage = */ true); for (const auto& pass : passes_) { print_disassembly("; IR before pass ", pass.get()); + SPIRV_TIMER_SCOPED(time_report_stream_, (pass ? pass->name() : ""), true); const auto one_status = pass->Run(context); if (one_status == Pass::Status::Failure) return one_status; if (one_status == Pass::Status::SuccessWithChange) status = one_status; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/pass_manager.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/pass_manager.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/pass_manager.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/pass_manager.h 2018-04-27 11:46:32.000000000 +0000 @@ -39,7 +39,10 @@ // The constructed instance will have an empty message consumer, which just // ignores all messages from the library. Use SetMessageConsumer() to supply // one if messages are of concern. - PassManager() : consumer_(nullptr), print_all_stream_(nullptr) {} + PassManager() + : consumer_(nullptr), + print_all_stream_(nullptr), + time_report_stream_(nullptr) {} // Sets the message consumer to the given |consumer|. void SetMessageConsumer(MessageConsumer c) { consumer_ = std::move(c); } @@ -77,6 +80,14 @@ return *this; } + // Sets the option to print the resource utilization of each pass. Output is + // written to |out| if that is not null. No output is generated if |out| is + // null. + PassManager& SetTimeReport(std::ostream* out) { + time_report_stream_ = out; + return *this; + } + private: // Consumer for messages. MessageConsumer consumer_; @@ -85,6 +96,9 @@ // The output stream to write disassembly to before each pass, and after // the last pass. If this is null, no output is generated. std::ostream* print_all_stream_; + // The output stream to write the resource utilization of each pass. If this + // is null, no output is generated. + std::ostream* time_report_stream_; }; inline void PassManager::AddPass(std::unique_ptr pass) { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/private_to_local_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/private_to_local_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/private_to_local_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/private_to_local_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -125,6 +125,7 @@ switch (inst->opcode()) { case SpvOpLoad: case SpvOpStore: + case SpvOpImageTexelPointer: // Treat like a load return true; case SpvOpAccessChain: return context()->get_def_use_mgr()->WhileEachUser( @@ -146,6 +147,7 @@ switch (inst->opcode()) { case SpvOpLoad: case SpvOpStore: + case SpvOpImageTexelPointer: // Treat like a load // The type is fine because it is the type pointed to, and that does not // change. break; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/private_to_local_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/private_to_local_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/private_to_local_pass.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/private_to_local_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -33,7 +33,8 @@ return ir::IRContext::kAnalysisDefUse | ir::IRContext::kAnalysisDecorations | ir::IRContext::kAnalysisCombinators | ir::IRContext::kAnalysisCFG | - ir::IRContext::kAnalysisDominatorAnalysis; + ir::IRContext::kAnalysisDominatorAnalysis | + ir::IRContext::kAnalysisNameMap; } private: @@ -43,18 +44,19 @@ // |inst| is an instruction declaring a varible. If that variable is // referenced in a single function and all of uses are valid as defined by - // |IsValidUse|, then that function is returned. Otherwise, the return value - // is |nullptr|. + // |IsValidUse|, then that function is returned. Otherwise, the return + // value is |nullptr|. ir::Function* FindLocalFunction(const ir::Instruction& inst) const; - // Returns true is |inst| is a valid use of a pointer. In this case, a valid - // use is one where the transformation is able to rewrite the type to match a - // change in storage class of the original variable. + // Returns true is |inst| is a valid use of a pointer. In this case, a + // valid use is one where the transformation is able to rewrite the type to + // match a change in storage class of the original variable. bool IsValidUse(const ir::Instruction* inst) const; - // Given the result id of a pointer type, |old_type_id|, this function returns - // the id of a the same pointer type except the storage class has been changed - // to function. If the type does not already exist, it will be created. + // Given the result id of a pointer type, |old_type_id|, this function + // returns the id of a the same pointer type except the storage class has + // been changed to function. If the type does not already exist, it will be + // created. uint32_t GetNewType(uint32_t old_type_id); // Updates |inst|, and any instruction dependent on |inst|, to reflect the diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/propagator.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/propagator.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/propagator.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/propagator.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -36,22 +36,14 @@ blocks_.push(dest_bb); } -void SSAPropagator::AddSSAEdges(ir::Instruction* instr, bool traverse_phis) { +void SSAPropagator::AddSSAEdges(ir::Instruction* instr) { // Ignore instructions that produce no result. if (instr->result_id() == 0) { return; } get_def_use_mgr()->ForEachUser( - instr->result_id(), [this, traverse_phis](ir::Instruction* use_instr) { - // If |use_instr| is a Phi, ignore this edge. Phi instructions can form - // cycles in the def-use web, which would get the propagator into an - // infinite loop. Phi instructions are always simulated when a block is - // visited, so there is no need to traverse the SSA edges into them. - if (!traverse_phis && use_instr->opcode() == SpvOpPhi) { - return; - } - + instr->result_id(), [this](ir::Instruction* use_instr) { // If the basic block for |use_instr| has not been simulated yet, do // nothing. The instruction |use_instr| will be simulated next time the // block is scheduled. @@ -75,6 +67,23 @@ return IsEdgeExecutable(Edge(in_bb, phi_bb)); } +bool SSAPropagator::SetStatus(ir::Instruction* inst, PropStatus status) { + bool has_old_status = false; + PropStatus old_status = kVarying; + if (HasStatus(inst)) { + has_old_status = true; + old_status = Status(inst); + } + + assert((!has_old_status || old_status <= status) && + "Invalid lattice transition"); + + bool status_changed = !has_old_status || (old_status != status); + if (status_changed) statuses_[inst] = status; + + return status_changed; +} + bool SSAPropagator::Simulate(ir::Instruction* instr) { bool changed = false; @@ -85,13 +94,15 @@ ir::BasicBlock* dest_bb = nullptr; PropStatus status = visit_fn_(instr, &dest_bb); + bool status_changed = SetStatus(instr, status); if (status == kVarying) { // The statement produces a varying result, add it to the list of statements // not to simulate anymore and add its SSA def-use edges for simulation. - // Force re-simulation of all uses of this instruction. DontSimulateAgain(instr); - AddSSAEdges(instr, /* traverse_phis = */ true); + if (status_changed) { + AddSSAEdges(instr); + } // If |instr| is a block terminator, add all the control edges out of its // block. @@ -103,13 +114,16 @@ } return false; } else if (status == kInteresting) { - // Add the SSA edges coming out of this instruction. - AddSSAEdges(instr); + // Add the SSA edges coming out of this instruction if the propagation + // status has changed. + if (status_changed) { + AddSSAEdges(instr); + } // If there are multiple outgoing control flow edges and we know which one // will be taken, add the destination block to the CFG work list. if (dest_bb) { - blocks_.push(dest_bb); + AddControlEdge(Edge(ctx_->get_instr_block(instr), dest_bb)); } changed = true; } @@ -244,8 +258,34 @@ } } +#ifndef NDEBUG + // Verify all visited values have settled. No value that has been simulated + // should end on not interesting. + fn->ForEachInst([this](ir::Instruction* inst) { + assert( + (!HasStatus(inst) || Status(inst) != SSAPropagator::kNotInteresting) && + "Unsettled value"); + }); +#endif + return changed; } +std::ostream& operator<<(std::ostream& str, + const SSAPropagator::PropStatus& status) { + switch (status) { + case SSAPropagator::kVarying: + str << "Varying"; + break; + case SSAPropagator::kInteresting: + str << "Interesting"; + break; + default: + str << "Not interesting"; + break; + } + return str; +} + } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/propagator.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/propagator.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/propagator.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/propagator.h 2018-04-27 11:46:32.000000000 +0000 @@ -198,6 +198,20 @@ // Instruction::GetSingleWordOperand. bool IsPhiArgExecutable(ir::Instruction* phi, uint32_t i) const; + // Returns true if |inst| has a recorded status. This will be true once |inst| + // has been simulated once. + bool HasStatus(ir::Instruction* inst) const { return statuses_.count(inst); } + + // Returns the current propagation status of |inst|. Assumes + // |HasStatus(inst)| returns true. + PropStatus Status(ir::Instruction* inst) const { + return statuses_.find(inst)->second; + } + + // Records the propagation status |status| for |inst|. Returns true if the + // status for |inst| has changed or set was set for the first time. + bool SetStatus(ir::Instruction* inst, PropStatus status); + private: // Initialize processing. void Initialize(ir::Function* fn); @@ -253,13 +267,8 @@ void AddControlEdge(const Edge& e); // Adds all the instructions that use the result of |instr| to the SSA edges - // work list. If |instr| produces no result id, this does nothing. This also - // does nothing if the instruction at the end of the def-use is a Phi - // instruction. Phi instructions are treated specially because (a) they can - // be in def-use cycles with other Phi instructions, and (b) they are always - // executed when a basic block is simulated (see the description of the Sparse - // Conditional Constant algorithm in the original paper). - void AddSSAEdges(ir::Instruction* instr, bool traverse_phis = false); + // work list. If |instr| produces no result id, this does nothing. + void AddSSAEdges(ir::Instruction* instr); // IR context to use. ir::IRContext* ctx_; @@ -296,8 +305,14 @@ // Set of executable CFG edges. std::set executable_edges_; + + // Tracks instruction propagation status. + std::unordered_map statuses_; }; +std::ostream& operator<<(std::ostream& str, + const SSAPropagator::PropStatus& status); + } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/reflect.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/reflect.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/reflect.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/reflect.h 2018-04-27 11:46:32.000000000 +0000 @@ -39,7 +39,8 @@ } inline bool IsAnnotationInst(SpvOp opcode) { return (opcode >= SpvOpDecorate && opcode <= SpvOpGroupMemberDecorate) || - opcode == SpvOpDecorateId; + opcode == SpvOpDecorateId || opcode == SpvOpDecorateStringGOOGLE || + opcode == SpvOpMemberDecorateStringGOOGLE; } inline bool IsTypeInst(SpvOp opcode) { return (opcode >= SpvOpTypeVoid && opcode <= SpvOpTypeForwardPointer) || diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/remove_duplicates_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/remove_duplicates_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/remove_duplicates_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/remove_duplicates_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -130,6 +130,7 @@ visited_types.emplace_back(i); } else { // The same type has already been seen before, remove this one. + ir_context->KillNamesAndDecorates(i->result_id()); ir_context->ReplaceAllUsesWith(i->result_id(), id_to_keep); modified = true; to_delete.emplace_back(i); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/scalar_analysis.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/scalar_analysis.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/scalar_analysis.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/scalar_analysis.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,638 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include "opt/scalar_analysis.h" + +#include +#include +#include +#include + +#include "opt/ir_context.h" + +// Transforms a given scalar operation instruction into a DAG representation. +// +// 1. Take an instruction and traverse its operands until we reach a +// constant node or an instruction which we do not know how to compute the +// value, such as a load. +// +// 2. Create a new node for each instruction traversed and build the nodes for +// the in operands of that instruction as well. +// +// 3. Add the operand nodes as children of the first and hash the node. Use the +// hash to see if the node is already in the cache. We ensure the children are +// always in sorted order so that two nodes with the same children but inserted +// in a different order have the same hash and so that the overloaded operator== +// will return true. If the node is already in the cache return the cached +// version instead. +// +// 4. The created DAG can then be simplified by +// ScalarAnalysis::SimplifyExpression, implemented in +// scalar_analysis_simplification.cpp. See that file for further information on +// the simplification process. +// + +namespace spvtools { +namespace opt { + +uint32_t SENode::NumberOfNodes = 0; + +ScalarEvolutionAnalysis::ScalarEvolutionAnalysis(ir::IRContext* context) + : context_(context) { + // Create and cached the CantComputeNode. + cached_cant_compute_ = + GetCachedOrAdd(std::unique_ptr(new SECantCompute(this))); +} + +SENode* ScalarEvolutionAnalysis::CreateNegation(SENode* operand) { + // If operand is can't compute then the whole graph is can't compute. + if (operand->IsCantCompute()) return CreateCantComputeNode(); + + if (operand->GetType() == SENode::Constant) { + return CreateConstant(-operand->AsSEConstantNode()->FoldToSingleValue()); + } + std::unique_ptr negation_node{new SENegative(this)}; + negation_node->AddChild(operand); + return GetCachedOrAdd(std::move(negation_node)); +} + +SENode* ScalarEvolutionAnalysis::CreateConstant(int64_t integer) { + return GetCachedOrAdd( + std::unique_ptr(new SEConstantNode(this, integer))); +} + +SENode* ScalarEvolutionAnalysis::CreateRecurrentExpression( + const ir::Loop* loop, SENode* offset, SENode* coefficient) { + assert(loop && "Recurrent add expressions must have a valid loop."); + + // If operands are can't compute then the whole graph is can't compute. + if (offset->IsCantCompute() || coefficient->IsCantCompute()) + return CreateCantComputeNode(); + + std::unique_ptr phi_node{new SERecurrentNode(this, loop)}; + phi_node->AddOffset(offset); + phi_node->AddCoefficient(coefficient); + + return GetCachedOrAdd(std::move(phi_node)); +} + +SENode* ScalarEvolutionAnalysis::AnalyzeMultiplyOp( + const ir::Instruction* multiply) { + assert(multiply->opcode() == SpvOp::SpvOpIMul && + "Multiply node did not come from a multiply instruction"); + opt::analysis::DefUseManager* def_use = context_->get_def_use_mgr(); + + SENode* op1 = + AnalyzeInstruction(def_use->GetDef(multiply->GetSingleWordInOperand(0))); + SENode* op2 = + AnalyzeInstruction(def_use->GetDef(multiply->GetSingleWordInOperand(1))); + + return CreateMultiplyNode(op1, op2); +} + +SENode* ScalarEvolutionAnalysis::CreateMultiplyNode(SENode* operand_1, + SENode* operand_2) { + // If operands are can't compute then the whole graph is can't compute. + if (operand_1->IsCantCompute() || operand_2->IsCantCompute()) + return CreateCantComputeNode(); + + if (operand_1->GetType() == SENode::Constant && + operand_2->GetType() == SENode::Constant) { + return CreateConstant(operand_1->AsSEConstantNode()->FoldToSingleValue() * + operand_2->AsSEConstantNode()->FoldToSingleValue()); + } + + std::unique_ptr multiply_node{new SEMultiplyNode(this)}; + + multiply_node->AddChild(operand_1); + multiply_node->AddChild(operand_2); + + return GetCachedOrAdd(std::move(multiply_node)); +} + +SENode* ScalarEvolutionAnalysis::CreateSubtraction(SENode* operand_1, + SENode* operand_2) { + // Fold if both operands are constant. + if (operand_1->GetType() == SENode::Constant && + operand_2->GetType() == SENode::Constant) { + return CreateConstant(operand_1->AsSEConstantNode()->FoldToSingleValue() - + operand_2->AsSEConstantNode()->FoldToSingleValue()); + } + + return CreateAddNode(operand_1, CreateNegation(operand_2)); +} + +SENode* ScalarEvolutionAnalysis::CreateAddNode(SENode* operand_1, + SENode* operand_2) { + // Fold if both operands are constant and the |simplify| flag is true. + if (operand_1->GetType() == SENode::Constant && + operand_2->GetType() == SENode::Constant) { + return CreateConstant(operand_1->AsSEConstantNode()->FoldToSingleValue() + + operand_2->AsSEConstantNode()->FoldToSingleValue()); + } + + // If operands are can't compute then the whole graph is can't compute. + if (operand_1->IsCantCompute() || operand_2->IsCantCompute()) + return CreateCantComputeNode(); + + std::unique_ptr add_node{new SEAddNode(this)}; + + add_node->AddChild(operand_1); + add_node->AddChild(operand_2); + + return GetCachedOrAdd(std::move(add_node)); +} + +SENode* ScalarEvolutionAnalysis::AnalyzeInstruction( + const ir::Instruction* inst) { + auto itr = recurrent_node_map_.find(inst); + if (itr != recurrent_node_map_.end()) return itr->second; + + SENode* output = nullptr; + switch (inst->opcode()) { + case SpvOp::SpvOpPhi: { + output = AnalyzePhiInstruction(inst); + break; + } + case SpvOp::SpvOpConstant: + case SpvOp::SpvOpConstantNull: { + output = AnalyzeConstant(inst); + break; + } + case SpvOp::SpvOpISub: + case SpvOp::SpvOpIAdd: { + output = AnalyzeAddOp(inst); + break; + } + case SpvOp::SpvOpIMul: { + output = AnalyzeMultiplyOp(inst); + break; + } + default: { + output = CreateValueUnknownNode(inst); + break; + } + } + + return output; +} + +SENode* ScalarEvolutionAnalysis::AnalyzeConstant(const ir::Instruction* inst) { + if (inst->opcode() == SpvOp::SpvOpConstantNull) return CreateConstant(0); + + assert(inst->opcode() == SpvOp::SpvOpConstant); + assert(inst->NumInOperands() == 1); + int64_t value = 0; + + // Look up the instruction in the constant manager. + const opt::analysis::Constant* constant = + context_->get_constant_mgr()->FindDeclaredConstant(inst->result_id()); + + if (!constant) return CreateCantComputeNode(); + + const opt::analysis::IntConstant* int_constant = constant->AsIntConstant(); + + // Exit out if it is a 64 bit integer. + if (!int_constant || int_constant->words().size() != 1) + return CreateCantComputeNode(); + + if (int_constant->type()->AsInteger()->IsSigned()) { + value = int_constant->GetS32BitValue(); + } else { + value = int_constant->GetU32BitValue(); + } + + return CreateConstant(value); +} + +// Handles both addition and subtraction. If the |sub| flag is set then the +// addition will be op1+(-op2) otherwise op1+op2. +SENode* ScalarEvolutionAnalysis::AnalyzeAddOp(const ir::Instruction* inst) { + assert((inst->opcode() == SpvOp::SpvOpIAdd || + inst->opcode() == SpvOp::SpvOpISub) && + "Add node must be created from a OpIAdd or OpISub instruction"); + + opt::analysis::DefUseManager* def_use = context_->get_def_use_mgr(); + + SENode* op1 = + AnalyzeInstruction(def_use->GetDef(inst->GetSingleWordInOperand(0))); + + SENode* op2 = + AnalyzeInstruction(def_use->GetDef(inst->GetSingleWordInOperand(1))); + + // To handle subtraction we wrap the second operand in a unary negation node. + if (inst->opcode() == SpvOp::SpvOpISub) { + op2 = CreateNegation(op2); + } + + return CreateAddNode(op1, op2); +} + +SENode* ScalarEvolutionAnalysis::AnalyzePhiInstruction( + const ir::Instruction* phi) { + // The phi should only have two incoming value pairs. + if (phi->NumInOperands() != 4) { + return CreateCantComputeNode(); + } + + opt::analysis::DefUseManager* def_use = context_->get_def_use_mgr(); + + // Get the basic block this instruction belongs to. + ir::BasicBlock* basic_block = + context_->get_instr_block(const_cast(phi)); + + // And then the function that the basic blocks belongs to. + ir::Function* function = basic_block->GetParent(); + + // Use the function to get the loop descriptor. + ir::LoopDescriptor* loop_descriptor = context_->GetLoopDescriptor(function); + + // We only handle phis in loops at the moment. + if (!loop_descriptor) return CreateCantComputeNode(); + + // Get the innermost loop which this block belongs to. + ir::Loop* loop = (*loop_descriptor)[basic_block->id()]; + + // If the loop doesn't exist or doesn't have a preheader or latch block, exit + // out. + if (!loop || !loop->GetLatchBlock() || !loop->GetPreHeaderBlock() || + loop->GetHeaderBlock() != basic_block) + return recurrent_node_map_[phi] = CreateCantComputeNode(); + + std::unique_ptr phi_node{new SERecurrentNode(this, loop)}; + + // We add the node to this map to allow it to be returned before the node is + // fully built. This is needed as the subsequent call to AnalyzeInstruction + // could lead back to this |phi| instruction so we return the pointer + // immediately in AnalyzeInstruction to break the recursion. + recurrent_node_map_[phi] = phi_node.get(); + + // Traverse the operands of the instruction an create new nodes for each one. + for (uint32_t i = 0; i < phi->NumInOperands(); i += 2) { + uint32_t value_id = phi->GetSingleWordInOperand(i); + uint32_t incoming_label_id = phi->GetSingleWordInOperand(i + 1); + + ir::Instruction* value_inst = def_use->GetDef(value_id); + SENode* value_node = AnalyzeInstruction(value_inst); + + // If any operand is CantCompute then the whole graph is CantCompute. + if (value_node->IsCantCompute()) + return recurrent_node_map_[phi] = CreateCantComputeNode(); + + // If the value is coming from the preheader block then the value is the + // initial value of the phi. + if (incoming_label_id == loop->GetPreHeaderBlock()->id()) { + phi_node->AddOffset(value_node); + } else if (incoming_label_id == loop->GetLatchBlock()->id()) { + // Assumed to be in the form of step + phi. + if (value_node->GetType() != SENode::Add) + return recurrent_node_map_[phi] = CreateCantComputeNode(); + + SENode* step_node = nullptr; + SENode* phi_operand = nullptr; + SENode* operand_1 = value_node->GetChild(0); + SENode* operand_2 = value_node->GetChild(1); + + // Find which node is the step term. + if (!operand_1->AsSERecurrentNode()) + step_node = operand_1; + else if (!operand_2->AsSERecurrentNode()) + step_node = operand_2; + + // Find which node is the recurrent expression. + if (operand_1->AsSERecurrentNode()) + phi_operand = operand_1; + else if (operand_2->AsSERecurrentNode()) + phi_operand = operand_2; + + // If it is not in the form step + phi exit out. + if (!(step_node && phi_operand)) + return recurrent_node_map_[phi] = CreateCantComputeNode(); + + // If the phi operand is not the same phi node exit out. + if (phi_operand != phi_node.get()) + return recurrent_node_map_[phi] = CreateCantComputeNode(); + + if (!IsLoopInvariant(loop, step_node)) + return recurrent_node_map_[phi] = CreateCantComputeNode(); + + phi_node->AddCoefficient(step_node); + } + } + + // Once the node is fully built we update the map with the version from the + // cache (if it has already been added to the cache). + return recurrent_node_map_[phi] = GetCachedOrAdd(std::move(phi_node)); +} + +SENode* ScalarEvolutionAnalysis::CreateValueUnknownNode( + const ir::Instruction* inst) { + std::unique_ptr load_node{ + new SEValueUnknown(this, inst->result_id())}; + return GetCachedOrAdd(std::move(load_node)); +} + +SENode* ScalarEvolutionAnalysis::CreateCantComputeNode() { + return cached_cant_compute_; +} + +// Add the created node into the cache of nodes. If it already exists return it. +SENode* ScalarEvolutionAnalysis::GetCachedOrAdd( + std::unique_ptr prospective_node) { + auto itr = node_cache_.find(prospective_node); + if (itr != node_cache_.end()) { + return (*itr).get(); + } + + SENode* raw_ptr_to_node = prospective_node.get(); + node_cache_.insert(std::move(prospective_node)); + return raw_ptr_to_node; +} + +bool ScalarEvolutionAnalysis::IsLoopInvariant(const ir::Loop* loop, + const SENode* node) const { + for (auto itr = node->graph_cbegin(); itr != node->graph_cend(); ++itr) { + if (const SERecurrentNode* rec = itr->AsSERecurrentNode()) { + const ir::BasicBlock* header = rec->GetLoop()->GetHeaderBlock(); + + // If the loop which the recurrent expression belongs to is either |loop + // or a nested loop inside |loop| then we assume it is variant. + if (loop->IsInsideLoop(header)) { + return false; + } + } else if (const SEValueUnknown* unknown = itr->AsSEValueUnknown()) { + // If the instruction is inside the loop we conservatively assume it is + // loop variant. + if (loop->IsInsideLoop(unknown->ResultId())) return false; + } + } + + return true; +} + +SENode* ScalarEvolutionAnalysis::GetCoefficientFromRecurrentTerm( + SENode* node, const ir::Loop* loop) { + // Traverse the DAG to find the recurrent expression belonging to |loop|. + for (auto itr = node->graph_begin(); itr != node->graph_end(); ++itr) { + SERecurrentNode* rec = itr->AsSERecurrentNode(); + if (rec && rec->GetLoop() == loop) { + return rec->GetCoefficient(); + } + } + return CreateConstant(0); +} + +SENode* ScalarEvolutionAnalysis::UpdateChildNode(SENode* parent, + SENode* old_child, + SENode* new_child) { + // Only handles add. + if (parent->GetType() != SENode::Add) return parent; + + std::vector new_children; + for (SENode* child : *parent) { + if (child == old_child) { + new_children.push_back(new_child); + } else { + new_children.push_back(child); + } + } + + std::unique_ptr add_node{new SEAddNode(this)}; + for (SENode* child : new_children) { + add_node->AddChild(child); + } + + return SimplifyExpression(GetCachedOrAdd(std::move(add_node))); +} + +// Rebuild the |node| eliminating, if it exists, the recurrent term which +// belongs to the |loop|. +SENode* ScalarEvolutionAnalysis::BuildGraphWithoutRecurrentTerm( + SENode* node, const ir::Loop* loop) { + // If the node is already a recurrent expression belonging to loop then just + // return the offset. + SERecurrentNode* recurrent = node->AsSERecurrentNode(); + if (recurrent) { + if (recurrent->GetLoop() == loop) { + return recurrent->GetOffset(); + } else { + return node; + } + } + + std::vector new_children; + // Otherwise find the recurrent node in the children of this node. + for (auto itr : *node) { + recurrent = itr->AsSERecurrentNode(); + if (recurrent && recurrent->GetLoop() == loop) { + new_children.push_back(recurrent->GetOffset()); + } else { + new_children.push_back(itr); + } + } + + std::unique_ptr add_node{new SEAddNode(this)}; + for (SENode* child : new_children) { + add_node->AddChild(child); + } + + return SimplifyExpression(GetCachedOrAdd(std::move(add_node))); +} + +// Return the recurrent term belonging to |loop| if it appears in the graph +// starting at |node| or null if it doesn't. +SERecurrentNode* ScalarEvolutionAnalysis::GetRecurrentTerm( + SENode* node, const ir::Loop* loop) { + for (auto itr = node->graph_begin(); itr != node->graph_end(); ++itr) { + SERecurrentNode* rec = itr->AsSERecurrentNode(); + if (rec && rec->GetLoop() == loop) { + return rec; + } + } + return nullptr; +} +std::string SENode::AsString() const { + switch (GetType()) { + case Constant: + return "Constant"; + case RecurrentAddExpr: + return "RecurrentAddExpr"; + case Add: + return "Add"; + case Negative: + return "Negative"; + case Multiply: + return "Multiply"; + case ValueUnknown: + return "Value Unknown"; + case CanNotCompute: + return "Can not compute"; + } + return "NULL"; +} + +bool SENode::operator==(const SENode& other) const { + if (GetType() != other.GetType()) return false; + + if (other.GetChildren().size() != children_.size()) return false; + + const SERecurrentNode* this_as_recurrent = AsSERecurrentNode(); + + // Check the children are the same, for SERecurrentNodes we need to check the + // offset and coefficient manually as the child vector is sorted by ids so the + // offset/coefficient information is lost. + if (!this_as_recurrent) { + for (size_t index = 0; index < children_.size(); ++index) { + if (other.GetChildren()[index] != children_[index]) return false; + } + } else { + const SERecurrentNode* other_as_recurrent = other.AsSERecurrentNode(); + + // We've already checked the types are the same, this should not fail if + // this->AsSERecurrentNode() succeeded. + assert(other_as_recurrent); + + if (this_as_recurrent->GetCoefficient() != + other_as_recurrent->GetCoefficient()) + return false; + + if (this_as_recurrent->GetOffset() != other_as_recurrent->GetOffset()) + return false; + + if (this_as_recurrent->GetLoop() != other_as_recurrent->GetLoop()) + return false; + } + + // If we're dealing with a value unknown node check both nodes were created by + // the same instruction. + if (GetType() == SENode::ValueUnknown) { + if (AsSEValueUnknown()->ResultId() != + other.AsSEValueUnknown()->ResultId()) { + return false; + } + } + + if (AsSEConstantNode()) { + if (AsSEConstantNode()->FoldToSingleValue() != + other.AsSEConstantNode()->FoldToSingleValue()) + return false; + } + + return true; +} + +bool SENode::operator!=(const SENode& other) const { return !(*this == other); } + +namespace { +// Helper functions to insert 32/64 bit values into the 32 bit hash string. This +// allows us to add pointers to the string by reinterpreting the pointers as +// uintptr_t. PushToString will deduce the type, call sizeof on it and use +// that size to call into the correct PushToStringImpl functor depending on +// whether it is 32 or 64 bit. + +template +struct PushToStringImpl; + +template +struct PushToStringImpl { + void operator()(T id, std::u32string* str) { + str->push_back(static_cast(id >> 32)); + str->push_back(static_cast(id)); + } +}; + +template +struct PushToStringImpl { + void operator()(T id, std::u32string* str) { + str->push_back(static_cast(id)); + } +}; + +template +static void PushToString(T id, std::u32string* str) { + PushToStringImpl{}(id, str); +} + +} // namespace + +// Implements the hashing of SENodes. +size_t SENodeHash::operator()(const SENode* node) const { + // Concatinate the terms into a string which we can hash. + std::u32string hash_string{}; + + // Hashing the type as a string is safer than hashing the enum as the enum is + // very likely to collide with constants. + for (char ch : node->AsString()) { + hash_string.push_back(static_cast(ch)); + } + + // We just ignore the literal value unless it is a constant. + if (node->GetType() == SENode::Constant) + PushToString(node->AsSEConstantNode()->FoldToSingleValue(), &hash_string); + + const SERecurrentNode* recurrent = node->AsSERecurrentNode(); + + // If we're dealing with a recurrent expression hash the loop as well so that + // nested inductions like i=0,i++ and j=0,j++ correspond to different nodes. + if (recurrent) { + PushToString(reinterpret_cast(recurrent->GetLoop()), + &hash_string); + + // Recurrent expressions can't be hashed using the normal method as the + // order of coefficient and offset matters to the hash. + PushToString(reinterpret_cast(recurrent->GetCoefficient()), + &hash_string); + PushToString(reinterpret_cast(recurrent->GetOffset()), + &hash_string); + + return std::hash{}(hash_string); + } + + // Hash the result id of the original instruction which created this node if + // it is a value unknown node. + if (node->GetType() == SENode::ValueUnknown) { + PushToString(node->AsSEValueUnknown()->ResultId(), &hash_string); + } + + // Hash the pointers of the child nodes, each SENode has a unique pointer + // associated with it. + const std::vector& children = node->GetChildren(); + for (const SENode* child : children) { + PushToString(reinterpret_cast(child), &hash_string); + } + + return std::hash{}(hash_string); +} + +// This overload is the actual overload used by the node_cache_ set. +size_t SENodeHash::operator()(const std::unique_ptr& node) const { + return this->operator()(node.get()); +} + +void SENode::DumpDot(std::ostream& out, bool recurse) const { + size_t unique_id = std::hash{}(this); + out << unique_id << " [label=\"" << AsString() << " "; + if (GetType() == SENode::Constant) { + out << "\nwith value: " << this->AsSEConstantNode()->FoldToSingleValue(); + } + out << "\"]\n"; + for (const SENode* child : children_) { + size_t child_unique_id = std::hash{}(child); + out << unique_id << " -> " << child_unique_id << " \n"; + if (recurse) child->DumpDot(out, true); + } +} + +} // namespace opt +} // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/scalar_analysis.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/scalar_analysis.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/scalar_analysis.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/scalar_analysis.h 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,156 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#ifndef SOURCE_OPT_SCALAR_ANALYSIS_H_ +#define SOURCE_OPT_SCALAR_ANALYSIS_H_ + +#include +#include +#include +#include +#include +#include + +#include "opt/basic_block.h" +#include "opt/instruction.h" +#include "opt/scalar_analysis_nodes.h" + +namespace spvtools { +namespace ir { +class IRContext; +class Loop; +} // namespace ir + +namespace opt { + +// Manager for the Scalar Evolution analysis. Creates and maintains a DAG of +// scalar operations generated from analysing the use def graph from incoming +// instructions. Each node is hashed as it is added so like node (for instance, +// two induction variables i=0,i++ and j=0,j++) become the same node. After +// creating a DAG with AnalyzeInstruction it can the be simplified into a more +// usable form with SimplifyExpression. +class ScalarEvolutionAnalysis { + public: + explicit ScalarEvolutionAnalysis(ir::IRContext* context); + + // Create a unary negative node on |operand|. + SENode* CreateNegation(SENode* operand); + + // Creates a subtraction between the two operands by adding |operand_1| to the + // negation of |operand_2|. + SENode* CreateSubtraction(SENode* operand_1, SENode* operand_2); + + // Create an addition node between two operands. The |simplify| when set will + // allow the function to return an SEConstant instead of an addition if the + // two input operands are also constant. + SENode* CreateAddNode(SENode* operand_1, SENode* operand_2); + + // Create a multiply node between two operands. + SENode* CreateMultiplyNode(SENode* operand_1, SENode* operand_2); + + // Create a node representing a constant integer. + SENode* CreateConstant(int64_t integer); + + // Create a value unknown node, such as a load. + SENode* CreateValueUnknownNode(const ir::Instruction* inst); + + // Create a CantComputeNode. Used to exit out of analysis. + SENode* CreateCantComputeNode(); + + // Create a new recurrent node with |offset| and |coefficient|, with respect + // to |loop|. + SENode* CreateRecurrentExpression(const ir::Loop* loop, SENode* offset, + SENode* coefficient); + + // Construct the DAG by traversing use def chain of |inst|. + SENode* AnalyzeInstruction(const ir::Instruction* inst); + + // Simplify the |node| by grouping like terms or if contains a recurrent + // expression, rewrite the graph so the whole DAG (from |node| down) is in + // terms of that recurrent expression. + // + // For example. + // Induction variable i=0, i++ would produce Rec(0,1) so i+1 could be + // transformed into Rec(1,1). + // + // X+X*2+Y-Y+34-17 would be transformed into 3*X + 17, where X and Y are + // ValueUnknown nodes (such as a load instruction). + SENode* SimplifyExpression(SENode* node); + + // Add |prospective_node| into the cache and return a raw pointer to it. If + // |prospective_node| is already in the cache just return the raw pointer. + SENode* GetCachedOrAdd(std::unique_ptr prospective_node); + + // Checks that the graph starting from |node| is invariant to the |loop|. + bool IsLoopInvariant(const ir::Loop* loop, const SENode* node) const; + + // Find the recurrent term belonging to |loop| in the graph starting from + // |node| and return the coefficient of that recurrent term. Constant zero + // will be returned if no recurrent could be found. |node| should be in + // simplest form. + SENode* GetCoefficientFromRecurrentTerm(SENode* node, const ir::Loop* loop); + + // Return a rebuilt graph starting from |node| with the recurrent expression + // belonging to |loop| being zeroed out. Returned node will be simplified. + SENode* BuildGraphWithoutRecurrentTerm(SENode* node, const ir::Loop* loop); + + // Return the recurrent term belonging to |loop| if it appears in the graph + // starting at |node| or null if it doesn't. + SERecurrentNode* GetRecurrentTerm(SENode* node, const ir::Loop* loop); + + SENode* UpdateChildNode(SENode* parent, SENode* child, SENode* new_child); + + private: + SENode* AnalyzeConstant(const ir::Instruction* inst); + + // Handles both addition and subtraction. If the |instruction| is OpISub + // then the resulting node will be op1+(-op2) otherwise if it is OpIAdd then + // the result will be op1+op2. |instruction| must be OpIAdd or OpISub. + SENode* AnalyzeAddOp(const ir::Instruction* instruction); + + SENode* AnalyzeMultiplyOp(const ir::Instruction* multiply); + + SENode* AnalyzePhiInstruction(const ir::Instruction* phi); + + ir::IRContext* context_; + + // A map of instructions to SENodes. This is used to track recurrent + // expressions as they are added when analyzing instructions. Recurrent + // expressions come from phi nodes which by nature can include recursion so we + // check if nodes have already been built when analyzing instructions. + std::map recurrent_node_map_; + + // On creation we create and cache the CantCompute node so we not need to + // perform a needless create step. + SENode* cached_cant_compute_; + + // Helper functor to allow two unique_ptr to nodes to be compare. Only + // needed + // for the unordered_set implementation. + struct NodePointersEquality { + bool operator()(const std::unique_ptr& lhs, + const std::unique_ptr& rhs) const { + return *lhs == *rhs; + } + }; + + // Cache of nodes. All pointers to the nodes are references to the memory + // managed by they set. + std::unordered_set, SENodeHash, NodePointersEquality> + node_cache_; +}; + +} // namespace opt +} // namespace spvtools +#endif // SOURCE_OPT_SCALAR_ANALYSIS_H__ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/scalar_analysis_nodes.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/scalar_analysis_nodes.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/scalar_analysis_nodes.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/scalar_analysis_nodes.h 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,313 @@ +// Copyright (c) 2018 Google LLC. +// +// 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" BASI, +// 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. + +#ifndef SOURCE_OPT_SCALAR_ANALYSIS_NODES_H_ +#define SOURCE_OPT_SCALAR_ANALYSIS_NODES_H_ + +#include +#include +#include +#include +#include "opt/tree_iterator.h" + +namespace spvtools { +namespace ir { +class Loop; +} // namespace ir + +namespace opt { + +class ScalarEvolutionAnalysis; +class SEConstantNode; +class SERecurrentNode; +class SEAddNode; +class SEMultiplyNode; +class SENegative; +class SEValueUnknown; +class SECantCompute; + +// Abstract class representing a node in the scalar evolution DAG. Each node +// contains a vector of pointers to its children and each subclass of SENode +// implements GetType and an As method to allow casting. SENodes can be hashed +// using the SENodeHash functor. The vector of children is sorted when a node is +// added. This is important as it allows the hash of X+Y to be the same as Y+X. +class SENode { + public: + enum SENodeType { + Constant, + RecurrentAddExpr, + Add, + Multiply, + Negative, + ValueUnknown, + CanNotCompute + }; + + using ChildContainerType = std::vector; + + explicit SENode(opt::ScalarEvolutionAnalysis* parent_analysis) + : parent_analysis_(parent_analysis), unique_id_(++NumberOfNodes) {} + + virtual SENodeType GetType() const = 0; + + virtual ~SENode() {} + + virtual inline void AddChild(SENode* child) { + // If this is a constant node, assert. + if (AsSEConstantNode()) { + assert(false && "Trying to add a child node to a constant!"); + } + + // Find the first point in the vector where |child| is greater than the node + // currently in the vector. + auto find_first_less_than = [child](const SENode* node) { + return child->unique_id_ <= node->unique_id_; + }; + + auto position = std::find_if_not(children_.begin(), children_.end(), + find_first_less_than); + // Children are sorted so the hashing and equality operator will be the same + // for a node with the same children. X+Y should be the same as Y+X. + children_.insert(position, child); + } + + // Get the type as an std::string. This is used to represent the node in the + // dot output and is used to hash the type as well. + std::string AsString() const; + + // Dump the SENode and its immediate children, if |recurse| is true then it + // will recurse through all children to print the DAG starting from this node + // as a root. + void DumpDot(std::ostream& out, bool recurse = false) const; + + // Checks if two nodes are the same by hashing them. + bool operator==(const SENode& other) const; + + // Checks if two nodes are not the same by comparing the hashes. + bool operator!=(const SENode& other) const; + + // Return the child node at |index|. + inline SENode* GetChild(size_t index) { return children_[index]; } + inline const SENode* GetChild(size_t index) const { return children_[index]; } + + // Iterator to iterate over the child nodes. + using iterator = ChildContainerType::iterator; + using const_iterator = ChildContainerType::const_iterator; + + // Iterate over immediate child nodes. + iterator begin() { return children_.begin(); } + iterator end() { return children_.end(); } + + // Constant overloads for iterating over immediate child nodes. + const_iterator begin() const { return children_.cbegin(); } + const_iterator end() const { return children_.cend(); } + const_iterator cbegin() { return children_.cbegin(); } + const_iterator cend() { return children_.cend(); } + + // Iterator to iterate over the entire DAG. Even though we are using the tree + // iterator it should still be safe to iterate over. However, nodes with + // multiple parents will be visited multiple times, unlike in a tree. + using dag_iterator = TreeDFIterator; + using const_dag_iterator = TreeDFIterator; + + // Iterate over all child nodes in the graph. + dag_iterator graph_begin() { return dag_iterator(this); } + dag_iterator graph_end() { return dag_iterator(); } + const_dag_iterator graph_begin() const { return graph_cbegin(); } + const_dag_iterator graph_end() const { return graph_cend(); } + const_dag_iterator graph_cbegin() const { return const_dag_iterator(this); } + const_dag_iterator graph_cend() const { return const_dag_iterator(); } + + // Return the vector of immediate children. + const ChildContainerType& GetChildren() const { return children_; } + ChildContainerType& GetChildren() { return children_; } + + // Return true if this node is a cant compute node. + bool IsCantCompute() const { return GetType() == CanNotCompute; } + +// Implements a casting method for each type. +#define DeclareCastMethod(target) \ + virtual target* As##target() { return nullptr; } \ + virtual const target* As##target() const { return nullptr; } + DeclareCastMethod(SEConstantNode); + DeclareCastMethod(SERecurrentNode); + DeclareCastMethod(SEAddNode); + DeclareCastMethod(SEMultiplyNode); + DeclareCastMethod(SENegative); + DeclareCastMethod(SEValueUnknown); + DeclareCastMethod(SECantCompute); +#undef DeclareCastMethod + + // Get the analysis which has this node in its cache. + inline opt::ScalarEvolutionAnalysis* GetParentAnalysis() const { + return parent_analysis_; + } + + protected: + ChildContainerType children_; + + opt::ScalarEvolutionAnalysis* parent_analysis_; + + // The unique id of this node, assigned on creation by incrementing the static + // node count. + uint32_t unique_id_; + + // The number of nodes created. + static uint32_t NumberOfNodes; +}; + +// Function object to handle the hashing of SENodes. Hashing algorithm hashes +// the type (as a string), the literal value of any constants, and the child +// pointers which are assumed to be unique. +struct SENodeHash { + size_t operator()(const std::unique_ptr& node) const; + size_t operator()(const SENode* node) const; +}; + +// A node representing a constant integer. +class SEConstantNode : public SENode { + public: + SEConstantNode(opt::ScalarEvolutionAnalysis* parent_analysis, int64_t value) + : SENode(parent_analysis), literal_value_(value) {} + + SENodeType GetType() const final { return Constant; } + + int64_t FoldToSingleValue() const { return literal_value_; } + + SEConstantNode* AsSEConstantNode() override { return this; } + const SEConstantNode* AsSEConstantNode() const override { return this; } + + inline void AddChild(SENode*) final { + assert(false && "Attempting to add a child to a constant node!"); + } + + protected: + int64_t literal_value_; +}; + +// A node representing a recurrent expression in the code. A recurrent +// expression is an expression whose value can be expressed as a linear +// expression of the loop iterations. Such as an induction variable. The actual +// value of a recurrent expression is coefficent_ * iteration + offset_, hence +// an induction variable i=0, i++ becomes a recurrent expression with an offset +// of zero and a coefficient of one. +class SERecurrentNode : public SENode { + public: + SERecurrentNode(opt::ScalarEvolutionAnalysis* parent_analysis, + const ir::Loop* loop) + : SENode(parent_analysis), loop_(loop) {} + + SENodeType GetType() const final { return RecurrentAddExpr; } + + inline void AddCoefficient(SENode* child) { + coefficient_ = child; + SENode::AddChild(child); + } + + inline void AddOffset(SENode* child) { + offset_ = child; + SENode::AddChild(child); + } + + inline const SENode* GetCoefficient() const { return coefficient_; } + inline SENode* GetCoefficient() { return coefficient_; } + + inline const SENode* GetOffset() const { return offset_; } + inline SENode* GetOffset() { return offset_; } + + // Return the loop which this recurrent expression is recurring within. + const ir::Loop* GetLoop() const { return loop_; } + + SERecurrentNode* AsSERecurrentNode() override { return this; } + const SERecurrentNode* AsSERecurrentNode() const override { return this; } + + private: + SENode* coefficient_; + SENode* offset_; + const ir::Loop* loop_; +}; + +// A node representing an addition operation between child nodes. +class SEAddNode : public SENode { + public: + explicit SEAddNode(opt::ScalarEvolutionAnalysis* parent_analysis) + : SENode(parent_analysis) {} + + SENodeType GetType() const final { return Add; } + + SEAddNode* AsSEAddNode() override { return this; } + const SEAddNode* AsSEAddNode() const override { return this; } +}; + +// A node representing a multiply operation between child nodes. +class SEMultiplyNode : public SENode { + public: + explicit SEMultiplyNode(opt::ScalarEvolutionAnalysis* parent_analysis) + : SENode(parent_analysis) {} + + SENodeType GetType() const final { return Multiply; } + + SEMultiplyNode* AsSEMultiplyNode() override { return this; } + const SEMultiplyNode* AsSEMultiplyNode() const override { return this; } +}; + +// A node representing a unary negative operation. +class SENegative : public SENode { + public: + explicit SENegative(opt::ScalarEvolutionAnalysis* parent_analysis) + : SENode(parent_analysis) {} + + SENodeType GetType() const final { return Negative; } + + SENegative* AsSENegative() override { return this; } + const SENegative* AsSENegative() const override { return this; } +}; + +// A node representing a value which we do not know the value of, such as a load +// instruction. +class SEValueUnknown : public SENode { + public: + // SEValueUnknowns must come from an instruction |unique_id| is the unique id + // of that instruction. This is so we cancompare value unknowns and have a + // unique value unknown for each instruction. + SEValueUnknown(opt::ScalarEvolutionAnalysis* parent_analysis, + uint32_t result_id) + : SENode(parent_analysis), result_id_(result_id) {} + + SENodeType GetType() const final { return ValueUnknown; } + + SEValueUnknown* AsSEValueUnknown() override { return this; } + const SEValueUnknown* AsSEValueUnknown() const override { return this; } + + inline uint32_t ResultId() const { return result_id_; } + + private: + uint32_t result_id_; +}; + +// A node which we cannot reason about at all. +class SECantCompute : public SENode { + public: + explicit SECantCompute(opt::ScalarEvolutionAnalysis* parent_analysis) + : SENode(parent_analysis) {} + + SENodeType GetType() const final { return CanNotCompute; } + + SECantCompute* AsSECantCompute() override { return this; } + const SECantCompute* AsSECantCompute() const override { return this; } +}; + +} // namespace opt +} // namespace spvtools +#endif // SOURCE_OPT_SCALAR_ANALYSIS_NODES_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/scalar_analysis_simplification.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/scalar_analysis_simplification.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/scalar_analysis_simplification.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/scalar_analysis_simplification.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,539 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include "opt/scalar_analysis.h" + +#include +#include +#include +#include +#include +#include +#include + +// Simplifies scalar analysis DAGs. +// +// 1. Given a node passed to SimplifyExpression we first simplify the graph by +// calling SimplifyPolynomial. This groups like nodes following basic arithmetic +// rules, so multiple adds of the same load instruction could be grouped into a +// single multiply of that instruction. SimplifyPolynomial will traverse the DAG +// and build up an accumulator buffer for each class of instruction it finds. +// For example take the loop: +// for (i=0, i accumulators_; +}; + +// From a |multiply| build up the accumulator objects. +bool SENodeSimplifyImpl::AccumulatorsFromMultiply(SENode* multiply, + bool negation) { + if (multiply->GetChildren().size() != 2 || + multiply->GetType() != SENode::Multiply) + return false; + + SENode* operand_1 = multiply->GetChild(0); + SENode* operand_2 = multiply->GetChild(1); + + SENode* value_unknown = nullptr; + SENode* constant = nullptr; + + // Work out which operand is the unknown value. + if (operand_1->GetType() == SENode::ValueUnknown || + operand_1->GetType() == SENode::RecurrentAddExpr) + value_unknown = operand_1; + else if (operand_2->GetType() == SENode::ValueUnknown || + operand_2->GetType() == SENode::RecurrentAddExpr) + value_unknown = operand_2; + + // Work out which operand is the constant coefficient. + if (operand_1->GetType() == SENode::Constant) + constant = operand_1; + else if (operand_2->GetType() == SENode::Constant) + constant = operand_2; + + // If the expression is not a variable multiplied by a constant coefficient, + // exit out. + if (!(value_unknown && constant)) { + return false; + } + + int64_t sign = negation ? -1 : 1; + + auto iterator = accumulators_.find(value_unknown); + int64_t new_value = constant->AsSEConstantNode()->FoldToSingleValue() * sign; + // Add the result of the multiplication to the accumulators. + if (iterator != accumulators_.end()) { + (*iterator).second += new_value; + } else { + accumulators_.insert({value_unknown, new_value}); + } + + return true; +} + +SENode* SENodeSimplifyImpl::Simplify() { + // We only handle graphs with an addition, multiplication, or negation, at the + // root. + if (node_->GetType() != SENode::Add && node_->GetType() != SENode::Multiply && + node_->GetType() != SENode::Negative) + return node_; + + SENode* simplified_polynomial = SimplifyPolynomial(); + + SERecurrentNode* recurrent_expr = nullptr; + node_ = simplified_polynomial; + + // Fold recurrent expressions which are with respect to the same loop into a + // single recurrent expression. + simplified_polynomial = FoldRecurrentAddExpressions(simplified_polynomial); + + simplified_polynomial = + EliminateZeroCoefficientRecurrents(simplified_polynomial); + + // Traverse the immediate children of the new node to find the recurrent + // expression. If there is more than one there is nothing further we can do. + for (SENode* child : simplified_polynomial->GetChildren()) { + if (child->GetType() == SENode::RecurrentAddExpr) { + recurrent_expr = child->AsSERecurrentNode(); + } + } + + // We need to count the number of unique recurrent expressions in the DAG to + // ensure there is only one. + for (auto child_iterator = simplified_polynomial->graph_begin(); + child_iterator != simplified_polynomial->graph_end(); ++child_iterator) { + if (child_iterator->GetType() == SENode::RecurrentAddExpr && + recurrent_expr != child_iterator->AsSERecurrentNode()) { + return simplified_polynomial; + } + } + + if (recurrent_expr) { + return SimplifyRecurrentAddExpression(recurrent_expr); + } + + return simplified_polynomial; +} + +// Traverse the graph to build up the accumulator objects. +void SENodeSimplifyImpl::GatherAccumulatorsFromChildNodes(SENode* new_node, + SENode* child, + bool negation) { + int32_t sign = negation ? -1 : 1; + + if (child->GetType() == SENode::Constant) { + // Collect all the constants and add them together. + constant_accumulator_ += + child->AsSEConstantNode()->FoldToSingleValue() * sign; + + } else if (child->GetType() == SENode::ValueUnknown || + child->GetType() == SENode::RecurrentAddExpr) { + // To rebuild the graph of X+X+X*2 into 4*X we count the occurrences of X + // and create a new node of count*X after. X can either be a ValueUnknown or + // a RecurrentAddExpr. The count for each X is stored in the accumulators_ + // map. + + auto iterator = accumulators_.find(child); + // If we've encountered this term before add to the accumulator for it. + if (iterator == accumulators_.end()) + accumulators_.insert({child, sign}); + else + iterator->second += sign; + + } else if (child->GetType() == SENode::Multiply) { + if (!AccumulatorsFromMultiply(child, negation)) { + new_node->AddChild(child); + } + + } else if (child->GetType() == SENode::Add) { + for (SENode* next_child : *child) { + GatherAccumulatorsFromChildNodes(new_node, next_child, negation); + } + + } else if (child->GetType() == SENode::Negative) { + SENode* negated_node = child->GetChild(0); + GatherAccumulatorsFromChildNodes(new_node, negated_node, !negation); + } else { + // If we can't work out how to fold the expression just add it back into + // the graph. + new_node->AddChild(child); + } +} + +SERecurrentNode* SENodeSimplifyImpl::UpdateCoefficient( + SERecurrentNode* recurrent, int64_t coefficient_update) const { + std::unique_ptr new_recurrent_node{new SERecurrentNode( + recurrent->GetParentAnalysis(), recurrent->GetLoop())}; + + SENode* new_coefficient = analysis_.CreateMultiplyNode( + recurrent->GetCoefficient(), + analysis_.CreateConstant(coefficient_update)); + + // See if the node can be simplified. + SENode* simplified = analysis_.SimplifyExpression(new_coefficient); + if (simplified->GetType() != SENode::CanNotCompute) + new_coefficient = simplified; + + if (coefficient_update < 0) { + new_recurrent_node->AddOffset( + analysis_.CreateNegation(recurrent->GetOffset())); + } else { + new_recurrent_node->AddOffset(recurrent->GetOffset()); + } + + new_recurrent_node->AddCoefficient(new_coefficient); + + return analysis_.GetCachedOrAdd(std::move(new_recurrent_node)) + ->AsSERecurrentNode(); +} + +// Simplify all the terms in the polynomial function. +SENode* SENodeSimplifyImpl::SimplifyPolynomial() { + std::unique_ptr new_add{new SEAddNode(node_->GetParentAnalysis())}; + + // Traverse the graph and gather the accumulators from it. + GatherAccumulatorsFromChildNodes(new_add.get(), node_, false); + + // Fold all the constants into a single constant node. + if (constant_accumulator_ != 0) { + new_add->AddChild(analysis_.CreateConstant(constant_accumulator_)); + } + + for (auto& pair : accumulators_) { + SENode* term = pair.first; + int64_t count = pair.second; + + // We can eliminate the term completely. + if (count == 0) continue; + + if (count == 1) { + new_add->AddChild(term); + } else if (count == -1 && term->GetType() != SENode::RecurrentAddExpr) { + // If the count is -1 we can just add a negative version of that node, + // unless it is a recurrent expression as we would rather the negative + // goes on the recurrent expressions children. This makes it easier to + // work with in other places. + new_add->AddChild(analysis_.CreateNegation(term)); + } else { + // Output value unknown terms as count*term and output recurrent + // expression terms as rec(offset, coefficient + count) offset and + // coefficient are the same as in the original expression. + if (term->GetType() == SENode::ValueUnknown) { + SENode* count_as_constant = analysis_.CreateConstant(count); + new_add->AddChild( + analysis_.CreateMultiplyNode(count_as_constant, term)); + } else { + assert(term->GetType() == SENode::RecurrentAddExpr && + "We only handle value unknowns or recurrent expressions"); + + // Create a new recurrent expression by adding the count to the + // coefficient of the old one. + new_add->AddChild(UpdateCoefficient(term->AsSERecurrentNode(), count)); + } + } + } + + // If there is only one term in the addition left just return that term. + if (new_add->GetChildren().size() == 1) { + return new_add->GetChild(0); + } + + // If there are no terms left in the addition just return 0. + if (new_add->GetChildren().size() == 0) { + return analysis_.CreateConstant(0); + } + + return analysis_.GetCachedOrAdd(std::move(new_add)); +} + +SENode* SENodeSimplifyImpl::FoldRecurrentAddExpressions(SENode* root) { + std::unique_ptr new_node{new SEAddNode(&analysis_)}; + + // A mapping of loops to the list of recurrent expressions which are with + // respect to those loops. + std::map>> + loops_to_recurrent{}; + + bool has_multiple_same_loop_recurrent_terms = false; + + for (SENode* child : *root) { + bool negation = false; + + if (child->GetType() == SENode::Negative) { + child = child->GetChild(0); + negation = true; + } + + if (child->GetType() == SENode::RecurrentAddExpr) { + const ir::Loop* loop = child->AsSERecurrentNode()->GetLoop(); + + SERecurrentNode* rec = child->AsSERecurrentNode(); + if (loops_to_recurrent.find(loop) == loops_to_recurrent.end()) { + loops_to_recurrent[loop] = {std::make_pair(rec, negation)}; + } else { + loops_to_recurrent[loop].push_back(std::make_pair(rec, negation)); + has_multiple_same_loop_recurrent_terms = true; + } + } else { + new_node->AddChild(child); + } + } + + if (!has_multiple_same_loop_recurrent_terms) return root; + + for (auto pair : loops_to_recurrent) { + std::vector>& recurrent_expressions = + pair.second; + const ir::Loop* loop = pair.first; + + std::unique_ptr new_coefficient{new SEAddNode(&analysis_)}; + std::unique_ptr new_offset{new SEAddNode(&analysis_)}; + + for (auto node_pair : recurrent_expressions) { + SERecurrentNode* node = node_pair.first; + bool negative = node_pair.second; + + if (!negative) { + new_coefficient->AddChild(node->GetCoefficient()); + new_offset->AddChild(node->GetOffset()); + } else { + new_coefficient->AddChild( + analysis_.CreateNegation(node->GetCoefficient())); + new_offset->AddChild(analysis_.CreateNegation(node->GetOffset())); + } + } + + std::unique_ptr new_recurrent{ + new SERecurrentNode(&analysis_, loop)}; + + SENode* new_coefficient_simplified = + analysis_.SimplifyExpression(new_coefficient.get()); + + SENode* new_offset_simplified = + analysis_.SimplifyExpression(new_offset.get()); + + if (new_coefficient_simplified->GetType() == SENode::Constant && + new_coefficient_simplified->AsSEConstantNode()->FoldToSingleValue() == + 0) { + return new_offset_simplified; + } + + new_recurrent->AddCoefficient(new_coefficient_simplified); + new_recurrent->AddOffset(new_offset_simplified); + + new_node->AddChild(analysis_.GetCachedOrAdd(std::move(new_recurrent))); + } + + // If we only have one child in the add just return that. + if (new_node->GetChildren().size() == 1) { + return new_node->GetChild(0); + } + + return analysis_.GetCachedOrAdd(std::move(new_node)); +} + +SENode* SENodeSimplifyImpl::EliminateZeroCoefficientRecurrents(SENode* node) { + if (node->GetType() != SENode::Add) return node; + + bool has_change = false; + + std::vector new_children{}; + for (SENode* child : *node) { + if (child->GetType() == SENode::RecurrentAddExpr) { + SENode* coefficient = child->AsSERecurrentNode()->GetCoefficient(); + // If coefficient is zero then we can eliminate the recurrent expression + // entirely and just return the offset as the recurrent expression is + // representing the equation coefficient*iterations + offset. + if (coefficient->GetType() == SENode::Constant && + coefficient->AsSEConstantNode()->FoldToSingleValue() == 0) { + new_children.push_back(child->AsSERecurrentNode()->GetOffset()); + has_change = true; + } else { + new_children.push_back(child); + } + } else { + new_children.push_back(child); + } + } + + if (!has_change) return node; + + std::unique_ptr new_add{new SEAddNode(node_->GetParentAnalysis())}; + + for (SENode* child : new_children) { + new_add->AddChild(child); + } + + return analysis_.GetCachedOrAdd(std::move(new_add)); +} + +SENode* SENodeSimplifyImpl::SimplifyRecurrentAddExpression( + SERecurrentNode* recurrent_expr) { + const std::vector& children = node_->GetChildren(); + + std::unique_ptr recurrent_node{new SERecurrentNode( + recurrent_expr->GetParentAnalysis(), recurrent_expr->GetLoop())}; + + // Create and simplify the new offset node. + std::unique_ptr new_offset{ + new SEAddNode(recurrent_expr->GetParentAnalysis())}; + new_offset->AddChild(recurrent_expr->GetOffset()); + + for (SENode* child : children) { + if (child->GetType() != SENode::RecurrentAddExpr) { + new_offset->AddChild(child); + } + } + + // Simplify the new offset. + SENode* simplified_child = analysis_.SimplifyExpression(new_offset.get()); + + // If the child can be simplified, add the simplified form otherwise, add it + // via the usual caching mechanism. + if (simplified_child->GetType() != SENode::CanNotCompute) { + recurrent_node->AddOffset(simplified_child); + } else { + recurrent_expr->AddOffset(analysis_.GetCachedOrAdd(std::move(new_offset))); + } + + recurrent_node->AddCoefficient(recurrent_expr->GetCoefficient()); + + return analysis_.GetCachedOrAdd(std::move(recurrent_node)); +} + +/* + * Scalar Analysis simplification public methods. + */ + +SENode* ScalarEvolutionAnalysis::SimplifyExpression(SENode* node) { + SENodeSimplifyImpl impl{this, node}; + + return impl.Simplify(); +} + +} // namespace opt +} // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/scalar_replacement_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/scalar_replacement_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/scalar_replacement_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/scalar_replacement_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -592,9 +592,9 @@ VariableStats stats = {0, 0}; bool ok = CheckUses(inst, &stats); - // TODO(alanbaker): Extend this to some meaningful heuristics about when - // SRoA is valuable. - if (stats.num_partial_accesses == 0) ok = false; + // TODO(alanbaker/greg-lunarg): Add some meaningful heuristics about when + // SRoA is costly, such as when the structure has many (unaccessed?) + // members. return ok; } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/scalar_replacement_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/scalar_replacement_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/scalar_replacement_pass.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/scalar_replacement_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -39,7 +39,8 @@ return ir::IRContext::kAnalysisDefUse | ir::IRContext::kAnalysisInstrToBlockMapping | ir::IRContext::kAnalysisDecorations | - ir::IRContext::kAnalysisCombinators | ir::IRContext::kAnalysisCFG; + ir::IRContext::kAnalysisCombinators | ir::IRContext::kAnalysisCFG | + ir::IRContext::kAnalysisNameMap; } private: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/set_spec_constant_default_value_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/set_spec_constant_default_value_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/set_spec_constant_default_value_pass.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/set_spec_constant_default_value_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -188,7 +188,7 @@ } return target_inst; } -}; // namespace +} // namespace Pass::Status SetSpecConstantDefaultValuePass::Process( ir::IRContext* irContext) { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/simplification_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/simplification_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/simplification_pass.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/simplification_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,114 @@ +// Copyright (c) 2018 Google LLC +// +// 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. + +#include "simplification_pass.h" + +#include +#include +#include + +#include "fold.h" + +namespace spvtools { +namespace opt { + +Pass::Status SimplificationPass::Process(ir::IRContext* c) { + InitializeProcessing(c); + bool modified = false; + + for (ir::Function& function : *get_module()) { + modified |= SimplifyFunction(&function); + } + return (modified ? Status::SuccessWithChange : Status::SuccessWithoutChange); +} + +bool SimplificationPass::SimplifyFunction(ir::Function* function) { + bool modified = false; + // Phase 1: Traverse all instructions in dominance order. + // The second phase will only be on the instructions whose inputs have changed + // after being processed during phase 1. Since OpPhi instructions are the + // only instructions whose inputs do not necessarily dominate the use, we keep + // track of the OpPhi instructions already seen, and add them to the work list + // for phase 2 when needed. + std::vector work_list; + std::unordered_set process_phis; + std::unordered_set inst_to_kill; + std::unordered_set in_work_list; + + cfg()->ForEachBlockInReversePostOrder( + function->entry().get(), + [&modified, &process_phis, &work_list, &in_work_list, &inst_to_kill, + this](ir::BasicBlock* bb) { + for (ir::Instruction* inst = &*bb->begin(); inst; + inst = inst->NextNode()) { + if (inst->opcode() == SpvOpPhi) { + process_phis.insert(inst); + } + + if (inst->opcode() == SpvOpCopyObject || FoldInstruction(inst)) { + modified = true; + context()->AnalyzeUses(inst); + get_def_use_mgr()->ForEachUser(inst, [&work_list, &process_phis, + &in_work_list]( + ir::Instruction* use) { + if (process_phis.count(use) && in_work_list.insert(use).second) { + work_list.push_back(use); + } + }); + if (inst->opcode() == SpvOpCopyObject) { + context()->ReplaceAllUsesWith(inst->result_id(), + inst->GetSingleWordInOperand(0)); + inst_to_kill.insert(inst); + in_work_list.insert(inst); + } + } + } + }); + + // Phase 2: process the instructions in the work list until all of the work is + // done. This time we add all users to the work list because phase 1 + // has already finished. + for (size_t i = 0; i < work_list.size(); ++i) { + ir::Instruction* inst = work_list[i]; + in_work_list.erase(inst); + if (inst->opcode() == SpvOpCopyObject || FoldInstruction(inst)) { + modified = true; + context()->AnalyzeUses(inst); + get_def_use_mgr()->ForEachUser( + inst, [&work_list, &in_work_list](ir::Instruction* use) { + if (!use->IsDecoration() && use->opcode() != SpvOpName && + in_work_list.insert(use).second) { + work_list.push_back(use); + } + }); + + if (inst->opcode() == SpvOpCopyObject) { + context()->ReplaceAllUsesWith(inst->result_id(), + inst->GetSingleWordInOperand(0)); + inst_to_kill.insert(inst); + in_work_list.insert(inst); + } + } + } + + // Phase 3: Kill instructions we know are no longer needed. + for (ir::Instruction* inst : inst_to_kill) { + context()->KillInst(inst); + } + + return modified; +} + +} // namespace opt +} // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/simplification_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/simplification_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/simplification_pass.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/simplification_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,49 @@ +// Copyright (c) 2018 Google LLC +// +// 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. + +#ifndef LIBSPIRV_OPT_SIMPLIFICATION_PASS_H_ +#define LIBSPIRV_OPT_SIMPLIFICATION_PASS_H_ + +#include "function.h" +#include "ir_context.h" +#include "pass.h" + +namespace spvtools { +namespace opt { + +// See optimizer.hpp for documentation. +class SimplificationPass : public Pass { + public: + const char* name() const override { return "simplify-instructions"; } + Status Process(ir::IRContext*) override; + virtual ir::IRContext::Analysis GetPreservedAnalyses() override { + return ir::IRContext::kAnalysisDefUse | + ir::IRContext::kAnalysisInstrToBlockMapping | + ir::IRContext::kAnalysisDecorations | + ir::IRContext::kAnalysisCombinators | ir::IRContext::kAnalysisCFG | + ir::IRContext::kAnalysisDominatorAnalysis | + ir::IRContext::kAnalysisNameMap; + } + + private: + // Returns true if the module was changed. The simplifier is called on every + // instruction in |function| until nothing else in the function can be + // simplified. + bool SimplifyFunction(ir::Function* function); +}; + +} // namespace opt +} // namespace spvtools + +#endif // LIBSPIRV_OPT_SIMPLIFICATION_PASS_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/ssa_rewrite_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/ssa_rewrite_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/ssa_rewrite_pass.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/ssa_rewrite_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,582 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +// This file implements the SSA rewriting algorithm proposed in +// +// Simple and Efficient Construction of Static Single Assignment Form. +// Braun M., Buchwald S., Hack S., Leißa R., Mallon C., Zwinkau A. (2013) +// In: Jhala R., De Bosschere K. (eds) +// Compiler Construction. CC 2013. +// Lecture Notes in Computer Science, vol 7791. +// Springer, Berlin, Heidelberg +// +// https://link.springer.com/chapter/10.1007/978-3-642-37051-9_6 +// +// In contrast to common eager algorithms based on dominance and dominance +// frontier information, this algorithm works backwards from load operations. +// +// When a target variable is loaded, it queries the variable's reaching +// definition. If the reaching definition is unknown at the current location, +// it searches backwards in the CFG, inserting Phi instructions at join points +// in the CFG along the way until it finds the desired store instruction. +// +// The algorithm avoids repeated lookups using memoization. +// +// For reducible CFGs, which are a superset of the structured CFGs in SPIRV, +// this algorithm is proven to produce minimal SSA. That is, it inserts the +// minimal number of Phi instructions required to ensure the SSA property, but +// some Phi instructions may be dead +// (https://en.wikipedia.org/wiki/Static_single_assignment_form). + +#include "ssa_rewrite_pass.h" +#include "cfg.h" +#include "make_unique.h" +#include "mem_pass.h" +#include "opcode.h" + +#include + +// Debug logging (0: Off, 1-N: Verbosity level). Replace this with the +// implementation done for +// https://github.com/KhronosGroup/SPIRV-Tools/issues/1351 +// #define SSA_REWRITE_DEBUGGING_LEVEL 3 + +#ifdef SSA_REWRITE_DEBUGGING_LEVEL +#include +#else +#define SSA_REWRITE_DEBUGGING_LEVEL 0 +#endif + +namespace spvtools { +namespace opt { + +namespace { +const uint32_t kStoreValIdInIdx = 1; +const uint32_t kVariableInitIdInIdx = 1; +} // namespace + +std::string SSARewriter::PhiCandidate::PrettyPrint(const ir::CFG* cfg) const { + std::ostringstream str; + str << "%" << result_id_ << " = Phi[%" << var_id_ << ", BB %" << bb_->id() + << "]("; + if (phi_args_.size() > 0) { + uint32_t arg_ix = 0; + for (uint32_t pred_label : cfg->preds(bb_->id())) { + uint32_t arg_id = phi_args_[arg_ix++]; + str << "[%" << arg_id << ", bb(%" << pred_label << ")] "; + } + } + str << ")"; + if (copy_of_ != 0) { + str << " [COPY OF " << copy_of_ << "]"; + } + str << ((is_complete_) ? " [COMPLETE]" : " [INCOMPLETE]"); + + return str.str(); +} + +SSARewriter::PhiCandidate& SSARewriter::CreatePhiCandidate(uint32_t var_id, + ir::BasicBlock* bb) { + uint32_t phi_result_id = pass_->context()->TakeNextId(); + auto result = phi_candidates_.emplace( + phi_result_id, PhiCandidate(var_id, phi_result_id, bb)); + PhiCandidate& phi_candidate = result.first->second; + return phi_candidate; +} + +void SSARewriter::ReplacePhiUsersWith(const PhiCandidate& phi_to_remove, + uint32_t repl_id) { + for (uint32_t user_id : phi_to_remove.users()) { + PhiCandidate* user_phi = GetPhiCandidate(user_id); + if (user_phi) { + // If the user is a Phi candidate, replace all arguments that refer to + // |phi_to_remove.result_id()| with |repl_id|. + for (uint32_t& arg : user_phi->phi_args()) { + if (arg == phi_to_remove.result_id()) { + arg = repl_id; + } + } + } else { + // For regular loads, traverse the |load_replacement_| table looking for + // instances of |phi_to_remove|. + for (auto& it : load_replacement_) { + if (it.second == phi_to_remove.result_id()) { + it.second = repl_id; + } + } + } + } +} + +uint32_t SSARewriter::TryRemoveTrivialPhi(PhiCandidate* phi_candidate) { + uint32_t same_id = 0; + for (uint32_t arg_id : phi_candidate->phi_args()) { + if (arg_id == same_id || arg_id == phi_candidate->result_id()) { + // This is a self-reference operand or a reference to the same value ID. + continue; + } + if (same_id != 0) { + // This Phi candidate merges at least two values. Therefore, it is not + // trivial. + assert(phi_candidate->copy_of() == 0 && + "Phi candidate transitioning from copy to non-copy."); + return phi_candidate->result_id(); + } + same_id = arg_id; + } + + // The previous logic has determined that this Phi candidate |phi_candidate| + // is trivial. It is essentially the copy operation phi_candidate->phi_result + // = Phi(same, same, same, ...). Since it is not necessary, we can re-route + // all the users of |phi_candidate->phi_result| to all its users, and remove + // |phi_candidate|. + + // Mark the Phi candidate as a trivial copy of |same_id|, so it won't be + // generated. + phi_candidate->MarkCopyOf(same_id); + + assert(same_id != 0 && "Completed Phis cannot have %0 in their arguments"); + + // Since |phi_candidate| always produces |same_id|, replace all the users of + // |phi_candidate| with |same_id|. + ReplacePhiUsersWith(*phi_candidate, same_id); + + return same_id; +} + +uint32_t SSARewriter::AddPhiOperands(PhiCandidate* phi_candidate) { + assert(phi_candidate->phi_args().size() == 0 && + "Phi candidate already has arguments"); + + bool found_0_arg = false; + for (uint32_t pred : pass_->cfg()->preds(phi_candidate->bb()->id())) { + ir::BasicBlock* pred_bb = pass_->cfg()->block(pred); + + // If |pred_bb| is not sealed, use %0 to indicate that + // |phi_candidate| needs to be completed after the whole CFG has + // been processed. + // + // Note that we cannot call GetReachingDef() in these cases + // because this would generate an empty Phi candidate in + // |pred_bb|. When |pred_bb| is later processed, a new definition + // for |phi_candidate->var_id_| will be lost because + // |phi_candidate| will still be reached by the empty Phi. + // + // Consider: + // + // BB %23: + // %38 = Phi[%i](%int_0[%1], %39[%25]) + // + // ... + // + // BB %25: [Starts unsealed] + // %39 = Phi[%i]() + // %34 = ... + // OpStore %i %34 -> Currdef(%i) at %25 is %34 + // OpBranch %23 + // + // When we first create the Phi in %38, we add an operandless Phi in + // %39 to hold the unknown reaching def for %i. + // + // But then, when we go to complete %39 at the end. The reaching def + // for %i in %25's predecessor is %38 itself. So we miss the fact + // that %25 has a def for %i that should be used. + // + // By making the argument %0, we make |phi_candidate| incomplete, + // which will cause it to be completed after the whole CFG has + // been scanned. + uint32_t arg_id = IsBlockSealed(pred_bb) + ? GetReachingDef(phi_candidate->var_id(), pred_bb) + : 0; + phi_candidate->phi_args().push_back(arg_id); + + if (arg_id == 0) { + found_0_arg = true; + } else { + // If this argument is another Phi candidate, add |phi_candidate| to the + // list of users for the defining Phi. + PhiCandidate* defining_phi = GetPhiCandidate(arg_id); + if (defining_phi && defining_phi != phi_candidate) { + defining_phi->AddUser(phi_candidate->result_id()); + } + } + } + + // If we could not fill-in all the arguments of this Phi, mark it incomplete + // so it gets completed after the whole CFG has been processed. + if (found_0_arg) { + phi_candidate->MarkIncomplete(); + incomplete_phis_.push(phi_candidate); + return phi_candidate->result_id(); + } + + // Try to remove |phi_candidate|, if it's trivial. + uint32_t repl_id = TryRemoveTrivialPhi(phi_candidate); + if (repl_id == phi_candidate->result_id()) { + // |phi_candidate| is complete and not trivial. Add it to the + // list of Phi candidates to generate. + phi_candidate->MarkComplete(); + phis_to_generate_.push_back(phi_candidate); + } + + return repl_id; +} + +uint32_t SSARewriter::GetReachingDef(uint32_t var_id, ir::BasicBlock* bb) { + // If |var_id| has a definition in |bb|, return it. + const auto& bb_it = defs_at_block_.find(bb); + if (bb_it != defs_at_block_.end()) { + const auto& current_defs = bb_it->second; + const auto& var_it = current_defs.find(var_id); + if (var_it != current_defs.end()) { + return var_it->second; + } + } + + // Otherwise, look up the value for |var_id| in |bb|'s predecessors. + uint32_t val_id = 0; + auto& predecessors = pass_->cfg()->preds(bb->id()); + if (predecessors.size() == 1) { + // If |bb| has exactly one predecessor, we look for |var_id|'s definition + // there. + val_id = GetReachingDef(var_id, pass_->cfg()->block(predecessors[0])); + } else if (predecessors.size() > 1) { + // If there is more than one predecessor, this is a join block which may + // require a Phi instruction. This will act as |var_id|'s current + // definition to break potential cycles. + PhiCandidate& phi_candidate = CreatePhiCandidate(var_id, bb); + WriteVariable(var_id, bb, phi_candidate.result_id()); + val_id = AddPhiOperands(&phi_candidate); + } + + // If we could not find a store for this variable in the path from the root + // of the CFG, the variable is not defined, so we use undef. + if (val_id == 0) { + val_id = pass_->GetUndefVal(var_id); + } + + WriteVariable(var_id, bb, val_id); + + return val_id; +} + +void SSARewriter::SealBlock(ir::BasicBlock* bb) { + auto result = sealed_blocks_.insert(bb); + (void)result; + assert(result.second == true && + "Tried to seal the same basic block more than once."); +} + +void SSARewriter::ProcessStore(ir::Instruction* inst, ir::BasicBlock* bb) { + auto opcode = inst->opcode(); + assert((opcode == SpvOpStore || opcode == SpvOpVariable) && + "Expecting a store or a variable definition instruction."); + + uint32_t var_id = 0; + uint32_t val_id = 0; + if (opcode == SpvOpStore) { + (void)pass_->GetPtr(inst, &var_id); + val_id = inst->GetSingleWordInOperand(kStoreValIdInIdx); + } else if (inst->NumInOperands() >= 2) { + var_id = inst->result_id(); + val_id = inst->GetSingleWordInOperand(kVariableInitIdInIdx); + } + if (pass_->IsTargetVar(var_id)) { + WriteVariable(var_id, bb, val_id); + +#if SSA_REWRITE_DEBUGGING_LEVEL > 1 + std::cerr << "\tFound store '%" << var_id << " = %" << val_id << "': " + << inst->PrettyPrint(SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES) + << "\n"; +#endif + } +} + +void SSARewriter::ProcessLoad(ir::Instruction* inst, ir::BasicBlock* bb) { + uint32_t var_id = 0; + (void)pass_->GetPtr(inst, &var_id); + if (pass_->IsTargetVar(var_id)) { + // Get the immediate reaching definition for |var_id|. + uint32_t val_id = GetReachingDef(var_id, bb); + + // Schedule a replacement for the result of this load instruction with + // |val_id|. After all the rewriting decisions are made, every use of + // this load will be replaced with |val_id|. + const uint32_t load_id = inst->result_id(); + assert(load_replacement_.count(load_id) == 0); + load_replacement_[load_id] = val_id; + PhiCandidate* defining_phi = GetPhiCandidate(val_id); + if (defining_phi) { + defining_phi->AddUser(load_id); + } + +#if SSA_REWRITE_DEBUGGING_LEVEL > 1 + std::cerr << "\tFound load: " + << inst->PrettyPrint(SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES) + << " (replacement for %" << load_id << " is %" << val_id << ")\n"; +#endif + } +} + +void SSARewriter::PrintPhiCandidates() const { + std::cerr << "\nPhi candidates:\n"; + for (const auto& phi_it : phi_candidates_) { + std::cerr << "\tBB %" << phi_it.second.bb()->id() << ": " + << phi_it.second.PrettyPrint(pass_->cfg()) << "\n"; + } + std::cerr << "\n"; +} + +void SSARewriter::PrintReplacementTable() const { + std::cerr << "\nLoad replacement table\n"; + for (const auto& it : load_replacement_) { + std::cerr << "\t%" << it.first << " -> %" << it.second << "\n"; + } + std::cerr << "\n"; +} + +void SSARewriter::GenerateSSAReplacements(ir::BasicBlock* bb) { +#if SSA_REWRITE_DEBUGGING_LEVEL > 1 + std::cerr << "Generating SSA replacements for block: " << bb->id() << "\n"; + std::cerr << bb->PrettyPrint(SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES) + << "\n"; +#endif + + for (auto& inst : *bb) { + auto opcode = inst.opcode(); + if (opcode == SpvOpStore || opcode == SpvOpVariable) { + ProcessStore(&inst, bb); + } else if (inst.opcode() == SpvOpLoad) { + ProcessLoad(&inst, bb); + } + } + + // Seal |bb|. This means that all the stores in it have been scanned and it's + // ready to feed them into its successors. + SealBlock(bb); + +#if SSA_REWRITE_DEBUGGING_LEVEL > 1 + PrintPhiCandidates(); + PrintReplacementTable(); + std::cerr << "\n\n"; +#endif +} + +uint32_t SSARewriter::GetReplacement(std::pair repl) { + uint32_t val_id = repl.second; + auto it = load_replacement_.find(val_id); + while (it != load_replacement_.end()) { + val_id = it->second; + it = load_replacement_.find(val_id); + } + return val_id; +} + +uint32_t SSARewriter::GetPhiArgument(const PhiCandidate* phi_candidate, + uint32_t ix) { + assert(phi_candidate->IsReady() && + "Tried to get the final argument from an incomplete/trivial Phi"); + + uint32_t arg_id = phi_candidate->phi_args()[ix]; + while (arg_id != 0) { + PhiCandidate* phi_user = GetPhiCandidate(arg_id); + if (phi_user == nullptr || phi_user->IsReady()) { + // If the argument is not a Phi or it's a Phi candidate ready to be + // emitted, return it. + return arg_id; + } + arg_id = phi_user->copy_of(); + } + + assert(false && + "No Phi candidates in the copy-of chain are ready to be generated"); + + return 0; +} + +bool SSARewriter::ApplyReplacements() { + bool modified = false; + +#if SSA_REWRITE_DEBUGGING_LEVEL > 2 + std::cerr << "\n\nApplying replacement decisions to IR\n\n"; + PrintPhiCandidates(); + PrintReplacementTable(); + std::cerr << "\n\n"; +#endif + + // Add Phi instructions from completed Phi candidates. + std::vector generated_phis; + for (const PhiCandidate* phi_candidate : phis_to_generate_) { +#if SSA_REWRITE_DEBUGGING_LEVEL > 2 + std::cerr << "Phi candidate: " << phi_candidate->PrettyPrint(pass_->cfg()) + << "\n"; +#endif + + assert(phi_candidate->is_complete() && + "Tried to instantiate a Phi instruction from an incomplete Phi " + "candidate"); + + // Build the vector of operands for the new OpPhi instruction. + uint32_t type_id = pass_->GetPointeeTypeId( + pass_->get_def_use_mgr()->GetDef(phi_candidate->var_id())); + std::vector phi_operands; + uint32_t arg_ix = 0; + for (uint32_t pred_label : pass_->cfg()->preds(phi_candidate->bb()->id())) { + uint32_t op_val_id = GetPhiArgument(phi_candidate, arg_ix++); + phi_operands.push_back( + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {op_val_id}}); + phi_operands.push_back( + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {pred_label}}); + } + + // Generate a new OpPhi instruction and insert it in its basic + // block. + std::unique_ptr phi_inst( + new ir::Instruction(pass_->context(), SpvOpPhi, type_id, + phi_candidate->result_id(), phi_operands)); + generated_phis.push_back(phi_inst.get()); + pass_->get_def_use_mgr()->AnalyzeInstDef(&*phi_inst); + pass_->context()->set_instr_block(&*phi_inst, phi_candidate->bb()); + auto insert_it = phi_candidate->bb()->begin(); + insert_it.InsertBefore(std::move(phi_inst)); + modified = true; + } + + // Scan uses for all inserted Phi instructions. Do this separately from the + // registration of the Phi instruction itself to avoid trying to analyze uses + // of Phi instructions that have not been registered yet. + for (ir::Instruction* phi_inst : generated_phis) { + pass_->get_def_use_mgr()->AnalyzeInstUse(&*phi_inst); + } + +#if SSA_REWRITE_DEBUGGING_LEVEL > 1 + std::cerr << "\n\nReplacing the result of load instructions with the " + "corresponding SSA id\n\n"; +#endif + + // Apply replacements from the load replacement table. + for (auto& repl : load_replacement_) { + uint32_t load_id = repl.first; + uint32_t val_id = GetReplacement(repl); + ir::Instruction* load_inst = + pass_->context()->get_def_use_mgr()->GetDef(load_id); + +#if SSA_REWRITE_DEBUGGING_LEVEL > 2 + std::cerr << "\t" + << load_inst->PrettyPrint( + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES) + << " (%" << load_id << " -> %" << val_id << ")\n"; +#endif + + // Remove the load instruction and replace all the uses of this load's + // result with |val_id|. Kill any names or decorates using the load's + // result before replacing to prevent incorrect replacement in those + // instructions. + pass_->context()->KillNamesAndDecorates(load_id); + pass_->context()->ReplaceAllUsesWith(load_id, val_id); + pass_->context()->KillInst(load_inst); + modified = true; + } + + return modified; +} + +void SSARewriter::FinalizePhiCandidate(PhiCandidate* phi_candidate) { + assert(phi_candidate->phi_args().size() > 0 && + "Phi candidate should have arguments"); + + uint32_t ix = 0; + for (uint32_t pred : pass_->cfg()->preds(phi_candidate->bb()->id())) { + ir::BasicBlock* pred_bb = pass_->cfg()->block(pred); + uint32_t& arg_id = phi_candidate->phi_args()[ix++]; + if (arg_id == 0) { + // If |pred_bb| is still not sealed, it means it's unreachable. In this + // case, we just use Undef as an argument. + arg_id = IsBlockSealed(pred_bb) + ? GetReachingDef(phi_candidate->var_id(), pred_bb) + : pass_->GetUndefVal(phi_candidate->var_id()); + } + } + + // This candidate is now completed. + phi_candidate->MarkComplete(); + + // If |phi_candidate| is not trivial, add it to the list of Phis to generate. + if (TryRemoveTrivialPhi(phi_candidate) == phi_candidate->result_id()) { + // If we could not remove |phi_candidate|, it means that it is complete + // and not trivial. Add it to the list of Phis to generate. + assert(!phi_candidate->copy_of() && "A completed Phi cannot be trivial."); + phis_to_generate_.push_back(phi_candidate); + } +} + +void SSARewriter::FinalizePhiCandidates() { +#if SSA_REWRITE_DEBUGGING_LEVEL > 1 + std::cerr << "Finalizing Phi candidates:\n\n"; + PrintPhiCandidates(); + std::cerr << "\n"; +#endif + + // Now, complete the collected candidates. + while (incomplete_phis_.size() > 0) { + PhiCandidate* phi_candidate = incomplete_phis_.front(); + incomplete_phis_.pop(); + FinalizePhiCandidate(phi_candidate); + } +} + +bool SSARewriter::RewriteFunctionIntoSSA(ir::Function* fp) { +#if SSA_REWRITE_DEBUGGING_LEVEL > 0 + std::cerr << "Function before SSA rewrite:\n" + << fp->PrettyPrint(0) << "\n\n\n"; +#endif + + // Collect variables that can be converted into SSA IDs. + pass_->CollectTargetVars(fp); + + // Generate all the SSA replacements and Phi candidates. This will + // generate incomplete and trivial Phis. + pass_->cfg()->ForEachBlockInReversePostOrder( + fp->entry().get(), + [this](ir::BasicBlock* bb) { GenerateSSAReplacements(bb); }); + + // Remove trivial Phis and add arguments to incomplete Phis. + FinalizePhiCandidates(); + + // Finally, apply all the replacements in the IR. + bool modified = ApplyReplacements(); + +#if SSA_REWRITE_DEBUGGING_LEVEL > 0 + std::cerr << "\n\n\nFunction after SSA rewrite:\n" + << fp->PrettyPrint(0) << "\n"; +#endif + + return modified; +} + +void SSARewritePass::Initialize(ir::IRContext* c) { InitializeProcessing(c); } + +Pass::Status SSARewritePass::Process(ir::IRContext* c) { + Initialize(c); + + bool modified = false; + for (auto& fn : *get_module()) { + modified |= SSARewriter(this).RewriteFunctionIntoSSA(&fn); + } + return modified ? Pass::Status::SuccessWithChange + : Pass::Status::SuccessWithoutChange; +} + +} // namespace opt +} // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/ssa_rewrite_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/ssa_rewrite_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/ssa_rewrite_pass.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/ssa_rewrite_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,304 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#ifndef LIBSPIRV_OPT_SSA_REWRITE_PASS_H_ +#define LIBSPIRV_OPT_SSA_REWRITE_PASS_H_ + +#include "basic_block.h" +#include "ir_context.h" +#include "mem_pass.h" + +#include + +namespace spvtools { +namespace opt { + +// Utility class for passes that need to rewrite a function into SSA. This +// converts load/store operations on function-local variables into SSA IDs, +// which allows them to be the target of optimizing transformations. +// +// Store and load operations to these variables are converted into +// operations on SSA IDs. Phi instructions are added when needed. See the +// SSA construction paper for algorithmic details +// (https://link.springer.com/chapter/10.1007/978-3-642-37051-9_6) +class SSARewriter { + public: + SSARewriter(MemPass* pass) + : pass_(pass), first_phi_id_(pass_->get_module()->IdBound()) {} + + // Rewrites SSA-target variables in function |fp| into SSA. This is the + // entry point for the SSA rewrite algorithm. SSA-target variables are + // locally defined variables that meet the criteria set by IsSSATargetVar. + // + // It returns true if function |fp| was modified. Otherwise, it returns + // false. + bool RewriteFunctionIntoSSA(ir::Function* fp); + + private: + class PhiCandidate { + public: + explicit PhiCandidate(uint32_t var, uint32_t result, ir::BasicBlock* block) + : var_id_(var), + result_id_(result), + bb_(block), + phi_args_(), + copy_of_(0), + is_complete_(false), + users_() {} + + uint32_t var_id() const { return var_id_; } + uint32_t result_id() const { return result_id_; } + ir::BasicBlock* bb() const { return bb_; } + std::vector& phi_args() { return phi_args_; } + const std::vector& phi_args() const { return phi_args_; } + uint32_t copy_of() const { return copy_of_; } + bool is_complete() const { return is_complete_; } + std::vector& users() { return users_; } + const std::vector& users() const { return users_; } + + // Marks this phi candidate as a trivial copy of |orig_id|. + void MarkCopyOf(uint32_t orig_id) { copy_of_ = orig_id; } + + // Marks this phi candidate as incomplete. + void MarkIncomplete() { is_complete_ = false; } + + // Marks this phi candidate as complete. + void MarkComplete() { is_complete_ = true; } + + // Returns true if this Phi candidate is ready to be emitted. + bool IsReady() const { return is_complete() && copy_of() == 0; } + + // Pretty prints this Phi candidate into a string and returns it. |cfg| is + // needed to lookup basic block predecessors. + std::string PrettyPrint(const ir::CFG* cfg) const; + + // Registers |operand_id| as a user of this Phi candidate. + void AddUser(uint32_t operand_id) { users_.push_back(operand_id); } + + private: + // Variable ID that this Phi is merging. + uint32_t var_id_; + + // SSA ID generated by this Phi (i.e., this is the result ID of the eventual + // Phi instruction). + uint32_t result_id_; + + // Basic block to hold this Phi. + ir::BasicBlock* bb_; + + // Vector of operands for every predecessor block of |bb|. This vector is + // organized so that the Ith slot contains the argument coming from the Ith + // predecessor of |bb|. + std::vector phi_args_; + + // If this Phi is a trivial copy of another Phi, this is the ID of the + // original. If this is 0, it means that this is not a trivial Phi. + uint32_t copy_of_; + + // False, if this Phi candidate has no arguments or at least one argument is + // %0. + bool is_complete_; + + // List of all users for this Phi instruction. Each element is the result ID + // of the load instruction replaced by this Phi, or the result ID of a Phi + // candidate that has this Phi in its list of operands. + std::vector users_; + }; + + // Type used to keep track of store operations in each basic block. + typedef std::unordered_map> + BlockDefsMap; + + // Generates all the SSA rewriting decisions for basic block |bb|. This + // populates the Phi candidate table (|phi_candidate_|) and the load + // replacement table (|load_replacement_). + void GenerateSSAReplacements(ir::BasicBlock* bb); + + // Seals block |bb|. Sealing a basic block means |bb| and all its + // predecessors of |bb| have been scanned for loads/stores. + void SealBlock(ir::BasicBlock* bb); + + // Returns true if |bb| has been sealed. + bool IsBlockSealed(ir::BasicBlock* bb) { + return sealed_blocks_.count(bb) != 0; + } + + // Returns the Phi candidate with result ID |id| if it exists in the table + // |phi_candidates_|. If no such Phi candidate exists, it returns nullptr. + PhiCandidate* GetPhiCandidate(uint32_t id) { + auto it = phi_candidates_.find(id); + return (it != phi_candidates_.end()) ? &it->second : nullptr; + } + + // Replaces all the users of Phi candidate |phi_cand| to be users of + // |repl_id|. + void ReplacePhiUsersWith(const PhiCandidate& phi_cand, uint32_t repl_id); + + // Returns the value ID that should replace the load ID in the given + // replacement pair |repl|. The replacement is a pair (|load_id|, |val_id|). + // If |val_id| is itself replaced by another value in the table, this function + // will look the replacement for |val_id| until it finds one that is not + // itself replaced. For instance, given: + // + // %34 = OpLoad %float %f1 + // OpStore %t %34 + // %36 = OpLoad %float %t + // + // Assume that %f1 is reached by a Phi candidate %42, the load + // replacement table will have the following entries: + // + // %34 -> %42 + // %36 -> %34 + // + // So, when looking for the replacement for %36, we should not use + // %34. Rather, we should use %42. To do this, the chain of + // replacements must be followed until we reach an element that has + // no replacement. + uint32_t GetReplacement(std::pair repl); + + // Returns the argument at index |ix| from |phi_candidate|. If argument |ix| + // comes from a trivial Phi, it follows the copy-of chain from that trivial + // Phi until it finds the original Phi candidate. + // + // This is only valid after all Phi candidates have been completed. It can + // only be called when generating the IR for these Phis. + uint32_t GetPhiArgument(const PhiCandidate* phi_candidate, uint32_t ix); + + // Applies all the SSA replacement decisions. This replaces loads/stores to + // SSA target variables with their corresponding SSA IDs, and inserts Phi + // instructions for them. + bool ApplyReplacements(); + + // Registers a definition for variable |var_id| in basic block |bb| with + // value |val_id|. + void WriteVariable(uint32_t var_id, ir::BasicBlock* bb, uint32_t val_id) { + defs_at_block_[bb][var_id] = val_id; + } + + // Processes the store operation |inst| in basic block |bb|. This extracts + // the variable ID being stored into, determines whether the variable is an + // SSA-target variable, and, if it is, it stores its value in the + // |defs_at_block_| map. + void ProcessStore(ir::Instruction* inst, ir::BasicBlock* bb); + + // Processes the load operation |inst| in basic block |bb|. This extracts + // the variable ID being stored into, determines whether the variable is an + // SSA-target variable, and, if it is, it reads its reaching definition by + // calling |GetReachingDef|. + void ProcessLoad(ir::Instruction* inst, ir::BasicBlock* bb); + + // Reads the current definition for variable |var_id| in basic block |bb|. + // If |var_id| is not defined in block |bb| it walks up the predecessors of + // |bb|, creating new Phi candidates along the way, if needed. + // + // It returns the value for |var_id| from the RHS of the current reaching + // definition for |var_id|. + uint32_t GetReachingDef(uint32_t var_id, ir::BasicBlock* bb); + + // Adds arguments to |phi_candidate| by getting the reaching definition of + // |phi_candidate|'s variable on each of the predecessors of its basic + // block. After populating the argument list, it determines whether all its + // arguments are the same. If so, it returns the ID of the argument that + // this Phi copies. + uint32_t AddPhiOperands(PhiCandidate* phi_candidate); + + // Creates a Phi candidate instruction for variable |var_id| in basic block + // |bb|. + // + // Since the rewriting algorithm may remove Phi candidates when it finds + // them to be trivial, we avoid the expense of creating actual Phi + // instructions by keeping a pool of Phi candidates (|phi_candidates_|) + // during rewriting. + // + // Once the candidate Phi is created, it returns its ID. + PhiCandidate& CreatePhiCandidate(uint32_t var_id, ir::BasicBlock* bb); + + // Attempts to remove a trivial Phi candidate |phi_cand|. Trivial Phis are + // those that only reference themselves and one other value |val| any number + // of times. This will try to remove any other Phis that become trivial + // after |phi_cand| is removed. + // + // If |phi_cand| is trivial, it returns the SSA ID for the value that should + // replace it. Otherwise, it returns the SSA ID for |phi_cand|. + uint32_t TryRemoveTrivialPhi(PhiCandidate* phi_cand); + + // Finalizes |phi_candidate| by replacing every argument that is still %0 + // with its reaching definition. + void FinalizePhiCandidate(PhiCandidate* phi_candidate); + + // Finalizes processing of Phi candidates. Once the whole function has been + // scanned for loads and stores, the CFG will still have some incomplete and + // trivial Phis. This will add missing arguments and remove trivial Phi + // candidates. + void FinalizePhiCandidates(); + + // Prints the table of Phi candidates to std::cerr. + void PrintPhiCandidates() const; + + // Prints the load replacement table to std::cerr. + void PrintReplacementTable() const; + + // Map holding the value of every SSA-target variable at every basic block + // where the variable is stored. defs_at_block_[block][var_id] = val_id + // means that there is a store or Phi instruction for variable |var_id| at + // basic block |block| with value |val_id|. + BlockDefsMap defs_at_block_; + + // Map, indexed by Phi ID, holding all the Phi candidates created during SSA + // rewriting. |phi_candidates_[id]| returns the Phi candidate whose result + // is |id|. + std::unordered_map phi_candidates_; + + // Queue of incomplete Phi candidates. These are Phi candidates created at + // unsealed blocks. They need to be completed before they are instantiated + // in ApplyReplacements. + std::queue incomplete_phis_; + + // List of completed Phi candidates. These are the only candidates that + // will become real Phi instructions. + std::vector phis_to_generate_; + + // SSA replacement table. This maps variable IDs, resulting from a load + // operation, to the value IDs that will replace them after SSA rewriting. + // After all the rewriting decisions are made, a final scan through the IR + // is done to replace all uses of the original load ID with the value ID. + std::unordered_map load_replacement_; + + // Set of blocks that have been sealed already. + std::unordered_set sealed_blocks_; + + // Memory pass requesting the SSA rewriter. + MemPass* pass_; + + // ID of the first Phi created by the SSA rewriter. During rewriting, any + // ID bigger than this corresponds to a Phi candidate. + uint32_t first_phi_id_; +}; + +class SSARewritePass : public MemPass { + public: + SSARewritePass() = default; + const char* name() const override { return "ssa-rewrite"; } + Status Process(ir::IRContext* c) override; + + private: + // Initializes the pass. + void Initialize(ir::IRContext* c); +}; + +} // namespace opt +} // namespace spvtools + +#endif // LIBSPIRV_OPT_SSA_REWRITE_PASS_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/strip_reflect_info_pass.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/strip_reflect_info_pass.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/strip_reflect_info_pass.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/strip_reflect_info_pass.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,75 @@ +// Copyright (c) 2018 Google LLC +// +// 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. + +#include "strip_reflect_info_pass.h" + +#include + +#include "instruction.h" +#include "ir_context.h" + +namespace spvtools { +namespace opt { + +using spvtools::ir::Instruction; + +Pass::Status StripReflectInfoPass::Process(ir::IRContext* irContext) { + bool modified = false; + + std::vector to_remove; + + bool other_uses_for_decorate_string = false; + for (auto& inst : irContext->module()->annotations()) { + switch (inst.opcode()) { + case SpvOpDecorateStringGOOGLE: + if (inst.GetSingleWordInOperand(1) == SpvDecorationHlslSemanticGOOGLE) { + to_remove.push_back(&inst); + } else { + other_uses_for_decorate_string = true; + } + break; + + case SpvOpDecorateId: + if (inst.GetSingleWordInOperand(1) == + SpvDecorationHlslCounterBufferGOOGLE) { + to_remove.push_back(&inst); + } + break; + + default: + break; + } + } + + for (auto& inst : irContext->module()->extensions()) { + const char* ext_name = + reinterpret_cast(&inst.GetInOperand(0).words[0]); + if (0 == std::strcmp(ext_name, "SPV_GOOGLE_hlsl_functionality1")) { + to_remove.push_back(&inst); + } else if (!other_uses_for_decorate_string && + 0 == std::strcmp(ext_name, "SPV_GOOGLE_decorate_string")) { + to_remove.push_back(&inst); + } + } + + for (auto* inst : to_remove) { + modified = true; + irContext->KillInst(inst); + } + + return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; +} + +} // namespace opt +} // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/strip_reflect_info_pass.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/strip_reflect_info_pass.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/strip_reflect_info_pass.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/strip_reflect_info_pass.h 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,44 @@ +// Copyright (c) 2018 Google LLC +// +// 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. + +#ifndef LIBSPIRV_OPT_STRIP_REFLECT_INFO_PASS_H_ +#define LIBSPIRV_OPT_STRIP_REFLECT_INFO_PASS_H_ + +#include "ir_context.h" +#include "module.h" +#include "pass.h" + +namespace spvtools { +namespace opt { + +// See optimizer.hpp for documentation. +class StripReflectInfoPass : public Pass { + public: + const char* name() const override { return "strip-reflect"; } + Status Process(ir::IRContext* irContext) override; + + // Return the mask of preserved Analyses. + ir::IRContext::Analysis GetPreservedAnalyses() override { + return ir::IRContext::kAnalysisInstrToBlockMapping | + ir::IRContext::kAnalysisCombinators | ir::IRContext::kAnalysisCFG | + ir::IRContext::kAnalysisDominatorAnalysis | + ir::IRContext::kAnalysisLoopAnalysis | + ir::IRContext::kAnalysisNameMap; + } +}; + +} // namespace opt +} // namespace spvtools + +#endif // LIBSPIRV_OPT_STRIP_REFLECT_INFO_PASS_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/type_manager.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/type_manager.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/type_manager.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/type_manager.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -349,19 +349,153 @@ context()->get_def_use_mgr()->AnalyzeInstUse(inst); } +Type* TypeManager::RebuildType(const Type& type) { + // The comparison and hash on the type pool will avoid inserting the rebuilt + // type if an equivalent type already exists. The rebuilt type will be deleted + // when it goes out of scope at the end of the function in that case. Repeated + // insertions of the same Type will, at most, keep one corresponding object in + // the type pool. + std::unique_ptr rebuilt_ty; + switch (type.kind()) { +#define DefineNoSubtypeCase(kind) \ + case Type::k##kind: \ + rebuilt_ty.reset(type.Clone().release()); \ + break; + DefineNoSubtypeCase(Void); + DefineNoSubtypeCase(Bool); + DefineNoSubtypeCase(Integer); + DefineNoSubtypeCase(Float); + DefineNoSubtypeCase(Sampler); + DefineNoSubtypeCase(Opaque); + DefineNoSubtypeCase(Event); + DefineNoSubtypeCase(DeviceEvent); + DefineNoSubtypeCase(ReserveId); + DefineNoSubtypeCase(Queue); + DefineNoSubtypeCase(Pipe); + DefineNoSubtypeCase(PipeStorage); + DefineNoSubtypeCase(NamedBarrier); +#undef DefineNoSubtypeCase + case Type::kVector: { + const Vector* vec_ty = type.AsVector(); + const Type* ele_ty = vec_ty->element_type(); + rebuilt_ty.reset( + new Vector(RebuildType(*ele_ty), vec_ty->element_count())); + break; + } + case Type::kMatrix: { + const Matrix* mat_ty = type.AsMatrix(); + const Type* ele_ty = mat_ty->element_type(); + rebuilt_ty.reset( + new Matrix(RebuildType(*ele_ty), mat_ty->element_count())); + break; + } + case Type::kImage: { + const Image* image_ty = type.AsImage(); + const Type* ele_ty = image_ty->sampled_type(); + rebuilt_ty.reset(new Image(RebuildType(*ele_ty), image_ty->dim(), + image_ty->depth(), image_ty->is_arrayed(), + image_ty->is_multisampled(), + image_ty->sampled(), image_ty->format(), + image_ty->access_qualifier())); + break; + } + case Type::kSampledImage: { + const SampledImage* image_ty = type.AsSampledImage(); + const Type* ele_ty = image_ty->image_type(); + rebuilt_ty.reset( + + new SampledImage(RebuildType(*ele_ty))); + break; + } + case Type::kArray: { + const Array* array_ty = type.AsArray(); + const Type* ele_ty = array_ty->element_type(); + rebuilt_ty.reset(new Array(RebuildType(*ele_ty), array_ty->LengthId())); + break; + } + case Type::kRuntimeArray: { + const RuntimeArray* array_ty = type.AsRuntimeArray(); + const Type* ele_ty = array_ty->element_type(); + rebuilt_ty.reset(new RuntimeArray(RebuildType(*ele_ty))); + break; + } + case Type::kStruct: { + const Struct* struct_ty = type.AsStruct(); + std::vector subtypes; + subtypes.reserve(struct_ty->element_types().size()); + for (const auto* ele_ty : struct_ty->element_types()) { + subtypes.push_back(RebuildType(*ele_ty)); + } + rebuilt_ty.reset(new Struct(subtypes)); + Struct* rebuilt_struct = rebuilt_ty->AsStruct(); + for (auto pair : struct_ty->element_decorations()) { + uint32_t index = pair.first; + for (const auto& dec : pair.second) { + // Explicit copy intended. + std::vector copy(dec); + rebuilt_struct->AddMemberDecoration(index, std::move(copy)); + } + } + break; + } + case Type::kPointer: { + const Pointer* pointer_ty = type.AsPointer(); + const Type* ele_ty = pointer_ty->pointee_type(); + rebuilt_ty.reset( + new Pointer(RebuildType(*ele_ty), pointer_ty->storage_class())); + break; + } + case Type::kFunction: { + const Function* function_ty = type.AsFunction(); + const Type* ret_ty = function_ty->return_type(); + std::vector param_types; + param_types.reserve(function_ty->param_types().size()); + for (const auto* param_ty : function_ty->param_types()) { + param_types.push_back(RebuildType(*param_ty)); + } + rebuilt_ty.reset(new Function(RebuildType(*ret_ty), param_types)); + break; + } + case Type::kForwardPointer: { + const ForwardPointer* forward_ptr_ty = type.AsForwardPointer(); + rebuilt_ty.reset(new ForwardPointer(forward_ptr_ty->target_id(), + forward_ptr_ty->storage_class())); + const Pointer* target_ptr = forward_ptr_ty->target_pointer(); + if (target_ptr) { + rebuilt_ty->AsForwardPointer()->SetTargetPointer( + RebuildType(*target_ptr)->AsPointer()); + } + break; + } + default: + assert(false && "Unhandled type"); + return nullptr; + } + for (const auto& dec : type.decorations()) { + // Explicit copy intended. + std::vector copy(dec); + rebuilt_ty->AddDecoration(std::move(copy)); + } + + return type_pool_.insert(std::move(rebuilt_ty)).first->get(); +} + void TypeManager::RegisterType(uint32_t id, const Type& type) { - // The comparison and hash on the type pool will avoid inserting the clone if - // an equivalent type already exists. The clone will be deleted when it goes - // out of scope at the end of the function in that case. Repeated insertions - // of the same Type will atmost keep one corresponding object in the type + // Rebuild |type| so it and all its constituent types are owned by the type // pool. - auto pair = type_pool_.insert(type.Clone()); - id_to_type_[id] = pair.first->get(); - if (GetId(pair.first->get()) == 0) { - type_to_id_[pair.first->get()] = id; + Type* rebuilt = RebuildType(type); + assert(rebuilt->IsSame(&type)); + id_to_type_[id] = rebuilt; + if (GetId(rebuilt) == 0) { + type_to_id_[rebuilt] = id; } } +Type* TypeManager::GetRegisteredType(const Type* type) { + uint32_t id = GetTypeInstruction(type); + return GetType(id); +} + Type* TypeManager::RecordIfTypeDefinition( const spvtools::ir::Instruction& inst) { if (!spvtools::ir::IsTypeInst(inst.opcode())) return nullptr; @@ -535,6 +669,27 @@ } } +const Type* TypeManager::GetMemberType( + const Type* parent_type, const std::vector& access_chain) { + for (uint32_t element_index : access_chain) { + if (const analysis::Struct* struct_type = parent_type->AsStruct()) { + parent_type = struct_type->element_types()[element_index]; + } else if (const analysis::Array* array_type = parent_type->AsArray()) { + parent_type = array_type->element_type(); + } else if (const analysis::RuntimeArray* runtime_array_type = + parent_type->AsRuntimeArray()) { + parent_type = runtime_array_type->element_type(); + } else if (const analysis::Vector* vector_type = parent_type->AsVector()) { + parent_type = vector_type->element_type(); + } else if (const analysis::Matrix* matrix_type = parent_type->AsMatrix()) { + parent_type = matrix_type->element_type(); + } else { + assert(false && "Trying to get a member of a type without members."); + } + } + return parent_type; +} + } // namespace analysis } // namespace opt } // namespace spvtools diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/type_manager.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/type_manager.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/type_manager.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/type_manager.h 2018-04-27 11:46:32.000000000 +0000 @@ -122,6 +122,8 @@ // unchanged. void RegisterType(uint32_t id, const Type& type); + Type* GetRegisteredType(const Type* type); + // Removes knowledge of |id| from the manager. // // If |id| is an ambiguous type the multiple ids may be registered to |id|'s @@ -130,6 +132,14 @@ // defining that type. void RemoveId(uint32_t id); + // Returns the type of the member of |parent_type| that is identified by + // |access_chain|. The vector |access_chain| is a series of integers that are + // used to pick members as in the |OpCompositeExtract| instructions. If you + // want a member of an array, vector, or matrix that does not have a constant + // index, you can use 0 in that position. All elements have the same type. + const Type* GetMemberType(const Type* parent_type, + const std::vector& access_chain); + private: using TypeToIdMap = std::unordered_map; @@ -162,6 +172,11 @@ // |type| (e.g. should be called in loop of |type|'s decorations). void AttachDecoration(const spvtools::ir::Instruction& inst, Type* type); + // Returns an equivalent pointer to |type| built in terms of pointers owned by + // |type_pool_|. For example, if |type| is a vec3 of bool, it will be rebuilt + // replacing the bool subtype with one owned by |type_pool_|. + Type* RebuildType(const Type& type); + const MessageConsumer& consumer_; // Message consumer. spvtools::ir::IRContext* context_; IdToTypeMap id_to_type_; // Mapping from ids to their type representations. diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/types.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/types.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/types.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/types.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -486,10 +486,8 @@ } } -Pointer::Pointer(Type* type, SpvStorageClass sc) - : Type(kPointer), pointee_type_(type), storage_class_(sc) { - assert(!type->AsVoid()); -} +Pointer::Pointer(const Type* type, SpvStorageClass sc) + : Type(kPointer), pointee_type_(type), storage_class_(sc) {} bool Pointer::IsSame(const Type* that) const { const Pointer* pt = that->AsPointer(); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/types.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/types.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/opt/types.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/opt/types.h 2018-04-27 11:46:32.000000000 +0000 @@ -17,6 +17,7 @@ #ifndef LIBSPIRV_OPT_TYPES_H_ #define LIBSPIRV_OPT_TYPES_H_ +#include #include #include #include @@ -369,7 +370,8 @@ bool decoration_empty() const override { return decorations_.empty() && element_decorations_.empty(); } - const std::unordered_map>>& + + const std::map>>& element_decorations() const { return element_decorations_; } @@ -388,9 +390,10 @@ std::vector element_types_; // We can attach decorations to struct members and that should not affect the // underlying element type. So we need an extra data structure here to keep - // track of element type decorations. - std::unordered_map>> - element_decorations_; + // track of element type decorations. They must be stored in an ordered map + // because |GetExtraHashWords| will traverse the structure. It must have a + // fixed order in order to hash to the same value every time. + std::map>> element_decorations_; }; class Opaque : public Type { @@ -414,7 +417,7 @@ class Pointer : public Type { public: - Pointer(Type* pointee, SpvStorageClass sc); + Pointer(const Type* pointee, SpvStorageClass sc); Pointer(const Pointer&) = default; bool IsSame(const Type* that) const override; @@ -428,7 +431,7 @@ void GetExtraHashWords(std::vector* words) const override; private: - Type* pointee_type_; + const Type* pointee_type_; SpvStorageClass storage_class_; }; @@ -485,6 +488,7 @@ uint32_t target_id() const { return target_id_; } void SetTargetPointer(Pointer* pointer) { pointer_ = pointer; } SpvStorageClass storage_class() const { return storage_class_; } + const Pointer* target_pointer() const { return pointer_; } bool IsSame(const Type* that) const override; std::string str() const override; @@ -515,7 +519,7 @@ const type* As##type() const override { return this; } \ \ void GetExtraHashWords(std::vector*) const override {} \ - }; // namespace analysis + } DefineParameterlessType(Void, void); DefineParameterlessType(Bool, bool); DefineParameterlessType(Sampler, sampler); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/software_version.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/software_version.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/software_version.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/software_version.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -22,6 +22,6 @@ } // anonymous namespace -const char* spvSoftwareVersionString() { return kBuildVersions[0]; } +const char* spvSoftwareVersionString(void) { return kBuildVersions[0]; } -const char* spvSoftwareVersionDetailsString() { return kBuildVersions[1]; } +const char* spvSoftwareVersionDetailsString(void) { return kBuildVersions[1]; } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/spirv_target_env.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/spirv_target_env.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/spirv_target_env.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/spirv_target_env.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -39,9 +39,9 @@ case SPV_ENV_OPENCL_EMBEDDED_2_1: return "SPIR-V 1.0 (under OpenCL 2.1 Embedded Profile semantics)"; case SPV_ENV_OPENCL_2_2: - return "SPIR-V 1.1 (under OpenCL 2.2 Full Profile semantics)"; + return "SPIR-V 1.2 (under OpenCL 2.2 Full Profile semantics)"; case SPV_ENV_OPENCL_EMBEDDED_2_2: - return "SPIR-V 1.1 (under OpenCL 2.2 Embedded Profile semantics)"; + return "SPIR-V 1.2 (under OpenCL 2.2 Embedded Profile semantics)"; case SPV_ENV_OPENGL_4_0: return "SPIR-V 1.0 (under OpenCL 4.0 semantics)"; case SPV_ENV_OPENGL_4_1: @@ -54,6 +54,10 @@ return "SPIR-V 1.0 (under OpenCL 4.5 semantics)"; case SPV_ENV_UNIVERSAL_1_2: return "SPIR-V 1.2"; + case SPV_ENV_UNIVERSAL_1_3: + return "SPIR-V 1.3"; + case SPV_ENV_VULKAN_1_1: + return "SPIR-V 1.3 (under Vulkan 1.1 semantics)"; } assert(0 && "Unhandled SPIR-V target environment"); return ""; @@ -81,6 +85,9 @@ case SPV_ENV_OPENCL_2_2: case SPV_ENV_OPENCL_EMBEDDED_2_2: return SPV_SPIRV_VERSION_WORD(1, 2); + case SPV_ENV_UNIVERSAL_1_3: + case SPV_ENV_VULKAN_1_1: + return SPV_SPIRV_VERSION_WORD(1, 3); } assert(0 && "Unhandled SPIR-V target environment"); return SPV_SPIRV_VERSION_WORD(0, 0); @@ -93,6 +100,9 @@ if (match("vulkan1.0")) { if (env) *env = SPV_ENV_VULKAN_1_0; return true; + } else if (match("vulkan1.1")) { + if (env) *env = SPV_ENV_VULKAN_1_1; + return true; } else if (match("spv1.0")) { if (env) *env = SPV_ENV_UNIVERSAL_1_0; return true; @@ -102,6 +112,9 @@ } else if (match("spv1.2")) { if (env) *env = SPV_ENV_UNIVERSAL_1_2; return true; + } else if (match("spv1.3")) { + if (env) *env = SPV_ENV_UNIVERSAL_1_3; + return true; } else if (match("opencl1.2embedded")) { if (env) *env = SPV_ENV_OPENCL_EMBEDDED_1_2; return true; @@ -165,8 +178,10 @@ case SPV_ENV_UNIVERSAL_1_2: case SPV_ENV_OPENCL_2_2: case SPV_ENV_OPENCL_EMBEDDED_2_2: + case SPV_ENV_UNIVERSAL_1_3: return false; case SPV_ENV_VULKAN_1_0: + case SPV_ENV_VULKAN_1_1: return true; } return false; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/spirv_validator_options.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/spirv_validator_options.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/spirv_validator_options.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/spirv_validator_options.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -46,7 +46,7 @@ return true; } -spv_validator_options spvValidatorOptionsCreate() { +spv_validator_options spvValidatorOptionsCreate(void) { return new spv_validator_options_t; } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/table.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/table.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/table.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/table.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -35,6 +35,8 @@ case SPV_ENV_OPENGL_4_3: case SPV_ENV_OPENGL_4_5: case SPV_ENV_UNIVERSAL_1_2: + case SPV_ENV_UNIVERSAL_1_3: + case SPV_ENV_VULKAN_1_1: break; default: return nullptr; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/table.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/table.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/table.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/table.h 2018-04-27 11:46:32.000000000 +0000 @@ -29,10 +29,20 @@ // operandTypes[0..numTypes-1] describe logical operands for the instruction. // The operand types include result id and result-type id, followed by // the types of arguments. - uint16_t numTypes; + const uint16_t numTypes; spv_operand_type_t operandTypes[16]; // TODO: Smaller/larger? const bool hasResult; // Does the instruction have a result ID operand? const bool hasType; // Does the instruction have a type ID operand? + // A set of extensions that enable this feature. If empty then this operand + // value is in core and its availability is subject to minVersion. The + // assembler, binary parser, and disassembler ignore this rule, so you can + // freely process invalid modules. + const uint32_t numExtensions; + const libspirv::Extension* extensions; + // Minimal core SPIR-V version required for this feature, if without + // extensions. ~0u means reserved for future use. ~0u and non-empty extension + // lists means only available in extensions. + const uint32_t minVersion; } spv_opcode_desc_t; typedef struct spv_operand_desc_t { @@ -41,12 +51,16 @@ const uint32_t numCapabilities; const SpvCapability* capabilities; // A set of extensions that enable this feature. If empty then this operand - // value is always enabled, i.e. it's in core. The assembler, binary parser, - // and disassembler ignore this rule, so you can freely process invalid - // modules. + // value is in core and its availability is subject to minVersion. The + // assembler, binary parser, and disassembler ignore this rule, so you can + // freely process invalid modules. const uint32_t numExtensions; const libspirv::Extension* extensions; const spv_operand_type_t operandTypes[16]; // TODO: Smaller/larger? + // Minimal core SPIR-V version required for this feature, if without + // extensions. ~0u means reserved for future use. ~0u and non-empty extension + // lists means only available in extensions. + const uint32_t minVersion; } spv_operand_desc_t; typedef struct spv_operand_desc_group_t { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/util/hex_float.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/util/hex_float.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/util/hex_float.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/util/hex_float.h 2018-04-27 11:46:32.000000000 +0000 @@ -22,6 +22,7 @@ #include #include #include +#include #include "bitutils.h" @@ -76,6 +77,14 @@ static float max() { return std::numeric_limits::max(); } // Returns the lowest normal value. static float lowest() { return std::numeric_limits::lowest(); } + // Returns the value as the native floating point format. + static float getAsFloat(const uint_type& t) { return BitwiseCast(t); } + // Returns the bits from the given floating pointer number. + static uint_type getBitsFromFloat(const float& t) { + return BitwiseCast(t); + } + // Returns the bitwidth. + static uint32_t width() { return 32u; } }; template <> @@ -88,6 +97,16 @@ static double max() { return std::numeric_limits::max(); } // Returns the lowest normal value. static double lowest() { return std::numeric_limits::lowest(); } + // Returns the value as the native floating point format. + static double getAsFloat(const uint_type& t) { + return BitwiseCast(t); + } + // Returns the bits from the given floating pointer number. + static uint_type getBitsFromFloat(const double& t) { + return BitwiseCast(t); + } + // Returns the bitwidth. + static uint32_t width() { return 64u; } }; template <> @@ -100,6 +119,12 @@ static Float16 max() { return Float16::max(); } // Returns the lowest normal value. static Float16 lowest() { return Float16::lowest(); } + // Returns the value as the native floating point format. + static Float16 getAsFloat(const uint_type& t) { return Float16(t); } + // Returns the bits from the given floating pointer number. + static uint_type getBitsFromFloat(const Float16& t) { return t.get_value(); } + // Returns the bitwidth. + static uint32_t width() { return 16u; } }; // Since copying a floating point number (especially if it is NaN) @@ -116,7 +141,7 @@ // Intentionally non-explicit. This is a proxy type so // implicit conversions allow us to use it more transparently. - FloatProxy(T val) { data_ = BitwiseCast(val); } + FloatProxy(T val) { data_ = FloatProxyTraits::getBitsFromFloat(val); } // Intentionally non-explicit. This is a proxy type so // implicit conversions allow us to use it more transparently. @@ -129,11 +154,24 @@ } // Returns the data as a floating point value. - T getAsFloat() const { return BitwiseCast(data_); } + T getAsFloat() const { return FloatProxyTraits::getAsFloat(data_); } // Returns the raw data. uint_type data() const { return data_; } + // Returns a vector of words suitable for use in an Operand. + std::vector GetWords() const { + std::vector words; + if (FloatProxyTraits::width() == 64) { + FloatProxyTraits::uint_type d = data(); + words.push_back(static_cast(d)); + words.push_back(static_cast(d >> 32)); + } else { + words.push_back(static_cast(data())); + } + return words; + } + // Returns true if the value represents any type of NaN. bool isNan() { return FloatProxyTraits::isNan(getAsFloat()); } // Returns true if the value represents any type of infinity. @@ -317,12 +355,11 @@ static const int_type min_exponent = -static_cast(exponent_bias); // Returns the bits associated with the value. - uint_type getBits() const { return spvutils::BitwiseCast(value_); } + uint_type getBits() const { return value_.data(); } // Returns the bits associated with the value, without the leading sign bit. uint_type getUnsignedBits() const { - return static_cast(spvutils::BitwiseCast(value_) & - ~sign_mask); + return static_cast(value_.data() & ~sign_mask); } // Returns the bits associated with the exponent, shifted to start at the @@ -423,7 +460,7 @@ exponent_mask); significand = static_cast(significand & fraction_encode_mask); new_value = static_cast(new_value | (exponent | significand)); - value_ = BitwiseCast(new_value); + value_ = T(new_value); } // Increments the significand of this number by the given amount. @@ -710,7 +747,7 @@ static_assert(HF::num_fraction_bits != 0, "num_fractin_bits must be non-zero for a valid float"); - const uint_type bits = spvutils::BitwiseCast(value.value()); + const uint_type bits = value.value().data(); const char* const sign = (bits & HF::sign_mask) ? "-" : ""; const uint_type exponent = static_cast( (bits & HF::exponent_mask) >> HF::num_fraction_bits); @@ -1072,7 +1109,7 @@ HF::exponent_mask); output_bits |= shifted_exponent; - T output_float = spvutils::BitwiseCast(output_bits); + T output_float(output_bits); value.set_value(output_float); return is; @@ -1089,7 +1126,7 @@ case FP_ZERO: case FP_NORMAL: { auto saved_precision = os.precision(); - os.precision(std::numeric_limits::digits10); + os.precision(std::numeric_limits::max_digits10); os << float_val; os.precision(saved_precision); } break; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/util/ilist.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/util/ilist.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/util/ilist.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/util/ilist.h 2018-04-27 11:46:32.000000000 +0000 @@ -181,6 +181,12 @@ const NodeType& front() const; const NodeType& back() const; + // Transfers [|first|, |last|) from |other| into the list at |where|. + // + // If |other| is |this|, no change is made. + void Splice(iterator where, IntrusiveList* other, iterator first, + iterator last); + protected: // Doing a deep copy of the list does not make sense if the list does not own // the data. It is not clear who will own the newly created data. Making @@ -308,6 +314,29 @@ } template +void IntrusiveList::Splice(iterator where, + IntrusiveList* other, + iterator first, iterator last) { + if (first == last) return; + if (other == this) return; + + NodeType* first_prev = first.node_->previous_node_; + NodeType* where_next = where.node_->next_node_; + + // Attach first. + where.node_->next_node_ = first.node_; + first.node_->previous_node_ = where.node_; + + // Attach last. + where_next->previous_node_ = last.node_->previous_node_; + last.node_->previous_node_->next_node_ = where_next; + + // Fixup other. + first_prev->next_node_ = last.node_; + last.node_->previous_node_ = first_prev; +} + +template void IntrusiveList::Check(NodeType* start) { int sentinel_count = 0; NodeType* p = start; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/util/timer.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/util/timer.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/util/timer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/util/timer.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,100 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include "util/timer.h" + +#include +#include +#include +#include +#include + +namespace spvutils { + +#if defined(SPIRV_TIMER_ENABLED) + +void PrintTimerDescription(std::ostream* out, bool measure_mem_usage) { + if (out) { + *out << std::setw(30) << "PASS name" << std::setw(12) << "CPU time" + << std::setw(12) << "WALL time" << std::setw(12) << "USR time" + << std::setw(12) << "SYS time"; + if (measure_mem_usage) { + *out << std::setw(12) << "RSS delta" << std::setw(16) << "PGFault delta"; + } + *out << std::endl; + } +} + +// Do not change the order of invoking system calls. We want to make CPU/Wall +// time correct as much as possible. Calling functions to get CPU/Wall time must +// closely surround the target code of measuring. +void Timer::Start() { + if (report_stream_) { + if (getrusage(RUSAGE_SELF, &usage_before_) == -1) + usage_status_ |= kGetrusageFailed; + if (clock_gettime(CLOCK_MONOTONIC, &wall_before_) == -1) + usage_status_ |= kClockGettimeWalltimeFailed; + if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cpu_before_) == -1) + usage_status_ |= kClockGettimeCPUtimeFailed; + } +} + +// The order of invoking system calls is important with the same reason as +// Timer::Start(). +void Timer::Stop() { + if (report_stream_ && usage_status_ == kSucceeded) { + if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cpu_after_) == -1) + usage_status_ |= kClockGettimeCPUtimeFailed; + if (clock_gettime(CLOCK_MONOTONIC, &wall_after_) == -1) + usage_status_ |= kClockGettimeWalltimeFailed; + if (getrusage(RUSAGE_SELF, &usage_after_) == -1) + usage_status_ = kGetrusageFailed; + } +} + +void Timer::Report(const char* tag) { + if (!report_stream_) return; + + report_stream_->precision(2); + *report_stream_ << std::fixed << std::setw(30) << tag; + + if (usage_status_ & kClockGettimeCPUtimeFailed) + *report_stream_ << std::setw(12) << "Failed"; + else + *report_stream_ << std::setw(12) << CPUTime(); + + if (usage_status_ & kClockGettimeWalltimeFailed) + *report_stream_ << std::setw(12) << "Failed"; + else + *report_stream_ << std::setw(12) << WallTime(); + + if (usage_status_ & kGetrusageFailed) { + *report_stream_ << std::setw(12) << "Failed" << std::setw(12) << "Failed"; + if (measure_mem_usage_) { + *report_stream_ << std::setw(12) << "Failed" << std::setw(12) << "Failed"; + } + } else { + *report_stream_ << std::setw(12) << UserTime() << std::setw(12) + << SystemTime(); + if (measure_mem_usage_) { + *report_stream_ << std::fixed << std::setw(12) << RSS() << std::setw(16) + << PageFault(); + } + } + *report_stream_ << std::endl; +} + +#endif // defined(SPIRV_TIMER_ENABLED) + +} // namespace spvutils diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/util/timer.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/util/timer.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/util/timer.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/util/timer.h 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,387 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +// Contains utils for getting resource utilization + +#ifndef LIBSPIRV_UTIL_TIMER_H_ +#define LIBSPIRV_UTIL_TIMER_H_ + +#if defined(SPIRV_TIMER_ENABLED) + +#include +#include +#include + +// A macro to call spvutils::PrintTimerDescription(std::ostream*, bool). The +// first argument must be given as std::ostream*. If it is NULL, the function +// does nothing. Otherwise, it prints resource types measured by Timer class. +// The second is optional and if it is true, the function also prints resource +// type fields related to memory. Otherwise, it does not print memory related +// fields. Its default is false. In usual, this must be placed before calling +// Timer::Report() to inform what those fields printed by Timer::Report() +// indicate (or spvutils::PrintTimerDescription() must be used instead). +#define SPIRV_TIMER_DESCRIPTION(...) \ + spvutils::PrintTimerDescription(__VA_ARGS__) + +// Creates an object of ScopedTimer to measure the resource utilization for the +// scope surrounding it as the following example: +// +// { // <-- beginning of this scope +// +// /* ... code out of interest ... */ +// +// SPIRV_TIMER_SCOPED(std::cout, tag); +// +// /* ... lines of code that we want to know its resource usage ... */ +// +// } // <-- end of this scope. The destructor of ScopedTimer prints tag and +// the resource utilization to std::cout. +#define SPIRV_TIMER_SCOPED(...) \ + spvutils::ScopedTimer timer##__LINE__(__VA_ARGS__) + +namespace spvutils { + +// Prints the description of resource types measured by Timer class. If |out| is +// NULL, it does nothing. Otherwise, it prints resource types. The second is +// optional and if it is true, the function also prints resource type fields +// related to memory. Its default is false. In usual, this must be placed before +// calling Timer::Report() to inform what those fields printed by +// Timer::Report() indicate. +void PrintTimerDescription(std::ostream*, bool = false); + +// Status of Timer. kGetrusageFailed means it failed in calling getrusage(). +// kClockGettimeWalltimeFailed means it failed in getting wall time when calling +// clock_gettime(). kClockGettimeCPUtimeFailed means it failed in getting CPU +// time when calling clock_gettime(). +enum UsageStatus { + kSucceeded = 0, + kGetrusageFailed = 1 << 0, + kClockGettimeWalltimeFailed = 1 << 1, + kClockGettimeCPUtimeFailed = 1 << 2, +}; + +// Timer measures the resource utilization for a range of code. The resource +// utilization consists of CPU time (i.e., process time), WALL time (elapsed +// time), USR time, SYS time, RSS delta, and the delta of the number of page +// faults. RSS delta and the delta of the number of page faults are measured +// only when |measure_mem_usage| given to the constructor is true. This class +// should be used as the following example: +// +// spvutils::Timer timer(std::cout); +// timer.Start(); // <-- set |usage_before_|, |wall_before_|, +// and |cpu_before_| +// +// /* ... lines of code that we want to know its resource usage ... */ +// +// timer.Stop(); // <-- set |cpu_after_|, |wall_after_|, and +// |usage_after_| +// timer.Report(tag); // <-- print tag and the resource utilization to +// std::cout. +class Timer { + public: + Timer(std::ostream* out, bool measure_mem_usage = false) + : report_stream_(out), + usage_status_(kSucceeded), + measure_mem_usage_(measure_mem_usage) {} + + // Sets |usage_before_|, |wall_before_|, and |cpu_before_| as results of + // getrusage(), clock_gettime() for the wall time, and clock_gettime() for the + // CPU time respectively. Note that this method erases all previous state of + // |usage_before_|, |wall_before_|, |cpu_before_|. + virtual void Start(); + + // Sets |cpu_after_|, |wall_after_|, and |usage_after_| as results of + // clock_gettime() for the wall time, and clock_gettime() for the CPU time, + // getrusage() respectively. Note that this method erases all previous state + // of |cpu_after_|, |wall_after_|, |usage_after_|. + virtual void Stop(); + + // If |report_stream_| is NULL, it does nothing. Otherwise, it prints the + // resource utilization (i.e., CPU/WALL/USR/SYS time, RSS delta) between the + // time of calling Timer::Start() and the time of calling Timer::Stop(). If we + // cannot get a resource usage because of failures, it prints "Failed" instead + // for the resource. + void Report(const char* tag); + + // Returns the measured CPU Time (i.e., process time) for a range of code + // execution. If kClockGettimeCPUtimeFailed is set by the failure of calling + // clock_gettime(), it returns -1. + virtual double CPUTime() { + if (usage_status_ & kClockGettimeCPUtimeFailed) return -1; + return TimeDifference(cpu_before_, cpu_after_); + } + + // Returns the measured Wall Time (i.e., elapsed time) for a range of code + // execution. If kClockGettimeWalltimeFailed is set by the failure of + // calling clock_gettime(), it returns -1. + virtual double WallTime() { + if (usage_status_ & kClockGettimeWalltimeFailed) return -1; + return TimeDifference(wall_before_, wall_after_); + } + + // Returns the measured USR Time for a range of code execution. If + // kGetrusageFailed is set because of the failure of calling getrusage(), it + // returns -1. + virtual double UserTime() { + if (usage_status_ & kGetrusageFailed) return -1; + return TimeDifference(usage_before_.ru_utime, usage_after_.ru_utime); + } + + // Returns the measured SYS Time for a range of code execution. If + // kGetrusageFailed is set because of the failure of calling getrusage(), it + // returns -1. + virtual double SystemTime() { + if (usage_status_ & kGetrusageFailed) return -1; + return TimeDifference(usage_before_.ru_stime, usage_after_.ru_stime); + } + + // Returns the measured RSS delta for a range of code execution. If + // kGetrusageFailed is set because of the failure of calling getrusage(), it + // returns -1. + virtual long RSS() const { + if (usage_status_ & kGetrusageFailed) return -1; + return usage_after_.ru_maxrss - usage_before_.ru_maxrss; + } + + // Returns the measured the delta of the number of page faults for a range of + // code execution. If kGetrusageFailed is set because of the failure of + // calling getrusage(), it returns -1. + virtual long PageFault() const { + if (usage_status_ & kGetrusageFailed) return -1; + return (usage_after_.ru_minflt - usage_before_.ru_minflt) + + (usage_after_.ru_majflt - usage_before_.ru_majflt); + } + + virtual ~Timer() {} + + private: + // Returns the time gap between |from| and |to| in seconds. + static double TimeDifference(const timeval& from, const timeval& to) { + assert((to.tv_sec > from.tv_sec) || + (to.tv_sec == from.tv_sec && to.tv_usec >= from.tv_usec)); + return static_cast(to.tv_sec - from.tv_sec) + + static_cast(to.tv_usec - from.tv_usec) * .000001; + } + + // Returns the time gap between |from| and |to| in seconds. + static double TimeDifference(const timespec& from, const timespec& to) { + assert((to.tv_sec > from.tv_sec) || + (to.tv_sec == from.tv_sec && to.tv_nsec >= from.tv_nsec)); + return static_cast(to.tv_sec - from.tv_sec) + + static_cast(to.tv_nsec - from.tv_nsec) * .000000001; + } + + // Output stream to print out the resource utilization. If it is NULL, + // Report() does nothing. + std::ostream* report_stream_; + + // Status to stop measurement if a system call returns an error. + unsigned usage_status_; + + // Variable to save the result of clock_gettime(CLOCK_PROCESS_CPUTIME_ID) when + // Timer::Start() is called. It is used as the base status of CPU time. + timespec cpu_before_; + + // Variable to save the result of clock_gettime(CLOCK_MONOTONIC) when + // Timer::Start() is called. It is used as the base status of WALL time. + timespec wall_before_; + + // Variable to save the result of getrusage() when Timer::Start() is called. + // It is used as the base status of USR time, SYS time, and RSS. + rusage usage_before_; + + // Variable to save the result of clock_gettime(CLOCK_PROCESS_CPUTIME_ID) when + // Timer::Stop() is called. It is used as the last status of CPU time. The + // resouce usage is measured by subtracting |cpu_before_| from it. + timespec cpu_after_; + + // Variable to save the result of clock_gettime(CLOCK_MONOTONIC) when + // Timer::Stop() is called. It is used as the last status of WALL time. The + // resouce usage is measured by subtracting |wall_before_| from it. + timespec wall_after_; + + // Variable to save the result of getrusage() when Timer::Stop() is called. It + // is used as the last status of USR time, SYS time, and RSS. Those resouce + // usages are measured by subtracting |usage_before_| from it. + rusage usage_after_; + + // If true, Timer reports the memory usage information too. Otherwise, Timer + // reports only USR time, WALL time, SYS time. + bool measure_mem_usage_; +}; + +// The purpose of ScopedTimer is to measure the resource utilization for a +// scope. Simply creating a local variable of ScopedTimer will call +// Timer::Start() and it calls Timer::Stop() and Timer::Report() at the end of +// the scope by its destructor. When we use this class, we must choose the +// proper Timer class (for class TimerType template) in advance. This class +// should be used as the following example: +// +// { // <-- beginning of this scope +// +// /* ... code out of interest ... */ +// +// spvutils::ScopedTimer scopedtimer(std::cout, tag); +// +// /* ... lines of code that we want to know its resource usage ... */ +// +// } // <-- end of this scope. The destructor of ScopedTimer prints tag and +// the resource utilization to std::cout. +// +// The template is used to choose a Timer class. Currently, +// only options for the Timer class are Timer and MockTimer in the unit test. +template +class ScopedTimer { + public: + ScopedTimer(std::ostream* out, const char* tag, + bool measure_mem_usage = false) + : timer(new TimerType(out, measure_mem_usage)), tag_(tag) { + timer->Start(); + } + + // At the end of the scope surrounding the instance of this class, this + // destructor saves the last status of resource usage and reports it. + virtual ~ScopedTimer() { + timer->Stop(); + timer->Report(tag_); + delete timer; + } + + private: + // Actual timer that measures the resource utilization. It must be an instance + // of Timer class if there is no special reason to use other class. + TimerType* timer; + + // A tag that will be printed in front of the trace reported by Timer class. + const char* tag_; +}; + +// CumulativeTimer is the same as Timer class, but it supports a cumulative +// measurement as the following example: +// +// CumulativeTimer *ctimer = new CumulativeTimer(std::cout); +// ctimer->Start(); +// +// /* ... lines of code that we want to know its resource usage ... */ +// +// ctimer->Stop(); +// +// /* ... code out of interest ... */ +// +// ctimer->Start(); +// +// /* ... lines of code that we want to know its resource usage ... */ +// +// ctimer->Stop(); +// ctimer->Report(tag); +// delete ctimer; +// +class CumulativeTimer : public Timer { + public: + CumulativeTimer(std::ostream* out, bool measure_mem_usage = false) + : Timer(out, measure_mem_usage), + cpu_time_(0), + wall_time_(0), + usr_time_(0), + sys_time_(0), + rss_(0), + pgfaults_(0) {} + + // If we cannot get a resource usage because of failures, it sets -1 for the + // resource usage. + void Stop() override { + Timer::Stop(); + + if (cpu_time_ >= 0 && Timer::CPUTime() >= 0) + cpu_time_ += Timer::CPUTime(); + else + cpu_time_ = -1; + + if (wall_time_ >= 0 && Timer::WallTime() >= 0) + wall_time_ += Timer::WallTime(); + else + wall_time_ = -1; + + if (usr_time_ >= 0 && Timer::UserTime() >= 0) + usr_time_ += Timer::UserTime(); + else + usr_time_ = -1; + + if (sys_time_ >= 0 && Timer::SystemTime() >= 0) + sys_time_ += Timer::SystemTime(); + else + sys_time_ = -1; + + if (rss_ >= 0 && Timer::RSS() >= 0) + rss_ += Timer::RSS(); + else + rss_ = -1; + + if (pgfaults_ >= 0 && Timer::PageFault() >= 0) + pgfaults_ += Timer::PageFault(); + else + pgfaults_ = -1; + } + + // Returns the cumulative CPU Time (i.e., process time) for a range of code + // execution. + double CPUTime() override { return cpu_time_; } + + // Returns the cumulative Wall Time (i.e., elapsed time) for a range of code + // execution. + double WallTime() override { return wall_time_; } + + // Returns the cumulative USR Time for a range of code execution. + double UserTime() override { return usr_time_; } + + // Returns the cumulative SYS Time for a range of code execution. + double SystemTime() override { return sys_time_; } + + // Returns the cumulative RSS delta for a range of code execution. + long RSS() const override { return rss_; } + + // Returns the cumulative delta of number of page faults for a range of code + // execution. + long PageFault() const override { return pgfaults_; } + + private: + // Variable to save the cumulative CPU time (i.e., process time). + double cpu_time_; + + // Variable to save the cumulative wall time (i.e., elapsed time). + double wall_time_; + + // Variable to save the cumulative user time. + double usr_time_; + + // Variable to save the cumulative system time. + double sys_time_; + + // Variable to save the cumulative RSS delta. + long rss_; + + // Variable to save the cumulative delta of the number of page faults. + long pgfaults_; +}; + +} // namespace spvutils + +#else // defined(SPIRV_TIMER_ENABLED) + +#define SPIRV_TIMER_DESCRIPTION(...) +#define SPIRV_TIMER_SCOPED(...) + +#endif // defined(SPIRV_TIMER_ENABLED) + +#endif // LIBSPIRV_UTIL_TIMER_H_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/val/decoration.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/val/decoration.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/val/decoration.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/val/decoration.h 2018-04-27 11:46:32.000000000 +0000 @@ -63,9 +63,7 @@ : dec_type_(t), params_(parameters), struct_member_index_(member_index) {} void set_struct_member_index(uint32_t index) { struct_member_index_ = index; } - int struct_member_index() { return struct_member_index_; } int struct_member_index() const { return struct_member_index_; } - SpvDecoration dec_type() { return dec_type_; } SpvDecoration dec_type() const { return dec_type_; } std::vector& params() { return params_; } const std::vector& params() const { return params_; } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/val/function.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/val/function.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/val/function.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/val/function.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -279,7 +279,7 @@ ordered_blocks_, &pseudo_entry_block_, &pseudo_exit_block_, &augmented_successors_map_, &augmented_predecessors_map_, succ_func, pred_func); -}; +} Construct& Function::AddConstruct(const Construct& new_construct) { cfg_constructs_.push_back(new_construct); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/val/validation_state.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/val/validation_state.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/val/validation_state.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/val/validation_state.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -73,6 +73,9 @@ case SpvOpGroupDecorate: case SpvOpGroupMemberDecorate: case SpvOpDecorationGroup: + case SpvOpDecorateId: + case SpvOpDecorateStringGOOGLE: + case SpvOpMemberDecorateStringGOOGLE: out = true; break; default: break; @@ -328,6 +331,11 @@ module_extensions_.Add(ext); switch (ext) { + case kSPV_AMD_gpu_shader_half_float: + // SPV_AMD_gpu_shader_half_float enables float16 type. + // https://github.com/KhronosGroup/SPIRV-Tools/issues/1375 + features_.declare_float16_type = true; + break; case kSPV_AMD_shader_ballot: // The grammar doesn't encode the fact that SPV_AMD_shader_ballot // enables the use of group operations Reduce, InclusiveScan, @@ -766,4 +774,22 @@ return true; } +std::tuple ValidationState_t::EvalInt32IfConst( + uint32_t id) { + const Instruction* const inst = FindDef(id); + assert(inst); + const uint32_t type = inst->type_id(); + + if (!IsIntScalarType(type) || GetBitWidth(type) != 32) { + return std::make_tuple(false, false, 0); + } + + if (inst->opcode() != SpvOpConstant && inst->opcode() != SpvOpSpecConstant) { + return std::make_tuple(true, false, 0); + } + + assert(inst->words().size() == 4); + return std::make_tuple(true, true, inst->word(3)); +} + } // namespace libspirv diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/val/validation_state.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/val/validation_state.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/val/validation_state.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/val/validation_state.h 2018-04-27 11:46:32.000000000 +0000 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -154,10 +155,12 @@ /// instruction bool in_block() const; - /// Registers the given as an Entry Point. - void RegisterEntryPointId(const uint32_t id) { + /// Registers the given as an Entry Point with |execution_model|. + void RegisterEntryPointId(const uint32_t id, + SpvExecutionModel execution_model) { entry_points_.push_back(id); - entry_point_interfaces_.insert(std::make_pair(id, std::vector())); + entry_point_interfaces_.emplace(id, std::vector()); + entry_point_to_execution_models_[id].insert(execution_model); } /// Returns a list of entry point function ids @@ -169,6 +172,12 @@ entry_point_interfaces_[entry_point].push_back(interface); } + /// Registers execution mode for the given entry point. + void RegisterExecutionModeForEntryPoint(uint32_t entry_point, + SpvExecutionMode execution_mode) { + entry_point_to_execution_modes_[entry_point].insert(execution_mode); + } + /// Returns the interfaces of a given entry point. If the given id is not a /// valid Entry Point id, std::out_of_range exception is thrown. const std::vector& entry_point_interfaces( @@ -176,6 +185,29 @@ return entry_point_interfaces_.at(entry_point); } + /// Returns Execution Models for the given Entry Point. + /// Returns nullptr if none found (would trigger assertion). + const std::set* GetExecutionModels( + uint32_t entry_point) const { + const auto it = entry_point_to_execution_models_.find(entry_point); + if (it == entry_point_to_execution_models_.end()) { + assert(0); + return nullptr; + } + return &it->second; + } + + /// Returns Execution Modes for the given Entry Point. + /// Returns nullptr if none found. + const std::set* GetExecutionModes( + uint32_t entry_point) const { + const auto it = entry_point_to_execution_modes_.find(entry_point); + if (it == entry_point_to_execution_modes_.end()) { + return nullptr; + } + return &it->second; + } + /// Inserts an to the set of functions that are target of OpFunctionCall. void AddFunctionCallTarget(const uint32_t id) { function_call_targets_.insert(id); @@ -268,9 +300,16 @@ return id_decorations_[id]; } const std::vector& id_decorations(uint32_t id) const { + // TODO: This would throw or generate SIGABRT if id has no + // decorations. Remove/refactor this function. return id_decorations_.at(id); } + // Returns const pointer to the internal decoration container. + const std::map>& id_decorations() const { + return id_decorations_; + } + /// Finds id's def, if it exists. If found, returns the definition otherwise /// nullptr const Instruction* FindDef(uint32_t id) const; @@ -413,6 +452,10 @@ bool GetPointerTypeInfo(uint32_t id, uint32_t* data_type, uint32_t* storage_class) const; + // Tries to evaluate a 32-bit signed or unsigned scalar integer constant. + // Returns tuple . + std::tuple EvalInt32IfConst(uint32_t id); + private: ValidationState_t(const ValidationState_t&); @@ -484,7 +527,7 @@ std::unordered_map struct_nesting_depth_; /// Stores the list of decorations for a given - std::unordered_map> id_decorations_; + std::map> id_decorations_; /// Stores type declarations which need to be unique (i.e. non-aggregates), /// in the form [opcode, operand words], result_id is not stored. @@ -506,6 +549,16 @@ /// Maps function ids to function stat objects. std::unordered_map id_to_function_; + + /// Mapping entry point -> execution models. It is presumed that the same + /// function could theoretically be used as 'main' by multiple OpEntryPoint + /// instructions. + std::unordered_map> + entry_point_to_execution_models_; + + /// Mapping entry point -> execution modes. + std::unordered_map> + entry_point_to_execution_modes_; }; } // namespace libspirv diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_atomics.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_atomics.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_atomics.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_atomics.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -18,38 +18,71 @@ #include "diagnostic.h" #include "opcode.h" +#include "spirv_target_env.h" #include "util/bitutils.h" #include "val/instruction.h" #include "val/validation_state.h" namespace libspirv { +// Validates Memory Scope operand. +spv_result_t ValidateMemoryScope(ValidationState_t& _, + const spv_parsed_instruction_t* inst, + uint32_t id) { + const SpvOp opcode = static_cast(inst->opcode); + bool is_int32 = false, is_const_int32 = false; + uint32_t value = 0; + std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(id); + + if (!is_int32) { + return _.diag(SPV_ERROR_INVALID_DATA) + << spvOpcodeString(opcode) << ": expected Scope to be 32-bit int"; + } + + if (!is_const_int32) { + return SPV_SUCCESS; + } + +#if 0 + // TODO(atgoo@github.com): this check fails Vulkan CTS, reenable once fixed. + if (spvIsVulkanEnv(_.context()->target_env)) { + if (value != SpvScopeDevice && value != SpvScopeWorkgroup && + value != SpvScopeInvocation) { + return _.diag(SPV_ERROR_INVALID_DATA) + << spvOpcodeString(opcode) + << ": in Vulkan environment memory scope is limited to Device, " + "Workgroup and Invocation"; + } + } +#endif + + // TODO(atgoo@github.com) Add checks for OpenCL and OpenGL environments. + + return SPV_SUCCESS; +} + // Validates a Memory Semantics operand. spv_result_t ValidateMemorySemantics(ValidationState_t& _, const spv_parsed_instruction_t* inst, uint32_t operand_index) { const SpvOp opcode = static_cast(inst->opcode); - const uint32_t memory_semantics = + bool is_int32 = false, is_const_int32 = false; + uint32_t flags = 0; + const uint32_t memory_semantics_id = inst->words[inst->operands[operand_index].offset]; - const Instruction* const memory_semantics_inst = _.FindDef(memory_semantics); - assert(memory_semantics_inst); - const uint32_t memory_semantics_type = memory_semantics_inst->type_id(); + std::tie(is_int32, is_const_int32, flags) = + _.EvalInt32IfConst(memory_semantics_id); - if (!_.IsIntScalarType(memory_semantics_type) || - _.GetBitWidth(memory_semantics_type) != 32) { + if (!is_int32) { return _.diag(SPV_ERROR_INVALID_DATA) << spvOpcodeString(opcode) << ": expected Memory Semantics to be 32-bit int"; } - if (memory_semantics_inst->opcode() != SpvOpConstant && - memory_semantics_inst->opcode() != SpvOpSpecConstant) { + if (!is_const_int32) { return SPV_SUCCESS; } - assert(memory_semantics_inst->words().size() == 4); - const uint32_t flags = memory_semantics_inst->word(3); - if (spvutils::CountSetBits( flags & (SpvMemorySemanticsAcquireMask | SpvMemorySemanticsReleaseMask | @@ -94,6 +127,28 @@ "for operand Unequal"; } + if (spvIsVulkanEnv(_.context()->target_env)) { + if (opcode == SpvOpAtomicLoad && + (flags & SpvMemorySemanticsReleaseMask || + flags & SpvMemorySemanticsAcquireReleaseMask || + flags & SpvMemorySemanticsSequentiallyConsistentMask)) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec disallows OpAtomicLoad with Memory Semantics " + "Release, AcquireRelease and SequentiallyConsistent"; + } + + if (opcode == SpvOpAtomicStore && + (flags & SpvMemorySemanticsAcquireMask || + flags & SpvMemorySemanticsAcquireReleaseMask || + flags & SpvMemorySemanticsSequentiallyConsistentMask)) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec disallows OpAtomicStore with Memory Semantics " + "Acquire, AcquireRelease and SequentiallyConsistent"; + } + } + + // TODO(atgoo@github.com) Add checks for OpenCL and OpenGL environments. + return SPV_SUCCESS; } @@ -145,6 +200,13 @@ << spvOpcodeString(opcode) << ": expected Result Type to be int scalar type"; } + if (spvIsVulkanEnv(_.context()->target_env) && + _.GetBitWidth(result_type) != 32) { + return _.diag(SPV_ERROR_INVALID_DATA) + << spvOpcodeString(opcode) + << ": according to the Vulkan spec atomic Result Type needs " + "to be a 32-bit int scalar type"; + } } uint32_t operand_index = @@ -199,11 +261,10 @@ } } - const uint32_t scope_type = _.GetOperandTypeId(inst, operand_index++); - if (!_.IsIntScalarType(scope_type) || _.GetBitWidth(scope_type) != 32) { - return _.diag(SPV_ERROR_INVALID_DATA) - << spvOpcodeString(opcode) - << ": expected Scope to be 32-bit int"; + const uint32_t memory_scope = + inst->words[inst->operands[operand_index++].offset]; + if (auto error = ValidateMemoryScope(_, inst, memory_scope)) { + return error; } if (auto error = ValidateMemorySemantics(_, inst, operand_index++)) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_barriers.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_barriers.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_barriers.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_barriers.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -16,10 +16,9 @@ #include "validate.h" -#include - #include "diagnostic.h" #include "opcode.h" +#include "spirv_constant.h" #include "spirv_target_env.h" #include "util/bitutils.h" #include "val/instruction.h" @@ -29,26 +28,6 @@ namespace { -// Tries to evaluate a 32-bit signed or unsigned scalar integer constant. -// Returns tuple . -std::tuple EvalInt32IfConst(ValidationState_t& _, - uint32_t id) { - const Instruction* const inst = _.FindDef(id); - assert(inst); - const uint32_t type = inst->type_id(); - - if (!_.IsIntScalarType(type) || _.GetBitWidth(type) != 32) { - return std::make_tuple(false, false, 0); - } - - if (inst->opcode() != SpvOpConstant && inst->opcode() != SpvOpSpecConstant) { - return std::make_tuple(true, false, 0); - } - - assert(inst->words().size() == 4); - return std::make_tuple(true, true, inst->word(3)); -} - // Validates Execution Scope operand. spv_result_t ValidateExecutionScope(ValidationState_t& _, const spv_parsed_instruction_t* inst, @@ -56,7 +35,7 @@ const SpvOp opcode = static_cast(inst->opcode); bool is_int32 = false, is_const_int32 = false; uint32_t value = 0; - std::tie(is_int32, is_const_int32, value) = EvalInt32IfConst(_, id); + std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(id); if (!is_int32) { return _.diag(SPV_ERROR_INVALID_DATA) @@ -89,7 +68,7 @@ const SpvOp opcode = static_cast(inst->opcode); bool is_int32 = false, is_const_int32 = false; uint32_t value = 0; - std::tie(is_int32, is_const_int32, value) = EvalInt32IfConst(_, id); + std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(id); if (!is_int32) { return _.diag(SPV_ERROR_INVALID_DATA) @@ -123,7 +102,7 @@ const SpvOp opcode = static_cast(inst->opcode); bool is_int32 = false, is_const_int32 = false; uint32_t value = 0; - std::tie(is_int32, is_const_int32, value) = EvalInt32IfConst(_, id); + std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(id); if (!is_int32) { return _.diag(SPV_ERROR_INVALID_DATA) @@ -194,20 +173,24 @@ switch (opcode) { case SpvOpControlBarrier: { - _.current_function().RegisterExecutionModelLimitation( - [](SpvExecutionModel model, std::string* message) { - if (model != SpvExecutionModelTessellationControl && - model != SpvExecutionModelGLCompute && - model != SpvExecutionModelKernel) { - if (message) { - *message = - "OpControlBarrier requires one of the following Execution " - "Models: TessellationControl, GLCompute or Kernel"; + if (spvVersionForTargetEnv(_.context()->target_env) < + SPV_SPIRV_VERSION_WORD(1, 3)) { + _.current_function().RegisterExecutionModelLimitation( + [](SpvExecutionModel model, std::string* message) { + if (model != SpvExecutionModelTessellationControl && + model != SpvExecutionModelGLCompute && + model != SpvExecutionModelKernel) { + if (message) { + *message = + "OpControlBarrier requires one of the following " + "Execution " + "Models: TessellationControl, GLCompute or Kernel"; + } + return false; } - return false; - } - return true; - }); + return true; + }); + } const uint32_t execution_scope = inst->words[1]; const uint32_t memory_scope = inst->words[2]; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_builtins.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_builtins.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_builtins.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_builtins.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,2386 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +// Validates correctness of built-in variables. + +#include "validate.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "diagnostic.h" +#include "opcode.h" +#include "spirv_target_env.h" +#include "util/bitutils.h" +#include "val/instruction.h" +#include "val/validation_state.h" + +namespace libspirv { + +namespace { + +// Returns a short textual description of the id defined by the given +// instruction. +std::string GetIdDesc(const Instruction& inst) { + std::ostringstream ss; + ss << "ID <" << inst.id() << "> (Op" << spvOpcodeString(inst.opcode()) << ")"; + return ss.str(); +} + +// Gets underlying data type which is +// - member type if instruction is OpTypeStruct +// (member index is taken from decoration). +// - data type if id creates a pointer. +// - type of the constant if instruction is OpConst or OpSpecConst. +// +// Fails in any other case. The function is based on built-ins allowed by +// the Vulkan spec. +// TODO: If non-Vulkan validation rules are added then it might need +// to be refactored. +spv_result_t GetUnderlyingType(const ValidationState_t& _, + const Decoration& decoration, + const Instruction& inst, + uint32_t* underlying_type) { + if (decoration.struct_member_index() != Decoration::kInvalidMember) { + assert(inst.opcode() == SpvOpTypeStruct); + *underlying_type = inst.word(decoration.struct_member_index() + 2); + return SPV_SUCCESS; + } + + assert(inst.opcode() != SpvOpTypeStruct); + + if (spvOpcodeIsConstant(inst.opcode())) { + *underlying_type = inst.type_id(); + return SPV_SUCCESS; + } + + uint32_t storage_class = 0; + if (!_.GetPointerTypeInfo(inst.type_id(), underlying_type, &storage_class)) { + return _.diag(SPV_ERROR_INVALID_DATA) + << GetIdDesc(inst) + << " is decorated with BuiltIn. BuiltIn decoration should only be " + "applied to struct types, variables and constants."; + } + return SPV_SUCCESS; +} + +// Returns Storage Class used by the instruction if applicable. +// Returns SpvStorageClassMax if not. +SpvStorageClass GetStorageClass(const Instruction& inst) { + switch (inst.opcode()) { + case SpvOpTypePointer: + case SpvOpTypeForwardPointer: { + return SpvStorageClass(inst.word(2)); + } + case SpvOpVariable: { + return SpvStorageClass(inst.word(3)); + } + case SpvOpGenericCastToPtrExplicit: { + return SpvStorageClass(inst.word(4)); + } + default: { break; } + } + return SpvStorageClassMax; +} + +// Helper class managing validation of built-ins. +// TODO: Generic functionality of this class can be moved into +// ValidationState_t to be made available to other users. +class BuiltInsValidator { + public: + BuiltInsValidator(const ValidationState_t& vstate) : _(vstate) {} + + // Run validation. + spv_result_t Run(); + + private: + // Goes through all decorations in the module, if decoration is BuiltIn + // calls ValidateSingleBuiltInAtDefinition(). + spv_result_t ValidateBuiltInsAtDefinition(); + + // Validates the instruction defining an id with built-in decoration. + // Can be called multiple times for the same id, if multiple built-ins are + // specified. Seeds id_to_at_reference_checks_ with decorated ids if needed. + spv_result_t ValidateSingleBuiltInAtDefinition(const Decoration& decoration, + const Instruction& inst); + + // The following section contains functions which are called when id defined + // by |inst| is decorated with BuiltIn |decoration|. + // Most functions are specific to a single built-in and have naming scheme: + // ValidateXYZAtDefinition. Some functions are common to multiple kinds of + // BuiltIn. + spv_result_t ValidateClipOrCullDistanceAtDefinition( + const Decoration& decoration, const Instruction& inst); + spv_result_t ValidateFragCoordAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateFragDepthAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateFrontFacingAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateHelperInvocationAtDefinition( + const Decoration& decoration, const Instruction& inst); + spv_result_t ValidateInvocationIdAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateInstanceIndexAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateLayerOrViewportIndexAtDefinition( + const Decoration& decoration, const Instruction& inst); + spv_result_t ValidatePatchVerticesAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidatePointCoordAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidatePointSizeAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidatePositionAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidatePrimitiveIdAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateSampleIdAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateSampleMaskAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateSamplePositionAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateTessCoordAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateTessLevelOuterAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateTessLevelInnerAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateVertexIndexAtDefinition(const Decoration& decoration, + const Instruction& inst); + spv_result_t ValidateWorkgroupSizeAtDefinition(const Decoration& decoration, + const Instruction& inst); + // Used for GlobalInvocationId, LocalInvocationId, NumWorkgroups, WorkgroupId. + spv_result_t ValidateComputeShaderI32Vec3InputAtDefinition( + const Decoration& decoration, const Instruction& inst); + + // The following section contains functions which are called when id defined + // by |referenced_inst| is + // 1. referenced by |referenced_from_inst| + // 2. dependent on |built_in_inst| which is decorated with BuiltIn + // |decoration|. Most functions are specific to a single built-in and have + // naming scheme: ValidateXYZAtReference. Some functions are common to + // multiple kinds of BuiltIn. + spv_result_t ValidateFragCoordAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateFragDepthAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateFrontFacingAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateHelperInvocationAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateInvocationIdAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateInstanceIndexAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidatePatchVerticesAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidatePointCoordAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidatePointSizeAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidatePositionAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidatePrimitiveIdAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateSampleIdAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateSampleMaskAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateSamplePositionAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateTessCoordAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateTessLevelAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateVertexIndexAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateLayerOrViewportIndexAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateWorkgroupSizeAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + spv_result_t ValidateClipOrCullDistanceAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + // Used for GlobalInvocationId, LocalInvocationId, NumWorkgroups, WorkgroupId. + spv_result_t ValidateComputeShaderI32Vec3InputAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + // Validates that |built_in_inst| is not (even indirectly) referenced from + // within a function which can be called with |execution_model|. + // + // |comment| - text explaining why the restriction was imposed. + // |decoration| - BuiltIn decoration which causes the restriction. + // |referenced_inst| - instruction which is dependent on |built_in_inst| and + // defines the id which was referenced. + // |referenced_from_inst| - instruction which references id defined by + // |referenced_inst| from within a function. + spv_result_t ValidateNotCalledWithExecutionModel( + const char* comment, SpvExecutionModel execution_model, + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + + // The following section contains functions which check that the decorated + // variable has the type specified in the function name. |diag| would be + // called with a corresponding error message, if validation is not successful. + spv_result_t ValidateBool( + const Decoration& decoration, const Instruction& inst, + const std::function& diag); + spv_result_t ValidateI32( + const Decoration& decoration, const Instruction& inst, + const std::function& diag); + spv_result_t ValidateI32Vec( + const Decoration& decoration, const Instruction& inst, + uint32_t num_components, + const std::function& diag); + spv_result_t ValidateI32Arr( + const Decoration& decoration, const Instruction& inst, + const std::function& diag); + spv_result_t ValidateF32( + const Decoration& decoration, const Instruction& inst, + const std::function& diag); + spv_result_t ValidateF32Vec( + const Decoration& decoration, const Instruction& inst, + uint32_t num_components, + const std::function& diag); + // If |num_components| is zero, the number of components is not checked. + spv_result_t ValidateF32Arr( + const Decoration& decoration, const Instruction& inst, + uint32_t num_components, + const std::function& diag); + + // Generates strings like "Member #0 of struct ID <2>". + std::string GetDefinitionDesc(const Decoration& decoration, + const Instruction& inst) const; + + // Generates strings like "ID <51> (OpTypePointer) is referencing ID <2> + // (OpTypeStruct) which is decorated with BuiltIn Position". + std::string GetReferenceDesc( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst, + SpvExecutionModel execution_model = SpvExecutionModelMax) const; + + // Generates strings like "ID <51> (OpTypePointer) uses storage class + // UniformConstant". + std::string GetStorageClassDesc(const Instruction& inst) const; + + // Updates inner working of the class. Is called sequentially for every + // instruction. + void Update(const Instruction& inst); + + // Traverses call tree and computes function_to_entry_points_. + void ComputeFunctionToEntryPointMapping(); + + const ValidationState_t& _; + + // Mapping id -> list of rules which validate instruction referencing the + // id. Rules can create new rules and add them to this container. + // Using std::map, and not std::unordered_map to avoid iterator invalidation + // during rehashing. + std::map>> + id_to_at_reference_checks_; + + // Id of the function we are currently inside. 0 if not inside a function. + uint32_t function_id_ = 0; + + // Entry points which can (indirectly) call the current function. + // The pointer either points to a vector inside to function_to_entry_points_ + // or to no_entry_points_. The pointer is guaranteed to never be null. + const std::vector no_entry_points; + const std::vector* entry_points_ = &no_entry_points; + + // Mapping function -> array of entry points inside this + // module which can (indirectly) call the function. + std::unordered_map> function_to_entry_points_; + + // Execution models with which the current function can be called. + std::set execution_models_; +}; + +void BuiltInsValidator::Update(const Instruction& inst) { + const SpvOp opcode = inst.opcode(); + if (opcode == SpvOpFunction) { + // Entering a function. + assert(function_id_ == 0); + function_id_ = inst.id(); + execution_models_.clear(); + const auto it = function_to_entry_points_.find(function_id_); + if (it == function_to_entry_points_.end()) { + entry_points_ = &no_entry_points; + } else { + entry_points_ = &it->second; + // Collect execution models from all entry points from which the current + // function can be called. + for (const uint32_t entry_point : *entry_points_) { + if (const auto* models = _.GetExecutionModels(entry_point)) { + execution_models_.insert(models->begin(), models->end()); + } + } + } + } + + if (opcode == SpvOpFunctionEnd) { + // Exiting a function. + assert(function_id_ != 0); + function_id_ = 0; + entry_points_ = &no_entry_points; + execution_models_.clear(); + } +} + +void BuiltInsValidator::ComputeFunctionToEntryPointMapping() { + // TODO: Move this into validation_state.cpp. + for (const uint32_t entry_point : _.entry_points()) { + std::stack call_stack; + std::set visited; + call_stack.push(entry_point); + while (!call_stack.empty()) { + const uint32_t called_func_id = call_stack.top(); + call_stack.pop(); + if (!visited.insert(called_func_id).second) continue; + + function_to_entry_points_[called_func_id].push_back(entry_point); + + const Function* called_func = _.function(called_func_id); + assert(called_func); + for (const uint32_t new_call : called_func->function_call_targets()) { + call_stack.push(new_call); + } + } + } +} + +std::string BuiltInsValidator::GetDefinitionDesc( + const Decoration& decoration, const Instruction& inst) const { + std::ostringstream ss; + if (decoration.struct_member_index() != Decoration::kInvalidMember) { + assert(inst.opcode() == SpvOpTypeStruct); + ss << "Member #" << decoration.struct_member_index(); + ss << " of struct ID <" << inst.id() << ">"; + } else { + ss << GetIdDesc(inst); + } + return ss.str(); +} + +std::string BuiltInsValidator::GetReferenceDesc( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, const Instruction& referenced_from_inst, + SpvExecutionModel execution_model) const { + std::ostringstream ss; + ss << GetIdDesc(referenced_from_inst) << " is referencing " + << GetIdDesc(referenced_inst); + if (built_in_inst.id() != referenced_inst.id()) { + ss << " which is dependent on " << GetIdDesc(built_in_inst); + } + + ss << " which is decorated with BuiltIn "; + ss << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]); + if (function_id_) { + ss << " in function <" << function_id_ << ">"; + if (execution_model != SpvExecutionModelMax) { + ss << " called with execution model "; + ss << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_EXECUTION_MODEL, + execution_model); + } + } + ss << "."; + return ss.str(); +} + +std::string BuiltInsValidator::GetStorageClassDesc( + const Instruction& inst) const { + std::ostringstream ss; + ss << GetIdDesc(inst) << " uses storage class "; + ss << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_STORAGE_CLASS, + GetStorageClass(inst)); + ss << "."; + return ss.str(); +} + +spv_result_t BuiltInsValidator::ValidateBool( + const Decoration& decoration, const Instruction& inst, + const std::function& diag) { + uint32_t underlying_type = 0; + if (spv_result_t error = + GetUnderlyingType(_, decoration, inst, &underlying_type)) { + return error; + } + + if (!_.IsBoolScalarType(underlying_type)) { + return diag(GetDefinitionDesc(decoration, inst) + " is not a bool scalar."); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateI32( + const Decoration& decoration, const Instruction& inst, + const std::function& diag) { + uint32_t underlying_type = 0; + if (spv_result_t error = + GetUnderlyingType(_, decoration, inst, &underlying_type)) { + return error; + } + + if (!_.IsIntScalarType(underlying_type)) { + return diag(GetDefinitionDesc(decoration, inst) + " is not an int scalar."); + } + + const uint32_t bit_width = _.GetBitWidth(underlying_type); + if (bit_width != 32) { + std::ostringstream ss; + ss << GetDefinitionDesc(decoration, inst) << " has bit width " << bit_width + << "."; + return diag(ss.str()); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateF32( + const Decoration& decoration, const Instruction& inst, + const std::function& diag) { + uint32_t underlying_type = 0; + if (spv_result_t error = + GetUnderlyingType(_, decoration, inst, &underlying_type)) { + return error; + } + + if (!_.IsFloatScalarType(underlying_type)) { + return diag(GetDefinitionDesc(decoration, inst) + + " is not a float scalar."); + } + + const uint32_t bit_width = _.GetBitWidth(underlying_type); + if (bit_width != 32) { + std::ostringstream ss; + ss << GetDefinitionDesc(decoration, inst) << " has bit width " << bit_width + << "."; + return diag(ss.str()); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateI32Vec( + const Decoration& decoration, const Instruction& inst, + uint32_t num_components, + const std::function& diag) { + uint32_t underlying_type = 0; + if (spv_result_t error = + GetUnderlyingType(_, decoration, inst, &underlying_type)) { + return error; + } + + if (!_.IsIntVectorType(underlying_type)) { + return diag(GetDefinitionDesc(decoration, inst) + " is not an int vector."); + } + + const uint32_t actual_num_components = _.GetDimension(underlying_type); + if (_.GetDimension(underlying_type) != num_components) { + std::ostringstream ss; + ss << GetDefinitionDesc(decoration, inst) << " has " + << actual_num_components << " components."; + return diag(ss.str()); + } + + const uint32_t bit_width = _.GetBitWidth(underlying_type); + if (bit_width != 32) { + std::ostringstream ss; + ss << GetDefinitionDesc(decoration, inst) + << " has components with bit width " << bit_width << "."; + return diag(ss.str()); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateF32Vec( + const Decoration& decoration, const Instruction& inst, + uint32_t num_components, + const std::function& diag) { + uint32_t underlying_type = 0; + if (spv_result_t error = + GetUnderlyingType(_, decoration, inst, &underlying_type)) { + return error; + } + + if (!_.IsFloatVectorType(underlying_type)) { + return diag(GetDefinitionDesc(decoration, inst) + + " is not a float vector."); + } + + const uint32_t actual_num_components = _.GetDimension(underlying_type); + if (_.GetDimension(underlying_type) != num_components) { + std::ostringstream ss; + ss << GetDefinitionDesc(decoration, inst) << " has " + << actual_num_components << " components."; + return diag(ss.str()); + } + + const uint32_t bit_width = _.GetBitWidth(underlying_type); + if (bit_width != 32) { + std::ostringstream ss; + ss << GetDefinitionDesc(decoration, inst) + << " has components with bit width " << bit_width << "."; + return diag(ss.str()); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateI32Arr( + const Decoration& decoration, const Instruction& inst, + const std::function& diag) { + uint32_t underlying_type = 0; + if (spv_result_t error = + GetUnderlyingType(_, decoration, inst, &underlying_type)) { + return error; + } + + const Instruction* const type_inst = _.FindDef(underlying_type); + if (type_inst->opcode() != SpvOpTypeArray) { + return diag(GetDefinitionDesc(decoration, inst) + " is not an array."); + } + + const uint32_t component_type = type_inst->word(2); + if (!_.IsIntScalarType(component_type)) { + return diag(GetDefinitionDesc(decoration, inst) + + " components are not int scalar."); + } + + const uint32_t bit_width = _.GetBitWidth(component_type); + if (bit_width != 32) { + std::ostringstream ss; + ss << GetDefinitionDesc(decoration, inst) + << " has components with bit width " << bit_width << "."; + return diag(ss.str()); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateF32Arr( + const Decoration& decoration, const Instruction& inst, + uint32_t num_components, + const std::function& diag) { + uint32_t underlying_type = 0; + if (spv_result_t error = + GetUnderlyingType(_, decoration, inst, &underlying_type)) { + return error; + } + + const Instruction* const type_inst = _.FindDef(underlying_type); + if (type_inst->opcode() != SpvOpTypeArray) { + return diag(GetDefinitionDesc(decoration, inst) + " is not an array."); + } + + const uint32_t component_type = type_inst->word(2); + if (!_.IsFloatScalarType(component_type)) { + return diag(GetDefinitionDesc(decoration, inst) + + " components are not float scalar."); + } + + const uint32_t bit_width = _.GetBitWidth(component_type); + if (bit_width != 32) { + std::ostringstream ss; + ss << GetDefinitionDesc(decoration, inst) + << " has components with bit width " << bit_width << "."; + return diag(ss.str()); + } + + if (num_components != 0) { + uint64_t actual_num_components = 0; + if (!_.GetConstantValUint64(type_inst->word(3), &actual_num_components)) { + assert(0 && "Array type definition is corrupt"); + } + if (actual_num_components != num_components) { + std::ostringstream ss; + ss << GetDefinitionDesc(decoration, inst) << " has " + << actual_num_components << " components."; + return diag(ss.str()); + } + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateNotCalledWithExecutionModel( + const char* comment, SpvExecutionModel execution_model, + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (function_id_) { + if (execution_models_.count(execution_model)) { + const char* execution_model_str = _.grammar().lookupOperandName( + SPV_OPERAND_TYPE_EXECUTION_MODEL, execution_model); + const char* built_in_str = _.grammar().lookupOperandName( + SPV_OPERAND_TYPE_BUILT_IN, decoration.params()[0]); + return _.diag(SPV_ERROR_INVALID_DATA) + << comment << " " << GetIdDesc(referenced_inst) << " depends on " + << GetIdDesc(built_in_inst) << " which is decorated with BuiltIn " + << built_in_str << "." + << " Id <" << referenced_inst.id() << "> is later referenced by " + << GetIdDesc(referenced_from_inst) << " in function <" + << function_id_ << "> which is called with execution model " + << execution_model_str << "."; + } + } else { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back( + std::bind(&BuiltInsValidator::ValidateNotCalledWithExecutionModel, this, + comment, execution_model, decoration, built_in_inst, + referenced_from_inst, std::placeholders::_1)); + } + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateClipOrCullDistanceAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateF32Arr( + decoration, inst, /* Any number of components */ 0, + [this, &decoration](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << " variable needs to be a 32-bit float array. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateClipOrCullDistanceAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateClipOrCullDistanceAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput && + storage_class != SpvStorageClassOutput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << " to be only used for variables with Input or Output storage " + "class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + if (storage_class == SpvStorageClassInput) { + assert(function_id_ == 0); + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateNotCalledWithExecutionModel, this, + "Vulkan spec doesn't allow BuiltIn ClipDistance/CullDistance to be " + "used for variables with Input storage class if execution model is " + "Vertex.", + SpvExecutionModelVertex, decoration, built_in_inst, + referenced_from_inst, std::placeholders::_1)); + } + + if (storage_class == SpvStorageClassOutput) { + assert(function_id_ == 0); + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateNotCalledWithExecutionModel, this, + "Vulkan spec doesn't allow BuiltIn ClipDistance/CullDistance to be " + "used for variables with Output storage class if execution model is " + "Fragment.", + SpvExecutionModelFragment, decoration, built_in_inst, + referenced_from_inst, std::placeholders::_1)); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + switch (execution_model) { + case SpvExecutionModelFragment: + case SpvExecutionModelVertex: + case SpvExecutionModelTessellationControl: + case SpvExecutionModelTessellationEvaluation: + case SpvExecutionModelGeometry: { + // Ok. + break; + } + + default: { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << " to be used only with Fragment, Vertex, " + "TessellationControl, TessellationEvaluation or Geometry " + "execution models. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back( + std::bind(&BuiltInsValidator::ValidateClipOrCullDistanceAtReference, + this, decoration, built_in_inst, referenced_from_inst, + std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateFragCoordAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateF32Vec( + decoration, inst, 4, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn FragCoord " + "variable needs to be a 4-component 32-bit float " + "vector. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateFragCoordAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateFragCoordAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn FragCoord to be only used for " + "variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelFragment) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn FragCoord to be used only with " + "Fragment execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateFragCoordAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateFragDepthAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateF32( + decoration, inst, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn FragDepth " + "variable needs to be a 32-bit float scalar. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateFragDepthAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateFragDepthAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassOutput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn FragDepth to be only used for " + "variables with Output storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelFragment) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn FragDepth to be used only with " + "Fragment execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + + for (const uint32_t entry_point : *entry_points_) { + // Every entry point from which this function is called needs to have + // Execution Mode DepthReplacing. + const auto* modes = _.GetExecutionModes(entry_point); + if (!modes || !modes->count(SpvExecutionModeDepthReplacing)) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec requires DepthReplacing execution mode to be " + "declared when using BuiltIn FragDepth. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateFragDepthAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateFrontFacingAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateBool( + decoration, inst, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn FrontFacing " + "variable needs to be a bool scalar. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateFrontFacingAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateFrontFacingAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn FrontFacing to be only used for " + "variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelFragment) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn FrontFacing to be used only with " + "Fragment execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateFrontFacingAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateHelperInvocationAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateBool( + decoration, inst, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn HelperInvocation " + "variable needs to be a bool scalar. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateHelperInvocationAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateHelperInvocationAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn HelperInvocation to be only used " + "for variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelFragment) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn HelperInvocation to be used only " + "with Fragment execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back( + std::bind(&BuiltInsValidator::ValidateHelperInvocationAtReference, this, + decoration, built_in_inst, referenced_from_inst, + std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateInvocationIdAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateI32( + decoration, inst, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn InvocationId " + "variable needs to be a 32-bit int scalar. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateInvocationIdAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateInvocationIdAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn InvocationId to be only used for " + "variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelTessellationControl && + execution_model != SpvExecutionModelGeometry) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn InvocationId to be used only " + "with TessellationControl or Geometry execution models. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateInvocationIdAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateInstanceIndexAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateI32( + decoration, inst, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn InstanceIndex " + "variable needs to be a 32-bit int scalar. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateInstanceIndexAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateInstanceIndexAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn InstanceIndex to be only used for " + "variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelVertex) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn InstanceIndex to be used only " + "with Vertex execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateInstanceIndexAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidatePatchVerticesAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateI32( + decoration, inst, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn PatchVertices " + "variable needs to be a 32-bit int scalar. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidatePatchVerticesAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidatePatchVerticesAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn PatchVertices to be only used for " + "variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelTessellationControl && + execution_model != SpvExecutionModelTessellationEvaluation) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn PatchVertices to be used only " + "with TessellationControl or TessellationEvaluation " + "execution models. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidatePatchVerticesAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidatePointCoordAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateF32Vec( + decoration, inst, 2, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn PointCoord " + "variable needs to be a 2-component 32-bit float " + "vector. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidatePointCoordAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidatePointCoordAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn PointCoord to be only used for " + "variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelFragment) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn PointCoord to be used only with " + "Fragment execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidatePointCoordAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidatePointSizeAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateF32( + decoration, inst, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn PointSize " + "variable needs to be a 32-bit float scalar. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidatePointSizeAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidatePointSizeAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput && + storage_class != SpvStorageClassOutput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn PointSize to be only used for " + "variables with Input or Output storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + if (storage_class == SpvStorageClassInput) { + assert(function_id_ == 0); + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateNotCalledWithExecutionModel, this, + "Vulkan spec doesn't allow BuiltIn PointSize to be used for " + "variables with Input storage class if execution model is Vertex.", + SpvExecutionModelVertex, decoration, built_in_inst, + referenced_from_inst, std::placeholders::_1)); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + switch (execution_model) { + case SpvExecutionModelVertex: + case SpvExecutionModelTessellationControl: + case SpvExecutionModelTessellationEvaluation: + case SpvExecutionModelGeometry: { + // Ok. + break; + } + + default: { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn PointSize to be used only with " + "Vertex, TessellationControl, TessellationEvaluation or " + "Geometry execution models. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidatePointSizeAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidatePositionAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateF32Vec( + decoration, inst, 4, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn Position " + "variable needs to be a 4-component 32-bit float " + "vector. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidatePositionAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidatePositionAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput && + storage_class != SpvStorageClassOutput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn Position to be only used for " + "variables with Input or Output storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + if (storage_class == SpvStorageClassInput) { + assert(function_id_ == 0); + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateNotCalledWithExecutionModel, this, + "Vulkan spec doesn't allow BuiltIn Position to be used for variables " + "with Input storage class if execution model is Vertex.", + SpvExecutionModelVertex, decoration, built_in_inst, + referenced_from_inst, std::placeholders::_1)); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + switch (execution_model) { + case SpvExecutionModelVertex: + case SpvExecutionModelTessellationControl: + case SpvExecutionModelTessellationEvaluation: + case SpvExecutionModelGeometry: { + // Ok. + break; + } + + default: { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn Position to be used only with " + "Vertex, TessellationControl, TessellationEvaluation or " + "Geometry execution models. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidatePositionAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidatePrimitiveIdAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateI32( + decoration, inst, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn PrimitiveId " + "variable needs to be a 32-bit int scalar. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidatePrimitiveIdAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidatePrimitiveIdAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput && + storage_class != SpvStorageClassOutput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn PrimitiveId to be only used for " + "variables with Input or Output storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + if (storage_class == SpvStorageClassOutput) { + assert(function_id_ == 0); + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateNotCalledWithExecutionModel, this, + "Vulkan spec doesn't allow BuiltIn PrimitiveId to be used for " + "variables with Output storage class if execution model is " + "TessellationControl.", + SpvExecutionModelTessellationControl, decoration, built_in_inst, + referenced_from_inst, std::placeholders::_1)); + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateNotCalledWithExecutionModel, this, + "Vulkan spec doesn't allow BuiltIn PrimitiveId to be used for " + "variables with Output storage class if execution model is " + "TessellationEvaluation.", + SpvExecutionModelTessellationEvaluation, decoration, built_in_inst, + referenced_from_inst, std::placeholders::_1)); + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateNotCalledWithExecutionModel, this, + "Vulkan spec doesn't allow BuiltIn PrimitiveId to be used for " + "variables with Output storage class if execution model is Fragment.", + SpvExecutionModelFragment, decoration, built_in_inst, + referenced_from_inst, std::placeholders::_1)); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + switch (execution_model) { + case SpvExecutionModelFragment: + case SpvExecutionModelTessellationControl: + case SpvExecutionModelTessellationEvaluation: + case SpvExecutionModelGeometry: { + // Ok. + break; + } + + default: { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn PrimitiveId to be used only " + "with Fragment, TessellationControl, " + "TessellationEvaluation or Geometry execution models. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidatePrimitiveIdAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateSampleIdAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateI32( + decoration, inst, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn SampleId " + "variable needs to be a 32-bit int scalar. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateSampleIdAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateSampleIdAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn SampleId to be only used for " + "variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelFragment) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn SampleId to be used only with " + "Fragment execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateSampleIdAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateSampleMaskAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateI32Arr( + decoration, inst, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn SampleMask " + "variable needs to be a 32-bit int array. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateSampleMaskAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateSampleMaskAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput && + storage_class != SpvStorageClassOutput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn SampleMask to be only used for " + "variables with Input or Output storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelFragment) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn SampleMask to be used only with " + "Fragment execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateSampleMaskAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateSamplePositionAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateF32Vec( + decoration, inst, 2, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn SamplePosition " + "variable needs to be a 2-component 32-bit float " + "vector. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateSamplePositionAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateSamplePositionAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn SamplePosition to be only used for " + "variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelFragment) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn SamplePosition to be used only " + "with " + "Fragment execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateSamplePositionAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateTessCoordAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateF32Vec( + decoration, inst, 3, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn TessCoord " + "variable needs to be a 3-component 32-bit float " + "vector. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateTessCoordAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateTessCoordAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn TessCoord to be only used for " + "variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelTessellationEvaluation) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn TessCoord to be used only with " + "TessellationEvaluation execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateTessCoordAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateTessLevelOuterAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateF32Arr( + decoration, inst, 4, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn TessLevelOuter " + "variable needs to be a 4-component 32-bit float " + "array. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateTessLevelAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateTessLevelInnerAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateF32Arr( + decoration, inst, 2, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn TessLevelOuter " + "variable needs to be a 2-component 32-bit float " + "array. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateTessLevelAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateTessLevelAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput && + storage_class != SpvStorageClassOutput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << " to be only used for variables with Input or Output storage " + "class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + if (storage_class == SpvStorageClassInput) { + assert(function_id_ == 0); + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateNotCalledWithExecutionModel, this, + "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be used " + "for variables with Input storage class if execution model is " + "TessellationControl.", + SpvExecutionModelTessellationControl, decoration, built_in_inst, + referenced_from_inst, std::placeholders::_1)); + } + + if (storage_class == SpvStorageClassOutput) { + assert(function_id_ == 0); + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateNotCalledWithExecutionModel, this, + "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be used " + "for variables with Output storage class if execution model is " + "TessellationEvaluation.", + SpvExecutionModelTessellationEvaluation, decoration, built_in_inst, + referenced_from_inst, std::placeholders::_1)); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + switch (execution_model) { + case SpvExecutionModelTessellationControl: + case SpvExecutionModelTessellationEvaluation: { + // Ok. + break; + } + + default: { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << " to be used only with TessellationControl or " + "TessellationEvaluation execution models. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateTessLevelAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateVertexIndexAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateI32( + decoration, inst, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn VertexIndex " + "variable needs to be a 32-bit int scalar. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateVertexIndexAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateVertexIndexAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn VertexIndex to be only used for " + "variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelVertex) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn VertexIndex to be used only with " + "Vertex execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateVertexIndexAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateLayerOrViewportIndexAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateI32( + decoration, inst, + [this, &decoration](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << "variable needs to be a 32-bit int scalar. " << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateLayerOrViewportIndexAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateLayerOrViewportIndexAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput && + storage_class != SpvStorageClassOutput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << " to be only used for variables with Input or Output storage " + "class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + if (storage_class == SpvStorageClassInput) { + assert(function_id_ == 0); + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateNotCalledWithExecutionModel, this, + "Vulkan spec doesn't allow BuiltIn Layer and ViewportIndex to be " + "used for variables with Input storage class if execution model is " + "Geometry.", + SpvExecutionModelGeometry, decoration, built_in_inst, + referenced_from_inst, std::placeholders::_1)); + } + + if (storage_class == SpvStorageClassOutput) { + assert(function_id_ == 0); + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateNotCalledWithExecutionModel, this, + "Vulkan spec doesn't allow BuiltIn Layer and ViewportIndex to be " + "used for variables with Output storage class if execution model is " + "Fragment.", + SpvExecutionModelFragment, decoration, built_in_inst, + referenced_from_inst, std::placeholders::_1)); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + switch (execution_model) { + case SpvExecutionModelGeometry: + case SpvExecutionModelFragment: { + // Ok. + break; + } + + default: { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << " to be used only with Fragment or Geometry execution " + "models. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back( + std::bind(&BuiltInsValidator::ValidateLayerOrViewportIndexAtReference, + this, decoration, built_in_inst, referenced_from_inst, + std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateComputeShaderI32Vec3InputAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (spv_result_t error = ValidateI32Vec( + decoration, inst, 3, + [this, &decoration](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << " variable needs to be a 3-component 32-bit int " + "vector. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateComputeShaderI32Vec3InputAtReference(decoration, inst, inst, + inst); +} + +spv_result_t BuiltInsValidator::ValidateComputeShaderI32Vec3InputAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << " to be only used for variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelGLCompute) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << " to be used only with GLCompute execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateComputeShaderI32Vec3InputAtReference, this, + decoration, built_in_inst, referenced_from_inst, + std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateWorkgroupSizeAtDefinition( + const Decoration& decoration, const Instruction& inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + if (!spvOpcodeIsConstant(inst.opcode())) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec requires BuiltIn WorkgroupSize to be a constant. " + << GetIdDesc(inst) << " is not a constant."; + } + + if (spv_result_t error = ValidateI32Vec( + decoration, inst, 3, + [this](const std::string& message) -> spv_result_t { + return _.diag(SPV_ERROR_INVALID_DATA) + << "According to the Vulkan spec BuiltIn WorkgroupSize " + "variable " + "needs to be a 3-component 32-bit int vector. " + << message; + })) { + return error; + } + } + + // Seed at reference checks with this built-in. + return ValidateWorkgroupSizeAtReference(decoration, inst, inst, inst); +} + +spv_result_t BuiltInsValidator::ValidateWorkgroupSizeAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + const SpvStorageClass storage_class = GetStorageClass(referenced_from_inst); + if (storage_class != SpvStorageClassMax && + storage_class != SpvStorageClassInput) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << " to be only used for variables with Input storage class. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst) + << " " << GetStorageClassDesc(referenced_from_inst); + } + + for (const SpvExecutionModel execution_model : execution_models_) { + if (execution_model != SpvExecutionModelGLCompute) { + return _.diag(SPV_ERROR_INVALID_DATA) + << "Vulkan spec allows BuiltIn " + << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, + decoration.params()[0]) + << " to be used only with GLCompute execution model. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst, execution_model); + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateWorkgroupSizeAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateSingleBuiltInAtDefinition( + const Decoration& decoration, const Instruction& inst) { + const SpvBuiltIn label = SpvBuiltIn(decoration.params()[0]); + // If you are adding a new BuiltIn enum, please register it here. + // If the newly added enum has validation rules associated with it + // consider leaving a TODO and/or creating an issue. + switch (label) { + case SpvBuiltInClipDistance: + case SpvBuiltInCullDistance: { + return ValidateClipOrCullDistanceAtDefinition(decoration, inst); + } + case SpvBuiltInFragCoord: { + return ValidateFragCoordAtDefinition(decoration, inst); + } + case SpvBuiltInFragDepth: { + return ValidateFragDepthAtDefinition(decoration, inst); + } + case SpvBuiltInFrontFacing: { + return ValidateFrontFacingAtDefinition(decoration, inst); + } + case SpvBuiltInGlobalInvocationId: + case SpvBuiltInLocalInvocationId: + case SpvBuiltInNumWorkgroups: + case SpvBuiltInWorkgroupId: { + return ValidateComputeShaderI32Vec3InputAtDefinition(decoration, inst); + } + case SpvBuiltInHelperInvocation: { + return ValidateHelperInvocationAtDefinition(decoration, inst); + } + case SpvBuiltInInvocationId: { + return ValidateInvocationIdAtDefinition(decoration, inst); + } + case SpvBuiltInInstanceIndex: { + return ValidateInstanceIndexAtDefinition(decoration, inst); + } + case SpvBuiltInLayer: + case SpvBuiltInViewportIndex: { + return ValidateLayerOrViewportIndexAtDefinition(decoration, inst); + } + case SpvBuiltInPatchVertices: { + return ValidatePatchVerticesAtDefinition(decoration, inst); + } + case SpvBuiltInPointCoord: { + return ValidatePointCoordAtDefinition(decoration, inst); + } + case SpvBuiltInPointSize: { + return ValidatePointSizeAtDefinition(decoration, inst); + } + case SpvBuiltInPosition: { + return ValidatePositionAtDefinition(decoration, inst); + } + case SpvBuiltInPrimitiveId: { + return ValidatePrimitiveIdAtDefinition(decoration, inst); + } + case SpvBuiltInSampleId: { + return ValidateSampleIdAtDefinition(decoration, inst); + } + case SpvBuiltInSampleMask: { + return ValidateSampleMaskAtDefinition(decoration, inst); + } + case SpvBuiltInSamplePosition: { + return ValidateSamplePositionAtDefinition(decoration, inst); + } + case SpvBuiltInTessCoord: { + return ValidateTessCoordAtDefinition(decoration, inst); + } + case SpvBuiltInTessLevelOuter: { + return ValidateTessLevelOuterAtDefinition(decoration, inst); + } + case SpvBuiltInTessLevelInner: { + return ValidateTessLevelInnerAtDefinition(decoration, inst); + } + case SpvBuiltInVertexIndex: { + return ValidateVertexIndexAtDefinition(decoration, inst); + } + case SpvBuiltInWorkgroupSize: { + return ValidateWorkgroupSizeAtDefinition(decoration, inst); + } + case SpvBuiltInVertexId: + case SpvBuiltInInstanceId: + case SpvBuiltInLocalInvocationIndex: + case SpvBuiltInWorkDim: + case SpvBuiltInGlobalSize: + case SpvBuiltInEnqueuedWorkgroupSize: + case SpvBuiltInGlobalOffset: + case SpvBuiltInGlobalLinearId: + case SpvBuiltInSubgroupSize: + case SpvBuiltInSubgroupMaxSize: + case SpvBuiltInNumSubgroups: + case SpvBuiltInNumEnqueuedSubgroups: + case SpvBuiltInSubgroupId: + case SpvBuiltInSubgroupLocalInvocationId: + case SpvBuiltInSubgroupEqMaskKHR: + case SpvBuiltInSubgroupGeMaskKHR: + case SpvBuiltInSubgroupGtMaskKHR: + case SpvBuiltInSubgroupLeMaskKHR: + case SpvBuiltInSubgroupLtMaskKHR: + case SpvBuiltInBaseVertex: + case SpvBuiltInBaseInstance: + case SpvBuiltInDrawIndex: + case SpvBuiltInDeviceIndex: + case SpvBuiltInViewIndex: + case SpvBuiltInBaryCoordNoPerspAMD: + case SpvBuiltInBaryCoordNoPerspCentroidAMD: + case SpvBuiltInBaryCoordNoPerspSampleAMD: + case SpvBuiltInBaryCoordSmoothAMD: + case SpvBuiltInBaryCoordSmoothCentroidAMD: + case SpvBuiltInBaryCoordSmoothSampleAMD: + case SpvBuiltInBaryCoordPullModelAMD: + case SpvBuiltInFragStencilRefEXT: + case SpvBuiltInViewportMaskNV: + case SpvBuiltInSecondaryPositionNV: + case SpvBuiltInSecondaryViewportMaskNV: + case SpvBuiltInPositionPerViewNV: + case SpvBuiltInViewportMaskPerViewNV: + case SpvBuiltInFullyCoveredEXT: + case SpvBuiltInMax: { + // No validation rules (for the moment). + break; + } + } + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateBuiltInsAtDefinition() { + for (const auto& kv : _.id_decorations()) { + const uint32_t id = kv.first; + const auto& decorations = kv.second; + if (decorations.empty()) { + continue; + } + + const Instruction* inst = _.FindDef(id); + assert(inst); + + for (const auto& decoration : kv.second) { + if (decoration.dec_type() != SpvDecorationBuiltIn) { + continue; + } + + if (spv_result_t error = + ValidateSingleBuiltInAtDefinition(decoration, *inst)) { + return error; + } + } + } + + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::Run() { + // First pass: validate all built-ins at definition and seed + // id_to_at_reference_checks_ with built-ins. + if (auto error = ValidateBuiltInsAtDefinition()) { + return error; + } + + if (id_to_at_reference_checks_.empty()) { + // No validation tasks were seeded. Nothing else to do. + return SPV_SUCCESS; + } + + ComputeFunctionToEntryPointMapping(); + + // Second pass: validate every id reference in the module using + // rules in id_to_at_reference_checks_. + for (const Instruction& inst : _.ordered_instructions()) { + Update(inst); + + std::set already_checked; + + for (const auto& operand : inst.operands()) { + if (!spvIsIdType(operand.type)) { + // Not id. + continue; + } + + const uint32_t id = inst.word(operand.offset); + if (id == inst.id()) { + // No need to check result id. + continue; + } + + if (!already_checked.insert(id).second) { + // The instruction has already referenced this id. + continue; + } + + // Instruction references the id. Run all checks associated with the id on + // the instruction. id_to_at_reference_checks_ can be modified in the + // process, iterators are safe because it's a tree-based map. + const auto it = id_to_at_reference_checks_.find(id); + if (it != id_to_at_reference_checks_.end()) { + for (const auto& check : it->second) { + if (spv_result_t error = check(inst)) { + return error; + } + } + } + } + } + + return SPV_SUCCESS; +} + +} // anonymous namespace + +// Validates correctness of built-in variables. +spv_result_t ValidateBuiltIns(const ValidationState_t& _) { + if (!spvIsVulkanEnv(_.context()->target_env)) { + // Early return. All currently implemented rules are based on Vulkan spec. + // + // TODO: If you are adding validation rules for environments other than + // Vulkan (or general rules which are not environment independent), then you + // need to modify or remove this condition. Consider also adding early + // returns into BuiltIn-specific rules, so that the system doesn't spawn new + // rules which don't do anything. + return SPV_SUCCESS; + } + + BuiltInsValidator validator(_); + return validator.Run(); +} + +} // namespace libspirv diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_composites.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_composites.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_composites.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_composites.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -85,10 +85,16 @@ } case SpvOpTypeArray: { uint64_t array_size = 0; + auto size = _.FindDef(type_inst->word(3)); + *member_type = type_inst->word(2); + if (spvOpcodeIsSpecConstant(size->opcode())) { + // Cannot verify against the size of this array. + break; + } + if (!_.GetConstantValUint64(type_inst->word(3), &array_size)) { assert(0 && "Array type definition is corrupt"); } - *member_type = type_inst->word(2); if (component_index >= array_size) { return _.diag(SPV_ERROR_INVALID_DATA) << spvOpcodeString(opcode) @@ -288,6 +294,12 @@ assert(array_inst); assert(array_inst->opcode() == SpvOpTypeArray); + auto size = _.FindDef(array_inst->word(3)); + if (spvOpcodeIsSpecConstant(size->opcode())) { + // Cannot verify against the size of this array. + break; + } + uint64_t array_size = 0; if (!_.GetConstantValUint64(array_inst->word(3), &array_size)) { assert(0 && "Array type definition is corrupt"); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_conversion.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_conversion.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_conversion.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_conversion.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -96,34 +96,32 @@ break; } -#if 0 - // TODO(atgoo@github.com) Reenable this once VulkanCTS can pass this test. case SpvOpUConvert: { if (!_.IsUnsignedIntScalarType(result_type) && !_.IsUnsignedIntVectorType(result_type)) return _.diag(SPV_ERROR_INVALID_DATA) - << "Expected unsigned int scalar or vector type as Result Type: " - << spvOpcodeString(opcode); + << "Expected unsigned int scalar or vector type as Result Type: " + << spvOpcodeString(opcode); const uint32_t input_type = _.GetOperandTypeId(inst, 2); - if (!input_type || (!_.IsIntScalarType(input_type) && - !_.IsIntVectorType(input_type))) + if (!input_type || + (!_.IsIntScalarType(input_type) && !_.IsIntVectorType(input_type))) return _.diag(SPV_ERROR_INVALID_DATA) - << "Expected input to be int scalar or vector: " - << spvOpcodeString(opcode); + << "Expected input to be int scalar or vector: " + << spvOpcodeString(opcode); if (_.GetDimension(result_type) != _.GetDimension(input_type)) return _.diag(SPV_ERROR_INVALID_DATA) - << "Expected input to have the same dimension as Result Type: " - << spvOpcodeString(opcode); + << "Expected input to have the same dimension as Result Type: " + << spvOpcodeString(opcode); if (_.GetBitWidth(result_type) == _.GetBitWidth(input_type)) return _.diag(SPV_ERROR_INVALID_DATA) - << "Expected input to have different bit width from Result Type: " - << spvOpcodeString(opcode); + << "Expected input to have different bit width from Result " + "Type: " + << spvOpcodeString(opcode); break; } -#endif case SpvOpSConvert: { if (!_.IsIntScalarType(result_type) && !_.IsIntVectorType(result_type)) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -59,15 +59,10 @@ spv_result_t spvValidateIDs(const spv_instruction_t* pInsts, const uint64_t count, - const spv_opcode_table opcodeTable, - const spv_operand_table operandTable, - const spv_ext_inst_table extInstTable, const ValidationState_t& state, spv_position position) { position->index = SPV_INDEX_INSTRUCTION; - if (auto error = - spvValidateInstructionIDs(pInsts, count, opcodeTable, operandTable, - extInstTable, state, position)) + if (auto error = spvValidateInstructionIDs(pInsts, count, state, position)) return error; return SPV_SUCCESS; } @@ -127,7 +122,7 @@ const spv_parsed_instruction_t* inst) { const std::string extension_str = libspirv::GetExtensionString(inst); Extension extension; - if (!GetExtensionFromString(extension_str, &extension)) { + if (!GetExtensionFromString(extension_str.c_str(), &extension)) { // The error will be logged in the ProcessInstruction pass. return; } @@ -161,7 +156,8 @@ _.increment_instruction_count(); if (static_cast(inst->opcode) == SpvOpEntryPoint) { const auto entry_point = inst->words[2]; - _.RegisterEntryPointId(entry_point); + const SpvExecutionModel execution_model = SpvExecutionModel(inst->words[1]); + _.RegisterEntryPointId(entry_point, execution_model); // Operand 3 and later are the of interfaces for the entry point. for (int i = 3; i < inst->num_operands; ++i) { _.RegisterInterfaceForEntryPoint(entry_point, @@ -341,9 +337,13 @@ } position.index = SPV_INDEX_INSTRUCTION; - return spvValidateIDs(instructions.data(), instructions.size(), - context.opcode_table, context.operand_table, - context.ext_inst_table, *vstate, &position); + if (auto error = spvValidateIDs(instructions.data(), instructions.size(), + *vstate, &position)) + return error; + + if (auto error = ValidateBuiltIns(*vstate)) return error; + + return SPV_SUCCESS; } } // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_decorations.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_decorations.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_decorations.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_decorations.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -19,6 +19,7 @@ #include "diagnostic.h" #include "opcode.h" +#include "spirv_target_env.h" #include "val/validation_state.h" using libspirv::Decoration; @@ -28,6 +29,14 @@ namespace { +// Returns whether the given variable has a BuiltIn decoration. +bool isBuiltInVar(uint32_t var_id, ValidationState_t& vstate) { + const auto& decorations = vstate.id_decorations(var_id); + return std::any_of( + decorations.begin(), decorations.end(), + [](const Decoration& d) { return SpvDecorationBuiltIn == d.dec_type(); }); +} + // Returns whether the given structure type has any members with BuiltIn // decoration. bool isBuiltInStruct(uint32_t struct_id, ValidationState_t& vstate) { @@ -91,6 +100,22 @@ return SPV_SUCCESS; } +// Checks whether a builtin variable is valid. +spv_result_t CheckBuiltInVariable(uint32_t var_id, ValidationState_t& vstate) { + const auto& decorations = vstate.id_decorations(var_id); + for (const auto& d : decorations) { + if (spvIsVulkanEnv(vstate.context()->target_env)) { + if (d.dec_type() == SpvDecorationLocation || + d.dec_type() == SpvDecorationComponent) { + return vstate.diag(SPV_ERROR_INVALID_ID) + << "A BuiltIn variable (id " << var_id + << ") cannot have any Location or Component decorations"; + } + } + } + return SPV_SUCCESS; +} + // Checks whether proper decorations have been appied to the entry points. spv_result_t CheckDecorationsOfEntryPoints(ValidationState_t& vstate) { for (uint32_t entry_point : vstate.entry_points()) { @@ -126,6 +151,9 @@ if (storage_class == SpvStorageClassInput) ++num_builtin_inputs; if (storage_class == SpvStorageClassOutput) ++num_builtin_outputs; if (num_builtin_inputs > 1 || num_builtin_outputs > 1) break; + if (auto error = CheckBuiltInVariable(interface, vstate)) return error; + } else if (isBuiltInVar(interface, vstate)) { + if (auto error = CheckBuiltInVariable(interface, vstate)) return error; } } if (num_builtin_inputs > 1 || num_builtin_outputs > 1) { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate.h 2018-04-27 11:46:32.000000000 +0000 @@ -117,6 +117,9 @@ /// Performs decoration validation. spv_result_t ValidateDecorations(ValidationState_t& _); +/// Performs validation of built-in variables. +spv_result_t ValidateBuiltIns(const ValidationState_t& _); + /// Validates that type declarations are unique, unless multiple declarations /// of the same data type are allowed by the specification. /// (see section 2.8 Types and Variables) @@ -182,17 +185,12 @@ /// /// @param[in] pInsts stream of instructions /// @param[in] instCount number of instructions -/// @param[in] opcodeTable table of specified Opcodes -/// @param[in] operandTable table of specified operands /// @param[in] usedefs use-def info from module parsing /// @param[in,out] position current position in the stream /// /// @return result code spv_result_t spvValidateInstructionIDs(const spv_instruction_t* pInsts, const uint64_t instCount, - const spv_opcode_table opcodeTable, - const spv_operand_table operandTable, - const spv_ext_inst_table extInstTable, const libspirv::ValidationState_t& state, spv_position position); @@ -201,17 +199,12 @@ /// @param[in] pInstructions array of instructions /// @param[in] count number of elements in instruction array /// @param[in] bound the binary header -/// @param[in] opcodeTable table of specified Opcodes -/// @param[in] operandTable table of specified operands /// @param[in,out] position current word in the binary /// @param[in] consumer message consumer callback /// /// @return result code spv_result_t spvValidateIDs(const spv_instruction_t* pInstructions, const uint64_t count, const uint32_t bound, - const spv_opcode_table opcodeTable, - const spv_operand_table operandTable, - const spv_ext_inst_table extInstTable, spv_position position, const spvtools::MessageConsumer& consumer); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_id.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_id.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_id.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_id.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -47,17 +48,15 @@ class idUsage { public: - idUsage(const spv_opcode_table opcodeTableArg, - const spv_operand_table operandTableArg, - const spv_ext_inst_table extInstTableArg, - const spv_instruction_t* pInsts, const uint64_t instCountArg, - const SpvMemoryModel memoryModelArg, + idUsage(spv_const_context context, const spv_instruction_t* pInsts, + const uint64_t instCountArg, const SpvMemoryModel memoryModelArg, const SpvAddressingModel addressingModelArg, const ValidationState_t& module, const vector& entry_points, spv_position positionArg, const spvtools::MessageConsumer& consumer) - : opcodeTable(opcodeTableArg), - operandTable(operandTableArg), - extInstTable(extInstTableArg), + : targetEnv(context->target_env), + opcodeTable(context->opcode_table), + operandTable(context->operand_table), + extInstTable(context->ext_inst_table), firstInst(pInsts), instCount(instCountArg), memoryModel(memoryModelArg), @@ -73,6 +72,7 @@ bool isValid(const spv_instruction_t* inst, const spv_opcode_desc); private: + const spv_target_env targetEnv; const spv_opcode_table opcodeTable; const spv_operand_table operandTable; const spv_ext_inst_table extInstTable; @@ -1787,11 +1787,76 @@ return true; } -#if 0 template <> -bool idUsage::isValid(const spv_instruction_t *inst, - const spv_opcode_desc opcodeEntry) {} -#endif +bool idUsage::isValid(const spv_instruction_t* inst, + const spv_opcode_desc /*opcodeEntry*/) { + auto thisInst = module_.FindDef(inst->words[2]); + SpvOp typeOp = module_.GetIdOpcode(thisInst->type_id()); + if (!spvOpcodeGeneratesType(typeOp)) { + DIAG(0) << "OpPhi's type " << module_.getIdName(thisInst->type_id()) + << " is not a type instruction."; + return false; + } + + auto block = thisInst->block(); + size_t numInOps = inst->words.size() - 3; + if (numInOps % 2 != 0) { + DIAG(0) << "OpPhi does not have an equal number of incoming values and " + "basic blocks."; + return false; + } + + // Create a uniqued vector of predecessor ids for comparison against + // incoming values. OpBranchConditional %cond %label %label produces two + // predecessors in the CFG. + std::vector predIds; + std::transform(block->predecessors()->begin(), block->predecessors()->end(), + std::back_inserter(predIds), + [](const libspirv::BasicBlock* b) { return b->id(); }); + std::sort(predIds.begin(), predIds.end()); + predIds.erase(std::unique(predIds.begin(), predIds.end()), predIds.end()); + + size_t numEdges = numInOps / 2; + if (numEdges != predIds.size()) { + DIAG(0) << "OpPhi's number of incoming blocks (" << numEdges + << ") does not match block's predecessor count (" + << block->predecessors()->size() << ")."; + return false; + } + + for (size_t i = 3; i < inst->words.size(); ++i) { + auto incId = inst->words[i]; + if (i % 2 == 1) { + // Incoming value type must match the phi result type. + auto incTypeId = module_.GetTypeId(incId); + if (thisInst->type_id() != incTypeId) { + DIAG(i) << "OpPhi's result type " + << module_.getIdName(thisInst->type_id()) + << " does not match incoming value " + << module_.getIdName(incId) << " type " + << module_.getIdName(incTypeId) << "."; + return false; + } + } else { + if (module_.GetIdOpcode(incId) != SpvOpLabel) { + DIAG(i) << "OpPhi's incoming basic block " + << module_.getIdName(incId) << " is not an OpLabel."; + return false; + } + + // Incoming basic block must be an immediate predecessor of the phi's + // block. + if (!std::binary_search(predIds.begin(), predIds.end(), incId)) { + DIAG(i) << "OpPhi's incoming basic block " + << module_.getIdName(incId) << " is not a predecessor of " + << module_.getIdName(block->id()) << "."; + return false; + } + } + } + + return true; +} #if 0 template <> @@ -2297,7 +2362,8 @@ bool idUsage::isValid(const spv_instruction_t* inst) { spv_opcode_desc opcodeEntry = nullptr; - if (spvOpcodeTableValueLookup(opcodeTable, inst->opcode, &opcodeEntry)) + if (spvOpcodeTableValueLookup(targetEnv, opcodeTable, inst->opcode, + &opcodeEntry)) return false; #define CASE(OpCode) \ case Spv##OpCode: \ @@ -2357,7 +2423,7 @@ // Bitwise opcodes are validated in validate_bitwise.cpp. // Logical opcodes are validated in validate_logicals.cpp. // Derivative opcodes are validated in validate_derivatives.cpp. - TODO(OpPhi) + CASE(OpPhi) TODO(OpLoopMerge) TODO(OpSelectionMerge) TODO(OpBranch) @@ -2606,7 +2672,8 @@ const Instruction* variable = _.FindDef(phi->word(i)); const BasicBlock* parent = phi->function()->GetBlock(phi->word(i + 1)).first; - if (variable->block() && !variable->block()->dominates(*parent)) { + if (variable->block() && parent->reachable() && + !variable->block()->dominates(*parent)) { return _.diag(SPV_ERROR_INVALID_ID) << "In OpPhi instruction " << _.getIdName(phi->id()) << ", ID " << _.getIdName(variable->id()) @@ -2687,14 +2754,11 @@ spv_result_t spvValidateInstructionIDs(const spv_instruction_t* pInsts, const uint64_t instCount, - const spv_opcode_table opcodeTable, - const spv_operand_table operandTable, - const spv_ext_inst_table extInstTable, const libspirv::ValidationState_t& state, spv_position position) { - idUsage idUsage(opcodeTable, operandTable, extInstTable, pInsts, instCount, - state.memory_model(), state.addressing_model(), state, - state.entry_points(), position, state.context()->consumer); + idUsage idUsage(state.context(), pInsts, instCount, state.memory_model(), + state.addressing_model(), state, state.entry_points(), + position, state.context()->consumer); for (uint64_t instIndex = 0; instIndex < instCount; ++instIndex) { if (!idUsage.isValid(&pInsts[instIndex])) return SPV_ERROR_INVALID_ID; position->index += pInsts[instIndex].words.size(); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_instruction.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_instruction.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/source/validate_instruction.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/source/validate_instruction.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -29,7 +29,9 @@ #include "extensions.h" #include "opcode.h" #include "operand.h" +#include "spirv_constant.h" #include "spirv_definition.h" +#include "spirv_target_env.h" #include "spirv_validator_options.h" #include "util/string_utils.h" #include "val/function.h" @@ -93,9 +95,8 @@ // Look it up in the grammar spv_opcode_desc opcode_desc = {}; if (SPV_SUCCESS == state.grammar().lookupOpcode(opcode, &opcode_desc)) { - CapabilitySet opcode_caps(opcode_desc->numCapabilities, - opcode_desc->capabilities); - return opcode_caps; + return state.grammar().filterCapsAgainstTargetEnv( + opcode_desc->capabilities, opcode_desc->numCapabilities); } return CapabilitySet(); } @@ -127,14 +128,20 @@ spv_operand_desc operand_desc; const auto ret = state.grammar().lookupOperand(type, operand, &operand_desc); if (ret == SPV_SUCCESS) { - CapabilitySet result(operand_desc->numCapabilities, - operand_desc->capabilities); - // Allow FPRoundingMode decoration if requested. - if (state.features().free_fp_rounding_mode && - type == SPV_OPERAND_TYPE_DECORATION && + if (type == SPV_OPERAND_TYPE_DECORATION && operand_desc->value == SpvDecorationFPRoundingMode) { - return CapabilitySet(); + if (state.features().free_fp_rounding_mode) return CapabilitySet(); + + // Vulkan API requires more capabilities on rounding mode. + if (spvIsVulkanEnv(state.context()->target_env)) { + CapabilitySet cap_set; + cap_set.Add(SpvCapabilityStorageUniformBufferBlock16); + cap_set.Add(SpvCapabilityStorageUniform16); + cap_set.Add(SpvCapabilityStoragePushConstant16); + cap_set.Add(SpvCapabilityStorageInputOutput16); + return cap_set; + } } // Allow certain group operations if requested. if (state.features().group_ops_reduce_and_scans && @@ -142,7 +149,9 @@ (operand <= uint32_t(SpvGroupOperationExclusiveScan))) { return CapabilitySet(); } - return result; + + return state.grammar().filterCapsAgainstTargetEnv( + operand_desc->capabilities, operand_desc->numCapabilities); } return CapabilitySet(); @@ -155,10 +164,15 @@ if (state.grammar().lookupOperand(type, operand, &operand_desc) == SPV_SUCCESS) { assert(operand_desc); + // If this operand is incorporated into core SPIR-V before or in the current + // target environment, we don't require extensions anymore. + if (spvVersionForTargetEnv(state.grammar().target_env()) >= + operand_desc->minVersion) + return {}; return {operand_desc->numExtensions, operand_desc->extensions}; } - return ExtensionSet(); + return {}; } } // namespace @@ -204,7 +218,8 @@ return SPV_SUCCESS; } -// Checks that all required extensions were declared in the module. +// Checks that all extensions required by the given instruction's operands were +// declared in the module. spv_result_t ExtensionCheck(ValidationState_t& _, const spv_parsed_instruction_t* inst) { const SpvOp opcode = static_cast(inst->opcode); @@ -225,20 +240,54 @@ return SPV_SUCCESS; } -// Checks that the instruction is not reserved for future use. -spv_result_t ReservedCheck(ValidationState_t& _, - const spv_parsed_instruction_t* inst) { - const SpvOp opcode = static_cast(inst->opcode); - switch (opcode) { - case SpvOpImageSparseSampleProjImplicitLod: - case SpvOpImageSparseSampleProjExplicitLod: - case SpvOpImageSparseSampleProjDrefImplicitLod: - case SpvOpImageSparseSampleProjDrefExplicitLod: - return _.diag(SPV_ERROR_INVALID_VALUE) +// Checks that the instruction can be used in this target environment. +spv_result_t VersionCheck(ValidationState_t& _, + const spv_parsed_instruction_t* inst) { + const auto opcode = static_cast(inst->opcode); + spv_opcode_desc inst_desc; + const bool r = _.grammar().lookupOpcode(opcode, &inst_desc); + assert(r == SPV_SUCCESS); + (void)r; + + const auto min_version = inst_desc->minVersion; + + ExtensionSet exts(inst_desc->numExtensions, inst_desc->extensions); + if (exts.IsEmpty()) { + // If no extensions can enable this instruction, then emit error messages + // only concerning core SPIR-V versions if errors happen. + if (min_version == ~0u) { + return _.diag(SPV_ERROR_WRONG_VERSION) << spvOpcodeString(opcode) << " is reserved for future use."; - default: - return SPV_SUCCESS; + } + + if (spvVersionForTargetEnv(_.grammar().target_env()) < min_version) { + return _.diag(SPV_ERROR_WRONG_VERSION) + << spvOpcodeString(opcode) << " requires " + << spvTargetEnvDescription( + static_cast(min_version)) + << " at minimum."; + } + } + // Otherwise, we only error out when no enabling extensions are registered. + else if (!_.HasAnyOfExtensions(exts)) { + if (min_version == ~0u) { + return _.diag(SPV_ERROR_MISSING_EXTENSION) + << spvOpcodeString(opcode) + << " requires one of the following extensions: " + << ExtensionSetToString(exts); + } + + if (static_cast(_.grammar().target_env()) < min_version) { + return _.diag(SPV_ERROR_WRONG_VERSION) + << spvOpcodeString(opcode) << " requires " + << spvTargetEnvDescription( + static_cast(min_version)) + << " at minimum or one of the following extensions: " + << ExtensionSetToString(exts); + } } + + return SPV_SUCCESS; } // Checks that the Resuld is within the valid bound. @@ -424,7 +473,7 @@ const spv_parsed_instruction_t* inst) { const std::string extension_str = GetExtensionString(inst); Extension extension; - if (!GetExtensionFromString(extension_str, &extension)) { + if (!GetExtensionFromString(extension_str.c_str(), &extension)) { _.diag(SPV_SUCCESS) << "Found unrecognized extension " << extension_str; return; } @@ -433,18 +482,21 @@ spv_result_t InstructionPass(ValidationState_t& _, const spv_parsed_instruction_t* inst) { const SpvOp opcode = static_cast(inst->opcode); - if (opcode == SpvOpExtension) CheckIfKnownExtension(_, inst); - if (opcode == SpvOpCapability) { + if (opcode == SpvOpExtension) { + CheckIfKnownExtension(_, inst); + } else if (opcode == SpvOpCapability) { _.RegisterCapability( static_cast(inst->words[inst->operands[0].offset])); - } - if (opcode == SpvOpMemoryModel) { + } else if (opcode == SpvOpMemoryModel) { _.set_addressing_model( static_cast(inst->words[inst->operands[0].offset])); _.set_memory_model( static_cast(inst->words[inst->operands[1].offset])); - } - if (opcode == SpvOpVariable) { + } else if (opcode == SpvOpExecutionMode) { + const uint32_t entry_point = inst->words[1]; + _.RegisterExecutionModeForEntryPoint(entry_point, + SpvExecutionMode(inst->words[2])); + } else if (opcode == SpvOpVariable) { const auto storage_class = static_cast(inst->words[inst->operands[2].offset]); if (auto error = LimitCheckNumVars(_, inst->result_id, storage_class)) { @@ -492,7 +544,7 @@ if (auto error = LimitCheckIdBound(_, inst)) return error; if (auto error = LimitCheckStruct(_, inst)) return error; if (auto error = LimitCheckSwitch(_, inst)) return error; - if (auto error = ReservedCheck(_, inst)) return error; + if (auto error = VersionCheck(_, inst)) return error; // All instruction checks have passed. return SPV_SUCCESS; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/binary_header_get_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/binary_header_get_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/binary_header_get_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/binary_header_get_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -50,7 +50,7 @@ ASSERT_EQ(SPV_SUCCESS, spvBinaryHeaderGet(&const_bin, endian, &header)); ASSERT_EQ(static_cast(SpvMagicNumber), header.magic); - ASSERT_EQ(0x00010200u, header.version); + ASSERT_EQ(0x00010300u, header.version); ASSERT_EQ(static_cast(SPV_GENERATOR_CODEPLAY), header.generator); ASSERT_EQ(1u, header.bound); ASSERT_EQ(0u, header.schema); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/binary_to_text_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/binary_to_text_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/binary_to_text_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/binary_to_text_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -240,7 +240,7 @@ NumericLiterals, RoundTripInstructionsTest, // This test is independent of environment, so just test the one. Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_UNIVERSAL_1_2), + SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3), ::testing::ValuesIn(std::vector{ "%1 = OpTypeInt 12 0\n%2 = OpConstant %1 1867\n", "%1 = OpTypeInt 12 1\n%2 = OpConstant %1 1867\n", @@ -255,13 +255,13 @@ "%1 = OpTypeFloat 16\n%2 = OpConstant %1 0x1.ff4p+16\n", "%1 = OpTypeFloat 16\n%2 = OpConstant %1 -0x1.d2cp-10\n", // 32-bit floats - "%1 = OpTypeFloat 32\n%2 = OpConstant %1 -3.275\n", + "%1 = OpTypeFloat 32\n%2 = OpConstant %1 -3.125\n", "%1 = OpTypeFloat 32\n%2 = OpConstant %1 0x1.8p+128\n", // NaN "%1 = OpTypeFloat 32\n%2 = OpConstant %1 -0x1.0002p+128\n", // NaN "%1 = OpTypeFloat 32\n%2 = OpConstant %1 0x1p+128\n", // Inf "%1 = OpTypeFloat 32\n%2 = OpConstant %1 -0x1p+128\n", // -Inf // 64-bit floats - "%1 = OpTypeFloat 64\n%2 = OpConstant %1 -3.275\n", + "%1 = OpTypeFloat 64\n%2 = OpConstant %1 -3.125\n", "%1 = OpTypeFloat 64\n%2 = OpConstant %1 0x1.ffffffffffffap-1023\n", // small normal "%1 = OpTypeFloat 64\n%2 = OpConstant %1 -0x1.ffffffffffffap-1023\n", "%1 = OpTypeFloat 64\n%2 = OpConstant %1 0x1.8p+1024\n", // NaN @@ -274,7 +274,7 @@ INSTANTIATE_TEST_CASE_P( MemoryAccessMasks, RoundTripInstructionsTest, Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_UNIVERSAL_1_2), + SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3), ::testing::ValuesIn(std::vector{ "OpStore %1 %2\n", // 3 words long. "OpStore %1 %2 None\n", // 4 words long, explicit final 0. @@ -291,7 +291,7 @@ FPFastMathModeMasks, RoundTripInstructionsTest, Combine( ::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_UNIVERSAL_1_2), + SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3), ::testing::ValuesIn(std::vector{ "OpDecorate %1 FPFastMathMode None\n", "OpDecorate %1 FPFastMathMode NotNaN\n", @@ -305,54 +305,55 @@ "OpDecorate %1 FPFastMathMode NotNaN|NotInf|NSZ|AllowRecip|Fast\n", })), ); -INSTANTIATE_TEST_CASE_P(LoopControlMasks, RoundTripInstructionsTest, - Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, - SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_UNIVERSAL_1_2), - ::testing::ValuesIn(std::vector{ - "OpLoopMerge %1 %2 None\n", - "OpLoopMerge %1 %2 Unroll\n", - "OpLoopMerge %1 %2 DontUnroll\n", - "OpLoopMerge %1 %2 Unroll|DontUnroll\n", - })), ); +INSTANTIATE_TEST_CASE_P( + LoopControlMasks, RoundTripInstructionsTest, + Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, + SPV_ENV_UNIVERSAL_1_3, SPV_ENV_UNIVERSAL_1_2), + ::testing::ValuesIn(std::vector{ + "OpLoopMerge %1 %2 None\n", + "OpLoopMerge %1 %2 Unroll\n", + "OpLoopMerge %1 %2 DontUnroll\n", + "OpLoopMerge %1 %2 Unroll|DontUnroll\n", + })), ); INSTANTIATE_TEST_CASE_P(LoopControlMasksV11, RoundTripInstructionsTest, Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_UNIVERSAL_1_2), + SPV_ENV_UNIVERSAL_1_2, + SPV_ENV_UNIVERSAL_1_3), ::testing::ValuesIn(std::vector{ "OpLoopMerge %1 %2 DependencyInfinite\n", "OpLoopMerge %1 %2 DependencyLength 8\n", })), ); -INSTANTIATE_TEST_CASE_P(SelectionControlMasks, RoundTripInstructionsTest, - Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, - SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_UNIVERSAL_1_2), - ::testing::ValuesIn(std::vector{ - "OpSelectionMerge %1 None\n", - "OpSelectionMerge %1 Flatten\n", - "OpSelectionMerge %1 DontFlatten\n", - "OpSelectionMerge %1 Flatten|DontFlatten\n", - })), ); +INSTANTIATE_TEST_CASE_P( + SelectionControlMasks, RoundTripInstructionsTest, + Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, + SPV_ENV_UNIVERSAL_1_3, SPV_ENV_UNIVERSAL_1_2), + ::testing::ValuesIn(std::vector{ + "OpSelectionMerge %1 None\n", + "OpSelectionMerge %1 Flatten\n", + "OpSelectionMerge %1 DontFlatten\n", + "OpSelectionMerge %1 Flatten|DontFlatten\n", + })), ); -INSTANTIATE_TEST_CASE_P(FunctionControlMasks, RoundTripInstructionsTest, - Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, - SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_UNIVERSAL_1_2), - ::testing::ValuesIn(std::vector{ - "%2 = OpFunction %1 None %3\n", - "%2 = OpFunction %1 Inline %3\n", - "%2 = OpFunction %1 DontInline %3\n", - "%2 = OpFunction %1 Pure %3\n", - "%2 = OpFunction %1 Const %3\n", - "%2 = OpFunction %1 Inline|Pure|Const %3\n", - "%2 = OpFunction %1 DontInline|Const %3\n", - })), ); +INSTANTIATE_TEST_CASE_P( + FunctionControlMasks, RoundTripInstructionsTest, + Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, + SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3), + ::testing::ValuesIn(std::vector{ + "%2 = OpFunction %1 None %3\n", + "%2 = OpFunction %1 Inline %3\n", + "%2 = OpFunction %1 DontInline %3\n", + "%2 = OpFunction %1 Pure %3\n", + "%2 = OpFunction %1 Const %3\n", + "%2 = OpFunction %1 Inline|Pure|Const %3\n", + "%2 = OpFunction %1 DontInline|Const %3\n", + })), ); INSTANTIATE_TEST_CASE_P( ImageMasks, RoundTripInstructionsTest, Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_UNIVERSAL_1_2), + SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3), ::testing::ValuesIn(std::vector{ "%2 = OpImageFetch %1 %3 %4\n", "%2 = OpImageFetch %1 %3 %4 None\n", @@ -374,7 +375,7 @@ INSTANTIATE_TEST_CASE_P( NewInstructionsInSPIRV1_2, RoundTripInstructionsTest, - Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_2), + Combine(::testing::Values(SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3), ::testing::ValuesIn(std::vector{ "OpExecutionModeId %1 SubgroupsPerWorkgroupId %2\n", "OpExecutionModeId %1 LocalSizeId %2 %3 %4\n", @@ -547,4 +548,6 @@ {65535, 32767, "Unknown(65535); 32767"}, }), ); +// TODO(dneto): Test new instructions and enums in SPIR-V 1.3 + } // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/c_interface_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/c_interface_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/c_interface_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/c_interface_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -22,7 +22,15 @@ using namespace spvtools; -using libspirv::SetContextMessageConsumer; +// TODO(antiagainst): Use public C API for setting the consumer once exists. +#ifndef SPIRV_TOOLS_SHAREDLIB +void SetContextMessageConsumer(spv_context context, + spvtools::MessageConsumer consumer) { + libspirv::SetContextMessageConsumer(context, consumer); +} +#else +void SetContextMessageConsumer(spv_context, spvtools::MessageConsumer) {} +#endif // The default consumer is a null std::function. TEST(CInterface, DefaultConsumerNullDiagnosticForValidInput) { @@ -107,7 +115,6 @@ auto context = spvContextCreate(SPV_ENV_UNIVERSAL_1_1); int invocation = 0; - // TODO(antiagainst): Use public C API for setting the consumer once exists. SetContextMessageConsumer( context, [&invocation](spv_message_level_t level, const char* source, @@ -126,7 +133,9 @@ EXPECT_EQ(SPV_ERROR_INVALID_TEXT, spvTextToBinary(context, input_text, sizeof(input_text), &binary, nullptr)); +#ifndef SPIRV_TOOLS_SHAREDLIB EXPECT_EQ(1, invocation); +#endif spvBinaryDestroy(binary); spvContextDestroy(context); } @@ -159,7 +168,9 @@ EXPECT_EQ(SPV_ERROR_INVALID_BINARY, spvBinaryToText(context, binary->code, binary->wordCount, 0, &text, nullptr)); +#ifndef SPIRV_TOOLS_SHAREDLIB EXPECT_EQ(1, invocation); +#endif spvTextDestroy(text); spvBinaryDestroy(binary); @@ -193,7 +204,9 @@ spv_const_binary_t b{binary->code, binary->wordCount}; EXPECT_EQ(SPV_ERROR_INVALID_LAYOUT, spvValidate(context, &b, nullptr)); +#ifndef SPIRV_TOOLS_SHAREDLIB EXPECT_EQ(1, invocation); +#endif spvBinaryDestroy(binary); spvContextDestroy(context); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/CMakeLists.txt 2018-04-27 11:46:32.000000000 +0000 @@ -31,7 +31,7 @@ function(add_spvtools_unittest) if (NOT "${SPIRV_SKIP_TESTS}" AND TARGET gmock_main) set(one_value_args TARGET) - set(multi_value_args SRCS LIBS) + set(multi_value_args SRCS LIBS ENVIRONMENT) cmake_parse_arguments( ARG "" "${one_value_args}" "${multi_value_args}" ${ARGN}) set(target test_${ARG_TARGET}) @@ -72,6 +72,9 @@ endif() target_link_libraries(${target} PRIVATE gmock_main) add_test(NAME spirv-tools-${target} COMMAND ${target}) + if (DEFINED ARG_ENVIRONMENT) + set_tests_properties(spirv-tools-${target} PROPERTIES ENVIRONMENT ${ARG_ENVIRONMENT}) + endif() set_property(TARGET ${target} PROPERTY FOLDER "SPIRV-Tools tests") endif() endfunction() @@ -133,6 +136,7 @@ text_to_binary.pipe_storage_test.cpp text_to_binary.type_declaration_test.cpp text_to_binary.subgroup_dispatch_test.cpp + text_to_binary.reserved_sampling_test.cpp text_word_get_test.cpp unit_spirv.cpp @@ -154,6 +158,12 @@ LIBS ${SPIRV_TOOLS}) add_spvtools_unittest( + TARGET c_interface_shared + SRCS c_interface_test.cpp + LIBS ${SPIRV_TOOLS}-shared + ENVIRONMENT PATH=$) + +add_spvtools_unittest( TARGET cpp_interface SRCS cpp_interface_test.cpp LIBS SPIRV-Tools-opt) @@ -168,6 +178,13 @@ SRCS string_utils_test.cpp LIBS ${SPIRV_TOOLS}) +if (${SPIRV_TIMER_ENABLED}) +add_spvtools_unittest( + TARGET timer + SRCS timer_test.cpp + LIBS ${SPIRV_TOOLS}) +endif() + add_spvtools_unittest( TARGET log SRCS log_test.cpp diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/enum_string_mapping_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/enum_string_mapping_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/enum_string_mapping_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/enum_string_mapping_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -38,8 +38,8 @@ const Extension extension = param.first; const std::string extension_str = param.second; Extension result_extension; - ASSERT_TRUE( - libspirv::GetExtensionFromString(extension_str, &result_extension)); + ASSERT_TRUE(libspirv::GetExtensionFromString(extension_str.c_str(), + &result_extension)); EXPECT_EQ(extension, result_extension); } @@ -53,7 +53,8 @@ TEST_P(UnknownExtensionTest, TestExtensionFromStringFails) { Extension result_extension; - ASSERT_FALSE(libspirv::GetExtensionFromString(GetParam(), &result_extension)); + ASSERT_FALSE( + libspirv::GetExtensionFromString(GetParam().c_str(), &result_extension)); } TEST_P(CapabilityTest, TestCapabilityToString) { @@ -66,26 +67,32 @@ INSTANTIATE_TEST_CASE_P( AllExtensions, ExtensionTest, - ValuesIn(std::vector>( - {{Extension::kSPV_KHR_16bit_storage, "SPV_KHR_16bit_storage"}, - {Extension::kSPV_KHR_device_group, "SPV_KHR_device_group"}, - {Extension::kSPV_KHR_multiview, "SPV_KHR_multiview"}, - {Extension::kSPV_KHR_shader_ballot, "SPV_KHR_shader_ballot"}, - {Extension::kSPV_KHR_shader_draw_parameters, - "SPV_KHR_shader_draw_parameters"}, - {Extension::kSPV_KHR_subgroup_vote, "SPV_KHR_subgroup_vote"}, - {Extension::kSPV_NVX_multiview_per_view_attributes, - "SPV_NVX_multiview_per_view_attributes"}, - {Extension::kSPV_NV_geometry_shader_passthrough, - "SPV_NV_geometry_shader_passthrough"}, - {Extension::kSPV_NV_sample_mask_override_coverage, - "SPV_NV_sample_mask_override_coverage"}, - {Extension::kSPV_NV_stereo_view_rendering, - "SPV_NV_stereo_view_rendering"}, - {Extension::kSPV_NV_viewport_array2, "SPV_NV_viewport_array2"}}))); + ValuesIn(std::vector>({ + {Extension::kSPV_KHR_16bit_storage, "SPV_KHR_16bit_storage"}, + {Extension::kSPV_KHR_device_group, "SPV_KHR_device_group"}, + {Extension::kSPV_KHR_multiview, "SPV_KHR_multiview"}, + {Extension::kSPV_KHR_shader_ballot, "SPV_KHR_shader_ballot"}, + {Extension::kSPV_KHR_shader_draw_parameters, + "SPV_KHR_shader_draw_parameters"}, + {Extension::kSPV_KHR_subgroup_vote, "SPV_KHR_subgroup_vote"}, + {Extension::kSPV_NVX_multiview_per_view_attributes, + "SPV_NVX_multiview_per_view_attributes"}, + {Extension::kSPV_NV_geometry_shader_passthrough, + "SPV_NV_geometry_shader_passthrough"}, + {Extension::kSPV_NV_sample_mask_override_coverage, + "SPV_NV_sample_mask_override_coverage"}, + {Extension::kSPV_NV_stereo_view_rendering, + "SPV_NV_stereo_view_rendering"}, + {Extension::kSPV_NV_viewport_array2, "SPV_NV_viewport_array2"}, + {Extension::kSPV_GOOGLE_decorate_string, "SPV_GOOGLE_decorate_string"}, + {Extension::kSPV_GOOGLE_hlsl_functionality1, + "SPV_GOOGLE_hlsl_functionality1"}, + }))); INSTANTIATE_TEST_CASE_P(UnknownExtensions, UnknownExtensionTest, Values("", "SPV_KHR_", "SPV_KHR_device_group_ERROR", + /*alphabetically before all extensions*/ "A", + /*alphabetically after all extensions*/ "Z", "SPV_ERROR_random_string_hfsdklhlktherh")); INSTANTIATE_TEST_CASE_P( diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/hex_float_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/hex_float_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/hex_float_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/hex_float_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -43,6 +43,8 @@ ::testing::TestWithParam, std::string>>; using DecodeHexDoubleTest = ::testing::TestWithParam>>; +using RoundTripFloatTest = ::testing::TestWithParam; +using RoundTripDoubleTest = ::testing::TestWithParam; // Hex-encodes a float value. template @@ -241,6 +243,40 @@ {uint64_t(0x7FFFFFFFFFFFFFFFLL), "0x1.fffffffffffffp+1024"}, // -nan })), ); +// Tests that encoding a value and decoding it again restores +// the same value. +TEST_P(RoundTripFloatTest, CanStoreAccurately) { + std::stringstream ss; + ss << FloatProxy(GetParam()); + ss.seekg(0); + FloatProxy res; + ss >> res; + EXPECT_THAT(GetParam(), Eq(res.getAsFloat())); +} + +TEST_P(RoundTripDoubleTest, CanStoreAccurately) { + std::stringstream ss; + ss << FloatProxy(GetParam()); + ss.seekg(0); + FloatProxy res; + ss >> res; + EXPECT_THAT(GetParam(), Eq(res.getAsFloat())); +} + +INSTANTIATE_TEST_CASE_P( + Float32StoreTests, RoundTripFloatTest, + ::testing::ValuesIn(std::vector( + {// Value requiring more than 6 digits of precision to be + // represented accurately. + 3.0000002f}))); + +INSTANTIATE_TEST_CASE_P( + Float64StoreTests, RoundTripDoubleTest, + ::testing::ValuesIn(std::vector( + {// Value requiring more than 15 digits of precision to be + // represented accurately. + 1.5000000000000002}))); + TEST(HexFloatStreamTest, OperatorLeftShiftPreservesFloatAndFill) { std::stringstream s; s << std::setw(4) << std::oct << std::setfill('x') << 8 << " " @@ -478,8 +514,8 @@ {1000.0f, "1000"}, // Still normal numbers, but with large magnitude exponents. - {float(ldexp(1.f, 126)), "8.50706e+37"}, - {float(ldexp(-1.f, -126)), "-1.17549e-38"}, + {float(ldexp(1.f, 126)), "8.50705917e+37"}, + {float(ldexp(-1.f, -126)), "-1.17549435e-38"}, // denormalized values are printed as hex floats. {float(ldexp(1.0f, -127)), "0x1p-127"}, @@ -509,18 +545,18 @@ {1000.0, "1000"}, // Large outside the range of normal floats - {ldexp(1.0, 128), "3.40282366920938e+38"}, - {ldexp(1.5, 129), "1.02084710076282e+39"}, - {ldexp(-1.0, 128), "-3.40282366920938e+38"}, - {ldexp(-1.5, 129), "-1.02084710076282e+39"}, + {ldexp(1.0, 128), "3.4028236692093846e+38"}, + {ldexp(1.5, 129), "1.0208471007628154e+39"}, + {ldexp(-1.0, 128), "-3.4028236692093846e+38"}, + {ldexp(-1.5, 129), "-1.0208471007628154e+39"}, // Small outside the range of normal floats - {ldexp(1.5, -129), "2.20405190779179e-39"}, - {ldexp(-1.5, -129), "-2.20405190779179e-39"}, + {ldexp(1.5, -129), "2.2040519077917891e-39"}, + {ldexp(-1.5, -129), "-2.2040519077917891e-39"}, // lowest non-denorm - {ldexp(1.0, -1022), "2.2250738585072e-308"}, - {ldexp(-1.0, -1022), "-2.2250738585072e-308"}, + {ldexp(1.0, -1022), "2.2250738585072014e-308"}, + {ldexp(-1.0, -1022), "-2.2250738585072014e-308"}, // Denormalized values {ldexp(1.125, -1023), "0x1.2p-1023"}, @@ -554,8 +590,10 @@ EXPECT_EQ(-32, unbiased_exponent(ldexp(1.0f, -32))); EXPECT_EQ(42, unbiased_exponent(ldexp(1.0f, 42))); EXPECT_EQ(125, unbiased_exponent(ldexp(1.0f, 125))); - // Saturates to 128 - EXPECT_EQ(128, unbiased_exponent(ldexp(1.0f, 256))); + + EXPECT_EQ(128, spvutils::HexFloat>( + std::numeric_limits::infinity()) + .getUnbiasedNormalizedExponent()); EXPECT_EQ(-100, unbiased_exponent(ldexp(1.0f, -100))); EXPECT_EQ(-127, unbiased_exponent(ldexp(1.0f, -127))); // First denorm diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/link/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/link/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/link/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/link/CMakeLists.txt 2018-04-27 11:46:32.000000000 +0000 @@ -46,3 +46,8 @@ SRCS unique_ids_test.cpp LIBS SPIRV-Tools-opt SPIRV-Tools-link ) + +add_spvtools_unittest(TARGET link_partial_linkage + SRCS partial_linkage_test.cpp + LIBS SPIRV-Tools-opt SPIRV-Tools-link +) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/link/matching_imports_to_exports_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/link/matching_imports_to_exports_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/link/matching_imports_to_exports_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/link/matching_imports_to_exports_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -40,7 +40,9 @@ EXPECT_EQ(SPV_SUCCESS, AssembleAndLink({body1, body2}, &linked_binary)) << GetErrorMessage(); - const std::string expected_res = R"(%1 = OpTypeFloat 32 + const std::string expected_res = + R"(OpModuleProcessed "Linked by SPIR-V Tools Linker" +%1 = OpTypeFloat 32 %2 = OpVariable %1 Input %3 = OpConstant %1 42 %4 = OpVariable %1 Uniform %3 @@ -64,7 +66,9 @@ EXPECT_EQ(SPV_SUCCESS, AssembleAndLink({body}, &linked_binary)) << GetErrorMessage(); - const std::string expected_res = R"(%1 = OpTypeFloat 32 + const std::string expected_res = + R"(OpModuleProcessed "Linked by SPIR-V Tools Linker" +%1 = OpTypeFloat 32 %2 = OpVariable %1 Uniform )"; std::string res_body; @@ -89,6 +93,7 @@ << GetErrorMessage(); const std::string expected_res = R"(OpCapability Linkage +OpModuleProcessed "Linked by SPIR-V Tools Linker" OpDecorate %1 LinkageAttributes "foo" Export %2 = OpTypeFloat 32 %1 = OpVariable %2 Uniform @@ -267,6 +272,7 @@ << GetErrorMessage(); const std::string expected_res = R"(OpCapability Kernel +OpModuleProcessed "Linked by SPIR-V Tools Linker" OpDecorate %1 FuncParamAttr Sext %2 = OpTypeVoid %3 = OpTypeInt 32 0 @@ -310,7 +316,9 @@ EXPECT_EQ(SPV_SUCCESS, AssembleAndLink({body1, body2}, &linked_binary)) << GetErrorMessage(); - const std::string expected_res = R"(%1 = OpTypeVoid + const std::string expected_res = + R"(OpModuleProcessed "Linked by SPIR-V Tools Linker" +%1 = OpTypeVoid %2 = OpTypeFunction %1 %3 = OpTypeFloat 32 %4 = OpVariable %3 Uniform @@ -319,6 +327,68 @@ OpReturn OpFunctionEnd )"; + std::string res_body; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + EXPECT_EQ(SPV_SUCCESS, Disassemble(linked_binary, &res_body)) + << GetErrorMessage(); + EXPECT_EQ(expected_res, res_body); +} + +TEST_F(MatchingImportsToExports, UseExportedFuncParamAttr) { + const std::string body1 = R"( +OpCapability Kernel +OpCapability Linkage +OpDecorate %1 LinkageAttributes "foo" Import +OpDecorate %2 FuncParamAttr Zext +%2 = OpDecorationGroup +OpGroupDecorate %2 %3 %4 +%5 = OpTypeVoid +%6 = OpTypeInt 32 0 +%7 = OpTypeFunction %5 %6 +%1 = OpFunction %5 None %7 +%3 = OpFunctionParameter %6 +OpFunctionEnd +%8 = OpFunction %5 None %7 +%4 = OpFunctionParameter %6 +OpFunctionEnd +)"; + const std::string body2 = R"( +OpCapability Kernel +OpCapability Linkage +OpDecorate %1 LinkageAttributes "foo" Export +OpDecorate %2 FuncParamAttr Sext +%3 = OpTypeVoid +%4 = OpTypeInt 32 0 +%5 = OpTypeFunction %3 %4 +%1 = OpFunction %3 None %5 +%2 = OpFunctionParameter %4 +%6 = OpLabel +OpReturn +OpFunctionEnd +)"; + + spvtest::Binary linked_binary; + EXPECT_EQ(SPV_SUCCESS, AssembleAndLink({body1, body2}, &linked_binary)) + << GetErrorMessage(); + + const std::string expected_res = R"(OpCapability Kernel +OpModuleProcessed "Linked by SPIR-V Tools Linker" +OpDecorate %1 FuncParamAttr Zext +%1 = OpDecorationGroup +OpGroupDecorate %1 %2 +OpDecorate %3 FuncParamAttr Sext +%4 = OpTypeVoid +%5 = OpTypeInt 32 0 +%6 = OpTypeFunction %4 %5 +%7 = OpFunction %4 None %6 +%2 = OpFunctionParameter %5 +OpFunctionEnd +%8 = OpFunction %4 None %6 +%3 = OpFunctionParameter %5 +%9 = OpLabel +OpReturn +OpFunctionEnd +)"; std::string res_body; SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); EXPECT_EQ(SPV_SUCCESS, Disassemble(linked_binary, &res_body)) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/link/partial_linkage_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/link/partial_linkage_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/link/partial_linkage_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/link/partial_linkage_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,85 @@ +// Copyright (c) 2018 Pierre Moreau +// +// 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. + +#include "gmock/gmock.h" +#include "linker_fixture.h" + +namespace { + +using ::testing::HasSubstr; +using PartialLinkage = spvtest::LinkerTest; + +TEST_F(PartialLinkage, Allowed) { + const std::string body1 = R"( +OpCapability Linkage +OpDecorate %1 LinkageAttributes "foo" Import +OpDecorate %2 LinkageAttributes "bar" Import +%3 = OpTypeFloat 32 +%1 = OpVariable %3 Uniform +%2 = OpVariable %3 Uniform +)"; + const std::string body2 = R"( +OpCapability Linkage +OpDecorate %1 LinkageAttributes "bar" Export +%2 = OpTypeFloat 32 +%3 = OpConstant %2 3.1415 +%1 = OpVariable %2 Uniform %3 +)"; + + spvtest::Binary linked_binary; + spvtools::LinkerOptions linker_options; + linker_options.SetAllowPartialLinkage(true); + ASSERT_EQ(SPV_SUCCESS, + AssembleAndLink({body1, body2}, &linked_binary, linker_options)); + + const std::string expected_res = R"(OpCapability Linkage +OpModuleProcessed "Linked by SPIR-V Tools Linker" +OpDecorate %1 LinkageAttributes "foo" Import +%2 = OpTypeFloat 32 +%1 = OpVariable %2 Uniform +%3 = OpConstant %2 3.1415 +%4 = OpVariable %2 Uniform %3 +)"; + std::string res_body; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + ASSERT_EQ(SPV_SUCCESS, Disassemble(linked_binary, &res_body)) + << GetErrorMessage(); + EXPECT_EQ(expected_res, res_body); +} + +TEST_F(PartialLinkage, Disallowed) { + const std::string body1 = R"( +OpCapability Linkage +OpDecorate %1 LinkageAttributes "foo" Import +OpDecorate %2 LinkageAttributes "bar" Import +%3 = OpTypeFloat 32 +%1 = OpVariable %3 Uniform +%2 = OpVariable %3 Uniform +)"; + const std::string body2 = R"( +OpCapability Linkage +OpDecorate %1 LinkageAttributes "bar" Export +%2 = OpTypeFloat 32 +%3 = OpConstant %2 3.1415 +%1 = OpVariable %2 Uniform %3 +)"; + + spvtest::Binary linked_binary; + EXPECT_EQ(SPV_ERROR_INVALID_BINARY, + AssembleAndLink({body1, body2}, &linked_binary)); + EXPECT_THAT(GetErrorMessage(), + HasSubstr("Unresolved external reference to \"foo\".")); +} + +} // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/name_mapper_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/name_mapper_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/name_mapper_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/name_mapper_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -311,7 +311,7 @@ {"%1 = OpTypeFloat 16\n%2 = OpConstant %1 -0x1.d2cp-10", 2, "half_n0x1_d2cpn10"}, // 32-bit floats - {"%1 = OpTypeFloat 32\n%2 = OpConstant %1 -3.275", 2, "float_n3_275"}, + {"%1 = OpTypeFloat 32\n%2 = OpConstant %1 -3.125", 2, "float_n3_125"}, {"%1 = OpTypeFloat 32\n%2 = OpConstant %1 0x1.8p+128", 2, "float_0x1_8p_128"}, // NaN {"%1 = OpTypeFloat 32\n%2 = OpConstant %1 -0x1.0002p+128", 2, @@ -321,7 +321,7 @@ {"%1 = OpTypeFloat 32\n%2 = OpConstant %1 -0x1p+128", 2, "float_n0x1p_128"}, // -Inf // 64-bit floats - {"%1 = OpTypeFloat 64\n%2 = OpConstant %1 -3.275", 2, "double_n3_275"}, + {"%1 = OpTypeFloat 64\n%2 = OpConstant %1 -3.125", 2, "double_n3_125"}, {"%1 = OpTypeFloat 64\n%2 = OpConstant %1 0x1.ffffffffffffap-1023", 2, "double_0x1_ffffffffffffapn1023"}, // small normal {"%1 = OpTypeFloat 64\n%2 = OpConstant %1 -0x1.ffffffffffffap-1023", 2, diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opcode_require_capabilities_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opcode_require_capabilities_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opcode_require_capabilities_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opcode_require_capabilities_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -31,12 +31,12 @@ ::testing::TestWithParam; TEST_P(OpcodeTableCapabilitiesTest, TableEntryMatchesExpectedCapabilities) { + auto env = SPV_ENV_UNIVERSAL_1_1; spv_opcode_table opcodeTable; - ASSERT_EQ(SPV_SUCCESS, - spvOpcodeTableGet(&opcodeTable, SPV_ENV_UNIVERSAL_1_1)); + ASSERT_EQ(SPV_SUCCESS, spvOpcodeTableGet(&opcodeTable, env)); spv_opcode_desc entry; - ASSERT_EQ(SPV_SUCCESS, - spvOpcodeTableValueLookup(opcodeTable, GetParam().opcode, &entry)); + ASSERT_EQ(SPV_SUCCESS, spvOpcodeTableValueLookup(env, opcodeTable, + GetParam().opcode, &entry)); EXPECT_EQ( ElementsIn(GetParam().capabilities), ElementsIn(CapabilitySet(entry->numCapabilities, entry->capabilities))); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/operand_capabilities_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/operand_capabilities_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/operand_capabilities_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/operand_capabilities_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -45,15 +45,19 @@ TestWithParam>; TEST_P(EnumCapabilityTest, Sample) { - spv_operand_table operandTable; - ASSERT_EQ(SPV_SUCCESS, spvOperandTableGet(&operandTable, get<0>(GetParam()))); + const auto env = get<0>(GetParam()); + const auto context = spvContextCreate(env); + const libspirv::AssemblyGrammar grammar(context); spv_operand_desc entry; + ASSERT_EQ(SPV_SUCCESS, - spvOperandTableValueLookup(operandTable, get<1>(GetParam()).type, - get<1>(GetParam()).value, &entry)); - EXPECT_THAT( - ElementsIn(CapabilitySet(entry->numCapabilities, entry->capabilities)), - Eq(ElementsIn(get<1>(GetParam()).expected_capabilities))) + grammar.lookupOperand(get<1>(GetParam()).type, + get<1>(GetParam()).value, &entry)); + const auto cap_set = grammar.filterCapsAgainstTargetEnv( + entry->capabilities, entry->numCapabilities); + + EXPECT_THAT(ElementsIn(cap_set), + Eq(ElementsIn(get<1>(GetParam()).expected_capabilities))) << " capability value " << get<1>(GetParam()).value; } @@ -363,25 +367,6 @@ CASE1(FP_FAST_MATH_MODE, FPFastMathModeFastMask, Kernel), })), ); -// See SPIR-V Section 3.16 FP Rounding Mode -INSTANTIATE_TEST_CASE_P( - FPRoundingMode, EnumCapabilityTest, - Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1), - ValuesIn(std::vector{ - CASE5(FP_ROUNDING_MODE, FPRoundingModeRTE, Kernel, - StorageUniformBufferBlock16, StorageUniform16, - StoragePushConstant16, StorageInputOutput16), - CASE5(FP_ROUNDING_MODE, FPRoundingModeRTZ, Kernel, - StorageUniformBufferBlock16, StorageUniform16, - StoragePushConstant16, StorageInputOutput16), - CASE5(FP_ROUNDING_MODE, FPRoundingModeRTP, Kernel, - StorageUniformBufferBlock16, StorageUniform16, - StoragePushConstant16, StorageInputOutput16), - CASE5(FP_ROUNDING_MODE, FPRoundingModeRTN, Kernel, - StorageUniformBufferBlock16, StorageUniform16, - StoragePushConstant16, StorageInputOutput16), - })), ); - // See SPIR-V Section 3.17 Linkage Type INSTANTIATE_TEST_CASE_P( LinkageType, EnumCapabilityTest, @@ -463,9 +448,6 @@ CASE1(DECORATION, DecorationXfbBuffer, TransformFeedback), CASE1(DECORATION, DecorationXfbStride, TransformFeedback), CASE1(DECORATION, DecorationFuncParamAttr, Kernel), - CASE5(DECORATION, DecorationFPRoundingMode, Kernel, - StorageUniformBufferBlock16, StorageUniform16, - StoragePushConstant16, StorageInputOutput16), CASE1(DECORATION, DecorationFPFastMathMode, Kernel), CASE1(DECORATION, DecorationLinkageAttributes, Linkage), CASE1(DECORATION, DecorationNoContraction, Shader), @@ -532,12 +514,12 @@ CASE1(BUILT_IN, BuiltInGlobalOffset, Kernel), CASE1(BUILT_IN, BuiltInGlobalLinearId, Kernel), // Value 35 intentionally missing - CASE1(BUILT_IN, BuiltInSubgroupSize, Kernel), + CASE2(BUILT_IN, BuiltInSubgroupSize, Kernel, SubgroupBallotKHR), CASE1(BUILT_IN, BuiltInSubgroupMaxSize, Kernel), CASE1(BUILT_IN, BuiltInNumSubgroups, Kernel), CASE1(BUILT_IN, BuiltInNumEnqueuedSubgroups, Kernel), CASE1(BUILT_IN, BuiltInSubgroupId, Kernel), - CASE1(BUILT_IN, BuiltInSubgroupLocalInvocationId, Kernel), + CASE2(BUILT_IN, BuiltInSubgroupLocalInvocationId, Kernel, SubgroupBallotKHR), CASE1(BUILT_IN, BuiltInVertexIndex, Shader), CASE1(BUILT_IN, BuiltInInstanceIndex, Shader), // clang-format on diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/operand_pattern_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/operand_pattern_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/operand_pattern_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/operand_pattern_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -68,12 +68,12 @@ TEST_P(MaskExpansionTest, Sample) { spv_operand_table operandTable = nullptr; - ASSERT_EQ(SPV_SUCCESS, - spvOperandTableGet(&operandTable, SPV_ENV_UNIVERSAL_1_0)); + auto env = SPV_ENV_UNIVERSAL_1_0; + ASSERT_EQ(SPV_SUCCESS, spvOperandTableGet(&operandTable, env)); spv_operand_pattern_t pattern(GetParam().initial); - spvPushOperandTypesForMask(operandTable, GetParam().type, GetParam().mask, - &pattern); + spvPushOperandTypesForMask(env, operandTable, GetParam().type, + GetParam().mask, &pattern); EXPECT_THAT(pattern, Eq(GetParam().expected)); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/aggressive_dead_code_elim_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/aggressive_dead_code_elim_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/aggressive_dead_code_elim_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/aggressive_dead_code_elim_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -4006,7 +4006,7 @@ %uint = OpTypeInt 32 0 %11 = OpConstant %uint 2 %float = OpTypeFloat 32 - %13 = OpConstant %float 3.14 + %13 = OpConstant %float 3.1415 %double = OpTypeFloat 64 %15 = OpConstant %double 3.14159265358979 %main = OpFunction %void None %4 @@ -4048,7 +4048,7 @@ "%uint_2 = OpConstant %uint 2", "%float = OpTypeFloat 32", "%_ptr_Output_float = OpTypePointer Output %float", - "%float_3_14 = OpConstant %float 3.14", + "%float_3_1415 = OpConstant %float 3.1415", "%double = OpTypeFloat 64", "%_ptr_Output_double = OpTypePointer Output %double", "%double_3_14159265358979 = OpConstant %double 3.14159265358979", @@ -4064,7 +4064,7 @@ "OpStore %bfv %false", "OpStore %iv %int_1", "OpStore %uv %uint_2", - "OpStore %fv %float_3_14", + "OpStore %fv %float_3_1415", "OpStore %dv %double_3_14159265358979", "OpReturn", "OpFunctionEnd", @@ -4194,7 +4194,7 @@ { /* .used_consts = */ { - "%used_const_float = OpConstant %float 3.14", + "%used_const_float = OpConstant %float 3.1415", }, /* .main_insts = */ { @@ -4203,11 +4203,11 @@ }, /* .dead_consts = */ { - "%dead_const_float = OpConstant %float 3.14", + "%dead_const_float = OpConstant %float 3.1415", }, /* .checks = */ { - "; CHECK: [[const:%\\w+]] = OpConstant %float 3.14", + "; CHECK: [[const:%\\w+]] = OpConstant %float 3.1415", "; CHECK-NOT: OpConstant", "; CHECK: OpStore {{%\\w+}} [[const]]", }, @@ -4306,7 +4306,7 @@ { /* .used_consts = */ { - "%used_float_x = OpConstant %float 3.14", + "%used_float_x = OpConstant %float 3.1415", "%used_float_y = OpConstant %float 4.13", "%used_v2float = OpConstantComposite %v2float %used_float_x %used_float_y", }, @@ -4317,13 +4317,13 @@ }, /* .dead_consts = */ { - "%dead_float_x = OpConstant %float 3.14", + "%dead_float_x = OpConstant %float 3.1415", "%dead_float_y = OpConstant %float 4.13", "%dead_v2float = OpConstantComposite %v2float %dead_float_x %dead_float_y", }, /* .checks = */ { - "; CHECK: [[constx:%\\w+]] = OpConstant %float 3.14", + "; CHECK: [[constx:%\\w+]] = OpConstant %float 3.1415", "; CHECK: [[consty:%\\w+]] = OpConstant %float 4.13", "; CHECK: [[const:%\\w+]] = OpConstantComposite %v2float [[constx]] [[consty]]", "; CHECK-NOT: OpConstant", @@ -4336,9 +4336,9 @@ { /* .used_consts = */ { - "%used_float_x = OpConstant %float 3.14", - "%used_float_y = OpConstant %float 4.13", - "%used_float_z = OpConstant %float 4.31", + "%used_float_x = OpConstant %float 3.1415", + "%used_float_y = OpConstant %float 4.25", + "%used_float_z = OpConstant %float 4.75", "%used_v3float = OpConstantComposite %v3float %used_float_x %used_float_y %used_float_z", }, /* .main_insts = */ @@ -4352,9 +4352,9 @@ }, /* .checks = */ { - "; CHECK: [[constx:%\\w+]] = OpConstant %float 3.14", - "; CHECK: [[consty:%\\w+]] = OpConstant %float 4.13", - "; CHECK: [[constz:%\\w+]] = OpConstant %float 4.31", + "; CHECK: [[constx:%\\w+]] = OpConstant %float 3.1415", + "; CHECK: [[consty:%\\w+]] = OpConstant %float 4.25", + "; CHECK: [[constz:%\\w+]] = OpConstant %float 4.75", "; CHECK: [[const:%\\w+]] = OpConstantComposite %v3float [[constx]] [[consty]]", "; CHECK-NOT: OpConstant", "; CHECK: OpStore {{%\\w+}} [[const]]", @@ -5176,6 +5176,31 @@ SinglePassRunAndMatch(text, true); } + +// Test for #1404 +TEST_F(AggressiveDCETest, DontRemoveWorkgroupSize) { + const std::string text = R"( +; CHECK: OpDecorate [[wgs:%\w+]] BuiltIn WorkgroupSize +; CHECK: [[wgs]] = OpSpecConstantComposite +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %func "func" +OpExecutionMode %func LocalSize 1 1 1 +OpDecorate %1 BuiltIn WorkgroupSize +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%functy = OpTypeFunction %void +%v3int = OpTypeVector %int 3 +%2 = OpSpecConstant %int 1 +%1 = OpSpecConstantComposite %v3int %2 %2 %2 +%func = OpFunction %void None %functy +%3 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} #endif // SPIRV_EFFCEE // Test for #1214 @@ -5339,6 +5364,47 @@ OpReturn OpFunctionEnd )"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck(text, text, true, true); +} + +TEST_F(AggressiveDCETest, AtomicAdd) { + const std::string text = R"(OpCapability SampledBuffer +OpCapability StorageImageExtendedFormats +OpCapability ImageBuffer +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %2 "min" %gl_GlobalInvocationID +OpExecutionMode %2 LocalSize 64 1 1 +OpSource HLSL 600 +OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId +OpDecorate %4 DescriptorSet 4 +OpDecorate %4 Binding 70 +%uint = OpTypeInt 32 0 +%6 = OpTypeImage %uint Buffer 0 0 0 2 R32ui +%_ptr_UniformConstant_6 = OpTypePointer UniformConstant %6 +%_ptr_Private_6 = OpTypePointer Private %6 +%void = OpTypeVoid +%10 = OpTypeFunction %void +%uint_0 = OpConstant %uint 0 +%uint_1 = OpConstant %uint 1 +%v3uint = OpTypeVector %uint 3 +%_ptr_Input_v3uint = OpTypePointer Input %v3uint +%_ptr_Image_uint = OpTypePointer Image %uint +%4 = OpVariable %_ptr_UniformConstant_6 UniformConstant +%16 = OpVariable %_ptr_Private_6 Private +%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input +%2 = OpFunction %void None %10 +%17 = OpLabel +%18 = OpLoad %6 %4 +OpStore %16 %18 +%19 = OpImageTexelPointer %_ptr_Image_uint %16 %uint_0 %uint_0 +%20 = OpAtomicIAdd %uint %19 %uint_1 %uint_0 %uint_1 +OpReturn +OpFunctionEnd +)"; SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); SinglePassRunAndCheck(text, text, true, true); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/assembly_builder_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/assembly_builder_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/assembly_builder_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/assembly_builder_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -66,7 +66,7 @@ "%ui = OpConstant %uint 2", "%float = OpTypeFloat 32", "%_PF_float = OpTypePointer Function %float", - "%f = OpConstant %float 3.14", + "%f = OpConstant %float 3.1415", "%double = OpTypeFloat 64", "%_PF_double = OpTypePointer Function %double", "%d = OpConstant %double 3.14159265358979", @@ -136,7 +136,7 @@ "%ui = OpConstant %uint 2", "%float = OpTypeFloat 32", "%_PF_float = OpTypePointer Function %float", - "%f = OpConstant %float 3.14", + "%f = OpConstant %float 3.1415", "%double = OpTypeFloat 64", "%_PF_double = OpTypePointer Function %double", "%d = OpConstant %double 3.14159265358979", @@ -177,8 +177,8 @@ "%spec_false = OpSpecConstantFalse %bool", "%spec_uint = OpSpecConstant %uint 1", "%spec_int = OpSpecConstant %int 1", - "%spec_float = OpSpecConstant %float 1.2", - "%spec_double = OpSpecConstant %double 1.23456789", + "%spec_float = OpSpecConstant %float 1.25", + "%spec_double = OpSpecConstant %double 1.2345678", // Spec constants defined below should not have SpecID. "%spec_add_op = OpSpecConstantOp %int IAdd %spec_int %spec_int", @@ -229,8 +229,8 @@ "%spec_false = OpSpecConstantFalse %bool", "%spec_uint = OpSpecConstant %uint 1", "%spec_int = OpSpecConstant %int 1", - "%spec_float = OpSpecConstant %float 1.2", - "%spec_double = OpSpecConstant %double 1.23456789", + "%spec_float = OpSpecConstant %float 1.25", + "%spec_double = OpSpecConstant %double 1.2345678", "%spec_add_op = OpSpecConstantOp %int IAdd %spec_int %spec_int", "%spec_vec = OpSpecConstantComposite %v2int %spec_int %spec_int", "%spec_vec_x = OpSpecConstantOp %int CompositeExtract %spec_vec 0", diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/block_merge_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/block_merge_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/block_merge_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/block_merge_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -518,6 +518,177 @@ SinglePassRunAndMatch(assembly, true); } + +TEST_F(BlockMergeTest, DontMergeKill) { + const std::string text = R"( +; CHECK: OpLoopMerge [[merge:%\w+]] [[cont:%\w+]] None +; CHECK-NEXT: OpBranch [[ret:%\w+]] +; CHECK: [[ret:%\w+]] = OpLabel +; CHECK-NEXT: OpKill +; CHECK-DAG: [[cont]] = OpLabel +; CHECK-DAG: [[merge]] = OpLabel +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +%void = OpTypeVoid +%bool = OpTypeBool +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpBranch %2 +%2 = OpLabel +OpLoopMerge %3 %4 None +OpBranch %5 +%5 = OpLabel +OpKill +%4 = OpLabel +OpBranch %2 +%3 = OpLabel +OpUnreachable +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(BlockMergeTest, DontMergeUnreachable) { + const std::string text = R"( +; CHECK: OpLoopMerge [[merge:%\w+]] [[cont:%\w+]] None +; CHECK-NEXT: OpBranch [[ret:%\w+]] +; CHECK: [[ret:%\w+]] = OpLabel +; CHECK-NEXT: OpUnreachable +; CHECK-DAG: [[cont]] = OpLabel +; CHECK-DAG: [[merge]] = OpLabel +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +%void = OpTypeVoid +%bool = OpTypeBool +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpBranch %2 +%2 = OpLabel +OpLoopMerge %3 %4 None +OpBranch %5 +%5 = OpLabel +OpUnreachable +%4 = OpLabel +OpBranch %2 +%3 = OpLabel +OpUnreachable +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(BlockMergeTest, DontMergeReturn) { + const std::string text = R"( +; CHECK: OpLoopMerge [[merge:%\w+]] [[cont:%\w+]] None +; CHECK-NEXT: OpBranch [[ret:%\w+]] +; CHECK: [[ret:%\w+]] = OpLabel +; CHECK-NEXT: OpReturn +; CHECK-DAG: [[cont]] = OpLabel +; CHECK-DAG: [[merge]] = OpLabel +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +%void = OpTypeVoid +%bool = OpTypeBool +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpBranch %2 +%2 = OpLabel +OpLoopMerge %3 %4 None +OpBranch %5 +%5 = OpLabel +OpReturn +%4 = OpLabel +OpBranch %2 +%3 = OpLabel +OpUnreachable +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(BlockMergeTest, DontMergeSwitch) { + const std::string text = R"( +; CHECK: OpLoopMerge [[merge:%\w+]] [[cont:%\w+]] None +; CHECK-NEXT: OpBranch [[ret:%\w+]] +; CHECK: [[ret:%\w+]] = OpLabel +; CHECK-NEXT: OpSwitch +; CHECK-DAG: [[cont]] = OpLabel +; CHECK-DAG: [[merge]] = OpLabel +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +%void = OpTypeVoid +%bool = OpTypeBool +%int = OpTypeInt 32 1 +%int_0 = OpConstant %int 0 +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpBranch %2 +%2 = OpLabel +OpLoopMerge %3 %4 None +OpBranch %5 +%5 = OpLabel +OpSwitch %int_0 %6 +%6 = OpLabel +OpReturn +%4 = OpLabel +OpBranch %2 +%3 = OpLabel +OpUnreachable +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(BlockMergeTest, DontMergeReturnValue) { + const std::string text = R"( +; CHECK: OpLoopMerge [[merge:%\w+]] [[cont:%\w+]] None +; CHECK-NEXT: OpBranch [[ret:%\w+]] +; CHECK: [[ret:%\w+]] = OpLabel +; CHECK-NEXT: OpReturn +; CHECK-DAG: [[cont]] = OpLabel +; CHECK-DAG: [[merge]] = OpLabel +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +%void = OpTypeVoid +%bool = OpTypeBool +%functy = OpTypeFunction %void +%otherfuncty = OpTypeFunction %bool +%true = OpConstantTrue %bool +%func = OpFunction %void None %functy +%1 = OpLabel +%2 = OpFunctionCall %bool %3 +OpReturn +OpFunctionEnd +%3 = OpFunction %bool None %otherfuncty +%4 = OpLabel +OpBranch %5 +%5 = OpLabel +OpLoopMerge %6 %7 None +OpBranch %8 +%8 = OpLabel +OpReturnValue %true +%7 = OpLabel +OpBranch %5 +%6 = OpLabel +OpUnreachable +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} #endif // SPIRV_EFFCEE // TODO(greg-lunarg): Add tests to verify handling of these cases: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/ccp_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/ccp_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/ccp_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/ccp_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -458,14 +458,15 @@ %22 = OpIAdd %int %29 %30 OpBranch %14 %14 = OpLabel -; CHECK: OpPhi %int %int_0 {{%\d+}} %int_0 {{%\d+}} - %25 = OpPhi %int %int_0 %5 %30 %14 +; CHECK: OpPhi %int %int_0 {{%\d+}} + %25 = OpPhi %int %30 %12 OpBranch %11 %13 = OpLabel OpReturn OpFunctionEnd )"; + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); SinglePassRunAndMatch(spv_asm, true); } @@ -641,6 +642,254 @@ auto res = SinglePassRunToBinary(text, true); EXPECT_EQ(std::get<1>(res), opt::Pass::Status::SuccessWithoutChange); } + +TEST_F(CCPTest, UndefInPhi) { + const std::string text = R"( +; CHECK: [[uint1:%\w+]] = OpConstant {{%\w+}} 1 +; CHECK: [[phi:%\w+]] = OpPhi +; CHECK: OpIAdd {{%\w+}} [[phi]] [[uint1]] + OpCapability Kernel + OpCapability Linkage + OpMemoryModel Logical OpenCL + OpDecorate %1 LinkageAttributes "func" Export + %void = OpTypeVoid + %bool = OpTypeBool + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %7 = OpUndef %uint + %8 = OpTypeFunction %void %bool + %1 = OpFunction %void None %8 + %9 = OpFunctionParameter %bool + %10 = OpLabel + OpBranchConditional %9 %11 %12 + %11 = OpLabel + OpBranch %13 + %12 = OpLabel + OpBranch %14 + %14 = OpLabel + OpBranchConditional %9 %13 %15 + %15 = OpLabel + OpBranch %13 + %13 = OpLabel + %16 = OpPhi %uint %uint_0 %11 %7 %14 %uint_1 %15 + %17 = OpIAdd %uint %16 %uint_1 + OpReturn + OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +// Just test to make sure the constant fold rules are being used. Will rely on +// the folding test for specific testing of specific rules. +TEST_F(CCPTest, UseConstantFoldingRules) { + const std::string text = R"( +; CHECK: [[float1:%\w+]] = OpConstant {{%\w+}} 1 +; CHECK: OpReturnValue [[float1]] + OpCapability Shader + OpCapability Linkage + OpMemoryModel Logical GLSL450 + OpDecorate %1 LinkageAttributes "func" Export + %void = OpTypeVoid + %bool = OpTypeBool + %float = OpTypeFloat 32 + %float_0 = OpConstant %float 0 + %float_1 = OpConstant %float 1 + %8 = OpTypeFunction %float + %1 = OpFunction %float None %8 + %10 = OpLabel + %17 = OpFAdd %float %float_0 %float_1 + OpReturnValue %17 + OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +// Test for #1300. Previously value for %5 would not settle during simulation. +TEST_F(CCPTest, SettlePhiLatticeValue) { + const std::string text = R"( +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical OpenCL +OpDecorate %func LinkageAttributes "func" Export +%void = OpTypeVoid +%bool = OpTypeBool +%true = OpConstantTrue %bool +%false = OpConstantFalse %bool +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpBranchConditional %true %2 %3 +%3 = OpLabel +OpBranch %2 +%2 = OpLabel +%5 = OpPhi %bool %true %1 %false %3 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunToBinary(text, true); +} + +TEST_F(CCPTest, NullBranchCondition) { + const std::string text = R"( +; CHECK: [[int1:%\w+]] = OpConstant {{%\w+}} 1 +; CHECK: [[int2:%\w+]] = OpConstant {{%\w+}} 2 +; CHECK: OpIAdd {{%\w+}} [[int1]] [[int2]] +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +%void = OpTypeVoid +%bool = OpTypeBool +%int = OpTypeInt 32 1 +%null = OpConstantNull %bool +%int_1 = OpConstant %int 1 +%int_2 = OpConstant %int 2 +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpSelectionMerge %2 None +OpBranchConditional %null %2 %3 +%3 = OpLabel +OpBranch %2 +%2 = OpLabel +%phi = OpPhi %int %int_1 %1 %int_2 %3 +%add = OpIAdd %int %int_1 %phi +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(CCPTest, UndefBranchCondition) { + const std::string text = R"( +; CHECK: [[int1:%\w+]] = OpConstant {{%\w+}} 1 +; CHECK: [[phi:%\w+]] = OpPhi +; CHECK: OpIAdd {{%\w+}} [[int1]] [[phi]] +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +%void = OpTypeVoid +%bool = OpTypeBool +%int = OpTypeInt 32 1 +%undef = OpUndef %bool +%int_1 = OpConstant %int 1 +%int_2 = OpConstant %int 2 +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpSelectionMerge %2 None +OpBranchConditional %undef %2 %3 +%3 = OpLabel +OpBranch %2 +%2 = OpLabel +%phi = OpPhi %int %int_1 %1 %int_2 %3 +%add = OpIAdd %int %int_1 %phi +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(CCPTest, NullSwitchCondition) { + const std::string text = R"( +; CHECK: [[int1:%\w+]] = OpConstant {{%\w+}} 1 +; CHECK: [[int2:%\w+]] = OpConstant {{%\w+}} 2 +; CHECK: OpIAdd {{%\w+}} [[int1]] [[int2]] +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +%void = OpTypeVoid +%int = OpTypeInt 32 1 +%null = OpConstantNull %int +%int_1 = OpConstant %int 1 +%int_2 = OpConstant %int 2 +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpSelectionMerge %2 None +OpSwitch %null %2 0 %3 +%3 = OpLabel +OpBranch %2 +%2 = OpLabel +%phi = OpPhi %int %int_1 %1 %int_2 %3 +%add = OpIAdd %int %int_1 %phi +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(CCPTest, UndefSwitchCondition) { + const std::string text = R"( +; CHECK: [[int1:%\w+]] = OpConstant {{%\w+}} 1 +; CHECK: [[phi:%\w+]] = OpPhi +; CHECK: OpIAdd {{%\w+}} [[int1]] [[phi]] +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +%void = OpTypeVoid +%int = OpTypeInt 32 1 +%undef = OpUndef %int +%int_1 = OpConstant %int 1 +%int_2 = OpConstant %int 2 +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpSelectionMerge %2 None +OpSwitch %undef %2 0 %3 +%3 = OpLabel +OpBranch %2 +%2 = OpLabel +%phi = OpPhi %int %int_1 %1 %int_2 %3 +%add = OpIAdd %int %int_1 %phi +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +// Test for #1361. +TEST_F(CCPTest, CompositeConstructOfGlobalValue) { + const std::string text = R"( +; CHECK: [[phi:%\w+]] = OpPhi +; CHECK-NEXT: OpCompositeExtract {{%\w+}} [[phi]] 0 +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" %in +%void = OpTypeVoid +%int = OpTypeInt 32 1 +%bool = OpTypeBool +%functy = OpTypeFunction %void +%ptr_int_Input = OpTypePointer Input %int +%in = OpVariable %ptr_int_Input Input +%struct = OpTypeStruct %ptr_int_Input %ptr_int_Input +%struct_null = OpConstantNull %struct +%func = OpFunction %void None %functy +%1 = OpLabel +OpBranch %2 +%2 = OpLabel +%phi = OpPhi %struct %struct_null %1 %5 %4 +%extract = OpCompositeExtract %ptr_int_Input %phi 0 +OpLoopMerge %3 %4 None +OpBranch %4 +%4 = OpLabel +%5 = OpCompositeConstruct %struct %in %in +OpBranch %2 +%3 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} #endif } // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/cfg_cleanup_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/cfg_cleanup_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/cfg_cleanup_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/cfg_cleanup_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -307,7 +307,7 @@ OpStore %outparm %int_15 OpBranch %16 %16 = OpLabel - %30 = OpPhi %int %11 %41 %int_42 %13 %11 %14 %11 %15 + %30 = OpPhi %int %11 %40 %int_42 %13 %11 %14 %11 %15 %28 = OpIAdd %int %30 %int_5 OpStore %outparm %28 OpReturn @@ -352,7 +352,7 @@ OpStore %outparm %int_15 OpBranch %20 %20 = OpLabel -%24 = OpPhi %int %int_42 %21 %26 %22 %26 %23 +%24 = OpPhi %int %26 %16 %int_42 %21 %26 %22 %26 %23 %25 = OpIAdd %int %24 %int_5 OpStore %outparm %25 OpReturn diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/CMakeLists.txt 2018-04-27 11:46:32.000000000 +0000 @@ -46,6 +46,11 @@ LIBS SPIRV-Tools-opt ) +add_spvtools_unittest(TARGET pass_strip_reflect_info + SRCS strip_reflect_info_test.cpp pass_utils.cpp + LIBS SPIRV-Tools-opt +) + add_spvtools_unittest(TARGET pass_compact_ids SRCS compact_ids_test.cpp pass_utils.cpp LIBS SPIRV-Tools-opt @@ -291,3 +296,18 @@ SRCS replace_invalid_opc_test.cpp pass_utils.cpp LIBS SPIRV-Tools-opt ) + +add_spvtools_unittest(TARGET simplification + SRCS simplification_test.cpp pass_utils.cpp + LIBS SPIRV-Tools-opt +) +add_spvtools_unittest(TARGET copy_prop_array + SRCS copy_prop_array_test.cpp pass_utils.cpp + LIBS SPIRV-Tools-opt +) + +add_spvtools_unittest(TARGET scalar_analysis + SRCS scalar_analysis.cpp pass_utils.cpp + LIBS SPIRV-Tools-opt +) + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/copy_prop_array_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/copy_prop_array_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/copy_prop_array_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/copy_prop_array_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,1184 @@ +// Copyright (c) 2018 Google LLC +// +// 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. + +#include + +#include + +#include "assembly_builder.h" +#include "pass_fixture.h" + +namespace { + +using namespace spvtools; +using ir::Instruction; +using ir::IRContext; +using opt::PassManager; + +using CopyPropArrayPassTest = PassTest<::testing::Test>; + +#ifdef SPIRV_EFFCEE +TEST_F(CopyPropArrayPassTest, BasicPropagateArray) { + const std::string before = + R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 600 +OpName %type_MyCBuffer "type.MyCBuffer" +OpMemberName %type_MyCBuffer 0 "Data" +OpName %MyCBuffer "MyCBuffer" +OpName %main "main" +OpName %in_var_INDEX "in.var.INDEX" +OpName %out_var_SV_Target "out.var.SV_Target" +OpDecorate %_arr_v4float_uint_8 ArrayStride 16 +OpMemberDecorate %type_MyCBuffer 0 Offset 0 +OpDecorate %type_MyCBuffer Block +OpDecorate %in_var_INDEX Flat +OpDecorate %in_var_INDEX Location 0 +OpDecorate %out_var_SV_Target Location 0 +OpDecorate %MyCBuffer DescriptorSet 0 +OpDecorate %MyCBuffer Binding 0 +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_8 = OpConstant %uint 8 +%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8 +%type_MyCBuffer = OpTypeStruct %_arr_v4float_uint_8 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer +%void = OpTypeVoid +%13 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v4float_uint_8_0 = OpTypeArray %v4float %uint_8 +%_ptr_Function__arr_v4float_uint_8_0 = OpTypePointer Function %_arr_v4float_uint_8_0 +%int_0 = OpConstant %int 0 +%_ptr_Uniform__arr_v4float_uint_8 = OpTypePointer Uniform %_arr_v4float_uint_8 +%_ptr_Function_v4float = OpTypePointer Function %v4float +%MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output +; CHECK: OpFunction +; CHECK: OpLabel +; CHECK: OpVariable +; CHECK: OpAccessChain +; CHECK: [[new_address:%\w+]] = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +; CHECK: [[element_ptr:%\w+]] = OpAccessChain %_ptr_Uniform_v4float [[new_address]] %24 +; CHECK: [[load:%\w+]] = OpLoad %v4float [[element_ptr]] +; CHECK: OpStore %out_var_SV_Target [[load]] +%main = OpFunction %void None %13 +%22 = OpLabel +%23 = OpVariable %_ptr_Function__arr_v4float_uint_8_0 Function +%24 = OpLoad %int %in_var_INDEX +%25 = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +%26 = OpLoad %_arr_v4float_uint_8 %25 +%27 = OpCompositeExtract %v4float %26 0 +%28 = OpCompositeExtract %v4float %26 1 +%29 = OpCompositeExtract %v4float %26 2 +%30 = OpCompositeExtract %v4float %26 3 +%31 = OpCompositeExtract %v4float %26 4 +%32 = OpCompositeExtract %v4float %26 5 +%33 = OpCompositeExtract %v4float %26 6 +%34 = OpCompositeExtract %v4float %26 7 +%35 = OpCompositeConstruct %_arr_v4float_uint_8_0 %27 %28 %29 %30 %31 %32 %33 %34 +OpStore %23 %35 +%36 = OpAccessChain %_ptr_Function_v4float %23 %24 +%37 = OpLoad %v4float %36 +OpStore %out_var_SV_Target %37 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + SinglePassRunAndMatch(before, false); +} + +TEST_F(CopyPropArrayPassTest, BasicPropagateArrayWithName) { + const std::string before = + R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 600 +OpName %type_MyCBuffer "type.MyCBuffer" +OpMemberName %type_MyCBuffer 0 "Data" +OpName %MyCBuffer "MyCBuffer" +OpName %main "main" +OpName %local "local" +OpName %in_var_INDEX "in.var.INDEX" +OpName %out_var_SV_Target "out.var.SV_Target" +OpDecorate %_arr_v4float_uint_8 ArrayStride 16 +OpMemberDecorate %type_MyCBuffer 0 Offset 0 +OpDecorate %type_MyCBuffer Block +OpDecorate %in_var_INDEX Flat +OpDecorate %in_var_INDEX Location 0 +OpDecorate %out_var_SV_Target Location 0 +OpDecorate %MyCBuffer DescriptorSet 0 +OpDecorate %MyCBuffer Binding 0 +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_8 = OpConstant %uint 8 +%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8 +%type_MyCBuffer = OpTypeStruct %_arr_v4float_uint_8 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer +%void = OpTypeVoid +%13 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v4float_uint_8_0 = OpTypeArray %v4float %uint_8 +%_ptr_Function__arr_v4float_uint_8_0 = OpTypePointer Function %_arr_v4float_uint_8_0 +%int_0 = OpConstant %int 0 +%_ptr_Uniform__arr_v4float_uint_8 = OpTypePointer Uniform %_arr_v4float_uint_8 +%_ptr_Function_v4float = OpTypePointer Function %v4float +%MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output +; CHECK: OpFunction +; CHECK: OpLabel +; CHECK: OpVariable +; CHECK: OpAccessChain +; CHECK: [[new_address:%\w+]] = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +; CHECK: [[element_ptr:%\w+]] = OpAccessChain %_ptr_Uniform_v4float [[new_address]] %24 +; CHECK: [[load:%\w+]] = OpLoad %v4float [[element_ptr]] +; CHECK: OpStore %out_var_SV_Target [[load]] +%main = OpFunction %void None %13 +%22 = OpLabel +%local = OpVariable %_ptr_Function__arr_v4float_uint_8_0 Function +%24 = OpLoad %int %in_var_INDEX +%25 = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +%26 = OpLoad %_arr_v4float_uint_8 %25 +%27 = OpCompositeExtract %v4float %26 0 +%28 = OpCompositeExtract %v4float %26 1 +%29 = OpCompositeExtract %v4float %26 2 +%30 = OpCompositeExtract %v4float %26 3 +%31 = OpCompositeExtract %v4float %26 4 +%32 = OpCompositeExtract %v4float %26 5 +%33 = OpCompositeExtract %v4float %26 6 +%34 = OpCompositeExtract %v4float %26 7 +%35 = OpCompositeConstruct %_arr_v4float_uint_8_0 %27 %28 %29 %30 %31 %32 %33 %34 +OpStore %local %35 +%36 = OpAccessChain %_ptr_Function_v4float %local %24 +%37 = OpLoad %v4float %36 +OpStore %out_var_SV_Target %37 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + SinglePassRunAndMatch(before, false); +} + +// Propagate 2d array. This test identifing a copy through multiple levels. +// Also has to traverse multiple OpAccessChains. +TEST_F(CopyPropArrayPassTest, Propagate2DArray) { + const std::string text = + R"(OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 600 +OpName %type_MyCBuffer "type.MyCBuffer" +OpMemberName %type_MyCBuffer 0 "Data" +OpName %MyCBuffer "MyCBuffer" +OpName %main "main" +OpName %in_var_INDEX "in.var.INDEX" +OpName %out_var_SV_Target "out.var.SV_Target" +OpDecorate %_arr_v4float_uint_2 ArrayStride 16 +OpDecorate %_arr__arr_v4float_uint_2_uint_2 ArrayStride 32 +OpMemberDecorate %type_MyCBuffer 0 Offset 0 +OpDecorate %type_MyCBuffer Block +OpDecorate %in_var_INDEX Flat +OpDecorate %in_var_INDEX Location 0 +OpDecorate %out_var_SV_Target Location 0 +OpDecorate %MyCBuffer DescriptorSet 0 +OpDecorate %MyCBuffer Binding 0 +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_2 = OpConstant %uint 2 +%_arr_v4float_uint_2 = OpTypeArray %v4float %uint_2 +%_arr__arr_v4float_uint_2_uint_2 = OpTypeArray %_arr_v4float_uint_2 %uint_2 +%type_MyCBuffer = OpTypeStruct %_arr__arr_v4float_uint_2_uint_2 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer +%void = OpTypeVoid +%14 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v4float_uint_2_0 = OpTypeArray %v4float %uint_2 +%_arr__arr_v4float_uint_2_0_uint_2 = OpTypeArray %_arr_v4float_uint_2_0 %uint_2 +%_ptr_Function__arr__arr_v4float_uint_2_0_uint_2 = OpTypePointer Function %_arr__arr_v4float_uint_2_0_uint_2 +%int_0 = OpConstant %int 0 +%_ptr_Uniform__arr__arr_v4float_uint_2_uint_2 = OpTypePointer Uniform %_arr__arr_v4float_uint_2_uint_2 +%_ptr_Function__arr_v4float_uint_2_0 = OpTypePointer Function %_arr_v4float_uint_2_0 +%_ptr_Function_v4float = OpTypePointer Function %v4float +%MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output +; CHECK: OpFunction +; CHECK: OpLabel +; CHECK: OpVariable +; CHECK: OpVariable +; CHECK: OpAccessChain +; CHECK: [[new_address:%\w+]] = OpAccessChain %_ptr_Uniform__arr__arr_v4float_uint_2_uint_2 %MyCBuffer %int_0 +%main = OpFunction %void None %14 +%25 = OpLabel +%26 = OpVariable %_ptr_Function__arr_v4float_uint_2_0 Function +%27 = OpVariable %_ptr_Function__arr__arr_v4float_uint_2_0_uint_2 Function +%28 = OpLoad %int %in_var_INDEX +%29 = OpAccessChain %_ptr_Uniform__arr__arr_v4float_uint_2_uint_2 %MyCBuffer %int_0 +%30 = OpLoad %_arr__arr_v4float_uint_2_uint_2 %29 +%31 = OpCompositeExtract %_arr_v4float_uint_2 %30 0 +%32 = OpCompositeExtract %v4float %31 0 +%33 = OpCompositeExtract %v4float %31 1 +%34 = OpCompositeConstruct %_arr_v4float_uint_2_0 %32 %33 +%35 = OpCompositeExtract %_arr_v4float_uint_2 %30 1 +%36 = OpCompositeExtract %v4float %35 0 +%37 = OpCompositeExtract %v4float %35 1 +%38 = OpCompositeConstruct %_arr_v4float_uint_2_0 %36 %37 +%39 = OpCompositeConstruct %_arr__arr_v4float_uint_2_0_uint_2 %34 %38 +; CHECK: OpStore +OpStore %27 %39 +%40 = OpAccessChain %_ptr_Function__arr_v4float_uint_2_0 %27 %28 +%42 = OpAccessChain %_ptr_Function_v4float %40 %28 +%43 = OpLoad %v4float %42 +; CHECK: [[ac1:%\w+]] = OpAccessChain %_ptr_Uniform__arr_v4float_uint_2 [[new_address]] %28 +; CHECK: [[ac2:%\w+]] = OpAccessChain %_ptr_Uniform_v4float [[ac1]] %28 +; CHECK: [[load:%\w+]] = OpLoad %v4float [[ac2]] +; CHECK: OpStore %out_var_SV_Target [[load]] +OpStore %out_var_SV_Target %43 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + SinglePassRunAndMatch(text, false); +} + +// Test decomposing an object when we need to "rewrite" a store. +TEST_F(CopyPropArrayPassTest, DecomposeObjectForArrayStore) { + const std::string text = + R"( OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target + OpExecutionMode %main OriginUpperLeft + OpSource HLSL 600 + OpName %type_MyCBuffer "type.MyCBuffer" + OpMemberName %type_MyCBuffer 0 "Data" + OpName %MyCBuffer "MyCBuffer" + OpName %main "main" + OpName %in_var_INDEX "in.var.INDEX" + OpName %out_var_SV_Target "out.var.SV_Target" + OpDecorate %_arr_v4float_uint_2 ArrayStride 16 + OpDecorate %_arr__arr_v4float_uint_2_uint_2 ArrayStride 32 + OpMemberDecorate %type_MyCBuffer 0 Offset 0 + OpDecorate %type_MyCBuffer Block + OpDecorate %in_var_INDEX Flat + OpDecorate %in_var_INDEX Location 0 + OpDecorate %out_var_SV_Target Location 0 + OpDecorate %MyCBuffer DescriptorSet 0 + OpDecorate %MyCBuffer Binding 0 + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 + %uint = OpTypeInt 32 0 + %uint_2 = OpConstant %uint 2 +%_arr_v4float_uint_2 = OpTypeArray %v4float %uint_2 +%_arr__arr_v4float_uint_2_uint_2 = OpTypeArray %_arr_v4float_uint_2 %uint_2 +%type_MyCBuffer = OpTypeStruct %_arr__arr_v4float_uint_2_uint_2 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer + %void = OpTypeVoid + %14 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v4float_uint_2_0 = OpTypeArray %v4float %uint_2 +%_arr__arr_v4float_uint_2_0_uint_2 = OpTypeArray %_arr_v4float_uint_2_0 %uint_2 +%_ptr_Function__arr__arr_v4float_uint_2_0_uint_2 = OpTypePointer Function %_arr__arr_v4float_uint_2_0_uint_2 + %int_0 = OpConstant %int 0 +%_ptr_Uniform__arr__arr_v4float_uint_2_uint_2 = OpTypePointer Uniform %_arr__arr_v4float_uint_2_uint_2 +%_ptr_Function__arr_v4float_uint_2_0 = OpTypePointer Function %_arr_v4float_uint_2_0 +%_ptr_Function_v4float = OpTypePointer Function %v4float + %MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output + %main = OpFunction %void None %14 + %25 = OpLabel + %26 = OpVariable %_ptr_Function__arr_v4float_uint_2_0 Function + %27 = OpVariable %_ptr_Function__arr__arr_v4float_uint_2_0_uint_2 Function + %28 = OpLoad %int %in_var_INDEX + %29 = OpAccessChain %_ptr_Uniform__arr__arr_v4float_uint_2_uint_2 %MyCBuffer %int_0 + %30 = OpLoad %_arr__arr_v4float_uint_2_uint_2 %29 + %31 = OpCompositeExtract %_arr_v4float_uint_2 %30 0 + %32 = OpCompositeExtract %v4float %31 0 + %33 = OpCompositeExtract %v4float %31 1 + %34 = OpCompositeConstruct %_arr_v4float_uint_2_0 %32 %33 + %35 = OpCompositeExtract %_arr_v4float_uint_2 %30 1 + %36 = OpCompositeExtract %v4float %35 0 + %37 = OpCompositeExtract %v4float %35 1 + %38 = OpCompositeConstruct %_arr_v4float_uint_2_0 %36 %37 + %39 = OpCompositeConstruct %_arr__arr_v4float_uint_2_0_uint_2 %34 %38 + OpStore %27 %39 +; CHECK: [[access_chain:%\w+]] = OpAccessChain %_ptr_Uniform__arr_v4float_uint_2 + %40 = OpAccessChain %_ptr_Function__arr_v4float_uint_2_0 %27 %28 +; CHECK: [[load:%\w+]] = OpLoad %_arr_v4float_uint_2 [[access_chain]] + %41 = OpLoad %_arr_v4float_uint_2_0 %40 +; CHECK: [[extract1:%\w+]] = OpCompositeExtract %v4float [[load]] 0 +; CHECK: [[extract2:%\w+]] = OpCompositeExtract %v4float [[load]] 1 +; CHECK: [[construct:%\w+]] = OpCompositeConstruct %_arr_v4float_uint_2_0 [[extract1]] [[extract2]] +; CHEKC: OpStore %26 [[construct]] + OpStore %26 %41 + %42 = OpAccessChain %_ptr_Function_v4float %26 %28 + %43 = OpLoad %v4float %42 + OpStore %out_var_SV_Target %43 + OpReturn + OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + SinglePassRunAndMatch(text, false); +} + +// Test decomposing an object when we need to "rewrite" a store. +TEST_F(CopyPropArrayPassTest, DecomposeObjectForStructStore) { + const std::string text = + R"( OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target + OpExecutionMode %main OriginUpperLeft + OpSource HLSL 600 + OpName %type_MyCBuffer "type.MyCBuffer" + OpMemberName %type_MyCBuffer 0 "Data" + OpName %MyCBuffer "MyCBuffer" + OpName %main "main" + OpName %in_var_INDEX "in.var.INDEX" + OpName %out_var_SV_Target "out.var.SV_Target" + OpMemberDecorate %type_MyCBuffer 0 Offset 0 + OpDecorate %type_MyCBuffer Block + OpDecorate %in_var_INDEX Flat + OpDecorate %in_var_INDEX Location 0 + OpDecorate %out_var_SV_Target Location 0 + OpDecorate %MyCBuffer DescriptorSet 0 + OpDecorate %MyCBuffer Binding 0 +; CHECK: OpDecorate [[decorated_type:%\w+]] GLSLPacked + OpDecorate %struct GLSLPacked + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 + %uint = OpTypeInt 32 0 + %uint_2 = OpConstant %uint 2 +; CHECK: [[decorated_type]] = OpTypeStruct +%struct = OpTypeStruct %float %uint +%_arr_struct_uint_2 = OpTypeArray %struct %uint_2 +%type_MyCBuffer = OpTypeStruct %_arr_struct_uint_2 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer + %void = OpTypeVoid + %14 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +; CHECK: [[struct:%\w+]] = OpTypeStruct %float %uint +%struct_0 = OpTypeStruct %float %uint +%_arr_struct_0_uint_2 = OpTypeArray %struct_0 %uint_2 +%_ptr_Function__arr_struct_0_uint_2 = OpTypePointer Function %_arr_struct_0_uint_2 + %int_0 = OpConstant %int 0 +%_ptr_Uniform__arr_struct_uint_2 = OpTypePointer Uniform %_arr_struct_uint_2 +; CHECK: [[decorated_ptr:%\w+]] = OpTypePointer Uniform [[decorated_type]] +%_ptr_Function_struct_0 = OpTypePointer Function %struct_0 +%_ptr_Function_v4float = OpTypePointer Function %v4float + %MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output + %main = OpFunction %void None %14 + %25 = OpLabel + %26 = OpVariable %_ptr_Function_struct_0 Function + %27 = OpVariable %_ptr_Function__arr_struct_0_uint_2 Function + %28 = OpLoad %int %in_var_INDEX + %29 = OpAccessChain %_ptr_Uniform__arr_struct_uint_2 %MyCBuffer %int_0 + %30 = OpLoad %_arr_struct_uint_2 %29 + %31 = OpCompositeExtract %struct %30 0 + %32 = OpCompositeExtract %v4float %31 0 + %33 = OpCompositeExtract %v4float %31 1 + %34 = OpCompositeConstruct %struct_0 %32 %33 + %35 = OpCompositeExtract %struct %30 1 + %36 = OpCompositeExtract %float %35 0 + %37 = OpCompositeExtract %uint %35 1 + %38 = OpCompositeConstruct %struct_0 %36 %37 + %39 = OpCompositeConstruct %_arr_struct_0_uint_2 %34 %38 + OpStore %27 %39 +; CHECK: [[access_chain:%\w+]] = OpAccessChain [[decorated_ptr]] + %40 = OpAccessChain %_ptr_Function_struct_0 %27 %28 +; CHECK: [[load:%\w+]] = OpLoad [[decorated_type]] [[access_chain]] + %41 = OpLoad %struct_0 %40 +; CHECK: [[extract1:%\w+]] = OpCompositeExtract %float [[load]] 0 +; CHECK: [[extract2:%\w+]] = OpCompositeExtract %uint [[load]] 1 +; CHECK: [[construct:%\w+]] = OpCompositeConstruct [[struct]] [[extract1]] [[extract2]] +; CHEKC: OpStore %26 [[construct]] + OpStore %26 %41 + %42 = OpAccessChain %_ptr_Function_v4float %26 %28 + %43 = OpLoad %v4float %42 + OpStore %out_var_SV_Target %43 + OpReturn + OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + SinglePassRunAndMatch(text, false); +} + +TEST_F(CopyPropArrayPassTest, CopyViaInserts) { + const std::string before = + R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 600 +OpName %type_MyCBuffer "type.MyCBuffer" +OpMemberName %type_MyCBuffer 0 "Data" +OpName %MyCBuffer "MyCBuffer" +OpName %main "main" +OpName %in_var_INDEX "in.var.INDEX" +OpName %out_var_SV_Target "out.var.SV_Target" +OpDecorate %_arr_v4float_uint_8 ArrayStride 16 +OpMemberDecorate %type_MyCBuffer 0 Offset 0 +OpDecorate %type_MyCBuffer Block +OpDecorate %in_var_INDEX Flat +OpDecorate %in_var_INDEX Location 0 +OpDecorate %out_var_SV_Target Location 0 +OpDecorate %MyCBuffer DescriptorSet 0 +OpDecorate %MyCBuffer Binding 0 +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_8 = OpConstant %uint 8 +%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8 +%type_MyCBuffer = OpTypeStruct %_arr_v4float_uint_8 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer +%void = OpTypeVoid +%13 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v4float_uint_8_0 = OpTypeArray %v4float %uint_8 +%_ptr_Function__arr_v4float_uint_8_0 = OpTypePointer Function %_arr_v4float_uint_8_0 +%int_0 = OpConstant %int 0 +%_ptr_Uniform__arr_v4float_uint_8 = OpTypePointer Uniform %_arr_v4float_uint_8 +%_ptr_Function_v4float = OpTypePointer Function %v4float +%MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output +; CHECK: OpFunction +; CHECK: OpLabel +; CHECK: OpVariable +; CHECK: OpAccessChain +; CHECK: [[new_address:%\w+]] = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +; CHECK: [[element_ptr:%\w+]] = OpAccessChain %_ptr_Uniform_v4float [[new_address]] %24 +; CHECK: [[load:%\w+]] = OpLoad %v4float [[element_ptr]] +; CHECK: OpStore %out_var_SV_Target [[load]] +%main = OpFunction %void None %13 +%22 = OpLabel +%23 = OpVariable %_ptr_Function__arr_v4float_uint_8_0 Function +%undef = OpUndef %_arr_v4float_uint_8_0 +%24 = OpLoad %int %in_var_INDEX +%25 = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +%26 = OpLoad %_arr_v4float_uint_8 %25 +%27 = OpCompositeExtract %v4float %26 0 +%i0 = OpCompositeInsert %_arr_v4float_uint_8_0 %27 %undef 0 +%28 = OpCompositeExtract %v4float %26 1 +%i1 = OpCompositeInsert %_arr_v4float_uint_8_0 %28 %i0 1 +%29 = OpCompositeExtract %v4float %26 2 +%i2 = OpCompositeInsert %_arr_v4float_uint_8_0 %29 %i1 2 +%30 = OpCompositeExtract %v4float %26 3 +%i3 = OpCompositeInsert %_arr_v4float_uint_8_0 %30 %i2 3 +%31 = OpCompositeExtract %v4float %26 4 +%i4 = OpCompositeInsert %_arr_v4float_uint_8_0 %31 %i3 4 +%32 = OpCompositeExtract %v4float %26 5 +%i5 = OpCompositeInsert %_arr_v4float_uint_8_0 %32 %i4 5 +%33 = OpCompositeExtract %v4float %26 6 +%i6 = OpCompositeInsert %_arr_v4float_uint_8_0 %33 %i5 6 +%34 = OpCompositeExtract %v4float %26 7 +%i7 = OpCompositeInsert %_arr_v4float_uint_8_0 %34 %i6 7 +OpStore %23 %i7 +%36 = OpAccessChain %_ptr_Function_v4float %23 %24 +%37 = OpLoad %v4float %36 +OpStore %out_var_SV_Target %37 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + SinglePassRunAndMatch(before, false); +} +#endif // SPIRV_EFFCEE + +// This test will place a load before the store. We cannot propagate in this +// case. +TEST_F(CopyPropArrayPassTest, LoadBeforeStore) { + const std::string text = + R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 600 +OpName %type_MyCBuffer "type.MyCBuffer" +OpMemberName %type_MyCBuffer 0 "Data" +OpName %MyCBuffer "MyCBuffer" +OpName %main "main" +OpName %in_var_INDEX "in.var.INDEX" +OpName %out_var_SV_Target "out.var.SV_Target" +OpDecorate %_arr_v4float_uint_8 ArrayStride 16 +OpMemberDecorate %type_MyCBuffer 0 Offset 0 +OpDecorate %type_MyCBuffer Block +OpDecorate %in_var_INDEX Flat +OpDecorate %in_var_INDEX Location 0 +OpDecorate %out_var_SV_Target Location 0 +OpDecorate %MyCBuffer DescriptorSet 0 +OpDecorate %MyCBuffer Binding 0 +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_8 = OpConstant %uint 8 +%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8 +%type_MyCBuffer = OpTypeStruct %_arr_v4float_uint_8 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer +%void = OpTypeVoid +%13 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v4float_uint_8_0 = OpTypeArray %v4float %uint_8 +%_ptr_Function__arr_v4float_uint_8_0 = OpTypePointer Function %_arr_v4float_uint_8_0 +%int_0 = OpConstant %int 0 +%_ptr_Uniform__arr_v4float_uint_8 = OpTypePointer Uniform %_arr_v4float_uint_8 +%_ptr_Function_v4float = OpTypePointer Function %v4float +%MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output +%main = OpFunction %void None %13 +%22 = OpLabel +%23 = OpVariable %_ptr_Function__arr_v4float_uint_8_0 Function +%38 = OpAccessChain %_ptr_Function_v4float %23 %24 +%39 = OpLoad %v4float %36 +%24 = OpLoad %int %in_var_INDEX +%25 = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +%26 = OpLoad %_arr_v4float_uint_8 %25 +%27 = OpCompositeExtract %v4float %26 0 +%28 = OpCompositeExtract %v4float %26 1 +%29 = OpCompositeExtract %v4float %26 2 +%30 = OpCompositeExtract %v4float %26 3 +%31 = OpCompositeExtract %v4float %26 4 +%32 = OpCompositeExtract %v4float %26 5 +%33 = OpCompositeExtract %v4float %26 6 +%34 = OpCompositeExtract %v4float %26 7 +%35 = OpCompositeConstruct %_arr_v4float_uint_8_0 %27 %28 %29 %30 %31 %32 %33 %34 +OpStore %23 %35 +%36 = OpAccessChain %_ptr_Function_v4float %23 %24 +%37 = OpLoad %v4float %36 +OpStore %out_var_SV_Target %37 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + auto result = SinglePassRunAndDisassemble( + text, /* skip_nop = */ true, /* do_validation = */ false); + + EXPECT_EQ(opt::Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} + +// This test will place a load where it is not dominated by the store. We +// cannot propagate in this case. +TEST_F(CopyPropArrayPassTest, LoadNotDominated) { + const std::string text = + R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 600 +OpName %type_MyCBuffer "type.MyCBuffer" +OpMemberName %type_MyCBuffer 0 "Data" +OpName %MyCBuffer "MyCBuffer" +OpName %main "main" +OpName %in_var_INDEX "in.var.INDEX" +OpName %out_var_SV_Target "out.var.SV_Target" +OpDecorate %_arr_v4float_uint_8 ArrayStride 16 +OpMemberDecorate %type_MyCBuffer 0 Offset 0 +OpDecorate %type_MyCBuffer Block +OpDecorate %in_var_INDEX Flat +OpDecorate %in_var_INDEX Location 0 +OpDecorate %out_var_SV_Target Location 0 +OpDecorate %MyCBuffer DescriptorSet 0 +OpDecorate %MyCBuffer Binding 0 +%bool = OpTypeBool +%true = OpConstantTrue %bool +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_8 = OpConstant %uint 8 +%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8 +%type_MyCBuffer = OpTypeStruct %_arr_v4float_uint_8 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer +%void = OpTypeVoid +%13 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v4float_uint_8_0 = OpTypeArray %v4float %uint_8 +%_ptr_Function__arr_v4float_uint_8_0 = OpTypePointer Function %_arr_v4float_uint_8_0 +%int_0 = OpConstant %int 0 +%_ptr_Uniform__arr_v4float_uint_8 = OpTypePointer Uniform %_arr_v4float_uint_8 +%_ptr_Function_v4float = OpTypePointer Function %v4float +%MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output +%main = OpFunction %void None %13 +%22 = OpLabel +%23 = OpVariable %_ptr_Function__arr_v4float_uint_8_0 Function +OpSelectionMerge %merge None +OpBranchConditional %true %if %else +%if = OpLabel +%24 = OpLoad %int %in_var_INDEX +%25 = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +%26 = OpLoad %_arr_v4float_uint_8 %25 +%27 = OpCompositeExtract %v4float %26 0 +%28 = OpCompositeExtract %v4float %26 1 +%29 = OpCompositeExtract %v4float %26 2 +%30 = OpCompositeExtract %v4float %26 3 +%31 = OpCompositeExtract %v4float %26 4 +%32 = OpCompositeExtract %v4float %26 5 +%33 = OpCompositeExtract %v4float %26 6 +%34 = OpCompositeExtract %v4float %26 7 +%35 = OpCompositeConstruct %_arr_v4float_uint_8_0 %27 %28 %29 %30 %31 %32 %33 %34 +OpStore %23 %35 +%38 = OpAccessChain %_ptr_Function_v4float %23 %24 +%39 = OpLoad %v4float %36 +OpBranch %merge +%else = OpLabel +%36 = OpAccessChain %_ptr_Function_v4float %23 %24 +%37 = OpLoad %v4float %36 +OpBranch %merge +%merge = OpLabel +%phi = OpPhi %out_var_SV_Target %39 %if %37 %else +OpStore %out_var_SV_Target %phi +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + auto result = SinglePassRunAndDisassemble( + text, /* skip_nop = */ true, /* do_validation = */ false); + + EXPECT_EQ(opt::Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} + +// This test has a partial store to the variable. We cannot propagate in this +// case. +TEST_F(CopyPropArrayPassTest, PartialStore) { + const std::string text = + R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 600 +OpName %type_MyCBuffer "type.MyCBuffer" +OpMemberName %type_MyCBuffer 0 "Data" +OpName %MyCBuffer "MyCBuffer" +OpName %main "main" +OpName %in_var_INDEX "in.var.INDEX" +OpName %out_var_SV_Target "out.var.SV_Target" +OpDecorate %_arr_v4float_uint_8 ArrayStride 16 +OpMemberDecorate %type_MyCBuffer 0 Offset 0 +OpDecorate %type_MyCBuffer Block +OpDecorate %in_var_INDEX Flat +OpDecorate %in_var_INDEX Location 0 +OpDecorate %out_var_SV_Target Location 0 +OpDecorate %MyCBuffer DescriptorSet 0 +OpDecorate %MyCBuffer Binding 0 +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_8 = OpConstant %uint 8 +%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8 +%type_MyCBuffer = OpTypeStruct %_arr_v4float_uint_8 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer +%void = OpTypeVoid +%13 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v4float_uint_8_0 = OpTypeArray %v4float %uint_8 +%_ptr_Function__arr_v4float_uint_8_0 = OpTypePointer Function %_arr_v4float_uint_8_0 +%int_0 = OpConstant %int 0 +%f0 = OpConstant %float 0 +%v4const = OpConstantComposite %v4float %f0 %f0 %f0 %f0 +%_ptr_Uniform__arr_v4float_uint_8 = OpTypePointer Uniform %_arr_v4float_uint_8 +%_ptr_Function_v4float = OpTypePointer Function %v4float +%MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output +%main = OpFunction %void None %13 +%22 = OpLabel +%23 = OpVariable %_ptr_Function__arr_v4float_uint_8_0 Function +%24 = OpLoad %int %in_var_INDEX +%25 = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +%26 = OpLoad %_arr_v4float_uint_8 %25 +%27 = OpCompositeExtract %v4float %26 0 +%28 = OpCompositeExtract %v4float %26 1 +%29 = OpCompositeExtract %v4float %26 2 +%30 = OpCompositeExtract %v4float %26 3 +%31 = OpCompositeExtract %v4float %26 4 +%32 = OpCompositeExtract %v4float %26 5 +%33 = OpCompositeExtract %v4float %26 6 +%34 = OpCompositeExtract %v4float %26 7 +%35 = OpCompositeConstruct %_arr_v4float_uint_8_0 %27 %28 %29 %30 %31 %32 %33 %34 +OpStore %23 %35 +%36 = OpAccessChain %_ptr_Function_v4float %23 %24 +%37 = OpLoad %v4float %36 +%39 = OpStore %36 %v4const +OpStore %out_var_SV_Target %37 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + auto result = SinglePassRunAndDisassemble( + text, /* skip_nop = */ true, /* do_validation = */ false); + + EXPECT_EQ(opt::Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} + +// This test does not have a proper copy of an object. We cannot propagate in +// this case. +TEST_F(CopyPropArrayPassTest, NotACopy) { + const std::string text = + R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 600 +OpName %type_MyCBuffer "type.MyCBuffer" +OpMemberName %type_MyCBuffer 0 "Data" +OpName %MyCBuffer "MyCBuffer" +OpName %main "main" +OpName %in_var_INDEX "in.var.INDEX" +OpName %out_var_SV_Target "out.var.SV_Target" +OpDecorate %_arr_v4float_uint_8 ArrayStride 16 +OpMemberDecorate %type_MyCBuffer 0 Offset 0 +OpDecorate %type_MyCBuffer Block +OpDecorate %in_var_INDEX Flat +OpDecorate %in_var_INDEX Location 0 +OpDecorate %out_var_SV_Target Location 0 +OpDecorate %MyCBuffer DescriptorSet 0 +OpDecorate %MyCBuffer Binding 0 +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_8 = OpConstant %uint 8 +%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8 +%type_MyCBuffer = OpTypeStruct %_arr_v4float_uint_8 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer +%void = OpTypeVoid +%13 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v4float_uint_8_0 = OpTypeArray %v4float %uint_8 +%_ptr_Function__arr_v4float_uint_8_0 = OpTypePointer Function %_arr_v4float_uint_8_0 +%int_0 = OpConstant %int 0 +%f0 = OpConstant %float 0 +%v4const = OpConstantComposite %v4float %f0 %f0 %f0 %f0 +%_ptr_Uniform__arr_v4float_uint_8 = OpTypePointer Uniform %_arr_v4float_uint_8 +%_ptr_Function_v4float = OpTypePointer Function %v4float +%MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output +%main = OpFunction %void None %13 +%22 = OpLabel +%23 = OpVariable %_ptr_Function__arr_v4float_uint_8_0 Function +%24 = OpLoad %int %in_var_INDEX +%25 = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +%26 = OpLoad %_arr_v4float_uint_8 %25 +%27 = OpCompositeExtract %v4float %26 0 +%28 = OpCompositeExtract %v4float %26 0 +%29 = OpCompositeExtract %v4float %26 2 +%30 = OpCompositeExtract %v4float %26 3 +%31 = OpCompositeExtract %v4float %26 4 +%32 = OpCompositeExtract %v4float %26 5 +%33 = OpCompositeExtract %v4float %26 6 +%34 = OpCompositeExtract %v4float %26 7 +%35 = OpCompositeConstruct %_arr_v4float_uint_8_0 %27 %28 %29 %30 %31 %32 %33 %34 +OpStore %23 %35 +%36 = OpAccessChain %_ptr_Function_v4float %23 %24 +%37 = OpLoad %v4float %36 +OpStore %out_var_SV_Target %37 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + auto result = SinglePassRunAndDisassemble( + text, /* skip_nop = */ true, /* do_validation = */ false); + + EXPECT_EQ(opt::Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} + +TEST_F(CopyPropArrayPassTest, BadCopyViaInserts1) { + const std::string text = + R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 600 +OpName %type_MyCBuffer "type.MyCBuffer" +OpMemberName %type_MyCBuffer 0 "Data" +OpName %MyCBuffer "MyCBuffer" +OpName %main "main" +OpName %in_var_INDEX "in.var.INDEX" +OpName %out_var_SV_Target "out.var.SV_Target" +OpDecorate %_arr_v4float_uint_8 ArrayStride 16 +OpMemberDecorate %type_MyCBuffer 0 Offset 0 +OpDecorate %type_MyCBuffer Block +OpDecorate %in_var_INDEX Flat +OpDecorate %in_var_INDEX Location 0 +OpDecorate %out_var_SV_Target Location 0 +OpDecorate %MyCBuffer DescriptorSet 0 +OpDecorate %MyCBuffer Binding 0 +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_8 = OpConstant %uint 8 +%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8 +%type_MyCBuffer = OpTypeStruct %_arr_v4float_uint_8 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer +%void = OpTypeVoid +%13 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v4float_uint_8_0 = OpTypeArray %v4float %uint_8 +%_ptr_Function__arr_v4float_uint_8_0 = OpTypePointer Function %_arr_v4float_uint_8_0 +%int_0 = OpConstant %int 0 +%_ptr_Uniform__arr_v4float_uint_8 = OpTypePointer Uniform %_arr_v4float_uint_8 +%_ptr_Function_v4float = OpTypePointer Function %v4float +%MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output +%main = OpFunction %void None %13 +%22 = OpLabel +%23 = OpVariable %_ptr_Function__arr_v4float_uint_8_0 Function +%undef = OpUndef %_arr_v4float_uint_8_0 +%24 = OpLoad %int %in_var_INDEX +%25 = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +%26 = OpLoad %_arr_v4float_uint_8 %25 +%27 = OpCompositeExtract %v4float %26 0 +%i0 = OpCompositeInsert %_arr_v4float_uint_8_0 %27 %undef 0 +%28 = OpCompositeExtract %v4float %26 1 +%i1 = OpCompositeInsert %_arr_v4float_uint_8_0 %28 %i0 1 +%29 = OpCompositeExtract %v4float %26 2 +%i2 = OpCompositeInsert %_arr_v4float_uint_8_0 %29 %i1 3 +%30 = OpCompositeExtract %v4float %26 3 +%i3 = OpCompositeInsert %_arr_v4float_uint_8_0 %30 %i2 3 +%31 = OpCompositeExtract %v4float %26 4 +%i4 = OpCompositeInsert %_arr_v4float_uint_8_0 %31 %i3 4 +%32 = OpCompositeExtract %v4float %26 5 +%i5 = OpCompositeInsert %_arr_v4float_uint_8_0 %32 %i4 5 +%33 = OpCompositeExtract %v4float %26 6 +%i6 = OpCompositeInsert %_arr_v4float_uint_8_0 %33 %i5 6 +%34 = OpCompositeExtract %v4float %26 7 +%i7 = OpCompositeInsert %_arr_v4float_uint_8_0 %34 %i6 7 +OpStore %23 %i7 +%36 = OpAccessChain %_ptr_Function_v4float %23 %24 +%37 = OpLoad %v4float %36 +OpStore %out_var_SV_Target %37 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + auto result = SinglePassRunAndDisassemble( + text, /* skip_nop = */ true, /* do_validation = */ false); + + EXPECT_EQ(opt::Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} + +TEST_F(CopyPropArrayPassTest, BadCopyViaInserts2) { + const std::string text = + R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 600 +OpName %type_MyCBuffer "type.MyCBuffer" +OpMemberName %type_MyCBuffer 0 "Data" +OpName %MyCBuffer "MyCBuffer" +OpName %main "main" +OpName %in_var_INDEX "in.var.INDEX" +OpName %out_var_SV_Target "out.var.SV_Target" +OpDecorate %_arr_v4float_uint_8 ArrayStride 16 +OpMemberDecorate %type_MyCBuffer 0 Offset 0 +OpDecorate %type_MyCBuffer Block +OpDecorate %in_var_INDEX Flat +OpDecorate %in_var_INDEX Location 0 +OpDecorate %out_var_SV_Target Location 0 +OpDecorate %MyCBuffer DescriptorSet 0 +OpDecorate %MyCBuffer Binding 0 +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_8 = OpConstant %uint 8 +%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8 +%type_MyCBuffer = OpTypeStruct %_arr_v4float_uint_8 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer +%void = OpTypeVoid +%13 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v4float_uint_8_0 = OpTypeArray %v4float %uint_8 +%_ptr_Function__arr_v4float_uint_8_0 = OpTypePointer Function %_arr_v4float_uint_8_0 +%int_0 = OpConstant %int 0 +%_ptr_Uniform__arr_v4float_uint_8 = OpTypePointer Uniform %_arr_v4float_uint_8 +%_ptr_Function_v4float = OpTypePointer Function %v4float +%MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output +%main = OpFunction %void None %13 +%22 = OpLabel +%23 = OpVariable %_ptr_Function__arr_v4float_uint_8_0 Function +%undef = OpUndef %_arr_v4float_uint_8_0 +%24 = OpLoad %int %in_var_INDEX +%25 = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +%26 = OpLoad %_arr_v4float_uint_8 %25 +%27 = OpCompositeExtract %v4float %26 0 +%i0 = OpCompositeInsert %_arr_v4float_uint_8_0 %27 %undef 0 +%28 = OpCompositeExtract %v4float %26 1 +%i1 = OpCompositeInsert %_arr_v4float_uint_8_0 %28 %i0 1 +%29 = OpCompositeExtract %v4float %26 3 +%i2 = OpCompositeInsert %_arr_v4float_uint_8_0 %29 %i1 2 +%30 = OpCompositeExtract %v4float %26 3 +%i3 = OpCompositeInsert %_arr_v4float_uint_8_0 %30 %i2 3 +%31 = OpCompositeExtract %v4float %26 4 +%i4 = OpCompositeInsert %_arr_v4float_uint_8_0 %31 %i3 4 +%32 = OpCompositeExtract %v4float %26 5 +%i5 = OpCompositeInsert %_arr_v4float_uint_8_0 %32 %i4 5 +%33 = OpCompositeExtract %v4float %26 6 +%i6 = OpCompositeInsert %_arr_v4float_uint_8_0 %33 %i5 6 +%34 = OpCompositeExtract %v4float %26 7 +%i7 = OpCompositeInsert %_arr_v4float_uint_8_0 %34 %i6 7 +OpStore %23 %i7 +%36 = OpAccessChain %_ptr_Function_v4float %23 %24 +%37 = OpLoad %v4float %36 +OpStore %out_var_SV_Target %37 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + auto result = SinglePassRunAndDisassemble( + text, /* skip_nop = */ true, /* do_validation = */ false); + + EXPECT_EQ(opt::Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} + +TEST_F(CopyPropArrayPassTest, BadCopyViaInserts3) { + const std::string text = + R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %in_var_INDEX %out_var_SV_Target +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 600 +OpName %type_MyCBuffer "type.MyCBuffer" +OpMemberName %type_MyCBuffer 0 "Data" +OpName %MyCBuffer "MyCBuffer" +OpName %main "main" +OpName %in_var_INDEX "in.var.INDEX" +OpName %out_var_SV_Target "out.var.SV_Target" +OpDecorate %_arr_v4float_uint_8 ArrayStride 16 +OpMemberDecorate %type_MyCBuffer 0 Offset 0 +OpDecorate %type_MyCBuffer Block +OpDecorate %in_var_INDEX Flat +OpDecorate %in_var_INDEX Location 0 +OpDecorate %out_var_SV_Target Location 0 +OpDecorate %MyCBuffer DescriptorSet 0 +OpDecorate %MyCBuffer Binding 0 +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_8 = OpConstant %uint 8 +%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8 +%type_MyCBuffer = OpTypeStruct %_arr_v4float_uint_8 +%_ptr_Uniform_type_MyCBuffer = OpTypePointer Uniform %type_MyCBuffer +%void = OpTypeVoid +%13 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v4float_uint_8_0 = OpTypeArray %v4float %uint_8 +%_ptr_Function__arr_v4float_uint_8_0 = OpTypePointer Function %_arr_v4float_uint_8_0 +%int_0 = OpConstant %int 0 +%_ptr_Uniform__arr_v4float_uint_8 = OpTypePointer Uniform %_arr_v4float_uint_8 +%_ptr_Function_v4float = OpTypePointer Function %v4float +%MyCBuffer = OpVariable %_ptr_Uniform_type_MyCBuffer Uniform +%in_var_INDEX = OpVariable %_ptr_Input_int Input +%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output +%main = OpFunction %void None %13 +%22 = OpLabel +%23 = OpVariable %_ptr_Function__arr_v4float_uint_8_0 Function +%undef = OpUndef %_arr_v4float_uint_8_0 +%24 = OpLoad %int %in_var_INDEX +%25 = OpAccessChain %_ptr_Uniform__arr_v4float_uint_8 %MyCBuffer %int_0 +%26 = OpLoad %_arr_v4float_uint_8 %25 +%28 = OpCompositeExtract %v4float %26 1 +%i1 = OpCompositeInsert %_arr_v4float_uint_8_0 %28 %undef 1 +%29 = OpCompositeExtract %v4float %26 2 +%i2 = OpCompositeInsert %_arr_v4float_uint_8_0 %29 %i1 2 +%30 = OpCompositeExtract %v4float %26 3 +%i3 = OpCompositeInsert %_arr_v4float_uint_8_0 %30 %i2 3 +%31 = OpCompositeExtract %v4float %26 4 +%i4 = OpCompositeInsert %_arr_v4float_uint_8_0 %31 %i3 4 +%32 = OpCompositeExtract %v4float %26 5 +%i5 = OpCompositeInsert %_arr_v4float_uint_8_0 %32 %i4 5 +%33 = OpCompositeExtract %v4float %26 6 +%i6 = OpCompositeInsert %_arr_v4float_uint_8_0 %33 %i5 6 +%34 = OpCompositeExtract %v4float %26 7 +%i7 = OpCompositeInsert %_arr_v4float_uint_8_0 %34 %i6 7 +OpStore %23 %i7 +%36 = OpAccessChain %_ptr_Function_v4float %23 %24 +%37 = OpLoad %v4float %36 +OpStore %out_var_SV_Target %37 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + auto result = SinglePassRunAndDisassemble( + text, /* skip_nop = */ true, /* do_validation = */ false); + + EXPECT_EQ(opt::Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} + +TEST_F(CopyPropArrayPassTest, AtomicAdd) { + const std::string before = R"(OpCapability SampledBuffer +OpCapability StorageImageExtendedFormats +OpCapability ImageBuffer +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %2 "min" %gl_GlobalInvocationID +OpExecutionMode %2 LocalSize 64 1 1 +OpSource HLSL 600 +OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId +OpDecorate %4 DescriptorSet 4 +OpDecorate %4 Binding 70 +%uint = OpTypeInt 32 0 +%6 = OpTypeImage %uint Buffer 0 0 0 2 R32ui +%_ptr_UniformConstant_6 = OpTypePointer UniformConstant %6 +%_ptr_Function_6 = OpTypePointer Function %6 +%void = OpTypeVoid +%10 = OpTypeFunction %void +%uint_0 = OpConstant %uint 0 +%uint_1 = OpConstant %uint 1 +%v3uint = OpTypeVector %uint 3 +%_ptr_Input_v3uint = OpTypePointer Input %v3uint +%_ptr_Image_uint = OpTypePointer Image %uint +%4 = OpVariable %_ptr_UniformConstant_6 UniformConstant +%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input +%2 = OpFunction %void None %10 +%17 = OpLabel +%16 = OpVariable %_ptr_Function_6 Function +%18 = OpLoad %6 %4 +OpStore %16 %18 +%19 = OpImageTexelPointer %_ptr_Image_uint %16 %uint_0 %uint_0 +%20 = OpAtomicIAdd %uint %19 %uint_1 %uint_0 %uint_1 +OpReturn +OpFunctionEnd +)"; + + const std::string after = R"(OpCapability SampledBuffer +OpCapability StorageImageExtendedFormats +OpCapability ImageBuffer +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %2 "min" %gl_GlobalInvocationID +OpExecutionMode %2 LocalSize 64 1 1 +OpSource HLSL 600 +OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId +OpDecorate %4 DescriptorSet 4 +OpDecorate %4 Binding 70 +%uint = OpTypeInt 32 0 +%6 = OpTypeImage %uint Buffer 0 0 0 2 R32ui +%_ptr_UniformConstant_6 = OpTypePointer UniformConstant %6 +%_ptr_Function_6 = OpTypePointer Function %6 +%void = OpTypeVoid +%10 = OpTypeFunction %void +%uint_0 = OpConstant %uint 0 +%uint_1 = OpConstant %uint 1 +%v3uint = OpTypeVector %uint 3 +%_ptr_Input_v3uint = OpTypePointer Input %v3uint +%_ptr_Image_uint = OpTypePointer Image %uint +%4 = OpVariable %_ptr_UniformConstant_6 UniformConstant +%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input +%2 = OpFunction %void None %10 +%17 = OpLabel +%16 = OpVariable %_ptr_Function_6 Function +%18 = OpLoad %6 %4 +OpStore %16 %18 +%19 = OpImageTexelPointer %_ptr_Image_uint %4 %uint_0 %uint_0 +%20 = OpAtomicIAdd %uint %19 %uint_1 %uint_0 %uint_1 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck(before, after, true, true); +} +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/dead_branch_elim_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/dead_branch_elim_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/dead_branch_elim_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/dead_branch_elim_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -1070,10 +1070,10 @@ // OutColor = vec4(0.0,0.0,0.0,0.0); // break; // case 1: - // OutColor = vec4(0.1,0.1,0.1,0.1); + // OutColor = vec4(0.125,0.125,0.125,0.125); // break; // case 2: - // OutColor = vec4(0.2,0.2,0.2,0.2); + // OutColor = vec4(0.25,0.25,0.25,0.25); // break; // default: // OutColor = vec4(1.0,1.0,1.0,1.0); @@ -1102,10 +1102,10 @@ %OutColor = OpVariable %_ptr_Output_v4float Output %float_0 = OpConstant %float 0 %13 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 -%float_0_1 = OpConstant %float 0.1 -%15 = OpConstantComposite %v4float %float_0_1 %float_0_1 %float_0_1 %float_0_1 -%float_0_2 = OpConstant %float 0.2 -%17 = OpConstantComposite %v4float %float_0_2 %float_0_2 %float_0_2 %float_0_2 +%float_0_125 = OpConstant %float 0.125 +%15 = OpConstantComposite %v4float %float_0_125 %float_0_125 %float_0_125 %float_0_125 +%float_0_25 = OpConstant %float 0.25 +%17 = OpConstantComposite %v4float %float_0_25 %float_0_25 %float_0_25 %float_0_25 %float_1 = OpConstant %float 1 %19 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1 %_ptr_Input_v4float = OpTypePointer Input %v4float @@ -1163,10 +1163,10 @@ // OutColor = vec4(0.0,0.0,0.0,0.0); // break; // case 1: - // OutColor = vec4(0.1,0.1,0.1,0.1); + // OutColor = vec4(0.125,0.125,0.125,0.125); // break; // case 2: - // OutColor = vec4(0.2,0.2,0.2,0.2); + // OutColor = vec4(0.25,0.25,0.25,0.25); // break; // default: // OutColor = vec4(1.0,1.0,1.0,1.0); @@ -1195,10 +1195,10 @@ %OutColor = OpVariable %_ptr_Output_v4float Output %float_0 = OpConstant %float 0 %13 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 -%float_0_1 = OpConstant %float 0.1 -%15 = OpConstantComposite %v4float %float_0_1 %float_0_1 %float_0_1 %float_0_1 -%float_0_2 = OpConstant %float 0.2 -%17 = OpConstantComposite %v4float %float_0_2 %float_0_2 %float_0_2 %float_0_2 +%float_0_125 = OpConstant %float 0.125 +%15 = OpConstantComposite %v4float %float_0_125 %float_0_125 %float_0_125 %float_0_125 +%float_0_25 = OpConstant %float 0.25 +%17 = OpConstantComposite %v4float %float_0_25 %float_0_25 %float_0_25 %float_0_25 %float_1 = OpConstant %float 1 %19 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1 %_ptr_Input_v4float = OpTypePointer Input %v4float @@ -1276,10 +1276,10 @@ %_ptr_Function_v4float = OpTypePointer Function %v4float %float_0 = OpConstant %float 0 %17 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 -%float_0_1 = OpConstant %float 0.1 -%19 = OpConstantComposite %v4float %float_0_1 %float_0_1 %float_0_1 %float_0_1 -%float_0_2 = OpConstant %float 0.2 -%21 = OpConstantComposite %v4float %float_0_2 %float_0_2 %float_0_2 %float_0_2 +%float_0_125 = OpConstant %float 0.125 +%19 = OpConstantComposite %v4float %float_0_125 %float_0_125 %float_0_125 %float_0_125 +%float_0_25 = OpConstant %float 0.25 +%21 = OpConstantComposite %v4float %float_0_25 %float_0_25 %float_0_25 %float_0_25 %float_1 = OpConstant %float 1 %23 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1 %_ptr_Output_v4float = OpTypePointer Output %v4float @@ -1415,13 +1415,11 @@ SinglePassRunAndMatch(text, true); } -TEST_F(DeadBranchElimTest, UnreachableLoopMergeAndContinueTargets) { +TEST_F(DeadBranchElimTest, RemovePhiWithUnreachableContinue) { const std::string text = R"( -; CHECK: [[undef:%\w+]] = OpUndef %bool ; CHECK: [[entry:%\w+]] = OpLabel ; CHECK-NEXT: OpBranch [[header:%\w+]] -; CHECK: OpPhi %bool %false [[entry]] [[undef]] [[continue:%\w+]] -; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: OpLoopMerge [[merge:%\w+]] [[continue:%\w+]] None ; CHECK-NEXT: OpBranch [[ret:%\w+]] ; CHECK-NEXT: [[ret]] = OpLabel ; CHECK-NEXT: OpReturn @@ -1458,6 +1456,54 @@ SinglePassRunAndMatch(text, true); } +TEST_F(DeadBranchElimTest, UnreachableLoopMergeAndContinueTargets) { + const std::string text = R"( +; CHECK: [[undef:%\w+]] = OpUndef %bool +; CHECK: OpSelectionMerge [[header:%\w+]] +; CHECK-NEXT: OpBranchConditional {{%\w+}} [[if_lab:%\w+]] [[else_lab:%\w+]] +; CHECK: OpPhi %bool %false [[if_lab]] %false [[else_lab]] [[undef]] [[continue:%\w+]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK-NEXT: OpBranch [[ret:%\w+]] +; CHECK-NEXT: [[ret]] = OpLabel +; CHECK-NEXT: OpReturn +; CHECK: [[continue]] = OpLabel +; CHECK-NEXT: OpBranch [[header]] +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpUnreachable +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical OpenCL +OpName %func "func" +OpDecorate %func LinkageAttributes "func" Export +%bool = OpTypeBool +%false = OpConstantFalse %bool +%true = OpConstantTrue %bool +%void = OpTypeVoid +%funcTy = OpTypeFunction %void +%func = OpFunction %void None %funcTy +%1 = OpLabel +%c = OpUndef %bool +OpSelectionMerge %2 None +OpBranchConditional %c %if %else +%if = OpLabel +OpBranch %2 +%else = OpLabel +OpBranch %2 +%2 = OpLabel +%phi = OpPhi %bool %false %if %false %else %true %continue +OpLoopMerge %merge %continue None +OpBranch %3 +%3 = OpLabel +OpReturn +%continue = OpLabel +OpBranch %2 +%merge = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} TEST_F(DeadBranchElimTest, EarlyReconvergence) { const std::string text = R"( ; CHECK-NOT: OpBranchConditional @@ -1721,12 +1767,10 @@ TEST_F(DeadBranchElimTest, ExtraBackedgeBlocksUnreachable) { const std::string text = R"( -; CHECK: [[undef:%\w+]] = OpUndef ; CHECK: [[entry:%\w+]] = OpLabel ; CHECK-NEXT: OpBranch [[header:%\w+]] ; CHECK-NEXT: [[header]] = OpLabel -; CHECK-NEXT: OpPhi %bool %true [[entry]] [[undef]] [[continue:%\w+]] -; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue:%\w+]] None ; CHECK-NEXT: OpBranch [[merge]] ; CHECK-NEXT: [[continue]] = OpLabel ; CHECK-NEXT: OpBranch [[header]] @@ -1777,7 +1821,6 @@ %1 = OpLabel OpBranch %2 %2 = OpLabel -%3 = OpPhi %bool %true %1 %undef %5 OpLoopMerge %4 %5 None OpBranch %6 %6 = OpLabel @@ -1849,14 +1892,10 @@ TEST_F(DeadBranchElimTest, UnreachableContinuePhiInMerge) { const std::string text = R"( -; CHECK: [[float_undef:%\w+]] = OpUndef %float -; CHECK: [[int_undef:%\w+]] = OpUndef %int ; CHECK: [[entry:%\w+]] = OpLabel ; CHECK-NEXT: OpBranch [[header:%\w+]] ; CHECK-NEXT: [[header]] = OpLabel -; CHECK-NEXT: OpPhi %float {{%\w+}} [[entry]] [[float_undef]] [[continue:%\w+]] -; CHECK-NEXT: OpPhi %int {{%\w+}} [[entry]] [[int_undef]] [[continue]] -; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue:%\w+]] None ; CHECK-NEXT: OpBranch [[label:%\w+]] ; CHECK-NEXT: [[label]] = OpLabel ; CHECK-NEXT: [[fadd:%\w+]] = OpFAdd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/dead_insert_elim_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/dead_insert_elim_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/dead_insert_elim_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/dead_insert_elim_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -633,7 +633,7 @@ %_ = OpVariable %_ptr_Uniform__Globals_ Uniform %_ptr_Uniform_int = OpTypePointer Uniform %int %bool = OpTypeBool -%float_0_9 = OpConstant %float 0.9 +%float_0_75 = OpConstant %float 0.75 %int_1 = OpConstant %int 1 %v4float = OpTypeVector %float 4 %_ptr_Output_v4float = OpTypePointer Output %v4float @@ -661,7 +661,7 @@ %43 = OpFAdd %float %42 %float_1 %44 = OpCompositeInsert %v2float %43 %31 0 %45 = OpCompositeExtract %float %44 1 -%46 = OpFMul %float %45 %float_0_9 +%46 = OpFMul %float %45 %float_0_75 %32 = OpCompositeInsert %v2float %46 %44 1 OpBranch %33 %33 = OpLabel diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/decoration_manager_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/decoration_manager_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/decoration_manager_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/decoration_manager_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -24,8 +24,9 @@ namespace { -using spvtools::ir::IRContext; +using spvtest::MakeVector; using spvtools::ir::Instruction; +using spvtools::ir::IRContext; using spvtools::opt::analysis::DecorationManager; class DecorationManagerTest : public ::testing::Test { @@ -55,7 +56,7 @@ error_message_ += ": " + std::to_string(position.index) + ": " + message; }), - disassemble_options_(spvtools::SpirvTools::kDefaultDisassembleOption), + disassemble_options_(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER), error_message_() { tools_.SetMessageConsumer(consumer_); } @@ -111,21 +112,45 @@ std::string error_message_; }; -TEST_F(DecorationManagerTest, ComparingDecorationsWithDiffOpcodes) { +TEST_F(DecorationManagerTest, + ComparingDecorationsWithDiffOpcodesDecorateDecorateId) { spvtools::ir::IRContext ir_context(SPV_ENV_UNIVERSAL_1_2, GetConsumer()); + // This parameter can be interprated both as { SpvDecorationConstant } + // and also as a list of IDs: { 22 } + const std::vector param{SpvDecorationConstant}; // OpDecorate %1 Constant - Instruction inst1(&ir_context, SpvOpDecorate, 0u, 0u, - {{SPV_OPERAND_TYPE_ID, {1u}}, - {SPV_OPERAND_TYPE_DECORATION, {SpvDecorationConstant}}}); - // OpDecorateId %1 %2 - Instruction inst2(&ir_context, SpvOpDecorateId, 0u, 0u, - {{SPV_OPERAND_TYPE_ID, {1u}}, {SPV_OPERAND_TYPE_ID, {2u}}}); + Instruction inst1( + &ir_context, SpvOpDecorate, 0u, 0u, + {{SPV_OPERAND_TYPE_ID, {1u}}, {SPV_OPERAND_TYPE_DECORATION, param}}); + // OpDecorateId %1 %22 ; 'Constant' is decoration number 22 + Instruction inst2( + &ir_context, SpvOpDecorateId, 0u, 0u, + {{SPV_OPERAND_TYPE_ID, {1u}}, {SPV_OPERAND_TYPE_ID, param}}); + DecorationManager* decoManager = ir_context.get_decoration_mgr(); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_FALSE(decoManager->AreDecorationsTheSame(&inst1, &inst2, true)); +} + +TEST_F(DecorationManagerTest, + ComparingDecorationsWithDiffOpcodesDecorateDecorateString) { + spvtools::ir::IRContext ir_context(SPV_ENV_UNIVERSAL_1_2, GetConsumer()); + // This parameter can be interprated both as { SpvDecorationConstant } + // and also as a null-terminated string with a single character with value 22. + const std::vector param{SpvDecorationConstant}; + // OpDecorate %1 Constant + Instruction inst1( + &ir_context, SpvOpDecorate, 0u, 0u, + {{SPV_OPERAND_TYPE_ID, {1u}}, {SPV_OPERAND_TYPE_DECORATION, param}}); + // OpDecorateStringGOOGLE %1 !22 + Instruction inst2( + &ir_context, SpvOpDecorateStringGOOGLE, 0u, 0u, + {{SPV_OPERAND_TYPE_ID, {1u}}, {SPV_OPERAND_TYPE_LITERAL_STRING, param}}); DecorationManager* decoManager = ir_context.get_decoration_mgr(); EXPECT_THAT(GetErrorMessage(), ""); EXPECT_FALSE(decoManager->AreDecorationsTheSame(&inst1, &inst2, true)); } -TEST_F(DecorationManagerTest, ComparingDecorationsWithDiffDeco) { +TEST_F(DecorationManagerTest, ComparingDecorationsWithDiffDecorateParam) { spvtools::ir::IRContext ir_context(SPV_ENV_UNIVERSAL_1_2, GetConsumer()); // OpDecorate %1 Constant Instruction inst1(&ir_context, SpvOpDecorate, 0u, 0u, @@ -140,6 +165,36 @@ EXPECT_FALSE(decoManager->AreDecorationsTheSame(&inst1, &inst2, true)); } +TEST_F(DecorationManagerTest, ComparingDecorationsWithDiffDecorateIdParam) { + spvtools::ir::IRContext ir_context(SPV_ENV_UNIVERSAL_1_2, GetConsumer()); + // OpDecorate %1 Constant + Instruction inst1( + &ir_context, SpvOpDecorateId, 0u, 0u, + {{SPV_OPERAND_TYPE_ID, {1u}}, {SPV_OPERAND_TYPE_ID, {555}}}); + // OpDecorate %1 Restrict + Instruction inst2( + &ir_context, SpvOpDecorateId, 0u, 0u, + {{SPV_OPERAND_TYPE_ID, {1u}}, {SPV_OPERAND_TYPE_ID, {666}}}); + DecorationManager* decoManager = ir_context.get_decoration_mgr(); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_FALSE(decoManager->AreDecorationsTheSame(&inst1, &inst2, true)); +} + +TEST_F(DecorationManagerTest, ComparingDecorationsWithDiffDecorateStringParam) { + spvtools::ir::IRContext ir_context(SPV_ENV_UNIVERSAL_1_2, GetConsumer()); + // OpDecorate %1 Constant + Instruction inst1(&ir_context, SpvOpDecorateStringGOOGLE, 0u, 0u, + {{SPV_OPERAND_TYPE_ID, {1u}}, + {SPV_OPERAND_TYPE_LITERAL_STRING, MakeVector("Hello!")}}); + // OpDecorate %1 Restrict + Instruction inst2(&ir_context, SpvOpDecorateStringGOOGLE, 0u, 0u, + {{SPV_OPERAND_TYPE_ID, {1u}}, + {SPV_OPERAND_TYPE_LITERAL_STRING, MakeVector("Hellx")}}); + DecorationManager* decoManager = ir_context.get_decoration_mgr(); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_FALSE(decoManager->AreDecorationsTheSame(&inst1, &inst2, true)); +} + TEST_F(DecorationManagerTest, ComparingSameDecorationsOnDiffTargetAllowed) { spvtools::ir::IRContext ir_context(SPV_ENV_UNIVERSAL_1_2, GetConsumer()); // OpDecorate %1 Constant @@ -155,6 +210,33 @@ EXPECT_TRUE(decoManager->AreDecorationsTheSame(&inst1, &inst2, true)); } +TEST_F(DecorationManagerTest, ComparingSameDecorationIdsOnDiffTargetAllowed) { + spvtools::ir::IRContext ir_context(SPV_ENV_UNIVERSAL_1_2, GetConsumer()); + Instruction inst1( + &ir_context, SpvOpDecorateId, 0u, 0u, + {{SPV_OPERAND_TYPE_ID, {1u}}, {SPV_OPERAND_TYPE_DECORATION, {44}}}); + Instruction inst2( + &ir_context, SpvOpDecorateId, 0u, 0u, + {{SPV_OPERAND_TYPE_ID, {2u}}, {SPV_OPERAND_TYPE_DECORATION, {44}}}); + DecorationManager* decoManager = ir_context.get_decoration_mgr(); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_TRUE(decoManager->AreDecorationsTheSame(&inst1, &inst2, true)); +} + +TEST_F(DecorationManagerTest, + ComparingSameDecorationStringsOnDiffTargetAllowed) { + spvtools::ir::IRContext ir_context(SPV_ENV_UNIVERSAL_1_2, GetConsumer()); + Instruction inst1(&ir_context, SpvOpDecorateStringGOOGLE, 0u, 0u, + {{SPV_OPERAND_TYPE_ID, {1u}}, + {SPV_OPERAND_TYPE_LITERAL_STRING, MakeVector("hello")}}); + Instruction inst2(&ir_context, SpvOpDecorateStringGOOGLE, 0u, 0u, + {{SPV_OPERAND_TYPE_ID, {2u}}, + {SPV_OPERAND_TYPE_LITERAL_STRING, MakeVector("hello")}}); + DecorationManager* decoManager = ir_context.get_decoration_mgr(); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_TRUE(decoManager->AreDecorationsTheSame(&inst1, &inst2, true)); +} + TEST_F(DecorationManagerTest, ComparingSameDecorationsOnDiffTargetDisallowed) { spvtools::ir::IRContext ir_context(SPV_ENV_UNIVERSAL_1_2, GetConsumer()); // OpDecorate %1 Constant @@ -223,6 +305,435 @@ EXPECT_FALSE(decoManager->AreDecorationsTheSame(&inst1, &inst2, false)); } +TEST_F(DecorationManagerTest, RemoveDecorationFromVariable) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %1 Constant +OpDecorate %2 Restrict +%2 = OpDecorationGroup +OpGroupDecorate %2 %1 %3 +%4 = OpTypeInt 32 0 +%1 = OpVariable %4 Uniform +%3 = OpVariable %4 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + decoManager->RemoveDecorationsFrom(1u); + auto decorations = decoManager->GetDecorationsFor(1u, false); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_TRUE(decorations.empty()); + decorations = decoManager->GetDecorationsFor(3u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + const std::string expected_decorations = R"(OpDecorate %2 Restrict +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); + + const std::string expected_binary = R"(OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %2 Restrict +%2 = OpDecorationGroup +OpGroupDecorate %2 %3 +%4 = OpTypeInt 32 0 +%1 = OpVariable %4 Uniform +%3 = OpVariable %4 Uniform +)"; + EXPECT_THAT(ModuleToText(), expected_binary); +} + +TEST_F(DecorationManagerTest, RemoveDecorationStringFromVariable) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpExtension "SPV_GOOGLE_decorate_string" +OpMemoryModel Logical GLSL450 +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "hello world" +OpDecorate %2 Restrict +%2 = OpDecorationGroup +OpGroupDecorate %2 %1 %3 +%4 = OpTypeInt 32 0 +%1 = OpVariable %4 Uniform +%3 = OpVariable %4 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + decoManager->RemoveDecorationsFrom(1u); + auto decorations = decoManager->GetDecorationsFor(1u, false); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_TRUE(decorations.empty()); + decorations = decoManager->GetDecorationsFor(3u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + const std::string expected_decorations = R"(OpDecorate %2 Restrict +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); + + const std::string expected_binary = R"(OpCapability Shader +OpCapability Linkage +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpExtension "SPV_GOOGLE_decorate_string" +OpMemoryModel Logical GLSL450 +OpDecorate %2 Restrict +%2 = OpDecorationGroup +OpGroupDecorate %2 %3 +%4 = OpTypeInt 32 0 +%1 = OpVariable %4 Uniform +%3 = OpVariable %4 Uniform +)"; + EXPECT_THAT(ModuleToText(), expected_binary); +} + +TEST_F(DecorationManagerTest, RemoveDecorationFromDecorationGroup) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %1 Constant +OpDecorate %2 Restrict +%2 = OpDecorationGroup +OpGroupDecorate %2 %1 %3 +%4 = OpTypeInt 32 0 +%1 = OpVariable %4 Uniform +%3 = OpVariable %4 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + decoManager->RemoveDecorationsFrom(2u); + auto decorations = decoManager->GetDecorationsFor(2u, false); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_TRUE(decorations.empty()); + decorations = decoManager->GetDecorationsFor(1u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + const std::string expected_decorations = R"(OpDecorate %1 Constant +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); + decorations = decoManager->GetDecorationsFor(3u, false); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_THAT(ToText(decorations), ""); + + const std::string expected_binary = R"(OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %1 Constant +%4 = OpTypeInt 32 0 +%1 = OpVariable %4 Uniform +%3 = OpVariable %4 Uniform +)"; + EXPECT_THAT(ModuleToText(), expected_binary); +} + +TEST_F(DecorationManagerTest, + RemoveDecorationFromDecorationGroupKeepDeadDecorations) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %1 Constant +OpDecorate %2 Restrict +%2 = OpDecorationGroup +OpGroupDecorate %2 %1 +%3 = OpTypeInt 32 0 +%1 = OpVariable %3 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + decoManager->RemoveDecorationsFrom(1u); + auto decorations = decoManager->GetDecorationsFor(1u, false); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_TRUE(decorations.empty()); + decorations = decoManager->GetDecorationsFor(2u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + const std::string expected_decorations = R"(OpDecorate %2 Restrict +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); + + const std::string expected_binary = R"(OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %2 Restrict +%2 = OpDecorationGroup +%3 = OpTypeInt 32 0 +%1 = OpVariable %3 Uniform +)"; + EXPECT_THAT(ModuleToText(), expected_binary); +} + +TEST_F(DecorationManagerTest, RemoveAllDecorationsAppliedByGroup) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %1 Constant +OpDecorate %2 Restrict +%2 = OpDecorationGroup +OpGroupDecorate %2 %1 +OpDecorate %3 BuiltIn VertexId +%3 = OpDecorationGroup +OpGroupDecorate %3 %1 +%4 = OpTypeInt 32 0 +%1 = OpVariable %4 Input +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + decoManager->RemoveDecorationsFrom( + 1u, [](const spvtools::ir::Instruction& inst) { + return inst.opcode() == SpvOpDecorate && + inst.GetSingleWordInOperand(0u) == 3u; + }); + auto decorations = decoManager->GetDecorationsFor(1u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + std::string expected_decorations = R"(OpDecorate %1 Constant +OpDecorate %2 Restrict +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); + decorations = decoManager->GetDecorationsFor(2u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + expected_decorations = R"(OpDecorate %2 Restrict +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); + + const std::string expected_binary = R"(OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %1 Constant +OpDecorate %2 Restrict +%2 = OpDecorationGroup +OpGroupDecorate %2 %1 +OpDecorate %3 BuiltIn VertexId +%3 = OpDecorationGroup +%4 = OpTypeInt 32 0 +%1 = OpVariable %4 Input +)"; + EXPECT_THAT(ModuleToText(), expected_binary); +} + +TEST_F(DecorationManagerTest, RemoveSomeDecorationsAppliedByGroup) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %1 Constant +OpDecorate %2 Restrict +%2 = OpDecorationGroup +OpGroupDecorate %2 %1 +OpDecorate %3 BuiltIn VertexId +OpDecorate %3 Invariant +%3 = OpDecorationGroup +OpGroupDecorate %3 %1 +%uint = OpTypeInt 32 0 +%1 = OpVariable %uint Input +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + decoManager->RemoveDecorationsFrom( + 1u, [](const spvtools::ir::Instruction& inst) { + return inst.opcode() == SpvOpDecorate && + inst.GetSingleWordInOperand(0u) == 3u && + inst.GetSingleWordInOperand(1u) == SpvDecorationBuiltIn; + }); + auto decorations = decoManager->GetDecorationsFor(1u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + std::string expected_decorations = R"(OpDecorate %1 Constant +OpDecorate %1 Invariant +OpDecorate %2 Restrict +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); + decorations = decoManager->GetDecorationsFor(2u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + expected_decorations = R"(OpDecorate %2 Restrict +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); + + const std::string expected_binary = R"(OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %1 Constant +OpDecorate %2 Restrict +%2 = OpDecorationGroup +OpGroupDecorate %2 %1 +OpDecorate %3 BuiltIn VertexId +OpDecorate %3 Invariant +%3 = OpDecorationGroup +OpDecorate %1 Invariant +%4 = OpTypeInt 32 0 +%1 = OpVariable %4 Input +)"; + EXPECT_THAT(ModuleToText(), expected_binary); +} + +TEST_F(DecorationManagerTest, RemoveDecorationDecorate) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %1 Constant +OpDecorate %1 Restrict +%2 = OpTypeInt 32 0 +%1 = OpVariable %2 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + auto decorations = decoManager->GetDecorationsFor(1u, false); + decoManager->RemoveDecoration(decorations.front()); + decorations = decoManager->GetDecorationsFor(1u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + const std::string expected_decorations = R"(OpDecorate %1 Restrict +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); +} + +TEST_F(DecorationManagerTest, RemoveDecorationStringDecorate) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpExtension "SPV_GOOGLE_decorate_string" +OpMemoryModel Logical GLSL450 +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "foobar" +OpDecorate %1 Restrict +%2 = OpTypeInt 32 0 +%1 = OpVariable %2 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + auto decorations = decoManager->GetDecorationsFor(1u, false); + decoManager->RemoveDecoration(decorations.front()); + decorations = decoManager->GetDecorationsFor(1u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + const std::string expected_decorations = R"(OpDecorate %1 Restrict +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); +} + +TEST_F(DecorationManagerTest, CloneDecorations) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %1 Constant +OpDecorate %2 Restrict +%2 = OpDecorationGroup +OpGroupDecorate %2 %1 +OpDecorate %3 BuiltIn VertexId +OpDecorate %3 Invariant +%3 = OpDecorationGroup +OpGroupDecorate %3 %1 +%4 = OpTypeInt 32 0 +%1 = OpVariable %4 Input +%5 = OpVariable %4 Input +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + + // Check cloning OpDecorate including group decorations. + auto decorations = decoManager->GetDecorationsFor(5u, false); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_TRUE(decorations.empty()); + + decoManager->CloneDecorations(1u, 5u); + decorations = decoManager->GetDecorationsFor(5u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + std::string expected_decorations = R"(OpDecorate %5 Constant +OpDecorate %2 Restrict +OpDecorate %3 BuiltIn VertexId +OpDecorate %3 Invariant +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); + + // Check that bookkeeping for ID 2 remains the same. + decorations = decoManager->GetDecorationsFor(2u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + expected_decorations = R"(OpDecorate %2 Restrict +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); + + const std::string expected_binary = R"(OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %1 Constant +OpDecorate %2 Restrict +%2 = OpDecorationGroup +OpGroupDecorate %2 %1 %5 +OpDecorate %3 BuiltIn VertexId +OpDecorate %3 Invariant +%3 = OpDecorationGroup +OpGroupDecorate %3 %1 %5 +OpDecorate %5 Constant +%4 = OpTypeInt 32 0 +%1 = OpVariable %4 Input +%5 = OpVariable %4 Input +)"; + EXPECT_THAT(ModuleToText(), expected_binary); +} + +TEST_F(DecorationManagerTest, CloneDecorationsStringAndId) { + const std::string spirv = R"(OpCapability Shader +OpCapability Linkage +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpExtension "SPV_GOOGLE_decorate_string" +OpMemoryModel Logical GLSL450 +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "blah" +OpDecorateId %1 HlslCounterBufferGOOGLE %2 +OpDecorate %1 Aliased +%3 = OpTypeInt 32 0 +%4 = OpTypePointer Uniform %3 +%1 = OpVariable %4 Uniform +%2 = OpVariable %4 Uniform +%5 = OpVariable %4 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + + // Check cloning OpDecorate including group decorations. + auto decorations = decoManager->GetDecorationsFor(5u, false); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_TRUE(decorations.empty()); + + decoManager->CloneDecorations(1u, 5u); + decorations = decoManager->GetDecorationsFor(5u, false); + EXPECT_THAT(GetErrorMessage(), ""); + + std::string expected_decorations = + R"(OpDecorateStringGOOGLE %5 HlslSemanticGOOGLE "blah" +OpDecorateId %5 HlslCounterBufferGOOGLE %2 +OpDecorate %5 Aliased +)"; + EXPECT_THAT(ToText(decorations), expected_decorations); + + const std::string expected_binary = R"(OpCapability Shader +OpCapability Linkage +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpExtension "SPV_GOOGLE_decorate_string" +OpMemoryModel Logical GLSL450 +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "blah" +OpDecorateId %1 HlslCounterBufferGOOGLE %2 +OpDecorate %1 Aliased +OpDecorateStringGOOGLE %5 HlslSemanticGOOGLE "blah" +OpDecorateId %5 HlslCounterBufferGOOGLE %2 +OpDecorate %5 Aliased +%3 = OpTypeInt 32 0 +%4 = OpTypePointer Uniform %3 +%1 = OpVariable %4 Uniform +%2 = OpVariable %4 Uniform +%5 = OpVariable %4 Uniform +)"; + EXPECT_THAT(ModuleToText(), expected_binary); +} + TEST_F(DecorationManagerTest, HaveTheSameDecorationsWithoutGroupsTrue) { const std::string spirv = R"( OpCapability Shader @@ -258,6 +769,82 @@ EXPECT_FALSE(decoManager->HaveTheSameDecorations(1u, 2u)); } +TEST_F(DecorationManagerTest, HaveTheSameDecorationsIdWithoutGroupsTrue) { + const std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorateId %1 AlignmentId %nine +OpDecorateId %3 MaxByteOffsetId %nine +OpDecorateId %3 AlignmentId %nine +OpDecorateId %1 MaxByteOffsetId %nine +%u32 = OpTypeInt 32 0 +%nine = OpConstant %u32 9 +%1 = OpVariable %u32 Uniform +%3 = OpVariable %u32 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_TRUE(decoManager->HaveTheSameDecorations(1u, 3u)); +} + +TEST_F(DecorationManagerTest, HaveTheSameDecorationsIdWithoutGroupsFalse) { + const std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorateId %1 AlignmentId %nine +OpDecorateId %2 MaxByteOffsetId %nine +OpDecorateId %2 AlignmentId %nine +%u32 = OpTypeInt 32 0 +%nine = OpConstant %u32 9 +%1 = OpVariable %u32 Uniform +%2 = OpVariable %u32 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_FALSE(decoManager->HaveTheSameDecorations(1u, 2u)); +} + +TEST_F(DecorationManagerTest, HaveTheSameDecorationsStringWithoutGroupsTrue) { + const std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpExtension "SPV_GOOGLE_decorate_string" +OpMemoryModel Logical GLSL450 +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "hello" +OpDecorateStringGOOGLE %2 HlslSemanticGOOGLE "world" +OpDecorateStringGOOGLE %2 HlslSemanticGOOGLE "hello" +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "world" +%u32 = OpTypeInt 32 0 +%1 = OpVariable %u32 Uniform +%2 = OpVariable %u32 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_TRUE(decoManager->HaveTheSameDecorations(1u, 2u)); +} + +TEST_F(DecorationManagerTest, HaveTheSameDecorationsStringWithoutGroupsFalse) { + const std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpExtension "SPV_GOOGLE_decorate_string" +OpMemoryModel Logical GLSL450 +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "hello" +OpDecorateStringGOOGLE %2 HlslSemanticGOOGLE "world" +OpDecorateStringGOOGLE %2 HlslSemanticGOOGLE "hello" +%u32 = OpTypeInt 32 0 +%1 = OpVariable %u32 Uniform +%2 = OpVariable %u32 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_FALSE(decoManager->HaveTheSameDecorations(1u, 2u)); +} + TEST_F(DecorationManagerTest, HaveTheSameDecorationsWithGroupsTrue) { const std::string spirv = R"( OpCapability Shader @@ -403,6 +990,26 @@ EXPECT_TRUE(decoManager->HaveTheSameDecorations(1u, 3u)); } +TEST_F(DecorationManagerTest, + HaveTheSameDecorationsDuplicateStringDecorations) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpExtension "SPV_GOOGLE_decorate_string" +OpMemoryModel Logical GLSL450 +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "hello" +OpDecorateStringGOOGLE %2 HlslSemanticGOOGLE "hello" +OpDecorateStringGOOGLE %2 HlslSemanticGOOGLE "hello" +%u32 = OpTypeInt 32 0 +%1 = OpVariable %u32 Uniform +%2 = OpVariable %u32 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_TRUE(decoManager->HaveTheSameDecorations(1u, 2u)); +} + TEST_F(DecorationManagerTest, HaveTheSameDecorationsDifferentIdVariations) { const std::string spirv = R"( OpCapability Shader @@ -421,7 +1028,23 @@ EXPECT_FALSE(decoManager->HaveTheSameDecorations(1u, 2u)); } +TEST_F(DecorationManagerTest, HaveTheSameDecorationsDifferentStringVariations) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpExtension "SPV_GOOGLE_decorate_string" +OpMemoryModel Logical GLSL450 +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "hello" +OpDecorateStringGOOGLE %2 HlslSemanticGOOGLE "world" +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_FALSE(decoManager->HaveTheSameDecorations(1u, 2u)); +} + TEST_F(DecorationManagerTest, HaveTheSameDecorationsLeftSymmetry) { + // Left being a subset of right is not enough. const std::string spirv = R"( OpCapability Shader OpCapability Linkage @@ -440,6 +1063,7 @@ } TEST_F(DecorationManagerTest, HaveTheSameDecorationsRightSymmetry) { + // Right being a subset of left is not enough. const std::string spirv = R"( OpCapability Shader OpCapability Linkage @@ -451,6 +1075,84 @@ %u32 = OpTypeInt 32 0 %1 = OpVariable %u32 Uniform %2 = OpVariable %u32 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_FALSE(decoManager->HaveTheSameDecorations(1u, 2u)); +} + +TEST_F(DecorationManagerTest, HaveTheSameDecorationIdsLeftSymmetry) { + const std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorateId %1 AlignmentId %nine +OpDecorateId %1 AlignmentId %nine +OpDecorateId %2 AlignmentId %nine +OpDecorateId %2 MaxByteOffsetId %nine +%u32 = OpTypeInt 32 0 +%nine = OpConstant %u32 9 +%1 = OpVariable %u32 Uniform +%2 = OpVariable %u32 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_FALSE(decoManager->HaveTheSameDecorations(1u, 2u)); +} + +TEST_F(DecorationManagerTest, HaveTheSameDecorationIdsRightSymmetry) { + const std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorateId %1 AlignmentId %nine +OpDecorateId %1 MaxByteOffsetId %nine +OpDecorateId %2 AlignmentId %nine +OpDecorateId %2 AlignmentId %nine +%u32 = OpTypeInt 32 0 +%nine = OpConstant %u32 9 +%1 = OpVariable %u32 Uniform +%2 = OpVariable %u32 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_FALSE(decoManager->HaveTheSameDecorations(1u, 2u)); +} + +TEST_F(DecorationManagerTest, HaveTheSameDecorationStringsLeftSymmetry) { + const std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpExtension "SPV_GOOGLE_decorate_string" +OpMemoryModel Logical GLSL450 +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "hello" +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "hello" +OpDecorateStringGOOGLE %2 HlslSemanticGOOGLE "hello" +OpDecorateStringGOOGLE %2 HlslSemanticGOOGLE "world" +%u32 = OpTypeInt 32 0 +%1 = OpVariable %u32 Uniform +%2 = OpVariable %u32 Uniform +)"; + DecorationManager* decoManager = GetDecorationManager(spirv); + EXPECT_THAT(GetErrorMessage(), ""); + EXPECT_FALSE(decoManager->HaveTheSameDecorations(1u, 2u)); +} + +TEST_F(DecorationManagerTest, HaveTheSameDecorationStringsRightSymmetry) { + const std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpExtension "SPV_GOOGLE_decorate_string" +OpMemoryModel Logical GLSL450 +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "hello" +OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE "world" +OpDecorateStringGOOGLE %2 HlslSemanticGOOGLE "hello" +OpDecorateStringGOOGLE %2 HlslSemanticGOOGLE "hello" +%u32 = OpTypeInt 32 0 +%1 = OpVariable %u32 Uniform +%2 = OpVariable %u32 Uniform )"; DecorationManager* decoManager = GetDecorationManager(spirv); EXPECT_THAT(GetErrorMessage(), ""); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/def_use_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/def_use_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/def_use_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/def_use_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -22,11 +22,13 @@ #include "opt/def_use_manager.h" #include "opt/ir_context.h" #include "opt/module.h" +#include "pass_fixture.h" #include "pass_utils.h" #include "spirv-tools/libspirv.hpp" namespace { +using ::testing::Contains; using ::testing::UnorderedElementsAre; using ::testing::UnorderedElementsAreArray; @@ -1666,5 +1668,46 @@ }, }, })); + +using UpdateUsesTest = PassTest<::testing::Test>; + +TEST_F(UpdateUsesTest, KeepOldUses) { + const std::vector text = { + // clang-format off + "OpCapability Shader", + "%1 = OpExtInstImport \"GLSL.std.450\"", + "OpMemoryModel Logical GLSL450", + "OpEntryPoint Vertex %main \"main\"", + "OpName %main \"main\"", + "%void = OpTypeVoid", + "%4 = OpTypeFunction %void", + "%uint = OpTypeInt 32 0", + "%uint_5 = OpConstant %uint 5", + "%25 = OpConstant %uint 25", + "%main = OpFunction %void None %4", + "%8 = OpLabel", + "%9 = OpIMul %uint %uint_5 %uint_5", + "%10 = OpIMul %uint %9 %uint_5", + "OpReturn", + "OpFunctionEnd" + // clang-format on + }; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, JoinAllInsts(text), + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ASSERT_NE(nullptr, context); + + DefUseManager* def_use_mgr = context->get_def_use_mgr(); + ir::Instruction* def = def_use_mgr->GetDef(9); + ir::Instruction* use = def_use_mgr->GetDef(10); + def->SetOpcode(SpvOpCopyObject); + def->SetInOperands({{SPV_OPERAND_TYPE_ID, {25}}}); + context->UpdateDefUse(def); + + auto users = def_use_mgr->id_to_users(); + opt::analysis::UserEntry entry = {def, use}; + EXPECT_THAT(users, Contains(entry)); +} // clang-format on } // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/dominator_tree/generated.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/dominator_tree/generated.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/dominator_tree/generated.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/dominator_tree/generated.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -155,7 +155,8 @@ // check with some invalid inputs EXPECT_FALSE(dom_tree.Dominates(nullptr, entry)); EXPECT_FALSE(dom_tree.Dominates(entry, nullptr)); - EXPECT_FALSE(dom_tree.Dominates(nullptr, nullptr)); + EXPECT_FALSE(dom_tree.Dominates(static_cast(nullptr), + static_cast(nullptr))); EXPECT_FALSE(dom_tree.Dominates(10, 1)); EXPECT_FALSE(dom_tree.Dominates(1, 10)); EXPECT_FALSE(dom_tree.Dominates(1, 1)); @@ -216,7 +217,8 @@ // check with some invalid inputs EXPECT_FALSE(dom_tree.Dominates(nullptr, entry)); EXPECT_FALSE(dom_tree.Dominates(entry, nullptr)); - EXPECT_FALSE(dom_tree.Dominates(nullptr, nullptr)); + EXPECT_FALSE(dom_tree.Dominates(static_cast(nullptr), + static_cast(nullptr))); EXPECT_FALSE(dom_tree.Dominates(10, 1)); EXPECT_FALSE(dom_tree.Dominates(1, 10)); EXPECT_FALSE(dom_tree.Dominates(1, 1)); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/eliminate_dead_const_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/eliminate_dead_const_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/eliminate_dead_const_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/eliminate_dead_const_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -47,7 +47,7 @@ "%uint = OpTypeInt 32 0", "%11 = OpConstant %uint 2", "%float = OpTypeFloat 32", - "%13 = OpConstant %float 3.14", + "%13 = OpConstant %float 3.1415", "%double = OpTypeFloat 64", "%15 = OpConstant %double 3.14159265358979", "%main = OpFunction %void None %4", @@ -106,7 +106,7 @@ "%uint_2 = OpConstant %uint 2", "%float = OpTypeFloat 32", "%_ptr_Function_float = OpTypePointer Function %float", - "%float_3_14 = OpConstant %float 3.14", + "%float_3_1415 = OpConstant %float 3.1415", "%double = OpTypeFloat 64", "%_ptr_Function_double = OpTypePointer Function %double", "%double_3_14159265358979 = OpConstant %double 3.14159265358979", @@ -122,7 +122,7 @@ "OpStore %bfv %false", "OpStore %iv %int_1", "OpStore %uv %uint_2", - "OpStore %fv %float_3_14", + "OpStore %fv %float_3_1415", "OpStore %dv %double_3_14159265358979", "OpReturn", "OpFunctionEnd", @@ -233,7 +233,7 @@ { /* .used_consts = */ { - "%used_const_float = OpConstant %float 3.14", + "%used_const_float = OpConstant %float 3.1415", }, /* .main_insts = */ { @@ -242,13 +242,13 @@ }, /* .dead_consts = */ { - "%dead_const_float = OpConstant %float 3.14", + "%dead_const_float = OpConstant %float 3.1415", }, }, { /* .used_consts = */ { - "%used_const_double = OpConstant %double 3.14", + "%used_const_double = OpConstant %double 3.141592653", }, /* .main_insts = */ { @@ -257,7 +257,7 @@ }, /* .dead_consts = */ { - "%dead_const_double = OpConstant %double 3.14", + "%dead_const_double = OpConstant %double 3.141592653", }, }, // clang-format on @@ -316,8 +316,8 @@ { /* .used_consts = */ { - "%used_float_x = OpConstant %float 3.14", - "%used_float_y = OpConstant %float 4.13", + "%used_float_x = OpConstant %float 3.1415", + "%used_float_y = OpConstant %float 4.25", "%used_v2float = OpConstantComposite %v2float %used_float_x %used_float_y", }, /* .main_insts = */ @@ -327,8 +327,8 @@ }, /* .dead_consts = */ { - "%dead_float_x = OpConstant %float 3.14", - "%dead_float_y = OpConstant %float 4.13", + "%dead_float_x = OpConstant %float 3.1415", + "%dead_float_y = OpConstant %float 4.25", "%dead_v2float = OpConstantComposite %v2float %dead_float_x %dead_float_y", }, }, @@ -338,9 +338,9 @@ { /* .used_consts = */ { - "%used_float_x = OpConstant %float 3.14", - "%used_float_y = OpConstant %float 4.13", - "%used_float_z = OpConstant %float 4.31", + "%used_float_x = OpConstant %float 3.1415", + "%used_float_y = OpConstant %float 4.25", + "%used_float_z = OpConstant %float 4.75", "%used_v3float = OpConstantComposite %v3float %used_float_x %used_float_y %used_float_z", }, /* .main_insts = */ @@ -444,8 +444,8 @@ { "%used_bool = OpConstantTrue %bool", "%used_int = OpConstant %int 1", - "%used_float = OpConstant %float 1.23", - "%used_double = OpConstant %double 1.2345678901234", + "%used_float = OpConstant %float 1.25", + "%used_double = OpConstant %double 1.23456789012345", "%used_inner_struct = OpConstantComposite %inner_struct %used_bool %used_int %used_float %used_double", }, /* .main_insts = */ @@ -467,8 +467,8 @@ { "%used_bool = OpConstantTrue %bool", "%used_int = OpConstant %int 1", - "%used_float = OpConstant %float 1.23", - "%used_double = OpConstant %double 1.2345678901234", + "%used_float = OpConstant %float 1.25", + "%used_double = OpConstant %double 1.23456789012345", "%used_inner_struct = OpConstantComposite %inner_struct %used_bool %used_int %used_float %used_double", "%used_outer_struct = OpConstantComposite %outer_struct %used_inner_struct %used_int %used_double" }, @@ -495,7 +495,7 @@ "%used_uint = OpSpecConstant %uint 2", "%used_int = OpSpecConstant %int 2", "%used_float = OpSpecConstant %float 2.5", - "%used_double = OpSpecConstant %double 1.428571428514", + "%used_double = OpSpecConstant %double 1.42857142851", }, /* .main_insts = */ { @@ -514,7 +514,7 @@ "%dead_uint = OpSpecConstant %uint 2", "%dead_int = OpSpecConstant %int 2", "%dead_float = OpSpecConstant %float 2.5", - "%dead_double = OpSpecConstant %double 1.428571428514", + "%dead_double = OpSpecConstant %double 1.42857142851", }, }, // clang-format on diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/fold_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/fold_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/fold_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/fold_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -18,6 +18,10 @@ #include #include +#ifdef SPIRV_EFFCEE +#include "effcee/effcee.h" +#endif + #include "opt/build_module.h" #include "opt/def_use_manager.h" #include "opt/ir_context.h" @@ -32,6 +36,31 @@ using namespace spvtools; using spvtools::opt::analysis::DefUseManager; +#ifdef SPIRV_EFFCEE +std::string Disassemble(const std::string& original, ir::IRContext* context, + uint32_t disassemble_options = 0) { + std::vector optimized_bin; + context->module()->ToBinary(&optimized_bin, true); + spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2; + SpirvTools tools(target_env); + std::string optimized_asm; + EXPECT_TRUE( + tools.Disassemble(optimized_bin, &optimized_asm, disassemble_options)) + << "Disassembling failed for shader:\n" + << original << std::endl; + return optimized_asm; +} + +void Match(const std::string& original, ir::IRContext* context, + uint32_t disassemble_options = 0) { + std::string disassembly = Disassemble(original, context, disassemble_options); + auto match_result = effcee::Match(disassembly, original); + EXPECT_EQ(effcee::Result::Status::Ok, match_result.status()) + << match_result.message() << "\nChecking result:\n" + << disassembly; +} +#endif + template struct InstructionFoldingCase { InstructionFoldingCase(const std::string& tb, uint32_t id, ResultType result) @@ -57,11 +86,13 @@ // Fold the instruction to test. opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); ir::Instruction* inst = def_use_mgr->GetDef(tc.id_to_fold); - inst = opt::FoldInstruction(inst); + bool succeeded = opt::FoldInstruction(inst); // Make sure the instruction folded as expected. - EXPECT_NE(inst, nullptr); + EXPECT_TRUE(succeeded); if (inst != nullptr) { + EXPECT_EQ(inst->opcode(), SpvOpCopyObject); + inst = def_use_mgr->GetDef(inst->GetSingleWordInOperand(0)); EXPECT_EQ(inst->opcode(), SpvOpConstant); opt::analysis::ConstantManager* const_mrg = context->get_constant_mgr(); const opt::analysis::IntConstant* result = @@ -76,8 +107,16 @@ // Returns a common SPIR-V header for all of the test that follow. #define INT_0_ID 100 #define TRUE_ID 101 +#define VEC2_0_ID 102 +#define INT_7_ID 103 +#define FLOAT_0_ID 104 +#define DOUBLE_0_ID 105 +#define VEC4_0_ID 106 +#define DVEC4_0_ID 106 +#define HALF_0_ID 108 const std::string& Header() { static const std::string header = R"(OpCapability Shader +OpCapability Float16 %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" @@ -87,32 +126,107 @@ %void = OpTypeVoid %void_func = OpTypeFunction %void %bool = OpTypeBool -%true = OpConstantTrue %bool +%float16 = OpTypeFloat 16 +%float = OpTypeFloat 32 +%double = OpTypeFloat 64 +%half = OpTypeFloat 16 %101 = OpConstantTrue %bool ; Need a def with an numerical id to define id maps. +%true = OpConstantTrue %bool %false = OpConstantFalse %bool +%bool_null = OpConstantNull %bool %short = OpTypeInt 16 1 %int = OpTypeInt 32 1 %long = OpTypeInt 64 1 -%uint = OpTypeInt 32 1 +%uint = OpTypeInt 32 0 +%v2int = OpTypeVector %int 2 %v4int = OpTypeVector %int 4 +%v4float = OpTypeVector %float 4 +%v4double = OpTypeVector %double 4 +%v2float = OpTypeVector %float 2 +%v2bool = OpTypeVector %bool 2 +%struct_v2int_int_int = OpTypeStruct %v2int %int %int %_ptr_int = OpTypePointer Function %int %_ptr_uint = OpTypePointer Function %uint %_ptr_bool = OpTypePointer Function %bool +%_ptr_float = OpTypePointer Function %float +%_ptr_double = OpTypePointer Function %double +%_ptr_half = OpTypePointer Function %half +%_ptr_long = OpTypePointer Function %long +%_ptr_v2int = OpTypePointer Function %v2int +%_ptr_v4int = OpTypePointer Function %v4int +%_ptr_v4float = OpTypePointer Function %v4float +%_ptr_v4double = OpTypePointer Function %v4double +%_ptr_struct_v2int_int_int = OpTypePointer Function %struct_v2int_int_int +%_ptr_v2float = OpTypePointer Function %v2float %short_0 = OpConstant %short 0 %short_3 = OpConstant %short 3 +%100 = OpConstant %int 0 ; Need a def with an numerical id to define id maps. +%103 = OpConstant %int 7 ; Need a def with an numerical id to define id maps. %int_0 = OpConstant %int 0 %int_1 = OpConstant %int 1 -%100 = OpConstant %int 0 ; Need a def with an numerical id to define id maps. +%int_2 = OpConstant %int 2 %int_3 = OpConstant %int 3 +%int_4 = OpConstant %int 4 %int_min = OpConstant %int -2147483648 %int_max = OpConstant %int 2147483647 %long_0 = OpConstant %long 0 +%long_2 = OpConstant %long 2 %long_3 = OpConstant %long 3 %uint_0 = OpConstant %uint 0 +%uint_2 = OpConstant %uint 2 %uint_3 = OpConstant %uint 3 +%uint_4 = OpConstant %uint 4 %uint_32 = OpConstant %uint 32 -%uint_max = OpConstant %uint -1 +%uint_max = OpConstant %uint 4294967295 +%v2int_undef = OpUndef %v2int +%v2int_2_2 = OpConstantComposite %v2int %int_2 %int_2 +%v2int_2_3 = OpConstantComposite %v2int %int_2 %int_3 +%v2int_3_2 = OpConstantComposite %v2int %int_3 %int_2 +%v2int_4_4 = OpConstantComposite %v2int %int_4 %int_4 +%v2bool_null = OpConstantNull %v2bool +%v2bool_true_false = OpConstantComposite %v2bool %true %false +%v2bool_false_true = OpConstantComposite %v2bool %false %true +%struct_v2int_int_int_null = OpConstantNull %struct_v2int_int_int +%v2int_null = OpConstantNull %v2int +%102 = OpConstantComposite %v2int %103 %103 %v4int_0_0_0_0 = OpConstantComposite %v4int %int_0 %int_0 %int_0 %int_0 +%struct_undef_0_0 = OpConstantComposite %struct_v2int_int_int %v2int_undef %int_0 %int_0 +%float16_0 = OpConstant %float16 0 +%float16_1 = OpConstant %float16 1 +%float16_2 = OpConstant %float16 2 +%float_n1 = OpConstant %float -1 +%104 = OpConstant %float 0 ; Need a def with an numerical id to define id maps. +%float_0 = OpConstant %float 0 +%float_half = OpConstant %float 0.5 +%float_1 = OpConstant %float 1 +%float_2 = OpConstant %float 2 +%float_3 = OpConstant %float 3 +%float_4 = OpConstant %float 4 +%float_0p5 = OpConstant %float 0.5 +%v2float_2_2 = OpConstantComposite %v2float %float_2 %float_2 +%v2float_2_3 = OpConstantComposite %v2float %float_2 %float_3 +%v2float_3_2 = OpConstantComposite %v2float %float_3 %float_2 +%v2float_4_4 = OpConstantComposite %v2float %float_4 %float_4 +%v2float_2_0p5 = OpConstantComposite %v2float %float_2 %float_0p5 +%v2float_null = OpConstantNull %v2float +%double_n1 = OpConstant %double -1 +%105 = OpConstant %double 0 ; Need a def with an numerical id to define id maps. +%double_0 = OpConstant %double 0 +%double_1 = OpConstant %double 1 +%double_2 = OpConstant %double 2 +%double_3 = OpConstant %double 3 +%float_nan = OpConstant %float -0x1.8p+128 +%double_nan = OpConstant %double -0x1.8p+1024 +%108 = OpConstant %half 0 +%half_1 = OpConstant %half 1 +%106 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 +%v4float_0_0_0_0 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 +%v4float_0_0_0_1 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1 +%v4float_1_1_1_1 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1 +%107 = OpConstantComposite %v4double %double_0 %double_0 %double_0 %double_0 +%v4double_0_0_0_0 = OpConstantComposite %v4double %double_0 %double_0 %double_0 %double_0 +%v4double_0_0_0_1 = OpConstantComposite %v4double %double_0 %double_0 %double_0 %double_1 +%v4double_1_1_1_1 = OpConstantComposite %v4double %double_1 %double_1 %double_1 %double_1 )"; return header; @@ -294,6 +408,70 @@ )); // clang-format on +using IntVectorInstructionFoldingTest = + ::testing::TestWithParam>>; + +TEST_P(IntVectorInstructionFoldingTest, Case) { + const auto& tc = GetParam(); + + // Build module. + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, tc.test_body, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ASSERT_NE(nullptr, context); + + // Fold the instruction to test. + opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); + ir::Instruction* inst = def_use_mgr->GetDef(tc.id_to_fold); + bool succeeded = opt::FoldInstruction(inst); + + // Make sure the instruction folded as expected. + EXPECT_TRUE(succeeded); + if (inst != nullptr) { + EXPECT_EQ(inst->opcode(), SpvOpCopyObject); + inst = def_use_mgr->GetDef(inst->GetSingleWordInOperand(0)); + std::vector opcodes = {SpvOpConstantComposite}; + EXPECT_THAT(opcodes, Contains(inst->opcode())); + opt::analysis::ConstantManager* const_mrg = context->get_constant_mgr(); + const opt::analysis::Constant* result = + const_mrg->GetConstantFromInst(inst); + EXPECT_NE(result, nullptr); + if (result != nullptr) { + const std::vector& componenets = + result->AsVectorConstant()->GetComponents(); + EXPECT_EQ(componenets.size(), tc.expected_result.size()); + for (size_t i = 0; i < componenets.size(); i++) { + EXPECT_EQ(tc.expected_result[i], componenets[i]->GetU32()); + } + } + } +} + +// clang-format off +INSTANTIATE_TEST_CASE_P(TestCase, IntVectorInstructionFoldingTest, +::testing::Values( + // Test case 0: fold 0*n + InstructionFoldingCase>( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load = OpLoad %int %n\n" + + "%2 = OpVectorShuffle %v2int %v2int_2_2 %v2int_2_3 0 3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, {2,3}), + InstructionFoldingCase>( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load = OpLoad %int %n\n" + + "%2 = OpVectorShuffle %v2int %v2int_null %v2int_2_3 0 3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, {0,3}) +)); +// clang-format on + using BooleanInstructionFoldingTest = ::testing::TestWithParam>; @@ -309,11 +487,13 @@ // Fold the instruction to test. opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); ir::Instruction* inst = def_use_mgr->GetDef(tc.id_to_fold); - inst = opt::FoldInstruction(inst); + bool succeeded = opt::FoldInstruction(inst); // Make sure the instruction folded as expected. - EXPECT_NE(inst, nullptr); + EXPECT_TRUE(succeeded); if (inst != nullptr) { + EXPECT_EQ(inst->opcode(), SpvOpCopyObject); + inst = def_use_mgr->GetDef(inst->GetSingleWordInOperand(0)); std::vector bool_opcodes = {SpvOpConstantTrue, SpvOpConstantFalse}; EXPECT_THAT(bool_opcodes, Contains(inst->opcode())); opt::analysis::ConstantManager* const_mrg = context->get_constant_mgr(); @@ -532,23 +712,10 @@ )); // clang-format on -template -struct InstructionFoldingCaseWithMap { - InstructionFoldingCaseWithMap(const std::string& tb, uint32_t id, - ResultType result, - std::function map) - : test_body(tb), id_to_fold(id), expected_result(result), id_map(map) {} - - std::string test_body; - uint32_t id_to_fold; - ResultType expected_result; - std::function id_map; -}; - -using IntegerInstructionFoldingTestWithMap = - ::testing::TestWithParam>; +using FloatInstructionFoldingTest = + ::testing::TestWithParam>; -TEST_P(IntegerInstructionFoldingTestWithMap, Case) { +TEST_P(FloatInstructionFoldingTest, Case) { const auto& tc = GetParam(); // Build module. @@ -560,584 +727,3744 @@ // Fold the instruction to test. opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); ir::Instruction* inst = def_use_mgr->GetDef(tc.id_to_fold); - inst = opt::FoldInstruction(inst, tc.id_map); + bool succeeded = opt::FoldInstruction(inst); // Make sure the instruction folded as expected. - EXPECT_NE(inst, nullptr); + EXPECT_TRUE(succeeded); if (inst != nullptr) { + EXPECT_EQ(inst->opcode(), SpvOpCopyObject); + inst = def_use_mgr->GetDef(inst->GetSingleWordInOperand(0)); EXPECT_EQ(inst->opcode(), SpvOpConstant); opt::analysis::ConstantManager* const_mrg = context->get_constant_mgr(); - const opt::analysis::IntConstant* result = - const_mrg->GetConstantFromInst(inst)->AsIntConstant(); - EXPECT_NE(result, nullptr); - if (result != nullptr) { - EXPECT_EQ(result->GetU32BitValue(), tc.expected_result); - } - } -} -// clang-format off -INSTANTIATE_TEST_CASE_P(TestCase, IntegerInstructionFoldingTestWithMap, - ::testing::Values( - // Test case 0: fold %3 = 0; %3 * n - InstructionFoldingCaseWithMap( - Header() + "%main = OpFunction %void None %void_func\n" + - "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%load = OpLoad %int %n\n" + - "%3 = OpCopyObject %int %int_0\n" - "%2 = OpIMul %int %3 %load\n" + - "OpReturn\n" + - "OpFunctionEnd", - 2, 0, [](uint32_t id) {return (id == 3 ? INT_0_ID : id);}) - )); -// clang-format on - -using BooleanInstructionFoldingTestWithMap = - ::testing::TestWithParam>; - -TEST_P(BooleanInstructionFoldingTestWithMap, Case) { - const auto& tc = GetParam(); - - // Build module. - std::unique_ptr context = - BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, tc.test_body, - SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); - ASSERT_NE(nullptr, context); - - // Fold the instruction to test. - opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); - ir::Instruction* inst = def_use_mgr->GetDef(tc.id_to_fold); - inst = opt::FoldInstruction(inst, tc.id_map); - - // Make sure the instruction folded as expected. - EXPECT_NE(inst, nullptr); - if (inst != nullptr) { - std::vector bool_opcodes = {SpvOpConstantTrue, SpvOpConstantFalse}; - EXPECT_THAT(bool_opcodes, Contains(inst->opcode())); - opt::analysis::ConstantManager* const_mrg = context->get_constant_mgr(); - const opt::analysis::BoolConstant* result = - const_mrg->GetConstantFromInst(inst)->AsBoolConstant(); + const opt::analysis::FloatConstant* result = + const_mrg->GetConstantFromInst(inst)->AsFloatConstant(); EXPECT_NE(result, nullptr); if (result != nullptr) { - EXPECT_EQ(result->value(), tc.expected_result); + EXPECT_EQ(result->GetFloatValue(), tc.expected_result); } } } -// clang-format off -INSTANTIATE_TEST_CASE_P(TestCase, BooleanInstructionFoldingTestWithMap, - ::testing::Values( - // Test case 0: fold %3 = true; %3 || n - InstructionFoldingCaseWithMap( - Header() + "%main = OpFunction %void None %void_func\n" + - "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_bool Function\n" + - "%load = OpLoad %bool %n\n" + - "%3 = OpCopyObject %bool %true\n" + - "%2 = OpLogicalOr %bool %3 %load\n" + - "OpReturn\n" + - "OpFunctionEnd", - 2, true, [](uint32_t id) {return (id == 3 ? TRUE_ID : id);}) - )); -// clang-format on - -using GeneralInstructionFoldingTest = - ::testing::TestWithParam>; - -TEST_P(GeneralInstructionFoldingTest, Case) { - const auto& tc = GetParam(); - - // Build module. - std::unique_ptr context = - BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, tc.test_body, - SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); - ASSERT_NE(nullptr, context); - - // Fold the instruction to test. - opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); - ir::Instruction* inst = def_use_mgr->GetDef(tc.id_to_fold); - inst = opt::FoldInstruction(inst); - - // Make sure the instruction folded as expected. - EXPECT_TRUE((inst == nullptr) == (tc.expected_result == 0)); - if (inst != nullptr) { - EXPECT_EQ(inst->result_id(), tc.expected_result); - } -} +// Not testing NaNs because there are no expectations concerning NaNs according +// to the "Precision and Operation of SPIR-V Instructions" section of the Vulkan +// specification. // clang-format off -INSTANTIATE_TEST_CASE_P(TestCase, GeneralInstructionFoldingTest, +INSTANTIATE_TEST_CASE_P(FloatConstantFoldingTest, FloatInstructionFoldingTest, ::testing::Values( - // Test case 0: Don't fold n * m - InstructionFoldingCase( - Header() + "%main = OpFunction %void None %void_func\n" + - "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%m = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%load_m = OpLoad %int %m\n" + - "%2 = OpIMul %int %load_n %load_m\n" + - "OpReturn\n" + - "OpFunctionEnd", - 2, 0), - // Test case 1: Don't fold n / m (unsigned) - InstructionFoldingCase( + // Test case 0: Fold 2.0 - 1.0 + InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%m = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%load_m = OpLoad %uint %m\n" + - "%2 = OpUDiv %uint %load_n %load_m\n" + + "%2 = OpFSub %float %float_2 %float_1\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 2: Don't fold n / m (signed) - InstructionFoldingCase( + 2, 1.0), + // Test case 1: Fold 2.0 + 1.0 + InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%m = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%load_m = OpLoad %int %m\n" + - "%2 = OpSDiv %int %load_n %load_m\n" + + "%2 = OpFAdd %float %float_2 %float_1\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 3: Don't fold n remainder m - InstructionFoldingCase( + 2, 3.0), + // Test case 2: Fold 3.0 * 2.0 + InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%m = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%load_m = OpLoad %int %m\n" + - "%2 = OpSRem %int %load_n %load_m\n" + + "%2 = OpFMul %float %float_3 %float_2\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 4: Don't fold n % m (signed) - InstructionFoldingCase( + 2, 6.0), + // Test case 3: Fold 1.0 / 2.0 + InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%m = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%load_m = OpLoad %int %m\n" + - "%2 = OpSMod %int %load_n %load_m\n" + + "%2 = OpFDiv %float %float_1 %float_2\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 5: Don't fold n % m (unsigned) - InstructionFoldingCase( + 2, 0.5), + // Test case 4: Fold 1.0 / 0.0 + InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%m = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%load_m = OpLoad %uint %m\n" + - "%2 = OpUMod %int %load_n %load_m\n" + + "%2 = OpFDiv %float %float_1 %float_0\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 6: Don't fold n << m - InstructionFoldingCase( + 2, std::numeric_limits::infinity()), + // Test case 5: Fold -1.0 / 0.0 + InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%m = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%load_m = OpLoad %uint %m\n" + - "%2 = OpShiftRightLogical %int %load_n %load_m\n" + + "%2 = OpFDiv %float %float_n1 %float_0\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 7: Don't fold n >> m - InstructionFoldingCase( + 2, -std::numeric_limits::infinity()) +)); +// clang-format on + +using DoubleInstructionFoldingTest = + ::testing::TestWithParam>; + +TEST_P(DoubleInstructionFoldingTest, Case) { + const auto& tc = GetParam(); + + // Build module. + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, tc.test_body, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ASSERT_NE(nullptr, context); + + // Fold the instruction to test. + opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); + ir::Instruction* inst = def_use_mgr->GetDef(tc.id_to_fold); + bool succeeded = opt::FoldInstruction(inst); + + // Make sure the instruction folded as expected. + EXPECT_TRUE(succeeded); + if (inst != nullptr) { + EXPECT_EQ(inst->opcode(), SpvOpCopyObject); + inst = def_use_mgr->GetDef(inst->GetSingleWordInOperand(0)); + EXPECT_EQ(inst->opcode(), SpvOpConstant); + opt::analysis::ConstantManager* const_mrg = context->get_constant_mgr(); + const opt::analysis::FloatConstant* result = + const_mrg->GetConstantFromInst(inst)->AsFloatConstant(); + EXPECT_NE(result, nullptr); + if (result != nullptr) { + EXPECT_EQ(result->GetDoubleValue(), tc.expected_result); + } + } +} + +// clang-format off +INSTANTIATE_TEST_CASE_P(DoubleConstantFoldingTest, DoubleInstructionFoldingTest, +::testing::Values( + // Test case 0: Fold 2.0 - 1.0 + InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%m = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%load_m = OpLoad %uint %m\n" + - "%2 = OpShiftLeftLogical %int %load_n %load_m\n" + + "%2 = OpFSub %double %double_2 %double_1\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 8: Don't fold n | m - InstructionFoldingCase( - Header() + "%main = OpFunction %void None %void_func\n" + - "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%m = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + + 2, 1.0), + // Test case 1: Fold 2.0 + 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFAdd %double %double_2 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 3.0), + // Test case 2: Fold 3.0 * 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFMul %double %double_3 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 6.0), + // Test case 3: Fold 1.0 / 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFDiv %double %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0.5), + // Test case 4: Fold 1.0 / 0.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFDiv %double %double_1 %double_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, std::numeric_limits::infinity()), + // Test case 4: Fold -1.0 / 0.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFDiv %double %double_n1 %double_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, -std::numeric_limits::infinity()) +)); +// clang-format on + +// clang-format off +INSTANTIATE_TEST_CASE_P(DoubleOrderedCompareConstantFoldingTest, BooleanInstructionFoldingTest, + ::testing::Values( + // Test case 0: fold 1.0 == 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdEqual %bool %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 1: fold 1.0 != 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdNotEqual %bool %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 2: fold 1.0 < 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdLessThan %bool %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 3: fold 1.0 > 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdGreaterThan %bool %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 4: fold 1.0 <= 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdLessThanEqual %bool %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 5: fold 1.0 >= 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdGreaterThanEqual %bool %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 6: fold 1.0 == 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdEqual %bool %double_1 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 7: fold 1.0 != 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdNotEqual %bool %double_1 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 8: fold 1.0 < 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdLessThan %bool %double_1 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 9: fold 1.0 > 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdGreaterThan %bool %double_1 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 10: fold 1.0 <= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdLessThanEqual %bool %double_1 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 11: fold 1.0 >= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdGreaterThanEqual %bool %double_1 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 12: fold 2.0 < 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdLessThan %bool %double_2 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 13: fold 2.0 > 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdGreaterThan %bool %double_2 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 14: fold 2.0 <= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdLessThanEqual %bool %double_2 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 15: fold 2.0 >= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdGreaterThanEqual %bool %double_2 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true) +)); + +INSTANTIATE_TEST_CASE_P(DoubleUnorderedCompareConstantFoldingTest, BooleanInstructionFoldingTest, + ::testing::Values( + // Test case 0: fold 1.0 == 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordEqual %bool %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 1: fold 1.0 != 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordNotEqual %bool %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 2: fold 1.0 < 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordLessThan %bool %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 3: fold 1.0 > 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordGreaterThan %bool %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 4: fold 1.0 <= 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordLessThanEqual %bool %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 5: fold 1.0 >= 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordGreaterThanEqual %bool %double_1 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 6: fold 1.0 == 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordEqual %bool %double_1 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 7: fold 1.0 != 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordNotEqual %bool %double_1 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 8: fold 1.0 < 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordLessThan %bool %double_1 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 9: fold 1.0 > 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordGreaterThan %bool %double_1 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 10: fold 1.0 <= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordLessThanEqual %bool %double_1 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 11: fold 1.0 >= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordGreaterThanEqual %bool %double_1 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 12: fold 2.0 < 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordLessThan %bool %double_2 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 13: fold 2.0 > 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordGreaterThan %bool %double_2 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 14: fold 2.0 <= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordLessThanEqual %bool %double_2 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 15: fold 2.0 >= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordGreaterThanEqual %bool %double_2 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true) +)); + +INSTANTIATE_TEST_CASE_P(FloatOrderedCompareConstantFoldingTest, BooleanInstructionFoldingTest, + ::testing::Values( + // Test case 0: fold 1.0 == 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdEqual %bool %float_1 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 1: fold 1.0 != 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdNotEqual %bool %float_1 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 2: fold 1.0 < 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdLessThan %bool %float_1 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 3: fold 1.0 > 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdGreaterThan %bool %float_1 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 4: fold 1.0 <= 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdLessThanEqual %bool %float_1 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 5: fold 1.0 >= 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdGreaterThanEqual %bool %float_1 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 6: fold 1.0 == 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdEqual %bool %float_1 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 7: fold 1.0 != 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdNotEqual %bool %float_1 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 8: fold 1.0 < 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdLessThan %bool %float_1 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 9: fold 1.0 > 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdGreaterThan %bool %float_1 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 10: fold 1.0 <= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdLessThanEqual %bool %float_1 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 11: fold 1.0 >= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdGreaterThanEqual %bool %float_1 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 12: fold 2.0 < 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdLessThan %bool %float_2 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 13: fold 2.0 > 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdGreaterThan %bool %float_2 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 14: fold 2.0 <= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdLessThanEqual %bool %float_2 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 15: fold 2.0 >= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdGreaterThanEqual %bool %float_2 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true) +)); + +INSTANTIATE_TEST_CASE_P(FloatUnorderedCompareConstantFoldingTest, BooleanInstructionFoldingTest, + ::testing::Values( + // Test case 0: fold 1.0 == 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordEqual %bool %float_1 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 1: fold 1.0 != 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordNotEqual %bool %float_1 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 2: fold 1.0 < 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordLessThan %bool %float_1 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 3: fold 1.0 > 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordGreaterThan %bool %float_1 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 4: fold 1.0 <= 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordLessThanEqual %bool %float_1 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 5: fold 1.0 >= 2.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordGreaterThanEqual %bool %float_1 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 6: fold 1.0 == 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordEqual %bool %float_1 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 7: fold 1.0 != 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordNotEqual %bool %float_1 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 8: fold 1.0 < 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordLessThan %bool %float_1 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 9: fold 1.0 > 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordGreaterThan %bool %float_1 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 10: fold 1.0 <= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordLessThanEqual %bool %float_1 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 11: fold 1.0 >= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordGreaterThanEqual %bool %float_1 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 12: fold 2.0 < 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordLessThan %bool %float_2 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 13: fold 2.0 > 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordGreaterThan %bool %float_2 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 14: fold 2.0 <= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordLessThanEqual %bool %float_2 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 15: fold 2.0 >= 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordGreaterThanEqual %bool %float_2 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true) +)); + +INSTANTIATE_TEST_CASE_P(DoubleNaNCompareConstantFoldingTest, BooleanInstructionFoldingTest, + ::testing::Values( + // Test case 0: fold NaN == 0 (ord) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdEqual %bool %double_nan %double_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 1: fold NaN == NaN (unord) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordEqual %bool %double_nan %double_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 2: fold NaN != NaN (ord) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdNotEqual %bool %double_nan %double_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 3: fold NaN != NaN (unord) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordNotEqual %bool %double_nan %double_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true) +)); + +INSTANTIATE_TEST_CASE_P(FloatNaNCompareConstantFoldingTest, BooleanInstructionFoldingTest, + ::testing::Values( + // Test case 0: fold NaN == 0 (ord) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdEqual %bool %float_nan %float_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 1: fold NaN == NaN (unord) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordEqual %bool %float_nan %float_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 2: fold NaN != NaN (ord) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFOrdNotEqual %bool %float_nan %float_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, false), + // Test case 3: fold NaN != NaN (unord) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpFUnordNotEqual %bool %float_nan %float_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true) +)); +// clang-format on + +template +struct InstructionFoldingCaseWithMap { + InstructionFoldingCaseWithMap(const std::string& tb, uint32_t id, + ResultType result, + std::function map) + : test_body(tb), id_to_fold(id), expected_result(result), id_map(map) {} + + std::string test_body; + uint32_t id_to_fold; + ResultType expected_result; + std::function id_map; +}; + +using IntegerInstructionFoldingTestWithMap = + ::testing::TestWithParam>; + +TEST_P(IntegerInstructionFoldingTestWithMap, Case) { + const auto& tc = GetParam(); + + // Build module. + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, tc.test_body, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ASSERT_NE(nullptr, context); + + // Fold the instruction to test. + opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); + ir::Instruction* inst = def_use_mgr->GetDef(tc.id_to_fold); + inst = opt::FoldInstructionToConstant(inst, tc.id_map); + + // Make sure the instruction folded as expected. + EXPECT_NE(inst, nullptr); + if (inst != nullptr) { + EXPECT_EQ(inst->opcode(), SpvOpConstant); + opt::analysis::ConstantManager* const_mrg = context->get_constant_mgr(); + const opt::analysis::IntConstant* result = + const_mrg->GetConstantFromInst(inst)->AsIntConstant(); + EXPECT_NE(result, nullptr); + if (result != nullptr) { + EXPECT_EQ(result->GetU32BitValue(), tc.expected_result); + } + } +} +// clang-format off +INSTANTIATE_TEST_CASE_P(TestCase, IntegerInstructionFoldingTestWithMap, + ::testing::Values( + // Test case 0: fold %3 = 0; %3 * n + InstructionFoldingCaseWithMap( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load = OpLoad %int %n\n" + + "%3 = OpCopyObject %int %int_0\n" + "%2 = OpIMul %int %3 %load\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0, [](uint32_t id) {return (id == 3 ? INT_0_ID : id);}) + )); +// clang-format on + +using BooleanInstructionFoldingTestWithMap = + ::testing::TestWithParam>; + +TEST_P(BooleanInstructionFoldingTestWithMap, Case) { + const auto& tc = GetParam(); + + // Build module. + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, tc.test_body, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ASSERT_NE(nullptr, context); + + // Fold the instruction to test. + opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); + ir::Instruction* inst = def_use_mgr->GetDef(tc.id_to_fold); + inst = opt::FoldInstructionToConstant(inst, tc.id_map); + + // Make sure the instruction folded as expected. + EXPECT_NE(inst, nullptr); + if (inst != nullptr) { + std::vector bool_opcodes = {SpvOpConstantTrue, SpvOpConstantFalse}; + EXPECT_THAT(bool_opcodes, Contains(inst->opcode())); + opt::analysis::ConstantManager* const_mrg = context->get_constant_mgr(); + const opt::analysis::BoolConstant* result = + const_mrg->GetConstantFromInst(inst)->AsBoolConstant(); + EXPECT_NE(result, nullptr); + if (result != nullptr) { + EXPECT_EQ(result->value(), tc.expected_result); + } + } +} + +// clang-format off +INSTANTIATE_TEST_CASE_P(TestCase, BooleanInstructionFoldingTestWithMap, + ::testing::Values( + // Test case 0: fold %3 = true; %3 || n + InstructionFoldingCaseWithMap( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_bool Function\n" + + "%load = OpLoad %bool %n\n" + + "%3 = OpCopyObject %bool %true\n" + + "%2 = OpLogicalOr %bool %3 %load\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true, [](uint32_t id) {return (id == 3 ? TRUE_ID : id);}) + )); +// clang-format on + +using GeneralInstructionFoldingTest = + ::testing::TestWithParam>; + +TEST_P(GeneralInstructionFoldingTest, Case) { + const auto& tc = GetParam(); + + // Build module. + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, tc.test_body, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ASSERT_NE(nullptr, context); + + // Fold the instruction to test. + opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); + ir::Instruction* inst = def_use_mgr->GetDef(tc.id_to_fold); + std::unique_ptr original_inst(inst->Clone(context.get())); + bool succeeded = opt::FoldInstruction(inst); + + // Make sure the instruction folded as expected. + EXPECT_EQ(inst->result_id(), original_inst->result_id()); + EXPECT_EQ(inst->type_id(), original_inst->type_id()); + EXPECT_TRUE((!succeeded) == (tc.expected_result == 0)); + if (succeeded) { + EXPECT_EQ(inst->opcode(), SpvOpCopyObject); + EXPECT_EQ(inst->GetSingleWordInOperand(0), tc.expected_result); + } else { + EXPECT_EQ(inst->NumInOperands(), original_inst->NumInOperands()); + for (uint32_t i = 0; i < inst->NumInOperands(); ++i) { + EXPECT_EQ(inst->GetOperand(i), original_inst->GetOperand(i)); + } + } +} + +// clang-format off +INSTANTIATE_TEST_CASE_P(IntegerArithmeticTestCases, GeneralInstructionFoldingTest, + ::testing::Values( + // Test case 0: Don't fold n * m + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%m = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%load_m = OpLoad %int %m\n" + + "%2 = OpIMul %int %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 1: Don't fold n / m (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%m = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%load_m = OpLoad %uint %m\n" + + "%2 = OpUDiv %uint %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 2: Don't fold n / m (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%m = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%load_m = OpLoad %int %m\n" + + "%2 = OpSDiv %int %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 3: Don't fold n remainder m + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%m = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%load_m = OpLoad %int %m\n" + + "%2 = OpSRem %int %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 4: Don't fold n % m (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%m = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%load_m = OpLoad %int %m\n" + + "%2 = OpSMod %int %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 5: Don't fold n % m (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%m = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%load_m = OpLoad %uint %m\n" + + "%2 = OpUMod %int %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 6: Don't fold n << m + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%m = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%load_m = OpLoad %uint %m\n" + + "%2 = OpShiftRightLogical %int %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 7: Don't fold n >> m + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%m = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%load_m = OpLoad %uint %m\n" + + "%2 = OpShiftLeftLogical %int %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 8: Don't fold n | m + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%m = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + "%load_m = OpLoad %uint %m\n" + "%2 = OpBitwiseOr %int %load_n %load_m\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 9: Don't fold n & m + // Test case 9: Don't fold n & m + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%m = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%load_m = OpLoad %uint %m\n" + + "%2 = OpBitwiseAnd %int %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 10: Don't fold n < m (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%m = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%load_m = OpLoad %uint %m\n" + + "%2 = OpULessThan %bool %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 11: Don't fold n > m (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%m = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%load_m = OpLoad %uint %m\n" + + "%2 = OpUGreaterThan %bool %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 12: Don't fold n <= m (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%m = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%load_m = OpLoad %uint %m\n" + + "%2 = OpULessThanEqual %bool %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 13: Don't fold n >= m (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%m = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%load_m = OpLoad %uint %m\n" + + "%2 = OpUGreaterThanEqual %bool %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 14: Don't fold n < m (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%m = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%load_m = OpLoad %int %m\n" + + "%2 = OpULessThan %bool %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 15: Don't fold n > m (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%m = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%load_m = OpLoad %int %m\n" + + "%2 = OpUGreaterThan %bool %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 16: Don't fold n <= m (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%m = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%load_m = OpLoad %int %m\n" + + "%2 = OpULessThanEqual %bool %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 17: Don't fold n >= m (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%m = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%load_m = OpLoad %int %m\n" + + "%2 = OpUGreaterThanEqual %bool %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 18: Don't fold n || m + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_bool Function\n" + + "%m = OpVariable %_ptr_bool Function\n" + + "%load_n = OpLoad %bool %n\n" + + "%load_m = OpLoad %bool %m\n" + + "%2 = OpLogicalOr %bool %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 19: Don't fold n && m + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_bool Function\n" + + "%m = OpVariable %_ptr_bool Function\n" + + "%load_n = OpLoad %bool %n\n" + + "%load_m = OpLoad %bool %m\n" + + "%2 = OpLogicalAnd %bool %load_n %load_m\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 20: Don't fold n * 3 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%2 = OpIMul %int %load_n %int_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 21: Don't fold n / 3 (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%2 = OpUDiv %uint %load_n %uint_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 22: Don't fold n / 3 (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%2 = OpSDiv %int %load_n %int_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 23: Don't fold n remainder 3 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%2 = OpSRem %int %load_n %int_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 24: Don't fold n % 3 (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%2 = OpSMod %int %load_n %int_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 25: Don't fold n % 3 (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%2 = OpUMod %int %load_n %int_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 26: Don't fold n << 3 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%2 = OpShiftRightLogical %int %load_n %int_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 27: Don't fold n >> 3 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%2 = OpShiftLeftLogical %int %load_n %int_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 28: Don't fold n | 3 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%2 = OpBitwiseOr %int %load_n %int_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 29: Don't fold n & 3 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%2 = OpBitwiseAnd %uint %load_n %uint_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 30: Don't fold n < 3 (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%2 = OpULessThan %bool %load_n %uint_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 31: Don't fold n > 3 (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%2 = OpUGreaterThan %bool %load_n %uint_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 32: Don't fold n <= 3 (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%2 = OpULessThanEqual %bool %load_n %uint_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 33: Don't fold n >= 3 (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%load_n = OpLoad %uint %n\n" + + "%2 = OpUGreaterThanEqual %bool %load_n %uint_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 34: Don't fold n < 3 (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%2 = OpULessThan %bool %load_n %int_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 35: Don't fold n > 3 (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%2 = OpUGreaterThan %bool %load_n %int_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 36: Don't fold n <= 3 (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%2 = OpULessThanEqual %bool %load_n %int_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 37: Don't fold n >= 3 (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load_n = OpLoad %int %n\n" + + "%2 = OpUGreaterThanEqual %bool %load_n %int_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 38: Don't fold 0 + 3 (long), bad length + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpIAdd %long %long_0 %long_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 39: Don't fold 0 + 3 (short), bad length + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpIAdd %short %short_0 %short_3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 40: fold 1*n + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%3 = OpLoad %int %n\n" + + "%2 = OpIMul %int %int_1 %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 3), + // Test case 41: fold n*1 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%3 = OpLoad %int %n\n" + + "%2 = OpIMul %int %3 %int_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 3) +)); + +INSTANTIATE_TEST_CASE_P(CompositeExtractFoldingTest, GeneralInstructionFoldingTest, +::testing::Values( + // Test case 0: fold Insert feeding extract + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %n\n" + + "%3 = OpCompositeInsert %v4int %2 %v4int_0_0_0_0 0\n" + + "%4 = OpCompositeInsert %v4int %int_1 %3 1\n" + + "%5 = OpCompositeInsert %v4int %int_1 %4 2\n" + + "%6 = OpCompositeInsert %v4int %int_1 %5 3\n" + + "%7 = OpCompositeExtract %int %6 0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 7, 2), + // Test case 1: fold Composite construct feeding extract (position 0) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %n\n" + + "%3 = OpCompositeConstruct %v4int %2 %int_0 %int_0 %int_0\n" + + "%4 = OpCompositeExtract %int %3 0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, 2), + // Test case 2: fold Composite construct feeding extract (position 3) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %n\n" + + "%3 = OpCompositeConstruct %v4int %2 %int_0 %int_0 %100\n" + + "%4 = OpCompositeExtract %int %3 3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, INT_0_ID), + // Test case 3: fold Composite construct with vectors feeding extract (scalar element) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %n\n" + + "%3 = OpCompositeConstruct %v2int %2 %int_0\n" + + "%4 = OpCompositeConstruct %v4int %3 %int_0 %100\n" + + "%5 = OpCompositeExtract %int %4 3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 5, INT_0_ID), + // Test case 4: fold Composite construct with vectors feeding extract (start of vector element) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %n\n" + + "%3 = OpCompositeConstruct %v2int %2 %int_0\n" + + "%4 = OpCompositeConstruct %v4int %3 %int_0 %100\n" + + "%5 = OpCompositeExtract %int %4 0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 5, 2), + // Test case 5: fold Composite construct with vectors feeding extract (middle of vector element) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %n\n" + + "%3 = OpCompositeConstruct %v2int %int_0 %2\n" + + "%4 = OpCompositeConstruct %v4int %3 %int_0 %100\n" + + "%5 = OpCompositeExtract %int %4 1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 5, 2), + // Test case 6: fold Composite construct with multiple indices. + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %n\n" + + "%3 = OpCompositeConstruct %v2int %int_0 %2\n" + + "%4 = OpCompositeConstruct %struct_v2int_int_int %3 %int_0 %100\n" + + "%5 = OpCompositeExtract %int %4 0 1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 5, 2), + // Test case 7: fold constant extract. + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpCompositeExtract %int %102 1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, INT_7_ID), + // Test case 8: constant struct has OpUndef + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpCompositeExtract %int %struct_undef_0_0 0 1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 9: Extracting a member of element inserted via Insert + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_struct_v2int_int_int Function\n" + + "%2 = OpLoad %struct_v2int_int_int %n\n" + + "%3 = OpCompositeInsert %struct_v2int_int_int %102 %2 0\n" + + "%4 = OpCompositeExtract %int %3 0 1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, 103), + // Test case 10: Extracting a element that is partially changed by Insert. (Don't fold) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_struct_v2int_int_int Function\n" + + "%2 = OpLoad %struct_v2int_int_int %n\n" + + "%3 = OpCompositeInsert %struct_v2int_int_int %int_0 %2 0 1\n" + + "%4 = OpCompositeExtract %v2int %3 0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, 0), + // Test case 11: Extracting from result of vector shuffle (first input) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_v2int Function\n" + + "%2 = OpLoad %v2int %n\n" + + "%3 = OpVectorShuffle %v2int %102 %2 3 0\n" + + "%4 = OpCompositeExtract %int %3 1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, INT_7_ID), + // Test case 12: Extracting from result of vector shuffle (second input) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_v2int Function\n" + + "%2 = OpLoad %v2int %n\n" + + "%3 = OpVectorShuffle %v2int %2 %102 2 0\n" + + "%4 = OpCompositeExtract %int %3 0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, INT_7_ID) +)); + +INSTANTIATE_TEST_CASE_P(CompositeConstructFoldingTest, GeneralInstructionFoldingTest, +::testing::Values( + // Test case 0: fold Extracts feeding construct + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpCopyObject %v4int %v4int_0_0_0_0\n" + + "%3 = OpCompositeExtract %int %2 0\n" + + "%4 = OpCompositeExtract %int %2 1\n" + + "%5 = OpCompositeExtract %int %2 2\n" + + "%6 = OpCompositeExtract %int %2 3\n" + + "%7 = OpCompositeConstruct %v4int %3 %4 %5 %6\n" + + "OpReturn\n" + + "OpFunctionEnd", + 7, 2), + // Test case 1: Don't fold Extracts feeding construct (Different source) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpCopyObject %v4int %v4int_0_0_0_0\n" + + "%3 = OpCompositeExtract %int %2 0\n" + + "%4 = OpCompositeExtract %int %2 1\n" + + "%5 = OpCompositeExtract %int %2 2\n" + + "%6 = OpCompositeExtract %int %v4int_0_0_0_0 3\n" + + "%7 = OpCompositeConstruct %v4int %3 %4 %5 %6\n" + + "OpReturn\n" + + "OpFunctionEnd", + 7, 0), + // Test case 2: Don't fold Extracts feeding construct (bad indices) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpCopyObject %v4int %v4int_0_0_0_0\n" + + "%3 = OpCompositeExtract %int %2 0\n" + + "%4 = OpCompositeExtract %int %2 0\n" + + "%5 = OpCompositeExtract %int %2 2\n" + + "%6 = OpCompositeExtract %int %2 3\n" + + "%7 = OpCompositeConstruct %v4int %3 %4 %5 %6\n" + + "OpReturn\n" + + "OpFunctionEnd", + 7, 0), + // Test case 3: Don't fold Extracts feeding construct (different type) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpCopyObject %struct_v2int_int_int %struct_v2int_int_int_null\n" + + "%3 = OpCompositeExtract %v2int %2 0\n" + + "%4 = OpCompositeExtract %int %2 1\n" + + "%5 = OpCompositeExtract %int %2 2\n" + + "%7 = OpCompositeConstruct %v4int %3 %4 %5\n" + + "OpReturn\n" + + "OpFunctionEnd", + 7, 0), + // Test case 4: Fold construct with constants to constant. + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpCompositeConstruct %v2int %103 %103\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, VEC2_0_ID) +)); + +INSTANTIATE_TEST_CASE_P(PhiFoldingTest, GeneralInstructionFoldingTest, +::testing::Values( + // Test case 0: Fold phi with the same values for all edges. + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + " OpBranchConditional %true %l1 %l2\n" + + "%l1 = OpLabel\n" + + " OpBranch %merge_lab\n" + + "%l2 = OpLabel\n" + + " OpBranch %merge_lab\n" + + "%merge_lab = OpLabel\n" + + "%2 = OpPhi %int %100 %l1 %100 %l2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, INT_0_ID), + // Test case 1: Fold phi in pass through loop. + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + " OpBranch %l1\n" + + "%l1 = OpLabel\n" + + "%2 = OpPhi %int %100 %main_lab %2 %l1\n" + + " OpBranchConditional %true %l1 %merge_lab\n" + + "%merge_lab = OpLabel\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, INT_0_ID), + // Test case 2: Don't Fold phi because of different values. + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + " OpBranch %l1\n" + + "%l1 = OpLabel\n" + + "%2 = OpPhi %int %int_0 %main_lab %int_3 %l1\n" + + " OpBranchConditional %true %l1 %merge_lab\n" + + "%merge_lab = OpLabel\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0) +)); + +INSTANTIATE_TEST_CASE_P(FloatRedundantFoldingTest, GeneralInstructionFoldingTest, + ::testing::Values( + // Test case 0: Don't fold n + 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFAdd %float %3 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 1: Don't fold n - 1.0 InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%m = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%load_m = OpLoad %uint %m\n" + - "%2 = OpBitwiseAnd %int %load_n %load_m\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFSub %float %3 %float_2\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 10: Don't fold n < m (unsigned) + // Test case 2: Don't fold n * 2.0 InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%m = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%load_m = OpLoad %uint %m\n" + - "%2 = OpULessThan %bool %load_n %load_m\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFMul %float %3 %float_2\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 11: Don't fold n > m (unsigned) + // Test case 3: Fold n + 0.0 InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%m = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%load_m = OpLoad %uint %m\n" + - "%2 = OpUGreaterThan %bool %load_n %load_m\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFAdd %float %3 %float_0\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 12: Don't fold n <= m (unsigned) + 2, 3), + // Test case 4: Fold 0.0 + n InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%m = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%load_m = OpLoad %uint %m\n" + - "%2 = OpULessThanEqual %bool %load_n %load_m\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFAdd %float %float_0 %3\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 13: Don't fold n >= m (unsigned) + 2, 3), + // Test case 5: Fold n - 0.0 InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%m = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%load_m = OpLoad %uint %m\n" + - "%2 = OpUGreaterThanEqual %bool %load_n %load_m\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFSub %float %3 %float_0\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 14: Don't fold n < m (signed) + 2, 3), + // Test case 6: Fold n * 1.0 InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%m = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%load_m = OpLoad %int %m\n" + - "%2 = OpULessThan %bool %load_n %load_m\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFMul %float %3 %float_1\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 15: Don't fold n > m (signed) + 2, 3), + // Test case 7: Fold 1.0 * n InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%m = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%load_m = OpLoad %int %m\n" + - "%2 = OpUGreaterThan %bool %load_n %load_m\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFMul %float %float_1 %3\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 16: Don't fold n <= m (signed) + 2, 3), + // Test case 8: Fold n / 1.0 InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%m = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%load_m = OpLoad %int %m\n" + - "%2 = OpULessThanEqual %bool %load_n %load_m\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFDiv %float %3 %float_1\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 17: Don't fold n >= m (signed) + 2, 3), + // Test case 9: Fold n * 0.0 InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%m = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%load_m = OpLoad %int %m\n" + - "%2 = OpUGreaterThanEqual %bool %load_n %load_m\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFMul %float %3 %104\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 18: Don't fold n || m + 2, FLOAT_0_ID), + // Test case 10: Fold 0.0 * n InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_bool Function\n" + - "%m = OpVariable %_ptr_bool Function\n" + - "%load_n = OpLoad %bool %n\n" + - "%load_m = OpLoad %bool %m\n" + - "%2 = OpLogicalOr %bool %load_n %load_m\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFMul %float %104 %3\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 19: Don't fold n && m + 2, FLOAT_0_ID), + // Test case 11: Fold 0.0 / n InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_bool Function\n" + - "%m = OpVariable %_ptr_bool Function\n" + - "%load_n = OpLoad %bool %n\n" + - "%load_m = OpLoad %bool %m\n" + - "%2 = OpLogicalAnd %bool %load_n %load_m\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFDiv %float %104 %3\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 20: Don't fold n * 3 + 2, FLOAT_0_ID), + // Test case 12: Don't fold mix(a, b, 2.0) InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%2 = OpIMul %int %load_n %int_3\n" + + "%a = OpVariable %_ptr_float Function\n" + + "%b = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %a\n" + + "%4 = OpLoad %float %b\n" + + "%2 = OpExtInst %float %1 FMix %3 %4 %float_2\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 21: Don't fold n / 3 (unsigned) + // Test case 13: Fold mix(a, b, 0.0) InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%2 = OpUDiv %uint %load_n %uint_3\n" + + "%a = OpVariable %_ptr_float Function\n" + + "%b = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %a\n" + + "%4 = OpLoad %float %b\n" + + "%2 = OpExtInst %float %1 FMix %3 %4 %float_0\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 22: Don't fold n / 3 (signed) + 2, 3), + // Test case 14: Fold mix(a, b, 1.0) InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%2 = OpSDiv %int %load_n %int_3\n" + + "%a = OpVariable %_ptr_float Function\n" + + "%b = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %a\n" + + "%4 = OpLoad %float %b\n" + + "%2 = OpExtInst %float %1 FMix %3 %4 %float_1\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 23: Don't fold n remainder 3 + 2, 4), + // Test case 15: Fold vector fadd with null InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%2 = OpSRem %int %load_n %int_3\n" + + "%a = OpVariable %_ptr_v2float Function\n" + + "%2 = OpLoad %v2float %a\n" + + "%3 = OpFAdd %v2float %2 %v2float_null\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 24: Don't fold n % 3 (signed) + 3, 2), + // Test case 16: Fold vector fadd with null InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%2 = OpSMod %int %load_n %int_3\n" + + "%a = OpVariable %_ptr_v2float Function\n" + + "%2 = OpLoad %v2float %a\n" + + "%3 = OpFAdd %v2float %v2float_null %2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 3, 2), + // Test case 15: Fold vector fsub with null + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%a = OpVariable %_ptr_v2float Function\n" + + "%2 = OpLoad %v2float %a\n" + + "%3 = OpFSub %v2float %2 %v2float_null\n" + + "OpReturn\n" + + "OpFunctionEnd", + 3, 2), + // Test case 16: Fold 0.0(half) * n + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_half Function\n" + + "%3 = OpLoad %half %n\n" + + "%2 = OpFMul %half %108 %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, HALF_0_ID), + // Test case 17: Don't fold 1.0(half) * n + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_half Function\n" + + "%3 = OpLoad %half %n\n" + + "%2 = OpFMul %half %half_1 %3\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 25: Don't fold n % 3 (unsigned) + // Test case 18: Don't fold 1.0 * 1.0 (half) InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%2 = OpUMod %int %load_n %int_3\n" + + "%2 = OpFMul %half %half_1 %half_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0) +)); + +INSTANTIATE_TEST_CASE_P(DoubleRedundantFoldingTest, GeneralInstructionFoldingTest, + ::testing::Values( + // Test case 0: Don't fold n + 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFAdd %double %3 %double_2\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 26: Don't fold n << 3 + // Test case 1: Don't fold n - 1.0 InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%2 = OpShiftRightLogical %int %load_n %int_3\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFSub %double %3 %double_2\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 27: Don't fold n >> 3 + // Test case 2: Don't fold n * 2.0 InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%2 = OpShiftLeftLogical %int %load_n %int_3\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFMul %double %3 %double_2\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 28: Don't fold n | 3 + // Test case 3: Fold n + 0.0 InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%2 = OpBitwiseOr %int %load_n %int_3\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFAdd %double %3 %double_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 3), + // Test case 4: Fold 0.0 + n + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFAdd %double %double_0 %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 3), + // Test case 5: Fold n - 0.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFSub %double %3 %double_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 3), + // Test case 6: Fold n * 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFMul %double %3 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 3), + // Test case 7: Fold 1.0 * n + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFMul %double %double_1 %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 3), + // Test case 8: Fold n / 1.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFDiv %double %3 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 3), + // Test case 9: Fold n * 0.0 + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFMul %double %3 %105\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, DOUBLE_0_ID), + // Test case 10: Fold 0.0 * n + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFMul %double %105 %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, DOUBLE_0_ID), + // Test case 11: Fold 0.0 / n + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFDiv %double %105 %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, DOUBLE_0_ID), + // Test case 12: Don't fold mix(a, b, 2.0) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%a = OpVariable %_ptr_double Function\n" + + "%b = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %a\n" + + "%4 = OpLoad %double %b\n" + + "%2 = OpExtInst %double %1 FMix %3 %4 %double_2\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 29: Don't fold n & 3 + // Test case 13: Fold mix(a, b, 0.0) InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%2 = OpBitwiseAnd %uint %load_n %uint_3\n" + + "%a = OpVariable %_ptr_double Function\n" + + "%b = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %a\n" + + "%4 = OpLoad %double %b\n" + + "%2 = OpExtInst %double %1 FMix %3 %4 %double_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 3), + // Test case 14: Fold mix(a, b, 1.0) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%a = OpVariable %_ptr_double Function\n" + + "%b = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %a\n" + + "%4 = OpLoad %double %b\n" + + "%2 = OpExtInst %double %1 FMix %3 %4 %double_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 4) +)); + +INSTANTIATE_TEST_CASE_P(FloatVectorRedundantFoldingTest, GeneralInstructionFoldingTest, + ::testing::Values( + // Test case 0: Don't fold a * vec4(0.0, 0.0, 0.0, 1.0) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_v4float Function\n" + + "%3 = OpLoad %v4float %n\n" + + "%2 = OpFMul %v4float %3 %v4float_0_0_0_1\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 30: Don't fold n < 3 (unsigned) + // Test case 1: Fold a * vec4(0.0, 0.0, 0.0, 0.0) InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%2 = OpULessThan %bool %load_n %uint_3\n" + + "%n = OpVariable %_ptr_v4float Function\n" + + "%3 = OpLoad %v4float %n\n" + + "%2 = OpFMul %v4float %3 %106\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, VEC4_0_ID), + // Test case 2: Fold a * vec4(1.0, 1.0, 1.0, 1.0) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_v4float Function\n" + + "%3 = OpLoad %v4float %n\n" + + "%2 = OpFMul %v4float %3 %v4float_1_1_1_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 3) +)); + +INSTANTIATE_TEST_CASE_P(DoubleVectorRedundantFoldingTest, GeneralInstructionFoldingTest, + ::testing::Values( + // Test case 0: Don't fold a * vec4(0.0, 0.0, 0.0, 1.0) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_v4double Function\n" + + "%3 = OpLoad %v4double %n\n" + + "%2 = OpFMul %v4double %3 %v4double_0_0_0_1\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 31: Don't fold n > 3 (unsigned) + // Test case 1: Fold a * vec4(0.0, 0.0, 0.0, 0.0) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_v4double Function\n" + + "%3 = OpLoad %v4double %n\n" + + "%2 = OpFMul %v4double %3 %106\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, DVEC4_0_ID), + // Test case 2: Fold a * vec4(1.0, 1.0, 1.0, 1.0) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_v4double Function\n" + + "%3 = OpLoad %v4double %n\n" + + "%2 = OpFMul %v4double %3 %v4double_1_1_1_1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 3) +)); + +INSTANTIATE_TEST_CASE_P(FToIConstantFoldingTest, IntegerInstructionFoldingTest, + ::testing::Values( + // Test case 0: Fold int(3.0) InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%2 = OpUGreaterThan %bool %load_n %uint_3\n" + + "%2 = OpConvertFToS %int %float_3\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 32: Don't fold n <= 3 (unsigned) + 2, 3), + // Test case 1: Fold uint(3.0) InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%2 = OpULessThanEqual %bool %load_n %uint_3\n" + + "%2 = OpConvertFToU %int %float_3\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 33: Don't fold n >= 3 (unsigned) - InstructionFoldingCase( + 2, 3) +)); + +INSTANTIATE_TEST_CASE_P(IToFConstantFoldingTest, FloatInstructionFoldingTest, + ::testing::Values( + // Test case 0: Fold float(3) + InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_uint Function\n" + - "%load_n = OpLoad %uint %n\n" + - "%2 = OpUGreaterThanEqual %bool %load_n %uint_3\n" + + "%2 = OpConvertSToF %float %int_3\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 34: Don't fold n < 3 (signed) - InstructionFoldingCase( + 2, 3.0), + // Test case 1: Fold float(3u) + InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%2 = OpULessThan %bool %load_n %int_3\n" + + "%2 = OpConvertUToF %float %uint_3\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 35: Don't fold n > 3 (signed) + 2, 3.0) +)); +// clang-format on + +using ToNegateFoldingTest = + ::testing::TestWithParam>; + +TEST_P(ToNegateFoldingTest, Case) { + const auto& tc = GetParam(); + + // Build module. + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, tc.test_body, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ASSERT_NE(nullptr, context); + + // Fold the instruction to test. + opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); + ir::Instruction* inst = def_use_mgr->GetDef(tc.id_to_fold); + std::unique_ptr original_inst(inst->Clone(context.get())); + bool succeeded = opt::FoldInstruction(inst); + + // Make sure the instruction folded as expected. + EXPECT_EQ(inst->result_id(), original_inst->result_id()); + EXPECT_EQ(inst->type_id(), original_inst->type_id()); + EXPECT_TRUE((!succeeded) == (tc.expected_result == 0)); + if (succeeded) { + EXPECT_EQ(inst->opcode(), SpvOpFNegate); + EXPECT_EQ(inst->GetSingleWordInOperand(0), tc.expected_result); + } else { + EXPECT_EQ(inst->NumInOperands(), original_inst->NumInOperands()); + for (uint32_t i = 0; i < inst->NumInOperands(); ++i) { + EXPECT_EQ(inst->GetOperand(i), original_inst->GetOperand(i)); + } + } +} + +// clang-format off +INSTANTIATE_TEST_CASE_P(FloatRedundantSubFoldingTest, ToNegateFoldingTest, + ::testing::Values( + // Test case 0: Don't fold 1.0 - n InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%2 = OpUGreaterThan %bool %load_n %int_3\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFSub %float %float_1 %3\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 36: Don't fold n <= 3 (signed) + // Test case 1: Fold 0.0 - n InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%2 = OpULessThanEqual %bool %load_n %int_3\n" + + "%n = OpVariable %_ptr_float Function\n" + + "%3 = OpLoad %float %n\n" + + "%2 = OpFSub %float %float_0 %3\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 37: Don't fold n >= 3 (signed) + 2, 3), + // Test case 2: Don't fold (0,0,0,1) - n InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%load_n = OpLoad %int %n\n" + - "%2 = OpUGreaterThanEqual %bool %load_n %int_3\n" + + "%n = OpVariable %_ptr_v4float Function\n" + + "%3 = OpLoad %v4float %n\n" + + "%2 = OpFSub %v4float %v4float_0_0_0_1 %3\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 38: Don't fold 0 + 3 (long), bad length + // Test case 3: Fold (0,0,0,0) - n InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%2 = OpIAdd %long %long_0 %long_3\n" + + "%n = OpVariable %_ptr_v4float Function\n" + + "%3 = OpLoad %v4float %n\n" + + "%2 = OpFSub %v4float %v4float_0_0_0_0 %3\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 0), - // Test case 39: Don't fold 0 + 3 (short), bad length + 2, 3) +)); + +INSTANTIATE_TEST_CASE_P(DoubleRedundantSubFoldingTest, ToNegateFoldingTest, + ::testing::Values( + // Test case 0: Don't fold 1.0 - n InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%2 = OpIAdd %short %short_0 %short_3\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFSub %double %double_1 %3\n" + "OpReturn\n" + "OpFunctionEnd", 2, 0), - // Test case 40: fold 1*n + // Test case 1: Fold 0.0 - n InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%3 = OpLoad %int %n\n" + - "%2 = OpIMul %int %int_1 %3\n" + + "%n = OpVariable %_ptr_double Function\n" + + "%3 = OpLoad %double %n\n" + + "%2 = OpFSub %double %double_0 %3\n" + "OpReturn\n" + "OpFunctionEnd", 2, 3), - // Test case 41: fold n*1 + // Test case 2: Don't fold (0,0,0,1) - n InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%3 = OpLoad %int %n\n" + - "%2 = OpIMul %int %3 %int_1\n" + + "%n = OpVariable %_ptr_v4double Function\n" + + "%3 = OpLoad %v4double %n\n" + + "%2 = OpFSub %v4double %v4double_0_0_0_1 %3\n" + "OpReturn\n" + "OpFunctionEnd", - 2, 3), - // Test case 42: fold Insert feeding extract + 2, 0), + // Test case 3: Fold (0,0,0,0) - n InstructionFoldingCase( Header() + "%main = OpFunction %void None %void_func\n" + "%main_lab = OpLabel\n" + - "%n = OpVariable %_ptr_int Function\n" + - "%2 = OpLoad %int %n\n" + - "%3 = OpCompositeInsert %v4int %2 %v4int_0_0_0_0 0\n" + - "%4 = OpCompositeInsert %v4int %int_1 %3 1\n" + - "%5 = OpCompositeInsert %v4int %int_1 %4 2\n" + - "%6 = OpCompositeInsert %v4int %int_1 %5 3\n" + - "%7 = OpCompositeExtract %int %6 0\n" + + "%n = OpVariable %_ptr_v4double Function\n" + + "%3 = OpLoad %v4double %n\n" + + "%2 = OpFSub %v4double %v4double_0_0_0_0 %3\n" + "OpReturn\n" + "OpFunctionEnd", - 7, 2) + 2, 3) )); -// clang-format off + +#ifdef SPIRV_EFFCEE +using MatchingInstructionFoldingTest = + ::testing::TestWithParam>; + +TEST_P(MatchingInstructionFoldingTest, Case) { + const auto& tc = GetParam(); + + // Build module. + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, tc.test_body, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ASSERT_NE(nullptr, context); + + // Fold the instruction to test. + opt::analysis::DefUseManager* def_use_mgr = context->get_def_use_mgr(); + ir::Instruction* inst = def_use_mgr->GetDef(tc.id_to_fold); + std::unique_ptr original_inst(inst->Clone(context.get())); + bool succeeded = opt::FoldInstruction(inst); + EXPECT_EQ(succeeded, tc.expected_result); + if (succeeded) { + Match(tc.test_body, context.get()); + } +} + +INSTANTIATE_TEST_CASE_P(MergeNegateTest, MatchingInstructionFoldingTest, +::testing::Values( + // Test case 0: fold consecutive fnegate + // -(-x) = x + InstructionFoldingCase( + Header() + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float:%\\w+]]\n" + + "; CHECK: %4 = OpCopyObject [[float]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFNegate %float %2\n" + + "%4 = OpFNegate %float %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 1: fold fnegate(fmul with const). + // -(x * 2.0) = x * -2.0 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_n2:%\\w+]] = OpConstant [[float]] -2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFMul [[float]] [[ld]] [[float_n2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFMul %float %2 %float_2\n" + + "%4 = OpFNegate %float %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 2: fold fnegate(fmul with const). + // -(2.0 * x) = x * 2.0 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_n2:%\\w+]] = OpConstant [[float]] -2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFMul [[float]] [[ld]] [[float_n2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFMul %float %float_2 %2\n" + + "%4 = OpFNegate %float %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 3: fold fnegate(fdiv with const). + // -(x / 2.0) = x * -0.5 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_n0p5:%\\w+]] = OpConstant [[float]] -0.5\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFMul [[float]] [[ld]] [[float_n0p5]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFDiv %float %2 %float_2\n" + + "%4 = OpFNegate %float %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 4: fold fnegate(fdiv with const). + // -(2.0 / x) = -2.0 / x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_n2:%\\w+]] = OpConstant [[float]] -2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFDiv [[float]] [[float_n2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFDiv %float %float_2 %2\n" + + "%4 = OpFNegate %float %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 5: fold fnegate(fadd with const). + // -(2.0 + x) = -2.0 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_n2:%\\w+]] = OpConstant [[float]] -2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[float_n2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFAdd %float %float_2 %2\n" + + "%4 = OpFNegate %float %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 6: fold fnegate(fadd with const). + // -(x + 2.0) = -2.0 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_n2:%\\w+]] = OpConstant [[float]] -2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[float_n2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFAdd %float %2 %float_2\n" + + "%4 = OpFNegate %float %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 7: fold fnegate(fsub with const). + // -(2.0 - x) = x - 2.0 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_2:%\\w+]] = OpConstant [[float]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[ld]] [[float_2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFSub %float %float_2 %2\n" + + "%4 = OpFNegate %float %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 8: fold fnegate(fsub with const). + // -(x - 2.0) = 2.0 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_2:%\\w+]] = OpConstant [[float]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[float_2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFSub %float %2 %float_2\n" + + "%4 = OpFNegate %float %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 9: fold consecutive snegate + // -(-x) = x + InstructionFoldingCase( + Header() + + "; CHECK: [[ld:%\\w+]] = OpLoad [[int:%\\w+]]\n" + + "; CHECK: %4 = OpCopyObject [[int]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpSNegate %int %2\n" + + "%4 = OpSNegate %int %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 10: fold consecutive vector negate + // -(-x) = x + InstructionFoldingCase( + Header() + + "; CHECK: [[ld:%\\w+]] = OpLoad [[v2float:%\\w+]]\n" + + "; CHECK: %4 = OpCopyObject [[v2float]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_v2float Function\n" + + "%2 = OpLoad %v2float %var\n" + + "%3 = OpFNegate %v2float %2\n" + + "%4 = OpFNegate %v2float %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 11: fold snegate(iadd with const). + // -(2 + x) = -2 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: OpConstant [[int]] -2147483648\n" + + "; CHECK: [[int_n2:%\\w+]] = OpConstant [[int]] -2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[int]]\n" + + "; CHECK: %4 = OpISub [[int]] [[int_n2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpIAdd %int %int_2 %2\n" + + "%4 = OpSNegate %int %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 12: fold snegate(iadd with const). + // -(x + 2) = -2 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: OpConstant [[int]] -2147483648\n" + + "; CHECK: [[int_n2:%\\w+]] = OpConstant [[int]] -2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[int]]\n" + + "; CHECK: %4 = OpISub [[int]] [[int_n2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpIAdd %int %2 %int_2\n" + + "%4 = OpSNegate %int %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 13: fold snegate(isub with const). + // -(2 - x) = x - 2 + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[int_2:%\\w+]] = OpConstant [[int]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[int]]\n" + + "; CHECK: %4 = OpISub [[int]] [[ld]] [[int_2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpISub %int %int_2 %2\n" + + "%4 = OpSNegate %int %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 14: fold snegate(isub with const). + // -(x - 2) = 2 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[int_2:%\\w+]] = OpConstant [[int]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[int]]\n" + + "; CHECK: %4 = OpISub [[int]] [[int_2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpISub %int %2 %int_2\n" + + "%4 = OpSNegate %int %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 15: fold snegate(iadd with const). + // -(x + 2) = -2 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[long:%\\w+]] = OpTypeInt 64 1\n" + + "; CHECK: [[long_n2:%\\w+]] = OpConstant [[long]] -2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[long]]\n" + + "; CHECK: %4 = OpISub [[long]] [[long_n2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_long Function\n" + + "%2 = OpLoad %long %var\n" + + "%3 = OpIAdd %long %2 %long_2\n" + + "%4 = OpSNegate %long %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 16: fold snegate(isub with const). + // -(2 - x) = x - 2 + InstructionFoldingCase( + Header() + + "; CHECK: [[long:%\\w+]] = OpTypeInt 64 1\n" + + "; CHECK: [[long_2:%\\w+]] = OpConstant [[long]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[long]]\n" + + "; CHECK: %4 = OpISub [[long]] [[ld]] [[long_2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_long Function\n" + + "%2 = OpLoad %long %var\n" + + "%3 = OpISub %long %long_2 %2\n" + + "%4 = OpSNegate %long %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 17: fold snegate(isub with const). + // -(x - 2) = 2 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[long:%\\w+]] = OpTypeInt 64 1\n" + + "; CHECK: [[long_2:%\\w+]] = OpConstant [[long]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[long]]\n" + + "; CHECK: %4 = OpISub [[long]] [[long_2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_long Function\n" + + "%2 = OpLoad %long %var\n" + + "%3 = OpISub %long %2 %long_2\n" + + "%4 = OpSNegate %long %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true) +)); + +INSTANTIATE_TEST_CASE_P(ReciprocalFDivTest, MatchingInstructionFoldingTest, +::testing::Values( + // Test case 0: scalar reicprocal + // x / 0.5 = x * 2.0 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_2:%\\w+]] = OpConstant [[float]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %3 = OpFMul [[float]] [[ld]] [[float_2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFDiv %float %2 %float_0p5\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 3, true), + // Test case 1: Unfoldable + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_0:%\\w+]] = OpConstant [[float]] 0\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %3 = OpFDiv [[float]] [[ld]] [[float_0]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFDiv %float %2 %104\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 3, false), + // Test case 2: Vector reciprocal + // x / {2.0, 0.5} = x * {0.5, 2.0} + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[v2float:%\\w+]] = OpTypeVector [[float]] 2\n" + + "; CHECK: [[float_2:%\\w+]] = OpConstant [[float]] 2\n" + + "; CHECK: [[float_0p5:%\\w+]] = OpConstant [[float]] 0.5\n" + + "; CHECK: [[v2float_0p5_2:%\\w+]] = OpConstantComposite [[v2float]] [[float_0p5]] [[float_2]]\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[v2float]]\n" + + "; CHECK: %3 = OpFMul [[v2float]] [[ld]] [[v2float_0p5_2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_v2float Function\n" + + "%2 = OpLoad %v2float %var\n" + + "%3 = OpFDiv %v2float %2 %v2float_2_0p5\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 3, true), + // Test case 3: double reciprocal + // x / 2.0 = x * 0.5 + InstructionFoldingCase( + Header() + + "; CHECK: [[double:%\\w+]] = OpTypeFloat 64\n" + + "; CHECK: [[double_0p5:%\\w+]] = OpConstant [[double]] 0.5\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[double]]\n" + + "; CHECK: %3 = OpFMul [[double]] [[ld]] [[double_0p5]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_double Function\n" + + "%2 = OpLoad %double %var\n" + + "%3 = OpFDiv %double %2 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 3, true), + // Test case 4: don't fold x / 0. + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_v2float Function\n" + + "%2 = OpLoad %v2float %var\n" + + "%3 = OpFDiv %v2float %2 %v2float_null\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 3, false) +)); + +INSTANTIATE_TEST_CASE_P(MergeMulTest, MatchingInstructionFoldingTest, +::testing::Values( + // Test case 0: fold consecutive fmuls + // (x * 3.0) * 2.0 = x * 6.0 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_6:%\\w+]] = OpConstant [[float]] 6\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFMul [[float]] [[ld]] [[float_6]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFMul %float %2 %float_3\n" + + "%4 = OpFMul %float %3 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 1: fold consecutive fmuls + // 2.0 * (x * 3.0) = x * 6.0 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_6:%\\w+]] = OpConstant [[float]] 6\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFMul [[float]] [[ld]] [[float_6]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFMul %float %2 %float_3\n" + + "%4 = OpFMul %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 2: fold consecutive fmuls + // (3.0 * x) * 2.0 = x * 6.0 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_6:%\\w+]] = OpConstant [[float]] 6\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFMul [[float]] [[ld]] [[float_6]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFMul %float %float_3 %2\n" + + "%4 = OpFMul %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 3: fold vector fmul + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[v2float:%\\w+]] = OpTypeVector [[float]] 2\n" + + "; CHECK: [[float_6:%\\w+]] = OpConstant [[float]] 6\n" + + "; CHECK: [[v2float_6_6:%\\w+]] = OpConstantComposite [[v2float]] [[float_6]] [[float_6]]\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[v2float]]\n" + + "; CHECK: %4 = OpFMul [[v2float]] [[ld]] [[v2float_6_6]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_v2float Function\n" + + "%2 = OpLoad %v2float %var\n" + + "%3 = OpFMul %v2float %2 %v2float_2_3\n" + + "%4 = OpFMul %v2float %3 %v2float_3_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 4: fold double fmuls + // (x * 3.0) * 2.0 = x * 6.0 + InstructionFoldingCase( + Header() + + "; CHECK: [[double:%\\w+]] = OpTypeFloat 64\n" + + "; CHECK: [[double_6:%\\w+]] = OpConstant [[double]] 6\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[double]]\n" + + "; CHECK: %4 = OpFMul [[double]] [[ld]] [[double_6]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_double Function\n" + + "%2 = OpLoad %double %var\n" + + "%3 = OpFMul %double %2 %double_3\n" + + "%4 = OpFMul %double %3 %double_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 5: fold 32 bit imuls + // (x * 3) * 2 = x * 6 + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[int_6:%\\w+]] = OpConstant [[int]] 6\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[int]]\n" + + "; CHECK: %4 = OpIMul [[int]] [[ld]] [[int_6]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpIMul %int %2 %int_3\n" + + "%4 = OpIMul %int %3 %int_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 6: fold 64 bit imuls + // (x * 3) * 2 = x * 6 + InstructionFoldingCase( + Header() + + "; CHECK: [[long:%\\w+]] = OpTypeInt 64\n" + + "; CHECK: [[long_6:%\\w+]] = OpConstant [[long]] 6\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[long]]\n" + + "; CHECK: %4 = OpIMul [[long]] [[ld]] [[long_6]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_long Function\n" + + "%2 = OpLoad %long %var\n" + + "%3 = OpIMul %long %2 %long_3\n" + + "%4 = OpIMul %long %3 %long_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 7: merge vector integer mults + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[v2int:%\\w+]] = OpTypeVector [[int]] 2\n" + + "; CHECK: [[int_6:%\\w+]] = OpConstant [[int]] 6\n" + + "; CHECK: [[v2int_6_6:%\\w+]] = OpConstantComposite [[v2int]] [[int_6]] [[int_6]]\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[v2int]]\n" + + "; CHECK: %4 = OpIMul [[v2int]] [[ld]] [[v2int_6_6]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_v2int Function\n" + + "%2 = OpLoad %v2int %var\n" + + "%3 = OpIMul %v2int %2 %v2int_2_3\n" + + "%4 = OpIMul %v2int %3 %v2int_3_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 8: merge fmul of fdiv + // 2.0 * (2.0 / x) = 4.0 / x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_4:%\\w+]] = OpConstant [[float]] 4\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFDiv [[float]] [[float_4]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFDiv %float %float_2 %2\n" + + "%4 = OpFMul %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 9: merge fmul of fdiv + // (2.0 / x) * 2.0 = 4.0 / x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_4:%\\w+]] = OpConstant [[float]] 4\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFDiv [[float]] [[float_4]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFDiv %float %float_2 %2\n" + + "%4 = OpFMul %float %3 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 10: Do not merge imul of sdiv + // 4 * (x / 2) + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpSDiv %int %2 %int_2\n" + + "%4 = OpIMul %int %int_4 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 11: Do not merge imul of sdiv + // (x / 2) * 4 + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpSDiv %int %2 %int_2\n" + + "%4 = OpIMul %int %3 %int_4\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 12: Do not merge imul of udiv + // 4 * (x / 2) + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_uint Function\n" + + "%2 = OpLoad %uint %var\n" + + "%3 = OpUDiv %uint %2 %uint_2\n" + + "%4 = OpIMul %uint %uint_4 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 13: Do not merge imul of udiv + // (x / 2) * 4 + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_uint Function\n" + + "%2 = OpLoad %uint %var\n" + + "%3 = OpUDiv %uint %2 %uint_2\n" + + "%4 = OpIMul %uint %3 %uint_4\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 14: Don't fold + // (x / 3) * 4 + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_uint Function\n" + + "%2 = OpLoad %uint %var\n" + + "%3 = OpUDiv %uint %2 %uint_3\n" + + "%4 = OpIMul %uint %3 %uint_4\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 15: merge vector fmul of fdiv + // (x / {2,2}) * {4,4} = x * {2,2} + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[v2float:%\\w+]] = OpTypeVector [[float]] 2\n" + + "; CHECK: [[float_2:%\\w+]] = OpConstant [[float]] 2\n" + + "; CHECK: [[v2float_2_2:%\\w+]] = OpConstantComposite [[v2float]] [[float_2]] [[float_2]]\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[v2float]]\n" + + "; CHECK: %4 = OpFMul [[v2float]] [[ld]] [[v2float_2_2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_v2float Function\n" + + "%2 = OpLoad %v2float %var\n" + + "%3 = OpFDiv %v2float %2 %v2float_2_2\n" + + "%4 = OpFMul %v2float %3 %v2float_4_4\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 16: merge vector imul of snegate + // (-x) * {2,2} = x * {-2,-2} + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[v2int:%\\w+]] = OpTypeVector [[int]] 2\n" + + "; CHECK: OpConstant [[int]] -2147483648\n" + + "; CHECK: [[int_n2:%\\w+]] = OpConstant [[int]] -2\n" + + "; CHECK: [[v2int_n2_n2:%\\w+]] = OpConstantComposite [[v2int]] [[int_n2]] [[int_n2]]\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[v2int]]\n" + + "; CHECK: %4 = OpIMul [[v2int]] [[ld]] [[v2int_n2_n2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_v2int Function\n" + + "%2 = OpLoad %v2int %var\n" + + "%3 = OpSNegate %v2int %2\n" + + "%4 = OpIMul %v2int %3 %v2int_2_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 17: merge vector imul of snegate + // {2,2} * (-x) = x * {-2,-2} + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[v2int:%\\w+]] = OpTypeVector [[int]] 2\n" + + "; CHECK: OpConstant [[int]] -2147483648\n" + + "; CHECK: [[int_n2:%\\w+]] = OpConstant [[int]] -2\n" + + "; CHECK: [[v2int_n2_n2:%\\w+]] = OpConstantComposite [[v2int]] [[int_n2]] [[int_n2]]\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[v2int]]\n" + + "; CHECK: %4 = OpIMul [[v2int]] [[ld]] [[v2int_n2_n2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_v2int Function\n" + + "%2 = OpLoad %v2int %var\n" + + "%3 = OpSNegate %v2int %2\n" + + "%4 = OpIMul %v2int %v2int_2_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true) +)); + +INSTANTIATE_TEST_CASE_P(MergeDivTest, MatchingInstructionFoldingTest, +::testing::Values( + // Test case 0: merge consecutive fdiv + // 4.0 / (2.0 / x) = 2.0 * x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_2:%\\w+]] = OpConstant [[float]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFMul [[float]] [[float_2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFDiv %float %float_2 %2\n" + + "%4 = OpFDiv %float %float_4 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 1: merge consecutive fdiv + // 4.0 / (x / 2.0) = 8.0 / x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_8:%\\w+]] = OpConstant [[float]] 8\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFDiv [[float]] [[float_8]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFDiv %float %2 %float_2\n" + + "%4 = OpFDiv %float %float_4 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 2: merge consecutive fdiv + // (4.0 / x) / 2.0 = 2.0 / x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_2:%\\w+]] = OpConstant [[float]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFDiv [[float]] [[float_2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFDiv %float %float_4 %2\n" + + "%4 = OpFDiv %float %3 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 3: Do not merge consecutive sdiv + // 4 / (2 / x) + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpSDiv %int %int_2 %2\n" + + "%4 = OpSDiv %int %int_4 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 4: Do not merge consecutive sdiv + // 4 / (x / 2) + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpSDiv %int %2 %int_2\n" + + "%4 = OpSDiv %int %int_4 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 5: Do not merge consecutive sdiv + // (4 / x) / 2 + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpSDiv %int %int_4 %2\n" + + "%4 = OpSDiv %int %3 %int_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 6: Do not merge consecutive sdiv + // (x / 4) / 2 + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpSDiv %int %2 %int_4\n" + + "%4 = OpSDiv %int %3 %int_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 7: Do not merge sdiv of imul + // 4 / (2 * x) + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpIMul %int %int_2 %2\n" + + "%4 = OpSDiv %int %int_4 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 8: Do not merge sdiv of imul + // 4 / (x * 2) + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpIMul %int %2 %int_2\n" + + "%4 = OpSDiv %int %int_4 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 9: Do not merge sdiv of imul + // (4 * x) / 2 + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpIMul %int %int_4 %2\n" + + "%4 = OpSDiv %int %3 %int_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 10: Do not merge sdiv of imul + // (x * 4) / 2 + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpIMul %int %2 %int_4\n" + + "%4 = OpSDiv %int %3 %int_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false), + // Test case 11: merge sdiv of snegate + // (-x) / 2 = x / -2 + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: OpConstant [[int]] -2147483648\n" + + "; CHECK: [[int_n2:%\\w+]] = OpConstant [[int]] -2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[int]]\n" + + "; CHECK: %4 = OpSDiv [[int]] [[ld]] [[int_n2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpSNegate %int %2\n" + + "%4 = OpSDiv %int %3 %int_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 12: merge sdiv of snegate + // 2 / (-x) = -2 / x + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: OpConstant [[int]] -2147483648\n" + + "; CHECK: [[int_n2:%\\w+]] = OpConstant [[int]] -2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[int]]\n" + + "; CHECK: %4 = OpSDiv [[int]] [[int_n2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_int Function\n" + + "%2 = OpLoad %int %var\n" + + "%3 = OpSNegate %int %2\n" + + "%4 = OpSDiv %int %int_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 13: Don't merge + // (x / {null}) / {null} + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_v2float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFDiv %float %2 %v2float_null\n" + + "%4 = OpFDiv %float %3 %v2float_null\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, false) +)); + +INSTANTIATE_TEST_CASE_P(MergeAddTest, MatchingInstructionFoldingTest, +::testing::Values( + // Test case 0: merge add of negate + // (-x) + 2 = 2 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_2:%\\w+]] = OpConstant [[float]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[float_2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFNegate %float %2\n" + + "%4 = OpFAdd %float %3 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 1: merge add of negate + // 2 + (-x) = 2 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_2:%\\w+]] = OpConstant [[float]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[float_2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpSNegate %float %2\n" + + "%4 = OpIAdd %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 2: merge add of negate + // (-x) + 2 = 2 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[long:%\\w+]] = OpTypeInt 64 1\n" + + "; CHECK: [[long_2:%\\w+]] = OpConstant [[long]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[long]]\n" + + "; CHECK: %4 = OpISub [[long]] [[long_2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_long Function\n" + + "%2 = OpLoad %long %var\n" + + "%3 = OpSNegate %long %2\n" + + "%4 = OpIAdd %long %3 %long_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 3: merge add of negate + // 2 + (-x) = 2 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[long:%\\w+]] = OpTypeInt 64 1\n" + + "; CHECK: [[long_2:%\\w+]] = OpConstant [[long]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[long]]\n" + + "; CHECK: %4 = OpISub [[long]] [[long_2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_long Function\n" + + "%2 = OpLoad %long %var\n" + + "%3 = OpSNegate %long %2\n" + + "%4 = OpIAdd %long %long_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 4: merge add of subtract + // (x - 1) + 2 = x + 1 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_1:%\\w+]] = OpConstant [[float]] 1\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFAdd [[float]] [[ld]] [[float_1]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFSub %float %2 %float_1\n" + + "%4 = OpFAdd %float %3 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 5: merge add of subtract + // (1 - x) + 2 = 3 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_3:%\\w+]] = OpConstant [[float]] 3\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[float_3]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFSub %float %float_1 %2\n" + + "%4 = OpFAdd %float %3 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 6: merge add of subtract + // 2 + (x - 1) = x + 1 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_1:%\\w+]] = OpConstant [[float]] 1\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFAdd [[float]] [[ld]] [[float_1]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFSub %float %2 %float_1\n" + + "%4 = OpFAdd %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 7: merge add of subtract + // 2 + (1 - x) = 3 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_3:%\\w+]] = OpConstant [[float]] 3\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[float_3]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFSub %float %float_1 %2\n" + + "%4 = OpFAdd %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 8: merge add of add + // (x + 1) + 2 = x + 3 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_3:%\\w+]] = OpConstant [[float]] 3\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFAdd [[float]] [[ld]] [[float_3]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFAdd %float %2 %float_1\n" + + "%4 = OpFAdd %float %3 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 9: merge add of add + // (1 + x) + 2 = 3 + x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_3:%\\w+]] = OpConstant [[float]] 3\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFAdd [[float]] [[ld]] [[float_3]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFAdd %float %float_1 %2\n" + + "%4 = OpFAdd %float %3 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 10: merge add of add + // 2 + (x + 1) = x + 1 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_3:%\\w+]] = OpConstant [[float]] 3\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFAdd [[float]] [[ld]] [[float_3]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFAdd %float %2 %float_1\n" + + "%4 = OpFAdd %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 11: merge add of add + // 2 + (1 + x) = 3 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_3:%\\w+]] = OpConstant [[float]] 3\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFAdd [[float]] [[ld]] [[float_3]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFAdd %float %float_1 %2\n" + + "%4 = OpFAdd %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true) +)); + +INSTANTIATE_TEST_CASE_P(MergeSubTest, MatchingInstructionFoldingTest, +::testing::Values( + // Test case 0: merge sub of negate + // (-x) - 2 = -2 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_n2:%\\w+]] = OpConstant [[float]] -2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[float_n2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFNegate %float %2\n" + + "%4 = OpFSub %float %3 %float_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 1: merge sub of negate + // 2 - (-x) = x + 2 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_2:%\\w+]] = OpConstant [[float]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFAdd [[float]] [[ld]] [[float_2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFNegate %float %2\n" + + "%4 = OpFSub %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 2: merge sub of negate + // (-x) - 2 = -2 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[long:%\\w+]] = OpTypeInt 64 1\n" + + "; CHECK: [[long_n2:%\\w+]] = OpConstant [[long]] -2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[long]]\n" + + "; CHECK: %4 = OpISub [[long]] [[long_n2]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_long Function\n" + + "%2 = OpLoad %long %var\n" + + "%3 = OpSNegate %long %2\n" + + "%4 = OpISub %long %3 %long_2\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 3: merge sub of negate + // 2 - (-x) = x + 2 + InstructionFoldingCase( + Header() + + "; CHECK: [[long:%\\w+]] = OpTypeInt 64 1\n" + + "; CHECK: [[long_2:%\\w+]] = OpConstant [[long]] 2\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[long]]\n" + + "; CHECK: %4 = OpIAdd [[long]] [[ld]] [[long_2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_long Function\n" + + "%2 = OpLoad %long %var\n" + + "%3 = OpSNegate %long %2\n" + + "%4 = OpISub %long %long_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 4: merge add of subtract + // (x + 2) - 1 = x + 1 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_1:%\\w+]] = OpConstant [[float]] 1\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFAdd [[float]] [[ld]] [[float_1]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFAdd %float %2 %float_2\n" + + "%4 = OpFSub %float %3 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 5: merge add of subtract + // (2 + x) - 1 = x + 1 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_1:%\\w+]] = OpConstant [[float]] 1\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFAdd [[float]] [[ld]] [[float_1]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFAdd %float %float_2 %2\n" + + "%4 = OpFSub %float %3 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 6: merge add of subtract + // 2 - (x + 1) = 1 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_1:%\\w+]] = OpConstant [[float]] 1\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[float_1]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFAdd %float %2 %float_1\n" + + "%4 = OpFSub %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 7: merge add of subtract + // 2 - (1 + x) = 1 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_1:%\\w+]] = OpConstant [[float]] 1\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[float_1]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFAdd %float %float_1 %2\n" + + "%4 = OpFSub %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 8: merge subtract of subtract + // (x - 2) - 1 = x - 3 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_3:%\\w+]] = OpConstant [[float]] 3\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[ld]] [[float_3]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFSub %float %2 %float_2\n" + + "%4 = OpFSub %float %3 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 9: merge subtract of subtract + // (2 - x) - 1 = 1 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_1:%\\w+]] = OpConstant [[float]] 1\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[float_1]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFSub %float %float_2 %2\n" + + "%4 = OpFSub %float %3 %float_1\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 10: merge subtract of subtract + // 2 - (x - 1) = 3 - x + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_3:%\\w+]] = OpConstant [[float]] 3\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFSub [[float]] [[float_3]] [[ld]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFSub %float %2 %float_1\n" + + "%4 = OpFSub %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 11: merge subtract of subtract + // 1 - (2 - x) = x + (-1) + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_n1:%\\w+]] = OpConstant [[float]] -1\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFAdd [[float]] [[ld]] [[float_n1]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFSub %float %float_2 %2\n" + + "%4 = OpFSub %float %float_1 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true), + // Test case 12: merge subtract of subtract + // 2 - (1 - x) = x + 1 + InstructionFoldingCase( + Header() + + "; CHECK: [[float:%\\w+]] = OpTypeFloat 32\n" + + "; CHECK: [[float_1:%\\w+]] = OpConstant [[float]] 1\n" + + "; CHECK: [[ld:%\\w+]] = OpLoad [[float]]\n" + + "; CHECK: %4 = OpFAdd [[float]] [[ld]] [[float_1]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%var = OpVariable %_ptr_float Function\n" + + "%2 = OpLoad %float %var\n" + + "%3 = OpFSub %float %float_1 %2\n" + + "%4 = OpFSub %float %float_2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd\n", + 4, true) +)); + +INSTANTIATE_TEST_CASE_P(SelectFoldingTest, MatchingInstructionFoldingTest, +::testing::Values( + // Test case 0: Fold select with the same values for both sides + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[int0:%\\w+]] = OpConstant [[int]] 0\n" + + "; CHECK: %2 = OpCopyObject [[int]] [[int0]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_bool Function\n" + + "%load = OpLoad %bool %n\n" + + "%2 = OpSelect %int %load %100 %100\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 1: Fold select true to left side + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[int0:%\\w+]] = OpConstant [[int]] 0\n" + + "; CHECK: %2 = OpCopyObject [[int]] [[int0]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load = OpLoad %bool %n\n" + + "%2 = OpSelect %int %true %100 %n\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 2: Fold select false to right side + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[int0:%\\w+]] = OpConstant [[int]] 0\n" + + "; CHECK: %2 = OpCopyObject [[int]] [[int0]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load = OpLoad %bool %n\n" + + "%2 = OpSelect %int %false %n %100\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 3: Fold select null to right side + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[int0:%\\w+]] = OpConstant [[int]] 0\n" + + "; CHECK: %2 = OpCopyObject [[int]] [[int0]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load = OpLoad %int %n\n" + + "%2 = OpSelect %int %bool_null %load %100\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 4: vector null + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[v2int:%\\w+]] = OpTypeVector [[int]] 2\n" + + "; CHECK: [[int2:%\\w+]] = OpConstant [[int]] 2\n" + + "; CHECK: [[v2int2_2:%\\w+]] = OpConstantComposite [[v2int]] [[int2]] [[int2]]\n" + + "; CHECK: %2 = OpCopyObject [[v2int]] [[v2int2_2]]\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_v2int Function\n" + + "%load = OpLoad %v2int %n\n" + + "%2 = OpSelect %v2int %v2bool_null %load %v2int_2_2\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, true), + // Test case 5: vector select + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[v2int:%\\w+]] = OpTypeVector [[int]] 2\n" + + "; CHECK: %4 = OpVectorShuffle [[v2int]] %2 %3 0 3\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%m = OpVariable %_ptr_v2int Function\n" + + "%n = OpVariable %_ptr_v2int Function\n" + + "%2 = OpLoad %v2int %n\n" + + "%3 = OpLoad %v2int %n\n" + + "%4 = OpSelect %v2int %v2bool_true_false %2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 6: vector select + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: [[v2int:%\\w+]] = OpTypeVector [[int]] 2\n" + + "; CHECK: %4 = OpVectorShuffle [[v2int]] %2 %3 2 1\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%m = OpVariable %_ptr_v2int Function\n" + + "%n = OpVariable %_ptr_v2int Function\n" + + "%2 = OpLoad %v2int %n\n" + + "%3 = OpLoad %v2int %n\n" + + "%4 = OpSelect %v2int %v2bool_false_true %2 %3\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true) +)); + +INSTANTIATE_TEST_CASE_P(CompositeExtractMatchingTest, MatchingInstructionFoldingTest, +::testing::Values( + // Test case 0: Extracting from result of consecutive shuffles of differing + // size. + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: %5 = OpCompositeExtract [[int]] %2 2\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_v4int Function\n" + + "%2 = OpLoad %v4int %n\n" + + "%3 = OpVectorShuffle %v2int %2 %2 2 3\n" + + "%4 = OpVectorShuffle %v4int %2 %3 0 4 2 5\n" + + "%5 = OpCompositeExtract %int %4 1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 5, true), + // Test case 1: Extracting from result of vector shuffle of differing + // input and result sizes. + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: %4 = OpCompositeExtract [[int]] %2 2\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_v4int Function\n" + + "%2 = OpLoad %v4int %n\n" + + "%3 = OpVectorShuffle %v2int %2 %2 2 3\n" + + "%4 = OpCompositeExtract %int %3 0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true), + // Test case 2: Extracting from result of vector shuffle of differing + // input and result sizes. + InstructionFoldingCase( + Header() + + "; CHECK: [[int:%\\w+]] = OpTypeInt 32 1\n" + + "; CHECK: %4 = OpCompositeExtract [[int]] %2 3\n" + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_v4int Function\n" + + "%2 = OpLoad %v4int %n\n" + + "%3 = OpVectorShuffle %v2int %2 %2 2 3\n" + + "%4 = OpCompositeExtract %int %3 1\n" + + "OpReturn\n" + + "OpFunctionEnd", + 4, true) +)); +#endif } // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/freeze_spec_const_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/freeze_spec_const_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/freeze_spec_const_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/freeze_spec_const_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -54,10 +54,10 @@ "%int_1 = OpConstant %int 1"}, {"%uint = OpTypeInt 32 0", "%2 = OpSpecConstant %uint 1", "%uint_1 = OpConstant %uint 1"}, - {"%float = OpTypeFloat 32", "%2 = OpSpecConstant %float 3.14", - "%float_3_14 = OpConstant %float 3.14"}, - {"%double = OpTypeFloat 64", "%2 = OpSpecConstant %double 3.1415926", - "%double_3_1415926 = OpConstant %double 3.1415926"}, + {"%float = OpTypeFloat 32", "%2 = OpSpecConstant %float 3.1415", + "%float_3_1415 = OpConstant %float 3.1415"}, + {"%double = OpTypeFloat 64", "%2 = OpSpecConstant %double 3.141592653", + "%double_3_141592653 = OpConstant %double 3.141592653"}, {"%bool = OpTypeBool", "%2 = OpSpecConstantTrue %bool", "%true = OpConstantTrue %bool"}, {"%bool = OpTypeBool", "%2 = OpSpecConstantFalse %bool", @@ -88,7 +88,7 @@ "%int = OpTypeInt 32 1", "%3 = OpSpecConstant %int 3", "%float = OpTypeFloat 32", - "%4 = OpSpecConstant %float 3.14", + "%4 = OpSpecConstant %float 3.1415", "%double = OpTypeFloat 64", "%5 = OpSpecConstant %double 3.14159265358979", "%bool = OpTypeBool", @@ -105,8 +105,8 @@ }); std::vector> replacement_pairs = { {"%3 = OpSpecConstant %int 3", "%int_3 = OpConstant %int 3"}, - {"%4 = OpSpecConstant %float 3.14", - "%float_3_14 = OpConstant %float 3.14"}, + {"%4 = OpSpecConstant %float 3.1415", + "%float_3_1415 = OpConstant %float 3.1415"}, {"%5 = OpSpecConstant %double 3.14159265358979", "%double_3_14159265358979 = OpConstant %double 3.14159265358979"}, {"%6 = OpSpecConstantTrue ", "%true = OpConstantTrue "}, diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/ir_builder.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/ir_builder.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/ir_builder.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/ir_builder.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -296,6 +296,120 @@ Match(text, context.get()); } +TEST_F(IRBuilderTest, ConstantAdder) { + const std::string text = R"( +; CHECK: [[uint:%\w+]] = OpTypeInt 32 0 +; CHECK: OpConstant [[uint]] 13 +; CHECK: [[sint:%\w+]] = OpTypeInt 32 1 +; CHECK: OpConstant [[sint]] -1 +; CHECK: OpConstant [[uint]] 1 +; CHECK: OpConstant [[sint]] 34 +; CHECK: OpConstant [[uint]] 0 +; CHECK: OpConstant [[sint]] 0 +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpFunction %1 None %2 +%4 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text); + EXPECT_NE(nullptr, context); + + opt::InstructionBuilder builder( + context.get(), &*context->module()->begin()->begin()->begin()); + EXPECT_NE(nullptr, builder.Add32BitUnsignedIntegerConstant(13)); + EXPECT_NE(nullptr, builder.Add32BitSignedIntegerConstant(-1)); + + // Try adding the same constants again to make sure they aren't added. + EXPECT_NE(nullptr, builder.Add32BitUnsignedIntegerConstant(13)); + EXPECT_NE(nullptr, builder.Add32BitSignedIntegerConstant(-1)); + + // Try adding different constants to make sure the type is reused. + EXPECT_NE(nullptr, builder.Add32BitUnsignedIntegerConstant(1)); + EXPECT_NE(nullptr, builder.Add32BitSignedIntegerConstant(34)); + + // Try adding 0 as both signed and unsigned. + EXPECT_NE(nullptr, builder.Add32BitUnsignedIntegerConstant(0)); + EXPECT_NE(nullptr, builder.Add32BitSignedIntegerConstant(0)); + + Match(text, context.get()); +} + +TEST_F(IRBuilderTest, ConstantAdderTypeAlreadyExists) { + const std::string text = R"( +; CHECK: OpConstant %uint 13 +; CHECK: OpConstant %int -1 +; CHECK: OpConstant %uint 1 +; CHECK: OpConstant %int 34 +; CHECK: OpConstant %uint 0 +; CHECK: OpConstant %int 0 +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%1 = OpTypeVoid +%uint = OpTypeInt 32 0 +%int = OpTypeInt 32 1 +%4 = OpTypeFunction %1 +%5 = OpFunction %1 None %4 +%6 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text); + EXPECT_NE(nullptr, context); + + opt::InstructionBuilder builder( + context.get(), &*context->module()->begin()->begin()->begin()); + ir::Instruction* const_1 = builder.Add32BitUnsignedIntegerConstant(13); + ir::Instruction* const_2 = builder.Add32BitSignedIntegerConstant(-1); + + EXPECT_NE(nullptr, const_1); + EXPECT_NE(nullptr, const_2); + + // Try adding the same constants again to make sure they aren't added. + EXPECT_EQ(const_1, builder.Add32BitUnsignedIntegerConstant(13)); + EXPECT_EQ(const_2, builder.Add32BitSignedIntegerConstant(-1)); + + ir::Instruction* const_3 = builder.Add32BitUnsignedIntegerConstant(1); + ir::Instruction* const_4 = builder.Add32BitSignedIntegerConstant(34); + + // Try adding different constants to make sure the type is reused. + EXPECT_NE(nullptr, const_3); + EXPECT_NE(nullptr, const_4); + + ir::Instruction* const_5 = builder.Add32BitUnsignedIntegerConstant(0); + ir::Instruction* const_6 = builder.Add32BitSignedIntegerConstant(0); + + // Try adding 0 as both signed and unsigned. + EXPECT_NE(nullptr, const_5); + EXPECT_NE(nullptr, const_6); + + // They have the same value but different types so should be unique. + EXPECT_NE(const_5, const_6); + + // Check the types are correct. + uint32_t type_id_unsigned = const_1->GetSingleWordOperand(0); + uint32_t type_id_signed = const_2->GetSingleWordOperand(0); + + EXPECT_NE(type_id_unsigned, type_id_signed); + + EXPECT_EQ(const_3->GetSingleWordOperand(0), type_id_unsigned); + EXPECT_EQ(const_5->GetSingleWordOperand(0), type_id_unsigned); + + EXPECT_EQ(const_4->GetSingleWordOperand(0), type_id_signed); + EXPECT_EQ(const_6->GetSingleWordOperand(0), type_id_signed); + + Match(text, context.get()); +} + #endif // SPIRV_EFFCEE } // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/local_single_block_elim.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/local_single_block_elim.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/local_single_block_elim.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/local_single_block_elim.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -55,27 +55,6 @@ %gl_FragColor = OpVariable %_ptr_Output_v4float Output )"; - const std::string predefs_after = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %BaseColor %gl_FragColor -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 140 -OpName %main "main" -OpName %BaseColor "BaseColor" -OpName %gl_FragColor "gl_FragColor" -%void = OpTypeVoid -%7 = OpTypeFunction %void -%float = OpTypeFloat 32 -%v4float = OpTypeVector %float 4 -%_ptr_Function_v4float = OpTypePointer Function %v4float -%_ptr_Input_v4float = OpTypePointer Input %v4float -%BaseColor = OpVariable %_ptr_Input_v4float Input -%_ptr_Output_v4float = OpTypePointer Output %v4float -%gl_FragColor = OpVariable %_ptr_Output_v4float Output -)"; - const std::string before = R"(%main = OpFunction %void None %7 %13 = OpLabel @@ -91,14 +70,17 @@ const std::string after = R"(%main = OpFunction %void None %7 %13 = OpLabel +%v = OpVariable %_ptr_Function_v4float Function %14 = OpLoad %v4float %BaseColor +OpStore %v %14 +%15 = OpLoad %v4float %v OpStore %gl_FragColor %14 OpReturn OpFunctionEnd )"; SinglePassRunAndCheck( - predefs_before + before, predefs_after + after, true, true); + predefs_before + before, predefs_before + after, true, true); } TEST_F(LocalSingleBlockLoadStoreElimTest, SimpleLoadLoadElim) { @@ -192,6 +174,7 @@ %31 = OpLoad %v4float %v %32 = OpAccessChain %_ptr_Output_v4float %gl_FragData %int_0 OpStore %32 %31 +%33 = OpLoad %v4float %v %34 = OpAccessChain %_ptr_Output_v4float %gl_FragData %int_1 OpStore %34 %31 OpReturn @@ -220,7 +203,7 @@ // gl_FragColor = v/f; // } - const std::string predefs_before = + const std::string predefs = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 @@ -249,34 +232,6 @@ %gl_FragColor = OpVariable %_ptr_Output_v4float Output )"; - const std::string predefs_after = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %BaseColor %Idx %gl_FragColor -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 140 -OpName %main "main" -OpName %v "v" -OpName %BaseColor "BaseColor" -OpName %Idx "Idx" -OpName %gl_FragColor "gl_FragColor" -OpDecorate %Idx Flat -%void = OpTypeVoid -%9 = OpTypeFunction %void -%float = OpTypeFloat 32 -%v4float = OpTypeVector %float 4 -%_ptr_Function_v4float = OpTypePointer Function %v4float -%_ptr_Input_v4float = OpTypePointer Input %v4float -%BaseColor = OpVariable %_ptr_Input_v4float Input -%_ptr_Function_float = OpTypePointer Function %float -%int = OpTypeInt 32 1 -%_ptr_Input_int = OpTypePointer Input %int -%Idx = OpVariable %_ptr_Input_int Input -%_ptr_Output_v4float = OpTypePointer Output %v4float -%gl_FragColor = OpVariable %_ptr_Output_v4float Output -)"; - const std::string before = R"(%main = OpFunction %void None %9 %18 = OpLabel @@ -301,11 +256,15 @@ R"(%main = OpFunction %void None %9 %18 = OpLabel %v = OpVariable %_ptr_Function_v4float Function +%f = OpVariable %_ptr_Function_float Function %19 = OpLoad %v4float %BaseColor OpStore %v %19 %20 = OpLoad %int %Idx %21 = OpAccessChain %_ptr_Function_float %v %20 %22 = OpLoad %float %21 +OpStore %f %22 +%23 = OpLoad %v4float %v +%24 = OpLoad %float %f %25 = OpCompositeConstruct %v4float %22 %22 %22 %22 %26 = OpFDiv %v4float %19 %25 OpStore %gl_FragColor %26 @@ -314,7 +273,7 @@ )"; SinglePassRunAndCheck( - predefs_before + before, predefs_after + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSingleBlockLoadStoreElimTest, NoElimIfInterveningAccessChainStore) { @@ -446,7 +405,7 @@ // gl_FragData[1] = v2; // } - const std::string predefs_before = + const std::string predefs = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 @@ -477,35 +436,6 @@ %int_1 = OpConstant %int 1 )"; - const std::string predefs_after = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %BaseColor %gl_FragData -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 140 -OpName %main "main" -OpName %BaseColor "BaseColor" -OpName %gl_FragData "gl_FragData" -%void = OpTypeVoid -%8 = OpTypeFunction %void -%float = OpTypeFloat 32 -%v4float = OpTypeVector %float 4 -%_ptr_Function_v4float = OpTypePointer Function %v4float -%_ptr_Input_v4float = OpTypePointer Input %v4float -%BaseColor = OpVariable %_ptr_Input_v4float Input -%uint = OpTypeInt 32 0 -%uint_32 = OpConstant %uint 32 -%_arr_v4float_uint_32 = OpTypeArray %v4float %uint_32 -%_ptr_Output__arr_v4float_uint_32 = OpTypePointer Output %_arr_v4float_uint_32 -%gl_FragData = OpVariable %_ptr_Output__arr_v4float_uint_32 Output -%int = OpTypeInt 32 1 -%int_0 = OpConstant %int 0 -%_ptr_Output_v4float = OpTypePointer Output %v4float -%float_0_5 = OpConstant %float 0.5 -%int_1 = OpConstant %int 1 -)"; - const std::string before = R"(%main = OpFunction %void None %8 %22 = OpLabel @@ -530,11 +460,18 @@ const std::string after = R"(%main = OpFunction %void None %8 %22 = OpLabel +%v1 = OpVariable %_ptr_Function_v4float Function +%v2 = OpVariable %_ptr_Function_v4float Function %23 = OpLoad %v4float %BaseColor +OpStore %v1 %23 +%24 = OpLoad %v4float %v1 %25 = OpAccessChain %_ptr_Output_v4float %gl_FragData %int_0 OpStore %25 %23 %26 = OpLoad %v4float %BaseColor %27 = OpVectorTimesScalar %v4float %26 %float_0_5 +%28 = OpCopyObject %_ptr_Function_v4float %v2 +OpStore %28 %27 +%29 = OpLoad %v4float %28 %30 = OpAccessChain %_ptr_Output_v4float %gl_FragData %int_1 OpStore %30 %27 OpReturn @@ -542,14 +479,14 @@ )"; SinglePassRunAndCheck( - predefs_before + before, predefs_after + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSingleBlockLoadStoreElimTest, ElimOpaque) { // SPIR-V not representable in GLSL; not generatable from HLSL // at the moment - const std::string predefs_before = + const std::string predefs = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 @@ -565,7 +502,7 @@ OpName %sampler15 "sampler15" OpName %s0 "s0" OpName %texCoords "texCoords" -OpName %param "param" +OpName %param "param" OpDecorate %sampler15 DescriptorSet 0 %void = OpTypeVoid %12 = OpTypeFunction %void @@ -590,48 +527,8 @@ %texCoords = OpVariable %_ptr_Input_v2float Input )"; - const std::string predefs_after = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %outColor %texCoords -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 140 -OpName %main "main" -OpName %S_t "S_t" -OpMemberName %S_t 0 "v0" -OpMemberName %S_t 1 "v1" -OpMemberName %S_t 2 "smp" -OpName %outColor "outColor" -OpName %sampler15 "sampler15" -OpName %s0 "s0" -OpName %texCoords "texCoords" -OpDecorate %sampler15 DescriptorSet 0 -%void = OpTypeVoid -%10 = OpTypeFunction %void -%float = OpTypeFloat 32 -%v2float = OpTypeVector %float 2 -%v4float = OpTypeVector %float 4 -%_ptr_Output_v4float = OpTypePointer Output %v4float -%outColor = OpVariable %_ptr_Output_v4float Output -%15 = OpTypeImage %float 2D 0 0 0 1 Unknown -%16 = OpTypeSampledImage %15 -%S_t = OpTypeStruct %v2float %v2float %16 -%_ptr_Function_S_t = OpTypePointer Function %S_t -%18 = OpTypeFunction %void %_ptr_Function_S_t -%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16 -%_ptr_Function_16 = OpTypePointer Function %16 -%sampler15 = OpVariable %_ptr_UniformConstant_16 UniformConstant -%int = OpTypeInt 32 1 -%int_0 = OpConstant %int 0 -%int_2 = OpConstant %int 2 -%_ptr_Function_v2float = OpTypePointer Function %v2float -%_ptr_Input_v2float = OpTypePointer Input %v2float -%texCoords = OpVariable %_ptr_Input_v2float Input -)"; - const std::string before = - R"( %main = OpFunction %void None %12 + R"(%main = OpFunction %void None %12 %28 = OpLabel %s0 = OpVariable %_ptr_Function_S_t Function %param = OpVariable %_ptr_Function_S_t Function @@ -656,25 +553,33 @@ )"; const std::string after = - R"(%main = OpFunction %void None %10 -%26 = OpLabel + R"(%main = OpFunction %void None %12 +%28 = OpLabel %s0 = OpVariable %_ptr_Function_S_t Function -%27 = OpLoad %v2float %texCoords -%28 = OpLoad %S_t %s0 -%29 = OpCompositeInsert %S_t %27 %28 0 -%30 = OpLoad %16 %sampler15 -%32 = OpCompositeInsert %S_t %30 %29 2 -OpStore %s0 %32 -%35 = OpCompositeExtract %16 %32 2 -%37 = OpCompositeExtract %v2float %32 0 -%38 = OpImageSampleImplicitLod %v4float %35 %37 -OpStore %outColor %38 +%param = OpVariable %_ptr_Function_S_t Function +%29 = OpLoad %v2float %texCoords +%30 = OpLoad %S_t %s0 +%31 = OpCompositeInsert %S_t %29 %30 0 +OpStore %s0 %31 +%32 = OpLoad %18 %sampler15 +%33 = OpLoad %S_t %s0 +%34 = OpCompositeInsert %S_t %32 %31 2 +OpStore %s0 %34 +%35 = OpLoad %S_t %s0 +OpStore %param %34 +%36 = OpLoad %S_t %param +%37 = OpCompositeExtract %18 %34 2 +%38 = OpLoad %S_t %param +%39 = OpCompositeExtract %v2float %34 0 +%40 = OpImageSampleImplicitLod %v4float %37 %39 +OpStore %outColor %40 OpReturn OpFunctionEnd )"; + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); SinglePassRunAndCheck( - predefs_before + before, predefs_after + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSingleBlockLoadStoreElimTest, PositiveAndNegativeCallTree) { @@ -701,7 +606,7 @@ // gl_FragColor = bar(BaseColor); // } - const std::string predefs_before = + const std::string predefs = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 @@ -715,43 +620,6 @@ OpName %v1_0 "v1" OpName %t "t" OpName %t_0 "t" -OpName %gl_FragColor "gl_FragColor" -OpName %BaseColor "BaseColor" -OpName %param "param" -%void = OpTypeVoid -%13 = OpTypeFunction %void -%float = OpTypeFloat 32 -%v4float = OpTypeVector %float 4 -%_ptr_Function_v4float = OpTypePointer Function %v4float -%17 = OpTypeFunction %v4float %_ptr_Function_v4float -%_ptr_Output_v4float = OpTypePointer Output %v4float -%gl_FragColor = OpVariable %_ptr_Output_v4float Output -%_ptr_Input_v4float = OpTypePointer Input %v4float -%BaseColor = OpVariable %_ptr_Input_v4float Input -%main = OpFunction %void None %13 -%20 = OpLabel -%param = OpVariable %_ptr_Function_v4float Function -%21 = OpLoad %v4float %BaseColor -OpStore %param %21 -%22 = OpFunctionCall %v4float %bar_vf4_ %param -OpStore %gl_FragColor %22 -OpReturn -OpFunctionEnd -)"; - - const std::string predefs_after = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %gl_FragColor %BaseColor -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 140 -OpName %main "main" -OpName %foo_vf4_ "foo(vf4;" -OpName %v1 "v1" -OpName %bar_vf4_ "bar(vf4;" -OpName %v1_0 "v1" -OpName %t "t" OpName %gl_FragColor "gl_FragColor" OpName %BaseColor "BaseColor" OpName %param "param" @@ -810,13 +678,16 @@ %bar_vf4_ = OpFunction %v4float None %17 %v1_0 = OpFunctionParameter %_ptr_Function_v4float %26 = OpLabel +%t_0 = OpVariable %_ptr_Function_v4float Function %27 = OpLoad %v4float %v1_0 +OpStore %t_0 %27 +%28 = OpLoad %v4float %t_0 OpReturnValue %27 OpFunctionEnd )"; SinglePassRunAndCheck( - predefs_before + before, predefs_after + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSingleBlockLoadStoreElimTest, PointerVariable) { @@ -905,6 +776,9 @@ %7 = OpVariable %_ptr_Uniform__struct_5 Uniform %1 = OpFunction %void None %10 %23 = OpLabel +%24 = OpVariable %_ptr_Function__ptr_Uniform__struct_5 Function +OpStore %24 %7 +%26 = OpLoad %_ptr_Uniform__struct_5 %24 %27 = OpAccessChain %_ptr_Uniform_v4float %7 %int_0 %uint_0 %int_0 %28 = OpLoad %v4float %27 %29 = OpCopyObject %v4float %28 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/local_single_store_elim_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/local_single_store_elim_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/local_single_store_elim_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/local_single_store_elim_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -40,7 +40,7 @@ // gl_FragColor = v + f; // } - const std::string predefs_before = + const std::string predefs = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 @@ -69,34 +69,6 @@ %gl_FragColor = OpVariable %_ptr_Output_v4float Output )"; - const std::string predefs_after = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %BaseColor %fi %gl_FragColor -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 140 -OpName %main "main" -OpName %BaseColor "BaseColor" -OpName %f "f" -OpName %fi "fi" -OpName %gl_FragColor "gl_FragColor" -%void = OpTypeVoid -%9 = OpTypeFunction %void -%float = OpTypeFloat 32 -%v4float = OpTypeVector %float 4 -%_ptr_Function_v4float = OpTypePointer Function %v4float -%_ptr_Input_v4float = OpTypePointer Input %v4float -%BaseColor = OpVariable %_ptr_Input_v4float Input -%_ptr_Function_float = OpTypePointer Function %float -%_ptr_Input_float = OpTypePointer Input %float -%fi = OpVariable %_ptr_Input_float Input -%float_0 = OpConstant %float 0 -%bool = OpTypeBool -%_ptr_Output_v4float = OpTypePointer Output %v4float -%gl_FragColor = OpVariable %_ptr_Output_v4float Output -)"; - const std::string before = R"(%main = OpFunction %void None %9 %19 = OpLabel @@ -126,8 +98,10 @@ const std::string after = R"(%main = OpFunction %void None %9 %19 = OpLabel +%v = OpVariable %_ptr_Function_v4float Function %f = OpVariable %_ptr_Function_float Function %20 = OpLoad %v4float %BaseColor +OpStore %v %20 %21 = OpLoad %float %fi OpStore %f %21 %22 = OpLoad %float %f @@ -138,6 +112,7 @@ OpStore %f %float_0 OpBranch %24 %24 = OpLabel +%26 = OpLoad %v4float %v %27 = OpLoad %float %f %28 = OpCompositeConstruct %v4float %27 %27 %27 %27 %29 = OpFAdd %v4float %20 %28 @@ -147,7 +122,7 @@ )"; SinglePassRunAndCheck( - predefs_before + before, predefs_after + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSingleStoreElimTest, MultipleLoads) { @@ -167,7 +142,7 @@ // gl_FragColor = v + f; // } - const std::string predefs_before = + const std::string predefs = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 @@ -196,34 +171,6 @@ %gl_FragColor = OpVariable %_ptr_Output_v4float Output )"; - const std::string predefs_after = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %BaseColor %fi %gl_FragColor -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 140 -OpName %main "main" -OpName %BaseColor "BaseColor" -OpName %fi "fi" -OpName %r "r" -OpName %gl_FragColor "gl_FragColor" -%void = OpTypeVoid -%9 = OpTypeFunction %void -%float = OpTypeFloat 32 -%v4float = OpTypeVector %float 4 -%_ptr_Function_v4float = OpTypePointer Function %v4float -%_ptr_Input_v4float = OpTypePointer Input %v4float -%BaseColor = OpVariable %_ptr_Input_v4float Input -%_ptr_Input_float = OpTypePointer Input %float -%fi = OpVariable %_ptr_Input_float Input -%float_0 = OpConstant %float 0 -%bool = OpTypeBool -%float_1 = OpConstant %float 1 -%_ptr_Output_v4float = OpTypePointer Output %v4float -%gl_FragColor = OpVariable %_ptr_Output_v4float Output -)"; - const std::string before = R"(%main = OpFunction %void None %9 %19 = OpLabel @@ -255,16 +202,20 @@ const std::string after = R"(%main = OpFunction %void None %9 %19 = OpLabel +%v = OpVariable %_ptr_Function_v4float Function %r = OpVariable %_ptr_Function_v4float Function %20 = OpLoad %v4float %BaseColor +OpStore %v %20 %21 = OpLoad %float %fi %22 = OpFOrdLessThan %bool %21 %float_0 OpSelectionMerge %23 None OpBranchConditional %22 %24 %25 %24 = OpLabel +%26 = OpLoad %v4float %v OpStore %r %20 OpBranch %23 %25 = OpLabel +%27 = OpLoad %v4float %v %28 = OpCompositeConstruct %v4float %float_1 %float_1 %float_1 %float_1 %29 = OpFSub %v4float %28 %20 OpStore %r %29 @@ -277,7 +228,7 @@ )"; SinglePassRunAndCheck( - predefs_before + before, predefs_after + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSingleStoreElimTest, NoStoreElimWithInterveningAccessChainLoad) { @@ -294,7 +245,7 @@ // gl_FragColor = v * f; // } - const std::string predefs_before = + const std::string predefs = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 @@ -320,31 +271,6 @@ %gl_FragColor = OpVariable %_ptr_Output_v4float Output )"; - const std::string predefs_after = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %BaseColor %gl_FragColor -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 140 -OpName %main "main" -OpName %v "v" -OpName %BaseColor "BaseColor" -OpName %gl_FragColor "gl_FragColor" -%void = OpTypeVoid -%8 = OpTypeFunction %void -%float = OpTypeFloat 32 -%v4float = OpTypeVector %float 4 -%_ptr_Function_v4float = OpTypePointer Function %v4float -%_ptr_Input_v4float = OpTypePointer Input %v4float -%BaseColor = OpVariable %_ptr_Input_v4float Input -%_ptr_Function_float = OpTypePointer Function %float -%uint = OpTypeInt 32 0 -%uint_3 = OpConstant %uint 3 -%_ptr_Output_v4float = OpTypePointer Output %v4float -%gl_FragColor = OpVariable %_ptr_Output_v4float Output -)"; - const std::string before = R"(%main = OpFunction %void None %8 %17 = OpLabel @@ -367,10 +293,14 @@ R"(%main = OpFunction %void None %8 %17 = OpLabel %v = OpVariable %_ptr_Function_v4float Function +%f = OpVariable %_ptr_Function_float Function %18 = OpLoad %v4float %BaseColor OpStore %v %18 %19 = OpAccessChain %_ptr_Function_float %v %uint_3 %20 = OpLoad %float %19 +OpStore %f %20 +%21 = OpLoad %v4float %v +%22 = OpLoad %float %f %23 = OpVectorTimesScalar %v4float %18 %20 OpStore %gl_FragColor %23 OpReturn @@ -378,7 +308,7 @@ )"; SinglePassRunAndCheck( - predefs_before + before, predefs_after + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSingleStoreElimTest, NoReplaceOfDominatingPartialStore) { @@ -453,7 +383,7 @@ // gl_FragColor = v + f; // } - const std::string predefs_before = + const std::string predefs = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 @@ -482,34 +412,6 @@ %gl_FragColor = OpVariable %_ptr_Output_v4float Output )"; - const std::string predefs_after = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %BaseColor %fi %gl_FragColor -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 140 -OpName %main "main" -OpName %BaseColor "BaseColor" -OpName %f "f" -OpName %fi "fi" -OpName %gl_FragColor "gl_FragColor" -%void = OpTypeVoid -%9 = OpTypeFunction %void -%float = OpTypeFloat 32 -%v4float = OpTypeVector %float 4 -%_ptr_Function_v4float = OpTypePointer Function %v4float -%_ptr_Input_v4float = OpTypePointer Input %v4float -%BaseColor = OpVariable %_ptr_Input_v4float Input -%_ptr_Function_float = OpTypePointer Function %float -%_ptr_Input_float = OpTypePointer Input %float -%fi = OpVariable %_ptr_Input_float Input -%float_0 = OpConstant %float 0 -%bool = OpTypeBool -%_ptr_Output_v4float = OpTypePointer Output %v4float -%gl_FragColor = OpVariable %_ptr_Output_v4float Output -)"; - const std::string before = R"(%main = OpFunction %void None %9 %19 = OpLabel @@ -540,8 +442,10 @@ const std::string after = R"(%main = OpFunction %void None %9 %19 = OpLabel +%v = OpVariable %_ptr_Function_v4float Function %f = OpVariable %_ptr_Function_float Function %20 = OpLoad %v4float %BaseColor +OpStore %v %20 %21 = OpLoad %float %fi OpStore %f %21 %22 = OpLoad %float %f @@ -552,6 +456,8 @@ OpStore %f %float_0 OpBranch %24 %24 = OpLabel +%26 = OpCopyObject %_ptr_Function_v4float %v +%27 = OpLoad %v4float %26 %28 = OpLoad %float %f %29 = OpCompositeConstruct %v4float %28 %28 %28 %28 %30 = OpFAdd %v4float %20 %29 @@ -561,7 +467,7 @@ )"; SinglePassRunAndCheck( - predefs_before + before, predefs_after + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSingleStoreElimTest, NoOptIfStoreNotDominating) { @@ -657,7 +563,7 @@ // gl_FragColor = vec4(f); // } - const std::string predefs_before = + const std::string predefs = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 @@ -678,26 +584,6 @@ %gl_FragColor = OpVariable %_ptr_Output_v4float Output )"; - const std::string predefs_after = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %gl_FragColor -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 140 -OpName %main "main" -OpName %gl_FragColor "gl_FragColor" -OpDecorate %gl_FragColor Location 0 -%void = OpTypeVoid -%6 = OpTypeFunction %void -%float = OpTypeFloat 32 -%_ptr_Function_float = OpTypePointer Function %float -%float_0 = OpConstant %float 0 -%v4float = OpTypeVector %float 4 -%_ptr_Output_v4float = OpTypePointer Output %v4float -%gl_FragColor = OpVariable %_ptr_Output_v4float Output -)"; - const std::string before = R"(%main = OpFunction %void None %6 %12 = OpLabel @@ -712,6 +598,8 @@ const std::string after = R"(%main = OpFunction %void None %6 %12 = OpLabel +%f = OpVariable %_ptr_Function_float Function %float_0 +%13 = OpLoad %float %f %14 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_0 OpStore %gl_FragColor %14 OpReturn @@ -719,7 +607,7 @@ )"; SinglePassRunAndCheck( - predefs_before + before, predefs_after + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSingleStoreElimTest, PointerVariable) { @@ -808,6 +696,9 @@ %7 = OpVariable %_ptr_Uniform__struct_5 Uniform %1 = OpFunction %void None %10 %23 = OpLabel +%24 = OpVariable %_ptr_Function__ptr_Uniform__struct_5 Function +OpStore %24 %7 +%26 = OpLoad %_ptr_Uniform__struct_5 %24 %27 = OpAccessChain %_ptr_Uniform_v4float %7 %int_0 %uint_0 %int_0 %28 = OpLoad %v4float %27 %29 = OpCopyObject %v4float %28 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/local_ssa_elim_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/local_ssa_elim_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/local_ssa_elim_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/local_ssa_elim_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -44,24 +44,12 @@ OpEntryPoint Fragment %main "main" %BC %fo OpExecutionMode %main OriginUpperLeft OpSource GLSL 140 -)"; - - const std::string names_before = - R"(OpName %main "main" +OpName %main "main" OpName %f "f" OpName %i "i" OpName %BC "BC" OpName %fo "fo" -)"; - - const std::string names_after = - R"(OpName %main "main" -OpName %BC "BC" -OpName %fo "fo" -)"; - - const std::string predefs2 = - R"(%void = OpTypeVoid +%void = OpTypeVoid %8 = OpTypeFunction %void %float = OpTypeFloat 32 %_ptr_Function_float = OpTypePointer Function %float @@ -118,32 +106,179 @@ const std::string after = R"(%main = OpFunction %void None %8 %22 = OpLabel +%f = OpVariable %_ptr_Function_float Function +%i = OpVariable %_ptr_Function_int Function +OpStore %f %float_0 +OpStore %i %int_0 OpBranch %23 %23 = OpLabel -%38 = OpPhi %float %float_0 %22 %34 %25 -%39 = OpPhi %int %int_0 %22 %36 %25 +%39 = OpPhi %float %float_0 %22 %34 %25 +%38 = OpPhi %int %int_0 %22 %36 %25 OpLoopMerge %24 %25 None OpBranch %26 %26 = OpLabel -%28 = OpSLessThan %bool %39 %int_4 +%28 = OpSLessThan %bool %38 %int_4 OpBranchConditional %28 %29 %24 %29 = OpLabel -%32 = OpAccessChain %_ptr_Input_float %BC %39 +%32 = OpAccessChain %_ptr_Input_float %BC %38 %33 = OpLoad %float %32 -%34 = OpFAdd %float %38 %33 +%34 = OpFAdd %float %39 %33 +OpStore %f %34 OpBranch %25 %25 = OpLabel -%36 = OpIAdd %int %39 %int_1 +%36 = OpIAdd %int %38 %int_1 +OpStore %i %36 OpBranch %23 %24 = OpLabel -OpStore %fo %38 +OpStore %fo %39 OpReturn OpFunctionEnd )"; SinglePassRunAndCheck( - predefs + names_before + predefs2 + before, - predefs + names_after + predefs2 + after, true, true); + predefs + before, predefs + after, true, true); +} + +TEST_F(LocalSSAElimTest, NestedForLoop) { + // #version 450 + // + // layout (location=0) in mat4 BC; + // layout (location=0) out float fo; + // + // void main() + // { + // float f = 0.0; + // for (int i=0; i<4; i++) + // for (int j=0; j<4; j++) + // f = f + BC[i][j]; + // fo = f; + // } + + const std::string predefs = + R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %BC %fo +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 450 +OpName %main "main" +OpName %f "f" +OpName %i "i" +OpName %j "j" +OpName %BC "BC" +OpName %fo "fo" +OpDecorate %BC Location 0 +OpDecorate %fo Location 0 +%void = OpTypeVoid +%9 = OpTypeFunction %void +%float = OpTypeFloat 32 +%_ptr_Function_float = OpTypePointer Function %float +%float_0 = OpConstant %float 0 +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_0 = OpConstant %int 0 +%int_4 = OpConstant %int 4 +%bool = OpTypeBool +%v4float = OpTypeVector %float 4 +%mat4v4float = OpTypeMatrix %v4float 4 +%_ptr_Input_mat4v4float = OpTypePointer Input %mat4v4float +%BC = OpVariable %_ptr_Input_mat4v4float Input +%_ptr_Input_float = OpTypePointer Input %float +%int_1 = OpConstant %int 1 +%_ptr_Output_float = OpTypePointer Output %float +%fo = OpVariable %_ptr_Output_float Output +)"; + + const std::string before = + R"(%main = OpFunction %void None %9 +%24 = OpLabel +%f = OpVariable %_ptr_Function_float Function +%i = OpVariable %_ptr_Function_int Function +%j = OpVariable %_ptr_Function_int Function +OpStore %f %float_0 +OpStore %i %int_0 +OpBranch %25 +%25 = OpLabel +%26 = OpLoad %int %i +%27 = OpSLessThan %bool %26 %int_4 +OpLoopMerge %28 %29 None +OpBranchConditional %27 %30 %28 +%30 = OpLabel +OpStore %j %int_0 +OpBranch %31 +%31 = OpLabel +%32 = OpLoad %int %j +%33 = OpSLessThan %bool %32 %int_4 +OpLoopMerge %29 %34 None +OpBranchConditional %33 %34 %29 +%34 = OpLabel +%35 = OpLoad %float %f +%36 = OpLoad %int %i +%37 = OpLoad %int %j +%38 = OpAccessChain %_ptr_Input_float %BC %36 %37 +%39 = OpLoad %float %38 +%40 = OpFAdd %float %35 %39 +OpStore %f %40 +%41 = OpLoad %int %j +%42 = OpIAdd %int %41 %int_1 +OpStore %j %42 +OpBranch %31 +%29 = OpLabel +%43 = OpLoad %int %i +%44 = OpIAdd %int %43 %int_1 +OpStore %i %44 +OpBranch %25 +%28 = OpLabel +%45 = OpLoad %float %f +OpStore %fo %45 +OpReturn +OpFunctionEnd +)"; + + const std::string after = + R"(%main = OpFunction %void None %9 +%24 = OpLabel +%f = OpVariable %_ptr_Function_float Function +%i = OpVariable %_ptr_Function_int Function +%j = OpVariable %_ptr_Function_int Function +OpStore %f %float_0 +OpStore %i %int_0 +OpBranch %25 +%25 = OpLabel +%47 = OpPhi %float %float_0 %24 %50 %29 +%46 = OpPhi %int %int_0 %24 %44 %29 +%27 = OpSLessThan %bool %46 %int_4 +OpLoopMerge %28 %29 None +OpBranchConditional %27 %30 %28 +%30 = OpLabel +OpStore %j %int_0 +OpBranch %31 +%31 = OpLabel +%50 = OpPhi %float %47 %30 %40 %34 +%48 = OpPhi %int %int_0 %30 %42 %34 +%33 = OpSLessThan %bool %48 %int_4 +OpLoopMerge %29 %34 None +OpBranchConditional %33 %34 %29 +%34 = OpLabel +%38 = OpAccessChain %_ptr_Input_float %BC %46 %48 +%39 = OpLoad %float %38 +%40 = OpFAdd %float %50 %39 +OpStore %f %40 +%42 = OpIAdd %int %48 %int_1 +OpStore %j %42 +OpBranch %31 +%29 = OpLabel +%44 = OpIAdd %int %46 %int_1 +OpStore %i %44 +OpBranch %25 +%28 = OpLabel +OpStore %fo %47 +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndCheck( + predefs + before, predefs + after, true, true); } TEST_F(LocalSSAElimTest, ForLoopWithContinue) { @@ -173,7 +308,7 @@ OpSource GLSL 140 )"; - const std::string names_before = + const std::string names = R"(OpName %main "main" OpName %f "f" OpName %i "i" @@ -182,12 +317,6 @@ OpName %fo "fo" )"; - const std::string names_after = - R"(OpName %main "main" -OpName %BC "BC" -OpName %fo "fo" -)"; - const std::string predefs2 = R"(%void = OpTypeVoid %9 = OpTypeFunction %void @@ -254,43 +383,49 @@ )"; const std::string after = - R"(%46 = OpUndef %float -%main = OpFunction %void None %9 + R"(%main = OpFunction %void None %9 %23 = OpLabel +%f = OpVariable %_ptr_Function_float Function +%i = OpVariable %_ptr_Function_int Function +%t = OpVariable %_ptr_Function_float Function +OpStore %f %float_0 +OpStore %i %int_0 OpBranch %24 %24 = OpLabel -%44 = OpPhi %float %float_0 %23 %48 %26 -%45 = OpPhi %int %int_0 %23 %42 %26 -%47 = OpPhi %float %46 %23 %33 %26 +%45 = OpPhi %float %float_0 %23 %47 %26 +%44 = OpPhi %int %int_0 %23 %42 %26 OpLoopMerge %25 %26 None OpBranch %27 %27 = OpLabel -%29 = OpSLessThan %bool %45 %int_4 +%29 = OpSLessThan %bool %44 %int_4 OpBranchConditional %29 %30 %25 %30 = OpLabel -%32 = OpAccessChain %_ptr_Input_float %BC %45 +%32 = OpAccessChain %_ptr_Input_float %BC %44 %33 = OpLoad %float %32 +OpStore %t %33 %35 = OpFOrdLessThan %bool %33 %float_0 OpSelectionMerge %36 None OpBranchConditional %35 %37 %36 %37 = OpLabel OpBranch %26 %36 = OpLabel -%40 = OpFAdd %float %44 %33 +%40 = OpFAdd %float %45 %33 +OpStore %f %40 OpBranch %26 %26 = OpLabel -%48 = OpPhi %float %44 %37 %40 %36 -%42 = OpIAdd %int %45 %int_1 +%47 = OpPhi %float %45 %37 %40 %36 +%42 = OpIAdd %int %44 %int_1 +OpStore %i %42 OpBranch %24 %25 = OpLabel -OpStore %fo %44 +OpStore %fo %45 OpReturn OpFunctionEnd )"; SinglePassRunAndCheck( - predefs + names_before + predefs2 + before, - predefs + names_after + predefs2 + after, true, true); + predefs + names + predefs2 + before, predefs + names + predefs2 + after, + true, true); } TEST_F(LocalSSAElimTest, ForLoopWithBreak) { @@ -318,25 +453,13 @@ OpEntryPoint Fragment %main "main" %BC %fo OpExecutionMode %main OriginUpperLeft OpSource GLSL 140 -)"; - - const std::string names_before = - R"(OpName %main "main" +OpName %main "main" OpName %f "f" OpName %i "i" OpName %t "t" OpName %BC "BC" OpName %fo "fo" -)"; - - const std::string names_after = - R"(OpName %main "main" -OpName %BC "BC" -OpName %fo "fo" -)"; - - const std::string predefs2 = - R"(%void = OpTypeVoid +%void = OpTypeVoid %9 = OpTypeFunction %void %float = OpTypeFloat 32 %_ptr_Function_float = OpTypePointer Function %float @@ -402,43 +525,47 @@ )"; const std::string after = - R"(%47 = OpUndef %float -%main = OpFunction %void None %9 + R"(%main = OpFunction %void None %9 %24 = OpLabel +%f = OpVariable %_ptr_Function_float Function +%i = OpVariable %_ptr_Function_int Function +%t = OpVariable %_ptr_Function_float Function +OpStore %f %float_0 +OpStore %i %int_0 OpBranch %25 %25 = OpLabel -%45 = OpPhi %float %float_0 %24 %36 %27 -%46 = OpPhi %int %int_0 %24 %43 %27 -%48 = OpPhi %float %47 %24 %36 %27 +%46 = OpPhi %float %float_0 %24 %36 %27 +%45 = OpPhi %int %int_0 %24 %43 %27 OpLoopMerge %26 %27 None OpBranch %28 %28 = OpLabel -%30 = OpSLessThan %bool %46 %int_4 +%30 = OpSLessThan %bool %45 %int_4 OpBranchConditional %30 %31 %26 %31 = OpLabel -%34 = OpAccessChain %_ptr_Input_float %BC %46 +%34 = OpAccessChain %_ptr_Input_float %BC %45 %35 = OpLoad %float %34 -%36 = OpFAdd %float %45 %35 +%36 = OpFAdd %float %46 %35 +OpStore %t %36 %38 = OpFOrdGreaterThan %bool %36 %float_1 OpSelectionMerge %39 None OpBranchConditional %38 %40 %39 %40 = OpLabel OpBranch %26 %39 = OpLabel +OpStore %f %36 OpBranch %27 %27 = OpLabel -%43 = OpIAdd %int %46 %int_1 +%43 = OpIAdd %int %45 %int_1 +OpStore %i %43 OpBranch %25 %26 = OpLabel -%49 = OpPhi %float %48 %28 %36 %40 -OpStore %fo %45 +OpStore %fo %46 OpReturn OpFunctionEnd )"; SinglePassRunAndCheck( - predefs + names_before + predefs2 + before, - predefs + names_after + predefs2 + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSSAElimTest, SwapProblem) { @@ -467,10 +594,7 @@ OpEntryPoint Fragment %main "main" %fe %fo OpExecutionMode %main OriginUpperLeft OpSource GLSL 140 -)"; - - const std::string names_before = - R"(OpName %main "main" +OpName %main "main" OpName %f1 "f1" OpName %f2 "f2" OpName %ie "ie" @@ -478,16 +602,7 @@ OpName %i "i" OpName %t "t" OpName %fo "fo" -)"; - - const std::string names_after = - R"(OpName %main "main" -OpName %fe "fe" -OpName %fo "fo" -)"; - - const std::string predefs2 = - R"(%void = OpTypeVoid +%void = OpTypeVoid %11 = OpTypeFunction %void %float = OpTypeFloat 32 %_ptr_Function_float = OpTypePointer Function %float @@ -548,36 +663,46 @@ )"; const std::string after = - R"(%43 = OpUndef %float -%main = OpFunction %void None %11 + R"(%main = OpFunction %void None %11 %23 = OpLabel +%f1 = OpVariable %_ptr_Function_float Function +%f2 = OpVariable %_ptr_Function_float Function +%ie = OpVariable %_ptr_Function_int Function +%i = OpVariable %_ptr_Function_int Function +%t = OpVariable %_ptr_Function_float Function +OpStore %f1 %float_0 +OpStore %f2 %float_1 %24 = OpLoad %float %fe %25 = OpConvertFToS %int %24 +OpStore %ie %25 +OpStore %i %int_0 OpBranch %26 %26 = OpLabel -%40 = OpPhi %float %float_0 %23 %41 %28 -%41 = OpPhi %float %float_1 %23 %40 %28 -%42 = OpPhi %int %int_0 %23 %38 %28 -%44 = OpPhi %float %43 %23 %40 %28 +%43 = OpPhi %float %float_1 %23 %42 %28 +%42 = OpPhi %float %float_0 %23 %43 %28 +%40 = OpPhi %int %int_0 %23 %38 %28 OpLoopMerge %27 %28 None OpBranch %29 %29 = OpLabel -%32 = OpSLessThan %bool %42 %25 +%32 = OpSLessThan %bool %40 %25 OpBranchConditional %32 %33 %27 %33 = OpLabel +OpStore %t %42 +OpStore %f1 %43 +OpStore %f2 %42 OpBranch %28 %28 = OpLabel -%38 = OpIAdd %int %42 %int_1 +%38 = OpIAdd %int %40 %int_1 +OpStore %i %38 OpBranch %26 %27 = OpLabel -OpStore %fo %40 +OpStore %fo %42 OpReturn OpFunctionEnd )"; SinglePassRunAndCheck( - predefs + names_before + predefs2 + before, - predefs + names_after + predefs2 + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSSAElimTest, LostCopyProblem) { @@ -606,25 +731,13 @@ OpEntryPoint Fragment %main "main" %BC %fo OpExecutionMode %main OriginUpperLeft OpSource GLSL 140 -)"; - - const std::string names_before = - R"(OpName %main "main" +OpName %main "main" OpName %f "f" OpName %i "i" OpName %t "t" OpName %BC "BC" OpName %fo "fo" -)"; - - const std::string names_after = - R"(OpName %main "main" -OpName %BC "BC" -OpName %fo "fo" -)"; - - const std::string predefs2 = - R"(%void = OpTypeVoid +%void = OpTypeVoid %9 = OpTypeFunction %void %float = OpTypeFloat 32 %_ptr_Function_float = OpTypePointer Function %float @@ -690,23 +803,30 @@ )"; const std::string after = - R"(%47 = OpUndef %float + R"(%49 = OpUndef %float %main = OpFunction %void None %9 %24 = OpLabel +%f = OpVariable %_ptr_Function_float Function +%i = OpVariable %_ptr_Function_int Function +%t = OpVariable %_ptr_Function_float Function +OpStore %f %float_0 +OpStore %i %int_0 OpBranch %25 %25 = OpLabel -%45 = OpPhi %float %float_0 %24 %37 %27 -%46 = OpPhi %int %int_0 %24 %43 %27 -%48 = OpPhi %float %47 %24 %45 %27 +%46 = OpPhi %float %float_0 %24 %37 %27 +%45 = OpPhi %int %int_0 %24 %43 %27 +%48 = OpPhi %float %49 %24 %46 %27 OpLoopMerge %26 %27 None OpBranch %28 %28 = OpLabel -%30 = OpSLessThan %bool %46 %int_4 +%30 = OpSLessThan %bool %45 %int_4 OpBranchConditional %30 %31 %26 %31 = OpLabel -%35 = OpAccessChain %_ptr_Input_float %BC %46 +OpStore %t %46 +%35 = OpAccessChain %_ptr_Input_float %BC %45 %36 = OpLoad %float %35 -%37 = OpFAdd %float %45 %36 +%37 = OpFAdd %float %46 %36 +OpStore %f %37 %39 = OpFOrdGreaterThan %bool %37 %float_1 OpSelectionMerge %40 None OpBranchConditional %39 %41 %40 @@ -715,19 +835,18 @@ %40 = OpLabel OpBranch %27 %27 = OpLabel -%43 = OpIAdd %int %46 %int_1 +%43 = OpIAdd %int %45 %int_1 +OpStore %i %43 OpBranch %25 %26 = OpLabel -%49 = OpPhi %float %45 %28 %37 %41 -%50 = OpPhi %float %48 %28 %45 %41 -OpStore %fo %50 +%47 = OpPhi %float %48 %28 %46 %41 +OpStore %fo %47 OpReturn OpFunctionEnd )"; SinglePassRunAndCheck( - predefs + names_before + predefs2 + before, - predefs + names_after + predefs2 + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSSAElimTest, IfThenElse) { @@ -753,25 +872,12 @@ OpEntryPoint Fragment %main "main" %f %BaseColor %gl_FragColor OpExecutionMode %main OriginUpperLeft OpSource GLSL 140 -)"; - - const std::string names_before = - R"(OpName %main "main" +OpName %main "main" OpName %f "f" OpName %v "v" OpName %BaseColor "BaseColor" OpName %gl_FragColor "gl_FragColor" -)"; - - const std::string names_after = - R"(OpName %main "main" -OpName %f "f" -OpName %BaseColor "BaseColor" -OpName %gl_FragColor "gl_FragColor" -)"; - - const std::string predefs2 = - R"(%void = OpTypeVoid +%void = OpTypeVoid %8 = OpTypeFunction %void %float = OpTypeFloat 32 %_ptr_Input_float = OpTypePointer Input %float @@ -817,117 +923,6 @@ const std::string after = R"(%main = OpFunction %void None %8 %20 = OpLabel -%21 = OpLoad %float %f -%22 = OpFOrdGreaterThanEqual %bool %21 %float_0 -OpSelectionMerge %23 None -OpBranchConditional %22 %24 %25 -%24 = OpLabel -%26 = OpLoad %v4float %BaseColor -%27 = OpVectorTimesScalar %v4float %26 %float_0_5 -OpBranch %23 -%25 = OpLabel -%28 = OpLoad %v4float %BaseColor -%29 = OpFAdd %v4float %28 %18 -OpBranch %23 -%23 = OpLabel -%31 = OpPhi %v4float %27 %24 %29 %25 -OpStore %gl_FragColor %31 -OpReturn -OpFunctionEnd -)"; - - SinglePassRunAndCheck( - predefs + names_before + predefs2 + before, - predefs + names_after + predefs2 + after, true, true); -} - -TEST_F(LocalSSAElimTest, DecoratedVar) { - // SPIR-V hand edited to decorate v - // #version 450 - // - // layout (location=0) in vec4 BaseColor; - // layout (location=1) in float f; - // layout (location=0) out vec4 OutColor; - // - // void main() - // { - // vec4 v; - // if (f >= 0) - // v = BaseColor * 0.5; - // else - // v = BaseColor + vec4(0.1,0.1,0.1,0.1); - // OutColor = v; - // } - - const std::string predefs_before = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %f %BaseColor %OutColor -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 450 -OpName %main "main" -OpName %f "f" -OpName %v "v" -OpName %BaseColor "BaseColor" -OpName %OutColor "OutColor" -OpDecorate %v RelaxedPrecision -OpDecorate %f Location 1 -OpDecorate %BaseColor Location 0 -OpDecorate %OutColor Location 0 -%void = OpTypeVoid -%8 = OpTypeFunction %void -%float = OpTypeFloat 32 -%_ptr_Input_float = OpTypePointer Input %float -%f = OpVariable %_ptr_Input_float Input -%float_0 = OpConstant %float 0 -%bool = OpTypeBool -%v4float = OpTypeVector %float 4 -%_ptr_Function_v4float = OpTypePointer Function %v4float -%_ptr_Input_v4float = OpTypePointer Input %v4float -%BaseColor = OpVariable %_ptr_Input_v4float Input -%float_0_5 = OpConstant %float 0.5 -%float_0_1 = OpConstant %float 0.1 -%18 = OpConstantComposite %v4float %float_0_1 %float_0_1 %float_0_1 %float_0_1 -%_ptr_Output_v4float = OpTypePointer Output %v4float -%OutColor = OpVariable %_ptr_Output_v4float Output -)"; - - const std::string predefs_after = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %f %BaseColor %OutColor -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 450 -OpName %main "main" -OpName %f "f" -OpName %BaseColor "BaseColor" -OpName %OutColor "OutColor" -OpDecorate %f Location 1 -OpDecorate %BaseColor Location 0 -OpDecorate %OutColor Location 0 -%void = OpTypeVoid -%8 = OpTypeFunction %void -%float = OpTypeFloat 32 -%_ptr_Input_float = OpTypePointer Input %float -%f = OpVariable %_ptr_Input_float Input -%float_0 = OpConstant %float 0 -%bool = OpTypeBool -%v4float = OpTypeVector %float 4 -%_ptr_Function_v4float = OpTypePointer Function %v4float -%_ptr_Input_v4float = OpTypePointer Input %v4float -%BaseColor = OpVariable %_ptr_Input_v4float Input -%float_0_5 = OpConstant %float 0.5 -%float_0_1 = OpConstant %float 0.1 -%18 = OpConstantComposite %v4float %float_0_1 %float_0_1 %float_0_1 %float_0_1 -%_ptr_Output_v4float = OpTypePointer Output %v4float -%OutColor = OpVariable %_ptr_Output_v4float Output -)"; - - const std::string before = - R"(%main = OpFunction %void None %8 -%20 = OpLabel %v = OpVariable %_ptr_Function_v4float Function %21 = OpLoad %float %f %22 = OpFOrdGreaterThanEqual %bool %21 %float_0 @@ -944,36 +939,14 @@ OpStore %v %29 OpBranch %23 %23 = OpLabel -%30 = OpLoad %v4float %v -OpStore %OutColor %30 -OpReturn -OpFunctionEnd -)"; - - const std::string after = - R"(%main = OpFunction %void None %8 -%20 = OpLabel -%21 = OpLoad %float %f -%22 = OpFOrdGreaterThanEqual %bool %21 %float_0 -OpSelectionMerge %23 None -OpBranchConditional %22 %24 %25 -%24 = OpLabel -%26 = OpLoad %v4float %BaseColor -%27 = OpVectorTimesScalar %v4float %26 %float_0_5 -OpBranch %23 -%25 = OpLabel -%28 = OpLoad %v4float %BaseColor -%29 = OpFAdd %v4float %28 %18 -OpBranch %23 -%23 = OpLabel %31 = OpPhi %v4float %27 %24 %29 %25 -OpStore %OutColor %31 +OpStore %gl_FragColor %31 OpReturn OpFunctionEnd )"; SinglePassRunAndCheck( - predefs_before + before, predefs_after + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSSAElimTest, IfThen) { @@ -997,25 +970,12 @@ OpEntryPoint Fragment %main "main" %BaseColor %f %gl_FragColor OpExecutionMode %main OriginUpperLeft OpSource GLSL 140 -)"; - - const std::string names_before = - R"(OpName %main "main" +OpName %main "main" OpName %v "v" OpName %BaseColor "BaseColor" OpName %f "f" OpName %gl_FragColor "gl_FragColor" -)"; - - const std::string names_after = - R"(OpName %main "main" -OpName %BaseColor "BaseColor" -OpName %f "f" -OpName %gl_FragColor "gl_FragColor" -)"; - - const std::string predefs2 = - R"(%void = OpTypeVoid +%void = OpTypeVoid %8 = OpTypeFunction %void %float = OpTypeFloat 32 %v4float = OpTypeVector %float 4 @@ -1056,13 +1016,16 @@ const std::string after = R"(%main = OpFunction %void None %8 %18 = OpLabel +%v = OpVariable %_ptr_Function_v4float Function %19 = OpLoad %v4float %BaseColor +OpStore %v %19 %20 = OpLoad %float %f %21 = OpFOrdLessThanEqual %bool %20 %float_0 OpSelectionMerge %22 None OpBranchConditional %21 %23 %22 %23 = OpLabel %25 = OpVectorTimesScalar %v4float %19 %float_0_5 +OpStore %v %25 OpBranch %22 %22 = OpLabel %27 = OpPhi %v4float %19 %18 %25 %23 @@ -1072,8 +1035,7 @@ )"; SinglePassRunAndCheck( - predefs + names_before + predefs2 + before, - predefs + names_after + predefs2 + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSSAElimTest, Switch) { @@ -1088,13 +1050,13 @@ // int i = int(f); // switch (i) { // case 0: - // v = v * 0.1; + // v = v * 0.25; // break; // case 1: - // v = v * 0.3; + // v = v * 0.625; // break; // case 2: - // v = v * 0.7; + // v = v * 0.75; // break; // default: // break; @@ -1109,26 +1071,13 @@ OpEntryPoint Fragment %main "main" %BaseColor %f %gl_FragColor OpExecutionMode %main OriginUpperLeft OpSource GLSL 140 -)"; - - const std::string names_before = - R"(OpName %main "main" +OpName %main "main" OpName %v "v" OpName %BaseColor "BaseColor" OpName %i "i" OpName %f "f" OpName %gl_FragColor "gl_FragColor" -)"; - - const std::string names_after = - R"(OpName %main "main" -OpName %BaseColor "BaseColor" -OpName %f "f" -OpName %gl_FragColor "gl_FragColor" -)"; - - const std::string predefs2 = - R"(%void = OpTypeVoid +%void = OpTypeVoid %9 = OpTypeFunction %void %float = OpTypeFloat 32 %v4float = OpTypeVector %float 4 @@ -1139,9 +1088,9 @@ %_ptr_Function_int = OpTypePointer Function %int %_ptr_Input_float = OpTypePointer Input %float %f = OpVariable %_ptr_Input_float Input -%float_0_1 = OpConstant %float 0.1 -%float_0_3 = OpConstant %float 0.3 -%float_0_7 = OpConstant %float 0.7 +%float_0_25 = OpConstant %float 0.25 +%float_0_625 = OpConstant %float 0.625 +%float_0_75 = OpConstant %float 0.75 %_ptr_Output_v4float = OpTypePointer Output %v4float %gl_FragColor = OpVariable %_ptr_Output_v4float Output )"; @@ -1163,17 +1112,17 @@ OpBranch %26 %28 = OpLabel %31 = OpLoad %v4float %v -%32 = OpVectorTimesScalar %v4float %31 %float_0_1 +%32 = OpVectorTimesScalar %v4float %31 %float_0_25 OpStore %v %32 OpBranch %26 %29 = OpLabel %33 = OpLoad %v4float %v -%34 = OpVectorTimesScalar %v4float %33 %float_0_3 +%34 = OpVectorTimesScalar %v4float %33 %float_0_625 OpStore %v %34 OpBranch %26 %30 = OpLabel %35 = OpLoad %v4float %v -%36 = OpVectorTimesScalar %v4float %35 %float_0_7 +%36 = OpVectorTimesScalar %v4float %35 %float_0_75 OpStore %v %36 OpBranch %26 %26 = OpLabel @@ -1186,21 +1135,28 @@ const std::string after = R"(%main = OpFunction %void None %9 %21 = OpLabel +%v = OpVariable %_ptr_Function_v4float Function +%i = OpVariable %_ptr_Function_int Function %22 = OpLoad %v4float %BaseColor +OpStore %v %22 %23 = OpLoad %float %f %24 = OpConvertFToS %int %23 +OpStore %i %24 OpSelectionMerge %26 None OpSwitch %24 %27 0 %28 1 %29 2 %30 %27 = OpLabel OpBranch %26 %28 = OpLabel -%32 = OpVectorTimesScalar %v4float %22 %float_0_1 +%32 = OpVectorTimesScalar %v4float %22 %float_0_25 +OpStore %v %32 OpBranch %26 %29 = OpLabel -%34 = OpVectorTimesScalar %v4float %22 %float_0_3 +%34 = OpVectorTimesScalar %v4float %22 %float_0_625 +OpStore %v %34 OpBranch %26 %30 = OpLabel -%36 = OpVectorTimesScalar %v4float %22 %float_0_7 +%36 = OpVectorTimesScalar %v4float %22 %float_0_75 +OpStore %v %36 OpBranch %26 %26 = OpLabel %38 = OpPhi %v4float %22 %27 %32 %28 %34 %29 %36 %30 @@ -1210,8 +1166,7 @@ )"; SinglePassRunAndCheck( - predefs + names_before + predefs2 + before, - predefs + names_after + predefs2 + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSSAElimTest, SwitchWithFallThrough) { @@ -1226,12 +1181,12 @@ // int i = int(f); // switch (i) { // case 0: - // v = v * 0.1; + // v = v * 0.25; // break; // case 1: - // v = v + 0.1; + // v = v + 0.25; // case 2: - // v = v * 0.7; + // v = v * 0.75; // break; // default: // break; @@ -1246,26 +1201,13 @@ OpEntryPoint Fragment %main "main" %BaseColor %f %gl_FragColor OpExecutionMode %main OriginUpperLeft OpSource GLSL 140 -)"; - - const std::string names_before = - R"(OpName %main "main" +OpName %main "main" OpName %v "v" OpName %BaseColor "BaseColor" OpName %i "i" OpName %f "f" OpName %gl_FragColor "gl_FragColor" -)"; - - const std::string names_after = - R"(OpName %main "main" -OpName %BaseColor "BaseColor" -OpName %f "f" -OpName %gl_FragColor "gl_FragColor" -)"; - - const std::string predefs2 = - R"(%void = OpTypeVoid +%void = OpTypeVoid %9 = OpTypeFunction %void %float = OpTypeFloat 32 %v4float = OpTypeVector %float 4 @@ -1276,8 +1218,8 @@ %_ptr_Function_int = OpTypePointer Function %int %_ptr_Input_float = OpTypePointer Input %float %f = OpVariable %_ptr_Input_float Input -%float_0_1 = OpConstant %float 0.1 -%float_0_7 = OpConstant %float 0.7 +%float_0_25 = OpConstant %float 0.25 +%float_0_75 = OpConstant %float 0.75 %_ptr_Output_v4float = OpTypePointer Output %v4float %gl_FragColor = OpVariable %_ptr_Output_v4float Output )"; @@ -1299,18 +1241,18 @@ OpBranch %25 %27 = OpLabel %30 = OpLoad %v4float %v -%31 = OpVectorTimesScalar %v4float %30 %float_0_1 +%31 = OpVectorTimesScalar %v4float %30 %float_0_25 OpStore %v %31 OpBranch %25 %28 = OpLabel %32 = OpLoad %v4float %v -%33 = OpCompositeConstruct %v4float %float_0_1 %float_0_1 %float_0_1 %float_0_1 +%33 = OpCompositeConstruct %v4float %float_0_25 %float_0_25 %float_0_25 %float_0_25 %34 = OpFAdd %v4float %32 %33 OpStore %v %34 OpBranch %29 %29 = OpLabel %35 = OpLoad %v4float %v -%36 = OpVectorTimesScalar %v4float %35 %float_0_7 +%36 = OpVectorTimesScalar %v4float %35 %float_0_75 OpStore %v %36 OpBranch %25 %25 = OpLabel @@ -1323,23 +1265,30 @@ const std::string after = R"(%main = OpFunction %void None %9 %20 = OpLabel +%v = OpVariable %_ptr_Function_v4float Function +%i = OpVariable %_ptr_Function_int Function %21 = OpLoad %v4float %BaseColor +OpStore %v %21 %22 = OpLoad %float %f %23 = OpConvertFToS %int %22 +OpStore %i %23 OpSelectionMerge %25 None OpSwitch %23 %26 0 %27 1 %28 2 %29 %26 = OpLabel OpBranch %25 %27 = OpLabel -%31 = OpVectorTimesScalar %v4float %21 %float_0_1 +%31 = OpVectorTimesScalar %v4float %21 %float_0_25 +OpStore %v %31 OpBranch %25 %28 = OpLabel -%33 = OpCompositeConstruct %v4float %float_0_1 %float_0_1 %float_0_1 %float_0_1 +%33 = OpCompositeConstruct %v4float %float_0_25 %float_0_25 %float_0_25 %float_0_25 %34 = OpFAdd %v4float %21 %33 +OpStore %v %34 OpBranch %29 %29 = OpLabel %38 = OpPhi %v4float %21 %20 %34 %28 -%36 = OpVectorTimesScalar %v4float %38 %float_0_7 +%36 = OpVectorTimesScalar %v4float %38 %float_0_75 +OpStore %v %36 OpBranch %25 %25 = OpLabel %39 = OpPhi %v4float %21 %26 %31 %27 %36 %29 @@ -1349,8 +1298,7 @@ )"; SinglePassRunAndCheck( - predefs + names_before + predefs2 + before, - predefs + names_after + predefs2 + after, true, true); + predefs + before, predefs + after, true, true); } TEST_F(LocalSSAElimTest, DontPatchPhiInLoopHeaderThatIsNotAVar) { @@ -1401,7 +1349,7 @@ // oColor = v; // } - const std::string predefs_before = + const std::string predefs = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 @@ -1435,39 +1383,6 @@ %oColor = OpVariable %_ptr_Output_v4float Output )"; - const std::string predefs_after = - R"(OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint Fragment %main "main" %fi %iColor %oColor -OpExecutionMode %main OriginUpperLeft -OpSource GLSL 450 -OpName %main "main" -OpName %fi "fi" -OpName %iColor "iColor" -OpName %oColor "oColor" -OpDecorate %fi Location 1 -OpDecorate %iColor Location 0 -OpDecorate %oColor Location 0 -%void = OpTypeVoid -%8 = OpTypeFunction %void -%float = OpTypeFloat 32 -%v4float = OpTypeVector %float 4 -%_ptr_Function_v4float = OpTypePointer Function %v4float -%float_0 = OpConstant %float 0 -%13 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 -%_ptr_Input_float = OpTypePointer Input %float -%fi = OpVariable %_ptr_Input_float Input -%bool = OpTypeBool -%_ptr_Input_v4float = OpTypePointer Input %v4float -%iColor = OpVariable %_ptr_Input_v4float Input -%uint = OpTypeInt 32 0 -%uint_0 = OpConstant %uint 0 -%_ptr_Function_float = OpTypePointer Function %float -%_ptr_Output_v4float = OpTypePointer Output %v4float -%oColor = OpVariable %_ptr_Output_v4float Output -)"; - const std::string func_before = R"(%main = OpFunction %void None %8 %21 = OpLabel @@ -1493,6 +1408,7 @@ const std::string func_after = R"(%main = OpFunction %void None %8 %21 = OpLabel +%v = OpVariable %_ptr_Function_v4float Function %13 %22 = OpLoad %float %fi %23 = OpFOrdLessThan %bool %22 %float_0 OpSelectionMerge %24 None @@ -1501,6 +1417,7 @@ %26 = OpAccessChain %_ptr_Input_float %iColor %uint_0 %27 = OpLoad %float %26 %29 = OpCompositeInsert %v4float %27 %13 0 +OpStore %v %29 OpBranch %24 %24 = OpLabel %31 = OpPhi %v4float %13 %21 %29 %25 @@ -1510,7 +1427,7 @@ )"; SinglePassRunAndCheck( - predefs_before + func_before, predefs_after + func_after, true, true); + predefs + func_before, predefs + func_after, true, true); } TEST_F(LocalSSAElimTest, PointerVariable) { @@ -1599,6 +1516,8 @@ %7 = OpVariable %_ptr_Uniform__struct_5 Uniform %1 = OpFunction %void None %10 %23 = OpLabel +%24 = OpVariable %_ptr_Function__ptr_Uniform__struct_5 Function +OpStore %24 %7 %27 = OpAccessChain %_ptr_Uniform_v4float %7 %int_0 %uint_0 %int_0 %28 = OpLoad %v4float %27 %29 = OpCopyObject %v4float %28 @@ -1704,6 +1623,103 @@ EXPECT_TRUE(status == opt::Pass::Status::SuccessWithChange); } +// TODO(dneto): Add Effcee as required dependency, and make this unconditional. +#ifdef SPIRV_EFFCEE +TEST_F(LocalSSAElimTest, CompositeExtractProblem) { + const std::string spv_asm = R"( + OpCapability Tessellation + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint TessellationControl %2 "main" + %void = OpTypeVoid + %4 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 + %uint = OpTypeInt 32 0 + %uint_3 = OpConstant %uint 3 + %v3float = OpTypeVector %float 3 + %v2float = OpTypeVector %float 2 + %_struct_11 = OpTypeStruct %v4float %v4float %v4float %v3float %v3float %v2float %v2float +%_arr__struct_11_uint_3 = OpTypeArray %_struct_11 %uint_3 +%_ptr_Function__arr__struct_11_uint_3 = OpTypePointer Function %_arr__struct_11_uint_3 +%_arr_v4float_uint_3 = OpTypeArray %v4float %uint_3 +%_ptr_Input__arr_v4float_uint_3 = OpTypePointer Input %_arr_v4float_uint_3 + %16 = OpVariable %_ptr_Input__arr_v4float_uint_3 Input + %17 = OpVariable %_ptr_Input__arr_v4float_uint_3 Input + %18 = OpVariable %_ptr_Input__arr_v4float_uint_3 Input +%_ptr_Input_uint = OpTypePointer Input %uint + %20 = OpVariable %_ptr_Input_uint Input +%_ptr_Output__arr_v4float_uint_3 = OpTypePointer Output %_arr_v4float_uint_3 + %22 = OpVariable %_ptr_Output__arr_v4float_uint_3 Output +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_arr_v3float_uint_3 = OpTypeArray %v3float %uint_3 +%_ptr_Input__arr_v3float_uint_3 = OpTypePointer Input %_arr_v3float_uint_3 + %26 = OpVariable %_ptr_Input__arr_v3float_uint_3 Input + %27 = OpVariable %_ptr_Input__arr_v3float_uint_3 Input +%_arr_v2float_uint_3 = OpTypeArray %v2float %uint_3 +%_ptr_Input__arr_v2float_uint_3 = OpTypePointer Input %_arr_v2float_uint_3 + %30 = OpVariable %_ptr_Input__arr_v2float_uint_3 Input + %31 = OpVariable %_ptr_Input__arr_v2float_uint_3 Input +%_ptr_Function__struct_11 = OpTypePointer Function %_struct_11 + %2 = OpFunction %void None %4 + %33 = OpLabel + %34 = OpLoad %_arr_v4float_uint_3 %16 + %35 = OpLoad %_arr_v4float_uint_3 %17 + %36 = OpLoad %_arr_v4float_uint_3 %18 + %37 = OpLoad %_arr_v3float_uint_3 %26 + %38 = OpLoad %_arr_v3float_uint_3 %27 + %39 = OpLoad %_arr_v2float_uint_3 %30 + %40 = OpLoad %_arr_v2float_uint_3 %31 + %41 = OpCompositeExtract %v4float %34 0 + %42 = OpCompositeExtract %v4float %35 0 + %43 = OpCompositeExtract %v4float %36 0 + %44 = OpCompositeExtract %v3float %37 0 + %45 = OpCompositeExtract %v3float %38 0 + %46 = OpCompositeExtract %v2float %39 0 + %47 = OpCompositeExtract %v2float %40 0 + %48 = OpCompositeConstruct %_struct_11 %41 %42 %43 %44 %45 %46 %47 + %49 = OpCompositeExtract %v4float %34 1 + %50 = OpCompositeExtract %v4float %35 1 + %51 = OpCompositeExtract %v4float %36 1 + %52 = OpCompositeExtract %v3float %37 1 + %53 = OpCompositeExtract %v3float %38 1 + %54 = OpCompositeExtract %v2float %39 1 + %55 = OpCompositeExtract %v2float %40 1 + %56 = OpCompositeConstruct %_struct_11 %49 %50 %51 %52 %53 %54 %55 + %57 = OpCompositeExtract %v4float %34 2 + %58 = OpCompositeExtract %v4float %35 2 + %59 = OpCompositeExtract %v4float %36 2 + %60 = OpCompositeExtract %v3float %37 2 + %61 = OpCompositeExtract %v3float %38 2 + %62 = OpCompositeExtract %v2float %39 2 + %63 = OpCompositeExtract %v2float %40 2 + %64 = OpCompositeConstruct %_struct_11 %57 %58 %59 %60 %61 %62 %63 + %65 = OpCompositeConstruct %_arr__struct_11_uint_3 %48 %56 %64 + %66 = OpVariable %_ptr_Function__arr__struct_11_uint_3 Function + %67 = OpLoad %uint %20 + +; CHECK OpStore {{%\d+}} [[store_source:%\d+]] + OpStore %66 %65 + %68 = OpAccessChain %_ptr_Function__struct_11 %66 %67 + +; This load was being removed, because %_ptr_Function__struct_11 was being +; wrongfully considered an SSA target. +; CHECK OpLoad %_struct_11 %68 + %69 = OpLoad %_struct_11 %68 + +; Similarly, %69 cannot be replaced with %65. +; CHECK-NOT: OpCompositeExtract %v4float [[store_source]] 0 + %70 = OpCompositeExtract %v4float %69 0 + + %71 = OpAccessChain %_ptr_Output_v4float %22 %67 + OpStore %71 %70 + OpReturn + OpFunctionEnd)"; + + SinglePassRunAndMatch(spv_asm, true); +} +#endif + // TODO(greg-lunarg): Add tests to verify handling of these cases: // // No optimization in the presence of diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/CMakeLists.txt 2018-04-27 11:46:32.000000000 +0000 @@ -30,3 +30,63 @@ lcssa.cpp LIBS SPIRV-Tools-opt ) + +add_spvtools_unittest(TARGET licm_all_loop_types + SRCS ../function_utils.h + hoist_all_loop_types.cpp + LIBS SPIRV-Tools-opt +) + +add_spvtools_unittest(TARGET licm_hoist_independent_loops + SRCS ../function_utils.h + hoist_from_independent_loops.cpp + LIBS SPIRV-Tools-opt +) + +add_spvtools_unittest(TARGET licm_hoist_double_nested_loops + SRCS ../function_utils.h + hoist_double_nested_loops.cpp + LIBS SPIRV-Tools-opt +) + +add_spvtools_unittest(TARGET licm_hoist_single_nested_loops + SRCS ../function_utils.h + hoist_single_nested_loops.cpp + LIBS SPIRV-Tools-opt +) + +add_spvtools_unittest(TARGET licm_hoist_simple_case + SRCS ../function_utils.h + hoist_simple_case.cpp + LIBS SPIRV-Tools-opt +) + +add_spvtools_unittest(TARGET licm_hoist_no_preheader + SRCS ../function_utils.h + hoist_without_preheader.cpp + LIBS SPIRV-Tools-opt +) + +add_spvtools_unittest(TARGET loop_unroll_simple + SRCS ../function_utils.h + unroll_simple.cpp + LIBS SPIRV-Tools-opt +) + +add_spvtools_unittest(TARGET loop_unroll_assumtion_checks + SRCS ../function_utils.h + unroll_assumptions.cpp + LIBS SPIRV-Tools-opt +) + +add_spvtools_unittest(TARGET unswitch_test + SRCS ../function_utils.h + unswitch.cpp + LIBS SPIRV-Tools-opt +) + +add_spvtools_unittest(TARGET peeling_test + SRCS ../function_utils.h + peeling.cpp + LIBS SPIRV-Tools-opt +) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_all_loop_types.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_all_loop_types.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_all_loop_types.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_all_loop_types.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,284 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include + +#include + +#include "../pass_fixture.h" +#include "opt/licm_pass.h" + +namespace { + +using namespace spvtools; +using ::testing::UnorderedElementsAre; + +using PassClassTest = PassTest<::testing::Test>; + +/* + Tests that all loop types are handled appropriately by the LICM pass. + + Generated from the following GLSL fragment shader +--eliminate-local-multi-store has also been run on the spv binary +#version 440 core +void main(){ + int i_1 = 0; + for (i_1 = 0; i_1 < 10; i_1++) { + } + int i_2 = 0; + while (i_2 < 10) { + i_2++; + } + int i_3 = 0; + do { + i_3++; + } while (i_3 < 10); + int hoist = 0; + int i_4 = 0; + int i_5 = 0; + int i_6 = 0; + for (i_4 = 0; i_4 < 10; i_4++) { + while (i_5 < 10) { + do { + hoist = i_1 + i_2 + i_3; + i_6++; + } while (i_6 < 10); + i_5++; + } + } +} +*/ +TEST_F(PassClassTest, AllLoopTypes) { + const std::string before_hoist = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 440 +OpName %main "main" +%void = OpTypeVoid +%4 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%int_1 = OpConstant %int 1 +%main = OpFunction %void None %4 +%11 = OpLabel +OpBranch %12 +%12 = OpLabel +%13 = OpPhi %int %int_0 %11 %14 %15 +OpLoopMerge %16 %15 None +OpBranch %17 +%17 = OpLabel +%18 = OpSLessThan %bool %13 %int_10 +OpBranchConditional %18 %19 %16 +%19 = OpLabel +OpBranch %15 +%15 = OpLabel +%14 = OpIAdd %int %13 %int_1 +OpBranch %12 +%16 = OpLabel +OpBranch %20 +%20 = OpLabel +%21 = OpPhi %int %int_0 %16 %22 %23 +OpLoopMerge %24 %23 None +OpBranch %25 +%25 = OpLabel +%26 = OpSLessThan %bool %21 %int_10 +OpBranchConditional %26 %27 %24 +%27 = OpLabel +%22 = OpIAdd %int %21 %int_1 +OpBranch %23 +%23 = OpLabel +OpBranch %20 +%24 = OpLabel +OpBranch %28 +%28 = OpLabel +%29 = OpPhi %int %int_0 %24 %30 %31 +OpLoopMerge %32 %31 None +OpBranch %33 +%33 = OpLabel +%30 = OpIAdd %int %29 %int_1 +OpBranch %31 +%31 = OpLabel +%34 = OpSLessThan %bool %30 %int_10 +OpBranchConditional %34 %28 %32 +%32 = OpLabel +OpBranch %35 +%35 = OpLabel +%36 = OpPhi %int %int_0 %32 %37 %38 +%39 = OpPhi %int %int_0 %32 %40 %38 +%41 = OpPhi %int %int_0 %32 %42 %38 +%43 = OpPhi %int %int_0 %32 %44 %38 +OpLoopMerge %45 %38 None +OpBranch %46 +%46 = OpLabel +%47 = OpSLessThan %bool %39 %int_10 +OpBranchConditional %47 %48 %45 +%48 = OpLabel +OpBranch %49 +%49 = OpLabel +%37 = OpPhi %int %36 %48 %50 %51 +%42 = OpPhi %int %41 %48 %52 %51 +%44 = OpPhi %int %43 %48 %53 %51 +OpLoopMerge %54 %51 None +OpBranch %55 +%55 = OpLabel +%56 = OpSLessThan %bool %42 %int_10 +OpBranchConditional %56 %57 %54 +%57 = OpLabel +OpBranch %58 +%58 = OpLabel +%59 = OpPhi %int %37 %57 %50 %60 +%61 = OpPhi %int %44 %57 %53 %60 +OpLoopMerge %62 %60 None +OpBranch %63 +%63 = OpLabel +%64 = OpIAdd %int %13 %21 +%50 = OpIAdd %int %64 %30 +%53 = OpIAdd %int %61 %int_1 +OpBranch %60 +%60 = OpLabel +%65 = OpSLessThan %bool %53 %int_10 +OpBranchConditional %65 %58 %62 +%62 = OpLabel +%52 = OpIAdd %int %42 %int_1 +OpBranch %51 +%51 = OpLabel +OpBranch %49 +%54 = OpLabel +OpBranch %38 +%38 = OpLabel +%40 = OpIAdd %int %39 %int_1 +OpBranch %35 +%45 = OpLabel +OpReturn +OpFunctionEnd +)"; + + const std::string after_hoist = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 440 +OpName %main "main" +%void = OpTypeVoid +%4 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%int_1 = OpConstant %int 1 +%main = OpFunction %void None %4 +%11 = OpLabel +OpBranch %12 +%12 = OpLabel +%13 = OpPhi %int %int_0 %11 %14 %15 +OpLoopMerge %16 %15 None +OpBranch %17 +%17 = OpLabel +%18 = OpSLessThan %bool %13 %int_10 +OpBranchConditional %18 %19 %16 +%19 = OpLabel +OpBranch %15 +%15 = OpLabel +%14 = OpIAdd %int %13 %int_1 +OpBranch %12 +%16 = OpLabel +OpBranch %20 +%20 = OpLabel +%21 = OpPhi %int %int_0 %16 %22 %23 +OpLoopMerge %24 %23 None +OpBranch %25 +%25 = OpLabel +%26 = OpSLessThan %bool %21 %int_10 +OpBranchConditional %26 %27 %24 +%27 = OpLabel +%22 = OpIAdd %int %21 %int_1 +OpBranch %23 +%23 = OpLabel +OpBranch %20 +%24 = OpLabel +OpBranch %28 +%28 = OpLabel +%29 = OpPhi %int %int_0 %24 %30 %31 +OpLoopMerge %32 %31 None +OpBranch %33 +%33 = OpLabel +%30 = OpIAdd %int %29 %int_1 +OpBranch %31 +%31 = OpLabel +%34 = OpSLessThan %bool %30 %int_10 +OpBranchConditional %34 %28 %32 +%32 = OpLabel +%64 = OpIAdd %int %13 %21 +%50 = OpIAdd %int %64 %30 +OpBranch %35 +%35 = OpLabel +%36 = OpPhi %int %int_0 %32 %37 %38 +%39 = OpPhi %int %int_0 %32 %40 %38 +%41 = OpPhi %int %int_0 %32 %42 %38 +%43 = OpPhi %int %int_0 %32 %44 %38 +OpLoopMerge %45 %38 None +OpBranch %46 +%46 = OpLabel +%47 = OpSLessThan %bool %39 %int_10 +OpBranchConditional %47 %48 %45 +%48 = OpLabel +OpBranch %49 +%49 = OpLabel +%37 = OpPhi %int %36 %48 %50 %51 +%42 = OpPhi %int %41 %48 %52 %51 +%44 = OpPhi %int %43 %48 %53 %51 +OpLoopMerge %54 %51 None +OpBranch %55 +%55 = OpLabel +%56 = OpSLessThan %bool %42 %int_10 +OpBranchConditional %56 %57 %54 +%57 = OpLabel +OpBranch %58 +%58 = OpLabel +%59 = OpPhi %int %37 %57 %50 %60 +%61 = OpPhi %int %44 %57 %53 %60 +OpLoopMerge %62 %60 None +OpBranch %63 +%63 = OpLabel +%53 = OpIAdd %int %61 %int_1 +OpBranch %60 +%60 = OpLabel +%65 = OpSLessThan %bool %53 %int_10 +OpBranchConditional %65 %58 %62 +%62 = OpLabel +%52 = OpIAdd %int %42 %int_1 +OpBranch %51 +%51 = OpLabel +OpBranch %49 +%54 = OpLabel +OpBranch %38 +%38 = OpLabel +%40 = OpIAdd %int %39 %int_1 +OpBranch %35 +%45 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndCheck(before_hoist, after_hoist, true); +} + +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_double_nested_loops.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_double_nested_loops.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_double_nested_loops.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_double_nested_loops.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,161 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include + +#include + +#include "../pass_fixture.h" +#include "opt/licm_pass.h" + +namespace { + +using namespace spvtools; +using ::testing::UnorderedElementsAre; + +using PassClassTest = PassTest<::testing::Test>; + +/* + Tests that the LICM pass will move invariants through multiple loops + + Generated from the following GLSL fragment shader +--eliminate-local-multi-store has also been run on the spv binary +#version 440 core +void main(){ + int a = 2; + int b = 1; + int hoist = 0; + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + // hoist 'hoist = a - b' out of both loops + hoist = a - b; + } + } +} +*/ +TEST_F(PassClassTest, NestedDoubleHoist) { + const std::string before_hoist = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 440 +OpName %main "main" +%void = OpTypeVoid +%4 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_2 = OpConstant %int 2 +%int_1 = OpConstant %int 1 +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%12 = OpUndef %int +%main = OpFunction %void None %4 +%13 = OpLabel +OpBranch %14 +%14 = OpLabel +%15 = OpPhi %int %int_0 %13 %16 %17 +%18 = OpPhi %int %int_0 %13 %19 %17 +%20 = OpPhi %int %12 %13 %21 %17 +OpLoopMerge %22 %17 None +OpBranch %23 +%23 = OpLabel +%24 = OpSLessThan %bool %18 %int_10 +OpBranchConditional %24 %25 %22 +%25 = OpLabel +OpBranch %26 +%26 = OpLabel +%16 = OpPhi %int %15 %25 %27 %28 +%21 = OpPhi %int %int_0 %25 %29 %28 +OpLoopMerge %30 %28 None +OpBranch %31 +%31 = OpLabel +%32 = OpSLessThan %bool %21 %int_10 +OpBranchConditional %32 %33 %30 +%33 = OpLabel +%27 = OpISub %int %int_2 %int_1 +OpBranch %28 +%28 = OpLabel +%29 = OpIAdd %int %21 %int_1 +OpBranch %26 +%30 = OpLabel +OpBranch %17 +%17 = OpLabel +%19 = OpIAdd %int %18 %int_1 +OpBranch %14 +%22 = OpLabel +OpReturn +OpFunctionEnd +)"; + + const std::string after_hoist = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 440 +OpName %main "main" +%void = OpTypeVoid +%4 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_2 = OpConstant %int 2 +%int_1 = OpConstant %int 1 +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%12 = OpUndef %int +%main = OpFunction %void None %4 +%13 = OpLabel +%27 = OpISub %int %int_2 %int_1 +OpBranch %14 +%14 = OpLabel +%15 = OpPhi %int %int_0 %13 %16 %17 +%18 = OpPhi %int %int_0 %13 %19 %17 +%20 = OpPhi %int %12 %13 %21 %17 +OpLoopMerge %22 %17 None +OpBranch %23 +%23 = OpLabel +%24 = OpSLessThan %bool %18 %int_10 +OpBranchConditional %24 %25 %22 +%25 = OpLabel +OpBranch %26 +%26 = OpLabel +%16 = OpPhi %int %15 %25 %27 %28 +%21 = OpPhi %int %int_0 %25 %29 %28 +OpLoopMerge %30 %28 None +OpBranch %31 +%31 = OpLabel +%32 = OpSLessThan %bool %21 %int_10 +OpBranchConditional %32 %33 %30 +%33 = OpLabel +OpBranch %28 +%28 = OpLabel +%29 = OpIAdd %int %21 %int_1 +OpBranch %26 +%30 = OpLabel +OpBranch %17 +%17 = OpLabel +%19 = OpIAdd %int %18 %int_1 +OpBranch %14 +%22 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndCheck(before_hoist, after_hoist, true); +} + +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_from_independent_loops.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_from_independent_loops.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_from_independent_loops.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_from_independent_loops.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,200 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include + +#include + +#include "../pass_fixture.h" +#include "opt/licm_pass.h" + +namespace { + +using namespace spvtools; +using ::testing::UnorderedElementsAre; + +using PassClassTest = PassTest<::testing::Test>; + +/* + Tests that the LICM pass will analyse multiple independent loops in a function + + Generated from the following GLSL fragment shader +--eliminate-local-multi-store has also been run on the spv binary +#version 440 core +void main(){ + int a = 1; + int b = 2; + int hoist = 0; + for (int i = 0; i < 10; i++) { + // invariant + hoist = a + b; + } + for (int i = 0; i < 10; i++) { + // invariant + hoist = a + b; + } + int c = 1; + int d = 2; + int hoist2 = 0; + for (int i = 0; i < 10; i++) { + // invariant + hoist2 = c + d; + } +} +*/ +TEST_F(PassClassTest, HoistFromIndependentLoops) { + const std::string before_hoist = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 440 +OpName %main "main" +%void = OpTypeVoid +%4 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_1 = OpConstant %int 1 +%int_2 = OpConstant %int 2 +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%main = OpFunction %void None %4 +%12 = OpLabel +OpBranch %13 +%13 = OpLabel +%14 = OpPhi %int %int_0 %12 %15 %16 +%17 = OpPhi %int %int_0 %12 %18 %16 +OpLoopMerge %19 %16 None +OpBranch %20 +%20 = OpLabel +%21 = OpSLessThan %bool %17 %int_10 +OpBranchConditional %21 %22 %19 +%22 = OpLabel +%15 = OpIAdd %int %int_1 %int_2 +OpBranch %16 +%16 = OpLabel +%18 = OpIAdd %int %17 %int_1 +OpBranch %13 +%19 = OpLabel +OpBranch %23 +%23 = OpLabel +%24 = OpPhi %int %14 %19 %25 %26 +%27 = OpPhi %int %int_0 %19 %28 %26 +OpLoopMerge %29 %26 None +OpBranch %30 +%30 = OpLabel +%31 = OpSLessThan %bool %27 %int_10 +OpBranchConditional %31 %32 %29 +%32 = OpLabel +%25 = OpIAdd %int %int_1 %int_2 +OpBranch %26 +%26 = OpLabel +%28 = OpIAdd %int %27 %int_1 +OpBranch %23 +%29 = OpLabel +OpBranch %33 +%33 = OpLabel +%34 = OpPhi %int %int_0 %29 %35 %36 +%37 = OpPhi %int %int_0 %29 %38 %36 +OpLoopMerge %39 %36 None +OpBranch %40 +%40 = OpLabel +%41 = OpSLessThan %bool %37 %int_10 +OpBranchConditional %41 %42 %39 +%42 = OpLabel +%35 = OpIAdd %int %int_1 %int_2 +OpBranch %36 +%36 = OpLabel +%38 = OpIAdd %int %37 %int_1 +OpBranch %33 +%39 = OpLabel +OpReturn +OpFunctionEnd +)"; + + const std::string after_hoist = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 440 +OpName %main "main" +%void = OpTypeVoid +%4 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_1 = OpConstant %int 1 +%int_2 = OpConstant %int 2 +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%main = OpFunction %void None %4 +%12 = OpLabel +%15 = OpIAdd %int %int_1 %int_2 +OpBranch %13 +%13 = OpLabel +%14 = OpPhi %int %int_0 %12 %15 %16 +%17 = OpPhi %int %int_0 %12 %18 %16 +OpLoopMerge %19 %16 None +OpBranch %20 +%20 = OpLabel +%21 = OpSLessThan %bool %17 %int_10 +OpBranchConditional %21 %22 %19 +%22 = OpLabel +OpBranch %16 +%16 = OpLabel +%18 = OpIAdd %int %17 %int_1 +OpBranch %13 +%19 = OpLabel +%25 = OpIAdd %int %int_1 %int_2 +OpBranch %23 +%23 = OpLabel +%24 = OpPhi %int %14 %19 %25 %26 +%27 = OpPhi %int %int_0 %19 %28 %26 +OpLoopMerge %29 %26 None +OpBranch %30 +%30 = OpLabel +%31 = OpSLessThan %bool %27 %int_10 +OpBranchConditional %31 %32 %29 +%32 = OpLabel +OpBranch %26 +%26 = OpLabel +%28 = OpIAdd %int %27 %int_1 +OpBranch %23 +%29 = OpLabel +%35 = OpIAdd %int %int_1 %int_2 +OpBranch %33 +%33 = OpLabel +%34 = OpPhi %int %int_0 %29 %35 %36 +%37 = OpPhi %int %int_0 %29 %38 %36 +OpLoopMerge %39 %36 None +OpBranch %40 +%40 = OpLabel +%41 = OpSLessThan %bool %37 %int_10 +OpBranchConditional %41 %42 %39 +%42 = OpLabel +OpBranch %36 +%36 = OpLabel +%38 = OpIAdd %int %37 %int_1 +OpBranch %33 +%39 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndCheck(before_hoist, after_hoist, true); +} + +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_simple_case.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_simple_case.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_simple_case.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_simple_case.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,125 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include + +#include + +#include "../pass_fixture.h" +#include "opt/licm_pass.h" + +namespace { + +using namespace spvtools; +using ::testing::UnorderedElementsAre; + +using PassClassTest = PassTest<::testing::Test>; + +/* + A simple test for the LICM pass + + Generated from the following GLSL fragment shader +--eliminate-local-multi-store has also been run on the spv binary +#version 440 core +void main(){ + int a = 1; + int b = 2; + int hoist = 0; + for (int i = 0; i < 10; i++) { + // invariant + hoist = a + b; + } +} +*/ +TEST_F(PassClassTest, SimpleHoist) { + const std::string before_hoist = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 440 +OpName %main "main" +%void = OpTypeVoid +%4 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_1 = OpConstant %int 1 +%int_2 = OpConstant %int 2 +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%main = OpFunction %void None %4 +%12 = OpLabel +OpBranch %13 +%13 = OpLabel +%14 = OpPhi %int %int_0 %12 %15 %16 +%17 = OpPhi %int %int_0 %12 %18 %16 +OpLoopMerge %19 %16 None +OpBranch %20 +%20 = OpLabel +%21 = OpSLessThan %bool %17 %int_10 +OpBranchConditional %21 %22 %19 +%22 = OpLabel +%15 = OpIAdd %int %int_1 %int_2 +OpBranch %16 +%16 = OpLabel +%18 = OpIAdd %int %17 %int_1 +OpBranch %13 +%19 = OpLabel +OpReturn +OpFunctionEnd +)"; + + const std::string after_hoist = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 440 +OpName %main "main" +%void = OpTypeVoid +%4 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_1 = OpConstant %int 1 +%int_2 = OpConstant %int 2 +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%main = OpFunction %void None %4 +%12 = OpLabel +%15 = OpIAdd %int %int_1 %int_2 +OpBranch %13 +%13 = OpLabel +%14 = OpPhi %int %int_0 %12 %15 %16 +%17 = OpPhi %int %int_0 %12 %18 %16 +OpLoopMerge %19 %16 None +OpBranch %20 +%20 = OpLabel +%21 = OpSLessThan %bool %17 %int_10 +OpBranchConditional %21 %22 %19 +%22 = OpLabel +OpBranch %16 +%16 = OpLabel +%18 = OpIAdd %int %17 %int_1 +OpBranch %13 +%19 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndCheck(before_hoist, after_hoist, true); +} + +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_single_nested_loops.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_single_nested_loops.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_single_nested_loops.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_single_nested_loops.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,161 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include + +#include + +#include "../pass_fixture.h" +#include "opt/licm_pass.h" + +namespace { + +using namespace spvtools; +using ::testing::UnorderedElementsAre; + +using PassClassTest = PassTest<::testing::Test>; + +/* + Tests that the LICM pass will detect an move an invariant from a nested loop, + but not it's parent loop + + Generated from the following GLSL fragment shader +--eliminate-local-multi-store has also been run on the spv binary +#version 440 core +void main(){ + int a = 2; + int hoist = 0; + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + // hoist 'hoist = a - i' out of j loop, but not i loop + hoist = a - i; + } + } +} +*/ +TEST_F(PassClassTest, NestedSingleHoist) { + const std::string before_hoist = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 440 +OpName %main "main" +%void = OpTypeVoid +%4 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_2 = OpConstant %int 2 +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%int_1 = OpConstant %int 1 +%12 = OpUndef %int +%main = OpFunction %void None %4 +%13 = OpLabel +OpBranch %14 +%14 = OpLabel +%15 = OpPhi %int %int_0 %13 %16 %17 +%18 = OpPhi %int %int_0 %13 %19 %17 +%20 = OpPhi %int %12 %13 %21 %17 +OpLoopMerge %22 %17 None +OpBranch %23 +%23 = OpLabel +%24 = OpSLessThan %bool %18 %int_10 +OpBranchConditional %24 %25 %22 +%25 = OpLabel +OpBranch %26 +%26 = OpLabel +%16 = OpPhi %int %15 %25 %27 %28 +%21 = OpPhi %int %int_0 %25 %29 %28 +OpLoopMerge %30 %28 None +OpBranch %31 +%31 = OpLabel +%32 = OpSLessThan %bool %21 %int_10 +OpBranchConditional %32 %33 %30 +%33 = OpLabel +%27 = OpISub %int %int_2 %18 +OpBranch %28 +%28 = OpLabel +%29 = OpIAdd %int %21 %int_1 +OpBranch %26 +%30 = OpLabel +OpBranch %17 +%17 = OpLabel +%19 = OpIAdd %int %18 %int_1 +OpBranch %14 +%22 = OpLabel +OpReturn +OpFunctionEnd +)"; + + const std::string after_hoist = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 440 +OpName %main "main" +%void = OpTypeVoid +%4 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_2 = OpConstant %int 2 +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%int_1 = OpConstant %int 1 +%12 = OpUndef %int +%main = OpFunction %void None %4 +%13 = OpLabel +OpBranch %14 +%14 = OpLabel +%15 = OpPhi %int %int_0 %13 %16 %17 +%18 = OpPhi %int %int_0 %13 %19 %17 +%20 = OpPhi %int %12 %13 %21 %17 +OpLoopMerge %22 %17 None +OpBranch %23 +%23 = OpLabel +%24 = OpSLessThan %bool %18 %int_10 +OpBranchConditional %24 %25 %22 +%25 = OpLabel +%27 = OpISub %int %int_2 %18 +OpBranch %26 +%26 = OpLabel +%16 = OpPhi %int %15 %25 %27 %28 +%21 = OpPhi %int %int_0 %25 %29 %28 +OpLoopMerge %30 %28 None +OpBranch %31 +%31 = OpLabel +%32 = OpSLessThan %bool %21 %int_10 +OpBranchConditional %32 %33 %30 +%33 = OpLabel +OpBranch %28 +%28 = OpLabel +%29 = OpIAdd %int %21 %int_1 +OpBranch %26 +%30 = OpLabel +OpBranch %17 +%17 = OpLabel +%19 = OpIAdd %int %18 %int_1 +OpBranch %14 +%22 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndCheck(before_hoist, after_hoist, true); +} + +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_without_preheader.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_without_preheader.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_without_preheader.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/hoist_without_preheader.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,123 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include + +#include + +#include "../pass_fixture.h" +#include "opt/licm_pass.h" + +namespace { + +using namespace spvtools; +using ::testing::UnorderedElementsAre; + +using PassClassTest = PassTest<::testing::Test>; + +/* + Tests that the LICM pass will generate a preheader when one is not present + + Generated from the following GLSL fragment shader +--eliminate-local-multi-store has also been run on the spv binary +#version 440 core +void main(){ + int a = 1; + int b = 2; + int hoist = 0; + for (int i = 0; i < 10; i++) { + if (i == 5) { + break; + } + } + for (int i = 0; i < 10; i++) { + hoist = a + b; + } +} +*/ +#ifdef SPIRV_EFFCEE +TEST_F(PassClassTest, HoistWithoutPreheader) { + const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 440 +OpName %main "main" +%void = OpTypeVoid +%4 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_1 = OpConstant %int 1 +%int_2 = OpConstant %int 2 +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%int_5 = OpConstant %int 5 +%main = OpFunction %void None %4 +%13 = OpLabel +OpBranch %14 +%14 = OpLabel +%15 = OpPhi %int %int_0 %13 %16 %17 +; CHECK: OpLoopMerge [[preheader:%\w+]] +OpLoopMerge %25 %17 None +OpBranch %19 +%19 = OpLabel +%20 = OpSLessThan %bool %15 %int_10 +OpBranchConditional %20 %21 %25 +%21 = OpLabel +%22 = OpIEqual %bool %15 %int_5 +OpSelectionMerge %23 None +OpBranchConditional %22 %24 %23 +%24 = OpLabel +OpBranch %25 +%23 = OpLabel +OpBranch %17 +%17 = OpLabel +%16 = OpIAdd %int %15 %int_1 +OpBranch %14 +; Check that we hoisted the code to the preheader +; CHECK: [[preheader]] = OpLabel +; CHECK-NEXT: OpPhi +; CHECK-NEXT: OpPhi +; CHECK-NEXT: OpIAdd +; CHECK-NEXT: OpBranch [[header:%\w+]] +; CHECK: [[header]] = OpLabel +; CHECK-NEXT: OpPhi +; CHECK-NEXT: OpPhi +; CHECK: OpLoopMerge +%25 = OpLabel +%26 = OpPhi %int %int_0 %24 %int_0 %19 %27 %28 +%29 = OpPhi %int %int_0 %24 %int_0 %19 %30 %28 +OpLoopMerge %31 %28 None +OpBranch %32 +%32 = OpLabel +%33 = OpSLessThan %bool %29 %int_10 +OpBranchConditional %33 %34 %31 +%34 = OpLabel +%27 = OpIAdd %int %int_1 %int_2 +OpBranch %28 +%28 = OpLabel +%30 = OpIAdd %int %29 %int_1 +OpBranch %25 +%31 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, false); +} +#endif + +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/loop_descriptions.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/loop_descriptions.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/loop_descriptions.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/loop_descriptions.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -200,7 +200,101 @@ ir::Loop* loop = ld[27]; EXPECT_EQ(loop->GetPreHeaderBlock(), nullptr); - EXPECT_NE(loop->GetOrCreatePreHeaderBlock(context.get()), nullptr); + EXPECT_NE(loop->GetOrCreatePreHeaderBlock(), nullptr); +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 330 core +in vec4 c; +void main() { + int i = 0; + bool cond = c[0] == 0; + for (; i < 10; i++) { + if (cond) { + return; + } + else { + return; + } + } + bool cond2 = i == 9; +} +*/ +TEST_F(PassClassTest, NoLoop) { + const std::string text = R"(; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 3 +; Bound: 47 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %16 + OpExecutionMode %4 OriginUpperLeft + OpSource GLSL 330 + OpName %4 "main" + OpName %16 "c" + OpDecorate %16 Location 0 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %10 = OpTypeBool + %11 = OpTypePointer Function %10 + %13 = OpTypeFloat 32 + %14 = OpTypeVector %13 4 + %15 = OpTypePointer Input %14 + %16 = OpVariable %15 Input + %17 = OpTypeInt 32 0 + %18 = OpConstant %17 0 + %19 = OpTypePointer Input %13 + %22 = OpConstant %13 0 + %30 = OpConstant %6 10 + %39 = OpConstant %6 1 + %46 = OpUndef %6 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %20 = OpAccessChain %19 %16 %18 + %21 = OpLoad %13 %20 + %23 = OpFOrdEqual %10 %21 %22 + OpBranch %24 + %24 = OpLabel + %45 = OpPhi %6 %9 %5 %40 %27 + OpLoopMerge %26 %27 None + OpBranch %28 + %28 = OpLabel + %31 = OpSLessThan %10 %45 %30 + OpBranchConditional %31 %25 %26 + %25 = OpLabel + OpSelectionMerge %34 None + OpBranchConditional %23 %33 %36 + %33 = OpLabel + OpReturn + %36 = OpLabel + OpReturn + %34 = OpLabel + OpBranch %27 + %27 = OpLabel + %40 = OpIAdd %6 %46 %39 + OpBranch %24 + %26 = OpLabel + OpReturn + OpFunctionEnd + )"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + const ir::Function* f = spvtest::GetFunction(module, 4); + ir::LoopDescriptor ld{f}; + + EXPECT_EQ(ld.NumLoops(), 0u); } } // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/nested_loops.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/nested_loops.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/nested_loops.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/nested_loops.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -725,7 +725,7 @@ { ir::Loop& loop = *ld[33]; EXPECT_EQ(loop.GetPreHeaderBlock(), nullptr); - EXPECT_NE(loop.GetOrCreatePreHeaderBlock(context.get()), nullptr); + EXPECT_NE(loop.GetOrCreatePreHeaderBlock(), nullptr); // Make sure the loop descriptor was properly updated. EXPECT_EQ(ld[loop.GetPreHeaderBlock()], ld[16]); { @@ -762,7 +762,7 @@ { ir::Loop& loop = *ld[41]; EXPECT_EQ(loop.GetPreHeaderBlock(), nullptr); - EXPECT_NE(loop.GetOrCreatePreHeaderBlock(context.get()), nullptr); + EXPECT_NE(loop.GetOrCreatePreHeaderBlock(), nullptr); EXPECT_EQ(ld[loop.GetPreHeaderBlock()], nullptr); EXPECT_EQ(cfg->preds(loop.GetPreHeaderBlock()->id()).size(), 1u); EXPECT_EQ(cfg->preds(loop.GetPreHeaderBlock()->id())[0], 25u); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/peeling.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/peeling.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/peeling.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/peeling.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,1075 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include + +#ifdef SPIRV_EFFCEE +#include "effcee/effcee.h" +#endif + +#include "../pass_fixture.h" +#include "opt/ir_builder.h" +#include "opt/loop_descriptor.h" +#include "opt/loop_peeling.h" + +namespace { + +using namespace spvtools; + +using PeelingTest = PassTest<::testing::Test>; + +bool Validate(const std::vector& bin) { + spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2; + spv_context spvContext = spvContextCreate(target_env); + spv_diagnostic diagnostic = nullptr; + spv_const_binary_t binary = {bin.data(), bin.size()}; + spv_result_t error = spvValidate(spvContext, &binary, &diagnostic); + if (error != 0) spvDiagnosticPrint(diagnostic); + spvDiagnosticDestroy(diagnostic); + spvContextDestroy(spvContext); + return error == 0; +} + +void Match(const std::string& checks, ir::IRContext* context) { + std::vector bin; + context->module()->ToBinary(&bin, true); + EXPECT_TRUE(Validate(bin)); +#ifdef SPIRV_EFFCEE + std::string assembly; + SpirvTools tools(SPV_ENV_UNIVERSAL_1_2); + EXPECT_TRUE( + tools.Disassemble(bin, &assembly, SPV_BINARY_TO_TEXT_OPTION_NO_HEADER)) + << "Disassembling failed for shader:\n" + << assembly << std::endl; + auto match_result = effcee::Match(assembly, checks); + EXPECT_EQ(effcee::Result::Status::Ok, match_result.status()) + << match_result.message() << "\nChecking result:\n" + << assembly; +#endif // ! SPIRV_EFFCEE +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +First test: +#version 330 core +void main() { + for(int i = 0; i < 10; ++i) { + if (i < 4) + break; + } +} + +Second test (with a common sub-expression elimination): +#version 330 core +void main() { + for(int i = 0; i + 1 < 10; ++i) { + } +} + +Third test: +#version 330 core +void main() { + int a[10]; + for (int i = 0; a[i] != 0; i++) {} +} + +Forth test: +#version 330 core +void main() { + for (long i = 0; i < 10; i++) {} +} + +Fifth test: +#version 330 core +void main() { + for (float i = 0; i < 10; i++) {} +} + +Sixth test: +#version 450 +layout(location = 0)out float o; +void main() { + o = 0.0; + for( int i = 0; true; i++ ) { + o += 1.0; + if (i > 10) break; + } +} +*/ +TEST_F(PeelingTest, CannotPeel) { + // Build the given SPIR-V program in |text|, take the first loop in the first + // function and test that it is not peelable. |loop_count_id| is the id + // representing the loop count, if equals to 0, then the function build a 10 + // constant as loop count. + auto test_cannot_peel = [](const std::string& text, uint32_t loop_count_id) { + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + ir::Function& f = *module->begin(); + ir::LoopDescriptor& ld = *context->GetLoopDescriptor(&f); + + EXPECT_EQ(ld.NumLoops(), 1u); + + ir::Instruction* loop_count = nullptr; + if (loop_count_id) { + loop_count = context->get_def_use_mgr()->GetDef(loop_count_id); + } else { + opt::InstructionBuilder builder(context.get(), &*f.begin()); + // Exit condition. + loop_count = builder.Add32BitSignedIntegerConstant(10); + } + + opt::LoopPeeling peel(context.get(), &*ld.begin(), loop_count); + EXPECT_FALSE(peel.CanPeelLoop()); + }; + { + SCOPED_TRACE("loop with break"); + + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginLowerLeft + OpSource GLSL 330 + OpName %main "main" + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %int_10 = OpConstant %int 10 + %bool = OpTypeBool + %int_4 = OpConstant %int 4 + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %3 + %5 = OpLabel + OpBranch %10 + %10 = OpLabel + %28 = OpPhi %int %int_0 %5 %27 %13 + OpLoopMerge %12 %13 None + OpBranch %14 + %14 = OpLabel + %18 = OpSLessThan %bool %28 %int_10 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + %21 = OpSLessThan %bool %28 %int_4 + OpSelectionMerge %23 None + OpBranchConditional %21 %22 %23 + %22 = OpLabel + OpBranch %12 + %23 = OpLabel + OpBranch %13 + %13 = OpLabel + %27 = OpIAdd %int %28 %int_1 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + test_cannot_peel(text, 0); + } + + { + SCOPED_TRACE("Ambiguous iterator update"); + + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginLowerLeft + OpSource GLSL 330 + OpName %main "main" + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %int_1 = OpConstant %int 1 + %int_10 = OpConstant %int 10 + %bool = OpTypeBool + %main = OpFunction %void None %3 + %5 = OpLabel + OpBranch %10 + %10 = OpLabel + %23 = OpPhi %int %int_0 %5 %17 %13 + OpLoopMerge %12 %13 None + OpBranch %14 + %14 = OpLabel + %17 = OpIAdd %int %23 %int_1 + %20 = OpSLessThan %bool %17 %int_10 + OpBranchConditional %20 %11 %12 + %11 = OpLabel + OpBranch %13 + %13 = OpLabel + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + + test_cannot_peel(text, 0); + } + + { + SCOPED_TRACE("No loop static bounds"); + + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginLowerLeft + OpSource GLSL 330 + OpName %main "main" + OpName %i "i" + OpName %a "a" + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %uint = OpTypeInt 32 0 + %uint_10 = OpConstant %uint 10 +%_arr_int_uint_10 = OpTypeArray %int %uint_10 +%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10 + %bool = OpTypeBool + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %3 + %5 = OpLabel + %i = OpVariable %_ptr_Function_int Function + %a = OpVariable %_ptr_Function__arr_int_uint_10 Function + OpStore %i %int_0 + OpBranch %10 + %10 = OpLabel + %28 = OpPhi %int %int_0 %5 %27 %13 + OpLoopMerge %12 %13 None + OpBranch %14 + %14 = OpLabel + %21 = OpAccessChain %_ptr_Function_int %a %28 + %22 = OpLoad %int %21 + %24 = OpINotEqual %bool %22 %int_0 + OpBranchConditional %24 %11 %12 + %11 = OpLabel + OpBranch %13 + %13 = OpLabel + %27 = OpIAdd %int %28 %int_1 + OpStore %i %27 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + + test_cannot_peel(text, 22); + } + { + SCOPED_TRACE("Int 64 type for conditions"); + + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginLowerLeft + OpSource GLSL 330 + OpName %2 "main" + OpName %4 "i" + %6 = OpTypeVoid + %3 = OpTypeFunction %6 + %7 = OpTypeInt 64 1 + %8 = OpTypePointer Function %7 + %9 = OpConstant %7 0 + %15 = OpConstant %7 10 + %16 = OpTypeBool + %17 = OpConstant %7 1 + %2 = OpFunction %6 None %3 + %5 = OpLabel + %4 = OpVariable %8 Function + OpStore %4 %9 + OpBranch %10 + %10 = OpLabel + %22 = OpPhi %7 %9 %5 %21 %13 + OpLoopMerge %12 %13 None + OpBranch %14 + %14 = OpLabel + %18 = OpSLessThan %16 %22 %15 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + OpBranch %13 + %13 = OpLabel + %21 = OpIAdd %7 %22 %17 + OpStore %4 %21 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + // %15 is a constant for a 64 int. Currently rejected. + test_cannot_peel(text, 15); + } + { + SCOPED_TRACE("Float type for conditions"); + + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginLowerLeft + OpSource GLSL 330 + OpName %2 "main" + OpName %4 "i" + %6 = OpTypeVoid + %3 = OpTypeFunction %6 + %7 = OpTypeFloat 32 + %8 = OpTypePointer Function %7 + %9 = OpConstant %7 0 + %15 = OpConstant %7 10 + %16 = OpTypeBool + %17 = OpConstant %7 1 + %2 = OpFunction %6 None %3 + %5 = OpLabel + %4 = OpVariable %8 Function + OpStore %4 %9 + OpBranch %10 + %10 = OpLabel + %22 = OpPhi %7 %9 %5 %21 %13 + OpLoopMerge %12 %13 None + OpBranch %14 + %14 = OpLabel + %18 = OpFOrdLessThan %16 %22 %15 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + OpBranch %13 + %13 = OpLabel + %21 = OpFAdd %7 %22 %17 + OpStore %4 %21 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + // %15 is a constant for a float. Currently rejected. + test_cannot_peel(text, 15); + } + { + SCOPED_TRACE("Side effect before exit"); + + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %o + OpExecutionMode %main OriginLowerLeft + OpSource GLSL 450 + OpName %main "main" + OpName %o "o" + OpName %i "i" + OpDecorate %o Location 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 +%_ptr_Output_float = OpTypePointer Output %float + %o = OpVariable %_ptr_Output_float Output + %float_0 = OpConstant %float 0 + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %bool = OpTypeBool + %true = OpConstantTrue %bool + %float_1 = OpConstant %float 1 + %int_10 = OpConstant %int 10 + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %3 + %5 = OpLabel + %i = OpVariable %_ptr_Function_int Function + OpStore %o %float_0 + OpStore %i %int_0 + OpBranch %14 + %14 = OpLabel + %33 = OpPhi %int %int_0 %5 %32 %17 + OpLoopMerge %16 %17 None + OpBranch %15 + %15 = OpLabel + %22 = OpLoad %float %o + %23 = OpFAdd %float %22 %float_1 + OpStore %o %23 + %26 = OpSGreaterThan %bool %33 %int_10 + OpSelectionMerge %28 None + OpBranchConditional %26 %27 %28 + %27 = OpLabel + OpBranch %16 + %28 = OpLabel + OpBranch %17 + %17 = OpLabel + %32 = OpIAdd %int %33 %int_1 + OpStore %i %32 + OpBranch %14 + %16 = OpLabel + OpReturn + OpFunctionEnd + )"; + test_cannot_peel(text, 0); + } +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 330 core +void main() { + int i = 0; + for (; i < 10; i++) {} +} +*/ +TEST_F(PeelingTest, SimplePeeling) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginLowerLeft + OpSource GLSL 330 + OpName %main "main" + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %int_10 = OpConstant %int 10 + %bool = OpTypeBool + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %3 + %5 = OpLabel + OpBranch %10 + %10 = OpLabel + %22 = OpPhi %int %int_0 %5 %21 %13 + OpLoopMerge %12 %13 None + OpBranch %14 + %14 = OpLabel + %18 = OpSLessThan %bool %22 %int_10 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + OpBranch %13 + %13 = OpLabel + %21 = OpIAdd %int %22 %int_1 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + + // Peel before. + { + SCOPED_TRACE("Peel before"); + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + ir::Function& f = *module->begin(); + ir::LoopDescriptor& ld = *context->GetLoopDescriptor(&f); + + EXPECT_EQ(ld.NumLoops(), 1u); + + opt::InstructionBuilder builder(context.get(), &*f.begin()); + // Exit condition. + ir::Instruction* ten_cst = builder.Add32BitSignedIntegerConstant(10); + + opt::LoopPeeling peel(context.get(), &*ld.begin(), ten_cst); + EXPECT_TRUE(peel.CanPeelLoop()); + peel.PeelBefore(2); + + const std::string check = R"( +CHECK: [[CST_TEN:%\w+]] = OpConstant {{%\w+}} 10 +CHECK: [[CST_TWO:%\w+]] = OpConstant {{%\w+}} 2 +CHECK: OpFunction +CHECK-NEXT: [[ENTRY:%\w+]] = OpLabel +CHECK: [[MIN_LOOP_COUNT:%\w+]] = OpSLessThan {{%\w+}} [[CST_TWO]] [[CST_TEN]] +CHECK-NEXT: [[LOOP_COUNT:%\w+]] = OpSelect {{%\w+}} [[MIN_LOOP_COUNT]] [[CST_TWO]] [[CST_TEN]] +CHECK: [[BEFORE_LOOP:%\w+]] = OpLabel +CHECK-NEXT: [[DUMMY_IT:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[DUMMY_IT_1:%\w+]] [[BE:%\w+]] +CHECK-NEXT: [[i:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[I_1:%\w+]] [[BE]] +CHECK-NEXT: OpLoopMerge [[AFTER_LOOP_PREHEADER:%\w+]] [[BE]] None +CHECK: [[COND_BLOCK:%\w+]] = OpLabel +CHECK-NEXT: OpSLessThan +CHECK-NEXT: [[EXIT_COND:%\w+]] = OpSLessThan {{%\w+}} [[DUMMY_IT]] +CHECK-NEXT: OpBranchConditional [[EXIT_COND]] {{%\w+}} [[AFTER_LOOP_PREHEADER]] +CHECK: [[I_1]] = OpIAdd {{%\w+}} [[i]] +CHECK-NEXT: [[DUMMY_IT_1]] = OpIAdd {{%\w+}} [[DUMMY_IT]] +CHECK-NEXT: OpBranch [[BEFORE_LOOP]] + +CHECK: [[AFTER_LOOP_PREHEADER]] = OpLabel +CHECK-NEXT: OpSelectionMerge [[IF_MERGE:%\w+]] +CHECK-NEXT: OpBranchConditional [[MIN_LOOP_COUNT]] [[AFTER_LOOP:%\w+]] [[IF_MERGE]] + +CHECK: [[AFTER_LOOP]] = OpLabel +CHECK-NEXT: OpPhi {{%\w+}} {{%\w+}} {{%\w+}} [[i]] [[AFTER_LOOP_PREHEADER]] +CHECK-NEXT: OpLoopMerge +)"; + + Match(check, context.get()); + } + + // Peel after. + { + SCOPED_TRACE("Peel after"); + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + ir::Function& f = *module->begin(); + ir::LoopDescriptor& ld = *context->GetLoopDescriptor(&f); + + EXPECT_EQ(ld.NumLoops(), 1u); + + opt::InstructionBuilder builder(context.get(), &*f.begin()); + // Exit condition. + ir::Instruction* ten_cst = builder.Add32BitSignedIntegerConstant(10); + + opt::LoopPeeling peel(context.get(), &*ld.begin(), ten_cst); + EXPECT_TRUE(peel.CanPeelLoop()); + peel.PeelAfter(2); + + const std::string check = R"( +CHECK: OpFunction +CHECK-NEXT: [[ENTRY:%\w+]] = OpLabel +CHECK: [[MIN_LOOP_COUNT:%\w+]] = OpSLessThan {{%\w+}} +CHECK-NEXT: OpSelectionMerge [[IF_MERGE:%\w+]] +CHECK-NEXT: OpBranchConditional [[MIN_LOOP_COUNT]] [[BEFORE_LOOP:%\w+]] [[IF_MERGE]] +CHECK: [[BEFORE_LOOP]] = OpLabel +CHECK-NEXT: [[DUMMY_IT:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[DUMMY_IT_1:%\w+]] [[BE:%\w+]] +CHECK-NEXT: [[I:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[I_1:%\w+]] [[BE]] +CHECK-NEXT: OpLoopMerge [[BEFORE_LOOP_MERGE:%\w+]] [[BE]] None +CHECK: [[COND_BLOCK:%\w+]] = OpLabel +CHECK-NEXT: OpSLessThan +CHECK-NEXT: [[TMP:%\w+]] = OpIAdd {{%\w+}} [[DUMMY_IT]] {{%\w+}} +CHECK-NEXT: [[EXIT_COND:%\w+]] = OpSLessThan {{%\w+}} [[TMP]] +CHECK-NEXT: OpBranchConditional [[EXIT_COND]] {{%\w+}} [[BEFORE_LOOP_MERGE]] +CHECK: [[I_1]] = OpIAdd {{%\w+}} [[I]] +CHECK-NEXT: [[DUMMY_IT_1]] = OpIAdd {{%\w+}} [[DUMMY_IT]] +CHECK-NEXT: OpBranch [[BEFORE_LOOP]] + +CHECK: [[IF_MERGE]] = OpLabel +CHECK-NEXT: [[TMP:%\w+]] = OpPhi {{%\w+}} [[I]] [[BEFORE_LOOP_MERGE]] +CHECK-NEXT: OpBranch [[AFTER_LOOP:%\w+]] + +CHECK: [[AFTER_LOOP]] = OpLabel +CHECK-NEXT: OpPhi {{%\w+}} {{%\w+}} {{%\w+}} [[TMP]] [[IF_MERGE]] +CHECK-NEXT: OpLoopMerge + +)"; + + Match(check, context.get()); + } +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 330 core +void main() { + int a[10]; + int n = a[0]; + for(int i = 0; i < n; ++i) {} +} +*/ +TEST_F(PeelingTest, PeelingUncountable) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginLowerLeft + OpSource GLSL 330 + OpName %main "main" + OpName %a "a" + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_10 = OpConstant %uint 10 +%_arr_int_uint_10 = OpTypeArray %int %uint_10 +%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10 + %int_0 = OpConstant %int 0 + %bool = OpTypeBool + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %3 + %5 = OpLabel + %a = OpVariable %_ptr_Function__arr_int_uint_10 Function + %15 = OpAccessChain %_ptr_Function_int %a %int_0 + %16 = OpLoad %int %15 + OpBranch %18 + %18 = OpLabel + %30 = OpPhi %int %int_0 %5 %29 %21 + OpLoopMerge %20 %21 None + OpBranch %22 + %22 = OpLabel + %26 = OpSLessThan %bool %30 %16 + OpBranchConditional %26 %19 %20 + %19 = OpLabel + OpBranch %21 + %21 = OpLabel + %29 = OpIAdd %int %30 %int_1 + OpBranch %18 + %20 = OpLabel + OpReturn + OpFunctionEnd + )"; + + // Peel before. + { + SCOPED_TRACE("Peel before"); + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + ir::Function& f = *module->begin(); + ir::LoopDescriptor& ld = *context->GetLoopDescriptor(&f); + + EXPECT_EQ(ld.NumLoops(), 1u); + + ir::Instruction* loop_count = context->get_def_use_mgr()->GetDef(16); + EXPECT_EQ(loop_count->opcode(), SpvOpLoad); + + opt::LoopPeeling peel(context.get(), &*ld.begin(), loop_count); + EXPECT_TRUE(peel.CanPeelLoop()); + peel.PeelBefore(1); + + const std::string check = R"( +CHECK: OpFunction +CHECK-NEXT: [[ENTRY:%\w+]] = OpLabel +CHECK: [[LOOP_COUNT:%\w+]] = OpLoad +CHECK: [[MIN_LOOP_COUNT:%\w+]] = OpSLessThan {{%\w+}} {{%\w+}} [[LOOP_COUNT]] +CHECK-NEXT: [[LOOP_COUNT:%\w+]] = OpSelect {{%\w+}} [[MIN_LOOP_COUNT]] {{%\w+}} [[LOOP_COUNT]] +CHECK: [[BEFORE_LOOP:%\w+]] = OpLabel +CHECK-NEXT: [[DUMMY_IT:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[DUMMY_IT_1:%\w+]] [[BE:%\w+]] +CHECK-NEXT: [[i:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[I_1:%\w+]] [[BE]] +CHECK-NEXT: OpLoopMerge [[AFTER_LOOP_PREHEADER:%\w+]] [[BE]] None +CHECK: [[COND_BLOCK:%\w+]] = OpLabel +CHECK-NEXT: OpSLessThan +CHECK-NEXT: [[EXIT_COND:%\w+]] = OpSLessThan {{%\w+}} [[DUMMY_IT]] +CHECK-NEXT: OpBranchConditional [[EXIT_COND]] {{%\w+}} [[AFTER_LOOP_PREHEADER]] +CHECK: [[I_1]] = OpIAdd {{%\w+}} [[i]] +CHECK-NEXT: [[DUMMY_IT_1]] = OpIAdd {{%\w+}} [[DUMMY_IT]] +CHECK-NEXT: OpBranch [[BEFORE_LOOP]] + +CHECK: [[AFTER_LOOP_PREHEADER]] = OpLabel +CHECK-NEXT: OpSelectionMerge [[IF_MERGE:%\w+]] +CHECK-NEXT: OpBranchConditional [[MIN_LOOP_COUNT]] [[AFTER_LOOP:%\w+]] [[IF_MERGE]] + +CHECK: [[AFTER_LOOP]] = OpLabel +CHECK-NEXT: OpPhi {{%\w+}} {{%\w+}} {{%\w+}} [[i]] [[AFTER_LOOP_PREHEADER]] +CHECK-NEXT: OpLoopMerge +)"; + + Match(check, context.get()); + } + + // Peel after. + { + SCOPED_TRACE("Peel after"); + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + ir::Function& f = *module->begin(); + ir::LoopDescriptor& ld = *context->GetLoopDescriptor(&f); + + EXPECT_EQ(ld.NumLoops(), 1u); + + ir::Instruction* loop_count = context->get_def_use_mgr()->GetDef(16); + EXPECT_EQ(loop_count->opcode(), SpvOpLoad); + + opt::LoopPeeling peel(context.get(), &*ld.begin(), loop_count); + EXPECT_TRUE(peel.CanPeelLoop()); + peel.PeelAfter(1); + + const std::string check = R"( +CHECK: OpFunction +CHECK-NEXT: [[ENTRY:%\w+]] = OpLabel +CHECK: [[MIN_LOOP_COUNT:%\w+]] = OpSLessThan {{%\w+}} +CHECK-NEXT: OpSelectionMerge [[IF_MERGE:%\w+]] +CHECK-NEXT: OpBranchConditional [[MIN_LOOP_COUNT]] [[BEFORE_LOOP:%\w+]] [[IF_MERGE]] +CHECK: [[BEFORE_LOOP]] = OpLabel +CHECK-NEXT: [[DUMMY_IT:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[DUMMY_IT_1:%\w+]] [[BE:%\w+]] +CHECK-NEXT: [[I:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[I_1:%\w+]] [[BE]] +CHECK-NEXT: OpLoopMerge [[BEFORE_LOOP_MERGE:%\w+]] [[BE]] None +CHECK: [[COND_BLOCK:%\w+]] = OpLabel +CHECK-NEXT: OpSLessThan +CHECK-NEXT: [[TMP:%\w+]] = OpIAdd {{%\w+}} [[DUMMY_IT]] {{%\w+}} +CHECK-NEXT: [[EXIT_COND:%\w+]] = OpSLessThan {{%\w+}} [[TMP]] +CHECK-NEXT: OpBranchConditional [[EXIT_COND]] {{%\w+}} [[BEFORE_LOOP_MERGE]] +CHECK: [[I_1]] = OpIAdd {{%\w+}} [[I]] +CHECK-NEXT: [[DUMMY_IT_1]] = OpIAdd {{%\w+}} [[DUMMY_IT]] +CHECK-NEXT: OpBranch [[BEFORE_LOOP]] + +CHECK: [[IF_MERGE]] = OpLabel +CHECK-NEXT: [[TMP:%\w+]] = OpPhi {{%\w+}} [[I]] [[BEFORE_LOOP_MERGE]] +CHECK-NEXT: OpBranch [[AFTER_LOOP:%\w+]] + +CHECK: [[AFTER_LOOP]] = OpLabel +CHECK-NEXT: OpPhi {{%\w+}} {{%\w+}} {{%\w+}} [[TMP]] [[IF_MERGE]] +CHECK-NEXT: OpLoopMerge + +)"; + + Match(check, context.get()); + } +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 330 core +void main() { + int i = 0; + do { + i++; + } while (i < 10); +} +*/ +TEST_F(PeelingTest, DoWhilePeeling) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginLowerLeft + OpSource GLSL 330 + OpName %main "main" + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %int_1 = OpConstant %int 1 + %int_10 = OpConstant %int 10 + %bool = OpTypeBool + %main = OpFunction %void None %3 + %5 = OpLabel + OpBranch %10 + %10 = OpLabel + %21 = OpPhi %int %int_0 %5 %16 %13 + OpLoopMerge %12 %13 None + OpBranch %11 + %11 = OpLabel + %16 = OpIAdd %int %21 %int_1 + OpBranch %13 + %13 = OpLabel + %20 = OpSLessThan %bool %16 %int_10 + OpBranchConditional %20 %10 %12 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + + // Peel before. + { + SCOPED_TRACE("Peel before"); + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + ir::Function& f = *module->begin(); + ir::LoopDescriptor& ld = *context->GetLoopDescriptor(&f); + + EXPECT_EQ(ld.NumLoops(), 1u); + opt::InstructionBuilder builder(context.get(), &*f.begin()); + // Exit condition. + ir::Instruction* ten_cst = builder.Add32BitUnsignedIntegerConstant(10); + + opt::LoopPeeling peel(context.get(), &*ld.begin(), ten_cst); + EXPECT_TRUE(peel.CanPeelLoop()); + peel.PeelBefore(2); + + const std::string check = R"( +CHECK: OpFunction +CHECK-NEXT: [[ENTRY:%\w+]] = OpLabel +CHECK: [[MIN_LOOP_COUNT:%\w+]] = OpULessThan {{%\w+}} +CHECK-NEXT: [[LOOP_COUNT:%\w+]] = OpSelect {{%\w+}} [[MIN_LOOP_COUNT]] +CHECK: [[BEFORE_LOOP:%\w+]] = OpLabel +CHECK-NEXT: [[DUMMY_IT:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[DUMMY_IT_1:%\w+]] [[BE:%\w+]] +CHECK-NEXT: [[i:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[I_1:%\w+]] [[BE]] +CHECK-NEXT: OpLoopMerge [[AFTER_LOOP_PREHEADER:%\w+]] [[BE]] None +CHECK: [[I_1]] = OpIAdd {{%\w+}} [[i]] +CHECK: [[BE]] = OpLabel +CHECK: [[DUMMY_IT_1]] = OpIAdd {{%\w+}} [[DUMMY_IT]] +CHECK-NEXT: [[EXIT_COND:%\w+]] = OpULessThan {{%\w+}} [[DUMMY_IT_1]] +CHECK-NEXT: OpBranchConditional [[EXIT_COND]] [[BEFORE_LOOP]] [[AFTER_LOOP_PREHEADER]] + +CHECK: [[AFTER_LOOP_PREHEADER]] = OpLabel +CHECK-NEXT: OpSelectionMerge [[IF_MERGE:%\w+]] +CHECK-NEXT: OpBranchConditional [[MIN_LOOP_COUNT]] [[AFTER_LOOP:%\w+]] [[IF_MERGE]] + +CHECK: [[AFTER_LOOP]] = OpLabel +CHECK-NEXT: OpPhi {{%\w+}} {{%\w+}} {{%\w+}} [[I_1]] [[AFTER_LOOP_PREHEADER]] +CHECK-NEXT: OpLoopMerge +)"; + + Match(check, context.get()); + } + + // Peel after. + { + SCOPED_TRACE("Peel after"); + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + ir::Function& f = *module->begin(); + ir::LoopDescriptor& ld = *context->GetLoopDescriptor(&f); + + EXPECT_EQ(ld.NumLoops(), 1u); + + opt::InstructionBuilder builder(context.get(), &*f.begin()); + // Exit condition. + ir::Instruction* ten_cst = builder.Add32BitUnsignedIntegerConstant(10); + + opt::LoopPeeling peel(context.get(), &*ld.begin(), ten_cst); + EXPECT_TRUE(peel.CanPeelLoop()); + peel.PeelAfter(2); + + const std::string check = R"( +CHECK: OpFunction +CHECK-NEXT: [[ENTRY:%\w+]] = OpLabel +CHECK: [[MIN_LOOP_COUNT:%\w+]] = OpULessThan {{%\w+}} +CHECK-NEXT: OpSelectionMerge [[IF_MERGE:%\w+]] +CHECK-NEXT: OpBranchConditional [[MIN_LOOP_COUNT]] [[BEFORE_LOOP:%\w+]] [[IF_MERGE]] +CHECK: [[BEFORE_LOOP]] = OpLabel +CHECK-NEXT: [[DUMMY_IT:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[DUMMY_IT_1:%\w+]] [[BE:%\w+]] +CHECK-NEXT: [[I:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[I_1:%\w+]] [[BE]] +CHECK-NEXT: OpLoopMerge [[BEFORE_LOOP_MERGE:%\w+]] [[BE]] None +CHECK: [[I_1]] = OpIAdd {{%\w+}} [[I]] +CHECK: [[BE]] = OpLabel +CHECK: [[DUMMY_IT_1]] = OpIAdd {{%\w+}} [[DUMMY_IT]] +CHECK-NEXT: [[EXIT_VAL:%\w+]] = OpIAdd {{%\w+}} [[DUMMY_IT_1]] +CHECK-NEXT: [[EXIT_COND:%\w+]] = OpULessThan {{%\w+}} [[EXIT_VAL]] +CHECK-NEXT: OpBranchConditional [[EXIT_COND]] [[BEFORE_LOOP]] [[BEFORE_LOOP_MERGE]] + +CHECK: [[IF_MERGE]] = OpLabel +CHECK-NEXT: [[TMP:%\w+]] = OpPhi {{%\w+}} [[I_1]] [[BEFORE_LOOP_MERGE]] +CHECK-NEXT: OpBranch [[AFTER_LOOP:%\w+]] + +CHECK: [[AFTER_LOOP]] = OpLabel +CHECK-NEXT: OpPhi {{%\w+}} {{%\w+}} {{%\w+}} [[TMP]] [[IF_MERGE]] +CHECK-NEXT: OpLoopMerge +)"; + + Match(check, context.get()); + } +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 330 core +void main() { + int a[10]; + int n = a[0]; + for(int i = 0; i < n; ++i) {} +} +*/ +TEST_F(PeelingTest, PeelingLoopWithStore) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %o %n + OpExecutionMode %main OriginLowerLeft + OpSource GLSL 450 + OpName %main "main" + OpName %o "o" + OpName %end "end" + OpName %n "n" + OpName %i "i" + OpDecorate %o Location 0 + OpDecorate %n Flat + OpDecorate %n Location 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 +%_ptr_Output_float = OpTypePointer Output %float + %o = OpVariable %_ptr_Output_float Output + %float_0 = OpConstant %float 0 + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%_ptr_Input_int = OpTypePointer Input %int + %n = OpVariable %_ptr_Input_int Input + %int_0 = OpConstant %int 0 + %bool = OpTypeBool + %float_1 = OpConstant %float 1 + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %3 + %5 = OpLabel + %end = OpVariable %_ptr_Function_int Function + %i = OpVariable %_ptr_Function_int Function + OpStore %o %float_0 + %15 = OpLoad %int %n + OpStore %end %15 + OpStore %i %int_0 + OpBranch %18 + %18 = OpLabel + %33 = OpPhi %int %int_0 %5 %32 %21 + OpLoopMerge %20 %21 None + OpBranch %22 + %22 = OpLabel + %26 = OpSLessThan %bool %33 %15 + OpBranchConditional %26 %19 %20 + %19 = OpLabel + %28 = OpLoad %float %o + %29 = OpFAdd %float %28 %float_1 + OpStore %o %29 + OpBranch %21 + %21 = OpLabel + %32 = OpIAdd %int %33 %int_1 + OpStore %i %32 + OpBranch %18 + %20 = OpLabel + OpReturn + OpFunctionEnd + )"; + + // Peel before. + { + SCOPED_TRACE("Peel before"); + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + ir::Function& f = *module->begin(); + ir::LoopDescriptor& ld = *context->GetLoopDescriptor(&f); + + EXPECT_EQ(ld.NumLoops(), 1u); + + ir::Instruction* loop_count = context->get_def_use_mgr()->GetDef(15); + EXPECT_EQ(loop_count->opcode(), SpvOpLoad); + + opt::LoopPeeling peel(context.get(), &*ld.begin(), loop_count); + EXPECT_TRUE(peel.CanPeelLoop()); + peel.PeelBefore(1); + + const std::string check = R"( +CHECK: OpFunction +CHECK-NEXT: [[ENTRY:%\w+]] = OpLabel +CHECK: [[LOOP_COUNT:%\w+]] = OpLoad +CHECK: [[MIN_LOOP_COUNT:%\w+]] = OpSLessThan {{%\w+}} {{%\w+}} [[LOOP_COUNT]] +CHECK-NEXT: [[LOOP_COUNT:%\w+]] = OpSelect {{%\w+}} [[MIN_LOOP_COUNT]] {{%\w+}} [[LOOP_COUNT]] +CHECK: [[BEFORE_LOOP:%\w+]] = OpLabel +CHECK-NEXT: [[DUMMY_IT:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[DUMMY_IT_1:%\w+]] [[BE:%\w+]] +CHECK-NEXT: [[i:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[I_1:%\w+]] [[BE]] +CHECK-NEXT: OpLoopMerge [[AFTER_LOOP_PREHEADER:%\w+]] [[BE]] None +CHECK: [[COND_BLOCK:%\w+]] = OpLabel +CHECK-NEXT: OpSLessThan +CHECK-NEXT: [[EXIT_COND:%\w+]] = OpSLessThan {{%\w+}} [[DUMMY_IT]] +CHECK-NEXT: OpBranchConditional [[EXIT_COND]] {{%\w+}} [[AFTER_LOOP_PREHEADER]] +CHECK: [[I_1]] = OpIAdd {{%\w+}} [[i]] +CHECK: [[DUMMY_IT_1]] = OpIAdd {{%\w+}} [[DUMMY_IT]] +CHECK-NEXT: OpBranch [[BEFORE_LOOP]] + +CHECK: [[AFTER_LOOP_PREHEADER]] = OpLabel +CHECK-NEXT: OpSelectionMerge [[IF_MERGE:%\w+]] +CHECK-NEXT: OpBranchConditional [[MIN_LOOP_COUNT]] [[AFTER_LOOP:%\w+]] [[IF_MERGE]] + +CHECK: [[AFTER_LOOP]] = OpLabel +CHECK-NEXT: OpPhi {{%\w+}} {{%\w+}} {{%\w+}} [[i]] [[AFTER_LOOP_PREHEADER]] +CHECK-NEXT: OpLoopMerge +)"; + + Match(check, context.get()); + } + + // Peel after. + { + SCOPED_TRACE("Peel after"); + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + ir::Function& f = *module->begin(); + ir::LoopDescriptor& ld = *context->GetLoopDescriptor(&f); + + EXPECT_EQ(ld.NumLoops(), 1u); + + ir::Instruction* loop_count = context->get_def_use_mgr()->GetDef(15); + EXPECT_EQ(loop_count->opcode(), SpvOpLoad); + + opt::LoopPeeling peel(context.get(), &*ld.begin(), loop_count); + EXPECT_TRUE(peel.CanPeelLoop()); + peel.PeelAfter(1); + + const std::string check = R"( +CHECK: OpFunction +CHECK-NEXT: [[ENTRY:%\w+]] = OpLabel +CHECK: [[MIN_LOOP_COUNT:%\w+]] = OpSLessThan {{%\w+}} +CHECK-NEXT: OpSelectionMerge [[IF_MERGE:%\w+]] +CHECK-NEXT: OpBranchConditional [[MIN_LOOP_COUNT]] [[BEFORE_LOOP:%\w+]] [[IF_MERGE]] +CHECK: [[BEFORE_LOOP]] = OpLabel +CHECK-NEXT: [[DUMMY_IT:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[DUMMY_IT_1:%\w+]] [[BE:%\w+]] +CHECK-NEXT: [[I:%\w+]] = OpPhi {{%\w+}} {{%\w+}} [[ENTRY]] [[I_1:%\w+]] [[BE]] +CHECK-NEXT: OpLoopMerge [[BEFORE_LOOP_MERGE:%\w+]] [[BE]] None +CHECK: [[COND_BLOCK:%\w+]] = OpLabel +CHECK-NEXT: OpSLessThan +CHECK-NEXT: [[TMP:%\w+]] = OpIAdd {{%\w+}} [[DUMMY_IT]] {{%\w+}} +CHECK-NEXT: [[EXIT_COND:%\w+]] = OpSLessThan {{%\w+}} [[TMP]] +CHECK-NEXT: OpBranchConditional [[EXIT_COND]] {{%\w+}} [[BEFORE_LOOP_MERGE]] +CHECK: [[I_1]] = OpIAdd {{%\w+}} [[I]] +CHECK: [[DUMMY_IT_1]] = OpIAdd {{%\w+}} [[DUMMY_IT]] +CHECK-NEXT: OpBranch [[BEFORE_LOOP]] + +CHECK: [[IF_MERGE]] = OpLabel +CHECK-NEXT: [[TMP:%\w+]] = OpPhi {{%\w+}} [[I]] [[BEFORE_LOOP_MERGE]] +CHECK-NEXT: OpBranch [[AFTER_LOOP:%\w+]] + +CHECK: [[AFTER_LOOP]] = OpLabel +CHECK-NEXT: OpPhi {{%\w+}} {{%\w+}} {{%\w+}} [[TMP]] [[IF_MERGE]] +CHECK-NEXT: OpLoopMerge + +)"; + + Match(check, context.get()); + } +} + +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/unroll_assumptions.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/unroll_assumptions.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/unroll_assumptions.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/unroll_assumptions.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,1446 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include +#include + +#include + +#include "../assembly_builder.h" +#include "../function_utils.h" +#include "../pass_fixture.h" +#include "../pass_utils.h" +#include "opt/loop_unroller.h" +#include "opt/loop_utils.h" +#include "opt/pass.h" + +namespace { + +using namespace spvtools; +using ::testing::UnorderedElementsAre; + +template +class PartialUnrollerTestPass : public opt::Pass { + public: + PartialUnrollerTestPass() : Pass() {} + + const char* name() const override { return "Loop unroller"; } + + Status Process(ir::IRContext* context) override { + bool changed = false; + for (ir::Function& f : *context->module()) { + ir::LoopDescriptor& loop_descriptor = *context->GetLoopDescriptor(&f); + for (auto& loop : loop_descriptor) { + opt::LoopUtils loop_utils{context, &loop}; + if (loop_utils.PartiallyUnroll(factor)) { + changed = true; + } + } + } + + if (changed) return Pass::Status::SuccessWithChange; + return Pass::Status::SuccessWithoutChange; + } +}; + +using PassClassTest = PassTest<::testing::Test>; + +/* +Generated from the following GLSL +#version 410 core +layout(location = 0) flat in int in_upper_bound; +void main() { + for (int i = 0; i < in_upper_bound; ++i) { + x[i] = 1.0f; + } +} +*/ +TEST_F(PassClassTest, CheckUpperBound) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" %3 +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %3 "in_upper_bound" +OpName %4 "x" +OpDecorate %3 Flat +OpDecorate %3 Location 0 +%5 = OpTypeVoid +%6 = OpTypeFunction %5 +%7 = OpTypeInt 32 1 +%8 = OpTypePointer Function %7 +%9 = OpConstant %7 0 +%10 = OpTypePointer Input %7 +%3 = OpVariable %10 Input +%11 = OpTypeBool +%12 = OpTypeFloat 32 +%13 = OpTypeInt 32 0 +%14 = OpConstant %13 10 +%15 = OpTypeArray %12 %14 +%16 = OpTypePointer Function %15 +%17 = OpConstant %12 1 +%18 = OpTypePointer Function %12 +%19 = OpConstant %7 1 +%2 = OpFunction %5 None %6 +%20 = OpLabel +%4 = OpVariable %16 Function +OpBranch %21 +%21 = OpLabel +%22 = OpPhi %7 %9 %20 %23 %24 +OpLoopMerge %25 %24 Unroll +OpBranch %26 +%26 = OpLabel +%27 = OpLoad %7 %3 +%28 = OpSLessThan %11 %22 %27 +OpBranchConditional %28 %29 %25 +%29 = OpLabel +%30 = OpAccessChain %18 %4 %22 +OpStore %30 %17 +OpBranch %24 +%24 = OpLabel +%23 = OpIAdd %7 %22 %19 +OpBranch %21 +%25 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + // Make sure the pass doesn't run + SinglePassRunAndCheck(text, text, false); + SinglePassRunAndCheck>(text, text, false); + SinglePassRunAndCheck>(text, text, false); +} + +/* +Generated from the following GLSL +#version 410 core +void main() { + float out_array[10]; + for (uint i = 0; i < 2; i++) { + for (float x = 0; x < 5; ++x) { + out_array[x + i*5] = i; + } + } +} +*/ +TEST_F(PassClassTest, UnrollNestedLoopsInvalid) { + // clang-format off + // With opt::LocalMultiStoreElimPass +const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %3 "out_array" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 0 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 0 +%9 = OpConstant %6 2 +%10 = OpTypeBool +%11 = OpTypeInt 32 1 +%12 = OpTypePointer Function %11 +%13 = OpConstant %11 0 +%14 = OpConstant %11 5 +%15 = OpTypeFloat 32 +%16 = OpConstant %6 10 +%17 = OpTypeArray %15 %16 +%18 = OpTypePointer Function %17 +%19 = OpConstant %6 5 +%20 = OpTypePointer Function %15 +%21 = OpConstant %11 1 +%22 = OpUndef %11 +%2 = OpFunction %4 None %5 +%23 = OpLabel +%3 = OpVariable %18 Function +OpBranch %24 +%24 = OpLabel +%25 = OpPhi %6 %8 %23 %26 %27 +%28 = OpPhi %11 %22 %23 %29 %27 +OpLoopMerge %30 %27 Unroll +OpBranch %31 +%31 = OpLabel +%32 = OpULessThan %10 %25 %9 +OpBranchConditional %32 %33 %30 +%33 = OpLabel +OpBranch %34 +%34 = OpLabel +%29 = OpPhi %11 %13 %33 %35 %36 +OpLoopMerge %37 %36 None +OpBranch %38 +%38 = OpLabel +%39 = OpSLessThan %10 %29 %14 +OpBranchConditional %39 %40 %37 +%40 = OpLabel +%41 = OpBitcast %6 %29 +%42 = OpIMul %6 %25 %19 +%43 = OpIAdd %6 %41 %42 +%44 = OpConvertUToF %15 %25 +%45 = OpAccessChain %20 %3 %43 +OpStore %45 %44 +OpBranch %36 +%36 = OpLabel +%35 = OpIAdd %11 %29 %21 +OpBranch %34 +%37 = OpLabel +OpBranch %27 +%27 = OpLabel +%26 = OpIAdd %6 %25 %21 +OpBranch %24 +%30 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(text, text, false); +} + +/* +Generated from the following GLSL +#version 440 core +void main(){ + float x[10]; + for (int i = 0; i < 10; i++) { + if (i == 5) { + break; + } + x[i] = i; + } +} +*/ +TEST_F(PassClassTest, BreakInBody) { + // clang-format off + // With opt::LocalMultiStoreElimPass +const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 440 +OpName %2 "main" +OpName %3 "x" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 0 +%9 = OpConstant %6 10 +%10 = OpTypeBool +%11 = OpConstant %6 5 +%12 = OpTypeFloat 32 +%13 = OpTypeInt 32 0 +%14 = OpConstant %13 10 +%15 = OpTypeArray %12 %14 +%16 = OpTypePointer Function %15 +%17 = OpTypePointer Function %12 +%18 = OpConstant %6 1 +%2 = OpFunction %4 None %5 +%19 = OpLabel +%3 = OpVariable %16 Function +OpBranch %20 +%20 = OpLabel +%21 = OpPhi %6 %8 %19 %22 %23 +OpLoopMerge %24 %23 Unroll +OpBranch %25 +%25 = OpLabel +%26 = OpSLessThan %10 %21 %9 +OpBranchConditional %26 %27 %24 +%27 = OpLabel +%28 = OpIEqual %10 %21 %11 +OpSelectionMerge %29 None +OpBranchConditional %28 %30 %29 +%30 = OpLabel +OpBranch %24 +%29 = OpLabel +%31 = OpConvertSToF %12 %21 +%32 = OpAccessChain %17 %3 %21 +OpStore %32 %31 +OpBranch %23 +%23 = OpLabel +%22 = OpIAdd %6 %21 %18 +OpBranch %20 +%24 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(text, text, false); +} + +/* +Generated from the following GLSL +#version 440 core +void main(){ + float x[10]; + for (int i = 0; i < 10; i++) { + if (i == 5) { + continue; + } + x[i] = i; + } +} +*/ +TEST_F(PassClassTest, ContinueInBody) { + // clang-format off + // With opt::LocalMultiStoreElimPass +const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 440 +OpName %2 "main" +OpName %3 "x" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 0 +%9 = OpConstant %6 10 +%10 = OpTypeBool +%11 = OpConstant %6 5 +%12 = OpTypeFloat 32 +%13 = OpTypeInt 32 0 +%14 = OpConstant %13 10 +%15 = OpTypeArray %12 %14 +%16 = OpTypePointer Function %15 +%17 = OpTypePointer Function %12 +%18 = OpConstant %6 1 +%2 = OpFunction %4 None %5 +%19 = OpLabel +%3 = OpVariable %16 Function +OpBranch %20 +%20 = OpLabel +%21 = OpPhi %6 %8 %19 %22 %23 +OpLoopMerge %24 %23 Unroll +OpBranch %25 +%25 = OpLabel +%26 = OpSLessThan %10 %21 %9 +OpBranchConditional %26 %27 %24 +%27 = OpLabel +%28 = OpIEqual %10 %21 %11 +OpSelectionMerge %29 None +OpBranchConditional %28 %30 %29 +%30 = OpLabel +OpBranch %23 +%29 = OpLabel +%31 = OpConvertSToF %12 %21 +%32 = OpAccessChain %17 %3 %21 +OpStore %32 %31 +OpBranch %23 +%23 = OpLabel +%22 = OpIAdd %6 %21 %18 +OpBranch %20 +%24 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(text, text, false); +} + +/* +Generated from the following GLSL +#version 440 core +void main(){ + float x[10]; + for (int i = 0; i < 10; i++) { + if (i == 5) { + return; + } + x[i] = i; + } +} +*/ +TEST_F(PassClassTest, ReturnInBody) { + // clang-format off + // With opt::LocalMultiStoreElimPass +const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 440 +OpName %2 "main" +OpName %3 "x" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 0 +%9 = OpConstant %6 10 +%10 = OpTypeBool +%11 = OpConstant %6 5 +%12 = OpTypeFloat 32 +%13 = OpTypeInt 32 0 +%14 = OpConstant %13 10 +%15 = OpTypeArray %12 %14 +%16 = OpTypePointer Function %15 +%17 = OpTypePointer Function %12 +%18 = OpConstant %6 1 +%2 = OpFunction %4 None %5 +%19 = OpLabel +%3 = OpVariable %16 Function +OpBranch %20 +%20 = OpLabel +%21 = OpPhi %6 %8 %19 %22 %23 +OpLoopMerge %24 %23 Unroll +OpBranch %25 +%25 = OpLabel +%26 = OpSLessThan %10 %21 %9 +OpBranchConditional %26 %27 %24 +%27 = OpLabel +%28 = OpIEqual %10 %21 %11 +OpSelectionMerge %29 None +OpBranchConditional %28 %30 %29 +%30 = OpLabel +OpReturn +%29 = OpLabel +%31 = OpConvertSToF %12 %21 +%32 = OpAccessChain %17 %3 %21 +OpStore %32 %31 +OpBranch %23 +%23 = OpLabel +%22 = OpIAdd %6 %21 %18 +OpBranch %20 +%24 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(text, text, false); +} + +/* +Generated from the following GLSL +#version 440 core +void main() { + int j = 0; + for (int i = 0; i < 10 && i > 0; i++) { + j++; + } +} +*/ +TEST_F(PassClassTest, MultipleConditionsSingleVariable) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 440 +OpName %2 "main" +%3 = OpTypeVoid +%4 = OpTypeFunction %3 +%5 = OpTypeInt 32 1 +%6 = OpTypePointer Function %5 +%7 = OpConstant %5 0 +%8 = OpConstant %5 10 +%9 = OpTypeBool +%10 = OpConstant %5 1 +%2 = OpFunction %3 None %4 +%11 = OpLabel +OpBranch %12 +%12 = OpLabel +%13 = OpPhi %5 %7 %11 %14 %15 +%16 = OpPhi %5 %7 %11 %17 %15 +OpLoopMerge %18 %15 Unroll +OpBranch %19 +%19 = OpLabel +%20 = OpSLessThan %9 %16 %8 +%21 = OpSGreaterThan %9 %16 %7 +%22 = OpLogicalAnd %9 %20 %21 +OpBranchConditional %22 %23 %18 +%23 = OpLabel +%14 = OpIAdd %5 %13 %10 +OpBranch %15 +%15 = OpLabel +%17 = OpIAdd %5 %16 %10 +OpBranch %12 +%18 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + // Make sure the pass doesn't run + SinglePassRunAndCheck(text, text, false); + SinglePassRunAndCheck>(text, text, false); + SinglePassRunAndCheck>(text, text, false); +} + +/* +Generated from the following GLSL +#version 440 core +void main() { + int i = 0; + int j = 0; + int k = 0; + for (; i < 10 && j > 0; i++, j++) { + k++; + } +} +*/ +TEST_F(PassClassTest, MultipleConditionsMultipleVariables) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 440 +OpName %2 "main" +%3 = OpTypeVoid +%4 = OpTypeFunction %3 +%5 = OpTypeInt 32 1 +%6 = OpTypePointer Function %5 +%7 = OpConstant %5 0 +%8 = OpConstant %5 10 +%9 = OpTypeBool +%10 = OpConstant %5 1 +%2 = OpFunction %3 None %4 +%11 = OpLabel +OpBranch %12 +%12 = OpLabel +%13 = OpPhi %5 %7 %11 %14 %15 +%16 = OpPhi %5 %7 %11 %17 %15 +%18 = OpPhi %5 %7 %11 %19 %15 +OpLoopMerge %20 %15 Unroll +OpBranch %21 +%21 = OpLabel +%22 = OpSLessThan %9 %13 %8 +%23 = OpSGreaterThan %9 %16 %7 +%24 = OpLogicalAnd %9 %22 %23 +OpBranchConditional %24 %25 %20 +%25 = OpLabel +%19 = OpIAdd %5 %18 %10 +OpBranch %15 +%15 = OpLabel +%14 = OpIAdd %5 %13 %10 +%17 = OpIAdd %5 %16 %10 +OpBranch %12 +%20 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + // Make sure the pass doesn't run + SinglePassRunAndCheck(text, text, false); + SinglePassRunAndCheck>(text, text, false); + SinglePassRunAndCheck>(text, text, false); +} + +/* +Generated from the following GLSL +#version 440 core +void main() { + float i = 0.0; + int j = 0; + for (; i < 10; i++) { + j++; + } +} +*/ +TEST_F(PassClassTest, FloatingPointLoop) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 440 +OpName %2 "main" +%3 = OpTypeVoid +%4 = OpTypeFunction %3 +%5 = OpTypeFloat 32 +%6 = OpTypePointer Function %5 +%7 = OpConstant %5 0 +%8 = OpTypeInt 32 1 +%9 = OpTypePointer Function %8 +%10 = OpConstant %8 0 +%11 = OpConstant %5 10 +%12 = OpTypeBool +%13 = OpConstant %8 1 +%14 = OpConstant %5 1 +%2 = OpFunction %3 None %4 +%15 = OpLabel +OpBranch %16 +%16 = OpLabel +%17 = OpPhi %5 %7 %15 %18 %19 +%20 = OpPhi %8 %10 %15 %21 %19 +OpLoopMerge %22 %19 Unroll +OpBranch %23 +%23 = OpLabel +%24 = OpFOrdLessThan %12 %17 %11 +OpBranchConditional %24 %25 %22 +%25 = OpLabel +%21 = OpIAdd %8 %20 %13 +OpBranch %19 +%19 = OpLabel +%18 = OpFAdd %5 %17 %14 +OpBranch %16 +%22 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + // Make sure the pass doesn't run + SinglePassRunAndCheck(text, text, false); + SinglePassRunAndCheck>(text, text, false); + SinglePassRunAndCheck>(text, text, false); +} + +/* +Generated from the following GLSL +#version 440 core +void main() { + int i = 2; + int j = 0; + if (j == 0) { i = 5; } + for (; i < 3; ++i) { + j++; + } +} +*/ +TEST_F(PassClassTest, InductionPhiOutsideLoop) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 440 +OpName %2 "main" +%3 = OpTypeVoid +%4 = OpTypeFunction %3 +%5 = OpTypeInt 32 1 +%6 = OpTypePointer Function %5 +%7 = OpConstant %5 2 +%8 = OpConstant %5 0 +%9 = OpTypeBool +%10 = OpConstant %5 5 +%11 = OpConstant %5 3 +%12 = OpConstant %5 1 +%2 = OpFunction %3 None %4 +%13 = OpLabel +%14 = OpIEqual %9 %8 %8 +OpSelectionMerge %15 None +OpBranchConditional %14 %16 %15 +%16 = OpLabel +OpBranch %15 +%15 = OpLabel +%17 = OpPhi %5 %7 %13 %10 %16 +OpBranch %18 +%18 = OpLabel +%19 = OpPhi %5 %17 %15 %20 %21 +%22 = OpPhi %5 %8 %15 %23 %21 +OpLoopMerge %24 %21 Unroll +OpBranch %25 +%25 = OpLabel +%26 = OpSLessThan %9 %19 %11 +OpBranchConditional %26 %27 %24 +%27 = OpLabel +%23 = OpIAdd %5 %22 %12 +OpBranch %21 +%21 = OpLabel +%20 = OpIAdd %5 %19 %12 +OpBranch %18 +%24 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + // Make sure the pass doesn't run + SinglePassRunAndCheck(text, text, false); + SinglePassRunAndCheck>(text, text, false); + SinglePassRunAndCheck>(text, text, false); +} + +/* +Generated from the following GLSL +#version 440 core +void main() { + int j = 0; + for (int i = 0; i == 0; ++i) { + ++j; + } + for (int i = 0; i != 3; ++i) { + ++j; + } + for (int i = 0; i < 3; i *= 2) { + ++j; + } + for (int i = 10; i > 3; i /= 2) { + ++j; + } + for (int i = 10; i > 3; i |= 2) { + ++j; + } + for (int i = 10; i > 3; i &= 2) { + ++j; + } + for (int i = 10; i > 3; i ^= 2) { + ++j; + } + for (int i = 0; i < 3; i << 2) { + ++j; + } + for (int i = 10; i > 3; i >> 2) { + ++j; + } +} +*/ +TEST_F(PassClassTest, UnsupportedLoopTypes) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 440 +OpName %2 "main" +%3 = OpTypeVoid +%4 = OpTypeFunction %3 +%5 = OpTypeInt 32 1 +%6 = OpTypePointer Function %5 +%7 = OpConstant %5 0 +%8 = OpTypeBool +%9 = OpConstant %5 1 +%10 = OpConstant %5 3 +%11 = OpConstant %5 2 +%12 = OpConstant %5 10 +%2 = OpFunction %3 None %4 +%13 = OpLabel +OpBranch %14 +%14 = OpLabel +%15 = OpPhi %5 %7 %13 %16 %17 +%18 = OpPhi %5 %7 %13 %19 %17 +OpLoopMerge %20 %17 Unroll +OpBranch %21 +%21 = OpLabel +%22 = OpIEqual %8 %18 %7 +OpBranchConditional %22 %23 %20 +%23 = OpLabel +%16 = OpIAdd %5 %15 %9 +OpBranch %17 +%17 = OpLabel +%19 = OpIAdd %5 %18 %9 +OpBranch %14 +%20 = OpLabel +OpBranch %24 +%24 = OpLabel +%25 = OpPhi %5 %15 %20 %26 %27 +%28 = OpPhi %5 %7 %20 %29 %27 +OpLoopMerge %30 %27 Unroll +OpBranch %31 +%31 = OpLabel +%32 = OpINotEqual %8 %28 %10 +OpBranchConditional %32 %33 %30 +%33 = OpLabel +%26 = OpIAdd %5 %25 %9 +OpBranch %27 +%27 = OpLabel +%29 = OpIAdd %5 %28 %9 +OpBranch %24 +%30 = OpLabel +OpBranch %34 +%34 = OpLabel +%35 = OpPhi %5 %25 %30 %36 %37 +%38 = OpPhi %5 %7 %30 %39 %37 +OpLoopMerge %40 %37 Unroll +OpBranch %41 +%41 = OpLabel +%42 = OpSLessThan %8 %38 %10 +OpBranchConditional %42 %43 %40 +%43 = OpLabel +%36 = OpIAdd %5 %35 %9 +OpBranch %37 +%37 = OpLabel +%39 = OpIMul %5 %38 %11 +OpBranch %34 +%40 = OpLabel +OpBranch %44 +%44 = OpLabel +%45 = OpPhi %5 %35 %40 %46 %47 +%48 = OpPhi %5 %12 %40 %49 %47 +OpLoopMerge %50 %47 Unroll +OpBranch %51 +%51 = OpLabel +%52 = OpSGreaterThan %8 %48 %10 +OpBranchConditional %52 %53 %50 +%53 = OpLabel +%46 = OpIAdd %5 %45 %9 +OpBranch %47 +%47 = OpLabel +%49 = OpSDiv %5 %48 %11 +OpBranch %44 +%50 = OpLabel +OpBranch %54 +%54 = OpLabel +%55 = OpPhi %5 %45 %50 %56 %57 +%58 = OpPhi %5 %12 %50 %59 %57 +OpLoopMerge %60 %57 Unroll +OpBranch %61 +%61 = OpLabel +%62 = OpSGreaterThan %8 %58 %10 +OpBranchConditional %62 %63 %60 +%63 = OpLabel +%56 = OpIAdd %5 %55 %9 +OpBranch %57 +%57 = OpLabel +%59 = OpBitwiseOr %5 %58 %11 +OpBranch %54 +%60 = OpLabel +OpBranch %64 +%64 = OpLabel +%65 = OpPhi %5 %55 %60 %66 %67 +%68 = OpPhi %5 %12 %60 %69 %67 +OpLoopMerge %70 %67 Unroll +OpBranch %71 +%71 = OpLabel +%72 = OpSGreaterThan %8 %68 %10 +OpBranchConditional %72 %73 %70 +%73 = OpLabel +%66 = OpIAdd %5 %65 %9 +OpBranch %67 +%67 = OpLabel +%69 = OpBitwiseAnd %5 %68 %11 +OpBranch %64 +%70 = OpLabel +OpBranch %74 +%74 = OpLabel +%75 = OpPhi %5 %65 %70 %76 %77 +%78 = OpPhi %5 %12 %70 %79 %77 +OpLoopMerge %80 %77 Unroll +OpBranch %81 +%81 = OpLabel +%82 = OpSGreaterThan %8 %78 %10 +OpBranchConditional %82 %83 %80 +%83 = OpLabel +%76 = OpIAdd %5 %75 %9 +OpBranch %77 +%77 = OpLabel +%79 = OpBitwiseXor %5 %78 %11 +OpBranch %74 +%80 = OpLabel +OpBranch %84 +%84 = OpLabel +%85 = OpPhi %5 %75 %80 %86 %87 +OpLoopMerge %88 %87 Unroll +OpBranch %89 +%89 = OpLabel +%90 = OpSLessThan %8 %7 %10 +OpBranchConditional %90 %91 %88 +%91 = OpLabel +%86 = OpIAdd %5 %85 %9 +OpBranch %87 +%87 = OpLabel +%92 = OpShiftLeftLogical %5 %7 %11 +OpBranch %84 +%88 = OpLabel +OpBranch %93 +%93 = OpLabel +%94 = OpPhi %5 %85 %88 %95 %96 +OpLoopMerge %97 %96 Unroll +OpBranch %98 +%98 = OpLabel +%99 = OpSGreaterThan %8 %12 %10 +OpBranchConditional %99 %100 %97 +%100 = OpLabel +%95 = OpIAdd %5 %94 %9 +OpBranch %96 +%96 = OpLabel +%101 = OpShiftRightArithmetic %5 %12 %11 +OpBranch %93 +%97 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + // Make sure the pass doesn't run + SinglePassRunAndCheck(text, text, false); + SinglePassRunAndCheck>(text, text, false); + SinglePassRunAndCheck>(text, text, false); +} + +/* +#version 430 + +layout(location = 0) out float o; + +void main(void) { + for (int j = 2; j < 0; j += 1) { + o += 1.0; + } +} +*/ +TEST_F(PassClassTest, NegativeNumberOfIterations) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" %3 +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 430 +OpName %2 "main" +OpName %3 "o" +OpDecorate %3 Location 0 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 2 +%9 = OpConstant %6 0 +%10 = OpTypeBool +%11 = OpTypeFloat 32 +%12 = OpTypePointer Output %11 +%3 = OpVariable %12 Output +%13 = OpConstant %11 1 +%14 = OpConstant %6 1 +%2 = OpFunction %4 None %5 +%15 = OpLabel +OpBranch %16 +%16 = OpLabel +%17 = OpPhi %6 %8 %15 %18 %19 +OpLoopMerge %20 %19 None +OpBranch %21 +%21 = OpLabel +%22 = OpSLessThan %10 %17 %9 +OpBranchConditional %22 %23 %20 +%23 = OpLabel +%24 = OpLoad %11 %3 +%25 = OpFAdd %11 %24 %13 +OpStore %3 %25 +OpBranch %19 +%19 = OpLabel +%18 = OpIAdd %6 %17 %14 +OpBranch %16 +%20 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + // Make sure the pass doesn't run + SinglePassRunAndCheck(text, text, false); + SinglePassRunAndCheck>(text, text, false); + SinglePassRunAndCheck>(text, text, false); +} + +/* +#version 430 + +layout(location = 0) out float o; + +void main(void) { + float s = 0.0; + for (int j = 0; j < 3; j += 1) { + s += 1.0; + j += 1; + } + o = s; +} +*/ +TEST_F(PassClassTest, MultipleStepOperations) { + // clang-format off + // With opt::LocalMultiStoreElimPass +const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" %3 +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 430 +OpName %2 "main" +OpName %3 "o" +OpDecorate %3 Location 0 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeFloat 32 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 0 +%9 = OpTypeInt 32 1 +%10 = OpTypePointer Function %9 +%11 = OpConstant %9 0 +%12 = OpConstant %9 3 +%13 = OpTypeBool +%14 = OpConstant %6 1 +%15 = OpConstant %9 1 +%16 = OpTypePointer Output %6 +%3 = OpVariable %16 Output +%2 = OpFunction %4 None %5 +%17 = OpLabel +OpBranch %18 +%18 = OpLabel +%19 = OpPhi %6 %8 %17 %20 %21 +%22 = OpPhi %9 %11 %17 %23 %21 +OpLoopMerge %24 %21 Unroll +OpBranch %25 +%25 = OpLabel +%26 = OpSLessThan %13 %22 %12 +OpBranchConditional %26 %27 %24 +%27 = OpLabel +%20 = OpFAdd %6 %19 %14 +%28 = OpIAdd %9 %22 %15 +OpBranch %21 +%21 = OpLabel +%23 = OpIAdd %9 %28 %15 +OpBranch %18 +%24 = OpLabel +OpStore %3 %19 +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + // Make sure the pass doesn't run + SinglePassRunAndCheck(text, text, false); + SinglePassRunAndCheck>(text, text, false); + SinglePassRunAndCheck>(text, text, false); +} + +/* +#version 430 + +layout(location = 0) out float o; + +void main(void) { + float s = 0.0; + for (int j = 10; j > 20; j -= 1) { + s += 1.0; + } + o = s; +} +*/ + +TEST_F(PassClassTest, ConditionFalseFromStartGreaterThan) { + // clang-format off + // With opt::LocalMultiStoreElimPass +const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" %3 +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 430 +OpName %2 "main" +OpName %3 "o" +OpDecorate %3 Location 0 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeFloat 32 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 0 +%9 = OpTypeInt 32 1 +%10 = OpTypePointer Function %9 +%11 = OpConstant %9 10 +%12 = OpConstant %9 20 +%13 = OpTypeBool +%14 = OpConstant %6 1 +%15 = OpConstant %9 1 +%16 = OpTypePointer Output %6 +%3 = OpVariable %16 Output +%2 = OpFunction %4 None %5 +%17 = OpLabel +OpBranch %18 +%18 = OpLabel +%19 = OpPhi %6 %8 %17 %20 %21 +%22 = OpPhi %9 %11 %17 %23 %21 +OpLoopMerge %24 %21 Unroll +OpBranch %25 +%25 = OpLabel +%26 = OpSGreaterThan %13 %22 %12 +OpBranchConditional %26 %27 %24 +%27 = OpLabel +%20 = OpFAdd %6 %19 %14 +OpBranch %21 +%21 = OpLabel +%23 = OpISub %9 %22 %15 +OpBranch %18 +%24 = OpLabel +OpStore %3 %19 +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + // Make sure the pass doesn't run + SinglePassRunAndCheck(text, text, false); + SinglePassRunAndCheck>(text, text, false); + SinglePassRunAndCheck>(text, text, false); +} + +/* +#version 430 + +layout(location = 0) out float o; + +void main(void) { + float s = 0.0; + for (int j = 10; j >= 20; j -= 1) { + s += 1.0; + } + o = s; +} +*/ +TEST_F(PassClassTest, ConditionFalseFromStartGreaterThanOrEqual) { + // clang-format off + // With opt::LocalMultiStoreElimPass +const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" %3 +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 430 +OpName %2 "main" +OpName %3 "o" +OpDecorate %3 Location 0 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeFloat 32 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 0 +%9 = OpTypeInt 32 1 +%10 = OpTypePointer Function %9 +%11 = OpConstant %9 10 +%12 = OpConstant %9 20 +%13 = OpTypeBool +%14 = OpConstant %6 1 +%15 = OpConstant %9 1 +%16 = OpTypePointer Output %6 +%3 = OpVariable %16 Output +%2 = OpFunction %4 None %5 +%17 = OpLabel +OpBranch %18 +%18 = OpLabel +%19 = OpPhi %6 %8 %17 %20 %21 +%22 = OpPhi %9 %11 %17 %23 %21 +OpLoopMerge %24 %21 Unroll +OpBranch %25 +%25 = OpLabel +%26 = OpSGreaterThanEqual %13 %22 %12 +OpBranchConditional %26 %27 %24 +%27 = OpLabel +%20 = OpFAdd %6 %19 %14 +OpBranch %21 +%21 = OpLabel +%23 = OpISub %9 %22 %15 +OpBranch %18 +%24 = OpLabel +OpStore %3 %19 +OpReturn +OpFunctionEnd +)"; + + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + // Make sure the pass doesn't run + SinglePassRunAndCheck(text, text, false); + SinglePassRunAndCheck>(text, text, false); + SinglePassRunAndCheck>(text, text, false); +} + +/* +#version 430 + +layout(location = 0) out float o; + +void main(void) { + float s = 0.0; + for (int j = 20; j < 10; j -= 1) { + s += 1.0; + } + o = s; +} +*/ +TEST_F(PassClassTest, ConditionFalseFromStartLessThan) { + // clang-format off + // With opt::LocalMultiStoreElimPass +const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" %3 +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 430 +OpName %2 "main" +OpName %3 "o" +OpDecorate %3 Location 0 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeFloat 32 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 0 +%9 = OpTypeInt 32 1 +%10 = OpTypePointer Function %9 +%11 = OpConstant %9 20 +%12 = OpConstant %9 10 +%13 = OpTypeBool +%14 = OpConstant %6 1 +%15 = OpConstant %9 1 +%16 = OpTypePointer Output %6 +%3 = OpVariable %16 Output +%2 = OpFunction %4 None %5 +%17 = OpLabel +OpBranch %18 +%18 = OpLabel +%19 = OpPhi %6 %8 %17 %20 %21 +%22 = OpPhi %9 %11 %17 %23 %21 +OpLoopMerge %24 %21 Unroll +OpBranch %25 +%25 = OpLabel +%26 = OpSLessThan %13 %22 %12 +OpBranchConditional %26 %27 %24 +%27 = OpLabel +%20 = OpFAdd %6 %19 %14 +OpBranch %21 +%21 = OpLabel +%23 = OpISub %9 %22 %15 +OpBranch %18 +%24 = OpLabel +OpStore %3 %19 +OpReturn +OpFunctionEnd +)"; + + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + // Make sure the pass doesn't run + SinglePassRunAndCheck(text, text, false); + SinglePassRunAndCheck>(text, text, false); + SinglePassRunAndCheck>(text, text, false); +} + +/* +#version 430 + +layout(location = 0) out float o; + +void main(void) { + float s = 0.0; + for (int j = 20; j <= 10; j -= 1) { + s += 1.0; + } + o = s; +} +*/ +TEST_F(PassClassTest, ConditionFalseFromStartLessThanEqual) { + // clang-format off + // With opt::LocalMultiStoreElimPass +const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" %3 +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 430 +OpName %2 "main" +OpName %3 "o" +OpDecorate %3 Location 0 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeFloat 32 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 0 +%9 = OpTypeInt 32 1 +%10 = OpTypePointer Function %9 +%11 = OpConstant %9 20 +%12 = OpConstant %9 10 +%13 = OpTypeBool +%14 = OpConstant %6 1 +%15 = OpConstant %9 1 +%16 = OpTypePointer Output %6 +%3 = OpVariable %16 Output +%2 = OpFunction %4 None %5 +%17 = OpLabel +OpBranch %18 +%18 = OpLabel +%19 = OpPhi %6 %8 %17 %20 %21 +%22 = OpPhi %9 %11 %17 %23 %21 +OpLoopMerge %24 %21 Unroll +OpBranch %25 +%25 = OpLabel +%26 = OpSLessThanEqual %13 %22 %12 +OpBranchConditional %26 %27 %24 +%27 = OpLabel +%20 = OpFAdd %6 %19 %14 +OpBranch %21 +%21 = OpLabel +%23 = OpISub %9 %22 %15 +OpBranch %18 +%24 = OpLabel +OpStore %3 %19 +OpReturn +OpFunctionEnd +)"; + + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + // Make sure the pass doesn't run + SinglePassRunAndCheck(text, text, false); + SinglePassRunAndCheck>(text, text, false); + SinglePassRunAndCheck>(text, text, false); +} + +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/unroll_simple.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/unroll_simple.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/unroll_simple.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/unroll_simple.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,2799 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include +#include + +#include + +#include "../assembly_builder.h" +#include "../function_utils.h" +#include "../pass_fixture.h" +#include "../pass_utils.h" +#include "opt/loop_unroller.h" +#include "opt/loop_utils.h" +#include "opt/pass.h" + +namespace { + +using namespace spvtools; +using ::testing::UnorderedElementsAre; + +using PassClassTest = PassTest<::testing::Test>; + +/* +Generated from the following GLSL +#version 330 core +layout(location = 0) out vec4 c; +void main() { + float x[4]; + for (int i = 0; i < 4; ++i) { + x[i] = 1.0f; + } +} +*/ +TEST_F(PassClassTest, SimpleFullyUnrollTest) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 + OpExecutionMode %2 OriginUpperLeft + OpSource GLSL 330 + OpName %2 "main" + OpName %5 "x" + OpName %3 "c" + OpDecorate %3 Location 0 + %6 = OpTypeVoid + %7 = OpTypeFunction %6 + %8 = OpTypeInt 32 1 + %9 = OpTypePointer Function %8 + %10 = OpConstant %8 0 + %11 = OpConstant %8 4 + %12 = OpTypeBool + %13 = OpTypeFloat 32 + %14 = OpTypeInt 32 0 + %15 = OpConstant %14 4 + %16 = OpTypeArray %13 %15 + %17 = OpTypePointer Function %16 + %18 = OpConstant %13 1 + %19 = OpTypePointer Function %13 + %20 = OpConstant %8 1 + %21 = OpTypeVector %13 4 + %22 = OpTypePointer Output %21 + %3 = OpVariable %22 Output + %2 = OpFunction %6 None %7 + %23 = OpLabel + %5 = OpVariable %17 Function + OpBranch %24 + %24 = OpLabel + %35 = OpPhi %8 %10 %23 %34 %26 + OpLoopMerge %25 %26 Unroll + OpBranch %27 + %27 = OpLabel + %29 = OpSLessThan %12 %35 %11 + OpBranchConditional %29 %30 %25 + %30 = OpLabel + %32 = OpAccessChain %19 %5 %35 + OpStore %32 %18 + OpBranch %26 + %26 = OpLabel + %34 = OpIAdd %8 %35 %20 + OpBranch %24 + %25 = OpLabel + OpReturn + OpFunctionEnd + )"; + +const std::string output = +R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" %3 +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 330 +OpName %2 "main" +OpName %4 "x" +OpName %3 "c" +OpDecorate %3 Location 0 +%5 = OpTypeVoid +%6 = OpTypeFunction %5 +%7 = OpTypeInt 32 1 +%8 = OpTypePointer Function %7 +%9 = OpConstant %7 0 +%10 = OpConstant %7 4 +%11 = OpTypeBool +%12 = OpTypeFloat 32 +%13 = OpTypeInt 32 0 +%14 = OpConstant %13 4 +%15 = OpTypeArray %12 %14 +%16 = OpTypePointer Function %15 +%17 = OpConstant %12 1 +%18 = OpTypePointer Function %12 +%19 = OpConstant %7 1 +%20 = OpTypeVector %12 4 +%21 = OpTypePointer Output %20 +%3 = OpVariable %21 Output +%2 = OpFunction %5 None %6 +%22 = OpLabel +%4 = OpVariable %16 Function +OpBranch %23 +%23 = OpLabel +OpBranch %28 +%28 = OpLabel +%29 = OpSLessThan %11 %9 %10 +OpBranch %30 +%30 = OpLabel +%31 = OpAccessChain %18 %4 %9 +OpStore %31 %17 +OpBranch %26 +%26 = OpLabel +%25 = OpIAdd %7 %9 %19 +OpBranch %32 +%32 = OpLabel +OpBranch %34 +%34 = OpLabel +%35 = OpSLessThan %11 %25 %10 +OpBranch %36 +%36 = OpLabel +%37 = OpAccessChain %18 %4 %25 +OpStore %37 %17 +OpBranch %38 +%38 = OpLabel +%39 = OpIAdd %7 %25 %19 +OpBranch %40 +%40 = OpLabel +OpBranch %42 +%42 = OpLabel +%43 = OpSLessThan %11 %39 %10 +OpBranch %44 +%44 = OpLabel +%45 = OpAccessChain %18 %4 %39 +OpStore %45 %17 +OpBranch %46 +%46 = OpLabel +%47 = OpIAdd %7 %39 %19 +OpBranch %48 +%48 = OpLabel +OpBranch %50 +%50 = OpLabel +%51 = OpSLessThan %11 %47 %10 +OpBranch %52 +%52 = OpLabel +%53 = OpAccessChain %18 %4 %47 +OpStore %53 %17 +OpBranch %54 +%54 = OpLabel +%55 = OpIAdd %7 %47 %19 +OpBranch %27 +%27 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(text, output, false); +} + +template +class PartialUnrollerTestPass : public opt::Pass { + public: + PartialUnrollerTestPass() : Pass() {} + + const char* name() const override { return "Loop unroller"; } + + Status Process(ir::IRContext* context) override { + for (ir::Function& f : *context->module()) { + ir::LoopDescriptor& loop_descriptor = *context->GetLoopDescriptor(&f); + for (auto& loop : loop_descriptor) { + opt::LoopUtils loop_utils{context, &loop}; + loop_utils.PartiallyUnroll(factor); + } + } + + return Pass::Status::SuccessWithChange; + } +}; + +/* +Generated from the following GLSL +#version 330 core +layout(location = 0) out vec4 c; +void main() { + float x[10]; + for (int i = 0; i < 10; ++i) { + x[i] = 1.0f; + } +} +*/ +TEST_F(PassClassTest, SimplePartialUnroll) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 + OpExecutionMode %2 OriginUpperLeft + OpSource GLSL 330 + OpName %2 "main" + OpName %5 "x" + OpName %3 "c" + OpDecorate %3 Location 0 + %6 = OpTypeVoid + %7 = OpTypeFunction %6 + %8 = OpTypeInt 32 1 + %9 = OpTypePointer Function %8 + %10 = OpConstant %8 0 + %11 = OpConstant %8 10 + %12 = OpTypeBool + %13 = OpTypeFloat 32 + %14 = OpTypeInt 32 0 + %15 = OpConstant %14 10 + %16 = OpTypeArray %13 %15 + %17 = OpTypePointer Function %16 + %18 = OpConstant %13 1 + %19 = OpTypePointer Function %13 + %20 = OpConstant %8 1 + %21 = OpTypeVector %13 4 + %22 = OpTypePointer Output %21 + %3 = OpVariable %22 Output + %2 = OpFunction %6 None %7 + %23 = OpLabel + %5 = OpVariable %17 Function + OpBranch %24 + %24 = OpLabel + %35 = OpPhi %8 %10 %23 %34 %26 + OpLoopMerge %25 %26 Unroll + OpBranch %27 + %27 = OpLabel + %29 = OpSLessThan %12 %35 %11 + OpBranchConditional %29 %30 %25 + %30 = OpLabel + %32 = OpAccessChain %19 %5 %35 + OpStore %32 %18 + OpBranch %26 + %26 = OpLabel + %34 = OpIAdd %8 %35 %20 + OpBranch %24 + %25 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const std::string output = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" %3 +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 330 +OpName %2 "main" +OpName %4 "x" +OpName %3 "c" +OpDecorate %3 Location 0 +%5 = OpTypeVoid +%6 = OpTypeFunction %5 +%7 = OpTypeInt 32 1 +%8 = OpTypePointer Function %7 +%9 = OpConstant %7 0 +%10 = OpConstant %7 10 +%11 = OpTypeBool +%12 = OpTypeFloat 32 +%13 = OpTypeInt 32 0 +%14 = OpConstant %13 10 +%15 = OpTypeArray %12 %14 +%16 = OpTypePointer Function %15 +%17 = OpConstant %12 1 +%18 = OpTypePointer Function %12 +%19 = OpConstant %7 1 +%20 = OpTypeVector %12 4 +%21 = OpTypePointer Output %20 +%3 = OpVariable %21 Output +%2 = OpFunction %5 None %6 +%22 = OpLabel +%4 = OpVariable %16 Function +OpBranch %23 +%23 = OpLabel +%24 = OpPhi %7 %9 %22 %39 %38 +OpLoopMerge %27 %38 DontUnroll +OpBranch %28 +%28 = OpLabel +%29 = OpSLessThan %11 %24 %10 +OpBranchConditional %29 %30 %27 +%30 = OpLabel +%31 = OpAccessChain %18 %4 %24 +OpStore %31 %17 +OpBranch %26 +%26 = OpLabel +%25 = OpIAdd %7 %24 %19 +OpBranch %32 +%32 = OpLabel +OpBranch %34 +%34 = OpLabel +%35 = OpSLessThan %11 %25 %10 +OpBranch %36 +%36 = OpLabel +%37 = OpAccessChain %18 %4 %25 +OpStore %37 %17 +OpBranch %38 +%38 = OpLabel +%39 = OpIAdd %7 %25 %19 +OpBranch %23 +%27 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck>(text, output, false); +} + +/* +Generated from the following GLSL +#version 330 core +layout(location = 0) out vec4 c; +void main() { + float x[10]; + for (int i = 0; i < 10; ++i) { + x[i] = 1.0f; + } +} +*/ +TEST_F(PassClassTest, SimpleUnevenPartialUnroll) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 + OpExecutionMode %2 OriginUpperLeft + OpSource GLSL 330 + OpName %2 "main" + OpName %5 "x" + OpName %3 "c" + OpDecorate %3 Location 0 + %6 = OpTypeVoid + %7 = OpTypeFunction %6 + %8 = OpTypeInt 32 1 + %9 = OpTypePointer Function %8 + %10 = OpConstant %8 0 + %11 = OpConstant %8 10 + %12 = OpTypeBool + %13 = OpTypeFloat 32 + %14 = OpTypeInt 32 0 + %15 = OpConstant %14 10 + %16 = OpTypeArray %13 %15 + %17 = OpTypePointer Function %16 + %18 = OpConstant %13 1 + %19 = OpTypePointer Function %13 + %20 = OpConstant %8 1 + %21 = OpTypeVector %13 4 + %22 = OpTypePointer Output %21 + %3 = OpVariable %22 Output + %2 = OpFunction %6 None %7 + %23 = OpLabel + %5 = OpVariable %17 Function + OpBranch %24 + %24 = OpLabel + %35 = OpPhi %8 %10 %23 %34 %26 + OpLoopMerge %25 %26 Unroll + OpBranch %27 + %27 = OpLabel + %29 = OpSLessThan %12 %35 %11 + OpBranchConditional %29 %30 %25 + %30 = OpLabel + %32 = OpAccessChain %19 %5 %35 + OpStore %32 %18 + OpBranch %26 + %26 = OpLabel + %34 = OpIAdd %8 %35 %20 + OpBranch %24 + %25 = OpLabel + OpReturn + OpFunctionEnd + )"; + +const std::string output = +R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" %3 +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 330 +OpName %2 "main" +OpName %4 "x" +OpName %3 "c" +OpDecorate %3 Location 0 +%5 = OpTypeVoid +%6 = OpTypeFunction %5 +%7 = OpTypeInt 32 1 +%8 = OpTypePointer Function %7 +%9 = OpConstant %7 0 +%10 = OpConstant %7 10 +%11 = OpTypeBool +%12 = OpTypeFloat 32 +%13 = OpTypeInt 32 0 +%14 = OpConstant %13 10 +%15 = OpTypeArray %12 %14 +%16 = OpTypePointer Function %15 +%17 = OpConstant %12 1 +%18 = OpTypePointer Function %12 +%19 = OpConstant %7 1 +%20 = OpTypeVector %12 4 +%21 = OpTypePointer Output %20 +%3 = OpVariable %21 Output +%58 = OpConstant %13 1 +%2 = OpFunction %5 None %6 +%22 = OpLabel +%4 = OpVariable %16 Function +OpBranch %23 +%23 = OpLabel +%24 = OpPhi %7 %9 %22 %25 %26 +OpLoopMerge %32 %26 Unroll +OpBranch %28 +%28 = OpLabel +%29 = OpSLessThan %11 %24 %58 +OpBranchConditional %29 %30 %32 +%30 = OpLabel +%31 = OpAccessChain %18 %4 %24 +OpStore %31 %17 +OpBranch %26 +%26 = OpLabel +%25 = OpIAdd %7 %24 %19 +OpBranch %23 +%32 = OpLabel +OpBranch %33 +%33 = OpLabel +%34 = OpPhi %7 %24 %32 %57 %56 +OpLoopMerge %41 %56 DontUnroll +OpBranch %35 +%35 = OpLabel +%36 = OpSLessThan %11 %34 %10 +OpBranchConditional %36 %37 %41 +%37 = OpLabel +%38 = OpAccessChain %18 %4 %34 +OpStore %38 %17 +OpBranch %39 +%39 = OpLabel +%40 = OpIAdd %7 %34 %19 +OpBranch %42 +%42 = OpLabel +OpBranch %44 +%44 = OpLabel +%45 = OpSLessThan %11 %40 %10 +OpBranch %46 +%46 = OpLabel +%47 = OpAccessChain %18 %4 %40 +OpStore %47 %17 +OpBranch %48 +%48 = OpLabel +%49 = OpIAdd %7 %40 %19 +OpBranch %50 +%50 = OpLabel +OpBranch %52 +%52 = OpLabel +%53 = OpSLessThan %11 %49 %10 +OpBranch %54 +%54 = OpLabel +%55 = OpAccessChain %18 %4 %49 +OpStore %55 %17 +OpBranch %56 +%56 = OpLabel +%57 = OpIAdd %7 %49 %19 +OpBranch %33 +%41 = OpLabel +OpReturn +%27 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + // By unrolling by a factor that doesn't divide evenly into the number of loop + // iterations we perfom an additional transform when partially unrolling to + // account for the remainder. + SinglePassRunAndCheck>(text, output, false); +} + +/* Generated from +#version 410 core +layout(location=0) flat in int upper_bound; +void main() { + float x[10]; + for (int i = 2; i < 8; i+=2) { + x[i] = i; + } +} +*/ +TEST_F(PassClassTest, SimpleLoopIterationsCheck) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" %3 +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %5 "x" +OpName %3 "upper_bound" +OpDecorate %3 Flat +OpDecorate %3 Location 0 +%6 = OpTypeVoid +%7 = OpTypeFunction %6 +%8 = OpTypeInt 32 1 +%9 = OpTypePointer Function %8 +%10 = OpConstant %8 2 +%11 = OpConstant %8 8 +%12 = OpTypeBool +%13 = OpTypeFloat 32 +%14 = OpTypeInt 32 0 +%15 = OpConstant %14 10 +%16 = OpTypeArray %13 %15 +%17 = OpTypePointer Function %16 +%18 = OpTypePointer Function %13 +%19 = OpTypePointer Input %8 +%3 = OpVariable %19 Input +%2 = OpFunction %6 None %7 +%20 = OpLabel +%5 = OpVariable %17 Function +OpBranch %21 +%21 = OpLabel +%34 = OpPhi %8 %10 %20 %33 %23 +OpLoopMerge %22 %23 Unroll +OpBranch %24 +%24 = OpLabel +%26 = OpSLessThan %12 %34 %11 +OpBranchConditional %26 %27 %22 +%27 = OpLabel +%30 = OpConvertSToF %13 %34 +%31 = OpAccessChain %18 %5 %34 +OpStore %31 %30 +OpBranch %23 +%23 = OpLabel +%33 = OpIAdd %8 %34 %10 +OpBranch %21 +%22 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + + ir::Function* f = spvtest::GetFunction(module, 2); + + ir::LoopDescriptor& loop_descriptor = *context->GetLoopDescriptor(f); + EXPECT_EQ(loop_descriptor.NumLoops(), 1u); + + ir::Loop& loop = loop_descriptor.GetLoopByIndex(0); + + EXPECT_TRUE(loop.HasUnrollLoopControl()); + + ir::BasicBlock* condition = loop.FindConditionBlock(); + EXPECT_EQ(condition->id(), 24u); + + ir::Instruction* induction = loop.FindConditionVariable(condition); + EXPECT_EQ(induction->result_id(), 34u); + + opt::LoopUtils loop_utils{context.get(), &loop}; + EXPECT_TRUE(loop_utils.CanPerformUnroll()); + + size_t iterations = 0; + EXPECT_TRUE(loop.FindNumberOfIterations(induction, &*condition->ctail(), + &iterations)); + EXPECT_EQ(iterations, 3u); +} + +/* Generated from +#version 410 core +void main() { + float x[10]; + for (int i = -1; i < 6; i+=3) { + x[i] = i; + } +} +*/ +TEST_F(PassClassTest, SimpleLoopIterationsCheckSignedInit) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" %3 +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %5 "x" +OpName %3 "upper_bound" +OpDecorate %3 Flat +OpDecorate %3 Location 0 +%6 = OpTypeVoid +%7 = OpTypeFunction %6 +%8 = OpTypeInt 32 1 +%9 = OpTypePointer Function %8 +%10 = OpConstant %8 -1 +%11 = OpConstant %8 6 +%12 = OpTypeBool +%13 = OpTypeFloat 32 +%14 = OpTypeInt 32 0 +%15 = OpConstant %14 10 +%16 = OpTypeArray %13 %15 +%17 = OpTypePointer Function %16 +%18 = OpTypePointer Function %13 +%19 = OpConstant %8 3 +%20 = OpTypePointer Input %8 +%3 = OpVariable %20 Input +%2 = OpFunction %6 None %7 +%21 = OpLabel +%5 = OpVariable %17 Function +OpBranch %22 +%22 = OpLabel +%35 = OpPhi %8 %10 %21 %34 %24 +OpLoopMerge %23 %24 None +OpBranch %25 +%25 = OpLabel +%27 = OpSLessThan %12 %35 %11 +OpBranchConditional %27 %28 %23 +%28 = OpLabel +%31 = OpConvertSToF %13 %35 +%32 = OpAccessChain %18 %5 %35 +OpStore %32 %31 +OpBranch %24 +%24 = OpLabel +%34 = OpIAdd %8 %35 %19 +OpBranch %22 +%23 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + + ir::Function* f = spvtest::GetFunction(module, 2); + + ir::LoopDescriptor& loop_descriptor = *context->GetLoopDescriptor(f); + + EXPECT_EQ(loop_descriptor.NumLoops(), 1u); + + ir::Loop& loop = loop_descriptor.GetLoopByIndex(0); + + EXPECT_FALSE(loop.HasUnrollLoopControl()); + + ir::BasicBlock* condition = loop.FindConditionBlock(); + EXPECT_EQ(condition->id(), 25u); + + ir::Instruction* induction = loop.FindConditionVariable(condition); + EXPECT_EQ(induction->result_id(), 35u); + + opt::LoopUtils loop_utils{context.get(), &loop}; + EXPECT_TRUE(loop_utils.CanPerformUnroll()); + + size_t iterations = 0; + EXPECT_TRUE(loop.FindNumberOfIterations(induction, &*condition->ctail(), + &iterations)); + EXPECT_EQ(iterations, 3u); +} + +/* +Generated from the following GLSL +#version 410 core +void main() { + float out_array[6]; + for (uint i = 0; i < 2; i++) { + for (int x = 0; x < 3; ++x) { + out_array[x + i*3] = i; + } + } +} +*/ +TEST_F(PassClassTest, UnrollNestedLoops) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource GLSL 410 + OpName %4 "main" + OpName %35 "out_array" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 0 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %16 = OpConstant %6 2 + %17 = OpTypeBool + %19 = OpTypeInt 32 1 + %20 = OpTypePointer Function %19 + %22 = OpConstant %19 0 + %29 = OpConstant %19 3 + %31 = OpTypeFloat 32 + %32 = OpConstant %6 6 + %33 = OpTypeArray %31 %32 + %34 = OpTypePointer Function %33 + %39 = OpConstant %6 3 + %44 = OpTypePointer Function %31 + %47 = OpConstant %19 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %35 = OpVariable %34 Function + OpBranch %10 + %10 = OpLabel + %51 = OpPhi %6 %9 %5 %50 %13 + OpLoopMerge %12 %13 Unroll + OpBranch %14 + %14 = OpLabel + %18 = OpULessThan %17 %51 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + OpBranch %23 + %23 = OpLabel + %54 = OpPhi %19 %22 %11 %48 %26 + OpLoopMerge %25 %26 Unroll + OpBranch %27 + %27 = OpLabel + %30 = OpSLessThan %17 %54 %29 + OpBranchConditional %30 %24 %25 + %24 = OpLabel + %37 = OpBitcast %6 %54 + %40 = OpIMul %6 %51 %39 + %41 = OpIAdd %6 %37 %40 + %43 = OpConvertUToF %31 %51 + %45 = OpAccessChain %44 %35 %41 + OpStore %45 %43 + OpBranch %26 + %26 = OpLabel + %48 = OpIAdd %19 %54 %47 + OpBranch %23 + %25 = OpLabel + OpBranch %13 + %13 = OpLabel + %50 = OpIAdd %6 %51 %47 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + +const std::string output = +R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %3 "out_array" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 0 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 0 +%9 = OpConstant %6 2 +%10 = OpTypeBool +%11 = OpTypeInt 32 1 +%12 = OpTypePointer Function %11 +%13 = OpConstant %11 0 +%14 = OpConstant %11 3 +%15 = OpTypeFloat 32 +%16 = OpConstant %6 6 +%17 = OpTypeArray %15 %16 +%18 = OpTypePointer Function %17 +%19 = OpConstant %6 3 +%20 = OpTypePointer Function %15 +%21 = OpConstant %11 1 +%2 = OpFunction %4 None %5 +%22 = OpLabel +%3 = OpVariable %18 Function +OpBranch %23 +%23 = OpLabel +OpBranch %28 +%28 = OpLabel +%29 = OpULessThan %10 %8 %9 +OpBranch %30 +%30 = OpLabel +OpBranch %31 +%31 = OpLabel +OpBranch %36 +%36 = OpLabel +%37 = OpSLessThan %10 %13 %14 +OpBranch %38 +%38 = OpLabel +%39 = OpBitcast %6 %13 +%40 = OpIMul %6 %8 %19 +%41 = OpIAdd %6 %39 %40 +%42 = OpConvertUToF %15 %8 +%43 = OpAccessChain %20 %3 %41 +OpStore %43 %42 +OpBranch %34 +%34 = OpLabel +%33 = OpIAdd %11 %13 %21 +OpBranch %44 +%44 = OpLabel +OpBranch %46 +%46 = OpLabel +%47 = OpSLessThan %10 %33 %14 +OpBranch %48 +%48 = OpLabel +%49 = OpBitcast %6 %33 +%50 = OpIMul %6 %8 %19 +%51 = OpIAdd %6 %49 %50 +%52 = OpConvertUToF %15 %8 +%53 = OpAccessChain %20 %3 %51 +OpStore %53 %52 +OpBranch %54 +%54 = OpLabel +%55 = OpIAdd %11 %33 %21 +OpBranch %56 +%56 = OpLabel +OpBranch %58 +%58 = OpLabel +%59 = OpSLessThan %10 %55 %14 +OpBranch %60 +%60 = OpLabel +%61 = OpBitcast %6 %55 +%62 = OpIMul %6 %8 %19 +%63 = OpIAdd %6 %61 %62 +%64 = OpConvertUToF %15 %8 +%65 = OpAccessChain %20 %3 %63 +OpStore %65 %64 +OpBranch %66 +%66 = OpLabel +%67 = OpIAdd %11 %55 %21 +OpBranch %35 +%35 = OpLabel +OpBranch %26 +%26 = OpLabel +%25 = OpIAdd %6 %8 %21 +OpBranch %68 +%68 = OpLabel +OpBranch %70 +%70 = OpLabel +%71 = OpULessThan %10 %25 %9 +OpBranch %72 +%72 = OpLabel +OpBranch %73 +%73 = OpLabel +OpBranch %74 +%74 = OpLabel +%75 = OpSLessThan %10 %13 %14 +OpBranch %76 +%76 = OpLabel +%77 = OpBitcast %6 %13 +%78 = OpIMul %6 %25 %19 +%79 = OpIAdd %6 %77 %78 +%80 = OpConvertUToF %15 %25 +%81 = OpAccessChain %20 %3 %79 +OpStore %81 %80 +OpBranch %82 +%82 = OpLabel +%83 = OpIAdd %11 %13 %21 +OpBranch %84 +%84 = OpLabel +OpBranch %85 +%85 = OpLabel +%86 = OpSLessThan %10 %83 %14 +OpBranch %87 +%87 = OpLabel +%88 = OpBitcast %6 %83 +%89 = OpIMul %6 %25 %19 +%90 = OpIAdd %6 %88 %89 +%91 = OpConvertUToF %15 %25 +%92 = OpAccessChain %20 %3 %90 +OpStore %92 %91 +OpBranch %93 +%93 = OpLabel +%94 = OpIAdd %11 %83 %21 +OpBranch %95 +%95 = OpLabel +OpBranch %96 +%96 = OpLabel +%97 = OpSLessThan %10 %94 %14 +OpBranch %98 +%98 = OpLabel +%99 = OpBitcast %6 %94 +%100 = OpIMul %6 %25 %19 +%101 = OpIAdd %6 %99 %100 +%102 = OpConvertUToF %15 %25 +%103 = OpAccessChain %20 %3 %101 +OpStore %103 %102 +OpBranch %104 +%104 = OpLabel +%105 = OpIAdd %11 %94 %21 +OpBranch %106 +%106 = OpLabel +OpBranch %107 +%107 = OpLabel +%108 = OpIAdd %6 %25 %21 +OpBranch %27 +%27 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(text, output, false); +} + +/* +Generated from the following GLSL +#version 410 core +void main() { + float out_array[2]; + for (int i = -3; i < -1; i++) { + out_array[3 + i] = i; + } +} +*/ +TEST_F(PassClassTest, NegativeConditionAndInit) { + // clang-format off + // With opt::LocalMultiStoreElimPass +const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource GLSL 410 + OpName %4 "main" + OpName %23 "out_array" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 -3 + %16 = OpConstant %6 -1 + %17 = OpTypeBool + %19 = OpTypeInt 32 0 + %20 = OpConstant %19 2 + %21 = OpTypeArray %6 %20 + %22 = OpTypePointer Function %21 + %25 = OpConstant %6 3 + %30 = OpConstant %6 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %23 = OpVariable %22 Function + OpBranch %10 + %10 = OpLabel + %32 = OpPhi %6 %9 %5 %31 %13 + OpLoopMerge %12 %13 Unroll + OpBranch %14 + %14 = OpLabel + %18 = OpSLessThan %17 %32 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + %26 = OpIAdd %6 %32 %25 + %28 = OpAccessChain %7 %23 %26 + OpStore %28 %32 + OpBranch %13 + %13 = OpLabel + %31 = OpIAdd %6 %32 %30 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd +)"; + +const std::string expected = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %3 "out_array" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 -3 +%9 = OpConstant %6 -1 +%10 = OpTypeBool +%11 = OpTypeInt 32 0 +%12 = OpConstant %11 2 +%13 = OpTypeArray %6 %12 +%14 = OpTypePointer Function %13 +%15 = OpConstant %6 3 +%16 = OpConstant %6 1 +%2 = OpFunction %4 None %5 +%17 = OpLabel +%3 = OpVariable %14 Function +OpBranch %18 +%18 = OpLabel +OpBranch %23 +%23 = OpLabel +%24 = OpSLessThan %10 %8 %9 +OpBranch %25 +%25 = OpLabel +%26 = OpIAdd %6 %8 %15 +%27 = OpAccessChain %7 %3 %26 +OpStore %27 %8 +OpBranch %21 +%21 = OpLabel +%20 = OpIAdd %6 %8 %16 +OpBranch %28 +%28 = OpLabel +OpBranch %30 +%30 = OpLabel +%31 = OpSLessThan %10 %20 %9 +OpBranch %32 +%32 = OpLabel +%33 = OpIAdd %6 %20 %15 +%34 = OpAccessChain %7 %3 %33 +OpStore %34 %20 +OpBranch %35 +%35 = OpLabel +%36 = OpIAdd %6 %20 %16 +OpBranch %22 +%22 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + // SinglePassRunAndCheck(text, expected, false); + + ir::Function* f = spvtest::GetFunction(module, 4); + + ir::LoopDescriptor& loop_descriptor = *context->GetLoopDescriptor(f); + EXPECT_EQ(loop_descriptor.NumLoops(), 1u); + + ir::Loop& loop = loop_descriptor.GetLoopByIndex(0); + + EXPECT_TRUE(loop.HasUnrollLoopControl()); + + ir::BasicBlock* condition = loop.FindConditionBlock(); + EXPECT_EQ(condition->id(), 14u); + + ir::Instruction* induction = loop.FindConditionVariable(condition); + EXPECT_EQ(induction->result_id(), 32u); + + opt::LoopUtils loop_utils{context.get(), &loop}; + EXPECT_TRUE(loop_utils.CanPerformUnroll()); + + size_t iterations = 0; + EXPECT_TRUE(loop.FindNumberOfIterations(induction, &*condition->ctail(), + &iterations)); + EXPECT_EQ(iterations, 2u); + SinglePassRunAndCheck(text, expected, false); +} + +/* +Generated from the following GLSL +#version 410 core +void main() { + float out_array[9]; + for (int i = -10; i < -1; i++) { + out_array[i] = i; + } +} +*/ +TEST_F(PassClassTest, NegativeConditionAndInitResidualUnroll) { + // clang-format off + // With opt::LocalMultiStoreElimPass +const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource GLSL 410 + OpName %4 "main" + OpName %23 "out_array" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 -10 + %16 = OpConstant %6 -1 + %17 = OpTypeBool + %19 = OpTypeInt 32 0 + %20 = OpConstant %19 9 + %21 = OpTypeArray %6 %20 + %22 = OpTypePointer Function %21 + %25 = OpConstant %6 10 + %30 = OpConstant %6 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %23 = OpVariable %22 Function + OpBranch %10 + %10 = OpLabel + %32 = OpPhi %6 %9 %5 %31 %13 + OpLoopMerge %12 %13 Unroll + OpBranch %14 + %14 = OpLabel + %18 = OpSLessThan %17 %32 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + %26 = OpIAdd %6 %32 %25 + %28 = OpAccessChain %7 %23 %26 + OpStore %28 %32 + OpBranch %13 + %13 = OpLabel + %31 = OpIAdd %6 %32 %30 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd +)"; + +const std::string expected = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %3 "out_array" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 -10 +%9 = OpConstant %6 -1 +%10 = OpTypeBool +%11 = OpTypeInt 32 0 +%12 = OpConstant %11 9 +%13 = OpTypeArray %6 %12 +%14 = OpTypePointer Function %13 +%15 = OpConstant %6 10 +%16 = OpConstant %6 1 +%48 = OpConstant %6 -9 +%2 = OpFunction %4 None %5 +%17 = OpLabel +%3 = OpVariable %14 Function +OpBranch %18 +%18 = OpLabel +%19 = OpPhi %6 %8 %17 %20 %21 +OpLoopMerge %28 %21 Unroll +OpBranch %23 +%23 = OpLabel +%24 = OpSLessThan %10 %19 %48 +OpBranchConditional %24 %25 %28 +%25 = OpLabel +%26 = OpIAdd %6 %19 %15 +%27 = OpAccessChain %7 %3 %26 +OpStore %27 %19 +OpBranch %21 +%21 = OpLabel +%20 = OpIAdd %6 %19 %16 +OpBranch %18 +%28 = OpLabel +OpBranch %29 +%29 = OpLabel +%30 = OpPhi %6 %19 %28 %47 %46 +OpLoopMerge %38 %46 DontUnroll +OpBranch %31 +%31 = OpLabel +%32 = OpSLessThan %10 %30 %9 +OpBranchConditional %32 %33 %38 +%33 = OpLabel +%34 = OpIAdd %6 %30 %15 +%35 = OpAccessChain %7 %3 %34 +OpStore %35 %30 +OpBranch %36 +%36 = OpLabel +%37 = OpIAdd %6 %30 %16 +OpBranch %39 +%39 = OpLabel +OpBranch %41 +%41 = OpLabel +%42 = OpSLessThan %10 %37 %9 +OpBranch %43 +%43 = OpLabel +%44 = OpIAdd %6 %37 %15 +%45 = OpAccessChain %7 %3 %44 +OpStore %45 %37 +OpBranch %46 +%46 = OpLabel +%47 = OpIAdd %6 %37 %16 +OpBranch %29 +%38 = OpLabel +OpReturn +%22 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + ir::Function* f = spvtest::GetFunction(module, 4); + + ir::LoopDescriptor& loop_descriptor = *context->GetLoopDescriptor(f); + EXPECT_EQ(loop_descriptor.NumLoops(), 1u); + + ir::Loop& loop = loop_descriptor.GetLoopByIndex(0); + + EXPECT_TRUE(loop.HasUnrollLoopControl()); + + ir::BasicBlock* condition = loop.FindConditionBlock(); + EXPECT_EQ(condition->id(), 14u); + + ir::Instruction* induction = loop.FindConditionVariable(condition); + EXPECT_EQ(induction->result_id(), 32u); + + opt::LoopUtils loop_utils{context.get(), &loop}; + EXPECT_TRUE(loop_utils.CanPerformUnroll()); + + size_t iterations = 0; + EXPECT_TRUE(loop.FindNumberOfIterations(induction, &*condition->ctail(), + &iterations)); + EXPECT_EQ(iterations, 9u); + SinglePassRunAndCheck>(text, expected, false); +} + +/* +Generated from the following GLSL +#version 410 core +void main() { + float out_array[10]; + for (uint i = 0; i < 2; i++) { + for (int x = 0; x < 5; ++x) { + out_array[x + i*5] = i; + } + } +} +*/ +TEST_F(PassClassTest, UnrollNestedLoopsValidateDescriptor) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource GLSL 410 + OpName %4 "main" + OpName %35 "out_array" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 0 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %16 = OpConstant %6 2 + %17 = OpTypeBool + %19 = OpTypeInt 32 1 + %20 = OpTypePointer Function %19 + %22 = OpConstant %19 0 + %29 = OpConstant %19 5 + %31 = OpTypeFloat 32 + %32 = OpConstant %6 10 + %33 = OpTypeArray %31 %32 + %34 = OpTypePointer Function %33 + %39 = OpConstant %6 5 + %44 = OpTypePointer Function %31 + %47 = OpConstant %19 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %35 = OpVariable %34 Function + OpBranch %10 + %10 = OpLabel + %51 = OpPhi %6 %9 %5 %50 %13 + OpLoopMerge %12 %13 Unroll + OpBranch %14 + %14 = OpLabel + %18 = OpULessThan %17 %51 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + OpBranch %23 + %23 = OpLabel + %54 = OpPhi %19 %22 %11 %48 %26 + OpLoopMerge %25 %26 Unroll + OpBranch %27 + %27 = OpLabel + %30 = OpSLessThan %17 %54 %29 + OpBranchConditional %30 %24 %25 + %24 = OpLabel + %37 = OpBitcast %6 %54 + %40 = OpIMul %6 %51 %39 + %41 = OpIAdd %6 %37 %40 + %43 = OpConvertUToF %31 %51 + %45 = OpAccessChain %44 %35 %41 + OpStore %45 %43 + OpBranch %26 + %26 = OpLabel + %48 = OpIAdd %19 %54 %47 + OpBranch %23 + %25 = OpLabel + OpBranch %13 + %13 = OpLabel + %50 = OpIAdd %6 %51 %47 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + + // clang-format on + + { // Test fully unroll + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + ir::Function* f = spvtest::GetFunction(module, 4); + ir::LoopDescriptor& loop_descriptor = *context->GetLoopDescriptor(f); + EXPECT_EQ(loop_descriptor.NumLoops(), 2u); + + ir::Loop& outer_loop = loop_descriptor.GetLoopByIndex(1); + + EXPECT_TRUE(outer_loop.HasUnrollLoopControl()); + + ir::Loop& inner_loop = loop_descriptor.GetLoopByIndex(0); + + EXPECT_TRUE(inner_loop.HasUnrollLoopControl()); + + EXPECT_EQ(outer_loop.GetBlocks().size(), 9u); + + EXPECT_EQ(inner_loop.GetBlocks().size(), 4u); + EXPECT_EQ(outer_loop.NumImmediateChildren(), 1u); + EXPECT_EQ(inner_loop.NumImmediateChildren(), 0u); + + { + opt::LoopUtils loop_utils{context.get(), &inner_loop}; + loop_utils.FullyUnroll(); + loop_utils.Finalize(); + } + + EXPECT_EQ(loop_descriptor.NumLoops(), 1u); + EXPECT_EQ(outer_loop.GetBlocks().size(), 25u); + EXPECT_EQ(outer_loop.NumImmediateChildren(), 0u); + { + opt::LoopUtils loop_utils{context.get(), &outer_loop}; + loop_utils.FullyUnroll(); + loop_utils.Finalize(); + } + EXPECT_EQ(loop_descriptor.NumLoops(), 0u); + } + + { // Test partially unroll + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + + ir::Function* f = spvtest::GetFunction(module, 4); + ir::LoopDescriptor& loop_descriptor = *context->GetLoopDescriptor(f); + EXPECT_EQ(loop_descriptor.NumLoops(), 2u); + + ir::Loop& outer_loop = loop_descriptor.GetLoopByIndex(1); + + EXPECT_TRUE(outer_loop.HasUnrollLoopControl()); + + ir::Loop& inner_loop = loop_descriptor.GetLoopByIndex(0); + + EXPECT_TRUE(inner_loop.HasUnrollLoopControl()); + + EXPECT_EQ(outer_loop.GetBlocks().size(), 9u); + + EXPECT_EQ(inner_loop.GetBlocks().size(), 4u); + + EXPECT_EQ(outer_loop.NumImmediateChildren(), 1u); + EXPECT_EQ(inner_loop.NumImmediateChildren(), 0u); + + opt::LoopUtils loop_utils{context.get(), &inner_loop}; + loop_utils.PartiallyUnroll(2); + loop_utils.Finalize(); + + // The number of loops should actually grow. + EXPECT_EQ(loop_descriptor.NumLoops(), 3u); + EXPECT_EQ(outer_loop.GetBlocks().size(), 18u); + EXPECT_EQ(outer_loop.NumImmediateChildren(), 2u); + } +} + +/* +Generated from the following GLSL +#version 410 core +void main() { + float out_array[3]; + for (int i = 3; i > 0; --i) { + out_array[i] = i; + } +} +*/ +TEST_F(PassClassTest, FullyUnrollNegativeStepLoopTest) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource GLSL 410 + OpName %4 "main" + OpName %24 "out_array" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 3 + %16 = OpConstant %6 0 + %17 = OpTypeBool + %19 = OpTypeFloat 32 + %20 = OpTypeInt 32 0 + %21 = OpConstant %20 3 + %22 = OpTypeArray %19 %21 + %23 = OpTypePointer Function %22 + %28 = OpTypePointer Function %19 + %31 = OpConstant %6 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %24 = OpVariable %23 Function + OpBranch %10 + %10 = OpLabel + %33 = OpPhi %6 %9 %5 %32 %13 + OpLoopMerge %12 %13 Unroll + OpBranch %14 + %14 = OpLabel + %18 = OpSGreaterThan %17 %33 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + %27 = OpConvertSToF %19 %33 + %29 = OpAccessChain %28 %24 %33 + OpStore %29 %27 + OpBranch %13 + %13 = OpLabel + %32 = OpISub %6 %33 %31 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + +const std::string output = +R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %3 "out_array" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 3 +%9 = OpConstant %6 0 +%10 = OpTypeBool +%11 = OpTypeFloat 32 +%12 = OpTypeInt 32 0 +%13 = OpConstant %12 3 +%14 = OpTypeArray %11 %13 +%15 = OpTypePointer Function %14 +%16 = OpTypePointer Function %11 +%17 = OpConstant %6 1 +%2 = OpFunction %4 None %5 +%18 = OpLabel +%3 = OpVariable %15 Function +OpBranch %19 +%19 = OpLabel +OpBranch %24 +%24 = OpLabel +%25 = OpSGreaterThan %10 %8 %9 +OpBranch %26 +%26 = OpLabel +%27 = OpConvertSToF %11 %8 +%28 = OpAccessChain %16 %3 %8 +OpStore %28 %27 +OpBranch %22 +%22 = OpLabel +%21 = OpISub %6 %8 %17 +OpBranch %29 +%29 = OpLabel +OpBranch %31 +%31 = OpLabel +%32 = OpSGreaterThan %10 %21 %9 +OpBranch %33 +%33 = OpLabel +%34 = OpConvertSToF %11 %21 +%35 = OpAccessChain %16 %3 %21 +OpStore %35 %34 +OpBranch %36 +%36 = OpLabel +%37 = OpISub %6 %21 %17 +OpBranch %38 +%38 = OpLabel +OpBranch %40 +%40 = OpLabel +%41 = OpSGreaterThan %10 %37 %9 +OpBranch %42 +%42 = OpLabel +%43 = OpConvertSToF %11 %37 +%44 = OpAccessChain %16 %3 %37 +OpStore %44 %43 +OpBranch %45 +%45 = OpLabel +%46 = OpISub %6 %37 %17 +OpBranch %23 +%23 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(text, output, false); +} + +/* +Generated from the following GLSL +#version 410 core +void main() { + float out_array[3]; + for (int i = 9; i > 0; i-=3) { + out_array[i] = i; + } +} +*/ +TEST_F(PassClassTest, FullyUnrollNegativeNonOneStepLoop) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource GLSL 410 + OpName %4 "main" + OpName %24 "out_array" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 9 + %16 = OpConstant %6 0 + %17 = OpTypeBool + %19 = OpTypeFloat 32 + %20 = OpTypeInt 32 0 + %21 = OpConstant %20 3 + %22 = OpTypeArray %19 %21 + %23 = OpTypePointer Function %22 + %28 = OpTypePointer Function %19 + %30 = OpConstant %6 3 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %24 = OpVariable %23 Function + OpBranch %10 + %10 = OpLabel + %33 = OpPhi %6 %9 %5 %32 %13 + OpLoopMerge %12 %13 Unroll + OpBranch %14 + %14 = OpLabel + %18 = OpSGreaterThan %17 %33 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + %27 = OpConvertSToF %19 %33 + %29 = OpAccessChain %28 %24 %33 + OpStore %29 %27 + OpBranch %13 + %13 = OpLabel + %32 = OpISub %6 %33 %30 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + +const std::string output = +R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %3 "out_array" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 9 +%9 = OpConstant %6 0 +%10 = OpTypeBool +%11 = OpTypeFloat 32 +%12 = OpTypeInt 32 0 +%13 = OpConstant %12 3 +%14 = OpTypeArray %11 %13 +%15 = OpTypePointer Function %14 +%16 = OpTypePointer Function %11 +%17 = OpConstant %6 3 +%2 = OpFunction %4 None %5 +%18 = OpLabel +%3 = OpVariable %15 Function +OpBranch %19 +%19 = OpLabel +OpBranch %24 +%24 = OpLabel +%25 = OpSGreaterThan %10 %8 %9 +OpBranch %26 +%26 = OpLabel +%27 = OpConvertSToF %11 %8 +%28 = OpAccessChain %16 %3 %8 +OpStore %28 %27 +OpBranch %22 +%22 = OpLabel +%21 = OpISub %6 %8 %17 +OpBranch %29 +%29 = OpLabel +OpBranch %31 +%31 = OpLabel +%32 = OpSGreaterThan %10 %21 %9 +OpBranch %33 +%33 = OpLabel +%34 = OpConvertSToF %11 %21 +%35 = OpAccessChain %16 %3 %21 +OpStore %35 %34 +OpBranch %36 +%36 = OpLabel +%37 = OpISub %6 %21 %17 +OpBranch %38 +%38 = OpLabel +OpBranch %40 +%40 = OpLabel +%41 = OpSGreaterThan %10 %37 %9 +OpBranch %42 +%42 = OpLabel +%43 = OpConvertSToF %11 %37 +%44 = OpAccessChain %16 %3 %37 +OpStore %44 %43 +OpBranch %45 +%45 = OpLabel +%46 = OpISub %6 %37 %17 +OpBranch %23 +%23 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(text, output, false); +} + +/* +Generated from the following GLSL +#version 410 core +void main() { + float out_array[3]; + for (int i = 0; i < 7; i+=3) { + out_array[i] = i; + } +} +*/ +TEST_F(PassClassTest, FullyUnrollNonDivisibleStepLoop) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %4 "main" +OpExecutionMode %4 OriginUpperLeft +OpSource GLSL 410 +OpName %4 "main" +OpName %24 "out_array" +%2 = OpTypeVoid +%3 = OpTypeFunction %2 +%6 = OpTypeInt 32 1 +%7 = OpTypePointer Function %6 +%9 = OpConstant %6 0 +%16 = OpConstant %6 7 +%17 = OpTypeBool +%19 = OpTypeFloat 32 +%20 = OpTypeInt 32 0 +%21 = OpConstant %20 3 +%22 = OpTypeArray %19 %21 +%23 = OpTypePointer Function %22 +%28 = OpTypePointer Function %19 +%30 = OpConstant %6 3 +%4 = OpFunction %2 None %3 +%5 = OpLabel +%24 = OpVariable %23 Function +OpBranch %10 +%10 = OpLabel +%33 = OpPhi %6 %9 %5 %32 %13 +OpLoopMerge %12 %13 Unroll +OpBranch %14 +%14 = OpLabel +%18 = OpSLessThan %17 %33 %16 +OpBranchConditional %18 %11 %12 +%11 = OpLabel +%27 = OpConvertSToF %19 %33 +%29 = OpAccessChain %28 %24 %33 +OpStore %29 %27 +OpBranch %13 +%13 = OpLabel +%32 = OpIAdd %6 %33 %30 +OpBranch %10 +%12 = OpLabel +OpReturn +OpFunctionEnd +)"; + +const std::string output = +R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %3 "out_array" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 0 +%9 = OpConstant %6 7 +%10 = OpTypeBool +%11 = OpTypeFloat 32 +%12 = OpTypeInt 32 0 +%13 = OpConstant %12 3 +%14 = OpTypeArray %11 %13 +%15 = OpTypePointer Function %14 +%16 = OpTypePointer Function %11 +%17 = OpConstant %6 3 +%2 = OpFunction %4 None %5 +%18 = OpLabel +%3 = OpVariable %15 Function +OpBranch %19 +%19 = OpLabel +OpBranch %24 +%24 = OpLabel +%25 = OpSLessThan %10 %8 %9 +OpBranch %26 +%26 = OpLabel +%27 = OpConvertSToF %11 %8 +%28 = OpAccessChain %16 %3 %8 +OpStore %28 %27 +OpBranch %22 +%22 = OpLabel +%21 = OpIAdd %6 %8 %17 +OpBranch %29 +%29 = OpLabel +OpBranch %31 +%31 = OpLabel +%32 = OpSLessThan %10 %21 %9 +OpBranch %33 +%33 = OpLabel +%34 = OpConvertSToF %11 %21 +%35 = OpAccessChain %16 %3 %21 +OpStore %35 %34 +OpBranch %36 +%36 = OpLabel +%37 = OpIAdd %6 %21 %17 +OpBranch %38 +%38 = OpLabel +OpBranch %40 +%40 = OpLabel +%41 = OpSLessThan %10 %37 %9 +OpBranch %42 +%42 = OpLabel +%43 = OpConvertSToF %11 %37 +%44 = OpAccessChain %16 %3 %37 +OpStore %44 %43 +OpBranch %45 +%45 = OpLabel +%46 = OpIAdd %6 %37 %17 +OpBranch %23 +%23 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(text, output, false); +} + +/* +Generated from the following GLSL +#version 410 core +void main() { + float out_array[4]; + for (int i = 11; i > 0; i-=3) { + out_array[i] = i; + } +} +*/ +TEST_F(PassClassTest, FullyUnrollNegativeNonDivisibleStepLoop) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %4 "main" +OpExecutionMode %4 OriginUpperLeft +OpSource GLSL 410 +OpName %4 "main" +OpName %24 "out_array" +%2 = OpTypeVoid +%3 = OpTypeFunction %2 +%6 = OpTypeInt 32 1 +%7 = OpTypePointer Function %6 +%9 = OpConstant %6 11 +%16 = OpConstant %6 0 +%17 = OpTypeBool +%19 = OpTypeFloat 32 +%20 = OpTypeInt 32 0 +%21 = OpConstant %20 4 +%22 = OpTypeArray %19 %21 +%23 = OpTypePointer Function %22 +%28 = OpTypePointer Function %19 +%30 = OpConstant %6 3 +%4 = OpFunction %2 None %3 +%5 = OpLabel +%24 = OpVariable %23 Function +OpBranch %10 +%10 = OpLabel +%33 = OpPhi %6 %9 %5 %32 %13 +OpLoopMerge %12 %13 Unroll +OpBranch %14 +%14 = OpLabel +%18 = OpSGreaterThan %17 %33 %16 +OpBranchConditional %18 %11 %12 +%11 = OpLabel +%27 = OpConvertSToF %19 %33 +%29 = OpAccessChain %28 %24 %33 +OpStore %29 %27 +OpBranch %13 +%13 = OpLabel +%32 = OpISub %6 %33 %30 +OpBranch %10 +%12 = OpLabel +OpReturn +OpFunctionEnd +)"; + +const std::string output = +R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %3 "out_array" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypePointer Function %6 +%8 = OpConstant %6 11 +%9 = OpConstant %6 0 +%10 = OpTypeBool +%11 = OpTypeFloat 32 +%12 = OpTypeInt 32 0 +%13 = OpConstant %12 4 +%14 = OpTypeArray %11 %13 +%15 = OpTypePointer Function %14 +%16 = OpTypePointer Function %11 +%17 = OpConstant %6 3 +%2 = OpFunction %4 None %5 +%18 = OpLabel +%3 = OpVariable %15 Function +OpBranch %19 +%19 = OpLabel +OpBranch %24 +%24 = OpLabel +%25 = OpSGreaterThan %10 %8 %9 +OpBranch %26 +%26 = OpLabel +%27 = OpConvertSToF %11 %8 +%28 = OpAccessChain %16 %3 %8 +OpStore %28 %27 +OpBranch %22 +%22 = OpLabel +%21 = OpISub %6 %8 %17 +OpBranch %29 +%29 = OpLabel +OpBranch %31 +%31 = OpLabel +%32 = OpSGreaterThan %10 %21 %9 +OpBranch %33 +%33 = OpLabel +%34 = OpConvertSToF %11 %21 +%35 = OpAccessChain %16 %3 %21 +OpStore %35 %34 +OpBranch %36 +%36 = OpLabel +%37 = OpISub %6 %21 %17 +OpBranch %38 +%38 = OpLabel +OpBranch %40 +%40 = OpLabel +%41 = OpSGreaterThan %10 %37 %9 +OpBranch %42 +%42 = OpLabel +%43 = OpConvertSToF %11 %37 +%44 = OpAccessChain %16 %3 %37 +OpStore %44 %43 +OpBranch %45 +%45 = OpLabel +%46 = OpISub %6 %37 %17 +OpBranch %47 +%47 = OpLabel +OpBranch %49 +%49 = OpLabel +%50 = OpSGreaterThan %10 %46 %9 +OpBranch %51 +%51 = OpLabel +%52 = OpConvertSToF %11 %46 +%53 = OpAccessChain %16 %3 %46 +OpStore %53 %52 +OpBranch %54 +%54 = OpLabel +%55 = OpISub %6 %46 %17 +OpBranch %23 +%23 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(text, output, false); +} + +// clang-format off +// With opt::LocalMultiStoreElimPass +static const std::string multiple_phi_shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource GLSL 410 + OpName %4 "main" + OpName %8 "foo(" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypeFunction %6 + %10 = OpTypePointer Function %6 + %12 = OpConstant %6 0 + %14 = OpConstant %6 3 + %22 = OpConstant %6 6 + %23 = OpTypeBool + %31 = OpConstant %6 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %40 = OpFunctionCall %6 %8 + OpReturn + OpFunctionEnd + %8 = OpFunction %6 None %7 + %9 = OpLabel + OpBranch %16 + %16 = OpLabel + %41 = OpPhi %6 %12 %9 %34 %19 + %42 = OpPhi %6 %14 %9 %29 %19 + %43 = OpPhi %6 %12 %9 %32 %19 + OpLoopMerge %18 %19 Unroll + OpBranch %20 + %20 = OpLabel + %24 = OpSLessThan %23 %43 %22 + OpBranchConditional %24 %17 %18 + %17 = OpLabel + %27 = OpIMul %6 %43 %41 + %29 = OpIAdd %6 %42 %27 + OpBranch %19 + %19 = OpLabel + %32 = OpIAdd %6 %43 %31 + %34 = OpISub %6 %41 %31 + OpBranch %16 + %18 = OpLabel + %37 = OpIAdd %6 %42 %41 + OpReturnValue %37 + OpFunctionEnd + )"; +// clang-format on + +TEST_F(PassClassTest, PartiallyUnrollResidualMultipleInductionVariables) { + // clang-format off +const std::string output = +R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %3 "foo(" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypeFunction %6 +%8 = OpTypePointer Function %6 +%9 = OpConstant %6 0 +%10 = OpConstant %6 3 +%11 = OpConstant %6 6 +%12 = OpTypeBool +%13 = OpConstant %6 1 +%82 = OpTypeInt 32 0 +%83 = OpConstant %82 2 +%2 = OpFunction %4 None %5 +%14 = OpLabel +%15 = OpFunctionCall %6 %3 +OpReturn +OpFunctionEnd +%3 = OpFunction %6 None %7 +%16 = OpLabel +OpBranch %17 +%17 = OpLabel +%18 = OpPhi %6 %9 %16 %19 %20 +%21 = OpPhi %6 %10 %16 %22 %20 +%23 = OpPhi %6 %9 %16 %24 %20 +OpLoopMerge %31 %20 Unroll +OpBranch %26 +%26 = OpLabel +%27 = OpSLessThan %12 %23 %83 +OpBranchConditional %27 %28 %31 +%28 = OpLabel +%29 = OpIMul %6 %23 %18 +%22 = OpIAdd %6 %21 %29 +OpBranch %20 +%20 = OpLabel +%24 = OpIAdd %6 %23 %13 +%19 = OpISub %6 %18 %13 +OpBranch %17 +%31 = OpLabel +OpBranch %32 +%32 = OpLabel +%33 = OpPhi %6 %18 %31 %81 %79 +%34 = OpPhi %6 %21 %31 %78 %79 +%35 = OpPhi %6 %23 %31 %80 %79 +OpLoopMerge %44 %79 DontUnroll +OpBranch %36 +%36 = OpLabel +%37 = OpSLessThan %12 %35 %11 +OpBranchConditional %37 %38 %44 +%38 = OpLabel +%39 = OpIMul %6 %35 %33 +%40 = OpIAdd %6 %34 %39 +OpBranch %41 +%41 = OpLabel +%42 = OpIAdd %6 %35 %13 +%43 = OpISub %6 %33 %13 +OpBranch %46 +%46 = OpLabel +OpBranch %50 +%50 = OpLabel +%51 = OpSLessThan %12 %42 %11 +OpBranch %52 +%52 = OpLabel +%53 = OpIMul %6 %42 %43 +%54 = OpIAdd %6 %40 %53 +OpBranch %55 +%55 = OpLabel +%56 = OpIAdd %6 %42 %13 +%57 = OpISub %6 %43 %13 +OpBranch %58 +%58 = OpLabel +OpBranch %62 +%62 = OpLabel +%63 = OpSLessThan %12 %56 %11 +OpBranch %64 +%64 = OpLabel +%65 = OpIMul %6 %56 %57 +%66 = OpIAdd %6 %54 %65 +OpBranch %67 +%67 = OpLabel +%68 = OpIAdd %6 %56 %13 +%69 = OpISub %6 %57 %13 +OpBranch %70 +%70 = OpLabel +OpBranch %74 +%74 = OpLabel +%75 = OpSLessThan %12 %68 %11 +OpBranch %76 +%76 = OpLabel +%77 = OpIMul %6 %68 %69 +%78 = OpIAdd %6 %66 %77 +OpBranch %79 +%79 = OpLabel +%80 = OpIAdd %6 %68 %13 +%81 = OpISub %6 %69 %13 +OpBranch %32 +%44 = OpLabel +%45 = OpIAdd %6 %34 %33 +OpReturnValue %45 +%25 = OpLabel +%30 = OpIAdd %6 %34 %33 +OpReturnValue %30 +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, multiple_phi_shader, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << multiple_phi_shader << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck>(multiple_phi_shader, output, + false); +} + +TEST_F(PassClassTest, PartiallyUnrollMultipleInductionVariables) { + // clang-format off +const std::string output = +R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %3 "foo(" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypeFunction %6 +%8 = OpTypePointer Function %6 +%9 = OpConstant %6 0 +%10 = OpConstant %6 3 +%11 = OpConstant %6 6 +%12 = OpTypeBool +%13 = OpConstant %6 1 +%2 = OpFunction %4 None %5 +%14 = OpLabel +%15 = OpFunctionCall %6 %3 +OpReturn +OpFunctionEnd +%3 = OpFunction %6 None %7 +%16 = OpLabel +OpBranch %17 +%17 = OpLabel +%18 = OpPhi %6 %9 %16 %42 %40 +%21 = OpPhi %6 %10 %16 %39 %40 +%23 = OpPhi %6 %9 %16 %41 %40 +OpLoopMerge %25 %40 DontUnroll +OpBranch %26 +%26 = OpLabel +%27 = OpSLessThan %12 %23 %11 +OpBranchConditional %27 %28 %25 +%28 = OpLabel +%29 = OpIMul %6 %23 %18 +%22 = OpIAdd %6 %21 %29 +OpBranch %20 +%20 = OpLabel +%24 = OpIAdd %6 %23 %13 +%19 = OpISub %6 %18 %13 +OpBranch %31 +%31 = OpLabel +OpBranch %35 +%35 = OpLabel +%36 = OpSLessThan %12 %24 %11 +OpBranch %37 +%37 = OpLabel +%38 = OpIMul %6 %24 %19 +%39 = OpIAdd %6 %22 %38 +OpBranch %40 +%40 = OpLabel +%41 = OpIAdd %6 %24 %13 +%42 = OpISub %6 %19 %13 +OpBranch %17 +%25 = OpLabel +%30 = OpIAdd %6 %21 %18 +OpReturnValue %30 +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, multiple_phi_shader, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << multiple_phi_shader << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck>(multiple_phi_shader, output, + false); +} + +TEST_F(PassClassTest, FullyUnrollMultipleInductionVariables) { + // clang-format off +const std::string output = +R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 410 +OpName %2 "main" +OpName %3 "foo(" +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpTypeInt 32 1 +%7 = OpTypeFunction %6 +%8 = OpTypePointer Function %6 +%9 = OpConstant %6 0 +%10 = OpConstant %6 3 +%11 = OpConstant %6 6 +%12 = OpTypeBool +%13 = OpConstant %6 1 +%2 = OpFunction %4 None %5 +%14 = OpLabel +%15 = OpFunctionCall %6 %3 +OpReturn +OpFunctionEnd +%3 = OpFunction %6 None %7 +%16 = OpLabel +OpBranch %17 +%17 = OpLabel +OpBranch %26 +%26 = OpLabel +%27 = OpSLessThan %12 %9 %11 +OpBranch %28 +%28 = OpLabel +%29 = OpIMul %6 %9 %9 +%22 = OpIAdd %6 %10 %29 +OpBranch %20 +%20 = OpLabel +%24 = OpIAdd %6 %9 %13 +%19 = OpISub %6 %9 %13 +OpBranch %31 +%31 = OpLabel +OpBranch %35 +%35 = OpLabel +%36 = OpSLessThan %12 %24 %11 +OpBranch %37 +%37 = OpLabel +%38 = OpIMul %6 %24 %19 +%39 = OpIAdd %6 %22 %38 +OpBranch %40 +%40 = OpLabel +%41 = OpIAdd %6 %24 %13 +%42 = OpISub %6 %19 %13 +OpBranch %43 +%43 = OpLabel +OpBranch %47 +%47 = OpLabel +%48 = OpSLessThan %12 %41 %11 +OpBranch %49 +%49 = OpLabel +%50 = OpIMul %6 %41 %42 +%51 = OpIAdd %6 %39 %50 +OpBranch %52 +%52 = OpLabel +%53 = OpIAdd %6 %41 %13 +%54 = OpISub %6 %42 %13 +OpBranch %55 +%55 = OpLabel +OpBranch %59 +%59 = OpLabel +%60 = OpSLessThan %12 %53 %11 +OpBranch %61 +%61 = OpLabel +%62 = OpIMul %6 %53 %54 +%63 = OpIAdd %6 %51 %62 +OpBranch %64 +%64 = OpLabel +%65 = OpIAdd %6 %53 %13 +%66 = OpISub %6 %54 %13 +OpBranch %67 +%67 = OpLabel +OpBranch %71 +%71 = OpLabel +%72 = OpSLessThan %12 %65 %11 +OpBranch %73 +%73 = OpLabel +%74 = OpIMul %6 %65 %66 +%75 = OpIAdd %6 %63 %74 +OpBranch %76 +%76 = OpLabel +%77 = OpIAdd %6 %65 %13 +%78 = OpISub %6 %66 %13 +OpBranch %79 +%79 = OpLabel +OpBranch %83 +%83 = OpLabel +%84 = OpSLessThan %12 %77 %11 +OpBranch %85 +%85 = OpLabel +%86 = OpIMul %6 %77 %78 +%87 = OpIAdd %6 %75 %86 +OpBranch %88 +%88 = OpLabel +%89 = OpIAdd %6 %77 %13 +%90 = OpISub %6 %78 %13 +OpBranch %25 +%25 = OpLabel +%30 = OpIAdd %6 %87 %90 +OpReturnValue %30 +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, multiple_phi_shader, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << multiple_phi_shader << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(multiple_phi_shader, output, false); +} + +/* +Generated from the following GLSL +#version 440 core +void main() +{ + int j = 0; + for (int i = 0; i <= 2; ++i) + ++j; + + for (int i = 1; i >= 0; --i) + ++j; +} +*/ +TEST_F(PassClassTest, FullyUnrollEqualToOperations) { + // clang-format off + // With opt::LocalMultiStoreElimPass + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource GLSL 440 + OpName %4 "main" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %17 = OpConstant %6 2 + %18 = OpTypeBool + %21 = OpConstant %6 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %11 + %11 = OpLabel + %37 = OpPhi %6 %9 %5 %22 %14 + %38 = OpPhi %6 %9 %5 %24 %14 + OpLoopMerge %13 %14 Unroll + OpBranch %15 + %15 = OpLabel + %19 = OpSLessThanEqual %18 %38 %17 + OpBranchConditional %19 %12 %13 + %12 = OpLabel + %22 = OpIAdd %6 %37 %21 + OpBranch %14 + %14 = OpLabel + %24 = OpIAdd %6 %38 %21 + OpBranch %11 + %13 = OpLabel + OpBranch %26 + %26 = OpLabel + %39 = OpPhi %6 %37 %13 %34 %29 + %40 = OpPhi %6 %21 %13 %36 %29 + OpLoopMerge %28 %29 Unroll + OpBranch %30 + %30 = OpLabel + %32 = OpSGreaterThanEqual %18 %40 %9 + OpBranchConditional %32 %27 %28 + %27 = OpLabel + %34 = OpIAdd %6 %39 %21 + OpBranch %29 + %29 = OpLabel + %36 = OpISub %6 %40 %21 + OpBranch %26 + %28 = OpLabel + OpReturn + OpFunctionEnd + )"; + +const std::string output = +R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +OpSource GLSL 440 +OpName %2 "main" +%3 = OpTypeVoid +%4 = OpTypeFunction %3 +%5 = OpTypeInt 32 1 +%6 = OpTypePointer Function %5 +%7 = OpConstant %5 0 +%8 = OpConstant %5 2 +%9 = OpTypeBool +%10 = OpConstant %5 1 +%2 = OpFunction %3 None %4 +%11 = OpLabel +OpBranch %12 +%12 = OpLabel +OpBranch %19 +%19 = OpLabel +%20 = OpSLessThanEqual %9 %7 %8 +OpBranch %21 +%21 = OpLabel +%14 = OpIAdd %5 %7 %10 +OpBranch %15 +%15 = OpLabel +%17 = OpIAdd %5 %7 %10 +OpBranch %41 +%41 = OpLabel +OpBranch %44 +%44 = OpLabel +%45 = OpSLessThanEqual %9 %17 %8 +OpBranch %46 +%46 = OpLabel +%47 = OpIAdd %5 %14 %10 +OpBranch %48 +%48 = OpLabel +%49 = OpIAdd %5 %17 %10 +OpBranch %50 +%50 = OpLabel +OpBranch %53 +%53 = OpLabel +%54 = OpSLessThanEqual %9 %49 %8 +OpBranch %55 +%55 = OpLabel +%56 = OpIAdd %5 %47 %10 +OpBranch %57 +%57 = OpLabel +%58 = OpIAdd %5 %49 %10 +OpBranch %18 +%18 = OpLabel +OpBranch %22 +%22 = OpLabel +OpBranch %29 +%29 = OpLabel +%30 = OpSGreaterThanEqual %9 %10 %7 +OpBranch %31 +%31 = OpLabel +%24 = OpIAdd %5 %56 %10 +OpBranch %25 +%25 = OpLabel +%27 = OpISub %5 %10 %10 +OpBranch %32 +%32 = OpLabel +OpBranch %35 +%35 = OpLabel +%36 = OpSGreaterThanEqual %9 %27 %7 +OpBranch %37 +%37 = OpLabel +%38 = OpIAdd %5 %24 %10 +OpBranch %39 +%39 = OpLabel +%40 = OpISub %5 %27 %10 +OpBranch %28 +%28 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << text << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(text, output, false); +} + +// clang-format off + // With opt::LocalMultiStoreElimPass + const std::string condition_in_header = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %o + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 430 + OpDecorate %o Location 0 + %void = OpTypeVoid + %6 = OpTypeFunction %void + %int = OpTypeInt 32 1 + %int_n2 = OpConstant %int -2 + %int_2 = OpConstant %int 2 + %bool = OpTypeBool + %float = OpTypeFloat 32 +%_ptr_Output_float = OpTypePointer Output %float + %o = OpVariable %_ptr_Output_float Output + %float_1 = OpConstant %float 1 + %main = OpFunction %void None %6 + %15 = OpLabel + OpBranch %16 + %16 = OpLabel + %27 = OpPhi %int %int_n2 %15 %26 %18 + %21 = OpSLessThanEqual %bool %27 %int_2 + OpLoopMerge %17 %18 Unroll + OpBranchConditional %21 %22 %17 + %22 = OpLabel + %23 = OpLoad %float %o + %24 = OpFAdd %float %23 %float_1 + OpStore %o %24 + OpBranch %18 + %18 = OpLabel + %26 = OpIAdd %int %27 %int_2 + OpBranch %16 + %17 = OpLabel + OpReturn + OpFunctionEnd + )"; +//clang-format on + + +TEST_F(PassClassTest, FullyUnrollConditionIsInHeaderBlock) { + +// clang-format off +const std::string output = +R"(OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "main" %2 +OpExecutionMode %1 OriginUpperLeft +OpSource GLSL 430 +OpDecorate %2 Location 0 +%3 = OpTypeVoid +%4 = OpTypeFunction %3 +%5 = OpTypeInt 32 1 +%6 = OpConstant %5 -2 +%7 = OpConstant %5 2 +%8 = OpTypeBool +%9 = OpTypeFloat 32 +%10 = OpTypePointer Output %9 +%2 = OpVariable %10 Output +%11 = OpConstant %9 1 +%1 = OpFunction %3 None %4 +%12 = OpLabel +OpBranch %13 +%13 = OpLabel +%17 = OpSLessThanEqual %8 %6 %7 +OpBranch %19 +%19 = OpLabel +%20 = OpLoad %9 %2 +%21 = OpFAdd %9 %20 %11 +OpStore %2 %21 +OpBranch %16 +%16 = OpLabel +%15 = OpIAdd %5 %6 %7 +OpBranch %22 +%22 = OpLabel +%24 = OpSLessThanEqual %8 %15 %7 +OpBranch %25 +%25 = OpLabel +%26 = OpLoad %9 %2 +%27 = OpFAdd %9 %26 %11 +OpStore %2 %27 +OpBranch %28 +%28 = OpLabel +%29 = OpIAdd %5 %15 %7 +OpBranch %30 +%30 = OpLabel +%32 = OpSLessThanEqual %8 %29 %7 +OpBranch %33 +%33 = OpLabel +%34 = OpLoad %9 %2 +%35 = OpFAdd %9 %34 %11 +OpStore %2 %35 +OpBranch %36 +%36 = OpLabel +%37 = OpIAdd %5 %29 %7 +OpBranch %18 +%18 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, condition_in_header, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << condition_in_header << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck(condition_in_header, output, false); +} + +TEST_F(PassClassTest, PartiallyUnrollResidualConditionIsInHeaderBlock) { + // clang-format off +const std::string output = +R"(OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "main" %2 +OpExecutionMode %1 OriginUpperLeft +OpSource GLSL 430 +OpDecorate %2 Location 0 +%3 = OpTypeVoid +%4 = OpTypeFunction %3 +%5 = OpTypeInt 32 1 +%6 = OpConstant %5 -2 +%7 = OpConstant %5 2 +%8 = OpTypeBool +%9 = OpTypeFloat 32 +%10 = OpTypePointer Output %9 +%2 = OpVariable %10 Output +%11 = OpConstant %9 1 +%40 = OpTypeInt 32 0 +%41 = OpConstant %40 1 +%1 = OpFunction %3 None %4 +%12 = OpLabel +OpBranch %13 +%13 = OpLabel +%14 = OpPhi %5 %6 %12 %15 %16 +%17 = OpSLessThanEqual %8 %14 %41 +OpLoopMerge %22 %16 Unroll +OpBranchConditional %17 %19 %22 +%19 = OpLabel +%20 = OpLoad %9 %2 +%21 = OpFAdd %9 %20 %11 +OpStore %2 %21 +OpBranch %16 +%16 = OpLabel +%15 = OpIAdd %5 %14 %7 +OpBranch %13 +%22 = OpLabel +OpBranch %23 +%23 = OpLabel +%24 = OpPhi %5 %14 %22 %39 %38 +%25 = OpSLessThanEqual %8 %24 %7 +OpLoopMerge %31 %38 DontUnroll +OpBranchConditional %25 %26 %31 +%26 = OpLabel +%27 = OpLoad %9 %2 +%28 = OpFAdd %9 %27 %11 +OpStore %2 %28 +OpBranch %29 +%29 = OpLabel +%30 = OpIAdd %5 %24 %7 +OpBranch %32 +%32 = OpLabel +%34 = OpSLessThanEqual %8 %30 %7 +OpBranch %35 +%35 = OpLabel +%36 = OpLoad %9 %2 +%37 = OpFAdd %9 %36 %11 +OpStore %2 %37 +OpBranch %38 +%38 = OpLabel +%39 = OpIAdd %5 %30 %7 +OpBranch %23 +%31 = OpLabel +OpReturn +%18 = OpLabel +OpReturn +OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, condition_in_header, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for ushader:\n" + << condition_in_header << std::endl; + + opt::LoopUnroller loop_unroller; + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); + SinglePassRunAndCheck>(condition_in_header, output, + false); +} + +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/unswitch.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/unswitch.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/loop_optimizations/unswitch.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/loop_optimizations/unswitch.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,914 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include + +#ifdef SPIRV_EFFCEE +#include "effcee/effcee.h" +#endif + +#include "../pass_fixture.h" + +namespace { + +using namespace spvtools; + +using UnswitchTest = PassTest<::testing::Test>; + +#ifdef SPIRV_EFFCEE + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 450 core +uniform vec4 c; +void main() { + int i = 0; + int j = 0; + bool cond = c[0] == 0; + for (; i < 10; i++, j++) { + if (cond) { + i++; + } + else { + j++; + } + } +} +*/ +TEST_F(UnswitchTest, SimpleUnswitch) { + const std::string text = R"( +; CHECK: [[cst_cond:%\w+]] = OpFOrdEqual +; CHECK-NEXT: OpSelectionMerge [[if_merge:%\w+]] None +; CHECK-NEXT: OpBranchConditional [[cst_cond]] [[loop_t:%\w+]] [[loop_f:%\w+]] + +; Loop specialized for false. +; CHECK: [[loop_f]] = OpLabel +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_f]] [[iv_i:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: [[phi_j:%\w+]] = OpPhi %int %int_0 [[loop_f]] [[iv_j:%\w+]] [[continue]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] +; Check that we have i+=1 and j+=2. +; CHECK: [[phi_j:%\w+]] = OpIAdd %int [[phi_j]] %int_1 +; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK: [[iv_j]] = OpIAdd %int [[phi_j]] %int_1 +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpBranch [[if_merge]] + +; Loop specialized for true. +; CHECK: [[loop_t]] = OpLabel +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_i:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: [[phi_j:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_j:%\w+]] [[continue]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] +; Check that we have i+=2 and j+=1. +; CHECK: [[phi_i:%\w+]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK: [[iv_j]] = OpIAdd %int [[phi_j]] %int_1 +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpBranch [[if_merge]] + +; CHECK: [[if_merge]] = OpLabel +; CHECK-NEXT: OpReturn + + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginLowerLeft + OpSource GLSL 450 + OpName %main "main" + OpName %c "c" + OpDecorate %c Location 0 + OpDecorate %c DescriptorSet 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %bool = OpTypeBool +%_ptr_Function_bool = OpTypePointer Function %bool + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_UniformConstant_v4float = OpTypePointer UniformConstant %v4float + %c = OpVariable %_ptr_UniformConstant_v4float UniformConstant + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_UniformConstant_float = OpTypePointer UniformConstant %float + %float_0 = OpConstant %float 0 + %int_10 = OpConstant %int 10 + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %3 + %5 = OpLabel + %21 = OpAccessChain %_ptr_UniformConstant_float %c %uint_0 + %22 = OpLoad %float %21 + %24 = OpFOrdEqual %bool %22 %float_0 + OpBranch %25 + %25 = OpLabel + %46 = OpPhi %int %int_0 %5 %43 %28 + %47 = OpPhi %int %int_0 %5 %45 %28 + OpLoopMerge %27 %28 None + OpBranch %29 + %29 = OpLabel + %32 = OpSLessThan %bool %46 %int_10 + OpBranchConditional %32 %26 %27 + %26 = OpLabel + OpSelectionMerge %35 None + OpBranchConditional %24 %34 %39 + %34 = OpLabel + %38 = OpIAdd %int %46 %int_1 + OpBranch %35 + %39 = OpLabel + %41 = OpIAdd %int %47 %int_1 + OpBranch %35 + %35 = OpLabel + %48 = OpPhi %int %38 %34 %46 %39 + %49 = OpPhi %int %47 %34 %41 %39 + OpBranch %28 + %28 = OpLabel + %43 = OpIAdd %int %48 %int_1 + %45 = OpIAdd %int %49 %int_1 + OpBranch %25 + %27 = OpLabel + OpReturn + OpFunctionEnd + )"; + + SinglePassRunAndMatch(text, true); +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 330 core +in vec4 c; +void main() { + int i = 0; + bool cond = c[0] == 0; + for (; i < 10; i++) { + if (cond) { + i++; + } + else { + return; + } + } +} +*/ +TEST_F(UnswitchTest, UnswitchExit) { + const std::string text = R"( +; CHECK: [[cst_cond:%\w+]] = OpFOrdEqual +; CHECK-NEXT: OpSelectionMerge [[if_merge:%\w+]] None +; CHECK-NEXT: OpBranchConditional [[cst_cond]] [[loop_t:%\w+]] [[loop_f:%\w+]] + +; Loop specialized for false. +; CHECK: [[loop_f]] = OpLabel +; CHECK: OpReturn + +; Loop specialized for true. +; CHECK: [[loop_t]] = OpLabel +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_i:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] +; Check that we have i+=2. +; CHECK: [[phi_i:%\w+]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpBranch [[if_merge]] + +; CHECK: [[if_merge]] = OpLabel +; CHECK-NEXT: OpReturn + + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %c + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 330 + OpName %main "main" + OpName %c "c" + OpDecorate %c Location 0 + OpDecorate %23 Uniform + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %bool = OpTypeBool +%_ptr_Function_bool = OpTypePointer Function %bool + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_Input_v4float = OpTypePointer Input %v4float + %c = OpVariable %_ptr_Input_v4float Input + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Input_float = OpTypePointer Input %float + %float_0 = OpConstant %float 0 + %int_10 = OpConstant %int 10 + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %3 + %5 = OpLabel + %20 = OpAccessChain %_ptr_Input_float %c %uint_0 + %21 = OpLoad %float %20 + %23 = OpFOrdEqual %bool %21 %float_0 + OpBranch %24 + %24 = OpLabel + %42 = OpPhi %int %int_0 %5 %41 %27 + OpLoopMerge %26 %27 None + OpBranch %28 + %28 = OpLabel + %31 = OpSLessThan %bool %42 %int_10 + OpBranchConditional %31 %25 %26 + %25 = OpLabel + OpSelectionMerge %34 None + OpBranchConditional %23 %33 %38 + %33 = OpLabel + %37 = OpIAdd %int %42 %int_1 + OpBranch %34 + %38 = OpLabel + OpReturn + %34 = OpLabel + OpBranch %27 + %27 = OpLabel + %41 = OpIAdd %int %37 %int_1 + OpBranch %24 + %26 = OpLabel + OpReturn + OpFunctionEnd + )"; + + SinglePassRunAndMatch(text, true); +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 330 core +in vec4 c; +void main() { + int i = 0; + bool cond = c[0] == 0; + for (; i < 10; i++) { + if (cond) { + continue; + } + else { + i++; + } + } +} +*/ +TEST_F(UnswitchTest, UnswitchContinue) { + const std::string text = R"( +; CHECK: [[cst_cond:%\w+]] = OpFOrdEqual +; CHECK-NEXT: OpSelectionMerge [[if_merge:%\w+]] None +; CHECK-NEXT: OpBranchConditional [[cst_cond]] [[loop_t:%\w+]] [[loop_f:%\w+]] + +; Loop specialized for false. +; CHECK: [[loop_f]] = OpLabel +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_f]] [[iv_i:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] +; Check that we have i+=2. +; CHECK: [[phi_i:%\w+]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpBranch [[if_merge]] + +; Loop specialized for true. +; CHECK: [[loop_t]] = OpLabel +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_i:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] +; Check that we have i+=1. +; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpBranch [[if_merge]] + +; CHECK: [[if_merge]] = OpLabel +; CHECK-NEXT: OpReturn + + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %c + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 330 + OpName %main "main" + OpName %c "c" + OpDecorate %c Location 0 + OpDecorate %23 Uniform + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %bool = OpTypeBool +%_ptr_Function_bool = OpTypePointer Function %bool + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_Input_v4float = OpTypePointer Input %v4float + %c = OpVariable %_ptr_Input_v4float Input + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Input_float = OpTypePointer Input %float + %float_0 = OpConstant %float 0 + %int_10 = OpConstant %int 10 + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %3 + %5 = OpLabel + %20 = OpAccessChain %_ptr_Input_float %c %uint_0 + %21 = OpLoad %float %20 + %23 = OpFOrdEqual %bool %21 %float_0 + OpBranch %24 + %24 = OpLabel + %42 = OpPhi %int %int_0 %5 %41 %27 + OpLoopMerge %26 %27 None + OpBranch %28 + %28 = OpLabel + %31 = OpSLessThan %bool %42 %int_10 + OpBranchConditional %31 %25 %26 + %25 = OpLabel + OpSelectionMerge %34 None + OpBranchConditional %23 %33 %36 + %33 = OpLabel + OpBranch %27 + %36 = OpLabel + %39 = OpIAdd %int %42 %int_1 + OpBranch %34 + %34 = OpLabel + OpBranch %27 + %27 = OpLabel + %43 = OpPhi %int %42 %33 %39 %34 + %41 = OpIAdd %int %43 %int_1 + OpBranch %24 + %26 = OpLabel + OpReturn + OpFunctionEnd + )"; + + SinglePassRunAndMatch(text, true); +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 330 core +in vec4 c; +void main() { + int i = 0; + bool cond = c[0] == 0; + for (; i < 10; i++) { + if (cond) { + i++; + } + else { + break; + } + } +} +*/ +TEST_F(UnswitchTest, UnswitchKillLoop) { + const std::string text = R"( +; CHECK: [[cst_cond:%\w+]] = OpFOrdEqual +; CHECK-NEXT: OpSelectionMerge [[if_merge:%\w+]] None +; CHECK-NEXT: OpBranchConditional [[cst_cond]] [[loop_t:%\w+]] [[loop_f:%\w+]] + +; Loop specialized for false. +; CHECK: [[loop_f]] = OpLabel +; CHECK: OpBranch [[if_merge]] + +; Loop specialized for true. +; CHECK: [[loop_t]] = OpLabel +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_i:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] +; Check that we have i+=2. +; CHECK: [[phi_i:%\w+]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpBranch [[if_merge]] + +; CHECK: [[if_merge]] = OpLabel +; CHECK-NEXT: OpReturn + + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %c + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 330 + OpName %main "main" + OpName %c "c" + OpDecorate %c Location 0 + OpDecorate %23 Uniform + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %bool = OpTypeBool +%_ptr_Function_bool = OpTypePointer Function %bool + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_Input_v4float = OpTypePointer Input %v4float + %c = OpVariable %_ptr_Input_v4float Input + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Input_float = OpTypePointer Input %float + %float_0 = OpConstant %float 0 + %int_10 = OpConstant %int 10 + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %3 + %5 = OpLabel + %20 = OpAccessChain %_ptr_Input_float %c %uint_0 + %21 = OpLoad %float %20 + %23 = OpFOrdEqual %bool %21 %float_0 + OpBranch %24 + %24 = OpLabel + %42 = OpPhi %int %int_0 %5 %41 %27 + OpLoopMerge %26 %27 None + OpBranch %28 + %28 = OpLabel + %31 = OpSLessThan %bool %42 %int_10 + OpBranchConditional %31 %25 %26 + %25 = OpLabel + OpSelectionMerge %34 None + OpBranchConditional %23 %33 %38 + %33 = OpLabel + %37 = OpIAdd %int %42 %int_1 + OpBranch %34 + %38 = OpLabel + OpBranch %26 + %34 = OpLabel + OpBranch %27 + %27 = OpLabel + %41 = OpIAdd %int %37 %int_1 + OpBranch %24 + %26 = OpLabel + OpReturn + OpFunctionEnd + )"; + + SinglePassRunAndMatch(text, true); +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 330 core +in vec4 c; +void main() { + int i = 0; + int cond = int(c[0]); + for (; i < 10; i++) { + switch (cond) { + case 0: + return; + case 1: + discard; + case 2: + break; + default: + break; + } + } + bool cond2 = i == 9; +} +*/ +TEST_F(UnswitchTest, UnswitchSwitch) { + const std::string text = R"( +; CHECK: [[cst_cond:%\w+]] = OpConvertFToS +; CHECK-NEXT: OpSelectionMerge [[if_merge:%\w+]] None +; CHECK-NEXT: OpSwitch [[cst_cond]] [[default:%\w+]] 0 [[loop_0:%\w+]] 1 [[loop_1:%\w+]] 2 [[loop_2:%\w+]] + +; Loop specialized for 2. +; CHECK: [[loop_2]] = OpLabel +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_2]] [[iv_i:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] +; Check that we have i+=1. +; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK: OpBranch [[loop]] + +; Loop specialized for 1. +; CHECK: [[loop_1]] = OpLabel +; CHECK: OpKill + +; Loop specialized for 0. +; CHECK: [[loop_0]] = OpLabel +; CHECK: OpReturn + +; Loop specialized for the default case. +; CHECK: [[default]] = OpLabel +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[default]] [[iv_i:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] +; Check that we have i+=1. +; CHECK: [[phi_i:%\w+]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK: OpBranch [[loop]] + +; CHECK: [[if_merge]] = OpLabel +; CHECK-NEXT: OpReturn + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %c + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 330 + OpName %main "main" + OpName %c "c" + OpDecorate %c Location 0 + OpDecorate %20 Uniform + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_Input_v4float = OpTypePointer Input %v4float + %c = OpVariable %_ptr_Input_v4float Input + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Input_float = OpTypePointer Input %float + %int_10 = OpConstant %int 10 + %bool = OpTypeBool + %int_1 = OpConstant %int 1 +%_ptr_Function_bool = OpTypePointer Function %bool + %main = OpFunction %void None %3 + %5 = OpLabel + %18 = OpAccessChain %_ptr_Input_float %c %uint_0 + %19 = OpLoad %float %18 + %20 = OpConvertFToS %int %19 + OpBranch %21 + %21 = OpLabel + %49 = OpPhi %int %int_0 %5 %43 %24 + OpLoopMerge %23 %24 None + OpBranch %25 + %25 = OpLabel + %29 = OpSLessThan %bool %49 %int_10 + OpBranchConditional %29 %22 %23 + %22 = OpLabel + OpSelectionMerge %35 None + OpSwitch %20 %34 0 %31 1 %32 2 %33 + %34 = OpLabel + OpBranch %35 + %31 = OpLabel + OpReturn + %32 = OpLabel + OpKill + %33 = OpLabel + OpBranch %35 + %35 = OpLabel + OpBranch %24 + %24 = OpLabel + %43 = OpIAdd %int %49 %int_1 + OpBranch %21 + %23 = OpLabel + OpReturn + OpFunctionEnd + )"; + + SinglePassRunAndMatch(text, true); +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 440 core +layout(location = 0)in vec4 c; +void main() { + int i = 0; + int j = 0; + int k = 0; + bool cond = c[0] == 0; + for (; i < 10; i++) { + for (; j < 10; j++) { + if (cond) { + i++; + } else { + j++; + } + } + } + for (; k < 10; k++) { + if (cond) { + k++; + } + } +} +*/ +TEST_F(UnswitchTest, UnSwitchNested) { + const std::string text = R"( +; CHECK: [[cst_cond:%\w+]] = OpFOrdEqual +; CHECK-NEXT: OpSelectionMerge [[if_merge:%\w+]] None +; CHECK-NEXT: OpBranchConditional [[cst_cond]] [[loop_t:%\w+]] [[loop_f:%\w+]] + +; Loop specialized for false, one loop is killed, j won't change anymore. +; CHECK: [[loop_f]] = OpLabel +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_f]] [[iv_i:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: [[phi_j:%\w+]] = OpPhi %int %int_0 [[loop_f]] [[iv_j:%\w+]] [[continue]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK-NEXT: OpBranch [[loop]] +; CHECK: OpReturn + +; Loop specialized for true. +; CHECK: [[loop_t]] = OpLabel +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_i:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: [[phi_j:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_j:%\w+]] [[continue]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] [[pre_loop_inner:%\w+]] [[merge]] + +; CHECK: [[pre_loop_inner]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_inner:%\w+]] +; CHECK-NEXT: [[loop_inner]] = OpLabel +; CHECK-NEXT: [[phi2_i:%\w+]] = OpPhi %int [[phi_i]] [[pre_loop_inner]] [[iv2_i:%\w+]] [[continue2:%\w+]] +; CHECK-NEXT: [[phi2_j:%\w+]] = OpPhi %int [[phi_j]] [[pre_loop_inner]] [[iv2_j:%\w+]] [[continue2]] +; CHECK-NEXT: OpLoopMerge [[merge2:%\w+]] [[continue2]] None + +; CHECK: OpBranch [[continue2]] +; CHECK: [[merge2]] = OpLabel +; CHECK: OpBranch [[continue]] +; CHECK: [[merge]] = OpLabel + +; Unswitched double nested loop is done. Test the single remaining one. + +; CHECK: [[if_merge]] = OpLabel +; CHECK-NEXT: OpSelectionMerge [[if_merge:%\w+]] None +; CHECK-NEXT: OpBranchConditional [[cst_cond]] [[loop_t:%\w+]] [[loop_f:%\w+]] + +; Loop specialized for false. +; CHECK: [[loop_f]] = OpLabel +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_k:%\w+]] = OpPhi %int %int_0 [[loop_f]] [[iv_k:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_k]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] +; Check that we have k+=1 +; CHECK: [[iv_k]] = OpIAdd %int [[phi_k]] %int_1 +; CHECK: OpBranch [[loop]] +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpBranch [[if_merge]] + +; Loop specialized for true. +; CHECK: [[loop_t]] = OpLabel +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_k:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_k:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_k]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] +; Check that we have k+=2. +; CHECK: [[tmp_k:%\w+]] = OpIAdd %int [[phi_k]] %int_1 +; CHECK: [[iv_k]] = OpIAdd %int [[tmp_k]] %int_1 +; CHECK: OpBranch [[loop]] +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpBranch [[if_merge]] + +; CHECK: [[if_merge]] = OpLabel +; CHECK-NEXT: OpReturn + + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %c + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 440 + OpName %main "main" + OpName %c "c" + OpDecorate %c Location 0 + OpDecorate %25 Uniform + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %bool = OpTypeBool +%_ptr_Function_bool = OpTypePointer Function %bool + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_Input_v4float = OpTypePointer Input %v4float + %c = OpVariable %_ptr_Input_v4float Input + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Input_float = OpTypePointer Input %float + %float_0 = OpConstant %float 0 + %int_10 = OpConstant %int 10 + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %3 + %5 = OpLabel + %22 = OpAccessChain %_ptr_Input_float %c %uint_0 + %23 = OpLoad %float %22 + %25 = OpFOrdEqual %bool %23 %float_0 + OpBranch %26 + %26 = OpLabel + %67 = OpPhi %int %int_0 %5 %52 %29 + %68 = OpPhi %int %int_0 %5 %70 %29 + OpLoopMerge %28 %29 None + OpBranch %30 + %30 = OpLabel + %33 = OpSLessThan %bool %67 %int_10 + OpBranchConditional %33 %27 %28 + %27 = OpLabel + OpBranch %34 + %34 = OpLabel + %69 = OpPhi %int %67 %27 %46 %37 + %70 = OpPhi %int %68 %27 %50 %37 + OpLoopMerge %36 %37 None + OpBranch %38 + %38 = OpLabel + %40 = OpSLessThan %bool %70 %int_10 + OpBranchConditional %40 %35 %36 + %35 = OpLabel + OpSelectionMerge %43 None + OpBranchConditional %25 %42 %47 + %42 = OpLabel + %46 = OpIAdd %int %69 %int_1 + OpBranch %43 + %47 = OpLabel + OpReturn + %43 = OpLabel + OpBranch %37 + %37 = OpLabel + %50 = OpIAdd %int %70 %int_1 + OpBranch %34 + %36 = OpLabel + OpBranch %29 + %29 = OpLabel + %52 = OpIAdd %int %69 %int_1 + OpBranch %26 + %28 = OpLabel + OpBranch %53 + %53 = OpLabel + %71 = OpPhi %int %int_0 %28 %66 %56 + OpLoopMerge %55 %56 None + OpBranch %57 + %57 = OpLabel + %59 = OpSLessThan %bool %71 %int_10 + OpBranchConditional %59 %54 %55 + %54 = OpLabel + OpSelectionMerge %62 None + OpBranchConditional %25 %61 %62 + %61 = OpLabel + %64 = OpIAdd %int %71 %int_1 + OpBranch %62 + %62 = OpLabel + %72 = OpPhi %int %71 %54 %64 %61 + OpBranch %56 + %56 = OpLabel + %66 = OpIAdd %int %72 %int_1 + OpBranch %53 + %55 = OpLabel + OpReturn + OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} +#endif // SPIRV_EFFCEE + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 330 core +in vec4 c; +void main() { + bool cond = false; + if (c[0] == 0) { + cond = c[1] == 0; + } else { + cond = c[2] == 0; + } + for (int i = 0; i < 10; i++) { + if (cond) { + i++; + } + } +} +*/ +TEST_F(UnswitchTest, UnswitchNotUniform) { + // Check that the unswitch is not triggered (condition loop invariant but not + // uniform) + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %c + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 330 + OpName %main "main" + OpName %c "c" + OpDecorate %c Location 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %bool = OpTypeBool +%_ptr_Function_bool = OpTypePointer Function %bool + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_Input_v4float = OpTypePointer Input %v4float + %c = OpVariable %_ptr_Input_v4float Input + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Input_float = OpTypePointer Input %float + %float_0 = OpConstant %float 0 + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %int_10 = OpConstant %int 10 + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %3 + %5 = OpLabel + %17 = OpAccessChain %_ptr_Input_float %c %uint_0 + %18 = OpLoad %float %17 + %20 = OpFOrdEqual %bool %18 %float_0 + OpSelectionMerge %22 None + OpBranchConditional %20 %21 %27 + %21 = OpLabel + %24 = OpAccessChain %_ptr_Input_float %c %uint_1 + %25 = OpLoad %float %24 + %26 = OpFOrdEqual %bool %25 %float_0 + OpBranch %22 + %27 = OpLabel + %29 = OpAccessChain %_ptr_Input_float %c %uint_2 + %30 = OpLoad %float %29 + %31 = OpFOrdEqual %bool %30 %float_0 + OpBranch %22 + %22 = OpLabel + %52 = OpPhi %bool %26 %21 %31 %27 + OpBranch %36 + %36 = OpLabel + %53 = OpPhi %int %int_0 %22 %51 %39 + OpLoopMerge %38 %39 None + OpBranch %40 + %40 = OpLabel + %43 = OpSLessThan %bool %53 %int_10 + OpBranchConditional %43 %37 %38 + %37 = OpLabel + OpSelectionMerge %46 None + OpBranchConditional %52 %45 %46 + %45 = OpLabel + %49 = OpIAdd %int %53 %int_1 + OpBranch %46 + %46 = OpLabel + %54 = OpPhi %int %53 %37 %49 %45 + OpBranch %39 + %39 = OpLabel + %51 = OpIAdd %int %54 %int_1 + OpBranch %36 + %38 = OpLabel + OpReturn + OpFunctionEnd + )"; + + auto result = + SinglePassRunAndDisassemble(text, true, false); + + EXPECT_EQ(opt::Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} + +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/pass_merge_return_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/pass_merge_return_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/pass_merge_return_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/pass_merge_return_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -257,9 +257,24 @@ SinglePassRunAndCheck(before, after, false, true); } -TEST_F(MergeReturnPassTest, StructuredControlFlowNOP) { +#ifdef SPIRV_EFFCEE +TEST_F(MergeReturnPassTest, StructuredControlFlowWithUnreachableMerge) { const std::string before = - R"(OpCapability Addresses + R"( +; CHECK: [[false:%\w+]] = OpConstantFalse +; CHECK: [[true:%\w+]] = OpConstantTrue +; CHECK: OpFunction +; CHECK: [[var:%\w+]] = OpVariable [[:%\w+]] Function [[false]] +; CHECK: OpSelectionMerge [[merge_lab:%\w+]] +; CHECK: OpBranchConditional [[cond:%\w+]] [[if_lab:%\w+]] [[then_lab:%\w+]] +; CHECK: [[if_lab]] = OpLabel +; CHECK-Next: OpStore [[var]] [[true]] +; CHECK-Next: OpBranch +; CHECK: [[then_lab]] = OpLabel +; CHECK-Next: OpStore [[var]] [[true]] +; CHECK-Next: OpBranch [[merge_lab]] +; CHECK: OpReturn +OpCapability Addresses OpCapability Shader OpCapability Linkage OpMemoryModel Logical GLSL450 @@ -281,11 +296,411 @@ OpFunctionEnd )"; - const std::string after = before; + SinglePassRunAndMatch(before, false); +} + +TEST_F(MergeReturnPassTest, StructuredControlFlowAddPhi) { + const std::string before = + R"( +; CHECK: [[false:%\w+]] = OpConstantFalse +; CHECK: [[true:%\w+]] = OpConstantTrue +; CHECK: OpFunction +; CHECK: [[var:%\w+]] = OpVariable [[:%\w+]] Function [[false]] +; CHECK: OpSelectionMerge [[merge_lab:%\w+]] +; CHECK: OpBranchConditional [[cond:%\w+]] [[if_lab:%\w+]] [[then_lab:%\w+]] +; CHECK: [[if_lab]] = OpLabel +; CHECK-NEXT: [[add:%\w+]] = OpIAdd [[type:%\w+]] +; CHECK-Next: OpStore [[var]] [[true]] +; CHECK-Next: OpBranch +; CHECK: [[then_lab]] = OpLabel +; CHECK-Next: OpStore [[var]] [[true]] +; CHECK-Next: OpBranch [[merge_lab]] +; CHECK: [[merge_lab]] = OpLabel +; CHECK-NEXT: [[phi:%\w+]] = OpPhi [[type]] [[add]] [[if_lab]] [[undef:%\w+]] [[then_lab]] +; CHECK: OpIAdd [[type]] [[phi]] [[phi]] +; CHECK: OpReturn +OpCapability Addresses +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %6 "simple_shader" +%2 = OpTypeVoid +%3 = OpTypeBool +%int = OpTypeInt 32 0 +%int_0 = OpConstant %int 0 +%4 = OpConstantFalse %3 +%1 = OpTypeFunction %2 +%6 = OpFunction %2 None %1 +%7 = OpLabel +OpSelectionMerge %10 None +OpBranchConditional %4 %8 %9 +%8 = OpLabel +%11 = OpIAdd %int %int_0 %int_0 +OpBranch %10 +%9 = OpLabel +OpReturn +%10 = OpLabel +%12 = OpIAdd %int %11 %11 +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(before, false); +} +#endif + +TEST_F(MergeReturnPassTest, StructuredControlFlowBothMergeAndHeader) { + const std::string before = + R"(OpCapability Addresses + OpCapability Shader + OpCapability Linkage + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %1 "simple_shader" + %2 = OpTypeVoid + %3 = OpTypeBool + %4 = OpTypeInt 32 0 + %5 = OpConstant %4 0 + %6 = OpConstantFalse %3 + %7 = OpTypeFunction %2 + %1 = OpFunction %2 None %7 + %8 = OpLabel + OpSelectionMerge %9 None + OpBranchConditional %6 %10 %11 + %10 = OpLabel + OpReturn + %11 = OpLabel + OpBranch %9 + %9 = OpLabel + OpLoopMerge %12 %13 None + OpBranch %13 + %13 = OpLabel + %14 = OpIAdd %4 %5 %5 + OpBranchConditional %6 %9 %12 + %12 = OpLabel + %15 = OpIAdd %4 %14 %14 + OpReturn + OpFunctionEnd +)"; + + const std::string after = + R"(OpCapability Addresses +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %1 "simple_shader" +%void = OpTypeVoid +%bool = OpTypeBool +%uint = OpTypeInt 32 0 +%uint_0 = OpConstant %uint 0 +%false = OpConstantFalse %bool +%7 = OpTypeFunction %void +%_ptr_Function_bool = OpTypePointer Function %bool +%true = OpConstantTrue %bool +%1 = OpFunction %void None %7 +%8 = OpLabel +%18 = OpVariable %_ptr_Function_bool Function %false +OpSelectionMerge %9 None +OpBranchConditional %false %10 %11 +%10 = OpLabel +OpStore %18 %true +OpBranch %9 +%11 = OpLabel +OpBranch %9 +%9 = OpLabel +%23 = OpLoad %bool %18 +OpSelectionMerge %22 None +OpBranchConditional %23 %22 %21 +%21 = OpLabel +OpBranch %20 +%20 = OpLabel +OpLoopMerge %12 %13 None +OpBranch %13 +%13 = OpLabel +%14 = OpIAdd %uint %uint_0 %uint_0 +OpBranchConditional %false %20 %12 +%12 = OpLabel +%15 = OpIAdd %uint %14 %14 +OpStore %18 %true +OpBranch %22 +%22 = OpLabel +OpBranch %16 +%16 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndCheck(before, after, false, true); +} + +TEST_F(MergeReturnPassTest, NestedSelectionMerge) { + const std::string before = + R"( + OpCapability Addresses + OpCapability Shader + OpCapability Linkage + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %1 "simple_shader" + %void = OpTypeVoid + %bool = OpTypeBool + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 + %false = OpConstantFalse %bool + %7 = OpTypeFunction %void + %1 = OpFunction %void None %7 + %8 = OpLabel + OpSelectionMerge %9 None + OpBranchConditional %false %10 %11 + %10 = OpLabel + OpReturn + %11 = OpLabel + OpSelectionMerge %12 None + OpBranchConditional %false %14 %15 + %14 = OpLabel + %16 = OpIAdd %uint %uint_0 %uint_0 + OpBranch %12 + %15 = OpLabel + OpReturn + %12 = OpLabel + OpBranch %9 + %9 = OpLabel + %17 = OpIAdd %uint %16 %16 + OpReturn + OpFunctionEnd +)"; + + const std::string after = + R"(OpCapability Addresses +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %1 "simple_shader" +%void = OpTypeVoid +%bool = OpTypeBool +%uint = OpTypeInt 32 0 +%uint_0 = OpConstant %uint 0 +%false = OpConstantFalse %bool +%7 = OpTypeFunction %void +%_ptr_Function_bool = OpTypePointer Function %bool +%true = OpConstantTrue %bool +%24 = OpUndef %uint +%1 = OpFunction %void None %7 +%8 = OpLabel +%19 = OpVariable %_ptr_Function_bool Function %false +OpSelectionMerge %9 None +OpBranchConditional %false %10 %11 +%10 = OpLabel +OpStore %19 %true +OpBranch %9 +%11 = OpLabel +OpSelectionMerge %12 None +OpBranchConditional %false %13 %14 +%13 = OpLabel +%15 = OpIAdd %uint %uint_0 %uint_0 +OpBranch %12 +%14 = OpLabel +OpStore %19 %true +OpBranch %12 +%12 = OpLabel +%25 = OpPhi %uint %15 %13 %24 %14 +OpBranch %9 +%9 = OpLabel +%26 = OpPhi %uint %25 %12 %24 %10 +%23 = OpLoad %bool %19 +OpSelectionMerge %22 None +OpBranchConditional %23 %22 %21 +%21 = OpLabel +%16 = OpIAdd %uint %26 %26 +OpStore %19 %true +OpBranch %22 +%22 = OpLabel +OpBranch %17 +%17 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndCheck(before, after, false, true); +} + +// This is essentially the same as NestedSelectionMerge, except +// the order of the first branch is changed. This is to make sure things +// work even if the order of the traversals change. +TEST_F(MergeReturnPassTest, NestedSelectionMerge2) { + const std::string before = + R"( + OpCapability Addresses + OpCapability Shader + OpCapability Linkage + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %1 "simple_shader" + %void = OpTypeVoid + %bool = OpTypeBool + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 + %false = OpConstantFalse %bool + %7 = OpTypeFunction %void + %1 = OpFunction %void None %7 + %8 = OpLabel + OpSelectionMerge %9 None + OpBranchConditional %false %10 %11 + %11 = OpLabel + OpReturn + %10 = OpLabel + OpSelectionMerge %12 None + OpBranchConditional %false %14 %15 + %14 = OpLabel + %16 = OpIAdd %uint %uint_0 %uint_0 + OpBranch %12 + %15 = OpLabel + OpReturn + %12 = OpLabel + OpBranch %9 + %9 = OpLabel + %17 = OpIAdd %uint %16 %16 + OpReturn + OpFunctionEnd +)"; + + const std::string after = + R"(OpCapability Addresses +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %1 "simple_shader" +%void = OpTypeVoid +%bool = OpTypeBool +%uint = OpTypeInt 32 0 +%uint_0 = OpConstant %uint 0 +%false = OpConstantFalse %bool +%7 = OpTypeFunction %void +%_ptr_Function_bool = OpTypePointer Function %bool +%true = OpConstantTrue %bool +%24 = OpUndef %uint +%1 = OpFunction %void None %7 +%8 = OpLabel +%19 = OpVariable %_ptr_Function_bool Function %false +OpSelectionMerge %9 None +OpBranchConditional %false %10 %11 +%11 = OpLabel +OpStore %19 %true +OpBranch %9 +%10 = OpLabel +OpSelectionMerge %12 None +OpBranchConditional %false %13 %14 +%13 = OpLabel +%15 = OpIAdd %uint %uint_0 %uint_0 +OpBranch %12 +%14 = OpLabel +OpStore %19 %true +OpBranch %12 +%12 = OpLabel +%25 = OpPhi %uint %15 %13 %24 %14 +OpBranch %9 +%9 = OpLabel +%26 = OpPhi %uint %25 %12 %24 %11 +%23 = OpLoad %bool %19 +OpSelectionMerge %22 None +OpBranchConditional %23 %22 %21 +%21 = OpLabel +%16 = OpIAdd %uint %26 %26 +OpStore %19 %true +OpBranch %22 +%22 = OpLabel +OpBranch %17 +%17 = OpLabel +OpReturn +OpFunctionEnd +)"; - SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); - SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); SinglePassRunAndCheck(before, after, false, true); } +TEST_F(MergeReturnPassTest, NestedSelectionMerge3) { + const std::string before = + R"( + OpCapability Addresses + OpCapability Shader + OpCapability Linkage + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %1 "simple_shader" + %void = OpTypeVoid + %bool = OpTypeBool + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 + %false = OpConstantFalse %bool + %7 = OpTypeFunction %void + %1 = OpFunction %void None %7 + %8 = OpLabel + OpSelectionMerge %9 None + OpBranchConditional %false %10 %11 + %11 = OpLabel + OpReturn + %10 = OpLabel + %16 = OpIAdd %uint %uint_0 %uint_0 + OpSelectionMerge %12 None + OpBranchConditional %false %14 %15 + %14 = OpLabel + OpBranch %12 + %15 = OpLabel + OpReturn + %12 = OpLabel + OpBranch %9 + %9 = OpLabel + %17 = OpIAdd %uint %16 %16 + OpReturn + OpFunctionEnd +)"; + + const std::string after = + R"(OpCapability Addresses +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %1 "simple_shader" +%void = OpTypeVoid +%bool = OpTypeBool +%uint = OpTypeInt 32 0 +%uint_0 = OpConstant %uint 0 +%false = OpConstantFalse %bool +%7 = OpTypeFunction %void +%_ptr_Function_bool = OpTypePointer Function %bool +%true = OpConstantTrue %bool +%24 = OpUndef %uint +%1 = OpFunction %void None %7 +%8 = OpLabel +%19 = OpVariable %_ptr_Function_bool Function %false +OpSelectionMerge %9 None +OpBranchConditional %false %10 %11 +%11 = OpLabel +OpStore %19 %true +OpBranch %9 +%10 = OpLabel +%12 = OpIAdd %uint %uint_0 %uint_0 +OpSelectionMerge %13 None +OpBranchConditional %false %14 %15 +%14 = OpLabel +OpBranch %13 +%15 = OpLabel +OpStore %19 %true +OpBranch %13 +%13 = OpLabel +OpBranch %9 +%9 = OpLabel +%25 = OpPhi %uint %12 %13 %24 %11 +%23 = OpLoad %bool %19 +OpSelectionMerge %22 None +OpBranchConditional %23 %22 %21 +%21 = OpLabel +%16 = OpIAdd %uint %25 %25 +OpStore %19 %true +OpBranch %22 +%22 = OpLabel +OpBranch %17 +%17 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndCheck(before, after, false, true); +} } // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/pass_remove_duplicates_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/pass_remove_duplicates_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/pass_remove_duplicates_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/pass_remove_duplicates_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -219,6 +219,29 @@ EXPECT_THAT(GetErrorMessage(), ""); } +TEST_F(RemoveDuplicatesTest, SameTypeAndDifferentName) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpName %1 "Type1" +OpName %2 "Type2" +%3 = OpTypeInt 32 0 +%1 = OpTypeStruct %3 %3 +%2 = OpTypeStruct %3 %3 +)"; + const std::string after = R"(OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpName %1 "Type1" +%3 = OpTypeInt 32 0 +%1 = OpTypeStruct %3 %3 +)"; + + EXPECT_THAT(RunPass(spirv), after); + EXPECT_THAT(GetErrorMessage(), ""); +} + // Check that #1033 has been fixed. TEST_F(RemoveDuplicatesTest, DoNotRemoveDifferentOpDecorationGroup) { const std::string spirv = R"( diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/pass_utils.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/pass_utils.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/pass_utils.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/pass_utils.h 2018-04-27 11:46:32.000000000 +0000 @@ -16,6 +16,7 @@ #define LIBSPIRV_TEST_OPT_PASS_UTILS_H_ #include +#include #include #include diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/private_to_local_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/private_to_local_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/private_to_local_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/private_to_local_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -130,6 +130,51 @@ SinglePassRunAndMatch(text, false); } +TEST_F(PrivateToLocalTest, UseTexelPointer) { + // Change the private variable to a local, and change the OpImageTexelPointer. + const std::string text = R"( +OpCapability SampledBuffer + OpCapability StorageImageExtendedFormats + OpCapability ImageBuffer + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %2 "min" %gl_GlobalInvocationID + OpExecutionMode %2 LocalSize 64 1 1 + OpSource HLSL 600 + OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId + OpDecorate %4 DescriptorSet 4 + OpDecorate %4 Binding 70 + %uint = OpTypeInt 32 0 + %6 = OpTypeImage %uint Buffer 0 0 0 2 R32ui +%_ptr_UniformConstant_6 = OpTypePointer UniformConstant %6 +%_ptr_Private_6 = OpTypePointer Private %6 + %void = OpTypeVoid + %10 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %v3uint = OpTypeVector %uint 3 +%_ptr_Input_v3uint = OpTypePointer Input %v3uint +%_ptr_Image_uint = OpTypePointer Image %uint + %4 = OpVariable %_ptr_UniformConstant_6 UniformConstant + %16 = OpVariable %_ptr_Private_6 Private +%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input + %2 = OpFunction %void None %10 + %17 = OpLabel +; Make sure the variable was moved. +; CHECK: OpFunction +; CHECK-NEXT: OpLabel +; CHECK-NEXT: OpVariable %_ptr_Function_6 Function + %18 = OpLoad %6 %4 + OpStore %16 %18 + %19 = OpImageTexelPointer %_ptr_Image_uint %16 %uint_0 %uint_0 + %20 = OpAtomicIAdd %uint %19 %uint_1 %uint_0 %uint_1 + OpReturn + OpFunctionEnd + )"; + SinglePassRunAndMatch(text, false); +} + TEST_F(PrivateToLocalTest, UsedInTwoFunctions) { // Should not change because it is used in multiple functions. const std::string text = R"( diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/replace_invalid_opc_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/replace_invalid_opc_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/replace_invalid_opc_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/replace_invalid_opc_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -27,7 +27,7 @@ #ifdef SPIRV_EFFCEE TEST_F(ReplaceInvalidOpcodeTest, ReplaceInstruction) { const std::string text = R"( -; CHECK: [[special_const:%\w+]] = OpConstant %float -6.25985e+18 +; CHECK: [[special_const:%\w+]] = OpConstant %float -6.2598534e+18 ; CHECK: [[constant:%\w+]] = OpConstantComposite %v4float [[special_const]] [[special_const]] [[special_const]] [[special_const]] ; CHECK-NOT: OpImageSampleImplicitLod ; CHECK: OpStore [[:%\w+]] [[constant]] @@ -82,7 +82,7 @@ TEST_F(ReplaceInvalidOpcodeTest, ReplaceInstructionInNonEntryPoint) { const std::string text = R"( -; CHECK: [[special_const:%\w+]] = OpConstant %float -6.25985e+18 +; CHECK: [[special_const:%\w+]] = OpConstant %float -6.2598534e+18 ; CHECK: [[constant:%\w+]] = OpConstantComposite %v4float [[special_const]] [[special_const]] [[special_const]] [[special_const]] ; CHECK-NOT: OpImageSampleImplicitLod ; CHECK: OpStore [[:%\w+]] [[constant]] @@ -142,7 +142,7 @@ TEST_F(ReplaceInvalidOpcodeTest, ReplaceInstructionMultipleEntryPoints) { const std::string text = R"( -; CHECK: [[special_const:%\w+]] = OpConstant %float -6.25985e+18 +; CHECK: [[special_const:%\w+]] = OpConstant %float -6.2598534e+18 ; CHECK: [[constant:%\w+]] = OpConstantComposite %v4float [[special_const]] [[special_const]] [[special_const]] [[special_const]] ; CHECK-NOT: OpImageSampleImplicitLod ; CHECK: OpStore [[:%\w+]] [[constant]] diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/scalar_analysis.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/scalar_analysis.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/scalar_analysis.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/scalar_analysis.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,1228 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include + +#include +#include +#include +#include + +#include "assembly_builder.h" +#include "function_utils.h" +#include "pass_fixture.h" +#include "pass_utils.h" + +#include "opt/iterator.h" +#include "opt/loop_descriptor.h" +#include "opt/pass.h" +#include "opt/scalar_analysis.h" +#include "opt/tree_iterator.h" + +namespace { + +using namespace spvtools; +using ::testing::UnorderedElementsAre; + +using ScalarAnalysisTest = PassTest<::testing::Test>; + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 410 core +layout (location = 1) out float array[10]; +void main() { + for (int i = 0; i < 10; ++i) { + array[i] = array[i+1]; + } +} +*/ +TEST_F(ScalarAnalysisTest, BasicEvolutionTest) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %24 + OpExecutionMode %4 OriginUpperLeft + OpSource GLSL 410 + OpName %4 "main" + OpName %24 "array" + OpDecorate %24 Location 1 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %16 = OpConstant %6 10 + %17 = OpTypeBool + %19 = OpTypeFloat 32 + %20 = OpTypeInt 32 0 + %21 = OpConstant %20 10 + %22 = OpTypeArray %19 %21 + %23 = OpTypePointer Output %22 + %24 = OpVariable %23 Output + %27 = OpConstant %6 1 + %29 = OpTypePointer Output %19 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %10 + %10 = OpLabel + %35 = OpPhi %6 %9 %5 %34 %13 + OpLoopMerge %12 %13 None + OpBranch %14 + %14 = OpLabel + %18 = OpSLessThan %17 %35 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + %28 = OpIAdd %6 %35 %27 + %30 = OpAccessChain %29 %24 %28 + %31 = OpLoad %19 %30 + %32 = OpAccessChain %29 %24 %35 + OpStore %32 %31 + OpBranch %13 + %13 = OpLabel + %34 = OpIAdd %6 %35 %27 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + const ir::Function* f = spvtest::GetFunction(module, 4); + opt::ScalarEvolutionAnalysis analysis{context.get()}; + + const ir::Instruction* store = nullptr; + const ir::Instruction* load = nullptr; + for (const ir::Instruction& inst : *spvtest::GetBasicBlock(f, 11)) { + if (inst.opcode() == SpvOp::SpvOpStore) { + store = &inst; + } + if (inst.opcode() == SpvOp::SpvOpLoad) { + load = &inst; + } + } + + EXPECT_NE(load, nullptr); + EXPECT_NE(store, nullptr); + + ir::Instruction* access_chain = + context->get_def_use_mgr()->GetDef(load->GetSingleWordInOperand(0)); + + ir::Instruction* child = context->get_def_use_mgr()->GetDef( + access_chain->GetSingleWordInOperand(1)); + const opt::SENode* node = analysis.AnalyzeInstruction(child); + + EXPECT_NE(node, nullptr); + + // Unsimplified node should have the form of ADD(REC(0,1), 1) + EXPECT_EQ(node->GetType(), opt::SENode::Add); + + const opt::SENode* child_1 = node->GetChild(0); + EXPECT_TRUE(child_1->GetType() == opt::SENode::Constant || + child_1->GetType() == opt::SENode::RecurrentAddExpr); + + const opt::SENode* child_2 = node->GetChild(1); + EXPECT_TRUE(child_2->GetType() == opt::SENode::Constant || + child_2->GetType() == opt::SENode::RecurrentAddExpr); + + opt::SENode* simplified = + analysis.SimplifyExpression(const_cast(node)); + // Simplified should be in the form of REC(1,1) + EXPECT_EQ(simplified->GetType(), opt::SENode::RecurrentAddExpr); + + EXPECT_EQ(simplified->GetChild(0)->GetType(), opt::SENode::Constant); + EXPECT_EQ(simplified->GetChild(0)->AsSEConstantNode()->FoldToSingleValue(), + 1); + + EXPECT_EQ(simplified->GetChild(1)->GetType(), opt::SENode::Constant); + EXPECT_EQ(simplified->GetChild(1)->AsSEConstantNode()->FoldToSingleValue(), + 1); + + EXPECT_EQ(simplified->GetChild(0), simplified->GetChild(1)); +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 410 core +layout (location = 1) out float array[10]; +layout (location = 2) flat in int loop_invariant; +void main() { + for (int i = 0; i < 10; ++i) { + array[i] = array[i+loop_invariant]; + } +} + +*/ +TEST_F(ScalarAnalysisTest, LoadTest) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 %4 + OpExecutionMode %2 OriginUpperLeft + OpSource GLSL 430 + OpName %2 "main" + OpName %3 "array" + OpName %4 "loop_invariant" + OpDecorate %3 Location 1 + OpDecorate %4 Flat + OpDecorate %4 Location 2 + %5 = OpTypeVoid + %6 = OpTypeFunction %5 + %7 = OpTypeInt 32 1 + %8 = OpTypePointer Function %7 + %9 = OpConstant %7 0 + %10 = OpConstant %7 10 + %11 = OpTypeBool + %12 = OpTypeFloat 32 + %13 = OpTypeInt 32 0 + %14 = OpConstant %13 10 + %15 = OpTypeArray %12 %14 + %16 = OpTypePointer Output %15 + %3 = OpVariable %16 Output + %17 = OpTypePointer Input %7 + %4 = OpVariable %17 Input + %18 = OpTypePointer Output %12 + %19 = OpConstant %7 1 + %2 = OpFunction %5 None %6 + %20 = OpLabel + OpBranch %21 + %21 = OpLabel + %22 = OpPhi %7 %9 %20 %23 %24 + OpLoopMerge %25 %24 None + OpBranch %26 + %26 = OpLabel + %27 = OpSLessThan %11 %22 %10 + OpBranchConditional %27 %28 %25 + %28 = OpLabel + %29 = OpLoad %7 %4 + %30 = OpIAdd %7 %22 %29 + %31 = OpAccessChain %18 %3 %30 + %32 = OpLoad %12 %31 + %33 = OpAccessChain %18 %3 %22 + OpStore %33 %32 + OpBranch %24 + %24 = OpLabel + %23 = OpIAdd %7 %22 %19 + OpBranch %21 + %25 = OpLabel + OpReturn + OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + const ir::Function* f = spvtest::GetFunction(module, 2); + opt::ScalarEvolutionAnalysis analysis{context.get()}; + + const ir::Instruction* load = nullptr; + for (const ir::Instruction& inst : *spvtest::GetBasicBlock(f, 28)) { + if (inst.opcode() == SpvOp::SpvOpLoad) { + load = &inst; + } + } + + EXPECT_NE(load, nullptr); + + ir::Instruction* access_chain = + context->get_def_use_mgr()->GetDef(load->GetSingleWordInOperand(0)); + + ir::Instruction* child = context->get_def_use_mgr()->GetDef( + access_chain->GetSingleWordInOperand(1)); + // const opt::SENode* node = + // analysis.GetNodeFromInstruction(child->unique_id()); + + const opt::SENode* node = analysis.AnalyzeInstruction(child); + + EXPECT_NE(node, nullptr); + + // Unsimplified node should have the form of ADD(REC(0,1), X) + EXPECT_EQ(node->GetType(), opt::SENode::Add); + + const opt::SENode* child_1 = node->GetChild(0); + EXPECT_TRUE(child_1->GetType() == opt::SENode::ValueUnknown || + child_1->GetType() == opt::SENode::RecurrentAddExpr); + + const opt::SENode* child_2 = node->GetChild(1); + EXPECT_TRUE(child_2->GetType() == opt::SENode::ValueUnknown || + child_2->GetType() == opt::SENode::RecurrentAddExpr); + + opt::SENode* simplified = + analysis.SimplifyExpression(const_cast(node)); + EXPECT_EQ(simplified->GetType(), opt::SENode::RecurrentAddExpr); + + const opt::SERecurrentNode* rec = simplified->AsSERecurrentNode(); + + EXPECT_NE(rec->GetChild(0), rec->GetChild(1)); + + EXPECT_EQ(rec->GetOffset()->GetType(), opt::SENode::ValueUnknown); + + EXPECT_EQ(rec->GetCoefficient()->GetType(), opt::SENode::Constant); + EXPECT_EQ(rec->GetCoefficient()->AsSEConstantNode()->FoldToSingleValue(), 1u); +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 410 core +layout (location = 1) out float array[10]; +layout (location = 2) flat in int loop_invariant; +void main() { + array[0] = array[loop_invariant * 2 + 4 + 5 - 24 - loop_invariant - +loop_invariant+ 16 * 3]; +} + +*/ +TEST_F(ScalarAnalysisTest, SimplifySimple) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 %4 + OpExecutionMode %2 OriginUpperLeft + OpSource GLSL 430 + OpName %2 "main" + OpName %3 "array" + OpName %4 "loop_invariant" + OpDecorate %3 Location 1 + OpDecorate %4 Flat + OpDecorate %4 Location 2 + %5 = OpTypeVoid + %6 = OpTypeFunction %5 + %7 = OpTypeFloat 32 + %8 = OpTypeInt 32 0 + %9 = OpConstant %8 10 + %10 = OpTypeArray %7 %9 + %11 = OpTypePointer Output %10 + %3 = OpVariable %11 Output + %12 = OpTypeInt 32 1 + %13 = OpConstant %12 0 + %14 = OpTypePointer Input %12 + %4 = OpVariable %14 Input + %15 = OpConstant %12 2 + %16 = OpConstant %12 4 + %17 = OpConstant %12 5 + %18 = OpConstant %12 24 + %19 = OpConstant %12 48 + %20 = OpTypePointer Output %7 + %2 = OpFunction %5 None %6 + %21 = OpLabel + %22 = OpLoad %12 %4 + %23 = OpIMul %12 %22 %15 + %24 = OpIAdd %12 %23 %16 + %25 = OpIAdd %12 %24 %17 + %26 = OpISub %12 %25 %18 + %28 = OpISub %12 %26 %22 + %30 = OpISub %12 %28 %22 + %31 = OpIAdd %12 %30 %19 + %32 = OpAccessChain %20 %3 %31 + %33 = OpLoad %7 %32 + %34 = OpAccessChain %20 %3 %13 + OpStore %34 %33 + OpReturn + OpFunctionEnd + )"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + const ir::Function* f = spvtest::GetFunction(module, 2); + opt::ScalarEvolutionAnalysis analysis{context.get()}; + + const ir::Instruction* load = nullptr; + for (const ir::Instruction& inst : *spvtest::GetBasicBlock(f, 21)) { + if (inst.opcode() == SpvOp::SpvOpLoad && inst.result_id() == 33) { + load = &inst; + } + } + + EXPECT_NE(load, nullptr); + + ir::Instruction* access_chain = + context->get_def_use_mgr()->GetDef(load->GetSingleWordInOperand(0)); + + ir::Instruction* child = context->get_def_use_mgr()->GetDef( + access_chain->GetSingleWordInOperand(1)); + + const opt::SENode* node = analysis.AnalyzeInstruction(child); + + // Unsimplified is a very large graph with an add at the top. + EXPECT_NE(node, nullptr); + EXPECT_EQ(node->GetType(), opt::SENode::Add); + + // Simplified node should resolve down to a constant expression as the loads + // will eliminate themselves. + opt::SENode* simplified = + analysis.SimplifyExpression(const_cast(node)); + + EXPECT_EQ(simplified->GetType(), opt::SENode::Constant); + EXPECT_EQ(simplified->AsSEConstantNode()->FoldToSingleValue(), 33u); +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 410 core +layout(location = 0) in vec4 c; +layout (location = 1) out float array[10]; +void main() { + int N = int(c.x); + for (int i = 0; i < 10; ++i) { + array[i] = array[i]; + array[i] = array[i-1]; + array[i] = array[i+1]; + array[i+1] = array[i+1]; + array[i+N] = array[i+N]; + array[i] = array[i+N]; + } +} + +*/ +TEST_F(ScalarAnalysisTest, Simplify) { + const std::string text = R"( OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %12 %33 + OpExecutionMode %4 OriginUpperLeft + OpSource GLSL 410 + OpName %4 "main" + OpName %8 "N" + OpName %12 "c" + OpName %19 "i" + OpName %33 "array" + OpDecorate %12 Location 0 + OpDecorate %33 Location 1 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpTypeFloat 32 + %10 = OpTypeVector %9 4 + %11 = OpTypePointer Input %10 + %12 = OpVariable %11 Input + %13 = OpTypeInt 32 0 + %14 = OpConstant %13 0 + %15 = OpTypePointer Input %9 + %20 = OpConstant %6 0 + %27 = OpConstant %6 10 + %28 = OpTypeBool + %30 = OpConstant %13 10 + %31 = OpTypeArray %9 %30 + %32 = OpTypePointer Output %31 + %33 = OpVariable %32 Output + %36 = OpTypePointer Output %9 + %42 = OpConstant %6 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %19 = OpVariable %7 Function + %16 = OpAccessChain %15 %12 %14 + %17 = OpLoad %9 %16 + %18 = OpConvertFToS %6 %17 + OpStore %8 %18 + OpStore %19 %20 + OpBranch %21 + %21 = OpLabel + %78 = OpPhi %6 %20 %5 %77 %24 + OpLoopMerge %23 %24 None + OpBranch %25 + %25 = OpLabel + %29 = OpSLessThan %28 %78 %27 + OpBranchConditional %29 %22 %23 + %22 = OpLabel + %37 = OpAccessChain %36 %33 %78 + %38 = OpLoad %9 %37 + %39 = OpAccessChain %36 %33 %78 + OpStore %39 %38 + %43 = OpISub %6 %78 %42 + %44 = OpAccessChain %36 %33 %43 + %45 = OpLoad %9 %44 + %46 = OpAccessChain %36 %33 %78 + OpStore %46 %45 + %49 = OpIAdd %6 %78 %42 + %50 = OpAccessChain %36 %33 %49 + %51 = OpLoad %9 %50 + %52 = OpAccessChain %36 %33 %78 + OpStore %52 %51 + %54 = OpIAdd %6 %78 %42 + %56 = OpIAdd %6 %78 %42 + %57 = OpAccessChain %36 %33 %56 + %58 = OpLoad %9 %57 + %59 = OpAccessChain %36 %33 %54 + OpStore %59 %58 + %62 = OpIAdd %6 %78 %18 + %65 = OpIAdd %6 %78 %18 + %66 = OpAccessChain %36 %33 %65 + %67 = OpLoad %9 %66 + %68 = OpAccessChain %36 %33 %62 + OpStore %68 %67 + %72 = OpIAdd %6 %78 %18 + %73 = OpAccessChain %36 %33 %72 + %74 = OpLoad %9 %73 + %75 = OpAccessChain %36 %33 %78 + OpStore %75 %74 + OpBranch %24 + %24 = OpLabel + %77 = OpIAdd %6 %78 %42 + OpStore %19 %77 + OpBranch %21 + %23 = OpLabel + OpReturn + OpFunctionEnd +)"; + // clang-format on + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + const ir::Function* f = spvtest::GetFunction(module, 4); + opt::ScalarEvolutionAnalysis analysis{context.get()}; + + const ir::Instruction* loads[6]; + const ir::Instruction* stores[6]; + int load_count = 0; + int store_count = 0; + + for (const ir::Instruction& inst : *spvtest::GetBasicBlock(f, 22)) { + if (inst.opcode() == SpvOp::SpvOpLoad) { + loads[load_count] = &inst; + ++load_count; + } + if (inst.opcode() == SpvOp::SpvOpStore) { + stores[store_count] = &inst; + ++store_count; + } + } + + EXPECT_EQ(load_count, 6); + EXPECT_EQ(store_count, 6); + + ir::Instruction* load_access_chain; + ir::Instruction* store_access_chain; + ir::Instruction* load_child; + ir::Instruction* store_child; + opt::SENode* load_node; + opt::SENode* store_node; + opt::SENode* subtract_node; + opt::SENode* simplified_node; + + // Testing [i] - [i] == 0 + load_access_chain = + context->get_def_use_mgr()->GetDef(loads[0]->GetSingleWordInOperand(0)); + store_access_chain = + context->get_def_use_mgr()->GetDef(stores[0]->GetSingleWordInOperand(0)); + + load_child = context->get_def_use_mgr()->GetDef( + load_access_chain->GetSingleWordInOperand(1)); + store_child = context->get_def_use_mgr()->GetDef( + store_access_chain->GetSingleWordInOperand(1)); + + load_node = analysis.AnalyzeInstruction(load_child); + store_node = analysis.AnalyzeInstruction(store_child); + + subtract_node = analysis.CreateSubtraction(store_node, load_node); + simplified_node = analysis.SimplifyExpression(subtract_node); + EXPECT_EQ(simplified_node->GetType(), opt::SENode::Constant); + EXPECT_EQ(simplified_node->AsSEConstantNode()->FoldToSingleValue(), 0u); + + // Testing [i] - [i-1] == 1 + load_access_chain = + context->get_def_use_mgr()->GetDef(loads[1]->GetSingleWordInOperand(0)); + store_access_chain = + context->get_def_use_mgr()->GetDef(stores[1]->GetSingleWordInOperand(0)); + + load_child = context->get_def_use_mgr()->GetDef( + load_access_chain->GetSingleWordInOperand(1)); + store_child = context->get_def_use_mgr()->GetDef( + store_access_chain->GetSingleWordInOperand(1)); + + load_node = analysis.AnalyzeInstruction(load_child); + store_node = analysis.AnalyzeInstruction(store_child); + + subtract_node = analysis.CreateSubtraction(store_node, load_node); + simplified_node = analysis.SimplifyExpression(subtract_node); + + EXPECT_EQ(simplified_node->GetType(), opt::SENode::Constant); + EXPECT_EQ(simplified_node->AsSEConstantNode()->FoldToSingleValue(), 1u); + + // Testing [i] - [i+1] == -1 + load_access_chain = + context->get_def_use_mgr()->GetDef(loads[2]->GetSingleWordInOperand(0)); + store_access_chain = + context->get_def_use_mgr()->GetDef(stores[2]->GetSingleWordInOperand(0)); + + load_child = context->get_def_use_mgr()->GetDef( + load_access_chain->GetSingleWordInOperand(1)); + store_child = context->get_def_use_mgr()->GetDef( + store_access_chain->GetSingleWordInOperand(1)); + + load_node = analysis.AnalyzeInstruction(load_child); + store_node = analysis.AnalyzeInstruction(store_child); + + subtract_node = analysis.CreateSubtraction(store_node, load_node); + simplified_node = analysis.SimplifyExpression(subtract_node); + EXPECT_EQ(simplified_node->GetType(), opt::SENode::Constant); + EXPECT_EQ(simplified_node->AsSEConstantNode()->FoldToSingleValue(), -1); + + // Testing [i+1] - [i+1] == 0 + load_access_chain = + context->get_def_use_mgr()->GetDef(loads[3]->GetSingleWordInOperand(0)); + store_access_chain = + context->get_def_use_mgr()->GetDef(stores[3]->GetSingleWordInOperand(0)); + + load_child = context->get_def_use_mgr()->GetDef( + load_access_chain->GetSingleWordInOperand(1)); + store_child = context->get_def_use_mgr()->GetDef( + store_access_chain->GetSingleWordInOperand(1)); + + load_node = analysis.AnalyzeInstruction(load_child); + store_node = analysis.AnalyzeInstruction(store_child); + + subtract_node = analysis.CreateSubtraction(store_node, load_node); + simplified_node = analysis.SimplifyExpression(subtract_node); + EXPECT_EQ(simplified_node->GetType(), opt::SENode::Constant); + EXPECT_EQ(simplified_node->AsSEConstantNode()->FoldToSingleValue(), 0u); + + // Testing [i+N] - [i+N] == 0 + load_access_chain = + context->get_def_use_mgr()->GetDef(loads[4]->GetSingleWordInOperand(0)); + store_access_chain = + context->get_def_use_mgr()->GetDef(stores[4]->GetSingleWordInOperand(0)); + + load_child = context->get_def_use_mgr()->GetDef( + load_access_chain->GetSingleWordInOperand(1)); + store_child = context->get_def_use_mgr()->GetDef( + store_access_chain->GetSingleWordInOperand(1)); + + load_node = analysis.AnalyzeInstruction(load_child); + store_node = analysis.AnalyzeInstruction(store_child); + + subtract_node = analysis.CreateSubtraction(store_node, load_node); + + simplified_node = analysis.SimplifyExpression(subtract_node); + EXPECT_EQ(simplified_node->GetType(), opt::SENode::Constant); + EXPECT_EQ(simplified_node->AsSEConstantNode()->FoldToSingleValue(), 0u); + + // Testing [i] - [i+N] == -N + load_access_chain = + context->get_def_use_mgr()->GetDef(loads[5]->GetSingleWordInOperand(0)); + store_access_chain = + context->get_def_use_mgr()->GetDef(stores[5]->GetSingleWordInOperand(0)); + + load_child = context->get_def_use_mgr()->GetDef( + load_access_chain->GetSingleWordInOperand(1)); + store_child = context->get_def_use_mgr()->GetDef( + store_access_chain->GetSingleWordInOperand(1)); + + load_node = analysis.AnalyzeInstruction(load_child); + store_node = analysis.AnalyzeInstruction(store_child); + + subtract_node = analysis.CreateSubtraction(store_node, load_node); + simplified_node = analysis.SimplifyExpression(subtract_node); + EXPECT_EQ(simplified_node->GetType(), opt::SENode::Negative); +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 430 +layout(location = 1) out float array[10]; +layout(location = 2) flat in int loop_invariant; +void main(void) { + for (int i = 0; i < 10; ++i) { + array[i * 2 + i * 5] = array[i * i * 2]; + array[i * 2] = array[i * 5]; + } +} + +*/ + +TEST_F(ScalarAnalysisTest, SimplifyMultiplyInductions) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 %4 + OpExecutionMode %2 OriginUpperLeft + OpSource GLSL 430 + OpName %2 "main" + OpName %5 "i" + OpName %3 "array" + OpName %4 "loop_invariant" + OpDecorate %3 Location 1 + OpDecorate %4 Flat + OpDecorate %4 Location 2 + %6 = OpTypeVoid + %7 = OpTypeFunction %6 + %8 = OpTypeInt 32 1 + %9 = OpTypePointer Function %8 + %10 = OpConstant %8 0 + %11 = OpConstant %8 10 + %12 = OpTypeBool + %13 = OpTypeFloat 32 + %14 = OpTypeInt 32 0 + %15 = OpConstant %14 10 + %16 = OpTypeArray %13 %15 + %17 = OpTypePointer Output %16 + %3 = OpVariable %17 Output + %18 = OpConstant %8 2 + %19 = OpConstant %8 5 + %20 = OpTypePointer Output %13 + %21 = OpConstant %8 1 + %22 = OpTypePointer Input %8 + %4 = OpVariable %22 Input + %2 = OpFunction %6 None %7 + %23 = OpLabel + %5 = OpVariable %9 Function + OpStore %5 %10 + OpBranch %24 + %24 = OpLabel + %25 = OpPhi %8 %10 %23 %26 %27 + OpLoopMerge %28 %27 None + OpBranch %29 + %29 = OpLabel + %30 = OpSLessThan %12 %25 %11 + OpBranchConditional %30 %31 %28 + %31 = OpLabel + %32 = OpIMul %8 %25 %18 + %33 = OpIMul %8 %25 %19 + %34 = OpIAdd %8 %32 %33 + %35 = OpIMul %8 %25 %25 + %36 = OpIMul %8 %35 %18 + %37 = OpAccessChain %20 %3 %36 + %38 = OpLoad %13 %37 + %39 = OpAccessChain %20 %3 %34 + OpStore %39 %38 + %40 = OpIMul %8 %25 %18 + %41 = OpIMul %8 %25 %19 + %42 = OpAccessChain %20 %3 %41 + %43 = OpLoad %13 %42 + %44 = OpAccessChain %20 %3 %40 + OpStore %44 %43 + OpBranch %27 + %27 = OpLabel + %26 = OpIAdd %8 %25 %21 + OpStore %5 %26 + OpBranch %24 + %28 = OpLabel + OpReturn + OpFunctionEnd + )"; + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + const ir::Function* f = spvtest::GetFunction(module, 2); + opt::ScalarEvolutionAnalysis analysis{context.get()}; + + const ir::Instruction* loads[2] = {nullptr, nullptr}; + const ir::Instruction* stores[2] = {nullptr, nullptr}; + int load_count = 0; + int store_count = 0; + + for (const ir::Instruction& inst : *spvtest::GetBasicBlock(f, 31)) { + if (inst.opcode() == SpvOp::SpvOpLoad) { + loads[load_count] = &inst; + ++load_count; + } + if (inst.opcode() == SpvOp::SpvOpStore) { + stores[store_count] = &inst; + ++store_count; + } + } + + EXPECT_EQ(load_count, 2); + EXPECT_EQ(store_count, 2); + + ir::Instruction* load_access_chain = + context->get_def_use_mgr()->GetDef(loads[0]->GetSingleWordInOperand(0)); + ir::Instruction* store_access_chain = + context->get_def_use_mgr()->GetDef(stores[0]->GetSingleWordInOperand(0)); + + ir::Instruction* load_child = context->get_def_use_mgr()->GetDef( + load_access_chain->GetSingleWordInOperand(1)); + ir::Instruction* store_child = context->get_def_use_mgr()->GetDef( + store_access_chain->GetSingleWordInOperand(1)); + + opt::SENode* store_node = analysis.AnalyzeInstruction(store_child); + + opt::SENode* store_simplified = analysis.SimplifyExpression(store_node); + + load_access_chain = + context->get_def_use_mgr()->GetDef(loads[1]->GetSingleWordInOperand(0)); + store_access_chain = + context->get_def_use_mgr()->GetDef(stores[1]->GetSingleWordInOperand(0)); + load_child = context->get_def_use_mgr()->GetDef( + load_access_chain->GetSingleWordInOperand(1)); + store_child = context->get_def_use_mgr()->GetDef( + store_access_chain->GetSingleWordInOperand(1)); + + opt::SENode* second_store = + analysis.SimplifyExpression(analysis.AnalyzeInstruction(store_child)); + opt::SENode* second_load = + analysis.SimplifyExpression(analysis.AnalyzeInstruction(load_child)); + opt::SENode* combined_add = analysis.SimplifyExpression( + analysis.CreateAddNode(second_load, second_store)); + + // We're checking that the two recurrent expression have been correctly + // folded. In store_simplified they will have been folded as the entire + // expression was simplified as one. In combined_add the two expressions have + // been simplified one after the other which means the recurrent expressions + // aren't exactly the same but should still be folded as they are with respect + // to the same loop. + EXPECT_EQ(combined_add, store_simplified); +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 430 +void main(void) { + for (int i = 0; i < 10; --i) { + array[i] = array[i]; + } +} + +*/ + +TEST_F(ScalarAnalysisTest, SimplifyNegativeSteps) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 %4 + OpExecutionMode %2 OriginUpperLeft + OpSource GLSL 430 + OpName %2 "main" + OpName %5 "i" + OpName %3 "array" + OpName %4 "loop_invariant" + OpDecorate %3 Location 1 + OpDecorate %4 Flat + OpDecorate %4 Location 2 + %6 = OpTypeVoid + %7 = OpTypeFunction %6 + %8 = OpTypeInt 32 1 + %9 = OpTypePointer Function %8 + %10 = OpConstant %8 0 + %11 = OpConstant %8 10 + %12 = OpTypeBool + %13 = OpTypeFloat 32 + %14 = OpTypeInt 32 0 + %15 = OpConstant %14 10 + %16 = OpTypeArray %13 %15 + %17 = OpTypePointer Output %16 + %3 = OpVariable %17 Output + %18 = OpTypePointer Output %13 + %19 = OpConstant %8 1 + %20 = OpTypePointer Input %8 + %4 = OpVariable %20 Input + %2 = OpFunction %6 None %7 + %21 = OpLabel + %5 = OpVariable %9 Function + OpStore %5 %10 + OpBranch %22 + %22 = OpLabel + %23 = OpPhi %8 %10 %21 %24 %25 + OpLoopMerge %26 %25 None + OpBranch %27 + %27 = OpLabel + %28 = OpSLessThan %12 %23 %11 + OpBranchConditional %28 %29 %26 + %29 = OpLabel + %30 = OpAccessChain %18 %3 %23 + %31 = OpLoad %13 %30 + %32 = OpAccessChain %18 %3 %23 + OpStore %32 %31 + OpBranch %25 + %25 = OpLabel + %24 = OpISub %8 %23 %19 + OpStore %5 %24 + OpBranch %22 + %26 = OpLabel + OpReturn + OpFunctionEnd + )"; + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + const ir::Function* f = spvtest::GetFunction(module, 2); + opt::ScalarEvolutionAnalysis analysis{context.get()}; + + const ir::Instruction* loads[1] = {nullptr}; + int load_count = 0; + + for (const ir::Instruction& inst : *spvtest::GetBasicBlock(f, 29)) { + if (inst.opcode() == SpvOp::SpvOpLoad) { + loads[load_count] = &inst; + ++load_count; + } + } + + EXPECT_EQ(load_count, 1); + + ir::Instruction* load_access_chain = + context->get_def_use_mgr()->GetDef(loads[0]->GetSingleWordInOperand(0)); + ir::Instruction* load_child = context->get_def_use_mgr()->GetDef( + load_access_chain->GetSingleWordInOperand(1)); + + opt::SENode* load_node = analysis.AnalyzeInstruction(load_child); + + EXPECT_TRUE(load_node); + EXPECT_EQ(load_node->GetType(), opt::SENode::RecurrentAddExpr); + EXPECT_TRUE(load_node->AsSERecurrentNode()); + + opt::SENode* child_1 = load_node->AsSERecurrentNode()->GetCoefficient(); + opt::SENode* child_2 = load_node->AsSERecurrentNode()->GetOffset(); + + EXPECT_EQ(child_1->GetType(), opt::SENode::Constant); + EXPECT_EQ(child_2->GetType(), opt::SENode::Constant); + + EXPECT_EQ(child_1->AsSEConstantNode()->FoldToSingleValue(), -1); + EXPECT_EQ(child_2->AsSEConstantNode()->FoldToSingleValue(), 0u); + + opt::SERecurrentNode* load_simplified = + analysis.SimplifyExpression(load_node)->AsSERecurrentNode(); + + EXPECT_TRUE(load_simplified); + EXPECT_EQ(load_node, load_simplified); + + EXPECT_EQ(load_simplified->GetType(), opt::SENode::RecurrentAddExpr); + EXPECT_TRUE(load_simplified->AsSERecurrentNode()); + + opt::SENode* simplified_child_1 = + load_simplified->AsSERecurrentNode()->GetCoefficient(); + opt::SENode* simplified_child_2 = + load_simplified->AsSERecurrentNode()->GetOffset(); + + EXPECT_EQ(child_1, simplified_child_1); + EXPECT_EQ(child_2, simplified_child_2); +} + +/* +Generated from the following GLSL + --eliminate-local-multi-store + +#version 430 +void main(void) { + for (int i = 0; i < 10; --i) { + array[i] = array[i]; + } +} + +*/ + +TEST_F(ScalarAnalysisTest, SimplifyInductionsAndLoads) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 %4 + OpExecutionMode %2 OriginUpperLeft + OpSource GLSL 430 + OpName %2 "main" + OpName %5 "i" + OpName %3 "array" + OpName %4 "N" + OpDecorate %3 Location 1 + OpDecorate %4 Flat + OpDecorate %4 Location 2 + %6 = OpTypeVoid + %7 = OpTypeFunction %6 + %8 = OpTypeInt 32 1 + %9 = OpTypePointer Function %8 + %10 = OpConstant %8 0 + %11 = OpConstant %8 10 + %12 = OpTypeBool + %13 = OpTypeFloat 32 + %14 = OpTypeInt 32 0 + %15 = OpConstant %14 10 + %16 = OpTypeArray %13 %15 + %17 = OpTypePointer Output %16 + %3 = OpVariable %17 Output + %18 = OpConstant %8 2 + %19 = OpTypePointer Input %8 + %4 = OpVariable %19 Input + %20 = OpTypePointer Output %13 + %21 = OpConstant %8 1 + %2 = OpFunction %6 None %7 + %22 = OpLabel + %5 = OpVariable %9 Function + OpStore %5 %10 + OpBranch %23 + %23 = OpLabel + %24 = OpPhi %8 %10 %22 %25 %26 + OpLoopMerge %27 %26 None + OpBranch %28 + %28 = OpLabel + %29 = OpSLessThan %12 %24 %11 + OpBranchConditional %29 %30 %27 + %30 = OpLabel + %31 = OpLoad %8 %4 + %32 = OpIMul %8 %18 %31 + %33 = OpIAdd %8 %24 %32 + %35 = OpIAdd %8 %24 %31 + %36 = OpAccessChain %20 %3 %35 + %37 = OpLoad %13 %36 + %38 = OpAccessChain %20 %3 %33 + OpStore %38 %37 + %39 = OpIMul %8 %18 %24 + %41 = OpIMul %8 %18 %31 + %42 = OpIAdd %8 %39 %41 + %43 = OpIAdd %8 %42 %21 + %44 = OpIMul %8 %18 %24 + %46 = OpIAdd %8 %44 %31 + %47 = OpIAdd %8 %46 %21 + %48 = OpAccessChain %20 %3 %47 + %49 = OpLoad %13 %48 + %50 = OpAccessChain %20 %3 %43 + OpStore %50 %49 + OpBranch %26 + %26 = OpLabel + %25 = OpISub %8 %24 %21 + OpStore %5 %25 + OpBranch %23 + %27 = OpLabel + OpReturn + OpFunctionEnd + )"; + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + const ir::Function* f = spvtest::GetFunction(module, 2); + opt::ScalarEvolutionAnalysis analysis{context.get()}; + + std::vector loads{}; + std::vector stores{}; + + for (const ir::Instruction& inst : *spvtest::GetBasicBlock(f, 30)) { + if (inst.opcode() == SpvOp::SpvOpLoad) { + loads.push_back(&inst); + } + if (inst.opcode() == SpvOp::SpvOpStore) { + stores.push_back(&inst); + } + } + + EXPECT_EQ(loads.size(), 3u); + EXPECT_EQ(stores.size(), 2u); + { + ir::Instruction* store_access_chain = context->get_def_use_mgr()->GetDef( + stores[0]->GetSingleWordInOperand(0)); + + ir::Instruction* store_child = context->get_def_use_mgr()->GetDef( + store_access_chain->GetSingleWordInOperand(1)); + + opt::SENode* store_node = analysis.AnalyzeInstruction(store_child); + + opt::SENode* store_simplified = analysis.SimplifyExpression(store_node); + + ir::Instruction* load_access_chain = + context->get_def_use_mgr()->GetDef(loads[1]->GetSingleWordInOperand(0)); + + ir::Instruction* load_child = context->get_def_use_mgr()->GetDef( + load_access_chain->GetSingleWordInOperand(1)); + + opt::SENode* load_node = analysis.AnalyzeInstruction(load_child); + + opt::SENode* load_simplified = analysis.SimplifyExpression(load_node); + + opt::SENode* difference = + analysis.CreateSubtraction(store_simplified, load_simplified); + + opt::SENode* difference_simplified = + analysis.SimplifyExpression(difference); + + // Check that i+2*N - i*N, turns into just N when both sides have already + // been simplified into a single recurrent expression. + EXPECT_EQ(difference_simplified->GetType(), opt::SENode::ValueUnknown); + + // Check that the inverse, i*N - i+2*N turns into -N. + opt::SENode* difference_inverse = analysis.SimplifyExpression( + analysis.CreateSubtraction(load_simplified, store_simplified)); + + EXPECT_EQ(difference_inverse->GetType(), opt::SENode::Negative); + EXPECT_EQ(difference_inverse->GetChild(0)->GetType(), + opt::SENode::ValueUnknown); + EXPECT_EQ(difference_inverse->GetChild(0), difference_simplified); + } + + { + ir::Instruction* store_access_chain = context->get_def_use_mgr()->GetDef( + stores[1]->GetSingleWordInOperand(0)); + + ir::Instruction* store_child = context->get_def_use_mgr()->GetDef( + store_access_chain->GetSingleWordInOperand(1)); + opt::SENode* store_node = analysis.AnalyzeInstruction(store_child); + opt::SENode* store_simplified = analysis.SimplifyExpression(store_node); + + ir::Instruction* load_access_chain = + context->get_def_use_mgr()->GetDef(loads[2]->GetSingleWordInOperand(0)); + + ir::Instruction* load_child = context->get_def_use_mgr()->GetDef( + load_access_chain->GetSingleWordInOperand(1)); + + opt::SENode* load_node = analysis.AnalyzeInstruction(load_child); + + opt::SENode* load_simplified = analysis.SimplifyExpression(load_node); + + opt::SENode* difference = + analysis.CreateSubtraction(store_simplified, load_simplified); + opt::SENode* difference_simplified = + analysis.SimplifyExpression(difference); + + // Check that 2*i + 2*N + 1 - 2*i + N + 1, turns into just N when both + // sides have already been simplified into a single recurrent expression. + EXPECT_EQ(difference_simplified->GetType(), opt::SENode::ValueUnknown); + + // Check that the inverse, (2*i + N + 1) - (2*i + 2*N + 1) turns into -N. + opt::SENode* difference_inverse = analysis.SimplifyExpression( + analysis.CreateSubtraction(load_simplified, store_simplified)); + + EXPECT_EQ(difference_inverse->GetType(), opt::SENode::Negative); + EXPECT_EQ(difference_inverse->GetChild(0)->GetType(), + opt::SENode::ValueUnknown); + EXPECT_EQ(difference_inverse->GetChild(0), difference_simplified); + } +} + +/* Generated from the following GLSL + --eliminate-local-multi-store + + #version 430 + layout(location = 1) out float array[10]; + layout(location = 2) flat in int N; + void main(void) { + int step = 0; + for (int i = 0; i < N; i += step) { + step++; + } + } +*/ +TEST_F(ScalarAnalysisTest, InductionWithVariantStep) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 %4 + OpExecutionMode %2 OriginUpperLeft + OpSource GLSL 430 + OpName %2 "main" + OpName %5 "step" + OpName %6 "i" + OpName %3 "N" + OpName %4 "array" + OpDecorate %3 Flat + OpDecorate %3 Location 2 + OpDecorate %4 Location 1 + %7 = OpTypeVoid + %8 = OpTypeFunction %7 + %9 = OpTypeInt 32 1 + %10 = OpTypePointer Function %9 + %11 = OpConstant %9 0 + %12 = OpTypePointer Input %9 + %3 = OpVariable %12 Input + %13 = OpTypeBool + %14 = OpConstant %9 1 + %15 = OpTypeFloat 32 + %16 = OpTypeInt 32 0 + %17 = OpConstant %16 10 + %18 = OpTypeArray %15 %17 + %19 = OpTypePointer Output %18 + %4 = OpVariable %19 Output + %2 = OpFunction %7 None %8 + %20 = OpLabel + %5 = OpVariable %10 Function + %6 = OpVariable %10 Function + OpStore %5 %11 + OpStore %6 %11 + OpBranch %21 + %21 = OpLabel + %22 = OpPhi %9 %11 %20 %23 %24 + %25 = OpPhi %9 %11 %20 %26 %24 + OpLoopMerge %27 %24 None + OpBranch %28 + %28 = OpLabel + %29 = OpLoad %9 %3 + %30 = OpSLessThan %13 %25 %29 + OpBranchConditional %30 %31 %27 + %31 = OpLabel + %23 = OpIAdd %9 %22 %14 + OpStore %5 %23 + OpBranch %24 + %24 = OpLabel + %26 = OpIAdd %9 %25 %23 + OpStore %6 %26 + OpBranch %21 + %27 = OpLabel + OpReturn + OpFunctionEnd + )"; + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ir::Module* module = context->module(); + EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n" + << text << std::endl; + const ir::Function* f = spvtest::GetFunction(module, 2); + opt::ScalarEvolutionAnalysis analysis{context.get()}; + + std::vector phis{}; + + for (const ir::Instruction& inst : *spvtest::GetBasicBlock(f, 21)) { + if (inst.opcode() == SpvOp::SpvOpPhi) { + phis.push_back(&inst); + } + } + + EXPECT_EQ(phis.size(), 2u); + opt::SENode* phi_node_1 = analysis.AnalyzeInstruction(phis[0]); + opt::SENode* phi_node_2 = analysis.AnalyzeInstruction(phis[1]); + phi_node_1->DumpDot(std::cout, true); + EXPECT_NE(phi_node_1, nullptr); + EXPECT_NE(phi_node_2, nullptr); + + EXPECT_EQ(phi_node_1->GetType(), opt::SENode::RecurrentAddExpr); + EXPECT_EQ(phi_node_2->GetType(), opt::SENode::CanNotCompute); + + opt::SENode* simplified_1 = analysis.SimplifyExpression(phi_node_1); + opt::SENode* simplified_2 = analysis.SimplifyExpression(phi_node_2); + + EXPECT_EQ(simplified_1->GetType(), opt::SENode::RecurrentAddExpr); + EXPECT_EQ(simplified_2->GetType(), opt::SENode::CanNotCompute); +} + +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/scalar_replacement_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/scalar_replacement_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/scalar_replacement_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/scalar_replacement_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -455,24 +455,32 @@ const std::string text = R"( ; ; CHECK: [[uint:%\w+]] = OpTypeInt 32 0 +; CHECK: [[long:%\w+]] = OpTypeInt 64 1 +; CHECK: [[dvector:%\w+]] = OpTypeVector +; CHECK: [[vector:%\w+]] = OpTypeVector ; CHECK: [[array:%\w+]] = OpTypeArray ; CHECK: [[matrix:%\w+]] = OpTypeMatrix -; CHECK: [[struct1:%\w+]] = OpTypeStruct [[uint]] +; CHECK: [[struct1:%\w+]] = OpTypeStruct [[uint]] [[vector]] ; CHECK: [[struct2:%\w+]] = OpTypeStruct [[struct1]] [[matrix]] [[array]] [[uint]] ; CHECK: [[struct1_ptr:%\w+]] = OpTypePointer Function [[struct1]] ; CHECK: [[matrix_ptr:%\w+]] = OpTypePointer Function [[matrix]] ; CHECK: [[array_ptr:%\w+]] = OpTypePointer Function [[array]] ; CHECK: [[uint_ptr:%\w+]] = OpTypePointer Function [[uint]] ; CHECK: [[struct2_ptr:%\w+]] = OpTypePointer Function [[struct2]] -; CHECK: [[const_uint:%\w+]] = OpConstant [[uint]] ; CHECK: [[const_array:%\w+]] = OpConstantComposite [[array]] ; CHECK: [[const_matrix:%\w+]] = OpConstantNull [[matrix]] ; CHECK: [[const_struct1:%\w+]] = OpConstantComposite [[struct1]] +; CHECK: [[vector_ptr:%\w+]] = OpTypePointer Function [[vector]] +; CHECK: [[long_ptr:%\w+]] = OpTypePointer Function [[long]] ; CHECK-NOT: OpVariable [[struct2_ptr]] Function -; CHECK: OpVariable [[uint_ptr]] Function [[const_uint]] -; CHECK-NEXT: OpVariable [[array_ptr]] Function [[const_array]] +; CHECK: OpVariable [[long_ptr]] Function +; CHECK: OpVariable [[long_ptr]] Function +; CHECK: OpVariable [[long_ptr]] Function +; CHECK: OpVariable [[vector_ptr]] Function +; CHECK: OpVariable [[uint_ptr]] Function +; CHECK: OpVariable [[uint_ptr]] Function ; CHECK-NEXT: OpVariable [[matrix_ptr]] Function [[const_matrix]] -; CHECK-NEXT: OpVariable [[struct1_ptr]] Function [[const_struct1]] +; CHECK-NOT: OpVariable [[struct1_ptr]] Function [[const_struct1]] ; CHECK-NOT: OpVariable [[struct2_ptr]] Function ; OpCapability Shader @@ -891,10 +899,10 @@ TEST_F(ScalarReplacementTest, NoPartialAccesses) { const std::string text = R"( ; -; CHECK: [[struct:%\w+]] = OpTypeStruct -; CHECK: [[struct_ptr:%\w+]] = OpTypePointer Function [[struct]] +; CHECK: [[uint:%\w+]] = OpTypeInt 32 0 +; CHECK: [[uint_ptr:%\w+]] = OpTypePointer Function [[uint]] ; CHECK: OpLabel -; CHECK-NEXT: OpVariable [[struct_ptr]] +; CHECK-NEXT: OpVariable [[uint_ptr]] ; CHECK-NOT: OpVariable ; OpCapability Shader @@ -1133,6 +1141,130 @@ OpReturn OpFunctionEnd )"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(ScalarReplacementTest, NoPartialAccesses2) { + const std::string text = R"( +; +; CHECK: [[float:%\w+]] = OpTypeFloat 32 +; CHECK: [[float_ptr:%\w+]] = OpTypePointer Function [[float]] +; CHECK: OpVariable [[float_ptr]] Function +; CHECK: OpVariable [[float_ptr]] Function +; CHECK: OpVariable [[float_ptr]] Function +; CHECK: OpVariable [[float_ptr]] Function +; CHECK: OpVariable [[float_ptr]] Function +; CHECK: OpVariable [[float_ptr]] Function +; CHECK: OpVariable [[float_ptr]] Function +; CHECK: OpVariable [[float_ptr]] Function +; CHECK-NOT: OpVariable +; +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %fo +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 430 +OpName %main "main" +OpName %S "S" +OpMemberName %S 0 "x" +OpMemberName %S 1 "y" +OpName %ts1 "ts1" +OpName %S_0 "S" +OpMemberName %S_0 0 "x" +OpMemberName %S_0 1 "y" +OpName %U_t "U_t" +OpMemberName %U_t 0 "g_s1" +OpMemberName %U_t 1 "g_s2" +OpMemberName %U_t 2 "g_s3" +OpName %_ "" +OpName %ts2 "ts2" +OpName %_Globals_ "_Globals_" +OpMemberName %_Globals_ 0 "g_b" +OpName %__0 "" +OpName %ts3 "ts3" +OpName %ts4 "ts4" +OpName %fo "fo" +OpMemberDecorate %S_0 0 Offset 0 +OpMemberDecorate %S_0 1 Offset 4 +OpMemberDecorate %U_t 0 Offset 0 +OpMemberDecorate %U_t 1 Offset 8 +OpMemberDecorate %U_t 2 Offset 16 +OpDecorate %U_t BufferBlock +OpDecorate %_ DescriptorSet 0 +OpMemberDecorate %_Globals_ 0 Offset 0 +OpDecorate %_Globals_ Block +OpDecorate %__0 DescriptorSet 0 +OpDecorate %__0 Binding 0 +OpDecorate %fo Location 0 +%void = OpTypeVoid +%15 = OpTypeFunction %void +%float = OpTypeFloat 32 +%S = OpTypeStruct %float %float +%_ptr_Function_S = OpTypePointer Function %S +%S_0 = OpTypeStruct %float %float +%U_t = OpTypeStruct %S_0 %S_0 %S_0 +%_ptr_Uniform_U_t = OpTypePointer Uniform %U_t +%_ = OpVariable %_ptr_Uniform_U_t Uniform +%int = OpTypeInt 32 1 +%int_0 = OpConstant %int 0 +%_ptr_Uniform_S_0 = OpTypePointer Uniform %S_0 +%_ptr_Function_float = OpTypePointer Function %float +%int_1 = OpConstant %int 1 +%uint = OpTypeInt 32 0 +%_Globals_ = OpTypeStruct %uint +%_ptr_Uniform__Globals_ = OpTypePointer Uniform %_Globals_ +%__0 = OpVariable %_ptr_Uniform__Globals_ Uniform +%_ptr_Uniform_uint = OpTypePointer Uniform %uint +%bool = OpTypeBool +%uint_0 = OpConstant %uint 0 +%_ptr_Output_float = OpTypePointer Output %float +%fo = OpVariable %_ptr_Output_float Output +%main = OpFunction %void None %15 +%30 = OpLabel +%ts1 = OpVariable %_ptr_Function_S Function +%ts2 = OpVariable %_ptr_Function_S Function +%ts3 = OpVariable %_ptr_Function_S Function +%ts4 = OpVariable %_ptr_Function_S Function +%31 = OpAccessChain %_ptr_Uniform_S_0 %_ %int_0 +%32 = OpLoad %S_0 %31 +%33 = OpCompositeExtract %float %32 0 +%34 = OpAccessChain %_ptr_Function_float %ts1 %int_0 +OpStore %34 %33 +%35 = OpCompositeExtract %float %32 1 +%36 = OpAccessChain %_ptr_Function_float %ts1 %int_1 +OpStore %36 %35 +%37 = OpAccessChain %_ptr_Uniform_S_0 %_ %int_1 +%38 = OpLoad %S_0 %37 +%39 = OpCompositeExtract %float %38 0 +%40 = OpAccessChain %_ptr_Function_float %ts2 %int_0 +OpStore %40 %39 +%41 = OpCompositeExtract %float %38 1 +%42 = OpAccessChain %_ptr_Function_float %ts2 %int_1 +OpStore %42 %41 +%43 = OpAccessChain %_ptr_Uniform_uint %__0 %int_0 +%44 = OpLoad %uint %43 +%45 = OpINotEqual %bool %44 %uint_0 +OpSelectionMerge %46 None +OpBranchConditional %45 %47 %48 +%47 = OpLabel +%49 = OpLoad %S %ts1 +OpStore %ts3 %49 +OpBranch %46 +%48 = OpLabel +%50 = OpLoad %S %ts2 +OpStore %ts3 %50 +OpBranch %46 +%46 = OpLabel +%51 = OpLoad %S %ts3 +OpStore %ts4 %51 +%52 = OpAccessChain %_ptr_Function_float %ts4 %int_1 +%53 = OpLoad %float %52 +OpStore %fo %53 +OpReturn +OpFunctionEnd + )"; SinglePassRunAndMatch(text, true); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/set_spec_const_default_value_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/set_spec_const_default_value_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/set_spec_const_default_value_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/set_spec_const_default_value_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -236,7 +236,7 @@ "OpDecorate %2 SpecId 202\n" "%double = OpTypeFloat 64\n" "%1 = OpSpecConstant %double 3.14159265358979\n" - "%2 = OpSpecConstant %double 0.142857\n", + "%2 = OpSpecConstant %double 0.14285\n", // default values SpecIdToValueStrMap{{201, "0x1.fffffffffffffp+1024"}, {202, "-32.5"}}, @@ -413,17 +413,17 @@ "OpDecorate %2 SpecId 202\n" "%float = OpTypeFloat 32\n" "%double = OpTypeFloat 64\n" - "%1 = OpSpecConstant %float 3.14159\n" - "%2 = OpSpecConstant %double 0.142857\n", + "%1 = OpSpecConstant %float 3.1415\n" + "%2 = OpSpecConstant %double 0.14285\n", // default values - SpecIdToValueStrMap{{201, "3.14159"}, {202, "0.142857"}}, + SpecIdToValueStrMap{{201, "3.1415"}, {202, "0.14285"}}, // expected "OpDecorate %1 SpecId 201\n" "OpDecorate %2 SpecId 202\n" "%float = OpTypeFloat 32\n" "%double = OpTypeFloat 64\n" - "%1 = OpSpecConstant %float 3.14159\n" - "%2 = OpSpecConstant %double 0.142857\n", + "%1 = OpSpecConstant %float 3.1415\n" + "%2 = OpSpecConstant %double 0.14285\n", }, // 17. OpGroupDecorate may have multiple target ids defined by the same // eligible spec constant @@ -700,7 +700,7 @@ "OpDecorate %2 SpecId 202\n" "%double = OpTypeFloat 64\n" "%1 = OpSpecConstant %double 3.14159265358979\n" - "%2 = OpSpecConstant %double 0.142857\n", + "%2 = OpSpecConstant %double 0.14285\n", // default values SpecIdToValueBitPatternMap{{201, {0xffffffff, 0x7fffffff}}, {202, {0x00000000, 0xc0404000}}}, @@ -1055,7 +1055,7 @@ "%double = OpTypeFloat 64\n" "%1 = OpSpecConstant %int 100\n" "%2 = OpSpecConstant %ulong 200\n" - "%3 = OpSpecConstant %double 3.1415926\n", + "%3 = OpSpecConstant %double 3.141592653\n", // default values SpecIdToValueBitPatternMap{ {100, {10, 0}}, {101, {11}}, {102, {0xffffffff}}}, @@ -1068,7 +1068,7 @@ "%double = OpTypeFloat 64\n" "%1 = OpSpecConstant %int 100\n" "%2 = OpSpecConstant %ulong 200\n" - "%3 = OpSpecConstant %double 3.1415926\n", + "%3 = OpSpecConstant %double 3.141592653\n", }, })); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/simplification_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/simplification_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/simplification_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/simplification_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,205 @@ +// Copyright (c) 2018 Google LLC +// +// 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. + +#include "opt/simplification_pass.h" + +#include "assembly_builder.h" +#include "gmock/gmock.h" +#include "pass_fixture.h" + +namespace { + +using namespace spvtools; + +using SimplificationTest = PassTest<::testing::Test>; + +#ifdef SPIRV_EFFCEE +TEST_F(SimplificationTest, StraightLineTest) { + // Testing that folding rules are combined in simple straight line code. + const std::string text = R"(OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %i %o + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 430 + OpSourceExtension "GL_GOOGLE_cpp_style_line_directive" + OpSourceExtension "GL_GOOGLE_include_directive" + OpName %main "main" + OpName %i "i" + OpName %o "o" + OpDecorate %i Flat + OpDecorate %i Location 0 + OpDecorate %o Location 0 + %void = OpTypeVoid + %8 = OpTypeFunction %void + %int = OpTypeInt 32 1 + %v4int = OpTypeVector %int 4 + %int_0 = OpConstant %int 0 + %13 = OpConstantComposite %v4int %int_0 %int_0 %int_0 %int_0 + %int_1 = OpConstant %int 1 +%_ptr_Input_v4int = OpTypePointer Input %v4int + %i = OpVariable %_ptr_Input_v4int Input +%_ptr_Output_int = OpTypePointer Output %int + %o = OpVariable %_ptr_Output_int Output + %main = OpFunction %void None %8 + %21 = OpLabel + %31 = OpCompositeInsert %v4int %int_1 %13 0 +; CHECK: [[load:%[a-zA-Z_\d]+]] = OpLoad + %23 = OpLoad %v4int %i + %33 = OpCompositeInsert %v4int %int_0 %23 0 + %35 = OpCompositeExtract %int %31 0 +; CHECK: [[extract:%[a-zA-Z_\d]+]] = OpCompositeExtract %int [[load]] 1 + %37 = OpCompositeExtract %int %33 1 +; CHECK: [[add:%[a-zA-Z_\d]+]] = OpIAdd %int %int_1 [[extract]] + %29 = OpIAdd %int %35 %37 + OpStore %o %29 + OpReturn + OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, false); +} + +TEST_F(SimplificationTest, AcrossBasicBlocks) { + // Testing that folding rules are combined across basic blocks. + const std::string text = R"(OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %i %o + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 430 + OpSourceExtension "GL_GOOGLE_cpp_style_line_directive" + OpSourceExtension "GL_GOOGLE_include_directive" + OpName %main "main" + OpName %i "i" + OpName %o "o" + OpDecorate %i Flat + OpDecorate %i Location 0 + OpDecorate %o Location 0 + %void = OpTypeVoid + %8 = OpTypeFunction %void + %int = OpTypeInt 32 1 + %v4int = OpTypeVector %int 4 + %int_0 = OpConstant %int 0 +%_ptr_Input_v4int = OpTypePointer Input %v4int + %i = OpVariable %_ptr_Input_v4int Input + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Input_int = OpTypePointer Input %int + %int_10 = OpConstant %int 10 + %bool = OpTypeBool + %int_1 = OpConstant %int 1 +%_ptr_Output_int = OpTypePointer Output %int + %o = OpVariable %_ptr_Output_int Output + %main = OpFunction %void None %8 + %24 = OpLabel +; CHECK: [[load:%[a-zA-Z_\d]+]] = OpLoad %v4int %i + %25 = OpLoad %v4int %i + %41 = OpCompositeInsert %v4int %int_0 %25 0 + %27 = OpAccessChain %_ptr_Input_int %i %uint_0 + %28 = OpLoad %int %27 + %29 = OpSGreaterThan %bool %28 %int_10 + OpSelectionMerge %30 None + OpBranchConditional %29 %31 %32 + %31 = OpLabel + %43 = OpCopyObject %v4int %25 + OpBranch %30 + %32 = OpLabel + %45 = OpCopyObject %v4int %25 + OpBranch %30 + %30 = OpLabel + %50 = OpPhi %v4int %43 %31 %45 %32 +; CHECK: [[extract1:%[a-zA-Z_\d]+]] = OpCompositeExtract %int [[load]] 0 + %47 = OpCompositeExtract %int %50 0 +; CHECK: [[extract2:%[a-zA-Z_\d]+]] = OpCompositeExtract %int [[load]] 1 + %49 = OpCompositeExtract %int %41 1 +; CHECK: [[add:%[a-zA-Z_\d]+]] = OpIAdd %int [[extract1]] [[extract2]] + %39 = OpIAdd %int %47 %49 + OpStore %o %39 + OpReturn + OpFunctionEnd + +)"; + + SinglePassRunAndMatch(text, false); +} + +TEST_F(SimplificationTest, ThroughLoops) { + // Testing that folding rules are applied multiple times to instructions + // to be able to propagate across loop iterations. + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %o %i + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 430 + OpSourceExtension "GL_GOOGLE_cpp_style_line_directive" + OpSourceExtension "GL_GOOGLE_include_directive" + OpName %main "main" + OpName %o "o" + OpName %i "i" + OpDecorate %o Location 0 + OpDecorate %i Flat + OpDecorate %i Location 0 + %void = OpTypeVoid + %8 = OpTypeFunction %void + %int = OpTypeInt 32 1 + %v4int = OpTypeVector %int 4 + %int_0 = OpConstant %int 0 +; CHECK: [[constant:%[a-zA-Z_\d]+]] = OpConstantComposite %v4int %int_0 %int_0 %int_0 %int_0 + %13 = OpConstantComposite %v4int %int_0 %int_0 %int_0 %int_0 + %bool = OpTypeBool +%_ptr_Output_int = OpTypePointer Output %int + %o = OpVariable %_ptr_Output_int Output +%_ptr_Input_v4int = OpTypePointer Input %v4int + %i = OpVariable %_ptr_Input_v4int Input + %68 = OpUndef %v4int + %main = OpFunction %void None %8 + %23 = OpLabel +; CHECK: [[load:%[a-zA-Z_\d]+]] = OpLoad %v4int %i + %load = OpLoad %v4int %i + OpBranch %24 + %24 = OpLabel + %67 = OpPhi %v4int %load %23 %64 %26 +; CHECK: OpLoopMerge [[merge_lab:%[a-zA-Z_\d]+]] + OpLoopMerge %25 %26 None + OpBranch %27 + %27 = OpLabel + %48 = OpCompositeExtract %int %67 0 + %30 = OpIEqual %bool %48 %int_0 + OpBranchConditional %30 %31 %25 + %31 = OpLabel + %50 = OpCompositeExtract %int %67 0 + %54 = OpCompositeExtract %int %67 1 + %58 = OpCompositeExtract %int %67 2 + %62 = OpCompositeExtract %int %67 3 + %64 = OpCompositeConstruct %v4int %50 %54 %58 %62 + OpBranch %26 + %26 = OpLabel + OpBranch %24 + %25 = OpLabel +; CHECK: [[merge_lab]] = OpLabel +; CHECK: [[extract:%[a-zA-Z_\d]+]] = OpCompositeExtract %int [[load]] 0 + %66 = OpCompositeExtract %int %67 0 +; CHECK-NEXT: OpStore %o [[extract]] + OpStore %o %66 + OpReturn + OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, false); +} +#endif +} // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/strength_reduction_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/strength_reduction_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/strength_reduction_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/strength_reduction_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -290,8 +290,8 @@ "%gl_FragColor = OpVariable %_ptr_Output_v4float Output", "%float_1 = OpConstant %float 1", "%int_10 = OpConstant %int 10", - "%float_0_4 = OpConstant %float 0.4", - "%float_0_8 = OpConstant %float 0.8", + "%float_0_375 = OpConstant %float 0.375", + "%float_0_75 = OpConstant %float 0.75", "%uint = OpTypeInt 32 0", "%uint_8 = OpConstant %uint 8", "%uint_1 = OpConstant %uint 1", @@ -302,7 +302,7 @@ "%26 = OpFunctionCall %int %foo_i1_ %param", "%27 = OpConvertSToF %float %26", "%28 = OpFDiv %float %float_1 %27", - "%31 = OpCompositeConstruct %v4float %28 %float_0_4 %float_0_8 %float_1", + "%31 = OpCompositeConstruct %v4float %28 %float_0_375 %float_0_75 %float_1", "OpStore %gl_FragColor %31", "OpReturn", "OpFunctionEnd" @@ -376,8 +376,8 @@ "%gl_FragColor = OpVariable %_ptr_Output_v4float Output", "%float_1 = OpConstant %float 1", "%int_10 = OpConstant %int 10", - "%float_0_4 = OpConstant %float 0.4", - "%float_0_8 = OpConstant %float 0.8", + "%float_0_375 = OpConstant %float 0.375", + "%float_0_75 = OpConstant %float 0.75", "%uint = OpTypeInt 32 0", "%uint_8 = OpConstant %uint 8", "%uint_1 = OpConstant %uint 1", @@ -388,7 +388,7 @@ "%26 = OpFunctionCall %int %foo_i1_ %param", "%27 = OpConvertSToF %float %26", "%28 = OpFDiv %float %float_1 %27", - "%31 = OpCompositeConstruct %v4float %28 %float_0_4 %float_0_8 %float_1", + "%31 = OpCompositeConstruct %v4float %28 %float_0_375 %float_0_75 %float_1", "OpStore %gl_FragColor %31", "OpReturn", "OpFunctionEnd" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/strip_reflect_info_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/strip_reflect_info_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/strip_reflect_info_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/strip_reflect_info_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,65 @@ +// Copyright (c) 2018 Google LLC +// +// 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. + +#include "pass_fixture.h" +#include "pass_utils.h" + +namespace { + +using namespace spvtools; + +using StripLineReflectInfoTest = PassTest<::testing::Test>; + +TEST_F(StripLineReflectInfoTest, StripHlslSemantic) { + // This is a non-sensical example, but exercises the instructions. + std::string before = R"(OpCapability Shader +OpCapability Linkage +OpExtension "SPV_GOOGLE_decorate_string" +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpMemoryModel Logical Simple +OpDecorateStringGOOGLE %float HlslSemanticGOOGLE "foobar" +OpDecorateStringGOOGLE %void HlslSemanticGOOGLE "my goodness" +%void = OpTypeVoid +%float = OpTypeFloat 32 +)"; + std::string after = R"(OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical Simple +%void = OpTypeVoid +%float = OpTypeFloat 32 +)"; + + SinglePassRunAndCheck(before, after, false); +} + +TEST_F(StripLineReflectInfoTest, StripHlslCounterBuffer) { + std::string before = R"(OpCapability Shader +OpCapability Linkage +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpMemoryModel Logical Simple +OpDecorateId %void HlslCounterBufferGOOGLE %float +%void = OpTypeVoid +%float = OpTypeFloat 32 +)"; + std::string after = R"(OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical Simple +%void = OpTypeVoid +%float = OpTypeFloat 32 +)"; + + SinglePassRunAndCheck(before, after, false); +} + +} // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/type_manager_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/type_manager_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/type_manager_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/type_manager_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -62,6 +62,8 @@ << assembly; } +#endif + std::vector> GenerateAllTypes() { // Types in this test case are only equal to themselves, nothing else. std::vector> types; @@ -168,8 +170,6 @@ return types; } -#endif - TEST(TypeManager, TypeStrings) { const std::string text = R"( OpTypeForwardPointer !20 !2 ; id for %p is 20, Uniform is 2 @@ -644,6 +644,84 @@ EXPECT_TRUE(type->IsSame(&st)); } +TEST(TypeManager, RegisterAndRemoveId) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +%1 = OpTypeInt 32 0 +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + EXPECT_NE(context, nullptr); + + uint32_t id = 2u; + { + // Ensure that u32 goes out of scope. + Integer u32(32, false); + Struct st({&u32}); + context->get_type_mgr()->RegisterType(id, st); + } + + context->get_type_mgr()->RemoveId(id); + EXPECT_EQ(nullptr, context->get_type_mgr()->GetType(id)); +} + +TEST(TypeManager, RegisterAndRemoveIdAllTypes) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + EXPECT_NE(context, nullptr); + + std::vector> types = GenerateAllTypes(); + uint32_t id = 1u; + for (auto& t : types) { + context->get_type_mgr()->RegisterType(id, *t); + EXPECT_EQ(*t, *context->get_type_mgr()->GetType(id)); + } + types.clear(); + + for (; id > 0; --id) { + context->get_type_mgr()->RemoveId(id); + EXPECT_EQ(nullptr, context->get_type_mgr()->GetType(id)); + } +} + +TEST(TypeManager, RegisterAndRemoveIdWithDecorations) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +%1 = OpTypeInt 32 0 +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + EXPECT_NE(context, nullptr); + + uint32_t id = 2u; + { + Integer u32(32, false); + Struct st({&u32, &u32}); + st.AddDecoration({10}); + st.AddDecoration({11}); + st.AddMemberDecoration(0, {{35, 4}}); + st.AddMemberDecoration(1, {{35, 4}}); + st.AddMemberDecoration(1, {{36, 5}}); + context->get_type_mgr()->RegisterType(id, st); + EXPECT_EQ(st, *context->get_type_mgr()->GetType(id)); + } + + context->get_type_mgr()->RemoveId(id); + EXPECT_EQ(nullptr, context->get_type_mgr()->GetType(id)); +} + #ifdef SPIRV_EFFCEE TEST(TypeManager, GetTypeInstructionInt) { const std::string text = R"( diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/types_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/types_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/opt/types_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/opt/types_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -174,6 +174,7 @@ types.emplace_back(new Pointer(f32, SpvStorageClassInput)); types.emplace_back(new Pointer(sts32f32, SpvStorageClassFunction)); types.emplace_back(new Pointer(a42f32, SpvStorageClassFunction)); + types.emplace_back(new Pointer(voidt, SpvStorageClassFunction)); // Function types.emplace_back(new Function(voidt, {})); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/target_env_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/target_env_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/target_env_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/target_env_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -41,7 +41,7 @@ TEST_P(TargetEnvTest, ValidSpirvVersion) { auto spirv_version = spvVersionForTargetEnv(GetParam()); - ASSERT_THAT(spirv_version, AnyOf(0x10000, 0x10100, 0x10200)); + ASSERT_THAT(spirv_version, AnyOf(0x10000, 0x10100, 0x10200, 0x10300)); } INSTANTIATE_TEST_CASE_P(AllTargetEnvs, TargetEnvTest, @@ -49,7 +49,7 @@ TEST(GetContextTest, InvalidTargetEnvProducesNull) { // Use a value beyond the last valid enum value. - spv_context context = spvContextCreate(static_cast(17)); + spv_context context = spvContextCreate(static_cast(30)); EXPECT_EQ(context, nullptr); } @@ -75,7 +75,9 @@ {"spv1.0", true, SPV_ENV_UNIVERSAL_1_0}, {"spv1.1", true, SPV_ENV_UNIVERSAL_1_1}, {"spv1.2", true, SPV_ENV_UNIVERSAL_1_2}, + {"spv1.3", true, SPV_ENV_UNIVERSAL_1_3}, {"vulkan1.0", true, SPV_ENV_VULKAN_1_0}, + {"vulkan1.1", true, SPV_ENV_VULKAN_1_1}, {"opencl2.1", true, SPV_ENV_OPENCL_2_1}, {"opencl2.2", true, SPV_ENV_OPENCL_2_2}, {"opengl4.0", true, SPV_ENV_OPENGL_4_0}, @@ -89,6 +91,10 @@ {"opencl2.0embedded", true, SPV_ENV_OPENCL_EMBEDDED_2_0}, {"opencl2.1embedded", true, SPV_ENV_OPENCL_EMBEDDED_2_1}, {"opencl2.2embedded", true, SPV_ENV_OPENCL_EMBEDDED_2_2}, + {"opencl2.3", false, SPV_ENV_UNIVERSAL_1_0}, + {"opencl3.0", false, SPV_ENV_UNIVERSAL_1_0}, + {"vulkan1.2", false, SPV_ENV_UNIVERSAL_1_0}, + {"vulkan2.0", false, SPV_ENV_UNIVERSAL_1_0}, {nullptr, false, SPV_ENV_UNIVERSAL_1_0}, {"", false, SPV_ENV_UNIVERSAL_1_0}, {"abc", false, SPV_ENV_UNIVERSAL_1_0}, diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/text_to_binary.constant_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/text_to_binary.constant_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/text_to_binary.constant_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/text_to_binary.constant_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -518,8 +518,8 @@ "%1 = OpTypeFloat 32\n%2 = OpConstant %1 -12.5\n", // 64-bit float "%1 = OpTypeFloat 64\n%2 = OpConstant %1 0\n", - "%1 = OpTypeFloat 64\n%2 = OpConstant %1 1.79769e+308\n", - "%1 = OpTypeFloat 64\n%2 = OpConstant %1 -1.79769e+308\n", + "%1 = OpTypeFloat 64\n%2 = OpConstant %1 1.79767e+308\n", + "%1 = OpTypeFloat 64\n%2 = OpConstant %1 -1.79767e+308\n", }), ); INSTANTIATE_TEST_CASE_P( @@ -628,8 +628,8 @@ "%1 = OpTypeFloat 32\n%2 = OpSpecConstant %1 -12.5\n", // 64-bit float "%1 = OpTypeFloat 64\n%2 = OpSpecConstant %1 0\n", - "%1 = OpTypeFloat 64\n%2 = OpSpecConstant %1 1.79769e+308\n", - "%1 = OpTypeFloat 64\n%2 = OpSpecConstant %1 -1.79769e+308\n", + "%1 = OpTypeFloat 64\n%2 = OpSpecConstant %1 1.79767e+308\n", + "%1 = OpTypeFloat 64\n%2 = OpSpecConstant %1 -1.79767e+308\n", }), ); // Test OpSpecConstantOp diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/text_to_binary.extension_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/text_to_binary.extension_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/text_to_binary.extension_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/text_to_binary.extension_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -33,6 +33,12 @@ using ::testing::Values; using ::testing::ValuesIn; +// Returns a generator of common Vulkan environment values to be tested. +std::vector CommonVulkanEnvs() { + return {SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, SPV_ENV_UNIVERSAL_1_2, + SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_0, SPV_ENV_VULKAN_1_1}; +} + TEST_F(TextToBinaryTest, InvalidExtInstImportName) { EXPECT_THAT(CompileFailure("%1 = OpExtInstImport \"Haskell.std\""), Eq("Invalid extended instruction import 'Haskell.std'")); @@ -119,7 +125,8 @@ // Check round trip through the disassembler. EXPECT_THAT(EncodeAndDecodeSuccessfully(ac.input, SPV_BINARY_TO_TEXT_OPTION_NONE, env), - Eq(ac.input)); + Eq(ac.input)) + << "target env: " << spvTargetEnvDescription(env) << "\n"; } // SPV_KHR_shader_ballot @@ -155,6 +162,61 @@ SpvBuiltInSubgroupLtMaskKHR})}, })), ); +INSTANTIATE_TEST_CASE_P( + SPV_KHR_shader_ballot_vulkan_1_1, ExtensionRoundTripTest, + // In SPIR-V 1.3 and Vulkan 1.1 we can drop the KHR suffix on the + // builtin enums. + Combine(Values(SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_1), + ValuesIn(std::vector{ + {"OpCapability SubgroupBallotKHR\n", + MakeInstruction(SpvOpCapability, + {SpvCapabilitySubgroupBallotKHR})}, + {"%2 = OpSubgroupBallotKHR %1 %3\n", + MakeInstruction(SpvOpSubgroupBallotKHR, {1, 2, 3})}, + {"%2 = OpSubgroupFirstInvocationKHR %1 %3\n", + MakeInstruction(SpvOpSubgroupFirstInvocationKHR, {1, 2, 3})}, + {"OpDecorate %1 BuiltIn SubgroupEqMask\n", + MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn, + SpvBuiltInSubgroupEqMask})}, + {"OpDecorate %1 BuiltIn SubgroupGeMask\n", + MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn, + SpvBuiltInSubgroupGeMask})}, + {"OpDecorate %1 BuiltIn SubgroupGtMask\n", + MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn, + SpvBuiltInSubgroupGtMask})}, + {"OpDecorate %1 BuiltIn SubgroupLeMask\n", + MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn, + SpvBuiltInSubgroupLeMask})}, + {"OpDecorate %1 BuiltIn SubgroupLtMask\n", + MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn, + SpvBuiltInSubgroupLtMask})}, + })), ); + +// The old builtin names (with KHR suffix) still work in the assmebler, and +// map to the enums without the KHR. +INSTANTIATE_TEST_CASE_P( + SPV_KHR_shader_ballot_vulkan_1_1_alias_check, ExtensionAssemblyTest, + // In SPIR-V 1.3 and Vulkan 1.1 we can drop the KHR suffix on the + // builtin enums. + Combine(Values(SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_1), + ValuesIn(std::vector{ + {"OpDecorate %1 BuiltIn SubgroupEqMaskKHR\n", + MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn, + SpvBuiltInSubgroupEqMask})}, + {"OpDecorate %1 BuiltIn SubgroupGeMaskKHR\n", + MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn, + SpvBuiltInSubgroupGeMask})}, + {"OpDecorate %1 BuiltIn SubgroupGtMaskKHR\n", + MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn, + SpvBuiltInSubgroupGtMask})}, + {"OpDecorate %1 BuiltIn SubgroupLeMaskKHR\n", + MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn, + SpvBuiltInSubgroupLeMask})}, + {"OpDecorate %1 BuiltIn SubgroupLtMaskKHR\n", + MakeInstruction(SpvOpDecorate, {1, SpvDecorationBuiltIn, + SpvBuiltInSubgroupLtMask})}, + })), ); + // SPV_KHR_shader_draw_parameters INSTANTIATE_TEST_CASE_P( @@ -162,8 +224,7 @@ // We'll get coverage over operand tables by trying the universal // environments, and at least one specific environment. Combine( - Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_VULKAN_1_0), + ValuesIn(CommonVulkanEnvs()), ValuesIn(std::vector{ {"OpCapability DrawParameters\n", MakeInstruction(SpvOpCapability, {SpvCapabilityDrawParameters})}, @@ -184,8 +245,7 @@ SPV_KHR_subgroup_vote, ExtensionRoundTripTest, // We'll get coverage over operand tables by trying the universal // environments, and at least one specific environment. - Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_VULKAN_1_0), + Combine(ValuesIn(CommonVulkanEnvs()), ValuesIn(std::vector{ {"OpCapability SubgroupVoteKHR\n", MakeInstruction(SpvOpCapability, @@ -204,8 +264,7 @@ SPV_KHR_16bit_storage, ExtensionRoundTripTest, // We'll get coverage over operand tables by trying the universal // environments, and at least one specific environment. - Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_VULKAN_1_0), + Combine(ValuesIn(CommonVulkanEnvs()), ValuesIn(std::vector{ {"OpCapability StorageBuffer16BitAccess\n", MakeInstruction(SpvOpCapability, @@ -213,11 +272,11 @@ {"OpCapability StorageBuffer16BitAccess\n", MakeInstruction(SpvOpCapability, {SpvCapabilityStorageBuffer16BitAccess})}, - {"OpCapability UniformAndStorageBuffer16BitAccess\n", + {"OpCapability StorageUniform16\n", MakeInstruction( SpvOpCapability, {SpvCapabilityUniformAndStorageBuffer16BitAccess})}, - {"OpCapability UniformAndStorageBuffer16BitAccess\n", + {"OpCapability StorageUniform16\n", MakeInstruction(SpvOpCapability, {SpvCapabilityStorageUniform16})}, {"OpCapability StoragePushConstant16\n", @@ -230,18 +289,16 @@ INSTANTIATE_TEST_CASE_P( SPV_KHR_16bit_storage_alias_check, ExtensionAssemblyTest, - Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_VULKAN_1_0), + Combine(ValuesIn(CommonVulkanEnvs()), ValuesIn(std::vector{ // The old name maps to the new enum. {"OpCapability StorageUniformBufferBlock16\n", MakeInstruction(SpvOpCapability, {SpvCapabilityStorageBuffer16BitAccess})}, - // The old name maps to the new enum. - {"OpCapability StorageUniform16\n", - MakeInstruction( - SpvOpCapability, - {SpvCapabilityUniformAndStorageBuffer16BitAccess})}, + // The new name maps to the old enum. + {"OpCapability UniformAndStorageBuffer16BitAccess\n", + MakeInstruction(SpvOpCapability, + {SpvCapabilityStorageUniform16})}, })), ); // SPV_KHR_device_group @@ -250,8 +307,7 @@ SPV_KHR_device_group, ExtensionRoundTripTest, // We'll get coverage over operand tables by trying the universal // environments, and at least one specific environment. - Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_VULKAN_1_0), + Combine(ValuesIn(CommonVulkanEnvs()), ValuesIn(std::vector{ {"OpCapability DeviceGroup\n", MakeInstruction(SpvOpCapability, {SpvCapabilityDeviceGroup})}, @@ -430,4 +486,175 @@ {SpvCapabilityVariablePointersStorageBuffer})}, })), ); +// SPV_GOOGLE_decorate_string + +INSTANTIATE_TEST_CASE_P( + SPV_GOOGLE_decorate_string, ExtensionRoundTripTest, + Combine( + // We'll get coverage over operand tables by trying the universal + // environments, and at least one specific environment. + Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, + SPV_ENV_UNIVERSAL_1_2, SPV_ENV_VULKAN_1_0), + ValuesIn(std::vector{ + {"OpDecorateStringGOOGLE %1 HlslSemanticGOOGLE \"ABC\"\n", + MakeInstruction(SpvOpDecorateStringGOOGLE, + {1, SpvDecorationHlslSemanticGOOGLE}, + MakeVector("ABC"))}, + {"OpMemberDecorateStringGOOGLE %1 3 HlslSemanticGOOGLE \"DEF\"\n", + MakeInstruction(SpvOpMemberDecorateStringGOOGLE, + {1, 3, SpvDecorationHlslSemanticGOOGLE}, + MakeVector("DEF"))}, + })), ); + +// SPV_GOOGLE_hlsl_functionality1 + +INSTANTIATE_TEST_CASE_P( + SPV_GOOGLE_hlsl_functionality1, ExtensionRoundTripTest, + Combine( + // We'll get coverage over operand tables by trying the universal + // environments, and at least one specific environment. + Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, + SPV_ENV_UNIVERSAL_1_2, SPV_ENV_VULKAN_1_0), + // HlslSemanticGOOGLE is tested in SPV_GOOGLE_decorate_string, since + // they are coupled together. + ValuesIn(std::vector{ + {"OpDecorateId %1 HlslCounterBufferGOOGLE %2\n", + MakeInstruction(SpvOpDecorateId, + {1, SpvDecorationHlslCounterBufferGOOGLE, 2})}, + })), ); + +// SPV_NV_shader_subgroup_partitioned + +INSTANTIATE_TEST_CASE_P( + SPV_NV_shader_subgroup_partitioned, ExtensionRoundTripTest, + Combine( + Values(SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_1), + ValuesIn(std::vector{ + {"OpExtension \"SPV_NV_shader_subgroup_partitioned\"\n", + MakeInstruction(SpvOpExtension, + MakeVector("SPV_NV_shader_subgroup_partitioned"))}, + {"OpCapability GroupNonUniformPartitionedNV\n", + MakeInstruction(SpvOpCapability, + {SpvCapabilityGroupNonUniformPartitionedNV})}, + // Check the new capability's token number + {"OpCapability GroupNonUniformPartitionedNV\n", + MakeInstruction(SpvOpCapability, {5297})}, + {"%2 = OpGroupNonUniformPartitionNV %1 %3\n", + MakeInstruction(SpvOpGroupNonUniformPartitionNV, {1, 2, 3})}, + // Check the new instruction's token number + {"%2 = OpGroupNonUniformPartitionNV %1 %3\n", + MakeInstruction(static_cast(5296), {1, 2, 3})}, + // Check the new group operations + {"%2 = OpGroupIAdd %1 %3 PartitionedReduceNV %4\n", + MakeInstruction(SpvOpGroupIAdd, + {1, 2, 3, SpvGroupOperationPartitionedReduceNV, + 4})}, + {"%2 = OpGroupIAdd %1 %3 PartitionedReduceNV %4\n", + MakeInstruction(SpvOpGroupIAdd, {1, 2, 3, 6, 4})}, + {"%2 = OpGroupIAdd %1 %3 PartitionedInclusiveScanNV %4\n", + MakeInstruction(SpvOpGroupIAdd, + {1, 2, 3, + SpvGroupOperationPartitionedInclusiveScanNV, 4})}, + {"%2 = OpGroupIAdd %1 %3 PartitionedInclusiveScanNV %4\n", + MakeInstruction(SpvOpGroupIAdd, {1, 2, 3, 7, 4})}, + {"%2 = OpGroupIAdd %1 %3 PartitionedExclusiveScanNV %4\n", + MakeInstruction(SpvOpGroupIAdd, + {1, 2, 3, + SpvGroupOperationPartitionedExclusiveScanNV, 4})}, + {"%2 = OpGroupIAdd %1 %3 PartitionedExclusiveScanNV %4\n", + MakeInstruction(SpvOpGroupIAdd, {1, 2, 3, 8, 4})}, + })), ); + +// SPV_EXT_descriptor_indexing + +INSTANTIATE_TEST_CASE_P( + SPV_EXT_descriptor_indexing, ExtensionRoundTripTest, + Combine( + Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, + SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_0, + SPV_ENV_VULKAN_1_1), + ValuesIn(std::vector{ + {"OpExtension \"SPV_EXT_descriptor_indexing\"\n", + MakeInstruction(SpvOpExtension, + MakeVector("SPV_EXT_descriptor_indexing"))}, + // Check capabilities, by name + {"OpCapability ShaderNonUniformEXT\n", + MakeInstruction(SpvOpCapability, + {SpvCapabilityShaderNonUniformEXT})}, + {"OpCapability RuntimeDescriptorArrayEXT\n", + MakeInstruction(SpvOpCapability, + {SpvCapabilityRuntimeDescriptorArrayEXT})}, + {"OpCapability InputAttachmentArrayDynamicIndexingEXT\n", + MakeInstruction( + SpvOpCapability, + {SpvCapabilityInputAttachmentArrayDynamicIndexingEXT})}, + {"OpCapability UniformTexelBufferArrayDynamicIndexingEXT\n", + MakeInstruction( + SpvOpCapability, + {SpvCapabilityUniformTexelBufferArrayDynamicIndexingEXT})}, + {"OpCapability StorageTexelBufferArrayDynamicIndexingEXT\n", + MakeInstruction( + SpvOpCapability, + {SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT})}, + {"OpCapability UniformBufferArrayNonUniformIndexingEXT\n", + MakeInstruction( + SpvOpCapability, + {SpvCapabilityUniformBufferArrayNonUniformIndexingEXT})}, + {"OpCapability SampledImageArrayNonUniformIndexingEXT\n", + MakeInstruction( + SpvOpCapability, + {SpvCapabilitySampledImageArrayNonUniformIndexingEXT})}, + {"OpCapability StorageBufferArrayNonUniformIndexingEXT\n", + MakeInstruction( + SpvOpCapability, + {SpvCapabilityStorageBufferArrayNonUniformIndexingEXT})}, + {"OpCapability StorageImageArrayNonUniformIndexingEXT\n", + MakeInstruction( + SpvOpCapability, + {SpvCapabilityStorageImageArrayNonUniformIndexingEXT})}, + {"OpCapability InputAttachmentArrayNonUniformIndexingEXT\n", + MakeInstruction( + SpvOpCapability, + {SpvCapabilityInputAttachmentArrayNonUniformIndexingEXT})}, + {"OpCapability UniformTexelBufferArrayNonUniformIndexingEXT\n", + MakeInstruction( + SpvOpCapability, + {SpvCapabilityUniformTexelBufferArrayNonUniformIndexingEXT})}, + {"OpCapability StorageTexelBufferArrayNonUniformIndexingEXT\n", + MakeInstruction( + SpvOpCapability, + {SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT})}, + // Check capabilities, by number + {"OpCapability ShaderNonUniformEXT\n", + MakeInstruction(SpvOpCapability, {5301})}, + {"OpCapability RuntimeDescriptorArrayEXT\n", + MakeInstruction(SpvOpCapability, {5302})}, + {"OpCapability InputAttachmentArrayDynamicIndexingEXT\n", + MakeInstruction(SpvOpCapability, {5303})}, + {"OpCapability UniformTexelBufferArrayDynamicIndexingEXT\n", + MakeInstruction(SpvOpCapability, {5304})}, + {"OpCapability StorageTexelBufferArrayDynamicIndexingEXT\n", + MakeInstruction(SpvOpCapability, {5305})}, + {"OpCapability UniformBufferArrayNonUniformIndexingEXT\n", + MakeInstruction(SpvOpCapability, {5306})}, + {"OpCapability SampledImageArrayNonUniformIndexingEXT\n", + MakeInstruction(SpvOpCapability, {5307})}, + {"OpCapability StorageBufferArrayNonUniformIndexingEXT\n", + MakeInstruction(SpvOpCapability, {5308})}, + {"OpCapability StorageImageArrayNonUniformIndexingEXT\n", + MakeInstruction(SpvOpCapability, {5309})}, + {"OpCapability InputAttachmentArrayNonUniformIndexingEXT\n", + MakeInstruction(SpvOpCapability, {5310})}, + {"OpCapability UniformTexelBufferArrayNonUniformIndexingEXT\n", + MakeInstruction(SpvOpCapability, {5311})}, + {"OpCapability StorageTexelBufferArrayNonUniformIndexingEXT\n", + MakeInstruction(SpvOpCapability, {5312})}, + + // Check the decoration token + {"OpDecorate %1 NonUniformEXT\n", + MakeInstruction(SpvOpDecorate, {1, SpvDecorationNonUniformEXT})}, + {"OpDecorate %1 NonUniformEXT\n", + MakeInstruction(SpvOpDecorate, {1, 5300})}, + })), ); + } // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/text_to_binary.reserved_sampling_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/text_to_binary.reserved_sampling_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/text_to_binary.reserved_sampling_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/text_to_binary.reserved_sampling_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,57 @@ +// Copyright (c) 2017 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. + +// Validation tests for illegal instructions + +#include "unit_spirv.h" + +#include "gmock/gmock.h" +#include "test_fixture.h" + +namespace { + +using ::testing::Eq; + +using ReservedSamplingInstTest = spvtest::TextToBinaryTest; + +TEST_F(ReservedSamplingInstTest, OpImageSparseSampleProjImplicitLod) { + const std::string input = "OpImageSparseSampleProjImplicitLod %1 %2 %3\n"; + EXPECT_THAT(CompileFailure(input), + Eq("Invalid Opcode name 'OpImageSparseSampleProjImplicitLod'")); +} + +TEST_F(ReservedSamplingInstTest, OpImageSparseSampleProjExplicitLod) { + const std::string input = + "OpImageSparseSampleProjExplicitLod %1 %2 %3 Lod %4\n"; + EXPECT_THAT(CompileFailure(input), + Eq("Invalid Opcode name 'OpImageSparseSampleProjExplicitLod'")); +} + +TEST_F(ReservedSamplingInstTest, OpImageSparseSampleProjDrefImplicitLod) { + const std::string input = + "OpImageSparseSampleProjDrefImplicitLod %1 %2 %3 %4\n"; + EXPECT_THAT( + CompileFailure(input), + Eq("Invalid Opcode name 'OpImageSparseSampleProjDrefImplicitLod'")); +} + +TEST_F(ReservedSamplingInstTest, OpImageSparseSampleProjDrefExplicitLod) { + const std::string input = + "OpImageSparseSampleProjDrefExplicitLod %1 %2 %3 %4 Lod %5\n"; + EXPECT_THAT( + CompileFailure(input), + Eq("Invalid Opcode name 'OpImageSparseSampleProjDrefExplicitLod'")); +} + +} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/timer_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/timer_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/timer_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/timer_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,143 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +#include +#include + +#include "gtest/gtest.h" +#include "source/util/timer.h" + +namespace { + +using ::spvutils::CumulativeTimer; +using ::spvutils::PrintTimerDescription; +using ::spvutils::ScopedTimer; +using ::spvutils::Timer; + +// A mock class to mimic Timer class for a testing purpose. It has fixed +// CPU/WALL/USR/SYS time, RSS delta, and the delta of the number of page faults. +class MockTimer : public Timer { + public: + MockTimer(std::ostream* out, bool measure_mem_usage = false) + : Timer(out, measure_mem_usage) {} + double CPUTime() override { return 0.019123; } + double WallTime() override { return 0.019723; } + double UserTime() override { return 0.012723; } + double SystemTime() override { return 0.002723; } + long RSS() const override { return 360L; } + long PageFault() const override { return 3600L; } +}; + +// This unit test checks whether the actual output of MockTimer::Report() is the +// same as fixed CPU/WALL/USR/SYS time, RSS delta, and the delta of the number +// of page faults that are returned by MockTimer. +TEST(MockTimer, DoNothing) { + std::ostringstream buf; + + PrintTimerDescription(&buf); + MockTimer timer(&buf); + timer.Start(); + + // Do nothing. + + timer.Stop(); + timer.Report("TimerTest"); + + EXPECT_EQ(0.019123, timer.CPUTime()); + EXPECT_EQ(0.019723, timer.WallTime()); + EXPECT_EQ(0.012723, timer.UserTime()); + EXPECT_EQ(0.002723, timer.SystemTime()); + EXPECT_EQ( + " PASS name CPU time WALL time USR time" + " SYS time\n TimerTest 0.02 0.02" + " 0.01 0.00\n", + buf.str()); +} + +// This unit test checks whether the ScopedTimer correctly reports +// the fixed CPU/WALL/USR/SYS time, RSS delta, and the delta of the number of +// page faults that are returned by MockTimer. +TEST(MockTimer, TestScopedTimer) { + std::ostringstream buf; + + { + ScopedTimer scopedtimer(&buf, "ScopedTimerTest"); + // Do nothing. + } + + EXPECT_EQ( + " ScopedTimerTest 0.02 0.02 0.01" + " 0.00\n", + buf.str()); +} + +// A mock class to mimic CumulativeTimer class for a testing purpose. It has +// fixed CPU/WALL/USR/SYS time, RSS delta, and the delta of the number of page +// faults for each measurement (i.e., a pair of Start() and Stop()). If the +// number of measurements increases, it increases |count_stop_| by the number of +// calling Stop() and the amount of each resource usage is proportional to +// |count_stop_|. +class MockCumulativeTimer : public CumulativeTimer { + public: + MockCumulativeTimer(std::ostream* out, bool measure_mem_usage = false) + : CumulativeTimer(out, measure_mem_usage), count_stop_(0) {} + double CPUTime() override { return count_stop_ * 0.019123; } + double WallTime() override { return count_stop_ * 0.019723; } + double UserTime() override { return count_stop_ * 0.012723; } + double SystemTime() override { return count_stop_ * 0.002723; } + long RSS() const override { return count_stop_ * 360L; } + long PageFault() const override { return count_stop_ * 3600L; } + + // Calling Stop() does nothing but just increases |count_stop_| by 1. + void Stop() override { ++count_stop_; }; + + private: + unsigned int count_stop_; +}; + +// This unit test checks whether the MockCumulativeTimer correctly reports the +// cumulative CPU/WALL/USR/SYS time, RSS delta, and the delta of the number of +// page faults whose values are fixed for each measurement (i.e., a pair of +// Start() and Stop()). +TEST(MockCumulativeTimer, DoNothing) { + CumulativeTimer* ctimer; + std::ostringstream buf; + + { + ctimer = new MockCumulativeTimer(&buf); + ctimer->Start(); + + // Do nothing. + + ctimer->Stop(); + } + + { + ctimer->Start(); + + // Do nothing. + + ctimer->Stop(); + ctimer->Report("CumulativeTimerTest"); + } + + EXPECT_EQ( + " CumulativeTimerTest 0.04 0.04 0.03" + " 0.01\n", + buf.str()); + + if (ctimer) delete ctimer; +} + +} // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/unit_spirv.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/unit_spirv.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/unit_spirv.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/unit_spirv.h 2018-04-27 11:46:32.000000000 +0000 @@ -208,15 +208,18 @@ // Returns a vector of all valid target environment enums. inline std::vector AllTargetEnvironments() { - return {SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, - SPV_ENV_OPENCL_1_2, SPV_ENV_OPENCL_EMBEDDED_1_2, - SPV_ENV_OPENCL_2_0, SPV_ENV_OPENCL_EMBEDDED_2_0, - SPV_ENV_OPENCL_2_1, SPV_ENV_OPENCL_EMBEDDED_2_1, - SPV_ENV_OPENCL_2_2, SPV_ENV_OPENCL_EMBEDDED_2_2, - SPV_ENV_VULKAN_1_0, SPV_ENV_OPENGL_4_0, - SPV_ENV_OPENGL_4_1, SPV_ENV_OPENGL_4_2, - SPV_ENV_OPENGL_4_3, SPV_ENV_OPENGL_4_5, - SPV_ENV_UNIVERSAL_1_2}; + return { + SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, + SPV_ENV_OPENCL_1_2, SPV_ENV_OPENCL_EMBEDDED_1_2, + SPV_ENV_OPENCL_2_0, SPV_ENV_OPENCL_EMBEDDED_2_0, + SPV_ENV_OPENCL_2_1, SPV_ENV_OPENCL_EMBEDDED_2_1, + SPV_ENV_OPENCL_2_2, SPV_ENV_OPENCL_EMBEDDED_2_2, + SPV_ENV_VULKAN_1_0, SPV_ENV_OPENGL_4_0, + SPV_ENV_OPENGL_4_1, SPV_ENV_OPENGL_4_2, + SPV_ENV_OPENGL_4_3, SPV_ENV_OPENGL_4_5, + SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3, + SPV_ENV_VULKAN_1_1, + }; } // Returns the capabilities in a CapabilitySet as an ordered vector. diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/CMakeLists.txt 2018-04-27 11:46:32.000000000 +0000 @@ -16,7 +16,6 @@ ${CMAKE_CURRENT_SOURCE_DIR}/../test_fixture.h ${CMAKE_CURRENT_SOURCE_DIR}/../unit_spirv.h ${CMAKE_CURRENT_SOURCE_DIR}/val_fixtures.h - ${CMAKE_CURRENT_SOURCE_DIR}/val_fixtures.cpp ) @@ -110,6 +109,12 @@ LIBS ${SPIRV_TOOLS} ) +add_spvtools_unittest(TARGET val_builtins + SRCS val_builtins_test.cpp + ${VAL_TEST_COMMON_SRCS} + LIBS ${SPIRV_TOOLS} +) + add_spvtools_unittest(TARGET val_image SRCS val_image_test.cpp ${VAL_TEST_COMMON_SRCS} @@ -157,12 +162,6 @@ ${VAL_TEST_COMMON_SRCS} LIBS ${SPIRV_TOOLS} ) - -add_spvtools_unittest(TARGET val_instructions - SRCS val_instructions_test.cpp - ${VAL_TEST_COMMON_SRCS} - LIBS ${SPIRV_TOOLS} -) add_spvtools_unittest(TARGET val_literals SRCS val_literals_test.cpp diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_atomics_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_atomics_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_atomics_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_atomics_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -32,7 +32,6 @@ std::ostringstream ss; ss << R"( OpCapability Shader -OpCapability Linkage OpCapability Int64 )"; @@ -55,7 +54,11 @@ %u64_1 = OpConstant %u64 1 %f32vec4_0000 = OpConstantComposite %f32vec4 %f32_0 %f32_0 %f32_0 %f32_0 -%scope = OpConstant %u32 1 +%cross_device = OpConstant %u32 0 +%device = OpConstant %u32 1 +%workgroup = OpConstant %u32 2 +%subgroup = OpConstant %u32 3 +%invocation = OpConstant %u32 4 %relaxed = OpConstant %u32 0 %acquire = OpConstant %u32 2 @@ -121,7 +124,11 @@ %u64_1 = OpConstant %u64 1 %f32vec4_0000 = OpConstantComposite %f32vec4 %f32_0 %f32_0 %f32_0 %f32_0 -%scope = OpConstant %u32 1 +%cross_device = OpConstant %u32 0 +%device = OpConstant %u32 1 +%workgroup = OpConstant %u32 2 +%subgroup = OpConstant %u32 3 +%invocation = OpConstant %u32 4 %relaxed = OpConstant %u32 0 %acquire = OpConstant %u32 2 @@ -161,42 +168,119 @@ TEST_F(ValidateAtomics, AtomicLoadShaderSuccess) { const std::string body = R"( -%val1 = OpAtomicLoad %u32 %u32_var %scope %relaxed +%val1 = OpAtomicLoad %u32 %u32_var %device %relaxed +%val2 = OpAtomicLoad %u32 %u32_var %workgroup %acquire +%val3 = OpAtomicLoad %u64 %u64_var %subgroup %sequentially_consistent )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); + CompileSuccessfully(GenerateShaderCode(body)); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } TEST_F(ValidateAtomics, AtomicLoadKernelSuccess) { const std::string body = R"( -%val1 = OpAtomicLoad %f32 %f32_var %scope %relaxed -%val2 = OpAtomicLoad %u32 %u32_var %scope %relaxed -%val3 = OpAtomicLoad %u64 %u64_var %scope %acquire +%val1 = OpAtomicLoad %f32 %f32_var %device %relaxed +%val2 = OpAtomicLoad %u32 %u32_var %workgroup %sequentially_consistent +%val3 = OpAtomicLoad %u64 %u64_var %subgroup %acquire )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } +TEST_F(ValidateAtomics, AtomicLoadVulkanSuccess) { + const std::string body = R"( +%val1 = OpAtomicLoad %u32 %u32_var %device %relaxed +%val2 = OpAtomicLoad %u32 %u32_var %workgroup %acquire +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0)); +} + +// TODO(atgoo@github.com): the corresponding check fails Vulkan CTS, +// reenable once fixed. +TEST_F(ValidateAtomics, DISABLED_AtomicLoadVulkanSubgroup) { + const std::string body = R"( +%val1 = OpAtomicLoad %u32 %u32_var %subgroup %acquire +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("AtomicLoad: in Vulkan environment memory scope is " + "limited to Device, Workgroup and Invocation")); +} + +TEST_F(ValidateAtomics, AtomicLoadVulkanRelease) { + const std::string body = R"( +%val1 = OpAtomicLoad %u32 %u32_var %workgroup %release +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Vulkan spec disallows OpAtomicLoad with Memory Semantics " + "Release, AcquireRelease and SequentiallyConsistent")); +} + +TEST_F(ValidateAtomics, AtomicLoadVulkanAcquireRelease) { + const std::string body = R"( +%val1 = OpAtomicLoad %u32 %u32_var %workgroup %acquire_release +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Vulkan spec disallows OpAtomicLoad with Memory Semantics " + "Release, AcquireRelease and SequentiallyConsistent")); +} + +TEST_F(ValidateAtomics, AtomicLoadVulkanSequentiallyConsistent) { + const std::string body = R"( +%val1 = OpAtomicLoad %u32 %u32_var %workgroup %sequentially_consistent +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Vulkan spec disallows OpAtomicLoad with Memory Semantics " + "Release, AcquireRelease and SequentiallyConsistent")); +} + TEST_F(ValidateAtomics, AtomicLoadShaderFloat) { const std::string body = R"( -%val1 = OpAtomicLoad %f32 %f32_var %scope %relaxed +%val1 = OpAtomicLoad %f32 %f32_var %device %relaxed )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); + CompileSuccessfully(GenerateShaderCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicLoad: " "expected Result Type to be int scalar type")); } +TEST_F(ValidateAtomics, AtomicLoadVulkanInt64) { + const std::string body = R"( +%val1 = OpAtomicLoad %u64 %u64_var %device %relaxed +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("AtomicLoad: according to the Vulkan spec atomic " + "Result Type needs to be a 32-bit int scalar type")); +} + TEST_F(ValidateAtomics, AtomicLoadWrongResultType) { const std::string body = R"( -%val1 = OpAtomicLoad %f32vec4 %f32vec4_var %scope %relaxed +%val1 = OpAtomicLoad %f32vec4 %f32vec4_var %device %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicLoad: " @@ -205,10 +289,10 @@ TEST_F(ValidateAtomics, AtomicLoadWrongPointerType) { const std::string body = R"( -%val1 = OpAtomicLoad %f32 %f32_ptr %scope %relaxed +%val1 = OpAtomicLoad %f32 %f32_ptr %device %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -217,10 +301,10 @@ TEST_F(ValidateAtomics, AtomicLoadWrongPointerDataType) { const std::string body = R"( -%val1 = OpAtomicLoad %u32 %f32_var %scope %relaxed +%val1 = OpAtomicLoad %u32 %f32_var %device %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -233,7 +317,7 @@ %val1 = OpAtomicLoad %f32 %f32_var %f32_1 %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicLoad: expected Scope to be 32-bit int")); @@ -241,32 +325,90 @@ TEST_F(ValidateAtomics, AtomicLoadWrongMemorySemanticsType) { const std::string body = R"( -%val1 = OpAtomicLoad %f32 %f32_var %scope %u64_1 +%val1 = OpAtomicLoad %f32 %f32_var %device %u64_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), HasSubstr("AtomicLoad: expected Memory Semantics to be 32-bit int")); } -TEST_F(ValidateAtomics, AtomicStoreSuccess) { +TEST_F(ValidateAtomics, AtomicStoreKernelSuccess) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val2 = OpAtomicStore %u32_var %scope %relaxed %u32_1 +OpAtomicStore %f32_var %device %relaxed %f32_1 +OpAtomicStore %u32_var %subgroup %release %u32_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateAtomics, AtomicStoreShaderSuccess) { + const std::string body = R"( +OpAtomicStore %u32_var %device %release %u32_1 +OpAtomicStore %u32_var %subgroup %sequentially_consistent %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body)); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } +TEST_F(ValidateAtomics, AtomicStoreVulkanSuccess) { + const std::string body = R"( +OpAtomicStore %u32_var %device %release %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0)); +} + +TEST_F(ValidateAtomics, AtomicStoreVulkanAcquire) { + const std::string body = R"( +OpAtomicStore %u32_var %device %acquire %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Vulkan spec disallows OpAtomicStore with Memory Semantics " + "Acquire, AcquireRelease and SequentiallyConsistent")); +} + +TEST_F(ValidateAtomics, AtomicStoreVulkanAcquireRelease) { + const std::string body = R"( +OpAtomicStore %u32_var %device %acquire_release %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Vulkan spec disallows OpAtomicStore with Memory Semantics " + "Acquire, AcquireRelease and SequentiallyConsistent")); +} + +TEST_F(ValidateAtomics, AtomicStoreVulkanSequentiallyConsistent) { + const std::string body = R"( +OpAtomicStore %u32_var %device %sequentially_consistent %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Vulkan spec disallows OpAtomicStore with Memory Semantics " + "Acquire, AcquireRelease and SequentiallyConsistent")); +} + TEST_F(ValidateAtomics, AtomicStoreWrongPointerType) { const std::string body = R"( -OpAtomicStore %f32_1 %scope %relaxed %f32_1 +OpAtomicStore %f32_1 %device %relaxed %f32_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -275,10 +417,10 @@ TEST_F(ValidateAtomics, AtomicStoreWrongPointerDataType) { const std::string body = R"( -OpAtomicStore %f32vec4_var %scope %relaxed %f32_1 +OpAtomicStore %f32vec4_var %device %relaxed %f32_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -290,10 +432,10 @@ TEST_F(ValidateAtomics, AtomicStoreWrongPointerStorageType) { const std::string body = R"( %f32_var_function = OpVariable %f32_ptr_function Function -OpAtomicStore %f32_var_function %scope %relaxed %f32_1 +OpAtomicStore %f32_var_function %device %relaxed %f32_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -307,7 +449,7 @@ OpAtomicStore %f32_var %f32_1 %relaxed %f32_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicStore: expected Scope to be 32-bit int")); @@ -315,10 +457,10 @@ TEST_F(ValidateAtomics, AtomicStoreWrongMemorySemanticsType) { const std::string body = R"( -OpAtomicStore %f32_var %scope %f32_1 %f32_1 +OpAtomicStore %f32_var %device %f32_1 %f32_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -327,10 +469,10 @@ TEST_F(ValidateAtomics, AtomicStoreWrongValueType) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %u32_1 +OpAtomicStore %f32_var %device %relaxed %u32_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -341,33 +483,33 @@ TEST_F(ValidateAtomics, AtomicExchangeShaderSuccess) { const std::string body = R"( -%val1 = OpAtomicStore %u32_var %scope %relaxed %u32_1 -%val2 = OpAtomicExchange %u32 %u32_var %scope %relaxed %u32_0 +%val1 = OpAtomicStore %u32_var %device %relaxed %u32_1 +%val2 = OpAtomicExchange %u32 %u32_var %device %relaxed %u32_0 )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); + CompileSuccessfully(GenerateShaderCode(body)); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } TEST_F(ValidateAtomics, AtomicExchangeKernelSuccess) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val2 = OpAtomicExchange %f32 %f32_var %scope %relaxed %f32_0 -%val3 = OpAtomicStore %u32_var %scope %relaxed %u32_1 -%val4 = OpAtomicExchange %u32 %u32_var %scope %relaxed %u32_0 +OpAtomicStore %f32_var %device %relaxed %f32_1 +%val2 = OpAtomicExchange %f32 %f32_var %device %relaxed %f32_0 +%val3 = OpAtomicStore %u32_var %device %relaxed %u32_1 +%val4 = OpAtomicExchange %u32 %u32_var %device %relaxed %u32_0 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } TEST_F(ValidateAtomics, AtomicExchangeShaderFloat) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val2 = OpAtomicExchange %f32 %f32_var %scope %relaxed %f32_0 +OpAtomicStore %f32_var %device %relaxed %f32_1 +%val2 = OpAtomicExchange %f32 %f32_var %device %relaxed %f32_0 )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); + CompileSuccessfully(GenerateShaderCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicExchange: " @@ -377,10 +519,10 @@ TEST_F(ValidateAtomics, AtomicExchangeWrongResultType) { const std::string body = R"( %val1 = OpStore %f32vec4_var %f32vec4_0000 -%val2 = OpAtomicExchange %f32vec4 %f32vec4_var %scope %relaxed %f32vec4_0000 +%val2 = OpAtomicExchange %f32vec4 %f32vec4_var %device %relaxed %f32vec4_0000 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicExchange: " @@ -389,10 +531,10 @@ TEST_F(ValidateAtomics, AtomicExchangeWrongPointerType) { const std::string body = R"( -%val2 = OpAtomicExchange %f32 %f32vec4_ptr %scope %relaxed %f32vec4_0000 +%val2 = OpAtomicExchange %f32 %f32vec4_ptr %device %relaxed %f32vec4_0000 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -403,10 +545,10 @@ TEST_F(ValidateAtomics, AtomicExchangeWrongPointerDataType) { const std::string body = R"( %val1 = OpStore %f32vec4_var %f32vec4_0000 -%val2 = OpAtomicExchange %f32 %f32vec4_var %scope %relaxed %f32vec4_0000 +%val2 = OpAtomicExchange %f32 %f32vec4_var %device %relaxed %f32vec4_0000 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -416,11 +558,11 @@ TEST_F(ValidateAtomics, AtomicExchangeWrongScopeType) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 +OpAtomicStore %f32_var %device %relaxed %f32_1 %val2 = OpAtomicExchange %f32 %f32_var %f32_1 %relaxed %f32_0 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicExchange: expected Scope to be 32-bit int")); @@ -428,11 +570,11 @@ TEST_F(ValidateAtomics, AtomicExchangeWrongMemorySemanticsType) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val2 = OpAtomicExchange %f32 %f32_var %scope %f32_1 %f32_0 +OpAtomicStore %f32_var %device %relaxed %f32_1 +%val2 = OpAtomicExchange %f32 %f32_var %device %f32_1 %f32_0 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -441,11 +583,11 @@ TEST_F(ValidateAtomics, AtomicExchangeWrongValueType) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val2 = OpAtomicExchange %f32 %f32_var %scope %relaxed %u32_0 +OpAtomicStore %f32_var %device %relaxed %f32_1 +%val2 = OpAtomicExchange %f32 %f32_var %device %relaxed %u32_0 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicExchange: " @@ -454,33 +596,33 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeShaderSuccess) { const std::string body = R"( -%val1 = OpAtomicStore %u32_var %scope %relaxed %u32_1 -%val2 = OpAtomicCompareExchange %u32 %u32_var %scope %relaxed %relaxed %u32_0 %u32_0 +%val1 = OpAtomicStore %u32_var %device %relaxed %u32_1 +%val2 = OpAtomicCompareExchange %u32 %u32_var %device %relaxed %relaxed %u32_0 %u32_0 )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); + CompileSuccessfully(GenerateShaderCode(body)); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } TEST_F(ValidateAtomics, AtomicCompareExchangeKernelSuccess) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val2 = OpAtomicCompareExchange %f32 %f32_var %scope %relaxed %relaxed %f32_0 %f32_1 -%val3 = OpAtomicStore %u32_var %scope %relaxed %u32_1 -%val4 = OpAtomicCompareExchange %u32 %u32_var %scope %relaxed %relaxed %u32_0 %u32_0 +OpAtomicStore %f32_var %device %relaxed %f32_1 +%val2 = OpAtomicCompareExchange %f32 %f32_var %device %relaxed %relaxed %f32_0 %f32_1 +%val3 = OpAtomicStore %u32_var %device %relaxed %u32_1 +%val4 = OpAtomicCompareExchange %u32 %u32_var %device %relaxed %relaxed %u32_0 %u32_0 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } TEST_F(ValidateAtomics, AtomicCompareExchangeShaderFloat) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val1 = OpAtomicCompareExchange %f32 %f32_var %scope %relaxed %relaxed %f32_0 %f32_1 +OpAtomicStore %f32_var %device %relaxed %f32_1 +%val1 = OpAtomicCompareExchange %f32 %f32_var %device %relaxed %relaxed %f32_0 %f32_1 )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); + CompileSuccessfully(GenerateShaderCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicCompareExchange: " @@ -490,10 +632,10 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeWrongResultType) { const std::string body = R"( %val1 = OpStore %f32vec4_var %f32vec4_0000 -%val2 = OpAtomicCompareExchange %f32vec4 %f32vec4_var %scope %relaxed %relaxed %f32vec4_0000 %f32vec4_0000 +%val2 = OpAtomicCompareExchange %f32vec4 %f32vec4_var %device %relaxed %relaxed %f32vec4_0000 %f32vec4_0000 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicCompareExchange: " @@ -502,10 +644,10 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeWrongPointerType) { const std::string body = R"( -%val2 = OpAtomicCompareExchange %f32 %f32vec4_ptr %scope %relaxed %relaxed %f32vec4_0000 %f32vec4_0000 +%val2 = OpAtomicCompareExchange %f32 %f32vec4_ptr %device %relaxed %relaxed %f32vec4_0000 %f32vec4_0000 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicCompareExchange: expected Pointer to be of type " @@ -515,10 +657,10 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeWrongPointerDataType) { const std::string body = R"( %val1 = OpStore %f32vec4_var %f32vec4_0000 -%val2 = OpAtomicCompareExchange %f32 %f32vec4_var %scope %relaxed %relaxed %f32_0 %f32_1 +%val2 = OpAtomicCompareExchange %f32 %f32vec4_var %device %relaxed %relaxed %f32_0 %f32_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -528,11 +670,11 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeWrongScopeType) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 +OpAtomicStore %f32_var %device %relaxed %f32_1 %val2 = OpAtomicCompareExchange %f32 %f32_var %f32_1 %relaxed %relaxed %f32_0 %f32_0 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -541,11 +683,11 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeWrongMemorySemanticsType1) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val2 = OpAtomicCompareExchange %f32 %f32_var %scope %f32_1 %relaxed %f32_0 %f32_0 +OpAtomicStore %f32_var %device %relaxed %f32_1 +%val2 = OpAtomicCompareExchange %f32 %f32_var %device %f32_1 %relaxed %f32_0 %f32_0 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -555,11 +697,11 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeWrongMemorySemanticsType2) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val2 = OpAtomicCompareExchange %f32 %f32_var %scope %relaxed %f32_1 %f32_0 %f32_0 +OpAtomicStore %f32_var %device %relaxed %f32_1 +%val2 = OpAtomicCompareExchange %f32 %f32_var %device %relaxed %f32_1 %f32_0 %f32_0 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -569,11 +711,11 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeUnequalRelease) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val2 = OpAtomicCompareExchange %f32 %f32_var %scope %relaxed %release %f32_0 %f32_0 +OpAtomicStore %f32_var %device %relaxed %f32_1 +%val2 = OpAtomicCompareExchange %f32 %f32_var %device %relaxed %release %f32_0 %f32_0 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicCompareExchange: Memory Semantics Release and " @@ -582,11 +724,11 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeWrongValueType) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val2 = OpAtomicCompareExchange %f32 %f32_var %scope %relaxed %relaxed %u32_0 %f32_1 +OpAtomicStore %f32_var %device %relaxed %f32_1 +%val2 = OpAtomicCompareExchange %f32 %f32_var %device %relaxed %relaxed %u32_0 %f32_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicCompareExchange: " @@ -595,11 +737,11 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeWrongComparatorType) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val2 = OpAtomicCompareExchange %f32 %f32_var %scope %relaxed %relaxed %f32_0 %u32_1 +OpAtomicStore %f32_var %device %relaxed %f32_1 +%val2 = OpAtomicCompareExchange %f32 %f32_var %device %relaxed %relaxed %f32_0 %u32_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicCompareExchange: " @@ -608,21 +750,21 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeWeakSuccess) { const std::string body = R"( -%val3 = OpAtomicStore %u32_var %scope %relaxed %u32_1 -%val4 = OpAtomicCompareExchangeWeak %u32 %u32_var %scope %relaxed %relaxed %u32_0 %u32_0 +%val3 = OpAtomicStore %u32_var %device %relaxed %u32_1 +%val4 = OpAtomicCompareExchangeWeak %u32 %u32_var %device %relaxed %relaxed %u32_0 %u32_0 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } TEST_F(ValidateAtomics, AtomicCompareExchangeWeakWrongResultType) { const std::string body = R"( -OpAtomicStore %f32_var %scope %relaxed %f32_1 -%val2 = OpAtomicCompareExchangeWeak %f32 %f32_var %scope %relaxed %relaxed %f32_0 %f32_1 +OpAtomicStore %f32_var %device %relaxed %f32_1 +%val2 = OpAtomicCompareExchangeWeak %f32 %f32_var %device %relaxed %relaxed %f32_0 %f32_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicCompareExchangeWeak: " @@ -631,40 +773,40 @@ TEST_F(ValidateAtomics, AtomicArithmeticsSuccess) { const std::string body = R"( -OpAtomicStore %u32_var %scope %relaxed %u32_1 -%val1 = OpAtomicIIncrement %u32 %u32_var %scope %acquire_release -%val2 = OpAtomicIDecrement %u32 %u32_var %scope %acquire_release -%val3 = OpAtomicIAdd %u32 %u32_var %scope %acquire_release %u32_1 -%val4 = OpAtomicISub %u32 %u32_var %scope %acquire_release %u32_1 -%val5 = OpAtomicUMin %u32 %u32_var %scope %acquire_release %u32_1 -%val6 = OpAtomicUMax %u32 %u32_var %scope %acquire_release %u32_1 -%val7 = OpAtomicSMin %u32 %u32_var %scope %sequentially_consistent %u32_1 -%val8 = OpAtomicSMax %u32 %u32_var %scope %sequentially_consistent %u32_1 -%val9 = OpAtomicAnd %u32 %u32_var %scope %sequentially_consistent %u32_1 -%val10 = OpAtomicOr %u32 %u32_var %scope %sequentially_consistent %u32_1 -%val11 = OpAtomicXor %u32 %u32_var %scope %sequentially_consistent %u32_1 +OpAtomicStore %u32_var %device %relaxed %u32_1 +%val1 = OpAtomicIIncrement %u32 %u32_var %device %acquire_release +%val2 = OpAtomicIDecrement %u32 %u32_var %device %acquire_release +%val3 = OpAtomicIAdd %u32 %u32_var %device %acquire_release %u32_1 +%val4 = OpAtomicISub %u32 %u32_var %device %acquire_release %u32_1 +%val5 = OpAtomicUMin %u32 %u32_var %device %acquire_release %u32_1 +%val6 = OpAtomicUMax %u32 %u32_var %device %acquire_release %u32_1 +%val7 = OpAtomicSMin %u32 %u32_var %device %sequentially_consistent %u32_1 +%val8 = OpAtomicSMax %u32 %u32_var %device %sequentially_consistent %u32_1 +%val9 = OpAtomicAnd %u32 %u32_var %device %sequentially_consistent %u32_1 +%val10 = OpAtomicOr %u32 %u32_var %device %sequentially_consistent %u32_1 +%val11 = OpAtomicXor %u32 %u32_var %device %sequentially_consistent %u32_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } TEST_F(ValidateAtomics, AtomicFlagsSuccess) { const std::string body = R"( -OpAtomicFlagClear %u32_var %scope %release -%val1 = OpAtomicFlagTestAndSet %bool %u32_var %scope %relaxed +OpAtomicFlagClear %u32_var %device %release +%val1 = OpAtomicFlagTestAndSet %bool %u32_var %device %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } TEST_F(ValidateAtomics, AtomicFlagTestAndSetWrongResultType) { const std::string body = R"( -%val1 = OpAtomicFlagTestAndSet %u32 %u32_var %scope %relaxed +%val1 = OpAtomicFlagTestAndSet %u32 %u32_var %device %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicFlagTestAndSet: " @@ -673,10 +815,10 @@ TEST_F(ValidateAtomics, AtomicFlagTestAndSetNotPointer) { const std::string body = R"( -%val1 = OpAtomicFlagTestAndSet %bool %u32_1 %scope %relaxed +%val1 = OpAtomicFlagTestAndSet %bool %u32_1 %device %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicFlagTestAndSet: " @@ -685,10 +827,10 @@ TEST_F(ValidateAtomics, AtomicFlagTestAndSetNotIntPointer) { const std::string body = R"( -%val1 = OpAtomicFlagTestAndSet %bool %f32_var %scope %relaxed +%val1 = OpAtomicFlagTestAndSet %bool %f32_var %device %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -698,10 +840,10 @@ TEST_F(ValidateAtomics, AtomicFlagTestAndSetNotInt32Pointer) { const std::string body = R"( -%val1 = OpAtomicFlagTestAndSet %bool %u64_var %scope %relaxed +%val1 = OpAtomicFlagTestAndSet %bool %u64_var %device %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -714,7 +856,7 @@ %val1 = OpAtomicFlagTestAndSet %bool %u32_var %u64_1 %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicFlagTestAndSet: " @@ -723,10 +865,10 @@ TEST_F(ValidateAtomics, AtomicFlagTestAndSetWrongMemorySemanticsType) { const std::string body = R"( -%val1 = OpAtomicFlagTestAndSet %bool %u32_var %scope %u64_1 +%val1 = OpAtomicFlagTestAndSet %bool %u32_var %device %u64_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicFlagTestAndSet: " @@ -735,10 +877,10 @@ TEST_F(ValidateAtomics, AtomicFlagClearAcquire) { const std::string body = R"( -OpAtomicFlagClear %u32_var %scope %acquire +OpAtomicFlagClear %u32_var %device %acquire )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("Memory Semantics Acquire and AcquireRelease cannot be " @@ -747,10 +889,10 @@ TEST_F(ValidateAtomics, AtomicFlagClearNotPointer) { const std::string body = R"( -OpAtomicFlagClear %u32_1 %scope %relaxed +OpAtomicFlagClear %u32_1 %device %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicFlagClear: " @@ -759,10 +901,10 @@ TEST_F(ValidateAtomics, AtomicFlagClearNotIntPointer) { const std::string body = R"( -OpAtomicFlagClear %f32_var %scope %relaxed +OpAtomicFlagClear %f32_var %device %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -772,10 +914,10 @@ TEST_F(ValidateAtomics, AtomicFlagClearNotInt32Pointer) { const std::string body = R"( -OpAtomicFlagClear %u64_var %scope %relaxed +OpAtomicFlagClear %u64_var %device %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -788,7 +930,7 @@ OpAtomicFlagClear %u32_var %u64_1 %relaxed )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicFlagClear: expected Scope to be 32-bit int")); @@ -796,10 +938,10 @@ TEST_F(ValidateAtomics, AtomicFlagClearWrongMemorySemanticsType) { const std::string body = R"( -OpAtomicFlagClear %u32_var %scope %u64_1 +OpAtomicFlagClear %u32_var %device %u64_1 )"; - CompileSuccessfully(GenerateKernelCode(body).c_str()); + CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), @@ -808,8 +950,8 @@ TEST_F(ValidateAtomics, AtomicIIncrementAcquireAndRelease) { const std::string body = R"( -OpAtomicStore %u32_var %scope %relaxed %u32_1 -%val1 = OpAtomicIIncrement %u32 %u32_var %scope %acquire_and_release +OpAtomicStore %u32_var %device %relaxed %u32_1 +%val1 = OpAtomicIIncrement %u32 %u32_var %device %acquire_and_release )"; CompileSuccessfully(GenerateKernelCode(body)); @@ -823,8 +965,8 @@ TEST_F(ValidateAtomics, AtomicUniformMemorySemanticsShader) { const std::string body = R"( -OpAtomicStore %u32_var %scope %relaxed %u32_1 -%val1 = OpAtomicIIncrement %u32 %u32_var %scope %acquire_release_uniform_workgroup +OpAtomicStore %u32_var %device %relaxed %u32_1 +%val1 = OpAtomicIIncrement %u32 %u32_var %device %acquire_release_uniform_workgroup )"; CompileSuccessfully(GenerateShaderCode(body)); @@ -833,8 +975,8 @@ TEST_F(ValidateAtomics, AtomicUniformMemorySemanticsKernel) { const std::string body = R"( -OpAtomicStore %u32_var %scope %relaxed %u32_1 -%val1 = OpAtomicIIncrement %u32 %u32_var %scope %acquire_release_uniform_workgroup +OpAtomicStore %u32_var %device %relaxed %u32_1 +%val1 = OpAtomicIIncrement %u32 %u32_var %device %acquire_release_uniform_workgroup )"; CompileSuccessfully(GenerateKernelCode(body)); @@ -846,8 +988,8 @@ TEST_F(ValidateAtomics, AtomicCounterMemorySemanticsNoCapability) { const std::string body = R"( -OpAtomicStore %u32_var %scope %relaxed %u32_1 -%val1 = OpAtomicIIncrement %u32 %u32_var %scope %acquire_release_atomic_counter_workgroup +OpAtomicStore %u32_var %device %relaxed %u32_1 +%val1 = OpAtomicIIncrement %u32 %u32_var %device %acquire_release_atomic_counter_workgroup )"; CompileSuccessfully(GenerateKernelCode(body)); @@ -859,8 +1001,8 @@ TEST_F(ValidateAtomics, AtomicCounterMemorySemanticsWithCapability) { const std::string body = R"( -OpAtomicStore %u32_var %scope %relaxed %u32_1 -%val1 = OpAtomicIIncrement %u32 %u32_var %scope %acquire_release_atomic_counter_workgroup +OpAtomicStore %u32_var %device %relaxed %u32_1 +%val1 = OpAtomicIIncrement %u32 %u32_var %device %acquire_release_atomic_counter_workgroup )"; CompileSuccessfully(GenerateKernelCode(body, "OpCapability AtomicStorage\n")); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_barriers_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_barriers_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_barriers_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_barriers_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -202,19 +202,30 @@ ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0)); } -TEST_F(ValidateBarriers, OpControlBarrierExecutionModelFragment) { +TEST_F(ValidateBarriers, OpControlBarrierExecutionModelFragmentSpirv12) { const std::string body = R"( OpControlBarrier %device %device %none )"; - CompileSuccessfully(GenerateShaderCode(body, "", "Fragment")); - ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + CompileSuccessfully(GenerateShaderCode(body, "", "Fragment"), + SPV_ENV_UNIVERSAL_1_2); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_2)); EXPECT_THAT( getDiagnosticString(), HasSubstr("OpControlBarrier requires one of the following Execution " "Models: TessellationControl, GLCompute or Kernel")); } +TEST_F(ValidateBarriers, OpControlBarrierExecutionModelFragmentSpirv13) { + const std::string body = R"( +OpControlBarrier %device %device %none +)"; + + CompileSuccessfully(GenerateShaderCode(body, "", "Fragment"), + SPV_ENV_UNIVERSAL_1_3); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + TEST_F(ValidateBarriers, OpControlBarrierFloatExecutionScope) { const std::string body = R"( OpControlBarrier %f32_1 %device %none diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_builtins_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_builtins_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_builtins_test.cpp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_builtins_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -0,0 +1,1924 @@ +// Copyright (c) 2018 Google LLC. +// +// 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. + +// Tests validation rules of GLSL.450.std and OpenCL.std extended instructions. +// Doesn't test OpenCL.std vector size 2, 3, 4, 8 or 16 rules (not supported +// by standard SPIR-V). + +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "unit_spirv.h" +#include "val_fixtures.h" + +namespace { + +struct TestResult { + TestResult(spv_result_t in_validation_result = SPV_SUCCESS, + const char* in_error_str = nullptr, + const char* in_error_str2 = nullptr) + : validation_result(in_validation_result), + error_str(in_error_str), + error_str2(in_error_str2) {} + spv_result_t validation_result; + const char* error_str; + const char* error_str2; +}; + +using ::testing::Combine; +using ::testing::HasSubstr; +using ::testing::Not; +using ::testing::Values; +using ::testing::ValuesIn; + +using ValidateBuiltIns = spvtest::ValidateBase; +using ValidateVulkanCombineBuiltInExecutionModelDataTypeResult = + spvtest::ValidateBase>; + +struct EntryPoint { + std::string name; + std::string execution_model; + std::string execution_modes; + std::string body; +}; + +class CodeGenerator { + public: + std::string Build() const; + + std::vector entry_points_; + std::string capabilities_; + std::string extensions_; + std::string memory_model_; + std::string before_types_; + std::string types_; + std::string after_types_; + std::string add_at_the_end_; +}; + +std::string CodeGenerator::Build() const { + std::ostringstream ss; + + ss << capabilities_; + ss << extensions_; + ss << memory_model_; + + for (const EntryPoint& entry_point : entry_points_) { + ss << "OpEntryPoint " << entry_point.execution_model << " %" + << entry_point.name << " \"" << entry_point.name << "\"\n"; + } + + for (const EntryPoint& entry_point : entry_points_) { + ss << entry_point.execution_modes << "\n"; + } + + ss << before_types_; + ss << types_; + ss << after_types_; + + for (const EntryPoint& entry_point : entry_points_) { + ss << "\n"; + ss << "%" << entry_point.name << " = OpFunction %void None %func\n"; + ss << "%" << entry_point.name << "_entry = OpLabel\n"; + ss << entry_point.body; + ss << "\nOpReturn\nOpFunctionEnd\n"; + } + + ss << add_at_the_end_; + + return ss.str(); +} + +std::string GetDefaultShaderCapabilities() { + return R"( +OpCapability Shader +OpCapability Geometry +OpCapability Tessellation +OpCapability Float64 +OpCapability Int64 +OpCapability MultiViewport +OpCapability SampleRateShading +)"; +} + +std::string GetDefaultShaderTypes() { + return R"( +%void = OpTypeVoid +%func = OpTypeFunction %void +%bool = OpTypeBool +%f32 = OpTypeFloat 32 +%f64 = OpTypeFloat 64 +%u32 = OpTypeInt 32 0 +%u64 = OpTypeInt 64 0 +%f32vec2 = OpTypeVector %f32 2 +%f32vec3 = OpTypeVector %f32 3 +%f32vec4 = OpTypeVector %f32 4 +%f64vec2 = OpTypeVector %f64 2 +%f64vec3 = OpTypeVector %f64 3 +%f64vec4 = OpTypeVector %f64 4 +%u32vec2 = OpTypeVector %u32 2 +%u32vec3 = OpTypeVector %u32 3 +%u64vec3 = OpTypeVector %u64 3 +%u32vec4 = OpTypeVector %u32 4 +%u64vec2 = OpTypeVector %u64 2 + +%f32_0 = OpConstant %f32 0 +%f32_1 = OpConstant %f32 1 +%f32_2 = OpConstant %f32 2 +%f32_3 = OpConstant %f32 3 +%f32_4 = OpConstant %f32 4 +%f32_h = OpConstant %f32 0.5 +%f32vec2_01 = OpConstantComposite %f32vec2 %f32_0 %f32_1 +%f32vec2_12 = OpConstantComposite %f32vec2 %f32_1 %f32_2 +%f32vec3_012 = OpConstantComposite %f32vec3 %f32_0 %f32_1 %f32_2 +%f32vec3_123 = OpConstantComposite %f32vec3 %f32_1 %f32_2 %f32_3 +%f32vec4_0123 = OpConstantComposite %f32vec4 %f32_0 %f32_1 %f32_2 %f32_3 +%f32vec4_1234 = OpConstantComposite %f32vec4 %f32_1 %f32_2 %f32_3 %f32_4 + +%f64_0 = OpConstant %f64 0 +%f64_1 = OpConstant %f64 1 +%f64_2 = OpConstant %f64 2 +%f64_3 = OpConstant %f64 3 +%f64vec2_01 = OpConstantComposite %f64vec2 %f64_0 %f64_1 +%f64vec3_012 = OpConstantComposite %f64vec3 %f64_0 %f64_1 %f64_2 +%f64vec4_0123 = OpConstantComposite %f64vec4 %f64_0 %f64_1 %f64_2 %f64_3 + +%u32_0 = OpConstant %u32 0 +%u32_1 = OpConstant %u32 1 +%u32_2 = OpConstant %u32 2 +%u32_3 = OpConstant %u32 3 +%u32_4 = OpConstant %u32 4 + +%u64_0 = OpConstant %u64 0 +%u64_1 = OpConstant %u64 1 +%u64_2 = OpConstant %u64 2 +%u64_3 = OpConstant %u64 3 + +%u32vec2_01 = OpConstantComposite %u32vec2 %u32_0 %u32_1 +%u32vec2_12 = OpConstantComposite %u32vec2 %u32_1 %u32_2 +%u32vec4_0123 = OpConstantComposite %u32vec4 %u32_0 %u32_1 %u32_2 %u32_3 +%u64vec2_01 = OpConstantComposite %u64vec2 %u64_0 %u64_1 + +%u32arr2 = OpTypeArray %u32 %u32_2 +%u32arr3 = OpTypeArray %u32 %u32_3 +%u32arr4 = OpTypeArray %u32 %u32_4 +%u64arr2 = OpTypeArray %u64 %u32_2 +%u64arr3 = OpTypeArray %u64 %u32_3 +%u64arr4 = OpTypeArray %u64 %u32_4 +%f32arr2 = OpTypeArray %f32 %u32_2 +%f32arr3 = OpTypeArray %f32 %u32_3 +%f32arr4 = OpTypeArray %f32 %u32_4 +%f64arr2 = OpTypeArray %f64 %u32_2 +%f64arr3 = OpTypeArray %f64 %u32_3 +%f64arr4 = OpTypeArray %f64 %u32_4 +)"; +} + +CodeGenerator GetDefaultShaderCodeGenerator() { + CodeGenerator generator; + generator.capabilities_ = GetDefaultShaderCapabilities(); + generator.memory_model_ = "OpMemoryModel Logical GLSL450\n"; + generator.types_ = GetDefaultShaderTypes(); + return generator; +} + +TEST_P(ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, InMain) { + const char* const built_in = std::get<0>(GetParam()); + const char* const execution_model = std::get<1>(GetParam()); + const char* const storage_class = std::get<2>(GetParam()); + const char* const data_type = std::get<3>(GetParam()); + const TestResult& test_result = std::get<4>(GetParam()); + + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = "OpMemberDecorate %built_in_type 0 BuiltIn "; + generator.before_types_ += built_in; + generator.before_types_ += "\n"; + + std::ostringstream after_types; + after_types << "%built_in_type = OpTypeStruct " << data_type << "\n"; + after_types << "%built_in_ptr = OpTypePointer " << storage_class + << " %built_in_type\n"; + after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class + << "\n"; + after_types << "%data_ptr = OpTypePointer " << storage_class << " " + << data_type << "\n"; + generator.after_types_ = after_types.str(); + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = execution_model; + + std::ostringstream execution_modes; + if (0 == std::strcmp(execution_model, "Fragment")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " OriginUpperLeft\n"; + } + if (0 == std::strcmp(built_in, "FragDepth")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " DepthReplacing\n"; + } + entry_point.execution_modes = execution_modes.str(); + + entry_point.body = R"( +%ptr = OpAccessChain %data_ptr %built_in_var %u32_0 +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(test_result.validation_result, + ValidateInstructions(SPV_ENV_VULKAN_1_0)); + if (test_result.error_str) { + EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str)); + } + if (test_result.error_str2) { + EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2)); + } +} + +TEST_P(ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, InFunction) { + const char* const built_in = std::get<0>(GetParam()); + const char* const execution_model = std::get<1>(GetParam()); + const char* const storage_class = std::get<2>(GetParam()); + const char* const data_type = std::get<3>(GetParam()); + const TestResult& test_result = std::get<4>(GetParam()); + + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = "OpMemberDecorate %built_in_type 0 BuiltIn "; + generator.before_types_ += built_in; + generator.before_types_ += "\n"; + + std::ostringstream after_types; + after_types << "%built_in_type = OpTypeStruct " << data_type << "\n"; + after_types << "%built_in_ptr = OpTypePointer " << storage_class + << " %built_in_type\n"; + after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class + << "\n"; + after_types << "%data_ptr = OpTypePointer " << storage_class << " " + << data_type << "\n"; + generator.after_types_ = after_types.str(); + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = execution_model; + + std::ostringstream execution_modes; + if (0 == std::strcmp(execution_model, "Fragment")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " OriginUpperLeft\n"; + } + if (0 == std::strcmp(built_in, "FragDepth")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " DepthReplacing\n"; + } + entry_point.execution_modes = execution_modes.str(); + + entry_point.body = R"( +%val2 = OpFunctionCall %void %foo +)"; + + generator.add_at_the_end_ = R"( +%foo = OpFunction %void None %func +%foo_entry = OpLabel +%ptr = OpAccessChain %data_ptr %built_in_var %u32_0 +OpReturn +OpFunctionEnd +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(test_result.validation_result, + ValidateInstructions(SPV_ENV_VULKAN_1_0)); + if (test_result.error_str) { + EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str)); + } + if (test_result.error_str2) { + EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2)); + } +} + +TEST_P(ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, Variable) { + const char* const built_in = std::get<0>(GetParam()); + const char* const execution_model = std::get<1>(GetParam()); + const char* const storage_class = std::get<2>(GetParam()); + const char* const data_type = std::get<3>(GetParam()); + const TestResult& test_result = std::get<4>(GetParam()); + + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = "OpDecorate %built_in_var BuiltIn "; + generator.before_types_ += built_in; + generator.before_types_ += "\n"; + + std::ostringstream after_types; + after_types << "%built_in_ptr = OpTypePointer " << storage_class << " " + << data_type << "\n"; + after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class + << "\n"; + generator.after_types_ = after_types.str(); + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = execution_model; + // Any kind of reference would do. + entry_point.body = R"( +%val = OpBitcast %u64 %built_in_var +)"; + + std::ostringstream execution_modes; + if (0 == std::strcmp(execution_model, "Fragment")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " OriginUpperLeft\n"; + } + if (0 == std::strcmp(built_in, "FragDepth")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " DepthReplacing\n"; + } + entry_point.execution_modes = execution_modes.str(); + + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(test_result.validation_result, + ValidateInstructions(SPV_ENV_VULKAN_1_0)); + if (test_result.error_str) { + EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str)); + } + if (test_result.error_str2) { + EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2)); + } +} + +INSTANTIATE_TEST_CASE_P( + ClipAndCullDistanceOutputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("ClipDistance", "CullDistance"), + Values("Vertex", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Output"), Values("%f32arr2", "%f32arr4"), + Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + ClipAndCullDistanceInputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("ClipDistance", "CullDistance"), + Values("Fragment", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Input"), Values("%f32arr2", "%f32arr4"), + Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + ClipAndCullDistanceFragmentOutput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"), + Values("Output"), Values("%f32arr4"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "Vulkan spec doesn't allow BuiltIn ClipDistance/CullDistance " + "to be used for variables with Output storage class if " + "execution model is Fragment.", + "which is called with execution model Fragment."))), ); + +INSTANTIATE_TEST_CASE_P( + ClipAndCullDistanceVertexInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("ClipDistance", "CullDistance"), Values("Vertex"), + Values("Input"), Values("%f32arr4"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "Vulkan spec doesn't allow BuiltIn ClipDistance/CullDistance " + "to be used for variables with Input storage class if " + "execution model is Vertex.", + "which is called with execution model Vertex."))), ); + +INSTANTIATE_TEST_CASE_P( + ClipAndCullInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("ClipDistance", "CullDistance"), Values("GLCompute"), + Values("Input", "Output"), Values("%f32arr4"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be used only with Fragment, Vertex, TessellationControl, " + "TessellationEvaluation or Geometry execution models"))), ); + +INSTANTIATE_TEST_CASE_P( + ClipAndCullDistanceNotArray, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"), + Values("Input"), Values("%f32vec2", "%f32vec4", "%f32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit float array", + "is not an array"))), ); + +INSTANTIATE_TEST_CASE_P( + ClipAndCullDistanceNotFloatArray, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"), + Values("Input"), Values("%u32arr2", "%u64arr4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit float array", + "components are not float scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + ClipAndCullDistanceNotF32Array, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"), + Values("Input"), Values("%f64arr2", "%f64arr4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit float array", + "has components with bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + FragCoordSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("FragCoord"), Values("Fragment"), Values("Input"), + Values("%f32vec4"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + FragCoordNotFragment, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("FragCoord"), + Values("Vertex", "GLCompute", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Input"), Values("%f32vec4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with Fragment execution model"))), ); + +INSTANTIATE_TEST_CASE_P( + FragCoordNotInput, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("FragCoord"), Values("Fragment"), Values("Output"), + Values("%f32vec4"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be only used for variables with Input storage class", + "uses storage class Output"))), ); + +INSTANTIATE_TEST_CASE_P( + FragCoordNotFloatVector, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("FragCoord"), Values("Fragment"), Values("Input"), + Values("%f32arr4", "%u32vec4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 4-component 32-bit float vector", + "is not a float vector"))), ); + +INSTANTIATE_TEST_CASE_P( + FragCoordNotFloatVec4, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("FragCoord"), Values("Fragment"), Values("Input"), + Values("%f32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 4-component 32-bit float vector", + "has 3 components"))), ); + +INSTANTIATE_TEST_CASE_P( + FragCoordNotF32Vec4, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("FragCoord"), Values("Fragment"), Values("Input"), + Values("%f64vec4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 4-component 32-bit float vector", + "has components with bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + FragDepthSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("FragDepth"), Values("Fragment"), Values("Output"), + Values("%f32"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + FragDepthNotFragment, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("FragDepth"), + Values("Vertex", "GLCompute", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Output"), Values("%f32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with Fragment execution model"))), ); + +INSTANTIATE_TEST_CASE_P( + FragDepthNotOutput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("FragDepth"), Values("Fragment"), Values("Input"), + Values("%f32"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be only used for variables with Output storage class", + "uses storage class Input"))), ); + +INSTANTIATE_TEST_CASE_P( + FragDepthNotFloatScalar, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("FragDepth"), Values("Fragment"), Values("Output"), + Values("%f32vec4", "%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit float scalar", + "is not a float scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + FragDepthNotF32, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("FragDepth"), Values("Fragment"), Values("Output"), + Values("%f64"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit float scalar", + "has bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + FrontFacingAndHelperInvocationSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("FrontFacing", "HelperInvocation"), Values("Fragment"), + Values("Input"), Values("%bool"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + FrontFacingAndHelperInvocationNotFragment, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("FrontFacing", "HelperInvocation"), + Values("Vertex", "GLCompute", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Input"), Values("%bool"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with Fragment execution model"))), ); + +INSTANTIATE_TEST_CASE_P( + FrontFacingAndHelperInvocationNotInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("FrontFacing", "HelperInvocation"), Values("Fragment"), + Values("Output"), Values("%bool"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be only used for variables with Input storage class", + "uses storage class Output"))), ); + +INSTANTIATE_TEST_CASE_P( + FrontFacingAndHelperInvocationNotBool, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("FrontFacing", "HelperInvocation"), Values("Fragment"), + Values("Input"), Values("%f32", "%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a bool scalar", + "is not a bool scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + ComputeShaderInputInt32Vec3Success, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups", + "WorkgroupId"), + Values("GLCompute"), Values("Input"), Values("%u32vec3"), + Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + ComputeShaderInputInt32Vec3NotGLCompute, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups", + "WorkgroupId"), + Values("Vertex", "Fragment", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Input"), Values("%u32vec3"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be used only with GLCompute execution model"))), ); + +INSTANTIATE_TEST_CASE_P( + ComputeShaderInputInt32Vec3NotInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups", + "WorkgroupId"), + Values("GLCompute"), Values("Output"), Values("%u32vec3"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be only used for variables with Input storage class", + "uses storage class Output"))), ); + +INSTANTIATE_TEST_CASE_P( + ComputeShaderInputInt32Vec3NotIntVector, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups", + "WorkgroupId"), + Values("GLCompute"), Values("Input"), + Values("%u32arr3", "%f32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 3-component 32-bit int vector", + "is not an int vector"))), ); + +INSTANTIATE_TEST_CASE_P( + ComputeShaderInputInt32Vec3NotIntVec3, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups", + "WorkgroupId"), + Values("GLCompute"), Values("Input"), Values("%u32vec4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 3-component 32-bit int vector", + "has 4 components"))), ); + +INSTANTIATE_TEST_CASE_P( + ComputeShaderInputInt32Vec3NotInt32Vec, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups", + "WorkgroupId"), + Values("GLCompute"), Values("Input"), Values("%u64vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 3-component 32-bit int vector", + "has components with bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + InvocationIdSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("InvocationId"), Values("Geometry", "TessellationControl"), + Values("Input"), Values("%u32"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + InvocationIdInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("InvocationId"), + Values("Vertex", "Fragment", "GLCompute", "TessellationEvaluation"), + Values("Input"), Values("%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with TessellationControl or " + "Geometry execution models"))), ); + +INSTANTIATE_TEST_CASE_P( + InvocationIdNotInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("InvocationId"), Values("Geometry", "TessellationControl"), + Values("Output"), Values("%u32"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be only used for variables with Input storage class", + "uses storage class Output"))), ); + +INSTANTIATE_TEST_CASE_P( + InvocationIdNotIntScalar, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("InvocationId"), Values("Geometry", "TessellationControl"), + Values("Input"), Values("%f32", "%u32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "is not an int scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + InvocationIdNotInt32, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("InvocationId"), Values("Geometry", "TessellationControl"), + Values("Input"), Values("%u64"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "has bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + InstanceIndexSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("InstanceIndex"), Values("Vertex"), Values("Input"), + Values("%u32"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + InstanceIndexInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("InstanceIndex"), + Values("Geometry", "Fragment", "GLCompute", "TessellationControl", + "TessellationEvaluation"), + Values("Input"), Values("%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with Vertex execution model"))), ); + +INSTANTIATE_TEST_CASE_P( + InstanceIndexNotInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("InstanceIndex"), Values("Vertex"), Values("Output"), + Values("%u32"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be only used for variables with Input storage class", + "uses storage class Output"))), ); + +INSTANTIATE_TEST_CASE_P( + InstanceIndexNotIntScalar, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("InstanceIndex"), Values("Vertex"), Values("Input"), + Values("%f32", "%u32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "is not an int scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + InstanceIndexNotInt32, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("InstanceIndex"), Values("Vertex"), Values("Input"), + Values("%u64"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "has bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + LayerAndViewportIndexInputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("Layer", "ViewportIndex"), Values("Fragment"), + Values("Input"), Values("%u32"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + LayerAndViewportIndexOutputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("Layer", "ViewportIndex"), Values("Geometry"), + Values("Output"), Values("%u32"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + LayerAndViewportIndexInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("Layer", "ViewportIndex"), + Values("Vertex", "GLCompute", "TessellationControl", + "TessellationEvaluation"), + Values("Input"), Values("%u32"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be used only with Fragment or Geometry execution models"))), ); + +INSTANTIATE_TEST_CASE_P( + LayerAndViewportIndexFragmentNotInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("Layer", "ViewportIndex"), Values("Fragment"), Values("Output"), + Values("%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "Output storage class if execution model is Fragment", + "which is called with execution model Fragment"))), ); + +INSTANTIATE_TEST_CASE_P( + LayerAndViewportIndexGeometryNotOutput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("Layer", "ViewportIndex"), Values("Geometry"), Values("Input"), + Values("%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "Input storage class if execution model is Geometry", + "which is called with execution model Geometry"))), ); + +INSTANTIATE_TEST_CASE_P( + LayerAndViewportIndexNotIntScalar, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("Layer", "ViewportIndex"), Values("Fragment"), + Values("Input"), Values("%f32", "%u32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "is not an int scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + LayerAndViewportIndexNotInt32, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("Layer", "ViewportIndex"), Values("Fragment"), + Values("Input"), Values("%u64"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "has bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + PatchVerticesSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PatchVertices"), + Values("TessellationEvaluation", "TessellationControl"), + Values("Input"), Values("%u32"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + PatchVerticesInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PatchVertices"), + Values("Vertex", "Fragment", "GLCompute", "Geometry"), + Values("Input"), Values("%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with TessellationControl or " + "TessellationEvaluation execution models"))), ); + +INSTANTIATE_TEST_CASE_P( + PatchVerticesNotInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PatchVertices"), + Values("TessellationEvaluation", "TessellationControl"), + Values("Output"), Values("%u32"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be only used for variables with Input storage class", + "uses storage class Output"))), ); + +INSTANTIATE_TEST_CASE_P( + PatchVerticesNotIntScalar, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PatchVertices"), + Values("TessellationEvaluation", "TessellationControl"), + Values("Input"), Values("%f32", "%u32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "is not an int scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + PatchVerticesNotInt32, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PatchVertices"), + Values("TessellationEvaluation", "TessellationControl"), + Values("Input"), Values("%u64"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "has bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + PointCoordSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PointCoord"), Values("Fragment"), Values("Input"), + Values("%f32vec2"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + PointCoordNotFragment, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("PointCoord"), + Values("Vertex", "GLCompute", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Input"), Values("%f32vec2"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with Fragment execution model"))), ); + +INSTANTIATE_TEST_CASE_P( + PointCoordNotInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PointCoord"), Values("Fragment"), Values("Output"), + Values("%f32vec2"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be only used for variables with Input storage class", + "uses storage class Output"))), ); + +INSTANTIATE_TEST_CASE_P( + PointCoordNotFloatVector, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PointCoord"), Values("Fragment"), Values("Input"), + Values("%f32arr2", "%u32vec2"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 2-component 32-bit float vector", + "is not a float vector"))), ); + +INSTANTIATE_TEST_CASE_P( + PointCoordNotFloatVec3, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PointCoord"), Values("Fragment"), Values("Input"), + Values("%f32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 2-component 32-bit float vector", + "has 3 components"))), ); + +INSTANTIATE_TEST_CASE_P( + PointCoordNotF32Vec4, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PointCoord"), Values("Fragment"), Values("Input"), + Values("%f64vec2"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 2-component 32-bit float vector", + "has components with bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + PointSizeOutputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PointSize"), + Values("Vertex", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Output"), Values("%f32"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + PointSizeInputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PointSize"), + Values("Geometry", "TessellationControl", "TessellationEvaluation"), + Values("Input"), Values("%f32"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + PointSizeVertexInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PointSize"), Values("Vertex"), Values("Input"), + Values("%f32"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "Vulkan spec doesn't allow BuiltIn PointSize " + "to be used for variables with Input storage class if " + "execution model is Vertex.", + "which is called with execution model Vertex."))), ); + +INSTANTIATE_TEST_CASE_P( + PointSizeInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PointSize"), Values("GLCompute", "Fragment"), + Values("Input", "Output"), Values("%f32"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be used only with Vertex, TessellationControl, " + "TessellationEvaluation or Geometry execution models"))), ); + +INSTANTIATE_TEST_CASE_P( + PointSizeNotFloatScalar, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PointSize"), Values("Vertex"), Values("Output"), + Values("%f32vec4", "%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit float scalar", + "is not a float scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + PointSizeNotF32, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PointSize"), Values("Vertex"), Values("Output"), + Values("%f64"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit float scalar", + "has bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + PositionOutputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("Position"), + Values("Vertex", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Output"), Values("%f32vec4"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + PositionInputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("Position"), + Values("Geometry", "TessellationControl", "TessellationEvaluation"), + Values("Input"), Values("%f32vec4"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + PositionVertexInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("Position"), Values("Vertex"), Values("Input"), + Values("%f32vec4"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "Vulkan spec doesn't allow BuiltIn Position " + "to be used for variables with Input storage class if " + "execution model is Vertex.", + "which is called with execution model Vertex."))), ); + +INSTANTIATE_TEST_CASE_P( + PositionInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("Position"), Values("GLCompute", "Fragment"), + Values("Input", "Output"), Values("%f32vec4"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be used only with Vertex, TessellationControl, " + "TessellationEvaluation or Geometry execution models"))), ); + +INSTANTIATE_TEST_CASE_P( + PositionNotFloatVector, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("Position"), Values("Geometry"), Values("Input"), + Values("%f32arr4", "%u32vec4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 4-component 32-bit float vector", + "is not a float vector"))), ); + +INSTANTIATE_TEST_CASE_P( + PositionNotFloatVec4, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("Position"), Values("Geometry"), Values("Input"), + Values("%f32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 4-component 32-bit float vector", + "has 3 components"))), ); + +INSTANTIATE_TEST_CASE_P( + PositionNotF32Vec4, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("Position"), Values("Geometry"), Values("Input"), + Values("%f64vec4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 4-component 32-bit float vector", + "has components with bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + PrimitiveIdInputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PrimitiveId"), + Values("Fragment", "TessellationControl", "TessellationEvaluation", + "Geometry"), + Values("Input"), Values("%u32"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + PrimitiveIdOutputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PrimitiveId"), Values("Geometry"), Values("Output"), + Values("%u32"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + PrimitiveIdInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PrimitiveId"), Values("Vertex", "GLCompute"), + Values("Input"), Values("%u32"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be used only with Fragment, TessellationControl, " + "TessellationEvaluation or Geometry execution models"))), ); + +INSTANTIATE_TEST_CASE_P( + PrimitiveIdFragmentNotInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("PrimitiveId"), Values("Fragment"), Values("Output"), + Values("%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "Output storage class if execution model is Fragment", + "which is called with execution model Fragment"))), ); + +INSTANTIATE_TEST_CASE_P( + PrimitiveIdGeometryNotInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PrimitiveId"), + Values("TessellationControl", "TessellationEvaluation"), + Values("Output"), Values("%u32"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "Output storage class if execution model is Tessellation", + "which is called with execution model Tessellation"))), ); + +INSTANTIATE_TEST_CASE_P( + PrimitiveIdNotIntScalar, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PrimitiveId"), Values("Fragment"), Values("Input"), + Values("%f32", "%u32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "is not an int scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + PrimitiveIdNotInt32, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("PrimitiveId"), Values("Fragment"), Values("Input"), + Values("%u64"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "has bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + SampleIdSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SampleId"), Values("Fragment"), Values("Input"), + Values("%u32"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + SampleIdInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("SampleId"), + Values("Vertex", "GLCompute", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Input"), Values("%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with Fragment execution model"))), ); + +INSTANTIATE_TEST_CASE_P( + SampleIdNotInput, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("SampleId"), Values("Fragment"), Values("Output"), + Values("%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "Vulkan spec allows BuiltIn SampleId to be only used " + "for variables with Input storage class"))), ); + +INSTANTIATE_TEST_CASE_P( + SampleIdNotIntScalar, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SampleId"), Values("Fragment"), Values("Input"), + Values("%f32", "%u32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "is not an int scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + SampleIdNotInt32, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SampleId"), Values("Fragment"), Values("Input"), + Values("%u64"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "has bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + SampleMaskSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SampleMask"), Values("Fragment"), Values("Input", "Output"), + Values("%u32arr2", "%u32arr4"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + SampleMaskInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("SampleMask"), + Values("Vertex", "GLCompute", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Input"), Values("%u32arr2"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with Fragment execution model"))), ); + +INSTANTIATE_TEST_CASE_P( + SampleMaskWrongStorageClass, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SampleMask"), Values("Fragment"), Values("UniformConstant"), + Values("%u32arr2"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "Vulkan spec allows BuiltIn SampleMask to be only used for " + "variables with Input or Output storage class"))), ); + +INSTANTIATE_TEST_CASE_P( + SampleMaskNotArray, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SampleMask"), Values("Fragment"), Values("Input"), + Values("%f32", "%u32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int array", + "is not an array"))), ); + +INSTANTIATE_TEST_CASE_P( + SampleMaskNotIntArray, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SampleMask"), Values("Fragment"), Values("Input"), + Values("%f32arr2"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int array", + "components are not int scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + SampleMaskNotInt32Array, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SampleMask"), Values("Fragment"), Values("Input"), + Values("%u64arr2"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int array", + "has components with bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + SamplePositionSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"), + Values("%f32vec2"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + SamplePositionNotFragment, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("SamplePosition"), + Values("Vertex", "GLCompute", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Input"), Values("%f32vec2"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with Fragment execution model"))), ); + +INSTANTIATE_TEST_CASE_P( + SamplePositionNotInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SamplePosition"), Values("Fragment"), Values("Output"), + Values("%f32vec2"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be only used for variables with Input storage class", + "uses storage class Output"))), ); + +INSTANTIATE_TEST_CASE_P( + SamplePositionNotFloatVector, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"), + Values("%f32arr2", "%u32vec4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 2-component 32-bit float vector", + "is not a float vector"))), ); + +INSTANTIATE_TEST_CASE_P( + SamplePositionNotFloatVec2, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"), + Values("%f32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 2-component 32-bit float vector", + "has 3 components"))), ); + +INSTANTIATE_TEST_CASE_P( + SamplePositionNotF32Vec2, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"), + Values("%f64vec2"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 2-component 32-bit float vector", + "has components with bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + TessCoordSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessCoord"), Values("TessellationEvaluation"), + Values("Input"), Values("%f32vec3"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + TessCoordNotFragment, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("TessCoord"), + Values("Vertex", "GLCompute", "Geometry", "TessellationControl", + "Fragment"), + Values("Input"), Values("%f32vec3"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be used only with TessellationEvaluation execution model"))), ); + +INSTANTIATE_TEST_CASE_P( + TessCoordNotInput, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessCoord"), Values("Fragment"), Values("Output"), + Values("%f32vec3"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "to be only used for variables with Input storage class", + "uses storage class Output"))), ); + +INSTANTIATE_TEST_CASE_P( + TessCoordNotFloatVector, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessCoord"), Values("Fragment"), Values("Input"), + Values("%f32arr3", "%u32vec4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 3-component 32-bit float vector", + "is not a float vector"))), ); + +INSTANTIATE_TEST_CASE_P( + TessCoordNotFloatVec3, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessCoord"), Values("Fragment"), Values("Input"), + Values("%f32vec2"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 3-component 32-bit float vector", + "has 2 components"))), ); + +INSTANTIATE_TEST_CASE_P( + TessCoordNotF32Vec3, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessCoord"), Values("Fragment"), Values("Input"), + Values("%f64vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 3-component 32-bit float vector", + "has components with bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelOuterTeseInputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"), + Values("Input"), Values("%f32arr4"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelOuterTescOutputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelOuter"), Values("TessellationControl"), + Values("Output"), Values("%f32arr4"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelOuterInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelOuter"), + Values("Vertex", "GLCompute", "Geometry", "Fragment"), + Values("Input"), Values("%f32arr4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with TessellationControl or " + "TessellationEvaluation execution models."))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelOuterOutputTese, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"), + Values("Output"), Values("%f32arr4"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be " + "used for variables with Output storage class if execution " + "model is TessellationEvaluation."))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelOuterInputTesc, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelOuter"), Values("TessellationControl"), + Values("Input"), Values("%f32arr4"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be " + "used for variables with Input storage class if execution " + "model is TessellationControl."))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelOuterNotArray, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"), + Values("Input"), Values("%f32vec4", "%f32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 4-component 32-bit float array", + "is not an array"))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelOuterNotFloatArray, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"), + Values("Input"), Values("%u32arr4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 4-component 32-bit float array", + "components are not float scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelOuterNotFloatArr4, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"), + Values("Input"), Values("%f32arr3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 4-component 32-bit float array", + "has 3 components"))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelOuterNotF32Arr4, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"), + Values("Input"), Values("%f64arr4"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 4-component 32-bit float array", + "has components with bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelInnerTeseInputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelInner"), Values("TessellationEvaluation"), + Values("Input"), Values("%f32arr2"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelInnerTescOutputSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelInner"), Values("TessellationControl"), + Values("Output"), Values("%f32arr2"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelInnerInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelInner"), + Values("Vertex", "GLCompute", "Geometry", "Fragment"), + Values("Input"), Values("%f32arr2"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with TessellationControl or " + "TessellationEvaluation execution models."))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelInnerOutputTese, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelInner"), Values("TessellationEvaluation"), + Values("Output"), Values("%f32arr2"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be " + "used for variables with Output storage class if execution " + "model is TessellationEvaluation."))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelInnerInputTesc, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelInner"), Values("TessellationControl"), + Values("Input"), Values("%f32arr2"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be " + "used for variables with Input storage class if execution " + "model is TessellationControl."))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelInnerNotArray, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelInner"), Values("TessellationEvaluation"), + Values("Input"), Values("%f32vec2", "%f32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 2-component 32-bit float array", + "is not an array"))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelInnerNotFloatArray, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelInner"), Values("TessellationEvaluation"), + Values("Input"), Values("%u32arr2"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 2-component 32-bit float array", + "components are not float scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelInnerNotFloatArr2, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelInner"), Values("TessellationEvaluation"), + Values("Input"), Values("%f32arr3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 2-component 32-bit float array", + "has 3 components"))), ); + +INSTANTIATE_TEST_CASE_P( + TessLevelInnerNotF32Arr2, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("TessLevelInner"), Values("TessellationEvaluation"), + Values("Input"), Values("%f64arr2"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 2-component 32-bit float array", + "has components with bit width 64"))), ); + +INSTANTIATE_TEST_CASE_P( + VertexIndexSuccess, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("VertexIndex"), Values("Vertex"), Values("Input"), + Values("%u32"), Values(TestResult())), ); + +INSTANTIATE_TEST_CASE_P( + VertexIndexInvalidExecutionModel, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("VertexIndex"), + Values("Fragment", "GLCompute", "Geometry", "TessellationControl", + "TessellationEvaluation"), + Values("Input"), Values("%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "to be used only with Vertex execution model"))), ); + +INSTANTIATE_TEST_CASE_P( + VertexIndexNotInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine( + Values("VertexIndex"), Values("Vertex"), Values("Output"), + Values("%u32"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "Vulkan spec allows BuiltIn VertexIndex to be only " + "used for variables with Input storage class"))), ); + +INSTANTIATE_TEST_CASE_P( + VertexIndexNotIntScalar, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("VertexIndex"), Values("Vertex"), Values("Input"), + Values("%f32", "%u32vec3"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "is not an int scalar"))), ); + +INSTANTIATE_TEST_CASE_P( + VertexIndexNotInt32, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("VertexIndex"), Values("Vertex"), Values("Input"), + Values("%u64"), + Values(TestResult(SPV_ERROR_INVALID_DATA, + "needs to be a 32-bit int scalar", + "has bit width 64"))), ); + +TEST_F(ValidateBuiltIns, WorkgroupSizeSuccess) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = R"( +OpDecorate %workgroup_size BuiltIn WorkgroupSize +)"; + + generator.after_types_ = R"( +%workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1 +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "GLCompute"; + entry_point.body = R"( +%copy = OpCopyObject %u32vec3 %workgroup_size +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0)); +} + +TEST_F(ValidateBuiltIns, WorkgroupSizeFragment) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = R"( +OpDecorate %workgroup_size BuiltIn WorkgroupSize +)"; + + generator.after_types_ = R"( +%workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1 +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "Fragment"; + entry_point.execution_modes = "OpExecutionMode %main OriginUpperLeft"; + entry_point.body = R"( +%copy = OpCopyObject %u32vec3 %workgroup_size +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Vulkan spec allows BuiltIn WorkgroupSize to be used " + "only with GLCompute execution model")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("is referencing ID <2> (OpConstantComposite) which is " + "decorated with BuiltIn WorkgroupSize in function <1> " + "called with execution model Fragment")); +} + +TEST_F(ValidateBuiltIns, WorkgroupSizeNotConstant) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = R"( +OpDecorate %copy BuiltIn WorkgroupSize +)"; + + generator.after_types_ = R"( +%workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1 +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "GLCompute"; + entry_point.body = R"( +%copy = OpCopyObject %u32vec3 %workgroup_size +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Vulkan spec requires BuiltIn WorkgroupSize to be a " + "constant. ID <2> (OpCopyObject) is not a constant")); +} + +TEST_F(ValidateBuiltIns, WorkgroupSizeNotVector) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = R"( +OpDecorate %workgroup_size BuiltIn WorkgroupSize +)"; + + generator.after_types_ = R"( +%workgroup_size = OpConstant %u32 16 +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "GLCompute"; + entry_point.body = R"( +%copy = OpCopyObject %u32 %workgroup_size +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize " + "variable needs to be a 3-component 32-bit int vector. " + "ID <2> (OpConstant) is not an int vector.")); +} + +TEST_F(ValidateBuiltIns, WorkgroupSizeNotIntVector) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = R"( +OpDecorate %workgroup_size BuiltIn WorkgroupSize +)"; + + generator.after_types_ = R"( +%workgroup_size = OpConstantComposite %f32vec3 %f32_1 %f32_1 %f32_1 +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "GLCompute"; + entry_point.body = R"( +%copy = OpCopyObject %f32vec3 %workgroup_size +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize " + "variable needs to be a 3-component 32-bit int vector. " + "ID <2> (OpConstantComposite) is not an int vector.")); +} + +TEST_F(ValidateBuiltIns, WorkgroupSizeNotVec3) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = R"( +OpDecorate %workgroup_size BuiltIn WorkgroupSize +)"; + + generator.after_types_ = R"( +%workgroup_size = OpConstantComposite %u32vec2 %u32_1 %u32_1 +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "GLCompute"; + entry_point.body = R"( +%copy = OpCopyObject %u32vec2 %workgroup_size +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize " + "variable needs to be a 3-component 32-bit int vector. " + "ID <2> (OpConstantComposite) has 2 components.")); +} + +TEST_F(ValidateBuiltIns, WorkgroupSizeNotInt32Vec) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = R"( +OpDecorate %workgroup_size BuiltIn WorkgroupSize +)"; + + generator.after_types_ = R"( +%workgroup_size = OpConstantComposite %u64vec3 %u64_1 %u64_1 %u64_1 +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "GLCompute"; + entry_point.body = R"( +%copy = OpCopyObject %u64vec3 %workgroup_size +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize variable " + "needs to be a 3-component 32-bit int vector. ID <2> " + "(OpConstantComposite) has components with bit width 64.")); +} + +TEST_F(ValidateBuiltIns, GeometryPositionInOutSuccess) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + + generator.before_types_ = R"( +OpMemberDecorate %input_type 0 BuiltIn Position +OpMemberDecorate %output_type 0 BuiltIn Position +)"; + + generator.after_types_ = R"( +%input_type = OpTypeStruct %f32vec4 +%input_ptr = OpTypePointer Input %input_type +%input = OpVariable %input_ptr Input +%input_f32vec4_ptr = OpTypePointer Input %f32vec4 +%output_type = OpTypeStruct %f32vec4 +%output_ptr = OpTypePointer Output %output_type +%output = OpVariable %output_ptr Output +%output_f32vec4_ptr = OpTypePointer Output %f32vec4 +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "Geometry"; + entry_point.body = R"( +%input_pos = OpAccessChain %input_f32vec4_ptr %input %u32_0 +%output_pos = OpAccessChain %output_f32vec4_ptr %output %u32_0 +%pos = OpLoad %f32vec4 %input_pos +OpStore %output_pos %pos +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0)); +} + +TEST_F(ValidateBuiltIns, TwoBuiltInsFirstFails) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + + generator.before_types_ = R"( +OpMemberDecorate %input_type 0 BuiltIn FragCoord +OpMemberDecorate %output_type 0 BuiltIn Position +)"; + + generator.after_types_ = R"( +%input_type = OpTypeStruct %f32vec4 +%input_ptr = OpTypePointer Input %input_type +%input = OpVariable %input_ptr Input +%input_f32vec4_ptr = OpTypePointer Input %f32vec4 +%output_type = OpTypeStruct %f32vec4 +%output_ptr = OpTypePointer Output %output_type +%output = OpVariable %output_ptr Output +%output_f32vec4_ptr = OpTypePointer Output %f32vec4 +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "Geometry"; + entry_point.body = R"( +%input_pos = OpAccessChain %input_f32vec4_ptr %input %u32_0 +%output_pos = OpAccessChain %output_f32vec4_ptr %output %u32_0 +%pos = OpLoad %f32vec4 %input_pos +OpStore %output_pos %pos +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Vulkan spec allows BuiltIn FragCoord to be used only " + "with Fragment execution model")); +} + +TEST_F(ValidateBuiltIns, TwoBuiltInsSecondFails) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + + generator.before_types_ = R"( +OpMemberDecorate %input_type 0 BuiltIn Position +OpMemberDecorate %output_type 0 BuiltIn FragCoord +)"; + + generator.after_types_ = R"( +%input_type = OpTypeStruct %f32vec4 +%input_ptr = OpTypePointer Input %input_type +%input = OpVariable %input_ptr Input +%input_f32vec4_ptr = OpTypePointer Input %f32vec4 +%output_type = OpTypeStruct %f32vec4 +%output_ptr = OpTypePointer Output %output_type +%output = OpVariable %output_ptr Output +%output_f32vec4_ptr = OpTypePointer Output %f32vec4 +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "Geometry"; + entry_point.body = R"( +%input_pos = OpAccessChain %input_f32vec4_ptr %input %u32_0 +%output_pos = OpAccessChain %output_f32vec4_ptr %output %u32_0 +%pos = OpLoad %f32vec4 %input_pos +OpStore %output_pos %pos +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Vulkan spec allows BuiltIn FragCoord to be only used " + "for variables with Input storage class")); +} + +TEST_F(ValidateBuiltIns, VertexPositionVariableSuccess) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = R"( +OpDecorate %position BuiltIn Position +)"; + + generator.after_types_ = R"( +%f32vec4_ptr_output = OpTypePointer Output %f32vec4 +%position = OpVariable %f32vec4_ptr_output Output +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "Vertex"; + entry_point.body = R"( +OpStore %position %f32vec4_0123 +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0)); +} + +TEST_F(ValidateBuiltIns, FragmentPositionTwoEntryPoints) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = R"( +OpMemberDecorate %output_type 0 BuiltIn Position +)"; + + generator.after_types_ = R"( +%output_type = OpTypeStruct %f32vec4 +%output_ptr = OpTypePointer Output %output_type +%output = OpVariable %output_ptr Output +%output_f32vec4_ptr = OpTypePointer Output %f32vec4 +)"; + + EntryPoint entry_point; + entry_point.name = "vmain"; + entry_point.execution_model = "Vertex"; + entry_point.body = R"( +%val1 = OpFunctionCall %void %foo +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + entry_point.name = "fmain"; + entry_point.execution_model = "Fragment"; + entry_point.execution_modes = "OpExecutionMode %fmain OriginUpperLeft"; + entry_point.body = R"( +%val2 = OpFunctionCall %void %foo +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + generator.add_at_the_end_ = R"( +%foo = OpFunction %void None %func +%foo_entry = OpLabel +%position = OpAccessChain %output_f32vec4_ptr %output %u32_0 +OpStore %position %f32vec4_0123 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Vulkan spec allows BuiltIn Position to be used only " + "with Vertex, TessellationControl, " + "TessellationEvaluation or Geometry execution models")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("called with execution model Fragment")); +} + +TEST_F(ValidateBuiltIns, FragmentFragDepthNoDepthReplacing) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = R"( +OpMemberDecorate %output_type 0 BuiltIn FragDepth +)"; + + generator.after_types_ = R"( +%output_type = OpTypeStruct %f32 +%output_ptr = OpTypePointer Output %output_type +%output = OpVariable %output_ptr Output +%output_f32_ptr = OpTypePointer Output %f32 +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "Fragment"; + entry_point.execution_modes = "OpExecutionMode %main OriginUpperLeft"; + entry_point.body = R"( +%val2 = OpFunctionCall %void %foo +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + generator.add_at_the_end_ = R"( +%foo = OpFunction %void None %func +%foo_entry = OpLabel +%frag_depth = OpAccessChain %output_f32_ptr %output %u32_0 +OpStore %frag_depth %f32_1 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Vulkan spec requires DepthReplacing execution mode to " + "be declared when using BuiltIn FragDepth")); +} + +TEST_F(ValidateBuiltIns, FragmentFragDepthOneMainHasDepthReplacingOtherHasnt) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = R"( +OpMemberDecorate %output_type 0 BuiltIn FragDepth +)"; + + generator.after_types_ = R"( +%output_type = OpTypeStruct %f32 +%output_ptr = OpTypePointer Output %output_type +%output = OpVariable %output_ptr Output +%output_f32_ptr = OpTypePointer Output %f32 +)"; + + EntryPoint entry_point; + entry_point.name = "main_d_r"; + entry_point.execution_model = "Fragment"; + entry_point.execution_modes = + "OpExecutionMode %main_d_r OriginUpperLeft\n" + "OpExecutionMode %main_d_r DepthReplacing"; + entry_point.body = R"( +%val2 = OpFunctionCall %void %foo +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + entry_point.name = "main_no_d_r"; + entry_point.execution_model = "Fragment"; + entry_point.execution_modes = "OpExecutionMode %main_no_d_r OriginUpperLeft"; + entry_point.body = R"( +%val3 = OpFunctionCall %void %foo +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + generator.add_at_the_end_ = R"( +%foo = OpFunction %void None %func +%foo_entry = OpLabel +%frag_depth = OpAccessChain %output_f32_ptr %output %u32_0 +OpStore %frag_depth %f32_1 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Vulkan spec requires DepthReplacing execution mode to " + "be declared when using BuiltIn FragDepth")); +} + +} // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_capability_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_capability_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_capability_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_capability_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -1035,11 +1035,6 @@ KernelDependencies()), make_pair(string(kGLSL450MemoryModel) + "OpEntryPoint Vertex %func \"shader\" \n" - "OpDecorate %intt FPRoundingMode RTE\n" - "%intt = OpTypeInt 32 0\n" + string(kVoidFVoid), - KernelDependencies()), -make_pair(string(kGLSL450MemoryModel) + - "OpEntryPoint Vertex %func \"shader\" \n" "OpDecorate %intt FPFastMathMode Fast\n" "%intt = OpTypeInt 32 0\n" + string(kVoidFVoid), KernelDependencies()), @@ -1341,20 +1336,30 @@ ValuesIn(AllSpirV10Capabilities()), Values( make_pair(string(kGLSL450MemoryModel) + - "OpEntryPoint Vertex %func \"shader\" \n" + - "OpDecorate %intt BuiltIn PointSize\n" + "OpEntryPoint Vertex %func \"shader\" \n" + "OpMemberDecorate %block 0 BuiltIn PointSize\n" + "%f32 = OpTypeFloat 32\n" + "%block = OpTypeStruct %f32\n" "%intt = OpTypeInt 32 0\n" + string(kVoidFVoid), // Capabilities which should succeed. AllVulkan10Capabilities()), make_pair(string(kGLSL450MemoryModel) + - "OpEntryPoint Vertex %func \"shader\" \n" + - "OpDecorate %intt BuiltIn ClipDistance\n" - "%intt = OpTypeInt 32 0\n" + string(kVoidFVoid), + "OpEntryPoint Vertex %func \"shader\" \n" + "OpMemberDecorate %block 0 BuiltIn ClipDistance\n" + "%f32 = OpTypeFloat 32\n" + "%intt = OpTypeInt 32 0\n" + "%intt_4 = OpConstant %intt 4\n" + "%f32arr4 = OpTypeArray %f32 %intt_4\n" + "%block = OpTypeStruct %f32arr4\n" + string(kVoidFVoid), AllVulkan10Capabilities()), make_pair(string(kGLSL450MemoryModel) + - "OpEntryPoint Vertex %func \"shader\" \n" + - "OpDecorate %intt BuiltIn CullDistance\n" - "%intt = OpTypeInt 32 0\n" + string(kVoidFVoid), + "OpEntryPoint Vertex %func \"shader\" \n" + "OpMemberDecorate %block 0 BuiltIn CullDistance\n" + "%f32 = OpTypeFloat 32\n" + "%intt = OpTypeInt 32 0\n" + "%intt_4 = OpConstant %intt 4\n" + "%f32arr4 = OpTypeArray %f32 %intt_4\n" + "%block = OpTypeStruct %f32arr4\n" + string(kVoidFVoid), AllVulkan10Capabilities()) )),); @@ -1473,7 +1478,9 @@ : SPV_ENV_UNIVERSAL_1_1; const string test_code = MakeAssembly(GetParam()); CompileSuccessfully(test_code, env); - ASSERT_EQ(ExpectedResult(GetParam()), ValidateInstructions(env)) << test_code; + ASSERT_EQ(ExpectedResult(GetParam()), ValidateInstructions(env)) + << "target env: " << spvTargetEnvDescription(env) << "\ntest code:\n" + << test_code; } TEST_P(ValidateCapabilityV11, Capability) { @@ -1601,8 +1608,9 @@ OpExtension "SPV_KHR_shader_draw_parameters" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %func "shader" -OpDecorate %intt BuiltIn PointSize -%intt = OpTypeInt 32 0 +OpMemberDecorate %block 0 BuiltIn PointSize +%f32 = OpTypeFloat 32 +%block = OpTypeStruct %f32 )" + string(kVoidFVoid); CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_0); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_composites_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_composites_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_composites_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_composites_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -1416,4 +1416,82 @@ "index 3 into the structure '26'. This structure " "has 3 members. Largest valid index is 2.")); } + +// #1403: Ensure that the default spec constant value is not used to check the +// extract index. +TEST_F(ValidateComposites, ExtractFromSpecConstantSizedArray) { + std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical OpenCL +OpDecorate %spec_const SpecId 1 +%void = OpTypeVoid +%uint = OpTypeInt 32 0 +%spec_const = OpSpecConstant %uint 3 +%uint_array = OpTypeArray %uint %spec_const +%undef = OpUndef %uint_array +%voidf = OpTypeFunction %void +%func = OpFunction %void None %voidf +%1 = OpLabel +%2 = OpCompositeExtract %uint %undef 4 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +// #1403: Ensure that spec constant ops do not produce false positives. +TEST_F(ValidateComposites, ExtractFromSpecConstantOpSizedArray) { + std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical OpenCL +OpDecorate %spec_const SpecId 1 +%void = OpTypeVoid +%uint = OpTypeInt 32 0 +%const = OpConstant %uint 1 +%spec_const = OpSpecConstant %uint 3 +%spec_const_op = OpSpecConstantOp %uint IAdd %spec_const %const +%uint_array = OpTypeArray %uint %spec_const_op +%undef = OpUndef %uint_array +%voidf = OpTypeFunction %void +%func = OpFunction %void None %voidf +%1 = OpLabel +%2 = OpCompositeExtract %uint %undef 4 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +// #1403: Ensure that the default spec constant value is not used to check the +// size of the array for a composite construct. This code has limited actual +// value as it is incorrect unless the specialization constant is assigned the +// value of 2, but it is still a valid module. +TEST_F(ValidateComposites, CompositeConstructSpecConstantSizedArray) { + std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical OpenCL +OpDecorate %spec_const SpecId 1 +%void = OpTypeVoid +%uint = OpTypeInt 32 0 +%uint_0 = OpConstant %uint 0 +%spec_const = OpSpecConstant %uint 3 +%uint_array = OpTypeArray %uint %spec_const +%voidf = OpTypeFunction %void +%func = OpFunction %void None %voidf +%1 = OpLabel +%2 = OpCompositeConstruct %uint_array %uint_0 %uint_0 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} } // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_conversion_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_conversion_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_conversion_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_conversion_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -412,8 +412,6 @@ ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } -#if 0 -// TODO(atgoo@github.com) Reenable the test once the check is reenabled. TEST_F(ValidateConversion, UConvertWrongResultType) { const std::string body = R"( %val = OpUConvert %s32 %s32_1 @@ -421,8 +419,9 @@ CompileSuccessfully(GenerateShaderCode(body).c_str()); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr( - "Expected unsigned int scalar or vector type as Result Type: UConvert")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Expected unsigned int scalar or vector type as Result " + "Type: UConvert")); } TEST_F(ValidateConversion, UConvertWrongInputType) { @@ -432,8 +431,8 @@ CompileSuccessfully(GenerateShaderCode(body).c_str()); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr( - "Expected input to be int scalar or vector: UConvert")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Expected input to be int scalar or vector: UConvert")); } TEST_F(ValidateConversion, UConvertDifferentDimension) { @@ -443,8 +442,9 @@ CompileSuccessfully(GenerateShaderCode(body).c_str()); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr( - "Expected input to have the same dimension as Result Type: UConvert")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Expected input to have the same dimension as Result " + "Type: UConvert")); } TEST_F(ValidateConversion, UConvertSameBitWidth) { @@ -454,10 +454,10 @@ CompileSuccessfully(GenerateShaderCode(body).c_str()); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr( - "Expected input to have different bit width from Result Type: UConvert")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Expected input to have different bit width from " + "Result Type: UConvert")); } -#endif TEST_F(ValidateConversion, SConvertSuccess) { const std::string body = R"( diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_data_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_data_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_data_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_data_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -570,20 +570,26 @@ } } -TEST_F(ValidateData, default_disallow_free_fp_rounding_mode) { - string str = R"( +TEST_F(ValidateData, vulkan_disallow_free_fp_rounding_mode) { + for (const char* mode : {"RTE", "RTZ"}) { + for (const auto env : {SPV_ENV_VULKAN_1_0, SPV_ENV_VULKAN_1_1}) { + string str = string(R"( OpCapability Shader - OpCapability Linkage OpMemoryModel Logical GLSL450 - OpDecorate %2 FPRoundingMode RTZ + OpDecorate %2 FPRoundingMode )") + + mode + R"( %1 = OpTypeFloat 32 %2 = OpConstant %1 1.25 - )"; - CompileSuccessfully(str.c_str()); - ASSERT_EQ(SPV_ERROR_INVALID_CAPABILITY, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("Operand 2 of Decorate requires one of these " - "capabilities: Kernel")); + )"; + CompileSuccessfully(str.c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_CAPABILITY, ValidateInstructions(env)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Operand 2 of Decorate requires one of these capabilities: " + "StorageBuffer16BitAccess StorageUniform16 " + "StoragePushConstant16 StorageInputOutput16")); + } + } } } // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_decoration_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_decoration_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_decoration_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_decoration_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -21,11 +21,11 @@ namespace { +using ::testing::Eq; +using ::testing::HasSubstr; using libspirv::Decoration; using std::string; using std::vector; -using ::testing::Eq; -using ::testing::HasSubstr; using ValidateDecorations = spvtest::ValidateBase; @@ -448,4 +448,104 @@ EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()); } +TEST_F(ValidateDecorations, BuiltinVariablesGoodVulkan) { + const spv_target_env env = SPV_ENV_VULKAN_1_0; + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %gl_FragCoord %_entryPointOutput +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 500 +OpDecorate %gl_FragCoord BuiltIn FragCoord +OpDecorate %_entryPointOutput Location 0 +%void = OpTypeVoid +%3 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%float_0 = OpConstant %float 0 +%14 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 +%_ptr_Input_v4float = OpTypePointer Input %v4float +%gl_FragCoord = OpVariable %_ptr_Input_v4float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput = OpVariable %_ptr_Output_v4float Output +%main = OpFunction %void None %3 +%5 = OpLabel +OpStore %_entryPointOutput %14 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, env); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState(env)); +} + +TEST_F(ValidateDecorations, BuiltinVariablesWithLocationDecorationVulkan) { + const spv_target_env env = SPV_ENV_VULKAN_1_0; + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %gl_FragCoord %_entryPointOutput +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 500 +OpDecorate %gl_FragCoord BuiltIn FragCoord +OpDecorate %gl_FragCoord Location 0 +OpDecorate %_entryPointOutput Location 0 +%void = OpTypeVoid +%3 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%float_0 = OpConstant %float 0 +%14 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 +%_ptr_Input_v4float = OpTypePointer Input %v4float +%gl_FragCoord = OpVariable %_ptr_Input_v4float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput = OpVariable %_ptr_Output_v4float Output +%main = OpFunction %void None %3 +%5 = OpLabel +OpStore %_entryPointOutput %14 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, env); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState(env)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("A BuiltIn variable (id 2) cannot have any Location or " + "Component decorations")); +} +TEST_F(ValidateDecorations, BuiltinVariablesWithComponentDecorationVulkan) { + const spv_target_env env = SPV_ENV_VULKAN_1_0; + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %gl_FragCoord %_entryPointOutput +OpExecutionMode %main OriginUpperLeft +OpSource HLSL 500 +OpDecorate %gl_FragCoord BuiltIn FragCoord +OpDecorate %gl_FragCoord Component 0 +OpDecorate %_entryPointOutput Location 0 +%void = OpTypeVoid +%3 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%float_0 = OpConstant %float 0 +%14 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 +%_ptr_Input_v4float = OpTypePointer Input %v4float +%gl_FragCoord = OpVariable %_ptr_Input_v4float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput = OpVariable %_ptr_Output_v4float Output +%main = OpFunction %void None %3 +%5 = OpLabel +OpStore %_entryPointOutput %14 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, env); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState(env)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("A BuiltIn variable (id 2) cannot have any Location or " + "Component decorations")); +} + } // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_extensions_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_extensions_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_extensions_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_extensions_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -19,6 +19,7 @@ #include "enum_string_mapping.h" #include "extensions.h" #include "gmock/gmock.h" +#include "spirv_target_env.h" #include "test_fixture.h" #include "unit_spirv.h" #include "val_fixtures.h" @@ -60,7 +61,9 @@ "SPV_AMD_gpu_shader_int16", "SPV_KHR_post_depth_coverage", "SPV_KHR_shader_atomic_counter_ops", "SPV_EXT_shader_stencil_export", "SPV_EXT_shader_viewport_index_layer", - "SPV_AMD_shader_image_load_store_lod", "SPV_AMD_shader_fragment_mask")); + "SPV_AMD_shader_image_load_store_lod", "SPV_AMD_shader_fragment_mask", + "SPV_GOOGLE_decorate_string", "SPV_GOOGLE_hlsl_functionality1", + "SPV_NV_shader_subgroup_partitioned", "SPV_EXT_descriptor_indexing")); INSTANTIATE_TEST_CASE_P(FailSilently, ValidateUnknownExtensions, Values("ERROR_unknown_extension", "SPV_KHR_", @@ -107,7 +110,6 @@ EXPECT_THAT(getDiagnosticString(), HasSubstr("SPV_KHR_device_group")); } - using ValidateAMDShaderBallotCapabilities = spvtest::ValidateBase; // Returns a vector of strings for the prefix of a SPIR-V assembly shader @@ -139,38 +141,56 @@ // of ShaderPartsForAMDShaderBallot. std::vector AMDShaderBallotGroupInstructions() { return std::vector{ - "%iadd_reduce = OpGroupIAddNonUniformAMD %uint %scope Reduce %uint_const", - "%iadd_iscan = OpGroupIAddNonUniformAMD %uint %scope InclusiveScan %uint_const", - "%iadd_escan = OpGroupIAddNonUniformAMD %uint %scope ExclusiveScan %uint_const", - - "%fadd_reduce = OpGroupFAddNonUniformAMD %float %scope Reduce %float_const", - "%fadd_iscan = OpGroupFAddNonUniformAMD %float %scope InclusiveScan %float_const", - "%fadd_escan = OpGroupFAddNonUniformAMD %float %scope ExclusiveScan %float_const", - - "%fmin_reduce = OpGroupFMinNonUniformAMD %float %scope Reduce %float_const", - "%fmin_iscan = OpGroupFMinNonUniformAMD %float %scope InclusiveScan %float_const", - "%fmin_escan = OpGroupFMinNonUniformAMD %float %scope ExclusiveScan %float_const", - - "%umin_reduce = OpGroupUMinNonUniformAMD %uint %scope Reduce %uint_const", - "%umin_iscan = OpGroupUMinNonUniformAMD %uint %scope InclusiveScan %uint_const", - "%umin_escan = OpGroupUMinNonUniformAMD %uint %scope ExclusiveScan %uint_const", - - "%smin_reduce = OpGroupUMinNonUniformAMD %int %scope Reduce %int_const", - "%smin_iscan = OpGroupUMinNonUniformAMD %int %scope InclusiveScan %int_const", - "%smin_escan = OpGroupUMinNonUniformAMD %int %scope ExclusiveScan %int_const", - - "%fmax_reduce = OpGroupFMaxNonUniformAMD %float %scope Reduce %float_const", - "%fmax_iscan = OpGroupFMaxNonUniformAMD %float %scope InclusiveScan %float_const", - "%fmax_escan = OpGroupFMaxNonUniformAMD %float %scope ExclusiveScan %float_const", - - "%umax_reduce = OpGroupUMaxNonUniformAMD %uint %scope Reduce %uint_const", - "%umax_iscan = OpGroupUMaxNonUniformAMD %uint %scope InclusiveScan %uint_const", - "%umax_escan = OpGroupUMaxNonUniformAMD %uint %scope ExclusiveScan %uint_const", - - "%smax_reduce = OpGroupUMaxNonUniformAMD %int %scope Reduce %int_const", - "%smax_iscan = OpGroupUMaxNonUniformAMD %int %scope InclusiveScan %int_const", - "%smax_escan = OpGroupUMaxNonUniformAMD %int %scope ExclusiveScan %int_const" - }; + "%iadd_reduce = OpGroupIAddNonUniformAMD %uint %scope Reduce %uint_const", + "%iadd_iscan = OpGroupIAddNonUniformAMD %uint %scope InclusiveScan " + "%uint_const", + "%iadd_escan = OpGroupIAddNonUniformAMD %uint %scope ExclusiveScan " + "%uint_const", + + "%fadd_reduce = OpGroupFAddNonUniformAMD %float %scope Reduce " + "%float_const", + "%fadd_iscan = OpGroupFAddNonUniformAMD %float %scope InclusiveScan " + "%float_const", + "%fadd_escan = OpGroupFAddNonUniformAMD %float %scope ExclusiveScan " + "%float_const", + + "%fmin_reduce = OpGroupFMinNonUniformAMD %float %scope Reduce " + "%float_const", + "%fmin_iscan = OpGroupFMinNonUniformAMD %float %scope InclusiveScan " + "%float_const", + "%fmin_escan = OpGroupFMinNonUniformAMD %float %scope ExclusiveScan " + "%float_const", + + "%umin_reduce = OpGroupUMinNonUniformAMD %uint %scope Reduce %uint_const", + "%umin_iscan = OpGroupUMinNonUniformAMD %uint %scope InclusiveScan " + "%uint_const", + "%umin_escan = OpGroupUMinNonUniformAMD %uint %scope ExclusiveScan " + "%uint_const", + + "%smin_reduce = OpGroupUMinNonUniformAMD %int %scope Reduce %int_const", + "%smin_iscan = OpGroupUMinNonUniformAMD %int %scope InclusiveScan " + "%int_const", + "%smin_escan = OpGroupUMinNonUniformAMD %int %scope ExclusiveScan " + "%int_const", + + "%fmax_reduce = OpGroupFMaxNonUniformAMD %float %scope Reduce " + "%float_const", + "%fmax_iscan = OpGroupFMaxNonUniformAMD %float %scope InclusiveScan " + "%float_const", + "%fmax_escan = OpGroupFMaxNonUniformAMD %float %scope ExclusiveScan " + "%float_const", + + "%umax_reduce = OpGroupUMaxNonUniformAMD %uint %scope Reduce %uint_const", + "%umax_iscan = OpGroupUMaxNonUniformAMD %uint %scope InclusiveScan " + "%uint_const", + "%umax_escan = OpGroupUMaxNonUniformAMD %uint %scope ExclusiveScan " + "%uint_const", + + "%smax_reduce = OpGroupUMaxNonUniformAMD %int %scope Reduce %int_const", + "%smax_iscan = OpGroupUMaxNonUniformAMD %int %scope InclusiveScan " + "%int_const", + "%smax_escan = OpGroupUMaxNonUniformAMD %int %scope ExclusiveScan " + "%int_const"}; } TEST_P(ValidateAMDShaderBallotCapabilities, ExpectSuccess) { @@ -188,7 +208,8 @@ ValuesIn(AMDShaderBallotGroupInstructions())); TEST_P(ValidateAMDShaderBallotCapabilities, ExpectFailure) { - // Fail because the module does not specify the SPV_AMD_shader_ballot extension. + // Fail because the module does not specify the SPV_AMD_shader_ballot + // extension. auto parts = ShaderPartsForAMDShaderBallot(); const string assembly = @@ -209,4 +230,90 @@ INSTANTIATE_TEST_CASE_P(ExpectFailure, ValidateAMDShaderBallotCapabilities, ValuesIn(AMDShaderBallotGroupInstructions())); +struct ExtIntoCoreCase { + const char* ext; + const char* cap; + const char* builtin; + spv_target_env env; + bool success; +}; + +using ValidateExtIntoCore = spvtest::ValidateBase; + +// Make sure that we don't panic about missing extensions for using +// functionalities that introduced in extensions but became core SPIR-V later. + +TEST_P(ValidateExtIntoCore, DoNotAskForExtensionInLaterVersion) { + const string code = string(R"( + OpCapability Shader + OpCapability )") + + GetParam().cap + R"( + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" %builtin + OpDecorate %builtin BuiltIn )" + GetParam().builtin + R"( + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int + %builtin = OpVariable %_ptr_Input_int Input + %main = OpFunction %void None %3 + %5 = OpLabel + %18 = OpLoad %int %builtin + OpReturn + OpFunctionEnd)"; + + CompileSuccessfully(code.c_str(), GetParam().env); + if (GetParam().success) { + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(GetParam().env)); + } else { + ASSERT_NE(SPV_SUCCESS, ValidateInstructions(GetParam().env)); + const string message = getDiagnosticString(); + if (spvIsVulkanEnv(GetParam().env)) { + EXPECT_THAT(message, HasSubstr(string(GetParam().cap) + + " is not allowed by Vulkan")); + EXPECT_THAT(message, HasSubstr(string("or requires extension"))); + } else { + EXPECT_THAT(message, + HasSubstr(string("requires one of these extensions: ") + + GetParam().ext)); + } + } +} + +// clang-format off +INSTANTIATE_TEST_CASE_P( + KHR_extensions, ValidateExtIntoCore, + ValuesIn(std::vector{ + // SPV_KHR_shader_draw_parameters became core SPIR-V 1.3 + {"SPV_KHR_shader_draw_parameters", "DrawParameters", "BaseVertex", SPV_ENV_UNIVERSAL_1_3, true}, + {"SPV_KHR_shader_draw_parameters", "DrawParameters", "BaseVertex", SPV_ENV_UNIVERSAL_1_2, false}, + {"SPV_KHR_shader_draw_parameters", "DrawParameters", "BaseVertex", SPV_ENV_UNIVERSAL_1_1, false}, + {"SPV_KHR_shader_draw_parameters", "DrawParameters", "BaseVertex", SPV_ENV_UNIVERSAL_1_0, false}, + {"SPV_KHR_shader_draw_parameters", "DrawParameters", "BaseVertex", SPV_ENV_VULKAN_1_1, true}, + {"SPV_KHR_shader_draw_parameters", "DrawParameters", "BaseVertex", SPV_ENV_VULKAN_1_0, false}, + + {"SPV_KHR_shader_draw_parameters", "DrawParameters", "BaseInstance", SPV_ENV_UNIVERSAL_1_3, true}, + {"SPV_KHR_shader_draw_parameters", "DrawParameters", "BaseInstance", SPV_ENV_VULKAN_1_0, false}, + + {"SPV_KHR_shader_draw_parameters", "DrawParameters", "DrawIndex", SPV_ENV_UNIVERSAL_1_3, true}, + {"SPV_KHR_shader_draw_parameters", "DrawParameters", "DrawIndex", SPV_ENV_UNIVERSAL_1_1, false}, + + // SPV_KHR_multiview became core SPIR-V 1.3 + {"SPV_KHR_multiview", "MultiView", "ViewIndex", SPV_ENV_UNIVERSAL_1_3, true}, + {"SPV_KHR_multiview", "MultiView", "ViewIndex", SPV_ENV_UNIVERSAL_1_2, false}, + {"SPV_KHR_multiview", "MultiView", "ViewIndex", SPV_ENV_UNIVERSAL_1_1, false}, + {"SPV_KHR_multiview", "MultiView", "ViewIndex", SPV_ENV_UNIVERSAL_1_0, false}, + {"SPV_KHR_multiview", "MultiView", "ViewIndex", SPV_ENV_VULKAN_1_1, true}, + {"SPV_KHR_multiview", "MultiView", "ViewIndex", SPV_ENV_VULKAN_1_0, false}, + + // SPV_KHR_device_group became core SPIR-V 1.3 + {"SPV_KHR_device_group", "DeviceGroup", "DeviceIndex", SPV_ENV_UNIVERSAL_1_3, true}, + {"SPV_KHR_device_group", "DeviceGroup", "DeviceIndex", SPV_ENV_UNIVERSAL_1_2, false}, + {"SPV_KHR_device_group", "DeviceGroup", "DeviceIndex", SPV_ENV_UNIVERSAL_1_1, false}, + {"SPV_KHR_device_group", "DeviceGroup", "DeviceIndex", SPV_ENV_UNIVERSAL_1_0, false}, + {"SPV_KHR_device_group", "DeviceGroup", "DeviceIndex", SPV_ENV_VULKAN_1_1, true}, + {"SPV_KHR_device_group", "DeviceGroup", "DeviceIndex", SPV_ENV_VULKAN_1_0, false}, + })); +// clang-format on + } // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_fixtures.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_fixtures.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_fixtures.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_fixtures.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ -// Copyright (c) 2015-2016 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. -// 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. - -// Common validation fixtures for unit tests - -#include "val_fixtures.h" - -#include -#include -#include - -#include "test_fixture.h" - -namespace spvtest { - -template -ValidateBase::ValidateBase() : binary_(), diagnostic_() { - // Initialize to default command line options. Different tests can then - // specialize specific options as necessary. - options_ = spvValidatorOptionsCreate(); -} - -template -spv_const_binary ValidateBase::get_const_binary() { - return spv_const_binary(binary_); -} - -template -void ValidateBase::TearDown() { - if (diagnostic_) { - spvDiagnosticPrint(diagnostic_); - } - spvDiagnosticDestroy(diagnostic_); - spvBinaryDestroy(binary_); - spvValidatorOptionsDestroy(options_); -} - -template -void ValidateBase::CompileSuccessfully(std::string code, - spv_target_env env) { - spv_diagnostic diagnostic = nullptr; - ASSERT_EQ(SPV_SUCCESS, - spvTextToBinary(ScopedContext(env).context, code.c_str(), - code.size(), &binary_, &diagnostic)) - << "ERROR: " << diagnostic->error - << "\nSPIR-V could not be compiled into binary:\n" - << code; -} - -template -void ValidateBase::OverwriteAssembledBinary(uint32_t index, uint32_t word) { - ASSERT_TRUE(index < binary_->wordCount) - << "OverwriteAssembledBinary: The given index is larger than the binary " - "word count."; - binary_->code[index] = word; -} - -template -spv_result_t ValidateBase::ValidateInstructions(spv_target_env env) { - return spvValidateWithOptions(ScopedContext(env).context, options_, - get_const_binary(), &diagnostic_); -} - -template -spv_result_t ValidateBase::ValidateAndRetrieveValidationState( - spv_target_env env) { - return spvtools::ValidateBinaryAndKeepValidationState( - ScopedContext(env).context, options_, get_const_binary()->code, - get_const_binary()->wordCount, &diagnostic_, &vstate_); -} - -template -std::string ValidateBase::getDiagnosticString() { - return diagnostic_ == nullptr ? std::string() - : std::string(diagnostic_->error); -} - -template -spv_validator_options ValidateBase::getValidatorOptions() { - return options_; -} - -template -spv_position_t ValidateBase::getErrorPosition() { - return diagnostic_ == nullptr ? spv_position_t() : diagnostic_->position; -} - -template class spvtest::ValidateBase; -template class spvtest::ValidateBase; -template class spvtest::ValidateBase; -template class spvtest::ValidateBase>; -template class spvtest::ValidateBase< - std::tuple>>>; -template class spvtest::ValidateBase< - std::tuple, - std::function>>>; -template class spvtest::ValidateBase; -template class spvtest::ValidateBase>; -} // namespace spvtest diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_fixtures.h vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_fixtures.h --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_fixtures.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_fixtures.h 2018-04-27 11:46:32.000000000 +0000 @@ -18,6 +18,7 @@ #define LIBSPIRV_TEST_VALIDATE_FIXTURES_H_ #include "source/val/validation_state.h" +#include "test_fixture.h" #include "unit_spirv.h" namespace spvtest { @@ -60,5 +61,78 @@ spv_validator_options options_; std::unique_ptr vstate_; }; + +template +ValidateBase::ValidateBase() : binary_(), diagnostic_() { + // Initialize to default command line options. Different tests can then + // specialize specific options as necessary. + options_ = spvValidatorOptionsCreate(); +} + +template +spv_const_binary ValidateBase::get_const_binary() { + return spv_const_binary(binary_); +} + +template +void ValidateBase::TearDown() { + if (diagnostic_) { + spvDiagnosticPrint(diagnostic_); + } + spvDiagnosticDestroy(diagnostic_); + spvBinaryDestroy(binary_); + spvValidatorOptionsDestroy(options_); +} + +template +void ValidateBase::CompileSuccessfully(std::string code, + spv_target_env env) { + spv_diagnostic diagnostic = nullptr; + ASSERT_EQ(SPV_SUCCESS, + spvTextToBinary(ScopedContext(env).context, code.c_str(), + code.size(), &binary_, &diagnostic)) + << "ERROR: " << diagnostic->error + << "\nSPIR-V could not be compiled into binary:\n" + << code; +} + +template +void ValidateBase::OverwriteAssembledBinary(uint32_t index, uint32_t word) { + ASSERT_TRUE(index < binary_->wordCount) + << "OverwriteAssembledBinary: The given index is larger than the binary " + "word count."; + binary_->code[index] = word; +} + +template +spv_result_t ValidateBase::ValidateInstructions(spv_target_env env) { + return spvValidateWithOptions(ScopedContext(env).context, options_, + get_const_binary(), &diagnostic_); +} + +template +spv_result_t ValidateBase::ValidateAndRetrieveValidationState( + spv_target_env env) { + return spvtools::ValidateBinaryAndKeepValidationState( + ScopedContext(env).context, options_, get_const_binary()->code, + get_const_binary()->wordCount, &diagnostic_, &vstate_); +} + +template +std::string ValidateBase::getDiagnosticString() { + return diagnostic_ == nullptr ? std::string() + : std::string(diagnostic_->error); +} + +template +spv_validator_options ValidateBase::getValidatorOptions() { + return options_; +} + +template +spv_position_t ValidateBase::getErrorPosition() { + return diagnostic_ == nullptr ? spv_position_t() : diagnostic_->position; +} + } // namespace spvtest #endif diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_id_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_id_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_id_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_id_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -2827,7 +2827,8 @@ const std::string instr = GetParam(); const std::string elem = AccessChainRequiresElemId(instr) ? "%int_0 " : ""; string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( -%entry = )" + instr + +%entry = )" + + instr + R"( %_ptr_Private_float %_ptr_Private_float )" + elem + R"(%int_0 %int_1 OpReturn @@ -2847,7 +2848,8 @@ const std::string instr = GetParam(); const std::string elem = AccessChainRequiresElemId(instr) ? "%int_0 " : ""; string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( -%entry = )" + instr + +%entry = )" + + instr + R"( %_ptr_Function_float %my_matrix )" + elem + R"(%int_0 %int_1 OpReturn @@ -2868,7 +2870,8 @@ const std::string instr = GetParam(); const std::string elem = AccessChainRequiresElemId(instr) ? "%int_0 " : ""; string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( -%entry = )" + instr + +%entry = )" + + instr + R"( %_ptr_Private_float %my_float_var )" + elem + R"(%int_0 OpReturn OpFunctionEnd @@ -2887,7 +2890,8 @@ const std::string instr = GetParam(); const std::string elem = AccessChainRequiresElemId(instr) ? "%int_0 " : ""; string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( -%entry = )" + instr + +%entry = )" + + instr + R"( %_ptr_Private_float %my_float_var )" + elem + R"( OpReturn OpFunctionEnd @@ -2902,7 +2906,8 @@ const std::string instr = GetParam(); const std::string elem = AccessChainRequiresElemId(instr) ? "%int_0 " : ""; string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( -%entry = )" + instr + +%entry = )" + + instr + R"( %_ptr_Private_mat4x3 %my_float_var )" + elem + R"( OpReturn OpFunctionEnd @@ -3051,9 +3056,10 @@ TEST_P(AccessChainInstructionTest, AccessChainUndefinedIndexBad) { const std::string instr = GetParam(); const std::string elem = AccessChainRequiresElemId(instr) ? "%int_0 " : ""; - string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( + string spirv = + kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( %entry = )" + instr + - R"( %_ptr_Private_float %my_matrix )" + elem + R"(%float %int_1 + R"( %_ptr_Private_float %my_matrix )" + elem + R"(%float %int_1 OpReturn OpFunctionEnd )"; @@ -3070,8 +3076,8 @@ const std::string instr = GetParam(); const std::string elem = AccessChainRequiresElemId(instr) ? "%int_0 " : ""; string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( -%f = )" + instr + R"( %_ptr_Uniform_float %blockName_var )" + - elem + +%f = )" + + instr + R"( %_ptr_Uniform_float %blockName_var )" + elem + R"(%int_0 %spec_int %int_2 OpReturn OpFunctionEnd @@ -3090,7 +3096,8 @@ const std::string instr = GetParam(); const std::string elem = AccessChainRequiresElemId(instr) ? "%int_0 " : ""; string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( -%entry = )" + instr + +%entry = )" + + instr + R"( %_ptr_Uniform_float %blockName_var )" + elem + R"(%int_0 %int_1 %int_2 OpReturn @@ -3110,7 +3117,8 @@ const std::string instr = GetParam(); const std::string elem = AccessChainRequiresElemId(instr) ? "%int_0 " : ""; string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( -%entry = )" + instr + +%entry = )" + + instr + R"( %_ptr_Uniform_float %blockName_var )" + elem + R"(%int_0 %int_2 %int_2 OpReturn @@ -3129,7 +3137,8 @@ const std::string instr = GetParam(); const std::string elem = AccessChainRequiresElemId(instr) ? "%int_0 " : ""; string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( -%entry = )" + instr + +%entry = )" + + instr + R"( %_ptr_Uniform_float %blockName_var )" + elem + R"(%int_3 %int_2 %int_2 OpReturn @@ -3216,7 +3225,8 @@ const std::string instr = GetParam(); const std::string elem = AccessChainRequiresElemId(instr) ? "%int_0 " : ""; string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( -%entry = )" + instr + +%entry = )" + + instr + R"( %_ptr_Private_float %my_matrix )" + elem + R"(%int_0 %int_1 %int_0 OpReturn @@ -3236,7 +3246,8 @@ const std::string instr = GetParam(); const std::string elem = AccessChainRequiresElemId(instr) ? "%int_0 " : ""; string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( -%entry = )" + instr + +%entry = )" + + instr + R"( %_ptr_Private_mat4x3 %my_matrix )" + elem + R"(%int_0 %int_1 OpReturn @@ -3914,11 +3925,196 @@ // TODO: OpDPdxCoarse // TODO: OpDPdyCoarse // TODO: OpFwidthCoarse -// TODO: OpPhi // TODO: OpLoopMerge // TODO: OpSelectionMerge // TODO: OpBranch +TEST_F(ValidateIdWithMessage, OpPhiNotAType) { + string spirv = kOpenCLMemoryModel32 + R"( +%2 = OpTypeBool +%3 = OpConstantTrue %2 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpFunction %4 None %5 +%7 = OpLabel +OpBranch %8 +%8 = OpLabel +%9 = OpPhi %3 %3 %7 +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpPhi's type 3 is not a type instruction.")); +} + +TEST_F(ValidateIdWithMessage, OpPhiSamePredecessor) { + string spirv = kOpenCLMemoryModel32 + R"( +%2 = OpTypeBool +%3 = OpConstantTrue %2 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpFunction %4 None %5 +%7 = OpLabel +OpBranchConditional %3 %8 %8 +%8 = OpLabel +%9 = OpPhi %2 %3 %7 +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateIdWithMessage, OpPhiOddArgumentNumber) { + string spirv = kOpenCLMemoryModel32 + R"( +%2 = OpTypeBool +%3 = OpConstantTrue %2 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpFunction %4 None %5 +%7 = OpLabel +OpBranch %8 +%8 = OpLabel +%9 = OpPhi %2 %3 +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpPhi does not have an equal number of incoming " + "values and basic blocks.")); +} + +TEST_F(ValidateIdWithMessage, OpPhiTooFewPredecessors) { + string spirv = kOpenCLMemoryModel32 + R"( +%2 = OpTypeBool +%3 = OpConstantTrue %2 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpFunction %4 None %5 +%7 = OpLabel +OpBranch %8 +%8 = OpLabel +%9 = OpPhi %2 +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpPhi's number of incoming blocks (0) does not match " + "block's predecessor count (1).")); +} + +TEST_F(ValidateIdWithMessage, OpPhiTooManyPredecessors) { + string spirv = kOpenCLMemoryModel32 + R"( +%2 = OpTypeBool +%3 = OpConstantTrue %2 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpFunction %4 None %5 +%7 = OpLabel +OpBranch %8 +%9 = OpLabel +OpReturn +%8 = OpLabel +%10 = OpPhi %2 %3 %7 %3 %9 +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpPhi's number of incoming blocks (2) does not match " + "block's predecessor count (1).")); +} + +TEST_F(ValidateIdWithMessage, OpPhiMismatchedTypes) { + string spirv = kOpenCLMemoryModel32 + R"( +%2 = OpTypeBool +%3 = OpConstantTrue %2 +%4 = OpTypeVoid +%5 = OpTypeInt 32 0 +%6 = OpConstant %5 0 +%7 = OpTypeFunction %4 +%8 = OpFunction %4 None %7 +%9 = OpLabel +OpBranchConditional %3 %10 %11 +%11 = OpLabel +OpBranch %10 +%10 = OpLabel +%12 = OpPhi %2 %3 %9 %6 %11 +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpPhi's result type 2 does not match incoming " + "value 6 type 5.")); +} + +TEST_F(ValidateIdWithMessage, OpPhiPredecessorNotABlock) { + string spirv = kOpenCLMemoryModel32 + R"( +%2 = OpTypeBool +%3 = OpConstantTrue %2 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpFunction %4 None %5 +%7 = OpLabel +OpBranchConditional %3 %8 %9 +%9 = OpLabel +OpBranch %11 +%11 = OpLabel +OpBranch %8 +%8 = OpLabel +%10 = OpPhi %2 %3 %7 %3 %3 +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("OpPhi's incoming basic block 3 is not an OpLabel.")); +} + +TEST_F(ValidateIdWithMessage, OpPhiNotAPredecessor) { + string spirv = kOpenCLMemoryModel32 + R"( +%2 = OpTypeBool +%3 = OpConstantTrue %2 +%4 = OpTypeVoid +%5 = OpTypeFunction %4 +%6 = OpFunction %4 None %5 +%7 = OpLabel +OpBranchConditional %3 %8 %9 +%9 = OpLabel +OpBranch %11 +%11 = OpLabel +OpBranch %8 +%8 = OpLabel +%10 = OpPhi %2 %3 %7 %3 %9 +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpPhi's incoming basic block 9 is not a " + "predecessor of 8.")); +} + TEST_F(ValidateIdWithMessage, OpBranchConditionalGood) { string spirv = BranchConditionalSetup + R"( %branch_cond = OpINotEqual %bool %i0 %i1 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_instructions_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_instructions_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_instructions_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_instructions_test.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -// Copyright (c) 2017 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. - -// Validation tests for illegal instructions - -#include -#include -#include - -#include "gmock/gmock.h" -#include "val_fixtures.h" - -using ::testing::HasSubstr; - -using ImageSampleTestParameter = std::pair; - -const std::string& Opcode(const ImageSampleTestParameter& p) { return p.first; } -const std::string& Operands(const ImageSampleTestParameter& p) { - return p.second; -} - -using ValidateIns = spvtest::ValidateBase; - -namespace { - -TEST_P(ValidateIns, Reserved) { - const auto& param = GetParam(); - - std::string str = R"( - OpCapability Shader - OpCapability SparseResidency - OpMemoryModel Logical GLSL450 - OpEntryPoint Fragment %main "main" %img -%void = OpTypeVoid -%int = OpTypeInt 32 0 -%float = OpTypeFloat 32 -%fnt = OpTypeFunction %void -%coord = OpConstantNull %float -%lod = OpConstantNull %float -%dref = OpConstantNull %float -%imgt = OpTypeImage %float 2D 0 0 0 0 Rgba32f -%sampledt = OpTypeSampledImage %imgt -%sampledp = OpTypePointer Uniform %sampledt -%img = OpVariable %sampledp Input -%main = OpFunction %void None %fnt -%label = OpLabel -%sample = Op)" + Opcode(param) + - " " + Operands(param) + R"( - OpReturn - OpFunctionEnd -)"; - - CompileSuccessfully(str); - EXPECT_EQ(SPV_ERROR_INVALID_VALUE, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - HasSubstr(Opcode(param) + " is reserved for future use.")); -} - -#define CASE(NAME, ARGS) \ - { "ImageSparseSampleProj" #NAME, ARGS } - -INSTANTIATE_TEST_CASE_P( - OpImageSparseSampleProj, ValidateIns, - ::testing::ValuesIn(std::vector{ - CASE(ImplicitLod, "%float %img %coord"), - CASE(ExplicitLod, "%float %img %coord Lod %lod"), - CASE(DrefImplicitLod, "%float %img %coord %dref"), - CASE(DrefExplicitLod, "%float %img %coord %dref Lod %lod"), - }), ); -#undef CASE -} // namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_ssa_test.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_ssa_test.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/test/val/val_ssa_test.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/test/val/val_ssa_test.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -611,8 +611,7 @@ kKernelDefinition + R"( %main = OpFunction %voidt None %vfunct %mainl = OpLabel - )" + - kKernelSetup + R"( + )" + kKernelSetup + R"( %err = OpEnqueueKernel %uintt %dqueue %flags %ndval %nevent %event %revent %kfunc %firstp %psize %palign %lsize @@ -634,8 +633,7 @@ %palign %lsize OpReturn OpFunctionEnd - )" + - kKernelDefinition; + )" + kKernelDefinition; CompileSuccessfully(str); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } @@ -645,8 +643,7 @@ kKernelTypesAndConstants + R"( %main = OpFunction %voidt None %vfunct %mainl = OpLabel - )" + - kKernelSetup + R"( + )" + kKernelSetup + R"( %err = OpEnqueueKernel %uintt %dqueue %flags %ndval %nevent %event %revent %kfunc %firstp %psize %palign %lsize @@ -1318,6 +1315,35 @@ EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()) << getDiagnosticString(); } +TEST_F(ValidateSSA, PhiVariableUnreachableDefNotInParentBlock) { + string str = kHeader + "OpName %unreachable \"unreachable\"\n" + kBasicTypes + + R"( +%func = OpFunction %voidt None %vfunct +%entry = OpLabel + OpBranch %if_false + +%unreachable = OpLabel +%copy = OpCopyObject %boolt %false + OpBranch %if_tnext +%if_tnext = OpLabel + OpBranch %exit + +%if_false = OpLabel +%false_copy = OpCopyObject %boolt %false + OpBranch %if_fnext +%if_fnext = OpLabel + OpBranch %exit + +%exit = OpLabel +%value = OpPhi %boolt %copy %if_tnext %false_copy %if_fnext + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(str); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + TEST_F(ValidateSSA, DominanceCheckIgnoresUsesInUnreachableBlocksDefIsParamGood) { string str = kHeader + kBasicTypes + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/tools/as/as.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/tools/as/as.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/tools/as/as.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/tools/as/as.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -41,13 +41,14 @@ Numeric IDs in the binary will have the same values as in the source. Non-numeric IDs are allocated by filling in the gaps, starting with 1 and going up. - --target-env {vulkan1.0|spv1.0|spv1.1|spv1.2} - Use Vulkan1.0/SPIR-V1.0/SPIR-V1.1/SPIR-V1.2 + --target-env {vulkan1.0|vulkan1.1|spv1.0|spv1.1|spv1.2|spv1.3} + Use Vulkan 1.0, Vulkan 1.1, SPIR-V 1.0, SPIR-V 1.1, + SPIR-V 1.2, or SPIR-V 1.3 )", argv0, argv0); } -static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_2; +static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_3; int main(int argc, char** argv) { const char* inFile = nullptr; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/tools/dis/dis.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/tools/dis/dis.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/tools/dis/dis.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/tools/dis/dis.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -60,7 +60,7 @@ argv0, argv0); } -static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_2; +static const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_3; int main(int argc, char** argv) { const char* inFile = nullptr; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/tools/link/linker.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/tools/link/linker.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/tools/link/linker.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/tools/link/linker.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -33,12 +33,14 @@ NOTE: The linker is a work in progress. Options: - -h, --help Print this help. - -o Name of the resulting linked SPIR-V binary. - --create-library Link the binaries into a library, keeping all exported symbols. - --version Display linker version information - --target-env {vulkan1.0|spv1.0|spv1.1|spv1.2|opencl2.1|opencl2.2} - Use Vulkan1.0/SPIR-V1.0/SPIR-V1.1/SPIR-V1.2/OpenCL-2.1/OpenCL2.2 validation rules. + -h, --help Print this help. + -o Name of the resulting linked SPIR-V binary. + --create-library Link the binaries into a library, keeping all exported symbols. + --allow-partial-linkage Allow partial linkage by accepting imported symbols to be unresolved. + --verify-ids Verify that IDs in the resulting modules are truly unique. + --version Display linker version information + --target-env {vulkan1.0|spv1.0|spv1.1|spv1.2|opencl2.1|opencl2.2} + Use Vulkan1.0/SPIR-V1.0/SPIR-V1.1/SPIR-V1.2/OpenCL-2.1/OpenCL2.2 validation rules. )", argv0, argv0); } @@ -70,6 +72,10 @@ } } else if (0 == strcmp(cur_arg, "--create-library")) { options.SetCreateLibrary(true); + } else if (0 == strcmp(cur_arg, "--verify-ids")) { + options.SetVerifyIds(true); + } else if (0 == strcmp(cur_arg, "--allow-partial-linkage")) { + options.SetAllowPartialLinkage(true); } else if (0 == strcmp(cur_arg, "--version")) { printf("%s\n", spvSoftwareVersionDetailsString()); // TODO(dneto): Add OpenCL 2.2 at least. diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/tools/opt/opt.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/tools/opt/opt.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/tools/opt/opt.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/tools/opt/opt.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -48,20 +48,22 @@ return ss.str(); } +const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_3; + std::string GetLegalizationPasses() { - spvtools::Optimizer optimizer(SPV_ENV_UNIVERSAL_1_2); + spvtools::Optimizer optimizer(kDefaultEnvironment); optimizer.RegisterLegalizationPasses(); return GetListOfPassesAsString(optimizer); } std::string GetOptimizationPasses() { - spvtools::Optimizer optimizer(SPV_ENV_UNIVERSAL_1_2); + spvtools::Optimizer optimizer(kDefaultEnvironment); optimizer.RegisterPerformancePasses(); return GetListOfPassesAsString(optimizer); } std::string GetSizePasses() { - spvtools::Optimizer optimizer(SPV_ENV_UNIVERSAL_1_2); + spvtools::Optimizer optimizer(kDefaultEnvironment); optimizer.RegisterSizePasses(); return GetListOfPassesAsString(optimizer); } @@ -100,6 +102,10 @@ on function scope variables referenced only with load, store, and constant index access chains in entry point call tree functions. + --copy-propagate-arrays + Does propagation of memory references when an array is a copy of + another. It will only propagate an array if the source is never + written to, and the only store to the target is the copy. --eliminate-common-uniform Perform load/load elimination for duplicate uniform values. Converts any constant index access chain uniform loads into @@ -169,18 +175,34 @@ --local-redundancy-elimination Looks for instructions in the same basic block that compute the same value, and deletes the redundant ones. + --loop-unroll + Fully unrolls loops marked with the Unroll flag + --loop-unroll-partial + Partially unrolls loops marked with the Unroll flag. Takes an + additional non-0 integer argument to set the unroll factor, or + how many times a loop body should be duplicated --merge-blocks Join two blocks into a single block if the second has the first as its only predecessor. Performed only on entry point call tree functions. --merge-return - Replace all return instructions with unconditional branches to - a new basic block containing an unified return. - This pass does not currently support structured control flow. It - makes no changes if the shader capability is detected. - --local-redundancy-elimination - Looks for instructions in the same basic block that compute the - same value, and deletes the redundant ones. + Changes functions that have multiple return statements so they + have a single return statement. + + For structured control flow it is assumed that the only + unreachable blocks in the function are trivial merge and continue + blocks. + + A trivial merge block contains the label and an OpUnreachable + instructions, nothing else. A trivial continue block contain a + label and an OpBranch to the header, nothing else. + + These conditions are guaranteed to be met after running + dead-branch elimination. + --loop-unswitch + Hoists loop-invariant conditionals out of loops by duplicating + the loop on each branch of the conditional and adjusting each + copy of the loop. -O Optimize for performance. Apply a sequence of transformations in an attempt to improve the performance of the generated @@ -244,6 +266,9 @@ Replaces instructions whose opcode is valid for shader modules, but not for the current shader stage. To have an effect, all entry points must have the same execution model. + --ssa-rewrite + Replace loads and stores to function local variables with + operations on SSA IDs. --scalar-replacement Replace aggregate function scope variables that are only accessed via their elements with new function variables representing each @@ -255,6 +280,9 @@ blank spaces, and in each pair, spec id and default value must be separated with colon ':' without any blank spaces in between. e.g.: --set-spec-const-default-value "1:100 2:400" + --simplify-instructions + Will simplify all instructions in the function as much as + possible. --skip-validation Will not validate the SPIR-V before optimizing. If the SPIR-V is invalid, the optimizer may fail or generate incorrect code. @@ -263,6 +291,16 @@ Replaces instructions with equivalent and less expensive ones. --strip-debug Remove all debug instructions. + --strip-reflect + Remove all reflection information. For now, this covers + reflection information defined by SPV_GOOGLE_hlsl_functionality1. + --time-report + Print the resource utilization of each pass (e.g., CPU time, + RSS) to standard error output. Currently it supports only Unix + systems. This option is the same as -ftime-report in GCC. It + prints CPU/WALL/USR/SYS time (and RSS if possible), but note that + USR/SYS time are returned by getrusage() and can have a small + error. --workaround-1209 Rewrites instructions for which there are known driver bugs to avoid triggering those bugs. @@ -352,6 +390,21 @@ in_file, out_file, nullptr, &skip_validator); } +OptStatus ParseLoopUnrollPartialArg(int argc, const char** argv, int argi, + Optimizer* optimizer) { + if (argi < argc) { + int factor = atoi(argv[argi]); + if (factor != 0) { + optimizer->RegisterPass(CreateLoopUnrollPass(false, factor)); + return {OPT_CONTINUE, 0}; + } + } + fprintf(stderr, + "error: --loop-unroll-partial must be followed by a non-0 " + "integer\n"); + return {OPT_STOP, 1}; +} + // Parses command-line flags. |argc| contains the number of command-line flags. // |argv| points to an array of strings holding the flags. |optimizer| is the // Optimizer instance used to optimize the program. @@ -381,6 +434,8 @@ } } else if (0 == strcmp(cur_arg, "--strip-debug")) { optimizer->RegisterPass(CreateStripDebugInfoPass()); + } else if (0 == strcmp(cur_arg, "--strip-reflect")) { + optimizer->RegisterPass(CreateStripReflectInfoPass()); } else if (0 == strcmp(cur_arg, "--set-spec-const-default-value")) { if (++argi < argc) { auto spec_ids_vals = @@ -439,6 +494,8 @@ optimizer->RegisterPass(CreateDeadVariableEliminationPass()); } else if (0 == strcmp(cur_arg, "--fold-spec-const-op-composite")) { optimizer->RegisterPass(CreateFoldSpecConstantOpAndCompositePass()); + } else if (0 == strcmp(cur_arg, "--loop-unswitch")) { + optimizer->RegisterPass(CreateLoopUnswitchPass()); } else if (0 == strcmp(cur_arg, "--scalar-replacement")) { optimizer->RegisterPass(CreateScalarReplacementPass()); } else if (0 == strcmp(cur_arg, "--strength-reduction")) { @@ -453,6 +510,8 @@ optimizer->RegisterPass(CreateCFGCleanupPass()); } else if (0 == strcmp(cur_arg, "--local-redundancy-elimination")) { optimizer->RegisterPass(CreateLocalRedundancyEliminationPass()); + } else if (0 == strcmp(cur_arg, "--loop-invariant-code-motion")) { + optimizer->RegisterPass(CreateLoopInvariantCodeMotionPass()); } else if (0 == strcmp(cur_arg, "--redundancy-elimination")) { optimizer->RegisterPass(CreateRedundancyEliminationPass()); } else if (0 == strcmp(cur_arg, "--private-to-local")) { @@ -465,6 +524,20 @@ options->relax_struct_store = true; } else if (0 == strcmp(cur_arg, "--replace-invalid-opcode")) { optimizer->RegisterPass(CreateReplaceInvalidOpcodePass()); + } else if (0 == strcmp(cur_arg, "--simplify-instructions")) { + optimizer->RegisterPass(CreateSimplificationPass()); + } else if (0 == strcmp(cur_arg, "--ssa-rewrite")) { + optimizer->RegisterPass(CreateSSARewritePass()); + } else if (0 == strcmp(cur_arg, "--copy-propagate-arrays")) { + optimizer->RegisterPass(CreateCopyPropagateArraysPass()); + } else if (0 == strcmp(cur_arg, "--loop-unroll")) { + optimizer->RegisterPass(CreateLoopUnrollPass(true)); + } else if (0 == strcmp(cur_arg, "--loop-unroll-partial")) { + OptStatus status = + ParseLoopUnrollPartialArg(argc, argv, ++argi, optimizer); + if (status.action != OPT_CONTINUE) { + return status; + } } else if (0 == strcmp(cur_arg, "--skip-validation")) { *skip_validator = true; } else if (0 == strcmp(cur_arg, "-O")) { @@ -484,6 +557,8 @@ optimizer->RegisterPass(CreateCCPPass()); } else if (0 == strcmp(cur_arg, "--print-all")) { optimizer->SetPrintAll(&std::cerr); + } else if (0 == strcmp(cur_arg, "--time-report")) { + optimizer->SetTimeReport(&std::cerr); } else if ('\0' == cur_arg[1]) { // Setting a filename of "-" to indicate stdin. if (!*in_file) { @@ -519,7 +594,7 @@ const char* out_file = nullptr; bool skip_validator = false; - spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2; + spv_target_env target_env = kDefaultEnvironment; spv_validator_options options = spvValidatorOptionsCreate(); spvtools::Optimizer optimizer(target_env); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/tools/stats/stats_analyzer.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/tools/stats/stats_analyzer.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/tools/stats/stats_analyzer.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/tools/stats/stats_analyzer.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -23,13 +23,13 @@ #include #include +#include "latest_version_spirv_header.h" #include "source/comp/markv_model.h" #include "source/enum_string_mapping.h" #include "source/opcode.h" #include "source/operand.h" #include "source/spirv_constant.h" #include "source/util/huffman_codec.h" -#include "spirv/1.2/spirv.h" using libspirv::SpirvStats; using spvutils::HuffmanCodec; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/tools/val/val.cpp vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/tools/val/val.cpp --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/tools/val/val.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/tools/val/val.cpp 2018-04-27 11:46:32.000000000 +0000 @@ -58,7 +58,7 @@ int main(int argc, char** argv) { const char* inFile = nullptr; - spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2; + spv_target_env target_env = SPV_ENV_UNIVERSAL_1_3; spvtools::ValidatorOptions options; bool continue_processing = true; int return_code = 0; @@ -71,7 +71,7 @@ spv_validator_limit limit_type; if (spvParseUniversalLimitsOptions(cur_arg, &limit_type)) { uint32_t limit = 0; - if (sscanf(argv[++argi], "%d", &limit)) { + if (sscanf(argv[++argi], "%u", &limit)) { options.SetUniversalLimit(limit_type, limit); } else { fprintf(stderr, "error: missing argument to %s\n", cur_arg); @@ -90,11 +90,14 @@ } } else if (0 == strcmp(cur_arg, "--version")) { printf("%s\n", spvSoftwareVersionDetailsString()); - // TODO(dneto): Add OpenCL 2.2 at least. - printf("Targets:\n %s\n %s\n %s\n", + printf("Targets:\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n", + spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_0), spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_1), + spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_2), + spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_3), + spvTargetEnvDescription(SPV_ENV_OPENCL_2_2), spvTargetEnvDescription(SPV_ENV_VULKAN_1_0), - spvTargetEnvDescription(SPV_ENV_UNIVERSAL_1_2)); + spvTargetEnvDescription(SPV_ENV_VULKAN_1_1)); continue_processing = false; return_code = 0; } else if (0 == strcmp(cur_arg, "--help") || 0 == strcmp(cur_arg, "-h")) { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/.travis.yml vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/.travis.yml --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/.travis.yml 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/.travis.yml 2018-04-27 11:46:32.000000000 +0000 @@ -24,8 +24,6 @@ - gcc matrix: - allow_failures: - - os: osx fast_finish: true include: # Additional build using Android NDK with android-cmake diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/utils/generate_grammar_tables.py vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/utils/generate_grammar_tables.py --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/utils/generate_grammar_tables.py 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/utils/generate_grammar_tables.py 2018-04-27 11:46:32.000000000 +0000 @@ -25,34 +25,13 @@ PYGEN_VARIABLE_PREFIX = 'pygen_variable' # Extensions to recognize, but which don't necessarily come from the SPIR-V -# core grammar. Get this list from the SPIR-V registery web page. -EXTENSIONS_FROM_SPIRV_REGISTRY = """ -SPV_AMD_shader_explicit_vertex_parameter -SPV_AMD_shader_trinary_minmax +# core or KHR grammar files. Get this list from the SPIR-V registery web page. +# NOTE: Only put things on this list if it is not in those grammar files. +EXTENSIONS_FROM_SPIRV_REGISTRY_AND_NOT_FROM_GRAMMARS = """ SPV_AMD_gcn_shader -SPV_KHR_shader_ballot -SPV_AMD_shader_ballot SPV_AMD_gpu_shader_half_float -SPV_KHR_shader_draw_parameters -SPV_KHR_subgroup_vote -SPV_KHR_16bit_storage -SPV_KHR_device_group -SPV_KHR_multiview -SPV_NVX_multiview_per_view_attributes -SPV_NV_viewport_array2 -SPV_NV_stereo_view_rendering -SPV_NV_sample_mask_override_coverage -SPV_NV_geometry_shader_passthrough -SPV_AMD_texture_gather_bias_lod -SPV_KHR_storage_buffer_storage_class -SPV_KHR_variable_pointers SPV_AMD_gpu_shader_int16 -SPV_KHR_post_depth_coverage -SPV_KHR_shader_atomic_counter_ops -SPV_EXT_shader_stencil_export -SPV_EXT_shader_viewport_index_layer -SPV_AMD_shader_image_load_store_lod -SPV_AMD_shader_fragment_mask +SPV_AMD_shader_trinary_minmax """ @@ -73,6 +52,16 @@ raise +def convert_min_required_version(version): + """Converts the minimal required SPIR-V version encoded in the + grammar to the symbol in SPIRV-Tools""" + if version is None: + return 'SPV_SPIRV_VERSION_WORD(1, 0)' + if version == 'None': + return '0xffffffffu' + return 'SPV_SPIRV_VERSION_WORD({})'.format(version.replace('.', ',')) + + def compose_capability_list(caps): """Returns a string containing a braced list of capabilities as enums. @@ -85,7 +74,7 @@ return "{" + ", ".join(['SpvCapability{}'.format(c) for c in caps]) + "}" -def get_capability_array_name(caps, version): +def get_capability_array_name(caps): """Returns the name of the array containing all the given capabilities. Args: @@ -93,12 +82,10 @@ """ if not caps: return 'nullptr' - else: - return '{}_caps_{}_{}'.format( - PYGEN_VARIABLE_PREFIX, ''.join(caps), version) + return '{}_caps_{}'.format(PYGEN_VARIABLE_PREFIX, ''.join(caps)) -def generate_capability_arrays(caps, version): +def generate_capability_arrays(caps): """Returns the arrays of capabilities. Arguments: @@ -107,7 +94,7 @@ caps = sorted(set([tuple(c) for c in caps if c])) arrays = [ 'static const SpvCapability {}[] = {};'.format( - get_capability_array_name(c, version), compose_capability_list(c)) + get_capability_array_name(c), compose_capability_list(c)) for c in caps] return '\n'.join(arrays) @@ -125,7 +112,7 @@ ['libspirv::Extension::k{}'.format(e) for e in exts]) + "}" -def get_extension_array_name(extensions, version): +def get_extension_array_name(extensions): """Returns the name of the array containing all the given extensions. Args: @@ -134,11 +121,11 @@ if not extensions: return 'nullptr' else: - return '{}_exts_{}_{}'.format( - PYGEN_VARIABLE_PREFIX, ''.join(extensions), version) + return '{}_exts_{}'.format( + PYGEN_VARIABLE_PREFIX, ''.join(extensions)) -def generate_extension_arrays(extensions, version): +def generate_extension_arrays(extensions): """Returns the arrays of extensions. Arguments: @@ -147,7 +134,7 @@ extensions = sorted(set([tuple(e) for e in extensions if e])) arrays = [ 'static const libspirv::Extension {}[] = {};'.format( - get_extension_array_name(e, version), compose_extension_list(e)) + get_extension_array_name(e), compose_extension_list(e)) for e in extensions] return '\n'.join(arrays) @@ -219,19 +206,23 @@ """Instances holds a SPIR-V instruction suitable for printing as the initializer for spv_opcode_desc_t.""" - def __init__(self, opname, caps, operands, version): + def __init__(self, opname, caps, exts, operands, version): """Initialization. Arguments: - opname: opcode name (with the 'Op' prefix) - caps: a sequence of capability names required by this opcode + - exts: a sequence of names of extensions enabling this enumerant - operands: a sequence of (operand-kind, operand-quantifier) tuples - - version: version of the instruction set + - version: minimal SPIR-V version required for this opcode """ + assert opname.startswith('Op') self.opname = opname[2:] # Remove the "Op" prefix. self.num_caps = len(caps) - self.caps_mask = get_capability_array_name(caps, version) + self.caps_mask = get_capability_array_name(caps) + self.num_exts = len(exts) + self.exts = get_extension_array_name(exts) self.operands = [convert_operand_kind(o) for o in operands] self.fix_syntax() @@ -240,6 +231,8 @@ self.ref_type_id = 'IdResultType' in operands self.def_result_id = 'IdResult' in operands + self.version = convert_min_required_version(version) + def fix_syntax(self): """Fix an instruction's syntax, adjusting for differences between the officially released grammar and how SPIRV-Tools uses the grammar. @@ -256,7 +249,9 @@ template = ['{{"{opname}"', 'SpvOp{opname}', '{num_caps}', '{caps_mask}', '{num_operands}', '{{{operands}}}', - '{def_result_id}', '{ref_type_id}}}'] + '{def_result_id}', '{ref_type_id}', + '{num_exts}', '{exts}', + '{min_version}}}'] return ', '.join(template).format( opname=self.opname, num_caps=self.num_caps, @@ -264,14 +259,17 @@ num_operands=len(self.operands), operands=', '.join(self.operands), def_result_id=(1 if self.def_result_id else 0), - ref_type_id=(1 if self.ref_type_id else 0)) + ref_type_id=(1 if self.ref_type_id else 0), + num_exts=self.num_exts, + exts=self.exts, + min_version=self.version) class ExtInstInitializer(object): """Instances holds a SPIR-V extended instruction suitable for printing as the initializer for spv_ext_inst_desc_t.""" - def __init__(self, opname, opcode, caps, operands, version): + def __init__(self, opname, opcode, caps, operands): """Initialization. Arguments: @@ -279,12 +277,11 @@ - opcode: enumerant value for this opcode - caps: a sequence of capability names required by this opcode - operands: a sequence of (operand-kind, operand-quantifier) tuples - - version: version of the extended instruction set """ self.opname = opname self.opcode = opcode self.num_caps = len(caps) - self.caps_mask = get_capability_array_name(caps, version) + self.caps_mask = get_capability_array_name(caps) self.operands = [convert_operand_kind(o) for o in operands] self.operands.append('SPV_OPERAND_TYPE_NONE') @@ -299,7 +296,7 @@ operands=', '.join(self.operands)) -def generate_instruction(inst, version, is_ext_inst): +def generate_instruction(inst, is_ext_inst): """Returns the C initializer for the given SPIR-V instruction. Arguments: @@ -314,40 +311,45 @@ opname = inst.get('opname') opcode = inst.get('opcode') caps = inst.get('capabilities', []) + exts = inst.get('extensions', []) operands = inst.get('operands', {}) operands = [(o['kind'], o.get('quantifier', '')) for o in operands] + min_version = inst.get('version', None) assert opname is not None if is_ext_inst: - return str(ExtInstInitializer(opname, opcode, caps, operands, version)) + return str(ExtInstInitializer(opname, opcode, caps, operands)) else: - return str(InstInitializer(opname, caps, operands, version)) + return str(InstInitializer(opname, caps, exts, operands, min_version)) -def generate_instruction_table(inst_table, version): +def generate_instruction_table(inst_table): """Returns the info table containing all SPIR-V instructions, sorted by opcode, and prefixed by capability arrays. - + Note: - the built-in sorted() function is guaranteed to be stable. https://docs.python.org/3/library/functions.html#sorted Arguments: - inst_table: a list containing all SPIR-V instructions. - - vesion: SPIR-V version. """ - inst_table = sorted(inst_table, key=lambda k: k['opcode']) + inst_table = sorted(inst_table, key=lambda k: (k['opcode'], k['opname'])) + caps_arrays = generate_capability_arrays( - [inst.get('capabilities', []) for inst in inst_table], version) - insts = [generate_instruction(inst, version, False) for inst in inst_table] - insts = ['static const spv_opcode_desc_t kOpcodeTableEntries_{}[] = {{\n' - ' {}\n}};'.format(version, ',\n '.join(insts))] + [inst.get('capabilities', []) for inst in inst_table]) + exts_arrays = generate_extension_arrays( + [inst.get('extensions', []) for inst in inst_table]) - return '{}\n\n{}'.format(caps_arrays, '\n'.join(insts)) + insts = [generate_instruction(inst, False) for inst in inst_table] + insts = ['static const spv_opcode_desc_t kOpcodeTableEntries[] = {{\n' + ' {}\n}};'.format(',\n '.join(insts))] + + return '{}\n\n{}\n\n{}'.format(caps_arrays, exts_arrays, '\n'.join(insts)) -def generate_extended_instruction_table(inst_table, set_name, version): +def generate_extended_instruction_table(inst_table, set_name): """Returns the info table containing all SPIR-V extended instructions, sorted by opcode, and prefixed by capability arrays. @@ -357,8 +359,8 @@ """ inst_table = sorted(inst_table, key=lambda k: k['opcode']) caps = [inst.get('capabilities', []) for inst in inst_table] - caps_arrays = generate_capability_arrays(caps, version) - insts = [generate_instruction(inst, version, True) for inst in inst_table] + caps_arrays = generate_capability_arrays(caps) + insts = [generate_instruction(inst, True) for inst in inst_table] insts = ['static const spv_ext_inst_desc_t {}_entries[] = {{\n' ' {}\n}};'.format(set_name, ',\n '.join(insts))] @@ -377,18 +379,21 @@ - caps: a sequence of capability names required by this enumerant - exts: a sequence of names of extensions enabling this enumerant - parameters: a sequence of (operand-kind, operand-quantifier) tuples + - version: minimal SPIR-V version required for this opcode """ self.enumerant = enumerant self.value = value self.num_caps = len(caps) - self.caps = get_capability_array_name(caps, version) + self.caps = get_capability_array_name(caps) self.num_exts = len(exts) - self.exts = get_extension_array_name(exts, version) + self.exts = get_extension_array_name(exts) self.parameters = [convert_operand_kind(p) for p in parameters] + self.version = convert_min_required_version(version) def __str__(self): template = ['{{"{enumerant}"', '{value}', '{num_caps}', - '{caps}', '{num_exts}', '{exts}', '{{{parameters}}}}}'] + '{caps}', '{num_exts}', '{exts}', + '{{{parameters}}}', '{min_version}}}'] return ', '.join(template).format( enumerant=self.enumerant, value=self.value, @@ -396,10 +401,11 @@ caps=self.caps, num_exts=self.num_exts, exts=self.exts, - parameters=', '.join(self.parameters)) + parameters=', '.join(self.parameters), + min_version=self.version) -def generate_enum_operand_kind_entry(entry, version): +def generate_enum_operand_kind_entry(entry): """Returns the C initializer for the given operand enum entry. Arguments: @@ -415,6 +421,7 @@ params = entry.get('parameters', []) params = [p.get('kind') for p in params] params = zip(params, [''] * len(params)) + version = entry.get('version', None) assert enumerant is not None assert value is not None @@ -423,14 +430,23 @@ enumerant, value, caps, exts, params, version)) -def generate_enum_operand_kind(enum, version): +def generate_enum_operand_kind(enum): """Returns the C definition for the given operand kind.""" kind = enum.get('kind') assert kind is not None - name = '{}_{}Entries_{}'.format(PYGEN_VARIABLE_PREFIX, kind, version) - entries = [' {}'.format(generate_enum_operand_kind_entry(e, version)) - for e in enum.get('enumerants', [])] + # Sort all enumerants first according to their values and then + # their names so that the symbols with the same values are + # grouped together. + if enum.get('category') == 'ValueEnum': + functor = lambda k: (k['value'], k['enumerant']) + else: + functor = lambda k: (int(k['value'], 16), k['enumerant']) + entries = sorted(enum.get('enumerants', []), key=functor) + + name = '{}_{}Entries'.format(PYGEN_VARIABLE_PREFIX, kind) + entries = [' {}'.format(generate_enum_operand_kind_entry(e)) + for e in entries] template = ['static const spv_operand_desc_t {name}[] = {{', '{entries}', '}};'] @@ -441,7 +457,7 @@ return kind, name, entries -def generate_operand_kind_table(enums, version): +def generate_operand_kind_table(enums): """Returns the info table containing all SPIR-V operand kinds.""" # We only need to output info tables for those operand kinds that are enums. enums = [e for e in enums if e.get('category') in ['ValueEnum', 'BitEnum']] @@ -449,14 +465,14 @@ caps = [entry.get('capabilities', []) for enum in enums for entry in enum.get('enumerants', [])] - caps_arrays = generate_capability_arrays(caps, version) + caps_arrays = generate_capability_arrays(caps) exts = [entry.get('extensions', []) for enum in enums for entry in enum.get('enumerants', [])] - exts_arrays = generate_extension_arrays(exts, version) + exts_arrays = generate_extension_arrays(exts) - enums = [generate_enum_operand_kind(e, version) for e in enums] + enums = [generate_enum_operand_kind(e) for e in enums] # We have three operand kinds that requires their optional counterpart to # exist in the operand info table. three_optional_enums = ['ImageOperands', 'AccessQualifier', 'MemoryAccess'] @@ -475,23 +491,33 @@ for e in table_entries] template = [ - 'static const spv_operand_desc_group_t {p}_OperandInfoTable_{v}[] = {{', + 'static const spv_operand_desc_group_t {p}_OperandInfoTable[] = {{', '{enums}', '}};'] table = '\n'.join(template).format( - p=PYGEN_VARIABLE_PREFIX, v=version, enums=',\n'.join(table_entries)) + p=PYGEN_VARIABLE_PREFIX, enums=',\n'.join(table_entries)) return '\n\n'.join((caps_arrays,) + (exts_arrays,) + enum_entries + (table,)) -def get_extension_list(operands): +def get_extension_list(instructions, operand_kinds): """Returns extensions as an alphabetically sorted list of strings.""" - enumerants = sum([item.get('enumerants', []) for item in operands - if item.get('category') in ['ValueEnum']], []) - extensions = sum([item.get('extensions', []) for item in enumerants + things_with_an_extensions_field = [item for item in instructions] + + enumerants = sum([item.get('enumerants', []) for item in operand_kinds], []) + + things_with_an_extensions_field.extend(enumerants) + + extensions = sum([item.get('extensions', []) + for item in things_with_an_extensions_field if item.get('extensions')], []) - extensions.extend(EXTENSIONS_FROM_SPIRV_REGISTRY.split()) + for item in EXTENSIONS_FROM_SPIRV_REGISTRY_AND_NOT_FROM_GRAMMARS.split(): + # If it's already listed in a grammar, then don't put it in the + # special exceptions list. + assert item not in extensions, "Extension %s is already in a grammar file" % item + + extensions.extend(EXTENSIONS_FROM_SPIRV_REGISTRY_AND_NOT_FROM_GRAMMARS.split()) # Validator would ignore type declaration unique check. Should only be used # for legacy autogenerated test files containing multiple instances of the @@ -502,56 +528,23 @@ return sorted(set(extensions)) -def get_capabilities(operands): +def get_capabilities(operand_kinds): """Returns capabilities as a list of JSON objects, in order of appearance. """ - enumerants = sum([item.get('enumerants', []) for item in operands + enumerants = sum([item.get('enumerants', []) for item in operand_kinds if item.get('kind') in ['Capability']], []) return enumerants -def generate_extension_enum(operands): +def generate_extension_enum(extensions): """Returns enumeration containing extensions declared in the grammar.""" - extensions = get_extension_list(operands) return ',\n'.join(['k' + extension for extension in extensions]) -def generate_extension_to_string_table(operands): - """Returns extension to string mapping table.""" - extensions = get_extension_list(operands) - entry_template = ' {{Extension::k{extension},\n "{extension}"}}' - table_entries = [entry_template.format(extension=extension) - for extension in extensions] - table_template = '{{\n{enums}\n}}' - return table_template.format(enums=',\n'.join(table_entries)) - - -def generate_string_to_extension_table(operands): - """Returns string to extension mapping table.""" - extensions = get_extension_list(operands) - entry_template = ' {{"{extension}",\n Extension::k{extension}}}' - table_entries = [entry_template.format(extension=extension) - for extension in extensions] - table_template = '{{\n{enums}\n}}' - return table_template.format(enums=',\n'.join(table_entries)) - - -def generate_capability_to_string_table(operands): - """Returns capability to string mapping table.""" - capabilities = [item.get('enumerant') - for item in get_capabilities(operands)] - entry_template = ' {{SpvCapability{capability},\n "{capability}"}}' - table_entries = [entry_template.format(capability=capability) - for capability in capabilities] - table_template = '{{\n{enums}\n}}' - return table_template.format(enums=',\n'.join(table_entries)) - - -def generate_extension_to_string_mapping(operands): +def generate_extension_to_string_mapping(extensions): """Returns mapping function from extensions to corresponding strings.""" - extensions = get_extension_list(operands) - function = 'std::string ExtensionToString(Extension extension) {\n' + function = 'const char* ExtensionToString(Extension extension) {\n' function += ' switch (extension) {\n' template = ' case Extension::k{extension}:\n' \ ' return "{extension}";\n' @@ -561,29 +554,40 @@ return function -def generate_string_to_extension_mapping(operands): +def generate_string_to_extension_mapping(extensions): """Returns mapping function from strings to corresponding extensions.""" - function = 'bool GetExtensionFromString(' \ - 'const std::string& str, Extension* extension) {\n ' \ - 'static const std::unordered_map mapping =\n' - function += generate_string_to_extension_table(operands) - function += ';\n\n' - function += ' const auto it = mapping.find(str);\n\n' \ - ' if (it == mapping.end()) return false;\n\n' \ - ' *extension = it->second;\n return true;\n}' + + function = ''' + bool GetExtensionFromString(const char* str, Extension* extension) {{ + static const char* known_ext_strs[] = {{ {strs} }}; + static const Extension known_ext_ids[] = {{ {ids} }}; + const auto b = std::begin(known_ext_strs); + const auto e = std::end(known_ext_strs); + const auto found = std::equal_range( + b, e, str, [](const char* str1, const char* str2) {{ + return std::strcmp(str1, str2) < 0; + }}); + if (found.first == e || found.first == found.second) return false; + + *extension = known_ext_ids[found.first - b]; + return true; + }} + '''.format(strs=', '.join(['"{}"'.format(e) for e in extensions]), + ids=', '.join(['Extension::k{}'.format(e) for e in extensions])) + return function -def generate_capability_to_string_mapping(operands): +def generate_capability_to_string_mapping(operand_kinds): """Returns mapping function from capabilities to corresponding strings. We take care to avoid emitting duplicate values. """ - function = 'std::string CapabilityToString(SpvCapability capability) {\n' + function = 'const char* CapabilityToString(SpvCapability capability) {\n' function += ' switch (capability) {\n' template = ' case SpvCapability{capability}:\n' \ ' return "{capability}";\n' emitted = set() # The values of capabilities we already have emitted - for capability in get_capabilities(operands): + for capability in get_capabilities(operand_kinds): value = capability.get('value') if value not in emitted: emitted.add(value) @@ -595,12 +599,12 @@ return function -def generate_all_string_enum_mappings(operands): +def generate_all_string_enum_mappings(extensions, operand_kinds): """Returns all string-to-enum / enum-to-string mapping tables.""" tables = [] - tables.append(generate_extension_to_string_mapping(operands)) - tables.append(generate_string_to_extension_mapping(operands)) - tables.append(generate_capability_to_string_mapping(operands)) + tables.append(generate_extension_to_string_mapping(extensions)) + tables.append(generate_string_to_extension_mapping(extensions)) + tables.append(generate_capability_to_string_mapping(operand_kinds)) return '\n\n'.join(tables) @@ -687,28 +691,30 @@ if args.spirv_core_grammar is not None: with open(args.spirv_core_grammar) as json_file: - grammar = json.loads(json_file.read()) + core_grammar = json.loads(json_file.read()) with open(args.extinst_debuginfo_grammar) as debuginfo_json_file: debuginfo_grammar = json.loads(debuginfo_json_file.read()) - operand_kinds = grammar['operand_kinds'] + instructions = [] + instructions.extend(core_grammar['instructions']) + instructions.extend(debuginfo_grammar['instructions']) + operand_kinds = [] + operand_kinds.extend(core_grammar['operand_kinds']) operand_kinds.extend(debuginfo_grammar['operand_kinds']) + extensions = get_extension_list(instructions, operand_kinds) if args.core_insts_output is not None: make_path_to_file(args.core_insts_output) make_path_to_file(args.operand_kinds_output) - version = '{}_{}'.format(grammar['major_version'], - grammar['minor_version']) - print(generate_instruction_table( - grammar['instructions'], version), + print(generate_instruction_table(core_grammar['instructions']), file=open(args.core_insts_output, 'w')) - print(generate_operand_kind_table(operand_kinds, version), + print(generate_operand_kind_table(operand_kinds), file=open(args.operand_kinds_output, 'w')) if args.extension_enum_output is not None: make_path_to_file(args.extension_enum_output) - print(generate_extension_enum(grammar['operand_kinds']), + print(generate_extension_enum(extensions), file=open(args.extension_enum_output, 'w')) if args.enum_string_mapping_output is not None: make_path_to_file(args.enum_string_mapping_output) - print(generate_all_string_enum_mappings(operand_kinds), + print(generate_all_string_enum_mappings(extensions, operand_kinds), file=open(args.enum_string_mapping_output, 'w')) if args.extinst_glsl_grammar is not None: @@ -716,7 +722,7 @@ grammar = json.loads(json_file.read()) make_path_to_file(args.glsl_insts_output) print(generate_extended_instruction_table( - grammar['instructions'], "glsl", "1_0"), + grammar['instructions'], "glsl"), file=open(args.glsl_insts_output, 'w')) if args.extinst_opencl_grammar is not None: @@ -724,7 +730,7 @@ grammar = json.loads(json_file.read()) make_path_to_file(args.opencl_insts_output) print(generate_extended_instruction_table( - grammar['instructions'], "opencl", "1_0"), + grammar['instructions'], "opencl"), file=open(args.opencl_insts_output, 'w')) if args.extinst_vendor_grammar is not None: @@ -735,7 +741,7 @@ start = name.find("extinst.") + len("extinst.") name = name[start:-len(".grammar.json")].replace("-", "_") print(generate_extended_instruction_table( - grammar['instructions'], name, "1_0"), + grammar['instructions'], name), file=open(args.vendor_insts_output, 'w')) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/utils/generate_vim_syntax.py vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/utils/generate_vim_syntax.py --- vulkan-1.1.70+dfsg1/external/glslang/External/spirv-tools/utils/generate_vim_syntax.py 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/External/spirv-tools/utils/generate_vim_syntax.py 2018-04-27 11:46:32.000000000 +0000 @@ -150,6 +150,10 @@ type=str, required=False, default=None, help='input JSON grammar file for OpenGL extended ' 'instruction set') + parser.add_argument('--extinst-debuginfo-grammar', metavar='', + type=str, required=False, default=None, + help='input JSON grammar file for DebugInfo extended ' + 'instruction set') args = parser.parse_args() # Generate the syntax rules. @@ -179,6 +183,17 @@ for inst in opencl["instructions"]: EmitAsEnumerant(inst['opname']) + if args.extinst_debuginfo_grammar is not None: + print('\n" DebugInfo extended instructions') + debuginfo = json.loads(open(args.extinst_debuginfo_grammar).read()) + for inst in debuginfo["instructions"]: + EmitAsEnumerant(inst['opname']) + print('\n" DebugInfo operand enums') + for operand_kind in debuginfo["operand_kinds"]: + if 'enumerants' in operand_kind: + for e in operand_kind['enumerants']: + EmitAsEnumerant(e['enumerant']) + print('\n" OpSpecConstantOp opcodes') for word in SPEC_CONSTANT_OP_OPCODES.split(' '): stripped = word.strip('\n,') diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/glslang/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/glslang/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/CMakeLists.txt 2018-04-27 11:46:26.000000000 +0000 @@ -80,10 +80,15 @@ # WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) # set(BISON_GLSLParser_OUTPUT_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/MachineIndependent/glslang_tab.cpp) -add_library(glslang STATIC ${BISON_GLSLParser_OUTPUT_SOURCE} ${SOURCES} ${HEADERS}) +add_library(glslang ${LIB_TYPE} ${BISON_GLSLParser_OUTPUT_SOURCE} ${SOURCES} ${HEADERS}) set_property(TARGET glslang PROPERTY FOLDER glslang) set_property(TARGET glslang PROPERTY POSITION_INDEPENDENT_CODE ON) target_link_libraries(glslang OGLCompiler OSDependent) + +if(WIN32 AND BUILD_SHARED_LIBS) + set_target_properties(glslang PROPERTIES PREFIX "") +endif() + if(ENABLE_HLSL) target_link_libraries(glslang HLSL) endif() diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/arrays.h vulkan-1.1.73+dfsg/external/glslang/glslang/Include/arrays.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/arrays.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/Include/arrays.h 2018-04-27 11:46:26.000000000 +0000 @@ -41,6 +41,8 @@ #ifndef _ARRAYS_INCLUDED #define _ARRAYS_INCLUDED +#include + namespace glslang { // This is used to mean there is no size yet (unsized), it is waiting to get a size from somewhere else. @@ -130,10 +132,10 @@ sizes->push_back(pair); } - void push_front(const TSmallArrayVector& newDims) + void push_back(const TSmallArrayVector& newDims) { alloc(); - sizes->insert(sizes->begin(), newDims.sizes->begin(), newDims.sizes->end()); + sizes->insert(sizes->end(), newDims.sizes->begin(), newDims.sizes->end()); } void pop_front() @@ -220,12 +222,13 @@ struct TArraySizes { POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) - TArraySizes() : implicitArraySize(1) { } + TArraySizes() : implicitArraySize(1), variablyIndexed(false) { } // For breaking into two non-shared copies, independently modifiable. TArraySizes& operator=(const TArraySizes& from) { implicitArraySize = from.implicitArraySize; + variablyIndexed = from.variablyIndexed; sizes = from.sizes; return *this; @@ -252,10 +255,11 @@ void addInnerSize(int s) { addInnerSize((unsigned)s, nullptr); } void addInnerSize(int s, TIntermTyped* n) { sizes.push_back((unsigned)s, n); } void addInnerSize(TArraySize pair) { sizes.push_back(pair.size, pair.node); } + void addInnerSizes(const TArraySizes& s) { sizes.push_back(s.sizes); } void changeOuterSize(int s) { sizes.changeFront((unsigned)s); } - int getImplicitSize() const { return (int)implicitArraySize; } - void setImplicitSize(int s) { implicitArraySize = s; } - bool isInnerImplicit() const + int getImplicitSize() const { return implicitArraySize; } + void updateImplicitSize(int s) { implicitArraySize = std::max(implicitArraySize, s); } + bool isInnerUnsized() const { for (int d = 1; d < sizes.size(); ++d) { if (sizes.getDimSize(d) == (unsigned)UnsizedArraySize) @@ -264,7 +268,7 @@ return false; } - bool clearInnerImplicit() + bool clearInnerUnsized() { for (int d = 1; d < sizes.size(); ++d) { if (sizes.getDimSize(d) == (unsigned)UnsizedArraySize) @@ -287,8 +291,8 @@ return sizes.getDimNode(0) != nullptr; } - bool isImplicit() const { return getOuterSize() == UnsizedArraySize || isInnerImplicit(); } - void addOuterSizes(const TArraySizes& s) { sizes.push_front(s.sizes); } + bool hasUnsized() const { return getOuterSize() == UnsizedArraySize || isInnerUnsized(); } + bool isSized() const { return getOuterSize() != UnsizedArraySize; } void dereference() { sizes.pop_front(); } void copyDereferenced(const TArraySizes& rhs) { @@ -311,6 +315,9 @@ return true; } + void setVariablyIndexed() { variablyIndexed = true; } + bool isVariablyIndexed() const { return variablyIndexed; } + bool operator==(const TArraySizes& rhs) { return sizes == rhs.sizes; } bool operator!=(const TArraySizes& rhs) { return sizes != rhs.sizes; } @@ -319,9 +326,12 @@ TArraySizes(const TArraySizes&); - // for tracking maximum referenced index, before an explicit size is given - // applies only to the outer-most dimension + // For tracking maximum referenced compile-time constant index. + // Applies only to the outer-most dimension. Potentially becomes + // the implicit size of the array, if not variably indexed and + // otherwise legal. int implicitArraySize; + bool variablyIndexed; // true if array is indexed with a non compile-time constant }; } // end namespace glslang diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/BaseTypes.h vulkan-1.1.73+dfsg/external/glslang/glslang/Include/BaseTypes.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/BaseTypes.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/Include/BaseTypes.h 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2013 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -46,17 +47,15 @@ EbtVoid, EbtFloat, EbtDouble, -#ifdef AMD_EXTENSIONS EbtFloat16, -#endif + EbtInt8, + EbtUint8, + EbtInt16, + EbtUint16, EbtInt, EbtUint, EbtInt64, EbtUint64, -#ifdef AMD_EXTENSIONS - EbtInt16, - EbtUint16, -#endif EbtBool, EbtAtomicUint, EbtSampler, @@ -141,6 +140,8 @@ EbvLocalInvocationId, EbvGlobalInvocationId, EbvLocalInvocationIndex, + EbvNumSubgroups, + EbvSubgroupID, EbvSubGroupSize, EbvSubGroupInvocation, EbvSubGroupEqMask, @@ -148,6 +149,13 @@ EbvSubGroupGtMask, EbvSubGroupLeMask, EbvSubGroupLtMask, + EbvSubgroupSize2, + EbvSubgroupInvocation2, + EbvSubgroupEqMask2, + EbvSubgroupGeMask2, + EbvSubgroupGtMask2, + EbvSubgroupLeMask2, + EbvSubgroupLtMask2, EbvVertexId, EbvInstanceId, EbvVertexIndex, @@ -373,7 +381,7 @@ __inline const char* GetPrecisionQualifierString(TPrecisionQualifier p) { - switch(p) { + switch (p) { case EpqNone: return ""; break; case EpqLow: return "lowp"; break; case EpqMedium: return "mediump"; break; @@ -382,6 +390,75 @@ } } +__inline bool isTypeSignedInt(TBasicType type) +{ + switch (type) { + case EbtInt8: + case EbtInt16: + case EbtInt: + case EbtInt64: + return true; + default: + return false; + } +} + +__inline bool isTypeUnsignedInt(TBasicType type) +{ + switch (type) { + case EbtUint8: + case EbtUint16: + case EbtUint: + case EbtUint64: + return true; + default: + return false; + } +} + +__inline bool isTypeInt(TBasicType type) +{ + return isTypeSignedInt(type) || isTypeUnsignedInt(type); +} + +__inline bool isTypeFloat(TBasicType type) +{ + switch (type) { + case EbtFloat: + case EbtDouble: + case EbtFloat16: + return true; + default: + return false; + } +} + +__inline int getTypeRank(TBasicType type) { + int res = -1; + switch(type) { + case EbtInt8: + case EbtUint8: + res = 0; + break; + case EbtInt16: + case EbtUint16: + res = 1; + break; + case EbtInt: + case EbtUint: + res = 2; + break; + case EbtInt64: + case EbtUint64: + res = 3; + break; + default: + assert(false); + break; + } + return res; +} + } // end namespace glslang #endif // _BASICTYPES_INCLUDED_ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/Common.h vulkan-1.1.73+dfsg/external/glslang/glslang/Include/Common.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/Common.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/Include/Common.h 2018-04-27 11:46:26.000000000 +0000 @@ -37,9 +37,24 @@ #ifndef _COMMON_INCLUDED_ #define _COMMON_INCLUDED_ + +#if defined(__ANDROID__) || _MSC_VER < 1700 +#include +namespace std { +template +std::string to_string(const T& val) { + std::ostringstream os; + os << val; + return os.str(); +} +} +#endif + #if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/) || defined MINGW_HAS_SECURE_API #include + #ifndef snprintf #define snprintf sprintf_s + #endif #define safe_vsprintf(buf,max,format,args) vsnprintf_s((buf), (max), (max), (format), (args)) #elif defined (solaris) #define safe_vsprintf(buf,max,format,args) vsnprintf((buf), (max), (format), (args)) @@ -51,31 +66,20 @@ #define UINT_PTR uintptr_t #endif -#if defined(__ANDROID__) || _MSC_VER < 1700 -#include -namespace std { -template -std::string to_string(const T& val) { - std::ostringstream os; - os << val; - return os.str(); -} -} -#endif - #if defined(_MSC_VER) && _MSC_VER < 1800 -inline long long int strtoll (const char* str, char** endptr, int base) -{ - return _strtoi64(str, endptr, base); -} -inline unsigned long long int strtoull (const char* str, char** endptr, int base) -{ - return _strtoui64(str, endptr, base); -} -inline long long int atoll (const char* str) -{ - return strtoll(str, NULL, 10); -} + #include + inline long long int strtoll (const char* str, char** endptr, int base) + { + return _strtoi64(str, endptr, base); + } + inline unsigned long long int strtoull (const char* str, char** endptr, int base) + { + return _strtoui64(str, endptr, base); + } + inline long long int atoll (const char* str) + { + return strtoll(str, NULL, 10); + } #endif #if defined(_MSC_VER) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/ConstantUnion.h vulkan-1.1.73+dfsg/external/glslang/glslang/Include/ConstantUnion.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/ConstantUnion.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/Include/ConstantUnion.h 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2013 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -48,6 +49,30 @@ TConstUnion() : iConst(0), type(EbtInt) { } + void setI8Const(signed char i) + { + i8Const = i; + type = EbtInt8; + } + + void setU8Const(unsigned char u) + { + u8Const = u; + type = EbtUint8; + } + + void setI16Const(signed short i) + { + i16Const = i; + type = EbtInt16; + } + + void setU16Const(unsigned short u) + { + u16Const = u; + type = EbtUint16; + } + void setIConst(int i) { iConst = i; @@ -90,6 +115,10 @@ type = EbtString; } + signed char getI8Const() const { return i8Const; } + unsigned char getU8Const() const { return u8Const; } + signed short getI16Const() const { return i16Const; } + unsigned short getU16Const() const { return u16Const; } int getIConst() const { return iConst; } unsigned int getUConst() const { return uConst; } long long getI64Const() const { return i64Const; } @@ -98,6 +127,38 @@ bool getBConst() const { return bConst; } const TString* getSConst() const { return sConst; } + bool operator==(const signed char i) const + { + if (i == i8Const) + return true; + + return false; + } + + bool operator==(const unsigned char u) const + { + if (u == u8Const) + return true; + + return false; + } + + bool operator==(const signed short i) const + { + if (i == i16Const) + return true; + + return false; + } + + bool operator==(const unsigned short u) const + { + if (u == u16Const) + return true; + + return false; + } + bool operator==(const int i) const { if (i == iConst) @@ -152,6 +213,26 @@ return false; switch (type) { + case EbtInt16: + if (constant.i16Const == i16Const) + return true; + + break; + case EbtUint16: + if (constant.u16Const == u16Const) + return true; + + break; + case EbtInt8: + if (constant.i8Const == i8Const) + return true; + + break; + case EbtUint8: + if (constant.u8Const == u8Const) + return true; + + break; case EbtInt: if (constant.iConst == iConst) return true; @@ -189,6 +270,26 @@ return false; } + bool operator!=(const signed char i) const + { + return !operator==(i); + } + + bool operator!=(const unsigned char u) const + { + return !operator==(u); + } + + bool operator!=(const signed short i) const + { + return !operator==(i); + } + + bool operator!=(const unsigned short u) const + { + return !operator==(u); + } + bool operator!=(const int i) const { return !operator==(i); @@ -228,6 +329,26 @@ { assert(type == constant.type); switch (type) { + case EbtInt8: + if (i8Const > constant.i8Const) + return true; + + return false; + case EbtUint8: + if (u8Const > constant.u8Const) + return true; + + return false; + case EbtInt16: + if (i16Const > constant.i16Const) + return true; + + return false; + case EbtUint16: + if (u16Const > constant.u16Const) + return true; + + return false; case EbtInt: if (iConst > constant.iConst) return true; @@ -263,6 +384,26 @@ { assert(type == constant.type); switch (type) { + case EbtInt8: + if (i8Const < constant.i8Const) + return true; + + return false; + case EbtUint8: + if (u8Const < constant.u8Const) + return true; + + return false; + case EbtInt16: + if (i16Const < constant.i16Const) + return true; + + return false; + case EbtUint16: + if (u16Const < constant.u16Const) + return true; + + return false; case EbtInt: if (iConst < constant.iConst) return true; @@ -299,9 +440,13 @@ TConstUnion returnValue; assert(type == constant.type); switch (type) { - case EbtInt: returnValue.setIConst(iConst + constant.iConst); break; - case EbtInt64: returnValue.setI64Const(i64Const + constant.i64Const); break; - case EbtUint: returnValue.setUConst(uConst + constant.uConst); break; + case EbtInt8: returnValue.setI8Const(i8Const + constant.i8Const); break; + case EbtInt16: returnValue.setI16Const(i16Const + constant.i16Const); break; + case EbtInt: returnValue.setIConst(iConst + constant.iConst); break; + case EbtInt64: returnValue.setI64Const(i64Const + constant.i64Const); break; + case EbtUint8: returnValue.setU8Const(u8Const + constant.u8Const); break; + case EbtUint16: returnValue.setU16Const(u16Const + constant.u16Const); break; + case EbtUint: returnValue.setUConst(uConst + constant.uConst); break; case EbtUint64: returnValue.setU64Const(u64Const + constant.u64Const); break; case EbtDouble: returnValue.setDConst(dConst + constant.dConst); break; default: assert(false && "Default missing"); @@ -315,9 +460,13 @@ TConstUnion returnValue; assert(type == constant.type); switch (type) { - case EbtInt: returnValue.setIConst(iConst - constant.iConst); break; - case EbtInt64: returnValue.setI64Const(i64Const - constant.i64Const); break; - case EbtUint: returnValue.setUConst(uConst - constant.uConst); break; + case EbtInt8: returnValue.setI8Const(i8Const - constant.i8Const); break; + case EbtInt16: returnValue.setI16Const(i16Const - constant.i16Const); break; + case EbtInt: returnValue.setIConst(iConst - constant.iConst); break; + case EbtInt64: returnValue.setI64Const(i64Const - constant.i64Const); break; + case EbtUint8: returnValue.setU8Const(u8Const - constant.u8Const); break; + case EbtUint16: returnValue.setU16Const(u16Const - constant.u16Const); break; + case EbtUint: returnValue.setUConst(uConst - constant.uConst); break; case EbtUint64: returnValue.setU64Const(u64Const - constant.u64Const); break; case EbtDouble: returnValue.setDConst(dConst - constant.dConst); break; default: assert(false && "Default missing"); @@ -331,9 +480,13 @@ TConstUnion returnValue; assert(type == constant.type); switch (type) { - case EbtInt: returnValue.setIConst(iConst * constant.iConst); break; - case EbtInt64: returnValue.setI64Const(i64Const * constant.i64Const); break; - case EbtUint: returnValue.setUConst(uConst * constant.uConst); break; + case EbtInt8: returnValue.setI8Const(i8Const * constant.i8Const); break; + case EbtInt16: returnValue.setI16Const(i16Const * constant.i16Const); break; + case EbtInt: returnValue.setIConst(iConst * constant.iConst); break; + case EbtInt64: returnValue.setI64Const(i64Const * constant.i64Const); break; + case EbtUint8: returnValue.setU8Const(u8Const * constant.u8Const); break; + case EbtUint16: returnValue.setU16Const(u16Const * constant.u16Const); break; + case EbtUint: returnValue.setUConst(uConst * constant.uConst); break; case EbtUint64: returnValue.setU64Const(u64Const * constant.u64Const); break; case EbtDouble: returnValue.setDConst(dConst * constant.dConst); break; default: assert(false && "Default missing"); @@ -347,9 +500,13 @@ TConstUnion returnValue; assert(type == constant.type); switch (type) { - case EbtInt: returnValue.setIConst(iConst % constant.iConst); break; - case EbtInt64: returnValue.setI64Const(i64Const % constant.i64Const); break; - case EbtUint: returnValue.setUConst(uConst % constant.uConst); break; + case EbtInt8: returnValue.setI8Const(i8Const % constant.i8Const); break; + case EbtInt16: returnValue.setI8Const(i8Const % constant.i16Const); break; + case EbtInt: returnValue.setIConst(iConst % constant.iConst); break; + case EbtInt64: returnValue.setI64Const(i64Const % constant.i64Const); break; + case EbtUint8: returnValue.setU8Const(u8Const % constant.u8Const); break; + case EbtUint16: returnValue.setU16Const(u16Const % constant.u16Const); break; + case EbtUint: returnValue.setUConst(uConst % constant.uConst); break; case EbtUint64: returnValue.setU64Const(u64Const % constant.u64Const); break; default: assert(false && "Default missing"); } @@ -361,8 +518,64 @@ { TConstUnion returnValue; switch (type) { + case EbtInt8: + switch (constant.type) { + case EbtInt8: returnValue.setI8Const(i8Const >> constant.i8Const); break; + case EbtUint8: returnValue.setI8Const(i8Const >> constant.u8Const); break; + case EbtInt16: returnValue.setI8Const(i8Const >> constant.i16Const); break; + case EbtUint16: returnValue.setI8Const(i8Const >> constant.u16Const); break; + case EbtInt: returnValue.setI8Const(i8Const >> constant.iConst); break; + case EbtUint: returnValue.setI8Const(i8Const >> constant.uConst); break; + case EbtInt64: returnValue.setI8Const(i8Const >> constant.i64Const); break; + case EbtUint64: returnValue.setI8Const(i8Const >> constant.u64Const); break; + default: assert(false && "Default missing"); + } + break; + case EbtUint8: + switch (constant.type) { + case EbtInt8: returnValue.setU8Const(u8Const >> constant.i8Const); break; + case EbtUint8: returnValue.setU8Const(u8Const >> constant.u8Const); break; + case EbtInt16: returnValue.setU8Const(u8Const >> constant.i16Const); break; + case EbtUint16: returnValue.setU8Const(u8Const >> constant.u16Const); break; + case EbtInt: returnValue.setU8Const(u8Const >> constant.iConst); break; + case EbtUint: returnValue.setU8Const(u8Const >> constant.uConst); break; + case EbtInt64: returnValue.setU8Const(u8Const >> constant.i64Const); break; + case EbtUint64: returnValue.setU8Const(u8Const >> constant.u64Const); break; + default: assert(false && "Default missing"); + } + break; + case EbtInt16: + switch (constant.type) { + case EbtInt8: returnValue.setI16Const(i16Const >> constant.i8Const); break; + case EbtUint8: returnValue.setI16Const(i16Const >> constant.u8Const); break; + case EbtInt16: returnValue.setI16Const(i16Const >> constant.i16Const); break; + case EbtUint16: returnValue.setI16Const(i16Const >> constant.u16Const); break; + case EbtInt: returnValue.setI16Const(i16Const >> constant.iConst); break; + case EbtUint: returnValue.setI16Const(i16Const >> constant.uConst); break; + case EbtInt64: returnValue.setI16Const(i16Const >> constant.i64Const); break; + case EbtUint64: returnValue.setI16Const(i16Const >> constant.u64Const); break; + default: assert(false && "Default missing"); + } + break; + case EbtUint16: + switch (constant.type) { + case EbtInt8: returnValue.setU16Const(u16Const >> constant.i8Const); break; + case EbtUint8: returnValue.setU16Const(u16Const >> constant.u8Const); break; + case EbtInt16: returnValue.setU16Const(u16Const >> constant.i16Const); break; + case EbtUint16: returnValue.setU16Const(u16Const >> constant.u16Const); break; + case EbtInt: returnValue.setU16Const(u16Const >> constant.iConst); break; + case EbtUint: returnValue.setU16Const(u16Const >> constant.uConst); break; + case EbtInt64: returnValue.setU16Const(u16Const >> constant.i64Const); break; + case EbtUint64: returnValue.setU16Const(u16Const >> constant.u64Const); break; + default: assert(false && "Default missing"); + } + break; case EbtInt: switch (constant.type) { + case EbtInt8: returnValue.setIConst(iConst >> constant.i8Const); break; + case EbtUint8: returnValue.setIConst(iConst >> constant.u8Const); break; + case EbtInt16: returnValue.setIConst(iConst >> constant.i16Const); break; + case EbtUint16: returnValue.setIConst(iConst >> constant.u16Const); break; case EbtInt: returnValue.setIConst(iConst >> constant.iConst); break; case EbtUint: returnValue.setIConst(iConst >> constant.uConst); break; case EbtInt64: returnValue.setIConst(iConst >> constant.i64Const); break; @@ -372,6 +585,10 @@ break; case EbtUint: switch (constant.type) { + case EbtInt8: returnValue.setUConst(uConst >> constant.i8Const); break; + case EbtUint8: returnValue.setUConst(uConst >> constant.u8Const); break; + case EbtInt16: returnValue.setUConst(uConst >> constant.i16Const); break; + case EbtUint16: returnValue.setUConst(uConst >> constant.u16Const); break; case EbtInt: returnValue.setUConst(uConst >> constant.iConst); break; case EbtUint: returnValue.setUConst(uConst >> constant.uConst); break; case EbtInt64: returnValue.setUConst(uConst >> constant.i64Const); break; @@ -381,6 +598,10 @@ break; case EbtInt64: switch (constant.type) { + case EbtInt8: returnValue.setI64Const(i64Const >> constant.i8Const); break; + case EbtUint8: returnValue.setI64Const(i64Const >> constant.u8Const); break; + case EbtInt16: returnValue.setI64Const(i64Const >> constant.i16Const); break; + case EbtUint16: returnValue.setI64Const(i64Const >> constant.u16Const); break; case EbtInt: returnValue.setI64Const(i64Const >> constant.iConst); break; case EbtUint: returnValue.setI64Const(i64Const >> constant.uConst); break; case EbtInt64: returnValue.setI64Const(i64Const >> constant.i64Const); break; @@ -390,6 +611,10 @@ break; case EbtUint64: switch (constant.type) { + case EbtInt8: returnValue.setU64Const(u64Const >> constant.i8Const); break; + case EbtUint8: returnValue.setU64Const(u64Const >> constant.u8Const); break; + case EbtInt16: returnValue.setU64Const(u64Const >> constant.i16Const); break; + case EbtUint16: returnValue.setU64Const(u64Const >> constant.u16Const); break; case EbtInt: returnValue.setU64Const(u64Const >> constant.iConst); break; case EbtUint: returnValue.setU64Const(u64Const >> constant.uConst); break; case EbtInt64: returnValue.setU64Const(u64Const >> constant.i64Const); break; @@ -407,8 +632,64 @@ { TConstUnion returnValue; switch (type) { + case EbtInt8: + switch (constant.type) { + case EbtInt8: returnValue.setI8Const(i8Const << constant.i8Const); break; + case EbtUint8: returnValue.setI8Const(i8Const << constant.u8Const); break; + case EbtInt16: returnValue.setI8Const(i8Const << constant.i16Const); break; + case EbtUint16: returnValue.setI8Const(i8Const << constant.u16Const); break; + case EbtInt: returnValue.setI8Const(i8Const << constant.iConst); break; + case EbtUint: returnValue.setI8Const(i8Const << constant.uConst); break; + case EbtInt64: returnValue.setI8Const(i8Const << constant.i64Const); break; + case EbtUint64: returnValue.setI8Const(i8Const << constant.u64Const); break; + default: assert(false && "Default missing"); + } + break; + case EbtUint8: + switch (constant.type) { + case EbtInt8: returnValue.setU8Const(u8Const << constant.i8Const); break; + case EbtUint8: returnValue.setU8Const(u8Const << constant.u8Const); break; + case EbtInt16: returnValue.setU8Const(u8Const << constant.i16Const); break; + case EbtUint16: returnValue.setU8Const(u8Const << constant.u16Const); break; + case EbtInt: returnValue.setU8Const(u8Const << constant.iConst); break; + case EbtUint: returnValue.setU8Const(u8Const << constant.uConst); break; + case EbtInt64: returnValue.setU8Const(u8Const << constant.i64Const); break; + case EbtUint64: returnValue.setU8Const(u8Const << constant.u64Const); break; + default: assert(false && "Default missing"); + } + break; + case EbtInt16: + switch (constant.type) { + case EbtInt8: returnValue.setI16Const(i16Const << constant.i8Const); break; + case EbtUint8: returnValue.setI16Const(i16Const << constant.u8Const); break; + case EbtInt16: returnValue.setI16Const(i16Const << constant.i16Const); break; + case EbtUint16: returnValue.setI16Const(i16Const << constant.u16Const); break; + case EbtInt: returnValue.setI16Const(i16Const << constant.iConst); break; + case EbtUint: returnValue.setI16Const(i16Const << constant.uConst); break; + case EbtInt64: returnValue.setI16Const(i16Const << constant.i64Const); break; + case EbtUint64: returnValue.setI16Const(i16Const << constant.u64Const); break; + default: assert(false && "Default missing"); + } + break; + case EbtUint16: + switch (constant.type) { + case EbtInt8: returnValue.setU16Const(u16Const << constant.i8Const); break; + case EbtUint8: returnValue.setU16Const(u16Const << constant.u8Const); break; + case EbtInt16: returnValue.setU16Const(u16Const << constant.i16Const); break; + case EbtUint16: returnValue.setU16Const(u16Const << constant.u16Const); break; + case EbtInt: returnValue.setU16Const(u16Const << constant.iConst); break; + case EbtUint: returnValue.setU16Const(u16Const << constant.uConst); break; + case EbtInt64: returnValue.setU16Const(u16Const << constant.i64Const); break; + case EbtUint64: returnValue.setU16Const(u16Const << constant.u64Const); break; + default: assert(false && "Default missing"); + } + break; case EbtInt: switch (constant.type) { + case EbtInt8: returnValue.setIConst(iConst << constant.i8Const); break; + case EbtUint8: returnValue.setIConst(iConst << constant.u8Const); break; + case EbtInt16: returnValue.setIConst(iConst << constant.i16Const); break; + case EbtUint16: returnValue.setIConst(iConst << constant.u16Const); break; case EbtInt: returnValue.setIConst(iConst << constant.iConst); break; case EbtUint: returnValue.setIConst(iConst << constant.uConst); break; case EbtInt64: returnValue.setIConst(iConst << constant.i64Const); break; @@ -418,6 +699,10 @@ break; case EbtUint: switch (constant.type) { + case EbtInt8: returnValue.setUConst(uConst << constant.i8Const); break; + case EbtUint8: returnValue.setUConst(uConst << constant.u8Const); break; + case EbtInt16: returnValue.setUConst(uConst << constant.i16Const); break; + case EbtUint16: returnValue.setUConst(uConst << constant.u16Const); break; case EbtInt: returnValue.setUConst(uConst << constant.iConst); break; case EbtUint: returnValue.setUConst(uConst << constant.uConst); break; case EbtInt64: returnValue.setUConst(uConst << constant.i64Const); break; @@ -425,8 +710,12 @@ default: assert(false && "Default missing"); } break; - case EbtInt64: + case EbtInt64: switch (constant.type) { + case EbtInt8: returnValue.setI64Const(i64Const << constant.i8Const); break; + case EbtUint8: returnValue.setI64Const(i64Const << constant.u8Const); break; + case EbtInt16: returnValue.setI64Const(i64Const << constant.i16Const); break; + case EbtUint16: returnValue.setI64Const(i64Const << constant.u16Const); break; case EbtInt: returnValue.setI64Const(i64Const << constant.iConst); break; case EbtUint: returnValue.setI64Const(i64Const << constant.uConst); break; case EbtInt64: returnValue.setI64Const(i64Const << constant.i64Const); break; @@ -436,6 +725,10 @@ break; case EbtUint64: switch (constant.type) { + case EbtInt8: returnValue.setU64Const(u64Const << constant.i8Const); break; + case EbtUint8: returnValue.setU64Const(u64Const << constant.u8Const); break; + case EbtInt16: returnValue.setU64Const(u64Const << constant.i16Const); break; + case EbtUint16: returnValue.setU64Const(u64Const << constant.u16Const); break; case EbtInt: returnValue.setU64Const(u64Const << constant.iConst); break; case EbtUint: returnValue.setU64Const(u64Const << constant.uConst); break; case EbtInt64: returnValue.setU64Const(u64Const << constant.i64Const); break; @@ -454,8 +747,12 @@ TConstUnion returnValue; assert(type == constant.type); switch (type) { - case EbtInt: returnValue.setIConst(iConst & constant.iConst); break; - case EbtUint: returnValue.setUConst(uConst & constant.uConst); break; + case EbtInt8: returnValue.setI8Const(i8Const & constant.i8Const); break; + case EbtUint8: returnValue.setU8Const(u8Const & constant.u8Const); break; + case EbtInt16: returnValue.setI16Const(i16Const & constant.i16Const); break; + case EbtUint16: returnValue.setU16Const(u16Const & constant.u16Const); break; + case EbtInt: returnValue.setIConst(iConst & constant.iConst); break; + case EbtUint: returnValue.setUConst(uConst & constant.uConst); break; case EbtInt64: returnValue.setI64Const(i64Const & constant.i64Const); break; case EbtUint64: returnValue.setU64Const(u64Const & constant.u64Const); break; default: assert(false && "Default missing"); @@ -469,8 +766,12 @@ TConstUnion returnValue; assert(type == constant.type); switch (type) { - case EbtInt: returnValue.setIConst(iConst | constant.iConst); break; - case EbtUint: returnValue.setUConst(uConst | constant.uConst); break; + case EbtInt8: returnValue.setI8Const(i8Const | constant.i8Const); break; + case EbtUint8: returnValue.setU8Const(u8Const | constant.u8Const); break; + case EbtInt16: returnValue.setI16Const(i16Const | constant.i16Const); break; + case EbtUint16: returnValue.setU16Const(u16Const | constant.u16Const); break; + case EbtInt: returnValue.setIConst(iConst | constant.iConst); break; + case EbtUint: returnValue.setUConst(uConst | constant.uConst); break; case EbtInt64: returnValue.setI64Const(i64Const | constant.i64Const); break; case EbtUint64: returnValue.setU64Const(u64Const | constant.u64Const); break; default: assert(false && "Default missing"); @@ -484,8 +785,12 @@ TConstUnion returnValue; assert(type == constant.type); switch (type) { - case EbtInt: returnValue.setIConst(iConst ^ constant.iConst); break; - case EbtUint: returnValue.setUConst(uConst ^ constant.uConst); break; + case EbtInt8: returnValue.setI8Const(i8Const ^ constant.i8Const); break; + case EbtUint8: returnValue.setU8Const(u8Const ^ constant.u8Const); break; + case EbtInt16: returnValue.setI16Const(i16Const ^ constant.i16Const); break; + case EbtUint16: returnValue.setU16Const(u16Const ^ constant.u16Const); break; + case EbtInt: returnValue.setIConst(iConst ^ constant.iConst); break; + case EbtUint: returnValue.setUConst(uConst ^ constant.uConst); break; case EbtInt64: returnValue.setI64Const(i64Const ^ constant.i64Const); break; case EbtUint64: returnValue.setU64Const(u64Const ^ constant.u64Const); break; default: assert(false && "Default missing"); @@ -498,8 +803,12 @@ { TConstUnion returnValue; switch (type) { - case EbtInt: returnValue.setIConst(~iConst); break; - case EbtUint: returnValue.setUConst(~uConst); break; + case EbtInt8: returnValue.setI8Const(~i8Const); break; + case EbtUint8: returnValue.setU8Const(~u8Const); break; + case EbtInt16: returnValue.setI16Const(~i16Const); break; + case EbtUint16: returnValue.setU16Const(~u16Const); break; + case EbtInt: returnValue.setIConst(~iConst); break; + case EbtUint: returnValue.setUConst(~uConst); break; case EbtInt64: returnValue.setI64Const(~i64Const); break; case EbtUint64: returnValue.setU64Const(~u64Const); break; default: assert(false && "Default missing"); @@ -536,6 +845,10 @@ private: union { + signed char i8Const; // used for i8vec, scalar int8s + unsigned char u8Const; // used for u8vec, scalar uint8s + signed short i16Const; // used for i16vec, scalar int16s + unsigned short u16Const; // used for u16vec, scalar uint16s int iConst; // used for ivec, scalar ints unsigned int uConst; // used for uvec, scalar uints long long i64Const; // used for i64vec, scalar int64s diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/intermediate.h vulkan-1.1.73+dfsg/external/glslang/glslang/Include/intermediate.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/intermediate.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/Include/intermediate.h 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2016 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -46,7 +47,7 @@ #ifndef __INTERMEDIATE_H #define __INTERMEDIATE_H -#if _MSC_VER >= 1900 +#if defined(_MSC_VER) && _MSC_VER >= 1900 #pragma warning(disable : 4464) // relative include path contains '..' #pragma warning(disable : 5026) // 'glslang::TIntermUnary': move constructor was implicitly defined as deleted #endif @@ -84,100 +85,189 @@ EOpPreIncrement, EOpPreDecrement, + // (u)int* -> bool + EOpConvInt8ToBool, + EOpConvUint8ToBool, + EOpConvInt16ToBool, + EOpConvUint16ToBool, EOpConvIntToBool, EOpConvUintToBool, - EOpConvFloatToBool, - EOpConvDoubleToBool, EOpConvInt64ToBool, EOpConvUint64ToBool, - EOpConvBoolToFloat, - EOpConvIntToFloat, - EOpConvUintToFloat, - EOpConvDoubleToFloat, - EOpConvInt64ToFloat, - EOpConvUint64ToFloat, - EOpConvUintToInt, - EOpConvFloatToInt, + + // float* -> bool + EOpConvFloat16ToBool, + EOpConvFloatToBool, + EOpConvDoubleToBool, + + // bool -> (u)int* + EOpConvBoolToInt8, + EOpConvBoolToUint8, + EOpConvBoolToInt16, + EOpConvBoolToUint16, EOpConvBoolToInt, - EOpConvDoubleToInt, - EOpConvInt64ToInt, - EOpConvUint64ToInt, - EOpConvIntToUint, - EOpConvFloatToUint, EOpConvBoolToUint, - EOpConvDoubleToUint, - EOpConvInt64ToUint, - EOpConvUint64ToUint, - EOpConvIntToDouble, - EOpConvUintToDouble, - EOpConvFloatToDouble, - EOpConvBoolToDouble, - EOpConvInt64ToDouble, - EOpConvUint64ToDouble, EOpConvBoolToInt64, - EOpConvIntToInt64, - EOpConvUintToInt64, - EOpConvFloatToInt64, - EOpConvDoubleToInt64, - EOpConvUint64ToInt64, EOpConvBoolToUint64, + + // bool -> float* + EOpConvBoolToFloat16, + EOpConvBoolToFloat, + EOpConvBoolToDouble, + + // int8_t -> (u)int* + EOpConvInt8ToInt16, + EOpConvInt8ToInt, + EOpConvInt8ToInt64, + EOpConvInt8ToUint8, + EOpConvInt8ToUint16, + EOpConvInt8ToUint, + EOpConvInt8ToUint64, + + // uint8_t -> (u)int* + EOpConvUint8ToInt8, + EOpConvUint8ToInt16, + EOpConvUint8ToInt, + EOpConvUint8ToInt64, + EOpConvUint8ToUint16, + EOpConvUint8ToUint, + EOpConvUint8ToUint64, + + // int8_t -> float* + EOpConvInt8ToFloat16, + EOpConvInt8ToFloat, + EOpConvInt8ToDouble, + + // uint8_t -> float* + EOpConvUint8ToFloat16, + EOpConvUint8ToFloat, + EOpConvUint8ToDouble, + + // int16_t -> (u)int* + EOpConvInt16ToInt8, + EOpConvInt16ToInt, + EOpConvInt16ToInt64, + EOpConvInt16ToUint8, + EOpConvInt16ToUint16, + EOpConvInt16ToUint, + EOpConvInt16ToUint64, + + // uint16_t -> (u)int* + EOpConvUint16ToInt8, + EOpConvUint16ToInt16, + EOpConvUint16ToInt, + EOpConvUint16ToInt64, + EOpConvUint16ToUint8, + EOpConvUint16ToUint, + EOpConvUint16ToUint64, + + // int16_t -> float* + EOpConvInt16ToFloat16, + EOpConvInt16ToFloat, + EOpConvInt16ToDouble, + + // uint16_t -> float* + EOpConvUint16ToFloat16, + EOpConvUint16ToFloat, + EOpConvUint16ToDouble, + + // int32_t -> (u)int* + EOpConvIntToInt8, + EOpConvIntToInt16, + EOpConvIntToInt64, + EOpConvIntToUint8, + EOpConvIntToUint16, + EOpConvIntToUint, EOpConvIntToUint64, + + // uint32_t -> (u)int* + EOpConvUintToInt8, + EOpConvUintToInt16, + EOpConvUintToInt, + EOpConvUintToInt64, + EOpConvUintToUint8, + EOpConvUintToUint16, EOpConvUintToUint64, - EOpConvFloatToUint64, - EOpConvDoubleToUint64, - EOpConvInt64ToUint64, -#ifdef AMD_EXTENSIONS - EOpConvBoolToFloat16, + + // int32_t -> float* EOpConvIntToFloat16, + EOpConvIntToFloat, + EOpConvIntToDouble, + + // uint32_t -> float* EOpConvUintToFloat16, - EOpConvFloatToFloat16, - EOpConvDoubleToFloat16, + EOpConvUintToFloat, + EOpConvUintToDouble, + + // int64_t -> (u)int* + EOpConvInt64ToInt8, + EOpConvInt64ToInt16, + EOpConvInt64ToInt, + EOpConvInt64ToUint8, + EOpConvInt64ToUint16, + EOpConvInt64ToUint, + EOpConvInt64ToUint64, + + // uint64_t -> (u)int* + EOpConvUint64ToInt8, + EOpConvUint64ToInt16, + EOpConvUint64ToInt, + EOpConvUint64ToInt64, + EOpConvUint64ToUint8, + EOpConvUint64ToUint16, + EOpConvUint64ToUint, + + // int64_t -> float* EOpConvInt64ToFloat16, + EOpConvInt64ToFloat, + EOpConvInt64ToDouble, + + // uint64_t -> float* EOpConvUint64ToFloat16, - EOpConvFloat16ToBool, + EOpConvUint64ToFloat, + EOpConvUint64ToDouble, + + // float16_t -> (u)int* + EOpConvFloat16ToInt8, + EOpConvFloat16ToInt16, EOpConvFloat16ToInt, + EOpConvFloat16ToInt64, + EOpConvFloat16ToUint8, + EOpConvFloat16ToUint16, EOpConvFloat16ToUint, + EOpConvFloat16ToUint64, + + // float16_t -> float* EOpConvFloat16ToFloat, EOpConvFloat16ToDouble, - EOpConvFloat16ToInt64, - EOpConvFloat16ToUint64, - EOpConvBoolToInt16, - EOpConvIntToInt16, - EOpConvUintToInt16, + // float -> (u)int* + EOpConvFloatToInt8, EOpConvFloatToInt16, - EOpConvDoubleToInt16, - EOpConvFloat16ToInt16, - EOpConvInt64ToInt16, - EOpConvUint64ToInt16, - EOpConvUint16ToInt16, - EOpConvInt16ToBool, - EOpConvInt16ToInt, - EOpConvInt16ToUint, - EOpConvInt16ToFloat, - EOpConvInt16ToDouble, - EOpConvInt16ToFloat16, - EOpConvInt16ToInt64, - EOpConvInt16ToUint64, - - EOpConvBoolToUint16, - EOpConvIntToUint16, - EOpConvUintToUint16, + EOpConvFloatToInt, + EOpConvFloatToInt64, + EOpConvFloatToUint8, EOpConvFloatToUint16, + EOpConvFloatToUint, + EOpConvFloatToUint64, + + // float -> float* + EOpConvFloatToFloat16, + EOpConvFloatToDouble, + + // float64 _t-> (u)int* + EOpConvDoubleToInt8, + EOpConvDoubleToInt16, + EOpConvDoubleToInt, + EOpConvDoubleToInt64, + EOpConvDoubleToUint8, EOpConvDoubleToUint16, - EOpConvFloat16ToUint16, - EOpConvInt64ToUint16, - EOpConvUint64ToUint16, - EOpConvInt16ToUint16, - EOpConvUint16ToBool, - EOpConvUint16ToInt, - EOpConvUint16ToUint, - EOpConvUint16ToFloat, - EOpConvUint16ToDouble, - EOpConvUint16ToFloat16, - EOpConvUint16ToInt64, - EOpConvUint16ToUint64, -#endif + EOpConvDoubleToUint, + EOpConvDoubleToUint64, + + // float64_t -> float* + EOpConvDoubleToFloat16, + EOpConvDoubleToFloat, // // binary operations @@ -280,12 +370,10 @@ EOpDoubleBitsToUint64, EOpInt64BitsToDouble, EOpUint64BitsToDouble, -#ifdef AMD_EXTENSIONS EOpFloat16BitsToInt16, EOpFloat16BitsToUint16, EOpInt16BitsToFloat16, EOpUint16BitsToFloat16, -#endif EOpPackSnorm2x16, EOpUnpackSnorm2x16, EOpPackUnorm2x16, @@ -302,7 +390,6 @@ EOpUnpackInt2x32, EOpPackUint2x32, EOpUnpackUint2x32, -#ifdef AMD_EXTENSIONS EOpPackFloat2x16, EOpUnpackFloat2x16, EOpPackInt2x16, @@ -313,7 +400,12 @@ EOpUnpackInt4x16, EOpPackUint4x16, EOpUnpackUint4x16, -#endif + EOpPack16, + EOpPack32, + EOpPack64, + EOpUnpack32, + EOpUnpack16, + EOpUnpack8, EOpLength, EOpDistance, @@ -379,6 +471,90 @@ EOpAllInvocations, EOpAllInvocationsEqual, + EOpSubgroupGuardStart, + EOpSubgroupBarrier, + EOpSubgroupMemoryBarrier, + EOpSubgroupMemoryBarrierBuffer, + EOpSubgroupMemoryBarrierImage, + EOpSubgroupMemoryBarrierShared, // compute only + EOpSubgroupElect, + EOpSubgroupAll, + EOpSubgroupAny, + EOpSubgroupAllEqual, + EOpSubgroupBroadcast, + EOpSubgroupBroadcastFirst, + EOpSubgroupBallot, + EOpSubgroupInverseBallot, + EOpSubgroupBallotBitExtract, + EOpSubgroupBallotBitCount, + EOpSubgroupBallotInclusiveBitCount, + EOpSubgroupBallotExclusiveBitCount, + EOpSubgroupBallotFindLSB, + EOpSubgroupBallotFindMSB, + EOpSubgroupShuffle, + EOpSubgroupShuffleXor, + EOpSubgroupShuffleUp, + EOpSubgroupShuffleDown, + EOpSubgroupAdd, + EOpSubgroupMul, + EOpSubgroupMin, + EOpSubgroupMax, + EOpSubgroupAnd, + EOpSubgroupOr, + EOpSubgroupXor, + EOpSubgroupInclusiveAdd, + EOpSubgroupInclusiveMul, + EOpSubgroupInclusiveMin, + EOpSubgroupInclusiveMax, + EOpSubgroupInclusiveAnd, + EOpSubgroupInclusiveOr, + EOpSubgroupInclusiveXor, + EOpSubgroupExclusiveAdd, + EOpSubgroupExclusiveMul, + EOpSubgroupExclusiveMin, + EOpSubgroupExclusiveMax, + EOpSubgroupExclusiveAnd, + EOpSubgroupExclusiveOr, + EOpSubgroupExclusiveXor, + EOpSubgroupClusteredAdd, + EOpSubgroupClusteredMul, + EOpSubgroupClusteredMin, + EOpSubgroupClusteredMax, + EOpSubgroupClusteredAnd, + EOpSubgroupClusteredOr, + EOpSubgroupClusteredXor, + EOpSubgroupQuadBroadcast, + EOpSubgroupQuadSwapHorizontal, + EOpSubgroupQuadSwapVertical, + EOpSubgroupQuadSwapDiagonal, + +#ifdef NV_EXTENSIONS + EOpSubgroupPartition, + EOpSubgroupPartitionedAdd, + EOpSubgroupPartitionedMul, + EOpSubgroupPartitionedMin, + EOpSubgroupPartitionedMax, + EOpSubgroupPartitionedAnd, + EOpSubgroupPartitionedOr, + EOpSubgroupPartitionedXor, + EOpSubgroupPartitionedInclusiveAdd, + EOpSubgroupPartitionedInclusiveMul, + EOpSubgroupPartitionedInclusiveMin, + EOpSubgroupPartitionedInclusiveMax, + EOpSubgroupPartitionedInclusiveAnd, + EOpSubgroupPartitionedInclusiveOr, + EOpSubgroupPartitionedInclusiveXor, + EOpSubgroupPartitionedExclusiveAdd, + EOpSubgroupPartitionedExclusiveMul, + EOpSubgroupPartitionedExclusiveMin, + EOpSubgroupPartitionedExclusiveMax, + EOpSubgroupPartitionedExclusiveAnd, + EOpSubgroupPartitionedExclusiveOr, + EOpSubgroupPartitionedExclusiveXor, +#endif + + EOpSubgroupGuardStop, + #ifdef AMD_EXTENSIONS EOpMinInvocations, EOpMaxInvocations, @@ -451,32 +627,36 @@ EOpConstructGuardStart, EOpConstructInt, // these first scalar forms also identify what implicit conversion is needed EOpConstructUint, - EOpConstructInt64, - EOpConstructUint64, -#ifdef AMD_EXTENSIONS + EOpConstructInt8, + EOpConstructUint8, EOpConstructInt16, EOpConstructUint16, -#endif + EOpConstructInt64, + EOpConstructUint64, EOpConstructBool, EOpConstructFloat, EOpConstructDouble, -#ifdef AMD_EXTENSIONS - EOpConstructFloat16, -#endif EOpConstructVec2, EOpConstructVec3, EOpConstructVec4, EOpConstructDVec2, EOpConstructDVec3, EOpConstructDVec4, -#ifdef AMD_EXTENSIONS - EOpConstructF16Vec2, - EOpConstructF16Vec3, - EOpConstructF16Vec4, -#endif EOpConstructBVec2, EOpConstructBVec3, EOpConstructBVec4, + EOpConstructI8Vec2, + EOpConstructI8Vec3, + EOpConstructI8Vec4, + EOpConstructU8Vec2, + EOpConstructU8Vec3, + EOpConstructU8Vec4, + EOpConstructI16Vec2, + EOpConstructI16Vec3, + EOpConstructI16Vec4, + EOpConstructU16Vec2, + EOpConstructU16Vec3, + EOpConstructU16Vec4, EOpConstructIVec2, EOpConstructIVec3, EOpConstructIVec4, @@ -489,14 +669,6 @@ EOpConstructU64Vec2, EOpConstructU64Vec3, EOpConstructU64Vec4, -#ifdef AMD_EXTENSIONS - EOpConstructI16Vec2, - EOpConstructI16Vec3, - EOpConstructI16Vec4, - EOpConstructU16Vec2, - EOpConstructU16Vec3, - EOpConstructU16Vec4, -#endif EOpConstructMat2x2, EOpConstructMat2x3, EOpConstructMat2x4, @@ -542,7 +714,10 @@ EOpConstructBMat4x2, EOpConstructBMat4x3, EOpConstructBMat4x4, -#ifdef AMD_EXTENSIONS + EOpConstructFloat16, + EOpConstructF16Vec2, + EOpConstructF16Vec3, + EOpConstructF16Vec4, EOpConstructF16Mat2x2, EOpConstructF16Mat2x3, EOpConstructF16Mat2x4, @@ -552,9 +727,9 @@ EOpConstructF16Mat4x2, EOpConstructF16Mat4x3, EOpConstructF16Mat4x4, -#endif EOpConstructStruct, EOpConstructTextureSampler, + EOpConstructNonuniform, // expected to be transformed away, not present in final AST EOpConstructGuardEnd, // @@ -581,7 +756,11 @@ // Array operators // - EOpArrayLength, // "Array" distinguishes from length(v) built-in function, but it applies to vectors and matrices as well. + // Can apply to arrays, vectors, or matrices. + // Can be decomposed to a constant at compile time, but this does not always happen, + // due to link-time effects. So, consumer can expect either a link-time sized or + // run-time sized array. + EOpArrayLength, // // Image operations @@ -777,6 +956,12 @@ // matrix EOpMatrixSwizzle, // select multiple matrix components (non-column) + + // SM6 wave ops + EOpWaveGetLaneCount, // Will decompose to gl_SubgroupSize. + EOpWaveGetLaneIndex, // Will decompose to gl_SubgroupInvocationID. + EOpWaveActiveCountBits, // Will decompose to subgroupBallotBitCount(subgroupBallot()). + EOpWavePrefixCountBits, // Will decompose to subgroupBallotInclusiveBitCount(subgroupBallot()). }; class TIntermTraverser; @@ -1336,9 +1521,11 @@ public: TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB) : TIntermTyped(EbtVoid), condition(cond), trueBlock(trueB), falseBlock(falseB), + shortCircuit(true), flatten(false), dontFlatten(false) {} TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB, const TType& type) : TIntermTyped(type), condition(cond), trueBlock(trueB), falseBlock(falseB), + shortCircuit(true), flatten(false), dontFlatten(false) {} virtual void traverse(TIntermTraverser*); virtual TIntermTyped* getCondition() const { return condition; } @@ -1347,6 +1534,9 @@ virtual TIntermSelection* getAsSelectionNode() { return this; } virtual const TIntermSelection* getAsSelectionNode() const { return this; } + void setNoShortCircuit() { shortCircuit = false; } + bool getShortCircuit() const { return shortCircuit; } + void setFlatten() { flatten = true; } void setDontFlatten() { dontFlatten = true; } bool getFlatten() const { return flatten; } @@ -1356,8 +1546,9 @@ TIntermTyped* condition; TIntermNode* trueBlock; TIntermNode* falseBlock; - bool flatten; // true if flatten requested - bool dontFlatten; // true if requested to not flatten + bool shortCircuit; // normally all if-then-else and all GLSL ?: short-circuit, but HLSL ?: does not + bool flatten; // true if flatten requested + bool dontFlatten; // true if requested to not flatten }; // diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/revision.h vulkan-1.1.73+dfsg/external/glslang/glslang/Include/revision.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/revision.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/Include/revision.h 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,3 @@ // This header is generated by the make-revision script. -// For the version, it uses the latest git tag followed by the number of commits. -// For the date, it uses the current date (when then script is run). -#define GLSLANG_REVISION "Overload400-PrecQual.2000" -#define GLSLANG_DATE "12-Apr-2017" +#define GLSLANG_PATCH_LEVEL 2705 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/revision.template vulkan-1.1.73+dfsg/external/glslang/glslang/Include/revision.template --- vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/revision.template 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/Include/revision.template 2018-04-27 11:46:26.000000000 +0000 @@ -1,13 +1,13 @@ -// The file revision.h should be updated to the latest version, somehow, on -// check-in, if glslang has changed. -// -// revision.template is the source for revision.h when using SubWCRev as the -// method of updating revision.h. You don't have to do it this way, the -// requirement is only that revision.h gets updated. -// -// revision.h is under source control so that not all consumers of glslang -// source have to figure out how to create revision.h just to get a build -// going. However, if it is not updated, it can be a version behind. - -#define GLSLANG_REVISION "$WCREV$" -#define GLSLANG_DATE "$WCDATE$" +// The file revision.h should be updated to the latest version, somehow, on +// check-in, if glslang has changed. +// +// revision.template is the source for revision.h when using SubWCRev as the +// method of updating revision.h. You don't have to do it this way, the +// requirement is only that revision.h gets updated. +// +// revision.h is under source control so that not all consumers of glslang +// source have to figure out how to create revision.h just to get a build +// going. However, if it is not updated, it can be a version behind. + +#define GLSLANG_REVISION "$WCREV$" +#define GLSLANG_DATE "$WCDATE$" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/Types.h vulkan-1.1.73+dfsg/external/glslang/glslang/Include/Types.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/Include/Types.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/Include/Types.h 2018-04-27 11:46:26.000000000 +0000 @@ -2,6 +2,7 @@ // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2016 LunarG, Inc. // Copyright (C) 2015-2016 Google, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -204,9 +205,18 @@ } switch (type) { - case EbtFloat: break; - case EbtInt: s.append("i"); break; - case EbtUint: s.append("u"); break; + case EbtFloat: break; +#ifdef AMD_EXTENSIONS + case EbtFloat16: s.append("f16"); break; +#endif + case EbtInt8: s.append("i8"); break; + case EbtUint16: s.append("u8"); break; + case EbtInt16: s.append("i16"); break; + case EbtUint8: s.append("u16"); break; + case EbtInt: s.append("i"); break; + case EbtUint: s.append("u"); break; + case EbtInt64: s.append("i64"); break; + case EbtUint64: s.append("u64"); break; default: break; // some compilers want this } if (image) { @@ -427,6 +437,7 @@ clearInterstage(); clearMemory(); specConstant = false; + nonUniform = false; clearLayout(); } @@ -460,7 +471,7 @@ // Drop just the storage qualification, which perhaps should // never be done, as it is fundamentally inconsistent, but need to // explore what downstream consumers need. - // E.g., in a deference, it is an inconsistency between: + // E.g., in a dereference, it is an inconsistency between: // A) partially dereferenced resource is still in the storage class it started in // B) partially dereferenced resource is a new temporary object // If A, then nothing should change, if B, then everything should change, but this is half way. @@ -468,6 +479,7 @@ { storage = EvqTemporary; specConstant = false; + nonUniform = false; } const char* semanticName; @@ -492,6 +504,7 @@ bool readonly : 1; bool writeonly : 1; bool specConstant : 1; // having a constant_id is not sufficient: expressions have no id, but are still specConstant + bool nonUniform : 1; bool isMemory() const { @@ -505,6 +518,12 @@ return flat || smooth || nopersp; #endif } +#ifdef AMD_EXTENSIONS + bool isExplicitInterpolation() const + { + return explicitInterp; + } +#endif bool isAuxiliary() const { return centroid || patch || sample; @@ -817,6 +836,10 @@ // true front-end constant. return specConstant; } + bool isNonUniform() const + { + return nonUniform; + } bool isFrontEndConstant() const { // True if the front-end knows the final constant value. @@ -1299,31 +1322,9 @@ void makeVector() { vector1 = true; } - // Merge type from parent, where a parentType is at the beginning of a declaration, - // establishing some characteristics for all subsequent names, while this type - // is on the individual names. - void mergeType(const TPublicType& parentType) - { - // arrayness is currently the only child aspect that has to be preserved - basicType = parentType.basicType; - vectorSize = parentType.vectorSize; - matrixCols = parentType.matrixCols; - matrixRows = parentType.matrixRows; - vector1 = false; // TPublicType is only GLSL which so far has no vec1 - qualifier = parentType.qualifier; - sampler = parentType.sampler; - if (parentType.arraySizes) - newArraySizes(*parentType.arraySizes); - if (parentType.userDef) { - structure = parentType.userDef->getWritableStruct(); - setTypeName(parentType.userDef->getTypeName()); - } - } - virtual void hideMember() { basicType = EbtVoid; vectorSize = 1; } virtual bool hiddenMember() const { return basicType == EbtVoid; } - virtual void setTypeName(const TString& n) { typeName = NewPoolTString(n.c_str()); } virtual void setFieldName(const TString& n) { fieldName = NewPoolTString(n.c_str()); } virtual const TString& getTypeName() const { @@ -1353,33 +1354,31 @@ virtual bool isArrayOfArrays() const { return arraySizes != nullptr && arraySizes->getNumDims() > 1; } virtual int getImplicitArraySize() const { return arraySizes->getImplicitSize(); } virtual const TArraySizes* getArraySizes() const { return arraySizes; } - virtual TArraySizes& getArraySizes() { assert(arraySizes != nullptr); return *arraySizes; } + virtual TArraySizes* getArraySizes() { return arraySizes; } virtual bool isScalar() const { return ! isVector() && ! isMatrix() && ! isStruct() && ! isArray(); } virtual bool isScalarOrVec1() const { return isScalar() || vector1; } virtual bool isVector() const { return vectorSize > 1 || vector1; } virtual bool isMatrix() const { return matrixCols ? true : false; } virtual bool isArray() const { return arraySizes != nullptr; } - virtual bool isExplicitlySizedArray() const { return isArray() && getOuterArraySize() != UnsizedArraySize; } - virtual bool isImplicitlySizedArray() const { return isArray() && getOuterArraySize() == UnsizedArraySize && qualifier.storage != EvqBuffer; } - virtual bool isRuntimeSizedArray() const { return isArray() && getOuterArraySize() == UnsizedArraySize && qualifier.storage == EvqBuffer; } + virtual bool isSizedArray() const { return isArray() && arraySizes->isSized(); } + virtual bool isUnsizedArray() const { return isArray() && !arraySizes->isSized(); } + virtual bool isArrayVariablyIndexed() const { assert(isArray()); return arraySizes->isVariablyIndexed(); } + virtual void setArrayVariablyIndexed() { assert(isArray()); arraySizes->setVariablyIndexed(); } + virtual void updateImplicitArraySize(int size) { assert(isArray()); arraySizes->updateImplicitSize(size); } virtual bool isStruct() const { return structure != nullptr; } -#ifdef AMD_EXTENSIONS virtual bool isFloatingDomain() const { return basicType == EbtFloat || basicType == EbtDouble || basicType == EbtFloat16; } -#else - virtual bool isFloatingDomain() const { return basicType == EbtFloat || basicType == EbtDouble; } -#endif virtual bool isIntegerDomain() const { switch (basicType) { + case EbtInt8: + case EbtUint8: + case EbtInt16: + case EbtUint16: case EbtInt: case EbtUint: case EbtInt64: case EbtUint64: -#ifdef AMD_EXTENSIONS - case EbtInt16: - case EbtUint16: -#endif case EbtAtomicUint: return true; default: @@ -1391,11 +1390,12 @@ virtual bool isBuiltIn() const { return getQualifier().builtIn != EbvNone; } // "Image" is a superset of "Subpass" - virtual bool isImage() const { return basicType == EbtSampler && getSampler().isImage(); } + virtual bool isImage() const { return basicType == EbtSampler && getSampler().isImage(); } virtual bool isSubpass() const { return basicType == EbtSampler && getSampler().isSubpass(); } + virtual bool isTexture() const { return basicType == EbtSampler && getSampler().isTexture(); } // return true if this type contains any subtype which satisfies the given predicate. - template + template bool contains(P predicate) const { if (predicate(this)) @@ -1424,10 +1424,10 @@ return contains([this](const TType* t) { return t != this && t->isStruct(); } ); } - // Recursively check the structure for any implicitly-sized arrays, needed for triggering a copyUp(). - virtual bool containsImplicitlySizedArray() const + // Recursively check the structure for any unsized arrays, needed for triggering a copyUp(). + virtual bool containsUnsizedArray() const { - return contains([](const TType* t) { return t->isImplicitlySizedArray(); } ); + return contains([](const TType* t) { return t->isUnsizedArray(); } ); } virtual bool containsOpaque() const @@ -1448,17 +1448,15 @@ case EbtVoid: case EbtFloat: case EbtDouble: -#ifdef AMD_EXTENSIONS case EbtFloat16: -#endif + case EbtInt8: + case EbtUint8: + case EbtInt16: + case EbtUint16: case EbtInt: case EbtUint: case EbtInt64: case EbtUint64: -#ifdef AMD_EXTENSIONS - case EbtInt16: - case EbtUint16: -#endif case EbtBool: return true; default: @@ -1493,34 +1491,51 @@ assert(type.arraySizes != nullptr); *arraySizes = *type.arraySizes; } - void newArraySizes(const TArraySizes& s) + void copyArraySizes(const TArraySizes& s) { // For setting a fresh new set of array sizes, not yet worrying about sharing. arraySizes = new TArraySizes; *arraySizes = s; } - void clearArraySizes() + void transferArraySizes(TArraySizes* s) { - arraySizes = 0; + // For setting an already allocated set of sizes that this type can use + // (no copy made). + arraySizes = s; } - void addArrayOuterSizes(const TArraySizes& s) + void clearArraySizes() { - if (arraySizes == nullptr) - newArraySizes(s); - else - arraySizes->addOuterSizes(s); + arraySizes = nullptr; + } + + // Add inner array sizes, to any existing sizes, via copy; the + // sizes passed in can still be reused for other purposes. + void copyArrayInnerSizes(const TArraySizes* s) + { + if (s != nullptr) { + if (arraySizes == nullptr) + copyArraySizes(*s); + else + arraySizes->addInnerSizes(*s); + } } void changeOuterArraySize(int s) { arraySizes->changeOuterSize(s); } - void setImplicitArraySize(int s) { arraySizes->setImplicitSize(s); } - // Recursively make the implicit array size the explicit array size, through the type tree. - void adoptImplicitArraySizes() + // Recursively make the implicit array size the explicit array size. + // Expicit arrays are compile-time or link-time sized, never run-time sized. + // Sometimes, policy calls for an array to be run-time sized even if it was + // never variably indexed: Don't turn a 'skipNonvariablyIndexed' array into + // an explicit array. + void adoptImplicitArraySizes(bool skipNonvariablyIndexed) { - if (isImplicitlySizedArray()) + if (isUnsizedArray() && !(skipNonvariablyIndexed || isArrayVariablyIndexed())) changeOuterArraySize(getImplicitArraySize()); - if (isStruct()) { - for (int i = 0; i < (int)structure->size(); ++i) - (*structure)[i].type->adoptImplicitArraySizes(); + if (isStruct() && structure->size() > 0) { + int lastMember = (int)structure->size() - 1; + for (int i = 0; i < lastMember; ++i) + (*structure)[i].type->adoptImplicitArraySizes(false); + // implement the "last member of an SSBO" policy + (*structure)[lastMember].type->adoptImplicitArraySizes(getQualifier().storage == EvqBuffer); } } @@ -1535,17 +1550,15 @@ case EbtVoid: return "void"; case EbtFloat: return "float"; case EbtDouble: return "double"; -#ifdef AMD_EXTENSIONS case EbtFloat16: return "float16_t"; -#endif + case EbtInt8: return "int8_t"; + case EbtUint8: return "uint8_t"; + case EbtInt16: return "int16_t"; + case EbtUint16: return "uint16_t"; case EbtInt: return "int"; case EbtUint: return "uint"; case EbtInt64: return "int64_t"; case EbtUint64: return "uint64_t"; -#ifdef AMD_EXTENSIONS - case EbtInt16: return "int16_t"; - case EbtUint16: return "uint16_t"; -#endif case EbtBool: return "bool"; case EbtAtomicUint: return "atomic_uint"; case EbtSampler: return "sampler/image"; @@ -1684,16 +1697,26 @@ appendStr(" writeonly"); if (qualifier.specConstant) appendStr(" specialization-constant"); + if (qualifier.nonUniform) + appendStr(" nonuniform"); appendStr(" "); appendStr(getStorageQualifierString()); if (isArray()) { for(int i = 0; i < (int)arraySizes->getNumDims(); ++i) { int size = arraySizes->getDimSize(i); - if (size == 0) - appendStr(" implicitly-sized array of"); + if (size == UnsizedArraySize && i == 0 && arraySizes->isVariablyIndexed()) + appendStr(" runtime-sized array of"); else { - appendStr(" "); - appendInt(arraySizes->getDimSize(i)); + if (size == UnsizedArraySize) { + appendStr(" unsized"); + if (i == 0) { + appendStr(" "); + appendInt(arraySizes->getImplicitSize()); + } + } else { + appendStr(" "); + appendInt(arraySizes->getDimSize(i)); + } appendStr("-element array of"); } } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/attribute.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/attribute.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/attribute.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/attribute.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -82,7 +82,7 @@ if (args == nullptr) return nullptr; - if (argNum >= args->getSequence().size()) + if (argNum >= (int)args->getSequence().size()) return nullptr; const TConstUnion* constVal = &args->getSequence()[argNum]->getAsConstantUnion()->getConstArray()[0]; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Constant.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Constant.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Constant.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Constant.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2013 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -177,11 +178,40 @@ switch (getType().getBasicType()) { case EbtDouble: case EbtFloat: -#ifdef AMD_EXTENSIONS case EbtFloat16: -#endif newConstArray[i].setDConst(leftUnionArray[i].getDConst() / rightUnionArray[i].getDConst()); break; + case EbtInt8: + if (rightUnionArray[i] == 0) + newConstArray[i].setI8Const(0x7F); + else if (rightUnionArray[i].getI8Const() == -1 && leftUnionArray[i].getI8Const() == (signed char)0x80) + newConstArray[i].setI8Const((signed char)0x80); + else + newConstArray[i].setI8Const(leftUnionArray[i].getI8Const() / rightUnionArray[i].getI8Const()); + break; + + case EbtUint8: + if (rightUnionArray[i] == 0) { + newConstArray[i].setU8Const(0xFF); + } else + newConstArray[i].setU8Const(leftUnionArray[i].getU8Const() / rightUnionArray[i].getU8Const()); + break; + + case EbtInt16: + if (rightUnionArray[i] == 0) + newConstArray[i].setI16Const(0x7FFF); + else if (rightUnionArray[i].getI16Const() == -1 && leftUnionArray[i].getI16Const() == (signed short)0x8000) + newConstArray[i].setI16Const(short(0x8000)); + else + newConstArray[i].setI16Const(leftUnionArray[i].getI16Const() / rightUnionArray[i].getI16Const()); + break; + + case EbtUint16: + if (rightUnionArray[i] == 0) { + newConstArray[i].setU16Const(0xFFFF); + } else + newConstArray[i].setU16Const(leftUnionArray[i].getU16Const() / rightUnionArray[i].getU16Const()); + break; case EbtInt: if (rightUnionArray[i] == 0) @@ -214,23 +244,6 @@ } else newConstArray[i].setU64Const(leftUnionArray[i].getU64Const() / rightUnionArray[i].getU64Const()); break; -#ifdef AMD_EXTENSIONS - case EbtInt16: - if (rightUnionArray[i] == 0) - newConstArray[i].setIConst(0x7FFF); - else if (rightUnionArray[i].getIConst() == -1 && leftUnionArray[i].getIConst() == (int)0x8000) - newConstArray[i].setIConst(0x8000); - else - newConstArray[i].setIConst(leftUnionArray[i].getIConst() / rightUnionArray[i].getIConst()); - break; - - case EbtUint16: - if (rightUnionArray[i] == 0) { - newConstArray[i].setUConst(0xFFFFu); - } else - newConstArray[i].setUConst(leftUnionArray[i].getUConst() / rightUnionArray[i].getUConst()); - break; -#endif default: return 0; } @@ -411,6 +424,12 @@ resultSize = 2; break; + case EOpPack16: + case EOpPack32: + case EOpPack64: + case EOpUnpack32: + case EOpUnpack16: + case EOpUnpack8: case EOpNormalize: componentWise = false; resultSize = objectSize; @@ -469,6 +488,12 @@ case EOpPackSnorm2x16: case EOpPackUnorm2x16: case EOpPackHalf2x16: + case EOpPack16: + case EOpPack32: + case EOpPack64: + case EOpUnpack32: + case EOpUnpack16: + case EOpUnpack8: case EOpUnpackSnorm2x16: case EOpUnpackUnorm2x16: @@ -494,17 +519,13 @@ case EOpNegative: switch (getType().getBasicType()) { case EbtDouble: -#ifdef AMD_EXTENSIONS case EbtFloat16: -#endif case EbtFloat: newConstArray[i].setDConst(-unionArray[i].getDConst()); break; -#ifdef AMD_EXTENSIONS - case EbtInt16: -#endif + case EbtInt8: newConstArray[i].setI8Const(-unionArray[i].getI8Const()); break; + case EbtUint8: newConstArray[i].setU8Const(static_cast(-static_cast(unionArray[i].getU8Const()))); break; + case EbtInt16: newConstArray[i].setI16Const(-unionArray[i].getI16Const()); break; + case EbtUint16:newConstArray[i].setU16Const(static_cast(-static_cast(unionArray[i].getU16Const()))); break; case EbtInt: newConstArray[i].setIConst(-unionArray[i].getIConst()); break; -#ifdef AMD_EXTENSIONS - case EbtUint16: -#endif case EbtUint: newConstArray[i].setUConst(static_cast(-static_cast(unionArray[i].getUConst()))); break; case EbtInt64: newConstArray[i].setI64Const(-unionArray[i].getI64Const()); break; case EbtUint64: newConstArray[i].setU64Const(static_cast(-static_cast(unionArray[i].getU64Const()))); break; @@ -659,13 +680,10 @@ case EOpDoubleBitsToUint64: case EOpInt64BitsToDouble: case EOpUint64BitsToDouble: -#ifdef AMD_EXTENSIONS case EOpFloat16BitsToInt16: case EOpFloat16BitsToUint16: case EOpInt16BitsToFloat16: case EOpUint16BitsToFloat16: -#endif - default: return 0; } @@ -749,20 +767,6 @@ for (unsigned int arg = 0; arg < children.size(); ++arg) childConstUnions.push_back(children[arg]->getAsConstantUnion()->getConstArray()); - // Second, do the actual folding - - bool isFloatingPoint = children[0]->getAsTyped()->getBasicType() == EbtFloat || -#ifdef AMD_EXTENSIONS - children[0]->getAsTyped()->getBasicType() == EbtFloat16 || -#endif - children[0]->getAsTyped()->getBasicType() == EbtDouble; - bool isSigned = children[0]->getAsTyped()->getBasicType() == EbtInt || -#ifdef AMD_EXTENSIONS - children[0]->getAsTyped()->getBasicType() == EbtInt16 || -#endif - children[0]->getAsTyped()->getBasicType() == EbtInt64; - bool isInt64 = children[0]->getAsTyped()->getBasicType() == EbtInt64 || - children[0]->getAsTyped()->getBasicType() == EbtUint64; if (componentwise) { for (int comp = 0; comp < objectSize; comp++) { @@ -783,53 +787,114 @@ newConstArray[comp].setDConst(pow(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst())); break; case EOpMin: - if (isFloatingPoint) + switch(children[0]->getAsTyped()->getBasicType()) { + case EbtFloat16: + case EbtFloat: + case EbtDouble: newConstArray[comp].setDConst(std::min(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst())); - else if (isSigned) { - if (isInt64) - newConstArray[comp].setI64Const(std::min(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const())); - else - newConstArray[comp].setIConst(std::min(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst())); - } else { - if (isInt64) - newConstArray[comp].setU64Const(std::min(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const())); - else - newConstArray[comp].setUConst(std::min(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst())); + break; + case EbtInt8: + newConstArray[comp].setI8Const(std::min(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const())); + break; + case EbtUint8: + newConstArray[comp].setU8Const(std::min(childConstUnions[0][arg0comp].getU8Const(), childConstUnions[1][arg1comp].getU8Const())); + break; + case EbtInt16: + newConstArray[comp].setI16Const(std::min(childConstUnions[0][arg0comp].getI16Const(), childConstUnions[1][arg1comp].getI16Const())); + break; + case EbtUint16: + newConstArray[comp].setU16Const(std::min(childConstUnions[0][arg0comp].getU16Const(), childConstUnions[1][arg1comp].getU16Const())); + break; + case EbtInt: + newConstArray[comp].setIConst(std::min(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst())); + break; + case EbtUint: + newConstArray[comp].setUConst(std::min(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst())); + break; + case EbtInt64: + newConstArray[comp].setI64Const(std::min(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const())); + break; + case EbtUint64: + newConstArray[comp].setU64Const(std::min(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const())); + break; + default: assert(false && "Default missing"); } break; case EOpMax: - if (isFloatingPoint) + switch(children[0]->getAsTyped()->getBasicType()) { + case EbtFloat16: + case EbtFloat: + case EbtDouble: newConstArray[comp].setDConst(std::max(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst())); - else if (isSigned) { - if (isInt64) - newConstArray[comp].setI64Const(std::max(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const())); - else - newConstArray[comp].setIConst(std::max(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst())); - } else { - if (isInt64) - newConstArray[comp].setU64Const(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const())); - else - newConstArray[comp].setUConst(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst())); + break; + case EbtInt8: + newConstArray[comp].setI8Const(std::max(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const())); + break; + case EbtUint8: + newConstArray[comp].setU8Const(std::max(childConstUnions[0][arg0comp].getU8Const(), childConstUnions[1][arg1comp].getU8Const())); + break; + case EbtInt16: + newConstArray[comp].setI16Const(std::max(childConstUnions[0][arg0comp].getI16Const(), childConstUnions[1][arg1comp].getI16Const())); + break; + case EbtUint16: + newConstArray[comp].setU16Const(std::max(childConstUnions[0][arg0comp].getU16Const(), childConstUnions[1][arg1comp].getU16Const())); + break; + case EbtInt: + newConstArray[comp].setIConst(std::max(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst())); + break; + case EbtUint: + newConstArray[comp].setUConst(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst())); + break; + case EbtInt64: + newConstArray[comp].setI64Const(std::max(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const())); + break; + case EbtUint64: + newConstArray[comp].setU64Const(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const())); + break; + default: assert(false && "Default missing"); } break; case EOpClamp: - if (isFloatingPoint) + switch(children[0]->getAsTyped()->getBasicType()) { + case EbtFloat16: + case EbtFloat: + case EbtDouble: newConstArray[comp].setDConst(std::min(std::max(childConstUnions[0][arg0comp].getDConst(), childConstUnions[1][arg1comp].getDConst()), childConstUnions[2][arg2comp].getDConst())); - else if (isSigned) { - if (isInt64) - newConstArray[comp].setI64Const(std::min(std::max(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const()), - childConstUnions[2][arg2comp].getI64Const())); - else - newConstArray[comp].setIConst(std::min(std::max(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst()), + break; + case EbtInt8: + newConstArray[comp].setI8Const(std::min(std::max(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const()), + childConstUnions[2][arg2comp].getI8Const())); + break; + case EbtUint8: + newConstArray[comp].setU8Const(std::min(std::max(childConstUnions[0][arg0comp].getU8Const(), childConstUnions[1][arg1comp].getU8Const()), + childConstUnions[2][arg2comp].getU8Const())); + break; + case EbtInt16: + newConstArray[comp].setI16Const(std::min(std::max(childConstUnions[0][arg0comp].getI16Const(), childConstUnions[1][arg1comp].getI16Const()), + childConstUnions[2][arg2comp].getI16Const())); + break; + case EbtUint16: + newConstArray[comp].setU16Const(std::min(std::max(childConstUnions[0][arg0comp].getU16Const(), childConstUnions[1][arg1comp].getU16Const()), + childConstUnions[2][arg2comp].getU16Const())); + break; + case EbtInt: + newConstArray[comp].setIConst(std::min(std::max(childConstUnions[0][arg0comp].getIConst(), childConstUnions[1][arg1comp].getIConst()), childConstUnions[2][arg2comp].getIConst())); - } else { - if (isInt64) - newConstArray[comp].setU64Const(std::min(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()), - childConstUnions[2][arg2comp].getU64Const())); - else - newConstArray[comp].setUConst(std::min(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()), + break; + case EbtUint: + newConstArray[comp].setUConst(std::min(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()), childConstUnions[2][arg2comp].getUConst())); + break; + case EbtInt64: + newConstArray[comp].setI64Const(std::min(std::max(childConstUnions[0][arg0comp].getI64Const(), childConstUnions[1][arg1comp].getI64Const()), + childConstUnions[2][arg2comp].getI64Const())); + break; + case EbtUint64: + newConstArray[comp].setU64Const(std::min(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()), + childConstUnions[2][arg2comp].getU64Const())); + break; + default: assert(false && "Default missing"); } break; case EOpLessThan: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/glslang_tab.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/glslang_tab.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/glslang_tab.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/glslang_tab.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -62,7 +62,7 @@ /* Copy the first part of user declarations. */ -#line 41 "MachineIndependent/glslang.y" /* yacc.c:339 */ +#line 42 "MachineIndependent/glslang.y" /* yacc.c:339 */ /* Based on: @@ -125,299 +125,392 @@ { ATTRIBUTE = 258, VARYING = 259, - CONST = 260, - BOOL = 261, - FLOAT = 262, + FLOAT16_T = 260, + FLOAT = 261, + FLOAT32_T = 262, DOUBLE = 263, - INT = 264, - UINT = 265, - INT64_T = 266, - UINT64_T = 267, - INT16_T = 268, - UINT16_T = 269, - FLOAT16_T = 270, - BREAK = 271, - CONTINUE = 272, - DO = 273, - ELSE = 274, - FOR = 275, - IF = 276, - DISCARD = 277, - RETURN = 278, - SWITCH = 279, - CASE = 280, - DEFAULT = 281, - SUBROUTINE = 282, - BVEC2 = 283, - BVEC3 = 284, - BVEC4 = 285, - IVEC2 = 286, - IVEC3 = 287, - IVEC4 = 288, - I64VEC2 = 289, - I64VEC3 = 290, - I64VEC4 = 291, - UVEC2 = 292, - UVEC3 = 293, - UVEC4 = 294, - U64VEC2 = 295, - U64VEC3 = 296, - U64VEC4 = 297, - VEC2 = 298, - VEC3 = 299, - VEC4 = 300, - MAT2 = 301, - MAT3 = 302, - MAT4 = 303, - CENTROID = 304, - IN = 305, - OUT = 306, - INOUT = 307, - UNIFORM = 308, - PATCH = 309, - SAMPLE = 310, - BUFFER = 311, - SHARED = 312, - COHERENT = 313, - VOLATILE = 314, - RESTRICT = 315, - READONLY = 316, - WRITEONLY = 317, - DVEC2 = 318, - DVEC3 = 319, - DVEC4 = 320, - DMAT2 = 321, - DMAT3 = 322, - DMAT4 = 323, - F16VEC2 = 324, - F16VEC3 = 325, - F16VEC4 = 326, - F16MAT2 = 327, - F16MAT3 = 328, - F16MAT4 = 329, - I16VEC2 = 330, - I16VEC3 = 331, - I16VEC4 = 332, - U16VEC2 = 333, - U16VEC3 = 334, - U16VEC4 = 335, - NOPERSPECTIVE = 336, - FLAT = 337, - SMOOTH = 338, - LAYOUT = 339, - __EXPLICITINTERPAMD = 340, - MAT2X2 = 341, - MAT2X3 = 342, - MAT2X4 = 343, - MAT3X2 = 344, - MAT3X3 = 345, - MAT3X4 = 346, - MAT4X2 = 347, - MAT4X3 = 348, - MAT4X4 = 349, - DMAT2X2 = 350, - DMAT2X3 = 351, - DMAT2X4 = 352, - DMAT3X2 = 353, - DMAT3X3 = 354, - DMAT3X4 = 355, - DMAT4X2 = 356, - DMAT4X3 = 357, - DMAT4X4 = 358, - F16MAT2X2 = 359, - F16MAT2X3 = 360, - F16MAT2X4 = 361, - F16MAT3X2 = 362, - F16MAT3X3 = 363, - F16MAT3X4 = 364, - F16MAT4X2 = 365, - F16MAT4X3 = 366, - F16MAT4X4 = 367, - ATOMIC_UINT = 368, - SAMPLER1D = 369, - SAMPLER2D = 370, - SAMPLER3D = 371, - SAMPLERCUBE = 372, - SAMPLER1DSHADOW = 373, - SAMPLER2DSHADOW = 374, - SAMPLERCUBESHADOW = 375, - SAMPLER1DARRAY = 376, - SAMPLER2DARRAY = 377, - SAMPLER1DARRAYSHADOW = 378, - SAMPLER2DARRAYSHADOW = 379, - ISAMPLER1D = 380, - ISAMPLER2D = 381, - ISAMPLER3D = 382, - ISAMPLERCUBE = 383, - ISAMPLER1DARRAY = 384, - ISAMPLER2DARRAY = 385, - USAMPLER1D = 386, - USAMPLER2D = 387, - USAMPLER3D = 388, - USAMPLERCUBE = 389, - USAMPLER1DARRAY = 390, - USAMPLER2DARRAY = 391, - SAMPLER2DRECT = 392, - SAMPLER2DRECTSHADOW = 393, - ISAMPLER2DRECT = 394, - USAMPLER2DRECT = 395, - SAMPLERBUFFER = 396, - ISAMPLERBUFFER = 397, - USAMPLERBUFFER = 398, - SAMPLERCUBEARRAY = 399, - SAMPLERCUBEARRAYSHADOW = 400, - ISAMPLERCUBEARRAY = 401, - USAMPLERCUBEARRAY = 402, - SAMPLER2DMS = 403, - ISAMPLER2DMS = 404, - USAMPLER2DMS = 405, - SAMPLER2DMSARRAY = 406, - ISAMPLER2DMSARRAY = 407, - USAMPLER2DMSARRAY = 408, - SAMPLEREXTERNALOES = 409, - SAMPLER = 410, - SAMPLERSHADOW = 411, - TEXTURE1D = 412, - TEXTURE2D = 413, - TEXTURE3D = 414, - TEXTURECUBE = 415, - TEXTURE1DARRAY = 416, - TEXTURE2DARRAY = 417, - ITEXTURE1D = 418, - ITEXTURE2D = 419, - ITEXTURE3D = 420, - ITEXTURECUBE = 421, - ITEXTURE1DARRAY = 422, - ITEXTURE2DARRAY = 423, - UTEXTURE1D = 424, - UTEXTURE2D = 425, - UTEXTURE3D = 426, - UTEXTURECUBE = 427, - UTEXTURE1DARRAY = 428, - UTEXTURE2DARRAY = 429, - TEXTURE2DRECT = 430, - ITEXTURE2DRECT = 431, - UTEXTURE2DRECT = 432, - TEXTUREBUFFER = 433, - ITEXTUREBUFFER = 434, - UTEXTUREBUFFER = 435, - TEXTURECUBEARRAY = 436, - ITEXTURECUBEARRAY = 437, - UTEXTURECUBEARRAY = 438, - TEXTURE2DMS = 439, - ITEXTURE2DMS = 440, - UTEXTURE2DMS = 441, - TEXTURE2DMSARRAY = 442, - ITEXTURE2DMSARRAY = 443, - UTEXTURE2DMSARRAY = 444, - SUBPASSINPUT = 445, - SUBPASSINPUTMS = 446, - ISUBPASSINPUT = 447, - ISUBPASSINPUTMS = 448, - USUBPASSINPUT = 449, - USUBPASSINPUTMS = 450, - IMAGE1D = 451, - IIMAGE1D = 452, - UIMAGE1D = 453, - IMAGE2D = 454, - IIMAGE2D = 455, - UIMAGE2D = 456, - IMAGE3D = 457, - IIMAGE3D = 458, - UIMAGE3D = 459, - IMAGE2DRECT = 460, - IIMAGE2DRECT = 461, - UIMAGE2DRECT = 462, - IMAGECUBE = 463, - IIMAGECUBE = 464, - UIMAGECUBE = 465, - IMAGEBUFFER = 466, - IIMAGEBUFFER = 467, - UIMAGEBUFFER = 468, - IMAGE1DARRAY = 469, - IIMAGE1DARRAY = 470, - UIMAGE1DARRAY = 471, - IMAGE2DARRAY = 472, - IIMAGE2DARRAY = 473, - UIMAGE2DARRAY = 474, - IMAGECUBEARRAY = 475, - IIMAGECUBEARRAY = 476, - UIMAGECUBEARRAY = 477, - IMAGE2DMS = 478, - IIMAGE2DMS = 479, - UIMAGE2DMS = 480, - IMAGE2DMSARRAY = 481, - IIMAGE2DMSARRAY = 482, - UIMAGE2DMSARRAY = 483, - STRUCT = 484, - VOID = 485, - WHILE = 486, - IDENTIFIER = 487, - TYPE_NAME = 488, - FLOATCONSTANT = 489, - DOUBLECONSTANT = 490, - INTCONSTANT = 491, - UINTCONSTANT = 492, - INT64CONSTANT = 493, - UINT64CONSTANT = 494, - INT16CONSTANT = 495, - UINT16CONSTANT = 496, - BOOLCONSTANT = 497, - FLOAT16CONSTANT = 498, - LEFT_OP = 499, - RIGHT_OP = 500, - INC_OP = 501, - DEC_OP = 502, - LE_OP = 503, - GE_OP = 504, - EQ_OP = 505, - NE_OP = 506, - AND_OP = 507, - OR_OP = 508, - XOR_OP = 509, - MUL_ASSIGN = 510, - DIV_ASSIGN = 511, - ADD_ASSIGN = 512, - MOD_ASSIGN = 513, - LEFT_ASSIGN = 514, - RIGHT_ASSIGN = 515, - AND_ASSIGN = 516, - XOR_ASSIGN = 517, - OR_ASSIGN = 518, - SUB_ASSIGN = 519, - LEFT_PAREN = 520, - RIGHT_PAREN = 521, - LEFT_BRACKET = 522, - RIGHT_BRACKET = 523, - LEFT_BRACE = 524, - RIGHT_BRACE = 525, - DOT = 526, - COMMA = 527, - COLON = 528, - EQUAL = 529, - SEMICOLON = 530, - BANG = 531, - DASH = 532, - TILDE = 533, - PLUS = 534, - STAR = 535, - SLASH = 536, - PERCENT = 537, - LEFT_ANGLE = 538, - RIGHT_ANGLE = 539, - VERTICAL_BAR = 540, - CARET = 541, - AMPERSAND = 542, - QUESTION = 543, - INVARIANT = 544, - PRECISE = 545, - HIGH_PRECISION = 546, - MEDIUM_PRECISION = 547, - LOW_PRECISION = 548, - PRECISION = 549, - PACKED = 550, - RESOURCE = 551, - SUPERP = 552 + FLOAT64_T = 264, + CONST = 265, + BOOL = 266, + INT = 267, + UINT = 268, + INT64_T = 269, + UINT64_T = 270, + INT32_T = 271, + UINT32_T = 272, + INT16_T = 273, + UINT16_T = 274, + INT8_T = 275, + UINT8_T = 276, + BREAK = 277, + CONTINUE = 278, + DO = 279, + ELSE = 280, + FOR = 281, + IF = 282, + DISCARD = 283, + RETURN = 284, + SWITCH = 285, + CASE = 286, + DEFAULT = 287, + SUBROUTINE = 288, + BVEC2 = 289, + BVEC3 = 290, + BVEC4 = 291, + IVEC2 = 292, + IVEC3 = 293, + IVEC4 = 294, + UVEC2 = 295, + UVEC3 = 296, + UVEC4 = 297, + I64VEC2 = 298, + I64VEC3 = 299, + I64VEC4 = 300, + U64VEC2 = 301, + U64VEC3 = 302, + U64VEC4 = 303, + I32VEC2 = 304, + I32VEC3 = 305, + I32VEC4 = 306, + U32VEC2 = 307, + U32VEC3 = 308, + U32VEC4 = 309, + I16VEC2 = 310, + I16VEC3 = 311, + I16VEC4 = 312, + U16VEC2 = 313, + U16VEC3 = 314, + U16VEC4 = 315, + I8VEC2 = 316, + I8VEC3 = 317, + I8VEC4 = 318, + U8VEC2 = 319, + U8VEC3 = 320, + U8VEC4 = 321, + VEC2 = 322, + VEC3 = 323, + VEC4 = 324, + MAT2 = 325, + MAT3 = 326, + MAT4 = 327, + CENTROID = 328, + IN = 329, + OUT = 330, + INOUT = 331, + UNIFORM = 332, + PATCH = 333, + SAMPLE = 334, + BUFFER = 335, + SHARED = 336, + NONUNIFORM = 337, + COHERENT = 338, + VOLATILE = 339, + RESTRICT = 340, + READONLY = 341, + WRITEONLY = 342, + DVEC2 = 343, + DVEC3 = 344, + DVEC4 = 345, + DMAT2 = 346, + DMAT3 = 347, + DMAT4 = 348, + F16VEC2 = 349, + F16VEC3 = 350, + F16VEC4 = 351, + F16MAT2 = 352, + F16MAT3 = 353, + F16MAT4 = 354, + F32VEC2 = 355, + F32VEC3 = 356, + F32VEC4 = 357, + F32MAT2 = 358, + F32MAT3 = 359, + F32MAT4 = 360, + F64VEC2 = 361, + F64VEC3 = 362, + F64VEC4 = 363, + F64MAT2 = 364, + F64MAT3 = 365, + F64MAT4 = 366, + NOPERSPECTIVE = 367, + FLAT = 368, + SMOOTH = 369, + LAYOUT = 370, + __EXPLICITINTERPAMD = 371, + MAT2X2 = 372, + MAT2X3 = 373, + MAT2X4 = 374, + MAT3X2 = 375, + MAT3X3 = 376, + MAT3X4 = 377, + MAT4X2 = 378, + MAT4X3 = 379, + MAT4X4 = 380, + DMAT2X2 = 381, + DMAT2X3 = 382, + DMAT2X4 = 383, + DMAT3X2 = 384, + DMAT3X3 = 385, + DMAT3X4 = 386, + DMAT4X2 = 387, + DMAT4X3 = 388, + DMAT4X4 = 389, + F16MAT2X2 = 390, + F16MAT2X3 = 391, + F16MAT2X4 = 392, + F16MAT3X2 = 393, + F16MAT3X3 = 394, + F16MAT3X4 = 395, + F16MAT4X2 = 396, + F16MAT4X3 = 397, + F16MAT4X4 = 398, + F32MAT2X2 = 399, + F32MAT2X3 = 400, + F32MAT2X4 = 401, + F32MAT3X2 = 402, + F32MAT3X3 = 403, + F32MAT3X4 = 404, + F32MAT4X2 = 405, + F32MAT4X3 = 406, + F32MAT4X4 = 407, + F64MAT2X2 = 408, + F64MAT2X3 = 409, + F64MAT2X4 = 410, + F64MAT3X2 = 411, + F64MAT3X3 = 412, + F64MAT3X4 = 413, + F64MAT4X2 = 414, + F64MAT4X3 = 415, + F64MAT4X4 = 416, + ATOMIC_UINT = 417, + SAMPLER1D = 418, + SAMPLER2D = 419, + SAMPLER3D = 420, + SAMPLERCUBE = 421, + SAMPLER1DSHADOW = 422, + SAMPLER2DSHADOW = 423, + SAMPLERCUBESHADOW = 424, + SAMPLER1DARRAY = 425, + SAMPLER2DARRAY = 426, + SAMPLER1DARRAYSHADOW = 427, + SAMPLER2DARRAYSHADOW = 428, + ISAMPLER1D = 429, + ISAMPLER2D = 430, + ISAMPLER3D = 431, + ISAMPLERCUBE = 432, + ISAMPLER1DARRAY = 433, + ISAMPLER2DARRAY = 434, + USAMPLER1D = 435, + USAMPLER2D = 436, + USAMPLER3D = 437, + USAMPLERCUBE = 438, + USAMPLER1DARRAY = 439, + USAMPLER2DARRAY = 440, + SAMPLER2DRECT = 441, + SAMPLER2DRECTSHADOW = 442, + ISAMPLER2DRECT = 443, + USAMPLER2DRECT = 444, + SAMPLERBUFFER = 445, + ISAMPLERBUFFER = 446, + USAMPLERBUFFER = 447, + SAMPLERCUBEARRAY = 448, + SAMPLERCUBEARRAYSHADOW = 449, + ISAMPLERCUBEARRAY = 450, + USAMPLERCUBEARRAY = 451, + SAMPLER2DMS = 452, + ISAMPLER2DMS = 453, + USAMPLER2DMS = 454, + SAMPLER2DMSARRAY = 455, + ISAMPLER2DMSARRAY = 456, + USAMPLER2DMSARRAY = 457, + SAMPLEREXTERNALOES = 458, + F16SAMPLER1D = 459, + F16SAMPLER2D = 460, + F16SAMPLER3D = 461, + F16SAMPLER2DRECT = 462, + F16SAMPLERCUBE = 463, + F16SAMPLER1DARRAY = 464, + F16SAMPLER2DARRAY = 465, + F16SAMPLERCUBEARRAY = 466, + F16SAMPLERBUFFER = 467, + F16SAMPLER2DMS = 468, + F16SAMPLER2DMSARRAY = 469, + F16SAMPLER1DSHADOW = 470, + F16SAMPLER2DSHADOW = 471, + F16SAMPLER1DARRAYSHADOW = 472, + F16SAMPLER2DARRAYSHADOW = 473, + F16SAMPLER2DRECTSHADOW = 474, + F16SAMPLERCUBESHADOW = 475, + F16SAMPLERCUBEARRAYSHADOW = 476, + SAMPLER = 477, + SAMPLERSHADOW = 478, + TEXTURE1D = 479, + TEXTURE2D = 480, + TEXTURE3D = 481, + TEXTURECUBE = 482, + TEXTURE1DARRAY = 483, + TEXTURE2DARRAY = 484, + ITEXTURE1D = 485, + ITEXTURE2D = 486, + ITEXTURE3D = 487, + ITEXTURECUBE = 488, + ITEXTURE1DARRAY = 489, + ITEXTURE2DARRAY = 490, + UTEXTURE1D = 491, + UTEXTURE2D = 492, + UTEXTURE3D = 493, + UTEXTURECUBE = 494, + UTEXTURE1DARRAY = 495, + UTEXTURE2DARRAY = 496, + TEXTURE2DRECT = 497, + ITEXTURE2DRECT = 498, + UTEXTURE2DRECT = 499, + TEXTUREBUFFER = 500, + ITEXTUREBUFFER = 501, + UTEXTUREBUFFER = 502, + TEXTURECUBEARRAY = 503, + ITEXTURECUBEARRAY = 504, + UTEXTURECUBEARRAY = 505, + TEXTURE2DMS = 506, + ITEXTURE2DMS = 507, + UTEXTURE2DMS = 508, + TEXTURE2DMSARRAY = 509, + ITEXTURE2DMSARRAY = 510, + UTEXTURE2DMSARRAY = 511, + F16TEXTURE1D = 512, + F16TEXTURE2D = 513, + F16TEXTURE3D = 514, + F16TEXTURE2DRECT = 515, + F16TEXTURECUBE = 516, + F16TEXTURE1DARRAY = 517, + F16TEXTURE2DARRAY = 518, + F16TEXTURECUBEARRAY = 519, + F16TEXTUREBUFFER = 520, + F16TEXTURE2DMS = 521, + F16TEXTURE2DMSARRAY = 522, + SUBPASSINPUT = 523, + SUBPASSINPUTMS = 524, + ISUBPASSINPUT = 525, + ISUBPASSINPUTMS = 526, + USUBPASSINPUT = 527, + USUBPASSINPUTMS = 528, + F16SUBPASSINPUT = 529, + F16SUBPASSINPUTMS = 530, + IMAGE1D = 531, + IIMAGE1D = 532, + UIMAGE1D = 533, + IMAGE2D = 534, + IIMAGE2D = 535, + UIMAGE2D = 536, + IMAGE3D = 537, + IIMAGE3D = 538, + UIMAGE3D = 539, + IMAGE2DRECT = 540, + IIMAGE2DRECT = 541, + UIMAGE2DRECT = 542, + IMAGECUBE = 543, + IIMAGECUBE = 544, + UIMAGECUBE = 545, + IMAGEBUFFER = 546, + IIMAGEBUFFER = 547, + UIMAGEBUFFER = 548, + IMAGE1DARRAY = 549, + IIMAGE1DARRAY = 550, + UIMAGE1DARRAY = 551, + IMAGE2DARRAY = 552, + IIMAGE2DARRAY = 553, + UIMAGE2DARRAY = 554, + IMAGECUBEARRAY = 555, + IIMAGECUBEARRAY = 556, + UIMAGECUBEARRAY = 557, + IMAGE2DMS = 558, + IIMAGE2DMS = 559, + UIMAGE2DMS = 560, + IMAGE2DMSARRAY = 561, + IIMAGE2DMSARRAY = 562, + UIMAGE2DMSARRAY = 563, + F16IMAGE1D = 564, + F16IMAGE2D = 565, + F16IMAGE3D = 566, + F16IMAGE2DRECT = 567, + F16IMAGECUBE = 568, + F16IMAGE1DARRAY = 569, + F16IMAGE2DARRAY = 570, + F16IMAGECUBEARRAY = 571, + F16IMAGEBUFFER = 572, + F16IMAGE2DMS = 573, + F16IMAGE2DMSARRAY = 574, + STRUCT = 575, + VOID = 576, + WHILE = 577, + IDENTIFIER = 578, + TYPE_NAME = 579, + FLOATCONSTANT = 580, + DOUBLECONSTANT = 581, + INT16CONSTANT = 582, + UINT16CONSTANT = 583, + INT32CONSTANT = 584, + UINT32CONSTANT = 585, + INTCONSTANT = 586, + UINTCONSTANT = 587, + INT64CONSTANT = 588, + UINT64CONSTANT = 589, + BOOLCONSTANT = 590, + FLOAT16CONSTANT = 591, + LEFT_OP = 592, + RIGHT_OP = 593, + INC_OP = 594, + DEC_OP = 595, + LE_OP = 596, + GE_OP = 597, + EQ_OP = 598, + NE_OP = 599, + AND_OP = 600, + OR_OP = 601, + XOR_OP = 602, + MUL_ASSIGN = 603, + DIV_ASSIGN = 604, + ADD_ASSIGN = 605, + MOD_ASSIGN = 606, + LEFT_ASSIGN = 607, + RIGHT_ASSIGN = 608, + AND_ASSIGN = 609, + XOR_ASSIGN = 610, + OR_ASSIGN = 611, + SUB_ASSIGN = 612, + LEFT_PAREN = 613, + RIGHT_PAREN = 614, + LEFT_BRACKET = 615, + RIGHT_BRACKET = 616, + LEFT_BRACE = 617, + RIGHT_BRACE = 618, + DOT = 619, + COMMA = 620, + COLON = 621, + EQUAL = 622, + SEMICOLON = 623, + BANG = 624, + DASH = 625, + TILDE = 626, + PLUS = 627, + STAR = 628, + SLASH = 629, + PERCENT = 630, + LEFT_ANGLE = 631, + RIGHT_ANGLE = 632, + VERTICAL_BAR = 633, + CARET = 634, + AMPERSAND = 635, + QUESTION = 636, + INVARIANT = 637, + PRECISE = 638, + HIGH_PRECISION = 639, + MEDIUM_PRECISION = 640, + LOW_PRECISION = 641, + PRECISION = 642, + PACKED = 643, + RESOURCE = 644, + SUPERP = 645 }; #endif @@ -426,7 +519,7 @@ typedef union YYSTYPE YYSTYPE; union YYSTYPE { -#line 69 "MachineIndependent/glslang.y" /* yacc.c:355 */ +#line 70 "MachineIndependent/glslang.y" /* yacc.c:355 */ struct { glslang::TSourceLoc loc; @@ -461,7 +554,7 @@ }; } interm; -#line 465 "MachineIndependent/glslang_tab.cpp" /* yacc.c:355 */ +#line 558 "MachineIndependent/glslang_tab.cpp" /* yacc.c:355 */ }; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 @@ -474,7 +567,7 @@ #endif /* !YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED */ /* Copy the second part of user declarations. */ -#line 104 "MachineIndependent/glslang.y" /* yacc.c:358 */ +#line 105 "MachineIndependent/glslang.y" /* yacc.c:358 */ /* windows only pragma */ @@ -490,7 +583,7 @@ extern int yylex(YYSTYPE*, TParseContext&); -#line 494 "MachineIndependent/glslang_tab.cpp" /* yacc.c:358 */ +#line 587 "MachineIndependent/glslang_tab.cpp" /* yacc.c:358 */ #ifdef short # undef short @@ -711,23 +804,23 @@ #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 274 +#define YYFINAL 366 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 6633 +#define YYLAST 8949 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 298 +#define YYNTOKENS 391 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 106 +#define YYNNTS 107 /* YYNRULES -- Number of rules. */ -#define YYNRULES 461 +#define YYNRULES 556 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 601 +#define YYNSTATES 697 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 552 +#define YYMAXUTOK 645 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -791,60 +884,78 @@ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297 + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 257, 257, 263, 266, 269, 273, 277, 281, 287, - 293, 296, 300, 306, 309, 317, 320, 323, 326, 329, - 334, 342, 349, 356, 362, 366, 373, 376, 382, 389, - 399, 407, 412, 442, 448, 452, 456, 476, 477, 478, - 479, 485, 486, 491, 496, 505, 506, 511, 519, 520, - 526, 535, 536, 541, 546, 551, 559, 560, 568, 579, - 580, 589, 590, 599, 600, 609, 610, 618, 619, 627, - 628, 636, 637, 637, 655, 656, 671, 675, 679, 683, - 688, 692, 696, 700, 704, 708, 712, 719, 722, 733, - 740, 745, 750, 758, 762, 766, 770, 775, 780, 789, - 789, 800, 804, 811, 818, 821, 828, 836, 856, 879, - 894, 917, 928, 938, 948, 958, 967, 970, 974, 978, - 983, 991, 996, 1001, 1006, 1011, 1020, 1031, 1058, 1067, - 1074, 1081, 1088, 1100, 1106, 1109, 1116, 1120, 1124, 1132, - 1141, 1144, 1155, 1158, 1161, 1165, 1169, 1173, 1180, 1184, - 1196, 1210, 1215, 1221, 1227, 1234, 1240, 1245, 1250, 1255, - 1263, 1267, 1271, 1275, 1279, 1283, 1289, 1298, 1301, 1309, - 1313, 1322, 1327, 1335, 1339, 1349, 1353, 1357, 1362, 1369, - 1373, 1378, 1383, 1388, 1395, 1402, 1406, 1411, 1416, 1421, - 1427, 1433, 1439, 1447, 1455, 1463, 1468, 1473, 1478, 1483, - 1488, 1493, 1499, 1505, 1511, 1519, 1527, 1535, 1541, 1547, - 1553, 1559, 1565, 1571, 1579, 1587, 1595, 1600, 1605, 1610, - 1615, 1620, 1625, 1630, 1635, 1640, 1645, 1650, 1655, 1661, - 1667, 1673, 1679, 1685, 1691, 1697, 1703, 1709, 1715, 1721, - 1727, 1735, 1743, 1751, 1759, 1767, 1775, 1783, 1791, 1799, - 1807, 1815, 1823, 1828, 1833, 1838, 1843, 1848, 1853, 1858, - 1863, 1868, 1873, 1878, 1883, 1888, 1893, 1898, 1903, 1908, - 1913, 1918, 1923, 1928, 1933, 1938, 1943, 1948, 1953, 1958, - 1963, 1968, 1973, 1978, 1983, 1988, 1993, 1998, 2003, 2008, - 2013, 2018, 2023, 2028, 2033, 2038, 2043, 2048, 2053, 2058, - 2063, 2068, 2073, 2078, 2083, 2088, 2093, 2098, 2103, 2108, - 2113, 2118, 2123, 2128, 2133, 2138, 2143, 2148, 2153, 2158, - 2163, 2168, 2173, 2178, 2183, 2188, 2193, 2198, 2203, 2208, - 2213, 2218, 2223, 2228, 2233, 2238, 2243, 2248, 2253, 2258, - 2263, 2268, 2273, 2278, 2283, 2288, 2293, 2298, 2303, 2308, - 2313, 2318, 2323, 2328, 2333, 2338, 2343, 2348, 2353, 2358, - 2363, 2368, 2374, 2380, 2386, 2392, 2398, 2404, 2410, 2415, - 2431, 2436, 2441, 2449, 2449, 2460, 2460, 2470, 2473, 2486, - 2504, 2528, 2532, 2538, 2543, 2554, 2557, 2563, 2572, 2575, - 2581, 2585, 2586, 2592, 2593, 2594, 2595, 2596, 2597, 2598, - 2602, 2603, 2607, 2603, 2619, 2620, 2624, 2624, 2631, 2631, - 2645, 2648, 2656, 2664, 2675, 2676, 2680, 2683, 2689, 2696, - 2700, 2708, 2712, 2725, 2728, 2734, 2734, 2754, 2757, 2763, - 2775, 2787, 2790, 2796, 2796, 2811, 2811, 2827, 2827, 2848, - 2851, 2857, 2860, 2866, 2870, 2877, 2882, 2887, 2894, 2897, - 2906, 2910, 2919, 2922, 2925, 2933, 2933, 2955, 2961, 2964, - 2969, 2972 + 0, 293, 293, 299, 302, 306, 310, 313, 317, 321, + 325, 329, 333, 336, 340, 344, 347, 355, 358, 361, + 364, 367, 372, 380, 387, 394, 400, 404, 411, 414, + 420, 427, 437, 445, 450, 477, 485, 491, 495, 499, + 519, 520, 521, 522, 528, 529, 534, 539, 548, 549, + 554, 562, 563, 569, 578, 579, 584, 589, 594, 602, + 603, 611, 622, 623, 632, 633, 642, 643, 652, 653, + 661, 662, 670, 671, 679, 680, 680, 698, 699, 714, + 718, 722, 726, 731, 735, 739, 743, 747, 751, 755, + 762, 765, 776, 783, 788, 793, 801, 805, 809, 813, + 818, 823, 832, 832, 843, 847, 854, 861, 864, 871, + 879, 899, 922, 937, 962, 973, 983, 993, 1003, 1012, + 1015, 1019, 1023, 1028, 1036, 1041, 1046, 1051, 1056, 1065, + 1076, 1103, 1112, 1119, 1126, 1137, 1149, 1155, 1158, 1165, + 1169, 1173, 1181, 1190, 1193, 1204, 1207, 1210, 1214, 1218, + 1222, 1226, 1232, 1236, 1248, 1262, 1267, 1273, 1279, 1286, + 1292, 1297, 1302, 1307, 1315, 1319, 1323, 1327, 1331, 1335, + 1341, 1350, 1357, 1360, 1368, 1372, 1381, 1386, 1394, 1398, + 1408, 1412, 1416, 1421, 1426, 1431, 1436, 1440, 1445, 1450, + 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1489, 1494, 1499, + 1504, 1510, 1516, 1522, 1528, 1534, 1540, 1546, 1552, 1558, + 1564, 1570, 1576, 1581, 1586, 1591, 1596, 1601, 1606, 1612, + 1618, 1624, 1630, 1636, 1642, 1648, 1654, 1660, 1666, 1672, + 1678, 1684, 1690, 1696, 1702, 1708, 1714, 1720, 1726, 1732, + 1738, 1744, 1750, 1756, 1762, 1768, 1773, 1778, 1783, 1788, + 1793, 1798, 1803, 1808, 1813, 1818, 1823, 1828, 1834, 1840, + 1846, 1852, 1858, 1864, 1870, 1876, 1882, 1888, 1894, 1900, + 1906, 1912, 1918, 1924, 1930, 1936, 1942, 1948, 1954, 1960, + 1966, 1972, 1978, 1984, 1990, 1996, 2002, 2008, 2014, 2020, + 2026, 2032, 2038, 2044, 2050, 2056, 2062, 2068, 2074, 2080, + 2086, 2092, 2098, 2104, 2110, 2116, 2121, 2126, 2131, 2136, + 2141, 2146, 2151, 2156, 2161, 2166, 2171, 2176, 2181, 2186, + 2194, 2202, 2210, 2218, 2226, 2234, 2242, 2250, 2258, 2266, + 2274, 2282, 2290, 2295, 2300, 2305, 2310, 2315, 2320, 2325, + 2330, 2335, 2340, 2345, 2350, 2355, 2360, 2365, 2370, 2378, + 2386, 2391, 2396, 2401, 2409, 2414, 2419, 2424, 2432, 2437, + 2442, 2447, 2455, 2460, 2465, 2470, 2475, 2480, 2488, 2493, + 2501, 2506, 2514, 2519, 2527, 2532, 2540, 2545, 2553, 2558, + 2566, 2571, 2576, 2581, 2586, 2591, 2596, 2601, 2606, 2611, + 2616, 2621, 2626, 2631, 2636, 2641, 2649, 2654, 2659, 2664, + 2672, 2677, 2682, 2687, 2695, 2700, 2705, 2710, 2718, 2723, + 2728, 2733, 2741, 2746, 2751, 2756, 2764, 2769, 2774, 2779, + 2787, 2792, 2797, 2802, 2810, 2815, 2820, 2825, 2833, 2838, + 2843, 2848, 2856, 2861, 2866, 2871, 2879, 2884, 2889, 2894, + 2902, 2907, 2912, 2917, 2925, 2930, 2935, 2940, 2948, 2953, + 2958, 2963, 2971, 2976, 2981, 2987, 2993, 2999, 3008, 3017, + 3023, 3029, 3035, 3041, 3046, 3062, 3067, 3072, 3080, 3080, + 3091, 3091, 3101, 3104, 3117, 3139, 3166, 3170, 3176, 3181, + 3192, 3195, 3201, 3210, 3213, 3219, 3223, 3224, 3230, 3231, + 3232, 3233, 3234, 3235, 3236, 3240, 3241, 3245, 3241, 3257, + 3258, 3262, 3262, 3269, 3269, 3283, 3286, 3294, 3302, 3313, + 3314, 3318, 3321, 3327, 3334, 3338, 3346, 3350, 3363, 3366, + 3372, 3372, 3392, 3395, 3401, 3413, 3425, 3428, 3434, 3434, + 3449, 3449, 3465, 3465, 3486, 3489, 3495, 3498, 3504, 3508, + 3515, 3520, 3525, 3532, 3535, 3544, 3548, 3557, 3560, 3563, + 3571, 3571, 3593, 3599, 3602, 3607, 3610 }; #endif @@ -853,25 +964,34 @@ First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { - "$end", "error", "$undefined", "ATTRIBUTE", "VARYING", "CONST", "BOOL", - "FLOAT", "DOUBLE", "INT", "UINT", "INT64_T", "UINT64_T", "INT16_T", - "UINT16_T", "FLOAT16_T", "BREAK", "CONTINUE", "DO", "ELSE", "FOR", "IF", - "DISCARD", "RETURN", "SWITCH", "CASE", "DEFAULT", "SUBROUTINE", "BVEC2", - "BVEC3", "BVEC4", "IVEC2", "IVEC3", "IVEC4", "I64VEC2", "I64VEC3", - "I64VEC4", "UVEC2", "UVEC3", "UVEC4", "U64VEC2", "U64VEC3", "U64VEC4", - "VEC2", "VEC3", "VEC4", "MAT2", "MAT3", "MAT4", "CENTROID", "IN", "OUT", - "INOUT", "UNIFORM", "PATCH", "SAMPLE", "BUFFER", "SHARED", "COHERENT", - "VOLATILE", "RESTRICT", "READONLY", "WRITEONLY", "DVEC2", "DVEC3", - "DVEC4", "DMAT2", "DMAT3", "DMAT4", "F16VEC2", "F16VEC3", "F16VEC4", - "F16MAT2", "F16MAT3", "F16MAT4", "I16VEC2", "I16VEC3", "I16VEC4", - "U16VEC2", "U16VEC3", "U16VEC4", "NOPERSPECTIVE", "FLAT", "SMOOTH", - "LAYOUT", "__EXPLICITINTERPAMD", "MAT2X2", "MAT2X3", "MAT2X4", "MAT3X2", - "MAT3X3", "MAT3X4", "MAT4X2", "MAT4X3", "MAT4X4", "DMAT2X2", "DMAT2X3", - "DMAT2X4", "DMAT3X2", "DMAT3X3", "DMAT3X4", "DMAT4X2", "DMAT4X3", - "DMAT4X4", "F16MAT2X2", "F16MAT2X3", "F16MAT2X4", "F16MAT3X2", - "F16MAT3X3", "F16MAT3X4", "F16MAT4X2", "F16MAT4X3", "F16MAT4X4", - "ATOMIC_UINT", "SAMPLER1D", "SAMPLER2D", "SAMPLER3D", "SAMPLERCUBE", - "SAMPLER1DSHADOW", "SAMPLER2DSHADOW", "SAMPLERCUBESHADOW", + "$end", "error", "$undefined", "ATTRIBUTE", "VARYING", "FLOAT16_T", + "FLOAT", "FLOAT32_T", "DOUBLE", "FLOAT64_T", "CONST", "BOOL", "INT", + "UINT", "INT64_T", "UINT64_T", "INT32_T", "UINT32_T", "INT16_T", + "UINT16_T", "INT8_T", "UINT8_T", "BREAK", "CONTINUE", "DO", "ELSE", + "FOR", "IF", "DISCARD", "RETURN", "SWITCH", "CASE", "DEFAULT", + "SUBROUTINE", "BVEC2", "BVEC3", "BVEC4", "IVEC2", "IVEC3", "IVEC4", + "UVEC2", "UVEC3", "UVEC4", "I64VEC2", "I64VEC3", "I64VEC4", "U64VEC2", + "U64VEC3", "U64VEC4", "I32VEC2", "I32VEC3", "I32VEC4", "U32VEC2", + "U32VEC3", "U32VEC4", "I16VEC2", "I16VEC3", "I16VEC4", "U16VEC2", + "U16VEC3", "U16VEC4", "I8VEC2", "I8VEC3", "I8VEC4", "U8VEC2", "U8VEC3", + "U8VEC4", "VEC2", "VEC3", "VEC4", "MAT2", "MAT3", "MAT4", "CENTROID", + "IN", "OUT", "INOUT", "UNIFORM", "PATCH", "SAMPLE", "BUFFER", "SHARED", + "NONUNIFORM", "COHERENT", "VOLATILE", "RESTRICT", "READONLY", + "WRITEONLY", "DVEC2", "DVEC3", "DVEC4", "DMAT2", "DMAT3", "DMAT4", + "F16VEC2", "F16VEC3", "F16VEC4", "F16MAT2", "F16MAT3", "F16MAT4", + "F32VEC2", "F32VEC3", "F32VEC4", "F32MAT2", "F32MAT3", "F32MAT4", + "F64VEC2", "F64VEC3", "F64VEC4", "F64MAT2", "F64MAT3", "F64MAT4", + "NOPERSPECTIVE", "FLAT", "SMOOTH", "LAYOUT", "__EXPLICITINTERPAMD", + "MAT2X2", "MAT2X3", "MAT2X4", "MAT3X2", "MAT3X3", "MAT3X4", "MAT4X2", + "MAT4X3", "MAT4X4", "DMAT2X2", "DMAT2X3", "DMAT2X4", "DMAT3X2", + "DMAT3X3", "DMAT3X4", "DMAT4X2", "DMAT4X3", "DMAT4X4", "F16MAT2X2", + "F16MAT2X3", "F16MAT2X4", "F16MAT3X2", "F16MAT3X3", "F16MAT3X4", + "F16MAT4X2", "F16MAT4X3", "F16MAT4X4", "F32MAT2X2", "F32MAT2X3", + "F32MAT2X4", "F32MAT3X2", "F32MAT3X3", "F32MAT3X4", "F32MAT4X2", + "F32MAT4X3", "F32MAT4X4", "F64MAT2X2", "F64MAT2X3", "F64MAT2X4", + "F64MAT3X2", "F64MAT3X3", "F64MAT3X4", "F64MAT4X2", "F64MAT4X3", + "F64MAT4X4", "ATOMIC_UINT", "SAMPLER1D", "SAMPLER2D", "SAMPLER3D", + "SAMPLERCUBE", "SAMPLER1DSHADOW", "SAMPLER2DSHADOW", "SAMPLERCUBESHADOW", "SAMPLER1DARRAY", "SAMPLER2DARRAY", "SAMPLER1DARRAYSHADOW", "SAMPLER2DARRAYSHADOW", "ISAMPLER1D", "ISAMPLER2D", "ISAMPLER3D", "ISAMPLERCUBE", "ISAMPLER1DARRAY", "ISAMPLER2DARRAY", "USAMPLER1D", @@ -881,27 +1001,41 @@ "USAMPLERBUFFER", "SAMPLERCUBEARRAY", "SAMPLERCUBEARRAYSHADOW", "ISAMPLERCUBEARRAY", "USAMPLERCUBEARRAY", "SAMPLER2DMS", "ISAMPLER2DMS", "USAMPLER2DMS", "SAMPLER2DMSARRAY", "ISAMPLER2DMSARRAY", - "USAMPLER2DMSARRAY", "SAMPLEREXTERNALOES", "SAMPLER", "SAMPLERSHADOW", - "TEXTURE1D", "TEXTURE2D", "TEXTURE3D", "TEXTURECUBE", "TEXTURE1DARRAY", - "TEXTURE2DARRAY", "ITEXTURE1D", "ITEXTURE2D", "ITEXTURE3D", - "ITEXTURECUBE", "ITEXTURE1DARRAY", "ITEXTURE2DARRAY", "UTEXTURE1D", - "UTEXTURE2D", "UTEXTURE3D", "UTEXTURECUBE", "UTEXTURE1DARRAY", - "UTEXTURE2DARRAY", "TEXTURE2DRECT", "ITEXTURE2DRECT", "UTEXTURE2DRECT", - "TEXTUREBUFFER", "ITEXTUREBUFFER", "UTEXTUREBUFFER", "TEXTURECUBEARRAY", - "ITEXTURECUBEARRAY", "UTEXTURECUBEARRAY", "TEXTURE2DMS", "ITEXTURE2DMS", - "UTEXTURE2DMS", "TEXTURE2DMSARRAY", "ITEXTURE2DMSARRAY", - "UTEXTURE2DMSARRAY", "SUBPASSINPUT", "SUBPASSINPUTMS", "ISUBPASSINPUT", - "ISUBPASSINPUTMS", "USUBPASSINPUT", "USUBPASSINPUTMS", "IMAGE1D", - "IIMAGE1D", "UIMAGE1D", "IMAGE2D", "IIMAGE2D", "UIMAGE2D", "IMAGE3D", - "IIMAGE3D", "UIMAGE3D", "IMAGE2DRECT", "IIMAGE2DRECT", "UIMAGE2DRECT", - "IMAGECUBE", "IIMAGECUBE", "UIMAGECUBE", "IMAGEBUFFER", "IIMAGEBUFFER", - "UIMAGEBUFFER", "IMAGE1DARRAY", "IIMAGE1DARRAY", "UIMAGE1DARRAY", - "IMAGE2DARRAY", "IIMAGE2DARRAY", "UIMAGE2DARRAY", "IMAGECUBEARRAY", - "IIMAGECUBEARRAY", "UIMAGECUBEARRAY", "IMAGE2DMS", "IIMAGE2DMS", - "UIMAGE2DMS", "IMAGE2DMSARRAY", "IIMAGE2DMSARRAY", "UIMAGE2DMSARRAY", - "STRUCT", "VOID", "WHILE", "IDENTIFIER", "TYPE_NAME", "FLOATCONSTANT", - "DOUBLECONSTANT", "INTCONSTANT", "UINTCONSTANT", "INT64CONSTANT", - "UINT64CONSTANT", "INT16CONSTANT", "UINT16CONSTANT", "BOOLCONSTANT", + "USAMPLER2DMSARRAY", "SAMPLEREXTERNALOES", "F16SAMPLER1D", + "F16SAMPLER2D", "F16SAMPLER3D", "F16SAMPLER2DRECT", "F16SAMPLERCUBE", + "F16SAMPLER1DARRAY", "F16SAMPLER2DARRAY", "F16SAMPLERCUBEARRAY", + "F16SAMPLERBUFFER", "F16SAMPLER2DMS", "F16SAMPLER2DMSARRAY", + "F16SAMPLER1DSHADOW", "F16SAMPLER2DSHADOW", "F16SAMPLER1DARRAYSHADOW", + "F16SAMPLER2DARRAYSHADOW", "F16SAMPLER2DRECTSHADOW", + "F16SAMPLERCUBESHADOW", "F16SAMPLERCUBEARRAYSHADOW", "SAMPLER", + "SAMPLERSHADOW", "TEXTURE1D", "TEXTURE2D", "TEXTURE3D", "TEXTURECUBE", + "TEXTURE1DARRAY", "TEXTURE2DARRAY", "ITEXTURE1D", "ITEXTURE2D", + "ITEXTURE3D", "ITEXTURECUBE", "ITEXTURE1DARRAY", "ITEXTURE2DARRAY", + "UTEXTURE1D", "UTEXTURE2D", "UTEXTURE3D", "UTEXTURECUBE", + "UTEXTURE1DARRAY", "UTEXTURE2DARRAY", "TEXTURE2DRECT", "ITEXTURE2DRECT", + "UTEXTURE2DRECT", "TEXTUREBUFFER", "ITEXTUREBUFFER", "UTEXTUREBUFFER", + "TEXTURECUBEARRAY", "ITEXTURECUBEARRAY", "UTEXTURECUBEARRAY", + "TEXTURE2DMS", "ITEXTURE2DMS", "UTEXTURE2DMS", "TEXTURE2DMSARRAY", + "ITEXTURE2DMSARRAY", "UTEXTURE2DMSARRAY", "F16TEXTURE1D", "F16TEXTURE2D", + "F16TEXTURE3D", "F16TEXTURE2DRECT", "F16TEXTURECUBE", + "F16TEXTURE1DARRAY", "F16TEXTURE2DARRAY", "F16TEXTURECUBEARRAY", + "F16TEXTUREBUFFER", "F16TEXTURE2DMS", "F16TEXTURE2DMSARRAY", + "SUBPASSINPUT", "SUBPASSINPUTMS", "ISUBPASSINPUT", "ISUBPASSINPUTMS", + "USUBPASSINPUT", "USUBPASSINPUTMS", "F16SUBPASSINPUT", + "F16SUBPASSINPUTMS", "IMAGE1D", "IIMAGE1D", "UIMAGE1D", "IMAGE2D", + "IIMAGE2D", "UIMAGE2D", "IMAGE3D", "IIMAGE3D", "UIMAGE3D", "IMAGE2DRECT", + "IIMAGE2DRECT", "UIMAGE2DRECT", "IMAGECUBE", "IIMAGECUBE", "UIMAGECUBE", + "IMAGEBUFFER", "IIMAGEBUFFER", "UIMAGEBUFFER", "IMAGE1DARRAY", + "IIMAGE1DARRAY", "UIMAGE1DARRAY", "IMAGE2DARRAY", "IIMAGE2DARRAY", + "UIMAGE2DARRAY", "IMAGECUBEARRAY", "IIMAGECUBEARRAY", "UIMAGECUBEARRAY", + "IMAGE2DMS", "IIMAGE2DMS", "UIMAGE2DMS", "IMAGE2DMSARRAY", + "IIMAGE2DMSARRAY", "UIMAGE2DMSARRAY", "F16IMAGE1D", "F16IMAGE2D", + "F16IMAGE3D", "F16IMAGE2DRECT", "F16IMAGECUBE", "F16IMAGE1DARRAY", + "F16IMAGE2DARRAY", "F16IMAGECUBEARRAY", "F16IMAGEBUFFER", "F16IMAGE2DMS", + "F16IMAGE2DMSARRAY", "STRUCT", "VOID", "WHILE", "IDENTIFIER", + "TYPE_NAME", "FLOATCONSTANT", "DOUBLECONSTANT", "INT16CONSTANT", + "UINT16CONSTANT", "INT32CONSTANT", "UINT32CONSTANT", "INTCONSTANT", + "UINTCONSTANT", "INT64CONSTANT", "UINT64CONSTANT", "BOOLCONSTANT", "FLOAT16CONSTANT", "LEFT_OP", "RIGHT_OP", "INC_OP", "DEC_OP", "LE_OP", "GE_OP", "EQ_OP", "NE_OP", "AND_OP", "OR_OP", "XOR_OP", "MUL_ASSIGN", "DIV_ASSIGN", "ADD_ASSIGN", "MOD_ASSIGN", "LEFT_ASSIGN", "RIGHT_ASSIGN", @@ -931,11 +1065,12 @@ "fully_specified_type", "invariant_qualifier", "interpolation_qualifier", "layout_qualifier", "layout_qualifier_id_list", "layout_qualifier_id", "precise_qualifier", "type_qualifier", "single_type_qualifier", - "storage_qualifier", "type_name_list", "type_specifier", - "array_specifier", "type_specifier_nonarray", "precision_qualifier", - "struct_specifier", "$@3", "$@4", "struct_declaration_list", - "struct_declaration", "struct_declarator_list", "struct_declarator", - "initializer", "initializer_list", "declaration_statement", "statement", + "storage_qualifier", "non_uniform_qualifier", "type_name_list", + "type_specifier", "array_specifier", "type_specifier_nonarray", + "precision_qualifier", "struct_specifier", "$@3", "$@4", + "struct_declaration_list", "struct_declaration", + "struct_declarator_list", "struct_declarator", "initializer", + "initializer_list", "declaration_statement", "statement", "simple_statement", "compound_statement", "$@5", "$@6", "statement_no_new_scope", "statement_scoped", "$@7", "$@8", "compound_statement_no_new_scope", "statement_list", @@ -985,16 +1120,26 @@ 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 552 + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645 }; # endif -#define YYPACT_NINF -542 +#define YYPACT_NINF -634 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-542))) + (!!((Yystate) == (-634))) -#define YYTABLE_NINF -407 +#define YYTABLE_NINF -502 #define yytable_value_is_error(Yytable_value) \ 0 @@ -1003,67 +1148,76 @@ STATE-NUM. */ static const yytype_int16 yypact[] = { - 2638, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -204, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -186, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -542, -542, -214, -542, -542, -542, - -542, -542, -542, -542, -542, -149, -542, -216, -237, -177, - -174, 4279, -210, -542, -119, -542, -542, -542, -542, 3202, - -542, -542, -542, -141, -542, -542, 594, -542, -542, -93, - -45, -85, -542, 6400, -233, -542, -542, -79, -542, 4279, - -542, -542, -542, 4279, -54, -41, -542, -180, -176, -542, - -542, -542, 4784, -73, -542, -542, -542, -175, -542, -78, - -165, -542, -542, 4279, -80, -542, -224, 886, -542, -542, - -542, -542, -141, -221, -542, 5058, -184, -542, -34, -542, - -172, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, 5880, 5880, 5880, -542, -542, -542, -542, -542, - -542, -542, -207, -542, -542, -542, -67, -164, 6140, -65, - -542, 5880, -133, -102, -197, -227, -120, -86, -84, -82, - -48, -49, -236, -61, -542, 5332, -542, -24, 5880, -542, - -45, 4279, 4279, -23, 3475, -542, -542, -542, -64, -63, - -542, -55, -52, -60, 5606, -51, 5880, -57, -46, -44, - -43, -542, -542, -188, -542, -542, -155, -542, -237, -40, - -542, -542, -542, -542, 1178, -542, -542, -542, -542, -542, - -542, -542, -542, -542, -11, -73, 5058, -179, 5058, -542, - -542, 5058, 4279, -542, -10, -542, -542, -542, -161, -542, - -542, 5880, -8, -542, -542, 5880, -38, -542, -542, -542, - 5880, 5880, 5880, 5880, 5880, 5880, 5880, 5880, 5880, 5880, - 5880, 5880, 5880, 5880, 5880, 5880, 5880, 5880, 5880, -542, - -542, -542, -47, -542, -542, -542, -542, 3743, -23, -141, - -148, -542, -542, -542, -542, -542, 1470, -542, 5880, -542, - -542, -135, 5880, -127, -542, -542, -6, -542, 1470, -542, - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - 5880, 5880, -542, -542, -542, -542, -542, -542, -542, 5058, - -542, -91, -542, 4011, -542, -542, -39, -42, -542, -542, - -542, -542, -542, -133, -133, -102, -102, -197, -197, -197, - -197, -227, -227, -120, -86, -84, -82, -48, -49, 5880, - -542, -542, -134, -73, -23, -542, 2, 2346, -156, -542, - -154, -542, 2911, -31, -245, -542, 1470, -542, -542, -542, - -542, 4510, -542, -542, -122, -542, -542, -30, -542, -542, - 2911, -33, -542, -42, 9, 4279, -28, 5880, -26, -6, - -27, -542, -542, 5880, 5880, -542, -35, -22, 226, -21, - 2054, -542, -18, -19, 1762, -9, -542, -542, -542, -542, - -151, 5880, 1762, -33, -542, -542, 1470, 5058, -542, -542, - -542, -542, -17, -42, -542, -542, 1470, -14, -542, -542, - -542 + 3391, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -311, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -295, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, -634, -301, -634, -634, + -634, -634, -634, -634, -634, -634, -241, -634, -302, -342, + -290, -254, 5696, -300, -634, -210, -634, -634, -634, -634, + 4160, -634, -634, -634, -634, -219, -634, -634, 696, -634, + -634, -189, -69, -207, -634, 8625, -320, -634, -634, -203, + -634, 5696, -634, -634, -634, 5696, -155, -154, -634, -324, + -288, -634, -634, -634, 6417, -190, -634, -634, -634, -292, + -634, -196, -287, -634, -634, 5696, -195, -634, -306, 1081, + -634, -634, -634, -634, -219, -325, -634, 6785, -310, -634, + -151, -634, -277, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, 7889, 7889, 7889, -634, + -634, -634, -634, -634, -634, -634, -309, -634, -634, -634, + -185, -283, 8257, -183, -634, 7889, -227, -263, -299, -318, + -194, -204, -202, -200, -165, -166, -321, -179, -634, -634, + 7153, -634, -140, 7889, -634, -69, 5696, 5696, -139, 4544, + -634, -634, -634, -182, -180, -634, -173, -169, -178, 7521, + -164, 7889, -174, -163, -167, -162, -634, -634, -252, -634, + -634, -237, -634, -342, -161, -158, -634, -634, -634, -634, + 1466, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -19, -190, 6785, -296, 6785, -634, -634, 6785, 5696, -634, + -127, -634, -634, -634, -278, -634, -634, 7889, -121, -634, + -634, 7889, -156, -634, -634, -634, 7889, 7889, 7889, 7889, + 7889, 7889, 7889, 7889, 7889, 7889, 7889, 7889, 7889, 7889, + 7889, 7889, 7889, 7889, 7889, -634, -634, -634, -157, -634, + -634, -634, -634, 4928, -139, -219, -236, -634, -634, -634, + -634, -634, 1851, -634, 7889, -634, -634, -230, 7889, -213, + -634, -634, -118, -634, 1851, -634, -634, -634, -634, -634, + -634, -634, -634, -634, -634, -634, 7889, 7889, -634, -634, + -634, -634, -634, -634, -634, 6785, -634, -270, -634, 5312, + -634, -634, -153, -150, -634, -634, -634, -634, -634, -227, + -227, -263, -263, -299, -299, -299, -299, -318, -318, -194, + -204, -202, -200, -165, -166, 7889, -634, -634, -226, -190, + -139, -634, -113, 3006, -275, -634, -253, -634, 3776, -148, + -282, -634, 1851, -634, -634, -634, -634, 6049, -634, -634, + -208, -634, -634, -147, -634, -634, 3776, -146, -634, -150, + -111, 5696, -145, 7889, -144, -118, -143, -634, -634, 7889, + 7889, -634, -149, -141, 196, -136, 2621, -634, -116, -120, + 2236, -137, -634, -634, -634, -634, -239, 7889, 2236, -146, + -634, -634, 1851, 6785, -634, -634, -634, -634, -119, -150, + -634, -634, 1851, -112, -634, -634, -634 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1071,99 +1225,108 @@ means the default is an error. */ static const yytype_uint16 yydefact[] = { - 0, 149, 150, 148, 185, 176, 177, 179, 180, 181, - 182, 183, 184, 178, 165, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 207, 208, 209, 210, 211, 212, - 186, 187, 188, 216, 217, 218, 154, 152, 153, 151, - 157, 155, 156, 158, 159, 160, 161, 162, 163, 164, - 189, 190, 191, 228, 229, 230, 192, 193, 194, 240, - 241, 242, 204, 205, 206, 213, 214, 215, 131, 130, - 129, 0, 132, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 266, 267, 268, 269, 270, 271, 273, 274, - 275, 276, 277, 278, 280, 281, 282, 283, 284, 285, - 286, 264, 265, 272, 279, 287, 288, 289, 290, 291, - 292, 361, 293, 294, 295, 296, 297, 298, 299, 300, - 302, 303, 304, 305, 306, 307, 309, 310, 311, 312, - 313, 314, 316, 317, 318, 319, 320, 321, 301, 308, - 315, 322, 323, 324, 325, 326, 327, 362, 363, 364, - 365, 366, 367, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 0, 175, 369, 454, - 128, 139, 370, 371, 372, 0, 453, 0, 455, 0, - 105, 104, 0, 116, 121, 146, 145, 143, 147, 0, - 140, 142, 126, 169, 144, 368, 0, 450, 452, 0, - 0, 0, 375, 0, 0, 93, 90, 0, 103, 0, - 112, 106, 114, 0, 115, 0, 91, 122, 0, 96, - 141, 127, 0, 170, 1, 451, 167, 0, 138, 136, - 0, 134, 373, 0, 0, 94, 0, 0, 456, 107, - 111, 113, 109, 117, 108, 0, 123, 99, 0, 97, - 0, 2, 10, 11, 4, 5, 6, 7, 8, 9, - 13, 12, 0, 0, 0, 171, 39, 38, 40, 37, - 3, 15, 33, 17, 22, 23, 0, 0, 27, 0, - 41, 0, 45, 48, 51, 56, 59, 61, 63, 65, - 67, 69, 71, 0, 31, 0, 166, 0, 0, 133, - 0, 0, 0, 0, 0, 377, 92, 95, 0, 0, - 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 401, 410, 414, 41, 74, 87, 0, 390, 0, 126, - 393, 412, 392, 391, 0, 394, 395, 416, 396, 423, - 397, 398, 431, 399, 0, 110, 0, 118, 0, 385, - 125, 0, 0, 101, 0, 98, 34, 35, 0, 19, - 20, 0, 0, 25, 24, 0, 175, 28, 30, 36, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, - 172, 173, 0, 168, 89, 137, 135, 0, 0, 383, - 0, 381, 376, 378, 446, 445, 0, 437, 0, 449, - 447, 0, 0, 0, 430, 433, 0, 400, 0, 77, - 78, 80, 79, 82, 83, 84, 85, 86, 81, 76, - 0, 0, 415, 411, 413, 417, 424, 432, 120, 0, - 388, 0, 124, 0, 102, 14, 0, 21, 18, 29, - 42, 43, 44, 47, 46, 49, 50, 54, 55, 52, - 53, 57, 58, 60, 62, 64, 66, 68, 70, 0, - 174, 374, 0, 384, 0, 379, 0, 0, 0, 448, - 0, 429, 0, 460, 0, 458, 402, 75, 88, 119, - 386, 0, 100, 16, 0, 380, 382, 0, 440, 439, - 442, 408, 425, 421, 0, 0, 0, 0, 0, 0, - 0, 387, 389, 0, 0, 441, 0, 0, 420, 0, - 0, 418, 0, 0, 0, 0, 457, 459, 403, 73, - 0, 443, 0, 408, 407, 409, 427, 0, 405, 434, - 404, 461, 0, 444, 438, 419, 428, 0, 422, 436, - 426 + 0, 153, 154, 183, 181, 184, 182, 185, 152, 196, + 186, 187, 194, 195, 192, 193, 190, 191, 188, 189, + 169, 212, 213, 214, 215, 216, 217, 230, 231, 232, + 227, 228, 229, 242, 243, 244, 224, 225, 226, 239, + 240, 241, 221, 222, 223, 236, 237, 238, 218, 219, + 220, 233, 234, 235, 197, 198, 199, 245, 246, 247, + 158, 156, 157, 155, 161, 159, 160, 162, 163, 171, + 164, 165, 166, 167, 168, 200, 201, 202, 257, 258, + 259, 203, 204, 205, 269, 270, 271, 206, 207, 208, + 281, 282, 283, 209, 210, 211, 293, 294, 295, 134, + 133, 132, 0, 135, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 332, 333, 334, 335, 336, 337, 339, 340, 341, + 342, 343, 344, 346, 347, 350, 351, 352, 354, 355, + 317, 318, 338, 345, 356, 358, 359, 360, 362, 363, + 454, 319, 320, 321, 348, 322, 326, 327, 330, 353, + 357, 361, 323, 324, 328, 329, 349, 325, 331, 364, + 365, 366, 368, 370, 372, 374, 376, 380, 381, 382, + 383, 384, 385, 387, 388, 389, 390, 391, 392, 394, + 396, 397, 398, 400, 401, 378, 386, 393, 402, 404, + 405, 406, 408, 409, 367, 369, 371, 395, 373, 375, + 377, 379, 399, 403, 407, 455, 456, 459, 460, 461, + 462, 457, 458, 410, 412, 413, 414, 416, 417, 418, + 420, 421, 422, 424, 425, 426, 428, 429, 430, 432, + 433, 434, 436, 437, 438, 440, 441, 442, 444, 445, + 446, 448, 449, 450, 452, 453, 411, 415, 419, 423, + 427, 435, 439, 443, 431, 447, 451, 0, 180, 464, + 549, 131, 142, 465, 466, 467, 0, 548, 0, 550, + 0, 108, 107, 0, 119, 124, 149, 148, 146, 150, + 0, 143, 145, 151, 129, 174, 147, 463, 0, 545, + 547, 0, 0, 0, 470, 0, 0, 96, 93, 0, + 106, 0, 115, 109, 117, 0, 118, 0, 94, 125, + 0, 99, 144, 130, 0, 175, 1, 546, 172, 0, + 141, 139, 0, 137, 468, 0, 0, 97, 0, 0, + 551, 110, 114, 116, 112, 120, 111, 0, 126, 102, + 0, 100, 0, 2, 12, 13, 10, 11, 4, 5, + 6, 7, 8, 9, 15, 14, 0, 0, 0, 176, + 42, 41, 43, 40, 3, 17, 36, 19, 24, 25, + 0, 0, 29, 0, 44, 0, 48, 51, 54, 59, + 62, 64, 66, 68, 70, 72, 74, 0, 35, 33, + 0, 170, 0, 0, 136, 0, 0, 0, 0, 0, + 472, 95, 98, 0, 0, 530, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 496, 505, 509, 44, 77, + 90, 0, 485, 0, 151, 129, 488, 507, 487, 486, + 0, 489, 490, 511, 491, 518, 492, 493, 526, 494, + 0, 113, 0, 121, 0, 480, 128, 0, 0, 104, + 0, 101, 37, 38, 0, 21, 22, 0, 0, 27, + 26, 0, 180, 30, 32, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 75, 177, 178, 0, 173, + 92, 140, 138, 0, 0, 478, 0, 476, 471, 473, + 541, 540, 0, 532, 0, 544, 542, 0, 0, 0, + 525, 528, 0, 495, 0, 80, 81, 83, 82, 85, + 86, 87, 88, 89, 84, 79, 0, 0, 510, 506, + 508, 512, 519, 527, 123, 0, 483, 0, 127, 0, + 105, 16, 0, 23, 20, 31, 45, 46, 47, 50, + 49, 52, 53, 57, 58, 55, 56, 60, 61, 63, + 65, 67, 69, 71, 73, 0, 179, 469, 0, 479, + 0, 474, 0, 0, 0, 543, 0, 524, 0, 555, + 0, 553, 497, 78, 91, 122, 481, 0, 103, 18, + 0, 475, 477, 0, 535, 534, 537, 503, 520, 516, + 0, 0, 0, 0, 0, 0, 0, 482, 484, 0, + 0, 536, 0, 0, 515, 0, 0, 513, 0, 0, + 0, 0, 552, 554, 498, 76, 0, 538, 0, 503, + 502, 504, 522, 0, 500, 529, 499, 556, 0, 539, + 533, 514, 523, 0, 517, 531, 521 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -542, -542, -542, -542, -542, -542, -542, -542, -542, -542, - -542, -542, -268, -542, -241, -240, -294, -239, -173, -187, - -170, -169, -171, -168, -542, -267, -542, -292, -542, -282, - -296, 6, -542, -542, -542, 8, -542, -542, -542, -1, - 10, 11, -542, -542, -513, -542, -542, -542, -542, -77, - -542, -229, -238, -542, -542, 0, -243, -542, 47, -542, - -542, -542, -336, -319, -167, -249, -370, -542, -251, -364, - -541, -291, -542, -542, -305, -304, -542, -542, 23, -454, - -242, -542, -110, -542, -264, -542, -106, -542, -542, -542, - -542, -103, -542, -542, -542, -542, -542, -542, -542, -542, - 46, -542, -542, -542, -542, -266 + -634, -634, -634, -634, -634, -634, -634, -634, -634, -634, + -634, -634, -289, -634, -358, -355, -401, -364, -279, -307, + -276, -280, -273, -281, -634, -354, -634, -378, -634, -367, + -397, 1, -634, -634, -634, 2, -634, -634, -634, -98, + -93, -92, -634, -634, -600, -634, -634, -634, -634, -181, + -634, -319, -326, -634, 6, -634, 0, -332, -634, -54, + -634, -634, -634, -428, -433, -272, -353, -477, -634, -357, + -467, -633, -400, -634, -634, -410, -408, -634, -634, -80, + -545, -350, -634, -216, -634, -371, -634, -214, -634, -634, + -634, -634, -212, -634, -634, -634, -634, -634, -634, -634, + -634, -61, -634, -634, -634, -634, -375 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 320, 321, 322, 496, 323, 324, 325, 326, 327, - 328, 329, 373, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 374, 519, 375, 480, 376, - 445, 377, 227, 402, 300, 378, 229, 230, 231, 260, - 261, 262, 232, 233, 234, 235, 236, 237, 280, 281, - 238, 239, 240, 241, 277, 344, 273, 243, 244, 245, - 351, 283, 354, 355, 450, 451, 400, 491, 380, 381, - 382, 383, 468, 560, 589, 568, 569, 570, 590, 384, - 385, 386, 387, 571, 556, 388, 389, 572, 597, 390, - 391, 392, 532, 456, 527, 550, 566, 567, 393, 246, - 247, 248, 257, 394, 534, 535 + -1, 414, 415, 416, 592, 417, 418, 419, 420, 421, + 422, 423, 468, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 469, 615, 470, 576, 471, + 541, 472, 318, 498, 392, 473, 320, 321, 322, 352, + 353, 354, 323, 324, 325, 326, 327, 328, 372, 373, + 329, 330, 331, 332, 438, 369, 439, 365, 335, 336, + 337, 446, 375, 449, 450, 546, 547, 496, 587, 476, + 477, 478, 479, 564, 656, 685, 664, 665, 666, 686, + 480, 481, 482, 483, 667, 652, 484, 485, 668, 693, + 486, 487, 488, 628, 552, 623, 646, 662, 663, 489, + 338, 339, 340, 349, 490, 630, 631 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1171,98 +1334,79 @@ number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 242, 270, 263, 399, 330, 343, 226, 360, 228, 361, - 362, 286, 278, 365, 536, 447, 254, 438, 251, 554, - 484, 427, 428, 558, 296, 270, 488, 559, 490, 585, - 263, 492, 408, 588, 272, 453, 417, 554, 256, 409, - 410, 588, 285, 345, 406, 407, 272, 425, 426, 395, - 397, 357, 439, 396, 352, 252, 429, 430, -32, 255, - 411, 249, 265, 419, 412, 266, 493, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 330, 442, 250, - 330, 444, 461, 345, 463, 294, 479, 272, 345, 258, - 401, 346, 526, 297, 295, 489, 298, 347, 259, 299, - 404, 349, 414, 405, 399, 495, 399, 350, 415, 399, - 551, 481, 552, 267, 270, 592, 481, 481, 481, 539, - 482, 481, 352, 499, 524, 352, 272, 525, 453, 497, - 431, 432, 596, 507, 508, 509, 510, 481, 524, 276, - 529, 545, 222, 223, 224, 481, 531, 420, 421, 422, - 481, 563, 500, 501, 502, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 562, 484, 352, 453, 423, 528, 424, 292, 540, - 530, 541, 503, 504, 282, 505, 506, 279, 537, 538, - 287, 293, 511, 512, 345, 356, 348, 399, 403, 413, - 418, 433, 434, 435, 436, 437, 523, 440, 443, 449, - 457, 454, 455, 458, 462, 459, 464, 598, 352, 465, - 368, 520, 494, 466, 498, -31, 533, 467, -26, 543, - 481, 264, 484, 547, 557, 564, -406, 544, 574, 271, - 581, 573, 576, 578, 582, 583, 242, 514, 370, 399, - 553, 586, 226, 284, 228, 587, 600, 591, 599, 264, - 513, 575, 290, 264, 352, 515, 517, 516, 553, 289, - 518, 579, 253, 446, 291, 546, 548, 594, 584, 595, - 288, 522, 580, 353, 485, 549, 565, 379, 486, 330, - 444, 487, 275, 577, 0, 399, 0, 0, 0, 593, - 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 270, 0, 0, - 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 353, 448, 0, 353, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 379, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 353, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 353, 0, 0, - 0, 0, 0, 0, 0, 0, 379, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 379, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 353, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 379, 0, 0, - 0, 0, 379, 0, 0, 0, 379, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 379, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 379, 0, 0, 0, 379, 0, 0, 0, 0, 0, - 0, 0, 379, 0, 0, 0, 379, 0, 0, 0, - 0, 0, 0, 0, 274, 0, 379, 1, 2, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 334, 317, 319, 355, 362, 455, 333, 456, 457, 495, + 437, 460, 370, 580, 378, 584, 549, 586, 543, 632, + 588, 346, 343, 523, 524, 534, 348, 388, 650, 362, + 505, 506, 355, 681, 386, 364, 364, 684, 521, 522, + 364, 504, 492, 387, 513, 684, 650, 341, 377, -34, + 440, 507, 491, 493, 440, 508, 447, 497, 525, 526, + 535, 344, 452, 342, 440, 357, 347, 441, 358, 350, + 589, 585, 444, 442, 389, 424, 510, 390, 445, 654, + 391, 591, 511, 655, 647, 622, 538, 577, 500, 540, + 577, 501, 557, 636, 559, 637, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 648, 519, 635, 520, + 549, 351, 577, 359, 495, 575, 495, 502, 503, 495, + 688, 362, 603, 604, 605, 606, 577, 447, 577, 620, + 447, 578, 621, 595, 368, 577, 515, 692, 625, 620, + 593, 364, 641, 313, 314, 315, 516, 517, 518, 527, + 528, 424, 577, 627, 424, 374, 549, 577, 659, 379, + 658, 599, 600, 607, 608, 580, 601, 602, 384, 385, + 440, 443, 499, 451, 509, 514, 529, 530, 531, 447, + 532, 533, 536, 539, 545, 553, 550, 624, 551, 554, + 555, 626, 560, 562, 558, 561, 590, -35, 633, 634, + -33, 563, 594, -28, 616, 629, 694, 495, 639, 643, + 653, 660, 669, 619, 670, 577, -501, 672, 678, 677, + 674, 679, 687, 610, 447, 580, 465, 596, 597, 598, + 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, + 424, 424, 424, 424, 424, 424, 682, 683, 640, 695, + 609, 696, 612, 614, 371, 611, 671, 382, 381, 495, + 613, 649, 345, 383, 542, 680, 644, 642, 690, 380, + 447, 691, 618, 645, 581, 661, 582, 367, 583, 649, + 673, 675, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 676, 0, 0, 0, 0, 0, 540, + 0, 0, 0, 463, 0, 495, 0, 0, 0, 651, + 689, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 356, 0, 0, 362, 0, 651, 333, 0, + 363, 0, 0, 0, 0, 0, 333, 0, 334, 317, + 319, 0, 0, 0, 333, 376, 0, 0, 0, 0, + 0, 356, 0, 0, 0, 356, 0, 333, 0, 0, + 0, 333, 0, 0, 424, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 448, 0, 0, 0, 475, + 0, 333, 0, 0, 0, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 0, 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 220, 221, 222, 223, 224, 225, 1, + 0, 0, 0, 0, 0, 0, 448, 544, 0, 448, + 0, 0, 333, 333, 0, 333, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 475, 0, 0, 0, 0, 0, 474, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 448, 0, + 0, 0, 0, 0, 333, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 448, 0, 0, 0, 0, 0, 333, + 0, 0, 475, 0, 0, 0, 0, 0, 474, 0, + 0, 0, 0, 0, 475, 0, 0, 0, 0, 0, + 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 448, + 0, 0, 0, 0, 0, 333, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 475, 0, 0, 0, 0, 475, 474, + 0, 0, 475, 0, 474, 0, 0, 0, 474, 0, + 0, 0, 0, 0, 0, 0, 475, 0, 0, 0, + 0, 363, 474, 0, 0, 0, 0, 333, 0, 0, + 0, 0, 0, 0, 0, 0, 475, 0, 0, 0, + 475, 0, 474, 0, 0, 0, 474, 0, 475, 0, + 0, 0, 475, 0, 474, 0, 0, 0, 474, 0, + 0, 0, 475, 0, 0, 0, 366, 0, 474, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 358, 359, 360, 0, 361, 362, 363, 364, - 365, 366, 367, 14, 15, 16, 17, 18, 19, 20, + 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, @@ -1282,133 +1426,64 @@ 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 368, 301, 218, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 0, 0, 312, 313, 0, 0, 0, 0, 0, 0, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 0, 0, + 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 314, 0, 369, 0, 370, 371, 0, 0, 0, - 0, 372, 316, 317, 318, 319, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 220, 221, 222, 223, 224, - 225, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 358, 359, 360, 0, 361, 362, - 363, 364, 365, 366, 367, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 368, - 301, 218, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 0, 0, 312, 313, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 314, 0, 369, 0, 370, 483, 0, - 0, 0, 0, 372, 316, 317, 318, 319, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 220, 221, 222, - 223, 224, 225, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 358, 359, 360, 0, - 361, 362, 363, 364, 365, 366, 367, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 368, 301, 218, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 0, 0, 312, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 314, 0, 369, 0, 370, - 0, 0, 0, 0, 0, 372, 316, 317, 318, 319, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, - 221, 222, 223, 224, 225, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 358, 359, - 360, 0, 361, 362, 363, 364, 365, 366, 367, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 368, 301, 218, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 0, 0, 312, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 314, 0, 369, - 0, 287, 0, 0, 0, 0, 0, 372, 316, 317, - 318, 319, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 220, 221, 222, 223, 224, 225, 1, 2, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 358, 359, 360, 0, 361, 362, 363, 364, 365, 366, - 367, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 368, 301, 218, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 0, 0, - 312, 313, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 314, - 0, 369, 0, 0, 0, 0, 0, 0, 0, 372, - 316, 317, 318, 319, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 220, 221, 222, 223, 224, 225, 1, + 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 311, 312, + 313, 314, 315, 316, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 453, 454, 455, 0, 456, 457, 458, + 459, 460, 461, 462, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 463, 393, 309, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 0, 0, + 406, 407, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, + 0, 464, 0, 465, 466, 0, 0, 0, 0, 467, + 410, 411, 412, 413, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 311, 312, 313, 314, 315, 316, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, + 12, 13, 14, 15, 16, 17, 18, 19, 453, 454, + 455, 0, 456, 457, 458, 459, 460, 461, 462, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, @@ -1428,44 +1503,26 @@ 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 0, 301, 218, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 0, 0, 312, 313, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 314, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 372, 316, 317, 318, 319, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 220, 221, 222, 223, 224, - 225, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 0, - 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 219, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 220, 221, 222, - 223, 224, 225, 0, 0, 0, 0, 0, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 463, 393, + 309, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 0, 0, 406, 407, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 408, 0, 464, 0, 465, 579, + 0, 0, 0, 0, 467, 410, 411, 412, 413, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 311, 312, + 313, 314, 315, 316, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 453, 454, 455, 0, 456, 457, 458, + 459, 460, 461, 462, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, @@ -1485,97 +1542,64 @@ 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 0, 301, 218, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 0, 0, 312, 313, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 314, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 316, 317, 318, - 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 220, 221, 222, 223, 224, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 0, 268, 218, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 269, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 220, 221, 222, 223, 224, 0, 0, 0, 0, - 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 0, 0, 218, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 452, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, - 0, 0, 0, 0, 220, 221, 222, 223, 224, 0, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 0, 0, 218, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 521, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, - 0, 0, 220, 221, 222, 223, 224, 0, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 463, 393, 309, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 0, 0, + 406, 407, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, + 0, 464, 0, 465, 0, 0, 0, 0, 0, 467, + 410, 411, 412, 413, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 311, 312, 313, 314, 315, 316, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 453, 454, + 455, 0, 456, 457, 458, 459, 460, 461, 462, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 463, 393, + 309, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 0, 0, 406, 407, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 408, 0, 464, 0, 379, 0, + 0, 0, 0, 0, 467, 410, 411, 412, 413, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 311, 312, + 313, 314, 315, 316, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 453, 454, 455, 0, 456, 457, 458, + 459, 460, 461, 462, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, @@ -1595,42 +1619,146 @@ 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 0, 0, 218, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 463, 393, 309, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 0, 0, + 406, 407, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, + 0, 464, 0, 0, 0, 0, 0, 0, 0, 467, + 410, 411, 412, 413, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 311, 312, 313, 314, 315, 316, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 0, 393, + 309, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 0, 0, 406, 407, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 467, 410, 411, 412, 413, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 311, 312, + 313, 314, 315, 316, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 0, 0, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 542, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, - 220, 221, 222, 223, 224, 0, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 0, 0, 218, 0, 0, 0, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 220, 221, - 222, 223, 224, 50, 51, 52, 53, 54, 55, 56, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 310, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 311, 312, 313, 314, 315, 316, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 0, 393, + 309, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 0, 0, 406, 407, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 410, 411, 412, 413, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 311, 312, + 313, 314, 315, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 0, 0, 0, 0, 73, 74, 75, 76, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, @@ -1645,19 +1773,30 @@ 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 0, 301, 218, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 0, 0, 312, 313, 0, 0, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 0, 360, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 314, 0, 0, 0, 398, - 561, 0, 0, 0, 0, 0, 316, 317, 318, 319, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 361, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 311, 312, 313, 314, 315, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 50, 51, 52, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 0, 0, 0, 0, 0, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, @@ -1672,20 +1811,31 @@ 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 0, 301, 218, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 0, 0, - 312, 313, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 314, - 0, 0, 315, 0, 0, 0, 0, 0, 0, 0, - 316, 317, 318, 319, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 0, - 0, 0, 0, 0, 73, 74, 75, 76, 77, 78, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 0, 0, 309, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 548, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 311, 312, 313, 314, + 315, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, @@ -1699,20 +1849,31 @@ 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 0, - 301, 218, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 0, 0, 312, 313, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 314, 0, 0, 0, 398, 0, 0, - 0, 0, 0, 0, 316, 317, 318, 319, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 0, 0, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 617, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 311, 312, 313, 314, 315, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50, 51, 52, 53, 54, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 0, 0, 0, 0, 0, 73, 74, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, @@ -1727,20 +1888,31 @@ 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 0, 301, 218, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 0, 0, 312, 313, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 0, 0, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 314, 0, 0, - 441, 0, 0, 0, 0, 0, 0, 0, 316, 317, - 318, 319, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 15, 16, 17, 18, 19, 20, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 311, 312, 313, 314, 315, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 0, 0, 0, - 0, 0, 73, 74, 75, 76, 77, 78, 79, 80, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, @@ -1754,249 +1926,68 @@ 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 0, 301, 218, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 0, 0, 312, 313, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 314, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 460, 316, 317, 318, 319, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 0, 0, 0, 0, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 0, 301, 218, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 0, 0, 312, 313, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 314, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 316, 317, 318, 319, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 0, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 0, 0, + 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 0, 0, 0, 0, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 416, 0, 301, 218, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 0, 0, 312, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 314, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 316, 317, 318, 319, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 0, + 0, 0, 0, 0, 3, 4, 5, 6, 7, 0, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 0, 0, 0, 0, 0, 0, 0, 311, 312, + 313, 314, 315, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 0, 0, 0, 0, 0, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 0, 0, 0, 0, 0, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 0, 393, 309, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 0, 0, 406, 407, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, + 0, 494, 657, 0, 0, 0, 0, 0, 410, 411, + 412, 413, 3, 4, 5, 6, 7, 0, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 0, 0, 0, 0, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 0, 0, 218 -}; - -static const yytype_int16 yycheck[] = -{ - 0, 239, 231, 295, 272, 272, 0, 18, 0, 20, - 21, 254, 57, 24, 468, 351, 232, 253, 232, 532, - 384, 248, 249, 268, 267, 263, 396, 272, 398, 570, - 259, 401, 314, 574, 267, 354, 328, 550, 275, 246, - 247, 582, 275, 267, 312, 313, 267, 244, 245, 292, - 293, 275, 288, 274, 283, 269, 283, 284, 265, 275, - 267, 265, 272, 331, 271, 275, 402, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 345, 345, 265, - 348, 348, 364, 267, 366, 265, 274, 267, 267, 266, - 274, 266, 456, 269, 274, 274, 272, 272, 272, 275, - 272, 266, 266, 275, 396, 266, 398, 272, 272, 401, - 266, 272, 266, 232, 352, 266, 272, 272, 272, 489, - 275, 272, 351, 415, 272, 354, 267, 275, 447, 411, - 250, 251, 586, 427, 428, 429, 430, 272, 272, 232, - 275, 275, 291, 292, 293, 272, 273, 280, 281, 282, - 272, 273, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, - 438, 541, 536, 402, 493, 277, 458, 279, 232, 270, - 462, 272, 423, 424, 269, 425, 426, 232, 480, 481, - 269, 232, 431, 432, 267, 275, 274, 489, 232, 266, - 265, 287, 286, 285, 252, 254, 449, 268, 232, 232, - 265, 275, 275, 265, 265, 275, 273, 587, 447, 265, - 231, 268, 232, 267, 232, 265, 232, 270, 266, 268, - 272, 231, 596, 231, 265, 265, 269, 519, 266, 239, - 275, 232, 268, 270, 266, 19, 246, 434, 269, 541, - 532, 269, 246, 253, 246, 274, 270, 266, 275, 259, - 433, 557, 263, 263, 493, 435, 437, 436, 550, 259, - 438, 563, 225, 350, 263, 524, 527, 582, 569, 583, - 257, 448, 564, 283, 394, 527, 550, 287, 394, 557, - 557, 394, 246, 559, -1, 587, -1, -1, -1, 581, - -1, -1, -1, 532, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 555, -1, -1, - -1, 550, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 351, 352, -1, 354, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 384, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 402, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 447, -1, -1, - -1, -1, -1, -1, -1, -1, 456, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 468, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 493, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 527, -1, -1, - -1, -1, 532, -1, -1, -1, 536, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 550, -1, -1, -1, -1, 555, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 570, -1, -1, -1, 574, -1, -1, -1, -1, -1, - -1, -1, 582, -1, -1, -1, 586, -1, -1, -1, - -1, -1, -1, -1, 0, -1, 596, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, - 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, -1, -1, 233, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 275, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 289, 290, 291, 292, 293, 294, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, -1, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - -1, -1, 246, 247, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 265, -1, 267, -1, 269, 270, -1, -1, -1, - -1, 275, 276, 277, 278, 279, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 289, 290, 291, 292, 293, - 294, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, -1, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, -1, -1, 246, 247, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 265, -1, 267, -1, 269, 270, -1, - -1, -1, -1, 275, 276, 277, 278, 279, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 289, 290, 291, - 292, 293, 294, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, + 0, 0, 0, 0, 0, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 0, + 0, 0, 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, @@ -2010,22 +2001,140 @@ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, -1, -1, 246, 247, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 265, -1, 267, -1, 269, - -1, -1, -1, -1, -1, 275, 276, 277, 278, 279, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 289, - 290, 291, 292, 293, 294, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, -1, 20, 21, 22, 23, 24, 25, 26, 27, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 0, + 393, 309, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 0, 0, 406, 407, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 408, 0, 0, 409, 0, + 0, 0, 0, 0, 0, 0, 410, 411, 412, 413, + 3, 4, 5, 6, 7, 0, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, + 0, 0, 0, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 0, 0, 0, + 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 0, 393, 309, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 0, 0, 406, 407, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 408, 0, 0, 0, 494, 0, 0, + 0, 0, 0, 0, 410, 411, 412, 413, 3, 4, + 5, 6, 7, 0, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, + 0, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 0, 0, 0, 0, 0, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 0, 393, 309, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 0, 0, 406, 407, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 408, 0, 0, 537, 0, 0, 0, 0, 0, + 0, 0, 410, 411, 412, 413, 3, 4, 5, 6, + 7, 0, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 69, 0, 0, 0, 0, 0, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 0, 0, 0, 0, 0, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 0, 393, 309, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 0, 0, + 406, 407, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 556, + 410, 411, 412, 413, 3, 4, 5, 6, 7, 0, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 0, 0, 0, 0, 0, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 98, 0, 0, 0, 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, @@ -2039,44 +2148,164 @@ 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, -1, -1, 246, 247, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 0, 393, 309, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 0, 0, 406, 407, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 410, 411, + 412, 413, 3, 4, 5, 6, 7, 0, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, + 0, 0, 0, 0, 0, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 0, + 0, 0, 0, 0, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 512, 0, + 393, 309, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 0, 0, 406, 407, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 410, 411, 412, 413, + 3, 4, 5, 6, 7, 0, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 0, 0, 0, + 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 0, 0, 309 +}; + +static const yytype_int16 yycheck[] = +{ + 0, 0, 0, 322, 330, 24, 0, 26, 27, 387, + 364, 30, 81, 480, 346, 492, 449, 494, 446, 564, + 497, 323, 323, 341, 342, 346, 368, 359, 628, 355, + 339, 340, 351, 666, 358, 360, 360, 670, 337, 338, + 360, 408, 367, 367, 422, 678, 646, 358, 368, 358, + 360, 360, 384, 385, 360, 364, 375, 367, 376, 377, + 381, 362, 368, 358, 360, 365, 368, 359, 368, 359, + 498, 367, 359, 365, 362, 364, 359, 365, 365, 361, + 368, 359, 365, 365, 359, 552, 440, 365, 365, 443, + 365, 368, 459, 363, 461, 365, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 359, 370, 585, 372, + 543, 365, 365, 323, 492, 367, 494, 406, 407, 497, + 359, 447, 523, 524, 525, 526, 365, 446, 365, 365, + 449, 368, 368, 511, 323, 365, 425, 682, 368, 365, + 507, 360, 368, 384, 385, 386, 373, 374, 375, 343, + 344, 440, 365, 366, 443, 362, 589, 365, 366, 362, + 637, 519, 520, 527, 528, 632, 521, 522, 323, 323, + 360, 367, 323, 368, 359, 358, 380, 379, 378, 498, + 345, 347, 361, 323, 323, 358, 368, 554, 368, 358, + 368, 558, 366, 360, 358, 358, 323, 358, 576, 577, + 358, 363, 323, 359, 361, 323, 683, 585, 361, 322, + 358, 358, 323, 545, 359, 365, 362, 361, 359, 368, + 363, 25, 359, 530, 543, 692, 362, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 362, 367, 615, 368, + 529, 363, 532, 534, 323, 531, 653, 355, 351, 637, + 533, 628, 316, 355, 445, 665, 623, 620, 678, 349, + 589, 679, 544, 623, 490, 646, 490, 338, 490, 646, + 655, 659, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 660, -1, -1, -1, -1, -1, 653, + -1, -1, -1, 322, -1, 683, -1, -1, -1, 628, + 677, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 322, -1, -1, 651, -1, 646, 322, -1, + 330, -1, -1, -1, -1, -1, 330, -1, 338, 338, + 338, -1, -1, -1, 338, 345, -1, -1, -1, -1, + -1, 351, -1, -1, -1, 355, -1, 351, -1, -1, + -1, 355, -1, -1, 653, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 375, -1, -1, -1, 379, + -1, 375, -1, -1, -1, 379, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 265, -1, 267, - -1, 269, -1, -1, -1, -1, -1, 275, 276, 277, - 278, 279, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 289, 290, 291, 292, 293, 294, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, -1, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, - 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, 239, 240, 241, 242, 243, -1, -1, - 246, 247, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 265, - -1, 267, -1, -1, -1, -1, -1, -1, -1, 275, - 276, 277, 278, 279, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 289, 290, 291, 292, 293, 294, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 446, 447, -1, 449, + -1, -1, 446, 447, -1, 449, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 480, -1, -1, -1, -1, -1, 480, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 498, -1, + -1, -1, -1, -1, 498, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 543, -1, -1, -1, -1, -1, 543, + -1, -1, 552, -1, -1, -1, -1, -1, 552, -1, + -1, -1, -1, -1, 564, -1, -1, -1, -1, -1, + 564, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 589, + -1, -1, -1, -1, -1, 589, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 623, -1, -1, -1, -1, 628, 623, + -1, -1, 632, -1, 628, -1, -1, -1, 632, -1, + -1, -1, -1, -1, -1, -1, 646, -1, -1, -1, + -1, 651, 646, -1, -1, -1, -1, 651, -1, -1, + -1, -1, -1, -1, -1, -1, 666, -1, -1, -1, + 670, -1, 666, -1, -1, -1, 670, -1, 678, -1, + -1, -1, 682, -1, 678, -1, -1, -1, 682, -1, + -1, -1, 692, -1, -1, -1, 0, -1, 692, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 27, 28, 29, 30, 31, 32, 33, + 14, 15, 16, 17, 18, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, @@ -2096,43 +2325,25 @@ 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, -1, 232, 233, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - -1, -1, 246, 247, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 265, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 275, 276, 277, 278, 279, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 289, 290, 291, 292, 293, - 294, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, - -1, 233, -1, -1, -1, -1, -1, -1, -1, -1, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, -1, -1, + 324, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 275, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 289, 290, 291, - 292, 293, 294, -1, -1, -1, -1, -1, 27, 28, + -1, -1, -1, -1, 368, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 382, 383, + 384, 385, 386, 387, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, @@ -2153,99 +2364,220 @@ 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, -1, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, -1, -1, 246, 247, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 265, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 276, 277, 278, - 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 289, 290, 291, 292, 293, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, -1, 232, 233, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 275, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 289, 290, 291, 292, 293, -1, -1, -1, -1, - -1, -1, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, -1, -1, 233, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 270, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, -1, - -1, -1, -1, -1, 289, 290, 291, 292, 293, -1, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, -1, -1, 233, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 270, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, -1, -1, -1, - -1, -1, 289, 290, 291, 292, 293, -1, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, -1, -1, + 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 358, + -1, 360, -1, 362, 363, -1, -1, -1, -1, 368, + 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 382, 383, 384, 385, 386, 387, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, -1, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, -1, -1, 339, 340, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 358, -1, 360, -1, 362, 363, + -1, -1, -1, -1, 368, 369, 370, 371, 372, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 382, 383, + 384, 385, 386, 387, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, -1, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, -1, -1, + 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 358, + -1, 360, -1, 362, -1, -1, -1, -1, -1, 368, + 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 382, 383, 384, 385, 386, 387, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, -1, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, -1, -1, 339, 340, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 358, -1, 360, -1, 362, -1, + -1, -1, -1, -1, 368, 369, 370, 371, 372, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 382, 383, + 384, 385, 386, 387, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, -1, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, -1, -1, + 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 358, + -1, 360, -1, -1, -1, -1, -1, -1, -1, 368, + 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 382, 383, 384, 385, 386, 387, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, -1, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, -1, -1, 339, 340, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 358, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 368, 369, 370, 371, 372, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 382, 383, + 384, 385, 386, 387, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, @@ -2263,42 +2595,69 @@ 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, -1, -1, 233, -1, -1, -1, -1, -1, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, -1, -1, 324, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 270, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, - 289, 290, 291, 292, 293, -1, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - -1, -1, 233, -1, -1, -1, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 289, 290, - 291, 292, 293, 63, 64, 65, 66, 67, 68, 69, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 368, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 382, 383, 384, 385, 386, 387, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, -1, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, -1, -1, 339, 340, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 358, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 382, 383, + 384, 385, 386, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, -1, -1, -1, -1, -1, 86, 87, 88, 89, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, @@ -2313,19 +2672,30 @@ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, -1, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, -1, -1, 246, 247, -1, -1, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, -1, 323, 324, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 265, -1, -1, -1, 269, - 270, -1, -1, -1, -1, -1, 276, 277, 278, 279, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, + -1, -1, -1, -1, -1, -1, -1, -1, 368, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 382, 383, 384, 385, 386, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 63, 64, 65, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, -1, -1, -1, -1, -1, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, @@ -2340,20 +2710,31 @@ 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, -1, 232, 233, 234, 235, - 236, 237, 238, 239, 240, 241, 242, 243, -1, -1, - 246, 247, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 265, - -1, -1, 268, -1, -1, -1, -1, -1, -1, -1, - 276, 277, 278, 279, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, -1, -1, -1, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, -1, -1, 324, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 363, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, -1, - -1, -1, -1, -1, 86, 87, 88, 89, 90, 91, + -1, -1, -1, -1, -1, -1, 382, 383, 384, 385, + 386, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, @@ -2367,20 +2748,31 @@ 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, -1, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, -1, -1, 246, 247, -1, -1, -1, -1, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + -1, -1, 324, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 265, -1, -1, -1, 269, -1, -1, - -1, -1, -1, -1, 276, 277, 278, 279, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 363, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 382, 383, 384, 385, 386, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 63, 64, 65, 66, 67, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, -1, -1, -1, -1, -1, 86, 87, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, @@ -2395,20 +2787,31 @@ 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, -1, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, -1, -1, 246, 247, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, -1, -1, 324, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 363, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 265, -1, -1, - 268, -1, -1, -1, -1, -1, -1, -1, 276, 277, - 278, 279, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 28, 29, 30, 31, 32, 33, + -1, -1, -1, -1, 382, 383, 384, 385, 386, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, -1, -1, -1, - -1, -1, 86, 87, 88, 89, 90, 91, 92, 93, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, @@ -2422,87 +2825,309 @@ 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, -1, 232, 233, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - -1, -1, 246, 247, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 265, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 275, 276, 277, 278, 279, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, -1, -1, -1, -1, -1, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, -1, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, -1, -1, 246, 247, -1, -1, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, -1, -1, + 324, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 265, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 276, 277, 278, 279, - -1, -1, -1, -1, -1, -1, -1, -1, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, -1, -1, -1, -1, -1, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, -1, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, -1, -1, 246, 247, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 265, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 276, 277, 278, 279, - -1, -1, -1, -1, -1, -1, -1, -1, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, -1, + -1, -1, -1, -1, 5, 6, 7, 8, 9, -1, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, -1, -1, -1, -1, -1, -1, -1, 382, 383, + 384, 385, 386, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 82, -1, -1, -1, -1, -1, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, -1, -1, -1, -1, -1, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, -1, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, -1, -1, 339, 340, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 358, -1, -1, + -1, 362, 363, -1, -1, -1, -1, -1, 369, 370, + 371, 372, 5, 6, 7, 8, 9, -1, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, -1, -1, -1, -1, -1, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, -1, -1, 233 + -1, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, + -1, -1, -1, -1, -1, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, -1, + -1, -1, -1, -1, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, -1, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, -1, -1, 339, 340, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 358, -1, -1, 361, -1, + -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, + 5, 6, 7, 8, 9, -1, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 82, -1, -1, + -1, -1, -1, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, -1, -1, -1, + -1, -1, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, -1, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, -1, -1, 339, 340, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 358, -1, -1, -1, 362, -1, -1, + -1, -1, -1, -1, 369, 370, 371, 372, 5, 6, + 7, 8, 9, -1, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, + -1, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, -1, -1, -1, -1, -1, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, -1, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + -1, -1, 339, 340, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 358, -1, -1, 361, -1, -1, -1, -1, -1, + -1, -1, 369, 370, 371, 372, 5, 6, 7, 8, + 9, -1, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 82, -1, -1, -1, -1, -1, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, -1, -1, -1, -1, -1, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, -1, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, -1, -1, + 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 358, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 368, + 369, 370, 371, 372, 5, 6, 7, 8, 9, -1, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 82, -1, -1, -1, -1, -1, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, -1, -1, -1, -1, -1, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, -1, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, -1, -1, 339, 340, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 358, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, + 371, 372, 5, 6, 7, 8, 9, -1, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, + -1, -1, -1, -1, -1, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, -1, + -1, -1, -1, -1, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, -1, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, -1, -1, 339, 340, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 358, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, + 5, 6, 7, 8, 9, -1, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, -1, -1, -1, + -1, -1, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, -1, -1, 324 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -2510,7 +3135,7 @@ static const yytype_uint16 yystos[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 27, 28, 29, 30, 31, 32, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, @@ -2530,121 +3155,146 @@ 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 233, 275, - 289, 290, 291, 292, 293, 294, 329, 330, 333, 334, - 335, 336, 340, 341, 342, 343, 344, 345, 348, 349, - 350, 351, 353, 355, 356, 357, 397, 398, 399, 265, - 265, 232, 269, 356, 232, 275, 275, 400, 266, 272, - 337, 338, 339, 349, 353, 272, 275, 232, 232, 275, - 350, 353, 267, 354, 0, 398, 232, 352, 57, 232, - 346, 347, 269, 359, 353, 275, 354, 269, 376, 338, - 337, 339, 232, 232, 265, 274, 354, 269, 272, 275, - 332, 232, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 246, 247, 265, 268, 276, 277, 278, 279, - 299, 300, 301, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 353, 267, 266, 272, 274, 266, - 272, 358, 349, 353, 360, 361, 275, 275, 16, 17, - 18, 20, 21, 22, 23, 24, 25, 26, 231, 267, - 269, 270, 275, 310, 323, 325, 327, 329, 333, 353, - 366, 367, 368, 369, 377, 378, 379, 380, 383, 384, - 387, 388, 389, 396, 401, 354, 274, 354, 269, 325, - 364, 274, 331, 232, 272, 275, 310, 310, 327, 246, - 247, 267, 271, 266, 266, 272, 230, 325, 265, 310, - 280, 281, 282, 277, 279, 244, 245, 248, 249, 283, - 284, 250, 251, 287, 286, 285, 252, 254, 253, 288, - 268, 268, 323, 232, 323, 328, 347, 360, 353, 232, - 362, 363, 270, 361, 275, 275, 391, 265, 265, 275, - 275, 327, 265, 327, 273, 265, 267, 270, 370, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 274, - 326, 272, 275, 270, 367, 380, 384, 389, 364, 274, - 364, 365, 364, 360, 232, 266, 302, 327, 232, 325, - 310, 310, 310, 312, 312, 313, 313, 314, 314, 314, - 314, 315, 315, 316, 317, 318, 319, 320, 321, 324, - 268, 270, 362, 354, 272, 275, 367, 392, 327, 275, - 327, 273, 390, 232, 402, 403, 377, 325, 325, 364, - 270, 272, 270, 268, 327, 275, 363, 231, 366, 378, - 393, 266, 266, 327, 342, 349, 382, 265, 268, 272, - 371, 270, 364, 273, 265, 382, 394, 395, 373, 374, - 375, 381, 385, 232, 266, 328, 268, 403, 270, 325, - 327, 275, 266, 19, 369, 368, 269, 274, 368, 372, - 376, 266, 266, 327, 372, 373, 377, 386, 364, 275, - 270 + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 324, + 368, 382, 383, 384, 385, 386, 387, 422, 423, 426, + 427, 428, 429, 433, 434, 435, 436, 437, 438, 441, + 442, 443, 444, 445, 447, 449, 450, 451, 491, 492, + 493, 358, 358, 323, 362, 450, 323, 368, 368, 494, + 359, 365, 430, 431, 432, 442, 447, 365, 368, 323, + 323, 368, 443, 447, 360, 448, 0, 492, 323, 446, + 81, 323, 439, 440, 362, 453, 447, 368, 448, 362, + 470, 431, 430, 432, 323, 323, 358, 367, 448, 362, + 365, 368, 425, 323, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 339, 340, 358, 361, + 369, 370, 371, 372, 392, 393, 394, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 445, 447, + 360, 359, 365, 367, 359, 365, 452, 442, 447, 454, + 455, 368, 368, 22, 23, 24, 26, 27, 28, 29, + 30, 31, 32, 322, 360, 362, 363, 368, 403, 416, + 418, 420, 422, 426, 445, 447, 460, 461, 462, 463, + 471, 472, 473, 474, 477, 478, 481, 482, 483, 490, + 495, 448, 367, 448, 362, 418, 458, 367, 424, 323, + 365, 368, 403, 403, 420, 339, 340, 360, 364, 359, + 359, 365, 321, 418, 358, 403, 373, 374, 375, 370, + 372, 337, 338, 341, 342, 376, 377, 343, 344, 380, + 379, 378, 345, 347, 346, 381, 361, 361, 416, 323, + 416, 421, 440, 454, 447, 323, 456, 457, 363, 455, + 368, 368, 485, 358, 358, 368, 368, 420, 358, 420, + 366, 358, 360, 363, 464, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 367, 419, 365, 368, 363, + 461, 474, 478, 483, 458, 367, 458, 459, 458, 454, + 323, 359, 395, 420, 323, 418, 403, 403, 403, 405, + 405, 406, 406, 407, 407, 407, 407, 408, 408, 409, + 410, 411, 412, 413, 414, 417, 361, 363, 456, 448, + 365, 368, 461, 486, 420, 368, 420, 366, 484, 323, + 496, 497, 471, 418, 418, 458, 363, 365, 363, 361, + 420, 368, 457, 322, 460, 472, 487, 359, 359, 420, + 435, 442, 476, 358, 361, 365, 465, 363, 458, 366, + 358, 476, 488, 489, 467, 468, 469, 475, 479, 323, + 359, 421, 361, 497, 363, 418, 420, 368, 359, 25, + 463, 462, 362, 367, 462, 466, 470, 359, 359, 420, + 466, 467, 471, 480, 458, 368, 363 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { - 0, 298, 299, 300, 300, 300, 300, 300, 300, 300, - 300, 300, 300, 300, 300, 301, 301, 301, 301, 301, - 301, 302, 303, 304, 305, 305, 306, 306, 307, 307, - 308, 309, 309, 310, 310, 310, 310, 311, 311, 311, - 311, 312, 312, 312, 312, 313, 313, 313, 314, 314, - 314, 315, 315, 315, 315, 315, 316, 316, 316, 317, - 317, 318, 318, 319, 319, 320, 320, 321, 321, 322, - 322, 323, 324, 323, 325, 325, 326, 326, 326, 326, - 326, 326, 326, 326, 326, 326, 326, 327, 327, 328, - 329, 329, 329, 329, 329, 329, 329, 329, 329, 331, - 330, 332, 332, 333, 334, 334, 335, 335, 336, 337, - 337, 338, 338, 338, 338, 339, 340, 340, 340, 340, - 340, 341, 341, 341, 341, 341, 342, 342, 343, 344, - 344, 344, 344, 345, 346, 346, 347, 347, 347, 348, - 349, 349, 350, 350, 350, 350, 350, 350, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 352, 352, 353, - 353, 354, 354, 354, 354, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 356, 356, 356, 358, 357, 359, 357, 360, 360, 361, - 361, 362, 362, 363, 363, 364, 364, 364, 365, 365, - 366, 367, 367, 368, 368, 368, 368, 368, 368, 368, - 369, 370, 371, 369, 372, 372, 374, 373, 375, 373, - 376, 376, 377, 377, 378, 378, 379, 379, 380, 381, - 381, 382, 382, 383, 383, 385, 384, 386, 386, 387, - 387, 388, 388, 390, 389, 391, 389, 392, 389, 393, - 393, 394, 394, 395, 395, 396, 396, 396, 396, 396, - 397, 397, 398, 398, 398, 400, 399, 401, 402, 402, - 403, 403 + 0, 391, 392, 393, 393, 393, 393, 393, 393, 393, + 393, 393, 393, 393, 393, 393, 393, 394, 394, 394, + 394, 394, 394, 395, 396, 397, 398, 398, 399, 399, + 400, 400, 401, 402, 402, 402, 403, 403, 403, 403, + 404, 404, 404, 404, 405, 405, 405, 405, 406, 406, + 406, 407, 407, 407, 408, 408, 408, 408, 408, 409, + 409, 409, 410, 410, 411, 411, 412, 412, 413, 413, + 414, 414, 415, 415, 416, 417, 416, 418, 418, 419, + 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, + 420, 420, 421, 422, 422, 422, 422, 422, 422, 422, + 422, 422, 424, 423, 425, 425, 426, 427, 427, 428, + 428, 429, 430, 430, 431, 431, 431, 431, 432, 433, + 433, 433, 433, 433, 434, 434, 434, 434, 434, 435, + 435, 436, 437, 437, 437, 437, 438, 439, 439, 440, + 440, 440, 441, 442, 442, 443, 443, 443, 443, 443, + 443, 443, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 445, 446, 446, 447, 447, 448, 448, 448, 448, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 450, 450, 450, 452, 451, + 453, 451, 454, 454, 455, 455, 456, 456, 457, 457, + 458, 458, 458, 459, 459, 460, 461, 461, 462, 462, + 462, 462, 462, 462, 462, 463, 464, 465, 463, 466, + 466, 468, 467, 469, 467, 470, 470, 471, 471, 472, + 472, 473, 473, 474, 475, 475, 476, 476, 477, 477, + 479, 478, 480, 480, 481, 481, 482, 482, 484, 483, + 485, 483, 486, 483, 487, 487, 488, 488, 489, 489, + 490, 490, 490, 490, 490, 491, 491, 492, 492, 492, + 494, 493, 495, 496, 496, 497, 497 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 1, 4, 1, 3, 2, - 2, 1, 1, 1, 2, 2, 2, 1, 2, 3, - 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, - 1, 1, 3, 3, 3, 1, 3, 3, 1, 3, - 3, 1, 3, 3, 3, 3, 1, 3, 3, 1, - 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, - 3, 1, 0, 6, 1, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 2, 2, 4, 2, 3, 4, 2, 3, 4, 0, - 6, 2, 3, 2, 1, 1, 2, 3, 3, 2, - 3, 2, 1, 2, 1, 1, 1, 3, 4, 6, - 5, 1, 2, 3, 5, 4, 1, 2, 1, 1, - 1, 1, 1, 4, 1, 3, 1, 3, 1, 1, - 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 4, 1, + 3, 2, 2, 1, 1, 1, 2, 2, 2, 1, + 2, 3, 2, 1, 1, 1, 1, 2, 2, 2, + 1, 1, 1, 1, 1, 3, 3, 3, 1, 3, + 3, 1, 3, 3, 1, 3, 3, 3, 3, 1, + 3, 3, 1, 3, 1, 3, 1, 3, 1, 3, + 1, 3, 1, 3, 1, 0, 6, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 2, 2, 4, 2, 3, 4, 2, + 3, 4, 0, 6, 2, 3, 2, 1, 1, 2, + 3, 3, 2, 3, 2, 1, 2, 1, 1, 1, + 3, 4, 6, 5, 1, 2, 3, 5, 4, 1, + 2, 1, 1, 1, 1, 1, 4, 1, 3, 1, + 3, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 4, 1, 1, 3, 1, 2, 2, 3, 3, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 4, 1, 3, 1, - 2, 2, 3, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2664,16 +3314,18 @@ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 6, 0, 5, 1, 2, 3, - 4, 1, 3, 1, 2, 1, 3, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 0, 0, 5, 1, 1, 0, 2, 0, 2, - 2, 3, 1, 2, 1, 2, 1, 2, 5, 3, - 1, 1, 4, 1, 2, 0, 8, 0, 1, 3, - 2, 1, 2, 0, 6, 0, 8, 0, 7, 1, - 1, 1, 0, 2, 3, 2, 2, 2, 3, 2, - 1, 2, 1, 1, 1, 0, 3, 5, 1, 3, - 1, 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 6, + 0, 5, 1, 2, 3, 4, 1, 3, 1, 2, + 1, 3, 4, 1, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 0, 0, 5, 1, + 1, 0, 2, 0, 2, 2, 3, 1, 2, 1, + 2, 1, 2, 5, 3, 1, 1, 4, 1, 2, + 0, 8, 0, 1, 3, 2, 1, 2, 0, 6, + 0, 8, 0, 7, 1, 1, 1, 0, 2, 3, + 2, 2, 2, 3, 2, 1, 2, 1, 1, 1, + 0, 3, 5, 1, 3, 1, 4 }; @@ -3356,238 +4008,250 @@ switch (yyn) { case 2: -#line 257 "MachineIndependent/glslang.y" /* yacc.c:1646 */ +#line 293 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.handleVariable((yyvsp[0].lex).loc, (yyvsp[0].lex).symbol, (yyvsp[0].lex).string); } -#line 3364 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4016 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; case 3: -#line 263 "MachineIndependent/glslang.y" /* yacc.c:1646 */ +#line 299 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3372 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4024 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; case 4: -#line 266 "MachineIndependent/glslang.y" /* yacc.c:1646 */ +#line 302 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); } -#line 3380 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4033 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; case 5: -#line 269 "MachineIndependent/glslang.y" /* yacc.c:1646 */ +#line 306 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned literal"); + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); } -#line 3389 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4042 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; case 6: -#line 273 "MachineIndependent/glslang.y" /* yacc.c:1646 */ +#line 310 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); + } +#line 4050 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 7: +#line 313 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned literal"); + (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); + } +#line 4059 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 8: +#line 317 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i64, (yyvsp[0].lex).loc, true); } -#line 3398 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4068 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 7: -#line 277 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 9: +#line 321 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u64, (yyvsp[0].lex).loc, true); } -#line 3407 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4077 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 8: -#line 281 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 10: +#line 325 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.int16Check((yyvsp[0].lex).loc, "16-bit integer literal"); + parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit integer literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((short)(yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); -#endif } -#line 3418 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4086 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 9: -#line 287 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 11: +#line 329 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.int16Check((yyvsp[0].lex).loc, "16-bit unsigned integer literal"); + parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((unsigned short)(yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); -#endif } -#line 3429 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4095 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 10: -#line 293 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 12: +#line 333 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true); } -#line 3437 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4103 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 11: -#line 296 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 13: +#line 336 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.doubleCheck((yyvsp[0].lex).loc, "double literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtDouble, (yyvsp[0].lex).loc, true); } -#line 3446 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4112 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 12: -#line 300 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 14: +#line 340 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS parseContext.float16Check((yyvsp[0].lex).loc, "half float literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat16, (yyvsp[0].lex).loc, true); -#endif } -#line 3457 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4121 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 13: -#line 306 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 15: +#line 344 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true); } -#line 3465 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4129 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 14: -#line 309 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 16: +#line 347 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode); if ((yyval.interm.intermTypedNode)->getAsConstantUnion()) (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression(); } -#line 3475 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4139 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 15: -#line 317 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 17: +#line 355 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3483 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4147 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 16: -#line 320 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 18: +#line 358 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.handleBracketDereference((yyvsp[-2].lex).loc, (yyvsp[-3].interm.intermTypedNode), (yyvsp[-1].interm.intermTypedNode)); } -#line 3491 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4155 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 17: -#line 323 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 19: +#line 361 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3499 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4163 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 18: -#line 326 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 20: +#line 364 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.handleDotDereference((yyvsp[0].lex).loc, (yyvsp[-2].interm.intermTypedNode), *(yyvsp[0].lex).string); } -#line 3507 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4171 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 19: -#line 329 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 21: +#line 367 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode)); parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "++", (yyvsp[-1].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "++", EOpPostIncrement, (yyvsp[-1].interm.intermTypedNode)); } -#line 3517 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4181 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 20: -#line 334 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 22: +#line 372 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode)); parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "--", (yyvsp[-1].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "--", EOpPostDecrement, (yyvsp[-1].interm.intermTypedNode)); } -#line 3527 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4191 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 21: -#line 342 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 23: +#line 380 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.integerCheck((yyvsp[0].interm.intermTypedNode), "[]"); (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3536 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4200 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 22: -#line 349 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 24: +#line 387 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.handleFunctionCall((yyvsp[0].interm).loc, (yyvsp[0].interm).function, (yyvsp[0].interm).intermNode); delete (yyvsp[0].interm).function; } -#line 3545 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4209 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 23: -#line 356 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 25: +#line 394 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm) = (yyvsp[0].interm); } -#line 3553 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4217 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 24: -#line 362 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 26: +#line 400 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm) = (yyvsp[-1].interm); (yyval.interm).loc = (yyvsp[0].lex).loc; } -#line 3562 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4226 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 25: -#line 366 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 27: +#line 404 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm) = (yyvsp[-1].interm); (yyval.interm).loc = (yyvsp[0].lex).loc; } -#line 3571 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4235 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 26: -#line 373 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 28: +#line 411 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm) = (yyvsp[-1].interm); } -#line 3579 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4243 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 27: -#line 376 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 29: +#line 414 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm) = (yyvsp[0].interm); } -#line 3587 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4251 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 28: -#line 382 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 30: +#line 420 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { TParameter param = { 0, new TType }; param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType()); @@ -3595,11 +4259,11 @@ (yyval.interm).function = (yyvsp[-1].interm).function; (yyval.interm).intermNode = (yyvsp[0].interm.intermTypedNode); } -#line 3599 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4263 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 29: -#line 389 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 31: +#line 427 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { TParameter param = { 0, new TType }; param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType()); @@ -3607,29 +4271,29 @@ (yyval.interm).function = (yyvsp[-2].interm).function; (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc); } -#line 3611 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4275 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 30: -#line 399 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 32: +#line 437 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm) = (yyvsp[-1].interm); } -#line 3619 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4283 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 31: -#line 407 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 33: +#line 445 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { // Constructor (yyval.interm).intermNode = 0; (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type)); } -#line 3629 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4293 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 32: -#line 412 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 34: +#line 450 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { // // Should be a method or subroutine call, but we haven't recognized the arguments yet. @@ -3657,40 +4321,50 @@ (yyval.interm).function = new TFunction(&empty, TType(EbtVoid), EOpNull); } } -#line 3661 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4325 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 33: -#line 442 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 35: +#line 477 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + // Constructor + (yyval.interm).intermNode = 0; + (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type)); + } +#line 4335 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 36: +#line 485 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.variableCheck((yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); if (TIntermMethod* method = (yyvsp[0].interm.intermTypedNode)->getAsMethodNode()) parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "incomplete method syntax", method->getMethodName().c_str(), ""); } -#line 3672 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4346 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 34: -#line 448 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 37: +#line 491 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "++", (yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "++", EOpPreIncrement, (yyvsp[0].interm.intermTypedNode)); } -#line 3681 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4355 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 35: -#line 452 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 38: +#line 495 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "--", (yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "--", EOpPreDecrement, (yyvsp[0].interm.intermTypedNode)); } -#line 3690 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4364 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 36: -#line 456 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 39: +#line 499 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { if ((yyvsp[-1].interm).op != EOpNull) { char errorOp[2] = {0, 0}; @@ -3707,179 +4381,179 @@ (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression(); } } -#line 3711 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4385 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 37: -#line 476 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 40: +#line 519 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNull; } -#line 3717 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4391 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 38: -#line 477 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 41: +#line 520 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNegative; } -#line 3723 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4397 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 39: -#line 478 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 42: +#line 521 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLogicalNot; } -#line 3729 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4403 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 40: -#line 479 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 43: +#line 522 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpBitwiseNot; parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise not"); } -#line 3736 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4410 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 41: -#line 485 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 44: +#line 528 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3742 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4416 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 42: -#line 486 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 45: +#line 529 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "*", EOpMul, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 3752 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4426 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 43: -#line 491 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 46: +#line 534 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "/", EOpDiv, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 3762 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4436 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 44: -#line 496 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 47: +#line 539 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "%"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "%", EOpMod, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 3773 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4447 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 45: -#line 505 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 48: +#line 548 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3779 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4453 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 46: -#line 506 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 49: +#line 549 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "+", EOpAdd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 3789 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4463 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 47: -#line 511 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 50: +#line 554 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "-", EOpSub, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 3799 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4473 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 48: -#line 519 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 51: +#line 562 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3805 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4479 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 49: -#line 520 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 52: +#line 563 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bit shift left"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<<", EOpLeftShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 3816 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4490 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 50: -#line 526 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 53: +#line 569 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bit shift right"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">>", EOpRightShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 3827 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4501 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 51: -#line 535 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 54: +#line 578 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3833 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4507 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 52: -#line 536 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 55: +#line 579 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<", EOpLessThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 3843 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4517 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 53: -#line 541 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 56: +#line 584 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">", EOpGreaterThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 3853 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4527 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 54: -#line 546 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 57: +#line 589 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<=", EOpLessThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 3863 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4537 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 55: -#line 551 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 58: +#line 594 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">=", EOpGreaterThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 3873 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4547 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 56: -#line 559 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 59: +#line 602 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3879 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4553 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 57: -#line 560 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 60: +#line 603 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array comparison"); parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "=="); @@ -3888,11 +4562,11 @@ if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 3892 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4566 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 58: -#line 568 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 61: +#line 611 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array comparison"); parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "!="); @@ -3901,3283 +4575,4328 @@ if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 3905 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4579 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 59: -#line 579 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 62: +#line 622 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } +#line 4585 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 63: +#line 623 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise and"); + (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&", EOpAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); + if ((yyval.interm.intermTypedNode) == 0) + (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); + } +#line 4596 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 64: +#line 632 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } +#line 4602 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 65: +#line 633 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise exclusive or"); + (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^", EOpExclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); + if ((yyval.interm.intermTypedNode) == 0) + (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); + } +#line 4613 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 66: +#line 642 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } +#line 4619 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 67: +#line 643 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise inclusive or"); + (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "|", EOpInclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); + if ((yyval.interm.intermTypedNode) == 0) + (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); + } +#line 4630 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 68: +#line 652 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } +#line 4636 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 69: +#line 653 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&&", EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); + if ((yyval.interm.intermTypedNode) == 0) + (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); + } +#line 4646 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 70: +#line 661 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } +#line 4652 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 71: +#line 662 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^^", EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); + if ((yyval.interm.intermTypedNode) == 0) + (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); + } +#line 4662 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 72: +#line 670 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } +#line 4668 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 73: +#line 671 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "||", EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); + if ((yyval.interm.intermTypedNode) == 0) + (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); + } +#line 4678 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 74: +#line 679 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } +#line 4684 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 75: +#line 680 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + ++parseContext.controlFlowNestingLevel; + } +#line 4692 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 76: +#line 683 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + --parseContext.controlFlowNestingLevel; + parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-5].interm.intermTypedNode)); + parseContext.rValueErrorCheck((yyvsp[-4].lex).loc, "?", (yyvsp[-5].interm.intermTypedNode)); + parseContext.rValueErrorCheck((yyvsp[-1].lex).loc, ":", (yyvsp[-2].interm.intermTypedNode)); + parseContext.rValueErrorCheck((yyvsp[-1].lex).loc, ":", (yyvsp[0].interm.intermTypedNode)); + (yyval.interm.intermTypedNode) = parseContext.intermediate.addSelection((yyvsp[-5].interm.intermTypedNode), (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-4].lex).loc); + if ((yyval.interm.intermTypedNode) == 0) { + parseContext.binaryOpError((yyvsp[-4].lex).loc, ":", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString()); + (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); + } + } +#line 4709 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 77: +#line 698 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3911 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 4715 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 78: +#line 699 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.arrayObjectCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array assignment"); + parseContext.opaqueCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "="); + parseContext.specializationCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "="); + parseContext.lValueErrorCheck((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode)); + parseContext.rValueErrorCheck((yyvsp[-1].interm).loc, "assign", (yyvsp[0].interm.intermTypedNode)); + (yyval.interm.intermTypedNode) = parseContext.intermediate.addAssign((yyvsp[-1].interm).op, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].interm).loc); + if ((yyval.interm.intermTypedNode) == 0) { + parseContext.assignError((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString()); + (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); + } + } +#line 4732 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 79: +#line 714 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).loc = (yyvsp[0].lex).loc; + (yyval.interm).op = EOpAssign; + } +#line 4741 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 80: +#line 718 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).loc = (yyvsp[0].lex).loc; + (yyval.interm).op = EOpMulAssign; + } +#line 4750 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 81: +#line 722 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).loc = (yyvsp[0].lex).loc; + (yyval.interm).op = EOpDivAssign; + } +#line 4759 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 82: +#line 726 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "%="); + (yyval.interm).loc = (yyvsp[0].lex).loc; + (yyval.interm).op = EOpModAssign; + } +#line 4769 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 83: +#line 731 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).loc = (yyvsp[0].lex).loc; + (yyval.interm).op = EOpAddAssign; + } +#line 4778 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 84: +#line 735 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).loc = (yyvsp[0].lex).loc; + (yyval.interm).op = EOpSubAssign; + } +#line 4787 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 85: +#line 739 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift left assign"); + (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLeftShiftAssign; + } +#line 4796 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 86: +#line 743 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift right assign"); + (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpRightShiftAssign; + } +#line 4805 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 87: +#line 747 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-and assign"); + (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAndAssign; + } +#line 4814 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 88: +#line 751 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-xor assign"); + (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpExclusiveOrAssign; + } +#line 4823 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 89: +#line 755 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-or assign"); + (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpInclusiveOrAssign; + } +#line 4832 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 90: +#line 762 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); + } +#line 4840 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 91: +#line 765 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.samplerConstructorLocationCheck((yyvsp[-1].lex).loc, ",", (yyvsp[0].interm.intermTypedNode)); + (yyval.interm.intermTypedNode) = parseContext.intermediate.addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc); + if ((yyval.interm.intermTypedNode) == 0) { + parseContext.binaryOpError((yyvsp[-1].lex).loc, ",", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString()); + (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); + } + } +#line 4853 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 92: +#line 776 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.constantValueCheck((yyvsp[0].interm.intermTypedNode), ""); + (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); + } +#line 4862 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 93: +#line 783 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.handleFunctionDeclarator((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).function, true /* prototype */); + (yyval.interm.intermNode) = 0; + // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature + } +#line 4872 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 94: +#line 788 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + if ((yyvsp[-1].interm).intermNode && (yyvsp[-1].interm).intermNode->getAsAggregate()) + (yyvsp[-1].interm).intermNode->getAsAggregate()->setOperator(EOpSequence); + (yyval.interm.intermNode) = (yyvsp[-1].interm).intermNode; + } +#line 4882 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 95: +#line 793 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.profileRequires((yyvsp[-3].lex).loc, ENoProfile, 130, 0, "precision statement"); + + // lazy setting of the previous scope's defaults, has effect only the first time it is called in a particular scope + parseContext.symbolTable.setPreviousDefaultPrecisions(&parseContext.defaultPrecision[0]); + parseContext.setDefaultPrecision((yyvsp[-3].lex).loc, (yyvsp[-1].interm.type), (yyvsp[-2].interm.type).qualifier.precision); + (yyval.interm.intermNode) = 0; + } +#line 4895 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 96: +#line 801 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.declareBlock((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).typeList); + (yyval.interm.intermNode) = 0; + } +#line 4904 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 97: +#line 805 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.declareBlock((yyvsp[-2].interm).loc, *(yyvsp[-2].interm).typeList, (yyvsp[-1].lex).string); + (yyval.interm.intermNode) = 0; + } +#line 4913 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 98: +#line 809 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.declareBlock((yyvsp[-3].interm).loc, *(yyvsp[-3].interm).typeList, (yyvsp[-2].lex).string, (yyvsp[-1].interm).arraySizes); + (yyval.interm.intermNode) = 0; + } +#line 4922 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 99: +#line 813 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier); + parseContext.updateStandaloneQualifierDefaults((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type)); + (yyval.interm.intermNode) = 0; + } +#line 4932 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 100: +#line 818 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.checkNoShaderLayouts((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).shaderQualifiers); + parseContext.addQualifierToExisting((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, *(yyvsp[-1].lex).string); + (yyval.interm.intermNode) = 0; + } +#line 4942 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 101: +#line 823 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.checkNoShaderLayouts((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).shaderQualifiers); + (yyvsp[-1].interm.identifierList)->push_back((yyvsp[-2].lex).string); + parseContext.addQualifierToExisting((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier, *(yyvsp[-1].interm.identifierList)); + (yyval.interm.intermNode) = 0; + } +#line 4953 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 102: +#line 832 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { parseContext.nestedBlockCheck((yyvsp[-2].interm.type).loc); } +#line 4959 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 103: +#line 832 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + --parseContext.structNestingLevel; + parseContext.blockName = (yyvsp[-4].lex).string; + parseContext.globalQualifierFixCheck((yyvsp[-5].interm.type).loc, (yyvsp[-5].interm.type).qualifier); + parseContext.checkNoShaderLayouts((yyvsp[-5].interm.type).loc, (yyvsp[-5].interm.type).shaderQualifiers); + parseContext.currentBlockQualifier = (yyvsp[-5].interm.type).qualifier; + (yyval.interm).loc = (yyvsp[-5].interm.type).loc; + (yyval.interm).typeList = (yyvsp[-1].interm.typeList); + } +#line 4973 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 104: +#line 843 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.identifierList) = new TIdentifierList; + (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string); + } +#line 4982 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 105: +#line 847 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.identifierList) = (yyvsp[-2].interm.identifierList); + (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string); + } +#line 4991 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 106: +#line 854 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).function = (yyvsp[-1].interm.function); + (yyval.interm).loc = (yyvsp[0].lex).loc; + } +#line 5000 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 107: +#line 861 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.function) = (yyvsp[0].interm.function); + } +#line 5008 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 108: +#line 864 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.function) = (yyvsp[0].interm.function); + } +#line 5016 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 109: +#line 871 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + // Add the parameter + (yyval.interm.function) = (yyvsp[-1].interm.function); + if ((yyvsp[0].interm).param.type->getBasicType() != EbtVoid) + (yyvsp[-1].interm.function)->addParameter((yyvsp[0].interm).param); + else + delete (yyvsp[0].interm).param.type; + } +#line 5029 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 110: +#line 879 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + // + // Only first parameter of one-parameter functions can be void + // The check for named parameters not being void is done in parameter_declarator + // + if ((yyvsp[0].interm).param.type->getBasicType() == EbtVoid) { + // + // This parameter > first is void + // + parseContext.error((yyvsp[-1].lex).loc, "cannot be an argument type except for '(void)'", "void", ""); + delete (yyvsp[0].interm).param.type; + } else { + // Add the parameter + (yyval.interm.function) = (yyvsp[-2].interm.function); + (yyvsp[-2].interm.function)->addParameter((yyvsp[0].interm).param); + } + } +#line 5051 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 111: +#line 899 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + if ((yyvsp[-2].interm.type).qualifier.storage != EvqGlobal && (yyvsp[-2].interm.type).qualifier.storage != EvqTemporary) { + parseContext.error((yyvsp[-1].lex).loc, "no qualifiers allowed for function return", + GetStorageQualifierString((yyvsp[-2].interm.type).qualifier.storage), ""); + } + if ((yyvsp[-2].interm.type).arraySizes) + parseContext.arraySizeRequiredCheck((yyvsp[-2].interm.type).loc, *(yyvsp[-2].interm.type).arraySizes); + + // Add the function as a prototype after parsing it (we do not support recursion) + TFunction *function; + TType type((yyvsp[-2].interm.type)); + + // Potentially rename shader entry point function. No-op most of the time. + parseContext.renameShaderFunction((yyvsp[-1].lex).string); + + // Make the function + function = new TFunction((yyvsp[-1].lex).string, type); + (yyval.interm.function) = function; + } +#line 5075 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 112: +#line 922 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + if ((yyvsp[-1].interm.type).arraySizes) { + parseContext.profileRequires((yyvsp[-1].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); + parseContext.profileRequires((yyvsp[-1].interm.type).loc, EEsProfile, 300, 0, "arrayed type"); + parseContext.arraySizeRequiredCheck((yyvsp[-1].interm.type).loc, *(yyvsp[-1].interm.type).arraySizes); + } + if ((yyvsp[-1].interm.type).basicType == EbtVoid) { + parseContext.error((yyvsp[0].lex).loc, "illegal use of type 'void'", (yyvsp[0].lex).string->c_str(), ""); + } + parseContext.reservedErrorCheck((yyvsp[0].lex).loc, *(yyvsp[0].lex).string); + + TParameter param = {(yyvsp[0].lex).string, new TType((yyvsp[-1].interm.type))}; + (yyval.interm).loc = (yyvsp[0].lex).loc; + (yyval.interm).param = param; + } +#line 5095 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 113: +#line 937 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + if ((yyvsp[-2].interm.type).arraySizes) { + parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); + parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, "arrayed type"); + parseContext.arraySizeRequiredCheck((yyvsp[-2].interm.type).loc, *(yyvsp[-2].interm.type).arraySizes); + } + TType* type = new TType((yyvsp[-2].interm.type)); + type->transferArraySizes((yyvsp[0].interm).arraySizes); + type->copyArrayInnerSizes((yyvsp[-2].interm.type).arraySizes); + + parseContext.arrayOfArrayVersionCheck((yyvsp[-1].lex).loc, type->getArraySizes()); + parseContext.arraySizeRequiredCheck((yyvsp[0].interm).loc, *(yyvsp[0].interm).arraySizes); + parseContext.reservedErrorCheck((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string); + + TParameter param = { (yyvsp[-1].lex).string, type }; + + (yyval.interm).loc = (yyvsp[-1].lex).loc; + (yyval.interm).param = param; + } +#line 5119 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 114: +#line 962 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm) = (yyvsp[0].interm); + if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone) + (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision; + parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + + parseContext.checkNoShaderLayouts((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers); + parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type); + parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type); + + } +#line 5135 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 115: +#line 973 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm) = (yyvsp[0].interm); + + parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type); + parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type); + parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + } +#line 5147 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 116: +#line 983 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm) = (yyvsp[0].interm); + if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone) + (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision; + parseContext.precisionQualifierCheck((yyvsp[-1].interm.type).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + + parseContext.checkNoShaderLayouts((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers); + parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type); + parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type); + } +#line 5162 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 117: +#line 993 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm) = (yyvsp[0].interm); + + parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type); + parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type); + parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + } +#line 5174 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 118: +#line 1003 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + TParameter param = { 0, new TType((yyvsp[0].interm.type)) }; + (yyval.interm).param = param; + if ((yyvsp[0].interm.type).arraySizes) + parseContext.arraySizeRequiredCheck((yyvsp[0].interm.type).loc, *(yyvsp[0].interm.type).arraySizes); + } +#line 5185 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 119: +#line 1012 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm) = (yyvsp[0].interm); + } +#line 5193 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 120: +#line 1015 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm) = (yyvsp[-2].interm); + parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-2].interm).type); + } +#line 5202 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 121: +#line 1019 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm) = (yyvsp[-3].interm); + parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-3].interm).type, (yyvsp[0].interm).arraySizes); + } +#line 5211 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 122: +#line 1023 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).type = (yyvsp[-5].interm).type; + TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-5].interm).type, (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode)); + (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-5].interm).intermNode, initNode, (yyvsp[-1].lex).loc); + } +#line 5221 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 123: +#line 1028 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).type = (yyvsp[-4].interm).type; + TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-4].interm).type, 0, (yyvsp[0].interm.intermTypedNode)); + (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-4].interm).intermNode, initNode, (yyvsp[-1].lex).loc); + } +#line 5231 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 124: +#line 1036 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).type = (yyvsp[0].interm.type); + (yyval.interm).intermNode = 0; + parseContext.declareTypeDefaults((yyval.interm).loc, (yyval.interm).type); + } +#line 5241 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 125: +#line 1041 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).type = (yyvsp[-1].interm.type); + (yyval.interm).intermNode = 0; + parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-1].interm.type)); + } +#line 5251 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 126: +#line 1046 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).type = (yyvsp[-2].interm.type); + (yyval.interm).intermNode = 0; + parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-2].interm.type), (yyvsp[0].interm).arraySizes); + } +#line 5261 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 127: +#line 1051 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).type = (yyvsp[-4].interm.type); + TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-4].interm.type), (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode)); + (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc); + } +#line 5271 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 128: +#line 1056 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm).type = (yyvsp[-3].interm.type); + TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-3].interm.type), 0, (yyvsp[0].interm.intermTypedNode)); + (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc); + } +#line 5281 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 129: +#line 1065 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type) = (yyvsp[0].interm.type); + + parseContext.globalQualifierTypeCheck((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier, (yyval.interm.type)); + if ((yyvsp[0].interm.type).arraySizes) { + parseContext.profileRequires((yyvsp[0].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); + parseContext.profileRequires((yyvsp[0].interm.type).loc, EEsProfile, 300, 0, "arrayed type"); + } + + parseContext.precisionQualifierCheck((yyval.interm.type).loc, (yyval.interm.type).basicType, (yyval.interm.type).qualifier); + } +#line 5297 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 130: +#line 1076 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier); + parseContext.globalQualifierTypeCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, (yyvsp[0].interm.type)); + + if ((yyvsp[0].interm.type).arraySizes) { + parseContext.profileRequires((yyvsp[0].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); + parseContext.profileRequires((yyvsp[0].interm.type).loc, EEsProfile, 300, 0, "arrayed type"); + } + + if ((yyvsp[0].interm.type).arraySizes && parseContext.arrayQualifierError((yyvsp[0].interm.type).loc, (yyvsp[-1].interm.type).qualifier)) + (yyvsp[0].interm.type).arraySizes = nullptr; + + parseContext.checkNoShaderLayouts((yyvsp[0].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers); + (yyvsp[0].interm.type).shaderQualifiers.merge((yyvsp[-1].interm.type).shaderQualifiers); + parseContext.mergeQualifiers((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier, (yyvsp[-1].interm.type).qualifier, true); + parseContext.precisionQualifierCheck((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).basicType, (yyvsp[0].interm.type).qualifier); + + (yyval.interm.type) = (yyvsp[0].interm.type); + + if (! (yyval.interm.type).qualifier.isInterpolation() && + ((parseContext.language == EShLangVertex && (yyval.interm.type).qualifier.storage == EvqVaryingOut) || + (parseContext.language == EShLangFragment && (yyval.interm.type).qualifier.storage == EvqVaryingIn))) + (yyval.interm.type).qualifier.smooth = true; + } +#line 5326 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 60: -#line 580 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 131: +#line 1103 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise and"); - (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&", EOpAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); - if ((yyval.interm.intermTypedNode) == 0) - (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); + parseContext.globalCheck((yyvsp[0].lex).loc, "invariant"); + parseContext.profileRequires((yyval.interm.type).loc, ENoProfile, 120, 0, "invariant"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.invariant = true; } -#line 3922 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ - break; - - case 61: -#line 589 "MachineIndependent/glslang.y" /* yacc.c:1646 */ - { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3928 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5337 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 62: -#line 590 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 132: +#line 1112 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise exclusive or"); - (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^", EOpExclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); - if ((yyval.interm.intermTypedNode) == 0) - (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); + parseContext.globalCheck((yyvsp[0].lex).loc, "smooth"); + parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "smooth"); + parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "smooth"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.smooth = true; } -#line 3939 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ - break; - - case 63: -#line 599 "MachineIndependent/glslang.y" /* yacc.c:1646 */ - { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3945 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5349 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 64: -#line 600 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 133: +#line 1119 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise inclusive or"); - (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "|", EOpInclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); - if ((yyval.interm.intermTypedNode) == 0) - (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); + parseContext.globalCheck((yyvsp[0].lex).loc, "flat"); + parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "flat"); + parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "flat"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.flat = true; } -#line 3956 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ - break; - - case 65: -#line 609 "MachineIndependent/glslang.y" /* yacc.c:1646 */ - { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3962 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5361 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 66: -#line 610 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 134: +#line 1126 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&&", EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); - if ((yyval.interm.intermTypedNode) == 0) - (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); + parseContext.globalCheck((yyvsp[0].lex).loc, "noperspective"); +#ifdef NV_EXTENSIONS + parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective"); +#else + parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, "noperspective"); +#endif + parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "noperspective"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.nopersp = true; } -#line 3972 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ - break; - - case 67: -#line 618 "MachineIndependent/glslang.y" /* yacc.c:1646 */ - { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3978 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5377 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 68: -#line 619 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 135: +#line 1137 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^^", EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); - if ((yyval.interm.intermTypedNode) == 0) - (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); +#ifdef AMD_EXTENSIONS + parseContext.globalCheck((yyvsp[0].lex).loc, "__explicitInterpAMD"); + parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation"); + parseContext.profileRequires((yyvsp[0].lex).loc, ECompatibilityProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.explicitInterp = true; +#endif } -#line 3988 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ - break; - - case 69: -#line 627 "MachineIndependent/glslang.y" /* yacc.c:1646 */ - { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 3994 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5391 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 70: -#line 628 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 136: +#line 1149 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "||", EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); - if ((yyval.interm.intermTypedNode) == 0) - (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); + (yyval.interm.type) = (yyvsp[-1].interm.type); } -#line 4004 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5399 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 71: -#line 636 "MachineIndependent/glslang.y" /* yacc.c:1646 */ - { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 4010 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + case 137: +#line 1155 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type) = (yyvsp[0].interm.type); + } +#line 5407 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 72: -#line 637 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 138: +#line 1158 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - ++parseContext.controlFlowNestingLevel; + (yyval.interm.type) = (yyvsp[-2].interm.type); + (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers); + parseContext.mergeObjectLayoutQualifiers((yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false); } -#line 4018 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5417 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 73: -#line 640 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 139: +#line 1165 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - --parseContext.controlFlowNestingLevel; - parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-5].interm.intermTypedNode)); - parseContext.rValueErrorCheck((yyvsp[-4].lex).loc, "?", (yyvsp[-5].interm.intermTypedNode)); - parseContext.rValueErrorCheck((yyvsp[-1].lex).loc, ":", (yyvsp[-2].interm.intermTypedNode)); - parseContext.rValueErrorCheck((yyvsp[-1].lex).loc, ":", (yyvsp[0].interm.intermTypedNode)); - (yyval.interm.intermTypedNode) = parseContext.intermediate.addSelection((yyvsp[-5].interm.intermTypedNode), (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-4].lex).loc); - if ((yyval.interm.intermTypedNode) == 0) { - parseContext.binaryOpError((yyvsp[-4].lex).loc, ":", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString()); - (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); - } + (yyval.interm.type).init((yyvsp[0].lex).loc); + parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), *(yyvsp[0].lex).string); } -#line 4035 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5426 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 74: -#line 655 "MachineIndependent/glslang.y" /* yacc.c:1646 */ - { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 4041 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + case 140: +#line 1169 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type).init((yyvsp[-2].lex).loc); + parseContext.setLayoutQualifier((yyvsp[-2].lex).loc, (yyval.interm.type), *(yyvsp[-2].lex).string, (yyvsp[0].interm.intermTypedNode)); + } +#line 5435 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 75: -#line 656 "MachineIndependent/glslang.y" /* yacc.c:1646 */ - { - parseContext.arrayObjectCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array assignment"); - parseContext.opaqueCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "="); - parseContext.specializationCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "="); - parseContext.lValueErrorCheck((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode)); - parseContext.rValueErrorCheck((yyvsp[-1].interm).loc, "assign", (yyvsp[0].interm.intermTypedNode)); - (yyval.interm.intermTypedNode) = parseContext.intermediate.addAssign((yyvsp[-1].interm).op, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].interm).loc); - if ((yyval.interm.intermTypedNode) == 0) { - parseContext.assignError((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString()); - (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); - } + case 141: +#line 1173 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { // because "shared" is both an identifier and a keyword + (yyval.interm.type).init((yyvsp[0].lex).loc); + TString strShared("shared"); + parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), strShared); } -#line 4058 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5445 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 76: -#line 671 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 142: +#line 1181 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).loc = (yyvsp[0].lex).loc; - (yyval.interm).op = EOpAssign; + parseContext.profileRequires((yyval.interm.type).loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader5, "precise"); + parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5, "precise"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.noContraction = true; } -#line 4067 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5456 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 77: -#line 675 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 143: +#line 1190 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).loc = (yyvsp[0].lex).loc; - (yyval.interm).op = EOpMulAssign; + (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 4076 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5464 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 78: -#line 679 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 144: +#line 1193 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).loc = (yyvsp[0].lex).loc; - (yyval.interm).op = EOpDivAssign; + (yyval.interm.type) = (yyvsp[-1].interm.type); + if ((yyval.interm.type).basicType == EbtVoid) + (yyval.interm.type).basicType = (yyvsp[0].interm.type).basicType; + + (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers); + parseContext.mergeQualifiers((yyval.interm.type).loc, (yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false); } -#line 4085 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5477 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 79: -#line 683 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 145: +#line 1204 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "%="); - (yyval.interm).loc = (yyvsp[0].lex).loc; - (yyval.interm).op = EOpModAssign; + (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 4095 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5485 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 80: -#line 688 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 146: +#line 1207 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).loc = (yyvsp[0].lex).loc; - (yyval.interm).op = EOpAddAssign; + (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 4104 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5493 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 81: -#line 692 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 147: +#line 1210 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).loc = (yyvsp[0].lex).loc; - (yyval.interm).op = EOpSubAssign; + parseContext.checkPrecisionQualifier((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier.precision); + (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 4113 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5502 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 82: -#line 696 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 148: +#line 1214 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift left assign"); - (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLeftShiftAssign; + // allow inheritance of storage qualifier from block declaration + (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 4122 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5511 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 83: -#line 700 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 149: +#line 1218 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift right assign"); - (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpRightShiftAssign; + // allow inheritance of storage qualifier from block declaration + (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 4131 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5520 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 84: -#line 704 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 150: +#line 1222 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-and assign"); - (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAndAssign; + // allow inheritance of storage qualifier from block declaration + (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 4140 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5529 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 85: -#line 708 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 151: +#line 1226 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-xor assign"); - (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpExclusiveOrAssign; + (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 4149 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5537 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 86: -#line 712 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 152: +#line 1232 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-or assign"); - (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpInclusiveOrAssign; + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.storage = EvqConst; // will later turn into EvqConstReadOnly, if the initializer is not constant } -#line 4158 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5546 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 87: -#line 719 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 153: +#line 1236 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); + parseContext.requireStage((yyvsp[0].lex).loc, EShLangVertex, "attribute"); + parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "attribute"); + parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "attribute"); + parseContext.requireNotRemoved((yyvsp[0].lex).loc, ECoreProfile, 420, "attribute"); + parseContext.requireNotRemoved((yyvsp[0].lex).loc, EEsProfile, 300, "attribute"); + + parseContext.globalCheck((yyvsp[0].lex).loc, "attribute"); + + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.storage = EvqVaryingIn; } -#line 4166 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5563 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 88: -#line 722 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 154: +#line 1248 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.samplerConstructorLocationCheck((yyvsp[-1].lex).loc, ",", (yyvsp[0].interm.intermTypedNode)); - (yyval.interm.intermTypedNode) = parseContext.intermediate.addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc); - if ((yyval.interm.intermTypedNode) == 0) { - parseContext.binaryOpError((yyvsp[-1].lex).loc, ",", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString()); - (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); - } + parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "varying"); + parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "varying"); + parseContext.requireNotRemoved((yyvsp[0].lex).loc, ECoreProfile, 420, "varying"); + parseContext.requireNotRemoved((yyvsp[0].lex).loc, EEsProfile, 300, "varying"); + + parseContext.globalCheck((yyvsp[0].lex).loc, "varying"); + + (yyval.interm.type).init((yyvsp[0].lex).loc); + if (parseContext.language == EShLangVertex) + (yyval.interm.type).qualifier.storage = EvqVaryingOut; + else + (yyval.interm.type).qualifier.storage = EvqVaryingIn; } -#line 4179 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5582 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 89: -#line 733 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 155: +#line 1262 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.constantValueCheck((yyvsp[0].interm.intermTypedNode), ""); - (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); + parseContext.globalCheck((yyvsp[0].lex).loc, "inout"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.storage = EvqInOut; } -#line 4188 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5592 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 90: -#line 740 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 156: +#line 1267 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.handleFunctionDeclarator((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).function, true /* prototype */); - (yyval.interm.intermNode) = 0; - // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature + parseContext.globalCheck((yyvsp[0].lex).loc, "in"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + // whether this is a parameter "in" or a pipeline "in" will get sorted out a bit later + (yyval.interm.type).qualifier.storage = EvqIn; } -#line 4198 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5603 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 91: -#line 745 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 157: +#line 1273 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - if ((yyvsp[-1].interm).intermNode && (yyvsp[-1].interm).intermNode->getAsAggregate()) - (yyvsp[-1].interm).intermNode->getAsAggregate()->setOperator(EOpSequence); - (yyval.interm.intermNode) = (yyvsp[-1].interm).intermNode; + parseContext.globalCheck((yyvsp[0].lex).loc, "out"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + // whether this is a parameter "out" or a pipeline "out" will get sorted out a bit later + (yyval.interm.type).qualifier.storage = EvqOut; } -#line 4208 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5614 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 92: -#line 750 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 158: +#line 1279 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.profileRequires((yyvsp[-3].lex).loc, ENoProfile, 130, 0, "precision statement"); - - // lazy setting of the previous scope's defaults, has effect only the first time it is called in a particular scope - parseContext.symbolTable.setPreviousDefaultPrecisions(&parseContext.defaultPrecision[0]); - parseContext.setDefaultPrecision((yyvsp[-3].lex).loc, (yyvsp[-1].interm.type), (yyvsp[-2].interm.type).qualifier.precision); - (yyval.interm.intermNode) = 0; + parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 120, 0, "centroid"); + parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "centroid"); + parseContext.globalCheck((yyvsp[0].lex).loc, "centroid"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.centroid = true; } -#line 4221 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5626 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 93: -#line 758 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 159: +#line 1286 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.declareBlock((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).typeList); - (yyval.interm.intermNode) = 0; + parseContext.globalCheck((yyvsp[0].lex).loc, "patch"); + parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTessControlMask | EShLangTessEvaluationMask), "patch"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.patch = true; } -#line 4230 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5637 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 94: -#line 762 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 160: +#line 1292 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.declareBlock((yyvsp[-2].interm).loc, *(yyvsp[-2].interm).typeList, (yyvsp[-1].lex).string); - (yyval.interm.intermNode) = 0; + parseContext.globalCheck((yyvsp[0].lex).loc, "sample"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.sample = true; } -#line 4239 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5647 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 95: -#line 766 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 161: +#line 1297 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.declareBlock((yyvsp[-3].interm).loc, *(yyvsp[-3].interm).typeList, (yyvsp[-2].lex).string, (yyvsp[-1].interm).arraySizes); - (yyval.interm.intermNode) = 0; + parseContext.globalCheck((yyvsp[0].lex).loc, "uniform"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.storage = EvqUniform; } -#line 4248 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5657 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 96: -#line 770 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 162: +#line 1302 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier); - parseContext.updateStandaloneQualifierDefaults((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type)); - (yyval.interm.intermNode) = 0; + parseContext.globalCheck((yyvsp[0].lex).loc, "buffer"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.storage = EvqBuffer; } -#line 4258 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5667 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 97: -#line 775 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 163: +#line 1307 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.checkNoShaderLayouts((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).shaderQualifiers); - parseContext.addQualifierToExisting((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, *(yyvsp[-1].lex).string); - (yyval.interm.intermNode) = 0; + parseContext.globalCheck((yyvsp[0].lex).loc, "shared"); + parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared"); + parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 310, 0, "shared"); + parseContext.requireStage((yyvsp[0].lex).loc, EShLangCompute, "shared"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.storage = EvqShared; } -#line 4268 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5680 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 98: -#line 780 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 164: +#line 1315 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.checkNoShaderLayouts((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).shaderQualifiers); - (yyvsp[-1].interm.identifierList)->push_back((yyvsp[-2].lex).string); - parseContext.addQualifierToExisting((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier, *(yyvsp[-1].interm.identifierList)); - (yyval.interm.intermNode) = 0; + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.coherent = true; } -#line 4279 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ - break; - - case 99: -#line 789 "MachineIndependent/glslang.y" /* yacc.c:1646 */ - { parseContext.nestedBlockCheck((yyvsp[-2].interm.type).loc); } -#line 4285 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5689 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 100: -#line 789 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 165: +#line 1319 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - --parseContext.structNestingLevel; - parseContext.blockName = (yyvsp[-4].lex).string; - parseContext.globalQualifierFixCheck((yyvsp[-5].interm.type).loc, (yyvsp[-5].interm.type).qualifier); - parseContext.checkNoShaderLayouts((yyvsp[-5].interm.type).loc, (yyvsp[-5].interm.type).shaderQualifiers); - parseContext.currentBlockQualifier = (yyvsp[-5].interm.type).qualifier; - (yyval.interm).loc = (yyvsp[-5].interm.type).loc; - (yyval.interm).typeList = (yyvsp[-1].interm.typeList); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.volatil = true; } -#line 4299 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5698 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 101: -#line 800 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 166: +#line 1323 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.identifierList) = new TIdentifierList; - (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.restrict = true; } -#line 4308 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5707 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 102: -#line 804 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 167: +#line 1327 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.identifierList) = (yyvsp[-2].interm.identifierList); - (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.readonly = true; } -#line 4317 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5716 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 103: -#line 811 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 168: +#line 1331 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).function = (yyvsp[-1].interm.function); - (yyval.interm).loc = (yyvsp[0].lex).loc; + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.writeonly = true; } -#line 4326 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5725 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 104: -#line 818 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 169: +#line 1335 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.function) = (yyvsp[0].interm.function); + parseContext.spvRemoved((yyvsp[0].lex).loc, "subroutine"); + parseContext.globalCheck((yyvsp[0].lex).loc, "subroutine"); + parseContext.unimplemented((yyvsp[0].lex).loc, "subroutine"); + (yyval.interm.type).init((yyvsp[0].lex).loc); } -#line 4334 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5736 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 105: -#line 821 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 170: +#line 1341 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.function) = (yyvsp[0].interm.function); + parseContext.spvRemoved((yyvsp[-3].lex).loc, "subroutine"); + parseContext.globalCheck((yyvsp[-3].lex).loc, "subroutine"); + parseContext.unimplemented((yyvsp[-3].lex).loc, "subroutine"); + (yyval.interm.type).init((yyvsp[-3].lex).loc); } -#line 4342 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5747 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 106: -#line 828 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 171: +#line 1350 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - // Add the parameter - (yyval.interm.function) = (yyvsp[-1].interm.function); - if ((yyvsp[0].interm).param.type->getBasicType() != EbtVoid) - (yyvsp[-1].interm.function)->addParameter((yyvsp[0].interm).param); - else - delete (yyvsp[0].interm).param.type; + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.nonUniform = true; } -#line 4355 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5756 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 107: -#line 836 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 172: +#line 1357 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - // - // Only first parameter of one-parameter functions can be void - // The check for named parameters not being void is done in parameter_declarator - // - if ((yyvsp[0].interm).param.type->getBasicType() == EbtVoid) { - // - // This parameter > first is void - // - parseContext.error((yyvsp[-1].lex).loc, "cannot be an argument type except for '(void)'", "void", ""); - delete (yyvsp[0].interm).param.type; - } else { - // Add the parameter - (yyval.interm.function) = (yyvsp[-2].interm.function); - (yyvsp[-2].interm.function)->addParameter((yyvsp[0].interm).param); - } + // TODO } -#line 4377 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5764 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 108: -#line 856 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 173: +#line 1360 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - if ((yyvsp[-2].interm.type).qualifier.storage != EvqGlobal && (yyvsp[-2].interm.type).qualifier.storage != EvqTemporary) { - parseContext.error((yyvsp[-1].lex).loc, "no qualifiers allowed for function return", - GetStorageQualifierString((yyvsp[-2].interm.type).qualifier.storage), ""); - } - if ((yyvsp[-2].interm.type).arraySizes) - parseContext.arraySizeRequiredCheck((yyvsp[-2].interm.type).loc, *(yyvsp[-2].interm.type).arraySizes); - - // Add the function as a prototype after parsing it (we do not support recursion) - TFunction *function; - TType type((yyvsp[-2].interm.type)); - - // Potentially rename shader entry point function. No-op most of the time. - parseContext.renameShaderFunction((yyvsp[-1].lex).string); - - // Make the function - function = new TFunction((yyvsp[-1].lex).string, type); - (yyval.interm.function) = function; + // TODO: 4.0 semantics: subroutines + // 1) make sure each identifier is a type declared earlier with SUBROUTINE + // 2) save all of the identifiers for future comparison with the declared function } -#line 4401 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5774 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 109: -#line 879 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 174: +#line 1368 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - if ((yyvsp[-1].interm.type).arraySizes) { - parseContext.profileRequires((yyvsp[-1].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); - parseContext.profileRequires((yyvsp[-1].interm.type).loc, EEsProfile, 300, 0, "arrayed type"); - parseContext.arraySizeRequiredCheck((yyvsp[-1].interm.type).loc, *(yyvsp[-1].interm.type).arraySizes); - } - if ((yyvsp[-1].interm.type).basicType == EbtVoid) { - parseContext.error((yyvsp[0].lex).loc, "illegal use of type 'void'", (yyvsp[0].lex).string->c_str(), ""); - } - parseContext.reservedErrorCheck((yyvsp[0].lex).loc, *(yyvsp[0].lex).string); - - TParameter param = {(yyvsp[0].lex).string, new TType((yyvsp[-1].interm.type))}; - (yyval.interm).loc = (yyvsp[0].lex).loc; - (yyval.interm).param = param; + (yyval.interm.type) = (yyvsp[0].interm.type); + (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type)); } -#line 4421 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5783 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 110: -#line 894 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 175: +#line 1372 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - if ((yyvsp[-2].interm.type).arraySizes) { - parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); - parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, "arrayed type"); - parseContext.arraySizeRequiredCheck((yyvsp[-2].interm.type).loc, *(yyvsp[-2].interm.type).arraySizes); - } - parseContext.arrayDimCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.type).arraySizes, (yyvsp[0].interm).arraySizes); - - parseContext.arraySizeRequiredCheck((yyvsp[0].interm).loc, *(yyvsp[0].interm).arraySizes); - parseContext.reservedErrorCheck((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string); - - TParameter param = { (yyvsp[-1].lex).string, new TType((yyvsp[-2].interm.type))}; - parseContext.arrayDimMerge(*param.type, (yyvsp[0].interm).arraySizes); - - (yyval.interm).loc = (yyvsp[-1].lex).loc; - (yyval.interm).param = param; + parseContext.arrayOfArrayVersionCheck((yyvsp[0].interm).loc, (yyvsp[0].interm).arraySizes); + (yyval.interm.type) = (yyvsp[-1].interm.type); + (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type)); + (yyval.interm.type).arraySizes = (yyvsp[0].interm).arraySizes; } -#line 4443 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5794 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 111: -#line 917 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 176: +#line 1381 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm) = (yyvsp[0].interm); - if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone) - (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision; - parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); - - parseContext.checkNoShaderLayouts((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers); - parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type); - parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type); - + (yyval.interm).loc = (yyvsp[-1].lex).loc; + (yyval.interm).arraySizes = new TArraySizes; + (yyval.interm).arraySizes->addInnerSize(); } -#line 4459 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5804 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 112: -#line 928 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 177: +#line 1386 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm) = (yyvsp[0].interm); + (yyval.interm).loc = (yyvsp[-2].lex).loc; + (yyval.interm).arraySizes = new TArraySizes; - parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type); - parseContext.paramCheckFix((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type); - parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + TArraySize size; + parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size); + (yyval.interm).arraySizes->addInnerSize(size); } -#line 4471 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5817 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 113: -#line 938 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 178: +#line 1394 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm) = (yyvsp[0].interm); - if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone) - (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision; - parseContext.precisionQualifierCheck((yyvsp[-1].interm.type).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); - - parseContext.checkNoShaderLayouts((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers); - parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type); - parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type); + (yyval.interm) = (yyvsp[-2].interm); + (yyval.interm).arraySizes->addInnerSize(); } -#line 4486 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5826 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 114: -#line 948 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 179: +#line 1398 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm) = (yyvsp[0].interm); + (yyval.interm) = (yyvsp[-3].interm); - parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type); - parseContext.paramCheckFix((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type); - parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + TArraySize size; + parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size); + (yyval.interm).arraySizes->addInnerSize(size); } -#line 4498 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5838 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 115: -#line 958 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 180: +#line 1408 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - TParameter param = { 0, new TType((yyvsp[0].interm.type)) }; - (yyval.interm).param = param; - if ((yyvsp[0].interm.type).arraySizes) - parseContext.arraySizeRequiredCheck((yyvsp[0].interm.type).loc, *(yyvsp[0].interm.type).arraySizes); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtVoid; } -#line 4509 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5847 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 116: -#line 967 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 181: +#line 1412 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm) = (yyvsp[0].interm); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; } -#line 4517 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5856 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 117: -#line 970 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 182: +#line 1416 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm) = (yyvsp[-2].interm); - parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-2].interm).type); + parseContext.doubleCheck((yyvsp[0].lex).loc, "double"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; } -#line 4526 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5866 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 118: -#line 974 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 183: +#line 1421 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm) = (yyvsp[-3].interm); - parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-3].interm).type, (yyvsp[0].interm).arraySizes); + parseContext.float16Check((yyvsp[0].lex).loc, "float16_t", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; } -#line 4535 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5876 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 119: -#line 978 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 184: +#line 1426 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).type = (yyvsp[-5].interm).type; - TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-5].interm).type, (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode)); - (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-5].interm).intermNode, initNode, (yyvsp[-1].lex).loc); + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; } -#line 4545 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5886 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 120: -#line 983 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 185: +#line 1431 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).type = (yyvsp[-4].interm).type; - TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-4].interm).type, 0, (yyvsp[0].interm.intermTypedNode)); - (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-4].interm).intermNode, initNode, (yyvsp[-1].lex).loc); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; } -#line 4555 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5896 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 121: -#line 991 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 186: +#line 1436 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).type = (yyvsp[0].interm.type); - (yyval.interm).intermNode = 0; - parseContext.declareTypeDefaults((yyval.interm).loc, (yyval.interm).type); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt; } -#line 4565 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5905 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 122: -#line 996 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 187: +#line 1440 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).type = (yyvsp[-1].interm.type); - (yyval.interm).intermNode = 0; - parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-1].interm.type)); + parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint; } -#line 4575 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5915 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 123: -#line 1001 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 188: +#line 1445 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).type = (yyvsp[-2].interm.type); - (yyval.interm).intermNode = 0; - parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-2].interm.type), (yyvsp[0].interm).arraySizes); + parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt8; } -#line 4585 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5925 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 124: -#line 1006 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 189: +#line 1450 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).type = (yyvsp[-4].interm.type); - TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-4].interm.type), (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode)); - (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc); + parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint8; } -#line 4595 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5935 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 125: -#line 1011 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 190: +#line 1455 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).type = (yyvsp[-3].interm.type); - TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-3].interm.type), 0, (yyvsp[0].interm.intermTypedNode)); - (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc); + parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt16; } -#line 4605 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5945 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 126: -#line 1020 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 191: +#line 1460 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type) = (yyvsp[0].interm.type); - - parseContext.globalQualifierTypeCheck((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier, (yyval.interm.type)); - if ((yyvsp[0].interm.type).arraySizes) { - parseContext.profileRequires((yyvsp[0].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); - parseContext.profileRequires((yyvsp[0].interm.type).loc, EEsProfile, 300, 0, "arrayed type"); - } - - parseContext.precisionQualifierCheck((yyval.interm.type).loc, (yyval.interm.type).basicType, (yyval.interm.type).qualifier); + parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint16; } -#line 4621 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5955 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 127: -#line 1031 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 192: +#line 1465 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier); - parseContext.globalQualifierTypeCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, (yyvsp[0].interm.type)); - - if ((yyvsp[0].interm.type).arraySizes) { - parseContext.profileRequires((yyvsp[0].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); - parseContext.profileRequires((yyvsp[0].interm.type).loc, EEsProfile, 300, 0, "arrayed type"); - } - - if ((yyvsp[0].interm.type).arraySizes && parseContext.arrayQualifierError((yyvsp[0].interm.type).loc, (yyvsp[-1].interm.type).qualifier)) - (yyvsp[0].interm.type).arraySizes = 0; - - parseContext.checkNoShaderLayouts((yyvsp[0].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers); - (yyvsp[0].interm.type).shaderQualifiers.merge((yyvsp[-1].interm.type).shaderQualifiers); - parseContext.mergeQualifiers((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier, (yyvsp[-1].interm.type).qualifier, true); - parseContext.precisionQualifierCheck((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).basicType, (yyvsp[0].interm.type).qualifier); - - (yyval.interm.type) = (yyvsp[0].interm.type); - - if (! (yyval.interm.type).qualifier.isInterpolation() && - ((parseContext.language == EShLangVertex && (yyval.interm.type).qualifier.storage == EvqVaryingOut) || - (parseContext.language == EShLangFragment && (yyval.interm.type).qualifier.storage == EvqVaryingIn))) - (yyval.interm.type).qualifier.smooth = true; + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt; } -#line 4650 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5965 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 128: -#line 1058 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 193: +#line 1470 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalCheck((yyvsp[0].lex).loc, "invariant"); - parseContext.profileRequires((yyval.interm.type).loc, ENoProfile, 120, 0, "invariant"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.invariant = true; + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint; } -#line 4661 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5975 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 129: -#line 1067 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 194: +#line 1475 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalCheck((yyvsp[0].lex).loc, "smooth"); - parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "smooth"); - parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "smooth"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.smooth = true; + parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt64; } -#line 4673 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5985 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 130: -#line 1074 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 195: +#line 1480 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalCheck((yyvsp[0].lex).loc, "flat"); - parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "flat"); - parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "flat"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.flat = true; + parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint64; } -#line 4685 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 5995 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 131: -#line 1081 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 196: +#line 1485 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalCheck((yyvsp[0].lex).loc, "noperspective"); - parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, "noperspective"); - parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "noperspective"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.nopersp = true; + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtBool; } -#line 4697 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6004 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 132: -#line 1088 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 197: +#line 1489 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.globalCheck((yyvsp[0].lex).loc, "__explicitInterpAMD"); - parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation"); - parseContext.profileRequires((yyvsp[0].lex).loc, ECompatibilityProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.explicitInterp = true; -#endif + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setVector(2); } -#line 4711 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6014 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 133: -#line 1100 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 198: +#line 1494 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type) = (yyvsp[-1].interm.type); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setVector(3); } -#line 4719 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6024 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 134: -#line 1106 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 199: +#line 1499 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type) = (yyvsp[0].interm.type); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setVector(4); } -#line 4727 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6034 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 135: -#line 1109 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 200: +#line 1504 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type) = (yyvsp[-2].interm.type); - (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers); - parseContext.mergeObjectLayoutQualifiers((yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false); + parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setVector(2); } -#line 4737 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6045 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 136: -#line 1116 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 201: +#line 1510 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type).init((yyvsp[0].lex).loc); - parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), *(yyvsp[0].lex).string); + parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setVector(3); } -#line 4746 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6056 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 137: -#line 1120 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 202: +#line 1516 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type).init((yyvsp[-2].lex).loc); - parseContext.setLayoutQualifier((yyvsp[-2].lex).loc, (yyval.interm.type), *(yyvsp[-2].lex).string, (yyvsp[0].interm.intermTypedNode)); - } -#line 4755 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ - break; - - case 138: -#line 1124 "MachineIndependent/glslang.y" /* yacc.c:1646 */ - { // because "shared" is both an identifier and a keyword - (yyval.interm.type).init((yyvsp[0].lex).loc); - TString strShared("shared"); - parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), strShared); + parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setVector(4); } -#line 4765 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6067 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 139: -#line 1132 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 203: +#line 1522 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.profileRequires((yyval.interm.type).loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader5, "precise"); - parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5, "precise"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.noContraction = true; + parseContext.float16Check((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setVector(2); } -#line 4776 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6078 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 140: -#line 1141 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 204: +#line 1528 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type) = (yyvsp[0].interm.type); + parseContext.float16Check((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setVector(3); } -#line 4784 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6089 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 141: -#line 1144 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 205: +#line 1534 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type) = (yyvsp[-1].interm.type); - if ((yyval.interm.type).basicType == EbtVoid) - (yyval.interm.type).basicType = (yyvsp[0].interm.type).basicType; - - (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers); - parseContext.mergeQualifiers((yyval.interm.type).loc, (yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false); + parseContext.float16Check((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setVector(4); } -#line 4797 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6100 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 142: -#line 1155 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 206: +#line 1540 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type) = (yyvsp[0].interm.type); + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setVector(2); } -#line 4805 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6111 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 143: -#line 1158 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 207: +#line 1546 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type) = (yyvsp[0].interm.type); + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setVector(3); } -#line 4813 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6122 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 144: -#line 1161 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 208: +#line 1552 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.checkPrecisionQualifier((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier.precision); - (yyval.interm.type) = (yyvsp[0].interm.type); + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setVector(4); } -#line 4822 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6133 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 145: -#line 1165 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 209: +#line 1558 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - // allow inheritance of storage qualifier from block declaration - (yyval.interm.type) = (yyvsp[0].interm.type); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setVector(2); } -#line 4831 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6144 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 146: -#line 1169 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 210: +#line 1564 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - // allow inheritance of storage qualifier from block declaration - (yyval.interm.type) = (yyvsp[0].interm.type); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setVector(3); } -#line 4840 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6155 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 147: -#line 1173 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 211: +#line 1570 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - // allow inheritance of storage qualifier from block declaration - (yyval.interm.type) = (yyvsp[0].interm.type); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setVector(4); } -#line 4849 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6166 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 148: -#line 1180 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 212: +#line 1576 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.storage = EvqConst; // will later turn into EvqConstReadOnly, if the initializer is not constant + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtBool; + (yyval.interm.type).setVector(2); } -#line 4858 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6176 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 149: -#line 1184 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 213: +#line 1581 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.requireStage((yyvsp[0].lex).loc, EShLangVertex, "attribute"); - parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "attribute"); - parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "attribute"); - parseContext.requireNotRemoved((yyvsp[0].lex).loc, ECoreProfile, 420, "attribute"); - parseContext.requireNotRemoved((yyvsp[0].lex).loc, EEsProfile, 300, "attribute"); - - parseContext.globalCheck((yyvsp[0].lex).loc, "attribute"); - - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.storage = EvqVaryingIn; + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtBool; + (yyval.interm.type).setVector(3); } -#line 4875 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6186 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 150: -#line 1196 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 214: +#line 1586 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "varying"); - parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "varying"); - parseContext.requireNotRemoved((yyvsp[0].lex).loc, ECoreProfile, 420, "varying"); - parseContext.requireNotRemoved((yyvsp[0].lex).loc, EEsProfile, 300, "varying"); - - parseContext.globalCheck((yyvsp[0].lex).loc, "varying"); - - (yyval.interm.type).init((yyvsp[0].lex).loc); - if (parseContext.language == EShLangVertex) - (yyval.interm.type).qualifier.storage = EvqVaryingOut; - else - (yyval.interm.type).qualifier.storage = EvqVaryingIn; + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtBool; + (yyval.interm.type).setVector(4); } -#line 4894 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6196 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 151: -#line 1210 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 215: +#line 1591 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalCheck((yyvsp[0].lex).loc, "inout"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.storage = EvqInOut; + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt; + (yyval.interm.type).setVector(2); } -#line 4904 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6206 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 152: -#line 1215 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 216: +#line 1596 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalCheck((yyvsp[0].lex).loc, "in"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - // whether this is a parameter "in" or a pipeline "in" will get sorted out a bit later - (yyval.interm.type).qualifier.storage = EvqIn; + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt; + (yyval.interm.type).setVector(3); } -#line 4915 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6216 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 153: -#line 1221 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 217: +#line 1601 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalCheck((yyvsp[0].lex).loc, "out"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - // whether this is a parameter "out" or a pipeline "out" will get sorted out a bit later - (yyval.interm.type).qualifier.storage = EvqOut; + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt; + (yyval.interm.type).setVector(4); } -#line 4926 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6226 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 154: -#line 1227 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 218: +#line 1606 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 120, 0, "centroid"); - parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "centroid"); - parseContext.globalCheck((yyvsp[0].lex).loc, "centroid"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.centroid = true; + parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt8; + (yyval.interm.type).setVector(2); } -#line 4938 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6237 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 155: -#line 1234 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 219: +#line 1612 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalCheck((yyvsp[0].lex).loc, "patch"); - parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTessControlMask | EShLangTessEvaluationMask), "patch"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.patch = true; + parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt8; + (yyval.interm.type).setVector(3); } -#line 4949 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6248 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 156: -#line 1240 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 220: +#line 1618 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalCheck((yyvsp[0].lex).loc, "sample"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.sample = true; + parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt8; + (yyval.interm.type).setVector(4); } -#line 4959 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6259 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 157: -#line 1245 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 221: +#line 1624 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalCheck((yyvsp[0].lex).loc, "uniform"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.storage = EvqUniform; + parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt16; + (yyval.interm.type).setVector(2); } -#line 4969 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6270 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 158: -#line 1250 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 222: +#line 1630 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalCheck((yyvsp[0].lex).loc, "buffer"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.storage = EvqBuffer; + parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt16; + (yyval.interm.type).setVector(3); } -#line 4979 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6281 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 159: -#line 1255 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 223: +#line 1636 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalCheck((yyvsp[0].lex).loc, "shared"); - parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared"); - parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 310, 0, "shared"); - parseContext.requireStage((yyvsp[0].lex).loc, EShLangCompute, "shared"); - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.storage = EvqShared; + parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt16; + (yyval.interm.type).setVector(4); } -#line 4992 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6292 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 160: -#line 1263 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 224: +#line 1642 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.coherent = true; + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt; + (yyval.interm.type).setVector(2); } -#line 5001 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6303 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 161: -#line 1267 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 225: +#line 1648 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.volatil = true; + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt; + (yyval.interm.type).setVector(3); } -#line 5010 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6314 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 162: -#line 1271 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 226: +#line 1654 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.restrict = true; + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt; + (yyval.interm.type).setVector(4); } -#line 5019 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6325 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 163: -#line 1275 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 227: +#line 1660 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.readonly = true; + parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt64; + (yyval.interm.type).setVector(2); } -#line 5028 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6336 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 164: -#line 1279 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 228: +#line 1666 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type).init((yyvsp[0].lex).loc); - (yyval.interm.type).qualifier.writeonly = true; + parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt64; + (yyval.interm.type).setVector(3); } -#line 5037 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6347 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 165: -#line 1283 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 229: +#line 1672 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.spvRemoved((yyvsp[0].lex).loc, "subroutine"); - parseContext.globalCheck((yyvsp[0].lex).loc, "subroutine"); - parseContext.unimplemented((yyvsp[0].lex).loc, "subroutine"); - (yyval.interm.type).init((yyvsp[0].lex).loc); + parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt64; + (yyval.interm.type).setVector(4); } -#line 5048 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6358 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 166: -#line 1289 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 230: +#line 1678 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.spvRemoved((yyvsp[-3].lex).loc, "subroutine"); - parseContext.globalCheck((yyvsp[-3].lex).loc, "subroutine"); - parseContext.unimplemented((yyvsp[-3].lex).loc, "subroutine"); - (yyval.interm.type).init((yyvsp[-3].lex).loc); + parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint; + (yyval.interm.type).setVector(2); } -#line 5059 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6369 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 167: -#line 1298 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 231: +#line 1684 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - // TODO + parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint; + (yyval.interm.type).setVector(3); } -#line 5067 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6380 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 168: -#line 1301 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 232: +#line 1690 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - // TODO: 4.0 semantics: subroutines - // 1) make sure each identifier is a type declared earlier with SUBROUTINE - // 2) save all of the identifiers for future comparison with the declared function + parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint; + (yyval.interm.type).setVector(4); } -#line 5077 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6391 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 169: -#line 1309 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 233: +#line 1696 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm.type) = (yyvsp[0].interm.type); - (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type)); + parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint8; + (yyval.interm.type).setVector(2); } -#line 5086 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6402 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 170: -#line 1313 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 234: +#line 1702 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.arrayDimCheck((yyvsp[0].interm).loc, (yyvsp[0].interm).arraySizes, 0); - (yyval.interm.type) = (yyvsp[-1].interm.type); - (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type)); - (yyval.interm.type).arraySizes = (yyvsp[0].interm).arraySizes; + parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt8; + (yyval.interm.type).setVector(3); } -#line 5097 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6413 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 171: -#line 1322 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 235: +#line 1708 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).loc = (yyvsp[-1].lex).loc; - (yyval.interm).arraySizes = new TArraySizes; - (yyval.interm).arraySizes->addInnerSize(); + parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint8; + (yyval.interm.type).setVector(4); } -#line 5107 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6424 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 172: -#line 1327 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 236: +#line 1714 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm).loc = (yyvsp[-2].lex).loc; - (yyval.interm).arraySizes = new TArraySizes; - - TArraySize size; - parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size); - (yyval.interm).arraySizes->addInnerSize(size); + parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint16; + (yyval.interm.type).setVector(2); } -#line 5120 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6435 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 173: -#line 1335 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 237: +#line 1720 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm) = (yyvsp[-2].interm); - (yyval.interm).arraySizes->addInnerSize(); + parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint16; + (yyval.interm.type).setVector(3); } -#line 5129 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6446 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 174: -#line 1339 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 238: +#line 1726 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - (yyval.interm) = (yyvsp[-3].interm); + parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint16; + (yyval.interm.type).setVector(4); + } +#line 6457 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; - TArraySize size; - parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size); - (yyval.interm).arraySizes->addInnerSize(size); + case 239: +#line 1732 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint; + (yyval.interm.type).setVector(2); } -#line 5141 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6468 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 175: -#line 1349 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 240: +#line 1738 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtVoid; + (yyval.interm.type).basicType = EbtUint; + (yyval.interm.type).setVector(3); } -#line 5150 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6479 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 176: -#line 1353 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 241: +#line 1744 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).basicType = EbtUint; + (yyval.interm.type).setVector(4); } -#line 5159 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6490 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 177: -#line 1357 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 242: +#line 1750 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double"); + parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).basicType = EbtUint64; + (yyval.interm.type).setVector(2); } -#line 5169 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6501 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 178: -#line 1362 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 243: +#line 1756 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float", parseContext.symbolTable.atBuiltInLevel()); + parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; -#endif + (yyval.interm.type).basicType = EbtUint64; + (yyval.interm.type).setVector(3); } -#line 5181 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6512 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 179: -#line 1369 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 244: +#line 1762 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt; + (yyval.interm.type).basicType = EbtUint64; + (yyval.interm.type).setVector(4); } -#line 5190 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6523 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 180: -#line 1373 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 245: +#line 1768 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint; + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setMatrix(2, 2); } -#line 5200 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6533 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 181: -#line 1378 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 246: +#line 1773 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt64; + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setMatrix(3, 3); } -#line 5210 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6543 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 182: -#line 1383 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 247: +#line 1778 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint64; + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setMatrix(4, 4); } -#line 5220 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6553 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 183: -#line 1388 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 248: +#line 1783 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.int16Check((yyvsp[0].lex).loc, "16-bit integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt16; -#endif + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setMatrix(2, 2); } -#line 5232 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6563 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 184: -#line 1395 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 249: +#line 1788 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.int16Check((yyvsp[0].lex).loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint16; -#endif + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setMatrix(2, 3); } -#line 5244 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6573 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 185: -#line 1402 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 250: +#line 1793 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtBool; + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setMatrix(2, 4); } -#line 5253 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6583 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 186: -#line 1406 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 251: +#line 1798 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; - (yyval.interm.type).setVector(2); + (yyval.interm.type).setMatrix(3, 2); } -#line 5263 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6593 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 187: -#line 1411 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 252: +#line 1803 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; - (yyval.interm.type).setVector(3); + (yyval.interm.type).setMatrix(3, 3); } -#line 5273 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6603 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 188: -#line 1416 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 253: +#line 1808 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; - (yyval.interm.type).setVector(4); + (yyval.interm.type).setMatrix(3, 4); } -#line 5283 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6613 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 189: -#line 1421 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 254: +#line 1813 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setVector(2); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setMatrix(4, 2); } -#line 5294 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6623 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 190: -#line 1427 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 255: +#line 1818 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setVector(3); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setMatrix(4, 3); } -#line 5305 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6633 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 191: -#line 1433 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 256: +#line 1823 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setVector(4); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setMatrix(4, 4); } -#line 5316 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6643 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 192: -#line 1439 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 257: +#line 1828 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setVector(2); -#endif + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(2, 2); } -#line 5329 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6654 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 193: -#line 1447 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 258: +#line 1834 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setVector(3); -#endif + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(3, 3); } -#line 5342 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6665 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 194: -#line 1455 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 259: +#line 1840 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setVector(4); -#endif + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(4, 4); } -#line 5355 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6676 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 195: -#line 1463 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 260: +#line 1846 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtBool; - (yyval.interm.type).setVector(2); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(2, 2); } -#line 5365 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6687 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 196: -#line 1468 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 261: +#line 1852 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtBool; - (yyval.interm.type).setVector(3); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(2, 3); } -#line 5375 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6698 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 197: -#line 1473 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 262: +#line 1858 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtBool; - (yyval.interm.type).setVector(4); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(2, 4); } -#line 5385 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6709 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 198: -#line 1478 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 263: +#line 1864 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt; - (yyval.interm.type).setVector(2); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(3, 2); } -#line 5395 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6720 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 199: -#line 1483 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 264: +#line 1870 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt; - (yyval.interm.type).setVector(3); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(3, 3); } -#line 5405 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6731 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 200: -#line 1488 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 265: +#line 1876 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt; - (yyval.interm.type).setVector(4); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(3, 4); } -#line 5415 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6742 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 201: -#line 1493 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 266: +#line 1882 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt64; - (yyval.interm.type).setVector(2); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(4, 2); } -#line 5426 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6753 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 202: -#line 1499 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 267: +#line 1888 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt64; - (yyval.interm.type).setVector(3); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(4, 3); } -#line 5437 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6764 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 203: -#line 1505 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 268: +#line 1894 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt64; - (yyval.interm.type).setVector(4); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(4, 4); } -#line 5448 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6775 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 204: -#line 1511 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 269: +#line 1900 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.int16Check((yyvsp[0].lex).loc, "16-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt16; - (yyval.interm.type).setVector(2); -#endif + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(2, 2); } -#line 5461 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6786 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 205: -#line 1519 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 270: +#line 1906 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.int16Check((yyvsp[0].lex).loc, "16-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt16; - (yyval.interm.type).setVector(3); -#endif + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(3, 3); } -#line 5474 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6797 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 206: -#line 1527 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 271: +#line 1912 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.int16Check((yyvsp[0].lex).loc, "16-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt16; - (yyval.interm.type).setVector(4); -#endif + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(4, 4); } -#line 5487 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6808 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 207: -#line 1535 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 272: +#line 1918 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector"); + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint; - (yyval.interm.type).setVector(2); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(2, 2); } -#line 5498 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6819 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 208: -#line 1541 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 273: +#line 1924 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector"); + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint; - (yyval.interm.type).setVector(3); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(2, 3); } -#line 5509 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6830 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 209: -#line 1547 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 274: +#line 1930 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector"); + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint; - (yyval.interm.type).setVector(4); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(2, 4); } -#line 5520 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6841 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 210: -#line 1553 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 275: +#line 1936 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint64; - (yyval.interm.type).setVector(2); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(3, 2); } -#line 5531 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6852 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 211: -#line 1559 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 276: +#line 1942 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint64; - (yyval.interm.type).setVector(3); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(3, 3); } -#line 5542 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6863 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 212: -#line 1565 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 277: +#line 1948 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint64; - (yyval.interm.type).setVector(4); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(3, 4); } -#line 5553 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6874 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 213: -#line 1571 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 278: +#line 1954 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.int16Check((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint16; - (yyval.interm.type).setVector(2); -#endif + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(4, 2); } -#line 5566 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6885 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 214: -#line 1579 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 279: +#line 1960 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.int16Check((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint16; - (yyval.interm.type).setVector(3); -#endif + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(4, 3); } -#line 5579 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6896 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 215: -#line 1587 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 280: +#line 1966 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.int16Check((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint16; - (yyval.interm.type).setVector(4); -#endif + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(4, 4); } -#line 5592 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6907 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 216: -#line 1595 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 281: +#line 1972 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 2); } -#line 5602 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6918 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 217: -#line 1600 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 282: +#line 1978 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 3); } -#line 5612 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6929 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 218: -#line 1605 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 283: +#line 1984 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 4); } -#line 5622 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6940 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 219: -#line 1610 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 284: +#line 1990 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 2); } -#line 5632 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6951 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 220: -#line 1615 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 285: +#line 1996 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 3); } -#line 5642 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6962 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 221: -#line 1620 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 286: +#line 2002 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 4); } -#line 5652 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6973 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 222: -#line 1625 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 287: +#line 2008 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 2); } -#line 5662 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6984 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 223: -#line 1630 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 288: +#line 2014 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 3); } -#line 5672 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 6995 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 224: -#line 1635 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 289: +#line 2020 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 4); } -#line 5682 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7006 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 225: -#line 1640 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 290: +#line 2026 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 2); } -#line 5692 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7017 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 226: -#line 1645 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 291: +#line 2032 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 3); } -#line 5702 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7028 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 227: -#line 1650 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 292: +#line 2038 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 4); } -#line 5712 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7039 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 228: -#line 1655 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 293: +#line 2044 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 2); } -#line 5723 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7050 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 229: -#line 1661 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 294: +#line 2050 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 3); } -#line 5734 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7061 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 230: -#line 1667 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 295: +#line 2056 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 4); } -#line 5745 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7072 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 231: -#line 1673 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 296: +#line 2062 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 2); } -#line 5756 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7083 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 232: -#line 1679 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 297: +#line 2068 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 3); } -#line 5767 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7094 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 233: -#line 1685 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 298: +#line 2074 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 4); } -#line 5778 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7105 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 234: -#line 1691 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 299: +#line 2080 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 2); } -#line 5789 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7116 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 235: -#line 1697 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 300: +#line 2086 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 3); } -#line 5800 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7127 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 236: -#line 1703 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 301: +#line 2092 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 4); } -#line 5811 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7138 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 237: -#line 1709 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 302: +#line 2098 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 2); } -#line 5822 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7149 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 303: +#line 2104 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(4, 3); + } +#line 7160 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 304: +#line 2110 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(4, 4); + } +#line 7171 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 305: +#line 2116 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + parseContext.vulkanRemoved((yyvsp[0].lex).loc, "atomic counter types"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtAtomicUint; + } +#line 7181 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 306: +#line 2121 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, Esd1D); + } +#line 7191 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 307: +#line 2126 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, Esd2D); + } +#line 7201 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 308: +#line 2131 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, Esd3D); + } +#line 7211 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 309: +#line 2136 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, EsdCube); + } +#line 7221 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 310: +#line 2141 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, Esd1D, false, true); + } +#line 7231 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 311: +#line 2146 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, true); + } +#line 7241 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 312: +#line 2151 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, EsdCube, false, true); + } +#line 7251 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 313: +#line 2156 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true); + } +#line 7261 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 314: +#line 2161 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true); + } +#line 7271 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 315: +#line 2166 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true, true); + } +#line 7281 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 238: -#line 1715 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 316: +#line 2171 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setMatrix(4, 3); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, true); } -#line 5833 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7291 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 239: -#line 1721 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 317: +#line 2176 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setMatrix(4, 4); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true); } -#line 5844 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7301 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 240: -#line 1727 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 318: +#line 2181 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { -#ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(2, 2); -#endif + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true, true); } -#line 5857 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7311 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 241: -#line 1735 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 319: +#line 2186 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { #ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(3, 3); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat16, Esd1D); #endif } -#line 5870 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7324 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 242: -#line 1743 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 320: +#line 2194 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { #ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(4, 4); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat16, Esd2D); #endif } -#line 5883 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7337 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 243: -#line 1751 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 321: +#line 2202 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { #ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(2, 2); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat16, Esd3D); #endif } -#line 5896 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7350 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 244: -#line 1759 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 322: +#line 2210 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { #ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(2, 3); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat16, EsdCube); #endif } -#line 5909 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7363 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 245: -#line 1767 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 323: +#line 2218 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { #ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(2, 4); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, false, true); #endif } -#line 5922 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7376 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 246: -#line 1775 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 324: +#line 2226 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { #ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(3, 2); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, true); #endif } -#line 5935 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7389 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 247: -#line 1783 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 325: +#line 2234 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { #ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(3, 3); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, false, true); #endif } -#line 5948 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7402 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 248: -#line 1791 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 326: +#line 2242 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { #ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(3, 4); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true); #endif } -#line 5961 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7415 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 249: -#line 1799 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 327: +#line 2250 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { #ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(4, 2); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true); #endif } -#line 5974 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7428 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 250: -#line 1807 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 328: +#line 2258 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { #ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(4, 3); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true, true); #endif } -#line 5987 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7441 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 251: -#line 1815 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 329: +#line 2266 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { #ifdef AMD_EXTENSIONS - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(4, 4); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, true); #endif } -#line 6000 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7454 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 252: -#line 1823 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 330: +#line 2274 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.vulkanRemoved((yyvsp[0].lex).loc, "atomic counter types"); +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtAtomicUint; + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true); +#endif } -#line 6010 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7467 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 253: -#line 1828 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 331: +#line 2282 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, Esd1D); + (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true, true); +#endif } -#line 6020 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7480 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 254: -#line 1833 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 332: +#line 2290 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, Esd2D); + (yyval.interm.type).sampler.set(EbtInt, Esd1D); } -#line 6030 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7490 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 255: -#line 1838 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 333: +#line 2295 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, Esd3D); + (yyval.interm.type).sampler.set(EbtInt, Esd2D); } -#line 6040 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7500 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 256: -#line 1843 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 334: +#line 2300 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, EsdCube); + (yyval.interm.type).sampler.set(EbtInt, Esd3D); } -#line 6050 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7510 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 257: -#line 1848 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 335: +#line 2305 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, Esd1D, false, true); + (yyval.interm.type).sampler.set(EbtInt, EsdCube); } -#line 6060 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7520 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 258: -#line 1853 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 336: +#line 2310 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, true); + (yyval.interm.type).sampler.set(EbtInt, Esd1D, true); } -#line 6070 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7530 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 259: -#line 1858 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 337: +#line 2315 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, EsdCube, false, true); + (yyval.interm.type).sampler.set(EbtInt, Esd2D, true); } -#line 6080 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7540 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 260: -#line 1863 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 338: +#line 2320 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true); + (yyval.interm.type).sampler.set(EbtInt, EsdCube, true); } -#line 6090 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7550 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 261: -#line 1868 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 339: +#line 2325 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true); + (yyval.interm.type).sampler.set(EbtUint, Esd1D); } -#line 6100 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7560 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 262: -#line 1873 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 340: +#line 2330 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true, true); + (yyval.interm.type).sampler.set(EbtUint, Esd2D); } -#line 6110 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7570 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 263: -#line 1878 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 341: +#line 2335 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, true); + (yyval.interm.type).sampler.set(EbtUint, Esd3D); } -#line 6120 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7580 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 264: -#line 1883 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 342: +#line 2340 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true); + (yyval.interm.type).sampler.set(EbtUint, EsdCube); } -#line 6130 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7590 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 265: -#line 1888 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 343: +#line 2345 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true, true); + (yyval.interm.type).sampler.set(EbtUint, Esd1D, true); } -#line 6140 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7600 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 266: -#line 1893 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 344: +#line 2350 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtInt, Esd1D); + (yyval.interm.type).sampler.set(EbtUint, Esd2D, true); } -#line 6150 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7610 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 267: -#line 1898 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 345: +#line 2355 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtInt, Esd2D); + (yyval.interm.type).sampler.set(EbtUint, EsdCube, true); } -#line 6160 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7620 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 268: -#line 1903 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 346: +#line 2360 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtInt, Esd3D); + (yyval.interm.type).sampler.set(EbtFloat, EsdRect); } -#line 6170 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7630 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 269: -#line 1908 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 347: +#line 2365 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtInt, EsdCube); + (yyval.interm.type).sampler.set(EbtFloat, EsdRect, false, true); } -#line 6180 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7640 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 270: -#line 1913 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 348: +#line 2370 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtInt, Esd1D, true); + (yyval.interm.type).sampler.set(EbtFloat16, EsdRect); +#endif } -#line 6190 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7653 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 271: -#line 1918 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 349: +#line 2378 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtInt, Esd2D, true); + (yyval.interm.type).sampler.set(EbtFloat16, EsdRect, false, true); +#endif } -#line 6200 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7666 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 272: -#line 1923 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 350: +#line 2386 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtInt, EsdCube, true); + (yyval.interm.type).sampler.set(EbtInt, EsdRect); } -#line 6210 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7676 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 273: -#line 1928 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 351: +#line 2391 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtUint, Esd1D); + (yyval.interm.type).sampler.set(EbtUint, EsdRect); } -#line 6220 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7686 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 274: -#line 1933 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 352: +#line 2396 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtUint, Esd2D); + (yyval.interm.type).sampler.set(EbtFloat, EsdBuffer); } -#line 6230 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7696 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 275: -#line 1938 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 353: +#line 2401 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtUint, Esd3D); + (yyval.interm.type).sampler.set(EbtFloat16, EsdBuffer); +#endif } -#line 6240 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7709 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 276: -#line 1943 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 354: +#line 2409 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtUint, EsdCube); + (yyval.interm.type).sampler.set(EbtInt, EsdBuffer); } -#line 6250 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7719 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 277: -#line 1948 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 355: +#line 2414 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtUint, Esd1D, true); + (yyval.interm.type).sampler.set(EbtUint, EsdBuffer); } -#line 6260 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7729 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 278: -#line 1953 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 356: +#line 2419 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtUint, Esd2D, true); + (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, false, true); } -#line 6270 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7739 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 279: -#line 1958 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 357: +#line 2424 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtUint, EsdCube, true); + (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, false, true); +#endif } -#line 6280 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7752 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 280: -#line 1963 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 358: +#line 2432 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, EsdRect); + (yyval.interm.type).sampler.set(EbtInt, Esd2D, false, false, true); } -#line 6290 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7762 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 281: -#line 1968 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 359: +#line 2437 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, EsdRect, false, true); + (yyval.interm.type).sampler.set(EbtUint, Esd2D, false, false, true); } -#line 6300 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7772 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 282: -#line 1973 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 360: +#line 2442 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtInt, EsdRect); + (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, false, true); } -#line 6310 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7782 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 283: -#line 1978 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 361: +#line 2447 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtUint, EsdRect); + (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, false, true); +#endif } -#line 6320 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7795 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 284: -#line 1983 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 362: +#line 2455 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, EsdBuffer); + (yyval.interm.type).sampler.set(EbtInt, Esd2D, true, false, true); } -#line 6330 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7805 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 285: -#line 1988 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 363: +#line 2460 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtInt, EsdBuffer); + (yyval.interm.type).sampler.set(EbtUint, Esd2D, true, false, true); } -#line 6340 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7815 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 286: -#line 1993 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 364: +#line 2465 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtUint, EsdBuffer); + (yyval.interm.type).sampler.setPureSampler(false); } -#line 6350 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7825 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 287: -#line 1998 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 365: +#line 2470 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, false, true); + (yyval.interm.type).sampler.setPureSampler(true); } -#line 6360 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7835 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 288: -#line 2003 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 366: +#line 2475 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtInt, Esd2D, false, false, true); + (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D); } -#line 6370 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7845 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 289: -#line 2008 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 367: +#line 2480 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtUint, Esd2D, false, false, true); + (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D); +#endif } -#line 6380 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7858 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 290: -#line 2013 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 368: +#line 2488 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, false, true); + (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D); } -#line 6390 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7868 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 291: -#line 2018 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 369: +#line 2493 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtInt, Esd2D, true, false, true); + (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D); +#endif } -#line 6400 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7881 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 292: -#line 2023 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 370: +#line 2501 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.set(EbtUint, Esd2D, true, false, true); + (yyval.interm.type).sampler.setTexture(EbtFloat, Esd3D); } -#line 6410 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7891 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 293: -#line 2028 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 371: +#line 2506 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.setPureSampler(false); + (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd3D); +#endif } -#line 6420 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7904 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 294: -#line 2033 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 372: +#line 2514 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.setPureSampler(true); + (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube); } -#line 6430 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7914 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 295: -#line 2038 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 373: +#line 2519 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D); + (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube); +#endif } -#line 6440 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7927 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 296: -#line 2043 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 374: +#line 2527 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D); + (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D, true); } -#line 6450 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7937 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 297: -#line 2048 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 375: +#line 2532 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.setTexture(EbtFloat, Esd3D); + (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D, true); +#endif } -#line 6460 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7950 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 298: -#line 2053 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 376: +#line 2540 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube); + (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true); } -#line 6470 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7960 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 299: -#line 2058 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 377: +#line 2545 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D, true); + (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true); +#endif } -#line 6480 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7973 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 300: -#line 2063 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 378: +#line 2553 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true); + (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube, true); } -#line 6490 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7983 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 301: -#line 2068 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 379: +#line 2558 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; - (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube, true); + (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube, true); +#endif } -#line 6500 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 7996 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 302: -#line 2073 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 380: +#line 2566 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D); } -#line 6510 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8006 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 303: -#line 2078 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 381: +#line 2571 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D); } -#line 6520 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8016 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 304: -#line 2083 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 382: +#line 2576 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd3D); } -#line 6530 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8026 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 305: -#line 2088 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 383: +#line 2581 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube); } -#line 6540 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8036 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 306: -#line 2093 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 384: +#line 2586 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D, true); } -#line 6550 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8046 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 307: -#line 2098 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 385: +#line 2591 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true); } -#line 6560 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8056 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 308: -#line 2103 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 386: +#line 2596 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube, true); } -#line 6570 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8066 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 309: -#line 2108 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 387: +#line 2601 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D); } -#line 6580 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8076 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 310: -#line 2113 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 388: +#line 2606 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D); } -#line 6590 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8086 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 311: -#line 2118 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 389: +#line 2611 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd3D); } -#line 6600 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8096 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 312: -#line 2123 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 390: +#line 2616 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube); } -#line 6610 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8106 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 313: -#line 2128 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 391: +#line 2621 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D, true); } -#line 6620 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8116 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 314: -#line 2133 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 392: +#line 2626 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true); } -#line 6630 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8126 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 315: -#line 2138 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 393: +#line 2631 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube, true); } -#line 6640 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8136 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 316: -#line 2143 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 394: +#line 2636 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, EsdRect); } -#line 6650 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8146 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 317: -#line 2148 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 395: +#line 2641 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdRect); +#endif + } +#line 8159 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 396: +#line 2649 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, EsdRect); } -#line 6660 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8169 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 318: -#line 2153 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 397: +#line 2654 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, EsdRect); } -#line 6670 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8179 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 319: -#line 2158 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 398: +#line 2659 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, EsdBuffer); } -#line 6680 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8189 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 320: -#line 2163 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 399: +#line 2664 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdBuffer); +#endif + } +#line 8202 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 400: +#line 2672 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, EsdBuffer); } -#line 6690 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8212 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 321: -#line 2168 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 401: +#line 2677 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, EsdBuffer); } -#line 6700 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8222 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 322: -#line 2173 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 402: +#line 2682 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, false, false, true); } -#line 6710 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8232 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 323: -#line 2178 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 403: +#line 2687 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, false, false, true); +#endif + } +#line 8245 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 404: +#line 2695 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, false, false, true); } -#line 6720 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8255 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 324: -#line 2183 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 405: +#line 2700 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, false, false, true); } -#line 6730 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8265 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 325: -#line 2188 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 406: +#line 2705 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true, false, true); } -#line 6740 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8275 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 326: -#line 2193 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 407: +#line 2710 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true, false, true); +#endif + } +#line 8288 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 408: +#line 2718 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true, false, true); } -#line 6750 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8298 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 327: -#line 2198 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 409: +#line 2723 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true, false, true); } -#line 6760 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8308 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 328: -#line 2203 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 410: +#line 2728 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D); } -#line 6770 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8318 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 329: -#line 2208 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 411: +#line 2733 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D); +#endif + } +#line 8331 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 412: +#line 2741 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd1D); } -#line 6780 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8341 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 330: -#line 2213 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 413: +#line 2746 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd1D); } -#line 6790 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8351 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 331: -#line 2218 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 414: +#line 2751 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D); } -#line 6800 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8361 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 332: -#line 2223 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 415: +#line 2756 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D); +#endif + } +#line 8374 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 416: +#line 2764 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd2D); } -#line 6810 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8384 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 333: -#line 2228 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 417: +#line 2769 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd2D); } -#line 6820 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8394 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 334: -#line 2233 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 418: +#line 2774 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd3D); } -#line 6830 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8404 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 335: -#line 2238 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 419: +#line 2779 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setImage(EbtFloat16, Esd3D); +#endif + } +#line 8417 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 420: +#line 2787 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd3D); } -#line 6840 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8427 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 336: -#line 2243 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 421: +#line 2792 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd3D); } -#line 6850 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8437 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 337: -#line 2248 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 422: +#line 2797 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, EsdRect); } -#line 6860 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8447 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 338: -#line 2253 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 423: +#line 2802 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setImage(EbtFloat16, EsdRect); +#endif + } +#line 8460 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 424: +#line 2810 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, EsdRect); } -#line 6870 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8470 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 339: -#line 2258 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 425: +#line 2815 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, EsdRect); } -#line 6880 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8480 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 340: -#line 2263 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 426: +#line 2820 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube); } -#line 6890 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8490 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 341: -#line 2268 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 427: +#line 2825 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube); +#endif + } +#line 8503 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 428: +#line 2833 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, EsdCube); } -#line 6900 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8513 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 342: -#line 2273 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 429: +#line 2838 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, EsdCube); } -#line 6910 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8523 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 343: -#line 2278 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 430: +#line 2843 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, EsdBuffer); } -#line 6920 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8533 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 344: -#line 2283 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 431: +#line 2848 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setImage(EbtFloat16, EsdBuffer); +#endif + } +#line 8546 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 432: +#line 2856 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, EsdBuffer); } -#line 6930 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8556 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 345: -#line 2288 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 433: +#line 2861 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, EsdBuffer); } -#line 6940 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8566 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 346: -#line 2293 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 434: +#line 2866 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D, true); } -#line 6950 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8576 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 347: -#line 2298 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 435: +#line 2871 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D, true); +#endif + } +#line 8589 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 436: +#line 2879 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd1D, true); } -#line 6960 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8599 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 348: -#line 2303 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 437: +#line 2884 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd1D, true); } -#line 6970 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8609 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 349: -#line 2308 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 438: +#line 2889 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true); } -#line 6980 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8619 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 350: -#line 2313 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 439: +#line 2894 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true); +#endif + } +#line 8632 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 440: +#line 2902 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true); } -#line 6990 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8642 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 351: -#line 2318 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 441: +#line 2907 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true); } -#line 7000 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8652 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 352: -#line 2323 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 442: +#line 2912 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube, true); } -#line 7010 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8662 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 353: -#line 2328 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 443: +#line 2917 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube, true); +#endif + } +#line 8675 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 444: +#line 2925 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, EsdCube, true); } -#line 7020 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8685 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 354: -#line 2333 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 445: +#line 2930 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, EsdCube, true); } -#line 7030 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8695 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 355: -#line 2338 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 446: +#line 2935 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, false, false, true); } -#line 7040 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8705 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 356: -#line 2343 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 447: +#line 2940 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, false, false, true); +#endif + } +#line 8718 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 448: +#line 2948 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, false, false, true); } -#line 7050 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8728 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 357: -#line 2348 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 449: +#line 2953 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, false, false, true); } -#line 7060 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8738 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 358: -#line 2353 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 450: +#line 2958 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true, false, true); } -#line 7070 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8748 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 359: -#line 2358 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 451: +#line 2963 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true, false, true); +#endif + } +#line 8761 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 452: +#line 2971 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true, false, true); } -#line 7080 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8771 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 360: -#line 2363 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 453: +#line 2976 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true, false, true); } -#line 7090 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8781 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 361: -#line 2368 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 454: +#line 2981 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { // GL_OES_EGL_image_external (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D); (yyval.interm.type).sampler.external = true; } -#line 7101 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8792 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 362: -#line 2374 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 455: +#line 2987 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtFloat); } -#line 7112 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8803 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 363: -#line 2380 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 456: +#line 2993 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtFloat, true); } -#line 7123 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8814 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 364: -#line 2386 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 457: +#line 2999 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel()); + parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setSubpass(EbtFloat16); +#endif + } +#line 8828 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 458: +#line 3008 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel()); + parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setSubpass(EbtFloat16, true); +#endif + } +#line 8842 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ + break; + + case 459: +#line 3017 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtInt); } -#line 7134 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8853 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 365: -#line 2392 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 460: +#line 3023 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtInt, true); } -#line 7145 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8864 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 366: -#line 2398 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 461: +#line 3029 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtUint); } -#line 7156 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8875 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 367: -#line 2404 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 462: +#line 3035 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtUint, true); } -#line 7167 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8886 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 368: -#line 2410 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 463: +#line 3041 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.type) = (yyvsp[0].interm.type); (yyval.interm.type).qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary; parseContext.structTypeCheck((yyval.interm.type).loc, (yyval.interm.type)); } -#line 7177 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8896 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 369: -#line 2415 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 464: +#line 3046 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { // // This is for user defined type names. The lexical phase looked up the @@ -7191,47 +8910,47 @@ } else parseContext.error((yyvsp[0].lex).loc, "expected type name", (yyvsp[0].lex).string->c_str(), ""); } -#line 7195 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8914 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 370: -#line 2431 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 465: +#line 3062 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "highp precision qualifier"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqHigh); } -#line 7205 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8924 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 371: -#line 2436 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 466: +#line 3067 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "mediump precision qualifier"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqMedium); } -#line 7215 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8934 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 372: -#line 2441 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 467: +#line 3072 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "lowp precision qualifier"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqLow); } -#line 7225 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8944 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 373: -#line 2449 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 468: +#line 3080 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.nestedStructCheck((yyvsp[-2].lex).loc); } -#line 7231 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8950 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 374: -#line 2449 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 469: +#line 3080 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { TType* structure = new TType((yyvsp[-1].interm.typeList), *(yyvsp[-4].lex).string); parseContext.structArrayCheck((yyvsp[-4].lex).loc, *structure); @@ -7243,17 +8962,17 @@ (yyval.interm.type).userDef = structure; --parseContext.structNestingLevel; } -#line 7247 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8966 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 375: -#line 2460 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 470: +#line 3091 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.nestedStructCheck((yyvsp[-1].lex).loc); } -#line 7253 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8972 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 376: -#line 2460 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 471: +#line 3091 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { TType* structure = new TType((yyvsp[-1].interm.typeList), TString("")); (yyval.interm.type).init((yyvsp[-4].lex).loc); @@ -7261,19 +8980,19 @@ (yyval.interm.type).userDef = structure; --parseContext.structNestingLevel; } -#line 7265 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8984 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 377: -#line 2470 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 472: +#line 3101 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.typeList) = (yyvsp[0].interm.typeList); } -#line 7273 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 8992 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 378: -#line 2473 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 473: +#line 3104 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.typeList) = (yyvsp[-1].interm.typeList); for (unsigned int i = 0; i < (yyvsp[0].interm.typeList)->size(); ++i) { @@ -7284,11 +9003,11 @@ (yyval.interm.typeList)->push_back((*(yyvsp[0].interm.typeList))[i]); } } -#line 7288 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9007 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 379: -#line 2486 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 474: +#line 3117 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { if ((yyvsp[-2].interm.type).arraySizes) { parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); @@ -7303,17 +9022,20 @@ parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier); for (unsigned int i = 0; i < (yyval.interm.typeList)->size(); ++i) { - parseContext.arrayDimCheck((yyvsp[-2].interm.type).loc, (*(yyval.interm.typeList))[i].type, (yyvsp[-2].interm.type).arraySizes); - (*(yyval.interm.typeList))[i].type->mergeType((yyvsp[-2].interm.type)); + TType type((yyvsp[-2].interm.type)); + type.setFieldName((*(yyval.interm.typeList))[i].type->getFieldName()); + type.transferArraySizes((*(yyval.interm.typeList))[i].type->getArraySizes()); + type.copyArrayInnerSizes((yyvsp[-2].interm.type).arraySizes); + parseContext.arrayOfArrayVersionCheck((*(yyval.interm.typeList))[i].loc, type.getArraySizes()); + (*(yyval.interm.typeList))[i].type->shallowCopy(type); } } -#line 7311 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9034 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 380: -#line 2504 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 475: +#line 3139 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.globalQualifierFixCheck((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier); if ((yyvsp[-2].interm.type).arraySizes) { parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, "arrayed type"); @@ -7323,269 +9045,273 @@ (yyval.interm.typeList) = (yyvsp[-1].interm.typeList); - parseContext.checkNoShaderLayouts((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).shaderQualifiers); + parseContext.memberQualifierCheck((yyvsp[-3].interm.type)); parseContext.voidErrorCheck((yyvsp[-2].interm.type).loc, (*(yyvsp[-1].interm.typeList))[0].type->getFieldName(), (yyvsp[-2].interm.type).basicType); parseContext.mergeQualifiers((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, (yyvsp[-3].interm.type).qualifier, true); parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier); for (unsigned int i = 0; i < (yyval.interm.typeList)->size(); ++i) { - parseContext.arrayDimCheck((yyvsp[-3].interm.type).loc, (*(yyval.interm.typeList))[i].type, (yyvsp[-2].interm.type).arraySizes); - (*(yyval.interm.typeList))[i].type->mergeType((yyvsp[-2].interm.type)); + TType type((yyvsp[-2].interm.type)); + type.setFieldName((*(yyval.interm.typeList))[i].type->getFieldName()); + type.transferArraySizes((*(yyval.interm.typeList))[i].type->getArraySizes()); + type.copyArrayInnerSizes((yyvsp[-2].interm.type).arraySizes); + parseContext.arrayOfArrayVersionCheck((*(yyval.interm.typeList))[i].loc, type.getArraySizes()); + (*(yyval.interm.typeList))[i].type->shallowCopy(type); } } -#line 7337 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9063 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 381: -#line 2528 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 476: +#line 3166 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.typeList) = new TTypeList; (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine)); } -#line 7346 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9072 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 382: -#line 2532 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 477: +#line 3170 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine)); } -#line 7354 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9080 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 383: -#line 2538 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 478: +#line 3176 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.typeLine).type = new TType(EbtVoid); (yyval.interm.typeLine).loc = (yyvsp[0].lex).loc; (yyval.interm.typeLine).type->setFieldName(*(yyvsp[0].lex).string); } -#line 7364 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9090 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 384: -#line 2543 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 479: +#line 3181 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { - parseContext.arrayDimCheck((yyvsp[-1].lex).loc, (yyvsp[0].interm).arraySizes, 0); + parseContext.arrayOfArrayVersionCheck((yyvsp[-1].lex).loc, (yyvsp[0].interm).arraySizes); (yyval.interm.typeLine).type = new TType(EbtVoid); (yyval.interm.typeLine).loc = (yyvsp[-1].lex).loc; (yyval.interm.typeLine).type->setFieldName(*(yyvsp[-1].lex).string); - (yyval.interm.typeLine).type->newArraySizes(*(yyvsp[0].interm).arraySizes); + (yyval.interm.typeLine).type->transferArraySizes((yyvsp[0].interm).arraySizes); } -#line 7377 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9103 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 385: -#line 2554 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 480: +#line 3192 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 7385 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9111 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 386: -#line 2557 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 481: +#line 3195 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { const char* initFeature = "{ } style initializers"; parseContext.requireProfile((yyvsp[-2].lex).loc, ~EEsProfile, initFeature); parseContext.profileRequires((yyvsp[-2].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature); (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode); } -#line 7396 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9122 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 387: -#line 2563 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 482: +#line 3201 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { const char* initFeature = "{ } style initializers"; parseContext.requireProfile((yyvsp[-3].lex).loc, ~EEsProfile, initFeature); parseContext.profileRequires((yyvsp[-3].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature); (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 7407 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9133 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 388: -#line 2572 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 483: +#line 3210 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate(0, (yyvsp[0].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)->getLoc()); } -#line 7415 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9141 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 389: -#line 2575 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 484: +#line 3213 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); } -#line 7423 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9149 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 390: -#line 2581 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 485: +#line 3219 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7429 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9155 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 391: -#line 2585 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 486: +#line 3223 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7435 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9161 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 392: -#line 2586 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 487: +#line 3224 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7441 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9167 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 393: -#line 2592 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 488: +#line 3230 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7447 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9173 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 394: -#line 2593 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 489: +#line 3231 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7453 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9179 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 395: -#line 2594 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 490: +#line 3232 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7459 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9185 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 396: -#line 2595 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 491: +#line 3233 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7465 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9191 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 397: -#line 2596 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 492: +#line 3234 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7471 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9197 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 398: -#line 2597 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 493: +#line 3235 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7477 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9203 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 399: -#line 2598 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 494: +#line 3236 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7483 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9209 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 400: -#line 2602 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 495: +#line 3240 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = 0; } -#line 7489 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9215 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 401: -#line 2603 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 496: +#line 3241 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.symbolTable.push(); ++parseContext.statementNestingLevel; } -#line 7498 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9224 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 402: -#line 2607 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 497: +#line 3245 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); --parseContext.statementNestingLevel; } -#line 7507 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9233 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 403: -#line 2611 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 498: +#line 3249 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { if ((yyvsp[-2].interm.intermNode) && (yyvsp[-2].interm.intermNode)->getAsAggregate()) (yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence); (yyval.interm.intermNode) = (yyvsp[-2].interm.intermNode); } -#line 7517 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9243 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 404: -#line 2619 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 499: +#line 3257 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7523 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9249 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 405: -#line 2620 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 500: +#line 3258 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7529 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9255 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 406: -#line 2624 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 501: +#line 3262 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { ++parseContext.controlFlowNestingLevel; } -#line 7537 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9263 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 407: -#line 2627 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 502: +#line 3265 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { --parseContext.controlFlowNestingLevel; (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7546 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9272 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 408: -#line 2631 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 503: +#line 3269 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.symbolTable.push(); ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; } -#line 7556 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9282 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 409: -#line 2636 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 504: +#line 3274 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7567 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9293 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 410: -#line 2645 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 505: +#line 3283 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = 0; } -#line 7575 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9301 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 411: -#line 2648 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 506: +#line 3286 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { if ((yyvsp[-1].interm.intermNode) && (yyvsp[-1].interm.intermNode)->getAsAggregate()) (yyvsp[-1].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence); (yyval.interm.intermNode) = (yyvsp[-1].interm.intermNode); } -#line 7585 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9311 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 412: -#line 2656 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 507: +#line 3294 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode)); if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase || @@ -7594,11 +9320,11 @@ (yyval.interm.intermNode) = 0; // start a fresh subsequence for what's after this case } } -#line 7598 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9324 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 413: -#line 2664 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 508: +#line 3302 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase || (yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) { @@ -7607,76 +9333,76 @@ } else (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode)); } -#line 7611 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9337 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 414: -#line 2675 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 509: +#line 3313 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = 0; } -#line 7617 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9343 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 415: -#line 2676 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 510: +#line 3314 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = static_cast((yyvsp[-1].interm.intermTypedNode)); } -#line 7623 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9349 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 416: -#line 2680 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 511: +#line 3318 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7631 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9357 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 417: -#line 2683 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 512: +#line 3321 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.handleSelectionAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode)); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7640 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9366 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 418: -#line 2689 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 513: +#line 3327 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-2].interm.intermTypedNode)); (yyval.interm.intermNode) = parseContext.intermediate.addSelection((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.nodePair), (yyvsp[-4].lex).loc); } -#line 7649 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9375 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 419: -#line 2696 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 514: +#line 3334 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode); (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermNode); } -#line 7658 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9384 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 420: -#line 2700 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 515: +#line 3338 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode); (yyval.interm.nodePair).node2 = 0; } -#line 7667 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9393 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 421: -#line 2708 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 516: +#line 3346 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); parseContext.boolCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode)); } -#line 7676 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9402 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 422: -#line 2712 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 517: +#line 3350 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.boolCheck((yyvsp[-2].lex).loc, (yyvsp[-3].interm.type)); @@ -7687,28 +9413,28 @@ else (yyval.interm.intermTypedNode) = 0; } -#line 7691 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9417 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 423: -#line 2725 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 518: +#line 3363 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7699 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9425 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 424: -#line 2728 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 519: +#line 3366 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.handleSwitchAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode)); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7708 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9434 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 425: -#line 2734 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 520: +#line 3372 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { // start new switch sequence on the switch stack ++parseContext.controlFlowNestingLevel; @@ -7717,11 +9443,11 @@ parseContext.switchLevel.push_back(parseContext.statementNestingLevel); parseContext.symbolTable.push(); } -#line 7721 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9447 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 426: -#line 2742 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 521: +#line 3380 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = parseContext.addSwitch((yyvsp[-7].lex).loc, (yyvsp[-5].interm.intermTypedNode), (yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0); delete parseContext.switchSequenceStack.back(); @@ -7731,27 +9457,27 @@ --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; } -#line 7735 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9461 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 427: -#line 2754 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 522: +#line 3392 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = 0; } -#line 7743 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9469 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 428: -#line 2757 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 523: +#line 3395 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7751 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9477 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 429: -#line 2763 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 524: +#line 3401 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = 0; if (parseContext.switchLevel.size() == 0) @@ -7764,11 +9490,11 @@ (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpCase, (yyvsp[-1].interm.intermTypedNode), (yyvsp[-2].lex).loc); } } -#line 7768 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9494 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 430: -#line 2775 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 525: +#line 3413 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = 0; if (parseContext.switchLevel.size() == 0) @@ -7778,28 +9504,28 @@ else (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDefault, (yyvsp[-1].lex).loc); } -#line 7782 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9508 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 431: -#line 2787 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 526: +#line 3425 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7790 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9516 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 432: -#line 2790 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 527: +#line 3428 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.handleLoopAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode)); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7799 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9525 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 433: -#line 2796 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 528: +#line 3434 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { if (! parseContext.limits.whileLoops) parseContext.error((yyvsp[-1].lex).loc, "while loops not available", "limitation", ""); @@ -7808,11 +9534,11 @@ ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; } -#line 7812 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9538 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 434: -#line 2804 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 529: +#line 3442 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); (yyval.interm.intermNode) = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), (yyvsp[-2].interm.intermTypedNode), 0, true, (yyvsp[-5].lex).loc); @@ -7820,21 +9546,21 @@ --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; } -#line 7824 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9550 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 435: -#line 2811 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 530: +#line 3449 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { ++parseContext.loopNestingLevel; ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; } -#line 7834 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9560 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 436: -#line 2816 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 531: +#line 3454 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { if (! parseContext.limits.whileLoops) parseContext.error((yyvsp[-7].lex).loc, "do-while loops not available", "limitation", ""); @@ -7846,22 +9572,22 @@ --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; } -#line 7850 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9576 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 437: -#line 2827 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 532: +#line 3465 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.symbolTable.push(); ++parseContext.loopNestingLevel; ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; } -#line 7861 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9587 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 438: -#line 2833 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 533: +#line 3471 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[-3].interm.intermNode), (yyvsp[-5].lex).loc); @@ -7874,81 +9600,81 @@ --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; } -#line 7878 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9604 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 439: -#line 2848 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 534: +#line 3486 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7886 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9612 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 440: -#line 2851 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 535: +#line 3489 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 7894 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9620 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 441: -#line 2857 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 536: +#line 3495 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 7902 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9628 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 442: -#line 2860 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 537: +#line 3498 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermTypedNode) = 0; } -#line 7910 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9636 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 443: -#line 2866 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 538: +#line 3504 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode); (yyval.interm.nodePair).node2 = 0; } -#line 7919 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9645 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 444: -#line 2870 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 539: +#line 3508 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode); (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermTypedNode); } -#line 7928 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9654 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 445: -#line 2877 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 540: +#line 3515 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { if (parseContext.loopNestingLevel <= 0) parseContext.error((yyvsp[-1].lex).loc, "continue statement only allowed in loops", "", ""); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpContinue, (yyvsp[-1].lex).loc); } -#line 7938 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9664 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 446: -#line 2882 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 541: +#line 3520 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { if (parseContext.loopNestingLevel + parseContext.switchSequenceStack.size() <= 0) parseContext.error((yyvsp[-1].lex).loc, "break statement only allowed in switch and loops", "", ""); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpBreak, (yyvsp[-1].lex).loc); } -#line 7948 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9674 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 447: -#line 2887 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 542: +#line 3525 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpReturn, (yyvsp[-1].lex).loc); if (parseContext.currentFunctionType->getBasicType() != EbtVoid) @@ -7956,83 +9682,83 @@ if (parseContext.inMain) parseContext.postEntryPointReturn = true; } -#line 7960 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9686 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 448: -#line 2894 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 543: +#line 3532 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = parseContext.handleReturnValue((yyvsp[-2].lex).loc, (yyvsp[-1].interm.intermTypedNode)); } -#line 7968 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9694 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 449: -#line 2897 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 544: +#line 3535 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "discard"); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpKill, (yyvsp[-1].lex).loc); } -#line 7977 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9703 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 450: -#line 2906 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 545: +#line 3544 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); parseContext.intermediate.setTreeRoot((yyval.interm.intermNode)); } -#line 7986 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9712 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 451: -#line 2910 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 546: +#line 3548 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { if ((yyvsp[0].interm.intermNode) != nullptr) { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode)); parseContext.intermediate.setTreeRoot((yyval.interm.intermNode)); } } -#line 7997 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9723 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 452: -#line 2919 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 547: +#line 3557 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 8005 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9731 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 453: -#line 2922 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 548: +#line 3560 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 8013 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9739 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 454: -#line 2925 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 549: +#line 3563 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, "extraneous semicolon"); parseContext.profileRequires((yyvsp[0].lex).loc, ~EEsProfile, 460, nullptr, "extraneous semicolon"); (yyval.interm.intermNode) = nullptr; } -#line 8023 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9749 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 455: -#line 2933 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 550: +#line 3571 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyvsp[0].interm).function = parseContext.handleFunctionDeclarator((yyvsp[0].interm).loc, *(yyvsp[0].interm).function, false /* not prototype */); (yyvsp[0].interm).intermNode = parseContext.handleFunctionDefinition((yyvsp[0].interm).loc, *(yyvsp[0].interm).function); } -#line 8032 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9758 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 456: -#line 2937 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 551: +#line 3575 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { // May be best done as post process phase on intermediate code if (parseContext.currentFunctionType->getBasicType() != EbtVoid && ! parseContext.functionReturnsValue) @@ -8048,52 +9774,52 @@ (yyval.interm.intermNode)->getAsAggregate()->setDebug(parseContext.contextPragma.debug); (yyval.interm.intermNode)->getAsAggregate()->setPragmaTable(parseContext.contextPragma.pragmaTable); } -#line 8052 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9778 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 457: -#line 2955 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 552: +#line 3593 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.attributes) = (yyvsp[-2].interm.attributes); parseContext.requireExtensions((yyvsp[-4].lex).loc, 1, &E_GL_EXT_control_flow_attributes, "attribute"); } -#line 8061 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9787 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 458: -#line 2961 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 553: +#line 3599 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.attributes) = (yyvsp[0].interm.attributes); } -#line 8069 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9795 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 459: -#line 2964 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 554: +#line 3602 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.attributes) = parseContext.mergeAttributes((yyvsp[-2].interm.attributes), (yyvsp[0].interm.attributes)); } -#line 8077 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9803 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 460: -#line 2969 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 555: +#line 3607 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[0].lex).string); } -#line 8085 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9811 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; - case 461: -#line 2972 "MachineIndependent/glslang.y" /* yacc.c:1646 */ + case 556: +#line 3610 "MachineIndependent/glslang.y" /* yacc.c:1646 */ { (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[-3].lex).string, (yyvsp[-1].interm.intermTypedNode)); } -#line 8093 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9819 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ break; -#line 8097 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ +#line 9823 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -8321,5 +10047,5 @@ #endif return yyresult; } -#line 2976 "MachineIndependent/glslang.y" /* yacc.c:1906 */ +#line 3614 "MachineIndependent/glslang.y" /* yacc.c:1906 */ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/glslang_tab.cpp.h vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/glslang_tab.cpp.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/glslang_tab.cpp.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/glslang_tab.cpp.h 2018-04-27 11:46:26.000000000 +0000 @@ -47,299 +47,392 @@ { ATTRIBUTE = 258, VARYING = 259, - CONST = 260, - BOOL = 261, - FLOAT = 262, + FLOAT16_T = 260, + FLOAT = 261, + FLOAT32_T = 262, DOUBLE = 263, - INT = 264, - UINT = 265, - INT64_T = 266, - UINT64_T = 267, - INT16_T = 268, - UINT16_T = 269, - FLOAT16_T = 270, - BREAK = 271, - CONTINUE = 272, - DO = 273, - ELSE = 274, - FOR = 275, - IF = 276, - DISCARD = 277, - RETURN = 278, - SWITCH = 279, - CASE = 280, - DEFAULT = 281, - SUBROUTINE = 282, - BVEC2 = 283, - BVEC3 = 284, - BVEC4 = 285, - IVEC2 = 286, - IVEC3 = 287, - IVEC4 = 288, - I64VEC2 = 289, - I64VEC3 = 290, - I64VEC4 = 291, - UVEC2 = 292, - UVEC3 = 293, - UVEC4 = 294, - U64VEC2 = 295, - U64VEC3 = 296, - U64VEC4 = 297, - VEC2 = 298, - VEC3 = 299, - VEC4 = 300, - MAT2 = 301, - MAT3 = 302, - MAT4 = 303, - CENTROID = 304, - IN = 305, - OUT = 306, - INOUT = 307, - UNIFORM = 308, - PATCH = 309, - SAMPLE = 310, - BUFFER = 311, - SHARED = 312, - COHERENT = 313, - VOLATILE = 314, - RESTRICT = 315, - READONLY = 316, - WRITEONLY = 317, - DVEC2 = 318, - DVEC3 = 319, - DVEC4 = 320, - DMAT2 = 321, - DMAT3 = 322, - DMAT4 = 323, - F16VEC2 = 324, - F16VEC3 = 325, - F16VEC4 = 326, - F16MAT2 = 327, - F16MAT3 = 328, - F16MAT4 = 329, - I16VEC2 = 330, - I16VEC3 = 331, - I16VEC4 = 332, - U16VEC2 = 333, - U16VEC3 = 334, - U16VEC4 = 335, - NOPERSPECTIVE = 336, - FLAT = 337, - SMOOTH = 338, - LAYOUT = 339, - __EXPLICITINTERPAMD = 340, - MAT2X2 = 341, - MAT2X3 = 342, - MAT2X4 = 343, - MAT3X2 = 344, - MAT3X3 = 345, - MAT3X4 = 346, - MAT4X2 = 347, - MAT4X3 = 348, - MAT4X4 = 349, - DMAT2X2 = 350, - DMAT2X3 = 351, - DMAT2X4 = 352, - DMAT3X2 = 353, - DMAT3X3 = 354, - DMAT3X4 = 355, - DMAT4X2 = 356, - DMAT4X3 = 357, - DMAT4X4 = 358, - F16MAT2X2 = 359, - F16MAT2X3 = 360, - F16MAT2X4 = 361, - F16MAT3X2 = 362, - F16MAT3X3 = 363, - F16MAT3X4 = 364, - F16MAT4X2 = 365, - F16MAT4X3 = 366, - F16MAT4X4 = 367, - ATOMIC_UINT = 368, - SAMPLER1D = 369, - SAMPLER2D = 370, - SAMPLER3D = 371, - SAMPLERCUBE = 372, - SAMPLER1DSHADOW = 373, - SAMPLER2DSHADOW = 374, - SAMPLERCUBESHADOW = 375, - SAMPLER1DARRAY = 376, - SAMPLER2DARRAY = 377, - SAMPLER1DARRAYSHADOW = 378, - SAMPLER2DARRAYSHADOW = 379, - ISAMPLER1D = 380, - ISAMPLER2D = 381, - ISAMPLER3D = 382, - ISAMPLERCUBE = 383, - ISAMPLER1DARRAY = 384, - ISAMPLER2DARRAY = 385, - USAMPLER1D = 386, - USAMPLER2D = 387, - USAMPLER3D = 388, - USAMPLERCUBE = 389, - USAMPLER1DARRAY = 390, - USAMPLER2DARRAY = 391, - SAMPLER2DRECT = 392, - SAMPLER2DRECTSHADOW = 393, - ISAMPLER2DRECT = 394, - USAMPLER2DRECT = 395, - SAMPLERBUFFER = 396, - ISAMPLERBUFFER = 397, - USAMPLERBUFFER = 398, - SAMPLERCUBEARRAY = 399, - SAMPLERCUBEARRAYSHADOW = 400, - ISAMPLERCUBEARRAY = 401, - USAMPLERCUBEARRAY = 402, - SAMPLER2DMS = 403, - ISAMPLER2DMS = 404, - USAMPLER2DMS = 405, - SAMPLER2DMSARRAY = 406, - ISAMPLER2DMSARRAY = 407, - USAMPLER2DMSARRAY = 408, - SAMPLEREXTERNALOES = 409, - SAMPLER = 410, - SAMPLERSHADOW = 411, - TEXTURE1D = 412, - TEXTURE2D = 413, - TEXTURE3D = 414, - TEXTURECUBE = 415, - TEXTURE1DARRAY = 416, - TEXTURE2DARRAY = 417, - ITEXTURE1D = 418, - ITEXTURE2D = 419, - ITEXTURE3D = 420, - ITEXTURECUBE = 421, - ITEXTURE1DARRAY = 422, - ITEXTURE2DARRAY = 423, - UTEXTURE1D = 424, - UTEXTURE2D = 425, - UTEXTURE3D = 426, - UTEXTURECUBE = 427, - UTEXTURE1DARRAY = 428, - UTEXTURE2DARRAY = 429, - TEXTURE2DRECT = 430, - ITEXTURE2DRECT = 431, - UTEXTURE2DRECT = 432, - TEXTUREBUFFER = 433, - ITEXTUREBUFFER = 434, - UTEXTUREBUFFER = 435, - TEXTURECUBEARRAY = 436, - ITEXTURECUBEARRAY = 437, - UTEXTURECUBEARRAY = 438, - TEXTURE2DMS = 439, - ITEXTURE2DMS = 440, - UTEXTURE2DMS = 441, - TEXTURE2DMSARRAY = 442, - ITEXTURE2DMSARRAY = 443, - UTEXTURE2DMSARRAY = 444, - SUBPASSINPUT = 445, - SUBPASSINPUTMS = 446, - ISUBPASSINPUT = 447, - ISUBPASSINPUTMS = 448, - USUBPASSINPUT = 449, - USUBPASSINPUTMS = 450, - IMAGE1D = 451, - IIMAGE1D = 452, - UIMAGE1D = 453, - IMAGE2D = 454, - IIMAGE2D = 455, - UIMAGE2D = 456, - IMAGE3D = 457, - IIMAGE3D = 458, - UIMAGE3D = 459, - IMAGE2DRECT = 460, - IIMAGE2DRECT = 461, - UIMAGE2DRECT = 462, - IMAGECUBE = 463, - IIMAGECUBE = 464, - UIMAGECUBE = 465, - IMAGEBUFFER = 466, - IIMAGEBUFFER = 467, - UIMAGEBUFFER = 468, - IMAGE1DARRAY = 469, - IIMAGE1DARRAY = 470, - UIMAGE1DARRAY = 471, - IMAGE2DARRAY = 472, - IIMAGE2DARRAY = 473, - UIMAGE2DARRAY = 474, - IMAGECUBEARRAY = 475, - IIMAGECUBEARRAY = 476, - UIMAGECUBEARRAY = 477, - IMAGE2DMS = 478, - IIMAGE2DMS = 479, - UIMAGE2DMS = 480, - IMAGE2DMSARRAY = 481, - IIMAGE2DMSARRAY = 482, - UIMAGE2DMSARRAY = 483, - STRUCT = 484, - VOID = 485, - WHILE = 486, - IDENTIFIER = 487, - TYPE_NAME = 488, - FLOATCONSTANT = 489, - DOUBLECONSTANT = 490, - INTCONSTANT = 491, - UINTCONSTANT = 492, - INT64CONSTANT = 493, - UINT64CONSTANT = 494, - INT16CONSTANT = 495, - UINT16CONSTANT = 496, - BOOLCONSTANT = 497, - FLOAT16CONSTANT = 498, - LEFT_OP = 499, - RIGHT_OP = 500, - INC_OP = 501, - DEC_OP = 502, - LE_OP = 503, - GE_OP = 504, - EQ_OP = 505, - NE_OP = 506, - AND_OP = 507, - OR_OP = 508, - XOR_OP = 509, - MUL_ASSIGN = 510, - DIV_ASSIGN = 511, - ADD_ASSIGN = 512, - MOD_ASSIGN = 513, - LEFT_ASSIGN = 514, - RIGHT_ASSIGN = 515, - AND_ASSIGN = 516, - XOR_ASSIGN = 517, - OR_ASSIGN = 518, - SUB_ASSIGN = 519, - LEFT_PAREN = 520, - RIGHT_PAREN = 521, - LEFT_BRACKET = 522, - RIGHT_BRACKET = 523, - LEFT_BRACE = 524, - RIGHT_BRACE = 525, - DOT = 526, - COMMA = 527, - COLON = 528, - EQUAL = 529, - SEMICOLON = 530, - BANG = 531, - DASH = 532, - TILDE = 533, - PLUS = 534, - STAR = 535, - SLASH = 536, - PERCENT = 537, - LEFT_ANGLE = 538, - RIGHT_ANGLE = 539, - VERTICAL_BAR = 540, - CARET = 541, - AMPERSAND = 542, - QUESTION = 543, - INVARIANT = 544, - PRECISE = 545, - HIGH_PRECISION = 546, - MEDIUM_PRECISION = 547, - LOW_PRECISION = 548, - PRECISION = 549, - PACKED = 550, - RESOURCE = 551, - SUPERP = 552 + FLOAT64_T = 264, + CONST = 265, + BOOL = 266, + INT = 267, + UINT = 268, + INT64_T = 269, + UINT64_T = 270, + INT32_T = 271, + UINT32_T = 272, + INT16_T = 273, + UINT16_T = 274, + INT8_T = 275, + UINT8_T = 276, + BREAK = 277, + CONTINUE = 278, + DO = 279, + ELSE = 280, + FOR = 281, + IF = 282, + DISCARD = 283, + RETURN = 284, + SWITCH = 285, + CASE = 286, + DEFAULT = 287, + SUBROUTINE = 288, + BVEC2 = 289, + BVEC3 = 290, + BVEC4 = 291, + IVEC2 = 292, + IVEC3 = 293, + IVEC4 = 294, + UVEC2 = 295, + UVEC3 = 296, + UVEC4 = 297, + I64VEC2 = 298, + I64VEC3 = 299, + I64VEC4 = 300, + U64VEC2 = 301, + U64VEC3 = 302, + U64VEC4 = 303, + I32VEC2 = 304, + I32VEC3 = 305, + I32VEC4 = 306, + U32VEC2 = 307, + U32VEC3 = 308, + U32VEC4 = 309, + I16VEC2 = 310, + I16VEC3 = 311, + I16VEC4 = 312, + U16VEC2 = 313, + U16VEC3 = 314, + U16VEC4 = 315, + I8VEC2 = 316, + I8VEC3 = 317, + I8VEC4 = 318, + U8VEC2 = 319, + U8VEC3 = 320, + U8VEC4 = 321, + VEC2 = 322, + VEC3 = 323, + VEC4 = 324, + MAT2 = 325, + MAT3 = 326, + MAT4 = 327, + CENTROID = 328, + IN = 329, + OUT = 330, + INOUT = 331, + UNIFORM = 332, + PATCH = 333, + SAMPLE = 334, + BUFFER = 335, + SHARED = 336, + NONUNIFORM = 337, + COHERENT = 338, + VOLATILE = 339, + RESTRICT = 340, + READONLY = 341, + WRITEONLY = 342, + DVEC2 = 343, + DVEC3 = 344, + DVEC4 = 345, + DMAT2 = 346, + DMAT3 = 347, + DMAT4 = 348, + F16VEC2 = 349, + F16VEC3 = 350, + F16VEC4 = 351, + F16MAT2 = 352, + F16MAT3 = 353, + F16MAT4 = 354, + F32VEC2 = 355, + F32VEC3 = 356, + F32VEC4 = 357, + F32MAT2 = 358, + F32MAT3 = 359, + F32MAT4 = 360, + F64VEC2 = 361, + F64VEC3 = 362, + F64VEC4 = 363, + F64MAT2 = 364, + F64MAT3 = 365, + F64MAT4 = 366, + NOPERSPECTIVE = 367, + FLAT = 368, + SMOOTH = 369, + LAYOUT = 370, + __EXPLICITINTERPAMD = 371, + MAT2X2 = 372, + MAT2X3 = 373, + MAT2X4 = 374, + MAT3X2 = 375, + MAT3X3 = 376, + MAT3X4 = 377, + MAT4X2 = 378, + MAT4X3 = 379, + MAT4X4 = 380, + DMAT2X2 = 381, + DMAT2X3 = 382, + DMAT2X4 = 383, + DMAT3X2 = 384, + DMAT3X3 = 385, + DMAT3X4 = 386, + DMAT4X2 = 387, + DMAT4X3 = 388, + DMAT4X4 = 389, + F16MAT2X2 = 390, + F16MAT2X3 = 391, + F16MAT2X4 = 392, + F16MAT3X2 = 393, + F16MAT3X3 = 394, + F16MAT3X4 = 395, + F16MAT4X2 = 396, + F16MAT4X3 = 397, + F16MAT4X4 = 398, + F32MAT2X2 = 399, + F32MAT2X3 = 400, + F32MAT2X4 = 401, + F32MAT3X2 = 402, + F32MAT3X3 = 403, + F32MAT3X4 = 404, + F32MAT4X2 = 405, + F32MAT4X3 = 406, + F32MAT4X4 = 407, + F64MAT2X2 = 408, + F64MAT2X3 = 409, + F64MAT2X4 = 410, + F64MAT3X2 = 411, + F64MAT3X3 = 412, + F64MAT3X4 = 413, + F64MAT4X2 = 414, + F64MAT4X3 = 415, + F64MAT4X4 = 416, + ATOMIC_UINT = 417, + SAMPLER1D = 418, + SAMPLER2D = 419, + SAMPLER3D = 420, + SAMPLERCUBE = 421, + SAMPLER1DSHADOW = 422, + SAMPLER2DSHADOW = 423, + SAMPLERCUBESHADOW = 424, + SAMPLER1DARRAY = 425, + SAMPLER2DARRAY = 426, + SAMPLER1DARRAYSHADOW = 427, + SAMPLER2DARRAYSHADOW = 428, + ISAMPLER1D = 429, + ISAMPLER2D = 430, + ISAMPLER3D = 431, + ISAMPLERCUBE = 432, + ISAMPLER1DARRAY = 433, + ISAMPLER2DARRAY = 434, + USAMPLER1D = 435, + USAMPLER2D = 436, + USAMPLER3D = 437, + USAMPLERCUBE = 438, + USAMPLER1DARRAY = 439, + USAMPLER2DARRAY = 440, + SAMPLER2DRECT = 441, + SAMPLER2DRECTSHADOW = 442, + ISAMPLER2DRECT = 443, + USAMPLER2DRECT = 444, + SAMPLERBUFFER = 445, + ISAMPLERBUFFER = 446, + USAMPLERBUFFER = 447, + SAMPLERCUBEARRAY = 448, + SAMPLERCUBEARRAYSHADOW = 449, + ISAMPLERCUBEARRAY = 450, + USAMPLERCUBEARRAY = 451, + SAMPLER2DMS = 452, + ISAMPLER2DMS = 453, + USAMPLER2DMS = 454, + SAMPLER2DMSARRAY = 455, + ISAMPLER2DMSARRAY = 456, + USAMPLER2DMSARRAY = 457, + SAMPLEREXTERNALOES = 458, + F16SAMPLER1D = 459, + F16SAMPLER2D = 460, + F16SAMPLER3D = 461, + F16SAMPLER2DRECT = 462, + F16SAMPLERCUBE = 463, + F16SAMPLER1DARRAY = 464, + F16SAMPLER2DARRAY = 465, + F16SAMPLERCUBEARRAY = 466, + F16SAMPLERBUFFER = 467, + F16SAMPLER2DMS = 468, + F16SAMPLER2DMSARRAY = 469, + F16SAMPLER1DSHADOW = 470, + F16SAMPLER2DSHADOW = 471, + F16SAMPLER1DARRAYSHADOW = 472, + F16SAMPLER2DARRAYSHADOW = 473, + F16SAMPLER2DRECTSHADOW = 474, + F16SAMPLERCUBESHADOW = 475, + F16SAMPLERCUBEARRAYSHADOW = 476, + SAMPLER = 477, + SAMPLERSHADOW = 478, + TEXTURE1D = 479, + TEXTURE2D = 480, + TEXTURE3D = 481, + TEXTURECUBE = 482, + TEXTURE1DARRAY = 483, + TEXTURE2DARRAY = 484, + ITEXTURE1D = 485, + ITEXTURE2D = 486, + ITEXTURE3D = 487, + ITEXTURECUBE = 488, + ITEXTURE1DARRAY = 489, + ITEXTURE2DARRAY = 490, + UTEXTURE1D = 491, + UTEXTURE2D = 492, + UTEXTURE3D = 493, + UTEXTURECUBE = 494, + UTEXTURE1DARRAY = 495, + UTEXTURE2DARRAY = 496, + TEXTURE2DRECT = 497, + ITEXTURE2DRECT = 498, + UTEXTURE2DRECT = 499, + TEXTUREBUFFER = 500, + ITEXTUREBUFFER = 501, + UTEXTUREBUFFER = 502, + TEXTURECUBEARRAY = 503, + ITEXTURECUBEARRAY = 504, + UTEXTURECUBEARRAY = 505, + TEXTURE2DMS = 506, + ITEXTURE2DMS = 507, + UTEXTURE2DMS = 508, + TEXTURE2DMSARRAY = 509, + ITEXTURE2DMSARRAY = 510, + UTEXTURE2DMSARRAY = 511, + F16TEXTURE1D = 512, + F16TEXTURE2D = 513, + F16TEXTURE3D = 514, + F16TEXTURE2DRECT = 515, + F16TEXTURECUBE = 516, + F16TEXTURE1DARRAY = 517, + F16TEXTURE2DARRAY = 518, + F16TEXTURECUBEARRAY = 519, + F16TEXTUREBUFFER = 520, + F16TEXTURE2DMS = 521, + F16TEXTURE2DMSARRAY = 522, + SUBPASSINPUT = 523, + SUBPASSINPUTMS = 524, + ISUBPASSINPUT = 525, + ISUBPASSINPUTMS = 526, + USUBPASSINPUT = 527, + USUBPASSINPUTMS = 528, + F16SUBPASSINPUT = 529, + F16SUBPASSINPUTMS = 530, + IMAGE1D = 531, + IIMAGE1D = 532, + UIMAGE1D = 533, + IMAGE2D = 534, + IIMAGE2D = 535, + UIMAGE2D = 536, + IMAGE3D = 537, + IIMAGE3D = 538, + UIMAGE3D = 539, + IMAGE2DRECT = 540, + IIMAGE2DRECT = 541, + UIMAGE2DRECT = 542, + IMAGECUBE = 543, + IIMAGECUBE = 544, + UIMAGECUBE = 545, + IMAGEBUFFER = 546, + IIMAGEBUFFER = 547, + UIMAGEBUFFER = 548, + IMAGE1DARRAY = 549, + IIMAGE1DARRAY = 550, + UIMAGE1DARRAY = 551, + IMAGE2DARRAY = 552, + IIMAGE2DARRAY = 553, + UIMAGE2DARRAY = 554, + IMAGECUBEARRAY = 555, + IIMAGECUBEARRAY = 556, + UIMAGECUBEARRAY = 557, + IMAGE2DMS = 558, + IIMAGE2DMS = 559, + UIMAGE2DMS = 560, + IMAGE2DMSARRAY = 561, + IIMAGE2DMSARRAY = 562, + UIMAGE2DMSARRAY = 563, + F16IMAGE1D = 564, + F16IMAGE2D = 565, + F16IMAGE3D = 566, + F16IMAGE2DRECT = 567, + F16IMAGECUBE = 568, + F16IMAGE1DARRAY = 569, + F16IMAGE2DARRAY = 570, + F16IMAGECUBEARRAY = 571, + F16IMAGEBUFFER = 572, + F16IMAGE2DMS = 573, + F16IMAGE2DMSARRAY = 574, + STRUCT = 575, + VOID = 576, + WHILE = 577, + IDENTIFIER = 578, + TYPE_NAME = 579, + FLOATCONSTANT = 580, + DOUBLECONSTANT = 581, + INT16CONSTANT = 582, + UINT16CONSTANT = 583, + INT32CONSTANT = 584, + UINT32CONSTANT = 585, + INTCONSTANT = 586, + UINTCONSTANT = 587, + INT64CONSTANT = 588, + UINT64CONSTANT = 589, + BOOLCONSTANT = 590, + FLOAT16CONSTANT = 591, + LEFT_OP = 592, + RIGHT_OP = 593, + INC_OP = 594, + DEC_OP = 595, + LE_OP = 596, + GE_OP = 597, + EQ_OP = 598, + NE_OP = 599, + AND_OP = 600, + OR_OP = 601, + XOR_OP = 602, + MUL_ASSIGN = 603, + DIV_ASSIGN = 604, + ADD_ASSIGN = 605, + MOD_ASSIGN = 606, + LEFT_ASSIGN = 607, + RIGHT_ASSIGN = 608, + AND_ASSIGN = 609, + XOR_ASSIGN = 610, + OR_ASSIGN = 611, + SUB_ASSIGN = 612, + LEFT_PAREN = 613, + RIGHT_PAREN = 614, + LEFT_BRACKET = 615, + RIGHT_BRACKET = 616, + LEFT_BRACE = 617, + RIGHT_BRACE = 618, + DOT = 619, + COMMA = 620, + COLON = 621, + EQUAL = 622, + SEMICOLON = 623, + BANG = 624, + DASH = 625, + TILDE = 626, + PLUS = 627, + STAR = 628, + SLASH = 629, + PERCENT = 630, + LEFT_ANGLE = 631, + RIGHT_ANGLE = 632, + VERTICAL_BAR = 633, + CARET = 634, + AMPERSAND = 635, + QUESTION = 636, + INVARIANT = 637, + PRECISE = 638, + HIGH_PRECISION = 639, + MEDIUM_PRECISION = 640, + LOW_PRECISION = 641, + PRECISION = 642, + PACKED = 643, + RESOURCE = 644, + SUPERP = 645 }; #endif @@ -348,7 +441,7 @@ typedef union YYSTYPE YYSTYPE; union YYSTYPE { -#line 69 "MachineIndependent/glslang.y" /* yacc.c:1909 */ +#line 70 "MachineIndependent/glslang.y" /* yacc.c:1909 */ struct { glslang::TSourceLoc loc; @@ -383,7 +476,7 @@ }; } interm; -#line 387 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909 */ +#line 480 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909 */ }; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/glslang.y vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/glslang.y --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/glslang.y 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/glslang.y 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2013 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -123,15 +124,28 @@ %expect 1 // One shift reduce conflict because of if | else %token ATTRIBUTE VARYING -%token CONST BOOL FLOAT DOUBLE INT UINT INT64_T UINT64_T INT16_T UINT16_T FLOAT16_T +%token FLOAT16_T FLOAT FLOAT32_T DOUBLE FLOAT64_T +%token CONST BOOL INT UINT INT64_T UINT64_T INT32_T UINT32_T INT16_T UINT16_T INT8_T UINT8_T %token BREAK CONTINUE DO ELSE FOR IF DISCARD RETURN SWITCH CASE DEFAULT SUBROUTINE -%token BVEC2 BVEC3 BVEC4 IVEC2 IVEC3 IVEC4 I64VEC2 I64VEC3 I64VEC4 UVEC2 UVEC3 UVEC4 U64VEC2 U64VEC3 U64VEC4 VEC2 VEC3 VEC4 +%token BVEC2 BVEC3 BVEC4 +%token IVEC2 IVEC3 IVEC4 +%token UVEC2 UVEC3 UVEC4 +%token I64VEC2 I64VEC3 I64VEC4 +%token U64VEC2 U64VEC3 U64VEC4 +%token I32VEC2 I32VEC3 I32VEC4 +%token U32VEC2 U32VEC3 U32VEC4 +%token I16VEC2 I16VEC3 I16VEC4 +%token U16VEC2 U16VEC3 U16VEC4 +%token I8VEC2 I8VEC3 I8VEC4 +%token U8VEC2 U8VEC3 U8VEC4 +%token VEC2 VEC3 VEC4 %token MAT2 MAT3 MAT4 CENTROID IN OUT INOUT -%token UNIFORM PATCH SAMPLE BUFFER SHARED +%token UNIFORM PATCH SAMPLE BUFFER SHARED NONUNIFORM %token COHERENT VOLATILE RESTRICT READONLY WRITEONLY %token DVEC2 DVEC3 DVEC4 DMAT2 DMAT3 DMAT4 %token F16VEC2 F16VEC3 F16VEC4 F16MAT2 F16MAT3 F16MAT4 -%token I16VEC2 I16VEC3 I16VEC4 U16VEC2 U16VEC3 U16VEC4 +%token F32VEC2 F32VEC3 F32VEC4 F32MAT2 F32MAT3 F32MAT4 +%token F64VEC2 F64VEC3 F64VEC4 F64MAT2 F64MAT3 F64MAT4 %token NOPERSPECTIVE FLAT SMOOTH LAYOUT __EXPLICITINTERPAMD %token MAT2X2 MAT2X3 MAT2X4 @@ -143,6 +157,12 @@ %token F16MAT2X2 F16MAT2X3 F16MAT2X4 %token F16MAT3X2 F16MAT3X3 F16MAT3X4 %token F16MAT4X2 F16MAT4X3 F16MAT4X4 +%token F32MAT2X2 F32MAT2X3 F32MAT2X4 +%token F32MAT3X2 F32MAT3X3 F32MAT3X4 +%token F32MAT4X2 F32MAT4X3 F32MAT4X4 +%token F64MAT2X2 F64MAT2X3 F64MAT2X4 +%token F64MAT3X2 F64MAT3X3 F64MAT3X4 +%token F64MAT4X2 F64MAT4X3 F64MAT4X4 %token ATOMIC_UINT // combined image/sampler @@ -159,6 +179,12 @@ %token SAMPLER2DMSARRAY ISAMPLER2DMSARRAY USAMPLER2DMSARRAY %token SAMPLEREXTERNALOES +%token F16SAMPLER1D F16SAMPLER2D F16SAMPLER3D F16SAMPLER2DRECT F16SAMPLERCUBE +%token F16SAMPLER1DARRAY F16SAMPLER2DARRAY F16SAMPLERCUBEARRAY +%token F16SAMPLERBUFFER F16SAMPLER2DMS F16SAMPLER2DMSARRAY +%token F16SAMPLER1DSHADOW F16SAMPLER2DSHADOW F16SAMPLER1DARRAYSHADOW F16SAMPLER2DARRAYSHADOW +%token F16SAMPLER2DRECTSHADOW F16SAMPLERCUBESHADOW F16SAMPLERCUBEARRAYSHADOW + // pure sampler %token SAMPLER SAMPLERSHADOW @@ -174,8 +200,13 @@ %token TEXTURE2DMS ITEXTURE2DMS UTEXTURE2DMS %token TEXTURE2DMSARRAY ITEXTURE2DMSARRAY UTEXTURE2DMSARRAY +%token F16TEXTURE1D F16TEXTURE2D F16TEXTURE3D F16TEXTURE2DRECT F16TEXTURECUBE +%token F16TEXTURE1DARRAY F16TEXTURE2DARRAY F16TEXTURECUBEARRAY +%token F16TEXTUREBUFFER F16TEXTURE2DMS F16TEXTURE2DMSARRAY + // input attachments %token SUBPASSINPUT SUBPASSINPUTMS ISUBPASSINPUT ISUBPASSINPUTMS USUBPASSINPUT USUBPASSINPUTMS +%token F16SUBPASSINPUT F16SUBPASSINPUTMS %token IMAGE1D IIMAGE1D UIMAGE1D IMAGE2D IIMAGE2D %token UIMAGE2D IMAGE3D IIMAGE3D UIMAGE3D @@ -188,10 +219,14 @@ %token IMAGE2DMS IIMAGE2DMS UIMAGE2DMS %token IMAGE2DMSARRAY IIMAGE2DMSARRAY UIMAGE2DMSARRAY +%token F16IMAGE1D F16IMAGE2D F16IMAGE3D F16IMAGE2DRECT +%token F16IMAGECUBE F16IMAGE1DARRAY F16IMAGE2DARRAY F16IMAGECUBEARRAY +%token F16IMAGEBUFFER F16IMAGE2DMS F16IMAGE2DMSARRAY + %token STRUCT VOID WHILE %token IDENTIFIER TYPE_NAME -%token FLOATCONSTANT DOUBLECONSTANT INTCONSTANT UINTCONSTANT INT64CONSTANT UINT64CONSTANT INT16CONSTANT UINT16CONSTANT BOOLCONSTANT FLOAT16CONSTANT +%token FLOATCONSTANT DOUBLECONSTANT INT16CONSTANT UINT16CONSTANT INT32CONSTANT UINT32CONSTANT INTCONSTANT UINTCONSTANT INT64CONSTANT UINT64CONSTANT BOOLCONSTANT FLOAT16CONSTANT %token LEFT_OP RIGHT_OP %token INC_OP DEC_OP LE_OP GE_OP EQ_OP NE_OP %token AND_OP OR_OP XOR_OP MUL_ASSIGN DIV_ASSIGN ADD_ASSIGN @@ -233,6 +268,7 @@ %type array_specifier %type precise_qualifier invariant_qualifier interpolation_qualifier storage_qualifier precision_qualifier %type layout_qualifier layout_qualifier_id_list layout_qualifier_id +%type non_uniform_qualifier %type type_qualifier fully_specified_type type_specifier %type single_type_qualifier @@ -263,6 +299,14 @@ : variable_identifier { $$ = $1; } + | INT32CONSTANT { + parseContext.explicitInt32Check($1.loc, "32-bit signed literal"); + $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true); + } + | UINT32CONSTANT { + parseContext.explicitInt32Check($1.loc, "32-bit signed literal"); + $$ = parseContext.intermediate.addConstantUnion($1.u, $1.loc, true); + } | INTCONSTANT { $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true); } @@ -279,16 +323,12 @@ $$ = parseContext.intermediate.addConstantUnion($1.u64, $1.loc, true); } | INT16CONSTANT { -#ifdef AMD_EXTENSIONS - parseContext.int16Check($1.loc, "16-bit integer literal"); + parseContext.explicitInt16Check($1.loc, "16-bit integer literal"); $$ = parseContext.intermediate.addConstantUnion((short)$1.i, $1.loc, true); -#endif } | UINT16CONSTANT { -#ifdef AMD_EXTENSIONS - parseContext.int16Check($1.loc, "16-bit unsigned integer literal"); + parseContext.explicitInt16Check($1.loc, "16-bit unsigned integer literal"); $$ = parseContext.intermediate.addConstantUnion((unsigned short)$1.u, $1.loc, true); -#endif } | FLOATCONSTANT { $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat, $1.loc, true); @@ -298,10 +338,8 @@ $$ = parseContext.intermediate.addConstantUnion($1.d, EbtDouble, $1.loc, true); } | FLOAT16CONSTANT { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float literal"); $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat16, $1.loc, true); -#endif } | BOOLCONSTANT { $$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true); @@ -436,6 +474,11 @@ $$.function = new TFunction(&empty, TType(EbtVoid), EOpNull); } } + | non_uniform_qualifier { + // Constructor + $$.intermNode = 0; + $$.function = parseContext.handleConstructorCall($1.loc, $1); + } ; unary_expression @@ -897,13 +940,15 @@ parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type"); parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes); } - parseContext.arrayDimCheck($2.loc, $1.arraySizes, $3.arraySizes); + TType* type = new TType($1); + type->transferArraySizes($3.arraySizes); + type->copyArrayInnerSizes($1.arraySizes); + parseContext.arrayOfArrayVersionCheck($2.loc, type->getArraySizes()); parseContext.arraySizeRequiredCheck($3.loc, *$3.arraySizes); parseContext.reservedErrorCheck($2.loc, *$2.string); - TParameter param = { $2.string, new TType($1)}; - parseContext.arrayDimMerge(*param.type, $3.arraySizes); + TParameter param = { $2.string, type }; $$.loc = $2.loc; $$.param = param; @@ -929,7 +974,7 @@ $$ = $1; parseContext.parameterTypeCheck($1.loc, EvqIn, *$1.param.type); - parseContext.paramCheckFix($1.loc, EvqTemporary, *$$.param.type); + parseContext.paramCheckFixStorage($1.loc, EvqTemporary, *$$.param.type); parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); } // @@ -949,7 +994,7 @@ $$ = $1; parseContext.parameterTypeCheck($1.loc, EvqIn, *$1.param.type); - parseContext.paramCheckFix($1.loc, EvqTemporary, *$$.param.type); + parseContext.paramCheckFixStorage($1.loc, EvqTemporary, *$$.param.type); parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); } ; @@ -1038,7 +1083,7 @@ } if ($2.arraySizes && parseContext.arrayQualifierError($2.loc, $1.qualifier)) - $2.arraySizes = 0; + $2.arraySizes = nullptr; parseContext.checkNoShaderLayouts($2.loc, $1.shaderQualifiers); $2.shaderQualifiers.merge($1.shaderQualifiers); @@ -1080,7 +1125,11 @@ } | NOPERSPECTIVE { parseContext.globalCheck($1.loc, "noperspective"); +#ifdef NV_EXTENSIONS + parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective"); +#else parseContext.requireProfile($1.loc, ~EEsProfile, "noperspective"); +#endif parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "noperspective"); $$.init($1.loc); $$.qualifier.nopersp = true; @@ -1174,6 +1223,9 @@ // allow inheritance of storage qualifier from block declaration $$ = $1; } + | non_uniform_qualifier { + $$ = $1; + } ; storage_qualifier @@ -1294,6 +1346,13 @@ } ; +non_uniform_qualifier + : NONUNIFORM { + $$.init($1.loc); + $$.qualifier.nonUniform = true; + } + ; + type_name_list : IDENTIFIER { // TODO @@ -1311,7 +1370,7 @@ $$.qualifier.precision = parseContext.getDefaultPrecision($$); } | type_specifier_nonarray array_specifier { - parseContext.arrayDimCheck($2.loc, $2.arraySizes, 0); + parseContext.arrayOfArrayVersionCheck($2.loc, $2.arraySizes); $$ = $1; $$.qualifier.precision = parseContext.getDefaultPrecision($$); $$.arraySizes = $2.arraySizes; @@ -1360,11 +1419,19 @@ $$.basicType = EbtDouble; } | FLOAT16_T { -#ifdef AMD_EXTENSIONS - parseContext.float16Check($1.loc, "half float", parseContext.symbolTable.atBuiltInLevel()); + parseContext.float16Check($1.loc, "float16_t", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; -#endif + } + | FLOAT32_T { + parseContext.explicitFloat32Check($1.loc, "float32_t", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + } + | FLOAT64_T { + parseContext.explicitFloat64Check($1.loc, "float64_t", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; } | INT { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); @@ -1375,29 +1442,45 @@ $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtUint; } - | INT64_T { - parseContext.int64Check($1.loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel()); + | INT8_T { + parseContext.explicitInt8Check($1.loc, "8-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt64; + $$.basicType = EbtInt8; } - | UINT64_T { - parseContext.int64Check($1.loc, "64-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); + | UINT8_T { + parseContext.explicitInt8Check($1.loc, "8-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint64; + $$.basicType = EbtUint8; } | INT16_T { -#ifdef AMD_EXTENSIONS - parseContext.int16Check($1.loc, "16-bit integer", parseContext.symbolTable.atBuiltInLevel()); + parseContext.explicitInt16Check($1.loc, "16-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtInt16; -#endif } | UINT16_T { -#ifdef AMD_EXTENSIONS - parseContext.int16Check($1.loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); + parseContext.explicitInt16Check($1.loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtUint16; -#endif + } + | INT32_T { + parseContext.explicitInt32Check($1.loc, "32-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtInt; + } + | UINT32_T { + parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtUint; + } + | INT64_T { + parseContext.int64Check($1.loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtInt64; + } + | UINT64_T { + parseContext.int64Check($1.loc, "64-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtUint64; } | BOOL { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); @@ -1437,28 +1520,58 @@ $$.setVector(4); } | F16VEC2 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setVector(2); -#endif } | F16VEC3 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setVector(3); -#endif } | F16VEC4 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setVector(4); -#endif + } + | F32VEC2 { + parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setVector(2); + } + | F32VEC3 { + parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setVector(3); + } + | F32VEC4 { + parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setVector(4); + } + | F64VEC2 { + parseContext.explicitFloat64Check($1.loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setVector(2); + } + | F64VEC3 { + parseContext.explicitFloat64Check($1.loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setVector(3); + } + | F64VEC4 { + parseContext.explicitFloat64Check($1.loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setVector(4); } | BVEC2 { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); @@ -1490,47 +1603,77 @@ $$.basicType = EbtInt; $$.setVector(4); } - | I64VEC2 { - parseContext.int64Check($1.loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + | I8VEC2 { + parseContext.explicitInt8Check($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtInt8; + $$.setVector(2); + } + | I8VEC3 { + parseContext.explicitInt8Check($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtInt8; + $$.setVector(3); + } + | I8VEC4 { + parseContext.explicitInt8Check($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtInt8; + $$.setVector(4); + } + | I16VEC2 { + parseContext.explicitInt16Check($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtInt16; + $$.setVector(2); + } + | I16VEC3 { + parseContext.explicitInt16Check($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtInt16; + $$.setVector(3); + } + | I16VEC4 { + parseContext.explicitInt16Check($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtInt16; + $$.setVector(4); + } + | I32VEC2 { + parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt64; + $$.basicType = EbtInt; $$.setVector(2); } - | I64VEC3 { - parseContext.int64Check($1.loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + | I32VEC3 { + parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt64; + $$.basicType = EbtInt; $$.setVector(3); } - | I64VEC4 { - parseContext.int64Check($1.loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + | I32VEC4 { + parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt64; + $$.basicType = EbtInt; $$.setVector(4); } - | I16VEC2 { -#ifdef AMD_EXTENSIONS - parseContext.int16Check($1.loc, "16-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + | I64VEC2 { + parseContext.int64Check($1.loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt16; + $$.basicType = EbtInt64; $$.setVector(2); -#endif } - | I16VEC3 { -#ifdef AMD_EXTENSIONS - parseContext.int16Check($1.loc, "16-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + | I64VEC3 { + parseContext.int64Check($1.loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt16; + $$.basicType = EbtInt64; $$.setVector(3); -#endif } - | I16VEC4 { -#ifdef AMD_EXTENSIONS - parseContext.int16Check($1.loc, "16-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); + | I64VEC4 { + parseContext.int64Check($1.loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt16; + $$.basicType = EbtInt64; $$.setVector(4); -#endif } | UVEC2 { parseContext.fullIntegerCheck($1.loc, "unsigned integer vector"); @@ -1550,47 +1693,77 @@ $$.basicType = EbtUint; $$.setVector(4); } - | U64VEC2 { - parseContext.int64Check($1.loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + | U8VEC2 { + parseContext.explicitInt8Check($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint64; + $$.basicType = EbtUint8; $$.setVector(2); } - | U64VEC3 { - parseContext.int64Check($1.loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + | U8VEC3 { + parseContext.explicitInt8Check($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint64; + $$.basicType = EbtInt8; $$.setVector(3); } - | U64VEC4 { - parseContext.int64Check($1.loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + | U8VEC4 { + parseContext.explicitInt8Check($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint64; + $$.basicType = EbtUint8; $$.setVector(4); } | U16VEC2 { -#ifdef AMD_EXTENSIONS - parseContext.int16Check($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.explicitInt16Check($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtUint16; $$.setVector(2); -#endif } | U16VEC3 { -#ifdef AMD_EXTENSIONS - parseContext.int16Check($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.explicitInt16Check($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtUint16; $$.setVector(3); -#endif } | U16VEC4 { -#ifdef AMD_EXTENSIONS - parseContext.int16Check($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + parseContext.explicitInt16Check($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtUint16; $$.setVector(4); -#endif + } + | U32VEC2 { + parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtUint; + $$.setVector(2); + } + | U32VEC3 { + parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtUint; + $$.setVector(3); + } + | U32VEC4 { + parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtUint; + $$.setVector(4); + } + | U64VEC2 { + parseContext.int64Check($1.loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtUint64; + $$.setVector(2); + } + | U64VEC3 { + parseContext.int64Check($1.loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtUint64; + $$.setVector(3); + } + | U64VEC4 { + parseContext.int64Check($1.loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtUint64; + $$.setVector(4); } | MAT2 { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); @@ -1725,100 +1898,220 @@ $$.setMatrix(4, 4); } | F16MAT2 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setMatrix(2, 2); -#endif } | F16MAT3 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setMatrix(3, 3); -#endif } | F16MAT4 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setMatrix(4, 4); -#endif } | F16MAT2X2 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setMatrix(2, 2); -#endif } | F16MAT2X3 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setMatrix(2, 3); -#endif } | F16MAT2X4 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setMatrix(2, 4); -#endif } | F16MAT3X2 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setMatrix(3, 2); -#endif } | F16MAT3X3 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setMatrix(3, 3); -#endif } | F16MAT3X4 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setMatrix(3, 4); -#endif } | F16MAT4X2 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setMatrix(4, 2); -#endif } | F16MAT4X3 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setMatrix(4, 3); -#endif } | F16MAT4X4 { -#ifdef AMD_EXTENSIONS parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat16; $$.setMatrix(4, 4); -#endif + } + | F32MAT2 { + parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setMatrix(2, 2); + } + | F32MAT3 { + parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setMatrix(3, 3); + } + | F32MAT4 { + parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setMatrix(4, 4); + } + | F32MAT2X2 { + parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setMatrix(2, 2); + } + | F32MAT2X3 { + parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setMatrix(2, 3); + } + | F32MAT2X4 { + parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setMatrix(2, 4); + } + | F32MAT3X2 { + parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setMatrix(3, 2); + } + | F32MAT3X3 { + parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setMatrix(3, 3); + } + | F32MAT3X4 { + parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setMatrix(3, 4); + } + | F32MAT4X2 { + parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setMatrix(4, 2); + } + | F32MAT4X3 { + parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setMatrix(4, 3); + } + | F32MAT4X4 { + parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtFloat; + $$.setMatrix(4, 4); + } + | F64MAT2 { + parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setMatrix(2, 2); + } + | F64MAT3 { + parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setMatrix(3, 3); + } + | F64MAT4 { + parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setMatrix(4, 4); + } + | F64MAT2X2 { + parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setMatrix(2, 2); + } + | F64MAT2X3 { + parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setMatrix(2, 3); + } + | F64MAT2X4 { + parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setMatrix(2, 4); + } + | F64MAT3X2 { + parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setMatrix(3, 2); + } + | F64MAT3X3 { + parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setMatrix(3, 3); + } + | F64MAT3X4 { + parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setMatrix(3, 4); + } + | F64MAT4X2 { + parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setMatrix(4, 2); + } + | F64MAT4X3 { + parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setMatrix(4, 3); + } + | F64MAT4X4 { + parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtDouble; + $$.setMatrix(4, 4); } | ATOMIC_UINT { parseContext.vulkanRemoved($1.loc, "atomic counter types"); @@ -1890,6 +2183,110 @@ $$.basicType = EbtSampler; $$.sampler.set(EbtFloat, EsdCube, true, true); } + | F16SAMPLER1D { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, Esd1D); +#endif + } + | F16SAMPLER2D { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, Esd2D); +#endif + } + | F16SAMPLER3D { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, Esd3D); +#endif + } + | F16SAMPLERCUBE { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, EsdCube); +#endif + } + | F16SAMPLER1DSHADOW { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, Esd1D, false, true); +#endif + } + | F16SAMPLER2DSHADOW { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, Esd2D, false, true); +#endif + } + | F16SAMPLERCUBESHADOW { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, EsdCube, false, true); +#endif + } + | F16SAMPLER1DARRAY { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, Esd1D, true); +#endif + } + | F16SAMPLER2DARRAY { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, Esd2D, true); +#endif + } + | F16SAMPLER1DARRAYSHADOW { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, Esd1D, true, true); +#endif + } + | F16SAMPLER2DARRAYSHADOW { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, Esd2D, true, true); +#endif + } + | F16SAMPLERCUBEARRAY { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, EsdCube, true); +#endif + } + | F16SAMPLERCUBEARRAYSHADOW { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, EsdCube, true, true); +#endif + } | ISAMPLER1D { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -1970,6 +2367,22 @@ $$.basicType = EbtSampler; $$.sampler.set(EbtFloat, EsdRect, false, true); } + | F16SAMPLER2DRECT { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, EsdRect); +#endif + } + | F16SAMPLER2DRECTSHADOW { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, EsdRect, false, true); +#endif + } | ISAMPLER2DRECT { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -1985,6 +2398,14 @@ $$.basicType = EbtSampler; $$.sampler.set(EbtFloat, EsdBuffer); } + | F16SAMPLERBUFFER { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, EsdBuffer); +#endif + } | ISAMPLERBUFFER { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2000,6 +2421,14 @@ $$.basicType = EbtSampler; $$.sampler.set(EbtFloat, Esd2D, false, false, true); } + | F16SAMPLER2DMS { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, Esd2D, false, false, true); +#endif + } | ISAMPLER2DMS { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2015,6 +2444,14 @@ $$.basicType = EbtSampler; $$.sampler.set(EbtFloat, Esd2D, true, false, true); } + | F16SAMPLER2DMSARRAY { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.set(EbtFloat16, Esd2D, true, false, true); +#endif + } | ISAMPLER2DMSARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2040,36 +2477,92 @@ $$.basicType = EbtSampler; $$.sampler.setTexture(EbtFloat, Esd1D); } + | F16TEXTURE1D { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setTexture(EbtFloat16, Esd1D); +#endif + } | TEXTURE2D { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; $$.sampler.setTexture(EbtFloat, Esd2D); } + | F16TEXTURE2D { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setTexture(EbtFloat16, Esd2D); +#endif + } | TEXTURE3D { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; $$.sampler.setTexture(EbtFloat, Esd3D); } + | F16TEXTURE3D { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setTexture(EbtFloat16, Esd3D); +#endif + } | TEXTURECUBE { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; $$.sampler.setTexture(EbtFloat, EsdCube); } + | F16TEXTURECUBE { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setTexture(EbtFloat16, EsdCube); +#endif + } | TEXTURE1DARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; $$.sampler.setTexture(EbtFloat, Esd1D, true); } + | F16TEXTURE1DARRAY { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setTexture(EbtFloat16, Esd1D, true); +#endif + } | TEXTURE2DARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; $$.sampler.setTexture(EbtFloat, Esd2D, true); } + | F16TEXTURE2DARRAY { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setTexture(EbtFloat16, Esd2D, true); +#endif + } | TEXTURECUBEARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; $$.sampler.setTexture(EbtFloat, EsdCube, true); } + | F16TEXTURECUBEARRAY { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setTexture(EbtFloat16, EsdCube, true); +#endif + } | ITEXTURE1D { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2145,6 +2638,14 @@ $$.basicType = EbtSampler; $$.sampler.setTexture(EbtFloat, EsdRect); } + | F16TEXTURE2DRECT { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setTexture(EbtFloat16, EsdRect); +#endif + } | ITEXTURE2DRECT { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2160,6 +2661,14 @@ $$.basicType = EbtSampler; $$.sampler.setTexture(EbtFloat, EsdBuffer); } + | F16TEXTUREBUFFER { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setTexture(EbtFloat16, EsdBuffer); +#endif + } | ITEXTUREBUFFER { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2175,6 +2684,14 @@ $$.basicType = EbtSampler; $$.sampler.setTexture(EbtFloat, Esd2D, false, false, true); } + | F16TEXTURE2DMS { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setTexture(EbtFloat16, Esd2D, false, false, true); +#endif + } | ITEXTURE2DMS { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2190,6 +2707,14 @@ $$.basicType = EbtSampler; $$.sampler.setTexture(EbtFloat, Esd2D, true, false, true); } + | F16TEXTURE2DMSARRAY { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setTexture(EbtFloat16, Esd2D, true, false, true); +#endif + } | ITEXTURE2DMSARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2205,6 +2730,14 @@ $$.basicType = EbtSampler; $$.sampler.setImage(EbtFloat, Esd1D); } + | F16IMAGE1D { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setImage(EbtFloat16, Esd1D); +#endif + } | IIMAGE1D { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2220,6 +2753,14 @@ $$.basicType = EbtSampler; $$.sampler.setImage(EbtFloat, Esd2D); } + | F16IMAGE2D { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setImage(EbtFloat16, Esd2D); +#endif + } | IIMAGE2D { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2235,6 +2776,14 @@ $$.basicType = EbtSampler; $$.sampler.setImage(EbtFloat, Esd3D); } + | F16IMAGE3D { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setImage(EbtFloat16, Esd3D); +#endif + } | IIMAGE3D { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2250,6 +2799,14 @@ $$.basicType = EbtSampler; $$.sampler.setImage(EbtFloat, EsdRect); } + | F16IMAGE2DRECT { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setImage(EbtFloat16, EsdRect); +#endif + } | IIMAGE2DRECT { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2265,6 +2822,14 @@ $$.basicType = EbtSampler; $$.sampler.setImage(EbtFloat, EsdCube); } + | F16IMAGECUBE { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setImage(EbtFloat16, EsdCube); +#endif + } | IIMAGECUBE { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2280,6 +2845,14 @@ $$.basicType = EbtSampler; $$.sampler.setImage(EbtFloat, EsdBuffer); } + | F16IMAGEBUFFER { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setImage(EbtFloat16, EsdBuffer); +#endif + } | IIMAGEBUFFER { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2295,6 +2868,14 @@ $$.basicType = EbtSampler; $$.sampler.setImage(EbtFloat, Esd1D, true); } + | F16IMAGE1DARRAY { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setImage(EbtFloat16, Esd1D, true); +#endif + } | IIMAGE1DARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2310,6 +2891,14 @@ $$.basicType = EbtSampler; $$.sampler.setImage(EbtFloat, Esd2D, true); } + | F16IMAGE2DARRAY { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setImage(EbtFloat16, Esd2D, true); +#endif + } | IIMAGE2DARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2325,6 +2914,14 @@ $$.basicType = EbtSampler; $$.sampler.setImage(EbtFloat, EsdCube, true); } + | F16IMAGECUBEARRAY { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setImage(EbtFloat16, EsdCube, true); +#endif + } | IIMAGECUBEARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2340,6 +2937,14 @@ $$.basicType = EbtSampler; $$.sampler.setImage(EbtFloat, Esd2D, false, false, true); } + | F16IMAGE2DMS { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setImage(EbtFloat16, Esd2D, false, false, true); +#endif + } | IIMAGE2DMS { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2355,6 +2960,14 @@ $$.basicType = EbtSampler; $$.sampler.setImage(EbtFloat, Esd2D, true, false, true); } + | F16IMAGE2DMSARRAY { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setImage(EbtFloat16, Esd2D, true, false, true); +#endif + } | IIMAGE2DMSARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2383,6 +2996,24 @@ $$.basicType = EbtSampler; $$.sampler.setSubpass(EbtFloat, true); } + | F16SUBPASSINPUT { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel()); + parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setSubpass(EbtFloat16); +#endif + } + | F16SUBPASSINPUTMS { +#ifdef AMD_EXTENSIONS + parseContext.float16OpaqueCheck($1.loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel()); + parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setSubpass(EbtFloat16, true); +#endif + } | ISUBPASSINPUT { parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); @@ -2497,12 +3128,15 @@ parseContext.precisionQualifierCheck($1.loc, $1.basicType, $1.qualifier); for (unsigned int i = 0; i < $$->size(); ++i) { - parseContext.arrayDimCheck($1.loc, (*$$)[i].type, $1.arraySizes); - (*$$)[i].type->mergeType($1); + TType type($1); + type.setFieldName((*$$)[i].type->getFieldName()); + type.transferArraySizes((*$$)[i].type->getArraySizes()); + type.copyArrayInnerSizes($1.arraySizes); + parseContext.arrayOfArrayVersionCheck((*$$)[i].loc, type.getArraySizes()); + (*$$)[i].type->shallowCopy(type); } } | type_qualifier type_specifier struct_declarator_list SEMICOLON { - parseContext.globalQualifierFixCheck($1.loc, $1.qualifier); if ($2.arraySizes) { parseContext.profileRequires($2.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); parseContext.profileRequires($2.loc, EEsProfile, 300, 0, "arrayed type"); @@ -2512,14 +3146,18 @@ $$ = $3; - parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers); + parseContext.memberQualifierCheck($1); parseContext.voidErrorCheck($2.loc, (*$3)[0].type->getFieldName(), $2.basicType); parseContext.mergeQualifiers($2.loc, $2.qualifier, $1.qualifier, true); parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier); for (unsigned int i = 0; i < $$->size(); ++i) { - parseContext.arrayDimCheck($1.loc, (*$$)[i].type, $2.arraySizes); - (*$$)[i].type->mergeType($2); + TType type($2); + type.setFieldName((*$$)[i].type->getFieldName()); + type.transferArraySizes((*$$)[i].type->getArraySizes()); + type.copyArrayInnerSizes($2.arraySizes); + parseContext.arrayOfArrayVersionCheck((*$$)[i].loc, type.getArraySizes()); + (*$$)[i].type->shallowCopy(type); } } ; @@ -2541,12 +3179,12 @@ $$.type->setFieldName(*$1.string); } | IDENTIFIER array_specifier { - parseContext.arrayDimCheck($1.loc, $2.arraySizes, 0); + parseContext.arrayOfArrayVersionCheck($1.loc, $2.arraySizes); $$.type = new TType(EbtVoid); $$.loc = $1.loc; $$.type->setFieldName(*$1.string); - $$.type->newArraySizes(*$2.arraySizes); + $$.type->transferArraySizes($2.arraySizes); } ; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/gl_types.h vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/gl_types.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/gl_types.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/gl_types.h 2018-04-27 11:46:26.000000000 +0000 @@ -117,6 +117,40 @@ #define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#ifdef AMD_EXTENSIONS +#define GL_FLOAT16_SAMPLER_1D_AMD 0x91CE +#define GL_FLOAT16_SAMPLER_2D_AMD 0x91CF +#define GL_FLOAT16_SAMPLER_3D_AMD 0x91D0 +#define GL_FLOAT16_SAMPLER_CUBE_AMD 0x91D1 +#define GL_FLOAT16_SAMPLER_2D_RECT_AMD 0x91D2 +#define GL_FLOAT16_SAMPLER_1D_ARRAY_AMD 0x91D3 +#define GL_FLOAT16_SAMPLER_2D_ARRAY_AMD 0x91D4 +#define GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_AMD 0x91D5 +#define GL_FLOAT16_SAMPLER_BUFFER_AMD 0x91D6 +#define GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_AMD 0x91D7 +#define GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_ARRAY_AMD 0x91D8 + +#define GL_FLOAT16_SAMPLER_1D_SHADOW_AMD 0x91D9 +#define GL_FLOAT16_SAMPLER_2D_SHADOW_AMD 0x91DA +#define GL_FLOAT16_SAMPLER_2D_RECT_SHADOW_AMD 0x91DB +#define GL_FLOAT16_SAMPLER_1D_ARRAY_SHADOW_AMD 0x91DC +#define GL_FLOAT16_SAMPLER_2D_ARRAY_SHADOW_AMD 0x91DD +#define GL_FLOAT16_SAMPLER_CUBE_SHADOW_AMD 0x91DE +#define GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_SHADOW_AMD 0x91DF + +#define GL_FLOAT16_IMAGE_1D_AMD 0x91E0 +#define GL_FLOAT16_IMAGE_2D_AMD 0x91E1 +#define GL_FLOAT16_IMAGE_3D_AMD 0x91E2 +#define GL_FLOAT16_IMAGE_2D_RECT_AMD 0x91E3 +#define GL_FLOAT16_IMAGE_CUBE_AMD 0x91E4 +#define GL_FLOAT16_IMAGE_1D_ARRAY_AMD 0x91E5 +#define GL_FLOAT16_IMAGE_2D_ARRAY_AMD 0x91E6 +#define GL_FLOAT16_IMAGE_CUBE_MAP_ARRAY_AMD 0x91E7 +#define GL_FLOAT16_IMAGE_BUFFER_AMD 0x91E8 +#define GL_FLOAT16_IMAGE_2D_MULTISAMPLE_AMD 0x91E9 +#define GL_FLOAT16_IMAGE_2D_MULTISAMPLE_ARRAY_AMD 0x91EA +#endif + #define GL_INT_SAMPLER_1D 0x8DC9 #define GL_INT_SAMPLER_2D 0x8DCA #define GL_INT_SAMPLER_3D 0x8DCB diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Initialize.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Initialize.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Initialize.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Initialize.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -2,6 +2,7 @@ // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2016 LunarG, Inc. // Copyright (C) 2015-2017 Google, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -83,6 +84,13 @@ // Set up textual representations for making all the permutations // of texturing/imaging functions. prefixes[EbtFloat] = ""; +#ifdef AMD_EXTENSIONS + prefixes[EbtFloat16] = "f16"; +#endif + prefixes[EbtInt8] = "i8"; + prefixes[EbtUint8] = "u8"; + prefixes[EbtInt16] = "i16"; + prefixes[EbtUint16] = "u16"; prefixes[EbtInt] = "i"; prefixes[EbtUint] = "u"; postfixes[2] = "2"; @@ -799,7 +807,6 @@ "bvec3 notEqual(u64vec3, u64vec3);" "bvec4 notEqual(u64vec4, u64vec4);" -#ifdef AMD_EXTENSIONS "int findLSB(int64_t);" "ivec2 findLSB(i64vec2);" "ivec3 findLSB(i64vec3);" @@ -819,7 +826,7 @@ "ivec2 findMSB(u64vec2);" "ivec3 findMSB(u64vec3);" "ivec4 findMSB(u64vec4);" -#endif + "\n" ); } @@ -888,6 +895,36 @@ "f16vec3 mid3(f16vec3, f16vec3, f16vec3);" "f16vec4 mid3(f16vec4, f16vec4, f16vec4);" + "int16_t min3(int16_t, int16_t, int16_t);" + "i16vec2 min3(i16vec2, i16vec2, i16vec2);" + "i16vec3 min3(i16vec3, i16vec3, i16vec3);" + "i16vec4 min3(i16vec4, i16vec4, i16vec4);" + + "int16_t max3(int16_t, int16_t, int16_t);" + "i16vec2 max3(i16vec2, i16vec2, i16vec2);" + "i16vec3 max3(i16vec3, i16vec3, i16vec3);" + "i16vec4 max3(i16vec4, i16vec4, i16vec4);" + + "int16_t mid3(int16_t, int16_t, int16_t);" + "i16vec2 mid3(i16vec2, i16vec2, i16vec2);" + "i16vec3 mid3(i16vec3, i16vec3, i16vec3);" + "i16vec4 mid3(i16vec4, i16vec4, i16vec4);" + + "uint16_t min3(uint16_t, uint16_t, uint16_t);" + "u16vec2 min3(u16vec2, u16vec2, u16vec2);" + "u16vec3 min3(u16vec3, u16vec3, u16vec3);" + "u16vec4 min3(u16vec4, u16vec4, u16vec4);" + + "uint16_t max3(uint16_t, uint16_t, uint16_t);" + "u16vec2 max3(u16vec2, u16vec2, u16vec2);" + "u16vec3 max3(u16vec3, u16vec3, u16vec3);" + "u16vec4 max3(u16vec4, u16vec4, u16vec4);" + + "uint16_t mid3(uint16_t, uint16_t, uint16_t);" + "u16vec2 mid3(u16vec2, u16vec2, u16vec2);" + "u16vec3 mid3(u16vec3, u16vec3, u16vec3);" + "u16vec4 mid3(u16vec4, u16vec4, u16vec4);" + "\n" ); } @@ -1627,6 +1664,1087 @@ "\n"); } + // GL_KHR_shader_subgroup + if (spvVersion.vulkan > 0) { + commonBuiltins.append( + "void subgroupBarrier();" + "void subgroupMemoryBarrier();" + "void subgroupMemoryBarrierBuffer();" + "void subgroupMemoryBarrierImage();" + "bool subgroupElect();" + + "bool subgroupAll(bool);\n" + "bool subgroupAny(bool);\n" + + "bool subgroupAllEqual(float);\n" + "bool subgroupAllEqual(vec2);\n" + "bool subgroupAllEqual(vec3);\n" + "bool subgroupAllEqual(vec4);\n" + "bool subgroupAllEqual(int);\n" + "bool subgroupAllEqual(ivec2);\n" + "bool subgroupAllEqual(ivec3);\n" + "bool subgroupAllEqual(ivec4);\n" + "bool subgroupAllEqual(uint);\n" + "bool subgroupAllEqual(uvec2);\n" + "bool subgroupAllEqual(uvec3);\n" + "bool subgroupAllEqual(uvec4);\n" + "bool subgroupAllEqual(bool);\n" + "bool subgroupAllEqual(bvec2);\n" + "bool subgroupAllEqual(bvec3);\n" + "bool subgroupAllEqual(bvec4);\n" + + "float subgroupBroadcast(float, uint);\n" + "vec2 subgroupBroadcast(vec2, uint);\n" + "vec3 subgroupBroadcast(vec3, uint);\n" + "vec4 subgroupBroadcast(vec4, uint);\n" + "int subgroupBroadcast(int, uint);\n" + "ivec2 subgroupBroadcast(ivec2, uint);\n" + "ivec3 subgroupBroadcast(ivec3, uint);\n" + "ivec4 subgroupBroadcast(ivec4, uint);\n" + "uint subgroupBroadcast(uint, uint);\n" + "uvec2 subgroupBroadcast(uvec2, uint);\n" + "uvec3 subgroupBroadcast(uvec3, uint);\n" + "uvec4 subgroupBroadcast(uvec4, uint);\n" + "bool subgroupBroadcast(bool, uint);\n" + "bvec2 subgroupBroadcast(bvec2, uint);\n" + "bvec3 subgroupBroadcast(bvec3, uint);\n" + "bvec4 subgroupBroadcast(bvec4, uint);\n" + + "float subgroupBroadcastFirst(float);\n" + "vec2 subgroupBroadcastFirst(vec2);\n" + "vec3 subgroupBroadcastFirst(vec3);\n" + "vec4 subgroupBroadcastFirst(vec4);\n" + "int subgroupBroadcastFirst(int);\n" + "ivec2 subgroupBroadcastFirst(ivec2);\n" + "ivec3 subgroupBroadcastFirst(ivec3);\n" + "ivec4 subgroupBroadcastFirst(ivec4);\n" + "uint subgroupBroadcastFirst(uint);\n" + "uvec2 subgroupBroadcastFirst(uvec2);\n" + "uvec3 subgroupBroadcastFirst(uvec3);\n" + "uvec4 subgroupBroadcastFirst(uvec4);\n" + "bool subgroupBroadcastFirst(bool);\n" + "bvec2 subgroupBroadcastFirst(bvec2);\n" + "bvec3 subgroupBroadcastFirst(bvec3);\n" + "bvec4 subgroupBroadcastFirst(bvec4);\n" + + "uvec4 subgroupBallot(bool);\n" + "bool subgroupInverseBallot(uvec4);\n" + "bool subgroupBallotBitExtract(uvec4, uint);\n" + "uint subgroupBallotBitCount(uvec4);\n" + "uint subgroupBallotInclusiveBitCount(uvec4);\n" + "uint subgroupBallotExclusiveBitCount(uvec4);\n" + "uint subgroupBallotFindLSB(uvec4);\n" + "uint subgroupBallotFindMSB(uvec4);\n" + + "float subgroupShuffle(float, uint);\n" + "vec2 subgroupShuffle(vec2, uint);\n" + "vec3 subgroupShuffle(vec3, uint);\n" + "vec4 subgroupShuffle(vec4, uint);\n" + "int subgroupShuffle(int, uint);\n" + "ivec2 subgroupShuffle(ivec2, uint);\n" + "ivec3 subgroupShuffle(ivec3, uint);\n" + "ivec4 subgroupShuffle(ivec4, uint);\n" + "uint subgroupShuffle(uint, uint);\n" + "uvec2 subgroupShuffle(uvec2, uint);\n" + "uvec3 subgroupShuffle(uvec3, uint);\n" + "uvec4 subgroupShuffle(uvec4, uint);\n" + "bool subgroupShuffle(bool, uint);\n" + "bvec2 subgroupShuffle(bvec2, uint);\n" + "bvec3 subgroupShuffle(bvec3, uint);\n" + "bvec4 subgroupShuffle(bvec4, uint);\n" + + "float subgroupShuffleXor(float, uint);\n" + "vec2 subgroupShuffleXor(vec2, uint);\n" + "vec3 subgroupShuffleXor(vec3, uint);\n" + "vec4 subgroupShuffleXor(vec4, uint);\n" + "int subgroupShuffleXor(int, uint);\n" + "ivec2 subgroupShuffleXor(ivec2, uint);\n" + "ivec3 subgroupShuffleXor(ivec3, uint);\n" + "ivec4 subgroupShuffleXor(ivec4, uint);\n" + "uint subgroupShuffleXor(uint, uint);\n" + "uvec2 subgroupShuffleXor(uvec2, uint);\n" + "uvec3 subgroupShuffleXor(uvec3, uint);\n" + "uvec4 subgroupShuffleXor(uvec4, uint);\n" + "bool subgroupShuffleXor(bool, uint);\n" + "bvec2 subgroupShuffleXor(bvec2, uint);\n" + "bvec3 subgroupShuffleXor(bvec3, uint);\n" + "bvec4 subgroupShuffleXor(bvec4, uint);\n" + + "float subgroupShuffleUp(float, uint delta);\n" + "vec2 subgroupShuffleUp(vec2, uint delta);\n" + "vec3 subgroupShuffleUp(vec3, uint delta);\n" + "vec4 subgroupShuffleUp(vec4, uint delta);\n" + "int subgroupShuffleUp(int, uint delta);\n" + "ivec2 subgroupShuffleUp(ivec2, uint delta);\n" + "ivec3 subgroupShuffleUp(ivec3, uint delta);\n" + "ivec4 subgroupShuffleUp(ivec4, uint delta);\n" + "uint subgroupShuffleUp(uint, uint delta);\n" + "uvec2 subgroupShuffleUp(uvec2, uint delta);\n" + "uvec3 subgroupShuffleUp(uvec3, uint delta);\n" + "uvec4 subgroupShuffleUp(uvec4, uint delta);\n" + "bool subgroupShuffleUp(bool, uint delta);\n" + "bvec2 subgroupShuffleUp(bvec2, uint delta);\n" + "bvec3 subgroupShuffleUp(bvec3, uint delta);\n" + "bvec4 subgroupShuffleUp(bvec4, uint delta);\n" + + "float subgroupShuffleDown(float, uint delta);\n" + "vec2 subgroupShuffleDown(vec2, uint delta);\n" + "vec3 subgroupShuffleDown(vec3, uint delta);\n" + "vec4 subgroupShuffleDown(vec4, uint delta);\n" + "int subgroupShuffleDown(int, uint delta);\n" + "ivec2 subgroupShuffleDown(ivec2, uint delta);\n" + "ivec3 subgroupShuffleDown(ivec3, uint delta);\n" + "ivec4 subgroupShuffleDown(ivec4, uint delta);\n" + "uint subgroupShuffleDown(uint, uint delta);\n" + "uvec2 subgroupShuffleDown(uvec2, uint delta);\n" + "uvec3 subgroupShuffleDown(uvec3, uint delta);\n" + "uvec4 subgroupShuffleDown(uvec4, uint delta);\n" + "bool subgroupShuffleDown(bool, uint delta);\n" + "bvec2 subgroupShuffleDown(bvec2, uint delta);\n" + "bvec3 subgroupShuffleDown(bvec3, uint delta);\n" + "bvec4 subgroupShuffleDown(bvec4, uint delta);\n" + + "float subgroupAdd(float);\n" + "vec2 subgroupAdd(vec2);\n" + "vec3 subgroupAdd(vec3);\n" + "vec4 subgroupAdd(vec4);\n" + "int subgroupAdd(int);\n" + "ivec2 subgroupAdd(ivec2);\n" + "ivec3 subgroupAdd(ivec3);\n" + "ivec4 subgroupAdd(ivec4);\n" + "uint subgroupAdd(uint);\n" + "uvec2 subgroupAdd(uvec2);\n" + "uvec3 subgroupAdd(uvec3);\n" + "uvec4 subgroupAdd(uvec4);\n" + + "float subgroupMul(float);\n" + "vec2 subgroupMul(vec2);\n" + "vec3 subgroupMul(vec3);\n" + "vec4 subgroupMul(vec4);\n" + "int subgroupMul(int);\n" + "ivec2 subgroupMul(ivec2);\n" + "ivec3 subgroupMul(ivec3);\n" + "ivec4 subgroupMul(ivec4);\n" + "uint subgroupMul(uint);\n" + "uvec2 subgroupMul(uvec2);\n" + "uvec3 subgroupMul(uvec3);\n" + "uvec4 subgroupMul(uvec4);\n" + + "float subgroupMin(float);\n" + "vec2 subgroupMin(vec2);\n" + "vec3 subgroupMin(vec3);\n" + "vec4 subgroupMin(vec4);\n" + "int subgroupMin(int);\n" + "ivec2 subgroupMin(ivec2);\n" + "ivec3 subgroupMin(ivec3);\n" + "ivec4 subgroupMin(ivec4);\n" + "uint subgroupMin(uint);\n" + "uvec2 subgroupMin(uvec2);\n" + "uvec3 subgroupMin(uvec3);\n" + "uvec4 subgroupMin(uvec4);\n" + + "float subgroupMax(float);\n" + "vec2 subgroupMax(vec2);\n" + "vec3 subgroupMax(vec3);\n" + "vec4 subgroupMax(vec4);\n" + "int subgroupMax(int);\n" + "ivec2 subgroupMax(ivec2);\n" + "ivec3 subgroupMax(ivec3);\n" + "ivec4 subgroupMax(ivec4);\n" + "uint subgroupMax(uint);\n" + "uvec2 subgroupMax(uvec2);\n" + "uvec3 subgroupMax(uvec3);\n" + "uvec4 subgroupMax(uvec4);\n" + + "int subgroupAnd(int);\n" + "ivec2 subgroupAnd(ivec2);\n" + "ivec3 subgroupAnd(ivec3);\n" + "ivec4 subgroupAnd(ivec4);\n" + "uint subgroupAnd(uint);\n" + "uvec2 subgroupAnd(uvec2);\n" + "uvec3 subgroupAnd(uvec3);\n" + "uvec4 subgroupAnd(uvec4);\n" + "bool subgroupAnd(bool);\n" + "bvec2 subgroupAnd(bvec2);\n" + "bvec3 subgroupAnd(bvec3);\n" + "bvec4 subgroupAnd(bvec4);\n" + + "int subgroupOr(int);\n" + "ivec2 subgroupOr(ivec2);\n" + "ivec3 subgroupOr(ivec3);\n" + "ivec4 subgroupOr(ivec4);\n" + "uint subgroupOr(uint);\n" + "uvec2 subgroupOr(uvec2);\n" + "uvec3 subgroupOr(uvec3);\n" + "uvec4 subgroupOr(uvec4);\n" + "bool subgroupOr(bool);\n" + "bvec2 subgroupOr(bvec2);\n" + "bvec3 subgroupOr(bvec3);\n" + "bvec4 subgroupOr(bvec4);\n" + + "int subgroupXor(int);\n" + "ivec2 subgroupXor(ivec2);\n" + "ivec3 subgroupXor(ivec3);\n" + "ivec4 subgroupXor(ivec4);\n" + "uint subgroupXor(uint);\n" + "uvec2 subgroupXor(uvec2);\n" + "uvec3 subgroupXor(uvec3);\n" + "uvec4 subgroupXor(uvec4);\n" + "bool subgroupXor(bool);\n" + "bvec2 subgroupXor(bvec2);\n" + "bvec3 subgroupXor(bvec3);\n" + "bvec4 subgroupXor(bvec4);\n" + + "float subgroupInclusiveAdd(float);\n" + "vec2 subgroupInclusiveAdd(vec2);\n" + "vec3 subgroupInclusiveAdd(vec3);\n" + "vec4 subgroupInclusiveAdd(vec4);\n" + "int subgroupInclusiveAdd(int);\n" + "ivec2 subgroupInclusiveAdd(ivec2);\n" + "ivec3 subgroupInclusiveAdd(ivec3);\n" + "ivec4 subgroupInclusiveAdd(ivec4);\n" + "uint subgroupInclusiveAdd(uint);\n" + "uvec2 subgroupInclusiveAdd(uvec2);\n" + "uvec3 subgroupInclusiveAdd(uvec3);\n" + "uvec4 subgroupInclusiveAdd(uvec4);\n" + + "float subgroupInclusiveMul(float);\n" + "vec2 subgroupInclusiveMul(vec2);\n" + "vec3 subgroupInclusiveMul(vec3);\n" + "vec4 subgroupInclusiveMul(vec4);\n" + "int subgroupInclusiveMul(int);\n" + "ivec2 subgroupInclusiveMul(ivec2);\n" + "ivec3 subgroupInclusiveMul(ivec3);\n" + "ivec4 subgroupInclusiveMul(ivec4);\n" + "uint subgroupInclusiveMul(uint);\n" + "uvec2 subgroupInclusiveMul(uvec2);\n" + "uvec3 subgroupInclusiveMul(uvec3);\n" + "uvec4 subgroupInclusiveMul(uvec4);\n" + + "float subgroupInclusiveMin(float);\n" + "vec2 subgroupInclusiveMin(vec2);\n" + "vec3 subgroupInclusiveMin(vec3);\n" + "vec4 subgroupInclusiveMin(vec4);\n" + "int subgroupInclusiveMin(int);\n" + "ivec2 subgroupInclusiveMin(ivec2);\n" + "ivec3 subgroupInclusiveMin(ivec3);\n" + "ivec4 subgroupInclusiveMin(ivec4);\n" + "uint subgroupInclusiveMin(uint);\n" + "uvec2 subgroupInclusiveMin(uvec2);\n" + "uvec3 subgroupInclusiveMin(uvec3);\n" + "uvec4 subgroupInclusiveMin(uvec4);\n" + + "float subgroupInclusiveMax(float);\n" + "vec2 subgroupInclusiveMax(vec2);\n" + "vec3 subgroupInclusiveMax(vec3);\n" + "vec4 subgroupInclusiveMax(vec4);\n" + "int subgroupInclusiveMax(int);\n" + "ivec2 subgroupInclusiveMax(ivec2);\n" + "ivec3 subgroupInclusiveMax(ivec3);\n" + "ivec4 subgroupInclusiveMax(ivec4);\n" + "uint subgroupInclusiveMax(uint);\n" + "uvec2 subgroupInclusiveMax(uvec2);\n" + "uvec3 subgroupInclusiveMax(uvec3);\n" + "uvec4 subgroupInclusiveMax(uvec4);\n" + + "int subgroupInclusiveAnd(int);\n" + "ivec2 subgroupInclusiveAnd(ivec2);\n" + "ivec3 subgroupInclusiveAnd(ivec3);\n" + "ivec4 subgroupInclusiveAnd(ivec4);\n" + "uint subgroupInclusiveAnd(uint);\n" + "uvec2 subgroupInclusiveAnd(uvec2);\n" + "uvec3 subgroupInclusiveAnd(uvec3);\n" + "uvec4 subgroupInclusiveAnd(uvec4);\n" + "bool subgroupInclusiveAnd(bool);\n" + "bvec2 subgroupInclusiveAnd(bvec2);\n" + "bvec3 subgroupInclusiveAnd(bvec3);\n" + "bvec4 subgroupInclusiveAnd(bvec4);\n" + + "int subgroupInclusiveOr(int);\n" + "ivec2 subgroupInclusiveOr(ivec2);\n" + "ivec3 subgroupInclusiveOr(ivec3);\n" + "ivec4 subgroupInclusiveOr(ivec4);\n" + "uint subgroupInclusiveOr(uint);\n" + "uvec2 subgroupInclusiveOr(uvec2);\n" + "uvec3 subgroupInclusiveOr(uvec3);\n" + "uvec4 subgroupInclusiveOr(uvec4);\n" + "bool subgroupInclusiveOr(bool);\n" + "bvec2 subgroupInclusiveOr(bvec2);\n" + "bvec3 subgroupInclusiveOr(bvec3);\n" + "bvec4 subgroupInclusiveOr(bvec4);\n" + + "int subgroupInclusiveXor(int);\n" + "ivec2 subgroupInclusiveXor(ivec2);\n" + "ivec3 subgroupInclusiveXor(ivec3);\n" + "ivec4 subgroupInclusiveXor(ivec4);\n" + "uint subgroupInclusiveXor(uint);\n" + "uvec2 subgroupInclusiveXor(uvec2);\n" + "uvec3 subgroupInclusiveXor(uvec3);\n" + "uvec4 subgroupInclusiveXor(uvec4);\n" + "bool subgroupInclusiveXor(bool);\n" + "bvec2 subgroupInclusiveXor(bvec2);\n" + "bvec3 subgroupInclusiveXor(bvec3);\n" + "bvec4 subgroupInclusiveXor(bvec4);\n" + + "float subgroupExclusiveAdd(float);\n" + "vec2 subgroupExclusiveAdd(vec2);\n" + "vec3 subgroupExclusiveAdd(vec3);\n" + "vec4 subgroupExclusiveAdd(vec4);\n" + "int subgroupExclusiveAdd(int);\n" + "ivec2 subgroupExclusiveAdd(ivec2);\n" + "ivec3 subgroupExclusiveAdd(ivec3);\n" + "ivec4 subgroupExclusiveAdd(ivec4);\n" + "uint subgroupExclusiveAdd(uint);\n" + "uvec2 subgroupExclusiveAdd(uvec2);\n" + "uvec3 subgroupExclusiveAdd(uvec3);\n" + "uvec4 subgroupExclusiveAdd(uvec4);\n" + + "float subgroupExclusiveMul(float);\n" + "vec2 subgroupExclusiveMul(vec2);\n" + "vec3 subgroupExclusiveMul(vec3);\n" + "vec4 subgroupExclusiveMul(vec4);\n" + "int subgroupExclusiveMul(int);\n" + "ivec2 subgroupExclusiveMul(ivec2);\n" + "ivec3 subgroupExclusiveMul(ivec3);\n" + "ivec4 subgroupExclusiveMul(ivec4);\n" + "uint subgroupExclusiveMul(uint);\n" + "uvec2 subgroupExclusiveMul(uvec2);\n" + "uvec3 subgroupExclusiveMul(uvec3);\n" + "uvec4 subgroupExclusiveMul(uvec4);\n" + + "float subgroupExclusiveMin(float);\n" + "vec2 subgroupExclusiveMin(vec2);\n" + "vec3 subgroupExclusiveMin(vec3);\n" + "vec4 subgroupExclusiveMin(vec4);\n" + "int subgroupExclusiveMin(int);\n" + "ivec2 subgroupExclusiveMin(ivec2);\n" + "ivec3 subgroupExclusiveMin(ivec3);\n" + "ivec4 subgroupExclusiveMin(ivec4);\n" + "uint subgroupExclusiveMin(uint);\n" + "uvec2 subgroupExclusiveMin(uvec2);\n" + "uvec3 subgroupExclusiveMin(uvec3);\n" + "uvec4 subgroupExclusiveMin(uvec4);\n" + + "float subgroupExclusiveMax(float);\n" + "vec2 subgroupExclusiveMax(vec2);\n" + "vec3 subgroupExclusiveMax(vec3);\n" + "vec4 subgroupExclusiveMax(vec4);\n" + "int subgroupExclusiveMax(int);\n" + "ivec2 subgroupExclusiveMax(ivec2);\n" + "ivec3 subgroupExclusiveMax(ivec3);\n" + "ivec4 subgroupExclusiveMax(ivec4);\n" + "uint subgroupExclusiveMax(uint);\n" + "uvec2 subgroupExclusiveMax(uvec2);\n" + "uvec3 subgroupExclusiveMax(uvec3);\n" + "uvec4 subgroupExclusiveMax(uvec4);\n" + + "int subgroupExclusiveAnd(int);\n" + "ivec2 subgroupExclusiveAnd(ivec2);\n" + "ivec3 subgroupExclusiveAnd(ivec3);\n" + "ivec4 subgroupExclusiveAnd(ivec4);\n" + "uint subgroupExclusiveAnd(uint);\n" + "uvec2 subgroupExclusiveAnd(uvec2);\n" + "uvec3 subgroupExclusiveAnd(uvec3);\n" + "uvec4 subgroupExclusiveAnd(uvec4);\n" + "bool subgroupExclusiveAnd(bool);\n" + "bvec2 subgroupExclusiveAnd(bvec2);\n" + "bvec3 subgroupExclusiveAnd(bvec3);\n" + "bvec4 subgroupExclusiveAnd(bvec4);\n" + + "int subgroupExclusiveOr(int);\n" + "ivec2 subgroupExclusiveOr(ivec2);\n" + "ivec3 subgroupExclusiveOr(ivec3);\n" + "ivec4 subgroupExclusiveOr(ivec4);\n" + "uint subgroupExclusiveOr(uint);\n" + "uvec2 subgroupExclusiveOr(uvec2);\n" + "uvec3 subgroupExclusiveOr(uvec3);\n" + "uvec4 subgroupExclusiveOr(uvec4);\n" + "bool subgroupExclusiveOr(bool);\n" + "bvec2 subgroupExclusiveOr(bvec2);\n" + "bvec3 subgroupExclusiveOr(bvec3);\n" + "bvec4 subgroupExclusiveOr(bvec4);\n" + + "int subgroupExclusiveXor(int);\n" + "ivec2 subgroupExclusiveXor(ivec2);\n" + "ivec3 subgroupExclusiveXor(ivec3);\n" + "ivec4 subgroupExclusiveXor(ivec4);\n" + "uint subgroupExclusiveXor(uint);\n" + "uvec2 subgroupExclusiveXor(uvec2);\n" + "uvec3 subgroupExclusiveXor(uvec3);\n" + "uvec4 subgroupExclusiveXor(uvec4);\n" + "bool subgroupExclusiveXor(bool);\n" + "bvec2 subgroupExclusiveXor(bvec2);\n" + "bvec3 subgroupExclusiveXor(bvec3);\n" + "bvec4 subgroupExclusiveXor(bvec4);\n" + + "float subgroupClusteredAdd(float, uint);\n" + "vec2 subgroupClusteredAdd(vec2, uint);\n" + "vec3 subgroupClusteredAdd(vec3, uint);\n" + "vec4 subgroupClusteredAdd(vec4, uint);\n" + "int subgroupClusteredAdd(int, uint);\n" + "ivec2 subgroupClusteredAdd(ivec2, uint);\n" + "ivec3 subgroupClusteredAdd(ivec3, uint);\n" + "ivec4 subgroupClusteredAdd(ivec4, uint);\n" + "uint subgroupClusteredAdd(uint, uint);\n" + "uvec2 subgroupClusteredAdd(uvec2, uint);\n" + "uvec3 subgroupClusteredAdd(uvec3, uint);\n" + "uvec4 subgroupClusteredAdd(uvec4, uint);\n" + + "float subgroupClusteredMul(float, uint);\n" + "vec2 subgroupClusteredMul(vec2, uint);\n" + "vec3 subgroupClusteredMul(vec3, uint);\n" + "vec4 subgroupClusteredMul(vec4, uint);\n" + "int subgroupClusteredMul(int, uint);\n" + "ivec2 subgroupClusteredMul(ivec2, uint);\n" + "ivec3 subgroupClusteredMul(ivec3, uint);\n" + "ivec4 subgroupClusteredMul(ivec4, uint);\n" + "uint subgroupClusteredMul(uint, uint);\n" + "uvec2 subgroupClusteredMul(uvec2, uint);\n" + "uvec3 subgroupClusteredMul(uvec3, uint);\n" + "uvec4 subgroupClusteredMul(uvec4, uint);\n" + + "float subgroupClusteredMin(float, uint);\n" + "vec2 subgroupClusteredMin(vec2, uint);\n" + "vec3 subgroupClusteredMin(vec3, uint);\n" + "vec4 subgroupClusteredMin(vec4, uint);\n" + "int subgroupClusteredMin(int, uint);\n" + "ivec2 subgroupClusteredMin(ivec2, uint);\n" + "ivec3 subgroupClusteredMin(ivec3, uint);\n" + "ivec4 subgroupClusteredMin(ivec4, uint);\n" + "uint subgroupClusteredMin(uint, uint);\n" + "uvec2 subgroupClusteredMin(uvec2, uint);\n" + "uvec3 subgroupClusteredMin(uvec3, uint);\n" + "uvec4 subgroupClusteredMin(uvec4, uint);\n" + + "float subgroupClusteredMax(float, uint);\n" + "vec2 subgroupClusteredMax(vec2, uint);\n" + "vec3 subgroupClusteredMax(vec3, uint);\n" + "vec4 subgroupClusteredMax(vec4, uint);\n" + "int subgroupClusteredMax(int, uint);\n" + "ivec2 subgroupClusteredMax(ivec2, uint);\n" + "ivec3 subgroupClusteredMax(ivec3, uint);\n" + "ivec4 subgroupClusteredMax(ivec4, uint);\n" + "uint subgroupClusteredMax(uint, uint);\n" + "uvec2 subgroupClusteredMax(uvec2, uint);\n" + "uvec3 subgroupClusteredMax(uvec3, uint);\n" + "uvec4 subgroupClusteredMax(uvec4, uint);\n" + + "int subgroupClusteredAnd(int, uint);\n" + "ivec2 subgroupClusteredAnd(ivec2, uint);\n" + "ivec3 subgroupClusteredAnd(ivec3, uint);\n" + "ivec4 subgroupClusteredAnd(ivec4, uint);\n" + "uint subgroupClusteredAnd(uint, uint);\n" + "uvec2 subgroupClusteredAnd(uvec2, uint);\n" + "uvec3 subgroupClusteredAnd(uvec3, uint);\n" + "uvec4 subgroupClusteredAnd(uvec4, uint);\n" + "bool subgroupClusteredAnd(bool, uint);\n" + "bvec2 subgroupClusteredAnd(bvec2, uint);\n" + "bvec3 subgroupClusteredAnd(bvec3, uint);\n" + "bvec4 subgroupClusteredAnd(bvec4, uint);\n" + + "int subgroupClusteredOr(int, uint);\n" + "ivec2 subgroupClusteredOr(ivec2, uint);\n" + "ivec3 subgroupClusteredOr(ivec3, uint);\n" + "ivec4 subgroupClusteredOr(ivec4, uint);\n" + "uint subgroupClusteredOr(uint, uint);\n" + "uvec2 subgroupClusteredOr(uvec2, uint);\n" + "uvec3 subgroupClusteredOr(uvec3, uint);\n" + "uvec4 subgroupClusteredOr(uvec4, uint);\n" + "bool subgroupClusteredOr(bool, uint);\n" + "bvec2 subgroupClusteredOr(bvec2, uint);\n" + "bvec3 subgroupClusteredOr(bvec3, uint);\n" + "bvec4 subgroupClusteredOr(bvec4, uint);\n" + + "int subgroupClusteredXor(int, uint);\n" + "ivec2 subgroupClusteredXor(ivec2, uint);\n" + "ivec3 subgroupClusteredXor(ivec3, uint);\n" + "ivec4 subgroupClusteredXor(ivec4, uint);\n" + "uint subgroupClusteredXor(uint, uint);\n" + "uvec2 subgroupClusteredXor(uvec2, uint);\n" + "uvec3 subgroupClusteredXor(uvec3, uint);\n" + "uvec4 subgroupClusteredXor(uvec4, uint);\n" + "bool subgroupClusteredXor(bool, uint);\n" + "bvec2 subgroupClusteredXor(bvec2, uint);\n" + "bvec3 subgroupClusteredXor(bvec3, uint);\n" + "bvec4 subgroupClusteredXor(bvec4, uint);\n" + + "float subgroupQuadBroadcast(float, uint);\n" + "vec2 subgroupQuadBroadcast(vec2, uint);\n" + "vec3 subgroupQuadBroadcast(vec3, uint);\n" + "vec4 subgroupQuadBroadcast(vec4, uint);\n" + "int subgroupQuadBroadcast(int, uint);\n" + "ivec2 subgroupQuadBroadcast(ivec2, uint);\n" + "ivec3 subgroupQuadBroadcast(ivec3, uint);\n" + "ivec4 subgroupQuadBroadcast(ivec4, uint);\n" + "uint subgroupQuadBroadcast(uint, uint);\n" + "uvec2 subgroupQuadBroadcast(uvec2, uint);\n" + "uvec3 subgroupQuadBroadcast(uvec3, uint);\n" + "uvec4 subgroupQuadBroadcast(uvec4, uint);\n" + "bool subgroupQuadBroadcast(bool, uint);\n" + "bvec2 subgroupQuadBroadcast(bvec2, uint);\n" + "bvec3 subgroupQuadBroadcast(bvec3, uint);\n" + "bvec4 subgroupQuadBroadcast(bvec4, uint);\n" + + "float subgroupQuadSwapHorizontal(float);\n" + "vec2 subgroupQuadSwapHorizontal(vec2);\n" + "vec3 subgroupQuadSwapHorizontal(vec3);\n" + "vec4 subgroupQuadSwapHorizontal(vec4);\n" + "int subgroupQuadSwapHorizontal(int);\n" + "ivec2 subgroupQuadSwapHorizontal(ivec2);\n" + "ivec3 subgroupQuadSwapHorizontal(ivec3);\n" + "ivec4 subgroupQuadSwapHorizontal(ivec4);\n" + "uint subgroupQuadSwapHorizontal(uint);\n" + "uvec2 subgroupQuadSwapHorizontal(uvec2);\n" + "uvec3 subgroupQuadSwapHorizontal(uvec3);\n" + "uvec4 subgroupQuadSwapHorizontal(uvec4);\n" + "bool subgroupQuadSwapHorizontal(bool);\n" + "bvec2 subgroupQuadSwapHorizontal(bvec2);\n" + "bvec3 subgroupQuadSwapHorizontal(bvec3);\n" + "bvec4 subgroupQuadSwapHorizontal(bvec4);\n" + + "float subgroupQuadSwapVertical(float);\n" + "vec2 subgroupQuadSwapVertical(vec2);\n" + "vec3 subgroupQuadSwapVertical(vec3);\n" + "vec4 subgroupQuadSwapVertical(vec4);\n" + "int subgroupQuadSwapVertical(int);\n" + "ivec2 subgroupQuadSwapVertical(ivec2);\n" + "ivec3 subgroupQuadSwapVertical(ivec3);\n" + "ivec4 subgroupQuadSwapVertical(ivec4);\n" + "uint subgroupQuadSwapVertical(uint);\n" + "uvec2 subgroupQuadSwapVertical(uvec2);\n" + "uvec3 subgroupQuadSwapVertical(uvec3);\n" + "uvec4 subgroupQuadSwapVertical(uvec4);\n" + "bool subgroupQuadSwapVertical(bool);\n" + "bvec2 subgroupQuadSwapVertical(bvec2);\n" + "bvec3 subgroupQuadSwapVertical(bvec3);\n" + "bvec4 subgroupQuadSwapVertical(bvec4);\n" + + "float subgroupQuadSwapDiagonal(float);\n" + "vec2 subgroupQuadSwapDiagonal(vec2);\n" + "vec3 subgroupQuadSwapDiagonal(vec3);\n" + "vec4 subgroupQuadSwapDiagonal(vec4);\n" + "int subgroupQuadSwapDiagonal(int);\n" + "ivec2 subgroupQuadSwapDiagonal(ivec2);\n" + "ivec3 subgroupQuadSwapDiagonal(ivec3);\n" + "ivec4 subgroupQuadSwapDiagonal(ivec4);\n" + "uint subgroupQuadSwapDiagonal(uint);\n" + "uvec2 subgroupQuadSwapDiagonal(uvec2);\n" + "uvec3 subgroupQuadSwapDiagonal(uvec3);\n" + "uvec4 subgroupQuadSwapDiagonal(uvec4);\n" + "bool subgroupQuadSwapDiagonal(bool);\n" + "bvec2 subgroupQuadSwapDiagonal(bvec2);\n" + "bvec3 subgroupQuadSwapDiagonal(bvec3);\n" + "bvec4 subgroupQuadSwapDiagonal(bvec4);\n" + +#ifdef NV_EXTENSIONS + "uvec4 subgroupPartitionNV(float);\n" + "uvec4 subgroupPartitionNV(vec2);\n" + "uvec4 subgroupPartitionNV(vec3);\n" + "uvec4 subgroupPartitionNV(vec4);\n" + "uvec4 subgroupPartitionNV(int);\n" + "uvec4 subgroupPartitionNV(ivec2);\n" + "uvec4 subgroupPartitionNV(ivec3);\n" + "uvec4 subgroupPartitionNV(ivec4);\n" + "uvec4 subgroupPartitionNV(uint);\n" + "uvec4 subgroupPartitionNV(uvec2);\n" + "uvec4 subgroupPartitionNV(uvec3);\n" + "uvec4 subgroupPartitionNV(uvec4);\n" + "uvec4 subgroupPartitionNV(bool);\n" + "uvec4 subgroupPartitionNV(bvec2);\n" + "uvec4 subgroupPartitionNV(bvec3);\n" + "uvec4 subgroupPartitionNV(bvec4);\n" + + "float subgroupPartitionedAddNV(float, uvec4 ballot);\n" + "vec2 subgroupPartitionedAddNV(vec2, uvec4 ballot);\n" + "vec3 subgroupPartitionedAddNV(vec3, uvec4 ballot);\n" + "vec4 subgroupPartitionedAddNV(vec4, uvec4 ballot);\n" + "int subgroupPartitionedAddNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedAddNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedAddNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedAddNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedAddNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedAddNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedAddNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedAddNV(uvec4, uvec4 ballot);\n" + + "float subgroupPartitionedMulNV(float, uvec4 ballot);\n" + "vec2 subgroupPartitionedMulNV(vec2, uvec4 ballot);\n" + "vec3 subgroupPartitionedMulNV(vec3, uvec4 ballot);\n" + "vec4 subgroupPartitionedMulNV(vec4, uvec4 ballot);\n" + "int subgroupPartitionedMulNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedMulNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedMulNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedMulNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedMulNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedMulNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedMulNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedMulNV(uvec4, uvec4 ballot);\n" + + "float subgroupPartitionedMinNV(float, uvec4 ballot);\n" + "vec2 subgroupPartitionedMinNV(vec2, uvec4 ballot);\n" + "vec3 subgroupPartitionedMinNV(vec3, uvec4 ballot);\n" + "vec4 subgroupPartitionedMinNV(vec4, uvec4 ballot);\n" + "int subgroupPartitionedMinNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedMinNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedMinNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedMinNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedMinNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedMinNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedMinNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedMinNV(uvec4, uvec4 ballot);\n" + + "float subgroupPartitionedMaxNV(float, uvec4 ballot);\n" + "vec2 subgroupPartitionedMaxNV(vec2, uvec4 ballot);\n" + "vec3 subgroupPartitionedMaxNV(vec3, uvec4 ballot);\n" + "vec4 subgroupPartitionedMaxNV(vec4, uvec4 ballot);\n" + "int subgroupPartitionedMaxNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedMaxNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedMaxNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedMaxNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedMaxNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedMaxNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedMaxNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedMaxNV(uvec4, uvec4 ballot);\n" + + "int subgroupPartitionedAndNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedAndNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedAndNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedAndNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedAndNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedAndNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedAndNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedAndNV(uvec4, uvec4 ballot);\n" + "bool subgroupPartitionedAndNV(bool, uvec4 ballot);\n" + "bvec2 subgroupPartitionedAndNV(bvec2, uvec4 ballot);\n" + "bvec3 subgroupPartitionedAndNV(bvec3, uvec4 ballot);\n" + "bvec4 subgroupPartitionedAndNV(bvec4, uvec4 ballot);\n" + + "int subgroupPartitionedOrNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedOrNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedOrNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedOrNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedOrNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedOrNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedOrNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedOrNV(uvec4, uvec4 ballot);\n" + "bool subgroupPartitionedOrNV(bool, uvec4 ballot);\n" + "bvec2 subgroupPartitionedOrNV(bvec2, uvec4 ballot);\n" + "bvec3 subgroupPartitionedOrNV(bvec3, uvec4 ballot);\n" + "bvec4 subgroupPartitionedOrNV(bvec4, uvec4 ballot);\n" + + "int subgroupPartitionedXorNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedXorNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedXorNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedXorNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedXorNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedXorNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedXorNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedXorNV(uvec4, uvec4 ballot);\n" + "bool subgroupPartitionedXorNV(bool, uvec4 ballot);\n" + "bvec2 subgroupPartitionedXorNV(bvec2, uvec4 ballot);\n" + "bvec3 subgroupPartitionedXorNV(bvec3, uvec4 ballot);\n" + "bvec4 subgroupPartitionedXorNV(bvec4, uvec4 ballot);\n" + + "float subgroupPartitionedInclusiveAddNV(float, uvec4 ballot);\n" + "vec2 subgroupPartitionedInclusiveAddNV(vec2, uvec4 ballot);\n" + "vec3 subgroupPartitionedInclusiveAddNV(vec3, uvec4 ballot);\n" + "vec4 subgroupPartitionedInclusiveAddNV(vec4, uvec4 ballot);\n" + "int subgroupPartitionedInclusiveAddNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedInclusiveAddNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedInclusiveAddNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedInclusiveAddNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedInclusiveAddNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedInclusiveAddNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedInclusiveAddNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedInclusiveAddNV(uvec4, uvec4 ballot);\n" + + "float subgroupPartitionedInclusiveMulNV(float, uvec4 ballot);\n" + "vec2 subgroupPartitionedInclusiveMulNV(vec2, uvec4 ballot);\n" + "vec3 subgroupPartitionedInclusiveMulNV(vec3, uvec4 ballot);\n" + "vec4 subgroupPartitionedInclusiveMulNV(vec4, uvec4 ballot);\n" + "int subgroupPartitionedInclusiveMulNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedInclusiveMulNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedInclusiveMulNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedInclusiveMulNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedInclusiveMulNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedInclusiveMulNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedInclusiveMulNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedInclusiveMulNV(uvec4, uvec4 ballot);\n" + + "float subgroupPartitionedInclusiveMinNV(float, uvec4 ballot);\n" + "vec2 subgroupPartitionedInclusiveMinNV(vec2, uvec4 ballot);\n" + "vec3 subgroupPartitionedInclusiveMinNV(vec3, uvec4 ballot);\n" + "vec4 subgroupPartitionedInclusiveMinNV(vec4, uvec4 ballot);\n" + "int subgroupPartitionedInclusiveMinNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedInclusiveMinNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedInclusiveMinNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedInclusiveMinNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedInclusiveMinNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedInclusiveMinNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedInclusiveMinNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedInclusiveMinNV(uvec4, uvec4 ballot);\n" + + "float subgroupPartitionedInclusiveMaxNV(float, uvec4 ballot);\n" + "vec2 subgroupPartitionedInclusiveMaxNV(vec2, uvec4 ballot);\n" + "vec3 subgroupPartitionedInclusiveMaxNV(vec3, uvec4 ballot);\n" + "vec4 subgroupPartitionedInclusiveMaxNV(vec4, uvec4 ballot);\n" + "int subgroupPartitionedInclusiveMaxNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedInclusiveMaxNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedInclusiveMaxNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedInclusiveMaxNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedInclusiveMaxNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedInclusiveMaxNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedInclusiveMaxNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedInclusiveMaxNV(uvec4, uvec4 ballot);\n" + + "int subgroupPartitionedInclusiveAndNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedInclusiveAndNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedInclusiveAndNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedInclusiveAndNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedInclusiveAndNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedInclusiveAndNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedInclusiveAndNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedInclusiveAndNV(uvec4, uvec4 ballot);\n" + "bool subgroupPartitionedInclusiveAndNV(bool, uvec4 ballot);\n" + "bvec2 subgroupPartitionedInclusiveAndNV(bvec2, uvec4 ballot);\n" + "bvec3 subgroupPartitionedInclusiveAndNV(bvec3, uvec4 ballot);\n" + "bvec4 subgroupPartitionedInclusiveAndNV(bvec4, uvec4 ballot);\n" + + "int subgroupPartitionedInclusiveOrNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedInclusiveOrNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedInclusiveOrNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedInclusiveOrNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedInclusiveOrNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedInclusiveOrNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedInclusiveOrNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedInclusiveOrNV(uvec4, uvec4 ballot);\n" + "bool subgroupPartitionedInclusiveOrNV(bool, uvec4 ballot);\n" + "bvec2 subgroupPartitionedInclusiveOrNV(bvec2, uvec4 ballot);\n" + "bvec3 subgroupPartitionedInclusiveOrNV(bvec3, uvec4 ballot);\n" + "bvec4 subgroupPartitionedInclusiveOrNV(bvec4, uvec4 ballot);\n" + + "int subgroupPartitionedInclusiveXorNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedInclusiveXorNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedInclusiveXorNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedInclusiveXorNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedInclusiveXorNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedInclusiveXorNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedInclusiveXorNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedInclusiveXorNV(uvec4, uvec4 ballot);\n" + "bool subgroupPartitionedInclusiveXorNV(bool, uvec4 ballot);\n" + "bvec2 subgroupPartitionedInclusiveXorNV(bvec2, uvec4 ballot);\n" + "bvec3 subgroupPartitionedInclusiveXorNV(bvec3, uvec4 ballot);\n" + "bvec4 subgroupPartitionedInclusiveXorNV(bvec4, uvec4 ballot);\n" + + "float subgroupPartitionedExclusiveAddNV(float, uvec4 ballot);\n" + "vec2 subgroupPartitionedExclusiveAddNV(vec2, uvec4 ballot);\n" + "vec3 subgroupPartitionedExclusiveAddNV(vec3, uvec4 ballot);\n" + "vec4 subgroupPartitionedExclusiveAddNV(vec4, uvec4 ballot);\n" + "int subgroupPartitionedExclusiveAddNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedExclusiveAddNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedExclusiveAddNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedExclusiveAddNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedExclusiveAddNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedExclusiveAddNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedExclusiveAddNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedExclusiveAddNV(uvec4, uvec4 ballot);\n" + + "float subgroupPartitionedExclusiveMulNV(float, uvec4 ballot);\n" + "vec2 subgroupPartitionedExclusiveMulNV(vec2, uvec4 ballot);\n" + "vec3 subgroupPartitionedExclusiveMulNV(vec3, uvec4 ballot);\n" + "vec4 subgroupPartitionedExclusiveMulNV(vec4, uvec4 ballot);\n" + "int subgroupPartitionedExclusiveMulNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedExclusiveMulNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedExclusiveMulNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedExclusiveMulNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedExclusiveMulNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedExclusiveMulNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedExclusiveMulNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedExclusiveMulNV(uvec4, uvec4 ballot);\n" + + "float subgroupPartitionedExclusiveMinNV(float, uvec4 ballot);\n" + "vec2 subgroupPartitionedExclusiveMinNV(vec2, uvec4 ballot);\n" + "vec3 subgroupPartitionedExclusiveMinNV(vec3, uvec4 ballot);\n" + "vec4 subgroupPartitionedExclusiveMinNV(vec4, uvec4 ballot);\n" + "int subgroupPartitionedExclusiveMinNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedExclusiveMinNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedExclusiveMinNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedExclusiveMinNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedExclusiveMinNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedExclusiveMinNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedExclusiveMinNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedExclusiveMinNV(uvec4, uvec4 ballot);\n" + + "float subgroupPartitionedExclusiveMaxNV(float, uvec4 ballot);\n" + "vec2 subgroupPartitionedExclusiveMaxNV(vec2, uvec4 ballot);\n" + "vec3 subgroupPartitionedExclusiveMaxNV(vec3, uvec4 ballot);\n" + "vec4 subgroupPartitionedExclusiveMaxNV(vec4, uvec4 ballot);\n" + "int subgroupPartitionedExclusiveMaxNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedExclusiveMaxNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedExclusiveMaxNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedExclusiveMaxNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedExclusiveMaxNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedExclusiveMaxNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedExclusiveMaxNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedExclusiveMaxNV(uvec4, uvec4 ballot);\n" + + "int subgroupPartitionedExclusiveAndNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedExclusiveAndNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedExclusiveAndNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedExclusiveAndNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedExclusiveAndNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedExclusiveAndNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedExclusiveAndNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedExclusiveAndNV(uvec4, uvec4 ballot);\n" + "bool subgroupPartitionedExclusiveAndNV(bool, uvec4 ballot);\n" + "bvec2 subgroupPartitionedExclusiveAndNV(bvec2, uvec4 ballot);\n" + "bvec3 subgroupPartitionedExclusiveAndNV(bvec3, uvec4 ballot);\n" + "bvec4 subgroupPartitionedExclusiveAndNV(bvec4, uvec4 ballot);\n" + + "int subgroupPartitionedExclusiveOrNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedExclusiveOrNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedExclusiveOrNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedExclusiveOrNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedExclusiveOrNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedExclusiveOrNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedExclusiveOrNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedExclusiveOrNV(uvec4, uvec4 ballot);\n" + "bool subgroupPartitionedExclusiveOrNV(bool, uvec4 ballot);\n" + "bvec2 subgroupPartitionedExclusiveOrNV(bvec2, uvec4 ballot);\n" + "bvec3 subgroupPartitionedExclusiveOrNV(bvec3, uvec4 ballot);\n" + "bvec4 subgroupPartitionedExclusiveOrNV(bvec4, uvec4 ballot);\n" + + "int subgroupPartitionedExclusiveXorNV(int, uvec4 ballot);\n" + "ivec2 subgroupPartitionedExclusiveXorNV(ivec2, uvec4 ballot);\n" + "ivec3 subgroupPartitionedExclusiveXorNV(ivec3, uvec4 ballot);\n" + "ivec4 subgroupPartitionedExclusiveXorNV(ivec4, uvec4 ballot);\n" + "uint subgroupPartitionedExclusiveXorNV(uint, uvec4 ballot);\n" + "uvec2 subgroupPartitionedExclusiveXorNV(uvec2, uvec4 ballot);\n" + "uvec3 subgroupPartitionedExclusiveXorNV(uvec3, uvec4 ballot);\n" + "uvec4 subgroupPartitionedExclusiveXorNV(uvec4, uvec4 ballot);\n" + "bool subgroupPartitionedExclusiveXorNV(bool, uvec4 ballot);\n" + "bvec2 subgroupPartitionedExclusiveXorNV(bvec2, uvec4 ballot);\n" + "bvec3 subgroupPartitionedExclusiveXorNV(bvec3, uvec4 ballot);\n" + "bvec4 subgroupPartitionedExclusiveXorNV(bvec4, uvec4 ballot);\n" +#endif + + "\n"); + + if (profile != EEsProfile && version >= 400) { + commonBuiltins.append( + "bool subgroupAllEqual(double);\n" + "bool subgroupAllEqual(dvec2);\n" + "bool subgroupAllEqual(dvec3);\n" + "bool subgroupAllEqual(dvec4);\n" + + "double subgroupBroadcast(double, uint);\n" + "dvec2 subgroupBroadcast(dvec2, uint);\n" + "dvec3 subgroupBroadcast(dvec3, uint);\n" + "dvec4 subgroupBroadcast(dvec4, uint);\n" + + "double subgroupBroadcastFirst(double);\n" + "dvec2 subgroupBroadcastFirst(dvec2);\n" + "dvec3 subgroupBroadcastFirst(dvec3);\n" + "dvec4 subgroupBroadcastFirst(dvec4);\n" + + "double subgroupShuffle(double, uint);\n" + "dvec2 subgroupShuffle(dvec2, uint);\n" + "dvec3 subgroupShuffle(dvec3, uint);\n" + "dvec4 subgroupShuffle(dvec4, uint);\n" + + "double subgroupShuffleXor(double, uint);\n" + "dvec2 subgroupShuffleXor(dvec2, uint);\n" + "dvec3 subgroupShuffleXor(dvec3, uint);\n" + "dvec4 subgroupShuffleXor(dvec4, uint);\n" + + "double subgroupShuffleUp(double, uint delta);\n" + "dvec2 subgroupShuffleUp(dvec2, uint delta);\n" + "dvec3 subgroupShuffleUp(dvec3, uint delta);\n" + "dvec4 subgroupShuffleUp(dvec4, uint delta);\n" + + "double subgroupShuffleDown(double, uint delta);\n" + "dvec2 subgroupShuffleDown(dvec2, uint delta);\n" + "dvec3 subgroupShuffleDown(dvec3, uint delta);\n" + "dvec4 subgroupShuffleDown(dvec4, uint delta);\n" + + "double subgroupAdd(double);\n" + "dvec2 subgroupAdd(dvec2);\n" + "dvec3 subgroupAdd(dvec3);\n" + "dvec4 subgroupAdd(dvec4);\n" + + "double subgroupMul(double);\n" + "dvec2 subgroupMul(dvec2);\n" + "dvec3 subgroupMul(dvec3);\n" + "dvec4 subgroupMul(dvec4);\n" + + "double subgroupMin(double);\n" + "dvec2 subgroupMin(dvec2);\n" + "dvec3 subgroupMin(dvec3);\n" + "dvec4 subgroupMin(dvec4);\n" + + "double subgroupMax(double);\n" + "dvec2 subgroupMax(dvec2);\n" + "dvec3 subgroupMax(dvec3);\n" + "dvec4 subgroupMax(dvec4);\n" + + "double subgroupInclusiveAdd(double);\n" + "dvec2 subgroupInclusiveAdd(dvec2);\n" + "dvec3 subgroupInclusiveAdd(dvec3);\n" + "dvec4 subgroupInclusiveAdd(dvec4);\n" + + "double subgroupInclusiveMul(double);\n" + "dvec2 subgroupInclusiveMul(dvec2);\n" + "dvec3 subgroupInclusiveMul(dvec3);\n" + "dvec4 subgroupInclusiveMul(dvec4);\n" + + "double subgroupInclusiveMin(double);\n" + "dvec2 subgroupInclusiveMin(dvec2);\n" + "dvec3 subgroupInclusiveMin(dvec3);\n" + "dvec4 subgroupInclusiveMin(dvec4);\n" + + "double subgroupInclusiveMax(double);\n" + "dvec2 subgroupInclusiveMax(dvec2);\n" + "dvec3 subgroupInclusiveMax(dvec3);\n" + "dvec4 subgroupInclusiveMax(dvec4);\n" + + "double subgroupExclusiveAdd(double);\n" + "dvec2 subgroupExclusiveAdd(dvec2);\n" + "dvec3 subgroupExclusiveAdd(dvec3);\n" + "dvec4 subgroupExclusiveAdd(dvec4);\n" + + "double subgroupExclusiveMul(double);\n" + "dvec2 subgroupExclusiveMul(dvec2);\n" + "dvec3 subgroupExclusiveMul(dvec3);\n" + "dvec4 subgroupExclusiveMul(dvec4);\n" + + "double subgroupExclusiveMin(double);\n" + "dvec2 subgroupExclusiveMin(dvec2);\n" + "dvec3 subgroupExclusiveMin(dvec3);\n" + "dvec4 subgroupExclusiveMin(dvec4);\n" + + "double subgroupExclusiveMax(double);\n" + "dvec2 subgroupExclusiveMax(dvec2);\n" + "dvec3 subgroupExclusiveMax(dvec3);\n" + "dvec4 subgroupExclusiveMax(dvec4);\n" + + "double subgroupClusteredAdd(double, uint);\n" + "dvec2 subgroupClusteredAdd(dvec2, uint);\n" + "dvec3 subgroupClusteredAdd(dvec3, uint);\n" + "dvec4 subgroupClusteredAdd(dvec4, uint);\n" + + "double subgroupClusteredMul(double, uint);\n" + "dvec2 subgroupClusteredMul(dvec2, uint);\n" + "dvec3 subgroupClusteredMul(dvec3, uint);\n" + "dvec4 subgroupClusteredMul(dvec4, uint);\n" + + "double subgroupClusteredMin(double, uint);\n" + "dvec2 subgroupClusteredMin(dvec2, uint);\n" + "dvec3 subgroupClusteredMin(dvec3, uint);\n" + "dvec4 subgroupClusteredMin(dvec4, uint);\n" + + "double subgroupClusteredMax(double, uint);\n" + "dvec2 subgroupClusteredMax(dvec2, uint);\n" + "dvec3 subgroupClusteredMax(dvec3, uint);\n" + "dvec4 subgroupClusteredMax(dvec4, uint);\n" + + "double subgroupQuadBroadcast(double, uint);\n" + "dvec2 subgroupQuadBroadcast(dvec2, uint);\n" + "dvec3 subgroupQuadBroadcast(dvec3, uint);\n" + "dvec4 subgroupQuadBroadcast(dvec4, uint);\n" + + "double subgroupQuadSwapHorizontal(double);\n" + "dvec2 subgroupQuadSwapHorizontal(dvec2);\n" + "dvec3 subgroupQuadSwapHorizontal(dvec3);\n" + "dvec4 subgroupQuadSwapHorizontal(dvec4);\n" + + "double subgroupQuadSwapVertical(double);\n" + "dvec2 subgroupQuadSwapVertical(dvec2);\n" + "dvec3 subgroupQuadSwapVertical(dvec3);\n" + "dvec4 subgroupQuadSwapVertical(dvec4);\n" + + "double subgroupQuadSwapDiagonal(double);\n" + "dvec2 subgroupQuadSwapDiagonal(dvec2);\n" + "dvec3 subgroupQuadSwapDiagonal(dvec3);\n" + "dvec4 subgroupQuadSwapDiagonal(dvec4);\n" + + +#ifdef NV_EXTENSIONS + "uvec4 subgroupPartitionNV(double);\n" + "uvec4 subgroupPartitionNV(dvec2);\n" + "uvec4 subgroupPartitionNV(dvec3);\n" + "uvec4 subgroupPartitionNV(dvec4);\n" + + "double subgroupPartitionedAddNV(double, uvec4 ballot);\n" + "dvec2 subgroupPartitionedAddNV(dvec2, uvec4 ballot);\n" + "dvec3 subgroupPartitionedAddNV(dvec3, uvec4 ballot);\n" + "dvec4 subgroupPartitionedAddNV(dvec4, uvec4 ballot);\n" + + "double subgroupPartitionedMulNV(double, uvec4 ballot);\n" + "dvec2 subgroupPartitionedMulNV(dvec2, uvec4 ballot);\n" + "dvec3 subgroupPartitionedMulNV(dvec3, uvec4 ballot);\n" + "dvec4 subgroupPartitionedMulNV(dvec4, uvec4 ballot);\n" + + "double subgroupPartitionedMinNV(double, uvec4 ballot);\n" + "dvec2 subgroupPartitionedMinNV(dvec2, uvec4 ballot);\n" + "dvec3 subgroupPartitionedMinNV(dvec3, uvec4 ballot);\n" + "dvec4 subgroupPartitionedMinNV(dvec4, uvec4 ballot);\n" + + "double subgroupPartitionedMaxNV(double, uvec4 ballot);\n" + "dvec2 subgroupPartitionedMaxNV(dvec2, uvec4 ballot);\n" + "dvec3 subgroupPartitionedMaxNV(dvec3, uvec4 ballot);\n" + "dvec4 subgroupPartitionedMaxNV(dvec4, uvec4 ballot);\n" + + "double subgroupPartitionedInclusiveAddNV(double, uvec4 ballot);\n" + "dvec2 subgroupPartitionedInclusiveAddNV(dvec2, uvec4 ballot);\n" + "dvec3 subgroupPartitionedInclusiveAddNV(dvec3, uvec4 ballot);\n" + "dvec4 subgroupPartitionedInclusiveAddNV(dvec4, uvec4 ballot);\n" + + "double subgroupPartitionedInclusiveMulNV(double, uvec4 ballot);\n" + "dvec2 subgroupPartitionedInclusiveMulNV(dvec2, uvec4 ballot);\n" + "dvec3 subgroupPartitionedInclusiveMulNV(dvec3, uvec4 ballot);\n" + "dvec4 subgroupPartitionedInclusiveMulNV(dvec4, uvec4 ballot);\n" + + "double subgroupPartitionedInclusiveMinNV(double, uvec4 ballot);\n" + "dvec2 subgroupPartitionedInclusiveMinNV(dvec2, uvec4 ballot);\n" + "dvec3 subgroupPartitionedInclusiveMinNV(dvec3, uvec4 ballot);\n" + "dvec4 subgroupPartitionedInclusiveMinNV(dvec4, uvec4 ballot);\n" + + "double subgroupPartitionedInclusiveMaxNV(double, uvec4 ballot);\n" + "dvec2 subgroupPartitionedInclusiveMaxNV(dvec2, uvec4 ballot);\n" + "dvec3 subgroupPartitionedInclusiveMaxNV(dvec3, uvec4 ballot);\n" + "dvec4 subgroupPartitionedInclusiveMaxNV(dvec4, uvec4 ballot);\n" + + "double subgroupPartitionedExclusiveAddNV(double, uvec4 ballot);\n" + "dvec2 subgroupPartitionedExclusiveAddNV(dvec2, uvec4 ballot);\n" + "dvec3 subgroupPartitionedExclusiveAddNV(dvec3, uvec4 ballot);\n" + "dvec4 subgroupPartitionedExclusiveAddNV(dvec4, uvec4 ballot);\n" + + "double subgroupPartitionedExclusiveMulNV(double, uvec4 ballot);\n" + "dvec2 subgroupPartitionedExclusiveMulNV(dvec2, uvec4 ballot);\n" + "dvec3 subgroupPartitionedExclusiveMulNV(dvec3, uvec4 ballot);\n" + "dvec4 subgroupPartitionedExclusiveMulNV(dvec4, uvec4 ballot);\n" + + "double subgroupPartitionedExclusiveMinNV(double, uvec4 ballot);\n" + "dvec2 subgroupPartitionedExclusiveMinNV(dvec2, uvec4 ballot);\n" + "dvec3 subgroupPartitionedExclusiveMinNV(dvec3, uvec4 ballot);\n" + "dvec4 subgroupPartitionedExclusiveMinNV(dvec4, uvec4 ballot);\n" + + "double subgroupPartitionedExclusiveMaxNV(double, uvec4 ballot);\n" + "dvec2 subgroupPartitionedExclusiveMaxNV(dvec2, uvec4 ballot);\n" + "dvec3 subgroupPartitionedExclusiveMaxNV(dvec3, uvec4 ballot);\n" + "dvec4 subgroupPartitionedExclusiveMaxNV(dvec4, uvec4 ballot);\n" +#endif + + "\n"); + } + + stageBuiltins[EShLangCompute].append( + "void subgroupMemoryBarrierShared();" + + "\n" + ); + } + if (profile != EEsProfile && version >= 460) { commonBuiltins.append( "bool anyInvocation(bool);" @@ -1675,6 +2793,16 @@ "f16vec3 minInvocationsAMD(f16vec3);" "f16vec4 minInvocationsAMD(f16vec4);" + "int16_t minInvocationsAMD(int16_t);" + "i16vec2 minInvocationsAMD(i16vec2);" + "i16vec3 minInvocationsAMD(i16vec3);" + "i16vec4 minInvocationsAMD(i16vec4);" + + "uint16_t minInvocationsAMD(uint16_t);" + "u16vec2 minInvocationsAMD(u16vec2);" + "u16vec3 minInvocationsAMD(u16vec3);" + "u16vec4 minInvocationsAMD(u16vec4);" + "float minInvocationsInclusiveScanAMD(float);" "vec2 minInvocationsInclusiveScanAMD(vec2);" "vec3 minInvocationsInclusiveScanAMD(vec3);" @@ -1710,6 +2838,16 @@ "f16vec3 minInvocationsInclusiveScanAMD(f16vec3);" "f16vec4 minInvocationsInclusiveScanAMD(f16vec4);" + "int16_t minInvocationsInclusiveScanAMD(int16_t);" + "i16vec2 minInvocationsInclusiveScanAMD(i16vec2);" + "i16vec3 minInvocationsInclusiveScanAMD(i16vec3);" + "i16vec4 minInvocationsInclusiveScanAMD(i16vec4);" + + "uint16_t minInvocationsInclusiveScanAMD(uint16_t);" + "u16vec2 minInvocationsInclusiveScanAMD(u16vec2);" + "u16vec3 minInvocationsInclusiveScanAMD(u16vec3);" + "u16vec4 minInvocationsInclusiveScanAMD(u16vec4);" + "float minInvocationsExclusiveScanAMD(float);" "vec2 minInvocationsExclusiveScanAMD(vec2);" "vec3 minInvocationsExclusiveScanAMD(vec3);" @@ -1745,6 +2883,16 @@ "f16vec3 minInvocationsExclusiveScanAMD(f16vec3);" "f16vec4 minInvocationsExclusiveScanAMD(f16vec4);" + "int16_t minInvocationsExclusiveScanAMD(int16_t);" + "i16vec2 minInvocationsExclusiveScanAMD(i16vec2);" + "i16vec3 minInvocationsExclusiveScanAMD(i16vec3);" + "i16vec4 minInvocationsExclusiveScanAMD(i16vec4);" + + "uint16_t minInvocationsExclusiveScanAMD(uint16_t);" + "u16vec2 minInvocationsExclusiveScanAMD(u16vec2);" + "u16vec3 minInvocationsExclusiveScanAMD(u16vec3);" + "u16vec4 minInvocationsExclusiveScanAMD(u16vec4);" + "float maxInvocationsAMD(float);" "vec2 maxInvocationsAMD(vec2);" "vec3 maxInvocationsAMD(vec3);" @@ -1780,6 +2928,16 @@ "f16vec3 maxInvocationsAMD(f16vec3);" "f16vec4 maxInvocationsAMD(f16vec4);" + "int16_t maxInvocationsAMD(int16_t);" + "i16vec2 maxInvocationsAMD(i16vec2);" + "i16vec3 maxInvocationsAMD(i16vec3);" + "i16vec4 maxInvocationsAMD(i16vec4);" + + "uint16_t maxInvocationsAMD(uint16_t);" + "u16vec2 maxInvocationsAMD(u16vec2);" + "u16vec3 maxInvocationsAMD(u16vec3);" + "u16vec4 maxInvocationsAMD(u16vec4);" + "float maxInvocationsInclusiveScanAMD(float);" "vec2 maxInvocationsInclusiveScanAMD(vec2);" "vec3 maxInvocationsInclusiveScanAMD(vec3);" @@ -1815,6 +2973,16 @@ "f16vec3 maxInvocationsInclusiveScanAMD(f16vec3);" "f16vec4 maxInvocationsInclusiveScanAMD(f16vec4);" + "int16_t maxInvocationsInclusiveScanAMD(int16_t);" + "i16vec2 maxInvocationsInclusiveScanAMD(i16vec2);" + "i16vec3 maxInvocationsInclusiveScanAMD(i16vec3);" + "i16vec4 maxInvocationsInclusiveScanAMD(i16vec4);" + + "uint16_t maxInvocationsInclusiveScanAMD(uint16_t);" + "u16vec2 maxInvocationsInclusiveScanAMD(u16vec2);" + "u16vec3 maxInvocationsInclusiveScanAMD(u16vec3);" + "u16vec4 maxInvocationsInclusiveScanAMD(u16vec4);" + "float maxInvocationsExclusiveScanAMD(float);" "vec2 maxInvocationsExclusiveScanAMD(vec2);" "vec3 maxInvocationsExclusiveScanAMD(vec3);" @@ -1850,6 +3018,16 @@ "f16vec3 maxInvocationsExclusiveScanAMD(f16vec3);" "f16vec4 maxInvocationsExclusiveScanAMD(f16vec4);" + "int16_t maxInvocationsExclusiveScanAMD(int16_t);" + "i16vec2 maxInvocationsExclusiveScanAMD(i16vec2);" + "i16vec3 maxInvocationsExclusiveScanAMD(i16vec3);" + "i16vec4 maxInvocationsExclusiveScanAMD(i16vec4);" + + "uint16_t maxInvocationsExclusiveScanAMD(uint16_t);" + "u16vec2 maxInvocationsExclusiveScanAMD(u16vec2);" + "u16vec3 maxInvocationsExclusiveScanAMD(u16vec3);" + "u16vec4 maxInvocationsExclusiveScanAMD(u16vec4);" + "float addInvocationsAMD(float);" "vec2 addInvocationsAMD(vec2);" "vec3 addInvocationsAMD(vec3);" @@ -1885,6 +3063,16 @@ "f16vec3 addInvocationsAMD(f16vec3);" "f16vec4 addInvocationsAMD(f16vec4);" + "int16_t addInvocationsAMD(int16_t);" + "i16vec2 addInvocationsAMD(i16vec2);" + "i16vec3 addInvocationsAMD(i16vec3);" + "i16vec4 addInvocationsAMD(i16vec4);" + + "uint16_t addInvocationsAMD(uint16_t);" + "u16vec2 addInvocationsAMD(u16vec2);" + "u16vec3 addInvocationsAMD(u16vec3);" + "u16vec4 addInvocationsAMD(u16vec4);" + "float addInvocationsInclusiveScanAMD(float);" "vec2 addInvocationsInclusiveScanAMD(vec2);" "vec3 addInvocationsInclusiveScanAMD(vec3);" @@ -1920,6 +3108,16 @@ "f16vec3 addInvocationsInclusiveScanAMD(f16vec3);" "f16vec4 addInvocationsInclusiveScanAMD(f16vec4);" + "int16_t addInvocationsInclusiveScanAMD(int16_t);" + "i16vec2 addInvocationsInclusiveScanAMD(i16vec2);" + "i16vec3 addInvocationsInclusiveScanAMD(i16vec3);" + "i16vec4 addInvocationsInclusiveScanAMD(i16vec4);" + + "uint16_t addInvocationsInclusiveScanAMD(uint16_t);" + "u16vec2 addInvocationsInclusiveScanAMD(u16vec2);" + "u16vec3 addInvocationsInclusiveScanAMD(u16vec3);" + "u16vec4 addInvocationsInclusiveScanAMD(u16vec4);" + "float addInvocationsExclusiveScanAMD(float);" "vec2 addInvocationsExclusiveScanAMD(vec2);" "vec3 addInvocationsExclusiveScanAMD(vec3);" @@ -1955,6 +3153,16 @@ "f16vec3 addInvocationsExclusiveScanAMD(f16vec3);" "f16vec4 addInvocationsExclusiveScanAMD(f16vec4);" + "int16_t addInvocationsExclusiveScanAMD(int16_t);" + "i16vec2 addInvocationsExclusiveScanAMD(i16vec2);" + "i16vec3 addInvocationsExclusiveScanAMD(i16vec3);" + "i16vec4 addInvocationsExclusiveScanAMD(i16vec4);" + + "uint16_t addInvocationsExclusiveScanAMD(uint16_t);" + "u16vec2 addInvocationsExclusiveScanAMD(u16vec2);" + "u16vec3 addInvocationsExclusiveScanAMD(u16vec3);" + "u16vec4 addInvocationsExclusiveScanAMD(u16vec4);" + "float minInvocationsNonUniformAMD(float);" "vec2 minInvocationsNonUniformAMD(vec2);" "vec3 minInvocationsNonUniformAMD(vec3);" @@ -1990,6 +3198,16 @@ "f16vec3 minInvocationsNonUniformAMD(f16vec3);" "f16vec4 minInvocationsNonUniformAMD(f16vec4);" + "int16_t minInvocationsNonUniformAMD(int16_t);" + "i16vec2 minInvocationsNonUniformAMD(i16vec2);" + "i16vec3 minInvocationsNonUniformAMD(i16vec3);" + "i16vec4 minInvocationsNonUniformAMD(i16vec4);" + + "uint16_t minInvocationsNonUniformAMD(uint16_t);" + "u16vec2 minInvocationsNonUniformAMD(u16vec2);" + "u16vec3 minInvocationsNonUniformAMD(u16vec3);" + "u16vec4 minInvocationsNonUniformAMD(u16vec4);" + "float minInvocationsInclusiveScanNonUniformAMD(float);" "vec2 minInvocationsInclusiveScanNonUniformAMD(vec2);" "vec3 minInvocationsInclusiveScanNonUniformAMD(vec3);" @@ -2025,6 +3243,16 @@ "f16vec3 minInvocationsInclusiveScanNonUniformAMD(f16vec3);" "f16vec4 minInvocationsInclusiveScanNonUniformAMD(f16vec4);" + "int16_t minInvocationsInclusiveScanNonUniformAMD(int16_t);" + "i16vec2 minInvocationsInclusiveScanNonUniformAMD(i16vec2);" + "i16vec3 minInvocationsInclusiveScanNonUniformAMD(i16vec3);" + "i16vec4 minInvocationsInclusiveScanNonUniformAMD(i16vec4);" + + "uint16_t minInvocationsInclusiveScanNonUniformAMD(uint16_t);" + "u16vec2 minInvocationsInclusiveScanNonUniformAMD(u16vec2);" + "u16vec3 minInvocationsInclusiveScanNonUniformAMD(u16vec3);" + "u16vec4 minInvocationsInclusiveScanNonUniformAMD(u16vec4);" + "float minInvocationsExclusiveScanNonUniformAMD(float);" "vec2 minInvocationsExclusiveScanNonUniformAMD(vec2);" "vec3 minInvocationsExclusiveScanNonUniformAMD(vec3);" @@ -2060,6 +3288,16 @@ "f16vec3 minInvocationsExclusiveScanNonUniformAMD(f16vec3);" "f16vec4 minInvocationsExclusiveScanNonUniformAMD(f16vec4);" + "int16_t minInvocationsExclusiveScanNonUniformAMD(int16_t);" + "i16vec2 minInvocationsExclusiveScanNonUniformAMD(i16vec2);" + "i16vec3 minInvocationsExclusiveScanNonUniformAMD(i16vec3);" + "i16vec4 minInvocationsExclusiveScanNonUniformAMD(i16vec4);" + + "uint16_t minInvocationsExclusiveScanNonUniformAMD(uint16_t);" + "u16vec2 minInvocationsExclusiveScanNonUniformAMD(u16vec2);" + "u16vec3 minInvocationsExclusiveScanNonUniformAMD(u16vec3);" + "u16vec4 minInvocationsExclusiveScanNonUniformAMD(u16vec4);" + "float maxInvocationsNonUniformAMD(float);" "vec2 maxInvocationsNonUniformAMD(vec2);" "vec3 maxInvocationsNonUniformAMD(vec3);" @@ -2095,6 +3333,16 @@ "f16vec3 maxInvocationsNonUniformAMD(f16vec3);" "f16vec4 maxInvocationsNonUniformAMD(f16vec4);" + "int16_t maxInvocationsNonUniformAMD(int16_t);" + "i16vec2 maxInvocationsNonUniformAMD(i16vec2);" + "i16vec3 maxInvocationsNonUniformAMD(i16vec3);" + "i16vec4 maxInvocationsNonUniformAMD(i16vec4);" + + "uint16_t maxInvocationsNonUniformAMD(uint16_t);" + "u16vec2 maxInvocationsNonUniformAMD(u16vec2);" + "u16vec3 maxInvocationsNonUniformAMD(u16vec3);" + "u16vec4 maxInvocationsNonUniformAMD(u16vec4);" + "float maxInvocationsInclusiveScanNonUniformAMD(float);" "vec2 maxInvocationsInclusiveScanNonUniformAMD(vec2);" "vec3 maxInvocationsInclusiveScanNonUniformAMD(vec3);" @@ -2130,6 +3378,16 @@ "f16vec3 maxInvocationsInclusiveScanNonUniformAMD(f16vec3);" "f16vec4 maxInvocationsInclusiveScanNonUniformAMD(f16vec4);" + "int16_t maxInvocationsInclusiveScanNonUniformAMD(int16_t);" + "i16vec2 maxInvocationsInclusiveScanNonUniformAMD(i16vec2);" + "i16vec3 maxInvocationsInclusiveScanNonUniformAMD(i16vec3);" + "i16vec4 maxInvocationsInclusiveScanNonUniformAMD(i16vec4);" + + "uint16_t maxInvocationsInclusiveScanNonUniformAMD(uint16_t);" + "u16vec2 maxInvocationsInclusiveScanNonUniformAMD(u16vec2);" + "u16vec3 maxInvocationsInclusiveScanNonUniformAMD(u16vec3);" + "u16vec4 maxInvocationsInclusiveScanNonUniformAMD(u16vec4);" + "float maxInvocationsExclusiveScanNonUniformAMD(float);" "vec2 maxInvocationsExclusiveScanNonUniformAMD(vec2);" "vec3 maxInvocationsExclusiveScanNonUniformAMD(vec3);" @@ -2165,6 +3423,16 @@ "f16vec3 maxInvocationsExclusiveScanNonUniformAMD(f16vec3);" "f16vec4 maxInvocationsExclusiveScanNonUniformAMD(f16vec4);" + "int16_t maxInvocationsExclusiveScanNonUniformAMD(int16_t);" + "i16vec2 maxInvocationsExclusiveScanNonUniformAMD(i16vec2);" + "i16vec3 maxInvocationsExclusiveScanNonUniformAMD(i16vec3);" + "i16vec4 maxInvocationsExclusiveScanNonUniformAMD(i16vec4);" + + "uint16_t maxInvocationsExclusiveScanNonUniformAMD(uint16_t);" + "u16vec2 maxInvocationsExclusiveScanNonUniformAMD(u16vec2);" + "u16vec3 maxInvocationsExclusiveScanNonUniformAMD(u16vec3);" + "u16vec4 maxInvocationsExclusiveScanNonUniformAMD(u16vec4);" + "float addInvocationsNonUniformAMD(float);" "vec2 addInvocationsNonUniformAMD(vec2);" "vec3 addInvocationsNonUniformAMD(vec3);" @@ -2200,6 +3468,16 @@ "f16vec3 addInvocationsNonUniformAMD(f16vec3);" "f16vec4 addInvocationsNonUniformAMD(f16vec4);" + "int16_t addInvocationsNonUniformAMD(int16_t);" + "i16vec2 addInvocationsNonUniformAMD(i16vec2);" + "i16vec3 addInvocationsNonUniformAMD(i16vec3);" + "i16vec4 addInvocationsNonUniformAMD(i16vec4);" + + "uint16_t addInvocationsNonUniformAMD(uint16_t);" + "u16vec2 addInvocationsNonUniformAMD(u16vec2);" + "u16vec3 addInvocationsNonUniformAMD(u16vec3);" + "u16vec4 addInvocationsNonUniformAMD(u16vec4);" + "float addInvocationsInclusiveScanNonUniformAMD(float);" "vec2 addInvocationsInclusiveScanNonUniformAMD(vec2);" "vec3 addInvocationsInclusiveScanNonUniformAMD(vec3);" @@ -2235,6 +3513,16 @@ "f16vec3 addInvocationsInclusiveScanNonUniformAMD(f16vec3);" "f16vec4 addInvocationsInclusiveScanNonUniformAMD(f16vec4);" + "int16_t addInvocationsInclusiveScanNonUniformAMD(int16_t);" + "i16vec2 addInvocationsInclusiveScanNonUniformAMD(i16vec2);" + "i16vec3 addInvocationsInclusiveScanNonUniformAMD(i16vec3);" + "i16vec4 addInvocationsInclusiveScanNonUniformAMD(i16vec4);" + + "uint16_t addInvocationsInclusiveScanNonUniformAMD(uint16_t);" + "u16vec2 addInvocationsInclusiveScanNonUniformAMD(u16vec2);" + "u16vec3 addInvocationsInclusiveScanNonUniformAMD(u16vec3);" + "u16vec4 addInvocationsInclusiveScanNonUniformAMD(u16vec4);" + "float addInvocationsExclusiveScanNonUniformAMD(float);" "vec2 addInvocationsExclusiveScanNonUniformAMD(vec2);" "vec3 addInvocationsExclusiveScanNonUniformAMD(vec3);" @@ -2270,6 +3558,16 @@ "f16vec3 addInvocationsExclusiveScanNonUniformAMD(f16vec3);" "f16vec4 addInvocationsExclusiveScanNonUniformAMD(f16vec4);" + "int16_t addInvocationsExclusiveScanNonUniformAMD(int16_t);" + "i16vec2 addInvocationsExclusiveScanNonUniformAMD(i16vec2);" + "i16vec3 addInvocationsExclusiveScanNonUniformAMD(i16vec3);" + "i16vec4 addInvocationsExclusiveScanNonUniformAMD(i16vec4);" + + "uint16_t addInvocationsExclusiveScanNonUniformAMD(uint16_t);" + "u16vec2 addInvocationsExclusiveScanNonUniformAMD(u16vec2);" + "u16vec3 addInvocationsExclusiveScanNonUniformAMD(u16vec3);" + "u16vec4 addInvocationsExclusiveScanNonUniformAMD(u16vec4);" + "float swizzleInvocationsAMD(float, uvec4);" "vec2 swizzleInvocationsAMD(vec2, uvec4);" "vec3 swizzleInvocationsAMD(vec3, uvec4);" @@ -2330,7 +3628,31 @@ "\n"); } - // GL_AMD_gpu_shader_half_float + // GL_AMD_shader_fragment_mask + if (profile != EEsProfile && version >= 450) { + commonBuiltins.append( + "uint fragmentMaskFetchAMD(sampler2DMS, ivec2);" + "uint fragmentMaskFetchAMD(isampler2DMS, ivec2);" + "uint fragmentMaskFetchAMD(usampler2DMS, ivec2);" + + "uint fragmentMaskFetchAMD(sampler2DMSArray, ivec3);" + "uint fragmentMaskFetchAMD(isampler2DMSArray, ivec3);" + "uint fragmentMaskFetchAMD(usampler2DMSArray, ivec3);" + + "vec4 fragmentFetchAMD(sampler2DMS, ivec2, uint);" + "ivec4 fragmentFetchAMD(isampler2DMS, ivec2, uint);" + "uvec4 fragmentFetchAMD(usampler2DMS, ivec2, uint);" + + "vec4 fragmentFetchAMD(sampler2DMSArray, ivec3, uint);" + "ivec4 fragmentFetchAMD(isampler2DMSArray, ivec3, uint);" + "uvec4 fragmentFetchAMD(usampler2DMSArray, ivec3, uint);" + + "\n"); + } + +#endif // AMD_EXTENSIONS + + // GL_AMD_gpu_shader_half_float/Explicit types if (profile != EEsProfile && version >= 450) { commonBuiltins.append( "float16_t radians(float16_t);" @@ -2678,9 +4000,168 @@ "\n"); } - // GL_AMD_gpu_shader_int16 + // Explicit types if (profile != EEsProfile && version >= 450) { commonBuiltins.append( + "int8_t abs(int8_t);" + "i8vec2 abs(i8vec2);" + "i8vec3 abs(i8vec3);" + "i8vec4 abs(i8vec4);" + + "int8_t sign(int8_t);" + "i8vec2 sign(i8vec2);" + "i8vec3 sign(i8vec3);" + "i8vec4 sign(i8vec4);" + + "int8_t min(int8_t x, int8_t y);" + "i8vec2 min(i8vec2 x, int8_t y);" + "i8vec3 min(i8vec3 x, int8_t y);" + "i8vec4 min(i8vec4 x, int8_t y);" + "i8vec2 min(i8vec2 x, i8vec2 y);" + "i8vec3 min(i8vec3 x, i8vec3 y);" + "i8vec4 min(i8vec4 x, i8vec4 y);" + + "uint8_t min(uint8_t x, uint8_t y);" + "u8vec2 min(u8vec2 x, uint8_t y);" + "u8vec3 min(u8vec3 x, uint8_t y);" + "u8vec4 min(u8vec4 x, uint8_t y);" + "u8vec2 min(u8vec2 x, u8vec2 y);" + "u8vec3 min(u8vec3 x, u8vec3 y);" + "u8vec4 min(u8vec4 x, u8vec4 y);" + + "int8_t max(int8_t x, int8_t y);" + "i8vec2 max(i8vec2 x, int8_t y);" + "i8vec3 max(i8vec3 x, int8_t y);" + "i8vec4 max(i8vec4 x, int8_t y);" + "i8vec2 max(i8vec2 x, i8vec2 y);" + "i8vec3 max(i8vec3 x, i8vec3 y);" + "i8vec4 max(i8vec4 x, i8vec4 y);" + + "uint8_t max(uint8_t x, uint8_t y);" + "u8vec2 max(u8vec2 x, uint8_t y);" + "u8vec3 max(u8vec3 x, uint8_t y);" + "u8vec4 max(u8vec4 x, uint8_t y);" + "u8vec2 max(u8vec2 x, u8vec2 y);" + "u8vec3 max(u8vec3 x, u8vec3 y);" + "u8vec4 max(u8vec4 x, u8vec4 y);" + + "int8_t clamp(int8_t x, int8_t minVal, int8_t maxVal);" + "i8vec2 clamp(i8vec2 x, int8_t minVal, int8_t maxVal);" + "i8vec3 clamp(i8vec3 x, int8_t minVal, int8_t maxVal);" + "i8vec4 clamp(i8vec4 x, int8_t minVal, int8_t maxVal);" + "i8vec2 clamp(i8vec2 x, i8vec2 minVal, i8vec2 maxVal);" + "i8vec3 clamp(i8vec3 x, i8vec3 minVal, i8vec3 maxVal);" + "i8vec4 clamp(i8vec4 x, i8vec4 minVal, i8vec4 maxVal);" + + "uint8_t clamp(uint8_t x, uint8_t minVal, uint8_t maxVal);" + "u8vec2 clamp(u8vec2 x, uint8_t minVal, uint8_t maxVal);" + "u8vec3 clamp(u8vec3 x, uint8_t minVal, uint8_t maxVal);" + "u8vec4 clamp(u8vec4 x, uint8_t minVal, uint8_t maxVal);" + "u8vec2 clamp(u8vec2 x, u8vec2 minVal, u8vec2 maxVal);" + "u8vec3 clamp(u8vec3 x, u8vec3 minVal, u8vec3 maxVal);" + "u8vec4 clamp(u8vec4 x, u8vec4 minVal, u8vec4 maxVal);" + + "int8_t mix(int8_t, int8_t, bool);" + "i8vec2 mix(i8vec2, i8vec2, bvec2);" + "i8vec3 mix(i8vec3, i8vec3, bvec3);" + "i8vec4 mix(i8vec4, i8vec4, bvec4);" + "uint8_t mix(uint8_t, uint8_t, bool);" + "u8vec2 mix(u8vec2, u8vec2, bvec2);" + "u8vec3 mix(u8vec3, u8vec3, bvec3);" + "u8vec4 mix(u8vec4, u8vec4, bvec4);" + + "bvec2 lessThan(i8vec2, i8vec2);" + "bvec3 lessThan(i8vec3, i8vec3);" + "bvec4 lessThan(i8vec4, i8vec4);" + "bvec2 lessThan(u8vec2, u8vec2);" + "bvec3 lessThan(u8vec3, u8vec3);" + "bvec4 lessThan(u8vec4, u8vec4);" + + "bvec2 lessThanEqual(i8vec2, i8vec2);" + "bvec3 lessThanEqual(i8vec3, i8vec3);" + "bvec4 lessThanEqual(i8vec4, i8vec4);" + "bvec2 lessThanEqual(u8vec2, u8vec2);" + "bvec3 lessThanEqual(u8vec3, u8vec3);" + "bvec4 lessThanEqual(u8vec4, u8vec4);" + + "bvec2 greaterThan(i8vec2, i8vec2);" + "bvec3 greaterThan(i8vec3, i8vec3);" + "bvec4 greaterThan(i8vec4, i8vec4);" + "bvec2 greaterThan(u8vec2, u8vec2);" + "bvec3 greaterThan(u8vec3, u8vec3);" + "bvec4 greaterThan(u8vec4, u8vec4);" + + "bvec2 greaterThanEqual(i8vec2, i8vec2);" + "bvec3 greaterThanEqual(i8vec3, i8vec3);" + "bvec4 greaterThanEqual(i8vec4, i8vec4);" + "bvec2 greaterThanEqual(u8vec2, u8vec2);" + "bvec3 greaterThanEqual(u8vec3, u8vec3);" + "bvec4 greaterThanEqual(u8vec4, u8vec4);" + + "bvec2 equal(i8vec2, i8vec2);" + "bvec3 equal(i8vec3, i8vec3);" + "bvec4 equal(i8vec4, i8vec4);" + "bvec2 equal(u8vec2, u8vec2);" + "bvec3 equal(u8vec3, u8vec3);" + "bvec4 equal(u8vec4, u8vec4);" + + "bvec2 notEqual(i8vec2, i8vec2);" + "bvec3 notEqual(i8vec3, i8vec3);" + "bvec4 notEqual(i8vec4, i8vec4);" + "bvec2 notEqual(u8vec2, u8vec2);" + "bvec3 notEqual(u8vec3, u8vec3);" + "bvec4 notEqual(u8vec4, u8vec4);" + + " int8_t bitfieldExtract( int8_t, int8_t, int8_t);" + "i8vec2 bitfieldExtract(i8vec2, int8_t, int8_t);" + "i8vec3 bitfieldExtract(i8vec3, int8_t, int8_t);" + "i8vec4 bitfieldExtract(i8vec4, int8_t, int8_t);" + + " uint8_t bitfieldExtract( uint8_t, int8_t, int8_t);" + "u8vec2 bitfieldExtract(u8vec2, int8_t, int8_t);" + "u8vec3 bitfieldExtract(u8vec3, int8_t, int8_t);" + "u8vec4 bitfieldExtract(u8vec4, int8_t, int8_t);" + + " int8_t bitfieldInsert( int8_t base, int8_t, int8_t, int8_t);" + "i8vec2 bitfieldInsert(i8vec2 base, i8vec2, int8_t, int8_t);" + "i8vec3 bitfieldInsert(i8vec3 base, i8vec3, int8_t, int8_t);" + "i8vec4 bitfieldInsert(i8vec4 base, i8vec4, int8_t, int8_t);" + + " uint8_t bitfieldInsert( uint8_t base, uint8_t, int8_t, int8_t);" + "u8vec2 bitfieldInsert(u8vec2 base, u8vec2, int8_t, int8_t);" + "u8vec3 bitfieldInsert(u8vec3 base, u8vec3, int8_t, int8_t);" + "u8vec4 bitfieldInsert(u8vec4 base, u8vec4, int8_t, int8_t);" + + " int8_t bitCount( int8_t);" + "i8vec2 bitCount(i8vec2);" + "i8vec3 bitCount(i8vec3);" + "i8vec4 bitCount(i8vec4);" + + " int8_t bitCount( uint8_t);" + "i8vec2 bitCount(u8vec2);" + "i8vec3 bitCount(u8vec3);" + "i8vec4 bitCount(u8vec4);" + + " int8_t findLSB( int8_t);" + "i8vec2 findLSB(i8vec2);" + "i8vec3 findLSB(i8vec3);" + "i8vec4 findLSB(i8vec4);" + + " int8_t findLSB( uint8_t);" + "i8vec2 findLSB(u8vec2);" + "i8vec3 findLSB(u8vec3);" + "i8vec4 findLSB(u8vec4);" + + " int8_t findMSB( int8_t);" + "i8vec2 findMSB(i8vec2);" + "i8vec3 findMSB(i8vec3);" + "i8vec4 findMSB(i8vec4);" + + " int8_t findMSB( uint8_t);" + "i8vec2 findMSB(u8vec2);" + "i8vec3 findMSB(u8vec3);" + "i8vec4 findMSB(u8vec4);" + "int16_t abs(int16_t);" "i16vec2 abs(i16vec2);" "i16vec3 abs(i16vec3);" @@ -2691,50 +4172,53 @@ "i16vec3 sign(i16vec3);" "i16vec4 sign(i16vec4);" - "int16_t min(int16_t, int16_t);" - "i16vec2 min(i16vec2, int16_t);" - "i16vec3 min(i16vec3, int16_t);" - "i16vec4 min(i16vec4, int16_t);" - "i16vec2 min(i16vec2, i16vec2);" - "i16vec3 min(i16vec3, i16vec3);" - "i16vec4 min(i16vec4, i16vec4);" - "uint16_t min(uint16_t, uint16_t);" - "u16vec2 min(u16vec2, uint16_t);" - "u16vec3 min(u16vec3, uint16_t);" - "u16vec4 min(u16vec4, uint16_t);" - "u16vec2 min(u16vec2, u16vec2);" - "u16vec3 min(u16vec3, u16vec3);" - "u16vec4 min(u16vec4, u16vec4);" - - "int16_t max(int16_t, int16_t);" - "i16vec2 max(i16vec2, int16_t);" - "i16vec3 max(i16vec3, int16_t);" - "i16vec4 max(i16vec4, int16_t);" - "i16vec2 max(i16vec2, i16vec2);" - "i16vec3 max(i16vec3, i16vec3);" - "i16vec4 max(i16vec4, i16vec4);" - "uint16_t max(uint16_t, uint16_t);" - "u16vec2 max(u16vec2, uint16_t);" - "u16vec3 max(u16vec3, uint16_t);" - "u16vec4 max(u16vec4, uint16_t);" - "u16vec2 max(u16vec2, u16vec2);" - "u16vec3 max(u16vec3, u16vec3);" - "u16vec4 max(u16vec4, u16vec4);" - - "int16_t clamp(int16_t, int16_t, int16_t);" - "i16vec2 clamp(i16vec2, int16_t, int16_t);" - "i16vec3 clamp(i16vec3, int16_t, int16_t);" - "i16vec4 clamp(i16vec4, int16_t, int16_t);" - "i16vec2 clamp(i16vec2, i16vec2, i16vec2);" - "i16vec3 clamp(i16vec3, i16vec3, i16vec3);" - "i16vec4 clamp(i16vec4, i16vec4, i16vec4);" - "uint16_t clamp(uint16_t, uint16_t, uint16_t);" - "u16vec2 clamp(u16vec2, uint16_t, uint16_t);" - "u16vec3 clamp(u16vec3, uint16_t, uint16_t);" - "u16vec4 clamp(u16vec4, uint16_t, uint16_t);" - "u16vec2 clamp(u16vec2, u16vec2, u16vec2);" - "u16vec3 clamp(u16vec3, u16vec3, u16vec3);" - "u16vec4 clamp(u16vec4, u16vec4, u16vec4);" + "int16_t min(int16_t x, int16_t y);" + "i16vec2 min(i16vec2 x, int16_t y);" + "i16vec3 min(i16vec3 x, int16_t y);" + "i16vec4 min(i16vec4 x, int16_t y);" + "i16vec2 min(i16vec2 x, i16vec2 y);" + "i16vec3 min(i16vec3 x, i16vec3 y);" + "i16vec4 min(i16vec4 x, i16vec4 y);" + + "uint16_t min(uint16_t x, uint16_t y);" + "u16vec2 min(u16vec2 x, uint16_t y);" + "u16vec3 min(u16vec3 x, uint16_t y);" + "u16vec4 min(u16vec4 x, uint16_t y);" + "u16vec2 min(u16vec2 x, u16vec2 y);" + "u16vec3 min(u16vec3 x, u16vec3 y);" + "u16vec4 min(u16vec4 x, u16vec4 y);" + + "int16_t max(int16_t x, int16_t y);" + "i16vec2 max(i16vec2 x, int16_t y);" + "i16vec3 max(i16vec3 x, int16_t y);" + "i16vec4 max(i16vec4 x, int16_t y);" + "i16vec2 max(i16vec2 x, i16vec2 y);" + "i16vec3 max(i16vec3 x, i16vec3 y);" + "i16vec4 max(i16vec4 x, i16vec4 y);" + + "uint16_t max(uint16_t x, uint16_t y);" + "u16vec2 max(u16vec2 x, uint16_t y);" + "u16vec3 max(u16vec3 x, uint16_t y);" + "u16vec4 max(u16vec4 x, uint16_t y);" + "u16vec2 max(u16vec2 x, u16vec2 y);" + "u16vec3 max(u16vec3 x, u16vec3 y);" + "u16vec4 max(u16vec4 x, u16vec4 y);" + + "int16_t clamp(int16_t x, int16_t minVal, int16_t maxVal);" + "i16vec2 clamp(i16vec2 x, int16_t minVal, int16_t maxVal);" + "i16vec3 clamp(i16vec3 x, int16_t minVal, int16_t maxVal);" + "i16vec4 clamp(i16vec4 x, int16_t minVal, int16_t maxVal);" + "i16vec2 clamp(i16vec2 x, i16vec2 minVal, i16vec2 maxVal);" + "i16vec3 clamp(i16vec3 x, i16vec3 minVal, i16vec3 maxVal);" + "i16vec4 clamp(i16vec4 x, i16vec4 minVal, i16vec4 maxVal);" + + "uint16_t clamp(uint16_t x, uint16_t minVal, uint16_t maxVal);" + "u16vec2 clamp(u16vec2 x, uint16_t minVal, uint16_t maxVal);" + "u16vec3 clamp(u16vec3 x, uint16_t minVal, uint16_t maxVal);" + "u16vec4 clamp(u16vec4 x, uint16_t minVal, uint16_t maxVal);" + "u16vec2 clamp(u16vec2 x, u16vec2 minVal, u16vec2 maxVal);" + "u16vec3 clamp(u16vec3 x, u16vec3 minVal, u16vec3 maxVal);" + "u16vec4 clamp(u16vec4 x, u16vec4 minVal, u16vec4 maxVal);" "int16_t mix(int16_t, int16_t, bool);" "i16vec2 mix(i16vec2, i16vec2, bvec2);" @@ -2755,6 +4239,16 @@ "f16vec3 ldexp(f16vec3, i16vec3);" "f16vec4 ldexp(f16vec4, i16vec4);" + "int16_t halfBitsToInt16(float16_t);" + "i16vec2 halfBitsToInt16(f16vec2);" + "i16vec3 halhBitsToInt16(f16vec3);" + "i16vec4 halfBitsToInt16(f16vec4);" + + "uint16_t halfBitsToUint16(float16_t);" + "u16vec2 halfBitsToUint16(f16vec2);" + "u16vec3 halfBitsToUint16(f16vec3);" + "u16vec4 halfBitsToUint16(f16vec4);" + "int16_t float16BitsToInt16(float16_t);" "i16vec2 float16BitsToInt16(f16vec2);" "i16vec3 float16BitsToInt16(f16vec3);" @@ -2775,6 +4269,16 @@ "f16vec3 uint16BitsToFloat16(u16vec3);" "f16vec4 uint16BitsToFloat16(u16vec4);" + "float16_t int16BitsToHalf(int16_t);" + "f16vec2 int16BitsToHalf(i16vec2);" + "f16vec3 int16BitsToHalf(i16vec3);" + "f16vec4 int16BitsToHalf(i16vec4);" + + "float16_t uint16BitsToHalf(uint16_t);" + "f16vec2 uint16BitsToHalf(u16vec2);" + "f16vec3 uint16BitsToHalf(u16vec3);" + "f16vec4 uint16BitsToHalf(u16vec4);" + "int packInt2x16(i16vec2);" "uint packUint2x16(u16vec2);" "int64_t packInt4x16(i16vec4);" @@ -2826,33 +4330,245 @@ "bvec3 notEqual(u16vec3, u16vec3);" "bvec4 notEqual(u16vec4, u16vec4);" + " int16_t bitfieldExtract( int16_t, int16_t, int16_t);" + "i16vec2 bitfieldExtract(i16vec2, int16_t, int16_t);" + "i16vec3 bitfieldExtract(i16vec3, int16_t, int16_t);" + "i16vec4 bitfieldExtract(i16vec4, int16_t, int16_t);" + + " uint16_t bitfieldExtract( uint16_t, int16_t, int16_t);" + "u16vec2 bitfieldExtract(u16vec2, int16_t, int16_t);" + "u16vec3 bitfieldExtract(u16vec3, int16_t, int16_t);" + "u16vec4 bitfieldExtract(u16vec4, int16_t, int16_t);" + + " int16_t bitfieldInsert( int16_t base, int16_t, int16_t, int16_t);" + "i16vec2 bitfieldInsert(i16vec2 base, i16vec2, int16_t, int16_t);" + "i16vec3 bitfieldInsert(i16vec3 base, i16vec3, int16_t, int16_t);" + "i16vec4 bitfieldInsert(i16vec4 base, i16vec4, int16_t, int16_t);" + + " uint16_t bitfieldInsert( uint16_t base, uint16_t, int16_t, int16_t);" + "u16vec2 bitfieldInsert(u16vec2 base, u16vec2, int16_t, int16_t);" + "u16vec3 bitfieldInsert(u16vec3 base, u16vec3, int16_t, int16_t);" + "u16vec4 bitfieldInsert(u16vec4 base, u16vec4, int16_t, int16_t);" + + " int16_t bitCount( int16_t);" + "i16vec2 bitCount(i16vec2);" + "i16vec3 bitCount(i16vec3);" + "i16vec4 bitCount(i16vec4);" + + " int16_t bitCount( uint16_t);" + "i16vec2 bitCount(u16vec2);" + "i16vec3 bitCount(u16vec3);" + "i16vec4 bitCount(u16vec4);" + + " int16_t findLSB( int16_t);" + "i16vec2 findLSB(i16vec2);" + "i16vec3 findLSB(i16vec3);" + "i16vec4 findLSB(i16vec4);" + + " int16_t findLSB( uint16_t);" + "i16vec2 findLSB(u16vec2);" + "i16vec3 findLSB(u16vec3);" + "i16vec4 findLSB(u16vec4);" + + " int16_t findMSB( int16_t);" + "i16vec2 findMSB(i16vec2);" + "i16vec3 findMSB(i16vec3);" + "i16vec4 findMSB(i16vec4);" + + " int16_t findMSB( uint16_t);" + "i16vec2 findMSB(u16vec2);" + "i16vec3 findMSB(u16vec3);" + "i16vec4 findMSB(u16vec4);" + + "int16_t pack16(i8vec2);" + "uint16_t pack16(u8vec2);" + "int32_t pack32(i8vec4);" + "uint32_t pack32(u8vec4);" + "int32_t pack32(i16vec2);" + "uint32_t pack32(u16vec2);" + "int64_t pack64(i16vec4);" + "uint64_t pack64(u16vec4);" + "int64_t pack64(i32vec2);" + "uint64_t pack64(u32vec2);" + + "i8vec2 unpack8(int16_t);" + "u8vec2 unpack8(uint16_t);" + "i8vec4 unpack8(int32_t);" + "u8vec4 unpack8(uint32_t);" + "i16vec2 unpack16(int32_t);" + "u16vec2 unpack16(uint32_t);" + "i16vec4 unpack16(int64_t);" + "u16vec4 unpack16(uint64_t);" + "i32vec2 unpack32(int64_t);" + "u32vec2 unpack32(uint64_t);" + + "float64_t radians(float64_t);" + "f64vec2 radians(f64vec2);" + "f64vec3 radians(f64vec3);" + "f64vec4 radians(f64vec4);" + + "float64_t degrees(float64_t);" + "f64vec2 degrees(f64vec2);" + "f64vec3 degrees(f64vec3);" + "f64vec4 degrees(f64vec4);" + + "float64_t sin(float64_t);" + "f64vec2 sin(f64vec2);" + "f64vec3 sin(f64vec3);" + "f64vec4 sin(f64vec4);" + + "float64_t cos(float64_t);" + "f64vec2 cos(f64vec2);" + "f64vec3 cos(f64vec3);" + "f64vec4 cos(f64vec4);" + + "float64_t tan(float64_t);" + "f64vec2 tan(f64vec2);" + "f64vec3 tan(f64vec3);" + "f64vec4 tan(f64vec4);" + + "float64_t asin(float64_t);" + "f64vec2 asin(f64vec2);" + "f64vec3 asin(f64vec3);" + "f64vec4 asin(f64vec4);" + + "float64_t acos(float64_t);" + "f64vec2 acos(f64vec2);" + "f64vec3 acos(f64vec3);" + "f64vec4 acos(f64vec4);" + + "float64_t atan(float64_t, float64_t);" + "f64vec2 atan(f64vec2, f64vec2);" + "f64vec3 atan(f64vec3, f64vec3);" + "f64vec4 atan(f64vec4, f64vec4);" + + "float64_t atan(float64_t);" + "f64vec2 atan(f64vec2);" + "f64vec3 atan(f64vec3);" + "f64vec4 atan(f64vec4);" + + "float64_t sinh(float64_t);" + "f64vec2 sinh(f64vec2);" + "f64vec3 sinh(f64vec3);" + "f64vec4 sinh(f64vec4);" + + "float64_t cosh(float64_t);" + "f64vec2 cosh(f64vec2);" + "f64vec3 cosh(f64vec3);" + "f64vec4 cosh(f64vec4);" + + "float64_t tanh(float64_t);" + "f64vec2 tanh(f64vec2);" + "f64vec3 tanh(f64vec3);" + "f64vec4 tanh(f64vec4);" + + "float64_t asinh(float64_t);" + "f64vec2 asinh(f64vec2);" + "f64vec3 asinh(f64vec3);" + "f64vec4 asinh(f64vec4);" + + "float64_t acosh(float64_t);" + "f64vec2 acosh(f64vec2);" + "f64vec3 acosh(f64vec3);" + "f64vec4 acosh(f64vec4);" + + "float64_t atanh(float64_t);" + "f64vec2 atanh(f64vec2);" + "f64vec3 atanh(f64vec3);" + "f64vec4 atanh(f64vec4);" + + "float64_t pow(float64_t, float64_t);" + "f64vec2 pow(f64vec2, f64vec2);" + "f64vec3 pow(f64vec3, f64vec3);" + "f64vec4 pow(f64vec4, f64vec4);" + + "float64_t exp(float64_t);" + "f64vec2 exp(f64vec2);" + "f64vec3 exp(f64vec3);" + "f64vec4 exp(f64vec4);" + + "float64_t log(float64_t);" + "f64vec2 log(f64vec2);" + "f64vec3 log(f64vec3);" + "f64vec4 log(f64vec4);" + + "float64_t exp2(float64_t);" + "f64vec2 exp2(f64vec2);" + "f64vec3 exp2(f64vec3);" + "f64vec4 exp2(f64vec4);" + + "float64_t log2(float64_t);" + "f64vec2 log2(f64vec2);" + "f64vec3 log2(f64vec3);" + "f64vec4 log2(f64vec4);" "\n"); - } - - // GL_AMD_shader_fragment_mask - if (profile != EEsProfile && version >= 450) { - commonBuiltins.append( - "uint fragmentMaskFetchAMD(sampler2DMS, ivec2);" - "uint fragmentMaskFetchAMD(isampler2DMS, ivec2);" - "uint fragmentMaskFetchAMD(usampler2DMS, ivec2);" - - "uint fragmentMaskFetchAMD(sampler2DMSArray, ivec3);" - "uint fragmentMaskFetchAMD(isampler2DMSArray, ivec3);" - "uint fragmentMaskFetchAMD(usampler2DMSArray, ivec3);" - - "vec4 fragmentFetchAMD(sampler2DMS, ivec2, uint);" - "ivec4 fragmentFetchAMD(isampler2DMS, ivec2, uint);" - "uvec4 fragmentFetchAMD(usampler2DMS, ivec2, uint);" + } + if (profile != EEsProfile && version >= 450) { + stageBuiltins[EShLangFragment].append( + "float64_t dFdx(float64_t);" + "f64vec2 dFdx(f64vec2);" + "f64vec3 dFdx(f64vec3);" + "f64vec4 dFdx(f64vec4);" + + "float64_t dFdy(float64_t);" + "f64vec2 dFdy(f64vec2);" + "f64vec3 dFdy(f64vec3);" + "f64vec4 dFdy(f64vec4);" + + "float64_t dFdxFine(float64_t);" + "f64vec2 dFdxFine(f64vec2);" + "f64vec3 dFdxFine(f64vec3);" + "f64vec4 dFdxFine(f64vec4);" + + "float64_t dFdyFine(float64_t);" + "f64vec2 dFdyFine(f64vec2);" + "f64vec3 dFdyFine(f64vec3);" + "f64vec4 dFdyFine(f64vec4);" + + "float64_t dFdxCoarse(float64_t);" + "f64vec2 dFdxCoarse(f64vec2);" + "f64vec3 dFdxCoarse(f64vec3);" + "f64vec4 dFdxCoarse(f64vec4);" + + "float64_t dFdyCoarse(float64_t);" + "f64vec2 dFdyCoarse(f64vec2);" + "f64vec3 dFdyCoarse(f64vec3);" + "f64vec4 dFdyCoarse(f64vec4);" + + "float64_t fwidth(float64_t);" + "f64vec2 fwidth(f64vec2);" + "f64vec3 fwidth(f64vec3);" + "f64vec4 fwidth(f64vec4);" + + "float64_t fwidthFine(float64_t);" + "f64vec2 fwidthFine(f64vec2);" + "f64vec3 fwidthFine(f64vec3);" + "f64vec4 fwidthFine(f64vec4);" + + "float64_t fwidthCoarse(float64_t);" + "f64vec2 fwidthCoarse(f64vec2);" + "f64vec3 fwidthCoarse(f64vec3);" + "f64vec4 fwidthCoarse(f64vec4);" + + "float64_t interpolateAtCentroid(float64_t);" + "f64vec2 interpolateAtCentroid(f64vec2);" + "f64vec3 interpolateAtCentroid(f64vec3);" + "f64vec4 interpolateAtCentroid(f64vec4);" + + "float64_t interpolateAtSample(float64_t, int);" + "f64vec2 interpolateAtSample(f64vec2, int);" + "f64vec3 interpolateAtSample(f64vec3, int);" + "f64vec4 interpolateAtSample(f64vec4, int);" + + "float64_t interpolateAtOffset(float64_t, f64vec2);" + "f64vec2 interpolateAtOffset(f64vec2, f64vec2);" + "f64vec3 interpolateAtOffset(f64vec3, f64vec2);" + "f64vec4 interpolateAtOffset(f64vec4, f64vec2);" - "vec4 fragmentFetchAMD(sampler2DMSArray, ivec3, uint);" - "ivec4 fragmentFetchAMD(isampler2DMSArray, ivec3, uint);" - "uvec4 fragmentFetchAMD(usampler2DMSArray, ivec3, uint);" + "\n"); - "\n"); } -#endif - //============================================================================ // // Prototypes for built-in functions seen by vertex shaders only. @@ -3192,7 +4908,7 @@ } // GL_AMD_shader_fragment_mask - if (profile != EEsProfile && version >= 450 && spvVersion.vulkan >= 100) { + if (profile != EEsProfile && version >= 450 && spvVersion.vulkan > 0) { stageBuiltins[EShLangFragment].append( "uint fragmentMaskFetchAMD(subpassInputMS);" "uint fragmentMaskFetchAMD(isubpassInputMS);" @@ -3491,7 +5207,7 @@ stageBuiltins[EShLangVertex].append( "int gl_InstanceID;" // needs qualifier fixed later ); - if (spvVersion.vulkan >= 100 && version >= 140) + if (spvVersion.vulkan > 0 && version >= 140) stageBuiltins[EShLangVertex].append( "in int gl_VertexIndex;" "in int gl_InstanceIndex;" @@ -3541,7 +5257,7 @@ "in highp int gl_VertexID;" // needs qualifier fixed later "in highp int gl_InstanceID;" // needs qualifier fixed later ); - if (spvVersion.vulkan >= 100) + if (spvVersion.vulkan > 0) stageBuiltins[EShLangVertex].append( "in highp int gl_VertexIndex;" "in highp int gl_InstanceIndex;" @@ -4018,17 +5734,30 @@ // GL_ARB_shader_ballot if (profile != EEsProfile && version >= 450) { - commonBuiltins.append( + const char* ballotDecls = "uniform uint gl_SubGroupSizeARB;" - "in uint gl_SubGroupInvocationARB;" "in uint64_t gl_SubGroupEqMaskARB;" "in uint64_t gl_SubGroupGeMaskARB;" "in uint64_t gl_SubGroupGtMaskARB;" "in uint64_t gl_SubGroupLeMaskARB;" "in uint64_t gl_SubGroupLtMaskARB;" - - "\n"); + "\n"; + const char* fragmentBallotDecls = + "uniform uint gl_SubGroupSizeARB;" + "flat in uint gl_SubGroupInvocationARB;" + "flat in uint64_t gl_SubGroupEqMaskARB;" + "flat in uint64_t gl_SubGroupGeMaskARB;" + "flat in uint64_t gl_SubGroupGtMaskARB;" + "flat in uint64_t gl_SubGroupLeMaskARB;" + "flat in uint64_t gl_SubGroupLtMaskARB;" + "\n"; + stageBuiltins[EShLangVertex] .append(ballotDecls); + stageBuiltins[EShLangTessControl] .append(ballotDecls); + stageBuiltins[EShLangTessEvaluation].append(ballotDecls); + stageBuiltins[EShLangGeometry] .append(ballotDecls); + stageBuiltins[EShLangCompute] .append(ballotDecls); + stageBuiltins[EShLangFragment] .append(fragmentBallotDecls); } if ((profile != EEsProfile && version >= 140) || @@ -4039,6 +5768,39 @@ "\n"); } + // GL_KHR_shader_subgroup + if (spvVersion.vulkan > 0) { + const char* ballotDecls = + "in mediump uint gl_SubgroupSize;" + "in mediump uint gl_SubgroupInvocationID;" + "in highp uvec4 gl_SubgroupEqMask;" + "in highp uvec4 gl_SubgroupGeMask;" + "in highp uvec4 gl_SubgroupGtMask;" + "in highp uvec4 gl_SubgroupLeMask;" + "in highp uvec4 gl_SubgroupLtMask;" + "\n"; + const char* fragmentBallotDecls = + "flat in mediump uint gl_SubgroupSize;" + "flat in mediump uint gl_SubgroupInvocationID;" + "flat in highp uvec4 gl_SubgroupEqMask;" + "flat in highp uvec4 gl_SubgroupGeMask;" + "flat in highp uvec4 gl_SubgroupGtMask;" + "flat in highp uvec4 gl_SubgroupLeMask;" + "flat in highp uvec4 gl_SubgroupLtMask;" + "\n"; + stageBuiltins[EShLangVertex] .append(ballotDecls); + stageBuiltins[EShLangTessControl] .append(ballotDecls); + stageBuiltins[EShLangTessEvaluation].append(ballotDecls); + stageBuiltins[EShLangGeometry] .append(ballotDecls); + stageBuiltins[EShLangCompute] .append(ballotDecls); + stageBuiltins[EShLangFragment] .append(fragmentBallotDecls); + + stageBuiltins[EShLangCompute].append( + "highp in uint gl_NumSubgroups;" + "highp in uint gl_SubgroupID;" + "\n"); + } + if (version >= 300 /* both ES and non-ES */) { stageBuiltins[EShLangFragment].append( "flat in highp uint gl_ViewID_OVR;" // GL_OVR_multiview, GL_OVR_multiview2 @@ -4059,8 +5821,11 @@ // In this function proper, enumerate the types, then calls the next set of functions // to enumerate all the uses for that type. // - +#ifdef AMD_EXTENSIONS + TBasicType bTypes[4] = { EbtFloat, EbtFloat16, EbtInt, EbtUint }; +#else TBasicType bTypes[3] = { EbtFloat, EbtInt, EbtUint }; +#endif bool skipBuffer = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 140); bool skipCubeArrayed = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 130); @@ -4100,12 +5865,20 @@ continue; if (ms && arrayed && profile == EEsProfile && version < 310) continue; +#ifdef AMD_EXTENSIONS + for (int bType = 0; bType < 4; ++bType) { // float, float16, int, uint results + if (shadow && bType > 1) + continue; + + if (bTypes[bType] == EbtFloat16 && (profile == EEsProfile ||version < 450)) + continue; +#else for (int bType = 0; bType < 3; ++bType) { // float, int, uint results if (shadow && bType > 0) continue; - +#endif if (dim == EsdRect && version < 140 && bType > 0) continue; @@ -4223,15 +5996,37 @@ // if (profile != EEsProfile && version >= 400 && ! sampler.image && sampler.dim != EsdRect && ! sampler.ms && sampler.dim != EsdBuffer) { - stageBuiltins[EShLangFragment].append("vec2 textureQueryLod("); - stageBuiltins[EShLangFragment].append(typeName); - if (dimMap[sampler.dim] == 1) - stageBuiltins[EShLangFragment].append(", float"); - else { - stageBuiltins[EShLangFragment].append(", vec"); - stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]); +#ifdef AMD_EXTENSIONS + for (int f16TexAddr = 0; f16TexAddr < 2; ++f16TexAddr) { + if (f16TexAddr && sampler.type != EbtFloat16) + continue; +#endif + stageBuiltins[EShLangFragment].append("vec2 textureQueryLod("); + stageBuiltins[EShLangFragment].append(typeName); + if (dimMap[sampler.dim] == 1) +#ifdef AMD_EXTENSIONS + if (f16TexAddr) + stageBuiltins[EShLangFragment].append(", float16_t"); + else + stageBuiltins[EShLangFragment].append(", float"); +#else + stageBuiltins[EShLangFragment].append(", float"); +#endif + else { +#ifdef AMD_EXTENSIONS + if (f16TexAddr) + stageBuiltins[EShLangFragment].append(", f16vec"); + else + stageBuiltins[EShLangFragment].append(", vec"); +#else + stageBuiltins[EShLangFragment].append(", vec"); +#endif + stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]); + } + stageBuiltins[EShLangFragment].append(");\n"); +#ifdef AMD_EXTENSIONS } - stageBuiltins[EShLangFragment].append(");\n"); +#endif } // @@ -4421,7 +6216,7 @@ if (bias && (lod || sampler.ms)) continue; - if (bias && sampler.dim == Esd2D && sampler.shadow && sampler.arrayed) + if (bias && (sampler.dim == Esd2D || sampler.dim == EsdCube) && sampler.shadow && sampler.arrayed) continue; if (bias && (sampler.dim == EsdRect || sampler.dim == EsdBuffer)) continue; @@ -4470,149 +6265,237 @@ continue; if (extraProj && (sampler.dim == Esd3D || sampler.shadow)) continue; +#ifdef AMD_EXTENSIONS + for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing - for (int lodClamp = 0; lodClamp <= 1 ;++lodClamp) { // loop over "bool" lod clamp - - if (lodClamp && (profile == EEsProfile || version < 450)) - continue; - if (lodClamp && (proj || lod || fetch)) + if (f16TexAddr && sampler.type != EbtFloat16) continue; + if (f16TexAddr && sampler.shadow && ! compare) { + compare = true; // compare argument is always present + totalDims--; + } +#endif + for (int lodClamp = 0; lodClamp <= 1 ;++lodClamp) { // loop over "bool" lod clamp - for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not - - if (sparse && (profile == EEsProfile || version < 450)) + if (lodClamp && (profile == EEsProfile || version < 450)) continue; - // Sparse sampling is not for 1D/1D array texture, buffer texture, and projective texture - if (sparse && (sampler.dim == Esd1D || sampler.dim == EsdBuffer || proj)) + if (lodClamp && (proj || lod || fetch)) continue; - TString s; + for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not - // return type - if (sparse) - s.append("int "); - else { - if (sampler.shadow) - s.append("float "); + if (sparse && (profile == EEsProfile || version < 450)) + continue; + // Sparse sampling is not for 1D/1D array texture, buffer texture, and projective texture + if (sparse && (sampler.dim == Esd1D || sampler.dim == EsdBuffer || proj)) + continue; + + TString s; + + // return type + if (sparse) + s.append("int "); else { - s.append(prefixes[sampler.type]); - s.append("vec4 "); + if (sampler.shadow) +#ifdef AMD_EXTENSIONS + if (sampler.type == EbtFloat16) + s.append("float16_t "); + else + s.append("float "); +#else + s.append("float "); +#endif + else { + s.append(prefixes[sampler.type]); + s.append("vec4 "); + } } - } - // name - if (sparse) { - if (fetch) - s.append("sparseTexel"); - else - s.append("sparseTexture"); - } else { - if (fetch) - s.append("texel"); - else - s.append("texture"); - } - if (proj) - s.append("Proj"); - if (lod) - s.append("Lod"); - if (grad) - s.append("Grad"); - if (fetch) - s.append("Fetch"); - if (offset) - s.append("Offset"); - if (lodClamp) - s.append("Clamp"); - if (lodClamp || sparse) - s.append("ARB"); - s.append("("); - - // sampler type - s.append(typeName); - - // P coordinate - if (extraProj) - s.append(",vec4"); - else { - s.append(","); - TBasicType t = fetch ? EbtInt : EbtFloat; - if (totalDims == 1) - s.append(TType::getBasicString(t)); + // name + if (sparse) { + if (fetch) + s.append("sparseTexel"); + else + s.append("sparseTexture"); + } else { - s.append(prefixes[t]); - s.append("vec"); - s.append(postfixes[totalDims]); + if (fetch) + s.append("texel"); + else + s.append("texture"); } - } - - if (bias && compare) - continue; + if (proj) + s.append("Proj"); + if (lod) + s.append("Lod"); + if (grad) + s.append("Grad"); + if (fetch) + s.append("Fetch"); + if (offset) + s.append("Offset"); + if (lodClamp) + s.append("Clamp"); + if (lodClamp || sparse) + s.append("ARB"); + s.append("("); - // non-optional lod argument (lod that's not driven by lod loop) or sample - if ((fetch && sampler.dim != EsdBuffer && sampler.dim != EsdRect && !sampler.ms) || - (sampler.ms && fetch)) - s.append(",int"); - - // non-optional lod - if (lod) - s.append(",float"); - - // gradient arguments - if (grad) { - if (dimMap[sampler.dim] == 1) - s.append(",float,float"); + // sampler type + s.append(typeName); +#ifdef AMD_EXTENSIONS + // P coordinate + if (extraProj) { + if (f16TexAddr) + s.append(",f16vec4"); + else + s.append(",vec4"); + } else { + s.append(","); + TBasicType t = fetch ? EbtInt : (f16TexAddr ? EbtFloat16 : EbtFloat); + if (totalDims == 1) + s.append(TType::getBasicString(t)); + else { + s.append(prefixes[t]); + s.append("vec"); + s.append(postfixes[totalDims]); + } + } +#else + // P coordinate + if (extraProj) + s.append(",vec4"); else { - s.append(",vec"); - s.append(postfixes[dimMap[sampler.dim]]); - s.append(",vec"); - s.append(postfixes[dimMap[sampler.dim]]); + s.append(","); + TBasicType t = fetch ? EbtInt : EbtFloat; + if (totalDims == 1) + s.append(TType::getBasicString(t)); + else { + s.append(prefixes[t]); + s.append("vec"); + s.append(postfixes[totalDims]); + } } - } - - // offset - if (offset) { - if (dimMap[sampler.dim] == 1) +#endif + // non-optional compare + if (compare) + s.append(",float"); + + // non-optional lod argument (lod that's not driven by lod loop) or sample + if ((fetch && sampler.dim != EsdBuffer && sampler.dim != EsdRect && !sampler.ms) || + (sampler.ms && fetch)) s.append(",int"); - else { - s.append(",ivec"); - s.append(postfixes[dimMap[sampler.dim]]); +#ifdef AMD_EXTENSIONS + // non-optional lod + if (lod) { + if (f16TexAddr) + s.append(",float16_t"); + else + s.append(",float"); } - } - // non-optional compare - if (compare) - s.append(",float"); - - // lod clamp - if (lodClamp) - s.append(",float"); - - // texel out (for sparse texture) - if (sparse) { - s.append(",out "); - if (sampler.shadow) - s.append("float "); - else { - s.append(prefixes[sampler.type]); - s.append("vec4 "); + // gradient arguments + if (grad) { + if (dimMap[sampler.dim] == 1) { + if (f16TexAddr) + s.append(",float16_t,float16_t"); + else + s.append(",float,float"); + } else { + if (f16TexAddr) + s.append(",f16vec"); + else + s.append(",vec"); + s.append(postfixes[dimMap[sampler.dim]]); + if (f16TexAddr) + s.append(",f16vec"); + else + s.append(",vec"); + s.append(postfixes[dimMap[sampler.dim]]); + } + } +#else + // non-optional lod + if (lod) + s.append(",float"); + + // gradient arguments + if (grad) { + if (dimMap[sampler.dim] == 1) + s.append(",float,float"); + else { + s.append(",vec"); + s.append(postfixes[dimMap[sampler.dim]]); + s.append(",vec"); + s.append(postfixes[dimMap[sampler.dim]]); + } + } +#endif + // offset + if (offset) { + if (dimMap[sampler.dim] == 1) + s.append(",int"); + else { + s.append(",ivec"); + s.append(postfixes[dimMap[sampler.dim]]); + } } - } - // optional bias - if (bias) - s.append(",float"); - - s.append(");\n"); - - // Add to the per-language set of built-ins - - if (bias || lodClamp) - stageBuiltins[EShLangFragment].append(s); - else - commonBuiltins.append(s); +#ifdef AMD_EXTENSIONS + // lod clamp + if (lodClamp) { + if (f16TexAddr) + s.append(",float16_t"); + else + s.append(",float"); + } +#else + // lod clamp + if (lodClamp) + s.append(",float"); +#endif + // texel out (for sparse texture) + if (sparse) { + s.append(",out "); + if (sampler.shadow) +#ifdef AMD_EXTENSIONS + if (sampler.type == EbtFloat16) + s.append("float16_t"); + else + s.append("float"); +#else + s.append("float"); +#endif + else { + s.append(prefixes[sampler.type]); + s.append("vec4"); + } + } +#ifdef AMD_EXTENSIONS + // optional bias + if (bias) { + if (f16TexAddr) + s.append(",float16_t"); + else + s.append(",float"); + } +#else + // optional bias + if (bias) + s.append(",float"); +#endif + s.append(");\n"); + + // Add to the per-language set of built-ins + if (bias || lodClamp) + stageBuiltins[EShLangFragment].append(s); + else + commonBuiltins.append(s); + + } } +#ifdef AMD_EXTENSIONS } +#endif } } } @@ -4645,81 +6528,96 @@ if (version < 140 && sampler.dim == EsdRect && sampler.type != EbtFloat) return; - for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name: none, Offset, and Offsets +#ifdef AMD_EXTENSIONS + for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing - for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument + if (f16TexAddr && sampler.type != EbtFloat16) + continue; +#endif + for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name: none, Offset, and Offsets - if (comp > 0 && sampler.shadow) - continue; + for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument - if (offset > 0 && sampler.dim == EsdCube) - continue; + if (comp > 0 && sampler.shadow) + continue; - for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not - if (sparse && (profile == EEsProfile || version < 450)) + if (offset > 0 && sampler.dim == EsdCube) continue; - TString s; + for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not + if (sparse && (profile == EEsProfile || version < 450)) + continue; - // return type - if (sparse) - s.append("int "); - else { - s.append(prefixes[sampler.type]); - s.append("vec4 "); - } + TString s; - // name - if (sparse) - s.append("sparseTextureGather"); - else - s.append("textureGather"); - switch (offset) { - case 1: - s.append("Offset"); - break; - case 2: - s.append("Offsets"); - default: - break; - } + // return type + if (sparse) + s.append("int "); + else { + s.append(prefixes[sampler.type]); + s.append("vec4 "); + } - if (sparse) - s.append("ARB"); - s.append("("); - - // sampler type argument - s.append(typeName); - - // P coordinate argument - s.append(",vec"); - int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0); - s.append(postfixes[totalDims]); - - // refZ argument - if (sampler.shadow) - s.append(",float"); - - // offset argument - if (offset > 0) { - s.append(",ivec2"); - if (offset == 2) - s.append("[4]"); - } + // name + if (sparse) + s.append("sparseTextureGather"); + else + s.append("textureGather"); + switch (offset) { + case 1: + s.append("Offset"); + break; + case 2: + s.append("Offsets"); + default: + break; + } + if (sparse) + s.append("ARB"); + s.append("("); - // texel out (for sparse texture) - if (sparse) { - s.append(",out "); - s.append(prefixes[sampler.type]); - s.append("vec4 "); - } + // sampler type argument + s.append(typeName); + + // P coordinate argument +#ifdef AMD_EXTENSIONS + if (f16TexAddr) + s.append(",f16vec"); + else + s.append(",vec"); +#else + s.append(",vec"); +#endif + int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0); + s.append(postfixes[totalDims]); + + // refZ argument + if (sampler.shadow) + s.append(",float"); + + // offset argument + if (offset > 0) { + s.append(",ivec2"); + if (offset == 2) + s.append("[4]"); + } + + // texel out (for sparse texture) + if (sparse) { + s.append(",out "); + s.append(prefixes[sampler.type]); + s.append("vec4 "); + } - // comp argument - if (comp) - s.append(",int"); + // comp argument + if (comp) + s.append(",int"); - s.append(");\n"); - commonBuiltins.append(s); + s.append(");\n"); + commonBuiltins.append(s); +#ifdef AMD_EXTENSIONS + } +#endif } } } @@ -4738,95 +6636,112 @@ if ((lod && bias) || (lod == 0 && bias == 0)) continue; - for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name: none, Offset, and Offsets + for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing - for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument + if (f16TexAddr && sampler.type != EbtFloat16) + continue; - if (comp == 0 && bias) - continue; + for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name: none, Offset, and Offsets - if (offset > 0 && sampler.dim == EsdCube) - continue; + for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument - for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not - if (sparse && (profile == EEsProfile || version < 450)) + if (comp == 0 && bias) continue; - TString s; + if (offset > 0 && sampler.dim == EsdCube) + continue; - // return type - if (sparse) - s.append("int "); - else { - s.append(prefixes[sampler.type]); - s.append("vec4 "); - } + for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not + if (sparse && (profile == EEsProfile || version < 450)) + continue; - // name - if (sparse) - s.append("sparseTextureGather"); - else - s.append("textureGather"); - - if (lod) - s.append("Lod"); - - switch (offset) { - case 1: - s.append("Offset"); - break; - case 2: - s.append("Offsets"); - default: - break; - } + TString s; - if (lod) - s.append("AMD"); - else if (sparse) - s.append("ARB"); + // return type + if (sparse) + s.append("int "); + else { + s.append(prefixes[sampler.type]); + s.append("vec4 "); + } - s.append("("); + // name + if (sparse) + s.append("sparseTextureGather"); + else + s.append("textureGather"); + + if (lod) + s.append("Lod"); + + switch (offset) { + case 1: + s.append("Offset"); + break; + case 2: + s.append("Offsets"); + default: + break; + } - // sampler type argument - s.append(typeName); + if (lod) + s.append("AMD"); + else if (sparse) + s.append("ARB"); + + s.append("("); + + // sampler type argument + s.append(typeName); + + // P coordinate argument + if (f16TexAddr) + s.append(",f16vec"); + else + s.append(",vec"); + int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0); + s.append(postfixes[totalDims]); + + // lod argument + if (lod) { + if (f16TexAddr) + s.append(",float16_t"); + else + s.append(",float"); + } - // P coordinate argument - s.append(",vec"); - int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0); - s.append(postfixes[totalDims]); + // offset argument + if (offset > 0) { + s.append(",ivec2"); + if (offset == 2) + s.append("[4]"); + } - // lod argument - if (lod) - s.append(",float"); - - // offset argument - if (offset > 0) { - s.append(",ivec2"); - if (offset == 2) - s.append("[4]"); - } + // texel out (for sparse texture) + if (sparse) { + s.append(",out "); + s.append(prefixes[sampler.type]); + s.append("vec4 "); + } - // texel out (for sparse texture) - if (sparse) { - s.append(",out "); - s.append(prefixes[sampler.type]); - s.append("vec4 "); - } + // comp argument + if (comp) + s.append(",int"); + + // bias argument + if (bias) { + if (f16TexAddr) + s.append(",float16_t"); + else + s.append(",float"); + } - // comp argument - if (comp) - s.append(",int"); - - // bias argument - if (bias) - s.append(",float"); - - s.append(");\n"); - if (bias) - stageBuiltins[EShLangFragment].append(s); - else - commonBuiltins.append(s); + s.append(");\n"); + if (bias) + stageBuiltins[EShLangFragment].append(s); + else + commonBuiltins.append(s); + } } } } @@ -5413,9 +7328,11 @@ BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan >= 100) + if (spvVersion.vulkan > 0) // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + else + BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); if (version >= 430) { symbolTable.setFunctionExtensions("anyInvocationARB", 1, &E_GL_ARB_shader_group_vote); @@ -5514,7 +7431,7 @@ SpecialQualifier("gl_InstanceID", EvqInstanceId, EbvInstanceId, symbolTable); } - if (spvVersion.vulkan >= 100) { + if (spvVersion.vulkan > 0) { BuiltInVariable("gl_VertexIndex", EbvVertexIndex, symbolTable); BuiltInVariable("gl_InstanceIndex", EbvInstanceIndex, symbolTable); } @@ -5654,6 +7571,25 @@ symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview); BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable); } + + // GL_KHR_shader_subgroup + if (spvVersion.vulkan > 0) { + symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic); + symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic); + symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setVariableExtensions("gl_SubgroupGeMask", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setVariableExtensions("gl_SubgroupGtMask", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setVariableExtensions("gl_SubgroupLeMask", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setVariableExtensions("gl_SubgroupLtMask", 1, &E_GL_KHR_shader_subgroup_ballot); + + BuiltInVariable("gl_SubgroupSize", EbvSubgroupSize2, symbolTable); + BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable); + BuiltInVariable("gl_SubgroupEqMask", EbvSubgroupEqMask2, symbolTable); + BuiltInVariable("gl_SubgroupGeMask", EbvSubgroupGeMask2, symbolTable); + BuiltInVariable("gl_SubgroupGtMask", EbvSubgroupGtMask2, symbolTable); + BuiltInVariable("gl_SubgroupLeMask", EbvSubgroupLeMask2, symbolTable); + BuiltInVariable("gl_SubgroupLtMask", EbvSubgroupLtMask2, symbolTable); + } break; @@ -5899,6 +7835,130 @@ BuiltInVariable("gl_ViewID_OVR", EbvViewIndex, symbolTable); } + // GL_ARB_shader_ballot + if (profile != EEsProfile) { + symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot); + symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot); + symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB", 1, &E_GL_ARB_shader_ballot); + symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB", 1, &E_GL_ARB_shader_ballot); + symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB", 1, &E_GL_ARB_shader_ballot); + symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB", 1, &E_GL_ARB_shader_ballot); + symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB", 1, &E_GL_ARB_shader_ballot); + + BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable); + BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable); + BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable); + BuiltInVariable("gl_SubGroupGtMaskARB", EbvSubGroupGtMask, symbolTable); + BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); + BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); + + if (spvVersion.vulkan > 0) + // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan + SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + else + BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); + } + + // GL_KHR_shader_subgroup + if (spvVersion.vulkan > 0) { + symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic); + symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic); + symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setVariableExtensions("gl_SubgroupGeMask", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setVariableExtensions("gl_SubgroupGtMask", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setVariableExtensions("gl_SubgroupLeMask", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setVariableExtensions("gl_SubgroupLtMask", 1, &E_GL_KHR_shader_subgroup_ballot); + + BuiltInVariable("gl_SubgroupSize", EbvSubgroupSize2, symbolTable); + BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable); + BuiltInVariable("gl_SubgroupEqMask", EbvSubgroupEqMask2, symbolTable); + BuiltInVariable("gl_SubgroupGeMask", EbvSubgroupGeMask2, symbolTable); + BuiltInVariable("gl_SubgroupGtMask", EbvSubgroupGtMask2, symbolTable); + BuiltInVariable("gl_SubgroupLeMask", EbvSubgroupLeMask2, symbolTable); + BuiltInVariable("gl_SubgroupLtMask", EbvSubgroupLtMask2, symbolTable); + + symbolTable.setFunctionExtensions("subgroupBarrier", 1, &E_GL_KHR_shader_subgroup_basic); + symbolTable.setFunctionExtensions("subgroupMemoryBarrier", 1, &E_GL_KHR_shader_subgroup_basic); + symbolTable.setFunctionExtensions("subgroupMemoryBarrierBuffer", 1, &E_GL_KHR_shader_subgroup_basic); + symbolTable.setFunctionExtensions("subgroupMemoryBarrierImage", 1, &E_GL_KHR_shader_subgroup_basic); + symbolTable.setFunctionExtensions("subgroupElect", 1, &E_GL_KHR_shader_subgroup_basic); + symbolTable.setFunctionExtensions("subgroupAll", 1, &E_GL_KHR_shader_subgroup_vote); + symbolTable.setFunctionExtensions("subgroupAny", 1, &E_GL_KHR_shader_subgroup_vote); + symbolTable.setFunctionExtensions("subgroupAllEqual", 1, &E_GL_KHR_shader_subgroup_vote); + symbolTable.setFunctionExtensions("subgroupBroadcast", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setFunctionExtensions("subgroupBroadcastFirst", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setFunctionExtensions("subgroupBallot", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setFunctionExtensions("subgroupInverseBallot", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setFunctionExtensions("subgroupBallotBitExtract", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setFunctionExtensions("subgroupBallotBitCount", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setFunctionExtensions("subgroupBallotInclusiveBitCount", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setFunctionExtensions("subgroupBallotExclusiveBitCount", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setFunctionExtensions("subgroupBallotFindLSB", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setFunctionExtensions("subgroupBallotFindMSB", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setFunctionExtensions("subgroupShuffle", 1, &E_GL_KHR_shader_subgroup_shuffle); + symbolTable.setFunctionExtensions("subgroupShuffleXor", 1, &E_GL_KHR_shader_subgroup_shuffle); + symbolTable.setFunctionExtensions("subgroupShuffleUp", 1, &E_GL_KHR_shader_subgroup_shuffle_relative); + symbolTable.setFunctionExtensions("subgroupShuffleDown", 1, &E_GL_KHR_shader_subgroup_shuffle_relative); + symbolTable.setFunctionExtensions("subgroupAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupMul", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupMin", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupMax", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupAnd", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupOr", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupXor", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupInclusiveAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupInclusiveMul", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupInclusiveMin", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupInclusiveMax", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupInclusiveAnd", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupInclusiveOr", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupInclusiveXor", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupExclusiveAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupExclusiveMul", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupExclusiveMin", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupExclusiveMax", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupExclusiveAnd", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupExclusiveOr", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupExclusiveXor", 1, &E_GL_KHR_shader_subgroup_arithmetic); + symbolTable.setFunctionExtensions("subgroupClusteredAdd", 1, &E_GL_KHR_shader_subgroup_clustered); + symbolTable.setFunctionExtensions("subgroupClusteredMul", 1, &E_GL_KHR_shader_subgroup_clustered); + symbolTable.setFunctionExtensions("subgroupClusteredMin", 1, &E_GL_KHR_shader_subgroup_clustered); + symbolTable.setFunctionExtensions("subgroupClusteredMax", 1, &E_GL_KHR_shader_subgroup_clustered); + symbolTable.setFunctionExtensions("subgroupClusteredAnd", 1, &E_GL_KHR_shader_subgroup_clustered); + symbolTable.setFunctionExtensions("subgroupClusteredOr", 1, &E_GL_KHR_shader_subgroup_clustered); + symbolTable.setFunctionExtensions("subgroupClusteredXor", 1, &E_GL_KHR_shader_subgroup_clustered); + symbolTable.setFunctionExtensions("subgroupQuadBroadcast", 1, &E_GL_KHR_shader_subgroup_quad); + symbolTable.setFunctionExtensions("subgroupQuadSwapHorizontal", 1, &E_GL_KHR_shader_subgroup_quad); + symbolTable.setFunctionExtensions("subgroupQuadSwapVertical", 1, &E_GL_KHR_shader_subgroup_quad); + symbolTable.setFunctionExtensions("subgroupQuadSwapDiagonal", 1, &E_GL_KHR_shader_subgroup_quad); + +#ifdef NV_EXTENSIONS + symbolTable.setFunctionExtensions("subgroupPartitionNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedAddNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedMulNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedMinNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedMaxNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedAndNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedOrNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedXorNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveAddNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveMulNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveMinNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveMaxNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveAndNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveOrNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveXorNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveAddNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveMulNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveMinNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveMaxNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveAndNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveOrNV", 1, &E_GL_NV_shader_subgroup_partitioned); + symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveXorNV", 1, &E_GL_NV_shader_subgroup_partitioned); +#endif + + } + if (profile == EEsProfile) { symbolTable.setFunctionExtensions("shadow2DEXT", 1, &E_GL_EXT_shadow_samplers); symbolTable.setFunctionExtensions("shadow2DProjEXT", 1, &E_GL_EXT_shadow_samplers); @@ -5937,6 +7997,49 @@ symbolTable.setFunctionExtensions("groupMemoryBarrier", 1, &E_GL_ARB_compute_shader); } + // GL_ARB_shader_ballot + if (profile != EEsProfile) { + symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot); + symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot); + symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB", 1, &E_GL_ARB_shader_ballot); + symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB", 1, &E_GL_ARB_shader_ballot); + symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB", 1, &E_GL_ARB_shader_ballot); + symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB", 1, &E_GL_ARB_shader_ballot); + symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB", 1, &E_GL_ARB_shader_ballot); + + BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable); + BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable); + BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable); + BuiltInVariable("gl_SubGroupGtMaskARB", EbvSubGroupGtMask, symbolTable); + BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); + BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); + + if (spvVersion.vulkan > 0) + // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan + SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + else + BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); + } + + // GL_ARB_shader_ballot + if (spvVersion.vulkan > 0) { + symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic); + symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic); + symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setVariableExtensions("gl_SubgroupGeMask", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setVariableExtensions("gl_SubgroupGtMask", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setVariableExtensions("gl_SubgroupLeMask", 1, &E_GL_KHR_shader_subgroup_ballot); + symbolTable.setVariableExtensions("gl_SubgroupLtMask", 1, &E_GL_KHR_shader_subgroup_ballot); + + BuiltInVariable("gl_SubgroupSize", EbvSubgroupSize2, symbolTable); + BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable); + BuiltInVariable("gl_SubgroupEqMask", EbvSubgroupEqMask2, symbolTable); + BuiltInVariable("gl_SubgroupGeMask", EbvSubgroupGeMask2, symbolTable); + BuiltInVariable("gl_SubgroupGtMask", EbvSubgroupGtMask2, symbolTable); + BuiltInVariable("gl_SubgroupLeMask", EbvSubgroupLeMask2, symbolTable); + BuiltInVariable("gl_SubgroupLtMask", EbvSubgroupLtMask2, symbolTable); + } + if ((profile != EEsProfile && version >= 140) || (profile == EEsProfile && version >= 310)) { symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group); @@ -5945,6 +8048,16 @@ BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable); } + // GL_KHR_shader_subgroup + if (spvVersion.vulkan > 0) { + symbolTable.setVariableExtensions("gl_NumSubgroups", 1, &E_GL_KHR_shader_subgroup_basic); + symbolTable.setVariableExtensions("gl_SubgroupID", 1, &E_GL_KHR_shader_subgroup_basic); + + BuiltInVariable("gl_NumSubgroups", EbvNumSubgroups, symbolTable); + BuiltInVariable("gl_SubgroupID", EbvSubgroupID, symbolTable); + + symbolTable.setFunctionExtensions("subgroupMemoryBarrierShared", 1, &E_GL_KHR_shader_subgroup_basic); + } break; default: @@ -6030,12 +8143,15 @@ symbolTable.relateToOperator("doubleBitsToUint64", EOpDoubleBitsToUint64); symbolTable.relateToOperator("int64BitsToDouble", EOpInt64BitsToDouble); symbolTable.relateToOperator("uint64BitsToDouble", EOpUint64BitsToDouble); -#ifdef AMD_EXTENSIONS + symbolTable.relateToOperator("halfBitsToInt16", EOpFloat16BitsToInt16); + symbolTable.relateToOperator("halfBitsToUint16", EOpFloat16BitsToUint16); symbolTable.relateToOperator("float16BitsToInt16", EOpFloat16BitsToInt16); symbolTable.relateToOperator("float16BitsToUint16", EOpFloat16BitsToUint16); symbolTable.relateToOperator("int16BitsToFloat16", EOpInt16BitsToFloat16); symbolTable.relateToOperator("uint16BitsToFloat16", EOpUint16BitsToFloat16); -#endif + + symbolTable.relateToOperator("int16BitsToHalf", EOpInt16BitsToFloat16); + symbolTable.relateToOperator("uint16BitsToHalf", EOpUint16BitsToFloat16); symbolTable.relateToOperator("packSnorm2x16", EOpPackSnorm2x16); symbolTable.relateToOperator("unpackSnorm2x16", EOpUnpackSnorm2x16); @@ -6058,7 +8174,6 @@ symbolTable.relateToOperator("packUint2x32", EOpPackUint2x32); symbolTable.relateToOperator("unpackUint2x32", EOpUnpackUint2x32); -#ifdef AMD_EXTENSIONS symbolTable.relateToOperator("packInt2x16", EOpPackInt2x16); symbolTable.relateToOperator("unpackInt2x16", EOpUnpackInt2x16); symbolTable.relateToOperator("packUint2x16", EOpPackUint2x16); @@ -6068,10 +8183,16 @@ symbolTable.relateToOperator("unpackInt4x16", EOpUnpackInt4x16); symbolTable.relateToOperator("packUint4x16", EOpPackUint4x16); symbolTable.relateToOperator("unpackUint4x16", EOpUnpackUint4x16); - symbolTable.relateToOperator("packFloat2x16", EOpPackFloat2x16); symbolTable.relateToOperator("unpackFloat2x16", EOpUnpackFloat2x16); -#endif + + symbolTable.relateToOperator("pack16", EOpPack16); + symbolTable.relateToOperator("pack32", EOpPack32); + symbolTable.relateToOperator("pack64", EOpPack64); + + symbolTable.relateToOperator("unpack32", EOpUnpack32); + symbolTable.relateToOperator("unpack16", EOpUnpack16); + symbolTable.relateToOperator("unpack8", EOpUnpack8); symbolTable.relateToOperator("length", EOpLength); symbolTable.relateToOperator("distance", EOpDistance); @@ -6315,6 +8436,90 @@ symbolTable.relateToOperator("fragmentFetchAMD", EOpFragmentFetch); #endif } + + // GL_KHR_shader_subgroup + if (spvVersion.vulkan > 0) { + symbolTable.relateToOperator("subgroupBarrier", EOpSubgroupBarrier); + symbolTable.relateToOperator("subgroupMemoryBarrier", EOpSubgroupMemoryBarrier); + symbolTable.relateToOperator("subgroupMemoryBarrierBuffer", EOpSubgroupMemoryBarrierBuffer); + symbolTable.relateToOperator("subgroupMemoryBarrierImage", EOpSubgroupMemoryBarrierImage); + symbolTable.relateToOperator("subgroupElect", EOpSubgroupElect); + symbolTable.relateToOperator("subgroupAll", EOpSubgroupAll); + symbolTable.relateToOperator("subgroupAny", EOpSubgroupAny); + symbolTable.relateToOperator("subgroupAllEqual", EOpSubgroupAllEqual); + symbolTable.relateToOperator("subgroupBroadcast", EOpSubgroupBroadcast); + symbolTable.relateToOperator("subgroupBroadcastFirst", EOpSubgroupBroadcastFirst); + symbolTable.relateToOperator("subgroupBallot", EOpSubgroupBallot); + symbolTable.relateToOperator("subgroupInverseBallot", EOpSubgroupInverseBallot); + symbolTable.relateToOperator("subgroupBallotBitExtract", EOpSubgroupBallotBitExtract); + symbolTable.relateToOperator("subgroupBallotBitCount", EOpSubgroupBallotBitCount); + symbolTable.relateToOperator("subgroupBallotInclusiveBitCount", EOpSubgroupBallotInclusiveBitCount); + symbolTable.relateToOperator("subgroupBallotExclusiveBitCount", EOpSubgroupBallotExclusiveBitCount); + symbolTable.relateToOperator("subgroupBallotFindLSB", EOpSubgroupBallotFindLSB); + symbolTable.relateToOperator("subgroupBallotFindMSB", EOpSubgroupBallotFindMSB); + symbolTable.relateToOperator("subgroupShuffle", EOpSubgroupShuffle); + symbolTable.relateToOperator("subgroupShuffleXor", EOpSubgroupShuffleXor); + symbolTable.relateToOperator("subgroupShuffleUp", EOpSubgroupShuffleUp); + symbolTable.relateToOperator("subgroupShuffleDown", EOpSubgroupShuffleDown); + symbolTable.relateToOperator("subgroupAdd", EOpSubgroupAdd); + symbolTable.relateToOperator("subgroupMul", EOpSubgroupMul); + symbolTable.relateToOperator("subgroupMin", EOpSubgroupMin); + symbolTable.relateToOperator("subgroupMax", EOpSubgroupMax); + symbolTable.relateToOperator("subgroupAnd", EOpSubgroupAnd); + symbolTable.relateToOperator("subgroupOr", EOpSubgroupOr); + symbolTable.relateToOperator("subgroupXor", EOpSubgroupXor); + symbolTable.relateToOperator("subgroupInclusiveAdd", EOpSubgroupInclusiveAdd); + symbolTable.relateToOperator("subgroupInclusiveMul", EOpSubgroupInclusiveMul); + symbolTable.relateToOperator("subgroupInclusiveMin", EOpSubgroupInclusiveMin); + symbolTable.relateToOperator("subgroupInclusiveMax", EOpSubgroupInclusiveMax); + symbolTable.relateToOperator("subgroupInclusiveAnd", EOpSubgroupInclusiveAnd); + symbolTable.relateToOperator("subgroupInclusiveOr", EOpSubgroupInclusiveOr); + symbolTable.relateToOperator("subgroupInclusiveXor", EOpSubgroupInclusiveXor); + symbolTable.relateToOperator("subgroupExclusiveAdd", EOpSubgroupExclusiveAdd); + symbolTable.relateToOperator("subgroupExclusiveMul", EOpSubgroupExclusiveMul); + symbolTable.relateToOperator("subgroupExclusiveMin", EOpSubgroupExclusiveMin); + symbolTable.relateToOperator("subgroupExclusiveMax", EOpSubgroupExclusiveMax); + symbolTable.relateToOperator("subgroupExclusiveAnd", EOpSubgroupExclusiveAnd); + symbolTable.relateToOperator("subgroupExclusiveOr", EOpSubgroupExclusiveOr); + symbolTable.relateToOperator("subgroupExclusiveXor", EOpSubgroupExclusiveXor); + symbolTable.relateToOperator("subgroupClusteredAdd", EOpSubgroupClusteredAdd); + symbolTable.relateToOperator("subgroupClusteredMul", EOpSubgroupClusteredMul); + symbolTable.relateToOperator("subgroupClusteredMin", EOpSubgroupClusteredMin); + symbolTable.relateToOperator("subgroupClusteredMax", EOpSubgroupClusteredMax); + symbolTable.relateToOperator("subgroupClusteredAnd", EOpSubgroupClusteredAnd); + symbolTable.relateToOperator("subgroupClusteredOr", EOpSubgroupClusteredOr); + symbolTable.relateToOperator("subgroupClusteredXor", EOpSubgroupClusteredXor); + symbolTable.relateToOperator("subgroupQuadBroadcast", EOpSubgroupQuadBroadcast); + symbolTable.relateToOperator("subgroupQuadSwapHorizontal", EOpSubgroupQuadSwapHorizontal); + symbolTable.relateToOperator("subgroupQuadSwapVertical", EOpSubgroupQuadSwapVertical); + symbolTable.relateToOperator("subgroupQuadSwapDiagonal", EOpSubgroupQuadSwapDiagonal); + +#ifdef NV_EXTENSIONS + symbolTable.relateToOperator("subgroupPartitionNV", EOpSubgroupPartition); + symbolTable.relateToOperator("subgroupPartitionedAddNV", EOpSubgroupPartitionedAdd); + symbolTable.relateToOperator("subgroupPartitionedMulNV", EOpSubgroupPartitionedMul); + symbolTable.relateToOperator("subgroupPartitionedMinNV", EOpSubgroupPartitionedMin); + symbolTable.relateToOperator("subgroupPartitionedMaxNV", EOpSubgroupPartitionedMax); + symbolTable.relateToOperator("subgroupPartitionedAndNV", EOpSubgroupPartitionedAnd); + symbolTable.relateToOperator("subgroupPartitionedOrNV", EOpSubgroupPartitionedOr); + symbolTable.relateToOperator("subgroupPartitionedXorNV", EOpSubgroupPartitionedXor); + symbolTable.relateToOperator("subgroupPartitionedInclusiveAddNV", EOpSubgroupPartitionedInclusiveAdd); + symbolTable.relateToOperator("subgroupPartitionedInclusiveMulNV", EOpSubgroupPartitionedInclusiveMul); + symbolTable.relateToOperator("subgroupPartitionedInclusiveMinNV", EOpSubgroupPartitionedInclusiveMin); + symbolTable.relateToOperator("subgroupPartitionedInclusiveMaxNV", EOpSubgroupPartitionedInclusiveMax); + symbolTable.relateToOperator("subgroupPartitionedInclusiveAndNV", EOpSubgroupPartitionedInclusiveAnd); + symbolTable.relateToOperator("subgroupPartitionedInclusiveOrNV", EOpSubgroupPartitionedInclusiveOr); + symbolTable.relateToOperator("subgroupPartitionedInclusiveXorNV", EOpSubgroupPartitionedInclusiveXor); + symbolTable.relateToOperator("subgroupPartitionedExclusiveAddNV", EOpSubgroupPartitionedExclusiveAdd); + symbolTable.relateToOperator("subgroupPartitionedExclusiveMulNV", EOpSubgroupPartitionedExclusiveMul); + symbolTable.relateToOperator("subgroupPartitionedExclusiveMinNV", EOpSubgroupPartitionedExclusiveMin); + symbolTable.relateToOperator("subgroupPartitionedExclusiveMaxNV", EOpSubgroupPartitionedExclusiveMax); + symbolTable.relateToOperator("subgroupPartitionedExclusiveAndNV", EOpSubgroupPartitionedExclusiveAnd); + symbolTable.relateToOperator("subgroupPartitionedExclusiveOrNV", EOpSubgroupPartitionedExclusiveOr); + symbolTable.relateToOperator("subgroupPartitionedExclusiveXorNV", EOpSubgroupPartitionedExclusiveXor); +#endif + } + if (profile == EEsProfile) { symbolTable.relateToOperator("shadow2DEXT", EOpTexture); symbolTable.relateToOperator("shadow2DProjEXT", EOpTextureProj); @@ -6355,12 +8560,13 @@ #ifdef AMD_EXTENSIONS if (profile != EEsProfile) symbolTable.relateToOperator("interpolateAtVertexAMD", EOpInterpolateAtVertex); - break; #endif + break; case EShLangCompute: - symbolTable.relateToOperator("memoryBarrierShared", EOpMemoryBarrierShared); - symbolTable.relateToOperator("groupMemoryBarrier", EOpGroupMemoryBarrier); + symbolTable.relateToOperator("memoryBarrierShared", EOpMemoryBarrierShared); + symbolTable.relateToOperator("groupMemoryBarrier", EOpGroupMemoryBarrier); + symbolTable.relateToOperator("subgroupMemoryBarrierShared", EOpSubgroupMemoryBarrierShared); break; default: @@ -6396,9 +8602,9 @@ if (version == 100 || IncludeLegacy(version, profile, spvVersion) || (! ForwardCompatibility && profile != EEsProfile && version < 420)) { TPrecisionQualifier pq = profile == EEsProfile ? EpqMedium : EpqNone; TType fragData(EbtFloat, EvqFragColor, pq, 4); - TArraySizes& arraySizes = *new TArraySizes; - arraySizes.addInnerSize(resources.maxDrawBuffers); - fragData.newArraySizes(arraySizes); + TArraySizes* arraySizes = new TArraySizes; + arraySizes->addInnerSize(resources.maxDrawBuffers); + fragData.transferArraySizes(arraySizes); symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData"), fragData)); SpecialQualifier("gl_FragData", EvqFragColor, EbvFragData, symbolTable); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Initialize.h vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Initialize.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Initialize.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Initialize.h 2018-04-27 11:46:26.000000000 +0000 @@ -67,7 +67,6 @@ virtual const TString& getStageString(EShLanguage language) const { return stageBuiltins[language]; } virtual void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable) = 0; - virtual void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources) = 0; protected: @@ -89,7 +88,6 @@ void initialize(const TBuiltInResource& resources, int version, EProfile, const SpvVersion& spvVersion, EShLanguage); void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable); - void identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources); protected: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Intermediate.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Intermediate.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Intermediate.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Intermediate.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -2,6 +2,7 @@ // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2015 LunarG, Inc. // Copyright (C) 2015-2016 Google, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -46,6 +47,7 @@ #include #include +#include namespace glslang { @@ -118,16 +120,12 @@ return nullptr; // Try converting the children's base types to compatible types. - TIntermTyped* child = addConversion(op, left->getType(), right); - if (child) - right = child; - else { - child = addConversion(op, right->getType(), left); - if (child) - left = child; - else - return nullptr; - } + auto children = addConversion(op, left, right); + left = std::get<0>(children); + right = std::get<1>(children); + + if (left == nullptr || right == nullptr) + return nullptr; // Convert the children's type shape to be compatible. addBiShapeConversion(op, left, right); @@ -161,6 +159,11 @@ if (specConstantPropagates(*node->getLeft(), *node->getRight()) && isSpecializationOperation(*node)) node->getWritableType().getQualifier().makeSpecConstant(); + // If must propagate nonuniform, make a nonuniform. + if ((node->getLeft()->getQualifier().nonUniform || node->getRight()->getQualifier().nonUniform) && + isNonuniformPropagating(node->getOp())) + node->getWritableType().getQualifier().nonUniform = true; + return node; } @@ -304,20 +307,18 @@ // TBasicType newType = EbtVoid; switch (op) { + case EOpConstructInt8: newType = EbtInt8; break; + case EOpConstructUint8: newType = EbtUint8; break; + case EOpConstructInt16: newType = EbtInt16; break; + case EOpConstructUint16: newType = EbtUint16; break; case EOpConstructInt: newType = EbtInt; break; case EOpConstructUint: newType = EbtUint; break; case EOpConstructInt64: newType = EbtInt64; break; case EOpConstructUint64: newType = EbtUint64; break; -#ifdef AMD_EXTENSIONS - case EOpConstructInt16: newType = EbtInt16; break; - case EOpConstructUint16: newType = EbtUint16; break; -#endif case EOpConstructBool: newType = EbtBool; break; case EOpConstructFloat: newType = EbtFloat; break; case EOpConstructDouble: newType = EbtDouble; break; -#ifdef AMD_EXTENSIONS case EOpConstructFloat16: newType = EbtFloat16; break; -#endif default: break; // some compilers want this } @@ -336,20 +337,18 @@ // TODO: but, did this bypass constant folding? // switch (op) { + case EOpConstructInt8: + case EOpConstructUint8: + case EOpConstructInt16: + case EOpConstructUint16: case EOpConstructInt: case EOpConstructUint: case EOpConstructInt64: case EOpConstructUint64: -#ifdef AMD_EXTENSIONS - case EOpConstructInt16: - case EOpConstructUint16: -#endif case EOpConstructBool: case EOpConstructFloat: case EOpConstructDouble: -#ifdef AMD_EXTENSIONS case EOpConstructFloat16: -#endif return child; default: break; // some compilers want this } @@ -373,10 +372,15 @@ if (node->getOperand()->getType().getQualifier().isSpecConstant() && isSpecializationOperation(*node)) node->getWritableType().getQualifier().makeSpecConstant(); + // If must propagate nonuniform, make a nonuniform. + if (node->getOperand()->getQualifier().nonUniform && isNonuniformPropagating(node->getOp())) + node->getWritableType().getQualifier().nonUniform = true; + return node; } -TIntermTyped* TIntermediate::addBuiltInFunctionCall(const TSourceLoc& loc, TOperator op, bool unary, TIntermNode* childNode, const TType& returnType) +TIntermTyped* TIntermediate::addBuiltInFunctionCall(const TSourceLoc& loc, TOperator op, bool unary, + TIntermNode* childNode, const TType& returnType) { if (unary) { // @@ -420,7 +424,7 @@ // // Make sure we have an aggregate. If not turn it into one. // - if (node) { + if (node != nullptr) { aggNode = node->getAsAggregate(); if (aggNode == nullptr || aggNode->getOp() != EOpNull) { // @@ -446,27 +450,14 @@ return fold(aggNode); } -// -// Convert the node's type to the given type, as allowed by the operation involved: 'op'. -// For implicit conversions, 'op' is not the requested conversion, it is the explicit -// operation requiring the implicit conversion. -// -// Returns a node representing the conversion, which could be the same -// node passed in if no conversion was needed. -// -// Generally, this is focused on basic type conversion, not shape conversion. -// See addShapeConversion(). -// -// Return nullptr if a conversion can't be done. -// -TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TIntermTyped* node) const +bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const { // // Does the base type even allow the operation? // switch (node->getBasicType()) { case EbtVoid: - return nullptr; + return false; case EbtAtomicUint: case EbtSampler: // opaque types can be passed to functions @@ -484,188 +475,19 @@ break; // otherwise, opaque types can't even be operated on, let alone converted - return nullptr; + return false; default: break; } - // Otherwise, if types are identical, no problem - if (type == node->getType()) - return node; - - // If one's a structure, then no conversions. - if (type.isStruct() || node->isStruct()) - return nullptr; - - // If one's an array, then no conversions. - if (type.isArray() || node->getType().isArray()) - return nullptr; - - // Note: callers are responsible for other aspects of shape, - // like vector and matrix sizes. - - TBasicType promoteTo; - - switch (op) { - // - // Explicit conversions (unary operations) - // - case EOpConstructBool: - promoteTo = EbtBool; - break; - case EOpConstructFloat: - promoteTo = EbtFloat; - break; - case EOpConstructDouble: - promoteTo = EbtDouble; - break; -#ifdef AMD_EXTENSIONS - case EOpConstructFloat16: - promoteTo = EbtFloat16; - break; -#endif - case EOpConstructInt: - promoteTo = EbtInt; - break; - case EOpConstructUint: - promoteTo = EbtUint; - break; - case EOpConstructInt64: - promoteTo = EbtInt64; - break; - case EOpConstructUint64: - promoteTo = EbtUint64; - break; -#ifdef AMD_EXTENSIONS - case EOpConstructInt16: - promoteTo = EbtInt16; - break; - case EOpConstructUint16: - promoteTo = EbtUint16; - break; -#endif - - // - // List all the binary ops that can implicitly convert one operand to the other's type; - // This implements the 'policy' for implicit type conversion. - // - case EOpLessThan: - case EOpGreaterThan: - case EOpLessThanEqual: - case EOpGreaterThanEqual: - case EOpEqual: - case EOpNotEqual: - - case EOpAdd: - case EOpSub: - case EOpMul: - case EOpDiv: - case EOpMod: - - case EOpVectorTimesScalar: - case EOpVectorTimesMatrix: - case EOpMatrixTimesVector: - case EOpMatrixTimesScalar: - - case EOpAnd: - case EOpInclusiveOr: - case EOpExclusiveOr: - case EOpAndAssign: - case EOpInclusiveOrAssign: - case EOpExclusiveOrAssign: - case EOpLogicalNot: - case EOpLogicalAnd: - case EOpLogicalOr: - case EOpLogicalXor: - - case EOpFunctionCall: - case EOpReturn: - case EOpAssign: - case EOpAddAssign: - case EOpSubAssign: - case EOpMulAssign: - case EOpVectorTimesScalarAssign: - case EOpMatrixTimesScalarAssign: - case EOpDivAssign: - case EOpModAssign: - - case EOpAtan: - case EOpClamp: - case EOpCross: - case EOpDistance: - case EOpDot: - case EOpDst: - case EOpFaceForward: - case EOpFma: - case EOpFrexp: - case EOpLdexp: - case EOpMix: - case EOpLit: - case EOpMax: - case EOpMin: - case EOpModf: - case EOpPow: - case EOpReflect: - case EOpRefract: - case EOpSmoothStep: - case EOpStep: - - case EOpSequence: - case EOpConstructStruct: - - if (type.getBasicType() == node->getType().getBasicType()) - return node; - - if (canImplicitlyPromote(node->getType().getBasicType(), type.getBasicType(), op)) - promoteTo = type.getBasicType(); - else - return nullptr; - - break; - - // Shifts can have mixed types as long as they are integer, without converting. - // It's the left operand's type that determines the resulting type, so no issue - // with assign shift ops either. - case EOpLeftShift: - case EOpRightShift: - case EOpLeftShiftAssign: - case EOpRightShiftAssign: - if ((type.getBasicType() == EbtInt || - type.getBasicType() == EbtUint || -#ifdef AMD_EXTENSIONS - type.getBasicType() == EbtInt16 || - type.getBasicType() == EbtUint16 || -#endif - type.getBasicType() == EbtInt64 || - type.getBasicType() == EbtUint64) && - (node->getType().getBasicType() == EbtInt || - node->getType().getBasicType() == EbtUint || -#ifdef AMD_EXTENSIONS - node->getType().getBasicType() == EbtInt16 || - node->getType().getBasicType() == EbtUint16 || -#endif - node->getType().getBasicType() == EbtInt64 || - node->getType().getBasicType() == EbtUint64)) - - return node; - else if (source == EShSourceHlsl && node->getType().getBasicType() == EbtBool) { - promoteTo = type.getBasicType(); - break; - } else - return nullptr; - - default: - // default is to require a match; all exceptions should have case statements above - - if (type.getBasicType() == node->getType().getBasicType()) - return node; - else - return nullptr; - } - - if (node->getAsConstantUnion()) - return promoteConstantUnion(promoteTo, node->getAsConstantUnion()); + return true; +} +// This is 'mechanism' here, it does any conversion told. +// It is about basic type, not about shape. +// The policy comes from the shader or the calling code. +TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped* node) const +{ // // Add a new newNode for the conversion. // @@ -673,50 +495,47 @@ TOperator newOp = EOpNull; - // This is 'mechanism' here, it does any conversion told. The policy comes - // from the shader or the above code. - switch (promoteTo) { + switch (convertTo) { case EbtDouble: switch (node->getBasicType()) { - case EbtInt: newOp = EOpConvIntToDouble; break; - case EbtUint: newOp = EOpConvUintToDouble; break; - case EbtBool: newOp = EOpConvBoolToDouble; break; - case EbtFloat: newOp = EOpConvFloatToDouble; break; -#ifdef AMD_EXTENSIONS + case EbtInt8: newOp = EOpConvInt8ToDouble; break; + case EbtUint8: newOp = EOpConvUint8ToDouble; break; + case EbtInt16: newOp = EOpConvInt16ToDouble; break; + case EbtUint16: newOp = EOpConvUint16ToDouble; break; + case EbtInt: newOp = EOpConvIntToDouble; break; + case EbtUint: newOp = EOpConvUintToDouble; break; + case EbtBool: newOp = EOpConvBoolToDouble; break; + case EbtFloat: newOp = EOpConvFloatToDouble; break; case EbtFloat16: newOp = EOpConvFloat16ToDouble; break; -#endif - case EbtInt64: newOp = EOpConvInt64ToDouble; break; - case EbtUint64: newOp = EOpConvUint64ToDouble; break; -#ifdef AMD_EXTENSIONS - case EbtInt16: newOp = EOpConvInt16ToDouble; break; - case EbtUint16: newOp = EOpConvUint16ToDouble; break; -#endif + case EbtInt64: newOp = EOpConvInt64ToDouble; break; + case EbtUint64: newOp = EOpConvUint64ToDouble; break; default: return nullptr; } break; case EbtFloat: switch (node->getBasicType()) { - case EbtInt: newOp = EOpConvIntToFloat; break; - case EbtUint: newOp = EOpConvUintToFloat; break; - case EbtBool: newOp = EOpConvBoolToFloat; break; - case EbtDouble: newOp = EOpConvDoubleToFloat; break; -#ifdef AMD_EXTENSIONS + case EbtInt8: newOp = EOpConvInt8ToFloat; break; + case EbtUint8: newOp = EOpConvUint8ToFloat; break; + case EbtInt16: newOp = EOpConvInt16ToFloat; break; + case EbtUint16: newOp = EOpConvUint16ToFloat; break; + case EbtInt: newOp = EOpConvIntToFloat; break; + case EbtUint: newOp = EOpConvUintToFloat; break; + case EbtBool: newOp = EOpConvBoolToFloat; break; + case EbtDouble: newOp = EOpConvDoubleToFloat; break; case EbtFloat16: newOp = EOpConvFloat16ToFloat; break; -#endif - case EbtInt64: newOp = EOpConvInt64ToFloat; break; - case EbtUint64: newOp = EOpConvUint64ToFloat; break; -#ifdef AMD_EXTENSIONS - case EbtInt16: newOp = EOpConvInt16ToFloat; break; - case EbtUint16: newOp = EOpConvUint16ToFloat; break; -#endif + case EbtInt64: newOp = EOpConvInt64ToFloat; break; + case EbtUint64: newOp = EOpConvUint64ToFloat; break; default: return nullptr; } break; -#ifdef AMD_EXTENSIONS case EbtFloat16: switch (node->getBasicType()) { + case EbtInt8: newOp = EOpConvInt8ToFloat16; break; + case EbtUint8: newOp = EOpConvUint8ToFloat16; break; + case EbtInt16: newOp = EOpConvInt16ToFloat16; break; + case EbtUint16: newOp = EOpConvUint16ToFloat16; break; case EbtInt: newOp = EOpConvIntToFloat16; break; case EbtUint: newOp = EOpConvUintToFloat16; break; case EbtBool: newOp = EOpConvBoolToFloat16; break; @@ -724,145 +543,170 @@ case EbtDouble: newOp = EOpConvDoubleToFloat16; break; case EbtInt64: newOp = EOpConvInt64ToFloat16; break; case EbtUint64: newOp = EOpConvUint64ToFloat16; break; - case EbtInt16: newOp = EOpConvInt16ToFloat16; break; - case EbtUint16: newOp = EOpConvUint16ToFloat16; break; default: return nullptr; } break; -#endif case EbtBool: switch (node->getBasicType()) { - case EbtInt: newOp = EOpConvIntToBool; break; - case EbtUint: newOp = EOpConvUintToBool; break; - case EbtFloat: newOp = EOpConvFloatToBool; break; - case EbtDouble: newOp = EOpConvDoubleToBool; break; -#ifdef AMD_EXTENSIONS + case EbtInt8: newOp = EOpConvInt8ToBool; break; + case EbtUint8: newOp = EOpConvUint8ToBool; break; + case EbtInt16: newOp = EOpConvInt16ToBool; break; + case EbtUint16: newOp = EOpConvUint16ToBool; break; + case EbtInt: newOp = EOpConvIntToBool; break; + case EbtUint: newOp = EOpConvUintToBool; break; + case EbtFloat: newOp = EOpConvFloatToBool; break; + case EbtDouble: newOp = EOpConvDoubleToBool; break; case EbtFloat16: newOp = EOpConvFloat16ToBool; break; -#endif - case EbtInt64: newOp = EOpConvInt64ToBool; break; - case EbtUint64: newOp = EOpConvUint64ToBool; break; -#ifdef AMD_EXTENSIONS - case EbtInt16: newOp = EOpConvInt16ToBool; break; - case EbtUint16: newOp = EOpConvUint16ToBool; break; -#endif - default: - return nullptr; - } - break; - case EbtInt: - switch (node->getBasicType()) { - case EbtUint: newOp = EOpConvUintToInt; break; - case EbtBool: newOp = EOpConvBoolToInt; break; - case EbtFloat: newOp = EOpConvFloatToInt; break; - case EbtDouble: newOp = EOpConvDoubleToInt; break; -#ifdef AMD_EXTENSIONS - case EbtFloat16: newOp = EOpConvFloat16ToInt; break; -#endif - case EbtInt64: newOp = EOpConvInt64ToInt; break; - case EbtUint64: newOp = EOpConvUint64ToInt; break; -#ifdef AMD_EXTENSIONS - case EbtInt16: newOp = EOpConvInt16ToInt; break; - case EbtUint16: newOp = EOpConvUint16ToInt; break; -#endif - default: - return nullptr; - } - break; - case EbtUint: - switch (node->getBasicType()) { - case EbtInt: newOp = EOpConvIntToUint; break; - case EbtBool: newOp = EOpConvBoolToUint; break; - case EbtFloat: newOp = EOpConvFloatToUint; break; - case EbtDouble: newOp = EOpConvDoubleToUint; break; -#ifdef AMD_EXTENSIONS - case EbtFloat16: newOp = EOpConvFloat16ToUint; break; -#endif - case EbtInt64: newOp = EOpConvInt64ToUint; break; - case EbtUint64: newOp = EOpConvUint64ToUint; break; -#ifdef AMD_EXTENSIONS - case EbtInt16: newOp = EOpConvInt16ToUint; break; - case EbtUint16: newOp = EOpConvUint16ToUint; break; -#endif + case EbtInt64: newOp = EOpConvInt64ToBool; break; + case EbtUint64: newOp = EOpConvUint64ToBool; break; default: return nullptr; } break; - case EbtInt64: + case EbtInt8: switch (node->getBasicType()) { - case EbtInt: newOp = EOpConvIntToInt64; break; - case EbtUint: newOp = EOpConvUintToInt64; break; - case EbtBool: newOp = EOpConvBoolToInt64; break; - case EbtFloat: newOp = EOpConvFloatToInt64; break; - case EbtDouble: newOp = EOpConvDoubleToInt64; break; -#ifdef AMD_EXTENSIONS - case EbtFloat16: newOp = EOpConvFloat16ToInt64; break; -#endif - case EbtUint64: newOp = EOpConvUint64ToInt64; break; -#ifdef AMD_EXTENSIONS - case EbtInt16: newOp = EOpConvInt16ToInt64; break; - case EbtUint16: newOp = EOpConvUint16ToInt64; break; -#endif + case EbtUint8: newOp = EOpConvUint8ToInt8; break; + case EbtInt16: newOp = EOpConvInt16ToInt8; break; + case EbtUint16: newOp = EOpConvUint16ToInt8; break; + case EbtInt: newOp = EOpConvIntToInt8; break; + case EbtUint: newOp = EOpConvUintToInt8; break; + case EbtInt64: newOp = EOpConvInt64ToInt8; break; + case EbtUint64: newOp = EOpConvUint64ToInt8; break; + case EbtBool: newOp = EOpConvBoolToInt8; break; + case EbtFloat: newOp = EOpConvFloatToInt8; break; + case EbtDouble: newOp = EOpConvDoubleToInt8; break; + case EbtFloat16: newOp = EOpConvFloat16ToInt8; break; default: return nullptr; } break; - case EbtUint64: + case EbtUint8: switch (node->getBasicType()) { - case EbtInt: newOp = EOpConvIntToUint64; break; - case EbtUint: newOp = EOpConvUintToUint64; break; - case EbtBool: newOp = EOpConvBoolToUint64; break; - case EbtFloat: newOp = EOpConvFloatToUint64; break; - case EbtDouble: newOp = EOpConvDoubleToUint64; break; -#ifdef AMD_EXTENSIONS - case EbtFloat16: newOp = EOpConvFloat16ToUint64; break; -#endif - case EbtInt64: newOp = EOpConvInt64ToUint64; break; -#ifdef AMD_EXTENSIONS - case EbtInt16: newOp = EOpConvInt16ToUint64; break; - case EbtUint16: newOp = EOpConvUint16ToUint64; break; -#endif + case EbtInt8: newOp = EOpConvInt8ToUint8; break; + case EbtInt16: newOp = EOpConvInt16ToUint8; break; + case EbtUint16: newOp = EOpConvUint16ToUint8; break; + case EbtInt: newOp = EOpConvIntToUint8; break; + case EbtUint: newOp = EOpConvUintToUint8; break; + case EbtInt64: newOp = EOpConvInt64ToUint8; break; + case EbtUint64: newOp = EOpConvUint64ToUint8; break; + case EbtBool: newOp = EOpConvBoolToUint8; break; + case EbtFloat: newOp = EOpConvFloatToUint8; break; + case EbtDouble: newOp = EOpConvDoubleToUint8; break; + case EbtFloat16: newOp = EOpConvFloat16ToUint8; break; default: return nullptr; } break; -#ifdef AMD_EXTENSIONS + case EbtInt16: switch (node->getBasicType()) { + case EbtUint8: newOp = EOpConvUint8ToInt16; break; + case EbtInt8: newOp = EOpConvInt8ToInt16; break; + case EbtUint16: newOp = EOpConvUint16ToInt16; break; case EbtInt: newOp = EOpConvIntToInt16; break; case EbtUint: newOp = EOpConvUintToInt16; break; + case EbtInt64: newOp = EOpConvInt64ToInt16; break; + case EbtUint64: newOp = EOpConvUint64ToInt16; break; case EbtBool: newOp = EOpConvBoolToInt16; break; case EbtFloat: newOp = EOpConvFloatToInt16; break; case EbtDouble: newOp = EOpConvDoubleToInt16; break; case EbtFloat16: newOp = EOpConvFloat16ToInt16; break; - case EbtInt64: newOp = EOpConvInt64ToInt16; break; - case EbtUint64: newOp = EOpConvUint64ToInt16; break; - case EbtUint16: newOp = EOpConvUint16ToInt16; break; default: return nullptr; } break; case EbtUint16: switch (node->getBasicType()) { + case EbtInt8: newOp = EOpConvInt8ToUint16; break; + case EbtUint8: newOp = EOpConvUint8ToUint16; break; + case EbtInt16: newOp = EOpConvInt16ToUint16; break; case EbtInt: newOp = EOpConvIntToUint16; break; case EbtUint: newOp = EOpConvUintToUint16; break; + case EbtInt64: newOp = EOpConvInt64ToUint16; break; + case EbtUint64: newOp = EOpConvUint64ToUint16; break; case EbtBool: newOp = EOpConvBoolToUint16; break; case EbtFloat: newOp = EOpConvFloatToUint16; break; case EbtDouble: newOp = EOpConvDoubleToUint16; break; case EbtFloat16: newOp = EOpConvFloat16ToUint16; break; - case EbtInt64: newOp = EOpConvInt64ToUint16; break; - case EbtUint64: newOp = EOpConvUint64ToUint16; break; - case EbtInt16: newOp = EOpConvInt16ToUint16; break; default: return nullptr; } break; -#endif + + case EbtInt: + switch (node->getBasicType()) { + case EbtInt8: newOp = EOpConvInt8ToInt; break; + case EbtUint8: newOp = EOpConvUint8ToInt; break; + case EbtInt16: newOp = EOpConvInt16ToInt; break; + case EbtUint16: newOp = EOpConvUint16ToInt; break; + case EbtUint: newOp = EOpConvUintToInt; break; + case EbtBool: newOp = EOpConvBoolToInt; break; + case EbtFloat: newOp = EOpConvFloatToInt; break; + case EbtDouble: newOp = EOpConvDoubleToInt; break; + case EbtFloat16: newOp = EOpConvFloat16ToInt; break; + case EbtInt64: newOp = EOpConvInt64ToInt; break; + case EbtUint64: newOp = EOpConvUint64ToInt; break; + default: + return nullptr; + } + break; + case EbtUint: + switch (node->getBasicType()) { + case EbtInt8: newOp = EOpConvInt8ToUint; break; + case EbtUint8: newOp = EOpConvUint8ToUint; break; + case EbtInt16: newOp = EOpConvInt16ToUint; break; + case EbtUint16: newOp = EOpConvUint16ToUint; break; + case EbtInt: newOp = EOpConvIntToUint; break; + case EbtBool: newOp = EOpConvBoolToUint; break; + case EbtFloat: newOp = EOpConvFloatToUint; break; + case EbtDouble: newOp = EOpConvDoubleToUint; break; + case EbtFloat16: newOp = EOpConvFloat16ToUint; break; + case EbtInt64: newOp = EOpConvInt64ToUint; break; + case EbtUint64: newOp = EOpConvUint64ToUint; break; + default: + return nullptr; + } + break; + case EbtInt64: + switch (node->getBasicType()) { + case EbtInt8: newOp = EOpConvInt8ToInt64; break; + case EbtUint8: newOp = EOpConvUint8ToInt64; break; + case EbtInt16: newOp = EOpConvInt16ToInt64; break; + case EbtUint16: newOp = EOpConvUint16ToInt64; break; + case EbtInt: newOp = EOpConvIntToInt64; break; + case EbtUint: newOp = EOpConvUintToInt64; break; + case EbtBool: newOp = EOpConvBoolToInt64; break; + case EbtFloat: newOp = EOpConvFloatToInt64; break; + case EbtDouble: newOp = EOpConvDoubleToInt64; break; + case EbtFloat16: newOp = EOpConvFloat16ToInt64; break; + case EbtUint64: newOp = EOpConvUint64ToInt64; break; + default: + return nullptr; + } + break; + case EbtUint64: + switch (node->getBasicType()) { + case EbtInt8: newOp = EOpConvInt8ToUint64; break; + case EbtUint8: newOp = EOpConvUint8ToUint64; break; + case EbtInt16: newOp = EOpConvInt16ToUint64; break; + case EbtUint16: newOp = EOpConvUint16ToUint64; break; + case EbtInt: newOp = EOpConvIntToUint64; break; + case EbtUint: newOp = EOpConvUintToUint64; break; + case EbtBool: newOp = EOpConvBoolToUint64; break; + case EbtFloat: newOp = EOpConvFloatToUint64; break; + case EbtDouble: newOp = EOpConvDoubleToUint64; break; + case EbtFloat16: newOp = EOpConvFloat16ToUint64; break; + case EbtInt64: newOp = EOpConvInt64ToUint64; break; + default: + return nullptr; + } + break; default: return nullptr; } - TType newType(promoteTo, EvqTemporary, node->getVectorSize(), node->getMatrixCols(), node->getMatrixRows()); + TType newType(convertTo, EvqTemporary, node->getVectorSize(), node->getMatrixCols(), node->getMatrixRows()); newNode = addUnaryNode(newOp, node, node->getLoc(), newType); // TODO: it seems that some unary folding operations should occur here, but are not @@ -874,6 +718,298 @@ return newNode; } +// For converting a pair of operands to a binary operation to compatible +// types with each other, relative to the operation in 'op'. +// This does not cover assignment operations, which is asymmetric in that the +// left type is not changeable. +// See addConversion(op, type, node) for assignments and unary operation +// conversions. +// +// Generally, this is focused on basic type conversion, not shape conversion. +// See addShapeConversion() for shape conversions. +// +// Returns the converted pair of nodes. +// Returns when there is no conversion. +std::tuple +TIntermediate::addConversion(TOperator op, TIntermTyped* node0, TIntermTyped* node1) const +{ + if (!isConversionAllowed(op, node0) || !isConversionAllowed(op, node1)) + return std::make_tuple(nullptr, nullptr); + + if (node0->getType() != node1->getType()) { + // If differing structure, then no conversions. + if (node0->isStruct() || node1->isStruct()) + return std::make_tuple(nullptr, nullptr); + + // If differing arrays, then no conversions. + if (node0->getType().isArray() || node1->getType().isArray()) + return std::make_tuple(nullptr, nullptr); + } + + auto promoteTo = std::make_tuple(EbtNumTypes, EbtNumTypes); + + switch (op) { + // + // List all the binary ops that can implicitly convert one operand to the other's type; + // This implements the 'policy' for implicit type conversion. + // + case EOpLessThan: + case EOpGreaterThan: + case EOpLessThanEqual: + case EOpGreaterThanEqual: + case EOpEqual: + case EOpNotEqual: + + case EOpAdd: + case EOpSub: + case EOpMul: + case EOpDiv: + case EOpMod: + + case EOpVectorTimesScalar: + case EOpVectorTimesMatrix: + case EOpMatrixTimesVector: + case EOpMatrixTimesScalar: + + case EOpAnd: + case EOpInclusiveOr: + case EOpExclusiveOr: + + case EOpSequence: // used by ?: + + if (node0->getBasicType() == node1->getBasicType()) + return std::make_tuple(node0, node1); + + promoteTo = getConversionDestinatonType(node0->getBasicType(), node1->getBasicType(), op); + if (std::get<0>(promoteTo) == EbtNumTypes || std::get<1>(promoteTo) == EbtNumTypes) + return std::make_tuple(nullptr, nullptr); + + break; + + case EOpLogicalAnd: + case EOpLogicalOr: + case EOpLogicalXor: + if (source == EShSourceHlsl) + promoteTo = std::make_tuple(EbtBool, EbtBool); + else + return std::make_tuple(node0, node1); + break; + + // There are no conversions needed for GLSL; the shift amount just needs to be an + // integer type, as does the base. + // HLSL can promote bools to ints to make this work. + case EOpLeftShift: + case EOpRightShift: + if (source == EShSourceHlsl) { + TBasicType node0BasicType = node0->getBasicType(); + if (node0BasicType == EbtBool) + node0BasicType = EbtInt; + if (node1->getBasicType() == EbtBool) + promoteTo = std::make_tuple(node0BasicType, EbtInt); + else + promoteTo = std::make_tuple(node0BasicType, node1->getBasicType()); + } else { + if (isTypeInt(node0->getBasicType()) && isTypeInt(node1->getBasicType())) + return std::make_tuple(node0, node1); + else + return std::make_tuple(nullptr, nullptr); + } + break; + + default: + if (node0->getType() == node1->getType()) + return std::make_tuple(node0, node1); + + return std::make_tuple(nullptr, nullptr); + } + + TIntermTyped* newNode0; + TIntermTyped* newNode1; + + if (std::get<0>(promoteTo) != node0->getType().getBasicType()) { + if (node0->getAsConstantUnion()) + newNode0 = promoteConstantUnion(std::get<0>(promoteTo), node0->getAsConstantUnion()); + else + newNode0 = createConversion(std::get<0>(promoteTo), node0); + } else + newNode0 = node0; + + if (std::get<1>(promoteTo) != node1->getType().getBasicType()) { + if (node1->getAsConstantUnion()) + newNode1 = promoteConstantUnion(std::get<1>(promoteTo), node1->getAsConstantUnion()); + else + newNode1 = createConversion(std::get<1>(promoteTo), node1); + } else + newNode1 = node1; + + return std::make_tuple(newNode0, newNode1); +} + +// +// Convert the node's type to the given type, as allowed by the operation involved: 'op'. +// For implicit conversions, 'op' is not the requested conversion, it is the explicit +// operation requiring the implicit conversion. +// +// Binary operation conversions should be handled by addConversion(op, node, node), not here. +// +// Returns a node representing the conversion, which could be the same +// node passed in if no conversion was needed. +// +// Generally, this is focused on basic type conversion, not shape conversion. +// See addShapeConversion() for shape conversions. +// +// Return nullptr if a conversion can't be done. +// +TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TIntermTyped* node) const +{ + if (!isConversionAllowed(op, node)) + return nullptr; + + // Otherwise, if types are identical, no problem + if (type == node->getType()) + return node; + + // If one's a structure, then no conversions. + if (type.isStruct() || node->isStruct()) + return nullptr; + + // If one's an array, then no conversions. + if (type.isArray() || node->getType().isArray()) + return nullptr; + + // Note: callers are responsible for other aspects of shape, + // like vector and matrix sizes. + + TBasicType promoteTo; + + switch (op) { + // + // Explicit conversions (unary operations) + // + case EOpConstructBool: + promoteTo = EbtBool; + break; + case EOpConstructFloat: + promoteTo = EbtFloat; + break; + case EOpConstructDouble: + promoteTo = EbtDouble; + break; + case EOpConstructFloat16: + promoteTo = EbtFloat16; + break; + case EOpConstructInt8: + promoteTo = EbtInt8; + break; + case EOpConstructUint8: + promoteTo = EbtUint8; + break; + case EOpConstructInt16: + promoteTo = EbtInt16; + break; + case EOpConstructUint16: + promoteTo = EbtUint16; + break; + case EOpConstructInt: + promoteTo = EbtInt; + break; + case EOpConstructUint: + promoteTo = EbtUint; + break; + case EOpConstructInt64: + promoteTo = EbtInt64; + break; + case EOpConstructUint64: + promoteTo = EbtUint64; + break; + + case EOpLogicalNot: + + case EOpFunctionCall: + + case EOpReturn: + case EOpAssign: + case EOpAddAssign: + case EOpSubAssign: + case EOpMulAssign: + case EOpVectorTimesScalarAssign: + case EOpMatrixTimesScalarAssign: + case EOpDivAssign: + case EOpModAssign: + case EOpAndAssign: + case EOpInclusiveOrAssign: + case EOpExclusiveOrAssign: + + case EOpAtan: + case EOpClamp: + case EOpCross: + case EOpDistance: + case EOpDot: + case EOpDst: + case EOpFaceForward: + case EOpFma: + case EOpFrexp: + case EOpLdexp: + case EOpMix: + case EOpLit: + case EOpMax: + case EOpMin: + case EOpModf: + case EOpPow: + case EOpReflect: + case EOpRefract: + case EOpSmoothStep: + case EOpStep: + + case EOpSequence: + case EOpConstructStruct: + + if (type.getBasicType() == node->getType().getBasicType()) + return node; + + if (canImplicitlyPromote(node->getBasicType(), type.getBasicType(), op)) + promoteTo = type.getBasicType(); + else + return nullptr; + break; + + // For GLSL, there are no conversions needed; the shift amount just needs to be an + // integer type, as do the base/result. + // HLSL can convert the shift from a bool to an int. + case EOpLeftShiftAssign: + case EOpRightShiftAssign: + { + if (source == EShSourceHlsl && node->getType().getBasicType() == EbtBool) + promoteTo = type.getBasicType(); + else { + if (isTypeInt(type.getBasicType()) && isTypeInt(node->getBasicType())) + return node; + else + return nullptr; + } + break; + } + + default: + // default is to require a match; all exceptions should have case statements above + + if (type.getBasicType() == node->getType().getBasicType()) + return node; + else + return nullptr; + } + + if (node->getAsConstantUnion()) + return promoteConstantUnion(promoteTo, node->getAsConstantUnion()); + + // + // Add a new newNode for the conversion. + // + TIntermUnary* newNode = createConversion(promoteTo, node); + + return newNode; +} + // Convert the node's shape of type for the given type, as allowed by the // operation involved: 'op'. This is for situations where there is only one // direction to consider doing the shape conversion. @@ -1019,12 +1155,11 @@ rhsNode = addShapeConversion(lhsNode->getType(), rhsNode); } -// Convert the node's shape of type for the given type. It's not necessarily -// an error if they are different and not converted, as some operations accept -// mixed types. Promotion will do final shape checking. +// Convert the node's shape of type for the given type, as allowed by the +// operation involved: 'op'. // -// If there is a chance of two nodes, with conversions possible in each direction, -// the policy for what to ask for must be in the caller; this will do what is asked. +// Generally, the AST represents allowed GLSL shapes, so this isn't needed +// for GLSL. Bad shapes are caught in conversion or promotion. // // Return 'node' if no conversion was done. Promotion handles final shape // checking. @@ -1080,6 +1215,166 @@ return node; } +bool TIntermediate::isIntegralPromotion(TBasicType from, TBasicType to) const +{ + // integral promotions + if (to == EbtInt) { + switch(from) { + case EbtInt8: + case EbtInt16: + case EbtUint8: + case EbtUint16: + return true; + default: + break; + } + } + return false; +} + +bool TIntermediate::isFPPromotion(TBasicType from, TBasicType to) const +{ + // floating-point promotions + if (to == EbtDouble) { + switch(from) { + case EbtFloat16: + case EbtFloat: + return true; + default: + break; + } + } + return false; +} + +bool TIntermediate::isIntegralConversion(TBasicType from, TBasicType to) const +{ + switch (from) { + case EbtInt8: + switch (to) { + case EbtUint8: + case EbtInt16: + case EbtUint16: + case EbtUint: + case EbtInt64: + case EbtUint64: + return true; + default: + break; + } + break; + case EbtUint8: + switch (to) { + case EbtInt16: + case EbtUint16: + case EbtUint: + case EbtInt64: + case EbtUint64: + return true; + default: + break; + } + break; + case EbtInt16: + switch(to) { + case EbtUint16: + case EbtUint: + case EbtInt64: + case EbtUint64: + return true; + default: + break; + } + break; + case EbtUint16: + switch(to) { + case EbtUint: + case EbtInt64: + case EbtUint64: + return true; + default: + break; + } + break; + case EbtInt: + switch(to) { + case EbtUint: + return version >= 400 || (source == EShSourceHlsl); + case EbtInt64: + case EbtUint64: + return true; + default: + break; + } + break; + case EbtUint: + switch(to) { + case EbtInt64: + case EbtUint64: + return true; + default: + break; + } + break; + case EbtInt64: + if (to == EbtUint64) { + return true; + } + break; + default: + break; + } + return false; +} + +bool TIntermediate::isFPConversion(TBasicType from, TBasicType to) const +{ + if (to == EbtFloat && from == EbtFloat16) { + return true; + } else { + return false; + } +} + +bool TIntermediate::isFPIntegralConversion(TBasicType from, TBasicType to) const +{ + switch (from) { + case EbtInt8: + case EbtUint8: + case EbtInt16: + case EbtUint16: + switch (to) { + case EbtFloat16: + case EbtFloat: + case EbtDouble: + return true; + default: + break; + } + break; + case EbtInt: + case EbtUint: + switch(to) { + case EbtFloat: + case EbtDouble: + return true; + default: + break; + } + break; + case EbtInt64: + case EbtUint64: + if (to == EbtDouble) { + return true; + } + break; + + default: + break; + } + return false; +} + // // See if the 'from' type is allowed to be implicitly converted to the // 'to' type. This is not about vector/array/struct, only about basic type. @@ -1125,120 +1420,337 @@ } } - switch (to) { - case EbtDouble: - switch (from) { - case EbtInt: - case EbtUint: - case EbtInt64: - case EbtUint64: -#ifdef AMD_EXTENSIONS - case EbtInt16: - case EbtUint16: -#endif - case EbtFloat: + bool explicitTypesEnabled = extensionRequested(E_GL_KHX_shader_explicit_arithmetic_types) || + extensionRequested(E_GL_KHX_shader_explicit_arithmetic_types_int8) || + extensionRequested(E_GL_KHX_shader_explicit_arithmetic_types_int16) || + extensionRequested(E_GL_KHX_shader_explicit_arithmetic_types_int32) || + extensionRequested(E_GL_KHX_shader_explicit_arithmetic_types_int64) || + extensionRequested(E_GL_KHX_shader_explicit_arithmetic_types_float16) || + extensionRequested(E_GL_KHX_shader_explicit_arithmetic_types_float32) || + extensionRequested(E_GL_KHX_shader_explicit_arithmetic_types_float64); + + if (explicitTypesEnabled) { + // integral promotions + if (isIntegralPromotion(from, to)) { + return true; + } + + // floating-point promotions + if (isFPPromotion(from, to)) { + return true; + } + + // integral conversions + if (isIntegralConversion(from, to)) { + return true; + } + + // floating-point conversions + if (isFPConversion(from, to)) { + return true; + } + + // floating-integral conversions + if (isFPIntegralConversion(from, to)) { + return true; + } + + // hlsl supported conversions + if (source == EShSourceHlsl) { + if (from == EbtBool && (to == EbtInt || to == EbtUint || to == EbtFloat)) + return true; + } + } else { + switch (to) { case EbtDouble: + switch (from) { + case EbtInt: + case EbtUint: + case EbtInt64: + case EbtUint64: #ifdef AMD_EXTENSIONS - case EbtFloat16: + case EbtInt16: + case EbtUint16: #endif - return true; - default: - return false; - } - case EbtFloat: - switch (from) { - case EbtInt: - case EbtUint: + case EbtFloat: + case EbtDouble: #ifdef AMD_EXTENSIONS - case EbtInt16: - case EbtUint16: + case EbtFloat16: #endif + return true; + default: + return false; + } case EbtFloat: + switch (from) { + case EbtInt: + case EbtUint: #ifdef AMD_EXTENSIONS - case EbtFloat16: + case EbtInt16: + case EbtUint16: #endif - return true; - case EbtBool: - return (source == EShSourceHlsl); - default: - return false; - } - case EbtUint: - switch (from) { - case EbtInt: - return version >= 400 || (source == EShSourceHlsl); + case EbtFloat: +#ifdef AMD_EXTENSIONS + case EbtFloat16: +#endif + return true; + case EbtBool: + return (source == EShSourceHlsl); + default: + return false; + } case EbtUint: + switch (from) { + case EbtInt: + return version >= 400 || (source == EShSourceHlsl); + case EbtUint: #ifdef AMD_EXTENSIONS - case EbtInt16: - case EbtUint16: + case EbtInt16: + case EbtUint16: #endif - return true; - case EbtBool: - return (source == EShSourceHlsl); - default: - return false; - } - case EbtInt: - switch (from) { + return true; + case EbtBool: + return (source == EShSourceHlsl); + default: + return false; + } case EbtInt: + switch (from) { + case EbtInt: #ifdef AMD_EXTENSIONS - case EbtInt16: + case EbtInt16: +#endif + return true; + case EbtBool: + return (source == EShSourceHlsl); + default: + return false; + } + case EbtUint64: + switch (from) { + case EbtInt: + case EbtUint: + case EbtInt64: + case EbtUint64: +#ifdef AMD_EXTENSIONS + case EbtInt16: + case EbtUint16: +#endif + return true; + default: + return false; + } + case EbtInt64: + switch (from) { + case EbtInt: + case EbtInt64: +#ifdef AMD_EXTENSIONS + case EbtInt16: +#endif + return true; + default: + return false; + } +#ifdef AMD_EXTENSIONS + case EbtFloat16: + switch (from) { + case EbtInt16: + case EbtUint16: + case EbtFloat16: + return true; + default: + return false; + } + case EbtUint16: + switch (from) { + case EbtInt16: + case EbtUint16: + return true; + default: + return false; + } #endif - return true; - case EbtBool: - return (source == EShSourceHlsl); default: return false; } - case EbtUint64: - switch (from) { - case EbtInt: + } + + return false; +} + +static bool canSignedIntTypeRepresentAllUnsignedValues(TBasicType sintType, TBasicType uintType) { + switch(sintType) { + case EbtInt8: + switch(uintType) { + case EbtUint8: + case EbtUint16: case EbtUint: - case EbtInt64: case EbtUint64: -#ifdef AMD_EXTENSIONS - case EbtInt16: - case EbtUint16: -#endif - return true; + return false; default: + assert(false); return false; } - case EbtInt64: - switch (from) { - case EbtInt: - case EbtInt64: -#ifdef AMD_EXTENSIONS - case EbtInt16: -#endif + break; + case EbtInt16: + switch(uintType) { + case EbtUint8: return true; + case EbtUint16: + case EbtUint: + case EbtUint64: + return false; default: + assert(false); return false; } -#ifdef AMD_EXTENSIONS - case EbtFloat16: - switch (from) { - case EbtInt16: + break; + case EbtInt: + switch(uintType) { + case EbtUint8: case EbtUint16: - case EbtFloat16: return true; + case EbtUint: + return false; default: + assert(false); return false; } - case EbtUint16: - switch (from) { - case EbtInt16: + break; + case EbtInt64: + switch(uintType) { + case EbtUint8: case EbtUint16: + case EbtUint: return true; + case EbtUint64: + return false; default: + assert(false); return false; } -#endif + break; default: + assert(false); return false; } } + +static TBasicType getCorrespondingUnsignedType(TBasicType type) { + switch(type) { + case EbtInt8: + return EbtUint8; + case EbtInt16: + return EbtUint16; + case EbtInt: + return EbtUint; + case EbtInt64: + return EbtUint64; + default: + assert(false); + return EbtNumTypes; + } +} + +// Implements the following rules +// - If either operand has type float64_t or derived from float64_t, +// the other shall be converted to float64_t or derived type. +// - Otherwise, if either operand has type float32_t or derived from +// float32_t, the other shall be converted to float32_t or derived type. +// - Otherwise, if either operand has type float16_t or derived from +// float16_t, the other shall be converted to float16_t or derived type. +// - Otherwise, if both operands have integer types the following rules +// shall be applied to the operands: +// - If both operands have the same type, no further conversion +// is needed. +// - Otherwise, if both operands have signed integer types or both +// have unsigned integer types, the operand with the type of lesser +// integer conversion rank shall be converted to the type of the +// operand with greater rank. +// - Otherwise, if the operand that has unsigned integer type has rank +// greater than or equal to the rank of the type of the other +// operand, the operand with signed integer type shall be converted +// to the type of the operand with unsigned integer type. +// - Otherwise, if the type of the operand with signed integer type can +// represent all of the values of the type of the operand with +// unsigned integer type, the operand with unsigned integer type +// shall be converted to the type of the operand with signed +// integer type. +// - Otherwise, both operands shall be converted to the unsigned +// integer type corresponding to the type of the operand with signed +// integer type. + +std::tuple TIntermediate::getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const +{ + TBasicType res0 = EbtNumTypes; + TBasicType res1 = EbtNumTypes; + + if (profile == EEsProfile || version == 110) + return std::make_tuple(res0, res1);; + + if (source == EShSourceHlsl) { + if (canImplicitlyPromote(type1, type0, op)) { + res0 = type0; + res1 = type0; + } else if (canImplicitlyPromote(type0, type1, op)) { + res0 = type1; + res1 = type1; + } + return std::make_tuple(res0, res1); + } + + if ((type0 == EbtDouble && canImplicitlyPromote(type1, EbtDouble, op)) || + (type1 == EbtDouble && canImplicitlyPromote(type0, EbtDouble, op)) ) { + res0 = EbtDouble; + res1 = EbtDouble; + } else if ((type0 == EbtFloat && canImplicitlyPromote(type1, EbtFloat, op)) || + (type1 == EbtFloat && canImplicitlyPromote(type0, EbtFloat, op)) ) { + res0 = EbtFloat; + res1 = EbtFloat; + } else if ((type0 == EbtFloat16 && canImplicitlyPromote(type1, EbtFloat16, op)) || + (type1 == EbtFloat16 && canImplicitlyPromote(type0, EbtFloat16, op)) ) { + res0 = EbtFloat16; + res1 = EbtFloat16; + } else if (isTypeInt(type0) && isTypeInt(type1) && + (canImplicitlyPromote(type0, type1, op) || canImplicitlyPromote(type1, type0, op))) { + if ((isTypeSignedInt(type0) && isTypeSignedInt(type1)) || + (isTypeUnsignedInt(type0) && isTypeUnsignedInt(type1))) { + if (getTypeRank(type0) < getTypeRank(type1)) { + res0 = type1; + res1 = type1; + } else { + res0 = type0; + res1 = type0; + } + } else if (isTypeUnsignedInt(type0) && (getTypeRank(type0) > getTypeRank(type1))) { + res0 = type0; + res1 = type0; + } else if (isTypeUnsignedInt(type1) && (getTypeRank(type1) > getTypeRank(type0))) { + res0 = type1; + res1 = type1; + } else if (isTypeSignedInt(type0)) { + if (canSignedIntTypeRepresentAllUnsignedValues(type0, type1)) { + res0 = type0; + res1 = type0; + } else { + res0 = getCorrespondingUnsignedType(type0); + res1 = getCorrespondingUnsignedType(type0); + } + } else if (isTypeSignedInt(type1)) { + if (canSignedIntTypeRepresentAllUnsignedValues(type1, type0)) { + res0 = type1; + res1 = type1; + } else { + res0 = getCorrespondingUnsignedType(type1); + res1 = getCorrespondingUnsignedType(type1); + } + } + } + + return std::make_tuple(res0, res1); +} + // // Given a type, find what operation would fully construct it. // @@ -1246,6 +1758,9 @@ { TOperator op = EOpNull; + if (type.getQualifier().nonUniform) + return EOpConstructNonuniform; + switch (type.getBasicType()) { case EbtStruct: op = EOpConstructStruct; @@ -1331,7 +1846,6 @@ } } break; -#ifdef AMD_EXTENSIONS case EbtFloat16: if (type.getMatrixCols()) { switch (type.getMatrixCols()) { @@ -1361,17 +1875,52 @@ break; } } - else { - switch (type.getVectorSize()) { - case 1: op = EOpConstructFloat16; break; - case 2: op = EOpConstructF16Vec2; break; - case 3: op = EOpConstructF16Vec3; break; - case 4: op = EOpConstructF16Vec4; break; - default: break; // some compilers want this - } + else { + switch (type.getVectorSize()) { + case 1: op = EOpConstructFloat16; break; + case 2: op = EOpConstructF16Vec2; break; + case 3: op = EOpConstructF16Vec3; break; + case 4: op = EOpConstructF16Vec4; break; + default: break; // some compilers want this + } + } + break; + case EbtInt8: + switch(type.getVectorSize()) { + case 1: op = EOpConstructInt8; break; + case 2: op = EOpConstructI8Vec2; break; + case 3: op = EOpConstructI8Vec3; break; + case 4: op = EOpConstructI8Vec4; break; + default: break; // some compilers want this + } + break; + case EbtUint8: + switch(type.getVectorSize()) { + case 1: op = EOpConstructUint8; break; + case 2: op = EOpConstructU8Vec2; break; + case 3: op = EOpConstructU8Vec3; break; + case 4: op = EOpConstructU8Vec4; break; + default: break; // some compilers want this + } + break; + case EbtInt16: + switch(type.getVectorSize()) { + case 1: op = EOpConstructInt16; break; + case 2: op = EOpConstructI16Vec2; break; + case 3: op = EOpConstructI16Vec3; break; + case 4: op = EOpConstructI16Vec4; break; + default: break; // some compilers want this + } + break; + case EbtUint16: + switch(type.getVectorSize()) { + case 1: op = EOpConstructUint16; break; + case 2: op = EOpConstructU16Vec2; break; + case 3: op = EOpConstructU16Vec3; break; + case 4: op = EOpConstructU16Vec4; break; + default: break; // some compilers want this } break; -#endif case EbtInt: if (type.getMatrixCols()) { switch (type.getMatrixCols()) { @@ -1466,26 +2015,6 @@ default: break; // some compilers want this } break; -#ifdef AMD_EXTENSIONS - case EbtInt16: - switch(type.getVectorSize()) { - case 1: op = EOpConstructInt16; break; - case 2: op = EOpConstructI16Vec2; break; - case 3: op = EOpConstructI16Vec3; break; - case 4: op = EOpConstructI16Vec4; break; - default: break; // some compilers want this - } - break; - case EbtUint16: - switch(type.getVectorSize()) { - case 1: op = EOpConstructUint16; break; - case 2: op = EOpConstructU16Vec2; break; - case 3: op = EOpConstructU16Vec3; break; - case 4: op = EOpConstructU16Vec4; break; - default: break; // some compilers want this - } - break; -#endif case EbtBool: if (type.getMatrixCols()) { switch (type.getMatrixCols()) { @@ -1671,22 +2200,22 @@ // If it's void, go to the if-then-else selection() if (trueBlock->getBasicType() == EbtVoid && falseBlock->getBasicType() == EbtVoid) { TIntermNodePair pair = { trueBlock, falseBlock }; - return addSelection(cond, pair, loc); + TIntermSelection* selection = addSelection(cond, pair, loc); + if (getSource() == EShSourceHlsl) + selection->setNoShortCircuit(); + + return selection; } // // Get compatible types. // - TIntermTyped* child = addConversion(EOpSequence, trueBlock->getType(), falseBlock); - if (child) - falseBlock = child; - else { - child = addConversion(EOpSequence, falseBlock->getType(), trueBlock); - if (child) - trueBlock = child; - else - return nullptr; - } + auto children = addConversion(EOpSequence, trueBlock, falseBlock); + trueBlock = std::get<0>(children); + falseBlock = std::get<1>(children); + + if (trueBlock == nullptr || falseBlock == nullptr) + return nullptr; // Handle a vector condition as a mix if (!cond->getType().isScalarOrVec1()) { @@ -1742,6 +2271,9 @@ else node->getQualifier().makeTemporary(); + if (getSource() == EShSourceHlsl) + node->setNoShortCircuit(); + return node; } @@ -1761,6 +2293,37 @@ return node; } +TIntermConstantUnion* TIntermediate::addConstantUnion(signed char i8, const TSourceLoc& loc, bool literal) const +{ + TConstUnionArray unionArray(1); + unionArray[0].setI8Const(i8); + + return addConstantUnion(unionArray, TType(EbtInt8, EvqConst), loc, literal); +} + +TIntermConstantUnion* TIntermediate::addConstantUnion(unsigned char u8, const TSourceLoc& loc, bool literal) const +{ + TConstUnionArray unionArray(1); + unionArray[0].setUConst(u8); + + return addConstantUnion(unionArray, TType(EbtUint8, EvqConst), loc, literal); +} + +TIntermConstantUnion* TIntermediate::addConstantUnion(signed short i16, const TSourceLoc& loc, bool literal) const +{ + TConstUnionArray unionArray(1); + unionArray[0].setI16Const(i16); + + return addConstantUnion(unionArray, TType(EbtInt16, EvqConst), loc, literal); +} + +TIntermConstantUnion* TIntermediate::addConstantUnion(unsigned short u16, const TSourceLoc& loc, bool literal) const +{ + TConstUnionArray unionArray(1); + unionArray[0].setU16Const(u16); + + return addConstantUnion(unionArray, TType(EbtUint16, EvqConst), loc, literal); +} TIntermConstantUnion* TIntermediate::addConstantUnion(int i, const TSourceLoc& loc, bool literal) const { @@ -1794,24 +2357,6 @@ return addConstantUnion(unionArray, TType(EbtUint64, EvqConst), loc, literal); } -#ifdef AMD_EXTENSIONS -TIntermConstantUnion* TIntermediate::addConstantUnion(short i16, const TSourceLoc& loc, bool literal) const -{ - TConstUnionArray unionArray(1); - unionArray[0].setIConst(i16); - - return addConstantUnion(unionArray, TType(EbtInt16, EvqConst), loc, literal); -} - -TIntermConstantUnion* TIntermediate::addConstantUnion(unsigned short u16, const TSourceLoc& loc, bool literal) const -{ - TConstUnionArray unionArray(1); - unionArray[0].setUConst(u16); - - return addConstantUnion(unionArray, TType(EbtUint16, EvqConst), loc, literal); -} -#endif - TIntermConstantUnion* TIntermediate::addConstantUnion(bool b, const TSourceLoc& loc, bool literal) const { TConstUnionArray unionArray(1); @@ -1822,11 +2367,7 @@ TIntermConstantUnion* TIntermediate::addConstantUnion(double d, TBasicType baseType, const TSourceLoc& loc, bool literal) const { -#ifdef AMD_EXTENSIONS assert(baseType == EbtFloat || baseType == EbtDouble || baseType == EbtFloat16); -#else - assert(baseType == EbtFloat || baseType == EbtDouble); -#endif TConstUnionArray unionArray(1); unionArray[0].setDConst(d); @@ -2121,12 +2662,10 @@ case EOpVectorSwizzle: case EOpConvFloatToDouble: case EOpConvDoubleToFloat: -#ifdef AMD_EXTENSIONS case EOpConvFloat16ToFloat: case EOpConvFloatToFloat16: case EOpConvFloat16ToDouble: case EOpConvDoubleToFloat16: -#endif return true; default: return false; @@ -2150,51 +2689,97 @@ case EOpIndexDirectStruct: case EOpVectorSwizzle: - // conversion constructors + // (u)int* -> bool + case EOpConvInt8ToBool: + case EOpConvInt16ToBool: case EOpConvIntToBool: + case EOpConvInt64ToBool: + case EOpConvUint8ToBool: + case EOpConvUint16ToBool: case EOpConvUintToBool: - case EOpConvUintToInt: + case EOpConvUint64ToBool: + + // bool -> (u)int* + case EOpConvBoolToInt8: + case EOpConvBoolToInt16: case EOpConvBoolToInt: - case EOpConvIntToUint: - case EOpConvBoolToUint: - case EOpConvInt64ToBool: case EOpConvBoolToInt64: - case EOpConvUint64ToBool: + case EOpConvBoolToUint8: + case EOpConvBoolToUint16: + case EOpConvBoolToUint: case EOpConvBoolToUint64: - case EOpConvInt64ToInt: - case EOpConvIntToInt64: - case EOpConvUint64ToUint: - case EOpConvUintToUint64: - case EOpConvInt64ToUint64: - case EOpConvUint64ToInt64: - case EOpConvInt64ToUint: - case EOpConvUintToInt64: - case EOpConvUint64ToInt: - case EOpConvIntToUint64: -#ifdef AMD_EXTENSIONS - case EOpConvInt16ToBool: - case EOpConvBoolToInt16: + + // int8_t -> (u)int* + case EOpConvInt8ToInt16: + case EOpConvInt8ToInt: + case EOpConvInt8ToInt64: + case EOpConvInt8ToUint8: + case EOpConvInt8ToUint16: + case EOpConvInt8ToUint: + case EOpConvInt8ToUint64: + + // int16_t -> (u)int* + case EOpConvInt16ToInt8: case EOpConvInt16ToInt: - case EOpConvIntToInt16: - case EOpConvInt16ToUint: - case EOpConvUintToInt16: case EOpConvInt16ToInt64: - case EOpConvInt64ToInt16: + case EOpConvInt16ToUint8: + case EOpConvInt16ToUint16: + case EOpConvInt16ToUint: case EOpConvInt16ToUint64: - case EOpConvUint64ToInt16: - case EOpConvUint16ToBool: - case EOpConvBoolToUint16: - case EOpConvUint16ToInt: + + // int32_t -> (u)int* + case EOpConvIntToInt8: + case EOpConvIntToInt16: + case EOpConvIntToInt64: + case EOpConvIntToUint8: case EOpConvIntToUint16: - case EOpConvUint16ToUint: - case EOpConvUintToUint16: - case EOpConvUint16ToInt64: + case EOpConvIntToUint: + case EOpConvIntToUint64: + + // int64_t -> (u)int* + case EOpConvInt64ToInt8: + case EOpConvInt64ToInt16: + case EOpConvInt64ToInt: + case EOpConvInt64ToUint8: case EOpConvInt64ToUint16: + case EOpConvInt64ToUint: + case EOpConvInt64ToUint64: + + // uint8_t -> (u)int* + case EOpConvUint8ToInt8: + case EOpConvUint8ToInt16: + case EOpConvUint8ToInt: + case EOpConvUint8ToInt64: + case EOpConvUint8ToUint16: + case EOpConvUint8ToUint: + case EOpConvUint8ToUint64: + + // uint16_t -> (u)int* + case EOpConvUint16ToInt8: + case EOpConvUint16ToInt16: + case EOpConvUint16ToInt: + case EOpConvUint16ToInt64: + case EOpConvUint16ToUint8: + case EOpConvUint16ToUint: case EOpConvUint16ToUint64: + + // uint32_t -> (u)int* + case EOpConvUintToInt8: + case EOpConvUintToInt16: + case EOpConvUintToInt: + case EOpConvUintToInt64: + case EOpConvUintToUint8: + case EOpConvUintToUint16: + case EOpConvUintToUint64: + + // uint64_t -> (u)int* + case EOpConvUint64ToInt8: + case EOpConvUint64ToInt16: + case EOpConvUint64ToInt: + case EOpConvUint64ToInt64: + case EOpConvUint64ToUint8: case EOpConvUint64ToUint16: - case EOpConvInt16ToUint16: - case EOpConvUint16ToInt16: -#endif + case EOpConvUint64ToUint: // unary operations case EOpNegative: @@ -2228,6 +2813,64 @@ } } +// Is the operation one that must propagate nonuniform? +bool TIntermediate::isNonuniformPropagating(TOperator op) const +{ + // "* All Operators in Section 5.1 (Operators), except for assignment, + // arithmetic assignment, and sequence + // * Component selection in Section 5.5 + // * Matrix components in Section 5.6 + // * Structure and Array Operations in Section 5.7, except for the length + // method." + switch (op) { + case EOpPostIncrement: + case EOpPostDecrement: + case EOpPreIncrement: + case EOpPreDecrement: + + case EOpNegative: + case EOpLogicalNot: + case EOpVectorLogicalNot: + case EOpBitwiseNot: + + case EOpAdd: + case EOpSub: + case EOpMul: + case EOpDiv: + case EOpMod: + case EOpRightShift: + case EOpLeftShift: + case EOpAnd: + case EOpInclusiveOr: + case EOpExclusiveOr: + case EOpEqual: + case EOpNotEqual: + case EOpLessThan: + case EOpGreaterThan: + case EOpLessThanEqual: + case EOpGreaterThanEqual: + case EOpVectorTimesScalar: + case EOpVectorTimesMatrix: + case EOpMatrixTimesVector: + case EOpMatrixTimesScalar: + + case EOpLogicalOr: + case EOpLogicalXor: + case EOpLogicalAnd: + + case EOpIndexDirect: + case EOpIndexIndirect: + case EOpIndexDirectStruct: + case EOpVectorSwizzle: + return true; + + default: + break; + } + + return false; +} + //////////////////////////////////////////////////////////////// // // Member functions of the nodes used for building the tree. @@ -2312,7 +2955,7 @@ // Convert operand to a boolean type if (operand->getBasicType() != EbtBool) { // Add constructor to boolean type. If that fails, we can't do it, so return false. - TIntermTyped* converted = convertToBasicType(op, EbtBool, operand); + TIntermTyped* converted = addConversion(op, TType(EbtBool), operand); if (converted == nullptr) return false; @@ -2321,15 +2964,7 @@ } break; case EOpBitwiseNot: - if (operand->getBasicType() != EbtInt && - operand->getBasicType() != EbtUint && -#ifdef AMD_EXTENSIONS - operand->getBasicType() != EbtInt16 && - operand->getBasicType() != EbtUint16 && -#endif - operand->getBasicType() != EbtInt64 && - operand->getBasicType() != EbtUint64) - + if (!isTypeInt(operand->getBasicType())) return false; break; case EOpNegative: @@ -2337,18 +2972,9 @@ case EOpPostDecrement: case EOpPreIncrement: case EOpPreDecrement: - if (operand->getBasicType() != EbtInt && - operand->getBasicType() != EbtUint && - operand->getBasicType() != EbtInt64 && - operand->getBasicType() != EbtUint64 && -#ifdef AMD_EXTENSIONS - operand->getBasicType() != EbtInt16 && - operand->getBasicType() != EbtUint16 && -#endif + if (!isTypeInt(operand->getBasicType()) && operand->getBasicType() != EbtFloat && -#ifdef AMD_EXTENSIONS operand->getBasicType() != EbtFloat16 && -#endif operand->getBasicType() != EbtDouble) return false; @@ -2368,34 +2994,12 @@ void TIntermUnary::updatePrecision() { -#ifdef AMD_EXTENSIONS if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat || getBasicType() == EbtFloat16) { -#else - if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat) { -#endif if (operand->getQualifier().precision > getQualifier().precision) getQualifier().precision = operand->getQualifier().precision; } } -// If it is not already, convert this node to the given basic type. -TIntermTyped* TIntermediate::convertToBasicType(TOperator op, TBasicType basicType, TIntermTyped* node) const -{ - if (node == nullptr) - return nullptr; - - // It's already this basic type: nothing needs to be done, so use the node directly. - if (node->getBasicType() == basicType) - return node; - - const TType& type = node->getType(); - const TType newType(basicType, type.getQualifier().storage, - type.getVectorSize(), type.getMatrixCols(), type.getMatrixRows(), type.isVector()); - - // Add constructor to the right vectorness of the right type. If that fails, we can't do it, so return nullptr. - return addConversion(op, newType, node); -} - // // See TIntermediate::promote // @@ -2468,8 +3072,10 @@ case EOpSub: case EOpDiv: case EOpMul: - left = addConversion(op, TType(EbtInt, EvqTemporary, left->getVectorSize()), left); - right = addConversion(op, TType(EbtInt, EvqTemporary, right->getVectorSize()), right); + if (left->getBasicType() == EbtBool) + left = createConversion(EbtInt, left); + if (right->getBasicType() == EbtBool) + right = createConversion(EbtInt, right); if (left == nullptr || right == nullptr) return false; node.setLeft(left); @@ -2520,21 +3126,17 @@ case EOpLogicalAnd: case EOpLogicalOr: case EOpLogicalXor: - if (getSource() == EShSourceHlsl) { - TIntermTyped* convertedL = convertToBasicType(op, EbtBool, left); - TIntermTyped* convertedR = convertToBasicType(op, EbtBool, right); - if (convertedL == nullptr || convertedR == nullptr) + // logical ops operate only on Booleans or vectors of Booleans. + if (left->getBasicType() != EbtBool || left->isMatrix()) return false; - node.setLeft(left = convertedL); // also updates stack variable - node.setRight(right = convertedR); // also updates stack variable - } else { + + if (getSource() == EShSourceGlsl) { // logical ops operate only on scalar Booleans and will promote to scalar Boolean. - if (left->getBasicType() != EbtBool || left->isVector() || left->isMatrix()) + if (left->isVector()) return false; } node.setType(TType(EbtBool, EvqTemporary, left->getVectorSize())); - break; case EOpRightShift: @@ -2555,16 +3157,7 @@ break; // Check for integer-only operands. - if ((left->getBasicType() != EbtInt && left->getBasicType() != EbtUint && -#ifdef AMD_EXTENSIONS - left->getBasicType() != EbtInt16 && left->getBasicType() != EbtUint16 && -#endif - left->getBasicType() != EbtInt64 && left->getBasicType() != EbtUint64) || - (right->getBasicType() != EbtInt && right->getBasicType() != EbtUint && -#ifdef AMD_EXTENSIONS - right->getBasicType() != EbtInt16 && right->getBasicType() != EbtUint16 && -#endif - right->getBasicType() != EbtInt64 && right->getBasicType() != EbtUint64)) + if (!isTypeInt(left->getBasicType()) && !isTypeInt(right->getBasicType())) return false; if (left->isMatrix() || right->isMatrix()) return false; @@ -2705,7 +3298,7 @@ node.setOp(op = EOpMatrixTimesScalarAssign); } } else if (left->isMatrix() && right->isMatrix()) { - if (left->getMatrixCols() != left->getMatrixRows() || left->getMatrixCols() != right->getMatrixCols() || left->getMatrixCols() != right->getMatrixRows()) + if (left->getMatrixCols() != right->getMatrixCols() || left->getMatrixCols() != right->getMatrixRows()) return false; node.setOp(op = EOpMatrixTimesMatrixAssign); } else if (!left->isMatrix() && !right->isMatrix()) { @@ -2865,11 +3458,7 @@ void TIntermBinary::updatePrecision() { -#ifdef AMD_EXTENSIONS if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat || getBasicType() == EbtFloat16) { -#else - if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat) { -#endif getQualifier().precision = std::max(right->getQualifier().precision, left->getQualifier().precision); if (getQualifier().precision != EpqNone) { left->propagatePrecision(getQualifier().precision); @@ -2880,11 +3469,7 @@ void TIntermTyped::propagatePrecision(TPrecisionQualifier newPrecision) { -#ifdef AMD_EXTENSIONS if (getQualifier().precision != EpqNone || (getBasicType() != EbtInt && getBasicType() != EbtUint && getBasicType() != EbtFloat && getBasicType() != EbtFloat16)) -#else - if (getQualifier().precision != EpqNone || (getBasicType() != EbtInt && getBasicType() != EbtUint && getBasicType() != EbtFloat)) -#endif return; getQualifier().precision = newPrecision; @@ -2959,9 +3544,7 @@ break; case EbtFloat: case EbtDouble: -#ifdef AMD_EXTENSIONS case EbtFloat16: -#endif leftUnionArray[i] = rightUnionArray[i]; break; default: @@ -2987,16 +3570,13 @@ break; case EbtFloat: case EbtDouble: -#ifdef AMD_EXTENSIONS case EbtFloat16: -#endif leftUnionArray[i] = rightUnionArray[i]; break; default: return node; } break; -#ifdef AMD_EXTENSIONS case EbtFloat16: switch (node->getType().getBasicType()) { case EbtInt: @@ -3023,7 +3603,6 @@ return node; } break; -#endif case EbtInt: switch (node->getType().getBasicType()) { case EbtInt: @@ -3043,9 +3622,7 @@ break; case EbtFloat: case EbtDouble: -#ifdef AMD_EXTENSIONS case EbtFloat16: -#endif leftUnionArray[i].setIConst(static_cast(rightUnionArray[i].getDConst())); break; default: @@ -3071,9 +3648,7 @@ break; case EbtFloat: case EbtDouble: -#ifdef AMD_EXTENSIONS case EbtFloat16: -#endif leftUnionArray[i].setUConst(static_cast(rightUnionArray[i].getDConst())); break; default: @@ -3099,9 +3674,7 @@ break; case EbtFloat: case EbtDouble: -#ifdef AMD_EXTENSIONS case EbtFloat16: -#endif leftUnionArray[i].setBConst(rightUnionArray[i].getDConst() != 0.0); break; default: @@ -3127,9 +3700,7 @@ break; case EbtFloat: case EbtDouble: -#ifdef AMD_EXTENSIONS case EbtFloat16: -#endif leftUnionArray[i].setI64Const(static_cast(rightUnionArray[i].getDConst())); break; default: @@ -3155,9 +3726,7 @@ break; case EbtFloat: case EbtDouble: -#ifdef AMD_EXTENSIONS case EbtFloat16: -#endif leftUnionArray[i].setU64Const(static_cast(rightUnionArray[i].getDConst())); break; default: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/intermOut.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/intermOut.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/intermOut.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/intermOut.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2016 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -224,48 +225,192 @@ case EOpPreIncrement: out.debug << "Pre-Increment"; break; case EOpPreDecrement: out.debug << "Pre-Decrement"; break; + // * -> bool + case EOpConvInt8ToBool: out.debug << "Convert int8_t to bool"; break; + case EOpConvUint8ToBool: out.debug << "Convert uint8_t to bool"; break; + case EOpConvInt16ToBool: out.debug << "Convert int16_t to bool"; break; + case EOpConvUint16ToBool: out.debug << "Convert uint16_t to bool";break; case EOpConvIntToBool: out.debug << "Convert int to bool"; break; case EOpConvUintToBool: out.debug << "Convert uint to bool"; break; - case EOpConvFloatToBool: out.debug << "Convert float to bool"; break; - case EOpConvDoubleToBool: out.debug << "Convert double to bool"; break; case EOpConvInt64ToBool: out.debug << "Convert int64 to bool"; break; case EOpConvUint64ToBool: out.debug << "Convert uint64 to bool"; break; - case EOpConvIntToFloat: out.debug << "Convert int to float"; break; - case EOpConvUintToFloat: out.debug << "Convert uint to float"; break; - case EOpConvDoubleToFloat: out.debug << "Convert double to float"; break; - case EOpConvInt64ToFloat: out.debug << "Convert int64 to float"; break; - case EOpConvUint64ToFloat: out.debug << "Convert uint64 to float"; break; - case EOpConvBoolToFloat: out.debug << "Convert bool to float"; break; - case EOpConvUintToInt: out.debug << "Convert uint to int"; break; - case EOpConvFloatToInt: out.debug << "Convert float to int"; break; - case EOpConvDoubleToInt: out.debug << "Convert double to int"; break; - case EOpConvBoolToInt: out.debug << "Convert bool to int"; break; - case EOpConvInt64ToInt: out.debug << "Convert int64 to int"; break; - case EOpConvUint64ToInt: out.debug << "Convert uint64 to int"; break; - case EOpConvIntToUint: out.debug << "Convert int to uint"; break; - case EOpConvFloatToUint: out.debug << "Convert float to uint"; break; - case EOpConvDoubleToUint: out.debug << "Convert double to uint"; break; + case EOpConvFloat16ToBool: out.debug << "Convert float16_t to bool"; break; + case EOpConvFloatToBool: out.debug << "Convert float to bool"; break; + case EOpConvDoubleToBool: out.debug << "Convert double to bool"; break; + + // bool -> * + case EOpConvBoolToInt8: out.debug << "Convert bool to int8_t"; break; + case EOpConvBoolToUint8: out.debug << "Convert bool to uint8_t"; break; + case EOpConvBoolToInt16: out.debug << "Convert bool to in16t_t"; break; + case EOpConvBoolToUint16: out.debug << "Convert bool to uint16_t";break; + case EOpConvBoolToInt: out.debug << "Convert bool to int" ; break; case EOpConvBoolToUint: out.debug << "Convert bool to uint"; break; - case EOpConvInt64ToUint: out.debug << "Convert int64 to uint"; break; - case EOpConvUint64ToUint: out.debug << "Convert uint64 to uint"; break; + case EOpConvBoolToInt64: out.debug << "Convert bool to int64"; break; + case EOpConvBoolToUint64: out.debug << "Convert bool to uint64";break; + case EOpConvBoolToFloat16: out.debug << "Convert bool to float16_t"; break; + case EOpConvBoolToFloat: out.debug << "Convert bool to float"; break; + case EOpConvBoolToDouble: out.debug << "Convert bool to double"; break; + + // int8_t -> (u)int* + case EOpConvInt8ToInt16: out.debug << "Convert int8_t to int16_t";break; + case EOpConvInt8ToInt: out.debug << "Convert int8_t to int"; break; + case EOpConvInt8ToInt64: out.debug << "Convert int8_t to int64"; break; + case EOpConvInt8ToUint8: out.debug << "Convert int8_t to uint8_t";break; + case EOpConvInt8ToUint16: out.debug << "Convert int8_t to uint16_t";break; + case EOpConvInt8ToUint: out.debug << "Convert int8_t to uint"; break; + case EOpConvInt8ToUint64: out.debug << "Convert int8_t to uint64"; break; + + // uint8_t -> (u)int* + case EOpConvUint8ToInt8: out.debug << "Convert uint8_t to int8_t";break; + case EOpConvUint8ToInt16: out.debug << "Convert uint8_t to int16_t";break; + case EOpConvUint8ToInt: out.debug << "Convert uint8_t to int"; break; + case EOpConvUint8ToInt64: out.debug << "Convert uint8_t to int64"; break; + case EOpConvUint8ToUint16: out.debug << "Convert uint8_t to uint16_t";break; + case EOpConvUint8ToUint: out.debug << "Convert uint8_t to uint"; break; + case EOpConvUint8ToUint64: out.debug << "Convert uint8_t to uint64"; break; + + // int8_t -> float* + case EOpConvInt8ToFloat16: out.debug << "Convert int8_t to float16_t";break; + case EOpConvInt8ToFloat: out.debug << "Convert int8_t to float"; break; + case EOpConvInt8ToDouble: out.debug << "Convert int8_t to double"; break; + + // uint8_t -> float* + case EOpConvUint8ToFloat16: out.debug << "Convert uint8_t to float16_t";break; + case EOpConvUint8ToFloat: out.debug << "Convert uint8_t to float"; break; + case EOpConvUint8ToDouble: out.debug << "Convert uint8_t to double"; break; + + // int16_t -> (u)int* + case EOpConvInt16ToInt8: out.debug << "Convert int16_t to int8_t";break; + case EOpConvInt16ToInt: out.debug << "Convert int16_t to int"; break; + case EOpConvInt16ToInt64: out.debug << "Convert int16_t to int64"; break; + case EOpConvInt16ToUint8: out.debug << "Convert int16_t to uint8_t";break; + case EOpConvInt16ToUint16: out.debug << "Convert int16_t to uint16_t";break; + case EOpConvInt16ToUint: out.debug << "Convert int16_t to uint"; break; + case EOpConvInt16ToUint64: out.debug << "Convert int16_t to uint64"; break; + + // int16_t -> float* + case EOpConvInt16ToFloat16: out.debug << "Convert int16_t to float16_t";break; + case EOpConvInt16ToFloat: out.debug << "Convert int16_t to float"; break; + case EOpConvInt16ToDouble: out.debug << "Convert int16_t to double"; break; + + // uint16_t -> (u)int* + case EOpConvUint16ToInt8: out.debug << "Convert uint16_t to int8_t";break; + case EOpConvUint16ToInt16: out.debug << "Convert uint16_t to int16_t";break; + case EOpConvUint16ToInt: out.debug << "Convert uint16_t to int"; break; + case EOpConvUint16ToInt64: out.debug << "Convert uint16_t to int64"; break; + case EOpConvUint16ToUint8: out.debug << "Convert uint16_t to uint8_t";break; + case EOpConvUint16ToUint: out.debug << "Convert uint16_t to uint"; break; + case EOpConvUint16ToUint64: out.debug << "Convert uint16_t to uint64"; break; + + // uint16_t -> float* + case EOpConvUint16ToFloat16: out.debug << "Convert uint16_t to float16_t";break; + case EOpConvUint16ToFloat: out.debug << "Convert uint16_t to float"; break; + case EOpConvUint16ToDouble: out.debug << "Convert uint16_t to double"; break; + + // int32_t -> (u)int* + case EOpConvIntToInt8: out.debug << "Convert int to int8_t";break; + case EOpConvIntToInt16: out.debug << "Convert int to int16_t";break; + case EOpConvIntToInt64: out.debug << "Convert int to int64"; break; + case EOpConvIntToUint8: out.debug << "Convert int to uint8_t";break; + case EOpConvIntToUint16: out.debug << "Convert int to uint16_t";break; + case EOpConvIntToUint: out.debug << "Convert int to uint"; break; + case EOpConvIntToUint64: out.debug << "Convert int to uint64"; break; + + // int32_t -> float* + case EOpConvIntToFloat16: out.debug << "Convert int to float16_t";break; + case EOpConvIntToFloat: out.debug << "Convert int to float"; break; case EOpConvIntToDouble: out.debug << "Convert int to double"; break; - case EOpConvUintToDouble: out.debug << "Convert uint to double"; break; - case EOpConvFloatToDouble: out.debug << "Convert float to double"; break; - case EOpConvBoolToDouble: out.debug << "Convert bool to double"; break; - case EOpConvInt64ToDouble: out.debug << "Convert int64 to double"; break; - case EOpConvUint64ToDouble: out.debug << "Convert uint64 to double"; break; - case EOpConvBoolToInt64: out.debug << "Convert bool to int64"; break; - case EOpConvIntToInt64: out.debug << "Convert int to int64"; break; + + // uint32_t -> (u)int* + case EOpConvUintToInt8: out.debug << "Convert uint to int8_t";break; + case EOpConvUintToInt16: out.debug << "Convert uint to int16_t";break; + case EOpConvUintToInt: out.debug << "Convert uint to int";break; case EOpConvUintToInt64: out.debug << "Convert uint to int64"; break; - case EOpConvFloatToInt64: out.debug << "Convert float to int64"; break; - case EOpConvDoubleToInt64: out.debug << "Convert double to int64"; break; - case EOpConvUint64ToInt64: out.debug << "Convert uint64 to int64"; break; - case EOpConvBoolToUint64: out.debug << "Convert bool to uint64"; break; - case EOpConvIntToUint64: out.debug << "Convert int to uint64"; break; - case EOpConvUintToUint64: out.debug << "Convert uint to uint64"; break; + case EOpConvUintToUint8: out.debug << "Convert uint to uint8_t";break; + case EOpConvUintToUint16: out.debug << "Convert uint to uint16_t";break; + case EOpConvUintToUint64: out.debug << "Convert uint to uint64"; break; + + // uint32_t -> float* + case EOpConvUintToFloat16: out.debug << "Convert uint to float16_t";break; + case EOpConvUintToFloat: out.debug << "Convert uint to float"; break; + case EOpConvUintToDouble: out.debug << "Convert uint to double"; break; + + // int64 -> (u)int* + case EOpConvInt64ToInt8: out.debug << "Convert int64 to int8_t"; break; + case EOpConvInt64ToInt16: out.debug << "Convert int64 to int16_t"; break; + case EOpConvInt64ToInt: out.debug << "Convert int64 to int"; break; + case EOpConvInt64ToUint8: out.debug << "Convert int64 to uint8_t";break; + case EOpConvInt64ToUint16: out.debug << "Convert int64 to uint16_t";break; + case EOpConvInt64ToUint: out.debug << "Convert int64 to uint"; break; + case EOpConvInt64ToUint64: out.debug << "Convert int64 to uint64"; break; + + // int64 -> float* + case EOpConvInt64ToFloat16: out.debug << "Convert int64 to float16_t";break; + case EOpConvInt64ToFloat: out.debug << "Convert int64 to float"; break; + case EOpConvInt64ToDouble: out.debug << "Convert int64 to double"; break; + + // uint64 -> (u)int* + case EOpConvUint64ToInt8: out.debug << "Convert uint64 to int8_t";break; + case EOpConvUint64ToInt16: out.debug << "Convert uint64 to int16_t";break; + case EOpConvUint64ToInt: out.debug << "Convert uint64 to int"; break; + case EOpConvUint64ToInt64: out.debug << "Convert uint64 to int64"; break; + case EOpConvUint64ToUint8: out.debug << "Convert uint64 to uint8_t";break; + case EOpConvUint64ToUint16: out.debug << "Convert uint64 to uint16"; break; + case EOpConvUint64ToUint: out.debug << "Convert uint64 to uint"; break; + + // uint64 -> float* + case EOpConvUint64ToFloat16: out.debug << "Convert uint64 to float16_t";break; + case EOpConvUint64ToFloat: out.debug << "Convert uint64 to float"; break; + case EOpConvUint64ToDouble: out.debug << "Convert uint64 to double"; break; + + // float16_t -> int* + case EOpConvFloat16ToInt8: out.debug << "Convert float16_t to int8_t"; break; + case EOpConvFloat16ToInt16: out.debug << "Convert float16_t to int16_t"; break; + case EOpConvFloat16ToInt: out.debug << "Convert float16_t to int"; break; + case EOpConvFloat16ToInt64: out.debug << "Convert float16_t to int64"; break; + + // float16_t -> uint* + case EOpConvFloat16ToUint8: out.debug << "Convert float16_t to uint8_t"; break; + case EOpConvFloat16ToUint16: out.debug << "Convert float16_t to uint16_t"; break; + case EOpConvFloat16ToUint: out.debug << "Convert float16_t to uint"; break; + case EOpConvFloat16ToUint64: out.debug << "Convert float16_t to uint64"; break; + + // float16_t -> float* + case EOpConvFloat16ToFloat: out.debug << "Convert float16_t to float"; break; + case EOpConvFloat16ToDouble: out.debug << "Convert float16_t to double"; break; + + // float32 -> float* + case EOpConvFloatToFloat16: out.debug << "Convert float to float16_t"; break; + case EOpConvFloatToDouble: out.debug << "Convert float to double"; break; + + // float32_t -> int* + case EOpConvFloatToInt8: out.debug << "Convert float to int8_t"; break; + case EOpConvFloatToInt16: out.debug << "Convert float to int16_t"; break; + case EOpConvFloatToInt: out.debug << "Convert float to int"; break; + case EOpConvFloatToInt64: out.debug << "Convert float to int64"; break; + + // float32_t -> uint* + case EOpConvFloatToUint8: out.debug << "Convert float to uint8_t"; break; + case EOpConvFloatToUint16: out.debug << "Convert float to uint16_t"; break; + case EOpConvFloatToUint: out.debug << "Convert float to uint"; break; case EOpConvFloatToUint64: out.debug << "Convert float to uint64"; break; + + // double -> float* + case EOpConvDoubleToFloat16: out.debug << "Convert double to float16_t"; break; + case EOpConvDoubleToFloat: out.debug << "Convert double to float"; break; + + // double -> int* + case EOpConvDoubleToInt8: out.debug << "Convert double to int8_t"; break; + case EOpConvDoubleToInt16: out.debug << "Convert double to int16_t"; break; + case EOpConvDoubleToInt: out.debug << "Convert double to int"; break; + case EOpConvDoubleToInt64: out.debug << "Convert double to int64"; break; + + // float32_t -> uint* + case EOpConvDoubleToUint8: out.debug << "Convert double to uint8_t"; break; + case EOpConvDoubleToUint16: out.debug << "Convert double to uint16_t"; break; + case EOpConvDoubleToUint: out.debug << "Convert double to uint"; break; case EOpConvDoubleToUint64: out.debug << "Convert double to uint64"; break; - case EOpConvInt64ToUint64: out.debug << "Convert uint64 to uint64"; break; + case EOpRadians: out.debug << "radians"; break; case EOpDegrees: out.debug << "degrees"; break; @@ -309,12 +454,10 @@ case EOpDoubleBitsToUint64: out.debug << "doubleBitsToUint64"; break; case EOpInt64BitsToDouble: out.debug << "int64BitsToDouble"; break; case EOpUint64BitsToDouble: out.debug << "uint64BitsToDouble"; break; -#ifdef AMD_EXTENSIONS case EOpFloat16BitsToInt16: out.debug << "float16BitsToInt16"; break; case EOpFloat16BitsToUint16: out.debug << "float16BitsToUint16"; break; case EOpInt16BitsToFloat16: out.debug << "int16BitsToFloat16"; break; case EOpUint16BitsToFloat16: out.debug << "uint16BitsToFloat16"; break; -#endif case EOpPackSnorm2x16: out.debug << "packSnorm2x16"; break; case EOpUnpackSnorm2x16:out.debug << "unpackSnorm2x16"; break; @@ -322,6 +465,12 @@ case EOpUnpackUnorm2x16:out.debug << "unpackUnorm2x16"; break; case EOpPackHalf2x16: out.debug << "packHalf2x16"; break; case EOpUnpackHalf2x16: out.debug << "unpackHalf2x16"; break; + case EOpPack16: out.debug << "pack16"; break; + case EOpPack32: out.debug << "pack32"; break; + case EOpPack64: out.debug << "pack64"; break; + case EOpUnpack32: out.debug << "unpack32"; break; + case EOpUnpack16: out.debug << "unpack16"; break; + case EOpUnpack8: out.debug << "unpack8"; break; case EOpPackSnorm4x8: out.debug << "PackSnorm4x8"; break; case EOpUnpackSnorm4x8: out.debug << "UnpackSnorm4x8"; break; @@ -335,7 +484,6 @@ case EOpPackUint2x32: out.debug << "packUint2x32"; break; case EOpUnpackUint2x32: out.debug << "unpackUint2x32"; break; -#ifdef AMD_EXTENSIONS case EOpPackInt2x16: out.debug << "packInt2x16"; break; case EOpUnpackInt2x16: out.debug << "unpackInt2x16"; break; case EOpPackUint2x16: out.debug << "packUint2x16"; break; @@ -345,10 +493,8 @@ case EOpUnpackInt4x16: out.debug << "unpackInt4x16"; break; case EOpPackUint4x16: out.debug << "packUint4x16"; break; case EOpUnpackUint4x16: out.debug << "unpackUint4x16"; break; - case EOpPackFloat2x16: out.debug << "packFloat2x16"; break; case EOpUnpackFloat2x16: out.debug << "unpackFloat2x16"; break; -#endif case EOpLength: out.debug << "length"; break; case EOpNormalize: out.debug << "normalize"; break; @@ -402,6 +548,82 @@ case EOpAllInvocations: out.debug << "allInvocations"; break; case EOpAllInvocationsEqual: out.debug << "allInvocationsEqual"; break; + case EOpSubgroupElect: out.debug << "subgroupElect"; break; + case EOpSubgroupAll: out.debug << "subgroupAll"; break; + case EOpSubgroupAny: out.debug << "subgroupAny"; break; + case EOpSubgroupAllEqual: out.debug << "subgroupAllEqual"; break; + case EOpSubgroupBroadcast: out.debug << "subgroupBroadcast"; break; + case EOpSubgroupBroadcastFirst: out.debug << "subgroupBroadcastFirst"; break; + case EOpSubgroupBallot: out.debug << "subgroupBallot"; break; + case EOpSubgroupInverseBallot: out.debug << "subgroupInverseBallot"; break; + case EOpSubgroupBallotBitExtract: out.debug << "subgroupBallotBitExtract"; break; + case EOpSubgroupBallotBitCount: out.debug << "subgroupBallotBitCount"; break; + case EOpSubgroupBallotInclusiveBitCount: out.debug << "subgroupBallotInclusiveBitCount"; break; + case EOpSubgroupBallotExclusiveBitCount: out.debug << "subgroupBallotExclusiveBitCount"; break; + case EOpSubgroupBallotFindLSB: out.debug << "subgroupBallotFindLSB"; break; + case EOpSubgroupBallotFindMSB: out.debug << "subgroupBallotFindMSB"; break; + case EOpSubgroupShuffle: out.debug << "subgroupShuffle"; break; + case EOpSubgroupShuffleXor: out.debug << "subgroupShuffleXor"; break; + case EOpSubgroupShuffleUp: out.debug << "subgroupShuffleUp"; break; + case EOpSubgroupShuffleDown: out.debug << "subgroupShuffleDown"; break; + case EOpSubgroupAdd: out.debug << "subgroupAdd"; break; + case EOpSubgroupMul: out.debug << "subgroupMul"; break; + case EOpSubgroupMin: out.debug << "subgroupMin"; break; + case EOpSubgroupMax: out.debug << "subgroupMax"; break; + case EOpSubgroupAnd: out.debug << "subgroupAnd"; break; + case EOpSubgroupOr: out.debug << "subgroupOr"; break; + case EOpSubgroupXor: out.debug << "subgroupXor"; break; + case EOpSubgroupInclusiveAdd: out.debug << "subgroupInclusiveAdd"; break; + case EOpSubgroupInclusiveMul: out.debug << "subgroupInclusiveMul"; break; + case EOpSubgroupInclusiveMin: out.debug << "subgroupInclusiveMin"; break; + case EOpSubgroupInclusiveMax: out.debug << "subgroupInclusiveMax"; break; + case EOpSubgroupInclusiveAnd: out.debug << "subgroupInclusiveAnd"; break; + case EOpSubgroupInclusiveOr: out.debug << "subgroupInclusiveOr"; break; + case EOpSubgroupInclusiveXor: out.debug << "subgroupInclusiveXor"; break; + case EOpSubgroupExclusiveAdd: out.debug << "subgroupExclusiveAdd"; break; + case EOpSubgroupExclusiveMul: out.debug << "subgroupExclusiveMul"; break; + case EOpSubgroupExclusiveMin: out.debug << "subgroupExclusiveMin"; break; + case EOpSubgroupExclusiveMax: out.debug << "subgroupExclusiveMax"; break; + case EOpSubgroupExclusiveAnd: out.debug << "subgroupExclusiveAnd"; break; + case EOpSubgroupExclusiveOr: out.debug << "subgroupExclusiveOr"; break; + case EOpSubgroupExclusiveXor: out.debug << "subgroupExclusiveXor"; break; + case EOpSubgroupClusteredAdd: out.debug << "subgroupClusteredAdd"; break; + case EOpSubgroupClusteredMul: out.debug << "subgroupClusteredMul"; break; + case EOpSubgroupClusteredMin: out.debug << "subgroupClusteredMin"; break; + case EOpSubgroupClusteredMax: out.debug << "subgroupClusteredMax"; break; + case EOpSubgroupClusteredAnd: out.debug << "subgroupClusteredAnd"; break; + case EOpSubgroupClusteredOr: out.debug << "subgroupClusteredOr"; break; + case EOpSubgroupClusteredXor: out.debug << "subgroupClusteredXor"; break; + case EOpSubgroupQuadBroadcast: out.debug << "subgroupQuadBroadcast"; break; + case EOpSubgroupQuadSwapHorizontal: out.debug << "subgroupQuadSwapHorizontal"; break; + case EOpSubgroupQuadSwapVertical: out.debug << "subgroupQuadSwapVertical"; break; + case EOpSubgroupQuadSwapDiagonal: out.debug << "subgroupQuadSwapDiagonal"; break; + +#ifdef NV_EXTENSIONS + case EOpSubgroupPartition: out.debug << "subgroupPartitionNV"; break; + case EOpSubgroupPartitionedAdd: out.debug << "subgroupPartitionedAddNV"; break; + case EOpSubgroupPartitionedMul: out.debug << "subgroupPartitionedMulNV"; break; + case EOpSubgroupPartitionedMin: out.debug << "subgroupPartitionedMinNV"; break; + case EOpSubgroupPartitionedMax: out.debug << "subgroupPartitionedMaxNV"; break; + case EOpSubgroupPartitionedAnd: out.debug << "subgroupPartitionedAndNV"; break; + case EOpSubgroupPartitionedOr: out.debug << "subgroupPartitionedOrNV"; break; + case EOpSubgroupPartitionedXor: out.debug << "subgroupPartitionedXorNV"; break; + case EOpSubgroupPartitionedInclusiveAdd: out.debug << "subgroupPartitionedInclusiveAddNV"; break; + case EOpSubgroupPartitionedInclusiveMul: out.debug << "subgroupPartitionedInclusiveMulNV"; break; + case EOpSubgroupPartitionedInclusiveMin: out.debug << "subgroupPartitionedInclusiveMinNV"; break; + case EOpSubgroupPartitionedInclusiveMax: out.debug << "subgroupPartitionedInclusiveMaxNV"; break; + case EOpSubgroupPartitionedInclusiveAnd: out.debug << "subgroupPartitionedInclusiveAndNV"; break; + case EOpSubgroupPartitionedInclusiveOr: out.debug << "subgroupPartitionedInclusiveOrNV"; break; + case EOpSubgroupPartitionedInclusiveXor: out.debug << "subgroupPartitionedInclusiveXorNV"; break; + case EOpSubgroupPartitionedExclusiveAdd: out.debug << "subgroupPartitionedExclusiveAddNV"; break; + case EOpSubgroupPartitionedExclusiveMul: out.debug << "subgroupPartitionedExclusiveMulNV"; break; + case EOpSubgroupPartitionedExclusiveMin: out.debug << "subgroupPartitionedExclusiveMinNV"; break; + case EOpSubgroupPartitionedExclusiveMax: out.debug << "subgroupPartitionedExclusiveMaxNV"; break; + case EOpSubgroupPartitionedExclusiveAnd: out.debug << "subgroupPartitionedExclusiveAndNV"; break; + case EOpSubgroupPartitionedExclusiveOr: out.debug << "subgroupPartitionedExclusiveOrNV"; break; + case EOpSubgroupPartitionedExclusiveXor: out.debug << "subgroupPartitionedExclusiveXorNV"; break; +#endif + case EOpClip: out.debug << "clip"; break; case EOpIsFinite: out.debug << "isfinite"; break; case EOpLog10: out.debug << "log10"; break; @@ -434,62 +656,11 @@ case EOpMbcnt: out.debug << "mbcnt"; break; - case EOpCubeFaceIndex: out.debug << "cubeFaceIndex"; break; - case EOpCubeFaceCoord: out.debug << "cubeFaceCoord"; break; - case EOpFragmentMaskFetch: out.debug << "fragmentMaskFetchAMD"; break; case EOpFragmentFetch: out.debug << "fragmentFetchAMD"; break; - case EOpConvBoolToFloat16: out.debug << "Convert bool to float16"; break; - case EOpConvIntToFloat16: out.debug << "Convert int to float16"; break; - case EOpConvUintToFloat16: out.debug << "Convert uint to float16"; break; - case EOpConvFloatToFloat16: out.debug << "Convert float to float16"; break; - case EOpConvDoubleToFloat16: out.debug << "Convert double to float16"; break; - case EOpConvInt64ToFloat16: out.debug << "Convert int64 to float16"; break; - case EOpConvUint64ToFloat16: out.debug << "Convert uint64 to float16"; break; - case EOpConvFloat16ToBool: out.debug << "Convert float16 to bool"; break; - case EOpConvFloat16ToInt: out.debug << "Convert float16 to int"; break; - case EOpConvFloat16ToUint: out.debug << "Convert float16 to uint"; break; - case EOpConvFloat16ToFloat: out.debug << "Convert float16 to float"; break; - case EOpConvFloat16ToDouble: out.debug << "Convert float16 to double"; break; - case EOpConvFloat16ToInt64: out.debug << "Convert float16 to int64"; break; - case EOpConvFloat16ToUint64: out.debug << "Convert float16 to uint64"; break; - - case EOpConvBoolToInt16: out.debug << "Convert bool to int16"; break; - case EOpConvIntToInt16: out.debug << "Convert int to int16"; break; - case EOpConvUintToInt16: out.debug << "Convert uint to int16"; break; - case EOpConvFloatToInt16: out.debug << "Convert float to int16"; break; - case EOpConvDoubleToInt16: out.debug << "Convert double to int16"; break; - case EOpConvFloat16ToInt16: out.debug << "Convert float16 to int16"; break; - case EOpConvInt64ToInt16: out.debug << "Convert int64 to int16"; break; - case EOpConvUint64ToInt16: out.debug << "Convert uint64 to int16"; break; - case EOpConvUint16ToInt16: out.debug << "Convert uint16 to int16"; break; - case EOpConvInt16ToBool: out.debug << "Convert int16 to bool"; break; - case EOpConvInt16ToInt: out.debug << "Convert int16 to int"; break; - case EOpConvInt16ToUint: out.debug << "Convert int16 to uint"; break; - case EOpConvInt16ToFloat: out.debug << "Convert int16 to float"; break; - case EOpConvInt16ToDouble: out.debug << "Convert int16 to double"; break; - case EOpConvInt16ToFloat16: out.debug << "Convert int16 to float16"; break; - case EOpConvInt16ToInt64: out.debug << "Convert int16 to int64"; break; - case EOpConvInt16ToUint64: out.debug << "Convert int16 to uint64"; break; - - case EOpConvBoolToUint16: out.debug << "Convert bool to uint16"; break; - case EOpConvIntToUint16: out.debug << "Convert int to uint16"; break; - case EOpConvUintToUint16: out.debug << "Convert uint to uint16"; break; - case EOpConvFloatToUint16: out.debug << "Convert float to uint16"; break; - case EOpConvDoubleToUint16: out.debug << "Convert double to uint16"; break; - case EOpConvFloat16ToUint16: out.debug << "Convert float16 to uint16"; break; - case EOpConvInt64ToUint16: out.debug << "Convert int64 to uint16"; break; - case EOpConvUint64ToUint16: out.debug << "Convert uint64 to uint16"; break; - case EOpConvInt16ToUint16: out.debug << "Convert int16 to uint16"; break; - case EOpConvUint16ToBool: out.debug << "Convert uint16 to bool"; break; - case EOpConvUint16ToInt: out.debug << "Convert uint16 to int"; break; - case EOpConvUint16ToUint: out.debug << "Convert uint16 to uint"; break; - case EOpConvUint16ToFloat: out.debug << "Convert uint16 to float"; break; - case EOpConvUint16ToDouble: out.debug << "Convert uint16 to double"; break; - case EOpConvUint16ToFloat16: out.debug << "Convert uint16 to float16"; break; - case EOpConvUint16ToInt64: out.debug << "Convert uint16 to int64"; break; - case EOpConvUint16ToUint64: out.debug << "Convert uint16 to uint64"; break; + case EOpCubeFaceIndex: out.debug << "cubeFaceIndex"; break; + case EOpCubeFaceCoord: out.debug << "cubeFaceCoord"; break; #endif case EOpSubpassLoad: out.debug << "subpassLoad"; break; @@ -537,23 +708,30 @@ case EOpConstructBVec2: out.debug << "Construct bvec2"; break; case EOpConstructBVec3: out.debug << "Construct bvec3"; break; case EOpConstructBVec4: out.debug << "Construct bvec4"; break; + case EOpConstructInt8: out.debug << "Construct int8_t"; break; + case EOpConstructI8Vec2: out.debug << "Construct i8vec2"; break; + case EOpConstructI8Vec3: out.debug << "Construct i8vec3"; break; + case EOpConstructI8Vec4: out.debug << "Construct i8vec4"; break; case EOpConstructInt: out.debug << "Construct int"; break; case EOpConstructIVec2: out.debug << "Construct ivec2"; break; case EOpConstructIVec3: out.debug << "Construct ivec3"; break; case EOpConstructIVec4: out.debug << "Construct ivec4"; break; + case EOpConstructUint8: out.debug << "Construct uint8_t"; break; + case EOpConstructU8Vec2: out.debug << "Construct u8vec2"; break; + case EOpConstructU8Vec3: out.debug << "Construct u8vec3"; break; + case EOpConstructU8Vec4: out.debug << "Construct u8vec4"; break; case EOpConstructUint: out.debug << "Construct uint"; break; case EOpConstructUVec2: out.debug << "Construct uvec2"; break; case EOpConstructUVec3: out.debug << "Construct uvec3"; break; case EOpConstructUVec4: out.debug << "Construct uvec4"; break; - case EOpConstructInt64: out.debug << "Construct int64_t"; break; + case EOpConstructInt64: out.debug << "Construct int64"; break; case EOpConstructI64Vec2: out.debug << "Construct i64vec2"; break; case EOpConstructI64Vec3: out.debug << "Construct i64vec3"; break; case EOpConstructI64Vec4: out.debug << "Construct i64vec4"; break; - case EOpConstructUint64: out.debug << "Construct uint64_t"; break; + case EOpConstructUint64: out.debug << "Construct uint64"; break; case EOpConstructU64Vec2: out.debug << "Construct u64vec2"; break; case EOpConstructU64Vec3: out.debug << "Construct u64vec3"; break; case EOpConstructU64Vec4: out.debug << "Construct u64vec4"; break; -#ifdef AMD_EXTENSIONS case EOpConstructInt16: out.debug << "Construct int16_t"; break; case EOpConstructI16Vec2: out.debug << "Construct i16vec2"; break; case EOpConstructI16Vec3: out.debug << "Construct i16vec3"; break; @@ -562,7 +740,6 @@ case EOpConstructU16Vec2: out.debug << "Construct u16vec2"; break; case EOpConstructU16Vec3: out.debug << "Construct u16vec3"; break; case EOpConstructU16Vec4: out.debug << "Construct u16vec4"; break; -#endif case EOpConstructMat2x2: out.debug << "Construct mat2"; break; case EOpConstructMat2x3: out.debug << "Construct mat2x3"; break; case EOpConstructMat2x4: out.debug << "Construct mat2x4"; break; @@ -608,7 +785,6 @@ case EOpConstructBMat4x2: out.debug << "Construct bmat4x2"; break; case EOpConstructBMat4x3: out.debug << "Construct bmat4x3"; break; case EOpConstructBMat4x4: out.debug << "Construct bmat4"; break; -#ifdef AMD_EXTENSIONS case EOpConstructFloat16: out.debug << "Construct float16_t"; break; case EOpConstructF16Vec2: out.debug << "Construct f16vec2"; break; case EOpConstructF16Vec3: out.debug << "Construct f16vec3"; break; @@ -622,7 +798,6 @@ case EOpConstructF16Mat4x2: out.debug << "Construct f16mat4x2"; break; case EOpConstructF16Mat4x3: out.debug << "Construct f16mat4x3"; break; case EOpConstructF16Mat4x4: out.debug << "Construct f16mat4"; break; -#endif case EOpConstructStruct: out.debug << "Construct structure"; break; case EOpConstructTextureSampler: out.debug << "Construct combined texture-sampler"; break; @@ -796,6 +971,62 @@ case EOpWorkgroupMemoryBarrier: out.debug << "WorkgroupMemoryBarrier"; break; case EOpWorkgroupMemoryBarrierWithGroupSync: out.debug << "WorkgroupMemoryBarrierWithGroupSync"; break; + case EOpSubgroupBarrier: out.debug << "subgroupBarrier"; break; + case EOpSubgroupMemoryBarrier: out.debug << "subgroupMemoryBarrier"; break; + case EOpSubgroupMemoryBarrierBuffer: out.debug << "subgroupMemoryBarrierBuffer"; break; + case EOpSubgroupMemoryBarrierImage: out.debug << "subgroupMemoryBarrierImage"; break; + case EOpSubgroupMemoryBarrierShared: out.debug << "subgroupMemoryBarrierShared"; break; + case EOpSubgroupElect: out.debug << "subgroupElect"; break; + case EOpSubgroupAll: out.debug << "subgroupAll"; break; + case EOpSubgroupAny: out.debug << "subgroupAny"; break; + case EOpSubgroupAllEqual: out.debug << "subgroupAllEqual"; break; + case EOpSubgroupBroadcast: out.debug << "subgroupBroadcast"; break; + case EOpSubgroupBroadcastFirst: out.debug << "subgroupBroadcastFirst"; break; + case EOpSubgroupBallot: out.debug << "subgroupBallot"; break; + case EOpSubgroupInverseBallot: out.debug << "subgroupInverseBallot"; break; + case EOpSubgroupBallotBitExtract: out.debug << "subgroupBallotBitExtract"; break; + case EOpSubgroupBallotBitCount: out.debug << "subgroupBallotBitCount"; break; + case EOpSubgroupBallotInclusiveBitCount: out.debug << "subgroupBallotInclusiveBitCount"; break; + case EOpSubgroupBallotExclusiveBitCount: out.debug << "subgroupBallotExclusiveBitCount"; break; + case EOpSubgroupBallotFindLSB: out.debug << "subgroupBallotFindLSB"; break; + case EOpSubgroupBallotFindMSB: out.debug << "subgroupBallotFindMSB"; break; + case EOpSubgroupShuffle: out.debug << "subgroupShuffle"; break; + case EOpSubgroupShuffleXor: out.debug << "subgroupShuffleXor"; break; + case EOpSubgroupShuffleUp: out.debug << "subgroupShuffleUp"; break; + case EOpSubgroupShuffleDown: out.debug << "subgroupShuffleDown"; break; + case EOpSubgroupAdd: out.debug << "subgroupAdd"; break; + case EOpSubgroupMul: out.debug << "subgroupMul"; break; + case EOpSubgroupMin: out.debug << "subgroupMin"; break; + case EOpSubgroupMax: out.debug << "subgroupMax"; break; + case EOpSubgroupAnd: out.debug << "subgroupAnd"; break; + case EOpSubgroupOr: out.debug << "subgroupOr"; break; + case EOpSubgroupXor: out.debug << "subgroupXor"; break; + case EOpSubgroupInclusiveAdd: out.debug << "subgroupInclusiveAdd"; break; + case EOpSubgroupInclusiveMul: out.debug << "subgroupInclusiveMul"; break; + case EOpSubgroupInclusiveMin: out.debug << "subgroupInclusiveMin"; break; + case EOpSubgroupInclusiveMax: out.debug << "subgroupInclusiveMax"; break; + case EOpSubgroupInclusiveAnd: out.debug << "subgroupInclusiveAnd"; break; + case EOpSubgroupInclusiveOr: out.debug << "subgroupInclusiveOr"; break; + case EOpSubgroupInclusiveXor: out.debug << "subgroupInclusiveXor"; break; + case EOpSubgroupExclusiveAdd: out.debug << "subgroupExclusiveAdd"; break; + case EOpSubgroupExclusiveMul: out.debug << "subgroupExclusiveMul"; break; + case EOpSubgroupExclusiveMin: out.debug << "subgroupExclusiveMin"; break; + case EOpSubgroupExclusiveMax: out.debug << "subgroupExclusiveMax"; break; + case EOpSubgroupExclusiveAnd: out.debug << "subgroupExclusiveAnd"; break; + case EOpSubgroupExclusiveOr: out.debug << "subgroupExclusiveOr"; break; + case EOpSubgroupExclusiveXor: out.debug << "subgroupExclusiveXor"; break; + case EOpSubgroupClusteredAdd: out.debug << "subgroupClusteredAdd"; break; + case EOpSubgroupClusteredMul: out.debug << "subgroupClusteredMul"; break; + case EOpSubgroupClusteredMin: out.debug << "subgroupClusteredMin"; break; + case EOpSubgroupClusteredMax: out.debug << "subgroupClusteredMax"; break; + case EOpSubgroupClusteredAnd: out.debug << "subgroupClusteredAnd"; break; + case EOpSubgroupClusteredOr: out.debug << "subgroupClusteredOr"; break; + case EOpSubgroupClusteredXor: out.debug << "subgroupClusteredXor"; break; + case EOpSubgroupQuadBroadcast: out.debug << "subgroupQuadBroadcast"; break; + case EOpSubgroupQuadSwapHorizontal: out.debug << "subgroupQuadSwapHorizontal"; break; + case EOpSubgroupQuadSwapVertical: out.debug << "subgroupQuadSwapVertical"; break; + case EOpSubgroupQuadSwapDiagonal: out.debug << "subgroupQuadSwapDiagonal"; break; + case EOpSubpassLoad: out.debug << "subpassLoad"; break; case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break; @@ -819,6 +1050,8 @@ out.debug << "Test condition and select"; out.debug << " (" << node->getCompleteString() << ")"; + if (node->getShortCircuit() == false) + out.debug << ": no shortcircuit"; if (node->getFlatten()) out.debug << ": Flatten"; if (node->getDontFlatten()) @@ -868,9 +1101,7 @@ break; case EbtFloat: case EbtDouble: -#ifdef AMD_EXTENSIONS case EbtFloat16: -#endif { const double value = constUnion[i].getDConst(); // Print infinities and NaNs in a portable way. @@ -890,62 +1121,78 @@ } } break; - case EbtInt: + case EbtInt8: { const int maxSize = 300; char buf[maxSize]; - snprintf(buf, maxSize, "%d (%s)", constUnion[i].getIConst(), "const int"); + snprintf(buf, maxSize, "%d (%s)", constUnion[i].getI8Const(), "const int8_t"); out.debug << buf << "\n"; } break; - case EbtUint: + case EbtUint8: { const int maxSize = 300; char buf[maxSize]; - snprintf(buf, maxSize, "%u (%s)", constUnion[i].getUConst(), "const uint"); + snprintf(buf, maxSize, "%u (%s)", constUnion[i].getU8Const(), "const uint8_t"); out.debug << buf << "\n"; } break; - case EbtInt64: + case EbtInt16: { const int maxSize = 300; char buf[maxSize]; - snprintf(buf, maxSize, "%lld (%s)", constUnion[i].getI64Const(), "const int64_t"); + snprintf(buf, maxSize, "%d (%s)", constUnion[i].getI16Const(), "const int16_t"); out.debug << buf << "\n"; } break; - case EbtUint64: + case EbtUint16: { const int maxSize = 300; char buf[maxSize]; - snprintf(buf, maxSize, "%llu (%s)", constUnion[i].getU64Const(), "const uint64_t"); + snprintf(buf, maxSize, "%u (%s)", constUnion[i].getU16Const(), "const uint16_t"); out.debug << buf << "\n"; } break; -#ifdef AMD_EXTENSIONS - case EbtInt16: + case EbtInt: { const int maxSize = 300; char buf[maxSize]; - snprintf(buf, maxSize, "%d (%s)", constUnion[i].getIConst(), "const int16_t"); + snprintf(buf, maxSize, "%d (%s)", constUnion[i].getIConst(), "const int"); out.debug << buf << "\n"; } break; - case EbtUint16: + case EbtUint: { const int maxSize = 300; char buf[maxSize]; - snprintf(buf, maxSize, "%u (%s)", constUnion[i].getUConst(), "const uint16_t"); + snprintf(buf, maxSize, "%u (%s)", constUnion[i].getUConst(), "const uint"); + + out.debug << buf << "\n"; + } + break; + case EbtInt64: + { + const int maxSize = 300; + char buf[maxSize]; + snprintf(buf, maxSize, "%lld (%s)", constUnion[i].getI64Const(), "const int64_t"); + + out.debug << buf << "\n"; + } + break; + case EbtUint64: + { + const int maxSize = 300; + char buf[maxSize]; + snprintf(buf, maxSize, "%llu (%s)", constUnion[i].getU64Const(), "const uint64_t"); out.debug << buf << "\n"; } break; -#endif default: out.info.message(EPrefixInternalError, "Unknown constant", node->getLoc()); break; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/iomapper.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/iomapper.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/iomapper.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/iomapper.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -353,7 +353,9 @@ { TDefaultIoResolverBase(const TIntermediate &intermediate) : intermediate(intermediate), - nextUniformLocation(0) + nextUniformLocation(0), + nextInputLocation(0), + nextOutputLocation(0) { } int getBaseBinding(TResourceType res, unsigned int set) const { @@ -429,7 +431,9 @@ // no locations added if already present, a built-in variable, a block, or an opaque if (type.getQualifier().hasLocation() || type.isBuiltIn() || - type.getBasicType() == EbtBlock || type.containsOpaque()) + type.getBasicType() == EbtBlock || + type.getBasicType() == EbtAtomicUint || + (type.containsOpaque() && intermediate.getSpv().openGl == 0)) return -1; // no locations on blocks of built-in variables @@ -440,13 +444,17 @@ return -1; } - return nextUniformLocation++; + int location = nextUniformLocation; + + nextUniformLocation += TIntermediate::computeTypeUniformLocationSize(type); + + return location; } bool validateInOut(EShLanguage /*stage*/, const char* /*name*/, const TType& /*type*/, bool /*is_live*/) override { return true; } - int resolveInOutLocation(EShLanguage /*stage*/, const char* /*name*/, const TType& type, bool /*is_live*/) override + int resolveInOutLocation(EShLanguage stage, const char* /*name*/, const TType& type, bool /*is_live*/) override { // kick out of not doing this if (!doAutoLocationMapping()) @@ -464,14 +472,15 @@ return -1; } - // Placeholder. - // TODO: It would be nice to flesh this out using - // intermediate->computeTypeLocationSize(type), or functions that call it like - // intermediate->addUsedLocation() - // These in turn would want the intermediate, which is not available here, but - // is available in many places, and a lot of copying from it could be saved if - // it were just available. - return 0; + // point to the right input or output location counter + int& nextLocation = type.getQualifier().isPipeInput() ? nextInputLocation : nextOutputLocation; + + // Placeholder. This does not do proper cross-stage lining up, nor + // work with mixed location/no-location declarations. + int location = nextLocation; + nextLocation += TIntermediate::computeTypeLocationSize(type, stage); + + return location; } int resolveInOutComponent(EShLanguage /*stage*/, const char* /*name*/, const TType& /*type*/, bool /*is_live*/) override { @@ -492,6 +501,8 @@ protected: const TIntermediate &intermediate; int nextUniformLocation; + int nextInputLocation; + int nextOutputLocation; // Return descriptor set specific base if there is one, and the generic base otherwise. int selectBaseBinding(int base, int descriptorSetBase) const { @@ -593,7 +604,7 @@ /******************************************************************************** The following IO resolver maps types in HLSL register space, as follows: -t – for shader resource views (SRV) +t - for shader resource views (SRV) TEXTURE1D TEXTURE1DARRAY TEXTURE2D @@ -608,7 +619,7 @@ BUFFER TBUFFER -s – for samplers +s - for samplers SAMPLER SAMPLER1D SAMPLER2D @@ -617,7 +628,7 @@ SAMPLERSTATE SAMPLERCOMPARISONSTATE -u – for unordered access views (UAV) +u - for unordered access views (UAV) RWBYTEADDRESSBUFFER RWSTRUCTUREDBUFFER APPENDSTRUCTUREDBUFFER @@ -629,7 +640,7 @@ RWTEXTURE2DARRAY RWTEXTURE3D -b – for constant buffer views (CBV) +b - for constant buffer views (CBV) CBUFFER CONSTANTBUFFER ********************************************************************************/ diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/linkValidate.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/linkValidate.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/linkValidate.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/linkValidate.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -1,5 +1,6 @@ // // Copyright (C) 2013 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -267,10 +268,13 @@ // Recursively merge the implicit array sizes through the objects' respective type trees. void TIntermediate::mergeImplicitArraySizes(TType& type, const TType& unitType) { - if (type.isImplicitlySizedArray() && unitType.isArray()) { - int newImplicitArraySize = unitType.isImplicitlySizedArray() ? unitType.getImplicitArraySize() : unitType.getOuterArraySize(); - if (newImplicitArraySize > type.getImplicitArraySize ()) - type.setImplicitArraySize(newImplicitArraySize); + if (type.isUnsizedArray()) { + if (unitType.isUnsizedArray()) { + type.updateImplicitArraySize(unitType.getImplicitArraySize()); + if (unitType.isArrayVariablyIndexed()) + type.setArrayVariablyIndexed(); + } else if (unitType.isSizedArray()) + type.changeOuterArraySize(unitType.getOuterArraySize()); } // Type mismatches are caught and reported after this, just be careful for now. @@ -293,8 +297,13 @@ // Types have to match if (symbol.getType() != unitSymbol.getType()) { - error(infoSink, "Types must match:"); - writeTypeComparison = true; + // but, we make an exception if one is an implicit array and the other is sized + if (! (symbol.getType().isArray() && unitSymbol.getType().isArray() && + symbol.getType().sameElementType(unitSymbol.getType()) && + (symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray()))) { + error(infoSink, "Types must match:"); + writeTypeComparison = true; + } } // Qualifiers have to (almost) match @@ -510,7 +519,9 @@ virtual void visitSymbol(TIntermSymbol* symbol) { // Implicitly size arrays. - symbol->getWritableType().adoptImplicitArraySizes(); + // If an unsized array is left as unsized, it effectively + // becomes run-time sized. + symbol->getWritableType().adoptImplicitArraySizes(false); } } finalLinkTraverser; @@ -765,7 +776,7 @@ int size; if (qualifier.isUniformOrBuffer()) { - if (type.isExplicitlySizedArray()) + if (type.isSizedArray()) size = type.getCumulativeArraySize(); else size = 1; @@ -773,9 +784,9 @@ // Strip off the outer array dimension for those having an extra one. if (type.isArray() && qualifier.isArrayedIo(language)) { TType elementType(type, 0); - size = computeTypeLocationSize(elementType); + size = computeTypeLocationSize(elementType, language); } else - size = computeTypeLocationSize(type); + size = computeTypeLocationSize(type, language); } // Locations, and components within locations. @@ -836,8 +847,8 @@ // combine location and component ranges TIoRange range(locationRange, componentRange, type.getBasicType(), qualifier.hasIndex() ? qualifier.layoutIndex : 0); - // check for collisions, except for vertex inputs on desktop - if (! (profile != EEsProfile && language == EShLangVertex && qualifier.isPipeInput())) + // check for collisions, except for vertex inputs on desktop targeting OpenGL + if (! (profile != EEsProfile && language == EShLangVertex && qualifier.isPipeInput()) || spvVersion.vulkan > 0) collision = checkLocationRange(set, range, type, typeCollision); if (collision < 0) @@ -907,18 +918,18 @@ // Recursively figure out how many locations are used up by an input or output type. // Return the size of type, as measured by "locations". -int TIntermediate::computeTypeLocationSize(const TType& type) const +int TIntermediate::computeTypeLocationSize(const TType& type, EShLanguage stage) { // "If the declared input is an array of size n and each element takes m locations, it will be assigned m * n // consecutive locations..." if (type.isArray()) { // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness + // TODO: are there valid cases of having an unsized array with a location? If so, running this code too early. TType elementType(type, 0); - if (type.isImplicitlySizedArray()) { - // TODO: are there valid cases of having an implicitly-sized array with a location? If so, running this code too early. - return computeTypeLocationSize(elementType); - } else - return type.getOuterArraySize() * computeTypeLocationSize(elementType); + if (type.isSizedArray()) + return type.getOuterArraySize() * computeTypeLocationSize(elementType, stage); + else + return computeTypeLocationSize(elementType, stage); } // "The locations consumed by block and structure members are determined by applying the rules above @@ -927,7 +938,7 @@ int size = 0; for (int member = 0; member < (int)type.getStruct()->size(); ++member) { TType memberType(type, member); - size += computeTypeLocationSize(memberType); + size += computeTypeLocationSize(memberType, stage); } return size; } @@ -941,7 +952,7 @@ if (type.isScalar()) return 1; if (type.isVector()) { - if (language == EShLangVertex && type.getQualifier().isPipeInput()) + if (stage == EShLangVertex && type.getQualifier().isPipeInput()) return 1; if (type.getBasicType() == EbtDouble && type.getVectorSize() > 2) return 2; @@ -954,13 +965,44 @@ // for an n-element array of m-component vectors..." if (type.isMatrix()) { TType columnType(type, 0); - return type.getMatrixCols() * computeTypeLocationSize(columnType); + return type.getMatrixCols() * computeTypeLocationSize(columnType, stage); } assert(0); return 1; } +// Same as computeTypeLocationSize but for uniforms +int TIntermediate::computeTypeUniformLocationSize(const TType& type) +{ + // "Individual elements of a uniform array are assigned + // consecutive locations with the first element taking location + // location." + if (type.isArray()) { + // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness + TType elementType(type, 0); + if (type.isSizedArray()) { + return type.getOuterArraySize() * computeTypeUniformLocationSize(elementType); + } else { + // TODO: are there valid cases of having an implicitly-sized array with a location? If so, running this code too early. + return computeTypeUniformLocationSize(elementType); + } + } + + // "Each subsequent inner-most member or element gets incremental + // locations for the entire structure or array." + if (type.isStruct()) { + int size = 0; + for (int member = 0; member < (int)type.getStruct()->size(); ++member) { + TType memberType(type, member); + size += computeTypeUniformLocationSize(memberType); + } + return size; + } + + return 1; +} + // Accumulate xfb buffer ranges and check for collisions as the accumulation is done. // // Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value. @@ -1005,7 +1047,7 @@ if (type.isArray()) { // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness - assert(type.isExplicitlySizedArray()); + assert(type.isSizedArray()); TType elementType(type, 0); return type.getOuterArraySize() * computeTypeXfbSize(elementType, containsDouble); } @@ -1064,11 +1106,11 @@ case EbtInt64: case EbtUint64: case EbtDouble: size = 8; return 8; -#ifdef AMD_EXTENSIONS - case EbtInt16: - case EbtUint16: case EbtFloat16: size = 2; return 2; -#endif + case EbtInt8: + case EbtUint8: size = 1; return 1; + case EbtInt16: + case EbtUint16: size = 2; return 2; default: size = 4; return 4; } } @@ -1197,6 +1239,8 @@ if (type.isVector()) { int scalarAlign = getBaseAlignmentScalar(type, size); switch (type.getVectorSize()) { + case 1: // HLSL has this, GLSL does not + return scalarAlign; case 2: size *= 2; return 2 * scalarAlign; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/localintermediate.h vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/localintermediate.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/localintermediate.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/localintermediate.h 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2016 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -78,7 +79,7 @@ assert(i < MaxSwizzleSelectors); return components[i]; } - + private: int size_; selectorType components[MaxSwizzleSelectors]; @@ -209,7 +210,7 @@ class TIntermediate { public: explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) : - implicitThisName("@this"), + implicitThisName("@this"), implicitCounterName("@count"), language(l), source(EShSourceNone), profile(p), version(v), treeRoot(0), numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false), invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet), @@ -217,6 +218,7 @@ pixelCenterInteger(false), originUpperLeft(false), vertexSpacing(EvsNone), vertexOrder(EvoNone), pointMode(false), earlyFragmentTests(false), postDepthCoverage(false), depthLayout(EldNone), depthReplacing(false), + hlslFunctionality1(false), blendEquations(0), xfbMode(false), multiStream(false), #ifdef NV_EXTENSIONS layoutOverrideCoverage(false), @@ -361,6 +363,13 @@ } bool usingHlslIoMapping() { return hlslIoMapping; } + template T addCounterBufferName(const T& name) const { return name + implicitCounterName; } + bool hasCounterBufferName(const TString& name) const { + size_t len = strlen(implicitCounterName); + return name.size() > len && + name.compare(name.size() - len, len, implicitCounterName) == 0; + } + void setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode) { textureSamplerTransformMode = mode; } void setVersion(int v) { version = v; } @@ -378,7 +387,7 @@ processes.addProcess("client opengl100"); // target-environment processes - if (spvVersion.vulkan == 100) + if (spvVersion.vulkan > 0) processes.addProcess("target-env vulkan1.0"); else if (spvVersion.vulkan > 0) processes.addProcess("target-env vulkanUnknown"); @@ -403,6 +412,7 @@ TIntermSymbol* addSymbol(const TType&, const TSourceLoc&); TIntermSymbol* addSymbol(const TIntermSymbol&); TIntermTyped* addConversion(TOperator, const TType&, TIntermTyped*) const; + std::tuple addConversion(TOperator op, TIntermTyped* node0, TIntermTyped* node1) const; TIntermTyped* addUniShapeConversion(TOperator, const TType&, TIntermTyped*); void addBiShapeConversion(TOperator, TIntermTyped*& lhsNode, TIntermTyped*& rhsNode); TIntermTyped* addShapeConversion(const TType&, TIntermTyped*); @@ -412,6 +422,11 @@ TIntermTyped* addUnaryMath(TOperator, TIntermTyped* child, TSourceLoc); TIntermTyped* addBuiltInFunctionCall(const TSourceLoc& line, TOperator, bool unary, TIntermNode*, const TType& returnType); bool canImplicitlyPromote(TBasicType from, TBasicType to, TOperator op = EOpNull) const; + bool isIntegralPromotion(TBasicType from, TBasicType to) const; + bool isFPPromotion(TBasicType from, TBasicType to) const; + bool isIntegralConversion(TBasicType from, TBasicType to) const; + bool isFPConversion(TBasicType from, TBasicType to) const; + bool isFPIntegralConversion(TBasicType from, TBasicType to) const; TOperator mapTypeToConstructorOp(const TType&) const; TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right); TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc&); @@ -425,15 +440,14 @@ TIntermTyped* addComma(TIntermTyped* left, TIntermTyped* right, const TSourceLoc&); TIntermTyped* addMethod(TIntermTyped*, const TType&, const TString*, const TSourceLoc&); TIntermConstantUnion* addConstantUnion(const TConstUnionArray&, const TType&, const TSourceLoc&, bool literal = false) const; + TIntermConstantUnion* addConstantUnion(signed char, const TSourceLoc&, bool literal = false) const; + TIntermConstantUnion* addConstantUnion(unsigned char, const TSourceLoc&, bool literal = false) const; + TIntermConstantUnion* addConstantUnion(signed short, const TSourceLoc&, bool literal = false) const; + TIntermConstantUnion* addConstantUnion(unsigned short, const TSourceLoc&, bool literal = false) const; TIntermConstantUnion* addConstantUnion(int, const TSourceLoc&, bool literal = false) const; TIntermConstantUnion* addConstantUnion(unsigned int, const TSourceLoc&, bool literal = false) const; TIntermConstantUnion* addConstantUnion(long long, const TSourceLoc&, bool literal = false) const; TIntermConstantUnion* addConstantUnion(unsigned long long, const TSourceLoc&, bool literal = false) const; -#ifdef AMD_EXTENSIONS - TIntermConstantUnion* addConstantUnion(short, const TSourceLoc&, bool literal = false) const; - TIntermConstantUnion* addConstantUnion(unsigned short, const TSourceLoc&, bool literal = false) const; - -#endif TIntermConstantUnion* addConstantUnion(bool, const TSourceLoc&, bool literal = false) const; TIntermConstantUnion* addConstantUnion(double, TBasicType, const TSourceLoc&, bool literal = false) const; TIntermConstantUnion* addConstantUnion(const TString*, const TSourceLoc&, bool literal = false) const; @@ -453,9 +467,6 @@ TIntermUnary* addUnaryNode(TOperator op, TIntermTyped* child, TSourceLoc) const; TIntermUnary* addUnaryNode(TOperator op, TIntermTyped* child, TSourceLoc, const TType&) const; - // Add conversion from node's type to given basic type. - TIntermTyped* convertToBasicType(TOperator op, TBasicType basicType, TIntermTyped* node) const; - // Constant folding (in Constant.cpp) TIntermTyped* fold(TIntermAggregate* aggrNode); TIntermTyped* foldConstructor(TIntermAggregate* aggrNode); @@ -561,6 +572,9 @@ void setDepthReplacing() { depthReplacing = true; } bool isDepthReplacing() const { return depthReplacing; } + void setHlslFunctionality1() { hlslFunctionality1 = true; } + bool getHlslFunctionality1() const { return hlslFunctionality1; } + void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); } unsigned int getBlendEquations() const { return blendEquations; } @@ -575,7 +589,8 @@ int checkLocationRange(int set, const TIoRange& range, const TType&, bool& typeCollision); int addUsedOffsets(int binding, int offset, int numOffsets); bool addUsedConstantId(int id); - int computeTypeLocationSize(const TType&) const; + static int computeTypeLocationSize(const TType&, EShLanguage); + static int computeTypeUniformLocationSize(const TType&); bool setXfbBufferStride(int buffer, unsigned stride) { @@ -604,7 +619,7 @@ return semanticNameSet.insert(name).first->c_str(); } - void setSourceFile(const char* file) { sourceFile = file; } + void setSourceFile(const char* file) { if (file != nullptr) sourceFile = file; } const std::string& getSourceFile() const { return sourceFile; } void addSourceText(const char* text) { sourceText = sourceText + text; } const std::string& getSourceText() const { return sourceText; } @@ -620,6 +635,7 @@ bool needsLegalization() const { return needToLegalize; } const char* const implicitThisName; + const char* const implicitCounterName; protected: TIntermSymbol* addSymbol(int Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&); @@ -635,6 +651,7 @@ TIntermSequence& findLinkerObjects() const; bool userOutputUsed() const; bool isSpecializationOperation(const TIntermOperator&) const; + bool isNonuniformPropagating(TOperator) const; bool promoteUnary(TIntermUnary&); bool promoteBinary(TIntermBinary&); void addSymbolLinkageNode(TIntermAggregate*& linkage, TSymbolTable&, const TString&); @@ -643,6 +660,10 @@ void pushSelector(TIntermSequence&, const TMatrixSelector&, const TSourceLoc&); bool specConstantPropagates(const TIntermTyped&, const TIntermTyped&); void performTextureUpgradeAndSamplerRemovalTransformation(TIntermNode* root); + bool isConversionAllowed(TOperator op, TIntermTyped* node) const; + TIntermUnary* createConversion(TBasicType convertTo, TIntermTyped* node) const; + std::tuple getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const; + bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();} static const char* getResourceName(TResourceType); const EShLanguage language; // stage, known at construction time @@ -650,8 +671,8 @@ std::string entryPointName; std::string entryPointMangledName; - EProfile profile; - int version; + EProfile profile; // source profile + int version; // source version SpvVersion spvVersion; TIntermNode* treeRoot; std::set requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them @@ -675,6 +696,7 @@ bool postDepthCoverage; TLayoutDepth depthLayout; bool depthReplacing; + bool hlslFunctionality1; int blendEquations; // an 'or'ing of masks of shifts of TBlendEquationShift bool xfbMode; bool multiStream; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/ParseContextBase.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/ParseContextBase.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/ParseContextBase.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/ParseContextBase.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -228,6 +228,7 @@ // must still be valid. // It is okay if the symbol's type will be subsequently edited; // the modifications will be tracked. +// Order is preserved, to avoid creating novel forward references. void TParseContextBase::trackLinkage(TSymbol& symbol) { if (!parsingBuiltins) @@ -242,7 +243,7 @@ error(loc, "", "[", "index out of range '%d'", index); index = 0; } else if (type.isArray()) { - if (type.isExplicitlySizedArray() && index >= type.getOuterArraySize()) { + if (type.isSizedArray() && index >= type.getOuterArraySize()) { error(loc, "", "[", "array index out of range '%d'", index); index = type.getOuterArraySize() - 1; } @@ -602,7 +603,7 @@ if (parsingBuiltins) return; - // Transfer the linkage symbols to AST nodes + // Transfer the linkage symbols to AST nodes, preserving order. TIntermAggregate* linkage = new TIntermAggregate; for (auto i = linkageSymbols.begin(); i != linkageSymbols.end(); ++i) intermediate.addSymbolLinkageNode(linkage, **i); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/ParseHelper.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/ParseHelper.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/ParseHelper.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/ParseHelper.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -2,6 +2,7 @@ // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2015 LunarG, Inc. // Copyright (C) 2015-2016 Google, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -266,6 +267,8 @@ if (tokens.size() != 1) error(loc, "extra tokens", "#pragma", ""); intermediate.setUseStorageBuffer(); + } else if (tokens[0].compare("once") == 0) { + warn(loc, "not implemented", "#pragma once", ""); } } @@ -281,17 +284,17 @@ requireExtensions(loc, symbol->getNumExtensions(), symbol->getExtensions(), symbol->getName().c_str()); if (symbol && symbol->isReadOnly()) { - // All shared things containing an implicitly sized array must be copied up + // All shared things containing an unsized array must be copied up // on first use, so that all future references will share its array structure, // so that editing the implicit size will effect all nodes consuming it, // and so that editing the implicit size won't change the shared one. // // If this is a variable or a block, check it and all it contains, but if this // is a member of an anonymous block, check the whole block, as the whole block - // will need to be copied up if it contains an implicitly-sized array. - if (symbol->getType().containsImplicitlySizedArray() || + // will need to be copied up if it contains an unsized array. + if (symbol->getType().containsUnsizedArray() || (symbol->getAsAnonMember() && - symbol->getAsAnonMember()->getAnonContainer().getType().containsImplicitlySizedArray())) + symbol->getAsAnonMember()->getAnonContainer().getType().containsUnsizedArray())) makeEditable(symbol); } @@ -369,21 +372,29 @@ } else { // at least one of base and index is not a front-end constant variable... + if (index->getQualifier().isFrontEndConstant()) + checkIndex(loc, base->getType(), indexValue); + if (base->getAsSymbolNode() && isIoResizeArray(base->getType())) handleIoResizeArrayAccess(loc, base); if (index->getQualifier().isFrontEndConstant()) { - if (base->getType().isImplicitlySizedArray()) - updateImplicitArraySize(loc, base, indexValue); + if (base->getType().isUnsizedArray()) + base->getWritableType().updateImplicitArraySize(indexValue + 1); else checkIndex(loc, base->getType(), indexValue); result = intermediate.addIndex(EOpIndexDirect, base, index, loc); } else { - if (base->getType().isImplicitlySizedArray()) { + if (base->getType().isUnsizedArray()) { + // we have a variable index into an unsized array, which is okay, + // depending on the situation if (base->getAsSymbolNode() && isIoResizeArray(base->getType())) error(loc, "", "[", "array must be sized by a redeclaration or layout qualifier before being indexed with a variable"); - else - error(loc, "", "[", "array must be redeclared with a size before being indexed with a variable"); + else { + // it is okay for a run-time sized array + checkRuntimeSizable(loc, *base); + } + base->getWritableType().setArrayVariablyIndexed(); } if (base->getBasicType() == EbtBlock) { if (base->getQualifier().storage == EvqBuffer) @@ -424,6 +435,10 @@ } result->setType(newType); + // Propagate nonuniform + if (base->getQualifier().isNonUniform() || index->getQualifier().isNonUniform()) + result->getWritableType().getQualifier().nonUniform = true; + if (anyIndexLimits) handleIndexLimits(loc, base, index); } @@ -482,7 +497,7 @@ if (language == EShLangTessControl || language == EShLangTessEvaluation) { if (type.getOuterArraySize() != resources.maxPatchVertices) { - if (type.isExplicitlySizedArray()) + if (type.isSizedArray()) error(loc, "tessellation input array size must be gl_MaxPatchVertices or implicitly sized", "[]", ""); type.changeOuterArraySize(resources.maxPatchVertices); } @@ -515,7 +530,7 @@ return; // fix array size, if it can be fixed and needs to be fixed (will allow variable indexing) - if (symbolNode->getType().isImplicitlySizedArray()) { + if (symbolNode->getType().isUnsizedArray()) { int newSize = getIoArrayImplicitSize(); if (newSize > 0) symbolNode->getWritableType().changeOuterArraySize(newSize); @@ -565,7 +580,7 @@ void TParseContext::checkIoArrayConsistency(const TSourceLoc& loc, int requiredSize, const char* feature, TType& type, const TString& name) { - if (type.isImplicitlySizedArray()) + if (type.isUnsizedArray()) type.changeOuterArraySize(requiredSize); else if (type.getOuterArraySize() != requiredSize) { if (language == EShLangGeometry) @@ -732,6 +747,10 @@ if (base->getQualifier().noContraction) result->getWritableType().getQualifier().noContraction = true; + // Propagate nonuniform + if (base->getQualifier().isNonUniform()) + result->getWritableType().getQualifier().nonUniform = true; + return result; } @@ -950,7 +969,7 @@ if (builtIn && fnCandidate->getNumExtensions()) requireExtensions(loc, fnCandidate->getNumExtensions(), fnCandidate->getExtensions(), fnCandidate->getName().c_str()); - if (arguments) { + if (arguments != nullptr) { // Make sure qualifications work for these arguments. TIntermAggregate* aggregate = arguments->getAsAggregate(); for (int i = 0; i < fnCandidate->getParamCount(); ++i) { @@ -988,7 +1007,7 @@ if (builtIn && fnCandidate->getBuiltInOp() != EOpNull) { // A function call mapped to a built-in operation. - result = handleBuiltInFunctionCall(loc, *arguments, *fnCandidate); + result = handleBuiltInFunctionCall(loc, arguments, *fnCandidate); } else { // This is a function call not mapped to built-in operator. // It could still be a built-in function, but only if PureOperatorBuiltins == false. @@ -1036,20 +1055,24 @@ return result; } -TIntermTyped* TParseContext::handleBuiltInFunctionCall(TSourceLoc loc, TIntermNode& arguments, +TIntermTyped* TParseContext::handleBuiltInFunctionCall(TSourceLoc loc, TIntermNode* arguments, const TFunction& function) { checkLocation(loc, function.getBuiltInOp()); TIntermTyped *result = intermediate.addBuiltInFunctionCall(loc, function.getBuiltInOp(), function.getParamCount() == 1, - &arguments, function.getType()); + arguments, function.getType()); if (obeyPrecisionQualifiers()) computeBuiltinPrecisions(*result, function); - if (result == nullptr) { - error(arguments.getLoc(), " wrong operand type", "Internal Error", - "built in unary operator function. Type: %s", - static_cast(&arguments)->getCompleteString().c_str()); + if (result == nullptr) { + if (arguments == nullptr) + error(loc, " wrong operand type", "Internal Error", + "built in unary operator function. Type: %s", ""); + else + error(arguments->getLoc(), " wrong operand type", "Internal Error", + "built in unary operator function. Type: %s", + static_cast(arguments)->getCompleteString().c_str()); } else if (result->getAsOperator()) builtInOpCheck(loc, function, *result->getAsOperator()); @@ -1208,10 +1231,7 @@ else { const TType& type = intermNode->getAsTyped()->getType(); if (type.isArray()) { - if (type.isRuntimeSizedArray()) { - // Create a unary op and let the back end handle it - return intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, intermNode, TType(EbtInt)); - } else if (type.isImplicitlySizedArray()) { + if (type.isUnsizedArray()) { if (intermNode->getAsSymbolNode() && isIoResizeArray(type)) { // We could be between a layout declaration that gives a built-in io array implicit size and // a user redeclaration of that array, meaning we have to substitute its implicit size here @@ -1224,7 +1244,10 @@ if (length == 0) { if (intermNode->getAsSymbolNode() && isIoResizeArray(type)) error(loc, "", function->getName().c_str(), "array must first be sized by a redeclaration or layout qualifier"); - else + else if (isRuntimeLength(*intermNode->getAsTyped())) { + // Create a unary op and let the back end handle it + return intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, intermNode, TType(EbtInt)); + } else error(loc, "", function->getName().c_str(), "array must be declared with a size before using this method"); } } else if (type.getOuterArrayNode()) { @@ -1487,6 +1510,39 @@ requireExtensions(loc, 1, &E_GL_ARB_sparse_texture2, fnCandidate.getName().c_str()); break; } + + case EOpSwizzleInvocations: + { + if (! (*argp)[1]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "offset", ""); + else { + unsigned offset[4] = {}; + offset[0] = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getUConst(); + offset[1] = (*argp)[1]->getAsConstantUnion()->getConstArray()[1].getUConst(); + offset[2] = (*argp)[1]->getAsConstantUnion()->getConstArray()[2].getUConst(); + offset[3] = (*argp)[1]->getAsConstantUnion()->getConstArray()[3].getUConst(); + if (offset[0] > 3 || offset[1] > 3 || offset[2] > 3 || offset[3] > 3) + error(loc, "components must be in the range [0, 3]", "offset", ""); + } + + break; + } + + case EOpSwizzleInvocationsMasked: + { + if (! (*argp)[1]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "mask", ""); + else { + unsigned mask[3] = {}; + mask[0] = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getUConst(); + mask[1] = (*argp)[1]->getAsConstantUnion()->getConstArray()[1].getUConst(); + mask[2] = (*argp)[1]->getAsConstantUnion()->getConstArray()[2].getUConst(); + if (mask[0] > 31 || mask[1] > 31 || mask[2] > 31) + error(loc, "components must be in the range [0, 31]", "mask", ""); + } + + break; + } #endif case EOpTextureOffset: @@ -1514,6 +1570,12 @@ } if (arg > 0) { + +#ifdef AMD_EXTENSIONS + bool f16ShadowCompare = (*argp)[1]->getAsTyped()->getBasicType() == EbtFloat16 && arg0->getType().getSampler().shadow; + if (f16ShadowCompare) + ++arg; +#endif if (! (*argp)[arg]->getAsConstantUnion()) error(loc, "argument must be compile-time constant", "texel offset", ""); else { @@ -1579,6 +1641,9 @@ case EOpInterpolateAtCentroid: case EOpInterpolateAtSample: case EOpInterpolateAtOffset: +#ifdef AMD_EXTENSIONS + case EOpInterpolateAtVertex: +#endif // Make sure the first argument is an interpolant, or an array element of an interpolant if (arg0->getType().getQualifier().storage != EvqVaryingIn) { // It might still be an array element. @@ -1593,6 +1658,23 @@ if (base == nullptr || base->getType().getQualifier().storage != EvqVaryingIn) error(loc, "first argument must be an interpolant, or interpolant-array element", fnCandidate.getName().c_str(), ""); } + +#ifdef AMD_EXTENSIONS + if (callNode.getOp() == EOpInterpolateAtVertex) { + if (!arg0->getType().getQualifier().isExplicitInterpolation()) + error(loc, "argument must be qualified as __explicitInterpAMD in", "interpolant", ""); + else { + if (! (*argp)[1]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "vertex index", ""); + else { + unsigned vertexIdx = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (vertexIdx > 2) + error(loc, "must be in the range [0, 2]", "vertex index", ""); + } + } + } +#endif + break; case EOpEmitStreamVertex: @@ -1600,9 +1682,33 @@ intermediate.setMultiStream(); break; + case EOpSubgroupClusteredAdd: + case EOpSubgroupClusteredMul: + case EOpSubgroupClusteredMin: + case EOpSubgroupClusteredMax: + case EOpSubgroupClusteredAnd: + case EOpSubgroupClusteredOr: + case EOpSubgroupClusteredXor: + if ((*argp)[1]->getAsConstantUnion() == nullptr) + error(loc, "argument must be compile-time constant", "cluster size", ""); + else { + int size = (*argp)[1]->getAsConstantUnion()->getConstArray()[0].getIConst(); + if (size < 1) + error(loc, "argument must be at least 1", "cluster size", ""); + else if (!IsPow2(size)) + error(loc, "argument must be a power of 2", "cluster size", ""); + } + break; + default: break; } + + if (callNode.getOp() > EOpSubgroupGuardStart && callNode.getOp() < EOpSubgroupGuardStop) { + // these require SPIR-V 1.3 + if (spvVersion.spv > 0 && spvVersion.spv < EShTargetSpv_1_3) + error(loc, "requires SPIR-V 1.3", "subgroup op", ""); + } } extern bool PureOperatorBuiltins; @@ -2164,7 +2270,6 @@ case EOpConstructDMat4x2: case EOpConstructDMat4x3: case EOpConstructDMat4x4: -#ifdef AMD_EXTENSIONS case EOpConstructF16Mat2x2: case EOpConstructF16Mat2x3: case EOpConstructF16Mat2x4: @@ -2174,7 +2279,6 @@ case EOpConstructF16Mat4x2: case EOpConstructF16Mat4x3: case EOpConstructF16Mat4x4: -#endif constructingMatrix = true; break; default: @@ -2195,7 +2299,7 @@ bool floatArgument = false; for (int arg = 0; arg < function.getParamCount(); ++arg) { if (function[arg].type->isArray()) { - if (! function[arg].type->isExplicitlySizedArray()) { + if (function[arg].type->isUnsizedArray()) { // Can't construct from an unsized array. error(loc, "array argument must be sized", "constructor", ""); return true; @@ -2231,18 +2335,30 @@ // Finish pinning down spec-const semantics if (specConstType) { switch (op) { + case EOpConstructInt8: + case EOpConstructUint8: + case EOpConstructInt16: + case EOpConstructUint16: case EOpConstructInt: case EOpConstructUint: case EOpConstructInt64: case EOpConstructUint64: -#ifdef AMD_EXTENSIONS - case EOpConstructInt16: - case EOpConstructUint16: -#endif case EOpConstructBool: case EOpConstructBVec2: case EOpConstructBVec3: case EOpConstructBVec4: + case EOpConstructI8Vec2: + case EOpConstructI8Vec3: + case EOpConstructI8Vec4: + case EOpConstructU8Vec2: + case EOpConstructU8Vec3: + case EOpConstructU8Vec4: + case EOpConstructI16Vec2: + case EOpConstructI16Vec3: + case EOpConstructI16Vec4: + case EOpConstructU16Vec2: + case EOpConstructU16Vec3: + case EOpConstructU16Vec4: case EOpConstructIVec2: case EOpConstructIVec3: case EOpConstructIVec4: @@ -2255,14 +2371,6 @@ case EOpConstructU64Vec2: case EOpConstructU64Vec3: case EOpConstructU64Vec4: -#ifdef AMD_EXTENSIONS - case EOpConstructI16Vec2: - case EOpConstructI16Vec3: - case EOpConstructI16Vec4: - case EOpConstructU16Vec2: - case EOpConstructU16Vec3: - case EOpConstructU16Vec4: -#endif // This was the list of valid ones, if they aren't converting from float // and aren't making an array. makeSpecConst = ! floatArgument && ! type.isArray(); @@ -2289,7 +2397,7 @@ return true; } - if (type.isImplicitlySizedArray()) { + if (type.isUnsizedArray()) { // auto adapt the constructor type to the number of arguments type.changeOuterArraySize(function.getParamCount()); } else if (type.getOuterArraySize() != function.getParamCount()) { @@ -2301,20 +2409,21 @@ // Types have to match, but we're still making the type. // Finish making the type, and the comparison is done later // when checking for conversion. - TArraySizes& arraySizes = type.getArraySizes(); + TArraySizes& arraySizes = *type.getArraySizes(); // At least the dimensionalities have to match. - if (! function[0].type->isArray() || arraySizes.getNumDims() != function[0].type->getArraySizes().getNumDims() + 1) { + if (! function[0].type->isArray() || + arraySizes.getNumDims() != function[0].type->getArraySizes()->getNumDims() + 1) { error(loc, "array constructor argument not correct type to construct array element", "constructor", ""); return true; } - if (arraySizes.isInnerImplicit()) { + if (arraySizes.isInnerUnsized()) { // "Arrays of arrays ..., and the size for any dimension is optional" // That means we need to adopt (from the first argument) the other array sizes into the type. for (int d = 1; d < arraySizes.getNumDims(); ++d) { if (arraySizes.getDimSize(d) == UnsizedArraySize) { - arraySizes.setDimSize(d, function[0].type->getArraySizes().getDimSize(d - 1)); + arraySizes.setDimSize(d, function[0].type->getArraySizes()->getDimSize(d - 1)); } } } @@ -2516,16 +2625,32 @@ } // +// Qualifier checks knowing the qualifier and that it is a member of a struct/block. +// +void TParseContext::memberQualifierCheck(glslang::TPublicType& publicType) +{ + globalQualifierFixCheck(publicType.loc, publicType.qualifier); + checkNoShaderLayouts(publicType.loc, publicType.shaderQualifiers); + if (publicType.qualifier.isNonUniform()) { + error(publicType.loc, "not allowed on block or structure members", "nonuniformEXT", ""); + publicType.qualifier.nonUniform = false; + } +} + +// // Check/fix just a full qualifier (no variables or types yet, but qualifier is complete) at global level. // void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& qualifier) { + bool nonuniformOkay = false; + // move from parameter/unknown qualifiers to pipeline in/out qualifiers switch (qualifier.storage) { case EvqIn: profileRequires(loc, ENoProfile, 130, nullptr, "in for stage inputs"); profileRequires(loc, EEsProfile, 300, nullptr, "in for stage inputs"); qualifier.storage = EvqVaryingIn; + nonuniformOkay = true; break; case EvqOut: profileRequires(loc, ENoProfile, 130, nullptr, "out for stage outputs"); @@ -2536,10 +2661,17 @@ qualifier.storage = EvqVaryingIn; error(loc, "cannot use 'inout' at global scope", "", ""); break; + case EvqGlobal: + case EvqTemporary: + nonuniformOkay = true; + break; default: break; } + if (!nonuniformOkay && qualifier.nonUniform) + error(loc, "for non-parameter, can only apply to 'in' or no storage qualifier", "nonuniformEXT", ""); + invariantCheck(loc, qualifier); } @@ -2570,12 +2702,7 @@ return; } - if (publicType.basicType == EbtInt || publicType.basicType == EbtUint || -#ifdef AMD_EXTENSIONS - publicType.basicType == EbtInt16 || publicType.basicType == EbtUint16 || -#endif - publicType.basicType == EbtInt64 || publicType.basicType == EbtUint64 || - publicType.basicType == EbtDouble) + if (isTypeInt(publicType.basicType) || publicType.basicType == EbtDouble) profileRequires(loc, EEsProfile, 300, nullptr, "shader input/output"); #ifdef AMD_EXTENSIONS @@ -2583,13 +2710,13 @@ #else if (!qualifier.flat) { #endif - if (publicType.basicType == EbtInt || publicType.basicType == EbtUint || -#ifdef AMD_EXTENSIONS - publicType.basicType == EbtInt16 || publicType.basicType == EbtUint16 || -#endif - publicType.basicType == EbtInt64 || publicType.basicType == EbtUint64 || + if (isTypeInt(publicType.basicType) || publicType.basicType == EbtDouble || - (publicType.userDef && (publicType.userDef->containsBasicType(EbtInt) || + (publicType.userDef && (publicType.userDef->containsBasicType(EbtInt8) || + publicType.userDef->containsBasicType(EbtUint8) || + publicType.userDef->containsBasicType(EbtInt16) || + publicType.userDef->containsBasicType(EbtUint16) || + publicType.userDef->containsBasicType(EbtInt) || publicType.userDef->containsBasicType(EbtUint) || publicType.userDef->containsBasicType(EbtInt64) || publicType.userDef->containsBasicType(EbtUint64) || @@ -2691,8 +2818,8 @@ error(loc, "can't use auxiliary qualifier on a fragment output", "centroid/sample/patch", ""); if (qualifier.isInterpolation()) error(loc, "can't use interpolation qualifier on a fragment output", "flat/smooth/noperspective", ""); - if (publicType.basicType == EbtDouble) - error(loc, "cannot contain a double", GetStorageQualifierString(qualifier.storage), ""); + if (publicType.basicType == EbtDouble || publicType.basicType == EbtInt64 || publicType.basicType == EbtUint64) + error(loc, "cannot contain a double, int64, or uint64", GetStorageQualifierString(qualifier.storage), ""); break; case EShLangCompute: @@ -2793,6 +2920,7 @@ MERGE_SINGLETON(readonly); MERGE_SINGLETON(writeonly); MERGE_SINGLETON(specConstant); + MERGE_SINGLETON(nonUniform); if (repeated) error(loc, "replicated qualifiers", "", ""); @@ -2993,7 +3121,7 @@ // void TParseContext::arraySizeRequiredCheck(const TSourceLoc& loc, const TArraySizes& arraySizes) { - if (arraySizes.isImplicit()) + if (arraySizes.hasUnsized()) error(loc, "array size required", "", ""); } @@ -3020,9 +3148,9 @@ return; // No environment allows any non-outer-dimension to be implicitly sized - if (arraySizes->isInnerImplicit()) { + if (arraySizes->isInnerUnsized()) { error(loc, "only outermost dimension of an array of arrays can be implicitly sized", "[]", ""); - arraySizes->clearInnerImplicit(); + arraySizes->clearInnerUnsized(); } if (arraySizes->isInnerSpecialization()) @@ -3068,8 +3196,11 @@ arraySizeRequiredCheck(loc, *arraySizes); } -void TParseContext::arrayOfArrayVersionCheck(const TSourceLoc& loc) +void TParseContext::arrayOfArrayVersionCheck(const TSourceLoc& loc, const TArraySizes* sizes) { + if (sizes == nullptr || sizes->getNumDims() == 1) + return; + const char* feature = "arrays of arrays"; requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, feature); @@ -3077,36 +3208,6 @@ profileRequires(loc, ECoreProfile | ECompatibilityProfile, 430, nullptr, feature); } -void TParseContext::arrayDimCheck(const TSourceLoc& loc, const TArraySizes* sizes1, const TArraySizes* sizes2) -{ - if ((sizes1 && sizes2) || - (sizes1 && sizes1->getNumDims() > 1) || - (sizes2 && sizes2->getNumDims() > 1)) - arrayOfArrayVersionCheck(loc); -} - -void TParseContext::arrayDimCheck(const TSourceLoc& loc, const TType* type, const TArraySizes* sizes2) -{ - // skip checking for multiple dimensions on the type; it was caught earlier - if ((type && type->isArray() && sizes2) || - (sizes2 && sizes2->getNumDims() > 1)) - arrayOfArrayVersionCheck(loc); -} - -// Merge array dimensions listed in 'sizes' onto the type's array dimensions. -// -// From the spec: "vec4[2] a[3]; // size-3 array of size-2 array of vec4" -// -// That means, the 'sizes' go in front of the 'type' as outermost sizes. -// 'type' is the type part of the declaration (to the left) -// 'sizes' is the arrayness tagged on the identifier (to the right) -// -void TParseContext::arrayDimMerge(TType& type, const TArraySizes* sizes) -{ - if (sizes != nullptr) - type.addArrayOuterSizes(*sizes); -} - // // Do all the semantic checking for declaring or redeclaring an array, with and // without a size, and make the right changes to the symbol table. @@ -3176,7 +3277,7 @@ return; } - if (existingType.isExplicitlySizedArray()) { + if (existingType.isSizedArray()) { // be more leniant for input arrays to geometry shaders and tessellation control outputs, where the redeclaration is the same size if (! (isIoResizeArray(type) && existingType.getOuterArraySize() == type.getOuterArraySize())) error(loc, "redeclaration of array with size", identifier.c_str(), ""); @@ -3191,64 +3292,37 @@ checkIoArraysConsistency(loc); } -void TParseContext::updateImplicitArraySize(const TSourceLoc& loc, TIntermNode *node, int index) +// Policy and error check for needing a runtime sized array. +void TParseContext::checkRuntimeSizable(const TSourceLoc& loc, const TIntermTyped& base) { - // maybe there is nothing to do... - TIntermTyped* typedNode = node->getAsTyped(); - if (typedNode->getType().getImplicitArraySize() > index) - return; - - // something to do... - - // Figure out what symbol to lookup, as we will use its type to edit for the size change, - // as that type will be shared through shallow copies for future references. - TSymbol* symbol = nullptr; - int blockIndex = -1; - const TString* lookupName = nullptr; - if (node->getAsSymbolNode()) - lookupName = &node->getAsSymbolNode()->getName(); - else if (node->getAsBinaryNode()) { - const TIntermBinary* deref = node->getAsBinaryNode(); - // This has to be the result of a block dereference, unless it's bad shader code - // If it's a uniform block, then an error will be issued elsewhere, but - // return early now to avoid crashing later in this function. - if (deref->getLeft()->getBasicType() != EbtBlock || - deref->getLeft()->getType().getQualifier().storage == EvqUniform || - deref->getRight()->getAsConstantUnion() == nullptr) - return; + // runtime length implies runtime sizeable, so no problem + if (isRuntimeLength(base)) + return; - const TIntermTyped* left = deref->getLeft(); - const TIntermTyped* right = deref->getRight(); + // check for additional things allowed by GL_EXT_nonuniform_qualifier + if (base.getBasicType() == EbtSampler || + (base.getBasicType() == EbtBlock && base.getType().getQualifier().isUniformOrBuffer())) + requireExtensions(loc, 1, &E_GL_EXT_nonuniform_qualifier, "variable index"); + else + error(loc, "", "[", "array must be redeclared with a size before being indexed with a variable"); +} - if (left->getAsBinaryNode()) { - left = left->getAsBinaryNode()->getLeft(); // Block array access - assert(left->isArray()); +// Policy decision for whether a run-time .length() is allowed. +bool TParseContext::isRuntimeLength(const TIntermTyped& base) const +{ + if (base.getType().getQualifier().storage == EvqBuffer) { + // in a buffer block + const TIntermBinary* binary = base.getAsBinaryNode(); + if (binary != nullptr && binary->getOp() == EOpIndexDirectStruct) { + // is it the last member? + const int index = binary->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst(); + const int memberCount = (int)binary->getLeft()->getType().getStruct()->size(); + if (index == memberCount - 1) + return true; } - - if (! left->getAsSymbolNode()) - return; - - blockIndex = right->getAsConstantUnion()->getConstArray()[0].getIConst(); - - lookupName = &left->getAsSymbolNode()->getName(); - if (IsAnonymous(*lookupName)) - lookupName = &(*left->getType().getStruct())[blockIndex].type->getFieldName(); - } - - // Lookup the symbol, should only fail if shader code is incorrect - symbol = symbolTable.find(*lookupName); - if (symbol == nullptr) - return; - - if (symbol->getAsFunction()) { - error(loc, "array variable name expected", symbol->getName().c_str(), ""); - return; } - if (symbol->getType().isStruct() && blockIndex != -1) - (*symbol->getWritableType().getStruct())[blockIndex].type->setImplicitArraySize(index + 1); - else - symbol->getWritableType().setImplicitArraySize(index + 1); + return false; } // Returns true if the first argument to the #line directive is the line number for the next line. @@ -3536,7 +3610,7 @@ error(memberLoc, "cannot redeclare block member with a different type", member->type->getFieldName().c_str(), ""); if (oldType.isArray() != newType.isArray()) error(memberLoc, "cannot change arrayness of redeclared block member", member->type->getFieldName().c_str(), ""); - else if (! oldType.sameArrayness(newType) && oldType.isExplicitlySizedArray()) + else if (! oldType.sameArrayness(newType) && oldType.isSizedArray()) error(memberLoc, "cannot change array size of redeclared block member", member->type->getFieldName().c_str(), ""); else if (newType.isArray()) arrayLimitCheck(loc, member->type->getFieldName(), newType.getOuterArraySize()); @@ -3565,7 +3639,7 @@ type.getQualifier().layoutXfbBuffer = currentBlockQualifier.layoutXfbBuffer; oldType.getQualifier().layoutXfbBuffer = currentBlockQualifier.layoutXfbBuffer; } - if (oldType.isImplicitlySizedArray() && newType.isExplicitlySizedArray()) + if (oldType.isUnsizedArray() && newType.isSizedArray()) oldType.changeOuterArraySize(newType.getOuterArraySize()); // check and process the member's type, which will include managing xfb information @@ -3591,11 +3665,11 @@ if (type.isArray() != (arraySizes != nullptr)) error(loc, "cannot change arrayness of redeclared block", blockName.c_str(), ""); else if (type.isArray()) { - if (type.isExplicitlySizedArray() && arraySizes->getOuterSize() == UnsizedArraySize) - error(loc, "block already declared with size, can't redeclare as implicitly-sized", blockName.c_str(), ""); - else if (type.isExplicitlySizedArray() && type.getArraySizes() != *arraySizes) + if (type.isSizedArray() && !arraySizes->isSized()) + error(loc, "block already declared with size, can't redeclare as unsized", blockName.c_str(), ""); + else if (type.isSizedArray() && *type.getArraySizes() != *arraySizes) error(loc, "cannot change array size of redeclared block", blockName.c_str(), ""); - else if (type.isImplicitlySizedArray() && arraySizes->getOuterSize() != UnsizedArraySize) + else if (!type.isSizedArray() && arraySizes->isSized()) type.changeOuterArraySize(arraySizes->getOuterSize()); } @@ -3615,7 +3689,7 @@ trackLinkage(*block); } -void TParseContext::paramCheckFix(const TSourceLoc& loc, const TStorageQualifier& qualifier, TType& type) +void TParseContext::paramCheckFixStorage(const TSourceLoc& loc, const TStorageQualifier& qualifier, TType& type) { switch (qualifier) { case EvqConst: @@ -3661,8 +3735,10 @@ else warn(loc, "qualifier has no effect on non-output parameters", "precise", ""); } + if (qualifier.isNonUniform()) + type.getQualifier().nonUniform = qualifier.nonUniform; - paramCheckFix(loc, qualifier.storage, type); + paramCheckFixStorage(loc, qualifier.storage, type); } void TParseContext::nestedBlockCheck(const TSourceLoc& loc) @@ -3901,6 +3977,28 @@ default: break; } + +#ifdef NV_EXTENSIONS + // Set default outputs for GL_NV_geometry_shader_passthrough + if (language == EShLangGeometry && extensionTurnedOn(E_SPV_NV_geometry_shader_passthrough)) { + if (intermediate.getOutputPrimitive() == ElgNone) { + switch (intermediate.getInputPrimitive()) { + case ElgPoints: intermediate.setOutputPrimitive(ElgPoints); break; + case ElgLines: intermediate.setOutputPrimitive(ElgLineStrip); break; + case ElgTriangles: intermediate.setOutputPrimitive(ElgTriangles); break; + default: break; + } + } + if (intermediate.getVertices() == TQualifier::layoutNotSet) { + switch (intermediate.getInputPrimitive()) { + case ElgPoints: intermediate.setVertices(1); break; + case ElgLines: intermediate.setVertices(2); break; + case ElgTriangles: intermediate.setVertices(3); break; + default: break; + } + } + } +#endif } // @@ -4534,7 +4632,8 @@ // they are not allowed on block members. For arrayed interfaces (those generally having an // extra level of arrayness due to interface expansion), the outer array is stripped before // applying this rule." -void TParseContext::layoutMemberLocationArrayCheck(const TSourceLoc& loc, bool memberWithLocation, TArraySizes* arraySizes) +void TParseContext::layoutMemberLocationArrayCheck(const TSourceLoc& loc, bool memberWithLocation, + TArraySizes* arraySizes) { if (memberWithLocation && arraySizes != nullptr) { if (arraySizes->getNumDims() > (currentBlockQualifier.isArrayedIo(language) ? 1 : 0)) @@ -4611,11 +4710,9 @@ // containing a double, the offset must also be a multiple of 8..." if (type.containsBasicType(EbtDouble) && ! IsMultipleOfPow2(qualifier.layoutXfbOffset, 8)) error(loc, "type contains double; xfb_offset must be a multiple of 8", "xfb_offset", ""); -#ifdef AMD_EXTENSIONS // ..., if applied to an aggregate containing a float16_t, the offset must also be a multiple of 2..." else if (type.containsBasicType(EbtFloat16) && !IsMultipleOfPow2(qualifier.layoutXfbOffset, 2)) error(loc, "type contains half float; xfb_offset must be a multiple of 2", "xfb_offset", ""); -#endif else if (! IsMultipleOfPow2(qualifier.layoutXfbOffset, 4)) error(loc, "must be a multiple of size of first component", "xfb_offset", ""); } @@ -4639,11 +4736,17 @@ if (type.getBasicType() == EbtSampler) { int lastBinding = qualifier.layoutBinding; if (type.isArray()) { - if (type.isImplicitlySizedArray()) { + if (spvVersion.vulkan > 0) lastBinding += 1; - warn(loc, "assuming array size of one for compile-time checking of binding numbers for implicitly-sized array", "[]", ""); - } else - lastBinding += type.getCumulativeArraySize(); + else { + if (type.isSizedArray()) + lastBinding += type.getCumulativeArraySize(); + else { + lastBinding += 1; + if (spvVersion.vulkan == 0) + warn(loc, "assuming binding count of one for compile-time checking of binding numbers for unsized array", "[]", ""); + } + } } if (spvVersion.vulkan == 0 && lastBinding >= resources.maxCombinedTextureImageUnits) error(loc, "sampler binding not less than gl_MaxCombinedTextureImageUnits", "binding", type.isArray() ? "(using array)" : ""); @@ -4654,12 +4757,23 @@ return; } } - } + } else if (!intermediate.getAutoMapBindings()) { + // some types require bindings - // atomic_uint - if (type.getBasicType() == EbtAtomicUint) { - if (! type.getQualifier().hasBinding()) + // atomic_uint + if (type.getBasicType() == EbtAtomicUint) error(loc, "layout(binding=X) is required", "atomic_uint", ""); + + // SPIR-V + if (spvVersion.spv > 0) { + if (qualifier.isUniformOrBuffer()) { + if (type.getBasicType() == EbtBlock && !qualifier.layoutPushConstant && + !qualifier.layoutAttachment) + error(loc, "uniform/buffer blocks require layout(binding=X)", "binding", ""); + else if (spvVersion.vulkan > 0 && type.getBasicType() == EbtSampler) + error(loc, "sampler/texture/image requires layout(binding=X)", "binding", ""); + } + } } // "The offset qualifier can only be used on block members of blocks..." @@ -4715,20 +4829,18 @@ error(loc, "can only be applied to a scalar", "constant_id", ""); switch (type.getBasicType()) { + case EbtInt8: + case EbtUint8: + case EbtInt16: + case EbtUint16: case EbtInt: case EbtUint: case EbtInt64: case EbtUint64: -#ifdef AMD_EXTENSIONS - case EbtInt16: - case EbtUint16: -#endif case EbtBool: case EbtFloat: case EbtDouble: -#ifdef AMD_EXTENSIONS case EbtFloat16: -#endif break; default: error(loc, "cannot be applied to this type", "constant_id", ""); @@ -4894,7 +5006,7 @@ // Check for overlap int numOffsets = 4; if (symbol.getType().isArray()) { - if (symbol.getType().isExplicitlySizedArray() && ! symbol.getType().getArraySizes()->isInnerImplicit()) + if (symbol.getType().isSizedArray() && !symbol.getType().getArraySizes()->isInnerUnsized()) numOffsets *= symbol.getType().getCumulativeArraySize(); else { // "It is a compile-time error to declare an unsized array of atomic_uint." @@ -4925,10 +5037,21 @@ return nullptr; } + bool explicitTypesEnabled = extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types) || + extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_int8) || + extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_int16) || + extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_int32) || + extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_int64) || + extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_float16) || + extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_float32) || + extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_float64); + if (profile == EEsProfile || version < 120) function = findFunctionExact(loc, call, builtIn); else if (version < 400) function = findFunction120(loc, call, builtIn); + else if (explicitTypesEnabled) + function = findFunctionExplicitTypes(loc, call, builtIn); else function = findFunction400(loc, call, builtIn); @@ -5113,6 +5236,85 @@ return bestMatch; } +// "To determine whether the conversion for a single argument in one match +// is better than that for another match, the conversion is assigned of the +// three ranks ordered from best to worst: +// 1. Exact match: no conversion. +// 2. Promotion: integral or floating-point promotion. +// 3. Conversion: integral conversion, floating-point conversion, +// floating-integral conversion. +// A conversion C1 is better than a conversion C2 if the rank of C1 is +// better than the rank of C2." +const TFunction* TParseContext::findFunctionExplicitTypes(const TSourceLoc& loc, const TFunction& call, bool& builtIn) +{ + // first, look for an exact match + TSymbol* symbol = symbolTable.find(call.getMangledName(), &builtIn); + if (symbol) + return symbol->getAsFunction(); + + // no exact match, use the generic selector, parameterized by the GLSL rules + + // create list of candidates to send + TVector candidateList; + symbolTable.findFunctionNameList(call.getMangledName(), candidateList, builtIn); + + // can 'from' convert to 'to'? + const auto convertible = [this](const TType& from, const TType& to, TOperator, int) -> bool { + if (from == to) + return true; + if (from.isArray() || to.isArray() || ! from.sameElementShape(to)) + return false; + return intermediate.canImplicitlyPromote(from.getBasicType(), to.getBasicType()); + }; + + // Is 'to2' a better conversion than 'to1'? + // Ties should not be considered as better. + // Assumes 'convertible' already said true. + const auto better = [this](const TType& from, const TType& to1, const TType& to2) -> bool { + // 1. exact match + if (from == to2) + return from != to1; + if (from == to1) + return false; + + // 2. Promotion (integral, floating-point) is better + TBasicType from_type = from.getBasicType(); + TBasicType to1_type = to1.getBasicType(); + TBasicType to2_type = to2.getBasicType(); + bool isPromotion1 = (intermediate.isIntegralPromotion(from_type, to1_type) || + intermediate.isFPPromotion(from_type, to1_type)); + bool isPromotion2 = (intermediate.isIntegralPromotion(from_type, to2_type) || + intermediate.isFPPromotion(from_type, to2_type)); + if (isPromotion2) + return !isPromotion1; + if(isPromotion1) + return false; + + // 3. Conversion (integral, floating-point , floating-integral) + bool isConversion1 = (intermediate.isIntegralConversion(from_type, to1_type) || + intermediate.isFPConversion(from_type, to1_type) || + intermediate.isFPIntegralConversion(from_type, to1_type)); + bool isConversion2 = (intermediate.isIntegralConversion(from_type, to2_type) || + intermediate.isFPConversion(from_type, to2_type) || + intermediate.isFPIntegralConversion(from_type, to2_type)); + + return isConversion2 && !isConversion1; + }; + + // for ambiguity reporting + bool tie = false; + + // send to the generic selector + const TFunction* bestMatch = selectFunction(candidateList, call, convertible, better, tie); + + if (bestMatch == nullptr) + error(loc, "no matching overloaded function found", call.getName().c_str(), ""); + else if (tie) + error(loc, "ambiguous best function under implicit type conversion", call.getName().c_str(), ""); + + return bestMatch; +} + // When a declaration includes a type, but not a variable name, it can be // to establish defaults. void TParseContext::declareTypeDefaults(const TSourceLoc& loc, const TPublicType& publicType) @@ -5141,15 +5343,15 @@ // 'publicType' is the type part of the declaration (to the left) // 'arraySizes' is the arrayness tagged on the identifier (to the right) // -TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& identifier, const TPublicType& publicType, TArraySizes* arraySizes, TIntermTyped* initializer) +TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& identifier, const TPublicType& publicType, + TArraySizes* arraySizes, TIntermTyped* initializer) { - TType type(publicType); // shallow copy; 'type' shares the arrayness and structure definition with 'publicType' - if (type.isImplicitlySizedArray()) { - // Because "int[] a = int[2](...), b = int[3](...)" makes two arrays a and b - // of different sizes, for this case sharing the shallow copy of arrayness - // with the publicType oversubscribes it, so get a deep copy of the arrayness. - type.newArraySizes(*publicType.arraySizes); - } + // Make a fresh type that combines the characteristics from the individual + // identifier syntax and the declaration-type syntax. + TType type(publicType); + type.transferArraySizes(arraySizes); + type.copyArrayInnerSizes(publicType.arraySizes); + arrayOfArrayVersionCheck(loc, type.getArraySizes()); if (voidErrorCheck(loc, identifier, type.getBasicType())) return nullptr; @@ -5176,15 +5378,9 @@ inheritGlobalDefaults(type.getQualifier()); // Declare the variable - if (arraySizes || type.isArray()) { - // Arrayness is potentially coming both from the type and from the - // variable: "int[] a[];" or just one or the other. - // Merge it all to the type, so all arrayness is part of the type. - arrayDimCheck(loc, &type, arraySizes); - arrayDimMerge(type, arraySizes); - + if (type.isArray()) { // Check that implicit sizing is only where allowed. - arraySizesCheck(loc, type.getQualifier(), &type.getArraySizes(), initializer != nullptr, false); + arraySizesCheck(loc, type.getQualifier(), type.getArraySizes(), initializer != nullptr, false); if (! arrayQualifierError(loc, type.getQualifier()) && ! arrayError(loc, type)) declareArray(loc, identifier, type, symbol); @@ -5315,8 +5511,7 @@ } // Fix outer arrayness if variable is unsized, getting size from the initializer - if (initializer->getType().isExplicitlySizedArray() && - variable->getType().isImplicitlySizedArray()) + if (initializer->getType().isSizedArray() && variable->getType().isUnsizedArray()) variable->getWritableType().changeOuterArraySize(initializer->getType().getOuterArraySize()); // Inner arrayness can also get set by an initializer @@ -5325,8 +5520,10 @@ variable->getType().getArraySizes()->getNumDims()) { // adopt unsized sizes from the initializer's sizes for (int d = 1; d < variable->getType().getArraySizes()->getNumDims(); ++d) { - if (variable->getType().getArraySizes()->getDimSize(d) == UnsizedArraySize) - variable->getWritableType().getArraySizes().setDimSize(d, initializer->getType().getArraySizes()->getDimSize(d)); + if (variable->getType().getArraySizes()->getDimSize(d) == UnsizedArraySize) { + variable->getWritableType().getArraySizes()->setDimSize(d, + initializer->getType().getArraySizes()->getDimSize(d)); + } } } @@ -5437,16 +5634,16 @@ // Later on, initializer execution code will deal with array size logic. TType arrayType; arrayType.shallowCopy(type); // sharing struct stuff is fine - arrayType.newArraySizes(*type.getArraySizes()); // but get a fresh copy of the array information, to edit below + arrayType.copyArraySizes(*type.getArraySizes()); // but get a fresh copy of the array information, to edit below // edit array sizes to fill in unsized dimensions arrayType.changeOuterArraySize((int)initList->getSequence().size()); TIntermTyped* firstInit = initList->getSequence()[0]->getAsTyped(); if (arrayType.isArrayOfArrays() && firstInit->getType().isArray() && - arrayType.getArraySizes().getNumDims() == firstInit->getType().getArraySizes()->getNumDims() + 1) { - for (int d = 1; d < arrayType.getArraySizes().getNumDims(); ++d) { - if (arrayType.getArraySizes().getDimSize(d) == UnsizedArraySize) - arrayType.getArraySizes().setDimSize(d, firstInit->getType().getArraySizes()->getDimSize(d - 1)); + arrayType.getArraySizes()->getNumDims() == firstInit->getType().getArraySizes()->getNumDims() + 1) { + for (int d = 1; d < arrayType.getArraySizes()->getNumDims(); ++d) { + if (arrayType.getArraySizes()->getDimSize(d) == UnsizedArraySize) + arrayType.getArraySizes()->setDimSize(d, firstInit->getType().getArraySizes()->getDimSize(d - 1)); } } @@ -5596,8 +5793,22 @@ // // Returns nullptr for an error or the constructed node. // -TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, TIntermTyped* node, const TSourceLoc& loc, bool subset) +TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, TIntermTyped* node, const TSourceLoc& loc, + bool subset) { + // If we are changing a matrix in both domain of basic type and to a non matrix, + // do the shape change first (by default, below, basic type is changed before shape). + // This avoids requesting a matrix of a new type that is going to be discarded anyway. + // TODO: This could be generalized to more type combinations, but that would require + // more extensive testing and full algorithm rework. For now, the need to do two changes makes + // the recursive call work, and avoids the most aggregious case of creating integer matrices. + if (node->getType().isMatrix() && (type.isScalar() || type.isVector()) && + type.isFloatingDomain() != node->getType().isFloatingDomain()) { + TType transitionType(node->getBasicType(), glslang::EvqTemporary, type.getVectorSize(), 0, 0, node->isVector()); + TOperator transitionOp = intermediate.mapTypeToConstructorOp(transitionType); + node = constructBuiltIn(transitionType, transitionOp, node, loc, false); + } + TIntermTyped* newNode; TOperator basicOp; @@ -5637,7 +5848,6 @@ basicOp = EOpConstructDouble; break; -#ifdef AMD_EXTENSIONS case EOpConstructF16Vec2: case EOpConstructF16Vec3: case EOpConstructF16Vec4: @@ -5653,7 +5863,34 @@ case EOpConstructFloat16: basicOp = EOpConstructFloat16; break; -#endif + + case EOpConstructI8Vec2: + case EOpConstructI8Vec3: + case EOpConstructI8Vec4: + case EOpConstructInt8: + basicOp = EOpConstructInt8; + break; + + case EOpConstructU8Vec2: + case EOpConstructU8Vec3: + case EOpConstructU8Vec4: + case EOpConstructUint8: + basicOp = EOpConstructUint8; + break; + + case EOpConstructI16Vec2: + case EOpConstructI16Vec3: + case EOpConstructI16Vec4: + case EOpConstructInt16: + basicOp = EOpConstructInt16; + break; + + case EOpConstructU16Vec2: + case EOpConstructU16Vec3: + case EOpConstructU16Vec4: + case EOpConstructUint16: + basicOp = EOpConstructUint16; + break; case EOpConstructIVec2: case EOpConstructIVec3: @@ -5683,22 +5920,6 @@ basicOp = EOpConstructUint64; break; -#ifdef AMD_EXTENSIONS - case EOpConstructI16Vec2: - case EOpConstructI16Vec3: - case EOpConstructI16Vec4: - case EOpConstructInt16: - basicOp = EOpConstructInt16; - break; - - case EOpConstructU16Vec2: - case EOpConstructU16Vec3: - case EOpConstructU16Vec4: - case EOpConstructUint16: - basicOp = EOpConstructUint16; - break; -#endif - case EOpConstructBVec2: case EOpConstructBVec3: case EOpConstructBVec4: @@ -5706,6 +5927,11 @@ basicOp = EOpConstructBool; break; + case EOpConstructNonuniform: + node->getWritableType().getQualifier().nonUniform = true; + return node; + break; + default: error(loc, "unsupported construction", "", ""); @@ -5750,13 +5976,14 @@ // // Do everything needed to add an interface block. // -void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, const TString* instanceName, TArraySizes* arraySizes) +void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, const TString* instanceName, + TArraySizes* arraySizes) { blockStageIoCheck(loc, currentBlockQualifier); blockQualifierCheck(loc, currentBlockQualifier, instanceName != nullptr); - if (arraySizes) { + if (arraySizes != nullptr) { arraySizesCheck(loc, currentBlockQualifier, arraySizes, false, false); - arrayDimCheck(loc, arraySizes, 0); + arrayOfArrayVersionCheck(loc, arraySizes); if (arraySizes->getNumDims() > 1) requireProfile(loc, ~EEsProfile, "array-of-array of block"); } @@ -5773,7 +6000,7 @@ if ((currentBlockQualifier.storage == EvqUniform || currentBlockQualifier.storage == EvqBuffer) && (memberQualifier.isInterpolation() || memberQualifier.isAuxiliary())) error(memberLoc, "member of uniform or buffer block cannot have an auxiliary or interpolation qualifier", memberType.getFieldName().c_str(), ""); if (memberType.isArray()) - arraySizesCheck(memberLoc, currentBlockQualifier, &memberType.getArraySizes(), false, member == typeList.size() - 1); + arraySizesCheck(memberLoc, currentBlockQualifier, memberType.getArraySizes(), false, member == typeList.size() - 1); if (memberQualifier.hasOffset()) { if (spvVersion.spv == 0) { requireProfile(memberLoc, ~EEsProfile, "offset on block member"); @@ -5895,8 +6122,8 @@ // TType blockType(&typeList, *blockName, currentBlockQualifier); - if (arraySizes) - blockType.newArraySizes(*arraySizes); + if (arraySizes != nullptr) + blockType.transferArraySizes(arraySizes); else ioArrayCheck(loc, blockType, instanceName ? *instanceName : *blockName); @@ -6063,7 +6290,8 @@ memberQualifier.layoutLocation = nextLocation; memberQualifier.layoutComponent = TQualifier::layoutComponentEnd; } - nextLocation = memberQualifier.layoutLocation + intermediate.computeTypeLocationSize(*typeList[member].type); + nextLocation = memberQualifier.layoutLocation + intermediate.computeTypeLocationSize( + *typeList[member].type, language); } } } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/ParseHelper.h vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/ParseHelper.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/ParseHelper.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/ParseHelper.h 2018-04-27 11:46:26.000000000 +0000 @@ -187,7 +187,7 @@ TParseContextBase& operator=(TParseContextBase&); const bool parsingBuiltins; // true if parsing built-in symbols/functions - TVector linkageSymbols; // these need to be transferred to 'linkage', after all editing is done + TVector linkageSymbols; // will be transferred to 'linkage', after all editing is done, order preserving TScanContext* scanContext; TPpContext* ppContext; TBuiltInResource resources; @@ -309,7 +309,7 @@ TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype); TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&); TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermNode*); - TIntermTyped* handleBuiltInFunctionCall(TSourceLoc, TIntermNode& arguments, const TFunction& function); + TIntermTyped* handleBuiltInFunctionCall(TSourceLoc, TIntermNode* arguments, const TFunction& function); void computeBuiltinPrecisions(TIntermTyped&, const TFunction&); TIntermNode* handleReturnValue(const TSourceLoc&, TIntermTyped*); void checkLocation(const TSourceLoc&, TOperator); @@ -341,16 +341,14 @@ void arraySizeRequiredCheck(const TSourceLoc&, const TArraySizes&); void structArrayCheck(const TSourceLoc&, const TType& structure); void arraySizesCheck(const TSourceLoc&, const TQualifier&, TArraySizes*, bool initializer, bool lastMember); - void arrayOfArrayVersionCheck(const TSourceLoc&); - void arrayDimCheck(const TSourceLoc&, const TArraySizes* sizes1, const TArraySizes* sizes2); - void arrayDimCheck(const TSourceLoc&, const TType*, const TArraySizes*); - void arrayDimMerge(TType& type, const TArraySizes* sizes); + void arrayOfArrayVersionCheck(const TSourceLoc&, const TArraySizes*); bool voidErrorCheck(const TSourceLoc&, const TString&, TBasicType); void boolCheck(const TSourceLoc&, const TIntermTyped*); void boolCheck(const TSourceLoc&, const TPublicType&); void samplerCheck(const TSourceLoc&, const TType&, const TString& identifier, TIntermTyped* initializer); void atomicUintCheck(const TSourceLoc&, const TType&, const TString& identifier); void transparentOpaqueCheck(const TSourceLoc&, const TType&, const TString& identifier); + void memberQualifierCheck(glslang::TPublicType&); void globalQualifierFixCheck(const TSourceLoc&, TQualifier&); void globalQualifierTypeCheck(const TSourceLoc&, const TQualifier&, const TPublicType&); bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType); @@ -363,7 +361,7 @@ bool containsFieldWithBasicType(const TType& type ,TBasicType basicType); TSymbol* redeclareBuiltinVariable(const TSourceLoc&, const TString&, const TQualifier&, const TShaderQualifiers&); void redeclareBuiltinBlock(const TSourceLoc&, TTypeList& typeList, const TString& blockName, const TString* instanceName, TArraySizes* arraySizes); - void paramCheckFix(const TSourceLoc&, const TStorageQualifier&, TType& type); + void paramCheckFixStorage(const TSourceLoc&, const TStorageQualifier&, TType& type); void paramCheckFix(const TSourceLoc&, const TQualifier&, TType& type); void nestedBlockCheck(const TSourceLoc&); void nestedStructCheck(const TSourceLoc&); @@ -392,6 +390,7 @@ const TFunction* findFunctionExact(const TSourceLoc& loc, const TFunction& call, bool& builtIn); const TFunction* findFunction120(const TSourceLoc& loc, const TFunction& call, bool& builtIn); const TFunction* findFunction400(const TSourceLoc& loc, const TFunction& call, bool& builtIn); + const TFunction* findFunctionExplicitTypes(const TSourceLoc& loc, const TFunction& call, bool& builtIn); void declareTypeDefaults(const TSourceLoc&, const TPublicType&); TIntermNode* declareVariable(const TSourceLoc&, TString& identifier, const TPublicType&, TArraySizes* typeArray = 0, TIntermTyped* initializer = 0); TIntermTyped* addConstructor(const TSourceLoc&, TIntermNode*, const TType&); @@ -410,7 +409,6 @@ void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode); TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body); - void updateImplicitArraySize(const TSourceLoc&, TIntermNode*, int index); TAttributeType attributeFromName(const TString& name) const; TAttributes* makeAttributes(const TString& identifier) const; TAttributes* makeAttributes(const TString& identifier, TIntermNode* node) const; @@ -429,6 +427,8 @@ TVariable* makeInternalVariable(const char* name, const TType&) const; TVariable* declareNonArray(const TSourceLoc&, const TString& identifier, const TType&); void declareArray(const TSourceLoc&, const TString& identifier, const TType&, TSymbol*&); + void checkRuntimeSizable(const TSourceLoc&, const TIntermTyped&); + bool isRuntimeLength(const TIntermTyped&) const; TIntermNode* executeInitializer(const TSourceLoc&, TIntermTyped* initializer, TVariable* variable); TIntermTyped* convertInitializerList(const TSourceLoc&, const TType&, TIntermTyped* initializer); void finish() override; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/parseVersions.h vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/parseVersions.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/parseVersions.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/parseVersions.h 2018-04-27 11:46:26.000000000 +0000 @@ -1,5 +1,6 @@ // // Copyright (C) 2016 Google, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -77,11 +78,16 @@ virtual void updateExtensionBehavior(int line, const char* const extension, const char* behavior); virtual void fullIntegerCheck(const TSourceLoc&, const char* op); virtual void doubleCheck(const TSourceLoc&, const char* op); -#ifdef AMD_EXTENSIONS - virtual void int16Check(const TSourceLoc& loc, const char* op, bool builtIn = false); virtual void float16Check(const TSourceLoc&, const char* op, bool builtIn = false); +#ifdef AMD_EXTENSIONS + virtual void float16OpaqueCheck(const TSourceLoc&, const char* op, bool builtIn = false); #endif virtual void int64Check(const TSourceLoc&, const char* op, bool builtIn = false); + virtual void explicitInt8Check(const TSourceLoc&, const char* op, bool builtIn = false); + virtual void explicitInt16Check(const TSourceLoc&, const char* op, bool builtIn = false); + virtual void explicitInt32Check(const TSourceLoc&, const char* op, bool builtIn = false); + virtual void explicitFloat32Check(const TSourceLoc&, const char* op, bool builtIn = false); + virtual void explicitFloat64Check(const TSourceLoc&, const char* op, bool builtIn = false); virtual void spvRemoved(const TSourceLoc&, const char* op); virtual void vulkanRemoved(const TSourceLoc&, const char* op); virtual void requireVulkan(const TSourceLoc&, const char* op); @@ -113,6 +119,7 @@ bool relaxedErrors() const { return (messages & EShMsgRelaxedErrors) != 0; } bool suppressWarnings() const { return (messages & EShMsgSuppressWarnings) != 0; } bool isReadingHLSL() const { return (messages & EShMsgReadHlsl) == EShMsgReadHlsl; } + bool hlslEnable16BitTypes() const { return (messages & EShMsgHlslEnable16BitTypes) != 0; } TInfoSink& infoSink; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -731,12 +731,10 @@ TSourceLoc loc = ppToken->loc; while (token != '\n' && token != EndOfInput) { - if (token == PpAtomConstInt || token == PpAtomConstUint || + if (token == PpAtomConstInt16 || token == PpAtomConstUint16 || + token == PpAtomConstInt || token == PpAtomConstUint || token == PpAtomConstInt64 || token == PpAtomConstUint64 || -#ifdef AMD_EXTENSIONS - token == PpAtomConstInt16 || token == PpAtomConstUint16 || token == PpAtomConstFloat16 || -#endif token == PpAtomConstFloat || token == PpAtomConstDouble) { message.append(ppToken->name); } else if (token == PpAtomIdentifier || token == PpAtomConstString) { @@ -775,9 +773,7 @@ #endif case PpAtomConstFloat: case PpAtomConstDouble: -#ifdef AMD_EXTENSIONS case PpAtomConstFloat16: -#endif tokens.push_back(ppToken->name); break; default: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2013 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -117,7 +118,7 @@ ch = getChar(); // 1.#INF or -1.#INF - if (parseContext.intermediate.getSource() == EShSourceHlsl && ch == '#') { + if (ch == '#' && (ifdepth > 0 || parseContext.intermediate.getSource() == EShSourceHlsl)) { if ((len < 2) || (len == 2 && ppToken->name[0] != '1') || (len == 3 && ppToken->name[1] != '1' && !(ppToken->name[0] == '-' || ppToken->name[0] == '+')) || @@ -173,24 +174,28 @@ // Suffix: bool isFloat16 = false; if (ch == 'l' || ch == 'L') { - parseContext.doubleCheck(ppToken->loc, "double floating-point suffix"); - if (! HasDecimalOrExponent) + if (ifdepth == 0 && parseContext.intermediate.getSource() == EShSourceGlsl) + parseContext.doubleCheck(ppToken->loc, "double floating-point suffix"); + if (ifdepth == 0 && !HasDecimalOrExponent) parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", ""); - int ch2 = getChar(); - if (ch2 != 'f' && ch2 != 'F') { - ungetChar(); - ungetChar(); - } else { + if (parseContext.intermediate.getSource() == EShSourceGlsl) { + int ch2 = getChar(); + if (ch2 != 'f' && ch2 != 'F') { + ungetChar(); + ungetChar(); + } else { + saveName(ch); + saveName(ch2); + isDouble = 1; + } + } else if (parseContext.intermediate.getSource() == EShSourceHlsl) { saveName(ch); - saveName(ch2); isDouble = 1; } } else if (ch == 'h' || ch == 'H') { -#ifdef AMD_EXTENSIONS - if (parseContext.intermediate.getSource() == EShSourceGlsl) + if (ifdepth == 0 && parseContext.intermediate.getSource() == EShSourceGlsl) parseContext.float16Check(ppToken->loc, "half floating-point suffix"); -#endif - if (!HasDecimalOrExponent) + if (ifdepth == 0 && !HasDecimalOrExponent) parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", ""); if (parseContext.intermediate.getSource() == EShSourceGlsl) { int ch2 = getChar(); @@ -202,15 +207,16 @@ saveName(ch2); isFloat16 = true; } - } else { + } else if (parseContext.intermediate.getSource() == EShSourceHlsl) { saveName(ch); - isFloat16 = false; + isFloat16 = true; } } else if (ch == 'f' || ch == 'F') { - parseContext.profileRequires(ppToken->loc, EEsProfile, 300, nullptr, "floating-point suffix"); - if (! parseContext.relaxedErrors()) + if (ifdepth == 0) + parseContext.profileRequires(ppToken->loc, EEsProfile, 300, nullptr, "floating-point suffix"); + if (ifdepth == 0 && !parseContext.relaxedErrors()) parseContext.profileRequires(ppToken->loc, ~EEsProfile, 120, nullptr, "floating-point suffix"); - if (! HasDecimalOrExponent) + if (ifdepth == 0 && !HasDecimalOrExponent) parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", ""); saveName(ch); } else @@ -322,11 +328,24 @@ int ch = 0; int ii = 0; unsigned long long ival = 0; - const auto floatingPointChar = [&](int ch) { return ch == '.' || ch == 'e' || ch == 'E' || ch == 'f' || ch == 'F' || ch == 'h' || ch == 'H'; }; + static const char* const Int64_Extensions[] = { + E_GL_ARB_gpu_shader_int64, + E_GL_KHX_shader_explicit_arithmetic_types, + E_GL_KHX_shader_explicit_arithmetic_types_int64 }; + static const int Num_Int64_Extensions = sizeof(Int64_Extensions) / sizeof(Int64_Extensions[0]); + + static const char* const Int16_Extensions[] = { +#ifdef AMD_EXTENSIONS + E_GL_AMD_gpu_shader_int16, +#endif + E_GL_KHX_shader_explicit_arithmetic_types, + E_GL_KHX_shader_explicit_arithmetic_types_int16 }; + static const int Num_Int16_Extensions = sizeof(Int16_Extensions) / sizeof(Int16_Extensions[0]); + ppToken->ival = 0; ppToken->i64val = 0; ppToken->space = false; @@ -389,9 +408,7 @@ bool isUnsigned = false; bool isInt64 = false; -#ifdef AMD_EXTENSIONS bool isInt16 = false; -#endif ppToken->name[len++] = (char)ch; ch = getch(); if ((ch >= '0' && ch <= '9') || @@ -467,23 +484,25 @@ ppToken->name[len] = '\0'; if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) { - pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, - "64-bit hexadecimal literal"); - pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_ARB_gpu_shader_int64, + if (pp->ifdepth == 0) { + pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, "64-bit hexadecimal literal"); + pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, + Num_Int64_Extensions, Int64_Extensions, "64-bit hexadecimal literal"); + } ppToken->i64val = ival; return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64; -#ifdef AMD_EXTENSIONS } else if (isInt16) { - if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) { - pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, - "16-bit hexadecimal literal"); - pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_AMD_gpu_shader_int16, - "16-bit hexadecimal literal"); + if (pp->ifdepth == 0) { + if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) { + pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, + "16-bit hexadecimal literal"); + pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, + Num_Int16_Extensions, Int16_Extensions, "16-bit hexadecimal literal"); + } } ppToken->ival = (int)ival; return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16; -#endif } else { if (ival > 0xffffffffu && !AlreadyComplained) pp->parseContext.ppError(ppToken->loc, "hexadecimal literal too big", "", ""); @@ -495,9 +514,7 @@ bool isUnsigned = false; bool isInt64 = false; -#ifdef AMD_EXTENSIONS bool isInt16 = false; -#endif bool octalOverflow = false; bool nonOctal = false; ival = 0; @@ -583,23 +600,25 @@ pp->parseContext.ppError(ppToken->loc, "octal literal too big", "", ""); if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) { - pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, - "64-bit octal literal"); - pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_ARB_gpu_shader_int64, + if (pp->ifdepth == 0) { + pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, "64-bit octal literal"); + pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, + Num_Int64_Extensions, Int64_Extensions, "64-bit octal literal"); + } ppToken->i64val = ival; return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64; -#ifdef AMD_EXTENSIONS } else if (isInt16) { - if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) { - pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, - "16-bit octal literal"); - pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_AMD_gpu_shader_int16, - "16-bit octal literal"); + if (pp->ifdepth == 0) { + if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) { + pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, + "16-bit octal literal"); + pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, + Num_Int16_Extensions, Int16_Extensions, "16-bit octal literal"); + } } ppToken->ival = (int)ival; return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16; -#endif } else { ppToken->ival = (int)ival; return isUnsigned ? PpAtomConstUint : PpAtomConstInt; @@ -626,9 +645,7 @@ int numericLen = len; bool isUnsigned = false; bool isInt64 = false; -#ifdef AMD_EXTENSIONS bool isInt16 = false; -#endif if (ch == 'u' || ch == 'U') { if (len < MaxTokenLength) ppToken->name[len++] = (char)ch; @@ -672,19 +689,15 @@ const unsigned remainderMaxInt = 0xFFFFFFFFu - 10 * oneTenthMaxInt; const unsigned long long oneTenthMaxInt64 = 0xFFFFFFFFFFFFFFFFull / 10; const unsigned long long remainderMaxInt64 = 0xFFFFFFFFFFFFFFFFull - 10 * oneTenthMaxInt64; -#ifdef AMD_EXTENSIONS const unsigned short oneTenthMaxInt16 = 0xFFFFu / 10; const unsigned short remainderMaxInt16 = 0xFFFFu - 10 * oneTenthMaxInt16; -#endif for (int i = 0; i < numericLen; i++) { ch = ppToken->name[i] - '0'; bool overflow = false; if (isInt64) overflow = (ival > oneTenthMaxInt64 || (ival == oneTenthMaxInt64 && (unsigned long long)ch > remainderMaxInt64)); -#ifdef AMD_EXTENSIONS else if (isInt16) overflow = (ival > oneTenthMaxInt16 || (ival == oneTenthMaxInt16 && (unsigned short)ch > remainderMaxInt16)); -#endif else overflow = (ival > oneTenthMaxInt || (ival == oneTenthMaxInt && (unsigned)ch > remainderMaxInt)); if (overflow) { @@ -696,23 +709,23 @@ } if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) { - pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, - "64-bit literal"); - pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_ARB_gpu_shader_int64, + if (pp->ifdepth == 0) { + pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, "64-bit literal"); + pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, + Num_Int64_Extensions, Int64_Extensions, "64-bit literal"); + } ppToken->i64val = ival; return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64; -#ifdef AMD_EXTENSIONS } else if (isInt16) { - if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) { + if (pp->ifdepth == 0 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) { pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, - "16-bit literal"); - pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_AMD_gpu_shader_int16, - "16-bit literal"); + "16-bit literal"); + pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, + Num_Int16_Extensions, Int16_Extensions, "16-bit literal"); } ppToken->ival = (int)ival; return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16; -#endif } else { ppToken->ival = (int)ival; return isUnsigned ? PpAtomConstUint : PpAtomConstInt; @@ -962,19 +975,15 @@ case PpAtomConstFloat: case PpAtomConstInt64: case PpAtomConstUint64: -#ifdef AMD_EXTENSIONS case PpAtomConstInt16: case PpAtomConstUint16: -#endif case PpAtomConstDouble: -#ifdef AMD_EXTENSIONS case PpAtomConstFloat16: -#endif if (ppToken.name[0] == '\0') continue; break; case PpAtomConstString: - if (parseContext.intermediate.getSource() != EShSourceHlsl) { + if (ifdepth == 0 && parseContext.intermediate.getSource() != EShSourceHlsl) { // HLSL allows string literals. parseContext.ppError(ppToken.loc, "string literals not supported", "\"\"", ""); continue; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -147,9 +147,7 @@ #endif case PpAtomConstFloat: case PpAtomConstDouble: -#ifdef AMD_EXTENSIONS case PpAtomConstFloat16: -#endif str = ppToken->name; while (*str) { putSubtoken(*str); @@ -187,9 +185,7 @@ case PpAtomIdentifier: case PpAtomConstFloat: case PpAtomConstDouble: -#ifdef AMD_EXTENSIONS case PpAtomConstFloat16: -#endif case PpAtomConstInt: case PpAtomConstUint: case PpAtomConstInt64: @@ -219,9 +215,7 @@ break; case PpAtomConstFloat: case PpAtomConstDouble: -#ifdef AMD_EXTENSIONS case PpAtomConstFloat16: -#endif ppToken->dval = atof(ppToken->name); break; case PpAtomConstInt: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h 2018-04-27 11:46:26.000000000 +0000 @@ -127,10 +127,8 @@ PpAtomConstUint, PpAtomConstInt64, PpAtomConstUint64, -#ifdef AMD_EXTENSIONS PpAtomConstInt16, PpAtomConstUint16, -#endif PpAtomConstFloat, PpAtomConstDouble, PpAtomConstFloat16, diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/reflection.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/reflection.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/reflection.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/reflection.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -415,6 +415,36 @@ case EsdBuffer: return GL_SAMPLER_BUFFER; } +#ifdef AMD_EXTENSIONS + case EbtFloat16: + switch ((int)sampler.dim) { + case Esd1D: + switch ((int)sampler.shadow) { + case false: return sampler.arrayed ? GL_FLOAT16_SAMPLER_1D_ARRAY_AMD : GL_FLOAT16_SAMPLER_1D_AMD; + case true: return sampler.arrayed ? GL_FLOAT16_SAMPLER_1D_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_1D_SHADOW_AMD; + } + case Esd2D: + switch ((int)sampler.ms) { + case false: + switch ((int)sampler.shadow) { + case false: return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_ARRAY_AMD : GL_FLOAT16_SAMPLER_2D_AMD; + case true: return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_2D_SHADOW_AMD; + } + case true: return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_ARRAY_AMD : GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_AMD; + } + case Esd3D: + return GL_FLOAT16_SAMPLER_3D_AMD; + case EsdCube: + switch ((int)sampler.shadow) { + case false: return sampler.arrayed ? GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_AMD : GL_FLOAT16_SAMPLER_CUBE_AMD; + case true: return sampler.arrayed ? GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_CUBE_SHADOW_AMD; + } + case EsdRect: + return sampler.shadow ? GL_FLOAT16_SAMPLER_2D_RECT_SHADOW_AMD : GL_FLOAT16_SAMPLER_2D_RECT_AMD; + case EsdBuffer: + return GL_FLOAT16_SAMPLER_BUFFER_AMD; + } +#endif case EbtInt: switch ((int)sampler.dim) { case Esd1D: @@ -477,6 +507,26 @@ case EsdBuffer: return GL_IMAGE_BUFFER; } +#ifdef AMD_EXTENSIONS + case EbtFloat16: + switch ((int)sampler.dim) { + case Esd1D: + return sampler.arrayed ? GL_FLOAT16_IMAGE_1D_ARRAY_AMD : GL_FLOAT16_IMAGE_1D_AMD; + case Esd2D: + switch ((int)sampler.ms) { + case false: return sampler.arrayed ? GL_FLOAT16_IMAGE_2D_ARRAY_AMD : GL_FLOAT16_IMAGE_2D_AMD; + case true: return sampler.arrayed ? GL_FLOAT16_IMAGE_2D_MULTISAMPLE_ARRAY_AMD : GL_FLOAT16_IMAGE_2D_MULTISAMPLE_AMD; + } + case Esd3D: + return GL_FLOAT16_IMAGE_3D_AMD; + case EsdCube: + return sampler.arrayed ? GL_FLOAT16_IMAGE_CUBE_MAP_ARRAY_AMD : GL_FLOAT16_IMAGE_CUBE_AMD; + case EsdRect: + return GL_FLOAT16_IMAGE_2D_RECT_AMD; + case EsdBuffer: + return GL_FLOAT16_IMAGE_BUFFER_AMD; + } +#endif case EbtInt: switch ((int)sampler.dim) { case Esd1D: @@ -716,11 +766,11 @@ } // build counter block index associations for buffers -void TReflection::buildCounterIndices() +void TReflection::buildCounterIndices(const TIntermediate& intermediate) { // search for ones that have counters for (int i = 0; i < int(indexToUniformBlock.size()); ++i) { - const TString counterName(indexToUniformBlock[i].name + "@count"); + const TString counterName(intermediate.addCounterBufferName(indexToUniformBlock[i].name)); const int index = getIndex(counterName); if (index >= 0) @@ -752,7 +802,7 @@ function->traverse(&it); } - buildCounterIndices(); + buildCounterIndices(intermediate); return true; } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/reflection.h vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/reflection.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/reflection.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/reflection.h 2018-04-27 11:46:26.000000000 +0000 @@ -156,7 +156,7 @@ protected: friend class glslang::TReflectionTraverser; - void buildCounterIndices(); + void buildCounterIndices(const TIntermediate&); void buildAttributeReflection(EShLanguage, const TIntermediate&); // Need a TString hash: typedef std::unordered_map TNameToIndex; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Scan.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Scan.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Scan.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Scan.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2013 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -340,6 +341,7 @@ (*KeywordMap)["const"] = CONST; (*KeywordMap)["uniform"] = UNIFORM; + (*KeywordMap)["nonuniformEXT"] = NONUNIFORM; (*KeywordMap)["in"] = IN; (*KeywordMap)["out"] = OUT; (*KeywordMap)["inout"] = INOUT; @@ -464,16 +466,34 @@ (*KeywordMap)["u64vec3"] = U64VEC3; (*KeywordMap)["u64vec4"] = U64VEC4; -#ifdef AMD_EXTENSIONS + // GL_KHX_shader_explicit_arithmetic_types + (*KeywordMap)["int8_t"] = INT8_T; + (*KeywordMap)["i8vec2"] = I8VEC2; + (*KeywordMap)["i8vec3"] = I8VEC3; + (*KeywordMap)["i8vec4"] = I8VEC4; + (*KeywordMap)["uint8_t"] = UINT8_T; + (*KeywordMap)["u8vec2"] = U8VEC2; + (*KeywordMap)["u8vec3"] = U8VEC3; + (*KeywordMap)["u8vec4"] = U8VEC4; + (*KeywordMap)["int16_t"] = INT16_T; - (*KeywordMap)["uint16_t"] = UINT16_T; (*KeywordMap)["i16vec2"] = I16VEC2; (*KeywordMap)["i16vec3"] = I16VEC3; (*KeywordMap)["i16vec4"] = I16VEC4; + (*KeywordMap)["uint16_t"] = UINT16_T; (*KeywordMap)["u16vec2"] = U16VEC2; (*KeywordMap)["u16vec3"] = U16VEC3; (*KeywordMap)["u16vec4"] = U16VEC4; + (*KeywordMap)["int32_t"] = INT32_T; + (*KeywordMap)["i32vec2"] = I32VEC2; + (*KeywordMap)["i32vec3"] = I32VEC3; + (*KeywordMap)["i32vec4"] = I32VEC4; + (*KeywordMap)["uint32_t"] = UINT32_T; + (*KeywordMap)["u32vec2"] = U32VEC2; + (*KeywordMap)["u32vec3"] = U32VEC3; + (*KeywordMap)["u32vec4"] = U32VEC4; + (*KeywordMap)["float16_t"] = FLOAT16_T; (*KeywordMap)["f16vec2"] = F16VEC2; (*KeywordMap)["f16vec3"] = F16VEC3; @@ -490,7 +510,39 @@ (*KeywordMap)["f16mat4x2"] = F16MAT4X2; (*KeywordMap)["f16mat4x3"] = F16MAT4X3; (*KeywordMap)["f16mat4x4"] = F16MAT4X4; -#endif + + (*KeywordMap)["float32_t"] = FLOAT32_T; + (*KeywordMap)["f32vec2"] = F32VEC2; + (*KeywordMap)["f32vec3"] = F32VEC3; + (*KeywordMap)["f32vec4"] = F32VEC4; + (*KeywordMap)["f32mat2"] = F32MAT2; + (*KeywordMap)["f32mat3"] = F32MAT3; + (*KeywordMap)["f32mat4"] = F32MAT4; + (*KeywordMap)["f32mat2x2"] = F32MAT2X2; + (*KeywordMap)["f32mat2x3"] = F32MAT2X3; + (*KeywordMap)["f32mat2x4"] = F32MAT2X4; + (*KeywordMap)["f32mat3x2"] = F32MAT3X2; + (*KeywordMap)["f32mat3x3"] = F32MAT3X3; + (*KeywordMap)["f32mat3x4"] = F32MAT3X4; + (*KeywordMap)["f32mat4x2"] = F32MAT4X2; + (*KeywordMap)["f32mat4x3"] = F32MAT4X3; + (*KeywordMap)["f32mat4x4"] = F32MAT4X4; + (*KeywordMap)["float64_t"] = FLOAT64_T; + (*KeywordMap)["f64vec2"] = F64VEC2; + (*KeywordMap)["f64vec3"] = F64VEC3; + (*KeywordMap)["f64vec4"] = F64VEC4; + (*KeywordMap)["f64mat2"] = F64MAT2; + (*KeywordMap)["f64mat3"] = F64MAT3; + (*KeywordMap)["f64mat4"] = F64MAT4; + (*KeywordMap)["f64mat2x2"] = F64MAT2X2; + (*KeywordMap)["f64mat2x3"] = F64MAT2X3; + (*KeywordMap)["f64mat2x4"] = F64MAT2X4; + (*KeywordMap)["f64mat3x2"] = F64MAT3X2; + (*KeywordMap)["f64mat3x3"] = F64MAT3X3; + (*KeywordMap)["f64mat3x4"] = F64MAT3X4; + (*KeywordMap)["f64mat4x2"] = F64MAT4X2; + (*KeywordMap)["f64mat4x3"] = F64MAT4X3; + (*KeywordMap)["f64mat4x4"] = F64MAT4X4; (*KeywordMap)["sampler2D"] = SAMPLER2D; (*KeywordMap)["samplerCube"] = SAMPLERCUBE; @@ -579,6 +631,54 @@ (*KeywordMap)["usubpassInput"] = USUBPASSINPUT; (*KeywordMap)["usubpassInputMS"] = USUBPASSINPUTMS; +#ifdef AMD_EXTENSIONS + (*KeywordMap)["f16sampler1D"] = F16SAMPLER1D; + (*KeywordMap)["f16sampler2D"] = F16SAMPLER2D; + (*KeywordMap)["f16sampler3D"] = F16SAMPLER3D; + (*KeywordMap)["f16sampler2DRect"] = F16SAMPLER2DRECT; + (*KeywordMap)["f16samplerCube"] = F16SAMPLERCUBE; + (*KeywordMap)["f16sampler1DArray"] = F16SAMPLER1DARRAY; + (*KeywordMap)["f16sampler2DArray"] = F16SAMPLER2DARRAY; + (*KeywordMap)["f16samplerCubeArray"] = F16SAMPLERCUBEARRAY; + (*KeywordMap)["f16samplerBuffer"] = F16SAMPLERBUFFER; + (*KeywordMap)["f16sampler2DMS"] = F16SAMPLER2DMS; + (*KeywordMap)["f16sampler2DMSArray"] = F16SAMPLER2DMSARRAY; + (*KeywordMap)["f16sampler1DShadow"] = F16SAMPLER1DSHADOW; + (*KeywordMap)["f16sampler2DShadow"] = F16SAMPLER2DSHADOW; + (*KeywordMap)["f16sampler2DRectShadow"] = F16SAMPLER2DRECTSHADOW; + (*KeywordMap)["f16samplerCubeShadow"] = F16SAMPLERCUBESHADOW; + (*KeywordMap)["f16sampler1DArrayShadow"] = F16SAMPLER1DARRAYSHADOW; + (*KeywordMap)["f16sampler2DArrayShadow"] = F16SAMPLER2DARRAYSHADOW; + (*KeywordMap)["f16samplerCubeArrayShadow"] = F16SAMPLERCUBEARRAYSHADOW; + + (*KeywordMap)["f16image1D"] = F16IMAGE1D; + (*KeywordMap)["f16image2D"] = F16IMAGE2D; + (*KeywordMap)["f16image3D"] = F16IMAGE3D; + (*KeywordMap)["f16image2DRect"] = F16IMAGE2DRECT; + (*KeywordMap)["f16imageCube"] = F16IMAGECUBE; + (*KeywordMap)["f16image1DArray"] = F16IMAGE1DARRAY; + (*KeywordMap)["f16image2DArray"] = F16IMAGE2DARRAY; + (*KeywordMap)["f16imageCubeArray"] = F16IMAGECUBEARRAY; + (*KeywordMap)["f16imageBuffer"] = F16IMAGEBUFFER; + (*KeywordMap)["f16image2DMS"] = F16IMAGE2DMS; + (*KeywordMap)["f16image2DMSArray"] = F16IMAGE2DMSARRAY; + + (*KeywordMap)["f16texture1D"] = F16TEXTURE1D; + (*KeywordMap)["f16texture2D"] = F16TEXTURE2D; + (*KeywordMap)["f16texture3D"] = F16TEXTURE3D; + (*KeywordMap)["f16texture2DRect"] = F16TEXTURE2DRECT; + (*KeywordMap)["f16textureCube"] = F16TEXTURECUBE; + (*KeywordMap)["f16texture1DArray"] = F16TEXTURE1DARRAY; + (*KeywordMap)["f16texture2DArray"] = F16TEXTURE2DARRAY; + (*KeywordMap)["f16textureCubeArray"] = F16TEXTURECUBEARRAY; + (*KeywordMap)["f16textureBuffer"] = F16TEXTUREBUFFER; + (*KeywordMap)["f16texture2DMS"] = F16TEXTURE2DMS; + (*KeywordMap)["f16texture2DMSArray"] = F16TEXTURE2DMSARRAY; + + (*KeywordMap)["f16subpassInput"] = F16SUBPASSINPUT; + (*KeywordMap)["f16subpassInputMS"] = F16SUBPASSINPUTMS; +#endif + (*KeywordMap)["noperspective"] = NOPERSPECTIVE; (*KeywordMap)["smooth"] = SMOOTH; (*KeywordMap)["flat"] = FLAT; @@ -715,19 +815,15 @@ parseContext.error(loc, "not supported", "::", ""); break; - case PpAtomConstInt: parserToken->sType.lex.i = ppToken.ival; return INTCONSTANT; - case PpAtomConstUint: parserToken->sType.lex.i = ppToken.ival; return UINTCONSTANT; - case PpAtomConstInt64: parserToken->sType.lex.i64 = ppToken.i64val; return INT64CONSTANT; - case PpAtomConstUint64: parserToken->sType.lex.i64 = ppToken.i64val; return UINT64CONSTANT; -#ifdef AMD_EXTENSIONS - case PpAtomConstInt16: parserToken->sType.lex.i = ppToken.ival; return INT16CONSTANT; - case PpAtomConstUint16: parserToken->sType.lex.i = ppToken.ival; return UINT16CONSTANT; -#endif - case PpAtomConstFloat: parserToken->sType.lex.d = ppToken.dval; return FLOATCONSTANT; - case PpAtomConstDouble: parserToken->sType.lex.d = ppToken.dval; return DOUBLECONSTANT; -#ifdef AMD_EXTENSIONS - case PpAtomConstFloat16: parserToken->sType.lex.d = ppToken.dval; return FLOAT16CONSTANT; -#endif + case PpAtomConstInt: parserToken->sType.lex.i = ppToken.ival; return INTCONSTANT; + case PpAtomConstUint: parserToken->sType.lex.i = ppToken.ival; return UINTCONSTANT; + case PpAtomConstInt16: parserToken->sType.lex.i = ppToken.ival; return INT16CONSTANT; + case PpAtomConstUint16: parserToken->sType.lex.i = ppToken.ival; return UINT16CONSTANT; + case PpAtomConstInt64: parserToken->sType.lex.i64 = ppToken.i64val; return INT64CONSTANT; + case PpAtomConstUint64: parserToken->sType.lex.i64 = ppToken.i64val; return UINT64CONSTANT; + case PpAtomConstFloat: parserToken->sType.lex.d = ppToken.dval; return FLOATCONSTANT; + case PpAtomConstDouble: parserToken->sType.lex.d = ppToken.dval; return DOUBLECONSTANT; + case PpAtomConstFloat16: parserToken->sType.lex.d = ppToken.dval; return FLOAT16CONSTANT; case PpAtomIdentifier: { int token = tokenizeIdentifier(); @@ -778,6 +874,12 @@ case CASE: return keyword; + case NONUNIFORM: + if (parseContext.extensionTurnedOn(E_GL_EXT_nonuniform_qualifier)) + return keyword; + else + return identifierOrType(); + case SWITCH: case DEFAULT: if ((parseContext.profile == EEsProfile && parseContext.version < 300) || @@ -867,7 +969,7 @@ case PATCH: if (parseContext.symbolTable.atBuiltInLevel() || (parseContext.profile == EEsProfile && - (parseContext.version >= 320 || + (parseContext.version >= 320 || parseContext.extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader))) || (parseContext.profile != EEsProfile && parseContext.extensionTurnedOn(E_GL_ARB_tessellation_shader))) return keyword; @@ -988,11 +1090,28 @@ afterType = true; if (parseContext.symbolTable.atBuiltInLevel() || (parseContext.profile != EEsProfile && parseContext.version >= 450 && - parseContext.extensionTurnedOn(E_GL_ARB_gpu_shader_int64))) + (parseContext.extensionTurnedOn(E_GL_ARB_gpu_shader_int64) || + parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types) || + parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_int64)))) + return keyword; + return identifierOrType(); + + case INT8_T: + case UINT8_T: + case I8VEC2: + case I8VEC3: + case I8VEC4: + case U8VEC2: + case U8VEC3: + case U8VEC4: + afterType = true; + if (parseContext.symbolTable.atBuiltInLevel() || + ((parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types) || + parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_int8)) && + parseContext.profile != EEsProfile && parseContext.version >= 450)) return keyword; return identifierOrType(); -#ifdef AMD_EXTENSIONS case INT16_T: case UINT16_T: case I16VEC2: @@ -1004,7 +1123,74 @@ afterType = true; if (parseContext.symbolTable.atBuiltInLevel() || (parseContext.profile != EEsProfile && parseContext.version >= 450 && - parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_int16))) + ( +#ifdef AMD_EXTENSIONS + parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_int16) || +#endif + parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types) || + parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_int16)))) + return keyword; + return identifierOrType(); + case INT32_T: + case UINT32_T: + case I32VEC2: + case I32VEC3: + case I32VEC4: + case U32VEC2: + case U32VEC3: + case U32VEC4: + afterType = true; + if (parseContext.symbolTable.atBuiltInLevel() || + ((parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types) || + parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_int32)) && + parseContext.profile != EEsProfile && parseContext.version >= 450)) + return keyword; + return identifierOrType(); + case FLOAT32_T: + case F32VEC2: + case F32VEC3: + case F32VEC4: + case F32MAT2: + case F32MAT3: + case F32MAT4: + case F32MAT2X2: + case F32MAT2X3: + case F32MAT2X4: + case F32MAT3X2: + case F32MAT3X3: + case F32MAT3X4: + case F32MAT4X2: + case F32MAT4X3: + case F32MAT4X4: + afterType = true; + if (parseContext.symbolTable.atBuiltInLevel() || + ((parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types) || + parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_float32)) && + parseContext.profile != EEsProfile && parseContext.version >= 450)) + return keyword; + return identifierOrType(); + + case FLOAT64_T: + case F64VEC2: + case F64VEC3: + case F64VEC4: + case F64MAT2: + case F64MAT3: + case F64MAT4: + case F64MAT2X2: + case F64MAT2X3: + case F64MAT2X4: + case F64MAT3X2: + case F64MAT3X3: + case F64MAT3X4: + case F64MAT4X2: + case F64MAT4X3: + case F64MAT4X4: + afterType = true; + if (parseContext.symbolTable.atBuiltInLevel() || + ((parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types) || + parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_float64)) && + parseContext.profile != EEsProfile && parseContext.version >= 450)) return keyword; return identifierOrType(); @@ -1027,10 +1213,15 @@ afterType = true; if (parseContext.symbolTable.atBuiltInLevel() || (parseContext.profile != EEsProfile && parseContext.version >= 450 && - parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float))) + ( +#ifdef AMD_EXTENSIONS + parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float) || +#endif + parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types) || + parseContext.extensionTurnedOn(E_GL_KHX_shader_explicit_arithmetic_types_float16)))) return keyword; + return identifierOrType(); -#endif case SAMPLERCUBEARRAY: case SAMPLERCUBEARRAYSHADOW: @@ -1195,7 +1386,7 @@ case TEXTURE1DARRAY: case SAMPLER: case SAMPLERSHADOW: - if (parseContext.spvVersion.vulkan >= 100) + if (parseContext.spvVersion.vulkan > 0) return keyword; else return identifierOrType(); @@ -1206,12 +1397,71 @@ case ISUBPASSINPUTMS: case USUBPASSINPUT: case USUBPASSINPUTMS: - if (parseContext.spvVersion.vulkan >= 100) + if (parseContext.spvVersion.vulkan > 0) return keyword; else return identifierOrType(); +#ifdef AMD_EXTENSIONS + case F16SAMPLER1D: + case F16SAMPLER2D: + case F16SAMPLER3D: + case F16SAMPLER2DRECT: + case F16SAMPLERCUBE: + case F16SAMPLER1DARRAY: + case F16SAMPLER2DARRAY: + case F16SAMPLERCUBEARRAY: + case F16SAMPLERBUFFER: + case F16SAMPLER2DMS: + case F16SAMPLER2DMSARRAY: + case F16SAMPLER1DSHADOW: + case F16SAMPLER2DSHADOW: + case F16SAMPLER1DARRAYSHADOW: + case F16SAMPLER2DARRAYSHADOW: + case F16SAMPLER2DRECTSHADOW: + case F16SAMPLERCUBESHADOW: + case F16SAMPLERCUBEARRAYSHADOW: + + case F16IMAGE1D: + case F16IMAGE2D: + case F16IMAGE3D: + case F16IMAGE2DRECT: + case F16IMAGECUBE: + case F16IMAGE1DARRAY: + case F16IMAGE2DARRAY: + case F16IMAGECUBEARRAY: + case F16IMAGEBUFFER: + case F16IMAGE2DMS: + case F16IMAGE2DMSARRAY: + + case F16TEXTURE1D: + case F16TEXTURE2D: + case F16TEXTURE3D: + case F16TEXTURE2DRECT: + case F16TEXTURECUBE: + case F16TEXTURE1DARRAY: + case F16TEXTURE2DARRAY: + case F16TEXTURECUBEARRAY: + case F16TEXTUREBUFFER: + case F16TEXTURE2DMS: + case F16TEXTURE2DMSARRAY: + + case F16SUBPASSINPUT: + case F16SUBPASSINPUTMS: + afterType = true; + if (parseContext.symbolTable.atBuiltInLevel() || + (parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float_fetch) && + parseContext.profile != EEsProfile && parseContext.version >= 450)) + return keyword; + return identifierOrType(); +#endif + case NOPERSPECTIVE: +#ifdef NV_EXTENSIONS + if (parseContext.profile == EEsProfile && parseContext.version >= 300 && + parseContext.extensionTurnedOn(E_GL_NV_shader_noperspective_interpolation)) + return keyword; +#endif return es30ReservedFromGLSL(130); case SMOOTH: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/ShaderLang.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/ShaderLang.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/ShaderLang.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/ShaderLang.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -578,7 +578,7 @@ if (spvVersion.spv != 0) { switch (profile) { case EEsProfile: - if (spvVersion.vulkan >= 100 && version < 310) { + if (spvVersion.vulkan > 0 && version < 310) { correct = false; infoSink.info.message(EPrefixError, "#version: ES shaders for Vulkan SPIR-V require version 310 or higher"); version = 310; @@ -593,7 +593,7 @@ infoSink.info.message(EPrefixError, "#version: compilation for SPIR-V does not support the compatibility profile"); break; default: - if (spvVersion.vulkan >= 100 && version < 140) { + if (spvVersion.vulkan > 0 && version < 140) { correct = false; infoSink.info.message(EPrefixError, "#version: Desktop shaders for Vulkan SPIR-V require version 140 or higher"); version = 140; @@ -619,9 +619,9 @@ { // Set up environmental defaults, first ignoring 'environment'. if (messages & EShMsgSpvRules) - spvVersion.spv = 0x00010000; + spvVersion.spv = EShTargetSpv_1_0; if (messages & EShMsgVulkanRules) { - spvVersion.vulkan = 100; + spvVersion.vulkan = EShTargetVulkan_1_0; spvVersion.vulkanGlsl = 100; } else if (spvVersion.spv != 0) spvVersion.openGl = 100; @@ -744,9 +744,9 @@ const int numPre = 2; const int numPost = requireNonempty? 1 : 0; const int numTotal = numPre + numStrings + numPost; - size_t* lengths = new size_t[numTotal]; - const char** strings = new const char*[numTotal]; - const char** names = new const char*[numTotal]; + std::unique_ptr lengths(new size_t[numTotal]); + std::unique_ptr strings(new const char*[numTotal]); + std::unique_ptr names(new const char*[numTotal]); for (int s = 0; s < numStrings; ++s) { strings[s + numPre] = shaderStrings[s]; if (inputLengths == nullptr || inputLengths[s] < 0) @@ -768,6 +768,8 @@ SpvVersion spvVersion; EShLanguage stage = compiler->getLanguage(); TranslateEnvironment(environment, messages, source, stage, spvVersion); + if (environment != nullptr && environment->target.hlslFunctionality1) + intermediate.setHlslFunctionality1(); // First, without using the preprocessor or parser, find the #version, so we know what // symbol tables, processing rules, etc. to set up. This does not need the extra strings @@ -814,7 +816,7 @@ intermediate.setProfile(profile); intermediate.setSpv(spvVersion); RecordProcesses(intermediate, messages, sourceEntryPointName); - if (spvVersion.vulkan >= 100) + if (spvVersion.vulkan > 0) intermediate.setOriginUpperLeft(); if ((messages & EShMsgHlslOffsets) || source == EShSourceHlsl) intermediate.setHlslOffsets(); @@ -832,25 +834,24 @@ [stage]; // Dynamically allocate the symbol table so we can control when it is deallocated WRT the pool. - TSymbolTable* symbolTableMemory = new TSymbolTable; - TSymbolTable& symbolTable = *symbolTableMemory; + std::unique_ptr symbolTable(new TSymbolTable); if (cachedTable) - symbolTable.adoptLevels(*cachedTable); + symbolTable->adoptLevels(*cachedTable); // Add built-in symbols that are potentially context dependent; // they get popped again further down. - if (! AddContextSpecificSymbols(resources, compiler->infoSink, symbolTable, version, profile, spvVersion, - stage, source)) + if (! AddContextSpecificSymbols(resources, compiler->infoSink, *symbolTable, version, profile, spvVersion, + stage, source)) { return false; + } // // Now we can process the full shader under proper symbols and rules. // - TParseContextBase* parseContext = CreateParseContext(symbolTable, intermediate, version, profile, source, - stage, compiler->infoSink, - spvVersion, forwardCompatible, messages, false, sourceEntryPointName); - + std::unique_ptr parseContext(CreateParseContext(*symbolTable, intermediate, version, profile, source, + stage, compiler->infoSink, + spvVersion, forwardCompatible, messages, false, sourceEntryPointName)); TPpContext ppContext(*parseContext, names[numPre] ? names[numPre] : "", includer); // only GLSL (bison triggered, really) needs an externally set scan context @@ -886,23 +887,14 @@ lengths[postIndex] = strlen(strings[numStrings + numPre]); names[postIndex] = nullptr; } - TInputScanner fullInput(numStrings + numPre + numPost, strings, lengths, names, numPre, numPost); + TInputScanner fullInput(numStrings + numPre + numPost, strings.get(), lengths.get(), names.get(), numPre, numPost); // Push a new symbol allocation scope that will get used for the shader's globals. - symbolTable.push(); + symbolTable->push(); bool success = processingContext(*parseContext, ppContext, fullInput, - versionWillBeError, symbolTable, + versionWillBeError, *symbolTable, intermediate, optLevel, messages); - - // Clean up the symbol table. The AST is self-sufficient now. - delete symbolTableMemory; - - delete parseContext; - delete [] lengths; - delete [] strings; - delete [] names; - return success; } @@ -912,7 +904,7 @@ class SourceLineSynchronizer { public: SourceLineSynchronizer(const std::function& lastSourceIndex, - std::stringstream* output) + std::string* output) : getLastSourceIndex(lastSourceIndex), output(output), lastSource(-1), lastLine(0) {} // SourceLineSynchronizer(const SourceLineSynchronizer&) = delete; // SourceLineSynchronizer& operator=(const SourceLineSynchronizer&) = delete; @@ -927,7 +919,7 @@ // used. We also need to output a newline to separate the output // from the previous source string (if there is one). if (lastSource != -1 || lastLine != 0) - *output << std::endl; + *output += '\n'; lastSource = getLastSourceIndex(); lastLine = -1; return true; @@ -942,7 +934,7 @@ syncToMostRecentString(); const bool newLineStarted = lastLine < tokenLine; for (; lastLine < tokenLine; ++lastLine) { - if (lastLine > 0) *output << std::endl; + if (lastLine > 0) *output += '\n'; } return newLineStarted; } @@ -956,8 +948,8 @@ // A function for getting the index of the last valid source string we've // read tokens from. const std::function getLastSourceIndex; - // output stream for newlines. - std::stringstream* output; + // output string for newlines. + std::string* output; // lastSource is the source string index (starting from 0) of the last token // processed. It is tracked in order for newlines to be inserted when a new // source string starts. -1 means we haven't started processing any source @@ -988,27 +980,33 @@ parseContext.setScanner(&input); ppContext.setInput(input, versionWillBeError); - std::stringstream outputStream; + std::string outputBuffer; SourceLineSynchronizer lineSync( - std::bind(&TInputScanner::getLastValidSourceIndex, &input), &outputStream); + std::bind(&TInputScanner::getLastValidSourceIndex, &input), &outputBuffer); - parseContext.setExtensionCallback([&lineSync, &outputStream]( + parseContext.setExtensionCallback([&lineSync, &outputBuffer]( int line, const char* extension, const char* behavior) { lineSync.syncToLine(line); - outputStream << "#extension " << extension << " : " << behavior; + outputBuffer += "#extension "; + outputBuffer += extension; + outputBuffer += " : "; + outputBuffer += behavior; }); - parseContext.setLineCallback([&lineSync, &outputStream, &parseContext]( + parseContext.setLineCallback([&lineSync, &outputBuffer, &parseContext]( int curLineNum, int newLineNum, bool hasSource, int sourceNum, const char* sourceName) { // SourceNum is the number of the source-string that is being parsed. lineSync.syncToLine(curLineNum); - outputStream << "#line " << newLineNum; + outputBuffer += "#line "; + outputBuffer += std::to_string(newLineNum); if (hasSource) { - outputStream << " "; + outputBuffer += ' '; if (sourceName != nullptr) { - outputStream << "\"" << sourceName << "\""; + outputBuffer += '\"'; + outputBuffer += sourceName; + outputBuffer += '\"'; } else { - outputStream << sourceNum; + outputBuffer += std::to_string(sourceNum); } } if (parseContext.lineDirectiveShouldSetNextLine()) { @@ -1016,33 +1014,36 @@ // directive. So the new line number for the current line is newLineNum -= 1; } - outputStream << std::endl; + outputBuffer += '\n'; // And we are at the next line of the #line directive now. lineSync.setLineNum(newLineNum + 1); }); parseContext.setVersionCallback( - [&lineSync, &outputStream](int line, int version, const char* str) { + [&lineSync, &outputBuffer](int line, int version, const char* str) { lineSync.syncToLine(line); - outputStream << "#version " << version; + outputBuffer += "#version "; + outputBuffer += std::to_string(version); if (str) { - outputStream << " " << str; + outputBuffer += ' '; + outputBuffer += str; } }); - parseContext.setPragmaCallback([&lineSync, &outputStream]( + parseContext.setPragmaCallback([&lineSync, &outputBuffer]( int line, const glslang::TVector& ops) { lineSync.syncToLine(line); - outputStream << "#pragma "; + outputBuffer += "#pragma "; for(size_t i = 0; i < ops.size(); ++i) { - outputStream << ops[i]; + outputBuffer += ops[i].c_str(); } }); - parseContext.setErrorCallback([&lineSync, &outputStream]( + parseContext.setErrorCallback([&lineSync, &outputBuffer]( int line, const char* errorMessage) { lineSync.syncToLine(line); - outputStream << "#error " << errorMessage; + outputBuffer += "#error "; + outputBuffer += errorMessage; }); int lastToken = EndOfInput; // lastToken records the last token processed. @@ -1058,7 +1059,7 @@ // Don't emit whitespace onto empty lines. // Copy any whitespace characters at the start of a line // from the input to the output. - outputStream << std::string(ppToken.loc.column - 1, ' '); + outputBuffer += std::string(ppToken.loc.column - 1, ' '); } // Output a space in between tokens, but not at the start of a line, @@ -1068,13 +1069,13 @@ (unNeededSpaceTokens.find((char)token) == std::string::npos) && (unNeededSpaceTokens.find((char)lastToken) == std::string::npos) && (noSpaceBeforeTokens.find((char)token) == std::string::npos)) { - outputStream << " "; + outputBuffer += ' '; } lastToken = token; - outputStream << ppToken.name; + outputBuffer += ppToken.name; } while (true); - outputStream << std::endl; - *outputString = outputStream.str(); + outputBuffer += '\n'; + *outputString = std::move(outputBuffer); bool success = true; if (parseContext.getNumErrors() > 0) { @@ -1568,14 +1569,17 @@ #include "../Include/revision.h" +#define QUOTE(s) #s +#define STR(n) QUOTE(n) + const char* GetEsslVersionString() { - return "OpenGL ES GLSL 3.20 glslang Khronos." GLSLANG_REVISION " " GLSLANG_DATE; + return "OpenGL ES GLSL 3.20 glslang Khronos. " STR(GLSLANG_MINOR_VERSION) "." STR(GLSLANG_PATCH_LEVEL); } const char* GetGlslVersionString() { - return "4.60 glslang Khronos." GLSLANG_REVISION " " GLSLANG_DATE; + return "4.60 glslang Khronos. " STR(GLSLANG_MINOR_VERSION) "." STR(GLSLANG_PATCH_LEVEL); } int GetKhronosToolId() @@ -1612,6 +1616,7 @@ environment.input.dialect = EShClientNone; environment.client.client = EShClientNone; environment.target.language = EShTargetNone; + environment.target.hlslFunctionality1 = false; } TShader::~TShader() @@ -1905,6 +1910,7 @@ int TProgram::getUniformBlockSize(int index) const { return reflection->getUniformBlock(index).size; } int TProgram::getUniformIndex(const char* name) const { return reflection->getIndex(name); } int TProgram::getUniformBinding(int index) const { return reflection->getUniform(index).getBinding(); } +int TProgram::getUniformBlockBinding(int index) const { return reflection->getUniformBlock(index).getBinding(); } int TProgram::getUniformBlockIndex(int index) const { return reflection->getUniform(index).index; } int TProgram::getUniformBlockCounterIndex(int index) const { return reflection->getUniformBlock(index).counterIndex; } int TProgram::getUniformType(int index) const { return reflection->getUniform(index).glDefineType; } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/SymbolTable.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/SymbolTable.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/SymbolTable.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/SymbolTable.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2013 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -60,21 +61,22 @@ switch (basicType) { case EbtFloat: mangledName += 'f'; break; case EbtDouble: mangledName += 'd'; break; -#ifdef AMD_EXTENSIONS case EbtFloat16: mangledName += "f16"; break; -#endif case EbtInt: mangledName += 'i'; break; case EbtUint: mangledName += 'u'; break; - case EbtInt64: mangledName += "i64"; break; - case EbtUint64: mangledName += "u64"; break; -#ifdef AMD_EXTENSIONS + case EbtInt8: mangledName += "i8"; break; + case EbtUint8: mangledName += "u8"; break; case EbtInt16: mangledName += "i16"; break; case EbtUint16: mangledName += "u16"; break; -#endif + case EbtInt64: mangledName += "i64"; break; + case EbtUint64: mangledName += "u64"; break; case EbtBool: mangledName += 'b'; break; case EbtAtomicUint: mangledName += "au"; break; case EbtSampler: switch (sampler.type) { +#ifdef AMD_EXTENSIONS + case EbtFloat16: mangledName += "f16"; break; +#endif case EbtInt: mangledName += "i"; break; case EbtUint: mangledName += "u"; break; default: break; // some compilers want this diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Versions.cpp vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Versions.cpp --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Versions.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Versions.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2013 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -185,10 +186,20 @@ extensionBehavior[E_GL_ARB_post_depth_coverage] = EBhDisable; extensionBehavior[E_GL_ARB_shader_viewport_layer_array] = EBhDisable; + extensionBehavior[E_GL_KHR_shader_subgroup_basic] = EBhDisable; + extensionBehavior[E_GL_KHR_shader_subgroup_vote] = EBhDisable; + extensionBehavior[E_GL_KHR_shader_subgroup_arithmetic] = EBhDisable; + extensionBehavior[E_GL_KHR_shader_subgroup_ballot] = EBhDisable; + extensionBehavior[E_GL_KHR_shader_subgroup_shuffle] = EBhDisable; + extensionBehavior[E_GL_KHR_shader_subgroup_shuffle_relative] = EBhDisable; + extensionBehavior[E_GL_KHR_shader_subgroup_clustered] = EBhDisable; + extensionBehavior[E_GL_KHR_shader_subgroup_quad] = EBhDisable; + extensionBehavior[E_GL_EXT_shader_non_constant_global_initializers] = EBhDisable; extensionBehavior[E_GL_EXT_shader_image_load_formatted] = EBhDisable; extensionBehavior[E_GL_EXT_post_depth_coverage] = EBhDisable; extensionBehavior[E_GL_EXT_control_flow_attributes] = EBhDisable; + extensionBehavior[E_GL_EXT_nonuniform_qualifier] = EBhDisable; // #line and #include extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive] = EBhDisable; @@ -204,6 +215,7 @@ extensionBehavior[E_GL_AMD_gpu_shader_int16] = EBhDisable; extensionBehavior[E_GL_AMD_shader_image_load_store_lod] = EBhDisable; extensionBehavior[E_GL_AMD_shader_fragment_mask] = EBhDisable; + extensionBehavior[E_GL_AMD_gpu_shader_half_float_fetch] = EBhDisable; #endif #ifdef NV_EXTENSIONS @@ -214,6 +226,8 @@ extensionBehavior[E_GL_NVX_multiview_per_view_attributes] = EBhDisable; extensionBehavior[E_GL_NV_shader_atomic_int64] = EBhDisable; extensionBehavior[E_GL_NV_conservative_raster_underestimation] = EBhDisable; + extensionBehavior[E_GL_NV_shader_noperspective_interpolation] = EBhDisable; + extensionBehavior[E_GL_NV_shader_subgroup_partitioned] = EBhDisable; #endif // AEP @@ -251,6 +265,16 @@ // OVR extensions extensionBehavior[E_GL_OVR_multiview] = EBhDisable; extensionBehavior[E_GL_OVR_multiview2] = EBhDisable; + + // explicit types + extensionBehavior[E_GL_KHX_shader_explicit_arithmetic_types] = EBhDisable; + extensionBehavior[E_GL_KHX_shader_explicit_arithmetic_types_int8] = EBhDisable; + extensionBehavior[E_GL_KHX_shader_explicit_arithmetic_types_int16] = EBhDisable; + extensionBehavior[E_GL_KHX_shader_explicit_arithmetic_types_int32] = EBhDisable; + extensionBehavior[E_GL_KHX_shader_explicit_arithmetic_types_int64] = EBhDisable; + extensionBehavior[E_GL_KHX_shader_explicit_arithmetic_types_float16] = EBhDisable; + extensionBehavior[E_GL_KHX_shader_explicit_arithmetic_types_float32] = EBhDisable; + extensionBehavior[E_GL_KHX_shader_explicit_arithmetic_types_float64] = EBhDisable; } // Get code that is not part of a shared symbol table, is specific to this shader, @@ -298,6 +322,13 @@ "#define GL_OES_texture_cube_map_array 1\n" "#define GL_EXT_shader_non_constant_global_initializers 1\n" ; + +#ifdef NV_EXTENSIONS + if (profile == EEsProfile && version >= 300) { + preamble += "#define GL_NV_shader_noperspective_interpolation 1\n"; + } +#endif + } else { preamble = "#define GL_FRAGMENT_PRECISION_HIGH 1\n" @@ -330,6 +361,17 @@ "#define GL_EXT_shader_image_load_formatted 1\n" "#define GL_EXT_post_depth_coverage 1\n" "#define GL_EXT_control_flow_attributes 1\n" + "#define GL_EXT_nonuniform_qualifier 1\n" + + // GL_KHR_shader_subgroup + "#define GL_KHR_shader_subgroup_basic 1\n" + "#define GL_KHR_shader_subgroup_vote 1\n" + "#define GL_KHR_shader_subgroup_arithmetic 1\n" + "#define GL_KHR_shader_subgroup_ballot 1\n" + "#define GL_KHR_shader_subgroup_shuffle 1\n" + "#define GL_KHR_shader_subgroup_shuffle_relative 1\n" + "#define GL_KHR_shader_subgroup_clustered 1\n" + "#define GL_KHR_shader_subgroup_quad 1\n" #ifdef AMD_EXTENSIONS "#define GL_AMD_shader_ballot 1\n" @@ -341,6 +383,7 @@ "#define GL_AMD_gpu_shader_int16 1\n" "#define GL_AMD_shader_image_load_store_lod 1\n" "#define GL_AMD_shader_fragment_mask 1\n" + "#define GL_AMD_gpu_shader_half_float_fetch 1\n" #endif #ifdef NV_EXTENSIONS @@ -349,7 +392,16 @@ "#define GL_NV_viewport_array2 1\n" "#define GL_NV_shader_atomic_int64 1\n" "#define GL_NV_conservative_raster_underestimation 1\n" + "#define GL_NV_shader_subgroup_partitioned 1\n" #endif + "#define GL_KHX_shader_explicit_arithmetic_types 1\n" + "#define GL_KHX_shader_explicit_arithmetic_types_int8 1\n" + "#define GL_KHX_shader_explicit_arithmetic_types_int16 1\n" + "#define GL_KHX_shader_explicit_arithmetic_types_int32 1\n" + "#define GL_KHX_shader_explicit_arithmetic_types_int64 1\n" + "#define GL_KHX_shader_explicit_arithmetic_types_float16 1\n" + "#define GL_KHX_shader_explicit_arithmetic_types_float32 1\n" + "#define GL_KHX_shader_explicit_arithmetic_types_float64 1\n" ; if (version >= 150) { @@ -687,6 +739,25 @@ updateExtensionBehavior(line, "GL_OES_shader_io_blocks", behaviorString); else if (strcmp(extension, "GL_GOOGLE_include_directive") == 0) updateExtensionBehavior(line, "GL_GOOGLE_cpp_style_line_directive", behaviorString); + // subgroup_* to subgroup_basic + else if (strcmp(extension, "GL_KHR_shader_subgroup_vote") == 0) + updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString); + else if (strcmp(extension, "GL_KHR_shader_subgroup_arithmetic") == 0) + updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString); + else if (strcmp(extension, "GL_KHR_shader_subgroup_ballot") == 0) + updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString); + else if (strcmp(extension, "GL_KHR_shader_subgroup_shuffle") == 0) + updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString); + else if (strcmp(extension, "GL_KHR_shader_subgroup_shuffle_relative") == 0) + updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString); + else if (strcmp(extension, "GL_KHR_shader_subgroup_clustered") == 0) + updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString); + else if (strcmp(extension, "GL_KHR_shader_subgroup_quad") == 0) + updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString); +#ifdef NV_EXTENSIONS + else if (strcmp(extension, "GL_NV_shader_subgroup_partitioned") == 0) + updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString); +#endif } void TParseVersions::updateExtensionBehavior(const char* extension, TExtensionBehavior behavior) @@ -744,23 +815,71 @@ profileRequires(loc, ECompatibilityProfile, 400, nullptr, op); } -#ifdef AMD_EXTENSIONS -// Call for any operation needing GLSL 16-bit integer data-type support. -void TParseVersions::int16Check(const TSourceLoc& loc, const char* op, bool builtIn) +// Call for any operation needing GLSL float16 data-type support. +void TParseVersions::float16Check(const TSourceLoc& loc, const char* op, bool builtIn) +{ + if (!builtIn) { +#if AMD_EXTENSIONS + const char* const extensions[3] = {E_GL_AMD_gpu_shader_half_float, + E_GL_KHX_shader_explicit_arithmetic_types, + E_GL_KHX_shader_explicit_arithmetic_types_float16}; + +#else + const char* const extensions[2] = {E_GL_KHX_shader_explicit_arithmetic_types, + E_GL_KHX_shader_explicit_arithmetic_types_float16}; +#endif + requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, "explicit types"); + requireProfile(loc, ECoreProfile | ECompatibilityProfile, op); + profileRequires(loc, ECoreProfile, 450, nullptr, op); + profileRequires(loc, ECompatibilityProfile, 450, nullptr, op); + } +} + +// Call for any operation needing GLSL float32 data-type support. +void TParseVersions::explicitFloat32Check(const TSourceLoc& loc, const char* op, bool builtIn) +{ + if (!builtIn) { + const char* const extensions[2] = {E_GL_KHX_shader_explicit_arithmetic_types, + E_GL_KHX_shader_explicit_arithmetic_types_float32}; + requireExtensions(loc, 2, extensions, "explicit types"); + requireProfile(loc, ECoreProfile | ECompatibilityProfile, op); + profileRequires(loc, ECoreProfile, 450, nullptr, op); + profileRequires(loc, ECompatibilityProfile, 450, nullptr, op); + } +} + +// Call for any operation needing GLSL float64 data-type support. +void TParseVersions::explicitFloat64Check(const TSourceLoc& loc, const char* op, bool builtIn) +{ + if (!builtIn) { + const char* const extensions[2] = {E_GL_KHX_shader_explicit_arithmetic_types, + E_GL_KHX_shader_explicit_arithmetic_types_float64}; + requireExtensions(loc, 2, extensions, "explicit types"); + requireProfile(loc, ECoreProfile | ECompatibilityProfile, op); + profileRequires(loc, ECoreProfile, 450, nullptr, op); + profileRequires(loc, ECompatibilityProfile, 450, nullptr, op); + } +} + +// Call for any operation needing GLSL explicit int8 data-type support. +void TParseVersions::explicitInt8Check(const TSourceLoc& loc, const char* op, bool builtIn) { if (! builtIn) { - requireExtensions(loc, 1, &E_GL_AMD_gpu_shader_int16, "shader int16"); + const char* const extensions[2] = {E_GL_KHX_shader_explicit_arithmetic_types, + E_GL_KHX_shader_explicit_arithmetic_types_int8}; + requireExtensions(loc, 2, extensions, "explicit types"); requireProfile(loc, ECoreProfile | ECompatibilityProfile, op); profileRequires(loc, ECoreProfile, 450, nullptr, op); profileRequires(loc, ECompatibilityProfile, 450, nullptr, op); } } -// Call for any operation needing GLSL float16 data-type support. -void TParseVersions::float16Check(const TSourceLoc& loc, const char* op, bool builtIn) +#ifdef AMD_EXTENSIONS +// Call for any operation needing GLSL float16 opaque-type support +void TParseVersions::float16OpaqueCheck(const TSourceLoc& loc, const char* op, bool builtIn) { if (! builtIn) { - requireExtensions(loc, 1, &E_GL_AMD_gpu_shader_half_float, "shader half float"); + requireExtensions(loc, 1, &E_GL_AMD_gpu_shader_half_float_fetch, op); requireProfile(loc, ECoreProfile | ECompatibilityProfile, op); profileRequires(loc, ECoreProfile, 450, nullptr, op); profileRequires(loc, ECompatibilityProfile, 450, nullptr, op); @@ -768,11 +887,46 @@ } #endif +// Call for any operation needing GLSL explicit int16 data-type support. +void TParseVersions::explicitInt16Check(const TSourceLoc& loc, const char* op, bool builtIn) +{ + if (! builtIn) { +#if AMD_EXTENSIONS + const char* const extensions[3] = {E_GL_AMD_gpu_shader_int16, + E_GL_KHX_shader_explicit_arithmetic_types, + E_GL_KHX_shader_explicit_arithmetic_types_int16}; +#else + const char* const extensions[2] = {E_GL_KHX_shader_explicit_arithmetic_types, + E_GL_KHX_shader_explicit_arithmetic_types_int16}; +#endif + requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, "explicit types"); + requireProfile(loc, ECoreProfile | ECompatibilityProfile, op); + profileRequires(loc, ECoreProfile, 450, nullptr, op); + profileRequires(loc, ECompatibilityProfile, 450, nullptr, op); + } +} + +// Call for any operation needing GLSL explicit int32 data-type support. +void TParseVersions::explicitInt32Check(const TSourceLoc& loc, const char* op, bool builtIn) +{ + if (! builtIn) { + const char* const extensions[2] = {E_GL_KHX_shader_explicit_arithmetic_types, + E_GL_KHX_shader_explicit_arithmetic_types_int32}; + requireExtensions(loc, 2, extensions, "explicit types"); + requireProfile(loc, ECoreProfile | ECompatibilityProfile, op); + profileRequires(loc, ECoreProfile, 450, nullptr, op); + profileRequires(loc, ECompatibilityProfile, 450, nullptr, op); + } +} + // Call for any operation needing GLSL 64-bit integer data-type support. void TParseVersions::int64Check(const TSourceLoc& loc, const char* op, bool builtIn) { if (! builtIn) { - requireExtensions(loc, 1, &E_GL_ARB_gpu_shader_int64, "shader int64"); + const char* const extensions[3] = {E_GL_ARB_gpu_shader_int64, + E_GL_KHX_shader_explicit_arithmetic_types, + E_GL_KHX_shader_explicit_arithmetic_types_int64}; + requireExtensions(loc, 3, extensions, "shader int64"); requireProfile(loc, ECoreProfile | ECompatibilityProfile, op); profileRequires(loc, ECoreProfile, 450, nullptr, op); profileRequires(loc, ECompatibilityProfile, 450, nullptr, op); @@ -789,7 +943,7 @@ // Call for any operation removed because Vulkan SPIR-V is being generated. void TParseVersions::vulkanRemoved(const TSourceLoc& loc, const char* op) { - if (spvVersion.vulkan >= 100) + if (spvVersion.vulkan > 0) error(loc, "not allowed when using GLSL for Vulkan", op, ""); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Versions.h vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Versions.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/MachineIndependent/Versions.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/MachineIndependent/Versions.h 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2013 LunarG, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -83,7 +84,7 @@ SpvVersion() : spv(0), vulkanGlsl(0), vulkan(0), openGl(0) {} unsigned int spv; // the version of SPIR-V to target, as defined by "word 1" of the SPIR-V binary header int vulkanGlsl; // the version of GLSL semantics for Vulkan, from GL_KHR_vulkan_glsl, for "#define VULKAN XXX" - int vulkan; // the version of Vulkan, for which SPIR-V execution environment rules to use (100 means 1.0) + int vulkan; // the version of Vulkan, for which SPIR-V execution environment rules to use int openGl; // the version of GLSL semantics for OpenGL, from GL_ARB_gl_spirv, for "#define GL_SPIRV XXX" }; @@ -139,6 +140,15 @@ const char* const E_GL_ARB_post_depth_coverage = "GL_ARB_post_depth_coverage"; const char* const E_GL_ARB_shader_viewport_layer_array = "GL_ARB_shader_viewport_layer_array"; +const char* const E_GL_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic"; +const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote"; +const char* const E_GL_KHR_shader_subgroup_arithmetic = "GL_KHR_shader_subgroup_arithmetic"; +const char* const E_GL_KHR_shader_subgroup_ballot = "GL_KHR_shader_subgroup_ballot"; +const char* const E_GL_KHR_shader_subgroup_shuffle = "GL_KHR_shader_subgroup_shuffle"; +const char* const E_GL_KHR_shader_subgroup_shuffle_relative = "GL_KHR_shader_subgroup_shuffle_relative"; +const char* const E_GL_KHR_shader_subgroup_clustered = "GL_KHR_shader_subgroup_clustered"; +const char* const E_GL_KHR_shader_subgroup_quad = "GL_KHR_shader_subgroup_quad"; + const char* const E_GL_EXT_shader_non_constant_global_initializers = "GL_EXT_shader_non_constant_global_initializers"; const char* const E_GL_EXT_shader_image_load_formatted = "GL_EXT_shader_image_load_formatted"; @@ -147,6 +157,7 @@ const char* const E_GL_EXT_multiview = "GL_EXT_multiview"; const char* const E_GL_EXT_post_depth_coverage = "GL_EXT_post_depth_coverage"; const char* const E_GL_EXT_control_flow_attributes = "GL_EXT_control_flow_attributes"; +const char* const E_GL_EXT_nonuniform_qualifier = "GL_EXT_nonuniform_qualifier"; // Arrays of extensions for the above viewportEXTs duplications @@ -174,6 +185,7 @@ const char* const E_GL_AMD_gpu_shader_int16 = "GL_AMD_gpu_shader_int16"; const char* const E_GL_AMD_shader_image_load_store_lod = "GL_AMD_shader_image_load_store_lod"; const char* const E_GL_AMD_shader_fragment_mask = "GL_AMD_shader_fragment_mask"; +const char* const E_GL_AMD_gpu_shader_half_float_fetch = "GL_AMD_gpu_shader_half_float_fetch"; #endif #ifdef NV_EXTENSIONS @@ -185,6 +197,8 @@ const char* const E_GL_NVX_multiview_per_view_attributes = "GL_NVX_multiview_per_view_attributes"; const char* const E_GL_NV_shader_atomic_int64 = "GL_NV_shader_atomic_int64"; const char* const E_GL_NV_conservative_raster_underestimation = "GL_NV_conservative_raster_underestimation"; +const char* const E_GL_NV_shader_noperspective_interpolation = "GL_NV_shader_noperspective_interpolation"; +const char* const E_GL_NV_shader_subgroup_partitioned = "GL_NV_shader_subgroup_partitioned"; // Arrays of extensions for the above viewportEXTs duplications @@ -220,6 +234,16 @@ const char* const E_GL_OES_texture_buffer = "GL_OES_texture_buffer"; const char* const E_GL_OES_texture_cube_map_array = "GL_OES_texture_cube_map_array"; +// KHX +const char* const E_GL_KHX_shader_explicit_arithmetic_types = "GL_KHX_shader_explicit_arithmetic_types"; +const char* const E_GL_KHX_shader_explicit_arithmetic_types_int8 = "GL_KHX_shader_explicit_arithmetic_types_int8"; +const char* const E_GL_KHX_shader_explicit_arithmetic_types_int16 = "GL_KHX_shader_explicit_arithmetic_types_int16"; +const char* const E_GL_KHX_shader_explicit_arithmetic_types_int32 = "GL_KHX_shader_explicit_arithmetic_types_int32"; +const char* const E_GL_KHX_shader_explicit_arithmetic_types_int64 = "GL_KHX_shader_explicit_arithmetic_types_int64"; +const char* const E_GL_KHX_shader_explicit_arithmetic_types_float16 = "GL_KHX_shader_explicit_arithmetic_types_float16"; +const char* const E_GL_KHX_shader_explicit_arithmetic_types_float32 = "GL_KHX_shader_explicit_arithmetic_types_float32"; +const char* const E_GL_KHX_shader_explicit_arithmetic_types_float64 = "GL_KHX_shader_explicit_arithmetic_types_float64"; + // Arrays of extensions for the above AEP duplications const char* const AEP_geometry_shader[] = { E_GL_EXT_geometry_shader, E_GL_OES_geometry_shader }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/Public/ShaderLang.h vulkan-1.1.73+dfsg/external/glslang/glslang/Public/ShaderLang.h --- vulkan-1.1.70+dfsg1/external/glslang/glslang/Public/ShaderLang.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/Public/ShaderLang.h 2018-04-27 11:46:26.000000000 +0000 @@ -67,6 +67,11 @@ extern "C" { #endif +// This should always increase, as some paths to do not consume +// a more major number. +// It should increment by one when new functionality is added. +#define GLSLANG_MINOR_VERSION 6 + // // Call before doing any other compiler/linker operations. // @@ -123,6 +128,19 @@ EshTargetSpv = EShTargetSpv, // legacy spelling } EShTargetLanguage; +typedef enum { + EShTargetVulkan_1_0 = (1 << 22), + EShTargetVulkan_1_1 = (1 << 22) | (1 << 12), + EShTargetOpenGL_450 = 450, +} EShTargetClientVersion; + +typedef EShTargetClientVersion EshTargetClientVersion; + +typedef enum { + EShTargetSpv_1_0 = (1 << 16), + EShTargetSpv_1_3 = (1 << 16) | (3 << 8), +} EShTargetLanguageVersion; + struct TInputLanguage { EShSource languageFamily; // redundant information with other input, this one overrides when not EShSourceNone EShLanguage stage; // redundant information with other input, this one overrides when not EShSourceNone @@ -132,12 +150,13 @@ struct TClient { EShClient client; - int version; // version of client itself (not the client's input dialect) + EShTargetClientVersion version; // version of client itself (not the client's input dialect) }; struct TTarget { EShTargetLanguage language; - unsigned int version; // the version to target, if SPIR-V, defined by "word 1" of the SPIR-V binary header + EShTargetLanguageVersion version; // version to target, if SPIR-V, defined by "word 1" of the SPIR-V header + bool hlslFunctionality1; // can target hlsl_functionality1 extension(s) }; // All source/client/target versions and settings. @@ -195,6 +214,8 @@ EShMsgKeepUncalled = (1 << 8), // for testing, don't eliminate uncalled functions EShMsgHlslOffsets = (1 << 9), // allow block offsets to follow HLSL rules instead of GLSL rules EShMsgDebugInfo = (1 << 10), // save debug information + EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL + EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages }; // @@ -393,16 +414,18 @@ environment.input.dialect = client; environment.input.dialectVersion = version; } - void setEnvClient(EShClient client, int version) + void setEnvClient(EShClient client, EShTargetClientVersion version) { environment.client.client = client; environment.client.version = version; } - void setEnvTarget(EShTargetLanguage lang, unsigned int version) + void setEnvTarget(EShTargetLanguage lang, EShTargetLanguageVersion version) { environment.target.language = lang; environment.target.version = version; } + void setEnvTargetHlslFunctionality1() { environment.target.hlslFunctionality1 = true; } + bool getEnvTargetHlslFunctionality1() const { return environment.target.hlslFunctionality1; } // Interface to #include handlers. // @@ -648,6 +671,7 @@ int getUniformBlockSize(int blockIndex) const; // can be used for glGetActiveUniformBlockiv(UNIFORM_BLOCK_DATA_SIZE) int getUniformIndex(const char* name) const; // can be used for glGetUniformIndices() int getUniformBinding(int index) const; // returns the binding number + int getUniformBlockBinding(int index) const; // returns the block binding number int getUniformBlockIndex(int index) const; // can be used for glGetActiveUniformsiv(GL_UNIFORM_BLOCK_INDEX) int getUniformBlockCounterIndex(int index) const; // returns block index of associated counter. int getUniformType(int index) const; // can be used for glGetActiveUniformsiv(GL_UNIFORM_TYPE) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/glslang/updateGrammar vulkan-1.1.73+dfsg/external/glslang/glslang/updateGrammar --- vulkan-1.1.70+dfsg1/external/glslang/glslang/updateGrammar 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/glslang/updateGrammar 2018-04-27 11:46:26.000000000 +0000 @@ -1,3 +1,3 @@ -#!/usr/bin/env bash +#!/usr/bin/env bash bison --defines=MachineIndependent/glslang_tab.cpp.h -t MachineIndependent/glslang.y -o MachineIndependent/glslang_tab.cpp diff -Nru vulkan-1.1.70+dfsg1/external/glslang/gtests/AST.FromFile.cpp vulkan-1.1.73+dfsg/external/glslang/gtests/AST.FromFile.cpp --- vulkan-1.1.70+dfsg1/external/glslang/gtests/AST.FromFile.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/gtests/AST.FromFile.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -41,12 +41,26 @@ using CompileToAstTest = GlslangTest<::testing::TestWithParam>; +#ifdef NV_EXTENSIONS +using CompileToAstTestNV = GlslangTest<::testing::TestWithParam>; +#endif + TEST_P(CompileToAstTest, FromFile) { loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), - Source::GLSL, Semantics::OpenGL, + Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0, + Target::AST); +} + +#ifdef NV_EXTENSIONS +// Compiling GLSL to SPIR-V under OpenGL semantics (NV extensions enabled). +TEST_P(CompileToAstTestNV, FromFile) +{ + loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), + Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0, Target::AST); } +#endif // clang-format off INSTANTIATE_TEST_CASE_P( @@ -85,6 +99,7 @@ "cppComplexExpr.vert", "cppDeepNest.frag", "cppPassMacroName.frag", + "cppRelaxSkipTokensErrors.vert", "badChars.frag", "pointCoord.frag", "array.frag", @@ -106,6 +121,7 @@ "310.tese", "310implicitSizeArrayError.vert", "310AofA.vert", + "310runtimeArray.vert", "320.comp", "320.vert", "320.geom", @@ -184,10 +200,13 @@ "loopsArtificial.frag", "matrix.frag", "matrix2.frag", + "mixedArrayDecls.frag", + "nonuniform.frag", "newTexture.frag", "Operations.frag", "overlongLiteral.frag", "prepost.frag", + "runtimeArray.vert", "simpleFunctionCall.frag", "structAssignment.frag", "structDeref.frag", @@ -210,9 +229,20 @@ "precise.tesc", "precise_struct_block.vert", "maxClipDistances.vert", + "findFunction.frag", + })), + FileNameAsCustomTestSuffix +); + +#ifdef NV_EXTENSIONS +INSTANTIATE_TEST_CASE_P( + Glsl, CompileToAstTestNV, + ::testing::ValuesIn(std::vector({ + "nvShaderNoperspectiveInterpolation.frag", })), FileNameAsCustomTestSuffix ); +#endif // clang-format on } // anonymous namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/gtests/Config.FromFile.cpp vulkan-1.1.73+dfsg/external/glslang/gtests/Config.FromFile.cpp --- vulkan-1.1.70+dfsg1/external/glslang/gtests/Config.FromFile.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/gtests/Config.FromFile.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -97,7 +97,7 @@ INSTANTIATE_TEST_CASE_P( Glsl, ConfigTest, ::testing::ValuesIn(std::vector({ - {"specExamples.vert", "baseResults/test.conf", "specExamples.vert.out", (EShMessages)(EShMsgAST | EShMsgCascadingErrors)}, + {"specExamples.vert", "baseResults/test.conf", "specExamplesConf.vert.out", (EShMessages)(EShMsgAST | EShMsgCascadingErrors)}, {"100Limits.vert", "100.conf", "100LimitsConf.vert.out", EShMsgCascadingErrors}, })), ); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/gtests/Hlsl.FromFile.cpp vulkan-1.1.73+dfsg/external/glslang/gtests/Hlsl.FromFile.cpp --- vulkan-1.1.70+dfsg1/external/glslang/gtests/Hlsl.FromFile.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/gtests/Hlsl.FromFile.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -58,6 +58,7 @@ } using HlslCompileTest = GlslangTest<::testing::TestWithParam>; +using HlslVulkan1_1CompileTest = GlslangTest<::testing::TestWithParam>; using HlslCompileAndFlattenTest = GlslangTest<::testing::TestWithParam>; using HlslLegalizeTest = GlslangTest<::testing::TestWithParam>; @@ -66,8 +67,15 @@ TEST_P(HlslCompileTest, FromFile) { loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName, - Source::HLSL, Semantics::Vulkan, - Target::BothASTAndSpv, GetParam().entryPoint); + Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, + Target::BothASTAndSpv, true, GetParam().entryPoint); +} + +TEST_P(HlslVulkan1_1CompileTest, FromFile) +{ + loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName, + Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1, + Target::BothASTAndSpv, true, GetParam().entryPoint); } TEST_P(HlslCompileAndFlattenTest, FromFile) @@ -82,9 +90,9 @@ TEST_P(HlslLegalizeTest, FromFile) { loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName, - Source::HLSL, Semantics::Vulkan, - Target::Spv, GetParam().entryPoint, - "/baseLegalResults/", false); + Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, + Target::Spv, true, GetParam().entryPoint, + "/baseLegalResults/", true); } // clang-format off @@ -189,6 +197,7 @@ {"hlsl.hull.ctrlpt-2.tesc", "main"}, {"hlsl.identifier.sample.frag", "main"}, {"hlsl.if.frag", "PixelShaderFunction"}, + {"hlsl.imagefetch-subvec4.comp", "main"}, {"hlsl.implicitBool.frag", "main"}, {"hlsl.inf.vert", "main"}, {"hlsl.inoutquals.frag", "main"}, @@ -376,6 +385,22 @@ // clang-format off INSTANTIATE_TEST_CASE_P( + ToSpirv, HlslVulkan1_1CompileTest, + ::testing::ValuesIn(std::vector{ + {"hlsl.wavebroadcast.comp", "CSMain"}, + {"hlsl.waveprefix.comp", "CSMain"}, + {"hlsl.wavequad.comp", "CSMain"}, + {"hlsl.wavequery.comp", "CSMain"}, + {"hlsl.wavequery.frag", "PixelShaderFunction"}, + {"hlsl.wavereduction.comp", "CSMain"}, + {"hlsl.wavevote.comp", "CSMain"}, + }), + FileNameAsCustomTestSuffix +); +// clang-format on + +// clang-format off +INSTANTIATE_TEST_CASE_P( ToSpirv, HlslCompileAndFlattenTest, ::testing::ValuesIn(std::vector{ {"hlsl.array.flatten.frag", "main"}, @@ -385,7 +410,7 @@ ); // clang-format on -#ifdef ENABLE_OPT +#if ENABLE_OPT // clang-format off INSTANTIATE_TEST_CASE_P( ToSpirv, HlslLegalizeTest, diff -Nru vulkan-1.1.70+dfsg1/external/glslang/gtests/Link.FromFile.Vk.cpp vulkan-1.1.73+dfsg/external/glslang/gtests/Link.FromFile.Vk.cpp --- vulkan-1.1.70+dfsg1/external/glslang/gtests/Link.FromFile.Vk.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/gtests/Link.FromFile.Vk.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -52,6 +52,7 @@ GlslangResult result; // Compile each input shader file. + bool success = true; std::vector> shaders; for (size_t i = 0; i < fileCount; ++i) { std::string contents; @@ -61,7 +62,7 @@ new glslang::TShader(GetShaderStage(GetSuffix(fileNames[i])))); auto* shader = shaders.back().get(); shader->setAutoMapLocations(true); - compile(shader, contents, "", controls); + success &= compile(shader, contents, "", controls); result.shaderResults.push_back( {fileNames[i], shader->getInfoLog(), shader->getInfoDebugLog()}); } @@ -69,10 +70,25 @@ // Link all of them. glslang::TProgram program; for (const auto& shader : shaders) program.addShader(shader.get()); - program.link(controls); + success &= program.link(controls); result.linkingOutput = program.getInfoLog(); result.linkingError = program.getInfoDebugLog(); + if (success && (controls & EShMsgSpvRules)) { + spv::SpvBuildLogger logger; + std::vector spirv_binary; + glslang::SpvOptions options; + options.disableOptimizer = true; + glslang::GlslangToSpv(*program.getIntermediate(shaders.front()->getStage()), + spirv_binary, &logger, &options); + + std::ostringstream disassembly_stream; + spv::Parameterize(); + spv::Disassemble(disassembly_stream, spirv_binary); + result.spirvWarningsErrors = logger.getAllMessages(); + result.spirv = disassembly_stream.str(); + } + std::ostringstream stream; outputResultToStream(&stream, result, controls); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/gtests/main.cpp vulkan-1.1.73+dfsg/external/glslang/gtests/main.cpp --- vulkan-1.1.70+dfsg1/external/glslang/gtests/main.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/gtests/main.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -54,7 +54,7 @@ glslangtest::GlobalTestSettings.updateMode = true; } if (std::string("--test-root") == argv[i]) { - // Allow the user set the tets root directory. This is useful + // Allow the user set the test root directory. This is useful // for testing with files from another source tree. if (i + 1 < argc) { glslangtest::GlobalTestSettings.testRoot = argv[i + 1]; @@ -64,6 +64,11 @@ return 1; } } + if (std::string("--help") == argv[i]) { + printf("\nExtra options:\n\n"); + printf(" --update-mode\n Update the golden results for the tests.\n"); + printf(" --test-root \n Specify the test root directory (useful for testing with\n files from another source tree).\n"); + } } const int result = RUN_ALL_TESTS(); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/gtests/Spv.FromFile.cpp vulkan-1.1.73+dfsg/external/glslang/gtests/Spv.FromFile.cpp --- vulkan-1.1.70+dfsg1/external/glslang/gtests/Spv.FromFile.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/gtests/Spv.FromFile.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -63,6 +63,7 @@ } using CompileVulkanToSpirvTest = GlslangTest<::testing::TestWithParam>; +using CompileVulkan1_1ToSpirvTest = GlslangTest<::testing::TestWithParam>; using CompileOpenGLToSpirvTest = GlslangTest<::testing::TestWithParam>; using VulkanSemantics = GlslangTest<::testing::TestWithParam>; using OpenGLSemantics = GlslangTest<::testing::TestWithParam>; @@ -82,7 +83,14 @@ TEST_P(CompileVulkanToSpirvTest, FromFile) { loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), - Source::GLSL, Semantics::Vulkan, + Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, + Target::Spv); +} + +TEST_P(CompileVulkan1_1ToSpirvTest, FromFile) +{ + loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), + Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1, Target::Spv); } @@ -91,7 +99,7 @@ TEST_P(CompileOpenGLToSpirvTest, FromFile) { loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), - Source::GLSL, Semantics::OpenGL, + Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0, Target::Spv); } @@ -100,8 +108,8 @@ TEST_P(VulkanSemantics, FromFile) { loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), - Source::GLSL, Semantics::Vulkan, - Target::Spv); + Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, + Target::Spv, false); } // GLSL-level Vulkan semantics test. Expected to error out before generating @@ -109,15 +117,15 @@ TEST_P(OpenGLSemantics, FromFile) { loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), - Source::GLSL, Semantics::OpenGL, - Target::Spv); + Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0, + Target::Spv, false); } // GLSL-level Vulkan semantics test that need to see the AST for validation. TEST_P(VulkanAstSemantics, FromFile) { loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), - Source::GLSL, Semantics::Vulkan, + Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, Target::AST); } @@ -157,19 +165,19 @@ TEST_P(CompileVulkanToSpirvTestAMD, FromFile) { loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), - Source::GLSL, Semantics::Vulkan, + Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, Target::Spv); } #endif #ifdef NV_EXTENSIONS -// Compiling GLSL to SPIR-V under Vulkan semantics (AMD extensions enabled). +// Compiling GLSL to SPIR-V under Vulkan semantics (NV extensions enabled). // Expected to successfully generate SPIR-V. TEST_P(CompileVulkanToSpirvTestNV, FromFile) { loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), - Source::GLSL, Semantics::Vulkan, - Target::Spv); + Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, + Target::Spv); } #endif @@ -235,6 +243,7 @@ "spv.branch-return.vert", "spv.builtInXFB.vert", "spv.conditionalDiscard.frag", + "spv.constStruct.vert", "spv.controlFlowAttributes.frag", "spv.conversion.frag", "spv.dataOut.frag", @@ -242,9 +251,7 @@ "spv.dataOutIndirect.vert", "spv.deepRvalue.frag", "spv.depthOut.frag", - "spv.deviceGroup.frag", "spv.discard-dce.frag", - "spv.drawParams.vert", "spv.doWhileLoop.frag", "spv.earlyReturnDiscard.frag", "spv.extPostDepthCoverage.frag", @@ -272,10 +279,10 @@ "spv.merge-unreachable.frag", "spv.multiStruct.comp", "spv.multiStructFuncall.frag", - "spv.multiView.frag", "spv.newTexture.frag", "spv.noDeadDecorations.vert", "spv.nonSquare.vert", + "spv.nonuniform.frag", "spv.noWorkgroup.comp", "spv.offsets.frag", "spv.Operations.frag", @@ -315,6 +322,7 @@ "spv.variableArrayIndex.frag", "spv.varyingArray.frag", "spv.varyingArrayIndirect.frag", + "spv.vecMatConstruct.frag", "spv.voidFunction.frag", "spv.whileLoop.frag", "spv.AofA.frag", @@ -331,6 +339,8 @@ "spv.storageBuffer.vert", "spv.precise.tese", "spv.precise.tesc", + "spv.vulkan100.subgroupArithmetic.comp", + "spv.vulkan100.subgroupPartitioned.comp", "spv.xfb.vert", "spv.xfb2.vert", "spv.xfb3.vert", @@ -340,6 +350,39 @@ // clang-format off INSTANTIATE_TEST_CASE_P( + Glsl, CompileVulkan1_1ToSpirvTest, + ::testing::ValuesIn(std::vector({ + "spv.deviceGroup.frag", + "spv.drawParams.vert", + "spv.int8.frag", + "spv.vulkan110.int16.frag", + "spv.int32.frag", + "spv.explicittypes.frag", + "spv.float32.frag", + "spv.float64.frag", + "spv.multiView.frag", + "spv.subgroup.frag", + "spv.subgroup.geom", + "spv.subgroup.tesc", + "spv.subgroup.tese", + "spv.subgroup.vert", + "spv.subgroupArithmetic.comp", + "spv.subgroupBasic.comp", + "spv.subgroupBallot.comp", + "spv.subgroupClustered.comp", + "spv.subgroupClusteredNeg.comp", + "spv.subgroupPartitioned.comp", + "spv.subgroupShuffle.comp", + "spv.subgroupShuffleRelative.comp", + "spv.subgroupQuad.comp", + "spv.subgroupVote.comp", + "spv.vulkan110.storageBuffer.vert", + })), + FileNameAsCustomTestSuffix +); + +// clang-format off +INSTANTIATE_TEST_CASE_P( Hlsl, HlslIoMap, ::testing::ValuesIn(std::vector{ { "spv.register.autoassign.frag", "main_ep", 5, 10, 0, 20, 30, true, false }, @@ -377,6 +420,7 @@ "spv.460.comp", "spv.atomic.comp", "spv.glFragColor.frag", + "spv.rankShift.comp", "spv.specConst.vert", "spv.OVR_multiview.vert", })), @@ -418,8 +462,10 @@ Glsl, CompileVulkanToSpirvTestAMD, ::testing::ValuesIn(std::vector({ "spv.float16.frag", + "spv.float16Fetch.frag", "spv.imageLoadStoreLod.frag", "spv.int16.frag", + "spv.int16.amd.frag", "spv.shaderBallotAMD.comp", "spv.shaderFragMaskAMD.frag", "spv.textureGatherBiasLod.frag", diff -Nru vulkan-1.1.70+dfsg1/external/glslang/gtests/TestFixture.cpp vulkan-1.1.73+dfsg/external/glslang/gtests/TestFixture.cpp --- vulkan-1.1.70+dfsg1/external/glslang/gtests/TestFixture.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/gtests/TestFixture.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -100,6 +100,8 @@ break; } + result = static_cast(result | EShMsgHlslLegalization); + return result; } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/gtests/TestFixture.h vulkan-1.1.73+dfsg/external/glslang/gtests/TestFixture.h --- vulkan-1.1.70+dfsg1/external/glslang/gtests/TestFixture.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/gtests/TestFixture.h 2018-04-27 11:46:26.000000000 +0000 @@ -70,7 +70,7 @@ // Enum for shader compilation semantics. enum class Semantics { OpenGL, - Vulkan, + Vulkan }; // Enum for compilation target. @@ -197,17 +197,40 @@ GlslangResult compileAndLink( const std::string shaderName, const std::string& code, const std::string& entryPointName, EShMessages controls, + glslang::EShTargetClientVersion clientTargetVersion, bool flattenUniformArrays = false, EShTextureSamplerTransformMode texSampTransMode = EShTexSampTransKeep, - bool disableOptimizer = true) + bool enableOptimizer = false, + bool automap = true) { - const EShLanguage kind = GetShaderStage(GetSuffix(shaderName)); + const EShLanguage stage = GetShaderStage(GetSuffix(shaderName)); - glslang::TShader shader(kind); - shader.setAutoMapLocations(true); + glslang::TShader shader(stage); + if (automap) { + shader.setAutoMapLocations(true); + shader.setAutoMapBindings(true); + } shader.setTextureSamplerTransformMode(texSampTransMode); shader.setFlattenUniformArrays(flattenUniformArrays); + if (controls & EShMsgSpvRules) { + if (controls & EShMsgVulkanRules) { + shader.setEnvInput((controls & EShMsgReadHlsl) ? glslang::EShSourceHlsl + : glslang::EShSourceGlsl, + stage, glslang::EShClientVulkan, 100); + shader.setEnvClient(glslang::EShClientVulkan, clientTargetVersion); + shader.setEnvTarget(glslang::EShTargetSpv, + clientTargetVersion == glslang::EShTargetVulkan_1_1 ? glslang::EShTargetSpv_1_3 + : glslang::EShTargetSpv_1_0); + } else { + shader.setEnvInput((controls & EShMsgReadHlsl) ? glslang::EShSourceHlsl + : glslang::EShSourceGlsl, + stage, glslang::EShClientOpenGL, 100); + shader.setEnvClient(glslang::EShClientOpenGL, clientTargetVersion); + shader.setEnvTarget(glslang::EshTargetSpv, glslang::EShTargetSpv_1_0); + } + } + bool success = compile(&shader, code, entryPointName, controls); glslang::TProgram program; @@ -219,8 +242,8 @@ if (success && (controls & EShMsgSpvRules)) { std::vector spirv_binary; glslang::SpvOptions options; - options.disableOptimizer = disableOptimizer; - glslang::GlslangToSpv(*program.getIntermediate(kind), + options.disableOptimizer = !enableOptimizer; + glslang::GlslangToSpv(*program.getIntermediate(stage), spirv_binary, &logger, &options); std::ostringstream disassembly_stream; @@ -251,9 +274,9 @@ bool autoMapBindings, bool flattenUniformArrays) { - const EShLanguage kind = GetShaderStage(GetSuffix(shaderName)); + const EShLanguage stage = GetShaderStage(GetSuffix(shaderName)); - glslang::TShader shader(kind); + glslang::TShader shader(stage); shader.setShiftSamplerBinding(baseSamplerBinding); shader.setShiftTextureBinding(baseTextureBinding); shader.setShiftImageBinding(baseImageBinding); @@ -275,7 +298,7 @@ if (success && (controls & EShMsgSpvRules)) { std::vector spirv_binary; - glslang::GlslangToSpv(*program.getIntermediate(kind), + glslang::GlslangToSpv(*program.getIntermediate(stage), spirv_binary, &logger); std::ostringstream disassembly_stream; @@ -299,9 +322,10 @@ const std::string& entryPointName, EShMessages controls, const unsigned int remapOptions = spv::spirvbin_t::NONE) { - const EShLanguage kind = GetShaderStage(GetSuffix(shaderName)); + const EShLanguage stage = GetShaderStage(GetSuffix(shaderName)); - glslang::TShader shader(kind); + glslang::TShader shader(stage); + shader.setAutoMapBindings(true); shader.setAutoMapLocations(true); bool success = compile(&shader, code, entryPointName, controls); @@ -314,7 +338,7 @@ if (success && (controls & EShMsgSpvRules)) { std::vector spirv_binary; - glslang::GlslangToSpv(*program.getIntermediate(kind), + glslang::GlslangToSpv(*program.getIntermediate(stage), spirv_binary, &logger); spv::spirvbin_t(0 /*verbosity*/).remap(spirv_binary, remapOptions); @@ -383,10 +407,12 @@ const std::string& testName, Source source, Semantics semantics, + glslang::EShTargetClientVersion clientTargetVersion, Target target, + bool automap = true, const std::string& entryPointName="", const std::string& baseDir="/baseResults/", - const bool disableOptimizer = true) + const bool enableOptimizer = false) { const std::string inputFname = testDir + "/" + testName; const std::string expectedOutputFname = @@ -396,8 +422,11 @@ tryLoadFile(inputFname, "input", &input); tryLoadFile(expectedOutputFname, "expected output", &expectedOutput); - const EShMessages controls = DeriveOptions(source, semantics, target); - GlslangResult result = compileAndLink(testName, input, entryPointName, controls, false, EShTexSampTransKeep, disableOptimizer); + EShMessages controls = DeriveOptions(source, semantics, target); + if (enableOptimizer) + controls = static_cast(controls & ~EShMsgHlslLegalization); + GlslangResult result = compileAndLink(testName, input, entryPointName, controls, clientTargetVersion, false, + EShTexSampTransKeep, enableOptimizer, automap); // Generate the hybrid output in the way of glslangValidator. std::ostringstream stream; @@ -423,7 +452,8 @@ tryLoadFile(expectedOutputFname, "expected output", &expectedOutput); const EShMessages controls = DeriveOptions(source, semantics, target); - GlslangResult result = compileAndLink(testName, input, entryPointName, controls, true); + GlslangResult result = compileAndLink(testName, input, entryPointName, controls, + glslang::EShTargetVulkan_1_0, true); // Generate the hybrid output in the way of glslangValidator. std::ostringstream stream; @@ -592,7 +622,9 @@ tryLoadFile(expectedOutputFname, "expected output", &expectedOutput); const EShMessages controls = DeriveOptions(source, semantics, target); - GlslangResult result = compileAndLink(testName, input, entryPointName, controls, false, EShTexSampTransUpgradeTextureRemoveSampler); + GlslangResult result = compileAndLink(testName, input, entryPointName, controls, + glslang::EShTargetVulkan_1_0, false, + EShTexSampTransUpgradeTextureRemoveSampler); // Generate the hybrid output in the way of glslangValidator. std::ostringstream stream; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/hlsl/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/hlsl/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/hlsl/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/hlsl/CMakeLists.txt 2018-04-27 11:46:26.000000000 +0000 @@ -17,10 +17,14 @@ hlslGrammar.h hlslParseables.h) -add_library(HLSL STATIC ${SOURCES} ${HEADERS}) +add_library(HLSL ${LIB_TYPE} ${SOURCES} ${HEADERS}) set_property(TARGET HLSL PROPERTY FOLDER hlsl) set_property(TARGET HLSL PROPERTY POSITION_INDEPENDENT_CODE ON) +if(WIN32 AND BUILD_SHARED_LIBS) + set_target_properties(HLSL PROPERTIES PREFIX "") +endif() + if(WIN32) source_group("Source" FILES ${SOURCES} ${HEADERS}) endif(WIN32) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/hlsl/hlslGrammar.cpp vulkan-1.1.73+dfsg/external/glslang/hlsl/hlslGrammar.cpp --- vulkan-1.1.70+dfsg1/external/glslang/hlsl/hlslGrammar.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/hlsl/hlslGrammar.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -436,28 +436,20 @@ if (declaredType.getQualifier().storage == EvqTemporary && parseContext.symbolTable.atGlobalLevel()) declaredType.getQualifier().storage = EvqUniform; + // recognize array_specifier + TArraySizes* arraySizes = nullptr; + acceptArraySpecifier(arraySizes); + // We can handle multiple variables per type declaration, so // the number of types can expand when arrayness is different. TType variableType; variableType.shallowCopy(declaredType); - // recognize array_specifier - TArraySizes* arraySizes = nullptr; - acceptArraySpecifier(arraySizes); - - // Fix arrayness in the variableType - if (declaredType.isImplicitlySizedArray()) { - // Because "int[] a = int[2](...), b = int[3](...)" makes two arrays a and b - // of different sizes, for this case sharing the shallow copy of arrayness - // with the parseType oversubscribes it, so get a deep copy of the arrayness. - variableType.newArraySizes(declaredType.getArraySizes()); - } - if (arraySizes || variableType.isArray()) { - // In the most general case, arrayness is potentially coming both from the - // declared type and from the variable: "int[] a[];" or just one or the other. - // Merge it all to the variableType, so all arrayness is part of the variableType. - parseContext.arrayDimMerge(variableType, arraySizes); - } + // In the most general case, arrayness is potentially coming both from the + // declared type and from the variable: "int[] a[];" or just one or the other. + // Merge it all to the variableType, so all arrayness is part of the variableType. + variableType.transferArraySizes(arraySizes); + variableType.copyArrayInnerSizes(declaredType.getArraySizes()); // samplers accept immediate sampler state if (variableType.getBasicType() == EbtSampler) { @@ -487,8 +479,7 @@ else if (variableType.getBasicType() == EbtBlock) { if (expressionNode) parseContext.error(idToken.loc, "buffer aliasing not yet supported", "block initializer", ""); - parseContext.declareBlock(idToken.loc, variableType, fullName, - variableType.isArray() ? &variableType.getArraySizes() : nullptr); + parseContext.declareBlock(idToken.loc, variableType, fullName); parseContext.declareStructBufferCounter(idToken.loc, variableType, *fullName); } else { if (variableType.getQualifier().storage == EvqUniform && ! variableType.containsOpaque()) { @@ -1036,7 +1027,7 @@ TArraySizes* arraySizes = new TArraySizes; arraySizes->addInnerSize(size->getAsConstantUnion()->getConstArray()[0].getIConst()); - type.newArraySizes(*arraySizes); + type.transferArraySizes(arraySizes); type.getQualifier().builtIn = patchType; if (! acceptTokenClass(EHTokRightAngle)) { @@ -1377,14 +1368,15 @@ } bool HlslGrammar::acceptType(TType& type, TIntermNode*& nodeList) { - // Basic types for min* types, broken out here in case of future - // changes, e.g, to use native halfs. - static const TBasicType min16float_bt = EbtFloat; - static const TBasicType min10float_bt = EbtFloat; - static const TBasicType half_bt = EbtFloat; - static const TBasicType min16int_bt = EbtInt; - static const TBasicType min12int_bt = EbtInt; - static const TBasicType min16uint_bt = EbtUint; + // Basic types for min* types, use native halfs if the option allows them. + bool enable16BitTypes = parseContext.hlslEnable16BitTypes(); + + const TBasicType min16float_bt = enable16BitTypes ? EbtFloat16 : EbtFloat; + const TBasicType min10float_bt = enable16BitTypes ? EbtFloat16 : EbtFloat; + const TBasicType half_bt = enable16BitTypes ? EbtFloat16 : EbtFloat; + const TBasicType min16int_bt = enable16BitTypes ? EbtInt16 : EbtInt; + const TBasicType min12int_bt = enable16BitTypes ? EbtInt16 : EbtInt; + const TBasicType min16uint_bt = enable16BitTypes ? EbtUint16 : EbtUint; // Some types might have turned into identifiers. Take the hit for checking // when this has happened. @@ -1590,6 +1582,10 @@ new(&type) TType(EbtUint, EvqTemporary, 4); break; + case EHTokUint64: + new(&type) TType(EbtUint64); + break; + case EHTokBool: new(&type) TType(EbtBool); break; @@ -2290,9 +2286,9 @@ // Create an unsized array out of that type. // TODO: does this work if it's already an array type? - TArraySizes unsizedArray; - unsizedArray.addInnerSize(UnsizedArraySize); - templateType->newArraySizes(unsizedArray); + TArraySizes* unsizedArray = new TArraySizes; + unsizedArray->addInnerSize(UnsizedArraySize); + templateType->transferArraySizes(unsizedArray); templateType->getQualifier().storage = storage; // field name is canonical for all structbuffers @@ -2390,7 +2386,7 @@ TArraySizes* arraySizes = nullptr; acceptArraySpecifier(arraySizes); if (arraySizes) - typeList->back().type->newArraySizes(*arraySizes); + typeList->back().type->transferArraySizes(arraySizes); acceptPostDecls(member.type->getQualifier()); @@ -2573,12 +2569,12 @@ TArraySizes* arraySizes = nullptr; acceptArraySpecifier(arraySizes); if (arraySizes) { - if (arraySizes->isImplicit()) { - parseContext.error(token.loc, "function parameter array cannot be implicitly sized", "", ""); + if (arraySizes->hasUnsized()) { + parseContext.error(token.loc, "function parameter requires array size", "[]", ""); return false; } - type->newArraySizes(*arraySizes); + type->transferArraySizes(arraySizes); } // post_decls @@ -2949,7 +2945,7 @@ TArraySizes* arraySizes = nullptr; acceptArraySpecifier(arraySizes); if (arraySizes != nullptr) - castType.newArraySizes(*arraySizes); + castType.transferArraySizes(arraySizes); TSourceLoc loc = token.loc; if (acceptTokenClass(EHTokRightParen)) { // We've matched "(type)" now, get the expression to cast @@ -3278,6 +3274,9 @@ case EHTokUintConstant: node = intermediate.addConstantUnion(token.u, token.loc, true); break; + case EHTokFloat16Constant: + node = intermediate.addConstantUnion(token.d, EbtFloat16, token.loc, true); + break; case EHTokFloatConstant: node = intermediate.addConstantUnion(token.d, EbtFloat, token.loc, true); break; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/hlsl/hlslParseables.cpp vulkan-1.1.73+dfsg/external/glslang/hlsl/hlslParseables.cpp --- vulkan-1.1.70+dfsg1/external/glslang/hlsl/hlslParseables.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/hlsl/hlslParseables.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -259,6 +259,8 @@ case 'D': s += "double"; break; case 'I': s += "int"; break; case 'U': s += "uint"; break; + case 'L': s += "int64_t"; break; + case 'M': s += "uint64_t"; break; case 'B': s += "bool"; break; case 'S': s += "sampler"; break; case 's': s += "SamplerComparisonState"; break; @@ -544,7 +546,7 @@ // orderKey can be: // S = scalar, V = vector, M = matrix, - = void // typekey can be: - // D = double, F = float, U = uint, I = int, B = bool, S = sampler, s = shadowSampler + // D = double, F = float, U = uint, I = int, B = bool, S = sampler, s = shadowSampler, M = uint64_t, L = int64_t // An empty order or type key repeats the first one. E.g: SVM,, means 3 args each of SVM. // '>' as first letter of order creates an output parameter // '<' as first letter of order creates an input parameter @@ -902,6 +904,35 @@ { "DecrementCounter", nullptr, nullptr, "-", "-", EShLangAll, true }, { "Consume", nullptr, nullptr, "-", "-", EShLangAll, true }, + // SM 6.0 + + { "WaveIsFirstLane", "S", "B", "-", "-", EShLangPSCS, false}, + { "WaveGetLaneCount", "S", "U", "-", "-", EShLangPSCS, false}, + { "WaveGetLaneIndex", "S", "U", "-", "-", EShLangPSCS, false}, + { "WaveActiveAnyTrue", "S", "B", "S", "B", EShLangPSCS, false}, + { "WaveActiveAllTrue", "S", "B", "S", "B", EShLangPSCS, false}, + { "WaveActiveBallot", "V4", "U", "S", "B", EShLangPSCS, false}, + { "WaveReadLaneAt", nullptr, nullptr, "SV,S", "DFUI,U", EShLangPSCS, false}, + { "WaveReadLaneFirst", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "WaveActiveAllEqual", "S", "B", "SV", "DFUI", EShLangPSCS, false}, + { "WaveActiveAllEqualBool", "S", "B", "S", "B", EShLangPSCS, false}, + { "WaveActiveCountBits", "S", "U", "S", "B", EShLangPSCS, false}, + + { "WaveActiveSum", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "WaveActiveProduct", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "WaveActiveBitAnd", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "WaveActiveBitOr", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "WaveActiveBitXor", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "WaveActiveMin", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "WaveActiveMax", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "WavePrefixSum", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "WavePrefixProduct", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "WavePrefixCountBits", "S", "U", "S", "B", EShLangPSCS, false}, + { "QuadReadAcrossX", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "QuadReadAcrossY", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "QuadReadAcrossDiagonal", nullptr, nullptr, "SV", "DFUI", EShLangPSCS, false}, + { "QuadReadLaneAt", nullptr, nullptr, "SV,S", "DFUI,U", EShLangPSCS, false}, + // Methods for subpass input objects { "SubpassLoad", "V4", nullptr, "[", "FIU", EShLangPS, true }, { "SubpassLoad", "V4", nullptr, "],S", "FIU,I", EShLangPS, true }, @@ -1244,6 +1275,33 @@ symbolTable.relateToOperator(BUILTIN_PREFIX "Append", EOpMethodAppend); symbolTable.relateToOperator(BUILTIN_PREFIX "RestartStrip", EOpMethodRestartStrip); + // Wave ops + symbolTable.relateToOperator("WaveIsFirstLane", EOpSubgroupElect); + symbolTable.relateToOperator("WaveGetLaneCount", EOpWaveGetLaneCount); + symbolTable.relateToOperator("WaveGetLaneIndex", EOpWaveGetLaneIndex); + symbolTable.relateToOperator("WaveActiveAnyTrue", EOpSubgroupAny); + symbolTable.relateToOperator("WaveActiveAllTrue", EOpSubgroupAll); + symbolTable.relateToOperator("WaveActiveBallot", EOpSubgroupBallot); + symbolTable.relateToOperator("WaveReadLaneFirst", EOpSubgroupBroadcastFirst); + symbolTable.relateToOperator("WaveReadLaneAt", EOpSubgroupShuffle); + symbolTable.relateToOperator("WaveActiveAllEqual", EOpSubgroupAllEqual); + symbolTable.relateToOperator("WaveActiveAllEqualBool", EOpSubgroupAllEqual); + symbolTable.relateToOperator("WaveActiveCountBits", EOpWaveActiveCountBits); + symbolTable.relateToOperator("WaveActiveSum", EOpSubgroupAdd); + symbolTable.relateToOperator("WaveActiveProduct", EOpSubgroupMul); + symbolTable.relateToOperator("WaveActiveBitAnd", EOpSubgroupAnd); + symbolTable.relateToOperator("WaveActiveBitOr", EOpSubgroupOr); + symbolTable.relateToOperator("WaveActiveBitXor", EOpSubgroupXor); + symbolTable.relateToOperator("WaveActiveMin", EOpSubgroupMin); + symbolTable.relateToOperator("WaveActiveMax", EOpSubgroupMax); + symbolTable.relateToOperator("WavePrefixSum", EOpSubgroupInclusiveAdd); + symbolTable.relateToOperator("WavePrefixProduct", EOpSubgroupInclusiveMul); + symbolTable.relateToOperator("WavePrefixCountBits", EOpWavePrefixCountBits); + symbolTable.relateToOperator("QuadReadAcrossX", EOpSubgroupQuadSwapHorizontal); + symbolTable.relateToOperator("QuadReadAcrossY", EOpSubgroupQuadSwapVertical); + symbolTable.relateToOperator("QuadReadAcrossDiagonal", EOpSubgroupQuadSwapDiagonal); + symbolTable.relateToOperator("QuadReadLaneAt", EOpSubgroupQuadBroadcast); + // Subpass input methods symbolTable.relateToOperator(BUILTIN_PREFIX "SubpassLoad", EOpSubpassLoad); symbolTable.relateToOperator(BUILTIN_PREFIX "SubpassLoadMS", EOpSubpassLoadMS); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/hlsl/hlslParseHelper.cpp vulkan-1.1.73+dfsg/external/glslang/hlsl/hlslParseHelper.cpp --- vulkan-1.1.70+dfsg1/external/glslang/hlsl/hlslParseHelper.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/hlsl/hlslParseHelper.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -65,10 +65,10 @@ entryPointFunction(nullptr), entryPointFunctionBody(nullptr), gsStreamOutput(nullptr), - clipDistanceInput(nullptr), - cullDistanceInput(nullptr), clipDistanceOutput(nullptr), - cullDistanceOutput(nullptr) + cullDistanceOutput(nullptr), + clipDistanceInput(nullptr), + cullDistanceInput(nullptr) { globalUniformDefaults.clear(); globalUniformDefaults.layoutMatrix = ElmRowMajor; @@ -550,6 +550,13 @@ warn(loc, "unknown pack_matrix pragma value", tokens[2].c_str(), ""); globalUniformDefaults.layoutMatrix = globalBufferDefaults.layoutMatrix = ElmRowMajor; } + return; + } + + // Handle once + if (lowerTokens[0] == "once") { + warn(loc, "not implemented", "#pragma once", ""); + return; } } @@ -822,7 +829,12 @@ } else { // at least one of base and index is variable... - if (base->getAsSymbolNode() && wasFlattened(base)) { + if (index->getQualifier().isFrontEndConstant()) + checkIndex(loc, base->getType(), indexValue); + + if (base->getType().isScalarOrVec1()) + result = base; + else if (base->getAsSymbolNode() && wasFlattened(base)) { if (index->getQualifier().storage != EvqConst) error(loc, "Invalid variable index to flattened array", base->getAsSymbolNode()->getName().c_str(), ""); @@ -830,14 +842,13 @@ flattened = (result != base); } else { if (index->getQualifier().isFrontEndConstant()) { - if (base->getType().isImplicitlySizedArray()) - updateImplicitArraySize(loc, base, indexValue); + if (base->getType().isUnsizedArray()) + base->getWritableType().updateImplicitArraySize(indexValue + 1); else checkIndex(loc, base->getType(), indexValue); result = intermediate.addIndex(EOpIndexDirect, base, index, loc); - } else { + } else result = intermediate.addIndex(EOpIndexIndirect, base, index, loc); - } } } @@ -1096,7 +1107,7 @@ TVariable* ioVar = makeInternalVariable(baseName + "." + memberType.getFieldName(), memberType); if (arraySizes != nullptr && !memberType.isArray()) - ioVar->getWritableType().newArraySizes(*arraySizes); + ioVar->getWritableType().copyArraySizes(*arraySizes); splitBuiltIns[tInterstageIoData(memberType.getQualifier().builtIn, outerQualifier.storage)] = ioVar; if (!isClipOrCullDistance(ioVar->getType())) @@ -1247,7 +1258,7 @@ // inherited locations must be auto bumped, not replicated if (flattenData.nextLocation != TQualifier::layoutLocationEnd) { memberVariable->getWritableType().getQualifier().layoutLocation = flattenData.nextLocation; - flattenData.nextLocation += intermediate.computeTypeLocationSize(memberVariable->getType()); + flattenData.nextLocation += intermediate.computeTypeLocationSize(memberVariable->getType(), language); nextOutLocation = std::max(nextOutLocation, flattenData.nextLocation); } } @@ -1292,7 +1303,7 @@ name + "." + dereferencedType.getFieldName(), linkage, outerQualifier, builtInArraySizes == nullptr && dereferencedType.isArray() - ? &dereferencedType.getArraySizes() + ? dereferencedType.getArraySizes() : builtInArraySizes); flattenData.offsets[pos++] = mpos; } @@ -1309,7 +1320,7 @@ TFlattenData& flattenData, TString name, bool linkage, const TQualifier& outerQualifier) { - assert(type.isArray() && !type.isImplicitlySizedArray()); + assert(type.isSizedArray()); const int size = type.getOuterArraySize(); const TType dereferencedType(type, 0); @@ -1503,9 +1514,9 @@ // Alter or set array size as needed. if (requiredArraySize > 0) { if (!type.isArray() || type.getOuterArraySize() != requiredArraySize) { - TArraySizes arraySizes; - arraySizes.addInnerSize(requiredArraySize); - type.newArraySizes(arraySizes); + TArraySizes* arraySizes = new TArraySizes; + arraySizes->addInnerSize(requiredArraySize); + type.transferArraySizes(arraySizes); } } } @@ -1527,9 +1538,9 @@ int size; if (type.isArray() && qualifier.isArrayedIo(language)) { TType elementType(type, 0); - size = intermediate.computeTypeLocationSize(elementType); + size = intermediate.computeTypeLocationSize(elementType, language); } else - size = intermediate.computeTypeLocationSize(type); + size = intermediate.computeTypeLocationSize(type, language); if (qualifier.storage == EvqVaryingIn) { variable.getWritableType().getQualifier().layoutLocation = nextInLocation; @@ -1599,7 +1610,7 @@ if (! hasStructBuffCounter(*param.type)) return; - const TString counterBlockName(getStructBuffCounterName(*param.name)); + const TString counterBlockName(intermediate.addCounterBufferName(*param.name)); TType counterType; counterBufferType(loc, counterType); @@ -2264,9 +2275,9 @@ outputType.shallowCopy(function.getType()); // vertices has necessarily already been set when handling entry point attributes. - TArraySizes arraySizes; - arraySizes.addInnerSize(intermediate.getVertices()); - outputType.newArraySizes(arraySizes); + TArraySizes* arraySizes = new TArraySizes; + arraySizes->addInnerSize(intermediate.getVertices()); + outputType.transferArraySizes(arraySizes); clearUniformInputOutput(function.getWritableType().getQualifier()); returnValue = makeIoVariable("@entryPointOutput", outputType, EvqVaryingOut); @@ -2503,11 +2514,11 @@ clipCullType.getQualifier() = clipCullNode->getType().getQualifier(); // Create required array dimension - TArraySizes arraySizes; + TArraySizes* arraySizes = new TArraySizes; if (isImplicitlyArrayed) - arraySizes.addInnerSize(requiredOuterArraySize); - arraySizes.addInnerSize(requiredInnerArraySize); - clipCullType.newArraySizes(arraySizes); + arraySizes->addInnerSize(requiredOuterArraySize); + arraySizes->addInnerSize(requiredInnerArraySize); + clipCullType.transferArraySizes(arraySizes); // Obtain symbol name: we'll use that for the symbol we introduce. TIntermSymbol* sym = clipCullNode->getAsSymbolNode(); @@ -3153,8 +3164,8 @@ void HlslParseContext::counterBufferType(const TSourceLoc& loc, TType& type) { // Counter type - TType* counterType = new TType(EbtInt, EvqBuffer); - counterType->setFieldName("@count"); + TType* counterType = new TType(EbtUint, EvqBuffer); + counterType->setFieldName(intermediate.implicitCounterName); TTypeList* blockStruct = new TTypeList; TTypeLoc member = { counterType, loc }; @@ -3167,12 +3178,6 @@ shareStructBufferType(type); } -// knowledge of how to construct block name, in one place instead of N places. -TString HlslParseContext::getStructBuffCounterName(const TString& blockName) const -{ - return blockName + "@count"; -} - // declare counter for a structured buffer type void HlslParseContext::declareStructBufferCounter(const TSourceLoc& loc, const TType& bufferType, const TString& name) { @@ -3186,9 +3191,9 @@ TType blockType; counterBufferType(loc, blockType); - TString* blockName = new TString(getStructBuffCounterName(name)); + TString* blockName = new TString(intermediate.addCounterBufferName(name)); - // Counter buffer does not have its own counter buffer. TODO: there should be a better way to track this. + // Counter buffer is not yet in use structBufferCounter[*blockName] = false; shareStructBufferType(blockType); @@ -3202,7 +3207,7 @@ if (buffer == nullptr || ! isStructBufferType(buffer->getType())) return nullptr; - const TString counterBlockName(getStructBuffCounterName(buffer->getAsSymbolNode()->getName())); + const TString counterBlockName(intermediate.addCounterBufferName(buffer->getAsSymbolNode()->getName())); // Mark the counter as being used structBufferCounter[counterBlockName] = true; @@ -3211,11 +3216,10 @@ TIntermTyped* index = intermediate.addConstantUnion(0, loc); // index to counter inside block struct TIntermTyped* counterMember = intermediate.addIndex(EOpIndexDirectStruct, counterVar, index, loc); - counterMember->setType(TType(EbtInt)); + counterMember->setType(TType(EbtUint)); return counterMember; } - // // Decompose structure buffer methods into AST // @@ -3245,7 +3249,7 @@ // Some methods require a hidden internal counter, obtained via getStructBufferCounter(). // This lambda adds something to it and returns the old value. const auto incDecCounter = [&](int incval) -> TIntermTyped* { - TIntermTyped* incrementValue = intermediate.addConstantUnion(incval, loc, true); + TIntermTyped* incrementValue = intermediate.addConstantUnion(static_cast(incval), loc, true); TIntermTyped* counter = getStructBufferCounter(loc, bufferObj); // obtain the counter member if (counter == nullptr) @@ -3440,16 +3444,16 @@ TIntermAggregate* body = nullptr; // Length output: - if (argArray->getType().isRuntimeSizedArray()) { - TIntermTyped* lengthCall = intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, argArray, - argNumItems->getType()); - TIntermTyped* assign = intermediate.addAssign(EOpAssign, argNumItems, lengthCall, loc); - body = intermediate.growAggregate(body, assign, loc); - } else { + if (argArray->getType().isSizedArray()) { const int length = argArray->getType().getOuterArraySize(); TIntermTyped* assign = intermediate.addAssign(EOpAssign, argNumItems, intermediate.addConstantUnion(length, loc, true), loc); body = intermediate.growAggregate(body, assign, loc); + } else { + TIntermTyped* lengthCall = intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, argArray, + argNumItems->getType()); + TIntermTyped* assign = intermediate.addAssign(EOpAssign, argNumItems, lengthCall, loc); + body = intermediate.growAggregate(body, assign, loc); } // Stride output: @@ -3610,9 +3614,9 @@ TType retType(EbtFloat, EvqConst, 2); if (numSamples != 1) { - TArraySizes arraySizes; - arraySizes.addInnerSize(numSamples); - retType.newArraySizes(arraySizes); + TArraySizes* arraySizes = new TArraySizes; + arraySizes->addInnerSize(numSamples); + retType.transferArraySizes(arraySizes); } return new TIntermConstantUnion(*values, retType); @@ -4309,9 +4313,9 @@ // we construct an array from the separate args. if (hasOffset4) { TType arrayType(EbtInt, EvqTemporary, 2); - TArraySizes arraySizes; - arraySizes.addInnerSize(4); - arrayType.newArraySizes(arraySizes); + TArraySizes* arraySizes = new TArraySizes; + arraySizes->addInnerSize(4); + arrayType.transferArraySizes(arraySizes); TIntermAggregate* initList = new TIntermAggregate(EOpNull); @@ -4550,6 +4554,22 @@ return imageAggregate != nullptr && imageAggregate->getOp() == EOpImageLoad; }; + const auto lookupBuiltinVariable = [&](const char* name, TBuiltInVariable builtin, TType& type) -> TIntermTyped* { + TSymbol* symbol = symbolTable.find(name); + if (nullptr == symbol) { + type.getQualifier().builtIn = builtin; + + TVariable* variable = new TVariable(new TString(name), type); + + symbolTable.insert(*variable); + + symbol = symbolTable.find(name); + assert(symbol && "Inserted symbol could not be found!"); + } + + return intermediate.addSymbol(*(symbol->getAsVariable()), loc); + }; + // HLSL intrinsics can be pass through to native AST opcodes, or decomposed here to existing AST // opcodes for compatibility with existing software stacks. static const bool decomposeHlslIntrinsics = true; @@ -4795,6 +4815,7 @@ } else { // Set the matching operator. Since output is absent, this is all we need to do. node->getAsAggregate()->setOperator(atomicOp); + node->setType(atomic->getType()); } } @@ -5106,7 +5127,65 @@ break; } - + case EOpWaveGetLaneCount: + { + // Mapped to gl_SubgroupSize builtin (We preprend @ to the symbol + // so that it inhabits the symbol table, but has a user-invalid name + // in-case some source HLSL defined the symbol also). + TType type(EbtUint, EvqVaryingIn); + node = lookupBuiltinVariable("@gl_SubgroupSize", EbvSubgroupSize2, type); + break; + } + case EOpWaveGetLaneIndex: + { + // Mapped to gl_SubgroupInvocationID builtin (We preprend @ to the + // symbol so that it inhabits the symbol table, but has a + // user-invalid name in-case some source HLSL defined the symbol + // also). + TType type(EbtUint, EvqVaryingIn); + node = lookupBuiltinVariable("@gl_SubgroupInvocationID", EbvSubgroupInvocation2, type); + break; + } + case EOpWaveActiveCountBits: + { + // Mapped to subgroupBallotBitCount(subgroupBallot()) builtin + + // uvec4 type. + TType uvec4Type(EbtUint, EvqTemporary, 4); + + // Get the uvec4 return from subgroupBallot(). + TIntermTyped* res = intermediate.addBuiltInFunctionCall(loc, + EOpSubgroupBallot, true, arguments, uvec4Type); + + // uint type. + TType uintType(EbtUint, EvqTemporary); + + node = intermediate.addBuiltInFunctionCall(loc, + EOpSubgroupBallotBitCount, true, res, uintType); + + break; + } + case EOpWavePrefixCountBits: + { + // Mapped to subgroupBallotInclusiveBitCount(subgroupBallot()) + // builtin + + // uvec4 type. + TType uvec4Type(EbtUint, EvqTemporary, 4); + + // Get the uvec4 return from subgroupBallot(). + TIntermTyped* res = intermediate.addBuiltInFunctionCall(loc, + EOpSubgroupBallot, true, arguments, uvec4Type); + + // uint type. + TType uintType(EbtUint, EvqTemporary); + + node = intermediate.addBuiltInFunctionCall(loc, + EOpSubgroupBallotInclusiveBitCount, true, res, uintType); + + break; + } + default: break; // most pass through unchanged } @@ -5660,12 +5739,11 @@ TType counterType; counterBufferType(loc, counterType); - const TString counterBlockName(getStructBuffCounterName(blockSym->getName())); + const TString counterBlockName(intermediate.addCounterBufferName(blockSym->getName())); TVariable* variable = makeInternalVariable(counterBlockName, counterType); - // Mark this buffer as requiring a counter block. TODO: there should be a better - // way to track it. + // Mark this buffer's counter block as being in use structBufferCounter[counterBlockName] = true; TIntermSymbol* sym = intermediate.addSymbol(*variable, loc); @@ -6220,7 +6298,7 @@ bool arrayArg = false; for (int arg = 0; arg < function.getParamCount(); ++arg) { if (function[arg].type->isArray()) { - if (! function[arg].type->isExplicitlySizedArray()) { + if (function[arg].type->isUnsizedArray()) { // Can't construct from an unsized array. error(loc, "array argument must be sized", "constructor", ""); return true; @@ -6255,11 +6333,10 @@ return true; } - if (type.isImplicitlySizedArray()) { + if (type.isUnsizedArray()) { // auto adapt the constructor type to the number of arguments type.changeOuterArraySize(function.getParamCount()); - } else if (type.getOuterArraySize() != function.getParamCount() && - type.computeNumComponents() > size) { + } else if (type.getOuterArraySize() != function.getParamCount() && type.computeNumComponents() > size) { error(loc, "array constructor needs one argument per array element", "constructor", ""); return true; } @@ -6268,21 +6345,21 @@ // Types have to match, but we're still making the type. // Finish making the type, and the comparison is done later // when checking for conversion. - TArraySizes& arraySizes = type.getArraySizes(); + TArraySizes& arraySizes = *type.getArraySizes(); // At least the dimensionalities have to match. if (! function[0].type->isArray() || - arraySizes.getNumDims() != function[0].type->getArraySizes().getNumDims() + 1) { + arraySizes.getNumDims() != function[0].type->getArraySizes()->getNumDims() + 1) { error(loc, "array constructor argument not correct type to construct array element", "constructor", ""); return true; } - if (arraySizes.isInnerImplicit()) { + if (arraySizes.isInnerUnsized()) { // "Arrays of arrays ..., and the size for any dimension is optional" // That means we need to adopt (from the first argument) the other array sizes into the type. for (int d = 1; d < arraySizes.getNumDims(); ++d) { if (arraySizes.getDimSize(d) == UnsizedArraySize) { - arraySizes.setDimSize(d, function[0].type->getArraySizes().getDimSize(d - 1)); + arraySizes.setDimSize(d, function[0].type->getArraySizes()->getDimSize(d - 1)); } } } @@ -6477,6 +6554,7 @@ MERGE_SINGLETON(readonly); MERGE_SINGLETON(writeonly); MERGE_SINGLETON(specConstant); + MERGE_SINGLETON(nonUniform); } // used to flatten the sampler type space into a single dimension @@ -6532,7 +6610,7 @@ // void HlslParseContext::arraySizeRequiredCheck(const TSourceLoc& loc, const TArraySizes& arraySizes) { - if (arraySizes.isImplicit()) + if (arraySizes.hasUnsized()) error(loc, "array size required", "", ""); } @@ -6546,20 +6624,6 @@ } } -// Merge array dimensions listed in 'sizes' onto the type's array dimensions. -// -// From the spec: "vec4[2] a[3]; // size-3 array of size-2 array of vec4" -// -// That means, the 'sizes' go in front of the 'type' as outermost sizes. -// 'type' is the type part of the declaration (to the left) -// 'sizes' is the arrayness tagged on the identifier (to the right) -// -void HlslParseContext::arrayDimMerge(TType& type, const TArraySizes* sizes) -{ - if (sizes) - type.addArrayOuterSizes(*sizes); -} - // // Do all the semantic checking for declaring or redeclaring an array, with and // without a size, and make the right changes to the symbol table. @@ -6606,7 +6670,7 @@ // redeclareBuiltinVariable() should have already done the copyUp() TType& existingType = symbol->getWritableType(); - if (existingType.isExplicitlySizedArray()) { + if (existingType.isSizedArray()) { // be more lenient for input arrays to geometry shaders and tessellation control outputs, // where the redeclaration is the same size return; @@ -6615,52 +6679,6 @@ existingType.updateArraySizes(type); } -void HlslParseContext::updateImplicitArraySize(const TSourceLoc& loc, TIntermNode *node, int index) -{ - // maybe there is nothing to do... - TIntermTyped* typedNode = node->getAsTyped(); - if (typedNode->getType().getImplicitArraySize() > index) - return; - - // something to do... - - // Figure out what symbol to lookup, as we will use its type to edit for the size change, - // as that type will be shared through shallow copies for future references. - TSymbol* symbol = nullptr; - int blockIndex = -1; - const TString* lookupName = nullptr; - if (node->getAsSymbolNode()) - lookupName = &node->getAsSymbolNode()->getName(); - else if (node->getAsBinaryNode()) { - const TIntermBinary* deref = node->getAsBinaryNode(); - // This has to be the result of a block dereference, unless it's bad shader code - // If it's a uniform block, then an error will be issued elsewhere, but - // return early now to avoid crashing later in this function. - if (! deref->getLeft()->getAsSymbolNode() || deref->getLeft()->getBasicType() != EbtBlock || - deref->getLeft()->getType().getQualifier().storage == EvqUniform || - deref->getRight()->getAsConstantUnion() == nullptr) - return; - - blockIndex = deref->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst(); - - lookupName = &deref->getLeft()->getAsSymbolNode()->getName(); - if (IsAnonymous(*lookupName)) - lookupName = &(*deref->getLeft()->getType().getStruct())[blockIndex].type->getFieldName(); - } - - // Lookup the symbol, should only fail if shader code is incorrect - symbol = symbolTable.find(*lookupName); - if (symbol == nullptr) - return; - - if (symbol->getAsFunction()) { - error(loc, "array variable name expected", symbol->getName().c_str(), ""); - return; - } - - symbol->getWritableType().setImplicitArraySize(index + 1); -} - // // Enforce non-initializer type/qualifier rules. // @@ -6724,7 +6742,7 @@ // TType* HlslParseContext::getStructBufferContentType(const TType& type) const { - if (type.getBasicType() != EbtBlock) + if (type.getBasicType() != EbtBlock || type.getQualifier().storage != EvqBuffer) return nullptr; const int memberCount = (int)type.getStruct()->size(); @@ -6732,7 +6750,7 @@ TType* contentType = (*type.getStruct())[memberCount-1].type; - return contentType->isRuntimeSizedArray() ? contentType : nullptr; + return contentType->isUnsizedArray() ? contentType : nullptr; } // @@ -7437,8 +7455,8 @@ } }; - return std::abs(linearize(to2.getBasicType()) - linearize(from.getBasicType())) < - std::abs(linearize(to1.getBasicType()) - linearize(from.getBasicType())); + return abs(linearize(to2.getBasicType()) - linearize(from.getBasicType())) < + abs(linearize(to1.getBasicType()) - linearize(from.getBasicType())); }; // for ambiguity reporting @@ -7861,8 +7879,7 @@ } // Fix outer arrayness if variable is unsized, getting size from the initializer - if (initializer->getType().isExplicitlySizedArray() && - variable->getType().isImplicitlySizedArray()) + if (initializer->getType().isSizedArray() && variable->getType().isUnsizedArray()) variable->getWritableType().changeOuterArraySize(initializer->getType().getOuterArraySize()); // Inner arrayness can also get set by an initializer @@ -7871,8 +7888,10 @@ variable->getType().getArraySizes()->getNumDims()) { // adopt unsized sizes from the initializer's sizes for (int d = 1; d < variable->getType().getArraySizes()->getNumDims(); ++d) { - if (variable->getType().getArraySizes()->getDimSize(d) == UnsizedArraySize) - variable->getWritableType().getArraySizes().setDimSize(d, initializer->getType().getArraySizes()->getDimSize(d)); + if (variable->getType().getArraySizes()->getDimSize(d) == UnsizedArraySize) { + variable->getWritableType().getArraySizes()->setDimSize(d, + initializer->getType().getArraySizes()->getDimSize(d)); + } } } @@ -7959,20 +7978,20 @@ // Later on, initializer execution code will deal with array size logic. TType arrayType; arrayType.shallowCopy(type); // sharing struct stuff is fine - arrayType.newArraySizes(*type.getArraySizes()); // but get a fresh copy of the array information, to edit below + arrayType.copyArraySizes(*type.getArraySizes()); // but get a fresh copy of the array information, to edit below // edit array sizes to fill in unsized dimensions - if (type.isImplicitlySizedArray()) + if (type.isUnsizedArray()) arrayType.changeOuterArraySize((int)initList->getSequence().size()); // set unsized array dimensions that can be derived from the initializer's first element if (arrayType.isArrayOfArrays() && initList->getSequence().size() > 0) { TIntermTyped* firstInit = initList->getSequence()[0]->getAsTyped(); if (firstInit->getType().isArray() && - arrayType.getArraySizes().getNumDims() == firstInit->getType().getArraySizes()->getNumDims() + 1) { - for (int d = 1; d < arrayType.getArraySizes().getNumDims(); ++d) { - if (arrayType.getArraySizes().getDimSize(d) == UnsizedArraySize) - arrayType.getArraySizes().setDimSize(d, firstInit->getType().getArraySizes()->getDimSize(d - 1)); + arrayType.getArraySizes()->getNumDims() == firstInit->getType().getArraySizes()->getNumDims() + 1) { + for (int d = 1; d < arrayType.getArraySizes()->getNumDims(); ++d) { + if (arrayType.getArraySizes()->getDimSize(d) == UnsizedArraySize) + arrayType.getArraySizes()->setDimSize(d, firstInit->getType().getArraySizes()->getDimSize(d - 1)); } } } @@ -8237,6 +8256,22 @@ // First, convert types as needed. // switch (op) { + case EOpConstructF16Vec2: + case EOpConstructF16Vec3: + case EOpConstructF16Vec4: + case EOpConstructF16Mat2x2: + case EOpConstructF16Mat2x3: + case EOpConstructF16Mat2x4: + case EOpConstructF16Mat3x2: + case EOpConstructF16Mat3x3: + case EOpConstructF16Mat3x4: + case EOpConstructF16Mat4x2: + case EOpConstructF16Mat4x3: + case EOpConstructF16Mat4x4: + case EOpConstructFloat16: + basicOp = EOpConstructFloat16; + break; + case EOpConstructVec2: case EOpConstructVec3: case EOpConstructVec4: @@ -8269,6 +8304,13 @@ basicOp = EOpConstructDouble; break; + case EOpConstructI16Vec2: + case EOpConstructI16Vec3: + case EOpConstructI16Vec4: + case EOpConstructInt16: + basicOp = EOpConstructInt16; + break; + case EOpConstructIVec2: case EOpConstructIVec3: case EOpConstructIVec4: @@ -8285,6 +8327,13 @@ basicOp = EOpConstructInt; break; + case EOpConstructU16Vec2: + case EOpConstructU16Vec3: + case EOpConstructU16Vec4: + case EOpConstructUint16: + basicOp = EOpConstructUint16; + break; + case EOpConstructUVec2: case EOpConstructUVec3: case EOpConstructUVec4: @@ -8434,7 +8483,7 @@ // // Do everything needed to add an interface block. // -void HlslParseContext::declareBlock(const TSourceLoc& loc, TType& type, const TString* instanceName, TArraySizes* arraySizes) +void HlslParseContext::declareBlock(const TSourceLoc& loc, TType& type, const TString* instanceName) { assert(type.getWritableStruct() != nullptr); @@ -8562,8 +8611,8 @@ const TString& interfaceName = (instanceName && !instanceName->empty()) ? *instanceName : type.getTypeName(); TType blockType(&typeList, interfaceName, type.getQualifier()); - if (arraySizes) - blockType.newArraySizes(*arraySizes); + if (type.isArray()) + blockType.transferArraySizes(type.getArraySizes()); // Add the variable, as anonymous or named instanceName. // Make an anonymous variable if no name was provided. @@ -8581,7 +8630,7 @@ return; } - // Save it in the AST for linker use. + // Save it in the AST for linker use. if (symbolTable.atGlobalLevel()) trackLinkage(variable); } @@ -8624,7 +8673,7 @@ memberQualifier.layoutComponent = 0; } nextLocation = memberQualifier.layoutLocation + - intermediate.computeTypeLocationSize(*typeList[member].type); + intermediate.computeTypeLocationSize(*typeList[member].type, language); } } } @@ -9294,11 +9343,17 @@ qualifier.patch = false; switch (qualifier.builtIn) { + case EbvFragDepth: + intermediate.setDepthReplacing(); + intermediate.setDepth(EldAny); + break; case EbvFragDepthGreater: + intermediate.setDepthReplacing(); intermediate.setDepth(EldGreater); qualifier.builtIn = EbvFragDepth; break; case EbvFragDepthLesser: + intermediate.setDepthReplacing(); intermediate.setDepth(EldLess); qualifier.builtIn = EbvFragDepth; break; @@ -9528,7 +9583,7 @@ const TType& type = *patchConstantFunction[param].type; const TBuiltInVariable biType = patchConstantFunction[param].getDeclaredBuiltIn(); - return type.isArray() && !type.isRuntimeSizedArray() && biType == EbvOutputPatch; + return type.isSizedArray() && biType == EbvOutputPatch; }; // We will perform these steps. Each is in a scoped block for separation: they could @@ -9831,7 +9886,8 @@ } // Finalization step: remove unused buffer blocks from linkage (we don't know until the -// shader is entirely compiled) +// shader is entirely compiled). +// Preserve order of remaining symbols. void HlslParseContext::removeUnusedStructBufferCounters() { const auto endIt = std::remove_if(linkageSymbols.begin(), linkageSymbols.end(), @@ -9878,7 +9934,7 @@ // Communicate out (esp. for command line) that we formed AST that will make // illegal AST SPIR-V and it needs transforms to legalize it. - if (intermediate.needsLegalization()) + if (intermediate.needsLegalization() && (messages & EShMsgHlslLegalization)) infoSink.info << "WARNING: AST will form illegal SPIR-V; need to transform to legalize"; TParseContextBase::finish(); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/hlsl/hlslParseHelper.h vulkan-1.1.73+dfsg/external/glslang/hlsl/hlslParseHelper.h --- vulkan-1.1.70+dfsg1/external/glslang/hlsl/hlslParseHelper.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/hlsl/hlslParseHelper.h 2018-04-27 11:46:26.000000000 +0000 @@ -126,7 +126,6 @@ void arraySizeCheck(const TSourceLoc&, TIntermTyped* expr, TArraySize&); void arraySizeRequiredCheck(const TSourceLoc&, const TArraySizes&); void structArrayCheck(const TSourceLoc&, const TType& structure); - void arrayDimMerge(TType& type, const TArraySizes* sizes); bool voidErrorCheck(const TSourceLoc&, const TString&, TBasicType); void globalQualifierFix(const TSourceLoc&, TQualifier&); bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType); @@ -154,7 +153,7 @@ TIntermTyped* convertArray(TIntermTyped*, const TType&); TIntermTyped* constructAggregate(TIntermNode*, const TType&, int, const TSourceLoc&); TIntermTyped* constructBuiltIn(const TType&, TOperator, TIntermTyped*, const TSourceLoc&, bool subset); - void declareBlock(const TSourceLoc&, TType&, const TString* instanceName = 0, TArraySizes* arraySizes = 0); + void declareBlock(const TSourceLoc&, TType&, const TString* instanceName = 0); void declareStructBufferCounter(const TSourceLoc& loc, const TType& bufferType, const TString& name); void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation); void fixBlockXfbOffsets(TQualifier&, TTypeList&); @@ -165,8 +164,6 @@ void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode); TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body, const TAttributes&); - void updateImplicitArraySize(const TSourceLoc&, TIntermNode*, int index); - void nestLooping() { ++loopNestingLevel; } void unnestLooping() { --loopNestingLevel; } void nestAnnotations() { ++annotationNestingLevel; } @@ -405,7 +402,7 @@ // may fit in TSampler::structReturnIndex. TVector textureReturnStruct; - TMap structBufferCounter; + TMap structBufferCounter; // true if counter buffer is in use // The built-in interstage IO map considers e.g, EvqPosition on input and output separately, so that we // can build the linkage correctly if position appears on both sides. Otherwise, multiple positions diff -Nru vulkan-1.1.70+dfsg1/external/glslang/hlsl/hlslScanContext.cpp vulkan-1.1.73+dfsg/external/glslang/hlsl/hlslScanContext.cpp --- vulkan-1.1.70+dfsg1/external/glslang/hlsl/hlslScanContext.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/hlsl/hlslScanContext.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -143,6 +143,7 @@ (*KeywordMap)["bool"] = EHTokBool; (*KeywordMap)["int"] = EHTokInt; (*KeywordMap)["uint"] = EHTokUint; + (*KeywordMap)["uint64_t"] = EHTokUint64; (*KeywordMap)["dword"] = EHTokDword; (*KeywordMap)["half"] = EHTokHalf; (*KeywordMap)["float"] = EHTokFloat; @@ -549,6 +550,7 @@ case PpAtomConstInt: parserToken->i = ppToken.ival; return EHTokIntConstant; case PpAtomConstUint: parserToken->i = ppToken.ival; return EHTokUintConstant; + case PpAtomConstFloat16: parserToken->d = ppToken.dval; return EHTokFloat16Constant; case PpAtomConstFloat: parserToken->d = ppToken.dval; return EHTokFloatConstant; case PpAtomConstDouble: parserToken->d = ppToken.dval; return EHTokDoubleConstant; case PpAtomIdentifier: @@ -650,6 +652,7 @@ case EHTokBool: case EHTokInt: case EHTokUint: + case EHTokUint64: case EHTokDword: case EHTokHalf: case EHTokFloat: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/hlsl/hlslTokens.h vulkan-1.1.73+dfsg/external/glslang/hlsl/hlslTokens.h --- vulkan-1.1.70+dfsg1/external/glslang/hlsl/hlslTokens.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/hlsl/hlslTokens.h 2018-04-27 11:46:26.000000000 +0000 @@ -95,6 +95,7 @@ EHTokBool, EHTokInt, EHTokUint, + EHTokUint64, EHTokDword, EHTokHalf, EHTokFloat, @@ -297,6 +298,7 @@ EHTokConstantBuffer, // constant + EHTokFloat16Constant, EHTokFloatConstant, EHTokDoubleConstant, EHTokIntConstant, diff -Nru vulkan-1.1.70+dfsg1/external/glslang/known_good.json vulkan-1.1.73+dfsg/external/glslang/known_good.json --- vulkan-1.1.70+dfsg1/external/glslang/known_good.json 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/known_good.json 2018-04-27 11:46:26.000000000 +0000 @@ -5,14 +5,14 @@ "site" : "github", "subrepo" : "KhronosGroup/SPIRV-Tools", "subdir" : "External/spirv-tools", - "commit" : "9e19fc0f31ceaf1f6bc907dbf17dcfded85f2ce8" + "commit" : "26a698c34788bb69123a1f3789970a16cf4d9641" }, { "name" : "spirv-tools/external/spirv-headers", "site" : "github", "subrepo" : "KhronosGroup/SPIRV-Headers", "subdir" : "External/spirv-tools/external/spirv-headers", - "commit" : "ce309203d7eceaf908bea8862c27f3e0749f7d00" + "commit" : "12f8de9f04327336b699b1b80aa390ae7f9ddbf4" } ] } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/known_good_khr.json vulkan-1.1.73+dfsg/external/glslang/known_good_khr.json --- vulkan-1.1.70+dfsg1/external/glslang/known_good_khr.json 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/known_good_khr.json 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,18 @@ +{ + "commits" : [ + { + "name" : "spirv-tools", + "site" : "gitlab", + "subrepo" : "spirv/spirv-tools", + "subdir" : "External/spirv-tools", + "commit" : "d4e2c2eaa6fd2e9f9cd218ea9add9b0c8ae759ba" + }, + { + "name" : "spirv-tools/external/spirv-headers", + "site" : "gitlab", + "subrepo" : "spirv/SPIRV-Headers", + "subdir" : "External/spirv-tools/external/spirv-headers", + "commit" : "4082a777bd5df31ed45acf40e64263094e85ed2e" + } + ] +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/make-revision vulkan-1.1.73+dfsg/external/glslang/make-revision --- vulkan-1.1.70+dfsg1/external/glslang/make-revision 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/make-revision 2018-04-27 11:46:26.000000000 +0000 @@ -1,10 +1,6 @@ #!/bin/sh ( echo "// This header is generated by the make-revision script." -echo "// For the version, it uses the latest git tag followed by the number of commits." -echo "// For the date, it uses the current date (when then script is run)." - echo -echo \#define GLSLANG_REVISION \"`git describe --tags --abbrev=0`.`git log --oneline | wc -l`\" -echo \#define GLSLANG_DATE \"`date +%d-%b-%Y`\" +echo \#define GLSLANG_PATCH_LEVEL `git log --oneline | wc -l` ) > glslang/Include/revision.h diff -Nru vulkan-1.1.70+dfsg1/external/glslang/README.md vulkan-1.1.73+dfsg/external/glslang/README.md --- vulkan-1.1.70+dfsg1/external/glslang/README.md 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/README.md 2018-04-27 11:46:26.000000000 +0000 @@ -57,7 +57,8 @@ ### Dependencies -* A C++11 compiler +* A C++11 compiler. + (For MSVS: 2015 is recommended, 2013 is fully supported/tested, and 2010 support is attempted, but not tested.) * [CMake][cmake]: for generating compilation targets. * make: _Linux_, ninja is an alternative, if configured. * [Python 2.7][python]: for executing SPIRV-Tools scripts. (Optional if not using SPIRV-Tools.) @@ -240,8 +241,11 @@ void FinalizeProcess(); class TShader + setStrings(...); + setEnvInput(EShSourceHlsl or EShSourceGlsl, stage, EShClientVulkan or EShClientOpenGL, 100); + setEnvClient(EShClientVulkan or EShClientOpenGL, EShTargetVulkan_1_0 or EShTargetVulkan_1_1 or EShTargetOpenGL_450); + setEnvTarget(EShTargetSpv, EShTargetSpv_1_0 or EShTargetSpv_1_3); bool parse(...); - void setStrings(...); const char* getInfoLog(); class TProgram diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/CMakeLists.txt vulkan-1.1.73+dfsg/external/glslang/SPIRV/CMakeLists.txt --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/CMakeLists.txt 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/CMakeLists.txt 2018-04-27 11:46:26.000000000 +0000 @@ -14,6 +14,7 @@ bitutils.h spirv.hpp GLSL.std.450.h + GLSL.ext.EXT.h GLSL.ext.KHR.h GlslangToSpv.h hex_float.h @@ -39,20 +40,25 @@ GLSL.ext.NV.h) endif(ENABLE_NV_EXTENSIONS) -add_library(SPIRV STATIC ${SOURCES} ${HEADERS}) +add_library(SPIRV ${LIB_TYPE} ${SOURCES} ${HEADERS}) set_property(TARGET SPIRV PROPERTY FOLDER glslang) set_property(TARGET SPIRV PROPERTY POSITION_INDEPENDENT_CODE ON) -add_library(SPVRemapper STATIC ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS}) +add_library(SPVRemapper ${LIB_TYPE} ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS}) set_property(TARGET SPVRemapper PROPERTY FOLDER glslang) set_property(TARGET SPVRemapper PROPERTY POSITION_INDEPENDENT_CODE ON) +if(WIN32 AND BUILD_SHARED_LIBS) + set_target_properties(SPIRV PROPERTIES PREFIX "") + set_target_properties(SPVRemapper PROPERTIES PREFIX "") +endif() + if(ENABLE_OPT) target_include_directories(SPIRV PRIVATE ${spirv-tools_SOURCE_DIR}/include PRIVATE ${spirv-tools_SOURCE_DIR}/source ) - target_link_libraries(SPIRV glslang SPIRV-Tools-opt SPVRemapper) + target_link_libraries(SPIRV glslang SPIRV-Tools-opt) else() target_link_libraries(SPIRV glslang) endif(ENABLE_OPT) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/disassemble.cpp vulkan-1.1.73+dfsg/external/glslang/SPIRV/disassemble.cpp --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/disassemble.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/disassemble.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -54,6 +54,7 @@ #ifdef AMD_EXTENSIONS #include "GLSL.ext.AMD.h" #endif + #ifdef NV_EXTENSIONS #include "GLSL.ext.NV.h" #endif @@ -80,12 +81,15 @@ // used to identify the extended instruction library imported when printing enum ExtInstSet { GLSL450Inst, + #ifdef AMD_EXTENSIONS GLSLextAMDInst, #endif + #ifdef NV_EXTENSIONS GLSLextNVInst, #endif + OpenCLExtInst, }; @@ -653,7 +657,6 @@ } #endif - #ifdef NV_EXTENSIONS static const char* GLSLextNVGetDebugNames(const char* name, unsigned entrypoint) { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/doc.cpp vulkan-1.1.73+dfsg/external/glslang/SPIRV/doc.cpp --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/doc.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/doc.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -66,7 +66,7 @@ // the specification (or their sanitized versions for auto-generating the // spirv headers. // -// Also, the ceilings are declared next to these, to help keep them in sync. +// Also, for masks the ceilings are declared next to these, to help keep them in sync. // Ceilings should be // - one more than the maximum value an enumerant takes on, for non-mask enumerants // (for non-sparse enums, this is the number of enumerants) @@ -74,8 +74,6 @@ // (for non-sparse mask enums, this is the number of enumerants) // -const int SourceLanguageCeiling = 6; // HLSL todo: need official enumerant - const char* SourceString(int source) { switch (source) { @@ -86,13 +84,10 @@ case 4: return "OpenCL_CPP"; case 5: return "HLSL"; - case SourceLanguageCeiling: default: return "Bad"; } } -const int ExecutionModelCeiling = 7; - const char* ExecutionModelString(int model) { switch (model) { @@ -104,13 +99,10 @@ case 5: return "GLCompute"; case 6: return "Kernel"; - case ExecutionModelCeiling: default: return "Bad"; } } -const int AddressingModelCeiling = 3; - const char* AddressingString(int addr) { switch (addr) { @@ -118,13 +110,10 @@ case 1: return "Physical32"; case 2: return "Physical64"; - case AddressingModelCeiling: default: return "Bad"; } } -const int MemoryModelCeiling = 3; - const char* MemoryString(int mem) { switch (mem) { @@ -132,7 +121,6 @@ case 1: return "GLSL450"; case 2: return "OpenCL"; - case MemoryModelCeiling: default: return "Bad"; } } @@ -182,8 +170,6 @@ } } -const int StorageClassCeiling = 13; - const char* StorageClassString(int StorageClass) { switch (StorageClass) { @@ -201,7 +187,6 @@ case 11: return "Image"; case 12: return "StorageBuffer"; - case StorageClassCeiling: default: return "Bad"; } } @@ -261,19 +246,21 @@ default: return "Bad"; #ifdef AMD_EXTENSIONS - case 4999: return "ExplicitInterpAMD"; + case DecorationExplicitInterpAMD: return "ExplicitInterpAMD"; #endif #ifdef NV_EXTENSIONS - case 5248: return "OverrideCoverageNV"; - case 5250: return "PassthroughNV"; - case 5252: return "ViewportRelativeNV"; - case 5256: return "SecondaryViewportRelativeNV"; + case DecorationOverrideCoverageNV: return "OverrideCoverageNV"; + case DecorationPassthroughNV: return "PassthroughNV"; + case DecorationViewportRelativeNV: return "ViewportRelativeNV"; + case DecorationSecondaryViewportRelativeNV: return "SecondaryViewportRelativeNV"; #endif + + case DecorationNonUniformEXT: return "DecorationNonUniformEXT"; + case DecorationHlslCounterBufferGOOGLE: return "DecorationHlslCounterBufferGOOGLE"; + case DecorationHlslSemanticGOOGLE: return "DecorationHlslSemanticGOOGLE"; } } -const int BuiltInCeiling = 44; - const char* BuiltInString(int builtIn) { switch (builtIn) { @@ -354,13 +341,10 @@ case 5264: return "FullyCoveredEXT"; - case BuiltInCeiling: default: return "Bad"; } } -const int DimensionCeiling = 7; - const char* DimensionString(int dim) { switch (dim) { @@ -372,13 +356,10 @@ case 5: return "Buffer"; case 6: return "SubpassData"; - case DimensionCeiling: default: return "Bad"; } } -const int SamplerAddressingModeCeiling = 5; - const char* SamplerAddressingModeString(int mode) { switch (mode) { @@ -388,26 +369,20 @@ case 3: return "Repeat"; case 4: return "RepeatMirrored"; - case SamplerAddressingModeCeiling: default: return "Bad"; } } -const int SamplerFilterModeCeiling = 2; - const char* SamplerFilterModeString(int mode) { switch (mode) { case 0: return "Nearest"; case 1: return "Linear"; - case SamplerFilterModeCeiling: default: return "Bad"; } } -const int ImageFormatCeiling = 40; - const char* ImageFormatString(int format) { switch (format) { @@ -464,14 +439,11 @@ case 38: return "R16ui"; case 39: return "R8ui"; - case ImageFormatCeiling: default: return "Bad"; } } -const int ImageChannelOrderCeiling = 19; - const char* ImageChannelOrderString(int format) { switch (format) { @@ -495,14 +467,11 @@ case 17: return "sRGBA"; case 18: return "sBGRA"; - case ImageChannelOrderCeiling: default: return "Bad"; } } -const int ImageChannelDataTypeCeiling = 17; - const char* ImageChannelDataTypeString(int type) { switch (type) @@ -525,7 +494,6 @@ case 15: return "UnormInt24"; case 16: return "UnormInt101010_2"; - case ImageChannelDataTypeCeiling: default: return "Bad"; } @@ -551,8 +519,6 @@ } } -const int FPFastMathCeiling = 5; - const char* FPFastMathString(int mode) { switch (mode) { @@ -562,13 +528,10 @@ case 3: return "AllowRecip"; case 4: return "Fast"; - case FPFastMathCeiling: default: return "Bad"; } } -const int FPRoundingModeCeiling = 4; - const char* FPRoundingModeString(int mode) { switch (mode) { @@ -577,26 +540,20 @@ case 2: return "RTP"; case 3: return "RTN"; - case FPRoundingModeCeiling: default: return "Bad"; } } -const int LinkageTypeCeiling = 2; - const char* LinkageTypeString(int type) { switch (type) { case 0: return "Export"; case 1: return "Import"; - case LinkageTypeCeiling: default: return "Bad"; } } -const int FuncParamAttrCeiling = 8; - const char* FuncParamAttrString(int attr) { switch (attr) { @@ -609,13 +566,10 @@ case 6: return "NoWrite"; case 7: return "NoReadWrite"; - case FuncParamAttrCeiling: default: return "Bad"; } } -const int AccessQualifierCeiling = 3; - const char* AccessQualifierString(int attr) { switch (attr) { @@ -623,7 +577,6 @@ case 1: return "WriteOnly"; case 2: return "ReadWrite"; - case AccessQualifierCeiling: default: return "Bad"; } } @@ -671,8 +624,6 @@ } } -const int MemorySemanticsCeiling = 12; - const char* MemorySemanticsString(int mem) { // Note: No bits set (None) means "Relaxed" @@ -690,13 +641,10 @@ case 10: return "AtomicCounterMemory"; case 11: return "ImageMemory"; - case MemorySemanticsCeiling: default: return "Bad"; } } -const int MemoryAccessCeiling = 3; - const char* MemoryAccessString(int mem) { switch (mem) { @@ -704,13 +652,10 @@ case 1: return "Aligned"; case 2: return "Nontemporal"; - case MemoryAccessCeiling: default: return "Bad"; } } -const int ScopeCeiling = 5; - const char* ScopeString(int mem) { switch (mem) { @@ -720,29 +665,29 @@ case 3: return "Subgroup"; case 4: return "Invocation"; - case ScopeCeiling: default: return "Bad"; } } -const int GroupOperationCeiling = 3; - const char* GroupOperationString(int gop) { switch (gop) { - case 0: return "Reduce"; - case 1: return "InclusiveScan"; - case 2: return "ExclusiveScan"; + case GroupOperationReduce: return "Reduce"; + case GroupOperationInclusiveScan: return "InclusiveScan"; + case GroupOperationExclusiveScan: return "ExclusiveScan"; + case GroupOperationClusteredReduce: return "ClusteredReduce"; +#ifdef NV_EXTENSIONS + case GroupOperationPartitionedReduceNV: return "PartitionedReduceNV"; + case GroupOperationPartitionedInclusiveScanNV: return "PartitionedInclusiveScanNV"; + case GroupOperationPartitionedExclusiveScanNV: return "PartitionedExclusiveScanNV"; +#endif - case GroupOperationCeiling: default: return "Bad"; } } -const int KernelEnqueueFlagsCeiling = 3; - const char* KernelEnqueueFlagsString(int flag) { switch (flag) @@ -751,26 +696,20 @@ case 1: return "WaitKernel"; case 2: return "WaitWorkGroup"; - case KernelEnqueueFlagsCeiling: default: return "Bad"; } } -const int KernelProfilingInfoCeiling = 1; - const char* KernelProfilingInfoString(int info) { switch (info) { case 0: return "CmdExecTime"; - case KernelProfilingInfoCeiling: default: return "Bad"; } } -const int CapabilityCeiling = 58; - const char* CapabilityString(int info) { switch (info) @@ -833,41 +772,63 @@ case 55: return "StorageImageReadWithoutFormat"; case 56: return "StorageImageWriteWithoutFormat"; case 57: return "MultiViewport"; + case 61: return "GroupNonUniform"; + case 62: return "GroupNonUniformVote"; + case 63: return "GroupNonUniformArithmetic"; + case 64: return "GroupNonUniformBallot"; + case 65: return "GroupNonUniformShuffle"; + case 66: return "GroupNonUniformShuffleRelative"; + case 67: return "GroupNonUniformClustered"; + case 68: return "GroupNonUniformQuad"; + + case CapabilitySubgroupBallotKHR: return "SubgroupBallotKHR"; + case CapabilityDrawParameters: return "DrawParameters"; + case CapabilitySubgroupVoteKHR: return "SubgroupVoteKHR"; + + case CapabilityStorageUniformBufferBlock16: return "StorageUniformBufferBlock16"; + case CapabilityStorageUniform16: return "StorageUniform16"; + case CapabilityStoragePushConstant16: return "StoragePushConstant16"; + case CapabilityStorageInputOutput16: return "StorageInputOutput16"; - case 4423: return "SubgroupBallotKHR"; - case 4427: return "DrawParameters"; - case 4431: return "SubgroupVoteKHR"; - - case 4433: return "StorageUniformBufferBlock16"; - case 4434: return "StorageUniform16"; - case 4435: return "StoragePushConstant16"; - case 4436: return "StorageInputOutput16"; - - case 4437: return "DeviceGroup"; - case 4439: return "MultiView"; + case CapabilityDeviceGroup: return "DeviceGroup"; + case CapabilityMultiView: return "MultiView"; - case 5013: return "StencilExportEXT"; + case CapabilityStencilExportEXT: return "StencilExportEXT"; #ifdef AMD_EXTENSIONS - case 5009: return "ImageGatherBiasLodAMD"; - case 5010: return "FragmentMaskAMD"; - case 5015: return "ImageReadWriteLodAMD"; + case CapabilityFloat16ImageAMD: return "Float16ImageAMD"; + case CapabilityImageGatherBiasLodAMD: return "ImageGatherBiasLodAMD"; + case CapabilityFragmentMaskAMD: return "FragmentMaskAMD"; + case CapabilityImageReadWriteLodAMD: return "ImageReadWriteLodAMD"; #endif - case 4445: return "AtomicStorageOps"; + case CapabilityAtomicStorageOps: return "AtomicStorageOps"; - case 4447: return "SampleMaskPostDepthCoverage"; + case CapabilitySampleMaskPostDepthCoverage: return "SampleMaskPostDepthCoverage"; #ifdef NV_EXTENSIONS - case 5251: return "GeometryShaderPassthroughNV"; - case 5254: return "ShaderViewportIndexLayerNV"; - case 5255: return "ShaderViewportMaskNV"; - case 5259: return "ShaderStereoViewNV"; - case 5260: return "PerViewAttributesNV"; + case CapabilityGeometryShaderPassthroughNV: return "GeometryShaderPassthroughNV"; + case CapabilityShaderViewportIndexLayerNV: return "ShaderViewportIndexLayerNV"; + case CapabilityShaderViewportMaskNV: return "ShaderViewportMaskNV"; + case CapabilityShaderStereoViewNV: return "ShaderStereoViewNV"; + case CapabilityPerViewAttributesNV: return "PerViewAttributesNV"; + case CapabilityGroupNonUniformPartitionedNV: return "GroupNonUniformPartitionedNV"; #endif - case 5265: return "FragmentFullyCoveredEXT"; + case CapabilityFragmentFullyCoveredEXT: return "FragmentFullyCoveredEXT"; + + case CapabilityShaderNonUniformEXT: return "CapabilityShaderNonUniformEXT"; + case CapabilityRuntimeDescriptorArrayEXT: return "CapabilityRuntimeDescriptorArrayEXT"; + case CapabilityInputAttachmentArrayDynamicIndexingEXT: return "CapabilityInputAttachmentArrayDynamicIndexingEXT"; + case CapabilityUniformTexelBufferArrayDynamicIndexingEXT: return "CapabilityUniformTexelBufferArrayDynamicIndexingEXT"; + case CapabilityStorageTexelBufferArrayDynamicIndexingEXT: return "CapabilityStorageTexelBufferArrayDynamicIndexingEXT"; + case CapabilityUniformBufferArrayNonUniformIndexingEXT: return "CapabilityUniformBufferArrayNonUniformIndexingEXT"; + case CapabilitySampledImageArrayNonUniformIndexingEXT: return "CapabilitySampledImageArrayNonUniformIndexingEXT"; + case CapabilityStorageBufferArrayNonUniformIndexingEXT: return "CapabilityStorageBufferArrayNonUniformIndexingEXT"; + case CapabilityStorageImageArrayNonUniformIndexingEXT: return "CapabilityStorageImageArrayNonUniformIndexingEXT"; + case CapabilityInputAttachmentArrayNonUniformIndexingEXT: return "CapabilityInputAttachmentArrayNonUniformIndexingEXT"; + case CapabilityUniformTexelBufferArrayNonUniformIndexingEXT: return "CapabilityUniformTexelBufferArrayNonUniformIndexingEXT"; + case CapabilityStorageTexelBufferArrayNonUniformIndexingEXT: return "CapabilityStorageTexelBufferArrayNonUniformIndexingEXT"; - case CapabilityCeiling: default: return "Bad"; } } @@ -1197,6 +1158,44 @@ case 319: return "OpAtomicFlagClear"; case 320: return "OpImageSparseRead"; + case OpModuleProcessed: return "OpModuleProcessed"; + case OpDecorateId: return "OpDecorateId"; + + case 333: return "OpGroupNonUniformElect"; + case 334: return "OpGroupNonUniformAll"; + case 335: return "OpGroupNonUniformAny"; + case 336: return "OpGroupNonUniformAllEqual"; + case 337: return "OpGroupNonUniformBroadcast"; + case 338: return "OpGroupNonUniformBroadcastFirst"; + case 339: return "OpGroupNonUniformBallot"; + case 340: return "OpGroupNonUniformInverseBallot"; + case 341: return "OpGroupNonUniformBallotBitExtract"; + case 342: return "OpGroupNonUniformBallotBitCount"; + case 343: return "OpGroupNonUniformBallotFindLSB"; + case 344: return "OpGroupNonUniformBallotFindMSB"; + case 345: return "OpGroupNonUniformShuffle"; + case 346: return "OpGroupNonUniformShuffleXor"; + case 347: return "OpGroupNonUniformShuffleUp"; + case 348: return "OpGroupNonUniformShuffleDown"; + case 349: return "OpGroupNonUniformIAdd"; + case 350: return "OpGroupNonUniformFAdd"; + case 351: return "OpGroupNonUniformIMul"; + case 352: return "OpGroupNonUniformFMul"; + case 353: return "OpGroupNonUniformSMin"; + case 354: return "OpGroupNonUniformUMin"; + case 355: return "OpGroupNonUniformFMin"; + case 356: return "OpGroupNonUniformSMax"; + case 357: return "OpGroupNonUniformUMax"; + case 358: return "OpGroupNonUniformFMax"; + case 359: return "OpGroupNonUniformBitwiseAnd"; + case 360: return "OpGroupNonUniformBitwiseOr"; + case 361: return "OpGroupNonUniformBitwiseXor"; + case 362: return "OpGroupNonUniformLogicalAnd"; + case 363: return "OpGroupNonUniformLogicalOr"; + case 364: return "OpGroupNonUniformLogicalXor"; + case 365: return "OpGroupNonUniformQuadBroadcast"; + case 366: return "OpGroupNonUniformQuadSwap"; + case 4421: return "OpSubgroupBallotKHR"; case 4422: return "OpSubgroupFirstInvocationKHR"; case 4428: return "OpSubgroupAllKHR"; @@ -1218,7 +1217,12 @@ case 5012: return "OpFragmentFetchAMD"; #endif - case OpcodeCeiling: + case OpDecorateStringGOOGLE: return "OpDecorateStringGOOGLE"; + case OpMemberDecorateStringGOOGLE: return "OpMemberDecorateStringGOOGLE"; + +#ifdef NV_EXTENSIONS + case OpGroupNonUniformPartitionNV: return "OpGroupNonUniformPartitionNV"; +#endif default: return "Bad"; } @@ -1231,35 +1235,12 @@ OperandParameters DecorationOperands[DecorationCeiling]; EnumDefinition OperandClassParams[OperandCount]; -EnumParameters ExecutionModelParams[ExecutionModelCeiling]; -EnumParameters AddressingParams[AddressingModelCeiling]; -EnumParameters MemoryParams[MemoryModelCeiling]; EnumParameters ExecutionModeParams[ExecutionModeCeiling]; -EnumParameters StorageParams[StorageClassCeiling]; -EnumParameters SamplerAddressingModeParams[SamplerAddressingModeCeiling]; -EnumParameters SamplerFilterModeParams[SamplerFilterModeCeiling]; -EnumParameters ImageFormatParams[ImageFormatCeiling]; -EnumParameters ImageChannelOrderParams[ImageChannelOrderCeiling]; -EnumParameters ImageChannelDataTypeParams[ImageChannelDataTypeCeiling]; EnumParameters ImageOperandsParams[ImageOperandsCeiling]; -EnumParameters FPFastMathParams[FPFastMathCeiling]; -EnumParameters FPRoundingModeParams[FPRoundingModeCeiling]; -EnumParameters LinkageTypeParams[LinkageTypeCeiling]; EnumParameters DecorationParams[DecorationCeiling]; -EnumParameters BuiltInParams[BuiltInCeiling]; -EnumParameters DimensionalityParams[DimensionCeiling]; -EnumParameters FuncParamAttrParams[FuncParamAttrCeiling]; -EnumParameters AccessQualifierParams[AccessQualifierCeiling]; -EnumParameters GroupOperationParams[GroupOperationCeiling]; EnumParameters LoopControlParams[FunctionControlCeiling]; EnumParameters SelectionControlParams[SelectControlCeiling]; EnumParameters FunctionControlParams[FunctionControlCeiling]; -EnumParameters MemorySemanticsParams[MemorySemanticsCeiling]; -EnumParameters MemoryAccessParams[MemoryAccessCeiling]; -EnumParameters ScopeParams[ScopeCeiling]; -EnumParameters KernelEnqueueFlagsParams[KernelEnqueueFlagsCeiling]; -EnumParameters KernelProfilingInfoParams[KernelProfilingInfoCeiling]; -EnumParameters CapabilityParams[CapabilityCeiling]; // Set up all the parameterizing descriptions of the opcodes, operands, etc. void Parameterize() @@ -1309,7 +1290,10 @@ InstructionDesc[OpImageWrite].setResultAndType(false, false); InstructionDesc[OpDecorationGroup].setResultAndType(true, false); InstructionDesc[OpDecorate].setResultAndType(false, false); + InstructionDesc[OpDecorateId].setResultAndType(false, false); + InstructionDesc[OpDecorateStringGOOGLE].setResultAndType(false, false); InstructionDesc[OpMemberDecorate].setResultAndType(false, false); + InstructionDesc[OpMemberDecorateStringGOOGLE].setResultAndType(false, false); InstructionDesc[OpGroupDecorate].setResultAndType(false, false); InstructionDesc[OpGroupMemberDecorate].setResultAndType(false, false); InstructionDesc[OpName].setResultAndType(false, false); @@ -1348,6 +1332,7 @@ InstructionDesc[OpReleaseEvent].setResultAndType(false, false); InstructionDesc[OpGroupWaitEvents].setResultAndType(false, false); InstructionDesc[OpAtomicFlagClear].setResultAndType(false, false); + InstructionDesc[OpModuleProcessed].setResultAndType(false, false); // Specific additional context-dependent operands @@ -1385,354 +1370,39 @@ DecorationOperands[DecorationInputAttachmentIndex].push(OperandLiteralNumber, "'Attachment Index'"); DecorationOperands[DecorationAlignment].push(OperandLiteralNumber, "'Alignment'"); - OperandClassParams[OperandSource].set(SourceLanguageCeiling, SourceString, 0); - OperandClassParams[OperandExecutionModel].set(ExecutionModelCeiling, ExecutionModelString, ExecutionModelParams); - OperandClassParams[OperandAddressing].set(AddressingModelCeiling, AddressingString, AddressingParams); - OperandClassParams[OperandMemory].set(MemoryModelCeiling, MemoryString, MemoryParams); + OperandClassParams[OperandSource].set(0, SourceString, 0); + OperandClassParams[OperandExecutionModel].set(0, ExecutionModelString, nullptr); + OperandClassParams[OperandAddressing].set(0, AddressingString, nullptr); + OperandClassParams[OperandMemory].set(0, MemoryString, nullptr); OperandClassParams[OperandExecutionMode].set(ExecutionModeCeiling, ExecutionModeString, ExecutionModeParams); OperandClassParams[OperandExecutionMode].setOperands(ExecutionModeOperands); - OperandClassParams[OperandStorage].set(StorageClassCeiling, StorageClassString, StorageParams); - OperandClassParams[OperandDimensionality].set(DimensionCeiling, DimensionString, DimensionalityParams); - OperandClassParams[OperandSamplerAddressingMode].set(SamplerAddressingModeCeiling, SamplerAddressingModeString, SamplerAddressingModeParams); - OperandClassParams[OperandSamplerFilterMode].set(SamplerFilterModeCeiling, SamplerFilterModeString, SamplerFilterModeParams); - OperandClassParams[OperandSamplerImageFormat].set(ImageFormatCeiling, ImageFormatString, ImageFormatParams); - OperandClassParams[OperandImageChannelOrder].set(ImageChannelOrderCeiling, ImageChannelOrderString, ImageChannelOrderParams); - OperandClassParams[OperandImageChannelDataType].set(ImageChannelDataTypeCeiling, ImageChannelDataTypeString, ImageChannelDataTypeParams); + OperandClassParams[OperandStorage].set(0, StorageClassString, nullptr); + OperandClassParams[OperandDimensionality].set(0, DimensionString, nullptr); + OperandClassParams[OperandSamplerAddressingMode].set(0, SamplerAddressingModeString, nullptr); + OperandClassParams[OperandSamplerFilterMode].set(0, SamplerFilterModeString, nullptr); + OperandClassParams[OperandSamplerImageFormat].set(0, ImageFormatString, nullptr); + OperandClassParams[OperandImageChannelOrder].set(0, ImageChannelOrderString, nullptr); + OperandClassParams[OperandImageChannelDataType].set(0, ImageChannelDataTypeString, nullptr); OperandClassParams[OperandImageOperands].set(ImageOperandsCeiling, ImageOperandsString, ImageOperandsParams, true); - OperandClassParams[OperandFPFastMath].set(FPFastMathCeiling, FPFastMathString, FPFastMathParams, true); - OperandClassParams[OperandFPRoundingMode].set(FPRoundingModeCeiling, FPRoundingModeString, FPRoundingModeParams); - OperandClassParams[OperandLinkageType].set(LinkageTypeCeiling, LinkageTypeString, LinkageTypeParams); - OperandClassParams[OperandFuncParamAttr].set(FuncParamAttrCeiling, FuncParamAttrString, FuncParamAttrParams); - OperandClassParams[OperandAccessQualifier].set(AccessQualifierCeiling, AccessQualifierString, AccessQualifierParams); + OperandClassParams[OperandFPFastMath].set(0, FPFastMathString, nullptr, true); + OperandClassParams[OperandFPRoundingMode].set(0, FPRoundingModeString, nullptr); + OperandClassParams[OperandLinkageType].set(0, LinkageTypeString, nullptr); + OperandClassParams[OperandFuncParamAttr].set(0, FuncParamAttrString, nullptr); + OperandClassParams[OperandAccessQualifier].set(0, AccessQualifierString, nullptr); OperandClassParams[OperandDecoration].set(DecorationCeiling, DecorationString, DecorationParams); OperandClassParams[OperandDecoration].setOperands(DecorationOperands); - OperandClassParams[OperandBuiltIn].set(BuiltInCeiling, BuiltInString, BuiltInParams); + OperandClassParams[OperandBuiltIn].set(0, BuiltInString, nullptr); OperandClassParams[OperandSelect].set(SelectControlCeiling, SelectControlString, SelectionControlParams, true); OperandClassParams[OperandLoop].set(LoopControlCeiling, LoopControlString, LoopControlParams, true); OperandClassParams[OperandFunction].set(FunctionControlCeiling, FunctionControlString, FunctionControlParams, true); - OperandClassParams[OperandMemorySemantics].set(MemorySemanticsCeiling, MemorySemanticsString, MemorySemanticsParams, true); - OperandClassParams[OperandMemoryAccess].set(MemoryAccessCeiling, MemoryAccessString, MemoryAccessParams, true); - OperandClassParams[OperandScope].set(ScopeCeiling, ScopeString, ScopeParams); - OperandClassParams[OperandGroupOperation].set(GroupOperationCeiling, GroupOperationString, GroupOperationParams); - OperandClassParams[OperandKernelEnqueueFlags].set(KernelEnqueueFlagsCeiling, KernelEnqueueFlagsString, KernelEnqueueFlagsParams); - OperandClassParams[OperandKernelProfilingInfo].set(KernelProfilingInfoCeiling, KernelProfilingInfoString, KernelProfilingInfoParams, true); - OperandClassParams[OperandCapability].set(CapabilityCeiling, CapabilityString, CapabilityParams); - OperandClassParams[OperandOpcode].set(OpcodeCeiling, OpcodeString, 0); - - CapabilityParams[CapabilityShader].caps.push_back(CapabilityMatrix); - CapabilityParams[CapabilityGeometry].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityTessellation].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityVector16].caps.push_back(CapabilityKernel); - CapabilityParams[CapabilityFloat16Buffer].caps.push_back(CapabilityKernel); - CapabilityParams[CapabilityInt64Atomics].caps.push_back(CapabilityInt64); - CapabilityParams[CapabilityImageBasic].caps.push_back(CapabilityKernel); - CapabilityParams[CapabilityImageReadWrite].caps.push_back(CapabilityImageBasic); - CapabilityParams[CapabilityImageMipmap].caps.push_back(CapabilityImageBasic); - CapabilityParams[CapabilityPipes].caps.push_back(CapabilityKernel); - CapabilityParams[CapabilityDeviceEnqueue].caps.push_back(CapabilityKernel); - CapabilityParams[CapabilityLiteralSampler].caps.push_back(CapabilityKernel); - CapabilityParams[CapabilityAtomicStorage].caps.push_back(CapabilityShader); - CapabilityParams[CapabilitySampleRateShading].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityTessellationPointSize].caps.push_back(CapabilityTessellation); - CapabilityParams[CapabilityGeometryPointSize].caps.push_back(CapabilityGeometry); - CapabilityParams[CapabilityImageGatherExtended].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityStorageImageExtendedFormats].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityStorageImageMultisample].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityUniformBufferArrayDynamicIndexing].caps.push_back(CapabilityShader); - CapabilityParams[CapabilitySampledImageArrayDynamicIndexing].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityStorageBufferArrayDynamicIndexing].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityStorageImageArrayDynamicIndexing].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityClipDistance].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityCullDistance].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityGenericPointer].caps.push_back(CapabilityAddresses); - CapabilityParams[CapabilityInt8].caps.push_back(CapabilityKernel); - CapabilityParams[CapabilityInputAttachment].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityMinLod].caps.push_back(CapabilityShader); - CapabilityParams[CapabilitySparseResidency].caps.push_back(CapabilityShader); - CapabilityParams[CapabilitySampled1D].caps.push_back(CapabilityShader); - CapabilityParams[CapabilitySampledRect].caps.push_back(CapabilityShader); - CapabilityParams[CapabilitySampledBuffer].caps.push_back(CapabilityShader); - CapabilityParams[CapabilitySampledCubeArray].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityImageMSArray].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityImage1D].caps.push_back(CapabilitySampled1D); - CapabilityParams[CapabilityImageRect].caps.push_back(CapabilitySampledRect); - CapabilityParams[CapabilityImageBuffer].caps.push_back(CapabilitySampledBuffer); - CapabilityParams[CapabilityImageCubeArray].caps.push_back(CapabilitySampledCubeArray); - CapabilityParams[CapabilityImageQuery].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityDerivativeControl].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityInterpolationFunction].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityTransformFeedback].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityGeometryStreams].caps.push_back(CapabilityGeometry); - CapabilityParams[CapabilityStorageImageReadWithoutFormat].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityStorageImageWriteWithoutFormat].caps.push_back(CapabilityShader); - CapabilityParams[CapabilityMultiViewport].caps.push_back(CapabilityGeometry); - - AddressingParams[AddressingModelPhysical32].caps.push_back(CapabilityAddresses); - AddressingParams[AddressingModelPhysical64].caps.push_back(CapabilityAddresses); - - MemoryParams[MemoryModelSimple].caps.push_back(CapabilityShader); - MemoryParams[MemoryModelGLSL450].caps.push_back(CapabilityShader); - MemoryParams[MemoryModelOpenCL].caps.push_back(CapabilityKernel); - - MemorySemanticsParams[MemorySemanticsUniformMemoryShift].caps.push_back(CapabilityShader); - MemorySemanticsParams[MemorySemanticsAtomicCounterMemoryShift].caps.push_back(CapabilityAtomicStorage); - - ExecutionModelParams[ExecutionModelVertex].caps.push_back(CapabilityShader); - ExecutionModelParams[ExecutionModelTessellationControl].caps.push_back(CapabilityTessellation); - ExecutionModelParams[ExecutionModelTessellationEvaluation].caps.push_back(CapabilityTessellation); - ExecutionModelParams[ExecutionModelGeometry].caps.push_back(CapabilityGeometry); - ExecutionModelParams[ExecutionModelFragment].caps.push_back(CapabilityShader); - ExecutionModelParams[ExecutionModelGLCompute].caps.push_back(CapabilityShader); - ExecutionModelParams[ExecutionModelKernel].caps.push_back(CapabilityKernel); - - // Storage capabilites - StorageParams[StorageClassInput].caps.push_back(CapabilityShader); - StorageParams[StorageClassUniform].caps.push_back(CapabilityShader); - StorageParams[StorageClassOutput].caps.push_back(CapabilityShader); - StorageParams[StorageClassPrivate].caps.push_back(CapabilityShader); - StorageParams[StorageClassGeneric].caps.push_back(CapabilityKernel); - StorageParams[StorageClassAtomicCounter].caps.push_back(CapabilityAtomicStorage); - StorageParams[StorageClassPushConstant].caps.push_back(CapabilityShader); - - // Sampler Filter & Addressing mode capabilities - SamplerAddressingModeParams[SamplerAddressingModeNone].caps.push_back(CapabilityKernel); - SamplerAddressingModeParams[SamplerAddressingModeClampToEdge].caps.push_back(CapabilityKernel); - SamplerAddressingModeParams[SamplerAddressingModeClamp].caps.push_back(CapabilityKernel); - SamplerAddressingModeParams[SamplerAddressingModeRepeat].caps.push_back(CapabilityKernel); - SamplerAddressingModeParams[SamplerAddressingModeRepeatMirrored].caps.push_back(CapabilityKernel); - - SamplerFilterModeParams[SamplerFilterModeNearest].caps.push_back(CapabilityKernel); - SamplerFilterModeParams[SamplerFilterModeLinear].caps.push_back(CapabilityKernel); - - // image format capabilities - - // ES/Desktop float - ImageFormatParams[ImageFormatRgba32f].caps.push_back(CapabilityShader); - ImageFormatParams[ImageFormatRgba16f].caps.push_back(CapabilityShader); - ImageFormatParams[ImageFormatR32f].caps.push_back(CapabilityShader); - ImageFormatParams[ImageFormatRgba8].caps.push_back(CapabilityShader); - ImageFormatParams[ImageFormatRgba8Snorm].caps.push_back(CapabilityShader); - - // Desktop float - ImageFormatParams[ImageFormatRg32f].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRg16f].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatR11fG11fB10f].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatR16f].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRgba16].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRgb10A2].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRg16].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRg8].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatR16].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatR8].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRgba16Snorm].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRg16Snorm].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRg8Snorm].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatR16Snorm].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatR8Snorm].caps.push_back(CapabilityStorageImageExtendedFormats); - - // ES/Desktop int - ImageFormatParams[ImageFormatRgba32i].caps.push_back(CapabilityShader); - ImageFormatParams[ImageFormatRgba16i].caps.push_back(CapabilityShader); - ImageFormatParams[ImageFormatRgba8i].caps.push_back(CapabilityShader); - ImageFormatParams[ImageFormatR32i].caps.push_back(CapabilityShader); - - // Desktop int - ImageFormatParams[ImageFormatRg32i].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRg16i].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRg8i].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatR16i].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatR8i].caps.push_back(CapabilityStorageImageExtendedFormats); - - // ES/Desktop uint - ImageFormatParams[ImageFormatRgba32ui].caps.push_back(CapabilityShader); - ImageFormatParams[ImageFormatRgba16ui].caps.push_back(CapabilityShader); - ImageFormatParams[ImageFormatRgba8ui].caps.push_back(CapabilityShader); - ImageFormatParams[ImageFormatR32ui].caps.push_back(CapabilityShader); - - // Desktop uint - ImageFormatParams[ImageFormatRgb10a2ui].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRg32ui].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRg16ui].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatRg8ui].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatR16ui].caps.push_back(CapabilityStorageImageExtendedFormats); - ImageFormatParams[ImageFormatR8ui].caps.push_back(CapabilityStorageImageExtendedFormats); - - // image channel order capabilities - for (int i = 0; i < ImageChannelOrderCeiling; ++i) { - ImageChannelOrderParams[i].caps.push_back(CapabilityKernel); - } - - // image channel type capabilities - for (int i = 0; i < ImageChannelDataTypeCeiling; ++i) { - ImageChannelDataTypeParams[i].caps.push_back(CapabilityKernel); - } - - // image lookup operands - ImageOperandsParams[ImageOperandsBiasShift].caps.push_back(CapabilityShader); - ImageOperandsParams[ImageOperandsOffsetShift].caps.push_back(CapabilityImageGatherExtended); - ImageOperandsParams[ImageOperandsMinLodShift].caps.push_back(CapabilityMinLod); - - // fast math flags capabilities - for (int i = 0; i < FPFastMathCeiling; ++i) { - FPFastMathParams[i].caps.push_back(CapabilityKernel); - } - - // fp rounding mode capabilities - for (int i = 0; i < FPRoundingModeCeiling; ++i) { - FPRoundingModeParams[i].caps.push_back(CapabilityKernel); - } - - // linkage types - for (int i = 0; i < LinkageTypeCeiling; ++i) { - LinkageTypeParams[i].caps.push_back(CapabilityLinkage); - } - - // function argument types - for (int i = 0; i < FuncParamAttrCeiling; ++i) { - FuncParamAttrParams[i].caps.push_back(CapabilityKernel); - } - - // function argument types - for (int i = 0; i < AccessQualifierCeiling; ++i) { - AccessQualifierParams[i].caps.push_back(CapabilityKernel); - } - - ExecutionModeParams[ExecutionModeInvocations].caps.push_back(CapabilityGeometry); - ExecutionModeParams[ExecutionModeSpacingEqual].caps.push_back(CapabilityTessellation); - ExecutionModeParams[ExecutionModeSpacingFractionalEven].caps.push_back(CapabilityTessellation); - ExecutionModeParams[ExecutionModeSpacingFractionalOdd].caps.push_back(CapabilityTessellation); - ExecutionModeParams[ExecutionModeVertexOrderCw].caps.push_back(CapabilityTessellation); - ExecutionModeParams[ExecutionModeVertexOrderCcw].caps.push_back(CapabilityTessellation); - ExecutionModeParams[ExecutionModePixelCenterInteger].caps.push_back(CapabilityShader); - ExecutionModeParams[ExecutionModeOriginUpperLeft].caps.push_back(CapabilityShader); - ExecutionModeParams[ExecutionModeOriginLowerLeft].caps.push_back(CapabilityShader); - ExecutionModeParams[ExecutionModeEarlyFragmentTests].caps.push_back(CapabilityShader); - ExecutionModeParams[ExecutionModePointMode].caps.push_back(CapabilityTessellation); - ExecutionModeParams[ExecutionModeXfb].caps.push_back(CapabilityTransformFeedback); - ExecutionModeParams[ExecutionModeDepthReplacing].caps.push_back(CapabilityShader); - ExecutionModeParams[ExecutionModeDepthGreater].caps.push_back(CapabilityShader); - ExecutionModeParams[ExecutionModeDepthLess].caps.push_back(CapabilityShader); - ExecutionModeParams[ExecutionModeDepthUnchanged].caps.push_back(CapabilityShader); - ExecutionModeParams[ExecutionModeLocalSizeHint].caps.push_back(CapabilityKernel); - ExecutionModeParams[ExecutionModeInputPoints].caps.push_back(CapabilityGeometry); - ExecutionModeParams[ExecutionModeInputLines].caps.push_back(CapabilityGeometry); - ExecutionModeParams[ExecutionModeInputLinesAdjacency].caps.push_back(CapabilityGeometry); - ExecutionModeParams[ExecutionModeTriangles].caps.push_back(CapabilityGeometry); - ExecutionModeParams[ExecutionModeTriangles].caps.push_back(CapabilityTessellation); - ExecutionModeParams[ExecutionModeInputTrianglesAdjacency].caps.push_back(CapabilityGeometry); - ExecutionModeParams[ExecutionModeQuads].caps.push_back(CapabilityTessellation); - ExecutionModeParams[ExecutionModeIsolines].caps.push_back(CapabilityTessellation); - ExecutionModeParams[ExecutionModeOutputVertices].caps.push_back(CapabilityGeometry); - ExecutionModeParams[ExecutionModeOutputVertices].caps.push_back(CapabilityTessellation); - ExecutionModeParams[ExecutionModeOutputPoints].caps.push_back(CapabilityGeometry); - ExecutionModeParams[ExecutionModeOutputLineStrip].caps.push_back(CapabilityGeometry); - ExecutionModeParams[ExecutionModeOutputTriangleStrip].caps.push_back(CapabilityGeometry); - ExecutionModeParams[ExecutionModeVecTypeHint].caps.push_back(CapabilityKernel); - ExecutionModeParams[ExecutionModeContractionOff].caps.push_back(CapabilityKernel); - - DecorationParams[DecorationRelaxedPrecision].caps.push_back(CapabilityShader); - DecorationParams[DecorationBlock].caps.push_back(CapabilityShader); - DecorationParams[DecorationBufferBlock].caps.push_back(CapabilityShader); - DecorationParams[DecorationRowMajor].caps.push_back(CapabilityMatrix); - DecorationParams[DecorationColMajor].caps.push_back(CapabilityMatrix); - DecorationParams[DecorationGLSLShared].caps.push_back(CapabilityShader); - DecorationParams[DecorationGLSLPacked].caps.push_back(CapabilityShader); - DecorationParams[DecorationNoPerspective].caps.push_back(CapabilityShader); - DecorationParams[DecorationFlat].caps.push_back(CapabilityShader); - DecorationParams[DecorationPatch].caps.push_back(CapabilityTessellation); - DecorationParams[DecorationCentroid].caps.push_back(CapabilityShader); - DecorationParams[DecorationSample].caps.push_back(CapabilitySampleRateShading); - DecorationParams[DecorationInvariant].caps.push_back(CapabilityShader); - DecorationParams[DecorationConstant].caps.push_back(CapabilityKernel); - DecorationParams[DecorationUniform].caps.push_back(CapabilityShader); - DecorationParams[DecorationCPacked].caps.push_back(CapabilityKernel); - DecorationParams[DecorationSaturatedConversion].caps.push_back(CapabilityKernel); - DecorationParams[DecorationStream].caps.push_back(CapabilityGeometryStreams); - DecorationParams[DecorationLocation].caps.push_back(CapabilityShader); - DecorationParams[DecorationComponent].caps.push_back(CapabilityShader); - DecorationParams[DecorationOffset].caps.push_back(CapabilityShader); - DecorationParams[DecorationIndex].caps.push_back(CapabilityShader); - DecorationParams[DecorationBinding].caps.push_back(CapabilityShader); - DecorationParams[DecorationDescriptorSet].caps.push_back(CapabilityShader); - DecorationParams[DecorationXfbBuffer].caps.push_back(CapabilityTransformFeedback); - DecorationParams[DecorationXfbStride].caps.push_back(CapabilityTransformFeedback); - DecorationParams[DecorationArrayStride].caps.push_back(CapabilityShader); - DecorationParams[DecorationMatrixStride].caps.push_back(CapabilityMatrix); - DecorationParams[DecorationFuncParamAttr].caps.push_back(CapabilityKernel); - DecorationParams[DecorationFPRoundingMode].caps.push_back(CapabilityKernel); - DecorationParams[DecorationFPFastMathMode].caps.push_back(CapabilityKernel); - DecorationParams[DecorationLinkageAttributes].caps.push_back(CapabilityLinkage); - DecorationParams[DecorationSpecId].caps.push_back(CapabilityShader); - DecorationParams[DecorationNoContraction].caps.push_back(CapabilityShader); - DecorationParams[DecorationInputAttachmentIndex].caps.push_back(CapabilityInputAttachment); - DecorationParams[DecorationAlignment].caps.push_back(CapabilityKernel); - - BuiltInParams[BuiltInPosition].caps.push_back(CapabilityShader); - BuiltInParams[BuiltInPointSize].caps.push_back(CapabilityShader); - BuiltInParams[BuiltInClipDistance].caps.push_back(CapabilityClipDistance); - BuiltInParams[BuiltInCullDistance].caps.push_back(CapabilityCullDistance); - - BuiltInParams[BuiltInVertexId].caps.push_back(CapabilityShader); - BuiltInParams[BuiltInVertexId].desc = "Vertex ID, which takes on values 0, 1, 2, . . . ."; - - BuiltInParams[BuiltInInstanceId].caps.push_back(CapabilityShader); - BuiltInParams[BuiltInInstanceId].desc = "Instance ID, which takes on values 0, 1, 2, . . . ."; - - BuiltInParams[BuiltInVertexIndex].caps.push_back(CapabilityShader); - BuiltInParams[BuiltInVertexIndex].desc = "Vertex index, which takes on values base, base+1, base+2, . . . ."; - - BuiltInParams[BuiltInInstanceIndex].caps.push_back(CapabilityShader); - BuiltInParams[BuiltInInstanceIndex].desc = "Instance index, which takes on values base, base+1, base+2, . . . ."; - - BuiltInParams[BuiltInPrimitiveId].caps.push_back(CapabilityGeometry); - BuiltInParams[BuiltInPrimitiveId].caps.push_back(CapabilityTessellation); - BuiltInParams[BuiltInInvocationId].caps.push_back(CapabilityGeometry); - BuiltInParams[BuiltInInvocationId].caps.push_back(CapabilityTessellation); - BuiltInParams[BuiltInLayer].caps.push_back(CapabilityGeometry); - BuiltInParams[BuiltInViewportIndex].caps.push_back(CapabilityMultiViewport); - BuiltInParams[BuiltInTessLevelOuter].caps.push_back(CapabilityTessellation); - BuiltInParams[BuiltInTessLevelInner].caps.push_back(CapabilityTessellation); - BuiltInParams[BuiltInTessCoord].caps.push_back(CapabilityTessellation); - BuiltInParams[BuiltInPatchVertices].caps.push_back(CapabilityTessellation); - BuiltInParams[BuiltInFragCoord].caps.push_back(CapabilityShader); - BuiltInParams[BuiltInPointCoord].caps.push_back(CapabilityShader); - BuiltInParams[BuiltInFrontFacing].caps.push_back(CapabilityShader); - BuiltInParams[BuiltInSampleId].caps.push_back(CapabilitySampleRateShading); - BuiltInParams[BuiltInSamplePosition].caps.push_back(CapabilitySampleRateShading); - BuiltInParams[BuiltInSampleMask].caps.push_back(CapabilitySampleRateShading); - BuiltInParams[BuiltInFragDepth].caps.push_back(CapabilityShader); - BuiltInParams[BuiltInHelperInvocation].caps.push_back(CapabilityShader); - BuiltInParams[BuiltInWorkDim].caps.push_back(CapabilityKernel); - BuiltInParams[BuiltInGlobalSize].caps.push_back(CapabilityKernel); - BuiltInParams[BuiltInEnqueuedWorkgroupSize].caps.push_back(CapabilityKernel); - BuiltInParams[BuiltInGlobalOffset].caps.push_back(CapabilityKernel); - BuiltInParams[BuiltInGlobalLinearId].caps.push_back(CapabilityKernel); - - BuiltInParams[BuiltInSubgroupSize].caps.push_back(CapabilityKernel); - BuiltInParams[BuiltInSubgroupMaxSize].caps.push_back(CapabilityKernel); - BuiltInParams[BuiltInNumSubgroups].caps.push_back(CapabilityKernel); - BuiltInParams[BuiltInNumEnqueuedSubgroups].caps.push_back(CapabilityKernel); - BuiltInParams[BuiltInSubgroupId].caps.push_back(CapabilityKernel); - BuiltInParams[BuiltInSubgroupLocalInvocationId].caps.push_back(CapabilityKernel); - - DimensionalityParams[Dim1D].caps.push_back(CapabilitySampled1D); - DimensionalityParams[DimCube].caps.push_back(CapabilityShader); - DimensionalityParams[DimRect].caps.push_back(CapabilitySampledRect); - DimensionalityParams[DimBuffer].caps.push_back(CapabilitySampledBuffer); - DimensionalityParams[DimSubpassData].caps.push_back(CapabilityInputAttachment); - - // Group Operations - for (int i = 0; i < GroupOperationCeiling; ++i) { - GroupOperationParams[i].caps.push_back(CapabilityKernel); - } - - // Enqueue flags - for (int i = 0; i < KernelEnqueueFlagsCeiling; ++i) { - KernelEnqueueFlagsParams[i].caps.push_back(CapabilityKernel); - } - - // Profiling info - KernelProfilingInfoParams[0].caps.push_back(CapabilityKernel); + OperandClassParams[OperandMemorySemantics].set(0, MemorySemanticsString, nullptr, true); + OperandClassParams[OperandMemoryAccess].set(0, MemoryAccessString, nullptr, true); + OperandClassParams[OperandScope].set(0, ScopeString, nullptr); + OperandClassParams[OperandGroupOperation].set(0, GroupOperationString, nullptr); + OperandClassParams[OperandKernelEnqueueFlags].set(0, KernelEnqueueFlagsString, nullptr); + OperandClassParams[OperandKernelProfilingInfo].set(0, KernelProfilingInfoString, nullptr, true); + OperandClassParams[OperandCapability].set(0, CapabilityString, nullptr); + OperandClassParams[OperandOpcode].set(OpCodeMask + 1, OpcodeString, 0); // set name of operator, an initial set of style operands, and the description @@ -1784,7 +1454,6 @@ InstructionDesc[OpTypeVector].operands.push(OperandId, "'Component Type'"); InstructionDesc[OpTypeVector].operands.push(OperandLiteralNumber, "'Component Count'"); - InstructionDesc[OpTypeMatrix].capabilities.push_back(CapabilityMatrix); InstructionDesc[OpTypeMatrix].operands.push(OperandId, "'Column Type'"); InstructionDesc[OpTypeMatrix].operands.push(OperandLiteralNumber, "'Column Count'"); @@ -1802,31 +1471,19 @@ InstructionDesc[OpTypeArray].operands.push(OperandId, "'Element Type'"); InstructionDesc[OpTypeArray].operands.push(OperandId, "'Length'"); - InstructionDesc[OpTypeRuntimeArray].capabilities.push_back(CapabilityShader); InstructionDesc[OpTypeRuntimeArray].operands.push(OperandId, "'Element Type'"); InstructionDesc[OpTypeStruct].operands.push(OperandVariableIds, "'Member 0 type', +\n'member 1 type', +\n..."); - InstructionDesc[OpTypeOpaque].capabilities.push_back(CapabilityKernel); InstructionDesc[OpTypeOpaque].operands.push(OperandLiteralString, "The name of the opaque type."); InstructionDesc[OpTypePointer].operands.push(OperandStorage, ""); InstructionDesc[OpTypePointer].operands.push(OperandId, "'Type'"); - InstructionDesc[OpTypeForwardPointer].capabilities.push_back(CapabilityAddresses); InstructionDesc[OpTypeForwardPointer].operands.push(OperandId, "'Pointer Type'"); InstructionDesc[OpTypeForwardPointer].operands.push(OperandStorage, ""); - InstructionDesc[OpTypeEvent].capabilities.push_back(CapabilityKernel); - - InstructionDesc[OpTypeDeviceEvent].capabilities.push_back(CapabilityDeviceEnqueue); - - InstructionDesc[OpTypeReserveId].capabilities.push_back(CapabilityPipes); - - InstructionDesc[OpTypeQueue].capabilities.push_back(CapabilityDeviceEnqueue); - InstructionDesc[OpTypePipe].operands.push(OperandAccessQualifier, "'Qualifier'"); - InstructionDesc[OpTypePipe].capabilities.push_back(CapabilityPipes); InstructionDesc[OpTypeFunction].operands.push(OperandId, "'Return Type'"); InstructionDesc[OpTypeFunction].operands.push(OperandVariableIds, "'Parameter 0 Type', +\n'Parameter 1 Type', +\n..."); @@ -1835,7 +1492,6 @@ InstructionDesc[OpConstantComposite].operands.push(OperandVariableIds, "'Constituents'"); - InstructionDesc[OpConstantSampler].capabilities.push_back(CapabilityLiteralSampler); InstructionDesc[OpConstantSampler].operands.push(OperandSamplerAddressingMode, ""); InstructionDesc[OpConstantSampler].operands.push(OperandLiteralNumber, "'Param'"); InstructionDesc[OpConstantSampler].operands.push(OperandSamplerFilterMode, ""); @@ -1873,11 +1529,24 @@ InstructionDesc[OpDecorate].operands.push(OperandDecoration, ""); InstructionDesc[OpDecorate].operands.push(OperandVariableLiterals, "See <>."); + InstructionDesc[OpDecorateId].operands.push(OperandId, "'Target'"); + InstructionDesc[OpDecorateId].operands.push(OperandDecoration, ""); + InstructionDesc[OpDecorateId].operands.push(OperandVariableIds, "See <>."); + + InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandId, "'Target'"); + InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandDecoration, ""); + InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandLiteralString, "'Literal String'"); + InstructionDesc[OpMemberDecorate].operands.push(OperandId, "'Structure Type'"); InstructionDesc[OpMemberDecorate].operands.push(OperandLiteralNumber, "'Member'"); InstructionDesc[OpMemberDecorate].operands.push(OperandDecoration, ""); InstructionDesc[OpMemberDecorate].operands.push(OperandVariableLiterals, "See <>."); + InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandId, "'Structure Type'"); + InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandLiteralNumber, "'Member'"); + InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandDecoration, ""); + InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandLiteralString, "'Literal String'"); + InstructionDesc[OpGroupDecorate].operands.push(OperandId, "'Decoration Group'"); InstructionDesc[OpGroupDecorate].operands.push(OperandVariableIds, "'Targets'"); @@ -1915,8 +1584,6 @@ InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Size'"); InstructionDesc[OpCopyMemorySized].operands.push(OperandMemoryAccess, "", true); - InstructionDesc[OpCopyMemorySized].capabilities.push_back(CapabilityAddresses); - InstructionDesc[OpSampledImage].operands.push(OperandId, "'Image'"); InstructionDesc[OpSampledImage].operands.push(OperandId, "'Sampler'"); @@ -1937,7 +1604,6 @@ InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSampleImplicitLod].capabilities.push_back(CapabilityShader); InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandId, "'Coordinate'"); @@ -1949,40 +1615,34 @@ InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSampleDrefImplicitLod].capabilities.push_back(CapabilityShader); InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSampleDrefExplicitLod].capabilities.push_back(CapabilityShader); InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSampleProjImplicitLod].capabilities.push_back(CapabilityShader); InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSampleProjExplicitLod].capabilities.push_back(CapabilityShader); InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSampleProjDrefImplicitLod].capabilities.push_back(CapabilityShader); InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSampleProjDrefExplicitLod].capabilities.push_back(CapabilityShader); InstructionDesc[OpImageFetch].operands.push(OperandId, "'Image'"); InstructionDesc[OpImageFetch].operands.push(OperandId, "'Coordinate'"); @@ -1994,122 +1654,96 @@ InstructionDesc[OpImageGather].operands.push(OperandId, "'Component'"); InstructionDesc[OpImageGather].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageGather].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageGather].capabilities.push_back(CapabilityShader); InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'D~ref~'"); InstructionDesc[OpImageDrefGather].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageDrefGather].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageDrefGather].capabilities.push_back(CapabilityShader); InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleImplicitLod].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleExplicitLod].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleDrefImplicitLod].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleDrefExplicitLod].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleProjImplicitLod].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleProjExplicitLod].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageSparseFetch].operands.push(OperandId, "'Image'"); InstructionDesc[OpImageSparseFetch].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSparseFetch].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSparseFetch].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseFetch].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Component'"); InstructionDesc[OpImageSparseGather].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSparseGather].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseGather].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'Sampled Image'"); InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'D~ref~'"); InstructionDesc[OpImageSparseDrefGather].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSparseDrefGather].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseDrefGather].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageSparseRead].operands.push(OperandId, "'Image'"); InstructionDesc[OpImageSparseRead].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpImageSparseRead].operands.push(OperandImageOperands, "", true); InstructionDesc[OpImageSparseRead].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseRead].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageSparseTexelsResident].operands.push(OperandId, "'Resident Code'"); - InstructionDesc[OpImageSparseTexelsResident].capabilities.push_back(CapabilitySparseResidency); InstructionDesc[OpImageQuerySizeLod].operands.push(OperandId, "'Image'"); InstructionDesc[OpImageQuerySizeLod].operands.push(OperandId, "'Level of Detail'"); - InstructionDesc[OpImageQuerySizeLod].capabilities.push_back(CapabilityKernel); - InstructionDesc[OpImageQuerySizeLod].capabilities.push_back(CapabilityImageQuery); InstructionDesc[OpImageQuerySize].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQuerySize].capabilities.push_back(CapabilityKernel); - InstructionDesc[OpImageQuerySize].capabilities.push_back(CapabilityImageQuery); InstructionDesc[OpImageQueryLod].operands.push(OperandId, "'Image'"); InstructionDesc[OpImageQueryLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageQueryLod].capabilities.push_back(CapabilityImageQuery); InstructionDesc[OpImageQueryLevels].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQueryLevels].capabilities.push_back(CapabilityKernel); - InstructionDesc[OpImageQueryLevels].capabilities.push_back(CapabilityImageQuery); InstructionDesc[OpImageQuerySamples].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQuerySamples].capabilities.push_back(CapabilityKernel); - InstructionDesc[OpImageQuerySamples].capabilities.push_back(CapabilityImageQuery); InstructionDesc[OpImageQueryFormat].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQueryFormat].capabilities.push_back(CapabilityKernel); InstructionDesc[OpImageQueryOrder].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQueryOrder].capabilities.push_back(CapabilityKernel); InstructionDesc[OpAccessChain].operands.push(OperandId, "'Base'"); InstructionDesc[OpAccessChain].operands.push(OperandVariableIds, "'Indexes'"); @@ -2120,12 +1754,10 @@ InstructionDesc[OpPtrAccessChain].operands.push(OperandId, "'Base'"); InstructionDesc[OpPtrAccessChain].operands.push(OperandId, "'Element'"); InstructionDesc[OpPtrAccessChain].operands.push(OperandVariableIds, "'Indexes'"); - InstructionDesc[OpPtrAccessChain].capabilities.push_back(CapabilityAddresses); InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandId, "'Base'"); InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandId, "'Element'"); InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandVariableIds, "'Indexes'"); - InstructionDesc[OpInBoundsPtrAccessChain].capabilities.push_back(CapabilityAddresses); InstructionDesc[OpSNegate].operands.push(OperandId, "'Operand'"); @@ -2152,65 +1784,49 @@ InstructionDesc[OpFConvert].operands.push(OperandId, "'Float Value'"); InstructionDesc[OpSatConvertSToU].operands.push(OperandId, "'Signed Value'"); - InstructionDesc[OpSatConvertSToU].capabilities.push_back(CapabilityKernel); InstructionDesc[OpSatConvertUToS].operands.push(OperandId, "'Unsigned Value'"); - InstructionDesc[OpSatConvertUToS].capabilities.push_back(CapabilityKernel); InstructionDesc[OpConvertPtrToU].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpConvertPtrToU].capabilities.push_back(CapabilityAddresses); InstructionDesc[OpConvertUToPtr].operands.push(OperandId, "'Integer Value'"); - InstructionDesc[OpConvertUToPtr].capabilities.push_back(CapabilityAddresses); InstructionDesc[OpPtrCastToGeneric].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpPtrCastToGeneric].capabilities.push_back(CapabilityKernel); InstructionDesc[OpGenericCastToPtr].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpGenericCastToPtr].capabilities.push_back(CapabilityKernel); InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandId, "'Pointer'"); InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandStorage, "'Storage'"); - InstructionDesc[OpGenericCastToPtrExplicit].capabilities.push_back(CapabilityKernel); InstructionDesc[OpGenericPtrMemSemantics].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpGenericPtrMemSemantics].capabilities.push_back(CapabilityKernel); InstructionDesc[OpBitcast].operands.push(OperandId, "'Operand'"); InstructionDesc[OpQuantizeToF16].operands.push(OperandId, "'Value'"); - InstructionDesc[OpTranspose].capabilities.push_back(CapabilityMatrix); InstructionDesc[OpTranspose].operands.push(OperandId, "'Matrix'"); InstructionDesc[OpIsNan].operands.push(OperandId, "'x'"); InstructionDesc[OpIsInf].operands.push(OperandId, "'x'"); - InstructionDesc[OpIsFinite].capabilities.push_back(CapabilityKernel); InstructionDesc[OpIsFinite].operands.push(OperandId, "'x'"); - InstructionDesc[OpIsNormal].capabilities.push_back(CapabilityKernel); InstructionDesc[OpIsNormal].operands.push(OperandId, "'x'"); - InstructionDesc[OpSignBitSet].capabilities.push_back(CapabilityKernel); InstructionDesc[OpSignBitSet].operands.push(OperandId, "'x'"); - InstructionDesc[OpLessOrGreater].capabilities.push_back(CapabilityKernel); InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'x'"); InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'y'"); - InstructionDesc[OpOrdered].capabilities.push_back(CapabilityKernel); InstructionDesc[OpOrdered].operands.push(OperandId, "'x'"); InstructionDesc[OpOrdered].operands.push(OperandId, "'y'"); - InstructionDesc[OpUnordered].capabilities.push_back(CapabilityKernel); InstructionDesc[OpUnordered].operands.push(OperandId, "'x'"); InstructionDesc[OpUnordered].operands.push(OperandId, "'y'"); InstructionDesc[OpArrayLength].operands.push(OperandId, "'Structure'"); InstructionDesc[OpArrayLength].operands.push(OperandLiteralNumber, "'Array member'"); - InstructionDesc[OpArrayLength].capabilities.push_back(CapabilityShader); InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 1'"); InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 2'"); @@ -2257,23 +1873,18 @@ InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Vector'"); InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Scalar'"); - InstructionDesc[OpMatrixTimesScalar].capabilities.push_back(CapabilityMatrix); InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Matrix'"); InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Scalar'"); - InstructionDesc[OpVectorTimesMatrix].capabilities.push_back(CapabilityMatrix); InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Vector'"); InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Matrix'"); - InstructionDesc[OpMatrixTimesVector].capabilities.push_back(CapabilityMatrix); InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Matrix'"); InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpMatrixTimesMatrix].capabilities.push_back(CapabilityMatrix); InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'LeftMatrix'"); InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'RightMatrix'"); - InstructionDesc[OpOuterProduct].capabilities.push_back(CapabilityMatrix); InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 1'"); InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 2'"); @@ -2324,23 +1935,19 @@ InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 1'"); InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpBitFieldInsert].capabilities.push_back(CapabilityShader); InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Base'"); InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Insert'"); InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Offset'"); InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Count'"); - - InstructionDesc[OpBitFieldSExtract].capabilities.push_back(CapabilityShader); + InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Base'"); InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Offset'"); InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Count'"); - InstructionDesc[OpBitFieldUExtract].capabilities.push_back(CapabilityShader); InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Base'"); InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Offset'"); InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Count'"); - InstructionDesc[OpBitReverse].capabilities.push_back(CapabilityShader); InstructionDesc[OpBitReverse].operands.push(OperandId, "'Base'"); InstructionDesc[OpBitCount].operands.push(OperandId, "'Base'"); @@ -2415,42 +2022,27 @@ InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpDPdx].capabilities.push_back(CapabilityShader); InstructionDesc[OpDPdx].operands.push(OperandId, "'P'"); - InstructionDesc[OpDPdy].capabilities.push_back(CapabilityShader); InstructionDesc[OpDPdy].operands.push(OperandId, "'P'"); - InstructionDesc[OpFwidth].capabilities.push_back(CapabilityShader); InstructionDesc[OpFwidth].operands.push(OperandId, "'P'"); - InstructionDesc[OpDPdxFine].capabilities.push_back(CapabilityDerivativeControl); InstructionDesc[OpDPdxFine].operands.push(OperandId, "'P'"); - InstructionDesc[OpDPdyFine].capabilities.push_back(CapabilityDerivativeControl); InstructionDesc[OpDPdyFine].operands.push(OperandId, "'P'"); - InstructionDesc[OpFwidthFine].capabilities.push_back(CapabilityDerivativeControl); InstructionDesc[OpFwidthFine].operands.push(OperandId, "'P'"); - InstructionDesc[OpDPdxCoarse].capabilities.push_back(CapabilityDerivativeControl); InstructionDesc[OpDPdxCoarse].operands.push(OperandId, "'P'"); - InstructionDesc[OpDPdyCoarse].capabilities.push_back(CapabilityDerivativeControl); InstructionDesc[OpDPdyCoarse].operands.push(OperandId, "'P'"); - InstructionDesc[OpFwidthCoarse].capabilities.push_back(CapabilityDerivativeControl); InstructionDesc[OpFwidthCoarse].operands.push(OperandId, "'P'"); - InstructionDesc[OpEmitVertex].capabilities.push_back(CapabilityGeometry); - - InstructionDesc[OpEndPrimitive].capabilities.push_back(CapabilityGeometry); - InstructionDesc[OpEmitStreamVertex].operands.push(OperandId, "'Stream'"); - InstructionDesc[OpEmitStreamVertex].capabilities.push_back(CapabilityGeometryStreams); InstructionDesc[OpEndStreamPrimitive].operands.push(OperandId, "'Stream'"); - InstructionDesc[OpEndStreamPrimitive].capabilities.push_back(CapabilityGeometryStreams); InstructionDesc[OpControlBarrier].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpControlBarrier].operands.push(OperandScope, "'Memory'"); @@ -2490,7 +2082,6 @@ InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandMemorySemantics, "'Unequal'"); InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Value'"); InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Comparator'"); - InstructionDesc[OpAtomicCompareExchangeWeak].capabilities.push_back(CapabilityKernel); InstructionDesc[OpAtomicIIncrement].operands.push(OperandId, "'Pointer'"); InstructionDesc[OpAtomicIIncrement].operands.push(OperandScope, "'Scope'"); @@ -2548,12 +2139,10 @@ InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandId, "'Pointer'"); InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandScope, "'Scope'"); InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicFlagTestAndSet].capabilities.push_back(CapabilityKernel); InstructionDesc[OpAtomicFlagClear].operands.push(OperandId, "'Pointer'"); InstructionDesc[OpAtomicFlagClear].operands.push(OperandScope, "'Scope'"); InstructionDesc[OpAtomicFlagClear].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicFlagClear].capabilities.push_back(CapabilityKernel); InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Merge Block'"); InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Continue Target'"); @@ -2574,19 +2163,15 @@ InstructionDesc[OpSwitch].operands.push(OperandId, "'Default'"); InstructionDesc[OpSwitch].operands.push(OperandVariableLiteralId, "'Target'"); - InstructionDesc[OpKill].capabilities.push_back(CapabilityShader); InstructionDesc[OpReturnValue].operands.push(OperandId, "'Value'"); InstructionDesc[OpLifetimeStart].operands.push(OperandId, "'Pointer'"); InstructionDesc[OpLifetimeStart].operands.push(OperandLiteralNumber, "'Size'"); - InstructionDesc[OpLifetimeStart].capabilities.push_back(CapabilityKernel); InstructionDesc[OpLifetimeStop].operands.push(OperandId, "'Pointer'"); InstructionDesc[OpLifetimeStop].operands.push(OperandLiteralNumber, "'Size'"); - InstructionDesc[OpLifetimeStop].capabilities.push_back(CapabilityKernel); - InstructionDesc[OpGroupAsyncCopy].capabilities.push_back(CapabilityKernel); InstructionDesc[OpGroupAsyncCopy].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Destination'"); InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Source'"); @@ -2594,77 +2179,62 @@ InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Stride'"); InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Event'"); - InstructionDesc[OpGroupWaitEvents].capabilities.push_back(CapabilityKernel); InstructionDesc[OpGroupWaitEvents].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupWaitEvents].operands.push(OperandId, "'Num Events'"); InstructionDesc[OpGroupWaitEvents].operands.push(OperandId, "'Events List'"); - InstructionDesc[OpGroupAll].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupAll].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupAll].operands.push(OperandId, "'Predicate'"); - InstructionDesc[OpGroupAny].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupAny].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupAny].operands.push(OperandId, "'Predicate'"); - InstructionDesc[OpGroupBroadcast].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupBroadcast].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'Value'"); InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'LocalId'"); - InstructionDesc[OpGroupIAdd].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupIAdd].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupIAdd].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupIAdd].operands.push(OperandId, "'X'"); - InstructionDesc[OpGroupFAdd].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupFAdd].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupFAdd].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupFAdd].operands.push(OperandId, "'X'"); - InstructionDesc[OpGroupUMin].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupUMin].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupUMin].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupUMin].operands.push(OperandId, "'X'"); - InstructionDesc[OpGroupSMin].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupSMin].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupSMin].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupSMin].operands.push(OperandId, "X"); - InstructionDesc[OpGroupFMin].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupFMin].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupFMin].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupFMin].operands.push(OperandId, "X"); - InstructionDesc[OpGroupUMax].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupUMax].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupUMax].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupUMax].operands.push(OperandId, "X"); - InstructionDesc[OpGroupSMax].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupSMax].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupSMax].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupSMax].operands.push(OperandId, "X"); - InstructionDesc[OpGroupFMax].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupFMax].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupFMax].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupFMax].operands.push(OperandId, "X"); - InstructionDesc[OpReadPipe].capabilities.push_back(CapabilityPipes); InstructionDesc[OpReadPipe].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpReadPipe].operands.push(OperandId, "'Pointer'"); InstructionDesc[OpReadPipe].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpReadPipe].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpWritePipe].capabilities.push_back(CapabilityPipes); InstructionDesc[OpWritePipe].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpWritePipe].operands.push(OperandId, "'Pointer'"); InstructionDesc[OpWritePipe].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpWritePipe].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpReservedReadPipe].capabilities.push_back(CapabilityPipes); InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Reserve Id'"); InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Index'"); @@ -2672,7 +2242,6 @@ InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpReservedWritePipe].capabilities.push_back(CapabilityPipes); InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Reserve Id'"); InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Index'"); @@ -2680,127 +2249,99 @@ InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpReserveReadPipePackets].capabilities.push_back(CapabilityPipes); InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Num Packets'"); InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpReserveWritePipePackets].capabilities.push_back(CapabilityPipes); InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Num Packets'"); InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpCommitReadPipe].capabilities.push_back(CapabilityPipes); InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Reserve Id'"); InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpCommitWritePipe].capabilities.push_back(CapabilityPipes); InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Reserve Id'"); InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpIsValidReserveId].capabilities.push_back(CapabilityPipes); InstructionDesc[OpIsValidReserveId].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpGetNumPipePackets].capabilities.push_back(CapabilityPipes); InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpGetMaxPipePackets].capabilities.push_back(CapabilityPipes); InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpGroupReserveReadPipePackets].capabilities.push_back(CapabilityPipes); InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Num Packets'"); InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpGroupReserveWritePipePackets].capabilities.push_back(CapabilityPipes); InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Num Packets'"); InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpGroupCommitReadPipe].capabilities.push_back(CapabilityPipes); InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Reserve Id'"); InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpGroupCommitWritePipe].capabilities.push_back(CapabilityPipes); InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Pipe'"); InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Reserve Id'"); InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Packet Size'"); InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Packet Alignment'"); - InstructionDesc[OpBuildNDRange].capabilities.push_back(CapabilityDeviceEnqueue); InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkSize'"); InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'LocalWorkSize'"); InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkOffset'"); - InstructionDesc[OpGetDefaultQueue].capabilities.push_back(CapabilityDeviceEnqueue); - - InstructionDesc[OpCaptureEventProfilingInfo].capabilities.push_back(CapabilityDeviceEnqueue); - InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Event'"); InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Profiling Info'"); InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Value'"); - InstructionDesc[OpSetUserEventStatus].capabilities.push_back(CapabilityDeviceEnqueue); - InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'Event'"); InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'Status'"); - InstructionDesc[OpIsValidEvent].capabilities.push_back(CapabilityDeviceEnqueue); InstructionDesc[OpIsValidEvent].operands.push(OperandId, "'Event'"); - InstructionDesc[OpCreateUserEvent].capabilities.push_back(CapabilityDeviceEnqueue); - - InstructionDesc[OpRetainEvent].capabilities.push_back(CapabilityDeviceEnqueue); InstructionDesc[OpRetainEvent].operands.push(OperandId, "'Event'"); - InstructionDesc[OpReleaseEvent].capabilities.push_back(CapabilityDeviceEnqueue); InstructionDesc[OpReleaseEvent].operands.push(OperandId, "'Event'"); - InstructionDesc[OpGetKernelWorkGroupSize].capabilities.push_back(CapabilityDeviceEnqueue); InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Invoke'"); InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param'"); InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param Size'"); InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param Align'"); - InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].capabilities.push_back(CapabilityDeviceEnqueue); InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Invoke'"); InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param'"); InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param Size'"); InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param Align'"); - InstructionDesc[OpGetKernelNDrangeSubGroupCount].capabilities.push_back(CapabilityDeviceEnqueue); InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'ND Range'"); InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Invoke'"); InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param'"); InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param Size'"); InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param Align'"); - InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].capabilities.push_back(CapabilityDeviceEnqueue); InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'ND Range'"); InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Invoke'"); InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param'"); InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param Size'"); InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param Align'"); - InstructionDesc[OpEnqueueKernel].capabilities.push_back(CapabilityDeviceEnqueue); InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Queue'"); InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Flags'"); InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'ND Range'"); @@ -2813,82 +2354,215 @@ InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param Align'"); InstructionDesc[OpEnqueueKernel].operands.push(OperandVariableIds, "'Local Size'"); - InstructionDesc[OpEnqueueMarker].capabilities.push_back(CapabilityDeviceEnqueue); InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Queue'"); InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Num Events'"); InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Wait Events'"); InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Ret Event'"); + InstructionDesc[OpGroupNonUniformElect].operands.push(OperandScope, "'Execution'"); + + InstructionDesc[OpGroupNonUniformAll].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformAll].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformAny].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformAny].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformAllEqual].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformAllEqual].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandId, "ID"); + + InstructionDesc[OpGroupNonUniformBroadcastFirst].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBroadcastFirst].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBallot].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallot].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformInverseBallot].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformInverseBallot].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandId, "Bit"); + + InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBallotFindLSB].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallotFindLSB].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBallotFindMSB].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallotFindMSB].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandId, "'Id'"); + + InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandId, "Mask"); + + InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandId, "Offset"); + + InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandId, "Offset"); + + InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandId, "'Id'"); + + InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandLiteralNumber, "'Direction'"); + InstructionDesc[OpSubgroupBallotKHR].operands.push(OperandId, "'Predicate'"); InstructionDesc[OpSubgroupFirstInvocationKHR].operands.push(OperandId, "'Value'"); - InstructionDesc[OpSubgroupAnyKHR].capabilities.push_back(CapabilitySubgroupVoteKHR); InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandId, "'Predicate'"); - InstructionDesc[OpSubgroupAllKHR].capabilities.push_back(CapabilitySubgroupVoteKHR); InstructionDesc[OpSubgroupAllKHR].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpSubgroupAllKHR].operands.push(OperandId, "'Predicate'"); - InstructionDesc[OpSubgroupAllEqualKHR].capabilities.push_back(CapabilitySubgroupVoteKHR); InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandId, "'Predicate'"); - InstructionDesc[OpSubgroupReadInvocationKHR].capabilities.push_back(CapabilityGroups); InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Value'"); InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Index'"); + InstructionDesc[OpModuleProcessed].operands.push(OperandLiteralString, "'process'"); + #ifdef AMD_EXTENSIONS - InstructionDesc[OpGroupIAddNonUniformAMD].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandId, "'X'"); - InstructionDesc[OpGroupFAddNonUniformAMD].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandId, "'X'"); - InstructionDesc[OpGroupUMinNonUniformAMD].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandId, "'X'"); - InstructionDesc[OpGroupSMinNonUniformAMD].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandId, "X"); - InstructionDesc[OpGroupFMinNonUniformAMD].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandId, "X"); - InstructionDesc[OpGroupUMaxNonUniformAMD].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandId, "X"); - InstructionDesc[OpGroupSMaxNonUniformAMD].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandId, "X"); - InstructionDesc[OpGroupFMaxNonUniformAMD].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandId, "X"); - InstructionDesc[OpFragmentMaskFetchAMD].capabilities.push_back(CapabilityFragmentMaskAMD); InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Image'"); InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpFragmentFetchAMD].capabilities.push_back(CapabilityFragmentMaskAMD); InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Image'"); InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Coordinate'"); InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Fragment Index'"); #endif + +#ifdef NV_EXTENSIONS + InstructionDesc[OpGroupNonUniformPartitionNV].operands.push(OperandId, "X"); +#endif } }; // end spv namespace diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/doc.h vulkan-1.1.73+dfsg/external/glslang/SPIRV/doc.h --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/doc.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/doc.h 2018-04-27 11:46:26.000000000 +0000 @@ -190,7 +190,6 @@ class EnumParameters { public: EnumParameters() : desc(0) { } - EnumCaps caps; const char* desc; }; @@ -235,7 +234,6 @@ bool hasType() const { return typePresent != 0; } const char* opDesc; - EnumCaps capabilities; OpcodeClass opClass; OperandParameters operands; @@ -244,8 +242,6 @@ int resultPresent : 1; }; -const int OpcodeCeiling = 321; - // The set of objects that hold all the instruction/operand // parameterization information. extern InstructionParameters InstructionDesc[]; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/GlslangToSpv.cpp vulkan-1.1.73+dfsg/external/glslang/SPIRV/GlslangToSpv.cpp --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/GlslangToSpv.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/GlslangToSpv.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2014-2016 LunarG, Inc. // Copyright (C) 2015-2016 Google, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -53,13 +54,12 @@ #endif } -#ifdef ENABLE_OPT +#if ENABLE_OPT #include "spirv-tools/optimizer.hpp" #include "message.h" - #include "SPVRemapper.h" #endif -#ifdef ENABLE_OPT +#if ENABLE_OPT using namespace spvtools; #endif @@ -98,7 +98,14 @@ spv::Builder* builder_; bool previous_flag_; }; -} + +struct OpDecorations { + spv::Decoration precision; + spv::Decoration noContraction; + spv::Decoration nonUniform; +}; + +} // namespace // // The main holder of information for translating glslang to SPIR-V. @@ -125,21 +132,27 @@ void dumpSpv(std::vector& out); protected: + TGlslangToSpvTraverser(TGlslangToSpvTraverser&); + TGlslangToSpvTraverser& operator=(TGlslangToSpvTraverser&); + spv::Decoration TranslateInterpolationDecoration(const glslang::TQualifier& qualifier); spv::Decoration TranslateAuxiliaryStorageDecoration(const glslang::TQualifier& qualifier); + spv::Decoration TranslateNonUniformDecoration(const glslang::TQualifier& qualifier); spv::BuiltIn TranslateBuiltInDecoration(glslang::TBuiltInVariable, bool memberDeclaration); spv::ImageFormat TranslateImageFormat(const glslang::TType& type); spv::SelectionControlMask TranslateSelectionControl(const glslang::TIntermSelection&) const; spv::SelectionControlMask TranslateSwitchControl(const glslang::TIntermSwitch&) const; spv::LoopControlMask TranslateLoopControl(const glslang::TIntermLoop&, unsigned int& dependencyLength) const; spv::StorageClass TranslateStorageClass(const glslang::TType&); + void addIndirectionIndexCapabilities(const glslang::TType& baseType, const glslang::TType& indexType); spv::Id createSpvVariable(const glslang::TIntermSymbol*); spv::Id getSampledType(const glslang::TSampler&); spv::Id getInvertedSwizzleType(const glslang::TIntermTyped&); spv::Id createInvertedSwizzle(spv::Decoration precision, const glslang::TIntermTyped&, spv::Id parentResult); void convertSwizzle(const glslang::TIntermAggregate&, std::vector& swizzle); spv::Id convertGlslangToSpvType(const glslang::TType& type); - spv::Id convertGlslangToSpvType(const glslang::TType& type, glslang::TLayoutPacking, const glslang::TQualifier&); + spv::Id convertGlslangToSpvType(const glslang::TType& type, glslang::TLayoutPacking, const glslang::TQualifier&, + bool lastBufferBlockMember); bool filterMember(const glslang::TType& member); spv::Id convertGlslangStructToSpvType(const glslang::TType&, const glslang::TTypeList* glslangStruct, glslang::TLayoutPacking, const glslang::TQualifier&); @@ -152,7 +165,8 @@ glslang::TLayoutPacking getExplicitLayout(const glslang::TType& type) const; int getArrayStride(const glslang::TType& arrayType, glslang::TLayoutPacking, glslang::TLayoutMatrix); int getMatrixStride(const glslang::TType& matrixType, glslang::TLayoutPacking, glslang::TLayoutMatrix); - void updateMemberOffset(const glslang::TType& structType, const glslang::TType& memberType, int& currentOffset, int& nextOffset, glslang::TLayoutPacking, glslang::TLayoutMatrix); + void updateMemberOffset(const glslang::TType& structType, const glslang::TType& memberType, int& currentOffset, + int& nextOffset, glslang::TLayoutPacking, glslang::TLayoutMatrix); void declareUseOfStructMember(const glslang::TTypeList& members, int glslangMember); bool isShaderEntryPoint(const glslang::TIntermAggregate* node); @@ -167,22 +181,24 @@ spv::Id createImageTextureFunctionCall(glslang::TIntermOperator* node); spv::Id handleUserFunctionCall(const glslang::TIntermAggregate*); - spv::Id createBinaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id left, spv::Id right, glslang::TBasicType typeProxy, bool reduceComparison = true); - spv::Id createBinaryMatrixOperation(spv::Op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id left, spv::Id right); - spv::Id createUnaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand,glslang::TBasicType typeProxy); - spv::Id createUnaryMatrixOperation(spv::Op op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand,glslang::TBasicType typeProxy); - spv::Id createConversion(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id destTypeId, spv::Id operand, glslang::TBasicType typeProxy); + spv::Id createBinaryOperation(glslang::TOperator op, OpDecorations&, spv::Id typeId, spv::Id left, spv::Id right, + glslang::TBasicType typeProxy, bool reduceComparison = true); + spv::Id createBinaryMatrixOperation(spv::Op, OpDecorations&, spv::Id typeId, spv::Id left, spv::Id right); + spv::Id createUnaryOperation(glslang::TOperator op, OpDecorations&, spv::Id typeId, spv::Id operand, + glslang::TBasicType typeProxy); + spv::Id createUnaryMatrixOperation(spv::Op op, OpDecorations&, spv::Id typeId, spv::Id operand, + glslang::TBasicType typeProxy); + spv::Id createConversion(glslang::TOperator op, OpDecorations&, spv::Id destTypeId, spv::Id operand, + glslang::TBasicType typeProxy); + spv::Id createConversionOperation(glslang::TOperator op, spv::Id operand, int vectorSize); spv::Id makeSmearedConstant(spv::Id constant, int vectorSize); spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy); spv::Id createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy); spv::Id CreateInvocationsVectorOperation(spv::Op op, spv::GroupOperation groupOperation, spv::Id typeId, std::vector& operands); + spv::Id createSubgroupOperation(glslang::TOperator op, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy); spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy); spv::Id createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId); spv::Id getSymbolId(const glslang::TIntermSymbol* node); - void addDecoration(spv::Id id, spv::Decoration dec); - void addDecoration(spv::Id id, spv::Decoration dec, unsigned value); - void addMemberDecoration(spv::Id id, int member, spv::Decoration dec); - void addMemberDecoration(spv::Id id, int member, spv::Decoration dec, unsigned value); spv::Id createSpvConstant(const glslang::TIntermTyped&); spv::Id createSpvConstantFromConstUnionArray(const glslang::TType& type, const glslang::TConstUnionArray&, int& nextConst, bool specConstant); bool isTrivialLeaf(const glslang::TIntermTyped* node); @@ -191,6 +207,11 @@ #ifdef AMD_EXTENSIONS spv::Id getExtBuiltins(const char* name); #endif + void addPre13Extension(const char* ext) + { + if (builder.getSpvVersion() < glslang::EShTargetSpv_1_3) + builder.addExtension(ext); + } glslang::SpvOptions& options; spv::Function* shaderEntry; @@ -214,8 +235,10 @@ std::unordered_set rValueParameters; // set of formal function parameters passed as rValues, rather than a pointer std::unordered_map functionMap; std::unordered_map structMap[glslang::ElpCount][glslang::ElmCount]; - std::unordered_map > memberRemapper; // for mapping glslang block indices to spv indices (e.g., due to hidden members) + // for mapping glslang block indices to spv indices (e.g., due to hidden members): + std::unordered_map > memberRemapper; std::stack breakForLoop; // false means break for switch + std::unordered_map counterOriginator; }; // @@ -423,6 +446,17 @@ return spv::DecorationMax; } +// If glslang type is nonUniform, return SPIR-V NonUniform decoration. +spv::Decoration TGlslangToSpvTraverser::TranslateNonUniformDecoration(const glslang::TQualifier& qualifier) +{ + if (qualifier.isNonUniform()) { + builder.addExtension("SPV_EXT_descriptor_indexing"); + builder.addCapability(spv::CapabilityShaderNonUniformEXT); + return spv::DecorationNonUniformEXT; + } else + return spv::DecorationMax; +} + // Translate a glslang built-in variable to a SPIR-V built in decoration. Also generate // associated capabilities when required. For some built-in variables, a capability // is generated only when using the variable in an executable instruction, but not when @@ -504,17 +538,17 @@ case glslang::EbvInstanceIndex: return spv::BuiltInInstanceIndex; case glslang::EbvBaseVertex: - builder.addExtension(spv::E_SPV_KHR_shader_draw_parameters); + addPre13Extension(spv::E_SPV_KHR_shader_draw_parameters); builder.addCapability(spv::CapabilityDrawParameters); return spv::BuiltInBaseVertex; case glslang::EbvBaseInstance: - builder.addExtension(spv::E_SPV_KHR_shader_draw_parameters); + addPre13Extension(spv::E_SPV_KHR_shader_draw_parameters); builder.addCapability(spv::CapabilityDrawParameters); return spv::BuiltInBaseInstance; case glslang::EbvDrawId: - builder.addExtension(spv::E_SPV_KHR_shader_draw_parameters); + addPre13Extension(spv::E_SPV_KHR_shader_draw_parameters); builder.addCapability(spv::CapabilityDrawParameters); return spv::BuiltInDrawIndex; @@ -580,6 +614,46 @@ builder.addCapability(spv::CapabilitySubgroupBallotKHR); return spv::BuiltInSubgroupLtMaskKHR; + case glslang::EbvNumSubgroups: + builder.addCapability(spv::CapabilityGroupNonUniform); + return spv::BuiltInNumSubgroups; + + case glslang::EbvSubgroupID: + builder.addCapability(spv::CapabilityGroupNonUniform); + return spv::BuiltInSubgroupId; + + case glslang::EbvSubgroupSize2: + builder.addCapability(spv::CapabilityGroupNonUniform); + return spv::BuiltInSubgroupSize; + + case glslang::EbvSubgroupInvocation2: + builder.addCapability(spv::CapabilityGroupNonUniform); + return spv::BuiltInSubgroupLocalInvocationId; + + case glslang::EbvSubgroupEqMask2: + builder.addCapability(spv::CapabilityGroupNonUniform); + builder.addCapability(spv::CapabilityGroupNonUniformBallot); + return spv::BuiltInSubgroupEqMask; + + case glslang::EbvSubgroupGeMask2: + builder.addCapability(spv::CapabilityGroupNonUniform); + builder.addCapability(spv::CapabilityGroupNonUniformBallot); + return spv::BuiltInSubgroupGeMask; + + case glslang::EbvSubgroupGtMask2: + builder.addCapability(spv::CapabilityGroupNonUniform); + builder.addCapability(spv::CapabilityGroupNonUniformBallot); + return spv::BuiltInSubgroupGtMask; + + case glslang::EbvSubgroupLeMask2: + builder.addCapability(spv::CapabilityGroupNonUniform); + builder.addCapability(spv::CapabilityGroupNonUniformBallot); + return spv::BuiltInSubgroupLeMask; + + case glslang::EbvSubgroupLtMask2: + builder.addCapability(spv::CapabilityGroupNonUniform); + builder.addCapability(spv::CapabilityGroupNonUniformBallot); + return spv::BuiltInSubgroupLtMask; #ifdef AMD_EXTENSIONS case glslang::EbvBaryCoordNoPersp: builder.addExtension(spv::E_SPV_AMD_shader_explicit_vertex_parameter); @@ -611,12 +685,12 @@ #endif case glslang::EbvDeviceIndex: - builder.addExtension(spv::E_SPV_KHR_device_group); + addPre13Extension(spv::E_SPV_KHR_device_group); builder.addCapability(spv::CapabilityDeviceGroup); return spv::BuiltInDeviceIndex; case glslang::EbvViewIndex: - builder.addExtension(spv::E_SPV_KHR_multiview); + addPre13Extension(spv::E_SPV_KHR_multiview); builder.addCapability(spv::CapabilityMultiView); return spv::BuiltInViewIndex; @@ -777,7 +851,7 @@ control = control | spv::LoopControlDontUnrollMask; if (loopNode.getUnroll()) control = control | spv::LoopControlUnrollMask; - if (loopNode.getLoopDependency() == glslang::TIntermLoop::dependencyInfinite) + if (unsigned(loopNode.getLoopDependency()) == glslang::TIntermLoop::dependencyInfinite) control = control | spv::LoopControlDependencyInfiniteMask; else if (loopNode.getLoopDependency() > 0) { control = control | spv::LoopControlDependencyLengthMask; @@ -804,7 +878,7 @@ } if (glslangIntermediate->usingStorageBuffer() && type.getQualifier().storage == glslang::EvqBuffer) { - builder.addExtension(spv::E_SPV_KHR_storage_buffer_storage_class); + addPre13Extension(spv::E_SPV_KHR_storage_buffer_storage_class); return spv::StorageClassStorageBuffer; } @@ -829,6 +903,42 @@ return spv::StorageClassFunction; } +// Add capabilities pertaining to how an array is indexed. +void TGlslangToSpvTraverser::addIndirectionIndexCapabilities(const glslang::TType& baseType, + const glslang::TType& indexType) +{ + if (indexType.getQualifier().isNonUniform()) { + // deal with an asserted non-uniform index + if (baseType.getBasicType() == glslang::EbtSampler) { + if (baseType.getQualifier().hasAttachment()) + builder.addCapability(spv::CapabilityInputAttachmentArrayNonUniformIndexingEXT); + else if (baseType.isImage() && baseType.getSampler().dim == glslang::EsdBuffer) + builder.addCapability(spv::CapabilityStorageTexelBufferArrayNonUniformIndexingEXT); + else if (baseType.isTexture() && baseType.getSampler().dim == glslang::EsdBuffer) + builder.addCapability(spv::CapabilityUniformTexelBufferArrayNonUniformIndexingEXT); + else if (baseType.isImage()) + builder.addCapability(spv::CapabilityStorageImageArrayNonUniformIndexingEXT); + else if (baseType.isTexture()) + builder.addCapability(spv::CapabilitySampledImageArrayNonUniformIndexingEXT); + } else if (baseType.getBasicType() == glslang::EbtBlock) { + if (baseType.getQualifier().storage == glslang::EvqBuffer) + builder.addCapability(spv::CapabilityStorageBufferArrayNonUniformIndexingEXT); + else if (baseType.getQualifier().storage == glslang::EvqUniform) + builder.addCapability(spv::CapabilityUniformBufferArrayNonUniformIndexingEXT); + } + } else { + // assume a dynamically uniform index + if (baseType.getBasicType() == glslang::EbtSampler) { + if (baseType.getQualifier().hasAttachment()) + builder.addCapability(spv::CapabilityInputAttachmentArrayDynamicIndexingEXT); + else if (baseType.isImage() && baseType.getSampler().dim == glslang::EsdBuffer) + builder.addCapability(spv::CapabilityStorageTexelBufferArrayDynamicIndexingEXT); + else if (baseType.isTexture() && baseType.getSampler().dim == glslang::EsdBuffer) + builder.addCapability(spv::CapabilityUniformTexelBufferArrayDynamicIndexingEXT); + } + } +} + // Return whether or not the given type is something that should be tied to a // descriptor set. bool IsDescriptorResource(const glslang::TType& type) @@ -1147,6 +1257,38 @@ else builder.setAccessChainLValue(id); } + + // Process linkage-only nodes for any special additional interface work. + if (linkageOnly) { + if (glslangIntermediate->getHlslFunctionality1()) { + // Map implicit counter buffers to their originating buffers, which should have been + // seen by now, given earlier pruning of unused counters, and preservation of order + // of declaration. + if (symbol->getType().getQualifier().isUniformOrBuffer()) { + if (!glslangIntermediate->hasCounterBufferName(symbol->getName())) { + // Save possible originating buffers for counter buffers, keyed by + // making the potential counter-buffer name. + std::string keyName = symbol->getName().c_str(); + keyName = glslangIntermediate->addCounterBufferName(keyName); + counterOriginator[keyName] = symbol; + } else { + // Handle a counter buffer, by finding the saved originating buffer. + std::string keyName = symbol->getName().c_str(); + auto it = counterOriginator.find(keyName); + if (it != counterOriginator.end()) { + id = getSymbolId(it->second); + if (id != spv::NoResult) { + spv::Id counterId = getSymbolId(symbol); + if (counterId != spv::NoResult) { + builder.addExtension("SPV_GOOGLE_hlsl_functionality1"); + builder.addDecorationId(id, spv::DecorationHlslCounterBufferGOOGLE, counterId); + } + } + } + } + } + } + } } bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::TIntermBinary* node) @@ -1195,8 +1337,10 @@ spv::Id leftRValue = accessChainLoad(node->getLeft()->getType()); // do the operation - rValue = createBinaryOperation(node->getOp(), TranslatePrecisionDecoration(node->getOperationPrecision()), - TranslateNoContractionDecoration(node->getType().getQualifier()), + OpDecorations decorations = { TranslatePrecisionDecoration(node->getOperationPrecision()), + TranslateNoContractionDecoration(node->getType().getQualifier()), + TranslateNonUniformDecoration(node->getType().getQualifier()) }; + rValue = createBinaryOperation(node->getOp(), decorations, convertGlslangToSpvType(node->getType()), leftRValue, rValue, node->getType().getBasicType()); @@ -1271,6 +1415,8 @@ node->getRight()->traverse(this); spv::Id index = accessChainLoad(node->getRight()->getType()); + addIndirectionIndexCapabilities(node->getLeft()->getType(), node->getRight()->getType()); + // restore the saved access chain builder.setAccessChain(partial); @@ -1323,8 +1469,10 @@ spv::Id right = accessChainLoad(node->getRight()->getType()); // get result - spv::Id result = createBinaryOperation(node->getOp(), TranslatePrecisionDecoration(node->getOperationPrecision()), - TranslateNoContractionDecoration(node->getType().getQualifier()), + OpDecorations decorations = { TranslatePrecisionDecoration(node->getOperationPrecision()), + TranslateNoContractionDecoration(node->getType().getQualifier()), + TranslateNonUniformDecoration(node->getType().getQualifier()) }; + spv::Id result = createBinaryOperation(node->getOp(), decorations, convertGlslangToSpvType(node->getType()), left, right, node->getLeft()->getType().getBasicType()); @@ -1362,10 +1510,15 @@ if (node->getOp() == glslang::EOpArrayLength) { // Quite special; won't want to evaluate the operand. + // Currently, the front-end does not allow .length() on an array until it is sized, + // except for the last block membeor of an SSBO. + // TODO: If this changes, link-time sized arrays might show up here, and need their + // size extracted. + // Normal .length() would have been constant folded by the front-end. // So, this has to be block.lastMember.length(). // SPV wants "block" and member number as the operands, go get them. - assert(node->getOperand()->getType().isRuntimeSizedArray()); + glslang::TIntermTyped* block = node->getOperand()->getAsBinaryNode()->getLeft(); block->traverse(this); unsigned int member = node->getOperand()->getAsBinaryNode()->getRight()->getAsConstantUnion()->getConstArray()[0].getUConst(); @@ -1402,20 +1555,23 @@ else operand = accessChainLoad(node->getOperand()->getType()); - spv::Decoration precision = TranslatePrecisionDecoration(node->getOperationPrecision()); - spv::Decoration noContraction = TranslateNoContractionDecoration(node->getType().getQualifier()); + OpDecorations decorations = { TranslatePrecisionDecoration(node->getOperationPrecision()), + TranslateNoContractionDecoration(node->getType().getQualifier()), + TranslateNonUniformDecoration(node->getType().getQualifier()) }; // it could be a conversion if (! result) - result = createConversion(node->getOp(), precision, noContraction, resultType(), operand, node->getOperand()->getBasicType()); + result = createConversion(node->getOp(), decorations, resultType(), operand, node->getOperand()->getBasicType()); // if not, then possibly an operation if (! result) - result = createUnaryOperation(node->getOp(), precision, noContraction, resultType(), operand, node->getOperand()->getBasicType()); + result = createUnaryOperation(node->getOp(), decorations, resultType(), operand, node->getOperand()->getBasicType()); if (result) { - if (invertedType) - result = createInvertedSwizzle(precision, *node->getOperand(), result); + if (invertedType) { + result = createInvertedSwizzle(decorations.precision, *node->getOperand(), result); + builder.addDecoration(result, decorations.nonUniform); + } builder.clearAccessChain(); builder.setAccessChainRValue(result); @@ -1436,16 +1592,14 @@ one = builder.makeFloatConstant(1.0F); else if (node->getBasicType() == glslang::EbtDouble) one = builder.makeDoubleConstant(1.0); -#ifdef AMD_EXTENSIONS else if (node->getBasicType() == glslang::EbtFloat16) one = builder.makeFloat16Constant(1.0F); -#endif - else if (node->getBasicType() == glslang::EbtInt64 || node->getBasicType() == glslang::EbtUint64) - one = builder.makeInt64Constant(1); -#ifdef AMD_EXTENSIONS + else if (node->getBasicType() == glslang::EbtInt8 || node->getBasicType() == glslang::EbtUint8) + one = builder.makeInt8Constant(1); else if (node->getBasicType() == glslang::EbtInt16 || node->getBasicType() == glslang::EbtUint16) one = builder.makeInt16Constant(1); -#endif + else if (node->getBasicType() == glslang::EbtInt64 || node->getBasicType() == glslang::EbtUint64) + one = builder.makeInt64Constant(1); else one = builder.makeIntConstant(1); glslang::TOperator op; @@ -1455,8 +1609,7 @@ else op = glslang::EOpSub; - spv::Id result = createBinaryOperation(op, precision, - TranslateNoContractionDecoration(node->getType().getQualifier()), + spv::Id result = createBinaryOperation(op, decorations, convertGlslangToSpvType(node->getType()), operand, one, node->getType().getBasicType()); assert(result != spv::NoResult); @@ -1650,7 +1803,6 @@ case glslang::EOpConstructBMat4x2: case glslang::EOpConstructBMat4x3: case glslang::EOpConstructBMat4x4: -#ifdef AMD_EXTENSIONS case glslang::EOpConstructF16Mat2x2: case glslang::EOpConstructF16Mat2x3: case glslang::EOpConstructF16Mat2x4: @@ -1660,7 +1812,6 @@ case glslang::EOpConstructF16Mat4x2: case glslang::EOpConstructF16Mat4x3: case glslang::EOpConstructF16Mat4x4: -#endif isMatrix = true; // fall through case glslang::EOpConstructFloat: @@ -1671,16 +1822,30 @@ case glslang::EOpConstructDVec2: case glslang::EOpConstructDVec3: case glslang::EOpConstructDVec4: -#ifdef AMD_EXTENSIONS case glslang::EOpConstructFloat16: case glslang::EOpConstructF16Vec2: case glslang::EOpConstructF16Vec3: case glslang::EOpConstructF16Vec4: -#endif case glslang::EOpConstructBool: case glslang::EOpConstructBVec2: case glslang::EOpConstructBVec3: case glslang::EOpConstructBVec4: + case glslang::EOpConstructInt8: + case glslang::EOpConstructI8Vec2: + case glslang::EOpConstructI8Vec3: + case glslang::EOpConstructI8Vec4: + case glslang::EOpConstructUint8: + case glslang::EOpConstructU8Vec2: + case glslang::EOpConstructU8Vec3: + case glslang::EOpConstructU8Vec4: + case glslang::EOpConstructInt16: + case glslang::EOpConstructI16Vec2: + case glslang::EOpConstructI16Vec3: + case glslang::EOpConstructI16Vec4: + case glslang::EOpConstructUint16: + case glslang::EOpConstructU16Vec2: + case glslang::EOpConstructU16Vec3: + case glslang::EOpConstructU16Vec4: case glslang::EOpConstructInt: case glslang::EOpConstructIVec2: case glslang::EOpConstructIVec3: @@ -1697,16 +1862,6 @@ case glslang::EOpConstructU64Vec2: case glslang::EOpConstructU64Vec3: case glslang::EOpConstructU64Vec4: -#ifdef AMD_EXTENSIONS - case glslang::EOpConstructInt16: - case glslang::EOpConstructI16Vec2: - case glslang::EOpConstructI16Vec3: - case glslang::EOpConstructI16Vec4: - case glslang::EOpConstructUint16: - case glslang::EOpConstructU16Vec2: - case glslang::EOpConstructU16Vec3: - case glslang::EOpConstructU16Vec4: -#endif case glslang::EOpConstructStruct: case glslang::EOpConstructTextureSampler: { @@ -1787,6 +1942,11 @@ case glslang::EOpDeviceMemoryBarrierWithGroupSync: case glslang::EOpWorkgroupMemoryBarrier: case glslang::EOpWorkgroupMemoryBarrierWithGroupSync: + case glslang::EOpSubgroupBarrier: + case glslang::EOpSubgroupMemoryBarrier: + case glslang::EOpSubgroupMemoryBarrierBuffer: + case glslang::EOpSubgroupMemoryBarrierImage: + case glslang::EOpSubgroupMemoryBarrierShared: noReturnValue = true; // These all have 0 operands and will naturally finish up in the code below for 0 operands break; @@ -1837,7 +1997,10 @@ spv::Id rightId = accessChainLoad(right->getType()); builder.setLine(node->getLoc().line); - result = createBinaryOperation(binOp, precision, TranslateNoContractionDecoration(node->getType().getQualifier()), + OpDecorations decorations = { precision, + TranslateNoContractionDecoration(node->getType().getQualifier()), + TranslateNonUniformDecoration(node->getType().getQualifier()) }; + result = createBinaryOperation(binOp, decorations, resultType(), leftId, rightId, left->getType().getBasicType(), reduceComparison); @@ -1935,11 +2098,15 @@ result = createNoArgOperation(node->getOp(), precision, resultType()); break; case 1: - result = createUnaryOperation( - node->getOp(), precision, - TranslateNoContractionDecoration(node->getType().getQualifier()), - resultType(), operands.front(), - glslangOperands[0]->getAsTyped()->getBasicType()); + { + OpDecorations decorations = { precision, + TranslateNoContractionDecoration(node->getType().getQualifier()), + TranslateNonUniformDecoration(node->getType().getQualifier()) }; + result = createUnaryOperation( + node->getOp(), decorations, + resultType(), operands.front(), + glslangOperands[0]->getAsTyped()->getBasicType()); + } break; default: result = createMiscOperation(node->getOp(), precision, resultType(), operands, node->getBasicType()); @@ -1973,18 +2140,29 @@ // next layer copies r-values into memory to use the access-chain mechanism bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang::TIntermSelection* node) { - // See if it simple and safe to generate OpSelect instead of using control flow. - // Crucially, side effects must be avoided, and there are performance trade-offs. - // Return true if good idea (and safe) for OpSelect, false otherwise. - const auto selectPolicy = [&]() -> bool { - if ((!node->getType().isScalar() && !node->getType().isVector()) || - node->getBasicType() == glslang::EbtVoid) - return false; - + // See if it simple and safe, or required, to execute both sides. + // Crucially, side effects must be either semantically required or avoided, + // and there are performance trade-offs. + // Return true if required or a good idea (and safe) to execute both sides, + // false otherwise. + const auto bothSidesPolicy = [&]() -> bool { + // do we have both sides? if (node->getTrueBlock() == nullptr || node->getFalseBlock() == nullptr) return false; + // required? (unless we write additional code to look for side effects + // and make performance trade-offs if none are present) + if (!node->getShortCircuit()) + return true; + + // if not required to execute both, decide based on performance/practicality... + + // see if OpSelect can handle it + if ((!node->getType().isScalar() && !node->getType().isVector()) || + node->getBasicType() == glslang::EbtVoid) + return false; + assert(node->getType() == node->getTrueBlock() ->getAsTyped()->getType() && node->getType() == node->getFalseBlock()->getAsTyped()->getType()); @@ -1997,10 +2175,14 @@ operandOkay(node->getFalseBlock()->getAsTyped()); }; - // Emit OpSelect for this selection. - const auto handleAsOpSelect = [&]() { - node->getCondition()->traverse(this); - spv::Id condition = accessChainLoad(node->getCondition()->getType()); + spv::Id result = spv::NoResult; // upcoming result selecting between trueValue and falseValue + // emit the condition before doing anything with selection + node->getCondition()->traverse(this); + spv::Id condition = accessChainLoad(node->getCondition()->getType()); + + // Find a way of executing both sides and selecting the right result. + const auto executeBothSides = [&]() -> void { + // execute both sides node->getTrueBlock()->traverse(this); spv::Id trueValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()); node->getFalseBlock()->traverse(this); @@ -2008,72 +2190,98 @@ builder.setLine(node->getLoc().line); - // smear condition to vector, if necessary (AST is always scalar) - if (builder.isVector(trueValue)) - condition = builder.smearScalar(spv::NoPrecision, condition, - builder.makeVectorType(builder.makeBoolType(), - builder.getNumComponents(trueValue))); - - spv::Id select = builder.createTriOp(spv::OpSelect, - convertGlslangToSpvType(node->getType()), condition, - trueValue, falseValue); - builder.clearAccessChain(); - builder.setAccessChainRValue(select); - }; + // done if void + if (node->getBasicType() == glslang::EbtVoid) + return; - // Try for OpSelect + // emit code to select between trueValue and falseValue - if (selectPolicy()) { - SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder); - if (node->getType().getQualifier().isSpecConstant()) - spec_constant_op_mode_setter.turnOnSpecConstantOpMode(); + // see if OpSelect can handle it + if (node->getType().isScalar() || node->getType().isVector()) { + // Emit OpSelect for this selection. + + // smear condition to vector, if necessary (AST is always scalar) + if (builder.isVector(trueValue)) + condition = builder.smearScalar(spv::NoPrecision, condition, + builder.makeVectorType(builder.makeBoolType(), + builder.getNumComponents(trueValue))); + + // OpSelect + result = builder.createTriOp(spv::OpSelect, + convertGlslangToSpvType(node->getType()), condition, + trueValue, falseValue); - handleAsOpSelect(); - return false; - } + builder.clearAccessChain(); + builder.setAccessChainRValue(result); + } else { + // We need control flow to select the result. + // TODO: Once SPIR-V OpSelect allows arbitrary types, eliminate this path. + result = builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType())); + + // Selection control: + const spv::SelectionControlMask control = TranslateSelectionControl(*node); + + // make an "if" based on the value created by the condition + spv::Builder::If ifBuilder(condition, control, builder); + + // emit the "then" statement + builder.createStore(trueValue, result); + ifBuilder.makeBeginElse(); + // emit the "else" statement + builder.createStore(falseValue, result); - // Instead, emit control flow... - // Don't handle results as temporaries, because there will be two names - // and better to leave SSA to later passes. - spv::Id result = (node->getBasicType() == glslang::EbtVoid) - ? spv::NoResult - : builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType())); + // finish off the control flow + ifBuilder.makeEndIf(); - // emit the condition before doing anything with selection - node->getCondition()->traverse(this); + builder.clearAccessChain(); + builder.setAccessChainLValue(result); + } + }; - // Selection control: - const spv::SelectionControlMask control = TranslateSelectionControl(*node); + // Execute the one side needed, as per the condition + const auto executeOneSide = [&]() { + // Always emit control flow. + if (node->getBasicType() != glslang::EbtVoid) + result = builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType())); - // make an "if" based on the value created by the condition - spv::Builder::If ifBuilder(accessChainLoad(node->getCondition()->getType()), control, builder); + // Selection control: + const spv::SelectionControlMask control = TranslateSelectionControl(*node); - // emit the "then" statement - if (node->getTrueBlock() != nullptr) { - node->getTrueBlock()->traverse(this); - if (result != spv::NoResult) - builder.createStore(accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()), result); - } + // make an "if" based on the value created by the condition + spv::Builder::If ifBuilder(condition, control, builder); - if (node->getFalseBlock() != nullptr) { - ifBuilder.makeBeginElse(); - // emit the "else" statement - node->getFalseBlock()->traverse(this); - if (result != spv::NoResult) - builder.createStore(accessChainLoad(node->getFalseBlock()->getAsTyped()->getType()), result); - } + // emit the "then" statement + if (node->getTrueBlock() != nullptr) { + node->getTrueBlock()->traverse(this); + if (result != spv::NoResult) + builder.createStore(accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()), result); + } - // finish off the control flow - ifBuilder.makeEndIf(); + if (node->getFalseBlock() != nullptr) { + ifBuilder.makeBeginElse(); + // emit the "else" statement + node->getFalseBlock()->traverse(this); + if (result != spv::NoResult) + builder.createStore(accessChainLoad(node->getFalseBlock()->getAsTyped()->getType()), result); + } - if (result != spv::NoResult) { - // GLSL only has r-values as the result of a :?, but - // if we have an l-value, that can be more efficient if it will - // become the base of a complex r-value expression, because the - // next layer copies r-values into memory to use the access-chain mechanism - builder.clearAccessChain(); - builder.setAccessChainLValue(result); - } + // finish off the control flow + ifBuilder.makeEndIf(); + + if (result != spv::NoResult) { + builder.clearAccessChain(); + builder.setAccessChainLValue(result); + } + }; + + // Try for OpSelect (or a requirement to execute both sides) + if (bothSidesPolicy()) { + SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder); + if (node->getType().getQualifier().isSpecConstant()) + spec_constant_op_mode_setter.turnOnSpecConstantOpMode(); + executeBothSides(); + } else + executeOneSide(); return false; } @@ -2267,25 +2475,23 @@ spv::StorageClass storageClass = TranslateStorageClass(node->getType()); spv::Id spvType = convertGlslangToSpvType(node->getType()); -#ifdef AMD_EXTENSIONS const bool contains16BitType = node->getType().containsBasicType(glslang::EbtFloat16) || node->getType().containsBasicType(glslang::EbtInt16) || node->getType().containsBasicType(glslang::EbtUint16); if (contains16BitType) { if (storageClass == spv::StorageClassInput || storageClass == spv::StorageClassOutput) { - builder.addExtension(spv::E_SPV_KHR_16bit_storage); + addPre13Extension(spv::E_SPV_KHR_16bit_storage); builder.addCapability(spv::CapabilityStorageInputOutput16); } else if (storageClass == spv::StorageClassPushConstant) { - builder.addExtension(spv::E_SPV_KHR_16bit_storage); + addPre13Extension(spv::E_SPV_KHR_16bit_storage); builder.addCapability(spv::CapabilityStoragePushConstant16); } else if (storageClass == spv::StorageClassUniform) { - builder.addExtension(spv::E_SPV_KHR_16bit_storage); + addPre13Extension(spv::E_SPV_KHR_16bit_storage); builder.addCapability(spv::CapabilityStorageUniform16); if (node->getType().getQualifier().storage == glslang::EvqBuffer) builder.addCapability(spv::CapabilityStorageUniformBufferBlock16); } } -#endif const char* name = node->getName().c_str(); if (glslang::IsAnonymous(name)) @@ -2299,6 +2505,12 @@ { switch (sampler.type) { case glslang::EbtFloat: return builder.makeFloatType(32); +#ifdef AMD_EXTENSIONS + case glslang::EbtFloat16: + builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float_fetch); + builder.addCapability(spv::CapabilityFloat16ImageAMD); + return builder.makeFloatType(16); +#endif case glslang::EbtInt: return builder.makeIntType(32); case glslang::EbtUint: return builder.makeUintType(32); default: @@ -2341,13 +2553,14 @@ // layout state rooted from the top-level type. spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& type) { - return convertGlslangToSpvType(type, getExplicitLayout(type), type.getQualifier()); + return convertGlslangToSpvType(type, getExplicitLayout(type), type.getQualifier(), false); } // Do full recursive conversion of an arbitrary glslang type to a SPIR-V Id. // explicitLayout can be kept the same throughout the hierarchical recursive walk. // Mutually recursive with convertGlslangStructToSpvType(). -spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& type, glslang::TLayoutPacking explicitLayout, const glslang::TQualifier& qualifier) +spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& type, + glslang::TLayoutPacking explicitLayout, const glslang::TQualifier& qualifier, bool lastBufferBlockMember) { spv::Id spvType = spv::NoResult; @@ -2362,12 +2575,14 @@ case glslang::EbtDouble: spvType = builder.makeFloatType(64); break; -#ifdef AMD_EXTENSIONS case glslang::EbtFloat16: - builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float); + builder.addCapability(spv::CapabilityFloat16); +#if AMD_EXTENSIONS + if (builder.getSpvVersion() < glslang::EShTargetSpv_1_3) + builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float); +#endif spvType = builder.makeFloatType(16); break; -#endif case glslang::EbtBool: // "transparent" bool doesn't exist in SPIR-V. The GLSL convention is // a 32-bit int where non-0 means true. @@ -2376,6 +2591,30 @@ else spvType = builder.makeBoolType(); break; + case glslang::EbtInt8: + builder.addCapability(spv::CapabilityInt8); + spvType = builder.makeIntType(8); + break; + case glslang::EbtUint8: + builder.addCapability(spv::CapabilityInt8); + spvType = builder.makeUintType(8); + break; + case glslang::EbtInt16: + builder.addCapability(spv::CapabilityInt16); +#ifdef AMD_EXTENSIONS + if (builder.getSpvVersion() < glslang::EShTargetSpv_1_3) + builder.addExtension(spv::E_SPV_AMD_gpu_shader_int16); +#endif + spvType = builder.makeIntType(16); + break; + case glslang::EbtUint16: + builder.addCapability(spv::CapabilityInt16); +#ifdef AMD_EXTENSIONS + if (builder.getSpvVersion() < glslang::EShTargetSpv_1_3) + builder.addExtension(spv::E_SPV_AMD_gpu_shader_int16); +#endif + spvType = builder.makeUintType(16); + break; case glslang::EbtInt: spvType = builder.makeIntType(32); break; @@ -2388,16 +2627,6 @@ case glslang::EbtUint64: spvType = builder.makeUintType(64); break; -#ifdef AMD_EXTENSIONS - case glslang::EbtInt16: - builder.addExtension(spv::E_SPV_AMD_gpu_shader_int16); - spvType = builder.makeIntType(16); - break; - case glslang::EbtUint16: - builder.addExtension(spv::E_SPV_AMD_gpu_shader_int16); - spvType = builder.makeUintType(16); - break; -#endif case glslang::EbtAtomicUint: builder.addCapability(spv::CapabilityAtomicStorage); spvType = builder.makeUintType(32); @@ -2461,8 +2690,8 @@ // Use a dummy glslang type for querying internal strides of // arrays of arrays, but using just a one-dimensional array. glslang::TType simpleArrayType(type, 0); // deference type of the array - while (simpleArrayType.getArraySizes().getNumDims() > 1) - simpleArrayType.getArraySizes().dereference(); + while (simpleArrayType.getArraySizes()->getNumDims() > 1) + simpleArrayType.getArraySizes()->dereference(); // Will compute the higher-order strides here, rather than making a whole // pile of types and doing repetitive recursion on their contents. @@ -2484,12 +2713,16 @@ stride = getArrayStride(type, explicitLayout, qualifier.layoutMatrix); } - // Do the outer dimension, which might not be known for a runtime-sized array - if (type.isRuntimeSizedArray()) { - spvType = builder.makeRuntimeArray(spvType); - } else { - assert(type.getOuterArraySize() > 0); + // Do the outer dimension, which might not be known for a runtime-sized array. + // (Unsized arrays that survive through linking will be runtime-sized arrays) + if (type.isSizedArray()) spvType = builder.makeArrayType(spvType, makeArraySizeId(*type.getArraySizes(), 0), stride); + else { + if (!lastBufferBlockMember) { + builder.addExtension("SPV_EXT_descriptor_indexing"); + builder.addCapability(spv::CapabilityRuntimeDescriptorArrayEXT); + } + spvType = builder.makeRuntimeArray(spvType); } if (stride > 0) builder.addDecoration(spvType, spv::DecorationArrayStride, stride); @@ -2557,7 +2790,10 @@ memberQualifier.layoutLocation = qualifier.layoutLocation; // recurse - spvMembers.push_back(convertGlslangToSpvType(glslangMember, explicitLayout, memberQualifier)); + bool lastBufferBlockMember = qualifier.storage == glslang::EvqBuffer && + i == (int)glslangMembers->size() - 1; + spvMembers.push_back( + convertGlslangToSpvType(glslangMember, explicitLayout, memberQualifier, lastBufferBlockMember)); } } @@ -2595,88 +2831,106 @@ InheritQualifiers(memberQualifier, qualifier); // using -1 above to indicate a hidden member - if (member >= 0) { - builder.addMemberName(spvType, member, glslangMember.getFieldName().c_str()); - addMemberDecoration(spvType, member, TranslateLayoutDecoration(glslangMember, memberQualifier.layoutMatrix)); - addMemberDecoration(spvType, member, TranslatePrecisionDecoration(glslangMember)); - // Add interpolation and auxiliary storage decorations only to top-level members of Input and Output storage classes - if (type.getQualifier().storage == glslang::EvqVaryingIn || - type.getQualifier().storage == glslang::EvqVaryingOut) { - if (type.getBasicType() == glslang::EbtBlock || - glslangIntermediate->getSource() == glslang::EShSourceHlsl) { - addMemberDecoration(spvType, member, TranslateInterpolationDecoration(memberQualifier)); - addMemberDecoration(spvType, member, TranslateAuxiliaryStorageDecoration(memberQualifier)); - } - } - addMemberDecoration(spvType, member, TranslateInvariantDecoration(memberQualifier)); - - if (type.getBasicType() == glslang::EbtBlock && - qualifier.storage == glslang::EvqBuffer) { - // Add memory decorations only to top-level members of shader storage block - std::vector memory; - TranslateMemoryDecoration(memberQualifier, memory); - for (unsigned int i = 0; i < memory.size(); ++i) - addMemberDecoration(spvType, member, memory[i]); - } + if (member < 0) + continue; - // Location assignment was already completed correctly by the front end, - // just track whether a member needs to be decorated. - // Ignore member locations if the container is an array, as that's - // ill-specified and decisions have been made to not allow this. - if (! type.isArray() && memberQualifier.hasLocation()) - builder.addMemberDecoration(spvType, member, spv::DecorationLocation, memberQualifier.layoutLocation); - - if (qualifier.hasLocation()) // track for upcoming inheritance - locationOffset += glslangIntermediate->computeTypeLocationSize(glslangMember); - - // component, XFB, others - if (glslangMember.getQualifier().hasComponent()) - builder.addMemberDecoration(spvType, member, spv::DecorationComponent, glslangMember.getQualifier().layoutComponent); - if (glslangMember.getQualifier().hasXfbOffset()) - builder.addMemberDecoration(spvType, member, spv::DecorationOffset, glslangMember.getQualifier().layoutXfbOffset); - else if (explicitLayout != glslang::ElpNone) { - // figure out what to do with offset, which is accumulating - int nextOffset; - updateMemberOffset(type, glslangMember, offset, nextOffset, explicitLayout, memberQualifier.layoutMatrix); - if (offset >= 0) - builder.addMemberDecoration(spvType, member, spv::DecorationOffset, offset); - offset = nextOffset; + builder.addMemberName(spvType, member, glslangMember.getFieldName().c_str()); + builder.addMemberDecoration(spvType, member, + TranslateLayoutDecoration(glslangMember, memberQualifier.layoutMatrix)); + builder.addMemberDecoration(spvType, member, TranslatePrecisionDecoration(glslangMember)); + // Add interpolation and auxiliary storage decorations only to + // top-level members of Input and Output storage classes + if (type.getQualifier().storage == glslang::EvqVaryingIn || + type.getQualifier().storage == glslang::EvqVaryingOut) { + if (type.getBasicType() == glslang::EbtBlock || + glslangIntermediate->getSource() == glslang::EShSourceHlsl) { + builder.addMemberDecoration(spvType, member, TranslateInterpolationDecoration(memberQualifier)); + builder.addMemberDecoration(spvType, member, TranslateAuxiliaryStorageDecoration(memberQualifier)); } + } + builder.addMemberDecoration(spvType, member, TranslateInvariantDecoration(memberQualifier)); - if (glslangMember.isMatrix() && explicitLayout != glslang::ElpNone) - builder.addMemberDecoration(spvType, member, spv::DecorationMatrixStride, getMatrixStride(glslangMember, explicitLayout, memberQualifier.layoutMatrix)); - - // built-in variable decorations - spv::BuiltIn builtIn = TranslateBuiltInDecoration(glslangMember.getQualifier().builtIn, true); - if (builtIn != spv::BuiltInMax) - addMemberDecoration(spvType, member, spv::DecorationBuiltIn, (int)builtIn); + if (type.getBasicType() == glslang::EbtBlock && + qualifier.storage == glslang::EvqBuffer) { + // Add memory decorations only to top-level members of shader storage block + std::vector memory; + TranslateMemoryDecoration(memberQualifier, memory); + for (unsigned int i = 0; i < memory.size(); ++i) + builder.addMemberDecoration(spvType, member, memory[i]); + } + + // Location assignment was already completed correctly by the front end, + // just track whether a member needs to be decorated. + // Ignore member locations if the container is an array, as that's + // ill-specified and decisions have been made to not allow this. + if (! type.isArray() && memberQualifier.hasLocation()) + builder.addMemberDecoration(spvType, member, spv::DecorationLocation, memberQualifier.layoutLocation); + + if (qualifier.hasLocation()) // track for upcoming inheritance + locationOffset += glslangIntermediate->computeTypeLocationSize( + glslangMember, glslangIntermediate->getStage()); + + // component, XFB, others + if (glslangMember.getQualifier().hasComponent()) + builder.addMemberDecoration(spvType, member, spv::DecorationComponent, + glslangMember.getQualifier().layoutComponent); + if (glslangMember.getQualifier().hasXfbOffset()) + builder.addMemberDecoration(spvType, member, spv::DecorationOffset, + glslangMember.getQualifier().layoutXfbOffset); + else if (explicitLayout != glslang::ElpNone) { + // figure out what to do with offset, which is accumulating + int nextOffset; + updateMemberOffset(type, glslangMember, offset, nextOffset, explicitLayout, memberQualifier.layoutMatrix); + if (offset >= 0) + builder.addMemberDecoration(spvType, member, spv::DecorationOffset, offset); + offset = nextOffset; + } + + if (glslangMember.isMatrix() && explicitLayout != glslang::ElpNone) + builder.addMemberDecoration(spvType, member, spv::DecorationMatrixStride, + getMatrixStride(glslangMember, explicitLayout, memberQualifier.layoutMatrix)); + + // built-in variable decorations + spv::BuiltIn builtIn = TranslateBuiltInDecoration(glslangMember.getQualifier().builtIn, true); + if (builtIn != spv::BuiltInMax) + builder.addMemberDecoration(spvType, member, spv::DecorationBuiltIn, (int)builtIn); + + // nonuniform + builder.addMemberDecoration(spvType, member, TranslateNonUniformDecoration(glslangMember.getQualifier())); + + if (glslangIntermediate->getHlslFunctionality1() && memberQualifier.semanticName != nullptr) { + builder.addExtension("SPV_GOOGLE_hlsl_functionality1"); + builder.addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationHlslSemanticGOOGLE, + memberQualifier.semanticName); + } #ifdef NV_EXTENSIONS - if (builtIn == spv::BuiltInLayer) { - // SPV_NV_viewport_array2 extension - if (glslangMember.getQualifier().layoutViewportRelative){ - addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationViewportRelativeNV); - builder.addCapability(spv::CapabilityShaderViewportMaskNV); - builder.addExtension(spv::E_SPV_NV_viewport_array2); - } - if (glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset != -2048){ - addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationSecondaryViewportRelativeNV, glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset); - builder.addCapability(spv::CapabilityShaderStereoViewNV); - builder.addExtension(spv::E_SPV_NV_stereo_view_rendering); - } + if (builtIn == spv::BuiltInLayer) { + // SPV_NV_viewport_array2 extension + if (glslangMember.getQualifier().layoutViewportRelative){ + builder.addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationViewportRelativeNV); + builder.addCapability(spv::CapabilityShaderViewportMaskNV); + builder.addExtension(spv::E_SPV_NV_viewport_array2); } - if (glslangMember.getQualifier().layoutPassthrough) { - addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationPassthroughNV); - builder.addCapability(spv::CapabilityGeometryShaderPassthroughNV); - builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough); + if (glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset != -2048){ + builder.addMemberDecoration(spvType, member, + (spv::Decoration)spv::DecorationSecondaryViewportRelativeNV, + glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset); + builder.addCapability(spv::CapabilityShaderStereoViewNV); + builder.addExtension(spv::E_SPV_NV_stereo_view_rendering); } -#endif } + if (glslangMember.getQualifier().layoutPassthrough) { + builder.addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationPassthroughNV); + builder.addCapability(spv::CapabilityGeometryShaderPassthroughNV); + builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough); + } +#endif } // Decorate the structure - addDecoration(spvType, TranslateLayoutDecoration(type, qualifier.layoutMatrix)); - addDecoration(spvType, TranslateBlockDecoration(type, glslangIntermediate->usingStorageBuffer())); + builder.addDecoration(spvType, TranslateLayoutDecoration(type, qualifier.layoutMatrix)); + builder.addDecoration(spvType, TranslateBlockDecoration(type, glslangIntermediate->usingStorageBuffer())); if (type.getQualifier().hasStream() && glslangIntermediate->isMultiStream()) { builder.addCapability(spv::CapabilityGeometryStreams); builder.addDecoration(spvType, spv::DecorationStream, type.getQualifier().layoutStream); @@ -2711,7 +2965,8 @@ spv::Id TGlslangToSpvTraverser::accessChainLoad(const glslang::TType& type) { spv::Id nominalTypeId = builder.accessChainGetInferredType(); - spv::Id loadedId = builder.accessChainLoad(TranslatePrecisionDecoration(type), nominalTypeId); + spv::Id loadedId = builder.accessChainLoad(TranslatePrecisionDecoration(type), + TranslateNonUniformDecoration(type.getQualifier()), nominalTypeId); // Need to convert to abstract types when necessary if (type.getBasicType() == glslang::EbtBool) { @@ -3117,9 +3372,15 @@ glslang::TSampler sampler = {}; bool cubeCompare = false; +#ifdef AMD_EXTENSIONS + bool f16ShadowCompare = false; +#endif if (node.isTexture() || node.isImage()) { sampler = glslangArguments[0]->getAsTyped()->getType().getSampler(); cubeCompare = sampler.dim == glslang::EsdCube && sampler.arrayed && sampler.shadow; +#ifdef AMD_EXTENSIONS + f16ShadowCompare = sampler.shadow && glslangArguments[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16; +#endif } for (int i = 0; i < (int)glslangArguments.size(); ++i) { @@ -3144,6 +3405,21 @@ if ((sampler.ms && i == 3) || (! sampler.ms && i == 2)) lvalue = true; break; +#ifdef AMD_EXTENSIONS + case glslang::EOpSparseTexture: + if (((cubeCompare || f16ShadowCompare) && i == 3) || (! (cubeCompare || f16ShadowCompare) && i == 2)) + lvalue = true; + break; + case glslang::EOpSparseTextureClamp: + if (((cubeCompare || f16ShadowCompare) && i == 4) || (! (cubeCompare || f16ShadowCompare) && i == 3)) + lvalue = true; + break; + case glslang::EOpSparseTextureLod: + case glslang::EOpSparseTextureOffset: + if ((f16ShadowCompare && i == 4) || (! f16ShadowCompare && i == 3)) + lvalue = true; + break; +#else case glslang::EOpSparseTexture: if ((cubeCompare && i == 3) || (! cubeCompare && i == 2)) lvalue = true; @@ -3157,6 +3433,7 @@ if (i == 3) lvalue = true; break; +#endif case glslang::EOpSparseTextureFetch: if ((sampler.dim != glslang::EsdRect && i == 3) || (sampler.dim == glslang::EsdRect && i == 2)) lvalue = true; @@ -3165,6 +3442,23 @@ if ((sampler.dim != glslang::EsdRect && i == 4) || (sampler.dim == glslang::EsdRect && i == 3)) lvalue = true; break; +#ifdef AMD_EXTENSIONS + case glslang::EOpSparseTextureLodOffset: + case glslang::EOpSparseTextureGrad: + case glslang::EOpSparseTextureOffsetClamp: + if ((f16ShadowCompare && i == 5) || (! f16ShadowCompare && i == 4)) + lvalue = true; + break; + case glslang::EOpSparseTextureGradOffset: + case glslang::EOpSparseTextureGradClamp: + if ((f16ShadowCompare && i == 6) || (! f16ShadowCompare && i == 5)) + lvalue = true; + break; + case glslang::EOpSparseTextureGradOffsetClamp: + if ((f16ShadowCompare && i == 7) || (! f16ShadowCompare && i == 6)) + lvalue = true; + break; +#else case glslang::EOpSparseTextureLodOffset: case glslang::EOpSparseTextureGrad: case glslang::EOpSparseTextureOffsetClamp: @@ -3180,6 +3474,7 @@ if (i == 6) lvalue = true; break; +#endif case glslang::EOpSparseTextureGather: if ((sampler.shadow && i == 3) || (! sampler.shadow && i == 2)) lvalue = true; @@ -3229,11 +3524,15 @@ builder.setLine(node->getLoc().line); - auto resultType = [&node,this]{ return convertGlslangToSpvType(node->getType()); }; - // Process a GLSL texturing op (will be SPV image) const glslang::TSampler sampler = node->getAsAggregate() ? node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType().getSampler() : node->getAsUnaryNode()->getOperand()->getAsTyped()->getType().getSampler(); +#ifdef AMD_EXTENSIONS + bool f16ShadowCompare = (sampler.shadow && node->getAsAggregate()) + ? node->getAsAggregate()->getSequence()[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16 + : false; +#endif + std::vector arguments; if (node->getAsAggregate()) translateArguments(*node->getAsAggregate(), arguments); @@ -3279,6 +3578,20 @@ } } + int components = node->getType().getVectorSize(); + + if (node->getOp() == glslang::EOpTextureFetch) { + // These must produce 4 components, per SPIR-V spec. We'll add a conversion constructor if needed. + // This will only happen through the HLSL path for operator[], so we do not have to handle e.g. + // the EOpTexture/Proj/Lod/etc family. It would be harmless to do so, but would need more logic + // here around e.g. which ones return scalars or other types. + components = 4; + } + + glslang::TType returnType(node->getType().getBasicType(), glslang::EvqTemporary, components); + + auto resultType = [&returnType,this]{ return convertGlslangToSpvType(returnType); }; + // Check for image functions other than queries if (node->isImage()) { std::vector operands; @@ -3325,9 +3638,14 @@ if (builder.getImageTypeFormat(builder.getImageType(operands.front())) == spv::ImageFormatUnknown) builder.addCapability(spv::CapabilityStorageImageReadWithoutFormat); - spv::Id result = builder.createOp(spv::OpImageRead, resultType(), operands); - builder.setPrecision(result, precision); - return result; + std::vector result( 1, builder.createOp(spv::OpImageRead, resultType(), operands) ); + builder.setPrecision(result[0], precision); + + // If needed, add a conversion constructor to the proper size. + if (components != node->getType().getVectorSize()) + result[0] = builder.createConstructor(precision, result, convertGlslangToSpvType(node->getType())); + + return result[0]; #ifdef AMD_EXTENSIONS } else if (node->getOp() == glslang::EOpImageStore || node->getOp() == glslang::EOpImageStoreLod) { #else @@ -3458,6 +3776,9 @@ #ifdef AMD_EXTENSIONS if (cracked.gather) ++nonBiasArgCount; // comp argument should be present when bias argument is present + + if (f16ShadowCompare) + ++nonBiasArgCount; #endif if (cracked.offset) ++nonBiasArgCount; @@ -3501,7 +3822,11 @@ bool noImplicitLod = false; // sort out where Dref is coming from +#ifdef AMD_EXTENSIONS + if (cubeCompare || f16ShadowCompare) { +#else if (cubeCompare) { +#endif params.Dref = arguments[2]; ++extraArgs; } else if (sampler.shadow && cracked.gather) { @@ -3601,7 +3926,14 @@ } } - return builder.createTextureCall(precision, resultType(), sparse, cracked.fetch, cracked.proj, cracked.gather, noImplicitLod, params); + std::vector result( 1, + builder.createTextureCall(precision, resultType(), sparse, cracked.fetch, cracked.proj, cracked.gather, noImplicitLod, params) + ); + + if (components != node->getType().getVectorSize()) + result[0] = builder.createConstructor(precision, result, convertGlslangToSpvType(node->getType())); + + return result[0]; } spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAggregate* node) @@ -3700,18 +4032,12 @@ } // Translate AST operation to SPV operation, already having SPV-based operands/types. -spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv::Decoration precision, - spv::Decoration noContraction, +spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, OpDecorations& decorations, spv::Id typeId, spv::Id left, spv::Id right, glslang::TBasicType typeProxy, bool reduceComparison) { -#ifdef AMD_EXTENSIONS - bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64 || typeProxy == glslang::EbtUint16; - bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble || typeProxy == glslang::EbtFloat16; -#else - bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64; - bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble; -#endif + bool isUnsigned = isTypeUnsignedInt(typeProxy); + bool isFloat = isTypeFloat(typeProxy); bool isBool = typeProxy == glslang::EbtBool; spv::Op binOp = spv::OpNop; @@ -3843,15 +4169,16 @@ if (binOp != spv::OpNop) { assert(comparison == false); if (builder.isMatrix(left) || builder.isMatrix(right)) - return createBinaryMatrixOperation(binOp, precision, noContraction, typeId, left, right); + return createBinaryMatrixOperation(binOp, decorations, typeId, left, right); // No matrix involved; make both operands be the same number of components, if needed if (needMatchingVectors) - builder.promoteScalar(precision, left, right); + builder.promoteScalar(decorations.precision, left, right); spv::Id result = builder.createBinOp(binOp, typeId, left, right); - addDecoration(result, noContraction); - return builder.setPrecision(result, precision); + builder.addDecoration(result, decorations.noContraction); + builder.addDecoration(result, decorations.nonUniform); + return builder.setPrecision(result, decorations.precision); } if (! comparison) @@ -3860,8 +4187,11 @@ // Handle comparison instructions if (reduceComparison && (op == glslang::EOpEqual || op == glslang::EOpNotEqual) - && (builder.isVector(left) || builder.isMatrix(left) || builder.isAggregate(left))) - return builder.createCompositeCompare(precision, left, right, op == glslang::EOpEqual); + && (builder.isVector(left) || builder.isMatrix(left) || builder.isAggregate(left))) { + spv::Id result = builder.createCompositeCompare(decorations.precision, left, right, op == glslang::EOpEqual); + builder.addDecoration(result, decorations.nonUniform); + return result; + } switch (op) { case glslang::EOpLessThan: @@ -3920,8 +4250,9 @@ if (binOp != spv::OpNop) { spv::Id result = builder.createBinOp(binOp, typeId, left, right); - addDecoration(result, noContraction); - return builder.setPrecision(result, precision); + builder.addDecoration(result, decorations.noContraction); + builder.addDecoration(result, decorations.nonUniform); + return builder.setPrecision(result, decorations.precision); } return 0; @@ -3941,7 +4272,8 @@ // matrix op scalar op in {+, -, /} // scalar op matrix op in {+, -, /} // -spv::Id TGlslangToSpvTraverser::createBinaryMatrixOperation(spv::Op op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id left, spv::Id right) +spv::Id TGlslangToSpvTraverser::createBinaryMatrixOperation(spv::Op op, OpDecorations& decorations, spv::Id typeId, + spv::Id left, spv::Id right) { bool firstClass = true; @@ -3950,7 +4282,8 @@ case spv::OpFDiv: if (builder.isMatrix(left) && builder.isScalar(right)) { // turn matrix / scalar into a multiply... - right = builder.createBinOp(spv::OpFDiv, builder.getTypeId(right), builder.makeFloatConstant(1.0F), right); + spv::Id resultType = builder.getTypeId(right); + right = builder.createBinOp(spv::OpFDiv, resultType, builder.makeFpConstant(resultType, 1.0), right); op = spv::OpMatrixTimesScalar; } else firstClass = false; @@ -3979,8 +4312,9 @@ if (firstClass) { spv::Id result = builder.createBinOp(op, typeId, left, right); - addDecoration(result, noContraction); - return builder.setPrecision(result, precision); + builder.addDecoration(result, decorations.noContraction); + builder.addDecoration(result, decorations.nonUniform); + return builder.setPrecision(result, decorations.precision); } // Handle component-wise +, -, *, %, and / for all combinations of type. @@ -4007,9 +4341,9 @@ std::vector results; spv::Id smearVec = spv::NoResult; if (builder.isScalar(left)) - smearVec = builder.smearScalar(precision, left, vecType); + smearVec = builder.smearScalar(decorations.precision, left, vecType); else if (builder.isScalar(right)) - smearVec = builder.smearScalar(precision, right, vecType); + smearVec = builder.smearScalar(decorations.precision, right, vecType); // do each vector op for (unsigned int c = 0; c < numCols; ++c) { @@ -4018,12 +4352,15 @@ spv::Id leftVec = leftMat ? builder.createCompositeExtract( left, vecType, indexes) : smearVec; spv::Id rightVec = rightMat ? builder.createCompositeExtract(right, vecType, indexes) : smearVec; spv::Id result = builder.createBinOp(op, vecType, leftVec, rightVec); - addDecoration(result, noContraction); - results.push_back(builder.setPrecision(result, precision)); + builder.addDecoration(result, decorations.noContraction); + builder.addDecoration(result, decorations.nonUniform); + results.push_back(builder.setPrecision(result, decorations.precision)); } // put the pieces together - return builder.setPrecision(builder.createCompositeConstruct(typeId, results), precision); + spv::Id result = builder.setPrecision(builder.createCompositeConstruct(typeId, results), decorations.precision); + builder.addDecoration(result, decorations.nonUniform); + return result; } default: assert(0); @@ -4031,25 +4368,21 @@ } } -spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand, glslang::TBasicType typeProxy) +spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDecorations& decorations, spv::Id typeId, + spv::Id operand, glslang::TBasicType typeProxy) { spv::Op unaryOp = spv::OpNop; int extBuiltins = -1; int libCall = -1; -#ifdef AMD_EXTENSIONS - bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64 || typeProxy == glslang::EbtUint16; - bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble || typeProxy == glslang::EbtFloat16; -#else - bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64; - bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble; -#endif + bool isUnsigned = isTypeUnsignedInt(typeProxy); + bool isFloat = isTypeFloat(typeProxy); switch (op) { case glslang::EOpNegative: if (isFloat) { unaryOp = spv::OpFNegate; if (builder.isMatrixType(typeId)) - return createUnaryMatrixOperation(unaryOp, precision, noContraction, typeId, operand, typeProxy); + return createUnaryMatrixOperation(unaryOp, decorations, typeId, operand, typeProxy); } else unaryOp = spv::OpSNegate; break; @@ -4179,12 +4512,10 @@ case glslang::EOpDoubleBitsToUint64: case glslang::EOpInt64BitsToDouble: case glslang::EOpUint64BitsToDouble: -#ifdef AMD_EXTENSIONS case glslang::EOpFloat16BitsToInt16: case glslang::EOpFloat16BitsToUint16: case glslang::EOpInt16BitsToFloat16: case glslang::EOpUint16BitsToFloat16: -#endif unaryOp = spv::OpBitcast; break; @@ -4229,10 +4560,12 @@ case glslang::EOpUnpackInt2x32: case glslang::EOpPackUint2x32: case glslang::EOpUnpackUint2x32: - unaryOp = spv::OpBitcast; - break; - -#ifdef AMD_EXTENSIONS + case glslang::EOpPack16: + case glslang::EOpPack32: + case glslang::EOpPack64: + case glslang::EOpUnpack32: + case glslang::EOpUnpack16: + case glslang::EOpUnpack8: case glslang::EOpPackInt2x16: case glslang::EOpUnpackInt2x16: case glslang::EOpPackUint2x16: @@ -4245,7 +4578,6 @@ case glslang::EOpUnpackFloat2x16: unaryOp = spv::OpBitcast; break; -#endif case glslang::EOpDPdx: unaryOp = spv::OpDPdx; @@ -4311,7 +4643,7 @@ // Handle all of the atomics in one place, in createAtomicOperation() std::vector operands; operands.push_back(operand); - return createAtomicOperation(op, precision, typeId, operands, typeProxy); + return createAtomicOperation(op, decorations.precision, typeId, operands, typeProxy); } case glslang::EOpBitFieldReverse: @@ -4360,7 +4692,45 @@ operands.push_back(operand); return createInvocationsOperation(op, typeId, operands, typeProxy); } - + case glslang::EOpSubgroupAll: + case glslang::EOpSubgroupAny: + case glslang::EOpSubgroupAllEqual: + case glslang::EOpSubgroupBroadcastFirst: + case glslang::EOpSubgroupBallot: + case glslang::EOpSubgroupInverseBallot: + case glslang::EOpSubgroupBallotBitCount: + case glslang::EOpSubgroupBallotInclusiveBitCount: + case glslang::EOpSubgroupBallotExclusiveBitCount: + case glslang::EOpSubgroupBallotFindLSB: + case glslang::EOpSubgroupBallotFindMSB: + case glslang::EOpSubgroupAdd: + case glslang::EOpSubgroupMul: + case glslang::EOpSubgroupMin: + case glslang::EOpSubgroupMax: + case glslang::EOpSubgroupAnd: + case glslang::EOpSubgroupOr: + case glslang::EOpSubgroupXor: + case glslang::EOpSubgroupInclusiveAdd: + case glslang::EOpSubgroupInclusiveMul: + case glslang::EOpSubgroupInclusiveMin: + case glslang::EOpSubgroupInclusiveMax: + case glslang::EOpSubgroupInclusiveAnd: + case glslang::EOpSubgroupInclusiveOr: + case glslang::EOpSubgroupInclusiveXor: + case glslang::EOpSubgroupExclusiveAdd: + case glslang::EOpSubgroupExclusiveMul: + case glslang::EOpSubgroupExclusiveMin: + case glslang::EOpSubgroupExclusiveMax: + case glslang::EOpSubgroupExclusiveAnd: + case glslang::EOpSubgroupExclusiveOr: + case glslang::EOpSubgroupExclusiveXor: + case glslang::EOpSubgroupQuadSwapHorizontal: + case glslang::EOpSubgroupQuadSwapVertical: + case glslang::EOpSubgroupQuadSwapDiagonal: { + std::vector operands; + operands.push_back(operand); + return createSubgroupOperation(op, typeId, operands, typeProxy); + } #ifdef AMD_EXTENSIONS case glslang::EOpMbcnt: extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_ballot); @@ -4377,7 +4747,13 @@ libCall = spv::CubeFaceCoordAMD; break; #endif - +#ifdef NV_EXTENSIONS + case glslang::EOpSubgroupPartition: + builder.addExtension(spv::E_SPV_NV_shader_subgroup_partitioned); + builder.addCapability(spv::CapabilityGroupNonUniformPartitionedNV); + unaryOp = spv::OpGroupNonUniformPartitionNV; + break; +#endif default: return 0; } @@ -4391,12 +4767,14 @@ id = builder.createUnaryOp(unaryOp, typeId, operand); } - addDecoration(id, noContraction); - return builder.setPrecision(id, precision); + builder.addDecoration(id, decorations.noContraction); + builder.addDecoration(id, decorations.nonUniform); + return builder.setPrecision(id, decorations.precision); } // Create a unary operation on a matrix -spv::Id TGlslangToSpvTraverser::createUnaryMatrixOperation(spv::Op op, spv::Decoration precision, spv::Decoration noContraction, spv::Id typeId, spv::Id operand, glslang::TBasicType /* typeProxy */) +spv::Id TGlslangToSpvTraverser::createUnaryMatrixOperation(spv::Op op, OpDecorations& decorations, spv::Id typeId, + spv::Id operand, glslang::TBasicType /* typeProxy */) { // Handle unary operations vector by vector. // The result type is the same type as the original type. @@ -4418,42 +4796,164 @@ indexes.push_back(c); spv::Id srcVec = builder.createCompositeExtract(operand, srcVecType, indexes); spv::Id destVec = builder.createUnaryOp(op, destVecType, srcVec); - addDecoration(destVec, noContraction); - results.push_back(builder.setPrecision(destVec, precision)); + builder.addDecoration(destVec, decorations.noContraction); + builder.addDecoration(destVec, decorations.nonUniform); + results.push_back(builder.setPrecision(destVec, decorations.precision)); } // put the pieces together - return builder.setPrecision(builder.createCompositeConstruct(typeId, results), precision); + spv::Id result = builder.setPrecision(builder.createCompositeConstruct(typeId, results), decorations.precision); + builder.addDecoration(result, decorations.nonUniform); + return result; } -spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id destType, spv::Id operand, glslang::TBasicType typeProxy) +spv::Id TGlslangToSpvTraverser::createConversionOperation(glslang::TOperator op, spv::Id operand, int vectorSize) { spv::Op convOp = spv::OpNop; - spv::Id zero = 0; - spv::Id one = 0; spv::Id type = 0; - int vectorSize = builder.isVectorType(destType) ? builder.getNumTypeComponents(destType) : 0; + spv::Id result = 0; - switch (op) { - case glslang::EOpConvIntToBool: - case glslang::EOpConvUintToBool: - case glslang::EOpConvInt64ToBool: - case glslang::EOpConvUint64ToBool: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvInt16ToBool: - case glslang::EOpConvUint16ToBool: -#endif - if (op == glslang::EOpConvInt64ToBool || op == glslang::EOpConvUint64ToBool) - zero = builder.makeUint64Constant(0); -#ifdef AMD_EXTENSIONS - else if (op == glslang::EOpConvInt16ToBool || op == glslang::EOpConvUint16ToBool) - zero = builder.makeUint16Constant(0); -#endif - else - zero = builder.makeUintConstant(0); - zero = makeSmearedConstant(zero, vectorSize); - return builder.createBinOp(spv::OpINotEqual, destType, operand, zero); + switch(op) { + case glslang::EOpConvInt8ToUint16: + convOp = spv::OpSConvert; + type = builder.makeIntType(16); + break; + case glslang::EOpConvInt8ToUint: + convOp = spv::OpSConvert; + type = builder.makeIntType(32); + break; + case glslang::EOpConvInt8ToUint64: + convOp = spv::OpSConvert; + type = builder.makeIntType(64); + break; + case glslang::EOpConvInt16ToUint8: + convOp = spv::OpSConvert; + type = builder.makeIntType(8); + break; + case glslang::EOpConvInt16ToUint: + convOp = spv::OpSConvert; + type = builder.makeIntType(32); + break; + case glslang::EOpConvInt16ToUint64: + convOp = spv::OpSConvert; + type = builder.makeIntType(64); + break; + case glslang::EOpConvIntToUint8: + convOp = spv::OpSConvert; + type = builder.makeIntType(8); + break; + case glslang::EOpConvIntToUint16: + convOp = spv::OpSConvert; + type = builder.makeIntType(16); + break; + case glslang::EOpConvIntToUint64: + convOp = spv::OpSConvert; + type = builder.makeIntType(64); + break; + case glslang::EOpConvInt64ToUint8: + convOp = spv::OpSConvert; + type = builder.makeIntType(8); + break; + case glslang::EOpConvInt64ToUint16: + convOp = spv::OpSConvert; + type = builder.makeIntType(16); + break; + case glslang::EOpConvInt64ToUint: + convOp = spv::OpSConvert; + type = builder.makeIntType(32); + break; + case glslang::EOpConvUint8ToInt16: + convOp = spv::OpUConvert; + type = builder.makeIntType(16); + break; + case glslang::EOpConvUint8ToInt: + convOp = spv::OpUConvert; + type = builder.makeIntType(32); + break; + case glslang::EOpConvUint8ToInt64: + convOp = spv::OpUConvert; + type = builder.makeIntType(64); + break; + case glslang::EOpConvUint16ToInt8: + convOp = spv::OpUConvert; + type = builder.makeIntType(8); + break; + case glslang::EOpConvUint16ToInt: + convOp = spv::OpUConvert; + type = builder.makeIntType(32); + break; + case glslang::EOpConvUint16ToInt64: + convOp = spv::OpUConvert; + type = builder.makeIntType(64); + break; + case glslang::EOpConvUintToInt8: + convOp = spv::OpUConvert; + type = builder.makeIntType(8); + break; + case glslang::EOpConvUintToInt16: + convOp = spv::OpUConvert; + type = builder.makeIntType(16); + break; + case glslang::EOpConvUintToInt64: + convOp = spv::OpUConvert; + type = builder.makeIntType(64); + break; + case glslang::EOpConvUint64ToInt8: + convOp = spv::OpUConvert; + type = builder.makeIntType(8); + break; + case glslang::EOpConvUint64ToInt16: + convOp = spv::OpUConvert; + type = builder.makeIntType(16); + break; + case glslang::EOpConvUint64ToInt: + convOp = spv::OpUConvert; + type = builder.makeIntType(32); + break; + + default: + assert(false && "Default missing"); + break; + } + + if (vectorSize > 0) + type = builder.makeVectorType(type, vectorSize); + + result = builder.createUnaryOp(convOp, type, operand); + return result; +} + +spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecorations& decorations, spv::Id destType, + spv::Id operand, glslang::TBasicType typeProxy) +{ + spv::Op convOp = spv::OpNop; + spv::Id zero = 0; + spv::Id one = 0; + + int vectorSize = builder.isVectorType(destType) ? builder.getNumTypeComponents(destType) : 0; + + switch (op) { + case glslang::EOpConvInt8ToBool: + case glslang::EOpConvUint8ToBool: + zero = builder.makeUint8Constant(0); + zero = makeSmearedConstant(zero, vectorSize); + return builder.createBinOp(spv::OpINotEqual, destType, operand, zero); + case glslang::EOpConvInt16ToBool: + case glslang::EOpConvUint16ToBool: + zero = builder.makeUint16Constant(0); + zero = makeSmearedConstant(zero, vectorSize); + return builder.createBinOp(spv::OpINotEqual, destType, operand, zero); + case glslang::EOpConvIntToBool: + case glslang::EOpConvUintToBool: + zero = builder.makeUintConstant(0); + zero = makeSmearedConstant(zero, vectorSize); + return builder.createBinOp(spv::OpINotEqual, destType, operand, zero); + case glslang::EOpConvInt64ToBool: + case glslang::EOpConvUint64ToBool: + zero = builder.makeUint64Constant(0); + zero = makeSmearedConstant(zero, vectorSize); + return builder.createBinOp(spv::OpINotEqual, destType, operand, zero); case glslang::EOpConvFloatToBool: zero = builder.makeFloatConstant(0.0F); @@ -4465,12 +4965,10 @@ zero = makeSmearedConstant(zero, vectorSize); return builder.createBinOp(spv::OpFOrdNotEqual, destType, operand, zero); -#ifdef AMD_EXTENSIONS case glslang::EOpConvFloat16ToBool: zero = builder.makeFloat16Constant(0.0F); zero = makeSmearedConstant(zero, vectorSize); return builder.createBinOp(spv::OpFOrdNotEqual, destType, operand, zero); -#endif case glslang::EOpConvBoolToFloat: convOp = spv::OpSelect; @@ -4484,34 +4982,45 @@ one = builder.makeDoubleConstant(1.0); break; -#ifdef AMD_EXTENSIONS case glslang::EOpConvBoolToFloat16: convOp = spv::OpSelect; zero = builder.makeFloat16Constant(0.0F); one = builder.makeFloat16Constant(1.0F); break; -#endif + + case glslang::EOpConvBoolToInt8: + zero = builder.makeInt8Constant(0); + one = builder.makeInt8Constant(1); + convOp = spv::OpSelect; + break; + + case glslang::EOpConvBoolToUint8: + zero = builder.makeUint8Constant(0); + one = builder.makeUint8Constant(1); + convOp = spv::OpSelect; + break; + + case glslang::EOpConvBoolToInt16: + zero = builder.makeInt16Constant(0); + one = builder.makeInt16Constant(1); + convOp = spv::OpSelect; + break; + + case glslang::EOpConvBoolToUint16: + zero = builder.makeUint16Constant(0); + one = builder.makeUint16Constant(1); + convOp = spv::OpSelect; + break; case glslang::EOpConvBoolToInt: case glslang::EOpConvBoolToInt64: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvBoolToInt16: -#endif if (op == glslang::EOpConvBoolToInt64) zero = builder.makeInt64Constant(0); -#ifdef AMD_EXTENSIONS - else if (op == glslang::EOpConvBoolToInt16) - zero = builder.makeInt16Constant(0); -#endif else zero = builder.makeIntConstant(0); if (op == glslang::EOpConvBoolToInt64) one = builder.makeInt64Constant(1); -#ifdef AMD_EXTENSIONS - else if (op == glslang::EOpConvBoolToInt16) - one = builder.makeInt16Constant(1); -#endif else one = builder.makeIntConstant(1); @@ -4520,104 +5029,94 @@ case glslang::EOpConvBoolToUint: case glslang::EOpConvBoolToUint64: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvBoolToUint16: -#endif if (op == glslang::EOpConvBoolToUint64) zero = builder.makeUint64Constant(0); -#ifdef AMD_EXTENSIONS - else if (op == glslang::EOpConvBoolToUint16) - zero = builder.makeUint16Constant(0); -#endif else zero = builder.makeUintConstant(0); if (op == glslang::EOpConvBoolToUint64) one = builder.makeUint64Constant(1); -#ifdef AMD_EXTENSIONS - else if (op == glslang::EOpConvBoolToUint16) - one = builder.makeUint16Constant(1); -#endif else one = builder.makeUintConstant(1); convOp = spv::OpSelect; break; + case glslang::EOpConvInt8ToFloat16: + case glslang::EOpConvInt8ToFloat: + case glslang::EOpConvInt8ToDouble: + case glslang::EOpConvInt16ToFloat16: + case glslang::EOpConvInt16ToFloat: + case glslang::EOpConvInt16ToDouble: + case glslang::EOpConvIntToFloat16: case glslang::EOpConvIntToFloat: case glslang::EOpConvIntToDouble: case glslang::EOpConvInt64ToFloat: case glslang::EOpConvInt64ToDouble: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvInt16ToFloat: - case glslang::EOpConvInt16ToDouble: - case glslang::EOpConvInt16ToFloat16: - case glslang::EOpConvIntToFloat16: case glslang::EOpConvInt64ToFloat16: -#endif convOp = spv::OpConvertSToF; break; + case glslang::EOpConvUint8ToFloat16: + case glslang::EOpConvUint8ToFloat: + case glslang::EOpConvUint8ToDouble: + case glslang::EOpConvUint16ToFloat16: + case glslang::EOpConvUint16ToFloat: + case glslang::EOpConvUint16ToDouble: + case glslang::EOpConvUintToFloat16: case glslang::EOpConvUintToFloat: case glslang::EOpConvUintToDouble: case glslang::EOpConvUint64ToFloat: case glslang::EOpConvUint64ToDouble: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvUint16ToFloat: - case glslang::EOpConvUint16ToDouble: - case glslang::EOpConvUint16ToFloat16: - case glslang::EOpConvUintToFloat16: case glslang::EOpConvUint64ToFloat16: -#endif convOp = spv::OpConvertUToF; break; case glslang::EOpConvDoubleToFloat: case glslang::EOpConvFloatToDouble: -#ifdef AMD_EXTENSIONS case glslang::EOpConvDoubleToFloat16: case glslang::EOpConvFloat16ToDouble: case glslang::EOpConvFloatToFloat16: case glslang::EOpConvFloat16ToFloat: -#endif convOp = spv::OpFConvert; if (builder.isMatrixType(destType)) - return createUnaryMatrixOperation(convOp, precision, noContraction, destType, operand, typeProxy); + return createUnaryMatrixOperation(convOp, decorations, destType, operand, typeProxy); break; - case glslang::EOpConvFloatToInt: - case glslang::EOpConvDoubleToInt: - case glslang::EOpConvFloatToInt64: - case glslang::EOpConvDoubleToInt64: -#ifdef AMD_EXTENSIONS + case glslang::EOpConvFloat16ToInt8: + case glslang::EOpConvFloatToInt8: + case glslang::EOpConvDoubleToInt8: + case glslang::EOpConvFloat16ToInt16: case glslang::EOpConvFloatToInt16: case glslang::EOpConvDoubleToInt16: - case glslang::EOpConvFloat16ToInt16: case glslang::EOpConvFloat16ToInt: + case glslang::EOpConvFloatToInt: + case glslang::EOpConvDoubleToInt: case glslang::EOpConvFloat16ToInt64: -#endif + case glslang::EOpConvFloatToInt64: + case glslang::EOpConvDoubleToInt64: convOp = spv::OpConvertFToS; break; + case glslang::EOpConvUint8ToInt8: + case glslang::EOpConvInt8ToUint8: + case glslang::EOpConvUint16ToInt16: + case glslang::EOpConvInt16ToUint16: case glslang::EOpConvUintToInt: case glslang::EOpConvIntToUint: case glslang::EOpConvUint64ToInt64: case glslang::EOpConvInt64ToUint64: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvUint16ToInt16: - case glslang::EOpConvInt16ToUint16: -#endif if (builder.isInSpecConstCodeGenMode()) { // Build zero scalar or vector for OpIAdd. - if (op == glslang::EOpConvUint64ToInt64 || op == glslang::EOpConvInt64ToUint64) - zero = builder.makeUint64Constant(0); -#ifdef AMD_EXTENSIONS - else if (op == glslang::EOpConvUint16ToInt16 || op == glslang::EOpConvInt16ToUint16) + if(op == glslang::EOpConvUint8ToInt8 || op == glslang::EOpConvInt8ToUint8) { + zero = builder.makeUint8Constant(0); + } else if (op == glslang::EOpConvUint16ToInt16 || op == glslang::EOpConvInt16ToUint16) { zero = builder.makeUint16Constant(0); -#endif - else + } else if (op == glslang::EOpConvUint64ToInt64 || op == glslang::EOpConvInt64ToUint64) { + zero = builder.makeUint64Constant(0); + } else { zero = builder.makeUintConstant(0); - + } zero = makeSmearedConstant(zero, vectorSize); // Use OpIAdd, instead of OpBitcast to do the conversion when // generating for OpSpecConstantOp instruction. @@ -4627,126 +5126,117 @@ convOp = spv::OpBitcast; break; + case glslang::EOpConvFloat16ToUint8: + case glslang::EOpConvFloatToUint8: + case glslang::EOpConvDoubleToUint8: + case glslang::EOpConvFloat16ToUint16: + case glslang::EOpConvFloatToUint16: + case glslang::EOpConvDoubleToUint16: + case glslang::EOpConvFloat16ToUint: case glslang::EOpConvFloatToUint: case glslang::EOpConvDoubleToUint: case glslang::EOpConvFloatToUint64: case glslang::EOpConvDoubleToUint64: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvFloatToUint16: - case glslang::EOpConvDoubleToUint16: - case glslang::EOpConvFloat16ToUint16: - case glslang::EOpConvFloat16ToUint: case glslang::EOpConvFloat16ToUint64: -#endif convOp = spv::OpConvertFToU; break; - case glslang::EOpConvIntToInt64: - case glslang::EOpConvInt64ToInt: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvIntToInt16: + case glslang::EOpConvInt8ToInt16: + case glslang::EOpConvInt8ToInt: + case glslang::EOpConvInt8ToInt64: + case glslang::EOpConvInt16ToInt8: case glslang::EOpConvInt16ToInt: - case glslang::EOpConvInt64ToInt16: case glslang::EOpConvInt16ToInt64: -#endif + case glslang::EOpConvIntToInt8: + case glslang::EOpConvIntToInt16: + case glslang::EOpConvIntToInt64: + case glslang::EOpConvInt64ToInt8: + case glslang::EOpConvInt64ToInt16: + case glslang::EOpConvInt64ToInt: convOp = spv::OpSConvert; break; - case glslang::EOpConvUintToUint64: - case glslang::EOpConvUint64ToUint: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvUintToUint16: + case glslang::EOpConvUint8ToUint16: + case glslang::EOpConvUint8ToUint: + case glslang::EOpConvUint8ToUint64: + case glslang::EOpConvUint16ToUint8: case glslang::EOpConvUint16ToUint: - case glslang::EOpConvUint64ToUint16: case glslang::EOpConvUint16ToUint64: -#endif + case glslang::EOpConvUintToUint8: + case glslang::EOpConvUintToUint16: + case glslang::EOpConvUintToUint64: + case glslang::EOpConvUint64ToUint8: + case glslang::EOpConvUint64ToUint16: + case glslang::EOpConvUint64ToUint: convOp = spv::OpUConvert; break; - case glslang::EOpConvIntToUint64: - case glslang::EOpConvInt64ToUint: - case glslang::EOpConvUint64ToInt: - case glslang::EOpConvUintToInt64: -#ifdef AMD_EXTENSIONS + case glslang::EOpConvInt8ToUint16: + case glslang::EOpConvInt8ToUint: + case glslang::EOpConvInt8ToUint64: + case glslang::EOpConvInt16ToUint8: case glslang::EOpConvInt16ToUint: - case glslang::EOpConvUintToInt16: case glslang::EOpConvInt16ToUint64: - case glslang::EOpConvUint64ToInt16: - case glslang::EOpConvUint16ToInt: + case glslang::EOpConvIntToUint8: case glslang::EOpConvIntToUint16: - case glslang::EOpConvUint16ToInt64: + case glslang::EOpConvIntToUint64: + case glslang::EOpConvInt64ToUint8: case glslang::EOpConvInt64ToUint16: -#endif + case glslang::EOpConvInt64ToUint: + case glslang::EOpConvUint8ToInt16: + case glslang::EOpConvUint8ToInt: + case glslang::EOpConvUint8ToInt64: + case glslang::EOpConvUint16ToInt8: + case glslang::EOpConvUint16ToInt: + case glslang::EOpConvUint16ToInt64: + case glslang::EOpConvUintToInt8: + case glslang::EOpConvUintToInt16: + case glslang::EOpConvUintToInt64: + case glslang::EOpConvUint64ToInt8: + case glslang::EOpConvUint64ToInt16: + case glslang::EOpConvUint64ToInt: // OpSConvert/OpUConvert + OpBitCast - switch (op) { - case glslang::EOpConvIntToUint64: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvInt16ToUint64: -#endif - convOp = spv::OpSConvert; - type = builder.makeIntType(64); - break; - case glslang::EOpConvInt64ToUint: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvInt16ToUint: -#endif - convOp = spv::OpSConvert; - type = builder.makeIntType(32); - break; - case glslang::EOpConvUint64ToInt: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvUint16ToInt: -#endif - convOp = spv::OpUConvert; - type = builder.makeUintType(32); - break; - case glslang::EOpConvUintToInt64: -#ifdef AMD_EXTENSIONS - case glslang::EOpConvUint16ToInt64: -#endif - convOp = spv::OpUConvert; - type = builder.makeUintType(64); - break; -#ifdef AMD_EXTENSIONS - case glslang::EOpConvUintToInt16: - case glslang::EOpConvUint64ToInt16: - convOp = spv::OpUConvert; - type = builder.makeUintType(16); - break; - case glslang::EOpConvIntToUint16: - case glslang::EOpConvInt64ToUint16: - convOp = spv::OpSConvert; - type = builder.makeIntType(16); - break; -#endif - default: - assert(0); - break; - } - - if (vectorSize > 0) - type = builder.makeVectorType(type, vectorSize); - - operand = builder.createUnaryOp(convOp, type, operand); + operand = createConversionOperation(op, operand, vectorSize); if (builder.isInSpecConstCodeGenMode()) { // Build zero scalar or vector for OpIAdd. -#ifdef AMD_EXTENSIONS - if (op == glslang::EOpConvIntToUint64 || op == glslang::EOpConvUintToInt64 || - op == glslang::EOpConvInt16ToUint64 || op == glslang::EOpConvUint16ToInt64) - zero = builder.makeUint64Constant(0); - else if (op == glslang::EOpConvIntToUint16 || op == glslang::EOpConvUintToInt16 || - op == glslang::EOpConvInt64ToUint16 || op == glslang::EOpConvUint64ToInt16) + switch(op) { + case glslang::EOpConvInt16ToUint8: + case glslang::EOpConvIntToUint8: + case glslang::EOpConvInt64ToUint8: + case glslang::EOpConvUint16ToInt8: + case glslang::EOpConvUintToInt8: + case glslang::EOpConvUint64ToInt8: + zero = builder.makeUint8Constant(0); + break; + case glslang::EOpConvInt8ToUint16: + case glslang::EOpConvIntToUint16: + case glslang::EOpConvInt64ToUint16: + case glslang::EOpConvUint8ToInt16: + case glslang::EOpConvUintToInt16: + case glslang::EOpConvUint64ToInt16: zero = builder.makeUint16Constant(0); - else + break; + case glslang::EOpConvInt8ToUint: + case glslang::EOpConvInt16ToUint: + case glslang::EOpConvInt64ToUint: + case glslang::EOpConvUint8ToInt: + case glslang::EOpConvUint16ToInt: + case glslang::EOpConvUint64ToInt: zero = builder.makeUintConstant(0); -#else - if (op == glslang::EOpConvIntToUint64 || op == glslang::EOpConvUintToInt64) + break; + case glslang::EOpConvInt8ToUint64: + case glslang::EOpConvInt16ToUint64: + case glslang::EOpConvIntToUint64: + case glslang::EOpConvUint8ToInt64: + case glslang::EOpConvUint16ToInt64: + case glslang::EOpConvUintToInt64: zero = builder.makeUint64Constant(0); - else - zero = builder.makeUintConstant(0); -#endif - + break; + default: + assert(false && "Default missing"); + break; + } zero = makeSmearedConstant(zero, vectorSize); // Use OpIAdd, instead of OpBitcast to do the conversion when // generating for OpSpecConstantOp instruction. @@ -4770,7 +5260,9 @@ } else result = builder.createUnaryOp(convOp, destType, operand); - return builder.setPrecision(result, precision); + result = builder.setPrecision(result, decorations.precision); + builder.addDecoration(result, decorations.nonUniform); + return result; } spv::Id TGlslangToSpvTraverser::makeSmearedConstant(spv::Id constant, int vectorSize) @@ -4888,10 +5380,8 @@ // Create group invocation operations. spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy) { -#ifdef AMD_EXTENSIONS - bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64; - bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble || typeProxy == glslang::EbtFloat16; -#endif + bool isUnsigned = isTypeUnsignedInt(typeProxy); + bool isFloat = isTypeFloat(typeProxy); spv::Op opCode = spv::OpNop; std::vector spvGroupOperands; @@ -5152,15 +5642,353 @@ return builder.createCompositeConstruct(typeId, results); } -spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy) +// Create subgroup invocation operations. +spv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy) { -#ifdef AMD_EXTENSIONS - bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64 || typeProxy == glslang::EbtUint16; - bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble || typeProxy == glslang::EbtFloat16; -#else - bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64; - bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble; + // Add the required capabilities. + switch (op) { + case glslang::EOpSubgroupElect: + builder.addCapability(spv::CapabilityGroupNonUniform); + break; + case glslang::EOpSubgroupAll: + case glslang::EOpSubgroupAny: + case glslang::EOpSubgroupAllEqual: + builder.addCapability(spv::CapabilityGroupNonUniform); + builder.addCapability(spv::CapabilityGroupNonUniformVote); + break; + case glslang::EOpSubgroupBroadcast: + case glslang::EOpSubgroupBroadcastFirst: + case glslang::EOpSubgroupBallot: + case glslang::EOpSubgroupInverseBallot: + case glslang::EOpSubgroupBallotBitExtract: + case glslang::EOpSubgroupBallotBitCount: + case glslang::EOpSubgroupBallotInclusiveBitCount: + case glslang::EOpSubgroupBallotExclusiveBitCount: + case glslang::EOpSubgroupBallotFindLSB: + case glslang::EOpSubgroupBallotFindMSB: + builder.addCapability(spv::CapabilityGroupNonUniform); + builder.addCapability(spv::CapabilityGroupNonUniformBallot); + break; + case glslang::EOpSubgroupShuffle: + case glslang::EOpSubgroupShuffleXor: + builder.addCapability(spv::CapabilityGroupNonUniform); + builder.addCapability(spv::CapabilityGroupNonUniformShuffle); + break; + case glslang::EOpSubgroupShuffleUp: + case glslang::EOpSubgroupShuffleDown: + builder.addCapability(spv::CapabilityGroupNonUniform); + builder.addCapability(spv::CapabilityGroupNonUniformShuffleRelative); + break; + case glslang::EOpSubgroupAdd: + case glslang::EOpSubgroupMul: + case glslang::EOpSubgroupMin: + case glslang::EOpSubgroupMax: + case glslang::EOpSubgroupAnd: + case glslang::EOpSubgroupOr: + case glslang::EOpSubgroupXor: + case glslang::EOpSubgroupInclusiveAdd: + case glslang::EOpSubgroupInclusiveMul: + case glslang::EOpSubgroupInclusiveMin: + case glslang::EOpSubgroupInclusiveMax: + case glslang::EOpSubgroupInclusiveAnd: + case glslang::EOpSubgroupInclusiveOr: + case glslang::EOpSubgroupInclusiveXor: + case glslang::EOpSubgroupExclusiveAdd: + case glslang::EOpSubgroupExclusiveMul: + case glslang::EOpSubgroupExclusiveMin: + case glslang::EOpSubgroupExclusiveMax: + case glslang::EOpSubgroupExclusiveAnd: + case glslang::EOpSubgroupExclusiveOr: + case glslang::EOpSubgroupExclusiveXor: + builder.addCapability(spv::CapabilityGroupNonUniform); + builder.addCapability(spv::CapabilityGroupNonUniformArithmetic); + break; + case glslang::EOpSubgroupClusteredAdd: + case glslang::EOpSubgroupClusteredMul: + case glslang::EOpSubgroupClusteredMin: + case glslang::EOpSubgroupClusteredMax: + case glslang::EOpSubgroupClusteredAnd: + case glslang::EOpSubgroupClusteredOr: + case glslang::EOpSubgroupClusteredXor: + builder.addCapability(spv::CapabilityGroupNonUniform); + builder.addCapability(spv::CapabilityGroupNonUniformClustered); + break; + case glslang::EOpSubgroupQuadBroadcast: + case glslang::EOpSubgroupQuadSwapHorizontal: + case glslang::EOpSubgroupQuadSwapVertical: + case glslang::EOpSubgroupQuadSwapDiagonal: + builder.addCapability(spv::CapabilityGroupNonUniform); + builder.addCapability(spv::CapabilityGroupNonUniformQuad); + break; +#ifdef NV_EXTENSIONS + case glslang::EOpSubgroupPartitionedAdd: + case glslang::EOpSubgroupPartitionedMul: + case glslang::EOpSubgroupPartitionedMin: + case glslang::EOpSubgroupPartitionedMax: + case glslang::EOpSubgroupPartitionedAnd: + case glslang::EOpSubgroupPartitionedOr: + case glslang::EOpSubgroupPartitionedXor: + case glslang::EOpSubgroupPartitionedInclusiveAdd: + case glslang::EOpSubgroupPartitionedInclusiveMul: + case glslang::EOpSubgroupPartitionedInclusiveMin: + case glslang::EOpSubgroupPartitionedInclusiveMax: + case glslang::EOpSubgroupPartitionedInclusiveAnd: + case glslang::EOpSubgroupPartitionedInclusiveOr: + case glslang::EOpSubgroupPartitionedInclusiveXor: + case glslang::EOpSubgroupPartitionedExclusiveAdd: + case glslang::EOpSubgroupPartitionedExclusiveMul: + case glslang::EOpSubgroupPartitionedExclusiveMin: + case glslang::EOpSubgroupPartitionedExclusiveMax: + case glslang::EOpSubgroupPartitionedExclusiveAnd: + case glslang::EOpSubgroupPartitionedExclusiveOr: + case glslang::EOpSubgroupPartitionedExclusiveXor: + builder.addExtension(spv::E_SPV_NV_shader_subgroup_partitioned); + builder.addCapability(spv::CapabilityGroupNonUniformPartitionedNV); + break; +#endif + default: assert(0 && "Unhandled subgroup operation!"); + } + + const bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64; + const bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble; + const bool isBool = typeProxy == glslang::EbtBool; + + spv::Op opCode = spv::OpNop; + + // Figure out which opcode to use. + switch (op) { + case glslang::EOpSubgroupElect: opCode = spv::OpGroupNonUniformElect; break; + case glslang::EOpSubgroupAll: opCode = spv::OpGroupNonUniformAll; break; + case glslang::EOpSubgroupAny: opCode = spv::OpGroupNonUniformAny; break; + case glslang::EOpSubgroupAllEqual: opCode = spv::OpGroupNonUniformAllEqual; break; + case glslang::EOpSubgroupBroadcast: opCode = spv::OpGroupNonUniformBroadcast; break; + case glslang::EOpSubgroupBroadcastFirst: opCode = spv::OpGroupNonUniformBroadcastFirst; break; + case glslang::EOpSubgroupBallot: opCode = spv::OpGroupNonUniformBallot; break; + case glslang::EOpSubgroupInverseBallot: opCode = spv::OpGroupNonUniformInverseBallot; break; + case glslang::EOpSubgroupBallotBitExtract: opCode = spv::OpGroupNonUniformBallotBitExtract; break; + case glslang::EOpSubgroupBallotBitCount: + case glslang::EOpSubgroupBallotInclusiveBitCount: + case glslang::EOpSubgroupBallotExclusiveBitCount: opCode = spv::OpGroupNonUniformBallotBitCount; break; + case glslang::EOpSubgroupBallotFindLSB: opCode = spv::OpGroupNonUniformBallotFindLSB; break; + case glslang::EOpSubgroupBallotFindMSB: opCode = spv::OpGroupNonUniformBallotFindMSB; break; + case glslang::EOpSubgroupShuffle: opCode = spv::OpGroupNonUniformShuffle; break; + case glslang::EOpSubgroupShuffleXor: opCode = spv::OpGroupNonUniformShuffleXor; break; + case glslang::EOpSubgroupShuffleUp: opCode = spv::OpGroupNonUniformShuffleUp; break; + case glslang::EOpSubgroupShuffleDown: opCode = spv::OpGroupNonUniformShuffleDown; break; + case glslang::EOpSubgroupAdd: + case glslang::EOpSubgroupInclusiveAdd: + case glslang::EOpSubgroupExclusiveAdd: + case glslang::EOpSubgroupClusteredAdd: +#ifdef NV_EXTENSIONS + case glslang::EOpSubgroupPartitionedAdd: + case glslang::EOpSubgroupPartitionedInclusiveAdd: + case glslang::EOpSubgroupPartitionedExclusiveAdd: #endif + if (isFloat) { + opCode = spv::OpGroupNonUniformFAdd; + } else { + opCode = spv::OpGroupNonUniformIAdd; + } + break; + case glslang::EOpSubgroupMul: + case glslang::EOpSubgroupInclusiveMul: + case glslang::EOpSubgroupExclusiveMul: + case glslang::EOpSubgroupClusteredMul: +#ifdef NV_EXTENSIONS + case glslang::EOpSubgroupPartitionedMul: + case glslang::EOpSubgroupPartitionedInclusiveMul: + case glslang::EOpSubgroupPartitionedExclusiveMul: +#endif + if (isFloat) { + opCode = spv::OpGroupNonUniformFMul; + } else { + opCode = spv::OpGroupNonUniformIMul; + } + break; + case glslang::EOpSubgroupMin: + case glslang::EOpSubgroupInclusiveMin: + case glslang::EOpSubgroupExclusiveMin: + case glslang::EOpSubgroupClusteredMin: +#ifdef NV_EXTENSIONS + case glslang::EOpSubgroupPartitionedMin: + case glslang::EOpSubgroupPartitionedInclusiveMin: + case glslang::EOpSubgroupPartitionedExclusiveMin: +#endif + if (isFloat) { + opCode = spv::OpGroupNonUniformFMin; + } else if (isUnsigned) { + opCode = spv::OpGroupNonUniformUMin; + } else { + opCode = spv::OpGroupNonUniformSMin; + } + break; + case glslang::EOpSubgroupMax: + case glslang::EOpSubgroupInclusiveMax: + case glslang::EOpSubgroupExclusiveMax: + case glslang::EOpSubgroupClusteredMax: +#ifdef NV_EXTENSIONS + case glslang::EOpSubgroupPartitionedMax: + case glslang::EOpSubgroupPartitionedInclusiveMax: + case glslang::EOpSubgroupPartitionedExclusiveMax: +#endif + if (isFloat) { + opCode = spv::OpGroupNonUniformFMax; + } else if (isUnsigned) { + opCode = spv::OpGroupNonUniformUMax; + } else { + opCode = spv::OpGroupNonUniformSMax; + } + break; + case glslang::EOpSubgroupAnd: + case glslang::EOpSubgroupInclusiveAnd: + case glslang::EOpSubgroupExclusiveAnd: + case glslang::EOpSubgroupClusteredAnd: +#ifdef NV_EXTENSIONS + case glslang::EOpSubgroupPartitionedAnd: + case glslang::EOpSubgroupPartitionedInclusiveAnd: + case glslang::EOpSubgroupPartitionedExclusiveAnd: +#endif + if (isBool) { + opCode = spv::OpGroupNonUniformLogicalAnd; + } else { + opCode = spv::OpGroupNonUniformBitwiseAnd; + } + break; + case glslang::EOpSubgroupOr: + case glslang::EOpSubgroupInclusiveOr: + case glslang::EOpSubgroupExclusiveOr: + case glslang::EOpSubgroupClusteredOr: +#ifdef NV_EXTENSIONS + case glslang::EOpSubgroupPartitionedOr: + case glslang::EOpSubgroupPartitionedInclusiveOr: + case glslang::EOpSubgroupPartitionedExclusiveOr: +#endif + if (isBool) { + opCode = spv::OpGroupNonUniformLogicalOr; + } else { + opCode = spv::OpGroupNonUniformBitwiseOr; + } + break; + case glslang::EOpSubgroupXor: + case glslang::EOpSubgroupInclusiveXor: + case glslang::EOpSubgroupExclusiveXor: + case glslang::EOpSubgroupClusteredXor: +#ifdef NV_EXTENSIONS + case glslang::EOpSubgroupPartitionedXor: + case glslang::EOpSubgroupPartitionedInclusiveXor: + case glslang::EOpSubgroupPartitionedExclusiveXor: +#endif + if (isBool) { + opCode = spv::OpGroupNonUniformLogicalXor; + } else { + opCode = spv::OpGroupNonUniformBitwiseXor; + } + break; + case glslang::EOpSubgroupQuadBroadcast: opCode = spv::OpGroupNonUniformQuadBroadcast; break; + case glslang::EOpSubgroupQuadSwapHorizontal: + case glslang::EOpSubgroupQuadSwapVertical: + case glslang::EOpSubgroupQuadSwapDiagonal: opCode = spv::OpGroupNonUniformQuadSwap; break; + default: assert(0 && "Unhandled subgroup operation!"); + } + + std::vector spvGroupOperands; + + // Every operation begins with the Execution Scope operand. + spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup)); + + // Next, for all operations that use a Group Operation, push that as an operand. + switch (op) { + default: break; + case glslang::EOpSubgroupBallotBitCount: + case glslang::EOpSubgroupAdd: + case glslang::EOpSubgroupMul: + case glslang::EOpSubgroupMin: + case glslang::EOpSubgroupMax: + case glslang::EOpSubgroupAnd: + case glslang::EOpSubgroupOr: + case glslang::EOpSubgroupXor: + spvGroupOperands.push_back(spv::GroupOperationReduce); + break; + case glslang::EOpSubgroupBallotInclusiveBitCount: + case glslang::EOpSubgroupInclusiveAdd: + case glslang::EOpSubgroupInclusiveMul: + case glslang::EOpSubgroupInclusiveMin: + case glslang::EOpSubgroupInclusiveMax: + case glslang::EOpSubgroupInclusiveAnd: + case glslang::EOpSubgroupInclusiveOr: + case glslang::EOpSubgroupInclusiveXor: + spvGroupOperands.push_back(spv::GroupOperationInclusiveScan); + break; + case glslang::EOpSubgroupBallotExclusiveBitCount: + case glslang::EOpSubgroupExclusiveAdd: + case glslang::EOpSubgroupExclusiveMul: + case glslang::EOpSubgroupExclusiveMin: + case glslang::EOpSubgroupExclusiveMax: + case glslang::EOpSubgroupExclusiveAnd: + case glslang::EOpSubgroupExclusiveOr: + case glslang::EOpSubgroupExclusiveXor: + spvGroupOperands.push_back(spv::GroupOperationExclusiveScan); + break; + case glslang::EOpSubgroupClusteredAdd: + case glslang::EOpSubgroupClusteredMul: + case glslang::EOpSubgroupClusteredMin: + case glslang::EOpSubgroupClusteredMax: + case glslang::EOpSubgroupClusteredAnd: + case glslang::EOpSubgroupClusteredOr: + case glslang::EOpSubgroupClusteredXor: + spvGroupOperands.push_back(spv::GroupOperationClusteredReduce); + break; +#ifdef NV_EXTENSIONS + case glslang::EOpSubgroupPartitionedAdd: + case glslang::EOpSubgroupPartitionedMul: + case glslang::EOpSubgroupPartitionedMin: + case glslang::EOpSubgroupPartitionedMax: + case glslang::EOpSubgroupPartitionedAnd: + case glslang::EOpSubgroupPartitionedOr: + case glslang::EOpSubgroupPartitionedXor: + spvGroupOperands.push_back(spv::GroupOperationPartitionedReduceNV); + break; + case glslang::EOpSubgroupPartitionedInclusiveAdd: + case glslang::EOpSubgroupPartitionedInclusiveMul: + case glslang::EOpSubgroupPartitionedInclusiveMin: + case glslang::EOpSubgroupPartitionedInclusiveMax: + case glslang::EOpSubgroupPartitionedInclusiveAnd: + case glslang::EOpSubgroupPartitionedInclusiveOr: + case glslang::EOpSubgroupPartitionedInclusiveXor: + spvGroupOperands.push_back(spv::GroupOperationPartitionedInclusiveScanNV); + break; + case glslang::EOpSubgroupPartitionedExclusiveAdd: + case glslang::EOpSubgroupPartitionedExclusiveMul: + case glslang::EOpSubgroupPartitionedExclusiveMin: + case glslang::EOpSubgroupPartitionedExclusiveMax: + case glslang::EOpSubgroupPartitionedExclusiveAnd: + case glslang::EOpSubgroupPartitionedExclusiveOr: + case glslang::EOpSubgroupPartitionedExclusiveXor: + spvGroupOperands.push_back(spv::GroupOperationPartitionedExclusiveScanNV); + break; +#endif + } + + // Push back the operands next. + for (auto opIt : operands) { + spvGroupOperands.push_back(opIt); + } + + // Some opcodes have additional operands. + switch (op) { + default: break; + case glslang::EOpSubgroupQuadSwapHorizontal: spvGroupOperands.push_back(builder.makeUintConstant(0)); break; + case glslang::EOpSubgroupQuadSwapVertical: spvGroupOperands.push_back(builder.makeUintConstant(1)); break; + case glslang::EOpSubgroupQuadSwapDiagonal: spvGroupOperands.push_back(builder.makeUintConstant(2)); break; + } + + return builder.createOp(opCode, typeId, spvGroupOperands); +} + +spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy) +{ + bool isUnsigned = isTypeUnsignedInt(typeProxy); + bool isFloat = isTypeFloat(typeProxy); spv::Op opCode = spv::OpNop; int extBuiltins = -1; @@ -5297,10 +6125,11 @@ libCall = spv::GLSLstd450FrexpStruct; assert(builder.isPointerType(typeId1)); typeId1 = builder.getContainedTypeId(typeId1); -#ifdef AMD_EXTENSIONS int width = builder.getScalarTypeWidth(typeId1); -#else - int width = 32; +#ifdef AMD_EXTENSIONS + if (width == 16) + // Using 16-bit exp operand, enable extension SPV_AMD_gpu_shader_int16 + builder.addExtension(spv::E_SPV_AMD_gpu_shader_int16); #endif if (builder.getNumComponents(operands[0]) == 1) frexpIntType = builder.makeIntegerType(width, true); @@ -5317,6 +6146,45 @@ case glslang::EOpReadInvocation: return createInvocationsOperation(op, typeId, operands, typeProxy); + case glslang::EOpSubgroupBroadcast: + case glslang::EOpSubgroupBallotBitExtract: + case glslang::EOpSubgroupShuffle: + case glslang::EOpSubgroupShuffleXor: + case glslang::EOpSubgroupShuffleUp: + case glslang::EOpSubgroupShuffleDown: + case glslang::EOpSubgroupClusteredAdd: + case glslang::EOpSubgroupClusteredMul: + case glslang::EOpSubgroupClusteredMin: + case glslang::EOpSubgroupClusteredMax: + case glslang::EOpSubgroupClusteredAnd: + case glslang::EOpSubgroupClusteredOr: + case glslang::EOpSubgroupClusteredXor: + case glslang::EOpSubgroupQuadBroadcast: +#ifdef NV_EXTENSIONS + case glslang::EOpSubgroupPartitionedAdd: + case glslang::EOpSubgroupPartitionedMul: + case glslang::EOpSubgroupPartitionedMin: + case glslang::EOpSubgroupPartitionedMax: + case glslang::EOpSubgroupPartitionedAnd: + case glslang::EOpSubgroupPartitionedOr: + case glslang::EOpSubgroupPartitionedXor: + case glslang::EOpSubgroupPartitionedInclusiveAdd: + case glslang::EOpSubgroupPartitionedInclusiveMul: + case glslang::EOpSubgroupPartitionedInclusiveMin: + case glslang::EOpSubgroupPartitionedInclusiveMax: + case glslang::EOpSubgroupPartitionedInclusiveAnd: + case glslang::EOpSubgroupPartitionedInclusiveOr: + case glslang::EOpSubgroupPartitionedInclusiveXor: + case glslang::EOpSubgroupPartitionedExclusiveAdd: + case glslang::EOpSubgroupPartitionedExclusiveMul: + case glslang::EOpSubgroupPartitionedExclusiveMin: + case glslang::EOpSubgroupPartitionedExclusiveMax: + case glslang::EOpSubgroupPartitionedExclusiveAnd: + case glslang::EOpSubgroupPartitionedExclusiveOr: + case glslang::EOpSubgroupPartitionedExclusiveXor: +#endif + return createSubgroupOperation(op, typeId, operands, typeProxy); + #ifdef AMD_EXTENSIONS case glslang::EOpSwizzleInvocations: extBuiltins = getExtBuiltins(spv::E_SPV_AMD_shader_ballot); @@ -5509,6 +6377,30 @@ spv::MemorySemanticsWorkgroupMemoryMask | spv::MemorySemanticsAcquireReleaseMask); return 0; + case glslang::EOpSubgroupBarrier: + builder.createControlBarrier(spv::ScopeSubgroup, spv::ScopeSubgroup, spv::MemorySemanticsAllMemory | + spv::MemorySemanticsAcquireReleaseMask); + return spv::NoResult; + case glslang::EOpSubgroupMemoryBarrier: + builder.createMemoryBarrier(spv::ScopeSubgroup, spv::MemorySemanticsAllMemory | + spv::MemorySemanticsAcquireReleaseMask); + return spv::NoResult; + case glslang::EOpSubgroupMemoryBarrierBuffer: + builder.createMemoryBarrier(spv::ScopeSubgroup, spv::MemorySemanticsUniformMemoryMask | + spv::MemorySemanticsAcquireReleaseMask); + return spv::NoResult; + case glslang::EOpSubgroupMemoryBarrierImage: + builder.createMemoryBarrier(spv::ScopeSubgroup, spv::MemorySemanticsImageMemoryMask | + spv::MemorySemanticsAcquireReleaseMask); + return spv::NoResult; + case glslang::EOpSubgroupMemoryBarrierShared: + builder.createMemoryBarrier(spv::ScopeSubgroup, spv::MemorySemanticsWorkgroupMemoryMask | + spv::MemorySemanticsAcquireReleaseMask); + return spv::NoResult; + case glslang::EOpSubgroupElect: { + std::vector operands; + return createSubgroupOperation(op, typeId, operands, glslang::EbtVoid); + } #ifdef AMD_EXTENSIONS case glslang::EOpTime: { @@ -5537,11 +6429,11 @@ symbolValues[symbol->getId()] = id; if (symbol->getBasicType() != glslang::EbtBlock) { - addDecoration(id, TranslatePrecisionDecoration(symbol->getType())); - addDecoration(id, TranslateInterpolationDecoration(symbol->getType().getQualifier())); - addDecoration(id, TranslateAuxiliaryStorageDecoration(symbol->getType().getQualifier())); + builder.addDecoration(id, TranslatePrecisionDecoration(symbol->getType())); + builder.addDecoration(id, TranslateInterpolationDecoration(symbol->getType().getQualifier())); + builder.addDecoration(id, TranslateAuxiliaryStorageDecoration(symbol->getType().getQualifier())); if (symbol->getType().getQualifier().hasSpecConstantId()) - addDecoration(id, spv::DecorationSpecId, symbol->getType().getQualifier().layoutSpecConstantId); + builder.addDecoration(id, spv::DecorationSpecId, symbol->getType().getQualifier().layoutSpecConstantId); if (symbol->getQualifier().hasIndex()) builder.addDecoration(id, spv::DecorationIndex, symbol->getQualifier().layoutIndex); if (symbol->getQualifier().hasComponent()) @@ -5553,7 +6445,7 @@ if (symbol->getQualifier().hasLocation()) builder.addDecoration(id, spv::DecorationLocation, symbol->getQualifier().layoutLocation); - addDecoration(id, TranslateInvariantDecoration(symbol->getType().getQualifier())); + builder.addDecoration(id, TranslateInvariantDecoration(symbol->getType().getQualifier())); if (symbol->getQualifier().hasStream() && glslangIntermediate->isMultiStream()) { builder.addCapability(spv::CapabilityGeometryStreams); builder.addDecoration(id, spv::DecorationStream, symbol->getQualifier().layoutStream); @@ -5586,13 +6478,16 @@ std::vector memory; TranslateMemoryDecoration(symbol->getType().getQualifier(), memory); for (unsigned int i = 0; i < memory.size(); ++i) - addDecoration(id, memory[i]); + builder.addDecoration(id, memory[i]); } // built-in variable decorations spv::BuiltIn builtIn = TranslateBuiltInDecoration(symbol->getQualifier().builtIn, false); if (builtIn != spv::BuiltInMax) - addDecoration(id, spv::DecorationBuiltIn, (int)builtIn); + builder.addDecoration(id, spv::DecorationBuiltIn, (int)builtIn); + + // nonuniform + builder.addDecoration(id, TranslateNonUniformDecoration(symbol->getType().getQualifier())); #ifdef NV_EXTENSIONS if (builtIn == spv::BuiltInSampleMask) { @@ -5602,7 +6497,7 @@ decoration = (spv::Decoration)spv::DecorationOverrideCoverageNV; else decoration = (spv::Decoration)spv::DecorationMax; - addDecoration(id, decoration); + builder.addDecoration(id, decoration); if (decoration != spv::DecorationMax) { builder.addExtension(spv::E_SPV_NV_sample_mask_override_coverage); } @@ -5610,53 +6505,32 @@ else if (builtIn == spv::BuiltInLayer) { // SPV_NV_viewport_array2 extension if (symbol->getQualifier().layoutViewportRelative) { - addDecoration(id, (spv::Decoration)spv::DecorationViewportRelativeNV); + builder.addDecoration(id, (spv::Decoration)spv::DecorationViewportRelativeNV); builder.addCapability(spv::CapabilityShaderViewportMaskNV); builder.addExtension(spv::E_SPV_NV_viewport_array2); } if (symbol->getQualifier().layoutSecondaryViewportRelativeOffset != -2048) { - addDecoration(id, (spv::Decoration)spv::DecorationSecondaryViewportRelativeNV, symbol->getQualifier().layoutSecondaryViewportRelativeOffset); + builder.addDecoration(id, (spv::Decoration)spv::DecorationSecondaryViewportRelativeNV, + symbol->getQualifier().layoutSecondaryViewportRelativeOffset); builder.addCapability(spv::CapabilityShaderStereoViewNV); builder.addExtension(spv::E_SPV_NV_stereo_view_rendering); } } if (symbol->getQualifier().layoutPassthrough) { - addDecoration(id, spv::DecorationPassthroughNV); + builder.addDecoration(id, spv::DecorationPassthroughNV); builder.addCapability(spv::CapabilityGeometryShaderPassthroughNV); builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough); } #endif - return id; -} - -// If 'dec' is valid, add no-operand decoration to an object -void TGlslangToSpvTraverser::addDecoration(spv::Id id, spv::Decoration dec) -{ - if (dec != spv::DecorationMax) - builder.addDecoration(id, dec); -} - -// If 'dec' is valid, add a one-operand decoration to an object -void TGlslangToSpvTraverser::addDecoration(spv::Id id, spv::Decoration dec, unsigned value) -{ - if (dec != spv::DecorationMax) - builder.addDecoration(id, dec, value); -} - -// If 'dec' is valid, add a no-operand decoration to a struct member -void TGlslangToSpvTraverser::addMemberDecoration(spv::Id id, int member, spv::Decoration dec) -{ - if (dec != spv::DecorationMax) - builder.addMemberDecoration(id, (unsigned)member, dec); -} + if (glslangIntermediate->getHlslFunctionality1() && symbol->getType().getQualifier().semanticName != nullptr) { + builder.addExtension("SPV_GOOGLE_hlsl_functionality1"); + builder.addDecoration(id, (spv::Decoration)spv::DecorationHlslSemanticGOOGLE, + symbol->getType().getQualifier().semanticName); + } -// If 'dec' is valid, add a one-operand decoration to a struct member -void TGlslangToSpvTraverser::addMemberDecoration(spv::Id id, int member, spv::Decoration dec, unsigned value) -{ - if (dec != spv::DecorationMax) - builder.addMemberDecoration(id, (unsigned)member, dec, value); + return id; } // Make a full tree of instructions to build a SPIR-V specialization constant, @@ -5691,8 +6565,10 @@ for (int dim = 0; dim < 3; ++dim) { bool specConst = (glslangIntermediate->getLocalSizeSpecId(dim) != glslang::TQualifier::layoutNotSet); dimConstId.push_back(builder.makeUintConstant(glslangIntermediate->getLocalSize(dim), specConst)); - if (specConst) - addDecoration(dimConstId.back(), spv::DecorationSpecId, glslangIntermediate->getLocalSizeSpecId(dim)); + if (specConst) { + builder.addDecoration(dimConstId.back(), spv::DecorationSpecId, + glslangIntermediate->getLocalSizeSpecId(dim)); + } } return builder.makeCompositeConstant(builder.makeVectorType(builder.makeUintType(32), 3), dimConstId, true); } @@ -5751,6 +6627,18 @@ for (unsigned int i = 0; i < (unsigned int)glslangType.getVectorSize(); ++i) { bool zero = nextConst >= consts.size(); switch (glslangType.getBasicType()) { + case glslang::EbtInt8: + spvConsts.push_back(builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const())); + break; + case glslang::EbtUint8: + spvConsts.push_back(builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const())); + break; + case glslang::EbtInt16: + spvConsts.push_back(builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const())); + break; + case glslang::EbtUint16: + spvConsts.push_back(builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const())); + break; case glslang::EbtInt: spvConsts.push_back(builder.makeIntConstant(zero ? 0 : consts[nextConst].getIConst())); break; @@ -5763,25 +6651,15 @@ case glslang::EbtUint64: spvConsts.push_back(builder.makeUint64Constant(zero ? 0 : consts[nextConst].getU64Const())); break; -#ifdef AMD_EXTENSIONS - case glslang::EbtInt16: - spvConsts.push_back(builder.makeInt16Constant(zero ? 0 : (short)consts[nextConst].getIConst())); - break; - case glslang::EbtUint16: - spvConsts.push_back(builder.makeUint16Constant(zero ? 0 : (unsigned short)consts[nextConst].getUConst())); - break; -#endif case glslang::EbtFloat: spvConsts.push_back(builder.makeFloatConstant(zero ? 0.0F : (float)consts[nextConst].getDConst())); break; case glslang::EbtDouble: spvConsts.push_back(builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst())); break; -#ifdef AMD_EXTENSIONS case glslang::EbtFloat16: spvConsts.push_back(builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst())); break; -#endif case glslang::EbtBool: spvConsts.push_back(builder.makeBoolConstant(zero ? false : consts[nextConst].getBConst())); break; @@ -5796,6 +6674,18 @@ bool zero = nextConst >= consts.size(); spv::Id scalar = 0; switch (glslangType.getBasicType()) { + case glslang::EbtInt8: + scalar = builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const(), specConstant); + break; + case glslang::EbtUint8: + scalar = builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const(), specConstant); + break; + case glslang::EbtInt16: + scalar = builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const(), specConstant); + break; + case glslang::EbtUint16: + scalar = builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const(), specConstant); + break; case glslang::EbtInt: scalar = builder.makeIntConstant(zero ? 0 : consts[nextConst].getIConst(), specConstant); break; @@ -5808,25 +6698,15 @@ case glslang::EbtUint64: scalar = builder.makeUint64Constant(zero ? 0 : consts[nextConst].getU64Const(), specConstant); break; -#ifdef AMD_EXTENSIONS - case glslang::EbtInt16: - scalar = builder.makeInt16Constant(zero ? 0 : (short)consts[nextConst].getIConst(), specConstant); - break; - case glslang::EbtUint16: - scalar = builder.makeUint16Constant(zero ? 0 : (unsigned short)consts[nextConst].getUConst(), specConstant); - break; -#endif case glslang::EbtFloat: scalar = builder.makeFloatConstant(zero ? 0.0F : (float)consts[nextConst].getDConst(), specConstant); break; case glslang::EbtDouble: scalar = builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst(), specConstant); break; -#ifdef AMD_EXTENSIONS case glslang::EbtFloat16: scalar = builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst(), specConstant); break; -#endif case glslang::EbtBool: scalar = builder.makeBoolConstant(zero ? false : consts[nextConst].getBConst(), specConstant); break; @@ -6008,7 +6888,11 @@ { // return 1; // start // return 2; // EOpAtomicCounterDecrement gets a post decrement, to map between GLSL -> SPIR-V - return 3; // change/correct barrier-instruction operands, to match memory model group decisions + // return 3; // change/correct barrier-instruction operands, to match memory model group decisions + // return 4; // some deeper access chains: for dynamic vector component, and local Boolean component + // return 5; // make OpArrayLength result type be an int with signedness of 0 + return 6; // revert version 5 change, which makes a different (new) kind of incorrect code, + // versions 4 and 6 each generate OpArrayLength as it has long been done } // Write SPIR-V out to a binary file @@ -6032,7 +6916,9 @@ out.open(baseName, std::ios::binary | std::ios::out); if (out.fail()) printf("ERROR: Failed to open file: %s\n", baseName); - out << "\t// " GLSLANG_REVISION " " GLSLANG_DATE << std::endl; + out << "\t// " << + glslang::GetSpirvGeneratorVersion() << "." << GLSLANG_MINOR_VERSION << "." << GLSLANG_PATCH_LEVEL << + std::endl; if (varName != nullptr) { out << "\t #pragma once" << std::endl; out << "const uint32_t " << varName << "[] = {" << std::endl; @@ -6055,12 +6941,6 @@ out.close(); } -#ifdef ENABLE_OPT -void errHandler(const std::string& str) { - std::cerr << str << std::endl; -} -#endif - // // Set up the glslang traversal // @@ -6089,7 +6969,7 @@ it.finishSpv(); it.dumpSpv(spirv); -#ifdef ENABLE_OPT +#if ENABLE_OPT // If from HLSL, run spirv-opt to "legalize" the SPIR-V for Vulkan // eg. forward and remove memory writes of opaque types. if ((intermediate.getSource() == EShSourceHlsl || @@ -6106,32 +6986,35 @@ << std::endl; }); + optimizer.RegisterPass(CreateMergeReturnPass()); optimizer.RegisterPass(CreateInlineExhaustivePass()); optimizer.RegisterPass(CreateEliminateDeadFunctionsPass()); optimizer.RegisterPass(CreateScalarReplacementPass()); optimizer.RegisterPass(CreateLocalAccessChainConvertPass()); optimizer.RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()); optimizer.RegisterPass(CreateLocalSingleStoreElimPass()); + optimizer.RegisterPass(CreateAggressiveDCEPass()); optimizer.RegisterPass(CreateInsertExtractElimPass()); + optimizer.RegisterPass(CreateDeadInsertElimPass()); optimizer.RegisterPass(CreateAggressiveDCEPass()); + optimizer.RegisterPass(CreateCCPPass()); + optimizer.RegisterPass(CreateSimplificationPass()); optimizer.RegisterPass(CreateDeadBranchElimPass()); optimizer.RegisterPass(CreateCFGCleanupPass()); optimizer.RegisterPass(CreateBlockMergePass()); optimizer.RegisterPass(CreateLocalMultiStoreElimPass()); + optimizer.RegisterPass(CreateAggressiveDCEPass()); optimizer.RegisterPass(CreateInsertExtractElimPass()); + optimizer.RegisterPass(CreateDeadInsertElimPass()); + if (options->optimizeSize) { + optimizer.RegisterPass(CreateRedundancyEliminationPass()); + // TODO(greg-lunarg): Add this when AMD driver issues are resolved + // optimizer.RegisterPass(CreateCommonUniformElimPass()); + } optimizer.RegisterPass(CreateAggressiveDCEPass()); - // TODO(greg-lunarg): Add this when AMD driver issues are resolved - // if (options->optimizeSize) - // optimizer.RegisterPass(CreateCommonUniformElimPass()); if (!optimizer.Run(spirv.data(), spirv.size(), &spirv)) return; - - // Remove dead module-level objects: functions, types, vars - // TODO(greg-lunarg): Switch to spirv-opt versions when available - spv::spirvbin_t Remapper(0); - Remapper.registerErrorHandler(errHandler); - Remapper.remap(spirv, spv::spirvbin_t::DCE_ALL); } #endif diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/GlslangToSpv.h vulkan-1.1.73+dfsg/external/glslang/SPIRV/GlslangToSpv.h --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/GlslangToSpv.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/GlslangToSpv.h 2018-04-27 11:46:26.000000000 +0000 @@ -34,7 +34,7 @@ #pragma once -#if _MSC_VER >= 1900 +#if defined(_MSC_VER) && _MSC_VER >= 1900 #pragma warning(disable : 4464) // relative include path contains '..' #endif diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/GLSL.ext.AMD.h vulkan-1.1.73+dfsg/external/glslang/SPIRV/GLSL.ext.AMD.h --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/GLSL.ext.AMD.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/GLSL.ext.AMD.h 2018-04-27 11:46:26.000000000 +0000 @@ -27,13 +27,8 @@ #ifndef GLSLextAMD_H #define GLSLextAMD_H -enum BuiltIn; -enum Capability; -enum Decoration; -enum Op; - static const int GLSLextAMDVersion = 100; -static const int GLSLextAMDRevision = 6; +static const int GLSLextAMDRevision = 7; // SPV_AMD_shader_ballot static const char* const E_SPV_AMD_shader_ballot = "SPV_AMD_shader_ballot"; @@ -107,4 +102,7 @@ // SPV_AMD_shader_fragment_mask static const char* const E_SPV_AMD_shader_fragment_mask = "SPV_AMD_shader_fragment_mask"; +// SPV_AMD_gpu_shader_half_float_fetch +static const char* const E_SPV_AMD_gpu_shader_half_float_fetch = "SPV_AMD_gpu_shader_half_float_fetch"; + #endif // #ifndef GLSLextAMD_H diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/GLSL.ext.EXT.h vulkan-1.1.73+dfsg/external/glslang/SPIRV/GLSL.ext.EXT.h --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/GLSL.ext.EXT.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/GLSL.ext.EXT.h 2018-04-27 11:46:26.000000000 +0000 @@ -27,13 +27,11 @@ #ifndef GLSLextEXT_H #define GLSLextEXT_H -enum BuiltIn; -enum Op; -enum Capability; - static const int GLSLextEXTVersion = 100; static const int GLSLextEXTRevision = 1; +static const char* const E_SPV_EXT_shader_stencil_export = "SPV_EXT_shader_stencil_export"; +static const char* const E_SPV_EXT_shader_viewport_index_layer = "SPV_EXT_shader_viewport_index_layer"; static const char* const E_SPV_EXT_fragment_fully_covered = "SPV_EXT_fragment_fully_covered"; #endif // #ifndef GLSLextEXT_H diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/GLSL.ext.KHR.h vulkan-1.1.73+dfsg/external/glslang/SPIRV/GLSL.ext.KHR.h --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/GLSL.ext.KHR.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/GLSL.ext.KHR.h 2018-04-27 11:46:26.000000000 +0000 @@ -27,10 +27,6 @@ #ifndef GLSLextKHR_H #define GLSLextKHR_H -enum BuiltIn; -enum Op; -enum Capability; - static const int GLSLextKHRVersion = 100; static const int GLSLextKHRRevision = 2; @@ -42,7 +38,5 @@ static const char* const E_SPV_KHR_16bit_storage = "SPV_KHR_16bit_storage"; static const char* const E_SPV_KHR_storage_buffer_storage_class = "SPV_KHR_storage_buffer_storage_class"; static const char* const E_SPV_KHR_post_depth_coverage = "SPV_KHR_post_depth_coverage"; -static const char* const E_SPV_EXT_shader_stencil_export = "SPV_EXT_shader_stencil_export"; -static const char* const E_SPV_EXT_shader_viewport_index_layer = "SPV_EXT_shader_viewport_index_layer"; #endif // #ifndef GLSLextKHR_H diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/GLSL.ext.NV.h vulkan-1.1.73+dfsg/external/glslang/SPIRV/GLSL.ext.NV.h --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/GLSL.ext.NV.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/GLSL.ext.NV.h 2018-04-27 11:46:26.000000000 +0000 @@ -51,4 +51,7 @@ //SPV_NVX_multiview_per_view_attributes const char* const E_SPV_NVX_multiview_per_view_attributes = "SPV_NVX_multiview_per_view_attributes"; +//SPV_NV_shader_subgroup_partitioned +const char* const E_SPV_NV_shader_subgroup_partitioned = "SPV_NV_shader_subgroup_partitioned"; + #endif // #ifndef GLSLextNV_H \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/spirv.hpp vulkan-1.1.73+dfsg/external/glslang/SPIRV/spirv.hpp --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/spirv.hpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/spirv.hpp 2018-04-27 11:46:26.000000000 +0000 @@ -46,12 +46,12 @@ typedef unsigned int Id; -#define SPV_VERSION 0x10200 -#define SPV_REVISION 3 +#define SPV_VERSION 0x10300 +#define SPV_REVISION 1 static const unsigned int MagicNumber = 0x07230203; -static const unsigned int Version = 0x00010200; -static const unsigned int Revision = 3; +static const unsigned int Version = 0x00010300; +static const unsigned int Revision = 1; static const unsigned int OpCodeMask = 0xffff; static const unsigned int WordCountShift = 16; @@ -393,6 +393,9 @@ DecorationPassthroughNV = 5250, DecorationViewportRelativeNV = 5252, DecorationSecondaryViewportRelativeNV = 5256, + DecorationNonUniformEXT = 5300, + DecorationHlslCounterBufferGOOGLE = 5634, + DecorationHlslSemanticGOOGLE = 5635, DecorationMax = 0x7fffffff, }; @@ -438,10 +441,15 @@ BuiltInSubgroupLocalInvocationId = 41, BuiltInVertexIndex = 42, BuiltInInstanceIndex = 43, + BuiltInSubgroupEqMask = 4416, BuiltInSubgroupEqMaskKHR = 4416, + BuiltInSubgroupGeMask = 4417, BuiltInSubgroupGeMaskKHR = 4417, + BuiltInSubgroupGtMask = 4418, BuiltInSubgroupGtMaskKHR = 4418, + BuiltInSubgroupLeMask = 4419, BuiltInSubgroupLeMaskKHR = 4419, + BuiltInSubgroupLtMask = 4420, BuiltInSubgroupLtMaskKHR = 4420, BuiltInBaseVertex = 4424, BuiltInBaseInstance = 4425, @@ -564,6 +572,10 @@ GroupOperationReduce = 0, GroupOperationInclusiveScan = 1, GroupOperationExclusiveScan = 2, + GroupOperationClusteredReduce = 3, + GroupOperationPartitionedReduceNV = 6, + GroupOperationPartitionedInclusiveScanNV = 7, + GroupOperationPartitionedExclusiveScanNV = 8, GroupOperationMax = 0x7fffffff, }; @@ -644,6 +656,14 @@ CapabilitySubgroupDispatch = 58, CapabilityNamedBarrier = 59, CapabilityPipeStorage = 60, + CapabilityGroupNonUniform = 61, + CapabilityGroupNonUniformVote = 62, + CapabilityGroupNonUniformArithmetic = 63, + CapabilityGroupNonUniformBallot = 64, + CapabilityGroupNonUniformShuffle = 65, + CapabilityGroupNonUniformShuffleRelative = 66, + CapabilityGroupNonUniformClustered = 67, + CapabilityGroupNonUniformQuad = 68, CapabilitySubgroupBallotKHR = 4423, CapabilityDrawParameters = 4427, CapabilitySubgroupVoteKHR = 4431, @@ -659,6 +679,7 @@ CapabilityVariablePointers = 4442, CapabilityAtomicStorageOps = 4445, CapabilitySampleMaskPostDepthCoverage = 4447, + CapabilityFloat16ImageAMD = 5008, CapabilityImageGatherBiasLodAMD = 5009, CapabilityFragmentMaskAMD = 5010, CapabilityStencilExportEXT = 5013, @@ -671,6 +692,19 @@ CapabilityShaderStereoViewNV = 5259, CapabilityPerViewAttributesNV = 5260, CapabilityFragmentFullyCoveredEXT = 5265, + CapabilityGroupNonUniformPartitionedNV = 5297, + CapabilityShaderNonUniformEXT = 5301, + CapabilityRuntimeDescriptorArrayEXT = 5302, + CapabilityInputAttachmentArrayDynamicIndexingEXT = 5303, + CapabilityUniformTexelBufferArrayDynamicIndexingEXT = 5304, + CapabilityStorageTexelBufferArrayDynamicIndexingEXT = 5305, + CapabilityUniformBufferArrayNonUniformIndexingEXT = 5306, + CapabilitySampledImageArrayNonUniformIndexingEXT = 5307, + CapabilityStorageBufferArrayNonUniformIndexingEXT = 5308, + CapabilityStorageImageArrayNonUniformIndexingEXT = 5309, + CapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310, + CapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311, + CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312, CapabilitySubgroupShuffleINTEL = 5568, CapabilitySubgroupBufferBlockIOINTEL = 5569, CapabilitySubgroupImageBlockIOINTEL = 5570, @@ -984,6 +1018,40 @@ OpModuleProcessed = 330, OpExecutionModeId = 331, OpDecorateId = 332, + OpGroupNonUniformElect = 333, + OpGroupNonUniformAll = 334, + OpGroupNonUniformAny = 335, + OpGroupNonUniformAllEqual = 336, + OpGroupNonUniformBroadcast = 337, + OpGroupNonUniformBroadcastFirst = 338, + OpGroupNonUniformBallot = 339, + OpGroupNonUniformInverseBallot = 340, + OpGroupNonUniformBallotBitExtract = 341, + OpGroupNonUniformBallotBitCount = 342, + OpGroupNonUniformBallotFindLSB = 343, + OpGroupNonUniformBallotFindMSB = 344, + OpGroupNonUniformShuffle = 345, + OpGroupNonUniformShuffleXor = 346, + OpGroupNonUniformShuffleUp = 347, + OpGroupNonUniformShuffleDown = 348, + OpGroupNonUniformIAdd = 349, + OpGroupNonUniformFAdd = 350, + OpGroupNonUniformIMul = 351, + OpGroupNonUniformFMul = 352, + OpGroupNonUniformSMin = 353, + OpGroupNonUniformUMin = 354, + OpGroupNonUniformFMin = 355, + OpGroupNonUniformSMax = 356, + OpGroupNonUniformUMax = 357, + OpGroupNonUniformFMax = 358, + OpGroupNonUniformBitwiseAnd = 359, + OpGroupNonUniformBitwiseOr = 360, + OpGroupNonUniformBitwiseXor = 361, + OpGroupNonUniformLogicalAnd = 362, + OpGroupNonUniformLogicalOr = 363, + OpGroupNonUniformLogicalXor = 364, + OpGroupNonUniformQuadBroadcast = 365, + OpGroupNonUniformQuadSwap = 366, OpSubgroupBallotKHR = 4421, OpSubgroupFirstInvocationKHR = 4422, OpSubgroupAllKHR = 4428, @@ -1000,6 +1068,7 @@ OpGroupSMaxNonUniformAMD = 5007, OpFragmentMaskFetchAMD = 5011, OpFragmentFetchAMD = 5012, + OpGroupNonUniformPartitionNV = 5296, OpSubgroupShuffleINTEL = 5571, OpSubgroupShuffleDownINTEL = 5572, OpSubgroupShuffleUpINTEL = 5573, @@ -1008,6 +1077,8 @@ OpSubgroupBlockWriteINTEL = 5576, OpSubgroupImageBlockReadINTEL = 5577, OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, OpMax = 0x7fffffff, }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/SpvBuilder.cpp vulkan-1.1.73+dfsg/external/glslang/SPIRV/SpvBuilder.cpp --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/SpvBuilder.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/SpvBuilder.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -46,9 +46,7 @@ #include "SpvBuilder.h" -#ifdef AMD_EXTENSIONS - #include "hex_float.h" -#endif +#include "hex_float.h" #ifndef _WIN32 #include @@ -194,6 +192,9 @@ // deal with capabilities switch (width) { + case 8: + addCapability(CapabilityInt8); + break; case 16: addCapability(CapabilityInt16); break; @@ -622,7 +623,7 @@ // See if a scalar constant of this type has already been created, so it // can be reused rather than duplicated. (Required by the specification). -Id Builder::findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value) const +Id Builder::findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value) { Instruction* constant; for (int i = 0; i < (int)groupedConstants[typeClass].size(); ++i) { @@ -637,7 +638,7 @@ } // Version of findScalarConstant (see above) for scalars that take two operands (e.g. a 'double' or 'int64'). -Id Builder::findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned v1, unsigned v2) const +Id Builder::findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned v1, unsigned v2) { Instruction* constant; for (int i = 0; i < (int)groupedConstants[typeClass].size(); ++i) { @@ -819,7 +820,6 @@ return c->getResultId(); } -#ifdef AMD_EXTENSIONS Id Builder::makeFloat16Constant(float f16, bool specConstant) { Op opcode = specConstant ? OpSpecConstant : OpConstant; @@ -847,9 +847,27 @@ return c->getResultId(); } -#endif -Id Builder::findCompositeConstant(Op typeClass, const std::vector& comps) const +Id Builder::makeFpConstant(Id type, double d, bool specConstant) +{ + assert(isFloatType(type)); + + switch (getScalarTypeWidth(type)) { + case 16: + return makeFloat16Constant((float)d, specConstant); + case 32: + return makeFloatConstant((float)d, specConstant); + case 64: + return makeDoubleConstant(d, specConstant); + default: + break; + } + + assert(false); + return NoResult; +} + +Id Builder::findCompositeConstant(Op typeClass, const std::vector& comps) { Instruction* constant = 0; bool found = false; @@ -877,6 +895,30 @@ return found ? constant->getResultId() : NoResult; } +Id Builder::findStructConstant(Id typeId, const std::vector& comps) +{ + Instruction* constant = 0; + bool found = false; + for (int i = 0; i < (int)groupedStructConstants[typeId].size(); ++i) { + constant = groupedStructConstants[typeId][i]; + + // same contents? + bool mismatch = false; + for (int op = 0; op < constant->getNumOperands(); ++op) { + if (constant->getIdOperand(op) != comps[op]) { + mismatch = true; + break; + } + } + if (! mismatch) { + found = true; + break; + } + } + + return found ? constant->getResultId() : NoResult; +} + // Comments in header Id Builder::makeCompositeConstant(Id typeId, const std::vector& members, bool specConstant) { @@ -887,25 +929,33 @@ switch (typeClass) { case OpTypeVector: case OpTypeArray: - case OpTypeStruct: case OpTypeMatrix: + if (! specConstant) { + Id existing = findCompositeConstant(typeClass, members); + if (existing) + return existing; + } + break; + case OpTypeStruct: + if (! specConstant) { + Id existing = findStructConstant(typeId, members); + if (existing) + return existing; + } break; default: assert(0); return makeFloatConstant(0.0); } - if (! specConstant) { - Id existing = findCompositeConstant(typeClass, members); - if (existing) - return existing; - } - Instruction* c = new Instruction(getUniqueId(), typeId, opcode); for (int op = 0; op < (int)members.size(); ++op) c->addIdOperand(members[op]); constantsTypesGlobals.push_back(std::unique_ptr(c)); - groupedConstants[typeClass].push_back(c); + if (typeClass == OpTypeStruct) + groupedStructConstants[typeId].push_back(c); + else + groupedConstants[typeClass].push_back(c); module.mapInstruction(c); return c->getResultId(); @@ -962,6 +1012,7 @@ { if (decoration == spv::DecorationMax) return; + Instruction* dec = new Instruction(OpDecorate); dec->addIdOperand(id); dec->addImmediateOperand(decoration); @@ -971,8 +1022,37 @@ decorations.push_back(std::unique_ptr(dec)); } +void Builder::addDecoration(Id id, Decoration decoration, const char* s) +{ + if (decoration == spv::DecorationMax) + return; + + Instruction* dec = new Instruction(OpDecorateStringGOOGLE); + dec->addIdOperand(id); + dec->addImmediateOperand(decoration); + dec->addStringOperand(s); + + decorations.push_back(std::unique_ptr(dec)); +} + +void Builder::addDecorationId(Id id, Decoration decoration, Id idDecoration) +{ + if (decoration == spv::DecorationMax) + return; + + Instruction* dec = new Instruction(OpDecorateId); + dec->addIdOperand(id); + dec->addImmediateOperand(decoration); + dec->addIdOperand(idDecoration); + + decorations.push_back(std::unique_ptr(dec)); +} + void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, int num) { + if (decoration == spv::DecorationMax) + return; + Instruction* dec = new Instruction(OpMemberDecorate); dec->addIdOperand(id); dec->addImmediateOperand(member); @@ -983,6 +1063,20 @@ decorations.push_back(std::unique_ptr(dec)); } +void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, const char *s) +{ + if (decoration == spv::DecorationMax) + return; + + Instruction* dec = new Instruction(OpMemberDecorateStringGOOGLE); + dec->addIdOperand(id); + dec->addImmediateOperand(member); + dec->addImmediateOperand(decoration); + dec->addStringOperand(s); + + decorations.push_back(std::unique_ptr(dec)); +} + // Comments in header Function* Builder::makeEntryPoint(const char* entryPoint) { @@ -1388,16 +1482,13 @@ return createCompositeInsert(source, target, typeId, channels.front()); Instruction* swizzle = new Instruction(getUniqueId(), typeId, OpVectorShuffle); + assert(isVector(target)); swizzle->addIdOperand(target); - if (accessChain.component != NoResult) - // For dynamic component selection, source does not involve in l-value swizzle - swizzle->addIdOperand(target); - else { - assert(getNumComponents(source) == (int)channels.size()); - assert(isVector(source)); - swizzle->addIdOperand(source); - } + + assert(getNumComponents(source) == (int)channels.size()); + assert(isVector(source)); + swizzle->addIdOperand(source); // Set up an identity shuffle from the base value to the result value unsigned int components[4]; @@ -1406,12 +1497,8 @@ components[i] = i; // Punch in the l-value swizzle - for (int i = 0; i < (int)channels.size(); ++i) { - if (accessChain.component != NoResult) - components[i] = channels[i]; // Only shuffle the base value - else - components[channels[i]] = numTargetComponents + i; - } + for (int i = 0; i < (int)channels.size(); ++i) + components[channels[i]] = numTargetComponents + i; // finish the instruction with these components selectors for (int i = 0; i < numTargetComponents; ++i) @@ -1726,7 +1813,11 @@ break; } case OpImageQueryLod: +#ifdef AMD_EXTENSIONS + resultType = makeVectorType(getScalarTypeId(getTypeId(parameters.coords)), 2); +#else resultType = makeVectorType(makeFloatType(32), 2); +#endif break; case OpImageQueryLevels: case OpImageQuerySamples: @@ -2203,7 +2294,7 @@ accessChain.preSwizzleBaseType = preSwizzleBaseType; // if needed, propagate the swizzle for the current access chain - if (accessChain.swizzle.size()) { + if (accessChain.swizzle.size() > 0) { std::vector oldSwizzle = accessChain.swizzle; accessChain.swizzle.resize(0); for (unsigned int i = 0; i < swizzle.size(); ++i) { @@ -2224,34 +2315,28 @@ transferAccessChainSwizzle(true); Id base = collapseAccessChain(); + Id source = rvalue; + + // dynamic component should be gone + assert(accessChain.component == NoResult); // If swizzle still exists, it is out-of-order or not full, we must load the target vector, // extract and insert elements to perform writeMask and/or swizzle. - Id source = NoResult; - if (accessChain.swizzle.size()) { + if (accessChain.swizzle.size() > 0) { Id tempBaseId = createLoad(base); - source = createLvalueSwizzle(getTypeId(tempBaseId), tempBaseId, rvalue, accessChain.swizzle); + source = createLvalueSwizzle(getTypeId(tempBaseId), tempBaseId, source, accessChain.swizzle); } - // dynamic component selection - if (accessChain.component != NoResult) { - Id tempBaseId = (source == NoResult) ? createLoad(base) : source; - source = createVectorInsertDynamic(tempBaseId, getTypeId(tempBaseId), rvalue, accessChain.component); - } - - if (source == NoResult) - source = rvalue; - createStore(source, base); } // Comments in header -Id Builder::accessChainLoad(Decoration precision, Id resultType) +Id Builder::accessChainLoad(Decoration precision, Decoration nonUniform, Id resultType) { Id id; if (accessChain.isRValue) { - // transfer access chain, but keep it static, so we can stay in registers + // transfer access chain, but try to stay in registers transferAccessChainSwizzle(false); if (accessChain.indexChain.size() > 0) { Id swizzleBase = accessChain.preSwizzleBaseType != NoType ? accessChain.preSwizzleBaseType : resultType; @@ -2292,6 +2377,7 @@ // load through the access chain id = createLoad(collapseAccessChain()); setPrecision(id, precision); + addDecoration(id, nonUniform); } // Done, unless there are swizzles to do @@ -2299,19 +2385,20 @@ return id; // Do remaining swizzling - // First, static swizzling - if (accessChain.swizzle.size()) { - // static swizzle + + // Do the basic swizzle + if (accessChain.swizzle.size() > 0) { Id swizzledType = getScalarTypeId(getTypeId(id)); if (accessChain.swizzle.size() > 1) swizzledType = makeVectorType(swizzledType, (int)accessChain.swizzle.size()); id = createRvalueSwizzle(precision, swizzledType, id, accessChain.swizzle); } - // dynamic single-component selection + // Do the dynamic component if (accessChain.component != NoResult) id = setPrecision(createVectorExtractDynamic(id, resultType, accessChain.component), precision); + addDecoration(id, nonUniform); return id; } @@ -2434,7 +2521,6 @@ // Debug instructions dumpInstructions(out, strings); - dumpModuleProcesses(out); dumpSourceInstructions(out); for (int e = 0; e < (int)sourceExtensions.size(); ++e) { Instruction sourceExtInst(0, 0, OpSourceExtension); @@ -2442,7 +2528,7 @@ sourceExtInst.dump(out); } dumpInstructions(out, names); - dumpInstructions(out, lines); + dumpModuleProcesses(out); // Annotation instructions dumpInstructions(out, decorations); @@ -2458,26 +2544,66 @@ // Protected methods. // -// Turn the described access chain in 'accessChain' into an instruction +// Turn the described access chain in 'accessChain' into an instruction(s) // computing its address. This *cannot* include complex swizzles, which must -// be handled after this is called, but it does include swizzles that select -// an individual element, as a single address of a scalar type can be -// computed by an OpAccessChain instruction. +// be handled after this is called. +// +// Can generate code. Id Builder::collapseAccessChain() { assert(accessChain.isRValue == false); - if (accessChain.indexChain.size() > 0) { - if (accessChain.instr == 0) { - StorageClass storageClass = (StorageClass)module.getStorageClass(getTypeId(accessChain.base)); - accessChain.instr = createAccessChain(storageClass, accessChain.base, accessChain.indexChain); - } - + // did we already emit an access chain for this? + if (accessChain.instr != NoResult) return accessChain.instr; - } else + + // If we have a dynamic component, we can still transfer + // that into a final operand to the access chain. We need to remap the + // dynamic component through the swizzle to get a new dynamic component to + // update. + // + // This was not done in transferAccessChainSwizzle() because it might + // generate code. + remapDynamicSwizzle(); + if (accessChain.component != NoResult) { + // transfer the dynamic component to the access chain + accessChain.indexChain.push_back(accessChain.component); + accessChain.component = NoResult; + } + + // note that non-trivial swizzling is left pending + + // do we have an access chain? + if (accessChain.indexChain.size() == 0) return accessChain.base; - // note that non-trivial swizzling is left pending... + // emit the access chain + StorageClass storageClass = (StorageClass)module.getStorageClass(getTypeId(accessChain.base)); + accessChain.instr = createAccessChain(storageClass, accessChain.base, accessChain.indexChain); + + return accessChain.instr; +} + +// For a dynamic component selection of a swizzle. +// +// Turn the swizzle and dynamic component into just a dynamic component. +// +// Generates code. +void Builder::remapDynamicSwizzle() +{ + // do we have a swizzle to remap a dynamic component through? + if (accessChain.component != NoResult && accessChain.swizzle.size() > 1) { + // build a vector of the swizzle for the component to map into + std::vector components; + for (int c = 0; c < (int)accessChain.swizzle.size(); ++c) + components.push_back(makeUintConstant(accessChain.swizzle[c])); + Id mapType = makeVectorType(makeUintType(32), (int)accessChain.swizzle.size()); + Id map = makeCompositeConstant(mapType, components); + + // use it + accessChain.component = createVectorExtractDynamic(map, makeUintType(32), accessChain.component); + accessChain.swizzle.clear(); + } } // clear out swizzle if it is redundant, that is reselecting the same components @@ -2503,38 +2629,30 @@ // To the extent any swizzling can become part of the chain // of accesses instead of a post operation, make it so. -// If 'dynamic' is true, include transferring a non-static component index, -// otherwise, only transfer static indexes. +// If 'dynamic' is true, include transferring the dynamic component, +// otherwise, leave it pending. // -// Also, Boolean vectors are likely to be special. While -// for external storage, they should only be integer types, -// function-local bool vectors could use sub-word indexing, -// so keep that as a separate Insert/Extract on a loaded vector. +// Does not generate code. just updates the access chain. void Builder::transferAccessChainSwizzle(bool dynamic) { - // too complex? - if (accessChain.swizzle.size() > 1) - return; - // non existent? if (accessChain.swizzle.size() == 0 && accessChain.component == NoResult) return; - // single component... - - // skip doing it for Boolean vectors - if (isBoolType(getContainedTypeId(accessChain.preSwizzleBaseType))) + // too complex? + // (this requires either a swizzle, or generating code for a dynamic component) + if (accessChain.swizzle.size() > 1) return; + // single component, either in the swizzle and/or dynamic component if (accessChain.swizzle.size() == 1) { - // handle static component + assert(accessChain.component == NoResult); + // handle static component selection accessChain.indexChain.push_back(makeUintConstant(accessChain.swizzle.front())); accessChain.swizzle.clear(); - // note, the only valid remaining dynamic access would be to this one - // component, so don't bother even looking at accessChain.component accessChain.preSwizzleBaseType = NoType; - accessChain.component = NoResult; } else if (dynamic && accessChain.component != NoResult) { + assert(accessChain.swizzle.size() == 0); // handle dynamic component accessChain.indexChain.push_back(accessChain.component); accessChain.preSwizzleBaseType = NoType; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/SpvBuilder.h vulkan-1.1.73+dfsg/external/glslang/SPIRV/SpvBuilder.h --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/SpvBuilder.h 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/SpvBuilder.h 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ // // Copyright (C) 2014-2015 LunarG, Inc. // Copyright (C) 2015-2016 Google, Inc. +// Copyright (C) 2017 ARM Limited. // // All rights reserved. // @@ -55,6 +56,7 @@ #include #include #include +#include namespace spv { @@ -65,6 +67,8 @@ static const int maxMatrixSize = 4; + unsigned int getSpvVersion() const { return spvVersion; } + void setSource(spv::SourceLanguage lang, int version) { source = lang; @@ -149,7 +153,7 @@ bool isAggregate(Id resultId) const { return isAggregateType(getTypeId(resultId)); } bool isSampledImage(Id resultId) const { return isSampledImageType(getTypeId(resultId)); } - bool isBoolType(Id typeId) const { return groupedTypes[OpTypeBool].size() > 0 && typeId == groupedTypes[OpTypeBool].back()->getResultId(); } + bool isBoolType(Id typeId) { return groupedTypes[OpTypeBool].size() > 0 && typeId == groupedTypes[OpTypeBool].back()->getResultId(); } bool isIntType(Id typeId) const { return getTypeClass(typeId) == OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) != 0; } bool isUintType(Id typeId) const { return getTypeClass(typeId) == OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) == 0; } bool isFloatType(Id typeId) const { return getTypeClass(typeId) == OpTypeFloat; } @@ -211,19 +215,18 @@ // For making new constants (will return old constant if the requested one was already made). Id makeBoolConstant(bool b, bool specConstant = false); + Id makeInt8Constant(int i, bool specConstant = false) { return makeIntConstant(makeIntType(8), (unsigned)i, specConstant); } + Id makeUint8Constant(unsigned u, bool specConstant = false) { return makeIntConstant(makeUintType(8), u, specConstant); } + Id makeInt16Constant(int i, bool specConstant = false) { return makeIntConstant(makeIntType(16), (unsigned)i, specConstant); } + Id makeUint16Constant(unsigned u, bool specConstant = false) { return makeIntConstant(makeUintType(16), u, specConstant); } Id makeIntConstant(int i, bool specConstant = false) { return makeIntConstant(makeIntType(32), (unsigned)i, specConstant); } Id makeUintConstant(unsigned u, bool specConstant = false) { return makeIntConstant(makeUintType(32), u, specConstant); } Id makeInt64Constant(long long i, bool specConstant = false) { return makeInt64Constant(makeIntType(64), (unsigned long long)i, specConstant); } Id makeUint64Constant(unsigned long long u, bool specConstant = false) { return makeInt64Constant(makeUintType(64), u, specConstant); } -#ifdef AMD_EXTENSIONS - Id makeInt16Constant(short i, bool specConstant = false) { return makeIntConstant(makeIntType(16), (unsigned)((unsigned short)i), specConstant); } - Id makeUint16Constant(unsigned short u, bool specConstant = false) { return makeIntConstant(makeUintType(16), (unsigned)u, specConstant); } -#endif Id makeFloatConstant(float f, bool specConstant = false); Id makeDoubleConstant(double d, bool specConstant = false); -#ifdef AMD_EXTENSIONS Id makeFloat16Constant(float f16, bool specConstant = false); -#endif + Id makeFpConstant(Id type, double d, bool specConstant = false); // Turn the array of constants into a proper spv constant of the requested type. Id makeCompositeConstant(Id type, const std::vector& comps, bool specConst = false); @@ -234,7 +237,10 @@ void addName(Id, const char* name); void addMemberName(Id, int member, const char* name); void addDecoration(Id, Decoration, int num = -1); + void addDecoration(Id, Decoration, const char*); + void addDecorationId(Id id, Decoration, Id idDecoration); void addMemberDecoration(Id, unsigned int member, Decoration, int num = -1); + void addMemberDecoration(Id, unsigned int member, Decoration, const char*); // At the end of what block do the next create*() instructions go? void setBuildPoint(Block* bp) { buildPoint = bp; } @@ -330,7 +336,7 @@ // Generally, the type of 'scalar' does not need to be the same type as the components in 'vector'. // The type of the created vector is a vector of components of the same type as the scalar. // - // Note: One of the arguments will change, with the result coming back that way rather than + // Note: One of the arguments will change, with the result coming back that way rather than // through the return value. void promoteScalar(Decoration precision, Id& left, Id& right); @@ -533,19 +539,22 @@ // push new swizzle onto the end of any existing swizzle, merging into a single swizzle void accessChainPushSwizzle(std::vector& swizzle, Id preSwizzleBaseType); - // push a variable component selection onto the access chain; supporting only one, so unsided + // push a dynamic component selection onto the access chain, only applicable with a + // non-trivial swizzle or no swizzle void accessChainPushComponent(Id component, Id preSwizzleBaseType) { - accessChain.component = component; - if (accessChain.preSwizzleBaseType == NoType) - accessChain.preSwizzleBaseType = preSwizzleBaseType; + if (accessChain.swizzle.size() != 1) { + accessChain.component = component; + if (accessChain.preSwizzleBaseType == NoType) + accessChain.preSwizzleBaseType = preSwizzleBaseType; + } } // use accessChain and swizzle to store value void accessChainStore(Id rvalue); // use accessChain and swizzle to load an r-value - Id accessChainLoad(Decoration precision, Id ResultType); + Id accessChainLoad(Decoration precision, Decoration nonUniform, Id ResultType); // get the direct pointer for an l-value Id accessChainGetLValue(); @@ -573,10 +582,12 @@ protected: Id makeIntConstant(Id typeId, unsigned value, bool specConstant); Id makeInt64Constant(Id typeId, unsigned long long value, bool specConstant); - Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value) const; - Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned v1, unsigned v2) const; - Id findCompositeConstant(Op typeClass, const std::vector& comps) const; + Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value); + Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned v1, unsigned v2); + Id findCompositeConstant(Op typeClass, const std::vector& comps); + Id findStructConstant(Id typeId, const std::vector& comps); Id collapseAccessChain(); + void remapDynamicSwizzle(); void transferAccessChainSwizzle(bool dynamic); void simplifyAccessChainSwizzle(); void createAndSetNoPredecessorBlock(const char*); @@ -612,15 +623,15 @@ std::vector > entryPoints; std::vector > executionModes; std::vector > names; - std::vector > lines; std::vector > decorations; std::vector > constantsTypesGlobals; std::vector > externals; std::vector > functions; // not output, internally used for quick & dirty canonical (unique) creation - std::vector groupedConstants[OpConstant]; // all types appear before OpConstant - std::vector groupedTypes[OpConstant]; + std::unordered_map> groupedConstants; // map type opcodes to constant inst. + std::unordered_map> groupedStructConstants; // map struct-id to constant instructions + std::unordered_map> groupedTypes; // map type opcodes to type instructions // stack of switches std::stack switchMerges; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/SPIRV/SPVRemapper.cpp vulkan-1.1.73+dfsg/external/glslang/SPIRV/SPVRemapper.cpp --- vulkan-1.1.70+dfsg1/external/glslang/SPIRV/SPVRemapper.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/SPIRV/SPVRemapper.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -256,7 +256,7 @@ spv::Id spirvbin_t::localId(spv::Id id, spv::Id newId) { - assert(id != spv::NoResult && newId != spv::NoResult); + //assert(id != spv::NoResult && newId != spv::NoResult); if (id > bound()) { error(std::string("ID out of range: ") + std::to_string(id)); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/StandAlone/StandAlone.cpp vulkan-1.1.73+dfsg/external/glslang/StandAlone/StandAlone.cpp --- vulkan-1.1.70+dfsg1/external/glslang/StandAlone/StandAlone.cpp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/StandAlone/StandAlone.cpp 2018-04-27 11:46:26.000000000 +0000 @@ -99,7 +99,9 @@ EOptionOptimizeDisable = (1 << 28), EOptionOptimizeSize = (1 << 29), EOptionInvertY = (1 << 30), + EOptionDumpBareVersion = (1 << 31), }; +bool targetHlslFunctionality1 = false; // // Return codes from main/exit(). @@ -155,12 +157,16 @@ const char* sourceEntryPointName = nullptr; const char* shaderStageName = nullptr; const char* variableName = nullptr; +bool HlslEnable16BitTypes = false; std::vector IncludeDirectoryList; -int ClientInputSemanticsVersion = 100; // maps to, say, #define VULKAN 100 -int VulkanClientVersion = 100; // would map to, say, Vulkan 1.0 -int OpenGLClientVersion = 450; // doesn't influence anything yet, but maps to OpenGL 4.50 -unsigned int TargetVersion = 0x00010000; // maps to, say, SPIR-V 1.0 -std::vector Processes; // what should be recorded by OpModuleProcessed, or equivalent +int ClientInputSemanticsVersion = 100; // maps to, say, #define VULKAN 100 +glslang::EShTargetClientVersion VulkanClientVersion = + glslang::EShTargetVulkan_1_0; // would map to, say, Vulkan 1.0 +glslang::EShTargetClientVersion OpenGLClientVersion = + glslang::EShTargetOpenGL_450; // doesn't influence anything yet, but maps to OpenGL 4.50 +glslang::EShTargetLanguageVersion TargetVersion = + glslang::EShTargetSpv_1_0; // maps to, say, SPIR-V 1.0 +std::vector Processes; // what should be recorded by OpModuleProcessed, or equivalent // Per descriptor-set binding base data typedef std::map TPerSetBaseBinding; @@ -449,6 +455,11 @@ lowerword == "hlsl-iomapper" || lowerword == "hlsl-iomapping") { Options |= EOptionHlslIoMapping; + } else if (lowerword == "hlsl-enable-16bit-types") { + HlslEnable16BitTypes = true; + } else if (lowerword == "invert-y" || // synonyms + lowerword == "iy") { + Options |= EOptionInvertY; } else if (lowerword == "keep-uncalled" || // synonyms lowerword == "ku") { Options |= EOptionKeepUncalled; @@ -504,25 +515,28 @@ if (argc > 1) { if (strcmp(argv[1], "vulkan1.0") == 0) { setVulkanSpv(); - VulkanClientVersion = 100; + VulkanClientVersion = glslang::EShTargetVulkan_1_0; + } else if (strcmp(argv[1], "vulkan1.1") == 0) { + setVulkanSpv(); + TargetVersion = glslang::EShTargetSpv_1_3; + VulkanClientVersion = glslang::EShTargetVulkan_1_1; } else if (strcmp(argv[1], "opengl") == 0) { setOpenGlSpv(); - OpenGLClientVersion = 450; + OpenGLClientVersion = glslang::EShTargetOpenGL_450; } else - Error("--target-env expected vulkan1.0 or opengl"); + Error("--target-env expected vulkan1.0, vulkan1.1, or opengl"); } bumpArg(); } else if (lowerword == "variable-name" || // synonyms - lowerword == "vn") { + lowerword == "vn") { Options |= EOptionOutputHexadecimal; if (argc <= 1) Error("no provided for --variable-name"); variableName = argv[1]; bumpArg(); break; - } else if (lowerword == "invert-y" || // synonyms - lowerword == "iy") { - Options |= EOptionInvertY; + } else if (lowerword == "version") { + Options |= EOptionDumpVersions; } else { usage(); } @@ -560,7 +574,7 @@ if (argv[0][2] == 'd') Options |= EOptionOptimizeDisable; else if (argv[0][2] == 's') -#ifdef ENABLE_OPT +#if ENABLE_OPT Options |= EOptionOptimizeSize; #else Error("-Os not available; optimizer not linked"); @@ -580,13 +594,17 @@ case 'V': setVulkanSpv(); if (argv[0][2] != 0) - ClientInputSemanticsVersion = getAttachedNumber("-G client input semantics"); + ClientInputSemanticsVersion = getAttachedNumber("-V client input semantics"); break; case 'c': Options |= EOptionDumpConfig; break; case 'd': - Options |= EOptionDefaultDesktop; + if (strncmp(&argv[0][1], "dumpversion", strlen(&argv[0][1]) + 1) == 0 || + strncmp(&argv[0][1], "dumpfullversion", strlen(&argv[0][1]) + 1) == 0) + Options |= EOptionDumpBareVersion; + else + Options |= EOptionDefaultDesktop; break; case 'e': // HLSL todo: entry point handle needs much more sophistication. @@ -596,6 +614,12 @@ Error("no provided for -e"); bumpArg(); break; + case 'f': + if (strcmp(&argv[0][2], "hlsl_functionality1") == 0) + targetHlslFunctionality1 = true; + else + Error("-f: expected hlsl_functionality1"); + break; case 'g': Options |= EOptionDebug; break; @@ -694,6 +718,10 @@ messages = (EShMessages)(messages | EShMsgHlslOffsets); if (Options & EOptionDebug) messages = (EShMessages)(messages | EShMsgDebugInfo); + if (HlslEnable16BitTypes) + messages = (EShMessages)(messages | EShMsgHlslEnable16BitTypes); + if ((Options & EOptionOptimizeDisable) || !ENABLE_OPT) + messages = (EShMessages)(messages | EShMsgHlslLegalization); } // @@ -701,6 +729,9 @@ // void CompileShaders(glslang::TWorklist& worklist) { + if (Options & EOptionDebug) + Error("cannot generate debug information unless linking to generate code"); + glslang::TWorkItem* workItem; if (Options & EOptionStdin) { worklist.remove(workItem); @@ -855,14 +886,15 @@ : glslang::EShSourceGlsl, compUnit.stage, glslang::EShClientVulkan, ClientInputSemanticsVersion); shader->setEnvClient(glslang::EShClientVulkan, VulkanClientVersion); - shader->setEnvTarget(glslang::EShTargetSpv, TargetVersion); } else { shader->setEnvInput((Options & EOptionReadHlsl) ? glslang::EShSourceHlsl : glslang::EShSourceGlsl, compUnit.stage, glslang::EShClientOpenGL, ClientInputSemanticsVersion); shader->setEnvClient(glslang::EShClientOpenGL, OpenGLClientVersion); - shader->setEnvTarget(glslang::EshTargetSpv, TargetVersion); } + shader->setEnvTarget(glslang::EShTargetSpv, TargetVersion); + if (targetHlslFunctionality1) + shader->setEnvTargetHlslFunctionality1(); } shaders.push_back(shader); @@ -1046,8 +1078,14 @@ return ESuccess; } - if (Options & EOptionDumpVersions) { - printf("Glslang Version: %s %s\n", GLSLANG_REVISION, GLSLANG_DATE); + if (Options & EOptionDumpBareVersion) { + printf("%d.%d.%d\n", + glslang::GetSpirvGeneratorVersion(), GLSLANG_MINOR_VERSION, GLSLANG_PATCH_LEVEL); + if (workList.empty()) + return ESuccess; + } else if (Options & EOptionDumpVersions) { + printf("Glslang Version: %d.%d.%d\n", + glslang::GetSpirvGeneratorVersion(), GLSLANG_MINOR_VERSION, GLSLANG_PATCH_LEVEL); printf("ESSL Version: %s\n", glslang::GetEsslVersionString()); printf("GLSL Version: %s\n", glslang::GetGlslVersionString()); std::string spirvVersion; @@ -1293,6 +1331,9 @@ " -d default to desktop (#version 110) when there is no shader #version\n" " (default is ES version 100)\n" " -e specify as the entry-point name\n" + " -f{hlsl_functionality1}\n" + " 'hlsl_functionality1' enables use of the\n" + " SPV_GOOGLE_hlsl_functionality1 extension\n" " -g generate debug information\n" " -h print this usage message\n" " -i intermediate tree (glslang AST) is printed out\n" @@ -1313,12 +1354,16 @@ " 'location' (fragile, not cross stage)\n" " --aml synonym for --auto-map-locations\n" " --client {vulkan|opengl} see -V and -G\n" + " -dumpfullversion print bare major.minor.patchlevel\n" + " -dumpversion same as -dumpfullversion\n" " --flatten-uniform-arrays flatten uniform texture/sampler arrays to\n" " scalars\n" " --fua synonym for --flatten-uniform-arrays\n" " --hlsl-offsets Allow block offsets to follow HLSL rules\n" " Works independently of source language\n" " --hlsl-iomap Perform IO mapping in HLSL register space\n" + " --hlsl-enable-16bit-types Allow use of 16-bit types in SPIR-V for HLSL\n" + " --invert-y | --iy invert position.Y output in vertex shader\n" " --keep-uncalled don't eliminate uncalled functions\n" " --ku synonym for --keep-uncalled\n" " --no-storage-format use Unknown image format\n" @@ -1357,16 +1402,17 @@ " using -S.\n" " --suppress-warnings suppress GLSL warnings\n" " (except as required by #extension : warn)\n" - " --target-env {vulkan1.0|opengl} set the execution environment code will\n" - " execute in (as opposed to language\n" + " --target-env {vulkan1.0 | vulkan1.1 | opengl} \n" + " set execution environment that emitted code\n" + " will execute in (as opposed to the language\n" " semantics selected by --client) defaults:\n" - " 'vulkan1.0' under '--client vulkan'\n" - " 'opengl' under '--client opengl'\n" + " 'vulkan1.0' under '--client vulkan'\n" + " 'opengl' under '--client opengl'\n" " --variable-name Creates a C header file that contains a\n" " uint32_t array named \n" " initialized with the shader binary code.\n" + " --version synonym for -v\n" " --vn synonym for --variable-name \n" - " --invert-y | --iy invert position.Y output in vertex shader\n" ); exit(EFailUsage); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/100.frag vulkan-1.1.73+dfsg/external/glslang/Test/100.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/100.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/100.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,227 +1,227 @@ -// okay -#version 100 -int a[3] = { 2, 3, 4, }; // ERROR (lots) -#version 100 -int uint; - -attribute vec4 v[3]; // ERROR - -float f = 2; // ERROR - -uniform block { // ERROR - int x; -}; - -void foo(float); - -void main() -{ - foo(3); // ERROR - int s = 1 << 4; // ERROR - s = 16 >> 2; // ERROR - if (a == a); // ERROR - int b, c; - b = c & 4; // ERROR - b = c % 4; // ERROR - b = c | 4; // ERROR - b >>= 2; // ERROR - b <<= 2; // ERROR - b %= 3; // ERROR - - struct S { - float f; - float a[10]; - } s1, s2; - - s1 = s2; // ERROR - if (s1 == s2); // ERROR - if (s1 != s2); // ERROR - - switch(b) { // ERROR - } -} - -invariant gl_FragColor; -float fa[]; // ERROR -float f13; -invariant f13; // ERROR -struct S { int a; }; -invariant S; // ERROR, not an input or output -invariant float fi; // ERROR -varying vec4 av; -invariant av; // okay in v100 - -void foo10() -{ - invariant f; // ERROR - invariant float f2; // ERROR - float f3; - invariant f3; // ERROR -} - -uniform vec2 uv2; -invariant uv2; // ERROR -invariant uniform vec3 uv3; // ERROR - -sampler2D glob2D; // ERROR -void f11(sampler2D p2d) -{ - sampler2D v2D; // ERROR -} -varying sampler2D vary2D; // ERROR - -struct sp { - highp float f; - in float g; // ERROR - uniform float h; // ERROR - invariant float i; // ERROR -}; - -uniform sampler3D s3D; // ERROR - -#extension GL_OES_texture_3D : enable - -precision highp sampler3D; -uniform sampler3D s3D2; - -void foo234() -{ - texture3D(s3D2, vec3(0.2), 0.2); - texture3DProj(s3D2, v[1], 0.4); - dFdx(v[0]); // ERROR - dFdy(3.2); // ERROR - fwidth(f13); // ERROR -} - -#extension GL_OES_standard_derivatives : enable - -void foo236() -{ - dFdx(v[0]); - dFdy(3.2); - fwidth(f13); - gl_FragDepth = f13; // ERROR - gl_FragDepthEXT = f13; // ERROR -} - -#extension GL_EXT_frag_depth : enable - -void foo239() -{ - gl_FragDepth = f13; // ERROR - gl_FragDepthEXT = f13; -} - -#extension GL_OES_EGL_image_external : enable - -uniform samplerExternalOES sExt; - -void foo245() -{ - texture2D(sExt, vec2(0.2)); - texture2DProj(sExt, vec3(f13)); - texture2DProj(sExt, v[2]); -} - -precision mediump samplerExternalOES; -uniform samplerExternalOES mediumExt; -uniform highp samplerExternalOES highExt; - -void foo246() -{ - texture2D(mediumExt, vec2(0.2)); - texture2DProj(highExt, v[2]); - texture3D(sExt, vec3(f13)); // ERROR - texture2DProjLod(sExt, vec3(f13), f13); // ERROR - int a; - ~a; // ERROR - a | a; // ERROR - a & a; // ERROR -} - -#extension GL_OES_EGL_image_external : disable -uniform sampler2D s2Dg; - -int foo203940(int a, float b, float a) // ERROR, a redefined -{ - texture2DProjGradEXT(s2Dg, vec3(f13), uv2, uv2); // ERROR, extension not enabled - return a; -} - -float f123 = 4.0f; // ERROR -float f124 = 5e10F; // ERROR - -#extension GL_EXT_shader_texture_lod : enable - -uniform samplerCube sCube; - -void foo323433() -{ - texture2DLodEXT(s2Dg, uv2, f13); - texture2DProjGradEXT(s2Dg, vec3(f13), uv2, uv2); - texture2DGradEXT(s2Dg, uv2, uv2, uv2); - textureCubeGradEXT(sCube, vec3(f13), vec3(f13), vec3(f13)); -} - -int fgfg(float f, mediump int i); -int fgfg(float f, highp int i) { return 2; } // ERROR, precision qualifier difference - -int fffg(float f); -int fffg(float f); // ERROR, can't have multiple prototypes - -int gggf(float f); -int gggf(float f) { return 2; } - -int agggf(float f) { return 2; } -int agggf(float f); -int agggf(float f); // ERROR, second prototype - -varying struct SSS { float f; } s; // ERROR - -int vf(void); -int vf2(); -int vf3(void v); // ERROR -int vf4(int, void); // ERROR -int vf5(int, void v); // ERROR - -void badswizzle() -{ - vec3 a[5]; - a.y; // ERROR, no array swizzle - a.zy; // ERROR, no array swizzle - a.nothing; // ERROR - a.length(); // ERROR, not this version - a.method(); // ERROR -} - -float fooinit(); - -float fooinittest() -{ - return fooinit(); -} - -// Test extra-function initializers -const float fi1 = 3.0; -const float fi2 = 4.0; -const float fi3 = 5.0; - -float fooinit() -{ - return fi1 + fi2 + fi3; // should make a constant of 12.0 -} - -int init1 = gl_FrontFacing ? 1 : 2; // ERROR, non-const initializer - -#ifdef GL_EXT_shader_non_constant_global_initializers -#extension GL_EXT_shader_non_constant_global_initializers : enable -#endif - -int init2 = gl_FrontFacing ? 1 : 2; - -#pragma STDGL invariant(all) - -#line 3000 -#error line of this error should be 3000 - -uniform samplerExternalOES badExt; // syntax ERROR +// okay +#version 100 +int a[3] = { 2, 3, 4, }; // ERROR (lots) +#version 100 +int uint; + +attribute vec4 v[3]; // ERROR + +float f = 2; // ERROR + +uniform block { // ERROR + int x; +}; + +void foo(float); + +void main() +{ + foo(3); // ERROR + int s = 1 << 4; // ERROR + s = 16 >> 2; // ERROR + if (a == a); // ERROR + int b, c; + b = c & 4; // ERROR + b = c % 4; // ERROR + b = c | 4; // ERROR + b >>= 2; // ERROR + b <<= 2; // ERROR + b %= 3; // ERROR + + struct S { + float f; + float a[10]; + } s1, s2; + + s1 = s2; // ERROR + if (s1 == s2); // ERROR + if (s1 != s2); // ERROR + + switch(b) { // ERROR + } +} + +invariant gl_FragColor; +float fa[]; // ERROR +float f13; +invariant f13; // ERROR +struct S { int a; }; +invariant S; // ERROR, not an input or output +invariant float fi; // ERROR +varying vec4 av; +invariant av; // okay in v100 + +void foo10() +{ + invariant f; // ERROR + invariant float f2; // ERROR + float f3; + invariant f3; // ERROR +} + +uniform vec2 uv2; +invariant uv2; // ERROR +invariant uniform vec3 uv3; // ERROR + +sampler2D glob2D; // ERROR +void f11(sampler2D p2d) +{ + sampler2D v2D; // ERROR +} +varying sampler2D vary2D; // ERROR + +struct sp { + highp float f; + in float g; // ERROR + uniform float h; // ERROR + invariant float i; // ERROR +}; + +uniform sampler3D s3D; // ERROR + +#extension GL_OES_texture_3D : enable + +precision highp sampler3D; +uniform sampler3D s3D2; + +void foo234() +{ + texture3D(s3D2, vec3(0.2), 0.2); + texture3DProj(s3D2, v[1], 0.4); + dFdx(v[0]); // ERROR + dFdy(3.2); // ERROR + fwidth(f13); // ERROR +} + +#extension GL_OES_standard_derivatives : enable + +void foo236() +{ + dFdx(v[0]); + dFdy(3.2); + fwidth(f13); + gl_FragDepth = f13; // ERROR + gl_FragDepthEXT = f13; // ERROR +} + +#extension GL_EXT_frag_depth : enable + +void foo239() +{ + gl_FragDepth = f13; // ERROR + gl_FragDepthEXT = f13; +} + +#extension GL_OES_EGL_image_external : enable + +uniform samplerExternalOES sExt; + +void foo245() +{ + texture2D(sExt, vec2(0.2)); + texture2DProj(sExt, vec3(f13)); + texture2DProj(sExt, v[2]); +} + +precision mediump samplerExternalOES; +uniform samplerExternalOES mediumExt; +uniform highp samplerExternalOES highExt; + +void foo246() +{ + texture2D(mediumExt, vec2(0.2)); + texture2DProj(highExt, v[2]); + texture3D(sExt, vec3(f13)); // ERROR + texture2DProjLod(sExt, vec3(f13), f13); // ERROR + int a; + ~a; // ERROR + a | a; // ERROR + a & a; // ERROR +} + +#extension GL_OES_EGL_image_external : disable +uniform sampler2D s2Dg; + +int foo203940(int a, float b, float a) // ERROR, a redefined +{ + texture2DProjGradEXT(s2Dg, vec3(f13), uv2, uv2); // ERROR, extension not enabled + return a; +} + +float f123 = 4.0f; // ERROR +float f124 = 5e10F; // ERROR + +#extension GL_EXT_shader_texture_lod : enable + +uniform samplerCube sCube; + +void foo323433() +{ + texture2DLodEXT(s2Dg, uv2, f13); + texture2DProjGradEXT(s2Dg, vec3(f13), uv2, uv2); + texture2DGradEXT(s2Dg, uv2, uv2, uv2); + textureCubeGradEXT(sCube, vec3(f13), vec3(f13), vec3(f13)); +} + +int fgfg(float f, mediump int i); +int fgfg(float f, highp int i) { return 2; } // ERROR, precision qualifier difference + +int fffg(float f); +int fffg(float f); // ERROR, can't have multiple prototypes + +int gggf(float f); +int gggf(float f) { return 2; } + +int agggf(float f) { return 2; } +int agggf(float f); +int agggf(float f); // ERROR, second prototype + +varying struct SSS { float f; } s; // ERROR + +int vf(void); +int vf2(); +int vf3(void v); // ERROR +int vf4(int, void); // ERROR +int vf5(int, void v); // ERROR + +void badswizzle() +{ + vec3 a[5]; + a.y; // ERROR, no array swizzle + a.zy; // ERROR, no array swizzle + a.nothing; // ERROR + a.length(); // ERROR, not this version + a.method(); // ERROR +} + +float fooinit(); + +float fooinittest() +{ + return fooinit(); +} + +// Test extra-function initializers +const float fi1 = 3.0; +const float fi2 = 4.0; +const float fi3 = 5.0; + +float fooinit() +{ + return fi1 + fi2 + fi3; // should make a constant of 12.0 +} + +int init1 = gl_FrontFacing ? 1 : 2; // ERROR, non-const initializer + +#ifdef GL_EXT_shader_non_constant_global_initializers +#extension GL_EXT_shader_non_constant_global_initializers : enable +#endif + +int init2 = gl_FrontFacing ? 1 : 2; + +#pragma STDGL invariant(all) + +#line 3000 +#error line of this error should be 3000 + +uniform samplerExternalOES badExt; // syntax ERROR diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/100Limits.vert vulkan-1.1.73+dfsg/external/glslang/Test/100Limits.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/100Limits.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/100Limits.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,76 +1,76 @@ -#version 100 - -int ga, gb; -float f; - -uniform sampler2D fsa[3]; -uniform float fua[10]; -attribute mat3 am3; -attribute vec2 av2; -varying vec4 va[4]; - -const mat2 m2 = mat2(1.0); -const vec3 v3 = vec3(2.0); - -void foo(inout float a) {} - -int bar() -{ - return 1; -} - -void main() -{ - while (ga < gb) { } - - do { } while (false); - - for ( ; ; ); // ERROR - for ( ; ga==gb; ); // ERROR - for ( ; ; f++); // ERROR - for ( ga = 0; ; ); // ERROR - for ( bool a = false; ; ); // ERROR - for (float a = 0.0; a == sin(f); ); // ERROR - for ( int a = 0; a < 10; a *= 2); // ERROR - for ( int a = 0; a <= 20; a++) --a; // ERROR - for ( int a = 0; a <= 20; a++) { if (ga==0) a = 4; } // ERROR - for (float a = 0.0; a <= 20.0; a += 2.0); - for (float a = 0.0; a != 20.0; a -= 2.0) { if (ga==0) ga = 4; } - for (float a = 0.0; a == 20.0; a--) for (float a = 0.0; a == 20.0; a--); // two different 'a's, everything okay - for (float a = 0.0; a <= 20.0; a += 2.0); - for (float a = 0.0; a <= 20.0; a += 2.0); - for (float a = 0.0; a > 2.0 * 20.0; a += v3.y); - for (float a = 0.0; a >= 20.0; a += 2.0) foo(a); // ERROR - - int ia[9]; - - fsa[ga]; // ERROR - fua[ga]; - am3[ga]; // ERROR - av2[ga]; // ERROR - va[2+ga]; // ERROR - m2[ga]; // ERROR - v3[ga/2]; // ERROR - ia[ga]; // ERROR - - for (int a = 3; a >= 0; a--) { - fsa[a]; - fua[a+2]; - am3[3*a]; - av2[3*a]; - va[a-1]; - m2[a/2]; - v3[a]; - ia[a]; - ia[bar()]; // ERROR - } - - fsa[2]; - fua[3]; - am3[2]; - av2[1]; - va[1]; - m2[1]; - v3[1]; - ia[3]; -} +#version 100 + +int ga, gb; +float f; + +uniform sampler2D fsa[3]; +uniform float fua[10]; +attribute mat3 am3; +attribute vec2 av2; +varying vec4 va[4]; + +const mat2 m2 = mat2(1.0); +const vec3 v3 = vec3(2.0); + +void foo(inout float a) {} + +int bar() +{ + return 1; +} + +void main() +{ + while (ga < gb) { } + + do { } while (false); + + for ( ; ; ); // ERROR + for ( ; ga==gb; ); // ERROR + for ( ; ; f++); // ERROR + for ( ga = 0; ; ); // ERROR + for ( bool a = false; ; ); // ERROR + for (float a = 0.0; a == sin(f); ); // ERROR + for ( int a = 0; a < 10; a *= 2); // ERROR + for ( int a = 0; a <= 20; a++) --a; // ERROR + for ( int a = 0; a <= 20; a++) { if (ga==0) a = 4; } // ERROR + for (float a = 0.0; a <= 20.0; a += 2.0); + for (float a = 0.0; a != 20.0; a -= 2.0) { if (ga==0) ga = 4; } + for (float a = 0.0; a == 20.0; a--) for (float a = 0.0; a == 20.0; a--); // two different 'a's, everything okay + for (float a = 0.0; a <= 20.0; a += 2.0); + for (float a = 0.0; a <= 20.0; a += 2.0); + for (float a = 0.0; a > 2.0 * 20.0; a += v3.y); + for (float a = 0.0; a >= 20.0; a += 2.0) foo(a); // ERROR + + int ia[9]; + + fsa[ga]; // ERROR + fua[ga]; + am3[ga]; // ERROR + av2[ga]; // ERROR + va[2+ga]; // ERROR + m2[ga]; // ERROR + v3[ga/2]; // ERROR + ia[ga]; // ERROR + + for (int a = 3; a >= 0; a--) { + fsa[a]; + fua[a+2]; + am3[3*a]; + av2[3*a]; + va[a-1]; + m2[a/2]; + v3[a]; + ia[a]; + ia[bar()]; // ERROR + } + + fsa[2]; + fua[3]; + am3[2]; + av2[1]; + va[1]; + m2[1]; + v3[1]; + ia[3]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/100samplerExternal.frag vulkan-1.1.73+dfsg/external/glslang/Test/100samplerExternal.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/100samplerExternal.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/100samplerExternal.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,41 +1,41 @@ -#version 100 - -#extension GL_OES_EGL_image_external : enable - -uniform samplerExternalOES sExt; -precision mediump samplerExternalOES; -uniform samplerExternalOES mediumExt; -uniform highp samplerExternalOES highExt; - -void main() -{ - texture2D(sExt, vec2(0.2)); - texture2D(mediumExt, vec2(0.2)); - texture2D(highExt, vec2(0.2)); - texture2DProj(sExt, vec3(0.3)); - texture2DProj(sExt, vec4(0.3)); - - int lod = 0; - highp float bias = 0.01; - textureSize(sExt, lod); // ERROR - texture(sExt, vec2(0.2)); // ERROR - texture(sExt, vec2(0.2), bias); // ERROR - textureProj(sExt, vec3(0.2)); // ERROR - textureProj(sExt, vec3(0.2), bias); // ERROR - textureProj(sExt, vec4(0.2)); // ERROR - textureProj(sExt, vec4(0.2), bias); // ERROR - texelFetch(sExt, ivec2(4), lod); // ERROR - - texture3D(sExt, vec3(0.3)); // ERROR - texture2DProjLod(sExt, vec3(0.3), 0.3); // ERROR - texture(sExt, vec3(0.3)); // ERROR - textureProjLod(sExt, vec3(0.3), 0.3); // ERROR -} - -#extension GL_OES_EGL_image_external : disable - -#extension GL_OES_EGL_image_external_essl3 : enable -uniform samplerExternalOES badExt; // ERROR -#extension GL_OES_EGL_image_external_essl3 : disable - -uniform samplerExternalOES badExt; // ERROR +#version 100 + +#extension GL_OES_EGL_image_external : enable + +uniform samplerExternalOES sExt; +precision mediump samplerExternalOES; +uniform samplerExternalOES mediumExt; +uniform highp samplerExternalOES highExt; + +void main() +{ + texture2D(sExt, vec2(0.2)); + texture2D(mediumExt, vec2(0.2)); + texture2D(highExt, vec2(0.2)); + texture2DProj(sExt, vec3(0.3)); + texture2DProj(sExt, vec4(0.3)); + + int lod = 0; + highp float bias = 0.01; + textureSize(sExt, lod); // ERROR + texture(sExt, vec2(0.2)); // ERROR + texture(sExt, vec2(0.2), bias); // ERROR + textureProj(sExt, vec3(0.2)); // ERROR + textureProj(sExt, vec3(0.2), bias); // ERROR + textureProj(sExt, vec4(0.2)); // ERROR + textureProj(sExt, vec4(0.2), bias); // ERROR + texelFetch(sExt, ivec2(4), lod); // ERROR + + texture3D(sExt, vec3(0.3)); // ERROR + texture2DProjLod(sExt, vec3(0.3), 0.3); // ERROR + texture(sExt, vec3(0.3)); // ERROR + textureProjLod(sExt, vec3(0.3), 0.3); // ERROR +} + +#extension GL_OES_EGL_image_external : disable + +#extension GL_OES_EGL_image_external_essl3 : enable +uniform samplerExternalOES badExt; // ERROR +#extension GL_OES_EGL_image_external_essl3 : disable + +uniform samplerExternalOES badExt; // ERROR diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/100scope.vert vulkan-1.1.73+dfsg/external/glslang/Test/100scope.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/100scope.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/100scope.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,76 +1,76 @@ -#version 100 - -int f(int a, int b, int c) -{ - int a = b; // ERROR, redefinition - - { - float a = float(a) + 1.0; - } - - return a; -} - -int f(int a, int b, int c); // okay to redeclare - -bool b; -float b(int a); // ERROR: redefinition - -float c(int a); -bool c; // ERROR: redefinition - -float f; // ERROR: redefinition -float tan; // okay, built-in is in an outer scope -float sin(float x); // ERROR: can't redefine built-in functions -float cos(float x) // ERROR: can't redefine built-in functions -{ - return 1.0; -} -bool radians(bool x) // okay, can overload built-in functions -{ - return true; -} - -invariant gl_Position; - -void main() -{ - int g(); // ERROR: no local function declarations - g(); - - float sin; // okay - sin; - sin(0.7); // ERROR, use of hidden function - f(1,2,3); - - float f; // hides f() - f = 3.0; - - gl_Position = vec4(f); - - for (int f = 0; f < 10; ++f) - ++f; - - int x = 1; - { - float x = 2.0, /* 2nd x visible here */ y = x; // y is initialized to 2 - int z = z; // ERROR: z not previously defined. - } - { - int x = x; // x is initialized to '1' - } - - struct S - { - int x; - }; - { - S S = S(0); // 'S' is only visible as a struct and constructor - S.x; // 'S' is now visible as a variable - } - - int degrees; - degrees(3.2); // ERROR, use of hidden built-in function -} - -varying struct SSS { float f; } s; // ERROR +#version 100 + +int f(int a, int b, int c) +{ + int a = b; // ERROR, redefinition + + { + float a = float(a) + 1.0; + } + + return a; +} + +int f(int a, int b, int c); // okay to redeclare + +bool b; +float b(int a); // ERROR: redefinition + +float c(int a); +bool c; // ERROR: redefinition + +float f; // ERROR: redefinition +float tan; // okay, built-in is in an outer scope +float sin(float x); // ERROR: can't redefine built-in functions +float cos(float x) // ERROR: can't redefine built-in functions +{ + return 1.0; +} +bool radians(bool x) // okay, can overload built-in functions +{ + return true; +} + +invariant gl_Position; + +void main() +{ + int g(); // ERROR: no local function declarations + g(); + + float sin; // okay + sin; + sin(0.7); // ERROR, use of hidden function + f(1,2,3); + + float f; // hides f() + f = 3.0; + + gl_Position = vec4(f); + + for (int f = 0; f < 10; ++f) + ++f; + + int x = 1; + { + float x = 2.0, /* 2nd x visible here */ y = x; // y is initialized to 2 + int z = z; // ERROR: z not previously defined. + } + { + int x = x; // x is initialized to '1' + } + + struct S + { + int x; + }; + { + S S = S(0); // 'S' is only visible as a struct and constructor + S.x; // 'S' is now visible as a variable + } + + int degrees; + degrees(3.2); // ERROR, use of hidden built-in function +} + +varying struct SSS { float f; } s; // ERROR diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/110scope.vert vulkan-1.1.73+dfsg/external/glslang/Test/110scope.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/110scope.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/110scope.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,74 +1,74 @@ -#version 110 - -int f(int a, int b, int c) -{ - int a = b; // ERROR, redefinition - - { - float a = float(a) + 1.0; // okay - } - - return a; -} - -int f(int a, int b, int c); // okay to redeclare - -bool b; -float b(int a); // okay, b and b() are different - -float c(int a); -bool c; // okay, and c() are different - -float f; // okay f and f() are different -float tan; // okay, hides built-in function -float sin(float x); // okay, can redefine built-in functions -float cos(float x) // okay, can redefine built-in functions -{ - return 1.0; -} -bool radians(bool x) // okay, can overload built-in functions -{ - return true; -} - -int gi = f(1,2,3); // ERROR, can't call user-defined function from global scope - -void main() -{ - int g(); // okay - g(); - - float sin; // okay - sin; - sin(0.7); // okay - f(1,2,3); - - float f; - f = 3.0; - - gl_Position = vec4(f); - - for (int f = 0; f < 10; ++f) - ++f; - - int x = 1; - { - float x = 2.0, /* 2nd x visible here */ y = x; // y is initialized to 2 - int z = z; // ERROR: z not previously defined. - } - { - int x = x; // x is initialized to '1' - } - - struct S - { - int x; - }; - { - S S = S(0); // 'S' is only visible as a struct and constructor - S.x; // 'S' is now visible as a variable - } - - int degrees; - degrees(3.2); -} +#version 110 + +int f(int a, int b, int c) +{ + int a = b; // ERROR, redefinition + + { + float a = float(a) + 1.0; // okay + } + + return a; +} + +int f(int a, int b, int c); // okay to redeclare + +bool b; +float b(int a); // okay, b and b() are different + +float c(int a); +bool c; // okay, and c() are different + +float f; // okay f and f() are different +float tan; // okay, hides built-in function +float sin(float x); // okay, can redefine built-in functions +float cos(float x) // okay, can redefine built-in functions +{ + return 1.0; +} +bool radians(bool x) // okay, can overload built-in functions +{ + return true; +} + +int gi = f(1,2,3); // ERROR, can't call user-defined function from global scope + +void main() +{ + int g(); // okay + g(); + + float sin; // okay + sin; + sin(0.7); // okay + f(1,2,3); + + float f; + f = 3.0; + + gl_Position = vec4(f); + + for (int f = 0; f < 10; ++f) + ++f; + + int x = 1; + { + float x = 2.0, /* 2nd x visible here */ y = x; // y is initialized to 2 + int z = z; // ERROR: z not previously defined. + } + { + int x = x; // x is initialized to '1' + } + + struct S + { + int x; + }; + { + S S = S(0); // 'S' is only visible as a struct and constructor + S.x; // 'S' is now visible as a variable + } + + int degrees; + degrees(3.2); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/120.frag vulkan-1.1.73+dfsg/external/glslang/Test/120.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/120.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/120.frag 2018-04-27 11:46:26.000000000 +0000 @@ -245,4 +245,4 @@ b ? 3 : foo12111(); // ERROR } -float halfFloat1 = 1.0h; // syntax ERROR +float halfFloat1 = 1.0h; // syntax ERROR diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/120.vert vulkan-1.1.73+dfsg/external/glslang/Test/120.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/120.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/120.vert 2018-04-27 11:46:26.000000000 +0000 @@ -139,12 +139,12 @@ bool b = any(lessThan(v4, attv4)); // tests aggregate arg to unary built-in } -void noise() -{ - float f1 = noise1(1.0); - vec2 f2 = noise2(vec2(1.0)); - vec3 f3 = noise3(vec3(1.0)); - vec4 f4 = noise4(vec4(1.0)); +void noise() +{ + float f1 = noise1(1.0); + vec2 f2 = noise2(vec2(1.0)); + vec3 f3 = noise3(vec3(1.0)); + vec4 f4 = noise4(vec4(1.0)); } // version 130 features diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/130.vert vulkan-1.1.73+dfsg/external/glslang/Test/130.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/130.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/130.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,78 +1,78 @@ -#version 130 - -uniform int c; -uniform usampler2D us2D; - -in ivec2 x; -in vec2 v2a; -in float c1D; -in vec2 c2D; -in vec3 c3D; -smooth vec4 c4D; // ?? - -uniform vec4 v4; - -void main() -{ - float f = 3; - switch (c) { // full switch testing in switch.frag - case 1: - f = sin(f); - break; - case 2: - f = f * f; - default: - f = 3.0; - } - - uint i; - i = texture(us2D, x).w; // full uint testing in uint.frag - i << 3u | 0x8Au >> 1u & 0xFFu; - - vec3 modfOut, modfIn; - vec3 v11 = modf(modfIn, modfOut); - float t = trunc(f); - vec2 v12 = round(v2a); - vec2 v13 = roundEven(v2a); - bvec2 b10 = isnan(v2a); - bvec4 b11 = isinf(v4); - - sinh(c1D) + - cosh(c1D) * tanh(c2D); - asinh(c4D) + acosh(c4D); - atanh(c3D); - - int id = gl_VertexID; - gl_ClipDistance[1] = 0.3; -} - -// version 140 features - -//uniform isamplerBuffer sbuf; - -//layout(std140) uniform blockName { -// int anonMem; -//}; - -void foo88() -{ - int id = gl_InstanceID; // ERROR - //id += anonMem; - id += texelFetch(id, 8); - - gl_ClipVertex; // these are all present... - gl_Color; - gl_LightSource[0]; - gl_DepthRange.far; - gl_TexCoord; - gl_FogFragCoord; - gl_FrontColor; -} - -// token pasting - -#define mac abc##def -int mac; - -#define macr(A,B) A##B -int macr(qrs,tuv); +#version 130 + +uniform int c; +uniform usampler2D us2D; + +in ivec2 x; +in vec2 v2a; +in float c1D; +in vec2 c2D; +in vec3 c3D; +smooth vec4 c4D; // ?? + +uniform vec4 v4; + +void main() +{ + float f = 3; + switch (c) { // full switch testing in switch.frag + case 1: + f = sin(f); + break; + case 2: + f = f * f; + default: + f = 3.0; + } + + uint i; + i = texture(us2D, x).w; // full uint testing in uint.frag + i << 3u | 0x8Au >> 1u & 0xFFu; + + vec3 modfOut, modfIn; + vec3 v11 = modf(modfIn, modfOut); + float t = trunc(f); + vec2 v12 = round(v2a); + vec2 v13 = roundEven(v2a); + bvec2 b10 = isnan(v2a); + bvec4 b11 = isinf(v4); + + sinh(c1D) + + cosh(c1D) * tanh(c2D); + asinh(c4D) + acosh(c4D); + atanh(c3D); + + int id = gl_VertexID; + gl_ClipDistance[1] = 0.3; +} + +// version 140 features + +//uniform isamplerBuffer sbuf; + +//layout(std140) uniform blockName { +// int anonMem; +//}; + +void foo88() +{ + int id = gl_InstanceID; // ERROR + //id += anonMem; + id += texelFetch(id, 8); + + gl_ClipVertex; // these are all present... + gl_Color; + gl_LightSource[0]; + gl_DepthRange.far; + gl_TexCoord; + gl_FogFragCoord; + gl_FrontColor; +} + +// token pasting + +#define mac abc##def +int mac; + +#define macr(A,B) A##B +int macr(qrs,tuv); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/140.vert vulkan-1.1.73+dfsg/external/glslang/Test/140.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/140.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/140.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,62 +1,62 @@ -#version 140 - -uniform isamplerBuffer sbuf; - -layout(std140) uniform blockName { - int anonMem; -}; - -void main() -{ - int id = gl_InstanceID; - id += anonMem; - id += texelFetch(sbuf, 8).w; - gl_ClipVertex; // could be ERROR, but compiling under compatibility profile - gl_Color; // could be ERROR, but compiling under compatibility profile - gl_LightSource[0]; // could be ERROR, but compiling under compatibility profile - gl_DepthRange.far; - gl_TexCoord; // could be ERROR, but compiling under compatibility profile - gl_FogFragCoord; // could be ERROR, but compiling under compatibility profile - gl_FrontColor; // could be ERROR, but compiling under compatibility profile -} - -out vec4 gl_Position; // ERROR - -layout(location = 9) in vec4 locBad; // ERROR - -#extension GL_ARB_explicit_attrib_location : enable - -layout(location = 9) in vec4 loc; - -#extension GL_ARB_separate_shader_objects : enable - -out vec4 gl_Position; -in vec4 gl_Position; // ERROR -out vec3 gl_Position; // ERROR - -out float gl_PointSize; -out vec4 gl_ClipVertex; -out float gl_FogFragCoord; - -uniform sampler2DRect s2dr; -uniform sampler2DRectShadow s2drs; -in ivec2 itloc2; -in vec2 tloc2; -in vec3 tloc3; -in vec4 tloc4; - -void foo() -{ - vec4 v = texelFetch(s2dr, itloc2); - v += texelFetch(s2dr, itloc2, 0.2); // ERROR, no lod - v += texture(s2dr, tloc2); - v += texture(s2dr, tloc2, 0.3); // ERROR, no bias - v += texture(s2drs, tloc3); - v += textureProj(s2dr, tloc3); - v += textureProj(s2dr, tloc4); - v += textureProjGradOffset(s2dr, tloc4, ivec2(0.0), ivec2(0.0), ivec2(1,2)); - v += textureProjGradOffset(s2drs, tloc4, ivec2(0.0), ivec2(0.0), ivec2(1,2)); -} +#version 140 + +uniform isamplerBuffer sbuf; + +layout(std140) uniform blockName { + int anonMem; +}; + +void main() +{ + int id = gl_InstanceID; + id += anonMem; + id += texelFetch(sbuf, 8).w; + gl_ClipVertex; // could be ERROR, but compiling under compatibility profile + gl_Color; // could be ERROR, but compiling under compatibility profile + gl_LightSource[0]; // could be ERROR, but compiling under compatibility profile + gl_DepthRange.far; + gl_TexCoord; // could be ERROR, but compiling under compatibility profile + gl_FogFragCoord; // could be ERROR, but compiling under compatibility profile + gl_FrontColor; // could be ERROR, but compiling under compatibility profile +} + +out vec4 gl_Position; // ERROR + +layout(location = 9) in vec4 locBad; // ERROR + +#extension GL_ARB_explicit_attrib_location : enable + +layout(location = 9) in vec4 loc; + +#extension GL_ARB_separate_shader_objects : enable + +out vec4 gl_Position; +in vec4 gl_Position; // ERROR +out vec3 gl_Position; // ERROR + +out float gl_PointSize; +out vec4 gl_ClipVertex; +out float gl_FogFragCoord; + +uniform sampler2DRect s2dr; +uniform sampler2DRectShadow s2drs; +in ivec2 itloc2; +in vec2 tloc2; +in vec3 tloc3; +in vec4 tloc4; + +void foo() +{ + vec4 v = texelFetch(s2dr, itloc2); + v += texelFetch(s2dr, itloc2, 0.2); // ERROR, no lod + v += texture(s2dr, tloc2); + v += texture(s2dr, tloc2, 0.3); // ERROR, no bias + v += texture(s2drs, tloc3); + v += textureProj(s2dr, tloc3); + v += textureProj(s2dr, tloc4); + v += textureProjGradOffset(s2dr, tloc4, ivec2(0.0), ivec2(0.0), ivec2(1,2)); + v += textureProjGradOffset(s2drs, tloc4, ivec2(0.0), ivec2(0.0), ivec2(1,2)); +} void devi() { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/150.frag vulkan-1.1.73+dfsg/external/glslang/Test/150.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/150.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/150.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,50 +1,50 @@ -#version 150 core - -in vec4 gl_FragCoord; -layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; // ERROR -layout(pixel_center_integer) in vec4 gl_FragCoord; // ERROR -layout(origin_upper_left) in vec4 foo; // ERROR -layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; - -void main() -{ - vec4 c = gl_FragCoord; -} - -layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; // ERROR, declared after use - -in struct S { float f; } s; - -float patch = 3.1; - -uniform sampler2DMS sms; -uniform isampler2DMS isms; -uniform usampler2DMS usms; -uniform sampler2DMSArray smsa; -uniform isampler2DMSArray ismsa; -uniform usampler2DMSArray usmsa; - -flat in ivec2 p2; -flat in ivec3 p3; -flat in int samp; - -void barWxyz() -{ - ivec2 t11 = textureSize( sms); - ivec2 t12 = textureSize(isms); - ivec2 t13 = textureSize(usms); - ivec3 t21 = textureSize( smsa); - ivec3 t22 = textureSize(ismsa); - ivec3 t23 = textureSize(usmsa); - vec4 t31 = texelFetch( sms, p2, samp); - ivec4 t32 = texelFetch(isms, p2, samp); - uvec4 t33 = texelFetch(usms, p2, 3); - vec4 t41 = texelFetch( smsa, p3, samp); - ivec4 t42 = texelFetch(ismsa, ivec3(2), samp); - uvec4 t43 = texelFetch(usmsa, p3, samp); -} - -int primitiveID() -{ - return gl_PrimitiveID; -} +#version 150 core + +in vec4 gl_FragCoord; +layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; // ERROR +layout(pixel_center_integer) in vec4 gl_FragCoord; // ERROR +layout(origin_upper_left) in vec4 foo; // ERROR +layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; + +void main() +{ + vec4 c = gl_FragCoord; +} + +layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; // ERROR, declared after use + +in struct S { float f; } s; + +float patch = 3.1; + +uniform sampler2DMS sms; +uniform isampler2DMS isms; +uniform usampler2DMS usms; +uniform sampler2DMSArray smsa; +uniform isampler2DMSArray ismsa; +uniform usampler2DMSArray usmsa; + +flat in ivec2 p2; +flat in ivec3 p3; +flat in int samp; + +void barWxyz() +{ + ivec2 t11 = textureSize( sms); + ivec2 t12 = textureSize(isms); + ivec2 t13 = textureSize(usms); + ivec3 t21 = textureSize( smsa); + ivec3 t22 = textureSize(ismsa); + ivec3 t23 = textureSize(usmsa); + vec4 t31 = texelFetch( sms, p2, samp); + ivec4 t32 = texelFetch(isms, p2, samp); + uvec4 t33 = texelFetch(usms, p2, 3); + vec4 t41 = texelFetch( smsa, p3, samp); + ivec4 t42 = texelFetch(ismsa, ivec3(2), samp); + uvec4 t43 = texelFetch(usmsa, p3, samp); +} + +int primitiveID() +{ + return gl_PrimitiveID; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/150.geom vulkan-1.1.73+dfsg/external/glslang/Test/150.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/150.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/150.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,139 +1,139 @@ -#version 150 core - -in fromVertex { - in vec3 color; -} fromV[]; - -out toFragment { - out vec3 color; -} toF; - -out fromVertex { // okay to reuse a block name for another block name - vec3 color; -}; - -out fooB { - vec2 color; -} fromVertex; // ERROR, cannot reuse block name as block instance - -int fromVertex; // ERROR, cannot reuse a block name for something else - -out fooC { - vec2 color; -} fooC; // ERROR, cannot have same name for block and instance name - -void main() -{ - EmitVertex(); - EndPrimitive(); - EmitStreamVertex(1); // ERROR - EndStreamPrimitive(0); // ERROR - - color = fromV[0].color; - gl_ClipDistance[3] = gl_in[1].gl_ClipDistance[2]; - gl_Position = gl_in[0].gl_Position; - gl_PointSize = gl_in[3].gl_PointSize; - gl_PrimitiveID = gl_PrimitiveIDIn; - gl_Layer = 2; -} - -out vec4 ov0; // stream should be 0 -layout(stream = 4) out vec4 ov4; -out vec4 o1v0; // stream should be 0 - -layout(stream = 3) uniform; // ERROR -layout(stream = 3) in; // ERROR -layout(stream = 3) uniform int ua; // ERROR -layout(stream = 3) uniform ubb { int ua; } ibb; // ERROR - -layout(line_strip, points, triangle_strip, stream = 3, points, triangle_strip) out; // just means "stream = 3, triangle_strip" -layout(stream = 3, triangle_strip) out; -out vec4 ov3; // stream should be 3 - -layout(stream = 6) out ooutb { vec4 a; } ouuaa6; - -layout(stream = 6) out ooutb2 { - layout(stream = 6) vec4 a; -} ouua6; - -layout(stream = 7) out ooutb3 { - layout(stream = 6) vec4 a; // ERROR -} ouua7; - -out vec4 ov2s3; // stream should be 3 - -layout(max_vertices = 200) out; -layout(max_vertices = 300) out; // ERROR, too big -void foo(layout(max_vertices = 4) int a) // ERROR -{ - ouuaa6.a = vec4(1.0); -} - -layout(line_strip, points, triangle_strip, stream = 3, points) out; // ERROR, changing output primitive -layout(line_strip, points, stream = 3) out; // ERROR, changing output primitive -layout(triangle_strip) in; // ERROR, not an input primitive -layout(triangle_strip) uniform; // ERROR -layout(triangle_strip) out vec4 badv4; // ERROR, not on a variable -layout(triangle_strip) in vec4 bad2v4[]; // ERROR, not on a variable or input -layout(invocations = 3) out outbn { int a; }; // 2 ERROR, not on a block, not until 4.0 -out outbn2 { - layout(invocations = 3) int a; // 2 ERRORs, not on a block member, not until 4.0 - layout(max_vertices = 3) int b; // ERROR, not on a block member - layout(triangle_strip) int c; // ERROR, not on a block member -} outbi; - -layout(lines) out; // ERROR, not on output -layout(lines_adjacency) in; -layout(triangles) in; // ERROR, can't change it -layout(triangles_adjacency) in; // ERROR, can't change it -layout(invocations = 4) in; // ERROR, not until 4.0 - -in inbn { - layout(stream = 2) int a; // ERROR, stream on input -} inbi[]; - -in sameName { - int a15; -} insn[]; - -out sameName { - float f15; -}; - -uniform sameName { - bool b15; -}; - -float summ = gl_MaxVertexAttribs + - gl_MaxVertexUniformComponents + - gl_MaxVaryingFloats + - gl_MaxVaryingComponents + - gl_MaxVertexOutputComponents + - gl_MaxGeometryInputComponents + - gl_MaxGeometryOutputComponents + - gl_MaxFragmentInputComponents + - gl_MaxVertexTextureImageUnits + - gl_MaxCombinedTextureImageUnits + - gl_MaxTextureImageUnits + - gl_MaxFragmentUniformComponents + - gl_MaxDrawBuffers + - gl_MaxClipDistances + - gl_MaxGeometryTextureImageUnits + - gl_MaxGeometryOutputVertices + - gl_MaxGeometryTotalOutputComponents + - gl_MaxGeometryUniformComponents + - gl_MaxGeometryVaryingComponents; - -void fooe1() -{ - gl_ViewportIndex = gl_MaxViewports - 1; -} - -#extension GL_ARB_viewport_array : enable - -void fooe2() -{ - gl_ViewportIndex = gl_MaxViewports - 1; -} - -out int gl_ViewportIndex; +#version 150 core + +in fromVertex { + in vec3 color; +} fromV[]; + +out toFragment { + out vec3 color; +} toF; + +out fromVertex { // okay to reuse a block name for another block name + vec3 color; +}; + +out fooB { + vec2 color; +} fromVertex; // ERROR, cannot reuse block name as block instance + +int fromVertex; // ERROR, cannot reuse a block name for something else + +out fooC { + vec2 color; +} fooC; // ERROR, cannot have same name for block and instance name + +void main() +{ + EmitVertex(); + EndPrimitive(); + EmitStreamVertex(1); // ERROR + EndStreamPrimitive(0); // ERROR + + color = fromV[0].color; + gl_ClipDistance[3] = gl_in[1].gl_ClipDistance[2]; + gl_Position = gl_in[0].gl_Position; + gl_PointSize = gl_in[3].gl_PointSize; + gl_PrimitiveID = gl_PrimitiveIDIn; + gl_Layer = 2; +} + +out vec4 ov0; // stream should be 0 +layout(stream = 4) out vec4 ov4; +out vec4 o1v0; // stream should be 0 + +layout(stream = 3) uniform; // ERROR +layout(stream = 3) in; // ERROR +layout(stream = 3) uniform int ua; // ERROR +layout(stream = 3) uniform ubb { int ua; } ibb; // ERROR + +layout(line_strip, points, triangle_strip, stream = 3, points, triangle_strip) out; // just means "stream = 3, triangle_strip" +layout(stream = 3, triangle_strip) out; +out vec4 ov3; // stream should be 3 + +layout(stream = 6) out ooutb { vec4 a; } ouuaa6; + +layout(stream = 6) out ooutb2 { + layout(stream = 6) vec4 a; +} ouua6; + +layout(stream = 7) out ooutb3 { + layout(stream = 6) vec4 a; // ERROR +} ouua7; + +out vec4 ov2s3; // stream should be 3 + +layout(max_vertices = 200) out; +layout(max_vertices = 300) out; // ERROR, too big +void foo(layout(max_vertices = 4) int a) // ERROR +{ + ouuaa6.a = vec4(1.0); +} + +layout(line_strip, points, triangle_strip, stream = 3, points) out; // ERROR, changing output primitive +layout(line_strip, points, stream = 3) out; // ERROR, changing output primitive +layout(triangle_strip) in; // ERROR, not an input primitive +layout(triangle_strip) uniform; // ERROR +layout(triangle_strip) out vec4 badv4; // ERROR, not on a variable +layout(triangle_strip) in vec4 bad2v4[]; // ERROR, not on a variable or input +layout(invocations = 3) out outbn { int a; }; // 2 ERROR, not on a block, not until 4.0 +out outbn2 { + layout(invocations = 3) int a; // 2 ERRORs, not on a block member, not until 4.0 + layout(max_vertices = 3) int b; // ERROR, not on a block member + layout(triangle_strip) int c; // ERROR, not on a block member +} outbi; + +layout(lines) out; // ERROR, not on output +layout(lines_adjacency) in; +layout(triangles) in; // ERROR, can't change it +layout(triangles_adjacency) in; // ERROR, can't change it +layout(invocations = 4) in; // ERROR, not until 4.0 + +in inbn { + layout(stream = 2) int a; // ERROR, stream on input +} inbi[]; + +in sameName { + int a15; +} insn[]; + +out sameName { + float f15; +}; + +uniform sameName { + bool b15; +}; + +float summ = gl_MaxVertexAttribs + + gl_MaxVertexUniformComponents + + gl_MaxVaryingFloats + + gl_MaxVaryingComponents + + gl_MaxVertexOutputComponents + + gl_MaxGeometryInputComponents + + gl_MaxGeometryOutputComponents + + gl_MaxFragmentInputComponents + + gl_MaxVertexTextureImageUnits + + gl_MaxCombinedTextureImageUnits + + gl_MaxTextureImageUnits + + gl_MaxFragmentUniformComponents + + gl_MaxDrawBuffers + + gl_MaxClipDistances + + gl_MaxGeometryTextureImageUnits + + gl_MaxGeometryOutputVertices + + gl_MaxGeometryTotalOutputComponents + + gl_MaxGeometryUniformComponents + + gl_MaxGeometryVaryingComponents; + +void fooe1() +{ + gl_ViewportIndex = gl_MaxViewports - 1; +} + +#extension GL_ARB_viewport_array : enable + +void fooe2() +{ + gl_ViewportIndex = gl_MaxViewports - 1; +} + +out int gl_ViewportIndex; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/150.tesc vulkan-1.1.73+dfsg/external/glslang/Test/150.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/150.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/150.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,34 +1,34 @@ -#version 150 - -#extension GL_ARB_tessellation_shader : enable - -layout(vertices = 4) out; -int outa[gl_out.length()]; - -patch out vec4 patchOut; - -void main() -{ - barrier(); - - int a = gl_MaxTessControlInputComponents + - gl_MaxTessControlOutputComponents + - gl_MaxTessControlTextureImageUnits + - gl_MaxTessControlUniformComponents + - gl_MaxTessControlTotalOutputComponents; - - vec4 p = gl_in[1].gl_Position; - float ps = gl_in[1].gl_PointSize; - float cd = gl_in[1].gl_ClipDistance[2]; - - int pvi = gl_PatchVerticesIn; - int pid = gl_PrimitiveID; - int iid = gl_InvocationID; - - gl_out[gl_InvocationID].gl_Position = p; - gl_out[gl_InvocationID].gl_PointSize = ps; - gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; - - gl_TessLevelOuter[3] = 3.2; - gl_TessLevelInner[1] = 1.3; -} +#version 150 + +#extension GL_ARB_tessellation_shader : enable + +layout(vertices = 4) out; +int outa[gl_out.length()]; + +patch out vec4 patchOut; + +void main() +{ + barrier(); + + int a = gl_MaxTessControlInputComponents + + gl_MaxTessControlOutputComponents + + gl_MaxTessControlTextureImageUnits + + gl_MaxTessControlUniformComponents + + gl_MaxTessControlTotalOutputComponents; + + vec4 p = gl_in[1].gl_Position; + float ps = gl_in[1].gl_PointSize; + float cd = gl_in[1].gl_ClipDistance[2]; + + int pvi = gl_PatchVerticesIn; + int pid = gl_PrimitiveID; + int iid = gl_InvocationID; + + gl_out[gl_InvocationID].gl_Position = p; + gl_out[gl_InvocationID].gl_PointSize = ps; + gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; + + gl_TessLevelOuter[3] = 3.2; + gl_TessLevelInner[1] = 1.3; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/150.tese vulkan-1.1.73+dfsg/external/glslang/Test/150.tese --- vulkan-1.1.70+dfsg1/external/glslang/Test/150.tese 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/150.tese 2018-04-27 11:46:26.000000000 +0000 @@ -1,35 +1,35 @@ -#version 150 - -#extension GL_ARB_tessellation_shader : enable - -layout(quads, cw) in; -layout(fractional_odd_spacing) in; -layout(point_mode) in; -patch in vec4 patchIn; - -void main() -{ - barrier(); // ERROR - - int a = gl_MaxTessEvaluationInputComponents + - gl_MaxTessEvaluationOutputComponents + - gl_MaxTessEvaluationTextureImageUnits + - gl_MaxTessEvaluationUniformComponents + - gl_MaxTessPatchComponents + - gl_MaxPatchVertices + - gl_MaxTessGenLevel; - - vec4 p = gl_in[1].gl_Position; - float ps = gl_in[1].gl_PointSize; - float cd = gl_in[1].gl_ClipDistance[2]; - - int pvi = gl_PatchVerticesIn; - int pid = gl_PrimitiveID; - vec3 tc = gl_TessCoord; - float tlo = gl_TessLevelOuter[3]; - float tli = gl_TessLevelInner[1]; - - gl_Position = p; - gl_PointSize = ps; - gl_ClipDistance[2] = cd; -} +#version 150 + +#extension GL_ARB_tessellation_shader : enable + +layout(quads, cw) in; +layout(fractional_odd_spacing) in; +layout(point_mode) in; +patch in vec4 patchIn; + +void main() +{ + barrier(); // ERROR + + int a = gl_MaxTessEvaluationInputComponents + + gl_MaxTessEvaluationOutputComponents + + gl_MaxTessEvaluationTextureImageUnits + + gl_MaxTessEvaluationUniformComponents + + gl_MaxTessPatchComponents + + gl_MaxPatchVertices + + gl_MaxTessGenLevel; + + vec4 p = gl_in[1].gl_Position; + float ps = gl_in[1].gl_PointSize; + float cd = gl_in[1].gl_ClipDistance[2]; + + int pvi = gl_PatchVerticesIn; + int pid = gl_PrimitiveID; + vec3 tc = gl_TessCoord; + float tlo = gl_TessLevelOuter[3]; + float tli = gl_TessLevelInner[1]; + + gl_Position = p; + gl_PointSize = ps; + gl_ClipDistance[2] = cd; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/150.vert vulkan-1.1.73+dfsg/external/glslang/Test/150.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/150.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/150.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,29 +1,29 @@ -#version 150 core - -#ifndef GL_core_profile -# error standard macro GL_core_profile not defined -#endif - -in vec4 iv4; - -uniform float ps; - -invariant gl_Position; - -void main() -{ - gl_Position = iv4; - gl_PointSize = ps; - gl_ClipDistance[2] = iv4.x; - gl_ClipVertex = iv4; -} - -out float gl_ClipDistance[4]; - -uniform foob { - int a[]; -}; -int a[5]; // ERROR, resizing user-block member - -#line 3000 -#error line of this error should be 3001 +#version 150 core + +#ifndef GL_core_profile +# error standard macro GL_core_profile not defined +#endif + +in vec4 iv4; + +uniform float ps; + +invariant gl_Position; + +void main() +{ + gl_Position = iv4; + gl_PointSize = ps; + gl_ClipDistance[2] = iv4.x; + gl_ClipVertex = iv4; +} + +out float gl_ClipDistance[4]; + +uniform foob { + int a[]; +}; +int a[5]; // ERROR, resizing user-block member + +#line 3000 +#error line of this error should be 3001 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/300link2.frag vulkan-1.1.73+dfsg/external/glslang/Test/300link2.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/300link2.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/300link2.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,11 +1,11 @@ -#version 300 es -precision mediump float; -in vec4 pos; - -layout(location = 1) out vec4 c; -layout(location = 5) out vec4 p; -layout(location = 9) out vec4 q[2]; - -void main() -{ -} +#version 300 es +precision mediump float; +in vec4 pos; + +layout(location = 1) out vec4 c; +layout(location = 5) out vec4 p; +layout(location = 9) out vec4 q[2]; + +void main() +{ +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/300link3.frag vulkan-1.1.73+dfsg/external/glslang/Test/300link3.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/300link3.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/300link3.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,7 @@ -#version 300 es - -precision highp float; - -out vec4 color1; - -void main() {} +#version 300 es + +precision highp float; + +out vec4 color1; + +void main() {} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/300link.frag vulkan-1.1.73+dfsg/external/glslang/Test/300link.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/300link.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/300link.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,8 @@ -#version 300 es - -precision highp float; - -out vec4 color1; -out vec4 color2; - -void main() {} +#version 300 es + +precision highp float; + +out vec4 color1; +out vec4 color2; + +void main() {} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/300samplerExternal.frag vulkan-1.1.73+dfsg/external/glslang/Test/300samplerExternal.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/300samplerExternal.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/300samplerExternal.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,41 +1,41 @@ -#version 300 es - -#extension GL_OES_EGL_image_external_essl3 : enable - -uniform samplerExternalOES sExt; -precision mediump samplerExternalOES; -uniform samplerExternalOES mediumExt; -uniform highp samplerExternalOES highExt; - -void main() -{ - texture2D(sExt, vec2(0.2)); // ERROR - texture2D(mediumExt, vec2(0.2)); // ERROR - texture2D(highExt, vec2(0.2)); // ERROR - texture2DProj(sExt, vec3(0.3)); // ERROR - texture2DProj(sExt, vec4(0.3)); // ERROR - - int lod = 0; - highp float bias = 0.01; - textureSize(sExt, lod); - texture(sExt, vec2(0.2)); - texture(sExt, vec2(0.2), bias); - textureProj(sExt, vec3(0.2)); - textureProj(sExt, vec3(0.2), bias); - textureProj(sExt, vec4(0.2)); - textureProj(sExt, vec4(0.2), bias); - texelFetch(sExt, ivec2(4), lod); - - texture3D(sExt, vec3(0.3)); // ERROR - texture2DProjLod(sExt, vec3(0.3), 0.3); // ERROR - texture(sExt, vec3(0.3)); // ERROR - textureProjLod(sExt, vec3(0.3), 0.3); // ERROR -} - -#extension GL_OES_EGL_image_external_essl3 : disable - -#extension GL_OES_EGL_image_external : enable -uniform samplerExternalOES badExt; // ERROR -#extension GL_OES_EGL_image_external : disable - -uniform samplerExternalOES badExt; // ERROR +#version 300 es + +#extension GL_OES_EGL_image_external_essl3 : enable + +uniform samplerExternalOES sExt; +precision mediump samplerExternalOES; +uniform samplerExternalOES mediumExt; +uniform highp samplerExternalOES highExt; + +void main() +{ + texture2D(sExt, vec2(0.2)); // ERROR + texture2D(mediumExt, vec2(0.2)); // ERROR + texture2D(highExt, vec2(0.2)); // ERROR + texture2DProj(sExt, vec3(0.3)); // ERROR + texture2DProj(sExt, vec4(0.3)); // ERROR + + int lod = 0; + highp float bias = 0.01; + textureSize(sExt, lod); + texture(sExt, vec2(0.2)); + texture(sExt, vec2(0.2), bias); + textureProj(sExt, vec3(0.2)); + textureProj(sExt, vec3(0.2), bias); + textureProj(sExt, vec4(0.2)); + textureProj(sExt, vec4(0.2), bias); + texelFetch(sExt, ivec2(4), lod); + + texture3D(sExt, vec3(0.3)); // ERROR + texture2DProjLod(sExt, vec3(0.3), 0.3); // ERROR + texture(sExt, vec3(0.3)); // ERROR + textureProjLod(sExt, vec3(0.3), 0.3); // ERROR +} + +#extension GL_OES_EGL_image_external_essl3 : disable + +#extension GL_OES_EGL_image_external : enable +uniform samplerExternalOES badExt; // ERROR +#extension GL_OES_EGL_image_external : disable + +uniform samplerExternalOES badExt; // ERROR diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/300.vert vulkan-1.1.73+dfsg/external/glslang/Test/300.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/300.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/300.vert 2018-04-27 11:46:26.000000000 +0000 @@ -184,7 +184,7 @@ yp = y; xp = y; // ERROR, wrong size yp = x; // ERROR, wrong size -} +} layout(num_views = 2) in; // ERROR, no extension diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/310AofA.vert vulkan-1.1.73+dfsg/external/glslang/Test/310AofA.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/310AofA.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/310AofA.vert 2018-04-27 11:46:26.000000000 +0000 @@ -13,109 +13,109 @@ f(false, 12.1, uint[NZ](uint(0),uint(1),uint(1),uint(2)), d); } -buffer b { - float u[]; // ERROR - vec4 v[]; +buffer b { + float u[]; // ERROR + vec4 v[]; } name[3]; - -uniform ub { - float u; - vec4 v[]; // ERROR + +uniform ub { + float u; + vec4 v[]; // ERROR } uname[3]; -buffer b2 { - float u; - vec4 v[][]; // ERROR +buffer b2 { + float u; + vec4 v[][]; // ERROR } name2[3]; -buffer b3 { - float u; - vec4 v[][7]; +buffer b3 { + float u; + vec4 v[][7]; } name3[3]; // General arrays of arrays - -float[4][5][6] many[1][2][3]; - -float gu[][7]; // ERROR, size required -float g4[4][7]; -float g5[5][7]; - -float[4][7] foo(float a[5][7]) -{ - float r[7]; - r = a[2]; - float[](a[0], a[1], r, a[3]); // ERROR, too few dims - float[4][7][4](a[0], a[1], r, a[3]); // ERROR, too many dims - return float[4][7](a[0], a[1], r, a[3]); - return float[][](a[0], a[1], r, a[3]); - return float[][7](a[0], a[1], a[2], a[3]); -} - -void bar(float[5][7]) {} - -void foo2() -{ - { - float gu[3][4][2]; - - gu[2][4][1] = 4.0; // ERROR, overflow - } - vec4 ca4[3][2] = vec4[][](vec4[2](vec4(0.0), vec4(1.0)), - vec4[2](vec4(0.0), vec4(1.0)), - vec4[2](vec4(0.0), vec4(1.0))); - vec4 caim[][2] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0))); - vec4 caim2[][] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0))); - vec4 caim3[3][] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0))); - - g4 = foo(g5); - g5 = g4; // ERROR, wrong types - gu = g4; // ERROR, not yet sized - - foo(gu); // ERROR, not yet sized - bar(g5); - - if (foo(g5) == g4) - ; - if (foo(g5) == g5) // ERROR, different types - ; - - float u[5][7]; - u[5][2] = 5.0; // ERROR - foo(u); - - vec4 badAss[3]; - name[1].v[-1]; // ERROR - name[1].v[1] = vec4(4.3); - name[1].v = badAss; // ERROR, bad assignemnt - - name3[0].v[1].length(); // 7 - name3[0].v.length(); // run time -} - -struct badS { - int sa[]; // ERROR - int a[][]; // ERROR - int b[][2]; // ERROR - int c[2][]; // ERROR - int d[][4]; // ERROR -}; - -in float inArray[2][3]; // ERROR -out float outArray[2][3]; // ERROR - -uniform ubaa { - int a; -} ubaaname[2][3]; // ERROR - -vec3 func(in mat3[2] x[3]) -{ - mat3 a0 = x[2][1]; - return a0[2]; -} + +float[4][5][6] many[1][2][3]; + +float gu[][7]; // ERROR, size required +float g4[4][7]; +float g5[5][7]; + +float[4][7] foo(float a[5][7]) +{ + float r[7]; + r = a[2]; + float[](a[0], a[1], r, a[3]); // ERROR, too few dims + float[4][7][4](a[0], a[1], r, a[3]); // ERROR, too many dims + return float[4][7](a[0], a[1], r, a[3]); + return float[][](a[0], a[1], r, a[3]); + return float[][7](a[0], a[1], a[2], a[3]); +} + +void bar(float[5][7]) {} + +void foo2() +{ + { + float gu[3][4][2]; + + gu[2][4][1] = 4.0; // ERROR, overflow + } + vec4 ca4[3][2] = vec4[][](vec4[2](vec4(0.0), vec4(1.0)), + vec4[2](vec4(0.0), vec4(1.0)), + vec4[2](vec4(0.0), vec4(1.0))); + vec4 caim[][2] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0))); + vec4 caim2[][] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0))); + vec4 caim3[3][] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0))); + + g4 = foo(g5); + g5 = g4; // ERROR, wrong types + gu = g4; // ERROR, not yet sized + + foo(gu); // ERROR, not yet sized + bar(g5); + + if (foo(g5) == g4) + ; + if (foo(g5) == g5) // ERROR, different types + ; + + float u[5][7]; + u[5][2] = 5.0; // ERROR + foo(u); + + vec4 badAss[3]; + name[1].v[-1]; // ERROR + name[1].v[1] = vec4(4.3); + name[1].v = badAss; // ERROR, bad assignemnt + + name3[0].v[1].length(); // 7 + name3[0].v.length(); // run time +} + +struct badS { + int sa[]; // ERROR + int a[][]; // ERROR + int b[][2]; // ERROR + int c[2][]; // ERROR + int d[][4]; // ERROR +}; + +in float inArray[2][3]; // ERROR +out float outArray[2][3]; // ERROR + +uniform ubaa { + int a; +} ubaaname[2][3]; // ERROR + +vec3 func(in mat3[2] x[3]) +{ + mat3 a0 = x[2][1]; + return a0[2]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/310.comp vulkan-1.1.73+dfsg/external/glslang/Test/310.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/310.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/310.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,237 +1,237 @@ -#version 310 es - -layout(local_size_x = 2) in; -layout(local_size_x = 16) in; // ERROR, changing -layout(local_size_z = 4096) in; // ERROR, too large -layout(local_size_x = 2) in; -layout(local_size_y = 0) in; // ERROR, 0 not allowed -const int total = gl_MaxComputeWorkGroupCount.y - + gl_MaxComputeUniformComponents - + gl_MaxComputeTextureImageUnits - + gl_MaxComputeImageUniforms - + gl_MaxComputeAtomicCounters - + gl_MaxComputeAtomicCounterBuffers; - -buffer ShaderStorageBlock -{ - int value; - float values[]; -}; - -buffer InvalidShaderStorageBlock -{ - float values[]; // ERROR - int value; -} invalid; - -void main() -{ - barrier(); - memoryBarrier(); - memoryBarrierAtomicCounter(); - memoryBarrierBuffer(); - memoryBarrierShared(); - memoryBarrierImage(); - groupMemoryBarrier(); - value = int(values[gl_LocalInvocationIndex]); -} - -layout(location = 2) in vec3 v3; // ERROR -in float f; // ERROR -out float fo; // ERROR - -shared vec4 s; -layout(location = 2) shared vec4 sl; // ERROR -shared float fs = 4.2; // ERROR - -layout(local_size_x = 2, local_size_y = 3, local_size_z = 4) out; // ERROR - -int arrX[gl_WorkGroupSize.x]; -int arrY[gl_WorkGroupSize.y]; -int arrZ[gl_WorkGroupSize.z]; - -readonly buffer roblock -{ - int value; - float values[]; -} ro; - -void foo() -{ - ro.values[2] = 4.7; // ERROR, readonly - ro.values.length(); - ++s; -} - -buffer vec4 v; // ERROR - -uniform usampler2D us2dbad; // ERROR, default precision - -precision highp usampler2D; -precision highp iimage2DArray; -precision highp iimage2D; - -uniform usampler2D us2d; - -uniform iimage2DArray ii2dabad; // ERROR, not writeonly -uniform writeonly iimage2DArray ii2da; - -layout(r32i) uniform iimage2D iimg2D; -layout(rgba32i) uniform readonly iimage2D iimg2Drgba; -layout(rgba32f) uniform readonly image2D img2Drgba; // ERROR, no default -layout(r32ui) uniform uimage2D uimg2D; // ERROR, no default - -void qux() -{ - int i = 4; - imageAtomicCompSwap(iimg2D, ivec2(i,i), i, i);// ERROR no longer in 310 - imageAtomicAdd(uimg2D, ivec2(i,i), uint(i)); // ERROR no longer in 310 - imageAtomicMin(iimg2Drgba, ivec2(i,i), i); // ERROR no longer in 310 // ERROR iimg2Drgba does not have r32i layout - imageAtomicMax(img2Drgba, ivec2(i,i), i); // ERROR no longer in 310 // ERROR img2Drgba is not integer image - ivec4 pos = imageLoad(iimg2D, ivec2(i,i)); - imageStore(ii2da, ivec3(i,i,i), ivec4(0)); - imageLoad(img2Drgba, ivec2(i,i)); - imageLoad(ii2da, ivec3(i,i,i)); // ERROR, drops writeonly -} - -volatile float vol; // ERROR, not an image -readonly int vol2; // ERROR, not an image - -void passr(coherent readonly iimage2D image) -{ -} - -layout(r32i) coherent readonly uniform iimage2D qualim1; -layout(r32i) coherent restrict readonly uniform iimage2D qualim2; - -void passrc() -{ - passr(qualim1); - passr(qualim2); // ERROR, drops restrict - passr(iimg2D); -} - -highp layout(rg8i) uniform readonly uimage2D i1bad; // ERROR, type mismatch -highp layout(rgba32i) uniform readonly image2D i2bad; // ERROR, type mismatch -highp layout(rgba32f) uniform readonly uimage2D i3bad; // ERROR, type mismatch -layout(r8_snorm) uniform readonly iimage2D i4bad; // ERROR, type mismatch -layout(rgba32ui) uniform readonly iimage2D i5bad; // ERROR, type mismatch -layout(r8ui) uniform readonly iimage2D i6bad; // ERROR, type mismatch - -layout(binding = 0) uniform atomic_uint counter; - -uint func(atomic_uint c) -{ - return atomicCounterIncrement(c); -} - -uint func2(out atomic_uint c) // ERROR, output -{ - return counter; // ERROR, type mismatch - return atomicCounter(counter); -} - -void mainAC() -{ - atomic_uint non_uniform_counter; // ERROR - uint val = atomicCounter(counter); - atomicCounterDecrement(counter); -} - -layout(binding = 1) uniform mediump atomic_uint counterBad; // ERROR, not highp - -layout(binding = 2, offset = 4) uniform atomic_uint countArr[4]; -uniform int i; - -void opac() -{ - int a[3]; - a[counter]; // ERROR, non-integer - countArr[2]; - countArr[i]; -} - -shared int atomi; -shared uint atomu; - -void atoms() -{ - int origi = atomicAdd(atomi, 3); - uint origu = atomicAnd(atomu, 7u); - origi = atomicExchange(atomi, 4); - origu = atomicCompSwap(atomu, 10u, 8u); -} - -precision highp atomic_uint; -precision lowp atomic_uint; // ERROR - -precise int pfoo; // ERROR, reserved - -dmat2x4 dm; // ERROR -uniform samplerCubeArray sca; // ERROR -uniform iimage2DRect i2dr; // ERROR -highp uniform image2DMS i2dms; // ERROR -uniform uimage2DMSArray u2dmsa; // ERROR - -highp layout(r32f) coherent volatile restrict readonly writeonly uniform image2D okay1; - layout(r32i) coherent volatile restrict readonly uniform iimage2D okay2; -highp layout(r32ui) coherent volatile restrict writeonly uniform uimage2D okay3; -highp layout(r32f) coherent volatile restrict uniform image2D okay4; - -highp layout(rgba32f) coherent volatile restrict uniform image2D badQ1; // ERROR, bad qualifiers - layout(rgba8i) coherent volatile restrict uniform iimage2D badQ2; // ERROR, bad qualifiers -highp layout(rgba16ui) coherent volatile restrict uniform uimage2D badQ3; // ERROR, bad qualifiers - -writeonly buffer woblock -{ - int value; - float values[]; -} wo; - -void foowo() -{ - float g; - g = wo.values[2]; // ERROR, writeonly - float f = wo.values[2]; // ERROR, writeonly - ++wo.values[2]; // ERROR, writeonly - wo.values[2]--; // ERROR, writeonly - f + wo.values[2]; // ERROR, writeonly - wo.values[2] - f; // ERROR, writeonly - bool b; - b ? f : wo.values[2]; // ERROR, writeonly - b ? wo.values[2] : f; // ERROR, writeonly - if (f == wo.values[2]) // ERROR, writeonly - ++f; - if (f >= wo.values[2]) // ERROR, writeonly - ++f; - f = vec3(wo.values[2]).x; // ERROR, writeonly - ~wo.value; // ERROR, writeonly - wo.values[2] = 3.4; -} - -buffer multioblock -{ - readonly int value; - writeonly float values[]; -} multio; - -void foomultio() -{ - float g; - g = wo.values[2]; // ERROR, writeonly - ~wo.value; - wo.values[2] = 3.4; - wo.value = 2; // ERROR, readonly -} - -in inb { // ERROR - int a; -} inbi; - -out outb { // ERROR - int a; -} outbi; - +#version 310 es + +layout(local_size_x = 2) in; +layout(local_size_x = 16) in; // ERROR, changing +layout(local_size_z = 4096) in; // ERROR, too large +layout(local_size_x = 2) in; +layout(local_size_y = 0) in; // ERROR, 0 not allowed +const int total = gl_MaxComputeWorkGroupCount.y + + gl_MaxComputeUniformComponents + + gl_MaxComputeTextureImageUnits + + gl_MaxComputeImageUniforms + + gl_MaxComputeAtomicCounters + + gl_MaxComputeAtomicCounterBuffers; + +buffer ShaderStorageBlock +{ + int value; + float values[]; +}; + +buffer InvalidShaderStorageBlock +{ + float values[]; // ERROR + int value; +} invalid; + +void main() +{ + barrier(); + memoryBarrier(); + memoryBarrierAtomicCounter(); + memoryBarrierBuffer(); + memoryBarrierShared(); + memoryBarrierImage(); + groupMemoryBarrier(); + value = int(values[gl_LocalInvocationIndex]); +} + +layout(location = 2) in vec3 v3; // ERROR +in float f; // ERROR +out float fo; // ERROR + +shared vec4 s; +layout(location = 2) shared vec4 sl; // ERROR +shared float fs = 4.2; // ERROR + +layout(local_size_x = 2, local_size_y = 3, local_size_z = 4) out; // ERROR + +int arrX[gl_WorkGroupSize.x]; +int arrY[gl_WorkGroupSize.y]; +int arrZ[gl_WorkGroupSize.z]; + +readonly buffer roblock +{ + int value; + float values[]; +} ro; + +void foo() +{ + ro.values[2] = 4.7; // ERROR, readonly + ro.values.length(); + ++s; +} + +buffer vec4 v; // ERROR + +uniform usampler2D us2dbad; // ERROR, default precision + +precision highp usampler2D; +precision highp iimage2DArray; +precision highp iimage2D; + +uniform usampler2D us2d; + +uniform iimage2DArray ii2dabad; // ERROR, not writeonly +uniform writeonly iimage2DArray ii2da; + +layout(r32i) uniform iimage2D iimg2D; +layout(rgba32i) uniform readonly iimage2D iimg2Drgba; +layout(rgba32f) uniform readonly image2D img2Drgba; // ERROR, no default +layout(r32ui) uniform uimage2D uimg2D; // ERROR, no default + +void qux() +{ + int i = 4; + imageAtomicCompSwap(iimg2D, ivec2(i,i), i, i);// ERROR no longer in 310 + imageAtomicAdd(uimg2D, ivec2(i,i), uint(i)); // ERROR no longer in 310 + imageAtomicMin(iimg2Drgba, ivec2(i,i), i); // ERROR no longer in 310 // ERROR iimg2Drgba does not have r32i layout + imageAtomicMax(img2Drgba, ivec2(i,i), i); // ERROR no longer in 310 // ERROR img2Drgba is not integer image + ivec4 pos = imageLoad(iimg2D, ivec2(i,i)); + imageStore(ii2da, ivec3(i,i,i), ivec4(0)); + imageLoad(img2Drgba, ivec2(i,i)); + imageLoad(ii2da, ivec3(i,i,i)); // ERROR, drops writeonly +} + +volatile float vol; // ERROR, not an image +readonly int vol2; // ERROR, not an image + +void passr(coherent readonly iimage2D image) +{ +} + +layout(r32i) coherent readonly uniform iimage2D qualim1; +layout(r32i) coherent restrict readonly uniform iimage2D qualim2; + +void passrc() +{ + passr(qualim1); + passr(qualim2); // ERROR, drops restrict + passr(iimg2D); +} + +highp layout(rg8i) uniform readonly uimage2D i1bad; // ERROR, type mismatch +highp layout(rgba32i) uniform readonly image2D i2bad; // ERROR, type mismatch +highp layout(rgba32f) uniform readonly uimage2D i3bad; // ERROR, type mismatch +layout(r8_snorm) uniform readonly iimage2D i4bad; // ERROR, type mismatch +layout(rgba32ui) uniform readonly iimage2D i5bad; // ERROR, type mismatch +layout(r8ui) uniform readonly iimage2D i6bad; // ERROR, type mismatch + +layout(binding = 0) uniform atomic_uint counter; + +uint func(atomic_uint c) +{ + return atomicCounterIncrement(c); +} + +uint func2(out atomic_uint c) // ERROR, output +{ + return counter; // ERROR, type mismatch + return atomicCounter(counter); +} + +void mainAC() +{ + atomic_uint non_uniform_counter; // ERROR + uint val = atomicCounter(counter); + atomicCounterDecrement(counter); +} + +layout(binding = 1) uniform mediump atomic_uint counterBad; // ERROR, not highp + +layout(binding = 2, offset = 4) uniform atomic_uint countArr[4]; +uniform int i; + +void opac() +{ + int a[3]; + a[counter]; // ERROR, non-integer + countArr[2]; + countArr[i]; +} + +shared int atomi; +shared uint atomu; + +void atoms() +{ + int origi = atomicAdd(atomi, 3); + uint origu = atomicAnd(atomu, 7u); + origi = atomicExchange(atomi, 4); + origu = atomicCompSwap(atomu, 10u, 8u); +} + +precision highp atomic_uint; +precision lowp atomic_uint; // ERROR + +precise int pfoo; // ERROR, reserved + +dmat2x4 dm; // ERROR +uniform samplerCubeArray sca; // ERROR +uniform iimage2DRect i2dr; // ERROR +highp uniform image2DMS i2dms; // ERROR +uniform uimage2DMSArray u2dmsa; // ERROR + +highp layout(r32f) coherent volatile restrict readonly writeonly uniform image2D okay1; + layout(r32i) coherent volatile restrict readonly uniform iimage2D okay2; +highp layout(r32ui) coherent volatile restrict writeonly uniform uimage2D okay3; +highp layout(r32f) coherent volatile restrict uniform image2D okay4; + +highp layout(rgba32f) coherent volatile restrict uniform image2D badQ1; // ERROR, bad qualifiers + layout(rgba8i) coherent volatile restrict uniform iimage2D badQ2; // ERROR, bad qualifiers +highp layout(rgba16ui) coherent volatile restrict uniform uimage2D badQ3; // ERROR, bad qualifiers + +writeonly buffer woblock +{ + int value; + float values[]; +} wo; + +void foowo() +{ + float g; + g = wo.values[2]; // ERROR, writeonly + float f = wo.values[2]; // ERROR, writeonly + ++wo.values[2]; // ERROR, writeonly + wo.values[2]--; // ERROR, writeonly + f + wo.values[2]; // ERROR, writeonly + wo.values[2] - f; // ERROR, writeonly + bool b; + b ? f : wo.values[2]; // ERROR, writeonly + b ? wo.values[2] : f; // ERROR, writeonly + if (f == wo.values[2]) // ERROR, writeonly + ++f; + if (f >= wo.values[2]) // ERROR, writeonly + ++f; + f = vec3(wo.values[2]).x; // ERROR, writeonly + ~wo.value; // ERROR, writeonly + wo.values[2] = 3.4; +} + +buffer multioblock +{ + readonly int value; + writeonly float values[]; +} multio; + +void foomultio() +{ + float g; + g = wo.values[2]; // ERROR, writeonly + ~wo.value; + wo.values[2] = 3.4; + wo.value = 2; // ERROR, readonly +} + +in inb { // ERROR + int a; +} inbi; + +out outb { // ERROR + int a; +} outbi; + float t__; // ERROR, no __ until revision 310 // ERROR, no __ until revision 310 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/310.frag vulkan-1.1.73+dfsg/external/glslang/Test/310.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/310.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/310.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,291 +1,291 @@ -#version 310 es -highp float nodef3(float); // ERROR, no default precision -precision mediump float; -precision highp usampler2D; -precision highp sampler2D; -precision highp isampler2DArray; - -layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; // ERROR, not supported - -layout(location = 2) in vec3 v3; -layout(location = 2) in mat4 yi; // ERROR, locations conflict with xi - -uniform sampler2D arrayedSampler[5]; -uniform usampler2D usamp2d; -uniform usampler2DRect samp2dr; // ERROR, reserved -uniform isampler2DArray isamp2DA; - -in vec2 c2D; -uniform int i; - -void main() -{ - vec4 v = texture(arrayedSampler[i], c2D); // ERROR - - ivec2 offsets[4]; - const ivec2 constOffsets[4] = ivec2[4](ivec2(1,2), ivec2(3,4), ivec2(15,16), ivec2(-2,0)); - uvec4 uv4 = textureGatherOffsets(samp2dr, c2D, offsets, 2); // ERROR, not supported - vec4 v4 = textureGather(arrayedSampler[0], c2D); - ivec4 iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 3); - iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), i); // ERROR, last argument not const - iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 4); // ERROR, last argument out of range - iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 1+2); - iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(0.5)); - iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(i)); // ERROR, offset not constant -} - -out vec4 outp; -void foo23() -{ - const ivec2[3] offsets = ivec2[3](ivec2(1,2), ivec2(3,4), ivec2(15,16)); - - textureProjGradOffset(usamp2d, outp, vec2(0.0), vec2(0.0), ivec2(c2D)); // ERROR, offset not constant - textureProjGradOffset(usamp2d, outp, vec2(0.0), vec2(0.0), offsets[1]); - textureProjGradOffset(usamp2d, outp, vec2(0.0), vec2(0.0), offsets[2]); // ERROR, offset out of range - textureProjGradOffset(usamp2d, outp, vec2(0.0), vec2(0.0), ivec2(-10, 20)); // ERROR, offset out of range - - if (gl_HelperInvocation) - ++outp; - - int sum = gl_MaxVertexImageUniforms + - gl_MaxFragmentImageUniforms + - gl_MaxComputeImageUniforms + - gl_MaxCombinedImageUniforms + - gl_MaxCombinedShaderOutputResources; - - bool b1, b2, b3, b; - - b1 = mix(b2, b3, b); - uvec3 um3 = mix(uvec3(i), uvec3(i), bvec3(b)); - ivec4 im4 = mix(ivec4(i), ivec4(i), bvec4(b)); -} - -layout(binding=3) uniform sampler2D s1; -layout(binding=3) uniform sampler2D s2; // ERROR: overlapping bindings? Don't see that in the 310 spec. -highp layout(binding=2) uniform writeonly image2D i2D; - layout(binding=4) uniform readonly image3D i3D; // ERROR, no default precision - layout(binding=5) uniform imageCube iCube; // ERROR, no default precision - layout(binding=6) uniform image2DArray i2DA; // ERROR, no default precision - layout(binding=6) uniform coherent volatile restrict image2D i2Dqualified; // ERROR, no default precision - -layout(binding = 1) uniform bb { - int foo; - layout(binding = 2) float f; // ERROR -} bbi; - -in centroid vec4 centroidIn; -layout(location = 200000) uniform vec4 bigl; // ERROR, location too big - -layout(early_fragment_tests) in; - -layout(location = 40) out vec4 bigout1; // ERROR, too big -layout(location = 40) out vec4 bigout2; // ERROR, overlap -layout(location = -2) out vec4 neg; // ERROR, negative - -layout(std430) buffer b430 { - int i; -} b430i; - -layout(shared) uniform bshar { - int i; -} bshari; - -in smooth vec4 smoothIn; -in flat int flatIn; - -uniform sampler2DMS s2dms; // ERROR, no default precision qualifier - -void foots() -{ - highp ivec2 v2 = textureSize(s1, 2); - highp ivec3 v3 = textureSize(isamp2DA, 3); - v2 = textureSize(s2dms); - v2 = imageSize(i2D); - v3 = imageSize(i3D); - v2 = imageSize(iCube); - v3 = imageSize(i2DA); - v2 = imageSize(i2Dqualified); -} - -out bool bout; // ERROR -highp out image2D imageOut; // ERROR -out mat2x3 mout; // ERROR - -in bool inb; // ERROR -in sampler2D ino; // ERROR -in float ina[4]; -in float inaa[4][2]; // ERROR -struct S { float f; }; -in S ins; -in S[4] inasa; // ERROR -in S insa[4]; // ERROR -struct SA { float f[4]; }; -in SA inSA; // ERROR -struct SS { float f; S s; }; -in SS inSS; // ERROR - -#ifndef GL_EXT_shader_io_blocks -#error GL_EXT_shader_io_blocks not defined -#endif - -#extension GL_EXT_shader_io_blocks : enable - -out outbname { int a; } outbinst; // ERROR, not out block in fragment shader - -in inbname { - int a; - vec4 v; - struct { int b; } s; // ERROR, nested struct definition -} inbinst; - -in inbname2 { - layout(location = 12) int aAnon; - layout(location = 13) centroid in vec4 vAnon; -}; - -in layout(location = 13) vec4 aliased; // ERROR, aliased - -in inbname2 { // ERROR, reuse of block name - int aAnon; - centroid in vec4 vAnon; -}; - -in badmember { // ERROR, aAnon already in global scope - int aAnon; -}; - -int inbname; // ERROR, redefinition of block name - -vec4 vAnon; // ERROR, anon in global scope; redefinition - -in arrayed { - float f; -} arrayedInst[4]; - -void fooIO() -{ - vec4 v = inbinst.v + vAnon; - v *= arrayedInst[2].f; - v *= arrayedInst[i].f; -} - -in vec4 gl_FragCoord; -layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; // ERROR, non-ES - -layout(early_fragment_tests) in; -out float gl_FragDepth; -layout(depth_any) out float gl_FragDepth; // ERROR, non-ES - -void foo_IO() -{ - gl_FragDepth = 0.2; // ERROR, early_fragment_tests declared - gl_Layer; // ERROR, not present - gl_PrimitiveID; // ERROR, not present - bool f = gl_FrontFacing; -} - -out float gl_FragDepth; - -#extension GL_OES_geometry_shader : enable - -void foo_GS() -{ - highp int l = gl_Layer; - highp int p = gl_PrimitiveID; -} - -in vec2 inf, ing; -uniform ivec2 offsets[4]; -uniform sampler2D sArray[4]; -uniform int sIndex; -layout(binding = 0) uniform atomic_uint auArray[2]; -uniform ubName { int i; } ubInst[4]; -buffer bbName { int i; } bbInst[4]; -highp uniform writeonly image2D iArray[5]; -const ivec2 constOffsets[4] = ivec2[4](ivec2(0.1), ivec2(0.2), ivec2(0.3), ivec2(0.4)); - -void pfooBad() -{ - precise vec2 h; // ERROR reserved - h = fma(inf, ing, h); // ERROR, not available - textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf)); // ERROR, offset not constant - textureGatherOffsets(sArray[0], vec2(0.1), constOffsets); // ERROR, not available -} - -#extension GL_OES_gpu_shader5 : enable - -void pfoo() -{ - precise vec2 h; - h = fma(inf, ing, h); - textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf)); - textureGatherOffsets(sArray[0], vec2(0.1), constOffsets); - textureGatherOffsets(sArray[0], vec2(0.1), offsets); // ERROR, offset not constant -} - -#extension GL_EXT_texture_cube_map_array : enable - -precision highp imageCubeArray ; -precision highp iimageCubeArray ; -precision highp uimageCubeArray ; - -precision highp samplerCubeArray ; -precision highp samplerCubeArrayShadow; -precision highp isamplerCubeArray ; -precision highp usamplerCubeArray ; - -uniform writeonly imageCubeArray CA1; -uniform writeonly iimageCubeArray CA2; -uniform writeonly uimageCubeArray CA3; - -#ifdef GL_EXT_texture_cube_map_array -uniform samplerCubeArray CA4; -uniform samplerCubeArrayShadow CA5; -uniform isamplerCubeArray CA6; -uniform usamplerCubeArray CA7; -#endif - -void CAT() -{ - highp vec4 b4 = texture(CA4, vec4(0.5), 0.24); - highp ivec4 b6 = texture(CA6, vec4(0.5), 0.26); - highp uvec4 b7 = texture(CA7, vec4(0.5), 0.27); -} - -void badSample() -{ - lowp int a1 = gl_SampleID; // ERROR, need extension - mediump vec2 a2 = gl_SamplePosition; // ERROR, need extension - highp int a3 = gl_SampleMaskIn[0]; // ERROR, need extension - gl_SampleMask[0] = a3; // ERROR, need extension - mediump int n = gl_NumSamples; // ERROR, need extension -} - -#ifdef GL_OES_sample_variables -#extension GL_OES_sample_variables : enable -#endif - -void goodSample() -{ - lowp int a1 = gl_SampleID; - mediump vec2 a2 = gl_SamplePosition; - highp int a3 = gl_SampleMaskIn[0]; - gl_SampleMask[0] = a3; - mediump int n1 = gl_MaxSamples; - mediump int n2 = gl_NumSamples; -} - -uniform layout(r32f) highp image2D im2Df; -uniform layout(r32ui) highp uimage2D im2Du; -uniform layout(r32i) highp iimage2D im2Di; -uniform ivec2 P; - -void badImageAtom() -{ - float datf; - int dati; - uint datu; - +#version 310 es +highp float nodef3(float); // ERROR, no default precision +precision mediump float; +precision highp usampler2D; +precision highp sampler2D; +precision highp isampler2DArray; + +layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; // ERROR, not supported + +layout(location = 2) in vec3 v3; +layout(location = 2) in mat4 yi; // ERROR, locations conflict with xi + +uniform sampler2D arrayedSampler[5]; +uniform usampler2D usamp2d; +uniform usampler2DRect samp2dr; // ERROR, reserved +uniform isampler2DArray isamp2DA; + +in vec2 c2D; +uniform int i; + +void main() +{ + vec4 v = texture(arrayedSampler[i], c2D); // ERROR + + ivec2 offsets[4]; + const ivec2 constOffsets[4] = ivec2[4](ivec2(1,2), ivec2(3,4), ivec2(15,16), ivec2(-2,0)); + uvec4 uv4 = textureGatherOffsets(samp2dr, c2D, offsets, 2); // ERROR, not supported + vec4 v4 = textureGather(arrayedSampler[0], c2D); + ivec4 iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 3); + iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), i); // ERROR, last argument not const + iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 4); // ERROR, last argument out of range + iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 1+2); + iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(0.5)); + iv4 = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(i)); // ERROR, offset not constant +} + +out vec4 outp; +void foo23() +{ + const ivec2[3] offsets = ivec2[3](ivec2(1,2), ivec2(3,4), ivec2(15,16)); + + textureProjGradOffset(usamp2d, outp, vec2(0.0), vec2(0.0), ivec2(c2D)); // ERROR, offset not constant + textureProjGradOffset(usamp2d, outp, vec2(0.0), vec2(0.0), offsets[1]); + textureProjGradOffset(usamp2d, outp, vec2(0.0), vec2(0.0), offsets[2]); // ERROR, offset out of range + textureProjGradOffset(usamp2d, outp, vec2(0.0), vec2(0.0), ivec2(-10, 20)); // ERROR, offset out of range + + if (gl_HelperInvocation) + ++outp; + + int sum = gl_MaxVertexImageUniforms + + gl_MaxFragmentImageUniforms + + gl_MaxComputeImageUniforms + + gl_MaxCombinedImageUniforms + + gl_MaxCombinedShaderOutputResources; + + bool b1, b2, b3, b; + + b1 = mix(b2, b3, b); + uvec3 um3 = mix(uvec3(i), uvec3(i), bvec3(b)); + ivec4 im4 = mix(ivec4(i), ivec4(i), bvec4(b)); +} + +layout(binding=3) uniform sampler2D s1; +layout(binding=3) uniform sampler2D s2; // ERROR: overlapping bindings? Don't see that in the 310 spec. +highp layout(binding=2) uniform writeonly image2D i2D; + layout(binding=4) uniform readonly image3D i3D; // ERROR, no default precision + layout(binding=5) uniform imageCube iCube; // ERROR, no default precision + layout(binding=6) uniform image2DArray i2DA; // ERROR, no default precision + layout(binding=6) uniform coherent volatile restrict image2D i2Dqualified; // ERROR, no default precision + +layout(binding = 1) uniform bb { + int foo; + layout(binding = 2) float f; // ERROR +} bbi; + +in centroid vec4 centroidIn; +layout(location = 200000) uniform vec4 bigl; // ERROR, location too big + +layout(early_fragment_tests) in; + +layout(location = 40) out vec4 bigout1; // ERROR, too big +layout(location = 40) out vec4 bigout2; // ERROR, overlap +layout(location = -2) out vec4 neg; // ERROR, negative + +layout(std430) buffer b430 { + int i; +} b430i; + +layout(shared) uniform bshar { + int i; +} bshari; + +in smooth vec4 smoothIn; +in flat int flatIn; + +uniform sampler2DMS s2dms; // ERROR, no default precision qualifier + +void foots() +{ + highp ivec2 v2 = textureSize(s1, 2); + highp ivec3 v3 = textureSize(isamp2DA, 3); + v2 = textureSize(s2dms); + v2 = imageSize(i2D); + v3 = imageSize(i3D); + v2 = imageSize(iCube); + v3 = imageSize(i2DA); + v2 = imageSize(i2Dqualified); +} + +out bool bout; // ERROR +highp out image2D imageOut; // ERROR +out mat2x3 mout; // ERROR + +in bool inb; // ERROR +in sampler2D ino; // ERROR +in float ina[4]; +in float inaa[4][2]; // ERROR +struct S { float f; }; +in S ins; +in S[4] inasa; // ERROR +in S insa[4]; // ERROR +struct SA { float f[4]; }; +in SA inSA; // ERROR +struct SS { float f; S s; }; +in SS inSS; // ERROR + +#ifndef GL_EXT_shader_io_blocks +#error GL_EXT_shader_io_blocks not defined +#endif + +#extension GL_EXT_shader_io_blocks : enable + +out outbname { int a; } outbinst; // ERROR, not out block in fragment shader + +in inbname { + int a; + vec4 v; + struct { int b; } s; // ERROR, nested struct definition +} inbinst; + +in inbname2 { + layout(location = 12) int aAnon; + layout(location = 13) centroid in vec4 vAnon; +}; + +in layout(location = 13) vec4 aliased; // ERROR, aliased + +in inbname2 { // ERROR, reuse of block name + int aAnon; + centroid in vec4 vAnon; +}; + +in badmember { // ERROR, aAnon already in global scope + int aAnon; +}; + +int inbname; // ERROR, redefinition of block name + +vec4 vAnon; // ERROR, anon in global scope; redefinition + +in arrayed { + float f; +} arrayedInst[4]; + +void fooIO() +{ + vec4 v = inbinst.v + vAnon; + v *= arrayedInst[2].f; + v *= arrayedInst[i].f; +} + +in vec4 gl_FragCoord; +layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; // ERROR, non-ES + +layout(early_fragment_tests) in; +out float gl_FragDepth; +layout(depth_any) out float gl_FragDepth; // ERROR, non-ES + +void foo_IO() +{ + gl_FragDepth = 0.2; // ERROR, early_fragment_tests declared + gl_Layer; // ERROR, not present + gl_PrimitiveID; // ERROR, not present + bool f = gl_FrontFacing; +} + +out float gl_FragDepth; + +#extension GL_OES_geometry_shader : enable + +void foo_GS() +{ + highp int l = gl_Layer; + highp int p = gl_PrimitiveID; +} + +in vec2 inf, ing; +uniform ivec2 offsets[4]; +uniform sampler2D sArray[4]; +uniform int sIndex; +layout(binding = 0) uniform atomic_uint auArray[2]; +uniform ubName { int i; } ubInst[4]; +buffer bbName { int i; } bbInst[4]; +highp uniform writeonly image2D iArray[5]; +const ivec2 constOffsets[4] = ivec2[4](ivec2(0.1), ivec2(0.2), ivec2(0.3), ivec2(0.4)); + +void pfooBad() +{ + precise vec2 h; // ERROR reserved + h = fma(inf, ing, h); // ERROR, not available + textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf)); // ERROR, offset not constant + textureGatherOffsets(sArray[0], vec2(0.1), constOffsets); // ERROR, not available +} + +#extension GL_OES_gpu_shader5 : enable + +void pfoo() +{ + precise vec2 h; + h = fma(inf, ing, h); + textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf)); + textureGatherOffsets(sArray[0], vec2(0.1), constOffsets); + textureGatherOffsets(sArray[0], vec2(0.1), offsets); // ERROR, offset not constant +} + +#extension GL_EXT_texture_cube_map_array : enable + +precision highp imageCubeArray ; +precision highp iimageCubeArray ; +precision highp uimageCubeArray ; + +precision highp samplerCubeArray ; +precision highp samplerCubeArrayShadow; +precision highp isamplerCubeArray ; +precision highp usamplerCubeArray ; + +uniform writeonly imageCubeArray CA1; +uniform writeonly iimageCubeArray CA2; +uniform writeonly uimageCubeArray CA3; + +#ifdef GL_EXT_texture_cube_map_array +uniform samplerCubeArray CA4; +uniform samplerCubeArrayShadow CA5; +uniform isamplerCubeArray CA6; +uniform usamplerCubeArray CA7; +#endif + +void CAT() +{ + highp vec4 b4 = texture(CA4, vec4(0.5), 0.24); + highp ivec4 b6 = texture(CA6, vec4(0.5), 0.26); + highp uvec4 b7 = texture(CA7, vec4(0.5), 0.27); +} + +void badSample() +{ + lowp int a1 = gl_SampleID; // ERROR, need extension + mediump vec2 a2 = gl_SamplePosition; // ERROR, need extension + highp int a3 = gl_SampleMaskIn[0]; // ERROR, need extension + gl_SampleMask[0] = a3; // ERROR, need extension + mediump int n = gl_NumSamples; // ERROR, need extension +} + +#ifdef GL_OES_sample_variables +#extension GL_OES_sample_variables : enable +#endif + +void goodSample() +{ + lowp int a1 = gl_SampleID; + mediump vec2 a2 = gl_SamplePosition; + highp int a3 = gl_SampleMaskIn[0]; + gl_SampleMask[0] = a3; + mediump int n1 = gl_MaxSamples; + mediump int n2 = gl_NumSamples; +} + +uniform layout(r32f) highp image2D im2Df; +uniform layout(r32ui) highp uimage2D im2Du; +uniform layout(r32i) highp iimage2D im2Di; +uniform ivec2 P; + +void badImageAtom() +{ + float datf; + int dati; + uint datu; + imageAtomicAdd( im2Di, P, dati); // ERROR, need extension imageAtomicAdd( im2Du, P, datu); // ERROR, need extension imageAtomicMin( im2Di, P, dati); // ERROR, need extension @@ -301,24 +301,24 @@ imageAtomicExchange(im2Di, P, dati); // ERROR, need extension imageAtomicExchange(im2Du, P, datu); // ERROR, need extension imageAtomicExchange(im2Df, P, datf); // ERROR, need extension - imageAtomicCompSwap(im2Di, P, 3, dati); // ERROR, need extension - imageAtomicCompSwap(im2Du, P, 5u, datu); // ERROR, need extension -} - -#ifdef GL_OES_shader_image_atomic -#extension GL_OES_shader_image_atomic : enable -#endif - -uniform layout(rgba32f) highp image2D badIm2Df; // ERROR, needs readonly or writeonly -uniform layout(rgba8ui) highp uimage2D badIm2Du; // ERROR, needs readonly or writeonly -uniform layout(rgba16i) highp iimage2D badIm2Di; // ERROR, needs readonly or writeonly - -void goodImageAtom() -{ - float datf; - int dati; - uint datu; - + imageAtomicCompSwap(im2Di, P, 3, dati); // ERROR, need extension + imageAtomicCompSwap(im2Du, P, 5u, datu); // ERROR, need extension +} + +#ifdef GL_OES_shader_image_atomic +#extension GL_OES_shader_image_atomic : enable +#endif + +uniform layout(rgba32f) highp image2D badIm2Df; // ERROR, needs readonly or writeonly +uniform layout(rgba8ui) highp uimage2D badIm2Du; // ERROR, needs readonly or writeonly +uniform layout(rgba16i) highp iimage2D badIm2Di; // ERROR, needs readonly or writeonly + +void goodImageAtom() +{ + float datf; + int dati; + uint datu; + imageAtomicAdd( im2Di, P, dati); imageAtomicAdd( im2Du, P, datu); imageAtomicMin( im2Di, P, dati); @@ -334,75 +334,75 @@ imageAtomicExchange(im2Di, P, dati); imageAtomicExchange(im2Du, P, datu); imageAtomicExchange(im2Df, P, datf); - imageAtomicCompSwap(im2Di, P, 3, dati); - imageAtomicCompSwap(im2Du, P, 5u, datu); - + imageAtomicCompSwap(im2Di, P, 3, dati); + imageAtomicCompSwap(im2Du, P, 5u, datu); + imageAtomicMax(badIm2Di, P, dati); // ERROR, not an allowed layout() on the image imageAtomicMax(badIm2Du, P, datu); // ERROR, not an allowed layout() on the image imageAtomicExchange(badIm2Df, P, datf); // ERROR, not an allowed layout() on the image -} - -sample in vec4 colorSampInBad; // ERROR, reserved -centroid out vec4 colorCentroidBad; // ERROR -flat out vec4 colorBadFlat; // ERROR -smooth out vec4 colorBadSmooth; // ERROR -noperspective out vec4 colorBadNo; // ERROR -flat centroid in vec2 colorfc; -in float scalarIn; - -void badInterp() -{ - interpolateAtCentroid(colorfc); // ERROR, need extension - interpolateAtSample(colorfc, 1); // ERROR, need extension - interpolateAtOffset(colorfc, vec2(0.2)); // ERROR, need extension -} - -#if defined GL_OES_shader_multisample_interpolation -#extension GL_OES_shader_multisample_interpolation : enable -#endif - -sample in vec4 colorSampIn; -sample out vec4 colorSampleBad; // ERROR -flat sample in vec4 colorfsi; -sample in vec3 sampInArray[4]; - -void interp() -{ - float res; - vec2 res2; - vec3 res3; - vec4 res4; - - res2 = interpolateAtCentroid(colorfc); - res4 = interpolateAtCentroid(colorSampIn); - res4 = interpolateAtCentroid(colorfsi); - res = interpolateAtCentroid(scalarIn); - res3 = interpolateAtCentroid(sampInArray); // ERROR - res3 = interpolateAtCentroid(sampInArray[2]); - res2 = interpolateAtCentroid(sampInArray[2].xy); // ERROR - - res3 = interpolateAtSample(sampInArray, 1); // ERROR - res3 = interpolateAtSample(sampInArray[i], 0); - res2 = interpolateAtSample(sampInArray[2].xy, 2); // ERROR - res = interpolateAtSample(scalarIn, 1); - - res3 = interpolateAtOffset(sampInArray, vec2(0.2)); // ERROR - res3 = interpolateAtOffset(sampInArray[2], vec2(0.2)); - res2 = interpolateAtOffset(sampInArray[2].xy, vec2(0.2)); // ERROR, no swizzle - res = interpolateAtOffset(scalarIn + scalarIn, vec2(0.2)); // ERROR, no binary ops other than dereference - res = interpolateAtOffset(scalarIn, vec2(0.2)); - - float f; - res = interpolateAtCentroid(f); // ERROR, not interpolant - res4 = interpolateAtSample(outp, 0); // ERROR, not interpolant -} - -layout(blend_support_softlight) out; // ERROR, need extension - -#ifdef GL_KHR_blend_equation_advanced -#extension GL_KHR_blend_equation_advanced : enable -#endif - +} + +sample in vec4 colorSampInBad; // ERROR, reserved +centroid out vec4 colorCentroidBad; // ERROR +flat out vec4 colorBadFlat; // ERROR +smooth out vec4 colorBadSmooth; // ERROR +noperspective out vec4 colorBadNo; // ERROR +flat centroid in vec2 colorfc; +in float scalarIn; + +void badInterp() +{ + interpolateAtCentroid(colorfc); // ERROR, need extension + interpolateAtSample(colorfc, 1); // ERROR, need extension + interpolateAtOffset(colorfc, vec2(0.2)); // ERROR, need extension +} + +#if defined GL_OES_shader_multisample_interpolation +#extension GL_OES_shader_multisample_interpolation : enable +#endif + +sample in vec4 colorSampIn; +sample out vec4 colorSampleBad; // ERROR +flat sample in vec4 colorfsi; +sample in vec3 sampInArray[4]; + +void interp() +{ + float res; + vec2 res2; + vec3 res3; + vec4 res4; + + res2 = interpolateAtCentroid(colorfc); + res4 = interpolateAtCentroid(colorSampIn); + res4 = interpolateAtCentroid(colorfsi); + res = interpolateAtCentroid(scalarIn); + res3 = interpolateAtCentroid(sampInArray); // ERROR + res3 = interpolateAtCentroid(sampInArray[2]); + res2 = interpolateAtCentroid(sampInArray[2].xy); // ERROR + + res3 = interpolateAtSample(sampInArray, 1); // ERROR + res3 = interpolateAtSample(sampInArray[i], 0); + res2 = interpolateAtSample(sampInArray[2].xy, 2); // ERROR + res = interpolateAtSample(scalarIn, 1); + + res3 = interpolateAtOffset(sampInArray, vec2(0.2)); // ERROR + res3 = interpolateAtOffset(sampInArray[2], vec2(0.2)); + res2 = interpolateAtOffset(sampInArray[2].xy, vec2(0.2)); // ERROR, no swizzle + res = interpolateAtOffset(scalarIn + scalarIn, vec2(0.2)); // ERROR, no binary ops other than dereference + res = interpolateAtOffset(scalarIn, vec2(0.2)); + + float f; + res = interpolateAtCentroid(f); // ERROR, not interpolant + res4 = interpolateAtSample(outp, 0); // ERROR, not interpolant +} + +layout(blend_support_softlight) out; // ERROR, need extension + +#ifdef GL_KHR_blend_equation_advanced +#extension GL_KHR_blend_equation_advanced : enable +#endif + layout(blend_support_multiply) out; layout(blend_support_screen) out; layout(blend_support_overlay) out; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/310.geom vulkan-1.1.73+dfsg/external/glslang/Test/310.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/310.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/310.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,152 +1,152 @@ -#version 310 es - -#ifdef GL_EXT_geometry_shader -#extension GL_EXT_geometry_shader : enable -#else -#error no GL_EXT_geometry_shader -#endif - -#ifndef GL_OES_geometry_shader -#error no GL_OES_geometry_shader -#endif - -precision mediump float; - -in fromVertex { - in vec3 color; -} fromV[]; - -in vec4 nonBlockUnsized[]; - -out toFragment { - out vec3 color; -} toF; - -out fromVertex { // okay to reuse a block name for another block name - vec3 color; -}; - -out fooB { // ERROR, cannot reuse block name as block instance - vec2 color; -} fromVertex; - -int fromVertex; // ERROR, cannot reuse a block name for something else - -out fooC { // ERROR, cannot have same name for block and instance name - vec2 color; -} fooC; - -void main() -{ - EmitVertex(); - EndPrimitive(); - EmitStreamVertex(1); // ERROR - EndStreamPrimitive(0); // ERROR - - color = fromV[0].color; - gl_ClipDistance[3] = // ERROR, no ClipDistance - gl_in[1].gl_ClipDistance[2]; // ERROR, no ClipDistance - gl_Position = gl_in[0].gl_Position; - - gl_PrimitiveID = gl_PrimitiveIDIn; - gl_Layer = 2; -} - -layout(stream = 4) out vec4 ov4; // ERROR, no streams - -layout(line_strip, points, triangle_strip, points, triangle_strip) out; // just means triangle_strip" - -out ooutb { vec4 a; } ouuaa6; - -layout(max_vertices = 200) out; -layout(max_vertices = 300) out; // ERROR, too big -void foo(layout(max_vertices = 4) int a) // ERROR -{ - ouuaa6.a = vec4(1.0); -} - -layout(line_strip, points, triangle_strip, points) out; // ERROR, changing output primitive -layout(line_strip, points) out; // ERROR, changing output primitive -layout(triangle_strip) in; // ERROR, not an input primitive -layout(triangle_strip) uniform; // ERROR -layout(triangle_strip) out vec4 badv4; // ERROR, not on a variable -layout(triangle_strip) in vec4 bad2v4[]; // ERROR, not on a variable or input -layout(invocations = 3) out outbn { int a; }; // 2 ERROR, not on a block, not until 4.0 -out outbn2 { - layout(invocations = 3) int a; // 2 ERRORs, not on a block member, not until 4.0 - layout(max_vertices = 3) int b; // ERROR, not on a block member - layout(triangle_strip) int c; // ERROR, not on a block member -} outbi; - -layout(lines) out; // ERROR, not on output -layout(lines_adjacency) in; -layout(triangles) in; // ERROR, can't change it -layout(triangles_adjacency) in; // ERROR, can't change it -layout(invocations = 4) in; - -in sameName { - int a15; -} insn[]; - -out sameName { - float f15; -}; - -uniform sameName { - bool b15; -}; - -const int summ = gl_MaxVertexAttribs + - gl_MaxGeometryInputComponents + - gl_MaxGeometryOutputComponents + - gl_MaxGeometryImageUniforms + - gl_MaxGeometryTextureImageUnits + - gl_MaxGeometryOutputVertices + - gl_MaxGeometryTotalOutputComponents + - gl_MaxGeometryUniformComponents + - gl_MaxGeometryAtomicCounters + - gl_MaxGeometryAtomicCounterBuffers + - gl_MaxVertexTextureImageUnits + - gl_MaxCombinedTextureImageUnits + - gl_MaxTextureImageUnits + - gl_MaxDrawBuffers; - -void fooe1() -{ - gl_ViewportIndex; // ERROR, not in ES - gl_MaxViewports; // ERROR, not in ES - insn.length(); // 4: lines_adjacency - int inv = gl_InvocationID; -} - -in vec4 explArray[4]; -in vec4 explArrayBad[5]; // ERROR, wrong size -in vec4 nonArrayed; // ERROR, not an array -flat out vec3 myColor1; -centroid out vec3 myColor2; -centroid in vec3 centr[]; -sample out vec4 perSampleColor; // ERROR without sample extensions - -layout(max_vertices = 200) out; // matching redecl - -layout(location = 7, component = 2) in float comp[]; // ERROR, es has no component - -void notHere() -{ - gl_MaxGeometryVaryingComponents; // ERROR, not in ES - gl_VerticesIn; // ERROR, not in ES -} - -void pointSize1() -{ - highp float ps = gl_in[3].gl_PointSize; // ERROR, need point_size extension - gl_PointSize = ps; // ERROR, need point_size extension -} - -#extension GL_OES_geometry_point_size : enable - -void pointSize2() -{ - highp float ps = gl_in[3].gl_PointSize; - gl_PointSize = ps; -} +#version 310 es + +#ifdef GL_EXT_geometry_shader +#extension GL_EXT_geometry_shader : enable +#else +#error no GL_EXT_geometry_shader +#endif + +#ifndef GL_OES_geometry_shader +#error no GL_OES_geometry_shader +#endif + +precision mediump float; + +in fromVertex { + in vec3 color; +} fromV[]; + +in vec4 nonBlockUnsized[]; + +out toFragment { + out vec3 color; +} toF; + +out fromVertex { // okay to reuse a block name for another block name + vec3 color; +}; + +out fooB { // ERROR, cannot reuse block name as block instance + vec2 color; +} fromVertex; + +int fromVertex; // ERROR, cannot reuse a block name for something else + +out fooC { // ERROR, cannot have same name for block and instance name + vec2 color; +} fooC; + +void main() +{ + EmitVertex(); + EndPrimitive(); + EmitStreamVertex(1); // ERROR + EndStreamPrimitive(0); // ERROR + + color = fromV[0].color; + gl_ClipDistance[3] = // ERROR, no ClipDistance + gl_in[1].gl_ClipDistance[2]; // ERROR, no ClipDistance + gl_Position = gl_in[0].gl_Position; + + gl_PrimitiveID = gl_PrimitiveIDIn; + gl_Layer = 2; +} + +layout(stream = 4) out vec4 ov4; // ERROR, no streams + +layout(line_strip, points, triangle_strip, points, triangle_strip) out; // just means triangle_strip" + +out ooutb { vec4 a; } ouuaa6; + +layout(max_vertices = 200) out; +layout(max_vertices = 300) out; // ERROR, too big +void foo(layout(max_vertices = 4) int a) // ERROR +{ + ouuaa6.a = vec4(1.0); +} + +layout(line_strip, points, triangle_strip, points) out; // ERROR, changing output primitive +layout(line_strip, points) out; // ERROR, changing output primitive +layout(triangle_strip) in; // ERROR, not an input primitive +layout(triangle_strip) uniform; // ERROR +layout(triangle_strip) out vec4 badv4; // ERROR, not on a variable +layout(triangle_strip) in vec4 bad2v4[]; // ERROR, not on a variable or input +layout(invocations = 3) out outbn { int a; }; // 2 ERROR, not on a block, not until 4.0 +out outbn2 { + layout(invocations = 3) int a; // 2 ERRORs, not on a block member, not until 4.0 + layout(max_vertices = 3) int b; // ERROR, not on a block member + layout(triangle_strip) int c; // ERROR, not on a block member +} outbi; + +layout(lines) out; // ERROR, not on output +layout(lines_adjacency) in; +layout(triangles) in; // ERROR, can't change it +layout(triangles_adjacency) in; // ERROR, can't change it +layout(invocations = 4) in; + +in sameName { + int a15; +} insn[]; + +out sameName { + float f15; +}; + +uniform sameName { + bool b15; +}; + +const int summ = gl_MaxVertexAttribs + + gl_MaxGeometryInputComponents + + gl_MaxGeometryOutputComponents + + gl_MaxGeometryImageUniforms + + gl_MaxGeometryTextureImageUnits + + gl_MaxGeometryOutputVertices + + gl_MaxGeometryTotalOutputComponents + + gl_MaxGeometryUniformComponents + + gl_MaxGeometryAtomicCounters + + gl_MaxGeometryAtomicCounterBuffers + + gl_MaxVertexTextureImageUnits + + gl_MaxCombinedTextureImageUnits + + gl_MaxTextureImageUnits + + gl_MaxDrawBuffers; + +void fooe1() +{ + gl_ViewportIndex; // ERROR, not in ES + gl_MaxViewports; // ERROR, not in ES + insn.length(); // 4: lines_adjacency + int inv = gl_InvocationID; +} + +in vec4 explArray[4]; +in vec4 explArrayBad[5]; // ERROR, wrong size +in vec4 nonArrayed; // ERROR, not an array +flat out vec3 myColor1; +centroid out vec3 myColor2; +centroid in vec3 centr[]; +sample out vec4 perSampleColor; // ERROR without sample extensions + +layout(max_vertices = 200) out; // matching redecl + +layout(location = 7, component = 2) in float comp[]; // ERROR, es has no component + +void notHere() +{ + gl_MaxGeometryVaryingComponents; // ERROR, not in ES + gl_VerticesIn; // ERROR, not in ES +} + +void pointSize1() +{ + highp float ps = gl_in[3].gl_PointSize; // ERROR, need point_size extension + gl_PointSize = ps; // ERROR, need point_size extension +} + +#extension GL_OES_geometry_point_size : enable + +void pointSize2() +{ + highp float ps = gl_in[3].gl_PointSize; + gl_PointSize = ps; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/310implicitSizeArrayError.vert vulkan-1.1.73+dfsg/external/glslang/Test/310implicitSizeArrayError.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/310implicitSizeArrayError.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/310implicitSizeArrayError.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,8 @@ -#version 310 es -layout (binding=0) uniform Block { - highp int a[]; -} uni; -layout (location=0) out highp int o; -void main() { - o = uni.a[2]; -} +#version 310 es +layout (binding=0) uniform Block { + highp int a[]; +} uni; +layout (location=0) out highp int o; +void main() { + o = uni.a[2]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/310runtimeArray.vert vulkan-1.1.73+dfsg/external/glslang/Test/310runtimeArray.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/310runtimeArray.vert 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/310runtimeArray.vert 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,18 @@ +#version 310 es + +precision highp float; +layout(location=0) out float o; + +struct S { float f; }; +buffer b1 { S s[]; }; +buffer b2 { S s[]; } b2name; +buffer b3 { S s[]; } b3name[]; +buffer b4 { S s[]; } b4name[4]; + +void main() +{ + o = s[5].f; + o += b2name.s[6].f; + o += b3name[3].s[7].f; + o += b4name[2].s[8].f; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/310.tesc vulkan-1.1.73+dfsg/external/glslang/Test/310.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/310.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/310.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,169 +1,169 @@ -#version 310 es - -#extension GL_OES_tessellation_shader : enable - -layout(vertices = 4) out; -out int outa[gl_out.length()]; - -layout(quads) in; // ERROR -layout(ccw) out; // ERROR -layout(fractional_even_spacing) in; // ERROR - -patch in vec4 patchIn; // ERROR -patch out vec4 patchOut; - -void main() -{ - barrier(); - - int a = gl_MaxTessControlInputComponents + - gl_MaxTessControlOutputComponents + - gl_MaxTessControlTextureImageUnits + - gl_MaxTessControlUniformComponents + - gl_MaxTessControlTotalOutputComponents; - - vec4 p = gl_in[1].gl_Position; - float ps = gl_in[1].gl_PointSize; // ERROR, need point_size extension - float cd = gl_in[1].gl_ClipDistance[2]; // ERROR, not in ES - - int pvi = gl_PatchVerticesIn; - int pid = gl_PrimitiveID; - int iid = gl_InvocationID; - - gl_out[gl_InvocationID].gl_Position = p; - gl_out[gl_InvocationID].gl_PointSize = ps; // ERROR, need point_size extension - gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; // ERROR, not in ES - - gl_TessLevelOuter[3] = 3.2; - gl_TessLevelInner[1] = 1.3; - - if (a > 10) - barrier(); // ERROR - else - barrier(); // ERROR - - barrier(); - - do { - barrier(); // ERROR - } while (a > 10); - - switch (a) { - default: - barrier(); // ERROR - break; - } - a < 12 ? a : (barrier(), a); // ERROR - { - barrier(); - } - - return; - - barrier(); // ERROR -} - -layout(vertices = 4) in; // ERROR, not on in -layout(vertices = 5) out; // ERROR, changing # - -void foo() -{ - gl_out[4].gl_Position; // ERROR, out of range - - barrier(); // ERROR, not in main -} - -in vec2 ina; // ERROR, not array -in vec2 inb[]; -in vec2 inc[18]; // ERROR, wrong size -in vec2 ind[gl_MaxPatchVertices]; -patch out float implA[]; // ERROR, not sized - -#extension GL_ARB_separate_shader_objects : enable - -layout(location = 3) in vec4 ivla[]; -layout(location = 4) in vec4 ivlb[]; -layout(location = 4) in vec4 ivlc[]; // ERROR, overlapping - -layout(location = 3) out vec4 ovla[]; -layout(location = 4) out vec4 ovlb[]; -layout(location = 4) out vec4 ovlc[]; // ERROR, overlapping - -void foop() -{ - precise float d; // ERROR without gpu_shader5 - d = fma(d, d, d); // ERROR without gpu_shader5 -} - -patch out pinbn { - int a; -} pinbi; - -centroid out vec3 myColor2[]; -centroid in vec3 centr[]; -sample out vec4 perSampleColor[]; // ERROR without sample extensions - -layout(vertices = 4) out float badlay[]; // ERROR, not on a variable -out float misSized[5]; // ERROR, size doesn't match -out float okaySize[4]; - -#extension GL_OES_tessellation_point_size : enable - -void pointSize2() -{ - float ps = gl_in[1].gl_PointSize; - gl_out[gl_InvocationID].gl_PointSize = ps; -} - -#extension GL_OES_gpu_shader5 : enable - -precise vec3 pv3; - -void goodfoop() -{ - precise float d; - - pv3 *= pv3; - pv3 = fma(pv3, pv3, pv3); - d = fma(d, d, d); -} - -void bbBad() -{ - gl_BoundingBoxOES; // ERROR without GL_OES_primitive_bounding_box -} - -#extension GL_OES_primitive_bounding_box : enable - -void bb() -{ - gl_BoundingBoxOES[0] = vec4(0.0); - gl_BoundingBoxOES[1] = vec4(1.0); - gl_BoundingBoxOES[2] = vec4(2.0); // ERROR, overflow -} - -out patch badpatchBName { // ERROR, array size required - float f; -} badpatchIName[]; - -out patch patchBName { - float f; -} patchIName[4]; - -void outputtingOutparam(out int a) -{ - a = 2; -} - -void outputting() -{ - outa[gl_InvocationID] = 2; - outa[1] = 2; // ERROR, not gl_InvocationID - gl_out[0].gl_Position = vec4(1.0); // ERROR, not gl_InvocationID - outa[1]; - gl_out[0]; - outputtingOutparam(outa[0]); // ERROR, not gl_InvocationID - outputtingOutparam(outa[gl_InvocationID]); - patchIName[1].f = 3.14; - outa[(gl_InvocationID)] = 2; -} +#version 310 es + +#extension GL_OES_tessellation_shader : enable + +layout(vertices = 4) out; +out int outa[gl_out.length()]; + +layout(quads) in; // ERROR +layout(ccw) out; // ERROR +layout(fractional_even_spacing) in; // ERROR + +patch in vec4 patchIn; // ERROR +patch out vec4 patchOut; + +void main() +{ + barrier(); + + int a = gl_MaxTessControlInputComponents + + gl_MaxTessControlOutputComponents + + gl_MaxTessControlTextureImageUnits + + gl_MaxTessControlUniformComponents + + gl_MaxTessControlTotalOutputComponents; + + vec4 p = gl_in[1].gl_Position; + float ps = gl_in[1].gl_PointSize; // ERROR, need point_size extension + float cd = gl_in[1].gl_ClipDistance[2]; // ERROR, not in ES + + int pvi = gl_PatchVerticesIn; + int pid = gl_PrimitiveID; + int iid = gl_InvocationID; + + gl_out[gl_InvocationID].gl_Position = p; + gl_out[gl_InvocationID].gl_PointSize = ps; // ERROR, need point_size extension + gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; // ERROR, not in ES + + gl_TessLevelOuter[3] = 3.2; + gl_TessLevelInner[1] = 1.3; + + if (a > 10) + barrier(); // ERROR + else + barrier(); // ERROR + + barrier(); + + do { + barrier(); // ERROR + } while (a > 10); + + switch (a) { + default: + barrier(); // ERROR + break; + } + a < 12 ? a : (barrier(), a); // ERROR + { + barrier(); + } + + return; + + barrier(); // ERROR +} + +layout(vertices = 4) in; // ERROR, not on in +layout(vertices = 5) out; // ERROR, changing # + +void foo() +{ + gl_out[4].gl_Position; // ERROR, out of range + + barrier(); // ERROR, not in main +} + +in vec2 ina; // ERROR, not array +in vec2 inb[]; +in vec2 inc[18]; // ERROR, wrong size +in vec2 ind[gl_MaxPatchVertices]; +patch out float implA[]; // ERROR, not sized + +#extension GL_ARB_separate_shader_objects : enable + +layout(location = 3) in vec4 ivla[]; +layout(location = 4) in vec4 ivlb[]; +layout(location = 4) in vec4 ivlc[]; // ERROR, overlapping + +layout(location = 3) out vec4 ovla[]; +layout(location = 4) out vec4 ovlb[]; +layout(location = 4) out vec4 ovlc[]; // ERROR, overlapping + +void foop() +{ + precise float d; // ERROR without gpu_shader5 + d = fma(d, d, d); // ERROR without gpu_shader5 +} + +patch out pinbn { + int a; +} pinbi; + +centroid out vec3 myColor2[]; +centroid in vec3 centr[]; +sample out vec4 perSampleColor[]; // ERROR without sample extensions + +layout(vertices = 4) out float badlay[]; // ERROR, not on a variable +out float misSized[5]; // ERROR, size doesn't match +out float okaySize[4]; + +#extension GL_OES_tessellation_point_size : enable + +void pointSize2() +{ + float ps = gl_in[1].gl_PointSize; + gl_out[gl_InvocationID].gl_PointSize = ps; +} + +#extension GL_OES_gpu_shader5 : enable + +precise vec3 pv3; + +void goodfoop() +{ + precise float d; + + pv3 *= pv3; + pv3 = fma(pv3, pv3, pv3); + d = fma(d, d, d); +} + +void bbBad() +{ + gl_BoundingBoxOES; // ERROR without GL_OES_primitive_bounding_box +} + +#extension GL_OES_primitive_bounding_box : enable + +void bb() +{ + gl_BoundingBoxOES[0] = vec4(0.0); + gl_BoundingBoxOES[1] = vec4(1.0); + gl_BoundingBoxOES[2] = vec4(2.0); // ERROR, overflow +} + +out patch badpatchBName { // ERROR, array size required + float f; +} badpatchIName[]; + +out patch patchBName { + float f; +} patchIName[4]; + +void outputtingOutparam(out int a) +{ + a = 2; +} + +void outputting() +{ + outa[gl_InvocationID] = 2; + outa[1] = 2; // ERROR, not gl_InvocationID + gl_out[0].gl_Position = vec4(1.0); // ERROR, not gl_InvocationID + outa[1]; + gl_out[0]; + outputtingOutparam(outa[0]); // ERROR, not gl_InvocationID + outputtingOutparam(outa[gl_InvocationID]); + patchIName[1].f = 3.14; + outa[(gl_InvocationID)] = 2; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/310.tese vulkan-1.1.73+dfsg/external/glslang/Test/310.tese --- vulkan-1.1.70+dfsg1/external/glslang/Test/310.tese 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/310.tese 2018-04-27 11:46:26.000000000 +0000 @@ -1,128 +1,128 @@ -#version 310 es - -#extension GL_EXT_tessellation_shader : enable -#extension GL_OES_tessellation_shader : enable -#extension GL_EXT_tessellation_shader : disable - -layout(vertices = 4) out; // ERROR -layout(quads, cw) in; -layout(triangles) in; // ERROR -layout(isolines) in; // ERROR - -layout(ccw) in; // ERROR -layout(cw) in; - -layout(fractional_odd_spacing) in; -layout(equal_spacing) in; // ERROR -layout(fractional_even_spacing) in; // ERROR - -layout(point_mode) in; - -patch in vec4 patchIn; -patch out vec4 patchOut; // ERROR - -void main() -{ - barrier(); // ERROR - - int a = gl_MaxTessEvaluationInputComponents + - gl_MaxTessEvaluationOutputComponents + - gl_MaxTessEvaluationTextureImageUnits + - gl_MaxTessEvaluationUniformComponents + - gl_MaxTessPatchComponents + - gl_MaxPatchVertices + - gl_MaxTessGenLevel; - - vec4 p = gl_in[1].gl_Position; - float ps = gl_in[1].gl_PointSize; // ERROR, need point_size extension - float cd = gl_in[1].gl_ClipDistance[2]; // ERROR, not in ES - - int pvi = gl_PatchVerticesIn; - int pid = gl_PrimitiveID; - vec3 tc = gl_TessCoord; - float tlo = gl_TessLevelOuter[3]; - float tli = gl_TessLevelInner[1]; - - gl_Position = p; - gl_PointSize = ps; // ERROR, need point_size extension - gl_ClipDistance[2] = cd; // ERROR, not in ES -} - -smooth patch in vec4 badp1; // ERROR -flat patch in vec4 badp2; // ERROR -noperspective patch in vec4 badp3; // ERROR -patch sample in vec3 badp4; // ERROR - -#extension GL_ARB_separate_shader_objects : enable - -in gl_PerVertex // ERROR, no size -{ - vec4 gl_Position; -} gl_in[]; - -in gl_PerVertex // ERROR, second redeclaration of gl_in -{ - vec4 gl_Position; -} gl_in[]; - -layout(quads, cw) out; // ERROR -layout(triangles) out; // ERROR -layout(isolines) out; // ERROR -layout(cw) out; // ERROR -layout(fractional_odd_spacing) out; // ERROR -layout(equal_spacing) out; // ERROR -layout(fractional_even_spacing) out; // ERROR -layout(point_mode) out; // ERROR - -in vec2 ina; // ERROR, not array -in vec2 inb[]; -in vec2 inc[18]; // ERROR, wrong size -in vec2 ind[gl_MaxPatchVertices]; - -in testbla { // ERROR, not array - int f; -} bla; - -in testblb { - int f; -} blb[]; - -in testblc { // ERROR wrong size - int f; -} blc[18]; - -in testbld { - int f; -} bld[gl_MaxPatchVertices]; - -layout(location = 23) in vec4 ivla[]; -layout(location = 24) in vec4 ivlb[]; -layout(location = 24) in vec4 ivlc[]; // ERROR, overlap - -layout(location = 23) out vec4 ovla[2]; -layout(location = 24) out vec4 ovlb[2]; // ERROR, overlap - -in float gl_TessLevelOuter[4]; // ERROR, can't redeclare - -patch in pinbn { - int a; -} pinbi; - -centroid out vec3 myColor2; -centroid in vec3 centr[]; -sample out vec4 perSampleColor; // ERROR without sample extensions - -#extension GL_OES_tessellation_point_size : enable - -void pointSize2() -{ - float ps = gl_in[1].gl_PointSize; // ERROR, not in the redeclaration, but no error on use of gl_PointSize - gl_PointSize = ps; -} - -#extension GL_EXT_primitive_bounding_box : enable - -void bbbad() -{ - gl_BoundingBoxOES; // ERROR, wrong stage -} +#version 310 es + +#extension GL_EXT_tessellation_shader : enable +#extension GL_OES_tessellation_shader : enable +#extension GL_EXT_tessellation_shader : disable + +layout(vertices = 4) out; // ERROR +layout(quads, cw) in; +layout(triangles) in; // ERROR +layout(isolines) in; // ERROR + +layout(ccw) in; // ERROR +layout(cw) in; + +layout(fractional_odd_spacing) in; +layout(equal_spacing) in; // ERROR +layout(fractional_even_spacing) in; // ERROR + +layout(point_mode) in; + +patch in vec4 patchIn; +patch out vec4 patchOut; // ERROR + +void main() +{ + barrier(); // ERROR + + int a = gl_MaxTessEvaluationInputComponents + + gl_MaxTessEvaluationOutputComponents + + gl_MaxTessEvaluationTextureImageUnits + + gl_MaxTessEvaluationUniformComponents + + gl_MaxTessPatchComponents + + gl_MaxPatchVertices + + gl_MaxTessGenLevel; + + vec4 p = gl_in[1].gl_Position; + float ps = gl_in[1].gl_PointSize; // ERROR, need point_size extension + float cd = gl_in[1].gl_ClipDistance[2]; // ERROR, not in ES + + int pvi = gl_PatchVerticesIn; + int pid = gl_PrimitiveID; + vec3 tc = gl_TessCoord; + float tlo = gl_TessLevelOuter[3]; + float tli = gl_TessLevelInner[1]; + + gl_Position = p; + gl_PointSize = ps; // ERROR, need point_size extension + gl_ClipDistance[2] = cd; // ERROR, not in ES +} + +smooth patch in vec4 badp1; // ERROR +flat patch in vec4 badp2; // ERROR +noperspective patch in vec4 badp3; // ERROR +patch sample in vec3 badp4; // ERROR + +#extension GL_ARB_separate_shader_objects : enable + +in gl_PerVertex // ERROR, no size +{ + vec4 gl_Position; +} gl_in[]; + +in gl_PerVertex // ERROR, second redeclaration of gl_in +{ + vec4 gl_Position; +} gl_in[]; + +layout(quads, cw) out; // ERROR +layout(triangles) out; // ERROR +layout(isolines) out; // ERROR +layout(cw) out; // ERROR +layout(fractional_odd_spacing) out; // ERROR +layout(equal_spacing) out; // ERROR +layout(fractional_even_spacing) out; // ERROR +layout(point_mode) out; // ERROR + +in vec2 ina; // ERROR, not array +in vec2 inb[]; +in vec2 inc[18]; // ERROR, wrong size +in vec2 ind[gl_MaxPatchVertices]; + +in testbla { // ERROR, not array + int f; +} bla; + +in testblb { + int f; +} blb[]; + +in testblc { // ERROR wrong size + int f; +} blc[18]; + +in testbld { + int f; +} bld[gl_MaxPatchVertices]; + +layout(location = 23) in vec4 ivla[]; +layout(location = 24) in vec4 ivlb[]; +layout(location = 24) in vec4 ivlc[]; // ERROR, overlap + +layout(location = 23) out vec4 ovla[2]; +layout(location = 24) out vec4 ovlb[2]; // ERROR, overlap + +in float gl_TessLevelOuter[4]; // ERROR, can't redeclare + +patch in pinbn { + int a; +} pinbi; + +centroid out vec3 myColor2; +centroid in vec3 centr[]; +sample out vec4 perSampleColor; // ERROR without sample extensions + +#extension GL_OES_tessellation_point_size : enable + +void pointSize2() +{ + float ps = gl_in[1].gl_PointSize; // ERROR, not in the redeclaration, but no error on use of gl_PointSize + gl_PointSize = ps; +} + +#extension GL_EXT_primitive_bounding_box : enable + +void bbbad() +{ + gl_BoundingBoxOES; // ERROR, wrong stage +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/310.vert vulkan-1.1.73+dfsg/external/glslang/Test/310.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/310.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/310.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,372 +1,372 @@ -#version 310 es - -shared vec4 s; // ERROR -layout(local_size_x = 2) out; // ERROR -buffer vec4 v; // ERROR -in int ini; -layout(location = 2) uniform mat4 x; -layout(location = 3) uniform mat4 y; -layout(location = 2) out mat4 xi; -layout(location = 3) out mat4 yi; // ERROR, locations conflict with xi - -void main() -{ - uvec2 u2; - u2 = uaddCarry(u2, u2, u2); - uint u1; - u1 = usubBorrow(u1, u1, u1); - uvec4 u4; - umulExtended(u4, u4, u4, u4); - ivec4 i4; - imulExtended(i4, i4, i4, i4); - int i1; - i1 = bitfieldExtract(i1, 4, 5); - uvec3 u3; - u3 = bitfieldExtract(u3, 4, 5); - ivec3 i3; - i3 = bitfieldInsert(i3, i3, 4, 5); - u1 = bitfieldInsert(u1, u1, 4, 5); - ivec2 i2; - i2 = bitfieldReverse(i2); - u4 = bitfieldReverse(u4); - i1 = bitCount(i1); - i3 = bitCount(u3); - i2 = findLSB(i2); - i4 = findLSB(u4); - i1 = findMSB(i1); - i2 = findMSB(u2); - - vec3 v3; - v3 = frexp(v3, i3); - vec2 v2; - v2 = ldexp(v2, i2); - - mediump vec4 v4; - u1 = packUnorm4x8(v4); - u1 = packSnorm4x8(v4); - v4 = unpackUnorm4x8(u1); - v4 = unpackSnorm4x8(u1); -} - -precision highp sampler2DMS; -precision highp isampler2DMS; -precision highp usampler2DMS; - -uniform sampler2DMS s2dms; -uniform isampler2DMS is2dms; -uniform usampler2DMS us2dms; -uniform usampler2DMSArray us2dmsa; // ERROR - -void foo() -{ - ivec2 v2; - v2 = textureSize(s2dms); - v2 = textureSize(us2dms); - vec4 v4 = texelFetch(s2dms, v2, 2); - ivec4 iv4 = texelFetch(is2dms, v2, 2); - textureSamples(s2dms); // ERROR - float f; - frexp(f, ini); // ERROR, i not writable -} - -out bool outb; // ERROR -out sampler2D outo; // ERROR -out float outa[4]; -out float outaa[4][2]; // ERROR -struct S { float f; }; -out S outs; -out S[4] outasa; // ERROR -out S outsa[4]; // ERROR -struct SA { float f[4]; }; -out SA outSA; // ERROR -struct SS { float f; S s; }; -out SS outSS; // ERROR - -layout(std430) uniform U430 { int a; } U430i; // ERROR -layout(std430) buffer B430 { int a; } B430i; - -#ifndef GL_OES_shader_io_blocks -#error GL_OES_shader_io_blocks not defined -#endif - -#extension GL_OES_shader_io_blocks : enable - -out outbname { - int a; - out vec4 v; - highp sampler2D s; // ERROR, opaque type -} outbinst; - -out outbname2 { - layout(location = 12) int aAnon; - layout(location = 13) vec4 vAnon; -}; - -layout(location = 12) out highp int aliased; // ERROR, aliasing location - -in inbname { int a; } inbinst; // ERROR, no in block in vertex shader - -out gl_PerVertex { // ERROR, has extra member - highp vec4 gl_Position; - highp vec4 t; -}; - -void foo_IO() -{ - int sum = gl_VertexID + - gl_InstanceID; - gl_Position = vec4(1.0); - gl_PointSize = 2.0; // ERROR, removed by redeclaration -} - -out gl_PerVertex { // ERROR, already used and already redeclared - highp vec4 gl_Position; - highp vec4 t; -}; - -smooth out smo { // ERROR, no smooth on a block - int i; -} smon; - -flat out fmo { // ERROR, no flat on a block - int i; -} fmon; - -centroid out cmo { // ERROR, no centroid on a block - int i; -} cmon; - -invariant out imo { // ERROR, no invariant on a block - int i; -} imon; - -in vec2 inf, ing; -uniform ivec2 offsets[4]; -uniform sampler2D sArray[4]; -uniform int sIndex; -layout(binding = 0) uniform atomic_uint auArray[2]; -uniform ubName { int i; } ubInst[4]; -buffer bbName { int i; } bbInst[4]; -highp uniform writeonly image2D iArray[5]; -const ivec2 constOffsets[4] = ivec2[4](ivec2(0.1), ivec2(0.2), ivec2(0.3), ivec2(0.4)); - -void pfooBad() -{ - precise vec2 h; // ERROR reserved - h = fma(inf, ing, h); // ERROR, not available - sArray[sIndex + 1]; // ERRRO, not supported - auArray[sIndex + 1]; - ubInst[1]; - bbInst[2]; - ubInst[sIndex + 1]; // ERROR, not supported - bbInst[sIndex]; // ERROR, not supported - iArray[2]; - iArray[sIndex * 2]; // ERROR, not supported - textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf)); // ERROR, offset not constant - textureGatherOffsets(sArray[0], vec2(0.1), constOffsets); // ERROR, not available -} - -#extension GL_OES_gpu_shader5 : enable - -void pfoo() -{ - precise vec2 h; - h = fma(inf, ing, h); - sArray[sIndex + 1]; - ubInst[sIndex + 1]; - bbInst[sIndex - 2]; // ERROR, still not supported - iArray[2]; - iArray[sIndex - 2]; - textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf)); - textureGatherOffsets(sArray[0], vec2(0.1), constOffsets); - textureGatherOffsets(sArray[0], vec2(0.1), offsets); // ERROR, offset not constant -} - -uniform samplerBuffer badSamp1; // ERROR, reserved -uniform isamplerBuffer badSamp2; // ERROR, reserved -uniform usamplerBuffer badSamp3; // ERROR, reserved -uniform writeonly imageBuffer badSamp4; // ERROR, reserved -uniform writeonly iimageBuffer badSamp5; // ERROR, reserved -uniform writeonly uimageBuffer badSamp6; // ERROR, reserved - -#extension GL_OES_texture_buffer : enable -#extension GL_EXT_texture_buffer : enable - -uniform samplerBuffer noPreSamp1; // ERROR, no default precision -uniform isamplerBuffer noPreSamp2; // ERROR, no default precision -uniform usamplerBuffer noPreSamp3; // ERROR, no default precision -uniform writeonly imageBuffer noPreSamp4; // ERROR, no default precision -uniform writeonly iimageBuffer noPreSamp5; // ERROR, no default precision -uniform writeonly uimageBuffer noPreSamp6; // ERROR, no default precision - -precision highp samplerBuffer; -precision highp isamplerBuffer; -precision highp usamplerBuffer; -precision highp imageBuffer; -precision highp iimageBuffer; -precision highp uimageBuffer; - -#ifdef GL_OES_texture_buffer -uniform samplerBuffer bufSamp1; -uniform isamplerBuffer bufSamp2; -uniform usamplerBuffer bufSamp3; -#endif -#ifdef GL_EXT_texture_buffer -uniform writeonly imageBuffer bufSamp4; -uniform writeonly iimageBuffer bufSamp5; -uniform writeonly uimageBuffer bufSamp6; -#endif - -void bufferT() -{ - highp int s1 = textureSize(bufSamp1); - highp int s2 = textureSize(bufSamp2); - highp int s3 = textureSize(bufSamp3); - - highp int s4 = imageSize(bufSamp4); - highp int s5 = imageSize(bufSamp5); - highp int s6 = imageSize(bufSamp6); - - highp vec4 f1 = texelFetch(bufSamp1, s1); - highp ivec4 f2 = texelFetch(bufSamp2, s2); - highp uvec4 f3 = texelFetch(bufSamp3, s3); -} - -uniform writeonly imageCubeArray badCA1; // ERROR, reserved -uniform writeonly iimageCubeArray badCA2; // ERROR, reserved -uniform writeonly uimageCubeArray badCA3; // ERROR, reserved - -uniform samplerCubeArray badCA4; // ERROR, reserved -uniform samplerCubeArrayShadow badCA5; // ERROR, reserved -uniform isamplerCubeArray badCA6; // ERROR, reserved -uniform usamplerCubeArray badCA7; // ERROR, reserved - -#extension GL_OES_texture_cube_map_array : enable - -uniform writeonly imageCubeArray noPreCA1; // ERROR, no default precision -uniform writeonly iimageCubeArray noPreCA2; // ERROR, no default precision -uniform writeonly uimageCubeArray noPreCA3; // ERROR, no default precision - -uniform samplerCubeArray noPreCA4; // ERROR, no default precision -uniform samplerCubeArrayShadow noPreCA5; // ERROR, no default precision -uniform isamplerCubeArray noPreCA6; // ERROR, no default precision -uniform usamplerCubeArray noPreCA7; // ERROR, no default precision - -precision highp imageCubeArray ; -precision highp iimageCubeArray ; -precision highp uimageCubeArray ; - -precision highp samplerCubeArray ; -precision highp samplerCubeArrayShadow; -precision highp isamplerCubeArray ; -precision highp usamplerCubeArray ; - -uniform writeonly imageCubeArray CA1; -uniform writeonly iimageCubeArray CA2; -uniform writeonly uimageCubeArray CA3; - -layout(rgba16f) uniform readonly imageCubeArray rCA1; -layout(rgba32i) uniform readonly iimageCubeArray rCA2; -layout(r32ui) uniform readonly uimageCubeArray rCA3; - -#ifdef GL_OES_texture_cube_map_array -uniform samplerCubeArray CA4; -uniform samplerCubeArrayShadow CA5; -uniform isamplerCubeArray CA6; -uniform usamplerCubeArray CA7; -#endif - -void CAT() -{ - highp ivec3 s4 = textureSize(CA4, 1); - highp ivec3 s5 = textureSize(CA5, 1); - highp ivec3 s6 = textureSize(CA6, 1); - highp ivec3 s7 = textureSize(CA7, 1); - - highp vec4 t4 = texture(CA4, vec4(0.5)); - highp float t5 = texture(CA5, vec4(0.5), 3.0); - highp ivec4 t6 = texture(CA6, vec4(0.5)); - highp uvec4 t7 = texture(CA7, vec4(0.5)); - - highp vec4 L4 = textureLod(CA4, vec4(0.5), 0.24); - highp ivec4 L6 = textureLod(CA6, vec4(0.5), 0.26); - highp uvec4 L7 = textureLod(CA7, vec4(0.5), 0.27); - - highp vec4 g4 = textureGrad(CA4, vec4(0.5), vec3(0.1), vec3(0.2)); - highp ivec4 g6 = textureGrad(CA6, vec4(0.5), vec3(0.1), vec3(0.2)); - highp uvec4 g7 = textureGrad(CA7, vec4(0.5), vec3(0.1), vec3(0.2)); - - highp vec4 gath4 = textureGather(CA4, vec4(0.5)); - highp vec4 gathC4 = textureGather(CA4, vec4(0.5), 2); - highp ivec4 gath6 = textureGather(CA6, vec4(0.5)); - highp ivec4 gathC6 = textureGather(CA6, vec4(0.5), 1); - highp uvec4 gath7 = textureGather(CA7, vec4(0.5)); - highp uvec4 gathC7 = textureGather(CA7, vec4(0.5), 0); - - highp vec4 gath5 = textureGather(CA5, vec4(0.5), 2.5); - - highp ivec3 s1 = imageSize(CA1); - highp ivec3 s2 = imageSize(CA2); - highp ivec3 s3 = imageSize(CA3); - - imageStore(CA1, s3, vec4(1)); - imageStore(CA2, s3, ivec4(1)); - imageStore(CA3, s3, uvec4(1)); - - highp vec4 cl1 = imageLoad(rCA1, s3); - highp ivec4 cl2 = imageLoad(rCA2, s3); - highp uvec4 cl3 = imageLoad(rCA3, s3); -} - -uniform sampler2DMSArray bad2DMS; // ERROR, reserved -uniform isampler2DMSArray bad2DMSi; // ERROR, reserved -uniform usampler2DMSArray bad2DMSu; // ERROR, reserved - -#extension GL_OES_texture_storage_multisample_2d_array : enable - -#ifdef GL_OES_texture_storage_multisample_2d_array - -uniform sampler2DMSArray noPrec2DMS; // ERROR, no default -uniform isampler2DMSArray noPrec2DMSi; // ERROR, no default -uniform usampler2DMSArray noPrec2DMSu; // ERROR, no default - -#endif - -precision highp sampler2DMSArray; -precision highp isampler2DMSArray; -precision highp usampler2DMSArray; - -uniform sampler2DMSArray samp2DMSA; -uniform isampler2DMSArray samp2DMSAi; -uniform usampler2DMSArray samp2DMSAu; - -void MSA() -{ - vec4 tf = texelFetch(samp2DMSA, ivec3(5), 2); - ivec4 tfi = texelFetch(samp2DMSAi, ivec3(5), 2); - uvec4 tfu = texelFetch(samp2DMSAu, ivec3(5), 2); - - ivec3 tfs = textureSize(samp2DMSA); - ivec3 tfsi = textureSize(samp2DMSAi); - ivec3 tfsb = textureSize(samp2DMSAi, 4); // ERROR, no lod - ivec3 tfsu = textureSize(samp2DMSAu); -} - -#ifdef GL_OES_shader_image_atomic -#extension GL_OES_shader_image_atomic : enable -#endif - -uniform layout(r32f) highp image2D im2Df; -uniform layout(r32ui) highp uimage2D im2Du; -uniform layout(r32i) highp iimage2D im2Di; -uniform ivec2 P; - -void goodImageAtom() -{ - float datf; - int dati; - uint datu; - +#version 310 es + +shared vec4 s; // ERROR +layout(local_size_x = 2) out; // ERROR +buffer vec4 v; // ERROR +in int ini; +layout(location = 2) uniform mat4 x; +layout(location = 3) uniform mat4 y; +layout(location = 2) out mat4 xi; +layout(location = 3) out mat4 yi; // ERROR, locations conflict with xi + +void main() +{ + uvec2 u2; + u2 = uaddCarry(u2, u2, u2); + uint u1; + u1 = usubBorrow(u1, u1, u1); + uvec4 u4; + umulExtended(u4, u4, u4, u4); + ivec4 i4; + imulExtended(i4, i4, i4, i4); + int i1; + i1 = bitfieldExtract(i1, 4, 5); + uvec3 u3; + u3 = bitfieldExtract(u3, 4, 5); + ivec3 i3; + i3 = bitfieldInsert(i3, i3, 4, 5); + u1 = bitfieldInsert(u1, u1, 4, 5); + ivec2 i2; + i2 = bitfieldReverse(i2); + u4 = bitfieldReverse(u4); + i1 = bitCount(i1); + i3 = bitCount(u3); + i2 = findLSB(i2); + i4 = findLSB(u4); + i1 = findMSB(i1); + i2 = findMSB(u2); + + vec3 v3; + v3 = frexp(v3, i3); + vec2 v2; + v2 = ldexp(v2, i2); + + mediump vec4 v4; + u1 = packUnorm4x8(v4); + u1 = packSnorm4x8(v4); + v4 = unpackUnorm4x8(u1); + v4 = unpackSnorm4x8(u1); +} + +precision highp sampler2DMS; +precision highp isampler2DMS; +precision highp usampler2DMS; + +uniform sampler2DMS s2dms; +uniform isampler2DMS is2dms; +uniform usampler2DMS us2dms; +uniform usampler2DMSArray us2dmsa; // ERROR + +void foo() +{ + ivec2 v2; + v2 = textureSize(s2dms); + v2 = textureSize(us2dms); + vec4 v4 = texelFetch(s2dms, v2, 2); + ivec4 iv4 = texelFetch(is2dms, v2, 2); + textureSamples(s2dms); // ERROR + float f; + frexp(f, ini); // ERROR, i not writable +} + +out bool outb; // ERROR +out sampler2D outo; // ERROR +out float outa[4]; +out float outaa[4][2]; // ERROR +struct S { float f; }; +out S outs; +out S[4] outasa; // ERROR +out S outsa[4]; // ERROR +struct SA { float f[4]; }; +out SA outSA; // ERROR +struct SS { float f; S s; }; +out SS outSS; // ERROR + +layout(std430) uniform U430 { int a; } U430i; // ERROR +layout(std430) buffer B430 { int a; } B430i; + +#ifndef GL_OES_shader_io_blocks +#error GL_OES_shader_io_blocks not defined +#endif + +#extension GL_OES_shader_io_blocks : enable + +out outbname { + int a; + out vec4 v; + highp sampler2D s; // ERROR, opaque type +} outbinst; + +out outbname2 { + layout(location = 12) int aAnon; + layout(location = 13) vec4 vAnon; +}; + +layout(location = 12) out highp int aliased; // ERROR, aliasing location + +in inbname { int a; } inbinst; // ERROR, no in block in vertex shader + +out gl_PerVertex { // ERROR, has extra member + highp vec4 gl_Position; + highp vec4 t; +}; + +void foo_IO() +{ + int sum = gl_VertexID + + gl_InstanceID; + gl_Position = vec4(1.0); + gl_PointSize = 2.0; // ERROR, removed by redeclaration +} + +out gl_PerVertex { // ERROR, already used and already redeclared + highp vec4 gl_Position; + highp vec4 t; +}; + +smooth out smo { // ERROR, no smooth on a block + int i; +} smon; + +flat out fmo { // ERROR, no flat on a block + int i; +} fmon; + +centroid out cmo { // ERROR, no centroid on a block + int i; +} cmon; + +invariant out imo { // ERROR, no invariant on a block + int i; +} imon; + +in vec2 inf, ing; +uniform ivec2 offsets[4]; +uniform sampler2D sArray[4]; +uniform int sIndex; +layout(binding = 0) uniform atomic_uint auArray[2]; +uniform ubName { int i; } ubInst[4]; +buffer bbName { int i; } bbInst[4]; +highp uniform writeonly image2D iArray[5]; +const ivec2 constOffsets[4] = ivec2[4](ivec2(0.1), ivec2(0.2), ivec2(0.3), ivec2(0.4)); + +void pfooBad() +{ + precise vec2 h; // ERROR reserved + h = fma(inf, ing, h); // ERROR, not available + sArray[sIndex + 1]; // ERRRO, not supported + auArray[sIndex + 1]; + ubInst[1]; + bbInst[2]; + ubInst[sIndex + 1]; // ERROR, not supported + bbInst[sIndex]; // ERROR, not supported + iArray[2]; + iArray[sIndex * 2]; // ERROR, not supported + textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf)); // ERROR, offset not constant + textureGatherOffsets(sArray[0], vec2(0.1), constOffsets); // ERROR, not available +} + +#extension GL_OES_gpu_shader5 : enable + +void pfoo() +{ + precise vec2 h; + h = fma(inf, ing, h); + sArray[sIndex + 1]; + ubInst[sIndex + 1]; + bbInst[sIndex - 2]; // ERROR, still not supported + iArray[2]; + iArray[sIndex - 2]; + textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf)); + textureGatherOffsets(sArray[0], vec2(0.1), constOffsets); + textureGatherOffsets(sArray[0], vec2(0.1), offsets); // ERROR, offset not constant +} + +uniform samplerBuffer badSamp1; // ERROR, reserved +uniform isamplerBuffer badSamp2; // ERROR, reserved +uniform usamplerBuffer badSamp3; // ERROR, reserved +uniform writeonly imageBuffer badSamp4; // ERROR, reserved +uniform writeonly iimageBuffer badSamp5; // ERROR, reserved +uniform writeonly uimageBuffer badSamp6; // ERROR, reserved + +#extension GL_OES_texture_buffer : enable +#extension GL_EXT_texture_buffer : enable + +uniform samplerBuffer noPreSamp1; // ERROR, no default precision +uniform isamplerBuffer noPreSamp2; // ERROR, no default precision +uniform usamplerBuffer noPreSamp3; // ERROR, no default precision +uniform writeonly imageBuffer noPreSamp4; // ERROR, no default precision +uniform writeonly iimageBuffer noPreSamp5; // ERROR, no default precision +uniform writeonly uimageBuffer noPreSamp6; // ERROR, no default precision + +precision highp samplerBuffer; +precision highp isamplerBuffer; +precision highp usamplerBuffer; +precision highp imageBuffer; +precision highp iimageBuffer; +precision highp uimageBuffer; + +#ifdef GL_OES_texture_buffer +uniform samplerBuffer bufSamp1; +uniform isamplerBuffer bufSamp2; +uniform usamplerBuffer bufSamp3; +#endif +#ifdef GL_EXT_texture_buffer +uniform writeonly imageBuffer bufSamp4; +uniform writeonly iimageBuffer bufSamp5; +uniform writeonly uimageBuffer bufSamp6; +#endif + +void bufferT() +{ + highp int s1 = textureSize(bufSamp1); + highp int s2 = textureSize(bufSamp2); + highp int s3 = textureSize(bufSamp3); + + highp int s4 = imageSize(bufSamp4); + highp int s5 = imageSize(bufSamp5); + highp int s6 = imageSize(bufSamp6); + + highp vec4 f1 = texelFetch(bufSamp1, s1); + highp ivec4 f2 = texelFetch(bufSamp2, s2); + highp uvec4 f3 = texelFetch(bufSamp3, s3); +} + +uniform writeonly imageCubeArray badCA1; // ERROR, reserved +uniform writeonly iimageCubeArray badCA2; // ERROR, reserved +uniform writeonly uimageCubeArray badCA3; // ERROR, reserved + +uniform samplerCubeArray badCA4; // ERROR, reserved +uniform samplerCubeArrayShadow badCA5; // ERROR, reserved +uniform isamplerCubeArray badCA6; // ERROR, reserved +uniform usamplerCubeArray badCA7; // ERROR, reserved + +#extension GL_OES_texture_cube_map_array : enable + +uniform writeonly imageCubeArray noPreCA1; // ERROR, no default precision +uniform writeonly iimageCubeArray noPreCA2; // ERROR, no default precision +uniform writeonly uimageCubeArray noPreCA3; // ERROR, no default precision + +uniform samplerCubeArray noPreCA4; // ERROR, no default precision +uniform samplerCubeArrayShadow noPreCA5; // ERROR, no default precision +uniform isamplerCubeArray noPreCA6; // ERROR, no default precision +uniform usamplerCubeArray noPreCA7; // ERROR, no default precision + +precision highp imageCubeArray ; +precision highp iimageCubeArray ; +precision highp uimageCubeArray ; + +precision highp samplerCubeArray ; +precision highp samplerCubeArrayShadow; +precision highp isamplerCubeArray ; +precision highp usamplerCubeArray ; + +uniform writeonly imageCubeArray CA1; +uniform writeonly iimageCubeArray CA2; +uniform writeonly uimageCubeArray CA3; + +layout(rgba16f) uniform readonly imageCubeArray rCA1; +layout(rgba32i) uniform readonly iimageCubeArray rCA2; +layout(r32ui) uniform readonly uimageCubeArray rCA3; + +#ifdef GL_OES_texture_cube_map_array +uniform samplerCubeArray CA4; +uniform samplerCubeArrayShadow CA5; +uniform isamplerCubeArray CA6; +uniform usamplerCubeArray CA7; +#endif + +void CAT() +{ + highp ivec3 s4 = textureSize(CA4, 1); + highp ivec3 s5 = textureSize(CA5, 1); + highp ivec3 s6 = textureSize(CA6, 1); + highp ivec3 s7 = textureSize(CA7, 1); + + highp vec4 t4 = texture(CA4, vec4(0.5)); + highp float t5 = texture(CA5, vec4(0.5), 3.0); + highp ivec4 t6 = texture(CA6, vec4(0.5)); + highp uvec4 t7 = texture(CA7, vec4(0.5)); + + highp vec4 L4 = textureLod(CA4, vec4(0.5), 0.24); + highp ivec4 L6 = textureLod(CA6, vec4(0.5), 0.26); + highp uvec4 L7 = textureLod(CA7, vec4(0.5), 0.27); + + highp vec4 g4 = textureGrad(CA4, vec4(0.5), vec3(0.1), vec3(0.2)); + highp ivec4 g6 = textureGrad(CA6, vec4(0.5), vec3(0.1), vec3(0.2)); + highp uvec4 g7 = textureGrad(CA7, vec4(0.5), vec3(0.1), vec3(0.2)); + + highp vec4 gath4 = textureGather(CA4, vec4(0.5)); + highp vec4 gathC4 = textureGather(CA4, vec4(0.5), 2); + highp ivec4 gath6 = textureGather(CA6, vec4(0.5)); + highp ivec4 gathC6 = textureGather(CA6, vec4(0.5), 1); + highp uvec4 gath7 = textureGather(CA7, vec4(0.5)); + highp uvec4 gathC7 = textureGather(CA7, vec4(0.5), 0); + + highp vec4 gath5 = textureGather(CA5, vec4(0.5), 2.5); + + highp ivec3 s1 = imageSize(CA1); + highp ivec3 s2 = imageSize(CA2); + highp ivec3 s3 = imageSize(CA3); + + imageStore(CA1, s3, vec4(1)); + imageStore(CA2, s3, ivec4(1)); + imageStore(CA3, s3, uvec4(1)); + + highp vec4 cl1 = imageLoad(rCA1, s3); + highp ivec4 cl2 = imageLoad(rCA2, s3); + highp uvec4 cl3 = imageLoad(rCA3, s3); +} + +uniform sampler2DMSArray bad2DMS; // ERROR, reserved +uniform isampler2DMSArray bad2DMSi; // ERROR, reserved +uniform usampler2DMSArray bad2DMSu; // ERROR, reserved + +#extension GL_OES_texture_storage_multisample_2d_array : enable + +#ifdef GL_OES_texture_storage_multisample_2d_array + +uniform sampler2DMSArray noPrec2DMS; // ERROR, no default +uniform isampler2DMSArray noPrec2DMSi; // ERROR, no default +uniform usampler2DMSArray noPrec2DMSu; // ERROR, no default + +#endif + +precision highp sampler2DMSArray; +precision highp isampler2DMSArray; +precision highp usampler2DMSArray; + +uniform sampler2DMSArray samp2DMSA; +uniform isampler2DMSArray samp2DMSAi; +uniform usampler2DMSArray samp2DMSAu; + +void MSA() +{ + vec4 tf = texelFetch(samp2DMSA, ivec3(5), 2); + ivec4 tfi = texelFetch(samp2DMSAi, ivec3(5), 2); + uvec4 tfu = texelFetch(samp2DMSAu, ivec3(5), 2); + + ivec3 tfs = textureSize(samp2DMSA); + ivec3 tfsi = textureSize(samp2DMSAi); + ivec3 tfsb = textureSize(samp2DMSAi, 4); // ERROR, no lod + ivec3 tfsu = textureSize(samp2DMSAu); +} + +#ifdef GL_OES_shader_image_atomic +#extension GL_OES_shader_image_atomic : enable +#endif + +uniform layout(r32f) highp image2D im2Df; +uniform layout(r32ui) highp uimage2D im2Du; +uniform layout(r32i) highp iimage2D im2Di; +uniform ivec2 P; + +void goodImageAtom() +{ + float datf; + int dati; + uint datu; + imageAtomicAdd( im2Di, P, dati); imageAtomicAdd( im2Du, P, datu); imageAtomicMin( im2Di, P, dati); @@ -382,22 +382,22 @@ imageAtomicExchange(im2Di, P, dati); imageAtomicExchange(im2Du, P, datu); imageAtomicExchange(im2Df, P, datf); - imageAtomicCompSwap(im2Di, P, 3, dati); - imageAtomicCompSwap(im2Du, P, 5u, datu); -} - -sample out vec4 colorSampInBad; // ERROR, reserved - -#extension GL_OES_shader_multisample_interpolation : enable - -sample out vec4 colorSample; -flat sample out vec4 colorfsi; -sample out vec3 sampInArray[4]; -in vec4 inv4; - -void badInterp() -{ - interpolateAtCentroid(inv4); // ERROR, wrong stage - interpolateAtSample(inv4, 1); // ERROR, need extension - interpolateAtOffset(inv4, vec2(0.2)); // ERROR, need extension -} + imageAtomicCompSwap(im2Di, P, 3, dati); + imageAtomicCompSwap(im2Du, P, 5u, datu); +} + +sample out vec4 colorSampInBad; // ERROR, reserved + +#extension GL_OES_shader_multisample_interpolation : enable + +sample out vec4 colorSample; +flat sample out vec4 colorfsi; +sample out vec3 sampInArray[4]; +in vec4 inv4; + +void badInterp() +{ + interpolateAtCentroid(inv4); // ERROR, wrong stage + interpolateAtSample(inv4, 1); // ERROR, need extension + interpolateAtOffset(inv4, vec2(0.2)); // ERROR, need extension +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/320.comp vulkan-1.1.73+dfsg/external/glslang/Test/320.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/320.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/320.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,5 +1,5 @@ -#version 320 es - +#version 320 es + void main() { } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/320.frag vulkan-1.1.73+dfsg/external/glslang/Test/320.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/320.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/320.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,136 +1,136 @@ -#version 320 es - -out outbname { int a; } outbinst; // ERROR, not out block in fragment shader - -in inbname { - int a; - vec4 v; - struct { int b; } s; // ERROR, nested struct definition -} inbinst; - -in inbname2 { - layout(location = 12) int aAnon; - layout(location = 13) centroid in vec4 vAnon; -}; - -in layout(location = 13) vec4 aliased; // ERROR, aliased - -in inbname2 { // ERROR, reuse of block name - int aAnon; - centroid in vec4 vAnon; -}; - -in badmember { // ERROR, aAnon already in global scope - int aAnon; -}; - -int inbname; // ERROR, redefinition of block name - -vec4 vAnon; // ERROR, anon in global scope; redefinition - -in arrayed { - float f; -} arrayedInst[4]; -uniform int i; -void fooIO() -{ - vec4 v = inbinst.v + vAnon; - v *= arrayedInst[2].f; - v *= arrayedInst[i].f; -} - -in vec4 gl_FragCoord; -layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; // ERROR, non-ES - -layout(early_fragment_tests) in; -out float gl_FragDepth; -layout(depth_any) out float gl_FragDepth; // ERROR, non-ES - -void main() -{ - gl_FragDepth = 0.2; // ERROR, early_fragment_tests declared - bool f = gl_FrontFacing; -} - -out float gl_FragDepth; - -void foo_GS() -{ - highp int l = gl_Layer; - highp int p = gl_PrimitiveID; -} - -in vec2 inf, ing; -uniform ivec2 offsets[4]; -uniform sampler2D sArray[4]; -uniform int sIndex; -layout(binding = 0) uniform atomic_uint auArray[2]; -uniform ubName { int i; } ubInst[4]; -buffer bbName { int i; } bbInst[4]; -highp uniform writeonly image2D iArray[5]; -const ivec2 constOffsets[4] = ivec2[4](ivec2(0.1), ivec2(0.2), ivec2(0.3), ivec2(0.4)); - -void pfoo() -{ - precise vec2 h; - h = fma(inf, ing, h); - textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf)); - textureGatherOffsets(sArray[0], vec2(0.1), constOffsets); - textureGatherOffsets(sArray[0], vec2(0.1), offsets); // ERROR, offset not constant -} - -precision highp imageCubeArray ; -precision highp iimageCubeArray ; -precision highp uimageCubeArray ; - -precision highp samplerCubeArray ; -precision highp samplerCubeArrayShadow; -precision highp isamplerCubeArray ; -precision highp usamplerCubeArray ; - -uniform writeonly imageCubeArray CA1; -uniform writeonly iimageCubeArray CA2; -uniform writeonly uimageCubeArray CA3; - -#ifdef GL_EXT_texture_cube_map_array -uniform samplerCubeArray CA4; -uniform samplerCubeArrayShadow CA5; -uniform isamplerCubeArray CA6; -uniform usamplerCubeArray CA7; -#endif - -void CAT() -{ - highp vec4 b4 = texture(CA4, vec4(0.5), 0.24); - highp ivec4 b6 = texture(CA6, vec4(0.5), 0.26); - highp uvec4 b7 = texture(CA7, vec4(0.5), 0.27); -} - -void goodSample() -{ - lowp int a1 = gl_SampleID; - mediump vec2 a2 = gl_SamplePosition; - highp int a3 = gl_SampleMaskIn[0]; - gl_SampleMask[0] = a3; - mediump int n1 = gl_MaxSamples; - mediump int n2 = gl_NumSamples; -} - -uniform layout(r32f) highp image2D im2Df; -uniform layout(r32ui) highp uimage2D im2Du; -uniform layout(r32i) highp iimage2D im2Di; -uniform ivec2 P; - -uniform layout(rgba32f) highp image2D badIm2Df; // ERROR, needs readonly or writeonly -uniform layout(rgba8ui) highp uimage2D badIm2Du; // ERROR, needs readonly or writeonly -uniform layout(rgba16i) highp iimage2D badIm2Di; // ERROR, needs readonly or writeonly - -void goodImageAtom() -{ - float datf; - int dati; - uint datu; - +#version 320 es + +out outbname { int a; } outbinst; // ERROR, not out block in fragment shader + +in inbname { + int a; + vec4 v; + struct { int b; } s; // ERROR, nested struct definition +} inbinst; + +in inbname2 { + layout(location = 12) int aAnon; + layout(location = 13) centroid in vec4 vAnon; +}; + +in layout(location = 13) vec4 aliased; // ERROR, aliased + +in inbname2 { // ERROR, reuse of block name + int aAnon; + centroid in vec4 vAnon; +}; + +in badmember { // ERROR, aAnon already in global scope + int aAnon; +}; + +int inbname; // ERROR, redefinition of block name + +vec4 vAnon; // ERROR, anon in global scope; redefinition + +in arrayed { + float f; +} arrayedInst[4]; +uniform int i; +void fooIO() +{ + vec4 v = inbinst.v + vAnon; + v *= arrayedInst[2].f; + v *= arrayedInst[i].f; +} + +in vec4 gl_FragCoord; +layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; // ERROR, non-ES + +layout(early_fragment_tests) in; +out float gl_FragDepth; +layout(depth_any) out float gl_FragDepth; // ERROR, non-ES + +void main() +{ + gl_FragDepth = 0.2; // ERROR, early_fragment_tests declared + bool f = gl_FrontFacing; +} + +out float gl_FragDepth; + +void foo_GS() +{ + highp int l = gl_Layer; + highp int p = gl_PrimitiveID; +} + +in vec2 inf, ing; +uniform ivec2 offsets[4]; +uniform sampler2D sArray[4]; +uniform int sIndex; +layout(binding = 0) uniform atomic_uint auArray[2]; +uniform ubName { int i; } ubInst[4]; +buffer bbName { int i; } bbInst[4]; +highp uniform writeonly image2D iArray[5]; +const ivec2 constOffsets[4] = ivec2[4](ivec2(0.1), ivec2(0.2), ivec2(0.3), ivec2(0.4)); + +void pfoo() +{ + precise vec2 h; + h = fma(inf, ing, h); + textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf)); + textureGatherOffsets(sArray[0], vec2(0.1), constOffsets); + textureGatherOffsets(sArray[0], vec2(0.1), offsets); // ERROR, offset not constant +} + +precision highp imageCubeArray ; +precision highp iimageCubeArray ; +precision highp uimageCubeArray ; + +precision highp samplerCubeArray ; +precision highp samplerCubeArrayShadow; +precision highp isamplerCubeArray ; +precision highp usamplerCubeArray ; + +uniform writeonly imageCubeArray CA1; +uniform writeonly iimageCubeArray CA2; +uniform writeonly uimageCubeArray CA3; + +#ifdef GL_EXT_texture_cube_map_array +uniform samplerCubeArray CA4; +uniform samplerCubeArrayShadow CA5; +uniform isamplerCubeArray CA6; +uniform usamplerCubeArray CA7; +#endif + +void CAT() +{ + highp vec4 b4 = texture(CA4, vec4(0.5), 0.24); + highp ivec4 b6 = texture(CA6, vec4(0.5), 0.26); + highp uvec4 b7 = texture(CA7, vec4(0.5), 0.27); +} + +void goodSample() +{ + lowp int a1 = gl_SampleID; + mediump vec2 a2 = gl_SamplePosition; + highp int a3 = gl_SampleMaskIn[0]; + gl_SampleMask[0] = a3; + mediump int n1 = gl_MaxSamples; + mediump int n2 = gl_NumSamples; +} + +uniform layout(r32f) highp image2D im2Df; +uniform layout(r32ui) highp uimage2D im2Du; +uniform layout(r32i) highp iimage2D im2Di; +uniform ivec2 P; + +uniform layout(rgba32f) highp image2D badIm2Df; // ERROR, needs readonly or writeonly +uniform layout(rgba8ui) highp uimage2D badIm2Du; // ERROR, needs readonly or writeonly +uniform layout(rgba16i) highp iimage2D badIm2Di; // ERROR, needs readonly or writeonly + +void goodImageAtom() +{ + float datf; + int dati; + uint datu; + imageAtomicAdd( im2Di, P, dati); imageAtomicAdd( im2Du, P, datu); imageAtomicMin( im2Di, P, dati); @@ -146,57 +146,57 @@ imageAtomicExchange(im2Di, P, dati); imageAtomicExchange(im2Du, P, datu); imageAtomicExchange(im2Df, P, datf); - imageAtomicCompSwap(im2Di, P, 3, dati); - imageAtomicCompSwap(im2Du, P, 5u, datu); - + imageAtomicCompSwap(im2Di, P, 3, dati); + imageAtomicCompSwap(im2Du, P, 5u, datu); + imageAtomicMax(badIm2Di, P, dati); // ERROR, not an allowed layout() on the image imageAtomicMax(badIm2Du, P, datu); // ERROR, not an allowed layout() on the image imageAtomicExchange(badIm2Df, P, datf); // ERROR, not an allowed layout() on the image -} - -centroid out vec4 colorCentroidBad; // ERROR -flat out vec4 colorBadFlat; // ERROR -smooth out vec4 colorBadSmooth; // ERROR -noperspective out vec4 colorBadNo; // ERROR -flat centroid in vec2 colorfc; -in float scalarIn; - -sample in vec4 colorSampIn; -sample out vec4 colorSampleBad; // ERROR -flat sample in vec4 colorfsi; -sample in vec3 sampInArray[4]; - -void interp() -{ - float res; - vec2 res2; - vec3 res3; - vec4 res4; - - res2 = interpolateAtCentroid(colorfc); - res4 = interpolateAtCentroid(colorSampIn); - res4 = interpolateAtCentroid(colorfsi); - res = interpolateAtCentroid(scalarIn); - res3 = interpolateAtCentroid(sampInArray); // ERROR - res3 = interpolateAtCentroid(sampInArray[2]); - res2 = interpolateAtCentroid(sampInArray[2].xy); // ERROR - - res3 = interpolateAtSample(sampInArray, 1); // ERROR - res3 = interpolateAtSample(sampInArray[i], 0); - res2 = interpolateAtSample(sampInArray[2].xy, 2); // ERROR - res = interpolateAtSample(scalarIn, 1); - - res3 = interpolateAtOffset(sampInArray, vec2(0.2)); // ERROR - res3 = interpolateAtOffset(sampInArray[2], vec2(0.2)); - res2 = interpolateAtOffset(sampInArray[2].xy, vec2(0.2)); // ERROR, no swizzle - res = interpolateAtOffset(scalarIn + scalarIn, vec2(0.2)); // ERROR, no binary ops other than dereference - res = interpolateAtOffset(scalarIn, vec2(0.2)); - - float f; - res = interpolateAtCentroid(f); // ERROR, not interpolant - res4 = interpolateAtSample(outp, 0); // ERROR, not interpolant -} - +} + +centroid out vec4 colorCentroidBad; // ERROR +flat out vec4 colorBadFlat; // ERROR +smooth out vec4 colorBadSmooth; // ERROR +noperspective out vec4 colorBadNo; // ERROR +flat centroid in vec2 colorfc; +in float scalarIn; + +sample in vec4 colorSampIn; +sample out vec4 colorSampleBad; // ERROR +flat sample in vec4 colorfsi; +sample in vec3 sampInArray[4]; + +void interp() +{ + float res; + vec2 res2; + vec3 res3; + vec4 res4; + + res2 = interpolateAtCentroid(colorfc); + res4 = interpolateAtCentroid(colorSampIn); + res4 = interpolateAtCentroid(colorfsi); + res = interpolateAtCentroid(scalarIn); + res3 = interpolateAtCentroid(sampInArray); // ERROR + res3 = interpolateAtCentroid(sampInArray[2]); + res2 = interpolateAtCentroid(sampInArray[2].xy); // ERROR + + res3 = interpolateAtSample(sampInArray, 1); // ERROR + res3 = interpolateAtSample(sampInArray[i], 0); + res2 = interpolateAtSample(sampInArray[2].xy, 2); // ERROR + res = interpolateAtSample(scalarIn, 1); + + res3 = interpolateAtOffset(sampInArray, vec2(0.2)); // ERROR + res3 = interpolateAtOffset(sampInArray[2], vec2(0.2)); + res2 = interpolateAtOffset(sampInArray[2].xy, vec2(0.2)); // ERROR, no swizzle + res = interpolateAtOffset(scalarIn + scalarIn, vec2(0.2)); // ERROR, no binary ops other than dereference + res = interpolateAtOffset(scalarIn, vec2(0.2)); + + float f; + res = interpolateAtCentroid(f); // ERROR, not interpolant + res4 = interpolateAtSample(outp, 0); // ERROR, not interpolant +} + layout(blend_support_multiply) out; layout(blend_support_screen) out; layout(blend_support_overlay) out; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/320.geom vulkan-1.1.73+dfsg/external/glslang/Test/320.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/320.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/320.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,134 +1,134 @@ -#version 320 es - -precision mediump float; - -in fromVertex { - in vec3 color; -} fromV[]; - -in vec4 nonBlockUnsized[]; - -out toFragment { - out vec3 color; -} toF; - -out fromVertex { // okay to reuse a block name for another block name - vec3 color; -}; - -out fooB { // ERROR, cannot reuse block name as block instance - vec2 color; -} fromVertex; - -int fromVertex; // ERROR, cannot reuse a block name for something else - -out fooC { // ERROR, cannot have same name for block and instance name - vec2 color; -} fooC; - -void main() -{ - EmitVertex(); - EndPrimitive(); - EmitStreamVertex(1); // ERROR - EndStreamPrimitive(0); // ERROR - - color = fromV[0].color; - gl_ClipDistance[3] = // ERROR, no ClipDistance - gl_in[1].gl_ClipDistance[2]; // ERROR, no ClipDistance - gl_Position = gl_in[0].gl_Position; - - gl_PrimitiveID = gl_PrimitiveIDIn; - gl_Layer = 2; -} - -layout(stream = 4) out vec4 ov4; // ERROR, no streams - -layout(line_strip, points, triangle_strip, points, triangle_strip) out; // just means triangle_strip" - -out ooutb { vec4 a; } ouuaa6; - -layout(max_vertices = 200) out; -layout(max_vertices = 300) out; // ERROR, too big -void foo(layout(max_vertices = 4) int a) // ERROR -{ - ouuaa6.a = vec4(1.0); -} - -layout(line_strip, points, triangle_strip, points) out; // ERROR, changing output primitive -layout(line_strip, points) out; // ERROR, changing output primitive -layout(triangle_strip) in; // ERROR, not an input primitive -layout(triangle_strip) uniform; // ERROR -layout(triangle_strip) out vec4 badv4; // ERROR, not on a variable -layout(triangle_strip) in vec4 bad2v4[]; // ERROR, not on a variable or input -layout(invocations = 3) out outbn { int a; }; // 2 ERROR, not on a block, not until 4.0 -out outbn2 { - layout(invocations = 3) int a; // 2 ERRORs, not on a block member, not until 4.0 - layout(max_vertices = 3) int b; // ERROR, not on a block member - layout(triangle_strip) int c; // ERROR, not on a block member -} outbi; - -layout(lines) out; // ERROR, not on output -layout(lines_adjacency) in; -layout(triangles) in; // ERROR, can't change it -layout(triangles_adjacency) in; // ERROR, can't change it -layout(invocations = 4) in; - -in sameName { - int a15; -} insn[]; - -out sameName { - float f15; -}; - -uniform sameName { - bool b15; -}; - -const int summ = gl_MaxVertexAttribs + - gl_MaxGeometryInputComponents + - gl_MaxGeometryOutputComponents + - gl_MaxGeometryImageUniforms + - gl_MaxGeometryTextureImageUnits + - gl_MaxGeometryOutputVertices + - gl_MaxGeometryTotalOutputComponents + - gl_MaxGeometryUniformComponents + - gl_MaxGeometryAtomicCounters + - gl_MaxGeometryAtomicCounterBuffers + - gl_MaxVertexTextureImageUnits + - gl_MaxCombinedTextureImageUnits + - gl_MaxTextureImageUnits + - gl_MaxDrawBuffers; - -void fooe1() -{ - gl_ViewportIndex; // ERROR, not in ES - gl_MaxViewports; // ERROR, not in ES - insn.length(); // 4: lines_adjacency - int inv = gl_InvocationID; -} - -in vec4 explArray[4]; -in vec4 explArrayBad[5]; // ERROR, wrong size -in vec4 nonArrayed; // ERROR, not an array -flat out vec3 myColor1; -centroid out vec3 myColor2; -centroid in vec3 centr[]; -sample out vec4 perSampleColor; // ERROR without sample extensions - -layout(max_vertices = 200) out; // matching redecl - -layout(location = 7, component = 2) in float comp[]; // ERROR, es has no component - -void notHere() -{ - gl_MaxGeometryVaryingComponents; // ERROR, not in ES - gl_VerticesIn; // ERROR, not in ES -} - -void pointSize2() -{ - highp float ps = gl_in[3].gl_PointSize; // ERROR, need extension - gl_PointSize = ps; // ERROR, need extension -} +#version 320 es + +precision mediump float; + +in fromVertex { + in vec3 color; +} fromV[]; + +in vec4 nonBlockUnsized[]; + +out toFragment { + out vec3 color; +} toF; + +out fromVertex { // okay to reuse a block name for another block name + vec3 color; +}; + +out fooB { // ERROR, cannot reuse block name as block instance + vec2 color; +} fromVertex; + +int fromVertex; // ERROR, cannot reuse a block name for something else + +out fooC { // ERROR, cannot have same name for block and instance name + vec2 color; +} fooC; + +void main() +{ + EmitVertex(); + EndPrimitive(); + EmitStreamVertex(1); // ERROR + EndStreamPrimitive(0); // ERROR + + color = fromV[0].color; + gl_ClipDistance[3] = // ERROR, no ClipDistance + gl_in[1].gl_ClipDistance[2]; // ERROR, no ClipDistance + gl_Position = gl_in[0].gl_Position; + + gl_PrimitiveID = gl_PrimitiveIDIn; + gl_Layer = 2; +} + +layout(stream = 4) out vec4 ov4; // ERROR, no streams + +layout(line_strip, points, triangle_strip, points, triangle_strip) out; // just means triangle_strip" + +out ooutb { vec4 a; } ouuaa6; + +layout(max_vertices = 200) out; +layout(max_vertices = 300) out; // ERROR, too big +void foo(layout(max_vertices = 4) int a) // ERROR +{ + ouuaa6.a = vec4(1.0); +} + +layout(line_strip, points, triangle_strip, points) out; // ERROR, changing output primitive +layout(line_strip, points) out; // ERROR, changing output primitive +layout(triangle_strip) in; // ERROR, not an input primitive +layout(triangle_strip) uniform; // ERROR +layout(triangle_strip) out vec4 badv4; // ERROR, not on a variable +layout(triangle_strip) in vec4 bad2v4[]; // ERROR, not on a variable or input +layout(invocations = 3) out outbn { int a; }; // 2 ERROR, not on a block, not until 4.0 +out outbn2 { + layout(invocations = 3) int a; // 2 ERRORs, not on a block member, not until 4.0 + layout(max_vertices = 3) int b; // ERROR, not on a block member + layout(triangle_strip) int c; // ERROR, not on a block member +} outbi; + +layout(lines) out; // ERROR, not on output +layout(lines_adjacency) in; +layout(triangles) in; // ERROR, can't change it +layout(triangles_adjacency) in; // ERROR, can't change it +layout(invocations = 4) in; + +in sameName { + int a15; +} insn[]; + +out sameName { + float f15; +}; + +uniform sameName { + bool b15; +}; + +const int summ = gl_MaxVertexAttribs + + gl_MaxGeometryInputComponents + + gl_MaxGeometryOutputComponents + + gl_MaxGeometryImageUniforms + + gl_MaxGeometryTextureImageUnits + + gl_MaxGeometryOutputVertices + + gl_MaxGeometryTotalOutputComponents + + gl_MaxGeometryUniformComponents + + gl_MaxGeometryAtomicCounters + + gl_MaxGeometryAtomicCounterBuffers + + gl_MaxVertexTextureImageUnits + + gl_MaxCombinedTextureImageUnits + + gl_MaxTextureImageUnits + + gl_MaxDrawBuffers; + +void fooe1() +{ + gl_ViewportIndex; // ERROR, not in ES + gl_MaxViewports; // ERROR, not in ES + insn.length(); // 4: lines_adjacency + int inv = gl_InvocationID; +} + +in vec4 explArray[4]; +in vec4 explArrayBad[5]; // ERROR, wrong size +in vec4 nonArrayed; // ERROR, not an array +flat out vec3 myColor1; +centroid out vec3 myColor2; +centroid in vec3 centr[]; +sample out vec4 perSampleColor; // ERROR without sample extensions + +layout(max_vertices = 200) out; // matching redecl + +layout(location = 7, component = 2) in float comp[]; // ERROR, es has no component + +void notHere() +{ + gl_MaxGeometryVaryingComponents; // ERROR, not in ES + gl_VerticesIn; // ERROR, not in ES +} + +void pointSize2() +{ + highp float ps = gl_in[3].gl_PointSize; // ERROR, need extension + gl_PointSize = ps; // ERROR, need extension +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/320.tesc vulkan-1.1.73+dfsg/external/glslang/Test/320.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/320.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/320.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,150 +1,150 @@ -#version 320 es - -layout(vertices = 4) out; -out int outa[gl_out.length()]; - -layout(quads) in; // ERROR -layout(ccw) out; // ERROR -layout(fractional_even_spacing) in; // ERROR - -patch in vec4 patchIn; // ERROR -patch out vec4 patchOut; - -void main() -{ - barrier(); - - int a = gl_MaxTessControlInputComponents + - gl_MaxTessControlOutputComponents + - gl_MaxTessControlTextureImageUnits + - gl_MaxTessControlUniformComponents + - gl_MaxTessControlTotalOutputComponents; - - vec4 p = gl_in[1].gl_Position; - float ps = gl_in[1].gl_PointSize; // ERROR, need point_size extension - float cd = gl_in[1].gl_ClipDistance[2]; // ERROR, not in ES - - int pvi = gl_PatchVerticesIn; - int pid = gl_PrimitiveID; - int iid = gl_InvocationID; - - gl_out[gl_InvocationID].gl_Position = p; - gl_out[gl_InvocationID].gl_PointSize = ps; // ERROR, need point_size extension - gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; // ERROR, not in ES - - gl_TessLevelOuter[3] = 3.2; - gl_TessLevelInner[1] = 1.3; - - if (a > 10) - barrier(); // ERROR - else - barrier(); // ERROR - - barrier(); - - do { - barrier(); // ERROR - } while (a > 10); - - switch (a) { - default: - barrier(); // ERROR - break; - } - a < 12 ? a : (barrier(), a); // ERROR - { - barrier(); - } - - return; - - barrier(); // ERROR -} - -layout(vertices = 4) in; // ERROR, not on in -layout(vertices = 5) out; // ERROR, changing # - -void foo() -{ - gl_out[4].gl_Position; // ERROR, out of range - - barrier(); // ERROR, not in main -} - -in vec2 ina; // ERROR, not array -in vec2 inb[]; -in vec2 inc[18]; // ERROR, wrong size -in vec2 ind[gl_MaxPatchVertices]; -patch out float implA[]; // ERROR, not sized - -#extension GL_ARB_separate_shader_objects : enable - -layout(location = 3) in vec4 ivla[]; -layout(location = 4) in vec4 ivlb[]; -layout(location = 4) in vec4 ivlc[]; // ERROR, overlapping - -layout(location = 3) out vec4 ovla[]; -layout(location = 4) out vec4 ovlb[]; -layout(location = 4) out vec4 ovlc[]; // ERROR, overlapping - -patch out pinbn { - int a; -} pinbi; - -centroid out vec3 myColor2[]; -centroid in vec3 centr[]; -sample out vec4 perSampleColor[]; - -layout(vertices = 4) out float badlay[]; // ERROR, not on a variable -out float misSized[5]; // ERROR, size doesn't match -out float okaySize[4]; - -void pointSize2() -{ - float ps = gl_in[1].gl_PointSize; // ERROR, need point_size extension - gl_out[gl_InvocationID].gl_PointSize = ps; // ERROR, need point_size extension -} - -precise vec3 pv3; - -void goodfoop() -{ - precise float d; - - pv3 *= pv3; - pv3 = fma(pv3, pv3, pv3); - d = fma(d, d, d); -} - -void bb() -{ - gl_BoundingBoxOES[0] = vec4(0.0); - gl_BoundingBoxOES[1] = vec4(1.0); - gl_BoundingBoxOES[2] = vec4(2.0); // ERROR, overflow -} - -out patch badpatchBName { // ERROR, array size required - float f; -} badpatchIName[]; - -out patch patchBName { - float f; -} patchIName[4]; - -void outputtingOutparam(out int a) -{ - a = 2; -} - -void outputting() -{ - outa[gl_InvocationID] = 2; - outa[1] = 2; // ERROR, not gl_InvocationID - gl_out[0].gl_Position = vec4(1.0); // ERROR, not gl_InvocationID - outa[1]; - gl_out[0]; - outputtingOutparam(outa[0]); // ERROR, not gl_InvocationID - outputtingOutparam(outa[gl_InvocationID]); - patchIName[1].f = 3.14; - outa[(gl_InvocationID)] = 2; -} +#version 320 es + +layout(vertices = 4) out; +out int outa[gl_out.length()]; + +layout(quads) in; // ERROR +layout(ccw) out; // ERROR +layout(fractional_even_spacing) in; // ERROR + +patch in vec4 patchIn; // ERROR +patch out vec4 patchOut; + +void main() +{ + barrier(); + + int a = gl_MaxTessControlInputComponents + + gl_MaxTessControlOutputComponents + + gl_MaxTessControlTextureImageUnits + + gl_MaxTessControlUniformComponents + + gl_MaxTessControlTotalOutputComponents; + + vec4 p = gl_in[1].gl_Position; + float ps = gl_in[1].gl_PointSize; // ERROR, need point_size extension + float cd = gl_in[1].gl_ClipDistance[2]; // ERROR, not in ES + + int pvi = gl_PatchVerticesIn; + int pid = gl_PrimitiveID; + int iid = gl_InvocationID; + + gl_out[gl_InvocationID].gl_Position = p; + gl_out[gl_InvocationID].gl_PointSize = ps; // ERROR, need point_size extension + gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; // ERROR, not in ES + + gl_TessLevelOuter[3] = 3.2; + gl_TessLevelInner[1] = 1.3; + + if (a > 10) + barrier(); // ERROR + else + barrier(); // ERROR + + barrier(); + + do { + barrier(); // ERROR + } while (a > 10); + + switch (a) { + default: + barrier(); // ERROR + break; + } + a < 12 ? a : (barrier(), a); // ERROR + { + barrier(); + } + + return; + + barrier(); // ERROR +} + +layout(vertices = 4) in; // ERROR, not on in +layout(vertices = 5) out; // ERROR, changing # + +void foo() +{ + gl_out[4].gl_Position; // ERROR, out of range + + barrier(); // ERROR, not in main +} + +in vec2 ina; // ERROR, not array +in vec2 inb[]; +in vec2 inc[18]; // ERROR, wrong size +in vec2 ind[gl_MaxPatchVertices]; +patch out float implA[]; // ERROR, not sized + +#extension GL_ARB_separate_shader_objects : enable + +layout(location = 3) in vec4 ivla[]; +layout(location = 4) in vec4 ivlb[]; +layout(location = 4) in vec4 ivlc[]; // ERROR, overlapping + +layout(location = 3) out vec4 ovla[]; +layout(location = 4) out vec4 ovlb[]; +layout(location = 4) out vec4 ovlc[]; // ERROR, overlapping + +patch out pinbn { + int a; +} pinbi; + +centroid out vec3 myColor2[]; +centroid in vec3 centr[]; +sample out vec4 perSampleColor[]; + +layout(vertices = 4) out float badlay[]; // ERROR, not on a variable +out float misSized[5]; // ERROR, size doesn't match +out float okaySize[4]; + +void pointSize2() +{ + float ps = gl_in[1].gl_PointSize; // ERROR, need point_size extension + gl_out[gl_InvocationID].gl_PointSize = ps; // ERROR, need point_size extension +} + +precise vec3 pv3; + +void goodfoop() +{ + precise float d; + + pv3 *= pv3; + pv3 = fma(pv3, pv3, pv3); + d = fma(d, d, d); +} + +void bb() +{ + gl_BoundingBoxOES[0] = vec4(0.0); + gl_BoundingBoxOES[1] = vec4(1.0); + gl_BoundingBoxOES[2] = vec4(2.0); // ERROR, overflow +} + +out patch badpatchBName { // ERROR, array size required + float f; +} badpatchIName[]; + +out patch patchBName { + float f; +} patchIName[4]; + +void outputtingOutparam(out int a) +{ + a = 2; +} + +void outputting() +{ + outa[gl_InvocationID] = 2; + outa[1] = 2; // ERROR, not gl_InvocationID + gl_out[0].gl_Position = vec4(1.0); // ERROR, not gl_InvocationID + outa[1]; + gl_out[0]; + outputtingOutparam(outa[0]); // ERROR, not gl_InvocationID + outputtingOutparam(outa[gl_InvocationID]); + patchIName[1].f = 3.14; + outa[(gl_InvocationID)] = 2; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/320.tese vulkan-1.1.73+dfsg/external/glslang/Test/320.tese --- vulkan-1.1.70+dfsg1/external/glslang/Test/320.tese 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/320.tese 2018-04-27 11:46:26.000000000 +0000 @@ -1,114 +1,114 @@ -#version 320 es - -layout(vertices = 4) out; // ERROR -layout(quads, cw) in; -layout(triangles) in; // ERROR -layout(isolines) in; // ERROR - -layout(ccw) in; // ERROR -layout(cw) in; - -layout(fractional_odd_spacing) in; -layout(equal_spacing) in; // ERROR -layout(fractional_even_spacing) in; // ERROR - -layout(point_mode) in; - -patch in vec4 patchIn; -patch out vec4 patchOut; // ERROR - -void main() -{ - barrier(); // ERROR - - int a = gl_MaxTessEvaluationInputComponents + - gl_MaxTessEvaluationOutputComponents + - gl_MaxTessEvaluationTextureImageUnits + - gl_MaxTessEvaluationUniformComponents + - gl_MaxTessPatchComponents + - gl_MaxPatchVertices + - gl_MaxTessGenLevel; - - vec4 p = gl_in[1].gl_Position; - float ps = gl_in[1].gl_PointSize; // ERROR, need point_size extension - float cd = gl_in[1].gl_ClipDistance[2]; // ERROR, not in ES - - int pvi = gl_PatchVerticesIn; - int pid = gl_PrimitiveID; - vec3 tc = gl_TessCoord; - float tlo = gl_TessLevelOuter[3]; - float tli = gl_TessLevelInner[1]; - - gl_Position = p; - gl_PointSize = ps; // ERROR, need point_size extension - gl_ClipDistance[2] = cd; // ERROR, not in ES -} - -smooth patch in vec4 badp1; // ERROR -flat patch in vec4 badp2; // ERROR -noperspective patch in vec4 badp3; // ERROR -patch sample in vec3 badp4; // ERROR - -#extension GL_ARB_separate_shader_objects : enable - -in gl_PerVertex // ERROR, no size -{ - vec4 gl_Position; -} gl_in[]; - -in gl_PerVertex // ERROR, second redeclaration of gl_in -{ - vec4 gl_Position; -} gl_in[]; - -layout(quads, cw) out; // ERROR -layout(triangles) out; // ERROR -layout(isolines) out; // ERROR -layout(cw) out; // ERROR -layout(fractional_odd_spacing) out; // ERROR -layout(equal_spacing) out; // ERROR -layout(fractional_even_spacing) out; // ERROR -layout(point_mode) out; // ERROR - -in vec2 ina; // ERROR, not array -in vec2 inb[]; -in vec2 inc[18]; // ERROR, wrong size -in vec2 ind[gl_MaxPatchVertices]; - -in testbla { // ERROR, not array - int f; -} bla; - -in testblb { - int f; -} blb[]; - -in testblc { // ERROR wrong size - int f; -} blc[18]; - -in testbld { - int f; -} bld[gl_MaxPatchVertices]; - -layout(location = 23) in vec4 ivla[]; -layout(location = 24) in vec4 ivlb[]; -layout(location = 24) in vec4 ivlc[]; // ERROR, overlap - -layout(location = 23) out vec4 ovla[2]; -layout(location = 24) out vec4 ovlb[2]; // ERROR, overlap - -in float gl_TessLevelOuter[4]; // ERROR, can't redeclare - -patch in pinbn { - int a; -} pinbi; - -centroid out vec3 myColor2; -centroid in vec3 centr[]; -sample out vec4 perSampleColor; - -void bbbad() -{ - gl_BoundingBoxOES; // ERROR, wrong stage -} +#version 320 es + +layout(vertices = 4) out; // ERROR +layout(quads, cw) in; +layout(triangles) in; // ERROR +layout(isolines) in; // ERROR + +layout(ccw) in; // ERROR +layout(cw) in; + +layout(fractional_odd_spacing) in; +layout(equal_spacing) in; // ERROR +layout(fractional_even_spacing) in; // ERROR + +layout(point_mode) in; + +patch in vec4 patchIn; +patch out vec4 patchOut; // ERROR + +void main() +{ + barrier(); // ERROR + + int a = gl_MaxTessEvaluationInputComponents + + gl_MaxTessEvaluationOutputComponents + + gl_MaxTessEvaluationTextureImageUnits + + gl_MaxTessEvaluationUniformComponents + + gl_MaxTessPatchComponents + + gl_MaxPatchVertices + + gl_MaxTessGenLevel; + + vec4 p = gl_in[1].gl_Position; + float ps = gl_in[1].gl_PointSize; // ERROR, need point_size extension + float cd = gl_in[1].gl_ClipDistance[2]; // ERROR, not in ES + + int pvi = gl_PatchVerticesIn; + int pid = gl_PrimitiveID; + vec3 tc = gl_TessCoord; + float tlo = gl_TessLevelOuter[3]; + float tli = gl_TessLevelInner[1]; + + gl_Position = p; + gl_PointSize = ps; // ERROR, need point_size extension + gl_ClipDistance[2] = cd; // ERROR, not in ES +} + +smooth patch in vec4 badp1; // ERROR +flat patch in vec4 badp2; // ERROR +noperspective patch in vec4 badp3; // ERROR +patch sample in vec3 badp4; // ERROR + +#extension GL_ARB_separate_shader_objects : enable + +in gl_PerVertex // ERROR, no size +{ + vec4 gl_Position; +} gl_in[]; + +in gl_PerVertex // ERROR, second redeclaration of gl_in +{ + vec4 gl_Position; +} gl_in[]; + +layout(quads, cw) out; // ERROR +layout(triangles) out; // ERROR +layout(isolines) out; // ERROR +layout(cw) out; // ERROR +layout(fractional_odd_spacing) out; // ERROR +layout(equal_spacing) out; // ERROR +layout(fractional_even_spacing) out; // ERROR +layout(point_mode) out; // ERROR + +in vec2 ina; // ERROR, not array +in vec2 inb[]; +in vec2 inc[18]; // ERROR, wrong size +in vec2 ind[gl_MaxPatchVertices]; + +in testbla { // ERROR, not array + int f; +} bla; + +in testblb { + int f; +} blb[]; + +in testblc { // ERROR wrong size + int f; +} blc[18]; + +in testbld { + int f; +} bld[gl_MaxPatchVertices]; + +layout(location = 23) in vec4 ivla[]; +layout(location = 24) in vec4 ivlb[]; +layout(location = 24) in vec4 ivlc[]; // ERROR, overlap + +layout(location = 23) out vec4 ovla[2]; +layout(location = 24) out vec4 ovlb[2]; // ERROR, overlap + +in float gl_TessLevelOuter[4]; // ERROR, can't redeclare + +patch in pinbn { + int a; +} pinbi; + +centroid out vec3 myColor2; +centroid in vec3 centr[]; +sample out vec4 perSampleColor; + +void bbbad() +{ + gl_BoundingBoxOES; // ERROR, wrong stage +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/320.vert vulkan-1.1.73+dfsg/external/glslang/Test/320.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/320.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/320.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,228 +1,228 @@ -#version 320 es - -out outbname { - int a; - out vec4 v; - highp sampler2D s; // ERROR, opaque type -} outbinst; - -out outbname2 { - layout(location = 12) int aAnon; - layout(location = 13) vec4 vAnon; -}; - -layout(location = 12) out highp int aliased; // ERROR, aliasing location - -in inbname { int a; } inbinst; // ERROR, no in block in vertex shader - -out gl_PerVertex { // ERROR, has extra member - highp vec4 gl_Position; - highp vec4 t; -}; - -void main() -{ - int sum = gl_VertexID + - gl_InstanceID; - gl_Position = vec4(1.0); - gl_PointSize = 2.0; // ERROR, removed by redeclaration -} - -out gl_PerVertex { // ERROR, already used and already redeclared - highp vec4 gl_Position; - highp vec4 t; -}; - -smooth out smo { // ERROR, no smooth on a block - int i; -} smon; - -flat out fmo { // ERROR, no flat on a block - int i; -} fmon; - -centroid out cmo { // ERROR, no centroid on a block - int i; -} cmon; - -invariant out imo { // ERROR, no invariant on a block - int i; -} imon; - -in vec2 inf, ing; -uniform ivec2 offsets[4]; -uniform sampler2D sArray[4]; -uniform int sIndex; -layout(binding = 0) uniform atomic_uint auArray[2]; -uniform ubName { int i; } ubInst[4]; -buffer bbName { int i; } bbInst[4]; -highp uniform writeonly image2D iArray[5]; -const ivec2 constOffsets[4] = ivec2[4](ivec2(0.1), ivec2(0.2), ivec2(0.3), ivec2(0.4)); - -void pfoo() -{ - precise vec2 h; - h = fma(inf, ing, h); - sArray[sIndex + 1]; - ubInst[sIndex + 1]; - bbInst[sIndex - 2]; // ERROR, still not supported - iArray[2]; - iArray[sIndex - 2]; - textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf)); - textureGatherOffsets(sArray[0], vec2(0.1), constOffsets); - textureGatherOffsets(sArray[0], vec2(0.1), offsets); // ERROR, offset not constant -} - -uniform samplerBuffer noPreSamp1; // ERROR, no default precision -uniform isamplerBuffer noPreSamp2; // ERROR, no default precision -uniform usamplerBuffer noPreSamp3; // ERROR, no default precision -uniform writeonly imageBuffer noPreSamp4; // ERROR, no default precision -uniform writeonly iimageBuffer noPreSamp5; // ERROR, no default precision -uniform writeonly uimageBuffer noPreSamp6; // ERROR, no default precision - -precision highp samplerBuffer; -precision highp isamplerBuffer; -precision highp usamplerBuffer; -precision highp imageBuffer; -precision highp iimageBuffer; -precision highp uimageBuffer; - -#ifdef GL_OES_texture_buffer -uniform samplerBuffer bufSamp1; -uniform isamplerBuffer bufSamp2; -uniform usamplerBuffer bufSamp3; -#endif -#ifdef GL_EXT_texture_buffer -uniform writeonly imageBuffer bufSamp4; -uniform writeonly iimageBuffer bufSamp5; -uniform writeonly uimageBuffer bufSamp6; -#endif - -void bufferT() -{ - highp int s1 = textureSize(bufSamp1); - highp int s2 = textureSize(bufSamp2); - highp int s3 = textureSize(bufSamp3); - - highp int s4 = imageSize(bufSamp4); - highp int s5 = imageSize(bufSamp5); - highp int s6 = imageSize(bufSamp6); - - highp vec4 f1 = texelFetch(bufSamp1, s1); - highp ivec4 f2 = texelFetch(bufSamp2, s2); - highp uvec4 f3 = texelFetch(bufSamp3, s3); -} - -uniform writeonly imageCubeArray noPreCA1; // ERROR, no default precision -uniform writeonly iimageCubeArray noPreCA2; // ERROR, no default precision -uniform writeonly uimageCubeArray noPreCA3; // ERROR, no default precision - -uniform samplerCubeArray noPreCA4; // ERROR, no default precision -uniform samplerCubeArrayShadow noPreCA5; // ERROR, no default precision -uniform isamplerCubeArray noPreCA6; // ERROR, no default precision -uniform usamplerCubeArray noPreCA7; // ERROR, no default precision - -precision highp imageCubeArray ; -precision highp iimageCubeArray ; -precision highp uimageCubeArray ; - -precision highp samplerCubeArray ; -precision highp samplerCubeArrayShadow; -precision highp isamplerCubeArray ; -precision highp usamplerCubeArray ; - -uniform writeonly imageCubeArray CA1; -uniform writeonly iimageCubeArray CA2; -uniform writeonly uimageCubeArray CA3; - -layout(rgba16f) uniform readonly imageCubeArray rCA1; -layout(rgba32i) uniform readonly iimageCubeArray rCA2; -layout(r32ui) uniform readonly uimageCubeArray rCA3; - -#ifdef GL_OES_texture_cube_map_array -uniform samplerCubeArray CA4; -uniform samplerCubeArrayShadow CA5; -uniform isamplerCubeArray CA6; -uniform usamplerCubeArray CA7; -#endif - -void CAT() -{ - highp ivec3 s4 = textureSize(CA4, 1); - highp ivec3 s5 = textureSize(CA5, 1); - highp ivec3 s6 = textureSize(CA6, 1); - highp ivec3 s7 = textureSize(CA7, 1); - - highp vec4 t4 = texture(CA4, vec4(0.5)); - highp float t5 = texture(CA5, vec4(0.5), 3.0); - highp ivec4 t6 = texture(CA6, vec4(0.5)); - highp uvec4 t7 = texture(CA7, vec4(0.5)); - - highp vec4 L4 = textureLod(CA4, vec4(0.5), 0.24); - highp ivec4 L6 = textureLod(CA6, vec4(0.5), 0.26); - highp uvec4 L7 = textureLod(CA7, vec4(0.5), 0.27); - - highp vec4 g4 = textureGrad(CA4, vec4(0.5), vec3(0.1), vec3(0.2)); - highp ivec4 g6 = textureGrad(CA6, vec4(0.5), vec3(0.1), vec3(0.2)); - highp uvec4 g7 = textureGrad(CA7, vec4(0.5), vec3(0.1), vec3(0.2)); - - highp vec4 gath4 = textureGather(CA4, vec4(0.5)); - highp vec4 gathC4 = textureGather(CA4, vec4(0.5), 2); - highp ivec4 gath6 = textureGather(CA6, vec4(0.5)); - highp ivec4 gathC6 = textureGather(CA6, vec4(0.5), 1); - highp uvec4 gath7 = textureGather(CA7, vec4(0.5)); - highp uvec4 gathC7 = textureGather(CA7, vec4(0.5), 0); - - highp vec4 gath5 = textureGather(CA5, vec4(0.5), 2.5); - - highp ivec3 s1 = imageSize(CA1); - highp ivec3 s2 = imageSize(CA2); - highp ivec3 s3 = imageSize(CA3); - - imageStore(CA1, s3, vec4(1)); - imageStore(CA2, s3, ivec4(1)); - imageStore(CA3, s3, uvec4(1)); - - highp vec4 cl1 = imageLoad(rCA1, s3); - highp ivec4 cl2 = imageLoad(rCA2, s3); - highp uvec4 cl3 = imageLoad(rCA3, s3); -} - -uniform sampler2DMSArray noPrec2DMS; // ERROR, no default -uniform isampler2DMSArray noPrec2DMSi; // ERROR, no default -uniform usampler2DMSArray noPrec2DMSu; // ERROR, no default - -precision highp sampler2DMSArray; -precision highp isampler2DMSArray; -precision highp usampler2DMSArray; - -uniform sampler2DMSArray samp2DMSA; -uniform isampler2DMSArray samp2DMSAi; -uniform usampler2DMSArray samp2DMSAu; - -void MSA() -{ - vec4 tf = texelFetch(samp2DMSA, ivec3(5), 2); - ivec4 tfi = texelFetch(samp2DMSAi, ivec3(5), 2); - uvec4 tfu = texelFetch(samp2DMSAu, ivec3(5), 2); - - ivec3 tfs = textureSize(samp2DMSA); - ivec3 tfsi = textureSize(samp2DMSAi); - ivec3 tfsb = textureSize(samp2DMSAi, 4); // ERROR, no lod - ivec3 tfsu = textureSize(samp2DMSAu); -} - -uniform layout(r32f) highp image2D im2Df; -uniform layout(r32ui) highp uimage2D im2Du; -uniform layout(r32i) highp iimage2D im2Di; -uniform ivec2 P; - -void goodImageAtom() -{ - float datf; - int dati; - uint datu; - +#version 320 es + +out outbname { + int a; + out vec4 v; + highp sampler2D s; // ERROR, opaque type +} outbinst; + +out outbname2 { + layout(location = 12) int aAnon; + layout(location = 13) vec4 vAnon; +}; + +layout(location = 12) out highp int aliased; // ERROR, aliasing location + +in inbname { int a; } inbinst; // ERROR, no in block in vertex shader + +out gl_PerVertex { // ERROR, has extra member + highp vec4 gl_Position; + highp vec4 t; +}; + +void main() +{ + int sum = gl_VertexID + + gl_InstanceID; + gl_Position = vec4(1.0); + gl_PointSize = 2.0; // ERROR, removed by redeclaration +} + +out gl_PerVertex { // ERROR, already used and already redeclared + highp vec4 gl_Position; + highp vec4 t; +}; + +smooth out smo { // ERROR, no smooth on a block + int i; +} smon; + +flat out fmo { // ERROR, no flat on a block + int i; +} fmon; + +centroid out cmo { // ERROR, no centroid on a block + int i; +} cmon; + +invariant out imo { // ERROR, no invariant on a block + int i; +} imon; + +in vec2 inf, ing; +uniform ivec2 offsets[4]; +uniform sampler2D sArray[4]; +uniform int sIndex; +layout(binding = 0) uniform atomic_uint auArray[2]; +uniform ubName { int i; } ubInst[4]; +buffer bbName { int i; } bbInst[4]; +highp uniform writeonly image2D iArray[5]; +const ivec2 constOffsets[4] = ivec2[4](ivec2(0.1), ivec2(0.2), ivec2(0.3), ivec2(0.4)); + +void pfoo() +{ + precise vec2 h; + h = fma(inf, ing, h); + sArray[sIndex + 1]; + ubInst[sIndex + 1]; + bbInst[sIndex - 2]; // ERROR, still not supported + iArray[2]; + iArray[sIndex - 2]; + textureGatherOffset(sArray[0], vec2(0.1), ivec2(inf)); + textureGatherOffsets(sArray[0], vec2(0.1), constOffsets); + textureGatherOffsets(sArray[0], vec2(0.1), offsets); // ERROR, offset not constant +} + +uniform samplerBuffer noPreSamp1; // ERROR, no default precision +uniform isamplerBuffer noPreSamp2; // ERROR, no default precision +uniform usamplerBuffer noPreSamp3; // ERROR, no default precision +uniform writeonly imageBuffer noPreSamp4; // ERROR, no default precision +uniform writeonly iimageBuffer noPreSamp5; // ERROR, no default precision +uniform writeonly uimageBuffer noPreSamp6; // ERROR, no default precision + +precision highp samplerBuffer; +precision highp isamplerBuffer; +precision highp usamplerBuffer; +precision highp imageBuffer; +precision highp iimageBuffer; +precision highp uimageBuffer; + +#ifdef GL_OES_texture_buffer +uniform samplerBuffer bufSamp1; +uniform isamplerBuffer bufSamp2; +uniform usamplerBuffer bufSamp3; +#endif +#ifdef GL_EXT_texture_buffer +uniform writeonly imageBuffer bufSamp4; +uniform writeonly iimageBuffer bufSamp5; +uniform writeonly uimageBuffer bufSamp6; +#endif + +void bufferT() +{ + highp int s1 = textureSize(bufSamp1); + highp int s2 = textureSize(bufSamp2); + highp int s3 = textureSize(bufSamp3); + + highp int s4 = imageSize(bufSamp4); + highp int s5 = imageSize(bufSamp5); + highp int s6 = imageSize(bufSamp6); + + highp vec4 f1 = texelFetch(bufSamp1, s1); + highp ivec4 f2 = texelFetch(bufSamp2, s2); + highp uvec4 f3 = texelFetch(bufSamp3, s3); +} + +uniform writeonly imageCubeArray noPreCA1; // ERROR, no default precision +uniform writeonly iimageCubeArray noPreCA2; // ERROR, no default precision +uniform writeonly uimageCubeArray noPreCA3; // ERROR, no default precision + +uniform samplerCubeArray noPreCA4; // ERROR, no default precision +uniform samplerCubeArrayShadow noPreCA5; // ERROR, no default precision +uniform isamplerCubeArray noPreCA6; // ERROR, no default precision +uniform usamplerCubeArray noPreCA7; // ERROR, no default precision + +precision highp imageCubeArray ; +precision highp iimageCubeArray ; +precision highp uimageCubeArray ; + +precision highp samplerCubeArray ; +precision highp samplerCubeArrayShadow; +precision highp isamplerCubeArray ; +precision highp usamplerCubeArray ; + +uniform writeonly imageCubeArray CA1; +uniform writeonly iimageCubeArray CA2; +uniform writeonly uimageCubeArray CA3; + +layout(rgba16f) uniform readonly imageCubeArray rCA1; +layout(rgba32i) uniform readonly iimageCubeArray rCA2; +layout(r32ui) uniform readonly uimageCubeArray rCA3; + +#ifdef GL_OES_texture_cube_map_array +uniform samplerCubeArray CA4; +uniform samplerCubeArrayShadow CA5; +uniform isamplerCubeArray CA6; +uniform usamplerCubeArray CA7; +#endif + +void CAT() +{ + highp ivec3 s4 = textureSize(CA4, 1); + highp ivec3 s5 = textureSize(CA5, 1); + highp ivec3 s6 = textureSize(CA6, 1); + highp ivec3 s7 = textureSize(CA7, 1); + + highp vec4 t4 = texture(CA4, vec4(0.5)); + highp float t5 = texture(CA5, vec4(0.5), 3.0); + highp ivec4 t6 = texture(CA6, vec4(0.5)); + highp uvec4 t7 = texture(CA7, vec4(0.5)); + + highp vec4 L4 = textureLod(CA4, vec4(0.5), 0.24); + highp ivec4 L6 = textureLod(CA6, vec4(0.5), 0.26); + highp uvec4 L7 = textureLod(CA7, vec4(0.5), 0.27); + + highp vec4 g4 = textureGrad(CA4, vec4(0.5), vec3(0.1), vec3(0.2)); + highp ivec4 g6 = textureGrad(CA6, vec4(0.5), vec3(0.1), vec3(0.2)); + highp uvec4 g7 = textureGrad(CA7, vec4(0.5), vec3(0.1), vec3(0.2)); + + highp vec4 gath4 = textureGather(CA4, vec4(0.5)); + highp vec4 gathC4 = textureGather(CA4, vec4(0.5), 2); + highp ivec4 gath6 = textureGather(CA6, vec4(0.5)); + highp ivec4 gathC6 = textureGather(CA6, vec4(0.5), 1); + highp uvec4 gath7 = textureGather(CA7, vec4(0.5)); + highp uvec4 gathC7 = textureGather(CA7, vec4(0.5), 0); + + highp vec4 gath5 = textureGather(CA5, vec4(0.5), 2.5); + + highp ivec3 s1 = imageSize(CA1); + highp ivec3 s2 = imageSize(CA2); + highp ivec3 s3 = imageSize(CA3); + + imageStore(CA1, s3, vec4(1)); + imageStore(CA2, s3, ivec4(1)); + imageStore(CA3, s3, uvec4(1)); + + highp vec4 cl1 = imageLoad(rCA1, s3); + highp ivec4 cl2 = imageLoad(rCA2, s3); + highp uvec4 cl3 = imageLoad(rCA3, s3); +} + +uniform sampler2DMSArray noPrec2DMS; // ERROR, no default +uniform isampler2DMSArray noPrec2DMSi; // ERROR, no default +uniform usampler2DMSArray noPrec2DMSu; // ERROR, no default + +precision highp sampler2DMSArray; +precision highp isampler2DMSArray; +precision highp usampler2DMSArray; + +uniform sampler2DMSArray samp2DMSA; +uniform isampler2DMSArray samp2DMSAi; +uniform usampler2DMSArray samp2DMSAu; + +void MSA() +{ + vec4 tf = texelFetch(samp2DMSA, ivec3(5), 2); + ivec4 tfi = texelFetch(samp2DMSAi, ivec3(5), 2); + uvec4 tfu = texelFetch(samp2DMSAu, ivec3(5), 2); + + ivec3 tfs = textureSize(samp2DMSA); + ivec3 tfsi = textureSize(samp2DMSAi); + ivec3 tfsb = textureSize(samp2DMSAi, 4); // ERROR, no lod + ivec3 tfsu = textureSize(samp2DMSAu); +} + +uniform layout(r32f) highp image2D im2Df; +uniform layout(r32ui) highp uimage2D im2Du; +uniform layout(r32i) highp iimage2D im2Di; +uniform ivec2 P; + +void goodImageAtom() +{ + float datf; + int dati; + uint datu; + imageAtomicAdd( im2Di, P, dati); imageAtomicAdd( im2Du, P, datu); imageAtomicMin( im2Di, P, dati); @@ -238,18 +238,18 @@ imageAtomicExchange(im2Di, P, dati); imageAtomicExchange(im2Du, P, datu); imageAtomicExchange(im2Df, P, datf); - imageAtomicCompSwap(im2Di, P, 3, dati); - imageAtomicCompSwap(im2Du, P, 5u, datu); -} - -sample out vec4 colorSample; -flat sample out vec4 colorfsi; -sample out vec3 sampInArray[4]; -in vec4 inv4; - -void badInterp() -{ - interpolateAtCentroid(inv4); // ERROR, wrong stage - interpolateAtSample(inv4, 1); // ERROR, need extension - interpolateAtOffset(inv4, vec2(0.2)); // ERROR, need extension -} + imageAtomicCompSwap(im2Di, P, 3, dati); + imageAtomicCompSwap(im2Du, P, 5u, datu); +} + +sample out vec4 colorSample; +flat sample out vec4 colorfsi; +sample out vec3 sampInArray[4]; +in vec4 inv4; + +void badInterp() +{ + interpolateAtCentroid(inv4); // ERROR, wrong stage + interpolateAtSample(inv4, 1); // ERROR, need extension + interpolateAtOffset(inv4, vec2(0.2)); // ERROR, need extension +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/330.frag vulkan-1.1.73+dfsg/external/glslang/Test/330.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/330.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/330.frag 2018-04-27 11:46:26.000000000 +0000 @@ -126,27 +126,27 @@ layout(location=0, index=0) in; // ERROR, not just on in layout(location=0, index=0) out; // ERROR, need a variable layout(location=26, index=0) out indexBlock { int a; } indexBlockI; // ERROR, not on a block - -uniform sampler1D samp1D; -uniform sampler2DShadow samp2Ds; - -void qlod() -{ - vec2 lod; - float pf; - vec2 pf2; - vec3 pf3; - - lod = textureQueryLod(samp1D, pf); // ERROR, not until 400 - lod = textureQueryLod(samp2Ds, pf2); // ERROR, not until 400 -} - -int precise; // okay, not a keyword yet -struct SKeyMem { int precise; } KeyMem; // okay, not a keyword yet - -void fooKeyMem() -{ - KeyMem.precise; -} - + +uniform sampler1D samp1D; +uniform sampler2DShadow samp2Ds; + +void qlod() +{ + vec2 lod; + float pf; + vec2 pf2; + vec3 pf3; + + lod = textureQueryLod(samp1D, pf); // ERROR, not until 400 + lod = textureQueryLod(samp2Ds, pf2); // ERROR, not until 400 +} + +int precise; // okay, not a keyword yet +struct SKeyMem { int precise; } KeyMem; // okay, not a keyword yet + +void fooKeyMem() +{ + KeyMem.precise; +} + layout(location=28, index=2) out vec4 outIndex2; // ERROR index out of range \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/400.frag vulkan-1.1.73+dfsg/external/glslang/Test/400.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/400.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/400.frag 2018-04-27 11:46:26.000000000 +0000 @@ -99,103 +99,103 @@ d = packDouble2x32(u2); u2 = unpackDouble2x32(d); } - -sample in vec4 colorSampIn; -sample out vec4 colorSampleBad; // ERROR -noperspective in vec4 colorfsi; -sample in vec3 sampInArray[4]; -smooth in float scalarIn; -flat centroid in vec2 colorfc; - -struct S { - float x; -}; - -in S s1; -sample S s2; - -void interp() -{ - interpolateAtCentroid(colorfc); - interpolateAtCentroid(colorSampIn); - interpolateAtCentroid(colorfsi); - interpolateAtCentroid(scalarIn); - interpolateAtCentroid(sampInArray); // ERROR - interpolateAtCentroid(sampInArray[2]); - interpolateAtCentroid(sampInArray[2].xy); // ERROR - - interpolateAtSample(sampInArray, 1); // ERROR - interpolateAtSample(sampInArray[i], 0); - interpolateAtSample(s1.x, 2); - interpolateAtSample(scalarIn, 1); - - interpolateAtOffset(sampInArray, vec2(0.2)); // ERROR - interpolateAtOffset(sampInArray[2], vec2(0.2)); - interpolateAtOffset(sampInArray[2].xy, vec2(0.2)); // ERROR, no swizzle - interpolateAtOffset(scalarIn + scalarIn, vec2(0.2)); // ERROR, no binary ops other than dereference - interpolateAtOffset(s2.x, vec2(0.2)); // ERROR - - float f; - interpolateAtCentroid(f); // ERROR, not interpolant - interpolateAtSample(outp, 0); // ERROR, not interpolant -} - -uniform sampler1D samp1D; -uniform isampler2D isamp2D; -uniform usampler3D usamp3D; -uniform samplerCube sampCube; -uniform isampler1DArray isamp1DA; -uniform usampler2DArray usamp2DA; -uniform isamplerCubeArray isampCubeA; - -uniform sampler1DShadow samp1Ds; -uniform sampler2DShadow samp2Ds; -uniform samplerCubeShadow sampCubes; -uniform sampler1DArrayShadow samp1DAs; -uniform sampler2DArrayShadow samp2DAs; -uniform samplerCubeArrayShadow sampCubeAs; - -uniform samplerBuffer sampBuf; -uniform sampler2DRect sampRect; - -void qlod() -{ - vec2 lod; - float pf; - vec2 pf2; - vec3 pf3; - - lod = textureQueryLod(samp1D, pf); - lod = textureQueryLod(isamp2D, pf2); - lod = textureQueryLod(usamp3D, pf3); - lod = textureQueryLod(sampCube, pf3); - lod = textureQueryLod(isamp1DA, pf); - lod = textureQueryLod(usamp2DA, pf2); - lod = textureQueryLod(isampCubeA, pf3); - - lod = textureQueryLod(samp1Ds, pf); - lod = textureQueryLod(samp2Ds, pf2); - lod = textureQueryLod(sampCubes, pf3); - lod = textureQueryLod(samp1DAs, pf); - lod = textureQueryLod(samp2DAs, pf2); - lod = textureQueryLod(sampCubeAs, pf3); - - lod = textureQueryLod(sampBuf, pf); // ERROR - lod = textureQueryLod(sampRect, pf2); // ERROR -} - -uniform uint uu; -out uint iout; - -void bitwiseConv() -{ - iout = uu & i; - iout += uu ^ i; - iout += i | uu; -} - -subroutine(subT1, subT2); -subroutine float subT1() { return 1.0; } -subroutine float subT2() { return 1.0; } - -struct SKeyMem { int precise; } KeyMem; // ERROR, keyword can't be a member + +sample in vec4 colorSampIn; +sample out vec4 colorSampleBad; // ERROR +noperspective in vec4 colorfsi; +sample in vec3 sampInArray[4]; +smooth in float scalarIn; +flat centroid in vec2 colorfc; + +struct S { + float x; +}; + +in S s1; +sample S s2; + +void interp() +{ + interpolateAtCentroid(colorfc); + interpolateAtCentroid(colorSampIn); + interpolateAtCentroid(colorfsi); + interpolateAtCentroid(scalarIn); + interpolateAtCentroid(sampInArray); // ERROR + interpolateAtCentroid(sampInArray[2]); + interpolateAtCentroid(sampInArray[2].xy); // ERROR + + interpolateAtSample(sampInArray, 1); // ERROR + interpolateAtSample(sampInArray[i], 0); + interpolateAtSample(s1.x, 2); + interpolateAtSample(scalarIn, 1); + + interpolateAtOffset(sampInArray, vec2(0.2)); // ERROR + interpolateAtOffset(sampInArray[2], vec2(0.2)); + interpolateAtOffset(sampInArray[2].xy, vec2(0.2)); // ERROR, no swizzle + interpolateAtOffset(scalarIn + scalarIn, vec2(0.2)); // ERROR, no binary ops other than dereference + interpolateAtOffset(s2.x, vec2(0.2)); // ERROR + + float f; + interpolateAtCentroid(f); // ERROR, not interpolant + interpolateAtSample(outp, 0); // ERROR, not interpolant +} + +uniform sampler1D samp1D; +uniform isampler2D isamp2D; +uniform usampler3D usamp3D; +uniform samplerCube sampCube; +uniform isampler1DArray isamp1DA; +uniform usampler2DArray usamp2DA; +uniform isamplerCubeArray isampCubeA; + +uniform sampler1DShadow samp1Ds; +uniform sampler2DShadow samp2Ds; +uniform samplerCubeShadow sampCubes; +uniform sampler1DArrayShadow samp1DAs; +uniform sampler2DArrayShadow samp2DAs; +uniform samplerCubeArrayShadow sampCubeAs; + +uniform samplerBuffer sampBuf; +uniform sampler2DRect sampRect; + +void qlod() +{ + vec2 lod; + float pf; + vec2 pf2; + vec3 pf3; + + lod = textureQueryLod(samp1D, pf); + lod = textureQueryLod(isamp2D, pf2); + lod = textureQueryLod(usamp3D, pf3); + lod = textureQueryLod(sampCube, pf3); + lod = textureQueryLod(isamp1DA, pf); + lod = textureQueryLod(usamp2DA, pf2); + lod = textureQueryLod(isampCubeA, pf3); + + lod = textureQueryLod(samp1Ds, pf); + lod = textureQueryLod(samp2Ds, pf2); + lod = textureQueryLod(sampCubes, pf3); + lod = textureQueryLod(samp1DAs, pf); + lod = textureQueryLod(samp2DAs, pf2); + lod = textureQueryLod(sampCubeAs, pf3); + + lod = textureQueryLod(sampBuf, pf); // ERROR + lod = textureQueryLod(sampRect, pf2); // ERROR +} + +uniform uint uu; +out uint iout; + +void bitwiseConv() +{ + iout = uu & i; + iout += uu ^ i; + iout += i | uu; +} + +subroutine(subT1, subT2); +subroutine float subT1() { return 1.0; } +subroutine float subT2() { return 1.0; } + +struct SKeyMem { int precise; } KeyMem; // ERROR, keyword can't be a member diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/400.geom vulkan-1.1.73+dfsg/external/glslang/Test/400.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/400.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/400.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,330 +1,330 @@ -#version 400 core - -void main() -{ - EmitStreamVertex(1); - EndStreamPrimitive(0); - EmitVertex(); - EndPrimitive(); - int id = gl_InvocationID; -} - -layout(invocations = 4) in outbn { int a; } bn[]; // ERROR, not on a block -layout(max_vertices = 127) out; -layout(invocations = 4) in; - -#extension GL_ARB_separate_shader_objects : enable - -in gl_PerVertex { // testing input arrays with a block redeclaration, see 420.geom for without - vec4 gl_Position; - layout(std140, location = 3) patch float gl_PointSize; // ERRORs... -} gl_in[]; - -void foo() -{ - gl_in.length(); // ERROR - gl_in[1].gl_Position; -} - -in vec4 color[]; -in vec4 color2[]; -in vec4 colorS[3]; -in vec4 colorBad[4]; - -void foo2() -{ - color.length(); // ERROR - colorS.length(); -} - -layout(triangles) in; // give ERROR just for colorBad - -in vec4 color[3]; -in vec4 color2[3]; -in vec4 colorbad2[2]; // ERROR - -void foo3() -{ - gl_in.length(); - color.length(); - color2.length(); - colorS.length(); -} - -layout(location = 4) in vec4 cva[3]; -layout(location = 5) in vec4 cvb[3]; -layout(location = 2) in mat3 cmc[3]; // ERROR, collision - -patch in vec4 patchIn[]; // ERROR -patch out vec4 patchOut; // ERROR - -in float scalar; // ERROR, no array - -layout(max_vertices = 127, invocations = 4) out; // ERROR -layout(invocations = 4, max_vertices = 127) in; // ERROR -layout(max_vertices = 127, invocations = 4) uniform; // 2 ERRORs - -in inblockscalar { - int a; -} inbls; // ERROR, not an array - -in inblocka { - int a; -} inbla[17]; // ERROR, wrong array size - -void bits() -{ - uvec2 u2; - u2 = uaddCarry(u2, u2, u2); - uint u1; - u1 = usubBorrow(u1, u1, u1); - uvec4 u4; - umulExtended(u4, u4, u4, u4); - ivec4 i4; - imulExtended(i4, i4, i4, i4); - int i1; - i1 = bitfieldExtract(i1, 4, 5); - uvec3 u3; - u3 = bitfieldExtract(u3, 4, 5); - ivec3 i3; - i3 = bitfieldInsert(i3, i3, 4, 5); - u1 = bitfieldInsert(u1, u1, 4, 5); - ivec2 i2; - i2 = bitfieldReverse(i2); - u4 = bitfieldReverse(u4); - i1 = bitCount(i1); - i3 = bitCount(u3); - i2 = findLSB(i2); - i4 = findLSB(u4); - i1 = findMSB(i1); - i2 = findMSB(u2); -} - -layout(location = 7, index = 1) out vec4 indexedOut; - -uniform sampler1D samp1D; -uniform sampler2DShadow samp2Ds; - -void qlod() -{ - vec2 lod; - float pf; - vec2 pf2; - vec3 pf3; - - lod = textureQueryLod(samp1D, pf); // ERROR, only in fragment - lod = textureQueryLod(samp2Ds, pf2); // ERROR, only in fragment -} - -void doubles() -{ - double doublev; - dvec2 dvec2v; - dvec3 dvec3v; - dvec4 dvec4v; - - bool boolv; - bvec2 bvec2v; - bvec3 bvec3v; - bvec4 bvec4v; - - doublev = sqrt(2.9); - dvec2v = sqrt(dvec2(2.7)); - dvec3v = sqrt(dvec3(2.0)); - dvec4v = sqrt(dvec4(2.1)); - - doublev += inversesqrt(doublev); - dvec2v += inversesqrt(dvec2v); - dvec3v += inversesqrt(dvec3v); - dvec4v += inversesqrt(dvec4v); - - doublev += abs(doublev); - dvec2v += abs(dvec2v); - dvec3v += abs(dvec3v); - dvec4v += abs(dvec4v); - - doublev += sign(doublev); - dvec2v += sign(dvec2v); - dvec3v += sign(dvec3v); - dvec4v += sign(dvec4v); - - doublev += floor(doublev); - dvec2v += floor(dvec2v); - dvec3v += floor(dvec3v); - dvec4v += floor(dvec4v); - - doublev += trunc(doublev); - dvec2v += trunc(dvec2v); - dvec3v += trunc(dvec3v); - dvec4v += trunc(dvec4v); - - doublev += round(doublev); - dvec2v += round(dvec2v); - dvec3v += round(dvec3v); - dvec4v += round(dvec4v); - - doublev += roundEven(doublev); - dvec2v += roundEven(dvec2v); - dvec3v += roundEven(dvec3v); - dvec4v += roundEven(dvec4v); - - doublev += ceil(doublev); - dvec2v += ceil(dvec2v); - dvec3v += ceil(dvec3v); - dvec4v += ceil(dvec4v); - - doublev += fract(doublev); - dvec2v += fract(dvec2v); - dvec3v += fract(dvec3v); - dvec4v += fract(dvec4v); - - doublev += mod(doublev, doublev); - dvec2v += mod(dvec2v, doublev); - dvec3v += mod(dvec3v, doublev); - dvec4v += mod(dvec4v, doublev); - dvec2v += mod(dvec2v, dvec2v); - dvec3v += mod(dvec3v, dvec3v); - dvec4v += mod(dvec4v, dvec4v); - - doublev += modf(doublev, doublev); - dvec2v += modf(dvec2v, dvec2v); - dvec3v += modf(dvec3v, dvec3v); - dvec4v += modf(dvec4v, dvec4v); - - doublev += min(doublev, doublev); - dvec2v += min(dvec2v, doublev); - dvec3v += min(dvec3v, doublev); - dvec4v += min(dvec4v, doublev); - dvec2v += min(dvec2v, dvec2v); - dvec3v += min(dvec3v, dvec3v); - dvec4v += min(dvec4v, dvec4v); - - doublev += max(doublev, doublev); - dvec2v += max(dvec2v, doublev); - dvec3v += max(dvec3v, doublev); - dvec4v += max(dvec4v, doublev); - dvec2v += max(dvec2v, dvec2v); - dvec3v += max(dvec3v, dvec3v); - dvec4v += max(dvec4v, dvec4v); - - doublev += clamp(doublev, doublev, doublev); - dvec2v += clamp(dvec2v, doublev, doublev); - dvec3v += clamp(dvec3v, doublev, doublev); - dvec4v += clamp(dvec4v, doublev, doublev); - dvec2v += clamp(dvec2v, dvec2v, dvec2v); - dvec3v += clamp(dvec3v, dvec3v, dvec3v); - dvec4v += clamp(dvec4v, dvec4v, dvec4v); - - doublev += mix(doublev, doublev, doublev); - dvec2v += mix(dvec2v, dvec2v, doublev); - dvec3v += mix(dvec3v, dvec3v, doublev); - dvec4v += mix(dvec4v, dvec4v, doublev); - dvec2v += mix(dvec2v, dvec2v, dvec2v); - dvec3v += mix(dvec3v, dvec3v, dvec3v); - dvec4v += mix(dvec4v, dvec4v, dvec4v); - doublev += mix(doublev, doublev, boolv); - dvec2v += mix(dvec2v, dvec2v, bvec2v); - dvec3v += mix(dvec3v, dvec3v, bvec3v); - dvec4v += mix(dvec4v, dvec4v, bvec4v); - - doublev += step(doublev, doublev); - dvec2v += step(dvec2v, dvec2v); - dvec3v += step(dvec3v, dvec3v); - dvec4v += step(dvec4v, dvec4v); - dvec2v += step(doublev, dvec2v); - dvec3v += step(doublev, dvec3v); - dvec4v += step(doublev, dvec4v); - - doublev += smoothstep(doublev, doublev, doublev); - dvec2v += smoothstep(dvec2v, dvec2v, dvec2v); - dvec3v += smoothstep(dvec3v, dvec3v, dvec3v); - dvec4v += smoothstep(dvec4v, dvec4v, dvec4v); - dvec2v += smoothstep(doublev, doublev, dvec2v); - dvec3v += smoothstep(doublev, doublev, dvec3v); - dvec4v += smoothstep(doublev, doublev, dvec4v); - - boolv = isnan(doublev); - bvec2v = isnan(dvec2v); - bvec3v = isnan(dvec3v); - bvec4v = isnan(dvec4v); - - boolv = boolv ? isinf(doublev) : false; - bvec2v = boolv ? isinf(dvec2v) : bvec2(false); - bvec3v = boolv ? isinf(dvec3v) : bvec3(false); - bvec4v = boolv ? isinf(dvec4v) : bvec4(false); - - doublev += length(doublev); - doublev += length(dvec2v); - doublev += length(dvec3v); - doublev += length(dvec4v); - - doublev += distance(doublev, doublev); - doublev += distance(dvec2v, dvec2v); - doublev += distance(dvec3v, dvec3v); - doublev += distance(dvec4v, dvec4v); - - doublev += dot(doublev, doublev); - doublev += dot(dvec2v, dvec2v); - doublev += dot(dvec3v, dvec3v); - doublev += dot(dvec4v, dvec4v); - - dvec3v += cross(dvec3v, dvec3v); - - doublev += normalize(doublev); - dvec2v += normalize(dvec2v); - dvec3v += normalize(dvec3v); - dvec4v += normalize(dvec4v); - - doublev += faceforward(doublev, doublev, doublev); - dvec2v += faceforward(dvec2v, dvec2v, dvec2v); - dvec3v += faceforward(dvec3v, dvec3v, dvec3v); - dvec4v += faceforward(dvec4v, dvec4v, dvec4v); - - doublev += reflect(doublev, doublev); - dvec2v += reflect(dvec2v, dvec2v); - dvec3v += reflect(dvec3v, dvec3v); - dvec4v += reflect(dvec4v, dvec4v); - - doublev += refract(doublev, doublev, doublev); - dvec2v += refract(dvec2v, dvec2v, doublev); - dvec3v += refract(dvec3v, dvec3v, doublev); - dvec4v += refract(dvec4v, dvec4v, doublev); - - dmat2 dmat2v = outerProduct(dvec2v, dvec2v); - dmat3 dmat3v = outerProduct(dvec3v, dvec3v); - dmat4 dmat4v = outerProduct(dvec4v, dvec4v); - dmat2x3 dmat2x3v = outerProduct(dvec3v, dvec2v); - dmat3x2 dmat3x2v = outerProduct(dvec2v, dvec3v); - dmat2x4 dmat2x4v = outerProduct(dvec4v, dvec2v); - dmat4x2 dmat4x2v = outerProduct(dvec2v, dvec4v); - dmat3x4 dmat3x4v = outerProduct(dvec4v, dvec3v); - dmat4x3 dmat4x3v = outerProduct(dvec3v, dvec4v); - +#version 400 core + +void main() +{ + EmitStreamVertex(1); + EndStreamPrimitive(0); + EmitVertex(); + EndPrimitive(); + int id = gl_InvocationID; +} + +layout(invocations = 4) in outbn { int a; } bn[]; // ERROR, not on a block +layout(max_vertices = 127) out; +layout(invocations = 4) in; + +#extension GL_ARB_separate_shader_objects : enable + +in gl_PerVertex { // testing input arrays with a block redeclaration, see 420.geom for without + vec4 gl_Position; + layout(std140, location = 3) patch float gl_PointSize; // ERRORs... +} gl_in[]; + +void foo() +{ + gl_in.length(); // ERROR + gl_in[1].gl_Position; +} + +in vec4 color[]; +in vec4 color2[]; +in vec4 colorS[3]; +in vec4 colorBad[4]; + +void foo2() +{ + color.length(); // ERROR + colorS.length(); +} + +layout(triangles) in; // give ERROR just for colorBad + +in vec4 color[3]; +in vec4 color2[3]; +in vec4 colorbad2[2]; // ERROR + +void foo3() +{ + gl_in.length(); + color.length(); + color2.length(); + colorS.length(); +} + +layout(location = 4) in vec4 cva[3]; +layout(location = 5) in vec4 cvb[3]; +layout(location = 2) in mat3 cmc[3]; // ERROR, collision + +patch in vec4 patchIn[]; // ERROR +patch out vec4 patchOut; // ERROR + +in float scalar; // ERROR, no array + +layout(max_vertices = 127, invocations = 4) out; // ERROR +layout(invocations = 4, max_vertices = 127) in; // ERROR +layout(max_vertices = 127, invocations = 4) uniform; // 2 ERRORs + +in inblockscalar { + int a; +} inbls; // ERROR, not an array + +in inblocka { + int a; +} inbla[17]; // ERROR, wrong array size + +void bits() +{ + uvec2 u2; + u2 = uaddCarry(u2, u2, u2); + uint u1; + u1 = usubBorrow(u1, u1, u1); + uvec4 u4; + umulExtended(u4, u4, u4, u4); + ivec4 i4; + imulExtended(i4, i4, i4, i4); + int i1; + i1 = bitfieldExtract(i1, 4, 5); + uvec3 u3; + u3 = bitfieldExtract(u3, 4, 5); + ivec3 i3; + i3 = bitfieldInsert(i3, i3, 4, 5); + u1 = bitfieldInsert(u1, u1, 4, 5); + ivec2 i2; + i2 = bitfieldReverse(i2); + u4 = bitfieldReverse(u4); + i1 = bitCount(i1); + i3 = bitCount(u3); + i2 = findLSB(i2); + i4 = findLSB(u4); + i1 = findMSB(i1); + i2 = findMSB(u2); +} + +layout(location = 7, index = 1) out vec4 indexedOut; + +uniform sampler1D samp1D; +uniform sampler2DShadow samp2Ds; + +void qlod() +{ + vec2 lod; + float pf; + vec2 pf2; + vec3 pf3; + + lod = textureQueryLod(samp1D, pf); // ERROR, only in fragment + lod = textureQueryLod(samp2Ds, pf2); // ERROR, only in fragment +} + +void doubles() +{ + double doublev; + dvec2 dvec2v; + dvec3 dvec3v; + dvec4 dvec4v; + + bool boolv; + bvec2 bvec2v; + bvec3 bvec3v; + bvec4 bvec4v; + + doublev = sqrt(2.9); + dvec2v = sqrt(dvec2(2.7)); + dvec3v = sqrt(dvec3(2.0)); + dvec4v = sqrt(dvec4(2.1)); + + doublev += inversesqrt(doublev); + dvec2v += inversesqrt(dvec2v); + dvec3v += inversesqrt(dvec3v); + dvec4v += inversesqrt(dvec4v); + + doublev += abs(doublev); + dvec2v += abs(dvec2v); + dvec3v += abs(dvec3v); + dvec4v += abs(dvec4v); + + doublev += sign(doublev); + dvec2v += sign(dvec2v); + dvec3v += sign(dvec3v); + dvec4v += sign(dvec4v); + + doublev += floor(doublev); + dvec2v += floor(dvec2v); + dvec3v += floor(dvec3v); + dvec4v += floor(dvec4v); + + doublev += trunc(doublev); + dvec2v += trunc(dvec2v); + dvec3v += trunc(dvec3v); + dvec4v += trunc(dvec4v); + + doublev += round(doublev); + dvec2v += round(dvec2v); + dvec3v += round(dvec3v); + dvec4v += round(dvec4v); + + doublev += roundEven(doublev); + dvec2v += roundEven(dvec2v); + dvec3v += roundEven(dvec3v); + dvec4v += roundEven(dvec4v); + + doublev += ceil(doublev); + dvec2v += ceil(dvec2v); + dvec3v += ceil(dvec3v); + dvec4v += ceil(dvec4v); + + doublev += fract(doublev); + dvec2v += fract(dvec2v); + dvec3v += fract(dvec3v); + dvec4v += fract(dvec4v); + + doublev += mod(doublev, doublev); + dvec2v += mod(dvec2v, doublev); + dvec3v += mod(dvec3v, doublev); + dvec4v += mod(dvec4v, doublev); + dvec2v += mod(dvec2v, dvec2v); + dvec3v += mod(dvec3v, dvec3v); + dvec4v += mod(dvec4v, dvec4v); + + doublev += modf(doublev, doublev); + dvec2v += modf(dvec2v, dvec2v); + dvec3v += modf(dvec3v, dvec3v); + dvec4v += modf(dvec4v, dvec4v); + + doublev += min(doublev, doublev); + dvec2v += min(dvec2v, doublev); + dvec3v += min(dvec3v, doublev); + dvec4v += min(dvec4v, doublev); + dvec2v += min(dvec2v, dvec2v); + dvec3v += min(dvec3v, dvec3v); + dvec4v += min(dvec4v, dvec4v); + + doublev += max(doublev, doublev); + dvec2v += max(dvec2v, doublev); + dvec3v += max(dvec3v, doublev); + dvec4v += max(dvec4v, doublev); + dvec2v += max(dvec2v, dvec2v); + dvec3v += max(dvec3v, dvec3v); + dvec4v += max(dvec4v, dvec4v); + + doublev += clamp(doublev, doublev, doublev); + dvec2v += clamp(dvec2v, doublev, doublev); + dvec3v += clamp(dvec3v, doublev, doublev); + dvec4v += clamp(dvec4v, doublev, doublev); + dvec2v += clamp(dvec2v, dvec2v, dvec2v); + dvec3v += clamp(dvec3v, dvec3v, dvec3v); + dvec4v += clamp(dvec4v, dvec4v, dvec4v); + + doublev += mix(doublev, doublev, doublev); + dvec2v += mix(dvec2v, dvec2v, doublev); + dvec3v += mix(dvec3v, dvec3v, doublev); + dvec4v += mix(dvec4v, dvec4v, doublev); + dvec2v += mix(dvec2v, dvec2v, dvec2v); + dvec3v += mix(dvec3v, dvec3v, dvec3v); + dvec4v += mix(dvec4v, dvec4v, dvec4v); + doublev += mix(doublev, doublev, boolv); + dvec2v += mix(dvec2v, dvec2v, bvec2v); + dvec3v += mix(dvec3v, dvec3v, bvec3v); + dvec4v += mix(dvec4v, dvec4v, bvec4v); + + doublev += step(doublev, doublev); + dvec2v += step(dvec2v, dvec2v); + dvec3v += step(dvec3v, dvec3v); + dvec4v += step(dvec4v, dvec4v); + dvec2v += step(doublev, dvec2v); + dvec3v += step(doublev, dvec3v); + dvec4v += step(doublev, dvec4v); + + doublev += smoothstep(doublev, doublev, doublev); + dvec2v += smoothstep(dvec2v, dvec2v, dvec2v); + dvec3v += smoothstep(dvec3v, dvec3v, dvec3v); + dvec4v += smoothstep(dvec4v, dvec4v, dvec4v); + dvec2v += smoothstep(doublev, doublev, dvec2v); + dvec3v += smoothstep(doublev, doublev, dvec3v); + dvec4v += smoothstep(doublev, doublev, dvec4v); + + boolv = isnan(doublev); + bvec2v = isnan(dvec2v); + bvec3v = isnan(dvec3v); + bvec4v = isnan(dvec4v); + + boolv = boolv ? isinf(doublev) : false; + bvec2v = boolv ? isinf(dvec2v) : bvec2(false); + bvec3v = boolv ? isinf(dvec3v) : bvec3(false); + bvec4v = boolv ? isinf(dvec4v) : bvec4(false); + + doublev += length(doublev); + doublev += length(dvec2v); + doublev += length(dvec3v); + doublev += length(dvec4v); + + doublev += distance(doublev, doublev); + doublev += distance(dvec2v, dvec2v); + doublev += distance(dvec3v, dvec3v); + doublev += distance(dvec4v, dvec4v); + + doublev += dot(doublev, doublev); + doublev += dot(dvec2v, dvec2v); + doublev += dot(dvec3v, dvec3v); + doublev += dot(dvec4v, dvec4v); + + dvec3v += cross(dvec3v, dvec3v); + + doublev += normalize(doublev); + dvec2v += normalize(dvec2v); + dvec3v += normalize(dvec3v); + dvec4v += normalize(dvec4v); + + doublev += faceforward(doublev, doublev, doublev); + dvec2v += faceforward(dvec2v, dvec2v, dvec2v); + dvec3v += faceforward(dvec3v, dvec3v, dvec3v); + dvec4v += faceforward(dvec4v, dvec4v, dvec4v); + + doublev += reflect(doublev, doublev); + dvec2v += reflect(dvec2v, dvec2v); + dvec3v += reflect(dvec3v, dvec3v); + dvec4v += reflect(dvec4v, dvec4v); + + doublev += refract(doublev, doublev, doublev); + dvec2v += refract(dvec2v, dvec2v, doublev); + dvec3v += refract(dvec3v, dvec3v, doublev); + dvec4v += refract(dvec4v, dvec4v, doublev); + + dmat2 dmat2v = outerProduct(dvec2v, dvec2v); + dmat3 dmat3v = outerProduct(dvec3v, dvec3v); + dmat4 dmat4v = outerProduct(dvec4v, dvec4v); + dmat2x3 dmat2x3v = outerProduct(dvec3v, dvec2v); + dmat3x2 dmat3x2v = outerProduct(dvec2v, dvec3v); + dmat2x4 dmat2x4v = outerProduct(dvec4v, dvec2v); + dmat4x2 dmat4x2v = outerProduct(dvec2v, dvec4v); + dmat3x4 dmat3x4v = outerProduct(dvec4v, dvec3v); + dmat4x3 dmat4x3v = outerProduct(dvec3v, dvec4v); + dmat2v *= matrixCompMult(dmat2v, dmat2v); dmat3v *= matrixCompMult(dmat3v, dmat3v); dmat4v *= matrixCompMult(dmat4v, dmat4v); - dmat2x3v = matrixCompMult(dmat2x3v, dmat2x3v); - dmat2x4v = matrixCompMult(dmat2x4v, dmat2x4v); - dmat3x2v = matrixCompMult(dmat3x2v, dmat3x2v); - dmat3x4v = matrixCompMult(dmat3x4v, dmat3x4v); - dmat4x2v = matrixCompMult(dmat4x2v, dmat4x2v); - dmat4x3v = matrixCompMult(dmat4x3v, dmat4x3v); - - dmat2v *= transpose(dmat2v); - dmat3v *= transpose(dmat3v); - dmat4v *= transpose(dmat4v); - dmat2x3v = transpose(dmat3x2v); - dmat3x2v = transpose(dmat2x3v); - dmat2x4v = transpose(dmat4x2v); - dmat4x2v = transpose(dmat2x4v); - dmat3x4v = transpose(dmat4x3v); - dmat4x3v = transpose(dmat3x4v); - - doublev += determinant(dmat2v); - doublev += determinant(dmat3v); - doublev += determinant(dmat4v); - - dmat2v *= inverse(dmat2v); - dmat3v *= inverse(dmat3v); - dmat4v *= inverse(dmat4v); -} + dmat2x3v = matrixCompMult(dmat2x3v, dmat2x3v); + dmat2x4v = matrixCompMult(dmat2x4v, dmat2x4v); + dmat3x2v = matrixCompMult(dmat3x2v, dmat3x2v); + dmat3x4v = matrixCompMult(dmat3x4v, dmat3x4v); + dmat4x2v = matrixCompMult(dmat4x2v, dmat4x2v); + dmat4x3v = matrixCompMult(dmat4x3v, dmat4x3v); + + dmat2v *= transpose(dmat2v); + dmat3v *= transpose(dmat3v); + dmat4v *= transpose(dmat4v); + dmat2x3v = transpose(dmat3x2v); + dmat3x2v = transpose(dmat2x3v); + dmat2x4v = transpose(dmat4x2v); + dmat4x2v = transpose(dmat2x4v); + dmat3x4v = transpose(dmat4x3v); + dmat4x3v = transpose(dmat3x4v); + + doublev += determinant(dmat2v); + doublev += determinant(dmat3v); + doublev += determinant(dmat4v); + + dmat2v *= inverse(dmat2v); + dmat3v *= inverse(dmat3v); + dmat4v *= inverse(dmat4v); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/400.tesc vulkan-1.1.73+dfsg/external/glslang/Test/400.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/400.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/400.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,108 +1,108 @@ -#version 400 core - -layout(vertices = 4) out; -int outa[gl_out.length()]; - -layout(quads) in; // ERROR -layout(ccw) out; // ERROR -layout(fractional_even_spacing) in; // ERROR - -patch in vec4 patchIn; // ERROR -patch out vec4 patchOut; - -void main() -{ - barrier(); - - int a = gl_MaxTessControlInputComponents + - gl_MaxTessControlOutputComponents + - gl_MaxTessControlTextureImageUnits + - gl_MaxTessControlUniformComponents + - gl_MaxTessControlTotalOutputComponents; - - vec4 p = gl_in[1].gl_Position; - float ps = gl_in[1].gl_PointSize; - float cd = gl_in[1].gl_ClipDistance[2]; - - int pvi = gl_PatchVerticesIn; - int pid = gl_PrimitiveID; - int iid = gl_InvocationID; - - gl_out[gl_InvocationID].gl_Position = p; - gl_out[gl_InvocationID].gl_PointSize = ps; - gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; - - gl_TessLevelOuter[3] = 3.2; - gl_TessLevelInner[1] = 1.3; - - if (a > 10) - barrier(); // ERROR - else - barrier(); // ERROR - - barrier(); - - do { - barrier(); // ERROR - } while (a > 10); - - switch (a) { - default: - barrier(); // ERROR - break; - } - a < 12 ? a : (barrier(), a); // ERROR - { - barrier(); - } - - return; - - barrier(); // ERROR -} - -layout(vertices = 4) in; // ERROR -layout(vertices = 5) out; // ERROR - -void foo() -{ - gl_out[4].gl_PointSize; // ERROR - - barrier(); // ERROR -} - -in vec2 ina; // ERROR, not array -in vec2 inb[]; -in vec2 inc[18]; // ERROR, wrong size -in vec2 ind[gl_MaxPatchVertices]; - -#extension GL_ARB_separate_shader_objects : enable - -layout(location = 3) in vec4 ivla[]; -layout(location = 4) in vec4 ivlb[]; -layout(location = 4) in vec4 ivlc[]; // ERROR, overlapping - -layout(location = 3) out vec4 ovla[]; -layout(location = 4) out vec4 ovlb[]; -layout(location = 4) out vec4 ovlc[]; // ERROR, overlapping - -precise vec3 pv3; - -void foop() -{ - precise double d; - - pv3 *= pv3; - pv3 = fma(pv3, pv3, pv3); - d = fma(d, d, d); -} - -patch out pinbn { - int a; -} pinbi; - -invariant precise out vec4 badOrder[]; // ERROR, precise must appear first -void badp(out precise float f); // ERROR, precise must appear first +#version 400 core + +layout(vertices = 4) out; +int outa[gl_out.length()]; + +layout(quads) in; // ERROR +layout(ccw) out; // ERROR +layout(fractional_even_spacing) in; // ERROR + +patch in vec4 patchIn; // ERROR +patch out vec4 patchOut; + +void main() +{ + barrier(); + + int a = gl_MaxTessControlInputComponents + + gl_MaxTessControlOutputComponents + + gl_MaxTessControlTextureImageUnits + + gl_MaxTessControlUniformComponents + + gl_MaxTessControlTotalOutputComponents; + + vec4 p = gl_in[1].gl_Position; + float ps = gl_in[1].gl_PointSize; + float cd = gl_in[1].gl_ClipDistance[2]; + + int pvi = gl_PatchVerticesIn; + int pid = gl_PrimitiveID; + int iid = gl_InvocationID; + + gl_out[gl_InvocationID].gl_Position = p; + gl_out[gl_InvocationID].gl_PointSize = ps; + gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; + + gl_TessLevelOuter[3] = 3.2; + gl_TessLevelInner[1] = 1.3; + + if (a > 10) + barrier(); // ERROR + else + barrier(); // ERROR + + barrier(); + + do { + barrier(); // ERROR + } while (a > 10); + + switch (a) { + default: + barrier(); // ERROR + break; + } + a < 12 ? a : (barrier(), a); // ERROR + { + barrier(); + } + + return; + + barrier(); // ERROR +} + +layout(vertices = 4) in; // ERROR +layout(vertices = 5) out; // ERROR + +void foo() +{ + gl_out[4].gl_PointSize; // ERROR + + barrier(); // ERROR +} + +in vec2 ina; // ERROR, not array +in vec2 inb[]; +in vec2 inc[18]; // ERROR, wrong size +in vec2 ind[gl_MaxPatchVertices]; + +#extension GL_ARB_separate_shader_objects : enable + +layout(location = 3) in vec4 ivla[]; +layout(location = 4) in vec4 ivlb[]; +layout(location = 4) in vec4 ivlc[]; // ERROR, overlapping + +layout(location = 3) out vec4 ovla[]; +layout(location = 4) out vec4 ovlb[]; +layout(location = 4) out vec4 ovlc[]; // ERROR, overlapping + +precise vec3 pv3; + +void foop() +{ + precise double d; + + pv3 *= pv3; + pv3 = fma(pv3, pv3, pv3); + d = fma(d, d, d); +} + +patch out pinbn { + int a; +} pinbi; + +invariant precise out vec4 badOrder[]; // ERROR, precise must appear first +void badp(out precise float f); // ERROR, precise must appear first void devi() { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/400.tese vulkan-1.1.73+dfsg/external/glslang/Test/400.tese --- vulkan-1.1.70+dfsg1/external/glslang/Test/400.tese 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/400.tese 2018-04-27 11:46:26.000000000 +0000 @@ -1,108 +1,108 @@ -#version 400 core - -layout(vertices = 4) out; // ERROR -layout(quads, cw) in; -layout(triangles) in; // ERROR -layout(isolines) in; // ERROR - -layout(ccw) in; // ERROR -layout(cw) in; - -layout(fractional_odd_spacing) in; -layout(equal_spacing) in; // ERROR -layout(fractional_even_spacing) in; // ERROR - -layout(point_mode) in; - -patch in vec4 patchIn; -patch out vec4 patchOut; // ERROR - -void main() -{ - barrier(); // ERROR - - int a = gl_MaxTessEvaluationInputComponents + - gl_MaxTessEvaluationOutputComponents + - gl_MaxTessEvaluationTextureImageUnits + - gl_MaxTessEvaluationUniformComponents + - gl_MaxTessPatchComponents + - gl_MaxPatchVertices + - gl_MaxTessGenLevel; - - vec4 p = gl_in[1].gl_Position; - float ps = gl_in[1].gl_PointSize; - float cd = gl_in[1].gl_ClipDistance[2]; - - int pvi = gl_PatchVerticesIn; - int pid = gl_PrimitiveID; - vec3 tc = gl_TessCoord; - float tlo = gl_TessLevelOuter[3]; - float tli = gl_TessLevelInner[1]; - - gl_Position = p; - gl_PointSize = ps; - gl_ClipDistance[2] = cd; -} - -smooth patch in vec4 badp1; // ERROR -flat patch in vec4 badp2; // ERROR -noperspective patch in vec4 badp3; // ERROR -patch sample in vec3 badp4; // ERROR - -#extension GL_ARB_separate_shader_objects : enable - -in gl_PerVertex // ERROR, no size -{ - float gl_ClipDistance[1]; -} gl_in[]; - -in gl_PerVertex // ERROR, second redeclaration of gl_in -{ - float gl_ClipDistance[1]; -} gl_in[]; - -layout(quads, cw) out; // ERROR -layout(triangles) out; // ERROR -layout(isolines) out; // ERROR -layout(cw) out; // ERROR -layout(fractional_odd_spacing) out; // ERROR -layout(equal_spacing) out; // ERROR -layout(fractional_even_spacing) out; // ERROR -layout(point_mode) out; // ERROR - -in vec2 ina; // ERROR, not array -in vec2 inb[]; -in vec2 inc[18]; // ERROR, wrong size -in vec2 ind[gl_MaxPatchVertices]; - -in testbla { - int f; -} bla; // ERROR, not array - -in testblb { - int f; -} blb[]; - -in testblc { - int f; -} blc[18]; // ERROR wrong size - -in testbld { - int f; -} bld[gl_MaxPatchVertices]; - -layout(location = 23) in vec4 ivla[]; -layout(location = 24) in vec4 ivlb[]; -layout(location = 24) in vec4 ivlc[]; // ERROR - -layout(location = 23) out vec4 ovla[2]; -layout(location = 24) out vec4 ovlb[2]; // ERROR - -in float gl_TessLevelOuter[4]; // ERROR, can't redeclare - -patch in pinbn { - int a; -} pinbi; +#version 400 core + +layout(vertices = 4) out; // ERROR +layout(quads, cw) in; +layout(triangles) in; // ERROR +layout(isolines) in; // ERROR + +layout(ccw) in; // ERROR +layout(cw) in; + +layout(fractional_odd_spacing) in; +layout(equal_spacing) in; // ERROR +layout(fractional_even_spacing) in; // ERROR + +layout(point_mode) in; + +patch in vec4 patchIn; +patch out vec4 patchOut; // ERROR + +void main() +{ + barrier(); // ERROR + + int a = gl_MaxTessEvaluationInputComponents + + gl_MaxTessEvaluationOutputComponents + + gl_MaxTessEvaluationTextureImageUnits + + gl_MaxTessEvaluationUniformComponents + + gl_MaxTessPatchComponents + + gl_MaxPatchVertices + + gl_MaxTessGenLevel; + + vec4 p = gl_in[1].gl_Position; + float ps = gl_in[1].gl_PointSize; + float cd = gl_in[1].gl_ClipDistance[2]; + + int pvi = gl_PatchVerticesIn; + int pid = gl_PrimitiveID; + vec3 tc = gl_TessCoord; + float tlo = gl_TessLevelOuter[3]; + float tli = gl_TessLevelInner[1]; + + gl_Position = p; + gl_PointSize = ps; + gl_ClipDistance[2] = cd; +} + +smooth patch in vec4 badp1; // ERROR +flat patch in vec4 badp2; // ERROR +noperspective patch in vec4 badp3; // ERROR +patch sample in vec3 badp4; // ERROR + +#extension GL_ARB_separate_shader_objects : enable + +in gl_PerVertex // ERROR, no size +{ + float gl_ClipDistance[1]; +} gl_in[]; + +in gl_PerVertex // ERROR, second redeclaration of gl_in +{ + float gl_ClipDistance[1]; +} gl_in[]; + +layout(quads, cw) out; // ERROR +layout(triangles) out; // ERROR +layout(isolines) out; // ERROR +layout(cw) out; // ERROR +layout(fractional_odd_spacing) out; // ERROR +layout(equal_spacing) out; // ERROR +layout(fractional_even_spacing) out; // ERROR +layout(point_mode) out; // ERROR + +in vec2 ina; // ERROR, not array +in vec2 inb[]; +in vec2 inc[18]; // ERROR, wrong size +in vec2 ind[gl_MaxPatchVertices]; + +in testbla { + int f; +} bla; // ERROR, not array + +in testblb { + int f; +} blb[]; + +in testblc { + int f; +} blc[18]; // ERROR wrong size + +in testbld { + int f; +} bld[gl_MaxPatchVertices]; + +layout(location = 23) in vec4 ivla[]; +layout(location = 24) in vec4 ivlb[]; +layout(location = 24) in vec4 ivlc[]; // ERROR + +layout(location = 23) out vec4 ovla[2]; +layout(location = 24) out vec4 ovlb[2]; // ERROR + +in float gl_TessLevelOuter[4]; // ERROR, can't redeclare + +patch in pinbn { + int a; +} pinbi; void devi() { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/400.vert vulkan-1.1.73+dfsg/external/glslang/Test/400.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/400.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/400.vert 2018-04-27 11:46:26.000000000 +0000 @@ -5,90 +5,90 @@ in dmat4 dm4; // ERROR, no doubles // function selection under type conversion -void foo1(double a, uint b) {} -void foo1(double a, int b) {} -void foo1(double a, float b) {} -void foo1(double a, double b){} - -void foo2(double a, float b) {} -void foo2(double a, double b){} - -void foo3(double a, float b) {} -void foo3(float a, double b) {} - -void ftd( int, float, double) {} -void ftd( uint, float, double) {} -void ftd(float, double, double) {} - -void main() -{ - double d; - uint u; - int i; - float f; - - foo1(d, d); - foo1(d, u); - foo1(d, i); - foo1(d, f); - - foo1(f, d); - foo1(f, u); - foo1(f, i); - foo1(f, f); - - foo1(u, d); - foo1(u, u); - foo1(u, i); - foo1(u, f); - - foo1(i, d); - foo1(i, u); - foo1(i, i); - foo1(i, f); - - foo2(d, d); - foo2(d, u); - foo2(d, i); - foo2(d, f); - - foo2(f, d); - foo2(f, u); - foo2(f, i); - foo2(f, f); - - foo2(u, d); - foo2(u, u); - foo2(u, i); - foo2(u, f); - - foo2(i, d); - foo2(i, u); - foo2(i, i); - foo2(i, f); - - foo3(d, d); // ERROR, no match - foo3(d, u); - foo3(d, i); - foo3(d, f); - - foo3(f, d); - foo3(f, u); // ERROR, ambiguous - foo3(f, i); // ERROR, ambiguous - foo3(f, f); // ERROR, ambiguous - - foo3(u, d); - foo3(u, u); // ERROR, ambiguous - foo3(u, i); // ERROR, ambiguous - foo3(u, f); // ERROR, ambiguous - - foo3(i, d); - foo3(i, u); // ERROR, ambiguous - foo3(i, i); // ERROR, ambiguous - foo3(i, f); // ERROR, ambiguous - - ftd(i, f, f); - ftd(u, f, f); +void foo1(double a, uint b) {} +void foo1(double a, int b) {} +void foo1(double a, float b) {} +void foo1(double a, double b){} + +void foo2(double a, float b) {} +void foo2(double a, double b){} + +void foo3(double a, float b) {} +void foo3(float a, double b) {} + +void ftd( int, float, double) {} +void ftd( uint, float, double) {} +void ftd(float, double, double) {} + +void main() +{ + double d; + uint u; + int i; + float f; + + foo1(d, d); + foo1(d, u); + foo1(d, i); + foo1(d, f); + + foo1(f, d); + foo1(f, u); + foo1(f, i); + foo1(f, f); + + foo1(u, d); + foo1(u, u); + foo1(u, i); + foo1(u, f); + + foo1(i, d); + foo1(i, u); + foo1(i, i); + foo1(i, f); + + foo2(d, d); + foo2(d, u); + foo2(d, i); + foo2(d, f); + + foo2(f, d); + foo2(f, u); + foo2(f, i); + foo2(f, f); + + foo2(u, d); + foo2(u, u); + foo2(u, i); + foo2(u, f); + + foo2(i, d); + foo2(i, u); + foo2(i, i); + foo2(i, f); + + foo3(d, d); // ERROR, no match + foo3(d, u); + foo3(d, i); + foo3(d, f); + + foo3(f, d); + foo3(f, u); // ERROR, ambiguous + foo3(f, i); // ERROR, ambiguous + foo3(f, f); // ERROR, ambiguous + + foo3(u, d); + foo3(u, u); // ERROR, ambiguous + foo3(u, i); // ERROR, ambiguous + foo3(u, f); // ERROR, ambiguous + + foo3(i, d); + foo3(i, u); // ERROR, ambiguous + foo3(i, i); // ERROR, ambiguous + foo3(i, f); // ERROR, ambiguous + + ftd(i, f, f); + ftd(u, f, f); } void itf(int, float, int); @@ -96,10 +96,10 @@ void tf() { - double d; - uint u; - int i; - float f; + double d; + uint u; + int i; + float f; itf(i, i, i); itf(i, u, i); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/410.geom vulkan-1.1.73+dfsg/external/glslang/Test/410.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/410.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/410.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,39 +1,39 @@ -#version 410 core - -void main() -{ - gl_ViewportIndex = 7; -} - -in gl_PerVertex { - float gl_PointSize; -} myIn[]; // ERROR, can't redeclare a different name - -in gl_PerVertex { - float gl_PointSize; -} gl_myIn[]; // ERROR, can't redeclare a different name - -in gl_PerVertex { - float gl_PointSize; -} gl_in[]; - -in gl_PerVertex { - float gl_PointSize; -} gl_in[]; // ERROR, can't do it again - -out gl_PerVertex { - float gl_PointSize; -}; - -void foo() -{ - float p = gl_in[1].gl_PointSize; // use of redeclared - gl_PointSize = p; // use of redeclared - vec4 v = gl_in[1].gl_Position; // ERROR, not included in the redeclaration - gl_Position = vec4(1.0); // ERROR, not included in the redeclaration -} - -float foo5() -{ - return 4; // implicit conversion of return type -} +#version 410 core + +void main() +{ + gl_ViewportIndex = 7; +} + +in gl_PerVertex { + float gl_PointSize; +} myIn[]; // ERROR, can't redeclare a different name + +in gl_PerVertex { + float gl_PointSize; +} gl_myIn[]; // ERROR, can't redeclare a different name + +in gl_PerVertex { + float gl_PointSize; +} gl_in[]; + +in gl_PerVertex { + float gl_PointSize; +} gl_in[]; // ERROR, can't do it again + +out gl_PerVertex { + float gl_PointSize; +}; + +void foo() +{ + float p = gl_in[1].gl_PointSize; // use of redeclared + gl_PointSize = p; // use of redeclared + vec4 v = gl_in[1].gl_Position; // ERROR, not included in the redeclaration + gl_Position = vec4(1.0); // ERROR, not included in the redeclaration +} + +float foo5() +{ + return 4; // implicit conversion of return type +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/410.tesc vulkan-1.1.73+dfsg/external/glslang/Test/410.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/410.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/410.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,11 +1,11 @@ -#version 400 core - -// no layout(vertices = ...) out; -int outa[gl_out.length()]; // ERROR - -patch out vec4 patchOut; - -void main() -{ - -} +#version 400 core + +// no layout(vertices = ...) out; +int outa[gl_out.length()]; // ERROR + +patch out vec4 patchOut; + +void main() +{ + +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/420.comp vulkan-1.1.73+dfsg/external/glslang/Test/420.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/420.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/420.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,30 +1,30 @@ -#version 420 - -layout(local_size_x = 2) in; // ERROR, no compute - -#extension GL_ARB_compute_shader : enable - -layout(local_size_x = 2, local_size_y = 4, local_size_z = 6) in; - -shared vec3 sfoo; - -void main() -{ - sfoo = vec3(gl_WorkGroupSize.x, gl_WorkGroupSize.y, gl_WorkGroupSize.z); - sfoo += gl_WorkGroupSize + gl_NumWorkGroups + gl_WorkGroupID + gl_LocalInvocationID + gl_GlobalInvocationID; - sfoo *= gl_LocalInvocationIndex; - sfoo += gl_MaxComputeWorkGroupCount + gl_MaxComputeWorkGroupSize; - sfoo *= gl_MaxComputeUniformComponents + - gl_MaxComputeTextureImageUnits + - gl_MaxComputeImageUniforms + - gl_MaxComputeAtomicCounters + - gl_MaxComputeAtomicCounterBuffers; - - barrier(); - memoryBarrier(); - memoryBarrierAtomicCounter(); - memoryBarrierBuffer(); - memoryBarrierImage(); - memoryBarrierShared(); - groupMemoryBarrier(); +#version 420 + +layout(local_size_x = 2) in; // ERROR, no compute + +#extension GL_ARB_compute_shader : enable + +layout(local_size_x = 2, local_size_y = 4, local_size_z = 6) in; + +shared vec3 sfoo; + +void main() +{ + sfoo = vec3(gl_WorkGroupSize.x, gl_WorkGroupSize.y, gl_WorkGroupSize.z); + sfoo += gl_WorkGroupSize + gl_NumWorkGroups + gl_WorkGroupID + gl_LocalInvocationID + gl_GlobalInvocationID; + sfoo *= gl_LocalInvocationIndex; + sfoo += gl_MaxComputeWorkGroupCount + gl_MaxComputeWorkGroupSize; + sfoo *= gl_MaxComputeUniformComponents + + gl_MaxComputeTextureImageUnits + + gl_MaxComputeImageUniforms + + gl_MaxComputeAtomicCounters + + gl_MaxComputeAtomicCounterBuffers; + + barrier(); + memoryBarrier(); + memoryBarrierAtomicCounter(); + memoryBarrierBuffer(); + memoryBarrierImage(); + memoryBarrierShared(); + groupMemoryBarrier(); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/420.geom vulkan-1.1.73+dfsg/external/glslang/Test/420.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/420.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/420.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,55 +1,55 @@ -#version 420 core - -// testing input arrays without a gl_in[] block redeclaration, see 400.geom for with - -int i; - -void foo() -{ - gl_in.length(); // ERROR - gl_in[1].gl_Position; - gl_in[i].gl_Position; // ERROR -} - -layout(triangles) in; - -in vec4 color3[3]; - -void foo3() -{ - gl_in.length(); - gl_in[i].gl_Position; - color3.length(); -} - -uniform sampler2D s2D; -in vec2 coord[]; -uniform vec4 v4; - -void foo4() -{ - const ivec2 offsets[5] = - { - ivec2(0,1), - ivec2(1,-2), - ivec2(0,3), - ivec2(-3,0), - ivec2(2,1) - }; - - vec4 v = textureGatherOffset(s2D, coord[0], offsets[i].xy); - - offsets[i].xy = ivec2(3); // ERROR - v4.x = 3.2; // ERROR - v4.xy; // should have non-uniform type -} - -out gl_PerVertex { - float gl_PointSize[1]; // ERROR, adding array - float gl_ClipDistance; // ERROR, removing array -}; - -float foo5() -{ - return i; // implicit conversion of return type -} +#version 420 core + +// testing input arrays without a gl_in[] block redeclaration, see 400.geom for with + +int i; + +void foo() +{ + gl_in.length(); // ERROR + gl_in[1].gl_Position; + gl_in[i].gl_Position; // ERROR +} + +layout(triangles) in; + +in vec4 color3[3]; + +void foo3() +{ + gl_in.length(); + gl_in[i].gl_Position; + color3.length(); +} + +uniform sampler2D s2D; +in vec2 coord[]; +uniform vec4 v4; + +void foo4() +{ + const ivec2 offsets[5] = + { + ivec2(0,1), + ivec2(1,-2), + ivec2(0,3), + ivec2(-3,0), + ivec2(2,1) + }; + + vec4 v = textureGatherOffset(s2D, coord[0], offsets[i].xy); + + offsets[i].xy = ivec2(3); // ERROR + v4.x = 3.2; // ERROR + v4.xy; // should have non-uniform type +} + +out gl_PerVertex { + float gl_PointSize[1]; // ERROR, adding array + float gl_ClipDistance; // ERROR, removing array +}; + +float foo5() +{ + return i; // implicit conversion of return type +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/420_size_gl_in.geom vulkan-1.1.73+dfsg/external/glslang/Test/420_size_gl_in.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/420_size_gl_in.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/420_size_gl_in.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,21 +1,21 @@ -#version 420 core - -// testing input arrays without a gl_in[] block redeclaration, see 400.geom for with - -int i; - -layout(triangles) in; -in vec4 colorun[]; -in vec4 color3[3]; - -void foo() -{ - gl_in.length(); - gl_in[1].gl_Position; - gl_in.length(); - gl_in[i].gl_Position; // should be sized to 3 by 'triangles' -} - -in gl_PerVertex { // ERROR, already used - vec4 gl_Position; -} gl_in[]; +#version 420 core + +// testing input arrays without a gl_in[] block redeclaration, see 400.geom for with + +int i; + +layout(triangles) in; +in vec4 colorun[]; +in vec4 color3[3]; + +void foo() +{ + gl_in.length(); + gl_in[1].gl_Position; + gl_in.length(); + gl_in[i].gl_Position; // should be sized to 3 by 'triangles' +} + +in gl_PerVertex { // ERROR, already used + vec4 gl_Position; +} gl_in[]; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/420.tesc vulkan-1.1.73+dfsg/external/glslang/Test/420.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/420.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/420.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,43 +1,43 @@ -#version 420 core - -#extension GL_ARB_separate_shader_objects : enable - -layout(vertices = 4) out; - -out gl_PerVertex { - vec4 gl_Position; -} gl_out[3]; // ERROR, wrong size - -out int a[gl_out.length()]; -out int outb[5]; // ERROR, wrong size -out int outc[]; - -void main() -{ - vec4 p = gl_in[1].gl_Position; - float ps = gl_in[1].gl_PointSize; - float cd = gl_in[1].gl_ClipDistance[2]; - - int pvi = gl_PatchVerticesIn; - int pid = gl_PrimitiveID; - int iid = gl_InvocationID; - - gl_out[gl_InvocationID].gl_Position = p; - gl_out[gl_InvocationID].gl_PointSize = ps; // ERROR -} - -out float outf; // ERROR, no array - -layout (location = 0) in dmat2x4 vs_tcs_first[]; -layout (location = 12) in dmat2x4 vs_tcs_last[]; - -void foo() -{ - if ((dmat2x4(dvec4(-0.625, -0.5, -0.375lf, -0.25), dvec4(-0.375, -0.25, -0.125, 0)) != vs_tcs_first[0]) || - (dmat2x4(dvec4(0.375, 0.5, 0.625, 0.75), dvec4(0.625, 0.75, 0.875, -0.625)) != vs_tcs_last[0])) - { - ; - } -} - -layout(vertices = 0) out; // ERROR, can't be 0 +#version 420 core + +#extension GL_ARB_separate_shader_objects : enable + +layout(vertices = 4) out; + +out gl_PerVertex { + vec4 gl_Position; +} gl_out[3]; // ERROR, wrong size + +out int a[gl_out.length()]; +out int outb[5]; // ERROR, wrong size +out int outc[]; + +void main() +{ + vec4 p = gl_in[1].gl_Position; + float ps = gl_in[1].gl_PointSize; + float cd = gl_in[1].gl_ClipDistance[2]; + + int pvi = gl_PatchVerticesIn; + int pid = gl_PrimitiveID; + int iid = gl_InvocationID; + + gl_out[gl_InvocationID].gl_Position = p; + gl_out[gl_InvocationID].gl_PointSize = ps; // ERROR +} + +out float outf; // ERROR, no array + +layout (location = 0) in dmat2x4 vs_tcs_first[]; +layout (location = 12) in dmat2x4 vs_tcs_last[]; + +void foo() +{ + if ((dmat2x4(dvec4(-0.625, -0.5, -0.375lf, -0.25), dvec4(-0.375, -0.25, -0.125, 0)) != vs_tcs_first[0]) || + (dmat2x4(dvec4(0.375, 0.5, 0.625, 0.75), dvec4(0.625, 0.75, 0.875, -0.625)) != vs_tcs_last[0])) + { + ; + } +} + +layout(vertices = 0) out; // ERROR, can't be 0 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/420.tese vulkan-1.1.73+dfsg/external/glslang/Test/420.tese --- vulkan-1.1.70+dfsg1/external/glslang/Test/420.tese 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/420.tese 2018-04-27 11:46:26.000000000 +0000 @@ -1,90 +1,90 @@ -#version 420 core - -const mat2x2 a = mat2( vec2( 1.0, 0.0 ), vec2( 0.0, 1.0 ) ); -mat2x2 b = { vec2( 1.0, 0.0 ), vec2( 0.0, 1.0 ) }; -const mat2x2 c = { { 1.0, 0.0, }, { 0.0, 1.0 } }; - -float a2[2] = { 3.4, 4.2, 5.0 }; // illegal -vec2 b2 = { 1.0, 2.0, 3.0 }; // illegal -mat3x3 c2 = { vec3(0.0), vec3(1.0), vec3(2.0), vec3(3.0) }; // illegal -mat2x2 d = { 1.0, 0.0, 0.0, 1.0 }; // illegal, can't flatten nesting - -struct { - float a; - int b; -} e = { 1.2, 2, }; - -struct { - float a; - int b; -} e2 = { 1, 3 }; // legal, first initializer is converted - -struct { - float a; - int b; -} e3 = { 1.2, 2, 3 }; // illegal - -int a3 = true; // illegal -vec4 b3[2] = { vec4(0.0), 1.0 }; // illegal -vec4 b4[2] = vec4[2](vec4(0.0), mat2x2(1.0)); // illegal -mat4x2 c3 = { vec3(0.0), vec3(1.0) }; // illegal - -struct S1 { - vec4 a; - vec4 b; -}; - -struct { - float s; - float t; -} d2[] = { S1(vec4(0.0), vec4(1.1)) }; // illegal - -float b5[] = { 3.4, 4.2, 5.0, 5.2, 1.1 }; - -struct S3 { - float f; - mat2x3 m23; -}; - -struct S4 { - uvec2 uv2; - S3 s[2]; -}; - -struct Single1 { int f; }; -Single1 single1 = { 10 }; - -struct Single2 { uvec2 v; }; -Single2 single2 = { { 1, 2 } }; - -struct Single3 { Single1 s1; }; -Single3 single3 = { { 3 } }; - -struct Single4 { Single2 s1; }; -Single4 single4 = { { { 4u, 5u } } }; - -const S4 constructed = S4(uvec2(1, 2), - S3[2](S3(3.0, mat2x3(4.0)), - S3(5.0, mat2x3(6.0)))); - -const S4 curlybad1 = { {1, 2}, - { {3, {4.0, 0, 0.0}, {0.0, 4.0, 0.0 } }, // ERROR, the mat2x3 isn't isolated - {5.0, {6, 0.0, 0.0}, {0.0, 6.0, 0.0 } } } }; - -const S4 curlyInit = { {1, 2}, - { {3, { {4.0, 0, 0.0}, {0.0, 4.0, 0.0 } } }, - {5.0, { {6, 0.0, 0.0}, {0.0, 6.0, 0.0 } } } } }; - -float vc1, vc2, vc3; -vec3 av3 = vec3(vc1, vc2, vc3); -vec3 bv3 = { vc1, vc2, vc3 }; - -void main() -{ - memoryBarrier(); - - if (constructed == curlybad1) - ; - if (constructed == curlyInit) - ; -} +#version 420 core + +const mat2x2 a = mat2( vec2( 1.0, 0.0 ), vec2( 0.0, 1.0 ) ); +mat2x2 b = { vec2( 1.0, 0.0 ), vec2( 0.0, 1.0 ) }; +const mat2x2 c = { { 1.0, 0.0, }, { 0.0, 1.0 } }; + +float a2[2] = { 3.4, 4.2, 5.0 }; // illegal +vec2 b2 = { 1.0, 2.0, 3.0 }; // illegal +mat3x3 c2 = { vec3(0.0), vec3(1.0), vec3(2.0), vec3(3.0) }; // illegal +mat2x2 d = { 1.0, 0.0, 0.0, 1.0 }; // illegal, can't flatten nesting + +struct { + float a; + int b; +} e = { 1.2, 2, }; + +struct { + float a; + int b; +} e2 = { 1, 3 }; // legal, first initializer is converted + +struct { + float a; + int b; +} e3 = { 1.2, 2, 3 }; // illegal + +int a3 = true; // illegal +vec4 b3[2] = { vec4(0.0), 1.0 }; // illegal +vec4 b4[2] = vec4[2](vec4(0.0), mat2x2(1.0)); // illegal +mat4x2 c3 = { vec3(0.0), vec3(1.0) }; // illegal + +struct S1 { + vec4 a; + vec4 b; +}; + +struct { + float s; + float t; +} d2[] = { S1(vec4(0.0), vec4(1.1)) }; // illegal + +float b5[] = { 3.4, 4.2, 5.0, 5.2, 1.1 }; + +struct S3 { + float f; + mat2x3 m23; +}; + +struct S4 { + uvec2 uv2; + S3 s[2]; +}; + +struct Single1 { int f; }; +Single1 single1 = { 10 }; + +struct Single2 { uvec2 v; }; +Single2 single2 = { { 1, 2 } }; + +struct Single3 { Single1 s1; }; +Single3 single3 = { { 3 } }; + +struct Single4 { Single2 s1; }; +Single4 single4 = { { { 4u, 5u } } }; + +const S4 constructed = S4(uvec2(1, 2), + S3[2](S3(3.0, mat2x3(4.0)), + S3(5.0, mat2x3(6.0)))); + +const S4 curlybad1 = { {1, 2}, + { {3, {4.0, 0, 0.0}, {0.0, 4.0, 0.0 } }, // ERROR, the mat2x3 isn't isolated + {5.0, {6, 0.0, 0.0}, {0.0, 6.0, 0.0 } } } }; + +const S4 curlyInit = { {1, 2}, + { {3, { {4.0, 0, 0.0}, {0.0, 4.0, 0.0 } } }, + {5.0, { {6, 0.0, 0.0}, {0.0, 6.0, 0.0 } } } } }; + +float vc1, vc2, vc3; +vec3 av3 = vec3(vc1, vc2, vc3); +vec3 bv3 = { vc1, vc2, vc3 }; + +void main() +{ + memoryBarrier(); + + if (constructed == curlybad1) + ; + if (constructed == curlyInit) + ; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/420.vert vulkan-1.1.73+dfsg/external/glslang/Test/420.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/420.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/420.vert 2018-04-27 11:46:26.000000000 +0000 @@ -147,15 +147,15 @@ layout(offset = 16) int foo; // ERROR } offcheckI; -uniform sampler1D samp1D; -uniform sampler1DShadow samp1Ds; - -void qlod() -{ - int levels; - - levels = textureQueryLevels(samp1D); // ERROR, not until 430 - levels = textureQueryLevels(samp1Ds); // ERROR, not until 430 -} - -layout(binding=0) writeonly uniform image1D badArray[]; +uniform sampler1D samp1D; +uniform sampler1DShadow samp1Ds; + +void qlod() +{ + int levels; + + levels = textureQueryLevels(samp1D); // ERROR, not until 430 + levels = textureQueryLevels(samp1Ds); // ERROR, not until 430 +} + +layout(binding=0) writeonly uniform image1D badArray[]; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/430AofA.frag vulkan-1.1.73+dfsg/external/glslang/Test/430AofA.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/430AofA.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/430AofA.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,108 +1,108 @@ -#version 430 - -float[4][5][6] many[1][2][3]; - -float gu[][7]; -float gimp[][]; // ERROR, implicit inner -float g4[4][7]; -float g5[5][7]; - -float[4][7] foo(float a[5][7]) -{ - float r[7]; - r = a[2]; - float[](a[0], a[1], r, a[3]); // ERROR, too few dims - float[4][7][4](a[0], a[1], r, a[3]); // ERROR, too many dims - return float[4][7](a[0], a[1], r, a[3]); - return float[][](a[0], a[1], r, a[3]); - return float[][7](a[0], a[1], a[2], a[3]); -} - -void bar(float[5][7]) {} - -void main() -{ - { - float gu[3][4][2]; - - gu[2][4][1] = 4.0; // ERROR, overflow - } - vec4 ca4[3][2] = vec4[][](vec4[2](vec4(0.0), vec4(1.0)), - vec4[2](vec4(0.0), vec4(1.0)), - vec4[2](vec4(0.0), vec4(1.0))); - vec4 caim[][2] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0))); - vec4 caim2[][] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0))); - vec4 caim3[3][] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0))); - - vec4 a4[3][2] = {vec4[](vec4(0.0), vec4(1.0)), - vec4[2](vec4(0.0), vec4(1.0)), - vec4[2](vec4(0.0), vec4(1.0)) }; - vec4 aim[][2] = {vec4[2](vec4(4.0), vec4(2.0)), - vec4[](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0)) }; - vec4 aim2[][] = {vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0)), - vec4[](vec4(4.0), vec4(2.0)) }; - vec4 aim3[3][] = {vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0)) }; - - vec4 bad2[3][] = {vec4[2](vec4(4.0), vec4(2.0)), // ERROR - vec4[3](vec4(4.0), vec4(2.0), vec4(5.0)), - vec4[2](vec4(4.0), vec4(2.0)) }; - - vec4 bad3[3][] = {vec4[3](vec4(4.0), vec4(2.0), vec4(5.0)), // ERROR - vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0)) }; - - vec4 bad4[4][] = {vec4[2](vec4(4.0), vec4(2.0)), // ERROR - vec4[2](vec4(4.0), vec4(2.0)), - vec4[2](vec4(4.0), vec4(2.0)) }; - - - g4 = foo(g5); - g5 = g4; // ERROR, wrong types - gu = g4; // ERROR, not yet sized - - foo(gu); // ERROR, not yet sized - bar(g5); - - if (foo(g5) == g4) - ; - if (foo(g5) == g5) // ERROR, different types - ; - - float u[][7]; - u[2][2] = 3.0; - float u[5][7]; - u[5][2] = 5.0; // ERROR - foo(u); -} - -void foo3() -{ - float resize1[][5][7]; - resize1.length(); // ERROR - resize1[1][4][5] = 2.0; - resize1.length(); // ERROR - float resize1[3][5][7]; - resize1.length(); // 3 in AST - resize1[1].length(); // 5 in AST - resize1[1][1].length(); // 7 in AST - resize1[1][1][1].length(); // ERROR - - float resize2[][5][7]; - float resize2[3][4][7]; // ERROR, inner dim change - - float resize3[][5][7]; - float resize3[3][5][9]; // ERROR, inner dim changed - - float resize4[][5][7]; - int resize4[3][5][7]; // ERROR, element type -} +#version 430 + +float[4][5][6] many[1][2][3]; + +float gu[][7]; +float gimp[][]; // ERROR, implicit inner +float g4[4][7]; +float g5[5][7]; + +float[4][7] foo(float a[5][7]) +{ + float r[7]; + r = a[2]; + float[](a[0], a[1], r, a[3]); // ERROR, too few dims + float[4][7][4](a[0], a[1], r, a[3]); // ERROR, too many dims + return float[4][7](a[0], a[1], r, a[3]); + return float[][](a[0], a[1], r, a[3]); + return float[][7](a[0], a[1], a[2], a[3]); +} + +void bar(float[5][7]) {} + +void main() +{ + { + float gu[3][4][2]; + + gu[2][4][1] = 4.0; // ERROR, overflow + } + vec4 ca4[3][2] = vec4[][](vec4[2](vec4(0.0), vec4(1.0)), + vec4[2](vec4(0.0), vec4(1.0)), + vec4[2](vec4(0.0), vec4(1.0))); + vec4 caim[][2] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0))); + vec4 caim2[][] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0))); + vec4 caim3[3][] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0))); + + vec4 a4[3][2] = {vec4[](vec4(0.0), vec4(1.0)), + vec4[2](vec4(0.0), vec4(1.0)), + vec4[2](vec4(0.0), vec4(1.0)) }; + vec4 aim[][2] = {vec4[2](vec4(4.0), vec4(2.0)), + vec4[](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0)) }; + vec4 aim2[][] = {vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0)), + vec4[](vec4(4.0), vec4(2.0)) }; + vec4 aim3[3][] = {vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0)) }; + + vec4 bad2[3][] = {vec4[2](vec4(4.0), vec4(2.0)), // ERROR + vec4[3](vec4(4.0), vec4(2.0), vec4(5.0)), + vec4[2](vec4(4.0), vec4(2.0)) }; + + vec4 bad3[3][] = {vec4[3](vec4(4.0), vec4(2.0), vec4(5.0)), // ERROR + vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0)) }; + + vec4 bad4[4][] = {vec4[2](vec4(4.0), vec4(2.0)), // ERROR + vec4[2](vec4(4.0), vec4(2.0)), + vec4[2](vec4(4.0), vec4(2.0)) }; + + + g4 = foo(g5); + g5 = g4; // ERROR, wrong types + gu = g4; // ERROR, not yet sized + + foo(gu); // ERROR, not yet sized + bar(g5); + + if (foo(g5) == g4) + ; + if (foo(g5) == g5) // ERROR, different types + ; + + float u[][7]; + u[2][2] = 3.0; + float u[5][7]; + u[5][2] = 5.0; // ERROR + foo(u); +} + +void foo3() +{ + float resize1[][5][7]; + resize1.length(); // ERROR + resize1[1][4][5] = 2.0; + resize1.length(); // ERROR + float resize1[3][5][7]; + resize1.length(); // 3 in AST + resize1[1].length(); // 5 in AST + resize1[1][1].length(); // 7 in AST + resize1[1][1][1].length(); // ERROR + + float resize2[][5][7]; + float resize2[3][4][7]; // ERROR, inner dim change + + float resize3[][5][7]; + float resize3[3][5][9]; // ERROR, inner dim changed + + float resize4[][5][7]; + int resize4[3][5][7]; // ERROR, element type +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/430.comp vulkan-1.1.73+dfsg/external/glslang/Test/430.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/430.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/430.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,87 +1,87 @@ -#version 430 core - -layout(local_size_x = 2) in; -layout(local_size_x = 16) in; // ERROR, changing -layout(local_size_z = 4096) in; // ERROR, too large -layout(local_size_x = 2) in; - -const int total = gl_MaxComputeWorkGroupCount.y - + gl_MaxComputeUniformComponents - + gl_MaxComputeTextureImageUnits - + gl_MaxComputeImageUniforms - + gl_MaxComputeAtomicCounters - + gl_MaxComputeAtomicCounterBuffers; - -buffer ShaderStorageBlock -{ - int value; - float values[]; -}; - -buffer InvalidShaderStorageBlock -{ - float values[]; - int value; -} invalid; - -void main() -{ - barrier(); - memoryBarrier(); - memoryBarrierAtomicCounter(); - memoryBarrierBuffer(); - memoryBarrierShared(); - memoryBarrierImage(); - groupMemoryBarrier(); - value = int(values[gl_LocalInvocationIndex]); - - int a; - if (a > 10) - barrier(); -} - -layout(location = 2) in vec3 v3; // ERROR -in float f; // ERROR -out float fo; // ERROR - -shared vec4 s; -layout(location = 2) shared vec4 sl; // ERROR -shared float fs = 4.2; // ERROR - -layout(local_size_x = 2, local_size_y = 3, local_size_z = 4) out; // ERROR - -int arrX[gl_WorkGroupSize.x]; -int arrY[gl_WorkGroupSize.y]; -int arrZ[gl_WorkGroupSize.z]; - -readonly buffer roblock -{ - int value; - float values[]; -} ro; - -void foo() -{ - ro.values[2] = 4.7; // ERROR, readonly - ro.values.length(); - barrier(); -} - -uniform double roll; -uniform writeonly image2D destTex; -void fooaoeu() { - ivec2 storePos = ivec2(gl_GlobalInvocationID.xy); - double localCoef = length(vec2(ivec2(gl_LocalInvocationID.xy)-8)/8.0); - dvec4 aa = dvec4(0.4, 0.2, 0.3, 0.4); - double globalCoef = 1.0; - int i = globalCoef; // ERROR, can't convert from double to int - double di = i; -} - -in inb { // ERROR - int a; -} inbi; - -out outb { // ERROR - int a; -} outbi; +#version 430 core + +layout(local_size_x = 2) in; +layout(local_size_x = 16) in; // ERROR, changing +layout(local_size_z = 4096) in; // ERROR, too large +layout(local_size_x = 2) in; + +const int total = gl_MaxComputeWorkGroupCount.y + + gl_MaxComputeUniformComponents + + gl_MaxComputeTextureImageUnits + + gl_MaxComputeImageUniforms + + gl_MaxComputeAtomicCounters + + gl_MaxComputeAtomicCounterBuffers; + +buffer ShaderStorageBlock +{ + int value; + float values[]; +}; + +buffer InvalidShaderStorageBlock +{ + float values[]; + int value; +} invalid; + +void main() +{ + barrier(); + memoryBarrier(); + memoryBarrierAtomicCounter(); + memoryBarrierBuffer(); + memoryBarrierShared(); + memoryBarrierImage(); + groupMemoryBarrier(); + value = int(values[gl_LocalInvocationIndex]); + + int a; + if (a > 10) + barrier(); +} + +layout(location = 2) in vec3 v3; // ERROR +in float f; // ERROR +out float fo; // ERROR + +shared vec4 s; +layout(location = 2) shared vec4 sl; // ERROR +shared float fs = 4.2; // ERROR + +layout(local_size_x = 2, local_size_y = 3, local_size_z = 4) out; // ERROR + +int arrX[gl_WorkGroupSize.x]; +int arrY[gl_WorkGroupSize.y]; +int arrZ[gl_WorkGroupSize.z]; + +readonly buffer roblock +{ + int value; + float values[]; +} ro; + +void foo() +{ + ro.values[2] = 4.7; // ERROR, readonly + ro.values.length(); + barrier(); +} + +uniform double roll; +uniform writeonly image2D destTex; +void fooaoeu() { + ivec2 storePos = ivec2(gl_GlobalInvocationID.xy); + double localCoef = length(vec2(ivec2(gl_LocalInvocationID.xy)-8)/8.0); + dvec4 aa = dvec4(0.4, 0.2, 0.3, 0.4); + double globalCoef = 1.0; + int i = globalCoef; // ERROR, can't convert from double to int + double di = i; +} + +in inb { // ERROR + int a; +} inbi; + +out outb { // ERROR + int a; +} outbi; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/430.vert vulkan-1.1.73+dfsg/external/glslang/Test/430.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/430.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/430.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,223 +1,223 @@ -#version 430 core - -layout(location = 3) vec4 v4; // ERROR - -layout(location = 4) uniform vec4 uv4; - -layout(location = 2) in inb1 { vec4 v; } b1; // ERROR -layout(location = 2) out outb1 { vec4 v; } b2; // ERROR - -out gl_PerVertex { - float gl_ClipDistance[]; -}; - -void foo() -{ - gl_ClipDistance[2] = 3.7; -} - -struct sp { - highp float f; - in float g; // ERROR - uniform float h; // ERROR - invariant float i; // ERROR - volatile float j; // ERROR - layout(row_major) mat3 m3; // ERROR -}; - -void foo3(invariant vec4 v4, // ERROR - volatile vec3 v3, - layout(location = 3) vec2 v2, // ERROR - centroid vec3 cv3) // ERROR -{ -} - -struct S { - mat3x2 m[7]; // needs 7*3 locations - float f; // needs 1 location -}; // needs 22 locations - -layout(location = 10) out S cs[2]; // 10 through 10 + 2 * 22 - 1 = 53 -layout(location = 54) out float cf; -layout(location = 53) out float cg; // ERROR, collision at 31 - -layout(location = 10) in vec4 alias1; -layout(location = 10) in vec4 alias2; // okay for vertex input on desktop - -out float gl_ClipDistance[17]; // ERROR, size too big - -// enhanced_layouts (most tests are in 440.*) - -layout(location = start*start - 2 - 4) in vec4 v6e; // ERROR - -layout(location = 28) in inblock2e { - layout(location = 25) float f2; // ERROR -} ininst2e; - -in ublock4e { - layout(location = 50) float f1; // ERROR - layout(location = 51) float f2; // ERROR -} in4e; - -layout(align=16, std140) uniform ubl4e { int a; } inst4e;// ERROR - -layout(align=32) uniform ubl9e { // ERROR - layout(offset=12, align=4) float f; // ERROR - layout(offset=20) float g; // ERROR -} inst9e; - -layout(std140) uniform blocke { - vec4 a; - layout(offset = 32) vec3 b; // ERROR -} spinste; - -int aconste[gl_MaxTransformFeedbackBuffers]; // ERROR -int bconste[gl_MaxTransformFeedbackInterleavedComponents]; // ERROR - -out bblck2 { - layout(xfb_offset=64) vec4 bbv; // ERROR -} bbinst2; - -layout(xfb_buffer = 3, xfb_stride = 64) out; // ERROR - -layout(xfb_buffer=2, xfb_offset=48, xfb_stride=80) out vec4 bge; // ERROR -layout( xfb_offset=32, xfb_stride=64) out vec4 bhe; // ERROR - -layout(xfb_stride=80, xfb_buffer=2, xfb_offset=16) out bblck4e { // ERROR - vec4 bbv1; - vec4 bbv2; -} bbinst4e; - -out bblck5e { - layout(xfb_offset=0) vec4 bbv1; // ERROR - layout(xfb_stride=64, xfb_buffer=3, xfb_offset=48) vec4 bbv2; // ERROR -} bbinst5e; - -#extension GL_ARB_enhanced_layouts : enable - -layout(align=16, std140) uniform ubl4 { int a; } inst4; -layout(std430) uniform; - -layout(align=32) uniform ubl9 { - layout(offset=12, align=4) float f; - layout(offset=20) float g; -} inst9; - -layout(std140) uniform block { - vec4 a; // a takes offsets 0-15 - layout(offset = 32) vec3 b; // b takes offsets 32-43 -} spinst; - -int aconst[gl_MaxTransformFeedbackBuffers]; -int bconst[gl_MaxTransformFeedbackInterleavedComponents]; - -const int start2 = 5; -layout(location = start2 * start2 - 2 - 4) in vec4 v6; - -layout(location = 28) in inblock2 { // ERROR, input block in vertex shader, other errors are valid checks still... - bool b1; - float f1; - layout(location = 25) float f2; -} ininst2; - -in ublock4 { // ERROR, input block in vertex shader, other errors are valid checks still... - layout(location = 50) float f1; - layout(location = 51) float f2; -} in4; - -out bblck2g { - layout(xfb_offset=64) vec4 bbv; -} bbinst2g; - -layout(xfb_buffer = 1, xfb_stride = 80) out; // default buffer is 3 - -layout(xfb_buffer=1, xfb_offset=48, xfb_stride=80) out vec4 bg; -layout( xfb_offset=32, xfb_stride=80) out vec4 bh; - -layout(xfb_stride=80, xfb_buffer=1, xfb_offset=16) out bblck4 { - vec4 bbv1; -} bbinst4; - -out bblck5 { - layout(xfb_offset=0) vec4 bbv1; - layout(xfb_stride=80, xfb_buffer=1, xfb_offset=64) vec4 bbv2; -} bbinst5; - -shared vec4 sharedv; // ERROR - -void fooBarrier() -{ - barrier(); // ERROR - memoryBarrier(); - memoryBarrierAtomicCounter(); - memoryBarrierBuffer(); - memoryBarrierShared(); // ERROR - memoryBarrierImage(); - groupMemoryBarrier(); // ERROR -} - -buffer vec4 v; // ERROR - -uniform sampler2DMS s2dms; -uniform usampler2DMSArray us2dmsa; -layout(rgba32i) uniform iimage2DMS ii2dms; -layout(rgba32f) uniform image2DMSArray i2dmsa; - -void fooq() -{ - int s = textureSamples(s2dms); // ERROR - s += textureSamples(us2dmsa); // ERROR - s += imageSamples(ii2dms); // ERROR - s += imageSamples(i2dmsa); // ERROR -} - -#extension GL_ARB_shader_texture_image_samples : enable - -void fooq2() -{ - int s = textureSamples(s2dms); - s += textureSamples(us2dmsa); - s += imageSamples(ii2dms); - s += imageSamples(i2dmsa); -} - -uniform sampler1D samp1D; -uniform usampler2D usamp2D; -uniform isampler3D isamp3D; -uniform isamplerCube isampCube; -uniform isampler1DArray isamp1DA; -uniform sampler2DArray samp2DA; -uniform usamplerCubeArray usampCubeA; - -uniform sampler1DShadow samp1Ds; -uniform sampler2DShadow samp2Ds; -uniform samplerCubeShadow sampCubes; -uniform sampler1DArrayShadow samp1DAs; -uniform sampler2DArrayShadow samp2DAs; -uniform samplerCubeArrayShadow sampCubeAs; - -uniform samplerBuffer sampBuf; -uniform sampler2DRect sampRect; - -void qlod() -{ - int levels; - - levels = textureQueryLevels(samp1D); - levels = textureQueryLevels(usamp2D); - levels = textureQueryLevels(isamp3D); - levels = textureQueryLevels(isampCube); - levels = textureQueryLevels(isamp1DA); - levels = textureQueryLevels(samp2DA); - levels = textureQueryLevels(usampCubeA); - - levels = textureQueryLevels(samp1Ds); - levels = textureQueryLevels(samp2Ds); - levels = textureQueryLevels(sampCubes); - levels = textureQueryLevels(samp1DAs); - levels = textureQueryLevels(samp2DAs); - levels = textureQueryLevels(sampCubeAs); - - levels = textureQueryLevels(sampBuf); // ERROR - levels = textureQueryLevels(sampRect); // ERROR -} +#version 430 core + +layout(location = 3) vec4 v4; // ERROR + +layout(location = 4) uniform vec4 uv4; + +layout(location = 2) in inb1 { vec4 v; } b1; // ERROR +layout(location = 2) out outb1 { vec4 v; } b2; // ERROR + +out gl_PerVertex { + float gl_ClipDistance[]; +}; + +void foo() +{ + gl_ClipDistance[2] = 3.7; +} + +struct sp { + highp float f; + in float g; // ERROR + uniform float h; // ERROR + invariant float i; // ERROR + volatile float j; // ERROR + layout(row_major) mat3 m3; // ERROR +}; + +void foo3(invariant vec4 v4, // ERROR + volatile vec3 v3, + layout(location = 3) vec2 v2, // ERROR + centroid vec3 cv3) // ERROR +{ +} + +struct S { + mat3x2 m[7]; // needs 7*3 locations + float f; // needs 1 location +}; // needs 22 locations + +layout(location = 10) out S cs[2]; // 10 through 10 + 2 * 22 - 1 = 53 +layout(location = 54) out float cf; +layout(location = 53) out float cg; // ERROR, collision at 31 + +layout(location = 10) in vec4 alias1; +layout(location = 10) in vec4 alias2; // okay for vertex input on desktop + +out float gl_ClipDistance[17]; // ERROR, size too big + +// enhanced_layouts (most tests are in 440.*) + +layout(location = start*start - 2 - 4) in vec4 v6e; // ERROR + +layout(location = 28) in inblock2e { + layout(location = 25) float f2; // ERROR +} ininst2e; + +in ublock4e { + layout(location = 50) float f1; // ERROR + layout(location = 51) float f2; // ERROR +} in4e; + +layout(align=16, std140) uniform ubl4e { int a; } inst4e;// ERROR + +layout(align=32) uniform ubl9e { // ERROR + layout(offset=12, align=4) float f; // ERROR + layout(offset=20) float g; // ERROR +} inst9e; + +layout(std140) uniform blocke { + vec4 a; + layout(offset = 32) vec3 b; // ERROR +} spinste; + +int aconste[gl_MaxTransformFeedbackBuffers]; // ERROR +int bconste[gl_MaxTransformFeedbackInterleavedComponents]; // ERROR + +out bblck2 { + layout(xfb_offset=64) vec4 bbv; // ERROR +} bbinst2; + +layout(xfb_buffer = 3, xfb_stride = 64) out; // ERROR + +layout(xfb_buffer=2, xfb_offset=48, xfb_stride=80) out vec4 bge; // ERROR +layout( xfb_offset=32, xfb_stride=64) out vec4 bhe; // ERROR + +layout(xfb_stride=80, xfb_buffer=2, xfb_offset=16) out bblck4e { // ERROR + vec4 bbv1; + vec4 bbv2; +} bbinst4e; + +out bblck5e { + layout(xfb_offset=0) vec4 bbv1; // ERROR + layout(xfb_stride=64, xfb_buffer=3, xfb_offset=48) vec4 bbv2; // ERROR +} bbinst5e; + +#extension GL_ARB_enhanced_layouts : enable + +layout(align=16, std140) uniform ubl4 { int a; } inst4; +layout(std430) uniform; + +layout(align=32) uniform ubl9 { + layout(offset=12, align=4) float f; + layout(offset=20) float g; +} inst9; + +layout(std140) uniform block { + vec4 a; // a takes offsets 0-15 + layout(offset = 32) vec3 b; // b takes offsets 32-43 +} spinst; + +int aconst[gl_MaxTransformFeedbackBuffers]; +int bconst[gl_MaxTransformFeedbackInterleavedComponents]; + +const int start2 = 5; +layout(location = start2 * start2 - 2 - 4) in vec4 v6; + +layout(location = 28) in inblock2 { // ERROR, input block in vertex shader, other errors are valid checks still... + bool b1; + float f1; + layout(location = 25) float f2; +} ininst2; + +in ublock4 { // ERROR, input block in vertex shader, other errors are valid checks still... + layout(location = 50) float f1; + layout(location = 51) float f2; +} in4; + +out bblck2g { + layout(xfb_offset=64) vec4 bbv; +} bbinst2g; + +layout(xfb_buffer = 1, xfb_stride = 80) out; // default buffer is 3 + +layout(xfb_buffer=1, xfb_offset=48, xfb_stride=80) out vec4 bg; +layout( xfb_offset=32, xfb_stride=80) out vec4 bh; + +layout(xfb_stride=80, xfb_buffer=1, xfb_offset=16) out bblck4 { + vec4 bbv1; +} bbinst4; + +out bblck5 { + layout(xfb_offset=0) vec4 bbv1; + layout(xfb_stride=80, xfb_buffer=1, xfb_offset=64) vec4 bbv2; +} bbinst5; + +shared vec4 sharedv; // ERROR + +void fooBarrier() +{ + barrier(); // ERROR + memoryBarrier(); + memoryBarrierAtomicCounter(); + memoryBarrierBuffer(); + memoryBarrierShared(); // ERROR + memoryBarrierImage(); + groupMemoryBarrier(); // ERROR +} + +buffer vec4 v; // ERROR + +uniform sampler2DMS s2dms; +uniform usampler2DMSArray us2dmsa; +layout(rgba32i) uniform iimage2DMS ii2dms; +layout(rgba32f) uniform image2DMSArray i2dmsa; + +void fooq() +{ + int s = textureSamples(s2dms); // ERROR + s += textureSamples(us2dmsa); // ERROR + s += imageSamples(ii2dms); // ERROR + s += imageSamples(i2dmsa); // ERROR +} + +#extension GL_ARB_shader_texture_image_samples : enable + +void fooq2() +{ + int s = textureSamples(s2dms); + s += textureSamples(us2dmsa); + s += imageSamples(ii2dms); + s += imageSamples(i2dmsa); +} + +uniform sampler1D samp1D; +uniform usampler2D usamp2D; +uniform isampler3D isamp3D; +uniform isamplerCube isampCube; +uniform isampler1DArray isamp1DA; +uniform sampler2DArray samp2DA; +uniform usamplerCubeArray usampCubeA; + +uniform sampler1DShadow samp1Ds; +uniform sampler2DShadow samp2Ds; +uniform samplerCubeShadow sampCubes; +uniform sampler1DArrayShadow samp1DAs; +uniform sampler2DArrayShadow samp2DAs; +uniform samplerCubeArrayShadow sampCubeAs; + +uniform samplerBuffer sampBuf; +uniform sampler2DRect sampRect; + +void qlod() +{ + int levels; + + levels = textureQueryLevels(samp1D); + levels = textureQueryLevels(usamp2D); + levels = textureQueryLevels(isamp3D); + levels = textureQueryLevels(isampCube); + levels = textureQueryLevels(isamp1DA); + levels = textureQueryLevels(samp2DA); + levels = textureQueryLevels(usampCubeA); + + levels = textureQueryLevels(samp1Ds); + levels = textureQueryLevels(samp2Ds); + levels = textureQueryLevels(sampCubes); + levels = textureQueryLevels(samp1DAs); + levels = textureQueryLevels(samp2DAs); + levels = textureQueryLevels(sampCubeAs); + + levels = textureQueryLevels(sampBuf); // ERROR + levels = textureQueryLevels(sampRect); // ERROR +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/435.vert vulkan-1.1.73+dfsg/external/glslang/Test/435.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/435.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/435.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,2 +1,2 @@ -#version 435 +#version 435 void main() {} \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/440.frag vulkan-1.1.73+dfsg/external/glslang/Test/440.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/440.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/440.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,153 +1,153 @@ -#version 440 - -// Note 'location'-only tests for enhanced layouts are in 330.frag -// Generic 'component' tests are in 440.vert - -// a consumes components 2 and 3 of location 4 -layout(location = 4, component = 2) in vec2 a; - -// b consumes component 1 of location 4 -layout(location = 4, component = 1) in float b; -layout(location = 4, component = 2) in vec2 h; // ERROR, component overlap not okay for fragment in - -layout(location = 3, component = 2) in vec3 c; // ERROR: c overflows components 2 and 3 - -// e consumes beginning (components 0, 1 and 2) of each of 6 slots -layout(location = 20, component = 0) in vec3 e[6]; - -// f consumes last component of the same 6 slots -layout(location = 20, component = 3) in float f[6]; - -layout(location = 30, component = 3) out int be; -layout(location = 30, component = 0) out vec3 bf; // ERROR, not the same basic type - -writeonly uniform; // ERROR -readonly in; // ERROR -flat out; // ERROR -mediump uniform; - -layout(offset=12) uniform; // ERROR -layout(offset=12) in; // ERROR -layout(offset=12) out; // ERROR - -layout(align=16) uniform; // ERROR -layout(align=16) in; // ERROR -layout(align=16) out; // ERROR - -layout(offset=12) uniform ubl1 { int a; } inst1; // ERROR -layout(offset=12) in inbl2 { int a; } inst2; // ERROR -layout(offset=12) out inbl3 { int a; } inst3; // ERROR - -layout(align=16, std140) uniform ubl4 { int a; } inst4; -layout(align=16) uniform ubl8 { int a; } inst8; // ERROR, no packing -layout(align=16) in inbl5 { int a; } inst5; // ERROR -layout(align=16) out inbl6 { int a; } inst6; // ERROR - -layout(offset=12) uniform vec4 v1; // ERROR -layout(offset=12) in vec4 v2; // ERROR -layout(offset=12) out vec4 v3; // ERROR - -layout(align=16) uniform vec4 v4; // ERROR -layout(align=16) in vec4 v5; // ERROR -layout(align=16) out vec4 v6; // ERROR - -layout(std140) in; // ERROR -layout(std140) uniform vec4 v7; // ERROR - -layout(align=48) uniform ubl7 { // ERROR, not power of 2 - layout(offset=12, align=4) float f; // ERROR, no packing -} inst7; - -in ibl10 { - layout(offset=12) float f; // ERROR - layout(align=4) float g; // ERROR -} inst10; - -layout(std430) uniform; - -layout(align=32) uniform ubl9 { - float e; - layout(offset=12, align=4) float f; - layout(offset=20) float g; - float h; -} inst9; - -uniform ubl11 { - layout(offset=12, align=4) float f; - float g; -} inst11; - -layout(std140) uniform block { - vec4 a; // a takes offsets 0-15 - layout(offset = 32) vec3 b; // b takes offsets 32-43 - layout(offset = 40) vec2 c; // ERROR, lies within previous member - layout(align = 6) double g; // ERROR, 6 is not a power of 2 - layout(offset=68) double h; // ERROR, offset not aligned -} specExampleErrors; - -layout(std140) uniform block2 { - vec4 a; // a takes offsets 0-15 - layout(offset = 32) vec3 b; // b takes offsets 32-43 - layout(offset = 48) vec2 d; // d takes offsets 48-55 - layout(align = 16) float e; // e takes offsets 64-67 - layout(align = 2) double f; // f takes offsets 72-79 - layout(offset = 80) float h; // h takes offsets 80-83 - layout(align = 64) dvec3 i; // i takes offsets 128-151 - layout(offset = 164, align = 8) float j; // j takes offsets 168-171 -} specExample; - -layout(std430) buffer block430 { - vec4 a; // a takes offsets 0-15 - layout(offset = 32) vec3 b; // b takes offsets 32-43 - layout(offset = 40) vec2 c; // ERROR, lies within previous member - layout(align = 6) double g; // ERROR, 6 is not a power of 2 - layout(offset=68) double h; // ERROR, offset not aligned - layout(align = 0) double i; // ERROR, 0 not a power of 2 -} specExampleErrors430; - -layout(std430) buffer block2430 { - vec4 a; // a takes offsets 0-15 - layout(offset = 32) vec3 b; // b takes offsets 32-43 - layout(offset = 48) vec2 d; // d takes offsets 48-55 - layout(align = 16) float e; // e takes offsets 64-67 - layout(align = 2) double f; // f takes offsets 72-79 - layout(offset = 80) float h; // h takes offsets 80-83 - layout(align = 64) dvec3 i; // i takes offsets 128-151 - layout(offset = 164, align = 8) float j; // j takes offsets 168-171 -} specExample430; - -layout(std430, align = 128) buffer block24300 { - vec4 a; - vec3 b; - vec2 d; - float e; - double f; - float h; - dvec3 i; -} specExample4300; - -layout(std430, align = 128) buffer block24301 { - vec4 a; - vec3 b; - vec2 d; - layout(offset=388) float e; - layout(align=8) double f; - float h; - dvec3 i; -} specExample4301; - -int aconst[gl_MaxTransformFeedbackBuffers]; -int bconst[gl_MaxTransformFeedbackInterleavedComponents]; - -sample in vec3 sampInArray[4]; - -void interp() -{ - interpolateAtCentroid(sampInArray[2].xy); - interpolateAtSample(sampInArray[2].x.x, 2); -} - -int layer() -{ - return gl_Layer; -} +#version 440 + +// Note 'location'-only tests for enhanced layouts are in 330.frag +// Generic 'component' tests are in 440.vert + +// a consumes components 2 and 3 of location 4 +layout(location = 4, component = 2) in vec2 a; + +// b consumes component 1 of location 4 +layout(location = 4, component = 1) in float b; +layout(location = 4, component = 2) in vec2 h; // ERROR, component overlap not okay for fragment in + +layout(location = 3, component = 2) in vec3 c; // ERROR: c overflows components 2 and 3 + +// e consumes beginning (components 0, 1 and 2) of each of 6 slots +layout(location = 20, component = 0) in vec3 e[6]; + +// f consumes last component of the same 6 slots +layout(location = 20, component = 3) in float f[6]; + +layout(location = 30, component = 3) out int be; +layout(location = 30, component = 0) out vec3 bf; // ERROR, not the same basic type + +writeonly uniform; // ERROR +readonly in; // ERROR +flat out; // ERROR +mediump uniform; + +layout(offset=12) uniform; // ERROR +layout(offset=12) in; // ERROR +layout(offset=12) out; // ERROR + +layout(align=16) uniform; // ERROR +layout(align=16) in; // ERROR +layout(align=16) out; // ERROR + +layout(offset=12) uniform ubl1 { int a; } inst1; // ERROR +layout(offset=12) in inbl2 { int a; } inst2; // ERROR +layout(offset=12) out inbl3 { int a; } inst3; // ERROR + +layout(align=16, std140) uniform ubl4 { int a; } inst4; +layout(align=16) uniform ubl8 { int a; } inst8; // ERROR, no packing +layout(align=16) in inbl5 { int a; } inst5; // ERROR +layout(align=16) out inbl6 { int a; } inst6; // ERROR + +layout(offset=12) uniform vec4 v1; // ERROR +layout(offset=12) in vec4 v2; // ERROR +layout(offset=12) out vec4 v3; // ERROR + +layout(align=16) uniform vec4 v4; // ERROR +layout(align=16) in vec4 v5; // ERROR +layout(align=16) out vec4 v6; // ERROR + +layout(std140) in; // ERROR +layout(std140) uniform vec4 v7; // ERROR + +layout(align=48) uniform ubl7 { // ERROR, not power of 2 + layout(offset=12, align=4) float f; // ERROR, no packing +} inst7; + +in ibl10 { + layout(offset=12) float f; // ERROR + layout(align=4) float g; // ERROR +} inst10; + +layout(std430) uniform; + +layout(align=32) uniform ubl9 { + float e; + layout(offset=12, align=4) float f; + layout(offset=20) float g; + float h; +} inst9; + +uniform ubl11 { + layout(offset=12, align=4) float f; + float g; +} inst11; + +layout(std140) uniform block { + vec4 a; // a takes offsets 0-15 + layout(offset = 32) vec3 b; // b takes offsets 32-43 + layout(offset = 40) vec2 c; // ERROR, lies within previous member + layout(align = 6) double g; // ERROR, 6 is not a power of 2 + layout(offset=68) double h; // ERROR, offset not aligned +} specExampleErrors; + +layout(std140) uniform block2 { + vec4 a; // a takes offsets 0-15 + layout(offset = 32) vec3 b; // b takes offsets 32-43 + layout(offset = 48) vec2 d; // d takes offsets 48-55 + layout(align = 16) float e; // e takes offsets 64-67 + layout(align = 2) double f; // f takes offsets 72-79 + layout(offset = 80) float h; // h takes offsets 80-83 + layout(align = 64) dvec3 i; // i takes offsets 128-151 + layout(offset = 164, align = 8) float j; // j takes offsets 168-171 +} specExample; + +layout(std430) buffer block430 { + vec4 a; // a takes offsets 0-15 + layout(offset = 32) vec3 b; // b takes offsets 32-43 + layout(offset = 40) vec2 c; // ERROR, lies within previous member + layout(align = 6) double g; // ERROR, 6 is not a power of 2 + layout(offset=68) double h; // ERROR, offset not aligned + layout(align = 0) double i; // ERROR, 0 not a power of 2 +} specExampleErrors430; + +layout(std430) buffer block2430 { + vec4 a; // a takes offsets 0-15 + layout(offset = 32) vec3 b; // b takes offsets 32-43 + layout(offset = 48) vec2 d; // d takes offsets 48-55 + layout(align = 16) float e; // e takes offsets 64-67 + layout(align = 2) double f; // f takes offsets 72-79 + layout(offset = 80) float h; // h takes offsets 80-83 + layout(align = 64) dvec3 i; // i takes offsets 128-151 + layout(offset = 164, align = 8) float j; // j takes offsets 168-171 +} specExample430; + +layout(std430, align = 128) buffer block24300 { + vec4 a; + vec3 b; + vec2 d; + float e; + double f; + float h; + dvec3 i; +} specExample4300; + +layout(std430, align = 128) buffer block24301 { + vec4 a; + vec3 b; + vec2 d; + layout(offset=388) float e; + layout(align=8) double f; + float h; + dvec3 i; +} specExample4301; + +int aconst[gl_MaxTransformFeedbackBuffers]; +int bconst[gl_MaxTransformFeedbackInterleavedComponents]; + +sample in vec3 sampInArray[4]; + +void interp() +{ + interpolateAtCentroid(sampInArray[2].xy); + interpolateAtSample(sampInArray[2].x.x, 2); +} + +int layer() +{ + return gl_Layer; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/440.vert vulkan-1.1.73+dfsg/external/glslang/Test/440.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/440.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/440.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,197 +1,197 @@ -#version 440 - -// Note 'location' tests for enhanced layouts are in 330.frag - -layout(location = 2, component = 2) in vec2 a; -layout(location = 2, component = 1) in float b; - -layout(location = 3, component = 2) in vec3 c; // ERROR: c overflows components 2 and 3 - -layout(location = 0, component = 3) in float d[4]; - -layout(location = 4, component = 0) in vec3 e[5]; -layout(location = 4, component = 3) in float f[5]; - -layout(location = 9, component = 4) in float g[6]; // ERROR, component too big - -layout(location = 4, component = 2) in vec2 h; // component overlap okay for vertex in - -layout(location = 3, component = 2) out vec2 i; -layout(location = 3, component = 0) out vec2 j; - -layout(location = 4, component = 2) out vec2 k; -layout(location = 4, component = 2) out vec2 m; // ERROR, component overlap - -layout(location = 2, component = 2) out vec2 n; -layout(location = 2, component = 0) out vec3 p; // ERROR, component overlap - -layout(location = 10, component = 3) out float q[6]; -layout(location = 10, component = 0) out vec3 r[6]; - -layout(location = 15, component = 3) out float s; // ERROR, overlap -layout(location = 10, component = 1) out float t; // ERROR, overlap - -layout(location = 20, component = 2) out float u; -layout(location = 20, component = 0) out float v; -layout(location = 20, component = 3) out float w; -layout(location = 20, component = 1) out vec2 x; // ERROR, overlap - -layout(location = 30, component = 3) out vec2 y; // ERROR, goes to component 4 -layout(location = 31, component = 1) out vec4 z; // ERROR, goes to component 4 - -layout(location = 32, component = 1) out mat4 ba; // ERROR -layout(location = 33, component = 1) out struct S {int a;} Ss; // ERROR -layout(location = 34, component = 1) out bn { int a;} bb; // ERROR - -layout(component = 1) out float bc; // ERROR, no location - -out blockname { - layout(location = 40, component = 2) out float u; - layout(location = 40, component = 0) out float v; - layout(location = 40, component = 3) out float w; - layout(location = 40, component = 1) out vec2 x; // ERROR, overlap - - layout(location = 41, component = 3) out vec2 y; // ERROR, goes to component 4 - layout(location = 42, component = 1) out vec4 z; // ERROR, goes to component 4 - - layout(location = 42, component = 1) out mat4 ba; // ERROR - layout(location = 43, component = 1) out S Ss; // ERROR -} bd; - -layout(location = 1, component = 1) out; // ERROR, no global setting - -layout(location = 50, component = 3) out int be; -layout(location = 50, component = 0) out vec3 bf; - -layout(location = 51, component = 1) out double dfo; // ERROR, odd component -layout(location = 52, component = 2) out dvec2 dvo; // ERROR, overflow -layout(location = 53) out double dfo2; -layout(location = 53, component = 2) out vec2 ffv2; // okay, fits -layout(location = 54) out dvec4 dvec4out; // uses up location 55 too -layout(location = 55) out float overf; // ERROR, collides with previous dvec4 -layout(location = 56, component = 1) out vec2 df2o; -layout(location = 56, component = 3) out float sf2o; -layout(location = 57, component = 2) out vec2 dv3o; -layout(location = 57, component = 3) out float sf4o; // ERROR, overlapping component -layout(location=58) out flat dvec3 dv3o2; // uses part of location 59 -layout(location=59, component=2) out flat double dfo3; // okay, fits -layout(location=59, component=0) out flat double dfo4; // ERROR, overlaps the dvec3 in starting in 58 - -out bblck1 { - vec4 bbv; -} bbinst1; - -out bblck2 { - layout(xfb_offset=64) vec4 bbv; -} bbinst2; - -layout(xfb_buffer = 3, xfb_stride = 64) out; // default buffer is 3 - -out bblck3 { - layout(xfb_offset=16) vec4 bbv; // in xfb_buffer 3 -} bbinst3; - -uniform ubblck3 { - layout(xfb_offset=16) vec4 bbv; // ERROR, not in a uniform -} ubbinst3; - -layout(xfb_buffer=2, xfb_offset=48, xfb_stride=80) out vec4 bg; -layout( xfb_offset=32, xfb_stride=64) out vec4 bh; - -layout(xfb_offset=48) out; // ERROR - -layout(xfb_stride=80, xfb_buffer=2, xfb_offset=16) out bblck4 { - vec4 bbv1; - vec4 bbv2; -} bbinst4; - -out bblck5 { - layout(xfb_offset=0) vec4 bbv1; - layout(xfb_stride=64, xfb_buffer=3, xfb_offset=48) vec4 bbv2; - layout(xfb_buffer=2) vec4 bbv3; // ERROR, wrong buffer -} bbinst5; - -out layout(xfb_buffer=2) bblck6 { - layout(xfb_offset=0) vec4 bbv1; - layout(xfb_stride=64, xfb_buffer=3, xfb_offset=32) vec4 bbv2; // ERROR, overlap 32 from bh, and buffer contradiction - layout(xfb_buffer=2, xfb_offset=0) vec4 bbv3; // ERROR, overlap 0 from bbinst5 - layout(xfb_buffer=2) vec4 bbv5; - layout(xfb_offset=24) float bbf6; // ERROR, overlap 24 from bbv1 in bbinst4 -} bbinst6; - -layout(xfb_stride=48) out; // ERROR, stride of buffer 3 - -layout(xfb_buffer=1) out; // default buffer is 1 -layout(xfb_offset=4) out float bj; -layout(xfb_offset=0) out ivec2 bk; // ERROR, overlap 4 - -layout(xfb_buffer=3, xfb_stride=48) out; // ERROR, stride of buffer 3 (default is now 3) -layout(xfb_stride=48) out float bl; // ERROR, stride of buffer 3 - -layout(xfb_stride=48) out bblck7 { // ERROR, stride of buffer 3 - layout(xfb_stride=64) vec4 bbv1; - layout(xfb_stride=32) vec4 bbv2; // ERROR, stride of buffer 3 -} bbinst7; - -struct S5 { - int i; // 4 bytes plus 4 byte hole - double d; // 8 bytes - float f; // 4 bytes -}; // total size = 20 - -struct T { - bool b; // 4 plus 4 byte hole - S5 s; // 20 - vec2 v2; // 8 -}; // total size = 36 - -out layout(xfb_buffer=0, xfb_offset=0, xfb_stride=92) bblck8 { // ERROR, stride not multiple of 8 - bool b; // offset 0 - T t; // offset 8, size 40 - int i; // offset 40 + 4 = 48 - mat3x3 m3; // offset 52 - float f; // offset 52 + 9*4 = 88 - float g; // ERROR, overflow stride -} bbinst8; - -out layout(xfb_buffer=4) bblck9 { - layout(xfb_offset=1) bool b; // ERROR - layout(xfb_offset=12) T t; // ERROR - layout(xfb_offset=52) mat3x3 m3; // non-multiple of 8 okay - layout(xfb_offset=90) int i; // ERROR - layout(xfb_offset=98) double d; // ERROR - layout(xfb_offset=108) S s; // non-multiple of 8 okay -} bbinst9; - -layout(xfb_buffer=5, xfb_stride=6) out; // link ERROR, stride not multiple of 4 -layout(xfb_offset=0) out float bm; - -layout(xfb_buffer=6, xfb_stride=2000) out; // ERROR, stride too big - -out layout(xfb_buffer=7, xfb_offset=0) bblck10 { // link ERROR, implicit stride too big - dmat4x4 m1; - dmat4x4 m2; - float f; -} bbinst10; - -layout(xfb_buffer = 3) out; -layout(xfb_offset = 32) out gl_PerVertex { - layout(xfb_buffer = 2) float gl_PointSize; // ERROR, change in xfb_buffer - vec4 gl_Position; -}; - -int drawParamsBad() -{ - return gl_BaseVertexARB + gl_BaseInstanceARB + gl_DrawIDARB; // ERROR, extension not requested -} - -#extension GL_ARB_shader_draw_parameters: enable - -int drawParams() -{ - return gl_BaseVertexARB + gl_BaseInstanceARB + gl_DrawIDARB; - gl_BaseVertexARB = 3; // ERROR, can't write to shader 'in' - gl_BaseInstanceARB = 3; // ERROR, can't write to shader 'in' - gl_DrawIDARB = 3; // ERROR, can't write to shader 'in' - glBaseInstanceARB; // ERROR, not defined -} +#version 440 + +// Note 'location' tests for enhanced layouts are in 330.frag + +layout(location = 2, component = 2) in vec2 a; +layout(location = 2, component = 1) in float b; + +layout(location = 3, component = 2) in vec3 c; // ERROR: c overflows components 2 and 3 + +layout(location = 0, component = 3) in float d[4]; + +layout(location = 4, component = 0) in vec3 e[5]; +layout(location = 4, component = 3) in float f[5]; + +layout(location = 9, component = 4) in float g[6]; // ERROR, component too big + +layout(location = 4, component = 2) in vec2 h; // component overlap okay for vertex in + +layout(location = 3, component = 2) out vec2 i; +layout(location = 3, component = 0) out vec2 j; + +layout(location = 4, component = 2) out vec2 k; +layout(location = 4, component = 2) out vec2 m; // ERROR, component overlap + +layout(location = 2, component = 2) out vec2 n; +layout(location = 2, component = 0) out vec3 p; // ERROR, component overlap + +layout(location = 10, component = 3) out float q[6]; +layout(location = 10, component = 0) out vec3 r[6]; + +layout(location = 15, component = 3) out float s; // ERROR, overlap +layout(location = 10, component = 1) out float t; // ERROR, overlap + +layout(location = 20, component = 2) out float u; +layout(location = 20, component = 0) out float v; +layout(location = 20, component = 3) out float w; +layout(location = 20, component = 1) out vec2 x; // ERROR, overlap + +layout(location = 30, component = 3) out vec2 y; // ERROR, goes to component 4 +layout(location = 31, component = 1) out vec4 z; // ERROR, goes to component 4 + +layout(location = 32, component = 1) out mat4 ba; // ERROR +layout(location = 33, component = 1) out struct S {int a;} Ss; // ERROR +layout(location = 34, component = 1) out bn { int a;} bb; // ERROR + +layout(component = 1) out float bc; // ERROR, no location + +out blockname { + layout(location = 40, component = 2) out float u; + layout(location = 40, component = 0) out float v; + layout(location = 40, component = 3) out float w; + layout(location = 40, component = 1) out vec2 x; // ERROR, overlap + + layout(location = 41, component = 3) out vec2 y; // ERROR, goes to component 4 + layout(location = 42, component = 1) out vec4 z; // ERROR, goes to component 4 + + layout(location = 42, component = 1) out mat4 ba; // ERROR + layout(location = 43, component = 1) out S Ss; // ERROR +} bd; + +layout(location = 1, component = 1) out; // ERROR, no global setting + +layout(location = 50, component = 3) out int be; +layout(location = 50, component = 0) out vec3 bf; + +layout(location = 51, component = 1) out double dfo; // ERROR, odd component +layout(location = 52, component = 2) out dvec2 dvo; // ERROR, overflow +layout(location = 53) out double dfo2; +layout(location = 53, component = 2) out vec2 ffv2; // okay, fits +layout(location = 54) out dvec4 dvec4out; // uses up location 55 too +layout(location = 55) out float overf; // ERROR, collides with previous dvec4 +layout(location = 56, component = 1) out vec2 df2o; +layout(location = 56, component = 3) out float sf2o; +layout(location = 57, component = 2) out vec2 dv3o; +layout(location = 57, component = 3) out float sf4o; // ERROR, overlapping component +layout(location=58) out flat dvec3 dv3o2; // uses part of location 59 +layout(location=59, component=2) out flat double dfo3; // okay, fits +layout(location=59, component=0) out flat double dfo4; // ERROR, overlaps the dvec3 in starting in 58 + +out bblck1 { + vec4 bbv; +} bbinst1; + +out bblck2 { + layout(xfb_offset=64) vec4 bbv; +} bbinst2; + +layout(xfb_buffer = 3, xfb_stride = 64) out; // default buffer is 3 + +out bblck3 { + layout(xfb_offset=16) vec4 bbv; // in xfb_buffer 3 +} bbinst3; + +uniform ubblck3 { + layout(xfb_offset=16) vec4 bbv; // ERROR, not in a uniform +} ubbinst3; + +layout(xfb_buffer=2, xfb_offset=48, xfb_stride=80) out vec4 bg; +layout( xfb_offset=32, xfb_stride=64) out vec4 bh; + +layout(xfb_offset=48) out; // ERROR + +layout(xfb_stride=80, xfb_buffer=2, xfb_offset=16) out bblck4 { + vec4 bbv1; + vec4 bbv2; +} bbinst4; + +out bblck5 { + layout(xfb_offset=0) vec4 bbv1; + layout(xfb_stride=64, xfb_buffer=3, xfb_offset=48) vec4 bbv2; + layout(xfb_buffer=2) vec4 bbv3; // ERROR, wrong buffer +} bbinst5; + +out layout(xfb_buffer=2) bblck6 { + layout(xfb_offset=0) vec4 bbv1; + layout(xfb_stride=64, xfb_buffer=3, xfb_offset=32) vec4 bbv2; // ERROR, overlap 32 from bh, and buffer contradiction + layout(xfb_buffer=2, xfb_offset=0) vec4 bbv3; // ERROR, overlap 0 from bbinst5 + layout(xfb_buffer=2) vec4 bbv5; + layout(xfb_offset=24) float bbf6; // ERROR, overlap 24 from bbv1 in bbinst4 +} bbinst6; + +layout(xfb_stride=48) out; // ERROR, stride of buffer 3 + +layout(xfb_buffer=1) out; // default buffer is 1 +layout(xfb_offset=4) out float bj; +layout(xfb_offset=0) out ivec2 bk; // ERROR, overlap 4 + +layout(xfb_buffer=3, xfb_stride=48) out; // ERROR, stride of buffer 3 (default is now 3) +layout(xfb_stride=48) out float bl; // ERROR, stride of buffer 3 + +layout(xfb_stride=48) out bblck7 { // ERROR, stride of buffer 3 + layout(xfb_stride=64) vec4 bbv1; + layout(xfb_stride=32) vec4 bbv2; // ERROR, stride of buffer 3 +} bbinst7; + +struct S5 { + int i; // 4 bytes plus 4 byte hole + double d; // 8 bytes + float f; // 4 bytes +}; // total size = 20 + +struct T { + bool b; // 4 plus 4 byte hole + S5 s; // 20 + vec2 v2; // 8 +}; // total size = 36 + +out layout(xfb_buffer=0, xfb_offset=0, xfb_stride=92) bblck8 { // ERROR, stride not multiple of 8 + bool b; // offset 0 + T t; // offset 8, size 40 + int i; // offset 40 + 4 = 48 + mat3x3 m3; // offset 52 + float f; // offset 52 + 9*4 = 88 + float g; // ERROR, overflow stride +} bbinst8; + +out layout(xfb_buffer=4) bblck9 { + layout(xfb_offset=1) bool b; // ERROR + layout(xfb_offset=12) T t; // ERROR + layout(xfb_offset=52) mat3x3 m3; // non-multiple of 8 okay + layout(xfb_offset=90) int i; // ERROR + layout(xfb_offset=98) double d; // ERROR + layout(xfb_offset=108) S s; // non-multiple of 8 okay +} bbinst9; + +layout(xfb_buffer=5, xfb_stride=6) out; // link ERROR, stride not multiple of 4 +layout(xfb_offset=0) out float bm; + +layout(xfb_buffer=6, xfb_stride=2000) out; // ERROR, stride too big + +out layout(xfb_buffer=7, xfb_offset=0) bblck10 { // link ERROR, implicit stride too big + dmat4x4 m1; + dmat4x4 m2; + float f; +} bbinst10; + +layout(xfb_buffer = 3) out; +layout(xfb_offset = 32) out gl_PerVertex { + layout(xfb_buffer = 2) float gl_PointSize; // ERROR, change in xfb_buffer + vec4 gl_Position; +}; + +int drawParamsBad() +{ + return gl_BaseVertexARB + gl_BaseInstanceARB + gl_DrawIDARB; // ERROR, extension not requested +} + +#extension GL_ARB_shader_draw_parameters: enable + +int drawParams() +{ + return gl_BaseVertexARB + gl_BaseInstanceARB + gl_DrawIDARB; + gl_BaseVertexARB = 3; // ERROR, can't write to shader 'in' + gl_BaseInstanceARB = 3; // ERROR, can't write to shader 'in' + gl_DrawIDARB = 3; // ERROR, can't write to shader 'in' + glBaseInstanceARB; // ERROR, not defined +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/450.comp vulkan-1.1.73+dfsg/external/glslang/Test/450.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/450.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/450.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ -#version 450 core -layout(local_size_x = 0) in; // ERROR, 0 not allowed -void main() -{ - shared float f; // ERROR shared must be global -} +#version 450 core +layout(local_size_x = 0) in; // ERROR, 0 not allowed +void main() +{ + shared float f; // ERROR shared must be global +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/450.frag vulkan-1.1.73+dfsg/external/glslang/Test/450.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/450.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/450.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,68 +1,68 @@ -#version 450 core - -in float in1; -in vec2 in2; -in vec3 in3; -in vec4 in4; - -void main() -{ - vec2 v2 = dFdxFine(in2); - vec3 v3 = dFdyCoarse(in3); - vec4 v4 = fwidth(in4); - v4 = dFdyFine(in4); - v3 = dFdyFine(in3); - float f = dFdx(in1) + dFdxFine(in1) + dFdxCoarse(in1); - v4 = fwidthCoarse(in4) + fwidthFine(in4); - - float cull = gl_CullDistance[2]; - float consts = gl_MaxCullDistances + gl_MaxCombinedClipAndCullDistances + gl_MaxSamples; - - if (gl_HelperInvocation) - ++v4; - - int sum = gl_MaxVertexImageUniforms + - gl_MaxFragmentImageUniforms + - gl_MaxComputeImageUniforms + - gl_MaxCombinedImageUniforms + - gl_MaxCombinedShaderOutputResources; - - bool b1, b3, b; - uint uin; - bvec2 b2 = mix(bvec2(b1), bvec2(b3), bvec2(b)); - uint um = mix(uin, uin, b); - ivec3 im3 = mix(ivec3(uin), ivec3(uin), bvec3(b)); -} - -uniform sampler2DMS s2dms; -uniform usampler2DMSArray us2dmsa; -layout(rgba32i) uniform iimage2DMS ii2dms; -layout(rgba32f) uniform image2DMSArray i2dmsa; - -void foo() -{ - int s = textureSamples(s2dms); - s += textureSamples(us2dmsa); - s += imageSamples(ii2dms); - s += imageSamples(i2dmsa); - float f = imageAtomicExchange(i2dmsa, ivec3(in3), 2, 4.5); -} - -in float gl_CullDistance[6]; - -float cull(int i) -{ - return (i >= 6) ? gl_CullDistance[5] : gl_CullDistance[i]; -} - -layout(location = 6) in bName1 { - float f; - layout(location = 7) float g; - mat4 m; -} bInst1; -layout(location = 12) in bName2 { - float f; - layout(location = 13) float g; // ERROR, location on array -} bInst2[3]; - -layout(early_fragment_tests) in float f; // ERROR, must be standalone +#version 450 core + +in float in1; +in vec2 in2; +in vec3 in3; +in vec4 in4; + +void main() +{ + vec2 v2 = dFdxFine(in2); + vec3 v3 = dFdyCoarse(in3); + vec4 v4 = fwidth(in4); + v4 = dFdyFine(in4); + v3 = dFdyFine(in3); + float f = dFdx(in1) + dFdxFine(in1) + dFdxCoarse(in1); + v4 = fwidthCoarse(in4) + fwidthFine(in4); + + float cull = gl_CullDistance[2]; + float consts = gl_MaxCullDistances + gl_MaxCombinedClipAndCullDistances + gl_MaxSamples; + + if (gl_HelperInvocation) + ++v4; + + int sum = gl_MaxVertexImageUniforms + + gl_MaxFragmentImageUniforms + + gl_MaxComputeImageUniforms + + gl_MaxCombinedImageUniforms + + gl_MaxCombinedShaderOutputResources; + + bool b1, b3, b; + uint uin; + bvec2 b2 = mix(bvec2(b1), bvec2(b3), bvec2(b)); + uint um = mix(uin, uin, b); + ivec3 im3 = mix(ivec3(uin), ivec3(uin), bvec3(b)); +} + +uniform sampler2DMS s2dms; +uniform usampler2DMSArray us2dmsa; +layout(rgba32i) uniform iimage2DMS ii2dms; +layout(rgba32f) uniform image2DMSArray i2dmsa; + +void foo() +{ + int s = textureSamples(s2dms); + s += textureSamples(us2dmsa); + s += imageSamples(ii2dms); + s += imageSamples(i2dmsa); + float f = imageAtomicExchange(i2dmsa, ivec3(in3), 2, 4.5); +} + +in float gl_CullDistance[6]; + +float cull(int i) +{ + return (i >= 6) ? gl_CullDistance[5] : gl_CullDistance[i]; +} + +layout(location = 6) in bName1 { + float f; + layout(location = 7) float g; + mat4 m; +} bInst1; +layout(location = 12) in bName2 { + float f; + layout(location = 13) float g; // ERROR, location on array +} bInst2[3]; + +layout(early_fragment_tests) in float f; // ERROR, must be standalone diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/450.geom vulkan-1.1.73+dfsg/external/glslang/Test/450.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/450.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/450.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,19 +1,19 @@ -#version 450 core - -in gl_PerVertex { - float gl_CullDistance[3]; -} gl_in[]; - -out gl_PerVertex { - float gl_CullDistance[3]; -}; - -layout(triangles) in; - -void main() -{ - gl_in[3].gl_Position; // ERROR, out of range - gl_CullDistance[2] = gl_in[1].gl_CullDistance[2]; -} - -layout(points) in float f[3]; // ERROR, must be standalone +#version 450 core + +in gl_PerVertex { + float gl_CullDistance[3]; +} gl_in[]; + +out gl_PerVertex { + float gl_CullDistance[3]; +}; + +layout(triangles) in; + +void main() +{ + gl_in[3].gl_Position; // ERROR, out of range + gl_CullDistance[2] = gl_in[1].gl_CullDistance[2]; +} + +layout(points) in float f[3]; // ERROR, must be standalone diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/450.tesc vulkan-1.1.73+dfsg/external/glslang/Test/450.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/450.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/450.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,23 +1,23 @@ -#version 450 core - -in gl_PerVertex { - float gl_CullDistance[3]; -} gl_in[gl_MaxPatchVertices]; - -out gl_PerVertex { - float gl_CullDistance[3]; -} gl_out[4]; - -void main() -{ - gl_out[gl_InvocationID].gl_CullDistance[2] = gl_in[1].gl_CullDistance[2]; -} - -layout(location = 4) out bName1 { - float f; - layout(location = 5) float g; -} bInst1[2]; -layout(location = 6) out bName2 { - float f; - layout(location = 7) float g; // ERROR, location on array -} bInst2[2][3]; +#version 450 core + +in gl_PerVertex { + float gl_CullDistance[3]; +} gl_in[gl_MaxPatchVertices]; + +out gl_PerVertex { + float gl_CullDistance[3]; +} gl_out[4]; + +void main() +{ + gl_out[gl_InvocationID].gl_CullDistance[2] = gl_in[1].gl_CullDistance[2]; +} + +layout(location = 4) out bName1 { + float f; + layout(location = 5) float g; +} bInst1[2]; +layout(location = 6) out bName2 { + float f; + layout(location = 7) float g; // ERROR, location on array +} bInst2[2][3]; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/450.tese vulkan-1.1.73+dfsg/external/glslang/Test/450.tese --- vulkan-1.1.70+dfsg1/external/glslang/Test/450.tese 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/450.tese 2018-04-27 11:46:26.000000000 +0000 @@ -1,21 +1,21 @@ -#version 450 core - -in gl_PerVertex { - float gl_CullDistance[3]; -} gl_in[gl_MaxPatchVertices]; - -out gl_PerVertex { - float gl_CullDistance[3]; -}; - -void main() -{ - gl_CullDistance[2] = gl_in[1].gl_CullDistance[2]; -} - -layout(equal_spacing) in float f1[]; // ERROR, must be standalone -layout(fractional_even_spacing) in float f2[]; // ERROR, must be standalone -layout(fractional_odd_spacing) in float f3[]; // ERROR, must be standalone -layout(cw) in float f4[]; // ERROR, must be standalone -layout(ccw) in float f5[]; // ERROR, must be standalone -layout(point_mode) in float f6[]; // ERROR, must be standalone +#version 450 core + +in gl_PerVertex { + float gl_CullDistance[3]; +} gl_in[gl_MaxPatchVertices]; + +out gl_PerVertex { + float gl_CullDistance[3]; +}; + +void main() +{ + gl_CullDistance[2] = gl_in[1].gl_CullDistance[2]; +} + +layout(equal_spacing) in float f1[]; // ERROR, must be standalone +layout(fractional_even_spacing) in float f2[]; // ERROR, must be standalone +layout(fractional_odd_spacing) in float f3[]; // ERROR, must be standalone +layout(cw) in float f4[]; // ERROR, must be standalone +layout(ccw) in float f5[]; // ERROR, must be standalone +layout(point_mode) in float f6[]; // ERROR, must be standalone diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/450.vert vulkan-1.1.73+dfsg/external/glslang/Test/450.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/450.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/450.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,56 +1,56 @@ -#version 450 core - -out gl_PerVertex { - float gl_CullDistance[3]; -}; - -void main() -{ - gl_CullDistance[2] = 4.5; -} - -out bool outb; // ERROR -out sampler2D outo; // ERROR -out float outa[4]; -out float outaa[4][2]; -struct S { float f; }; -out S outs; -out S[4] outasa; -out S outsa[4]; -struct SA { float f[4]; }; -out SA outSA; -struct SS { float f; S s; }; -out SS outSS; - -layout(binding = 0) uniform atomic_uint aui; -uint ui; - -void foo() -{ - SS::f; - atomicCounterAdd(aui, ui); // ERROR, need 4.6 - atomicCounterSubtract(aui, ui); // ERROR, need 4.6 - atomicCounterMin(aui, ui); // ERROR, need 4.6 - atomicCounterMax(aui, ui); // ERROR, need 4.6 - atomicCounterAnd(aui, ui); // ERROR, need 4.6 - atomicCounterOr(aui, ui); // ERROR, need 4.6 - atomicCounterXor(aui, ui); // ERROR, need 4.6 - atomicCounterExchange(aui, ui); // ERROR, need 4.6 - atomicCounterCompSwap(aui, ui, ui); // ERROR, need 4.6 - - int a = gl_BaseVertex + gl_BaseInstance + gl_DrawID; // ERROR, need 4.6 - - bool b1; - anyInvocation(b1); // ERROR, need 4.6 - allInvocations(b1); // ERROR, need 4.6 - allInvocationsEqual(b1); // ERROR, need 4.6 -} -; // ERROR: no extraneous semicolons - -layout(location = 0) uniform locBlock { // ERROR, no location uniform block - int a; -}; - -layout(location = 0) buffer locBuffBlock { // ERROR, no location on buffer block - int b; -}; +#version 450 core + +out gl_PerVertex { + float gl_CullDistance[3]; +}; + +void main() +{ + gl_CullDistance[2] = 4.5; +} + +out bool outb; // ERROR +out sampler2D outo; // ERROR +out float outa[4]; +out float outaa[4][2]; +struct S { float f; }; +out S outs; +out S[4] outasa; +out S outsa[4]; +struct SA { float f[4]; }; +out SA outSA; +struct SS { float f; S s; }; +out SS outSS; + +layout(binding = 0) uniform atomic_uint aui; +uint ui; + +void foo() +{ + SS::f; + atomicCounterAdd(aui, ui); // ERROR, need 4.6 + atomicCounterSubtract(aui, ui); // ERROR, need 4.6 + atomicCounterMin(aui, ui); // ERROR, need 4.6 + atomicCounterMax(aui, ui); // ERROR, need 4.6 + atomicCounterAnd(aui, ui); // ERROR, need 4.6 + atomicCounterOr(aui, ui); // ERROR, need 4.6 + atomicCounterXor(aui, ui); // ERROR, need 4.6 + atomicCounterExchange(aui, ui); // ERROR, need 4.6 + atomicCounterCompSwap(aui, ui, ui); // ERROR, need 4.6 + + int a = gl_BaseVertex + gl_BaseInstance + gl_DrawID; // ERROR, need 4.6 + + bool b1; + anyInvocation(b1); // ERROR, need 4.6 + allInvocations(b1); // ERROR, need 4.6 + allInvocationsEqual(b1); // ERROR, need 4.6 +} +; // ERROR: no extraneous semicolons + +layout(location = 0) uniform locBlock { // ERROR, no location uniform block + int a; +}; + +layout(location = 0) buffer locBuffBlock { // ERROR, no location on buffer block + int b; +}; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/460.frag vulkan-1.1.73+dfsg/external/glslang/Test/460.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/460.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/460.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,32 +1,32 @@ -#version 460 core - -struct S { - float f; - vec4 v; -}; - -in S s; - -void main() -{ - interpolateAtCentroid(s.v); - bool b1; - b1 = anyInvocation(b1); - b1 = allInvocations(b1); - b1 = allInvocationsEqual(b1); -} - -void attExtBad() -{ - // ERRORs, not enabled +#version 460 core + +struct S { + float f; + vec4 v; +}; + +in S s; + +void main() +{ + interpolateAtCentroid(s.v); + bool b1; + b1 = anyInvocation(b1); + b1 = allInvocations(b1); + b1 = allInvocationsEqual(b1); +} + +void attExtBad() +{ + // ERRORs, not enabled [[dependency_length(1+3)]] for (int i = 0; i < 8; ++i) { } [[flatten]] if (true) { } else { } } - -#extension GL_EXT_control_flow_attributes : enable - -void attExt() -{ - [[dependency_length(-3)]] do { } while(true); // ERROR, not positive + +#extension GL_EXT_control_flow_attributes : enable + +void attExt() +{ + [[dependency_length(-3)]] do { } while(true); // ERROR, not positive [[dependency_length(0)]] do { } while(true); // ERROR, not positive } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/460.vert vulkan-1.1.73+dfsg/external/glslang/Test/460.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/460.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/460.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,15 +1,15 @@ -#version 460 core - -int i; -; // extraneous semicolon okay -float f;;; - -void main() -{ - bool b1; - b1 = anyInvocation(b1); - b1 = allInvocations(b1); - b1 = allInvocationsEqual(b1); -} -; -; +#version 460 core + +int i; +; // extraneous semicolon okay +float f;;; + +void main() +{ + bool b1; + b1 = anyInvocation(b1); + b1 = allInvocations(b1); + b1 = allInvocationsEqual(b1); +} +; +; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/aggOps.frag vulkan-1.1.73+dfsg/external/glslang/Test/aggOps.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/aggOps.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/aggOps.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,51 +1,51 @@ -#version 130 - -uniform sampler2D sampler; -varying mediump vec2 coord; - -varying vec4 u, w; - -struct s1 { - int i; - float f; -}; - -struct s2 { - int i; - float f; - s1 s1_1; -}; - -uniform s1 foo1; -uniform s2 foo2a; -uniform s2 foo2b; - -void main() -{ - vec4 v; - s1 a[3], b[3]; - a = s1[3](s1(int(u.x), u.y), s1(int(u.z), u.w), s1(14, 14.0)); - b = s1[3](s1(17, 17.0), s1(int(w.x), w.y), s1(int(w.z), w.w)); - - if (foo2a == foo2b) - v = texture2D(sampler, coord); - else - v = texture2D(sampler, 2.0*coord); - - if (u == v) - v *= 3.0; - - if (u != v) - v *= 4.0; - - if (coord == v.yw) - v *= 5.0; - - if (a == b) - v *= 6.0; - - if (a != b) - v *= 7.0; - - gl_FragColor = v; -} +#version 130 + +uniform sampler2D sampler; +varying mediump vec2 coord; + +varying vec4 u, w; + +struct s1 { + int i; + float f; +}; + +struct s2 { + int i; + float f; + s1 s1_1; +}; + +uniform s1 foo1; +uniform s2 foo2a; +uniform s2 foo2b; + +void main() +{ + vec4 v; + s1 a[3], b[3]; + a = s1[3](s1(int(u.x), u.y), s1(int(u.z), u.w), s1(14, 14.0)); + b = s1[3](s1(17, 17.0), s1(int(w.x), w.y), s1(int(w.z), w.w)); + + if (foo2a == foo2b) + v = texture2D(sampler, coord); + else + v = texture2D(sampler, 2.0*coord); + + if (u == v) + v *= 3.0; + + if (u != v) + v *= 4.0; + + if (coord == v.yw) + v *= 5.0; + + if (a == b) + v *= 6.0; + + if (a != b) + v *= 7.0; + + gl_FragColor = v; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/always-discard2.frag vulkan-1.1.73+dfsg/external/glslang/Test/always-discard2.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/always-discard2.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/always-discard2.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,19 +1,19 @@ -#version 110 -varying vec2 tex_coord; - -void main (void) -{ - vec4 white = vec4(1.0); - vec4 black = vec4(0.2); - vec4 color = white; - - // First, cut out our circle - float x = tex_coord.x*2.0 - 1.0; - float y = tex_coord.y*2.0 - 1.0; - - discard; - - - gl_FragColor = color; - -} +#version 110 +varying vec2 tex_coord; + +void main (void) +{ + vec4 white = vec4(1.0); + vec4 black = vec4(0.2); + vec4 color = white; + + // First, cut out our circle + float x = tex_coord.x*2.0 - 1.0; + float y = tex_coord.y*2.0 - 1.0; + + discard; + + + gl_FragColor = color; + +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/always-discard.frag vulkan-1.1.73+dfsg/external/glslang/Test/always-discard.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/always-discard.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/always-discard.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,36 +1,36 @@ -#version 110 -varying vec2 tex_coord; - -void main (void) -{ - vec4 white = vec4(1.0); - vec4 black = vec4(0.2); - vec4 color = white; - - // First, cut out our circle - float x = tex_coord.x*2.0 - 1.0; - float y = tex_coord.y*2.0 - 1.0; - - float radius = sqrt(x*x + y*y); - if (radius > 1.0) { - if (radius > 1.1) { - ++color; - } - - gl_FragColor = color; - - if (radius > 1.2) { - ++color; - } - - } - - discard; - - // If we're near an edge, darken us a tiny bit - if (radius >= 0.75) - color -= abs(pow(radius, 16.0)/2.0); - - gl_FragColor = color; - -} +#version 110 +varying vec2 tex_coord; + +void main (void) +{ + vec4 white = vec4(1.0); + vec4 black = vec4(0.2); + vec4 color = white; + + // First, cut out our circle + float x = tex_coord.x*2.0 - 1.0; + float y = tex_coord.y*2.0 - 1.0; + + float radius = sqrt(x*x + y*y); + if (radius > 1.0) { + if (radius > 1.1) { + ++color; + } + + gl_FragColor = color; + + if (radius > 1.2) { + ++color; + } + + } + + discard; + + // If we're near an edge, darken us a tiny bit + if (radius >= 0.75) + color -= abs(pow(radius, 16.0)/2.0); + + gl_FragColor = color; + +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/array.frag vulkan-1.1.73+dfsg/external/glslang/Test/array.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/array.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/array.frag 2018-04-27 11:46:26.000000000 +0000 @@ -102,5 +102,11 @@ } int[] i = int[](); // ERROR, need constructor arguments -float emptyA[]; -float b = vec4(emptyA); // ERROR, array can't be a constructor argument +float emptyA[]; +float b = vec4(emptyA); // ERROR, array can't be a constructor argument +uniform sampler2D s2d[]; + +void foo4() +{ + s2d[a]; // ERROR, can't variably index unsized array +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/atomic_uint.frag vulkan-1.1.73+dfsg/external/glslang/Test/atomic_uint.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/atomic_uint.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/atomic_uint.frag 2018-04-27 11:46:26.000000000 +0000 @@ -19,30 +19,30 @@ uint val = atomicCounter(counter); atomicCounterDecrement(counter); } - -layout(binding = 1, offset = 3) uniform atomic_uint countArr[4]; -uniform int i; - -void opac() -{ - counter + counter; // ERROR - -counter; // ERROR - int a[3]; - a[counter]; // ERROR - countArr[2]; - countArr[i]; - counter = 4; // ERROR -} - -in atomic_uint acin; // ERROR -atomic_uint acg; // ERROR -uniform atomic_uint; -uniform atomic_uint aNoBind; // ERROR, no binding -layout(binding=0, offset=32) uniform atomic_uint aOffset; -layout(binding=0, offset=4) uniform atomic_uint; -layout(binding=0) uniform atomic_uint bar3; // offset is 4 -layout(binding=0) uniform atomic_uint ac[3]; // offset = 8 -layout(binding=0) uniform atomic_uint ad; // offset = 20 -layout(offset=8) uniform atomic_uint bar4; // ERROR, no binding -layout(binding = 0, offset = 12) uniform atomic_uint overlap; // ERROR, overlapping offsets -layout(binding = 20) uniform atomic_uint bigBind; // ERROR, binding too big + +layout(binding = 1, offset = 3) uniform atomic_uint countArr[4]; +uniform int i; + +void opac() +{ + counter + counter; // ERROR + -counter; // ERROR + int a[3]; + a[counter]; // ERROR + countArr[2]; + countArr[i]; + counter = 4; // ERROR +} + +in atomic_uint acin; // ERROR +atomic_uint acg; // ERROR +uniform atomic_uint; +uniform atomic_uint aNoBind; // ERROR, no binding +layout(binding=0, offset=32) uniform atomic_uint aOffset; +layout(binding=0, offset=4) uniform atomic_uint; +layout(binding=0) uniform atomic_uint bar3; // offset is 4 +layout(binding=0) uniform atomic_uint ac[3]; // offset = 8 +layout(binding=0) uniform atomic_uint ad; // offset = 20 +layout(offset=8) uniform atomic_uint bar4; // ERROR, no binding +layout(binding = 0, offset = 12) uniform atomic_uint overlap; // ERROR, overlapping offsets +layout(binding = 20) uniform atomic_uint bigBind; // ERROR, binding too big diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/badMacroArgs.frag vulkan-1.1.73+dfsg/external/glslang/Test/badMacroArgs.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/badMacroArgs.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/badMacroArgs.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,4 +1,4 @@ -#version 400 - -#define m(a) a +#version 400 + +#define m(a) a m() \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.aliasOpaque.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.aliasOpaque.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.aliasOpaque.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.aliasOpaque.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,6 @@ hlsl.aliasOpaque.frag -WARNING: AST will form illegal SPIR-V; need to transform to legalize // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 87 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.flattenOpaque.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.flattenOpaque.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.flattenOpaque.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.flattenOpaque.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,6 @@ hlsl.flattenOpaque.frag -WARNING: AST will form illegal SPIR-V; need to transform to legalize // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 185 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.flattenOpaqueInitMix.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.flattenOpaqueInitMix.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.flattenOpaqueInitMix.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.flattenOpaqueInitMix.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,7 @@ hlsl.flattenOpaqueInitMix.vert -WARNING: AST will form illegal SPIR-V; need to transform to legalize // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 80 +// Generated by (magic number): 80006 +// Id's are bound by 97 Capability Shader 1: ExtInstImport "GLSL.std.450" @@ -32,13 +31,13 @@ 49: 7(float) Constant 1056964608 56: TypePointer Output 11(fvec4) 57(@entryPointOutput): 56(ptr) Variable Output + 96: 36(fvec2) ConstantComposite 49 49 4(main): 2 Function None 3 5: Label 63: 6 Load 44(g_tInputTexture_sampler) 64: 8 Load 47(g_tInputTexture) 73: 28 SampledImage 64 63 - 78: 36(fvec2) CompositeConstruct 49 49 - 79: 11(fvec4) ImageSampleExplicitLod 73 78 Lod 38 + 79: 11(fvec4) ImageSampleExplicitLod 73 96 Lod 38 Store 57(@entryPointOutput) 79 Return FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.flattenOpaqueInit.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.flattenOpaqueInit.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.flattenOpaqueInit.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.flattenOpaqueInit.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,6 @@ hlsl.flattenOpaqueInit.vert -WARNING: AST will form illegal SPIR-V; need to transform to legalize // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 134 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.flattenSubset2.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.flattenSubset2.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.flattenSubset2.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.flattenSubset2.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,6 @@ hlsl.flattenSubset2.frag -WARNING: AST will form illegal SPIR-V; need to transform to legalize // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 53 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.flattenSubset.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.flattenSubset.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.flattenSubset.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.flattenSubset.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,6 @@ hlsl.flattenSubset.frag -WARNING: AST will form illegal SPIR-V; need to transform to legalize // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 66 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,7 @@ hlsl.partialFlattenLocal.vert -WARNING: AST will form illegal SPIR-V; need to transform to legalize // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 165 +// Generated by (magic number): 80006 +// Id's are bound by 169 Capability Shader 1: ExtInstImport "GLSL.std.450" @@ -52,22 +51,22 @@ Store 137 38 Branch 100 100: Label - 164: 21(int) Phi 25 5 119 106 - 105: 54(bool) SLessThan 164 31 + 168: 21(int) Phi 25 5 119 106 + 105: 54(bool) SLessThan 168 31 LoopMerge 101 106 None BranchConditional 105 106 101 106: Label - 138: 39(ptr) AccessChain 133 164 + 138: 39(ptr) AccessChain 133 168 110: 18(fvec2) Load 138 - 139: 34(ptr) AccessChain 131 164 + 139: 34(ptr) AccessChain 131 168 112: 14(fvec3) Load 139 113: 18(fvec2) VectorShuffle 112 112 0 1 114: 18(fvec2) FAdd 113 110 - 140: 34(ptr) AccessChain 131 164 + 140: 34(ptr) AccessChain 131 168 116: 14(fvec3) Load 140 117: 14(fvec3) VectorShuffle 116 114 3 4 2 Store 140 117 - 119: 21(int) IAdd 164 31 + 119: 21(int) IAdd 168 31 Branch 100 101: Label 142: 17 Load 131 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseLegalResults/hlsl.partialFlattenMixed.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,6 @@ hlsl.partialFlattenMixed.vert -WARNING: AST will form illegal SPIR-V; need to transform to legalize // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 36 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/100.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/100.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/100.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/100.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -395,7 +395,7 @@ 0:? 'v' ( smooth in 3-element array of mediump 4-component vector of float) 0:? 'f' ( invariant global mediump float) 0:? 'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump int x}) -0:? 'fa' ( global implicitly-sized array of mediump float) +0:? 'fa' ( global unsized 1-element array of mediump float) 0:? 'f13' ( invariant global mediump float) 0:? 'fi' ( invariant temp mediump float) 0:? 'av' ( invariant smooth in mediump 4-component vector of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/120.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/120.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/120.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/120.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -52,7 +52,10 @@ ERROR: 0:212: 'sampler2DRect' : Reserved word. ERROR: 0:244: ':' : wrong operand types: no operation ':' exists that takes a left-hand operand of type ' global void' and a right operand of type ' const int' (or there is no acceptable conversion) ERROR: 0:245: ':' : wrong operand types: no operation ':' exists that takes a left-hand operand of type ' const int' and a right operand of type ' global void' (or there is no acceptable conversion) -ERROR: 0:248: 'shader half float' : required extension not requested: GL_AMD_gpu_shader_half_float +ERROR: 0:248: 'explicit types' : required extension not requested: Possible extensions include: +GL_AMD_gpu_shader_half_float +GL_KHX_shader_explicit_arithmetic_types +GL_KHX_shader_explicit_arithmetic_types_float16 ERROR: 0:248: 'half floating-point suffix' : not supported with this profile: none ERROR: 0:248: '' : syntax error, unexpected IDENTIFIER, expecting COMMA or SEMICOLON ERROR: 56 compilation errors. No code generated. diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/120.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/120.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/120.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/120.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -19,6 +19,7 @@ ERROR: 0:35: 'arrays of arrays' : not supported with this profile: none ERROR: 0:36: 'arrays of arrays' : not supported with this profile: none ERROR: 0:37: 'arrays of arrays' : not supported with this profile: none +ERROR: 0:37: 'arrays of arrays' : not supported with this profile: none ERROR: 0:38: 'arrays of arrays' : not supported with this profile: none ERROR: 0:39: 'arrays of arrays' : not supported with this profile: none ERROR: 0:40: 'arrays of arrays' : not supported with this profile: none @@ -78,7 +79,7 @@ ERROR: 0:195: 'gl_ModelViewMatrix' : identifiers starting with "gl_" are reserved ERROR: 0:200: 'token pasting (##)' : not supported for this version or the enabled extensions ERROR: 0:203: 'token pasting (##)' : not supported for this version or the enabled extensions -ERROR: 79 compilation errors. No code generated. +ERROR: 80 compilation errors. No code generated. Shader version: 120 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/130.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/130.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/130.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/130.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -49,7 +49,7 @@ 0:18 move second child to first child ( temp float) 0:18 'clip' ( temp float) 0:18 direct index ( smooth temp float ClipDistance) -0:18 'gl_ClipDistance' ( smooth in implicitly-sized array of float ClipDistance) +0:18 'gl_ClipDistance' ( smooth in unsized 4-element array of float ClipDistance) 0:18 Constant: 0:18 3 (const int) 0:23 Function Definition: foo( ( global void) @@ -381,7 +381,7 @@ 0:? 'fflat' ( flat in float) 0:? 'fsmooth' ( smooth in float) 0:? 'fnop' ( noperspective in float) -0:? 'gl_ClipDistance' ( smooth in implicitly-sized array of float ClipDistance) +0:? 'gl_ClipDistance' ( smooth in unsized 4-element array of float ClipDistance) 0:? 'sampC' ( uniform samplerCube) 0:? 'gl_Color' ( in 4-component vector of float Color) 0:? 'samp2D' ( uniform sampler2D) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/130.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/130.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/130.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/130.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -113,7 +113,7 @@ 0:45 'gl_VertexID' ( gl_VertexId int VertexId) 0:46 move second child to first child ( temp float) 0:46 direct index ( smooth temp float ClipDistance) -0:46 'gl_ClipDistance' ( smooth out implicitly-sized array of float ClipDistance) +0:46 'gl_ClipDistance' ( smooth out unsized 2-element array of float ClipDistance) 0:46 Constant: 0:46 1 (const int) 0:46 Constant: @@ -132,7 +132,7 @@ 0:66 'gl_DepthRange' ( uniform structure{ global float near, global float far, global float diff}) 0:66 Constant: 0:66 1 (const int) -0:67 'gl_TexCoord' ( smooth out implicitly-sized array of 4-component vector of float TexCoord) +0:67 'gl_TexCoord' ( smooth out unsized 1-element array of 4-component vector of float TexCoord) 0:68 'gl_FogFragCoord' ( smooth out float FogFragCoord) 0:69 'gl_FrontColor' ( smooth out 4-component vector of float FrontColor) 0:? Linker Objects @@ -145,8 +145,8 @@ 0:? 'c3D' ( in 3-component vector of float) 0:? 'c4D' ( smooth temp 4-component vector of float) 0:? 'v4' ( uniform 4-component vector of float) -0:? 'gl_ClipDistance' ( smooth out implicitly-sized array of float ClipDistance) -0:? 'gl_TexCoord' ( smooth out implicitly-sized array of 4-component vector of float TexCoord) +0:? 'gl_ClipDistance' ( smooth out unsized 2-element array of float ClipDistance) +0:? 'gl_TexCoord' ( smooth out unsized 1-element array of 4-component vector of float TexCoord) 0:? 'abcdef' ( global int) 0:? 'qrstuv' ( global int) 0:? 'gl_VertexID' ( gl_VertexId int VertexId) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/140.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/140.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/140.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/140.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -52,7 +52,7 @@ 0:17 'gl_DepthRange' ( uniform structure{ global float near, global float far, global float diff}) 0:17 Constant: 0:17 1 (const int) -0:18 'gl_TexCoord' ( smooth out implicitly-sized array of 4-component vector of float TexCoord) +0:18 'gl_TexCoord' ( smooth out unsized 1-element array of 4-component vector of float TexCoord) 0:19 'gl_FogFragCoord' ( smooth out float FogFragCoord) 0:20 'gl_FrontColor' ( smooth out 4-component vector of float FrontColor) 0:48 Function Definition: foo( ( global void) @@ -133,7 +133,7 @@ 0:? Linker Objects 0:? 'sbuf' ( uniform isamplerBuffer) 0:? 'anon@0' (layout( column_major std140) uniform block{layout( column_major std140 offset=0) uniform int anonMem}) -0:? 'gl_TexCoord' ( smooth out implicitly-sized array of 4-component vector of float TexCoord) +0:? 'gl_TexCoord' ( smooth out unsized 1-element array of 4-component vector of float TexCoord) 0:? 'gl_Position' ( smooth out 4-component vector of float) 0:? 'locBad' (layout( location=9) in 4-component vector of float) 0:? 'loc' (layout( location=9) in 4-component vector of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/150.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/150.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/150.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/150.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -67,16 +67,16 @@ 0:32 0 (const int) 0:33 move second child to first child ( temp float) 0:33 direct index (layout( stream=0) temp float ClipDistance) -0:33 gl_ClipDistance: direct index for structure (layout( stream=0) out implicitly-sized array of float ClipDistance) -0:33 'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:33 gl_ClipDistance: direct index for structure (layout( stream=0) out unsized 4-element array of float ClipDistance) +0:33 'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 4-element array of float ClipDistance gl_ClipDistance}) 0:33 Constant: 0:33 2 (const uint) 0:33 Constant: 0:33 3 (const int) 0:33 direct index ( temp float ClipDistance) -0:33 gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance) -0:33 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:33 'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:33 gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance) +0:33 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:33 'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:33 Constant: 0:33 1 (const int) 0:33 Constant: @@ -85,24 +85,24 @@ 0:33 2 (const int) 0:34 move second child to first child ( temp 4-component vector of float) 0:34 gl_Position: direct index for structure (layout( stream=0) gl_Position 4-component vector of float Position) -0:34 'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:34 'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 4-element array of float ClipDistance gl_ClipDistance}) 0:34 Constant: 0:34 0 (const uint) 0:34 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:34 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:34 'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:34 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:34 'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:34 Constant: 0:34 0 (const int) 0:34 Constant: 0:34 0 (const int) 0:35 move second child to first child ( temp float) 0:35 gl_PointSize: direct index for structure (layout( stream=0) gl_PointSize float PointSize) -0:35 'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:35 'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 4-element array of float ClipDistance gl_ClipDistance}) 0:35 Constant: 0:35 1 (const uint) 0:35 gl_PointSize: direct index for structure ( in float PointSize) -0:35 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:35 'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:35 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:35 'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:35 Constant: 0:35 3 (const int) 0:35 Constant: @@ -151,8 +151,8 @@ 0:? 'fromV' ( in 4-element array of block{ in 3-component vector of float color}) 0:? 'toF' (layout( stream=0) out block{layout( stream=0) out 3-component vector of float color}) 0:? 'anon@0' (layout( stream=0) out block{layout( stream=0) out 3-component vector of float color}) -0:? 'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:? 'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:? 'anon@1' (layout( stream=0) out block{layout( stream=0) gl_Position 4-component vector of float Position gl_Position, layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 4-element array of float ClipDistance gl_ClipDistance}) +0:? 'gl_in' ( in 4-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:? 'ov0' (layout( stream=0) out 4-component vector of float) 0:? 'ov4' (layout( stream=4) out 4-component vector of float) 0:? 'o1v0' (layout( stream=0) out 4-component vector of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/150.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/150.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/150.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/150.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -16,8 +16,8 @@ 0:20 move second child to first child ( temp 4-component vector of float) 0:20 'p' ( temp 4-component vector of float) 0:20 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:20 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:20 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:20 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:20 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:20 Constant: 0:20 1 (const int) 0:20 Constant: @@ -26,8 +26,8 @@ 0:21 move second child to first child ( temp float) 0:21 'ps' ( temp float) 0:21 gl_PointSize: direct index for structure ( in float PointSize) -0:21 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:21 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:21 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:21 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:21 Constant: 0:21 1 (const int) 0:21 Constant: @@ -36,9 +36,9 @@ 0:22 move second child to first child ( temp float) 0:22 'cd' ( temp float) 0:22 direct index ( temp float ClipDistance) -0:22 gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance) -0:22 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:22 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:22 gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance) +0:22 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:22 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:22 Constant: 0:22 1 (const int) 0:22 Constant: @@ -59,25 +59,25 @@ 0:26 'gl_InvocationID' ( in int InvocationID) 0:28 move second child to first child ( temp 4-component vector of float) 0:28 gl_Position: direct index for structure ( out 4-component vector of float Position) -0:28 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:28 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:28 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) +0:28 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:28 'gl_InvocationID' ( in int InvocationID) 0:28 Constant: 0:28 0 (const int) 0:28 'p' ( temp 4-component vector of float) 0:29 move second child to first child ( temp float) 0:29 gl_PointSize: direct index for structure ( out float PointSize) -0:29 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:29 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:29 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) +0:29 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:29 'gl_InvocationID' ( in int InvocationID) 0:29 Constant: 0:29 1 (const int) 0:29 'ps' ( temp float) 0:30 move second child to first child ( temp float) 0:30 direct index ( temp float ClipDistance) -0:30 gl_ClipDistance: direct index for structure ( out implicitly-sized array of float ClipDistance) -0:30 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:30 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:30 gl_ClipDistance: direct index for structure ( out unsized 2-element array of float ClipDistance) +0:30 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) +0:30 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:30 'gl_InvocationID' ( in int InvocationID) 0:30 Constant: 0:30 2 (const int) @@ -99,7 +99,7 @@ 0:33 Constant: 0:33 1.300000 0:? Linker Objects -0:? 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:? 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:? 'outa' ( global 4-element array of int) 0:? 'patchOut' ( patch out 4-component vector of float) @@ -129,8 +129,8 @@ 0:22 move second child to first child ( temp 4-component vector of float) 0:22 'p' ( temp 4-component vector of float) 0:22 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:22 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:22 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:22 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:22 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:22 Constant: 0:22 1 (const int) 0:22 Constant: @@ -139,8 +139,8 @@ 0:23 move second child to first child ( temp float) 0:23 'ps' ( temp float) 0:23 gl_PointSize: direct index for structure ( in float PointSize) -0:23 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:23 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:23 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:23 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:23 Constant: 0:23 1 (const int) 0:23 Constant: @@ -149,9 +149,9 @@ 0:24 move second child to first child ( temp float) 0:24 'cd' ( temp float) 0:24 direct index ( temp float ClipDistance) -0:24 gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance) -0:24 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:24 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:24 gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance) +0:24 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:24 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:24 Constant: 0:24 1 (const int) 0:24 Constant: @@ -186,20 +186,20 @@ 0:30 1 (const int) 0:32 move second child to first child ( temp 4-component vector of float) 0:32 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position) -0:32 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:32 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:32 Constant: 0:32 0 (const uint) 0:32 'p' ( temp 4-component vector of float) 0:33 move second child to first child ( temp float) 0:33 gl_PointSize: direct index for structure ( gl_PointSize float PointSize) -0:33 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:33 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:33 Constant: 0:33 1 (const uint) 0:33 'ps' ( temp float) 0:34 move second child to first child ( temp float) 0:34 direct index ( temp float ClipDistance) -0:34 gl_ClipDistance: direct index for structure ( out implicitly-sized array of float ClipDistance) -0:34 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:34 gl_ClipDistance: direct index for structure ( out unsized 3-element array of float ClipDistance) +0:34 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:34 Constant: 0:34 2 (const uint) 0:34 Constant: @@ -207,7 +207,7 @@ 0:34 'cd' ( temp float) 0:? Linker Objects 0:? 'patchIn' ( patch in 4-component vector of float) -0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 3-element array of float ClipDistance gl_ClipDistance}) 400.tesc ERROR: 0:6: 'quads' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) @@ -255,8 +255,8 @@ 0:23 move second child to first child ( temp 4-component vector of float) 0:23 'p' ( temp 4-component vector of float) 0:23 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:23 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:23 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:23 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:23 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:23 Constant: 0:23 1 (const int) 0:23 Constant: @@ -265,8 +265,8 @@ 0:24 move second child to first child ( temp float) 0:24 'ps' ( temp float) 0:24 gl_PointSize: direct index for structure ( in float PointSize) -0:24 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:24 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:24 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:24 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:24 Constant: 0:24 1 (const int) 0:24 Constant: @@ -275,9 +275,9 @@ 0:25 move second child to first child ( temp float) 0:25 'cd' ( temp float) 0:25 direct index ( temp float ClipDistance) -0:25 gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance) -0:25 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:25 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:25 gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance) +0:25 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:25 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:25 Constant: 0:25 1 (const int) 0:25 Constant: @@ -298,25 +298,25 @@ 0:29 'gl_InvocationID' ( in int InvocationID) 0:31 move second child to first child ( temp 4-component vector of float) 0:31 gl_Position: direct index for structure ( out 4-component vector of float Position) -0:31 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:31 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:31 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) +0:31 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:31 'gl_InvocationID' ( in int InvocationID) 0:31 Constant: 0:31 0 (const int) 0:31 'p' ( temp 4-component vector of float) 0:32 move second child to first child ( temp float) 0:32 gl_PointSize: direct index for structure ( out float PointSize) -0:32 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:32 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:32 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) +0:32 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:32 'gl_InvocationID' ( in int InvocationID) 0:32 Constant: 0:32 1 (const int) 0:32 'ps' ( temp float) 0:33 move second child to first child ( temp float) 0:33 direct index ( temp float ClipDistance) -0:33 gl_ClipDistance: direct index for structure ( out implicitly-sized array of float ClipDistance) -0:33 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:33 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:33 gl_ClipDistance: direct index for structure ( out unsized 2-element array of float ClipDistance) +0:33 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) +0:33 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:33 'gl_InvocationID' ( in int InvocationID) 0:33 Constant: 0:33 2 (const int) @@ -386,8 +386,8 @@ 0:67 Function Parameters: 0:69 Sequence 0:69 gl_PointSize: direct index for structure ( out float PointSize) -0:69 direct index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:69 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:69 direct index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) +0:69 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:69 Constant: 0:69 4 (const int) 0:69 Constant: @@ -422,7 +422,7 @@ 0:123 'gl_DeviceIndex' ( in int DeviceIndex) 0:124 'gl_ViewIndex' ( in int ViewIndex) 0:? Linker Objects -0:? 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:? 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:? 'outa' ( global 4-element array of int) 0:? 'patchIn' ( patch in 4-component vector of float) 0:? 'patchOut' ( patch out 4-component vector of float) @@ -453,7 +453,7 @@ ERROR: 0:48: 'patch' : cannot use interpolation qualifiers with patch ERROR: 0:49: 'patch' : cannot use interpolation qualifiers with patch ERROR: 0:50: '' : can only have one auxiliary qualifier (centroid, patch, and sample) -ERROR: 0:54: 'gl_PerVertex' : block already declared with size, can't redeclare as implicitly-sized +ERROR: 0:54: 'gl_PerVertex' : block already declared with size, can't redeclare as unsized ERROR: 0:59: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use ERROR: 0:64: 'quads' : cannot apply to 'out' ERROR: 0:64: 'cw' : can only apply to 'in' @@ -499,8 +499,8 @@ 0:32 move second child to first child ( temp 4-component vector of float) 0:32 'p' ( temp 4-component vector of float) 0:32 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:32 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:32 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:32 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:32 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:32 Constant: 0:32 1 (const int) 0:32 Constant: @@ -509,8 +509,8 @@ 0:33 move second child to first child ( temp float) 0:33 'ps' ( temp float) 0:33 gl_PointSize: direct index for structure ( in float PointSize) -0:33 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:33 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:33 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:33 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:33 Constant: 0:33 1 (const int) 0:33 Constant: @@ -519,9 +519,9 @@ 0:34 move second child to first child ( temp float) 0:34 'cd' ( temp float) 0:34 direct index ( temp float ClipDistance) -0:34 gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance) -0:34 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:34 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:34 gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance) +0:34 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:34 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:34 Constant: 0:34 1 (const int) 0:34 Constant: @@ -556,20 +556,20 @@ 0:40 1 (const int) 0:42 move second child to first child ( temp 4-component vector of float) 0:42 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position) -0:42 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:42 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:42 Constant: 0:42 0 (const uint) 0:42 'p' ( temp 4-component vector of float) 0:43 move second child to first child ( temp float) 0:43 gl_PointSize: direct index for structure ( gl_PointSize float PointSize) -0:43 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:43 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:43 Constant: 0:43 1 (const uint) 0:43 'ps' ( temp float) 0:44 move second child to first child ( temp float) 0:44 direct index ( temp float ClipDistance) -0:44 gl_ClipDistance: direct index for structure ( out implicitly-sized array of float ClipDistance) -0:44 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:44 gl_ClipDistance: direct index for structure ( out unsized 3-element array of float ClipDistance) +0:44 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:44 Constant: 0:44 2 (const uint) 0:44 Constant: @@ -588,7 +588,7 @@ 0:? Linker Objects 0:? 'patchIn' ( patch in 4-component vector of float) 0:? 'patchOut' ( patch out 4-component vector of float) -0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:? 'badp1' ( smooth patch in 4-component vector of float) 0:? 'badp2' ( flat patch in 4-component vector of float) 0:? 'badp3' ( noperspective patch in 4-component vector of float) @@ -620,7 +620,7 @@ 0:8 Function Definition: main( ( global void) 0:8 Function Parameters: 0:? Linker Objects -0:? 'gl_out' ( out implicitly-sized array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:? 'gl_out' ( out unsized 1-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance}) 0:? 'outa' ( global 1-element array of int) 0:? 'patchOut' ( patch out 4-component vector of float) @@ -646,8 +646,8 @@ 0:17 move second child to first child ( temp 4-component vector of float) 0:17 'p' ( temp 4-component vector of float) 0:17 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:17 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:17 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:17 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:17 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:17 Constant: 0:17 1 (const int) 0:17 Constant: @@ -656,8 +656,8 @@ 0:18 move second child to first child ( temp float) 0:18 'ps' ( temp float) 0:18 gl_PointSize: direct index for structure ( in float PointSize) -0:18 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:18 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:18 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:18 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:18 Constant: 0:18 1 (const int) 0:18 Constant: @@ -666,9 +666,9 @@ 0:19 move second child to first child ( temp float) 0:19 'cd' ( temp float) 0:19 direct index ( temp float ClipDistance) -0:19 gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance) -0:19 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:19 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:19 gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance) +0:19 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:19 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:19 Constant: 0:19 1 (const int) 0:19 Constant: @@ -883,7 +883,7 @@ 0:? 'b3' ( global 2-element array of 4-component vector of float) 0:? 'b4' ( global 2-element array of 4-component vector of float) 0:? 'c3' ( global 4X2 matrix of float) -0:? 'd2' ( global implicitly-sized array of structure{ global float s, global float t}) +0:? 'd2' ( global unsized 1-element array of structure{ global float s, global float t}) 0:? 'b5' ( global 5-element array of float) 0:? 'single1' ( global structure{ global int f}) 0:? 'single2' ( global structure{ global 2-component vector of uint v}) @@ -943,8 +943,6 @@ ERROR: Linking tessellation control stage: Multiple function bodies in multiple compilation units for the same signature in the same stage: main( ERROR: Linking tessellation control stage: Types must match: - gl_out: " out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}" versus " out implicitly-sized array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}" -ERROR: Linking tessellation control stage: Types must match: outa: " global 4-element array of int" versus " global 1-element array of int" ERROR: Linking tessellation control stage: can't handle multiple entry points per stage ERROR: Linking tessellation control stage: Multiple function bodies in multiple compilation units for the same signature in the same stage: @@ -956,7 +954,7 @@ ERROR: Linking tessellation control stage: Multiple function bodies in multiple compilation units for the same signature in the same stage: main( ERROR: Linking tessellation control stage: Types must match: - gl_out: " out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}" versus " out 3-element array of block{ out 4-component vector of float Position gl_Position}" + gl_out: " out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}" versus " out 3-element array of block{ out 4-component vector of float Position gl_Position}" Linked tessellation evaluation stage: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/150.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/150.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/150.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/150.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -11,20 +11,20 @@ 0:15 Sequence 0:15 move second child to first child ( temp 4-component vector of float) 0:15 gl_Position: direct index for structure ( invariant gl_Position 4-component vector of float Position) -0:15 'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 4-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:15 'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 4-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 0:15 Constant: 0:15 0 (const uint) 0:15 'iv4' ( in 4-component vector of float) 0:16 move second child to first child ( temp float) 0:16 gl_PointSize: direct index for structure ( gl_PointSize float PointSize) -0:16 'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 4-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:16 'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 4-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 0:16 Constant: 0:16 1 (const uint) 0:16 'ps' ( uniform float) 0:17 move second child to first child ( temp float) 0:17 direct index ( temp float ClipDistance) 0:17 gl_ClipDistance: direct index for structure ( out 4-element array of float ClipDistance) -0:17 'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 4-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:17 'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 4-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 0:17 Constant: 0:17 2 (const uint) 0:17 Constant: @@ -35,14 +35,14 @@ 0:17 0 (const int) 0:18 move second child to first child ( temp 4-component vector of float) 0:18 gl_ClipVertex: direct index for structure ( gl_ClipVertex 4-component vector of float ClipVertex) -0:18 'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 4-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:18 'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 4-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 0:18 Constant: 0:18 3 (const uint) 0:18 'iv4' ( in 4-component vector of float) 0:? Linker Objects 0:? 'iv4' ( in 4-component vector of float) 0:? 'ps' ( uniform float) -0:? 'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform implicitly-sized array of int a}) +0:? 'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform unsized 1-element array of int a}) 0:? 'gl_VertexID' ( gl_VertexId int VertexId) 0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/300.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/300.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/300.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/300.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,7 @@ 300.frag ERROR: 0:2: 'float' : type requires declaration of default precision qualifier ERROR: 0:30: 'noperspective' : Reserved word. -ERROR: 0:30: 'noperspective' : not supported with this profile: es +ERROR: 0:30: 'noperspective' : not supported for this version or the enabled extensions ERROR: 0:31: 'sampler2D' : sampler/image types can only be used in uniform variables or function parameters: bads ERROR: 0:32: 'uint' : cannot apply precision statement to this type; use 'float', 'int' or a sampler type ERROR: 0:39: 'structure' : must be qualified as flat in @@ -26,6 +26,7 @@ ERROR: 0:102: 'arrays of arrays' : not supported for this version or the enabled extensions ERROR: 0:102: 'arrays of arrays' : not supported for this version or the enabled extensions ERROR: 0:103: 'arrays of arrays' : not supported for this version or the enabled extensions +ERROR: 0:103: 'arrays of arrays' : not supported for this version or the enabled extensions ERROR: 0:100: 'arrays of arrays' : not supported for this version or the enabled extensions ERROR: 0:100: 'array-of-array of block' : not supported with this profile: es ERROR: 0:111: 'variable indexing fragment shader output array' : not supported with this profile: es @@ -44,7 +45,7 @@ ERROR: 0:158: 'invariant' : can only apply to an output ERROR: 0:160: 'imageBuffer' : Reserved word. ERROR: 0:160: '' : syntax error, unexpected IMAGEBUFFER, expecting COMMA or SEMICOLON -ERROR: 45 compilation errors. No code generated. +ERROR: 46 compilation errors. No code generated. Shader version: 300 @@ -392,7 +393,7 @@ 0:? 'sc' ( out lowp 3-component vector of float) 0:? 'sf' ( out lowp float) 0:? 'arrayedSampler' ( uniform 5-element array of lowp sampler2D) -0:? 'multiInst' (layout( column_major shared) uniform 2-element array of 3-element array of block{layout( column_major shared) uniform 2-element array of mediump int a, layout( column_major shared) uniform 2-element array of 3-element array of mediump int b, layout( column_major shared) uniform 2-element array of 3-element array of mediump int c}) +0:? 'multiInst' (layout( column_major shared) uniform 2-element array of 3-element array of block{layout( column_major shared) uniform 3-element array of 2-element array of mediump int a, layout( column_major shared) uniform 2-element array of 3-element array of mediump int b, layout( column_major shared) uniform 2-element array of 3-element array of mediump int c}) 0:? 'colors' ( out 4-element array of lowp 4-component vector of float) 0:? 'st1' ( uniform structure{ global mediump int i, global lowp sampler2D s}) 0:? 'st2' ( uniform structure{ global mediump int i, global lowp sampler2D s}) @@ -623,7 +624,7 @@ 0:? 'sc' ( out lowp 3-component vector of float) 0:? 'sf' ( out lowp float) 0:? 'arrayedSampler' ( uniform 5-element array of lowp sampler2D) -0:? 'multiInst' (layout( column_major shared) uniform 2-element array of 3-element array of block{layout( column_major shared) uniform 2-element array of mediump int a, layout( column_major shared) uniform 2-element array of 3-element array of mediump int b, layout( column_major shared) uniform 2-element array of 3-element array of mediump int c}) +0:? 'multiInst' (layout( column_major shared) uniform 2-element array of 3-element array of block{layout( column_major shared) uniform 3-element array of 2-element array of mediump int a, layout( column_major shared) uniform 2-element array of 3-element array of mediump int b, layout( column_major shared) uniform 2-element array of 3-element array of mediump int c}) 0:? 'colors' ( out 4-element array of lowp 4-component vector of float) 0:? 'st1' ( uniform structure{ global mediump int i, global lowp sampler2D s}) 0:? 'st2' ( uniform structure{ global mediump int i, global lowp sampler2D s}) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/300.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/300.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/300.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/300.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -320,9 +320,9 @@ 0:? 'rep2' ( centroid smooth sample out highp 4-component vector of float) 0:? 'rep3' ( in highp 4-component vector of float) 0:? 's' ( smooth out structure{ global highp 3-component vector of float c, global highp float f}) -0:? 'badsize' ( global implicitly-sized array of highp float) -0:? 'badsize2' ( global implicitly-sized array of highp float) -0:? 'ubInst' (layout( column_major shared) uniform implicitly-sized array of block{layout( column_major shared) uniform implicitly-sized array of highp int a}) +0:? 'badsize' ( global unsized 1-element array of highp float) +0:? 'badsize2' ( global unsized 1-element array of highp float) +0:? 'ubInst' (layout( column_major shared) uniform unsized 1-element array of block{layout( column_major shared) uniform unsized 1-element array of highp int a}) 0:? 'okayA' ( global 2-element array of highp float) 0:? 'newV' ( invariant smooth out highp 3-component vector of float) 0:? 'invIn' ( invariant in highp 4-component vector of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310AofA.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310AofA.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310AofA.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310AofA.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -7,12 +7,12 @@ ERROR: 0:49: 'constructor' : array constructor argument not correct type to construct array element ERROR: 0:62: '[' : array index out of range '4' ERROR: 0:78: 'assign' : cannot convert from ' global 4-element array of 7-element array of highp float' to ' global 5-element array of 7-element array of highp float' -ERROR: 0:79: 'assign' : cannot convert from ' global 4-element array of 7-element array of highp float' to ' global implicitly-sized array of 7-element array of highp float' +ERROR: 0:79: 'assign' : cannot convert from ' global 4-element array of 7-element array of highp float' to ' global unsized 1-element array of 7-element array of highp float' ERROR: 0:81: 'foo' : no matching overloaded function found ERROR: 0:86: '==' : wrong operand types: no operation '==' exists that takes a left-hand operand of type ' global 4-element array of 7-element array of highp float' and a right operand of type ' global 5-element array of 7-element array of highp float' (or there is no acceptable conversion) ERROR: 0:90: '[' : array index out of range '5' ERROR: 0:94: '[' : index out of range '-1' -ERROR: 0:96: 'assign' : cannot convert from ' temp 3-element array of highp 4-component vector of float' to 'layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float' +ERROR: 0:96: 'assign' : cannot convert from ' temp 3-element array of highp 4-component vector of float' to 'layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float' ERROR: 0:103: '' : array size required ERROR: 0:104: '' : array size required ERROR: 0:105: '' : array size required @@ -245,7 +245,7 @@ 0:77 Function Call: foo(f1[5][7]; ( global 4-element array of 7-element array of highp float) 0:77 'g5' ( global 5-element array of 7-element array of highp float) 0:78 'g5' ( global 5-element array of 7-element array of highp float) -0:79 'gu' ( global implicitly-sized array of 7-element array of highp float) +0:79 'gu' ( global unsized 1-element array of 7-element array of highp float) 0:81 Constant: 0:81 0.000000 0:82 Function Call: bar(f1[5][7]; ( global void) @@ -275,9 +275,9 @@ 0:91 Function Call: foo(f1[5][7]; ( global 4-element array of 7-element array of highp float) 0:91 'u' ( temp 5-element array of 7-element array of highp float) 0:94 direct index (layout( column_major shared) temp highp 4-component vector of float) -0:94 v: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float) -0:94 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v}) -0:94 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v}) +0:94 v: direct index for structure (layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float) +0:94 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v}) +0:94 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v}) 0:94 Constant: 0:94 1 (const int) 0:94 Constant: @@ -286,9 +286,9 @@ 0:94 -1 (const int) 0:95 move second child to first child ( temp highp 4-component vector of float) 0:95 direct index (layout( column_major shared) temp highp 4-component vector of float) -0:95 v: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float) -0:95 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v}) -0:95 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v}) +0:95 v: direct index for structure (layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float) +0:95 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v}) +0:95 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v}) 0:95 Constant: 0:95 1 (const int) 0:95 Constant: @@ -300,9 +300,9 @@ 0:95 4.300000 0:95 4.300000 0:95 4.300000 -0:96 v: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float) -0:96 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v}) -0:96 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v}) +0:96 v: direct index for structure (layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float) +0:96 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v}) +0:96 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v}) 0:96 Constant: 0:96 1 (const int) 0:96 Constant: @@ -310,9 +310,9 @@ 0:98 Constant: 0:98 7 (const int) 0:99 array length ( temp int) -0:99 v: direct index for structure (layout( column_major shared) buffer implicitly-sized array of 7-element array of highp 4-component vector of float) -0:99 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v}) -0:99 'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v}) +0:99 v: direct index for structure (layout( column_major shared) buffer unsized 2-element array of 7-element array of highp 4-component vector of float) +0:99 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer unsized 2-element array of 7-element array of highp 4-component vector of float v}) +0:99 'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer unsized 2-element array of 7-element array of highp 4-component vector of float v}) 0:99 Constant: 0:99 0 (const int) 0:99 Constant: @@ -337,12 +337,12 @@ 0:120 Constant: 0:120 2 (const int) 0:? Linker Objects -0:? 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v}) -0:? 'uname' (layout( column_major shared) uniform 3-element array of block{layout( column_major shared) uniform highp float u, layout( column_major shared) uniform implicitly-sized array of highp 4-component vector of float v}) -0:? 'name2' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 1-element array of highp 4-component vector of float v}) -0:? 'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v}) +0:? 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer unsized 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v}) +0:? 'uname' (layout( column_major shared) uniform 3-element array of block{layout( column_major shared) uniform highp float u, layout( column_major shared) uniform unsized 1-element array of highp 4-component vector of float v}) +0:? 'name2' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer unsized 1-element array of 1-element array of highp 4-component vector of float v}) +0:? 'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer unsized 2-element array of 7-element array of highp 4-component vector of float v}) 0:? 'many' ( global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of highp float) -0:? 'gu' ( global implicitly-sized array of 7-element array of highp float) +0:? 'gu' ( global unsized 1-element array of 7-element array of highp float) 0:? 'g4' ( global 4-element array of 7-element array of highp float) 0:? 'g5' ( global 5-element array of 7-element array of highp float) 0:? 'inArray' ( in 2-element array of 3-element array of highp float) @@ -378,10 +378,10 @@ 0:13 2 (const uint) 0:13 'd' ( temp 3-element array of 2-element array of highp int) 0:? Linker Objects -0:? 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v}) +0:? 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer 1-element array of highp float u, layout( column_major shared) buffer unsized 2-element array of highp 4-component vector of float v}) 0:? 'uname' (layout( column_major shared) uniform 3-element array of block{layout( column_major shared) uniform highp float u, layout( column_major shared) uniform 1-element array of highp 4-component vector of float v}) -0:? 'name2' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 1-element array of highp 4-component vector of float v}) -0:? 'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v}) +0:? 'name2' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer unsized 1-element array of 1-element array of highp 4-component vector of float v}) +0:? 'name3' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer highp float u, layout( column_major shared) buffer unsized 2-element array of 7-element array of highp 4-component vector of float v}) 0:? 'many' ( global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of highp float) 0:? 'gu' ( global 1-element array of 7-element array of highp float) 0:? 'g4' ( global 4-element array of 7-element array of highp float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -40,7 +40,6 @@ ERROR: 0:128: 'atomic_uint' : samplers and atomic_uints cannot be output parameters ERROR: 0:130: 'return' : type does not match, or is not convertible to, the function's return type ERROR: 0:136: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: non_uniform_counter -ERROR: 0:136: 'atomic_uint' : layout(binding=X) is required ERROR: 0:141: 'atomic_uint' : atomic counters can only be highp ERROR: 0:141: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings ERROR: 0:143: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings @@ -84,7 +83,7 @@ ERROR: 0:244: 'gl_DeviceIndex' : required extension not requested: GL_EXT_device_group ERROR: 0:245: 'gl_ViewIndex' : undeclared identifier ERROR: 0:255: 'gl_ViewIndex' : undeclared identifier -ERROR: 83 compilation errors. No code generated. +ERROR: 82 compilation errors. No code generated. Shader version: 310 @@ -103,13 +102,13 @@ 0:35 GroupMemoryBarrier ( global void) 0:36 move second child to first child ( temp highp int) 0:36 value: direct index for structure (layout( column_major shared) buffer highp int) -0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer runtime-sized array of highp float values}) 0:36 Constant: 0:36 0 (const uint) 0:36 Convert float to int ( temp highp int) 0:36 indirect index (layout( column_major shared) temp highp float) -0:36 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:36 values: direct index for structure (layout( column_major shared) buffer runtime-sized array of highp float) +0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer runtime-sized array of highp float values}) 0:36 Constant: 0:36 1 (const uint) 0:36 'gl_LocalInvocationIndex' ( in highp uint LocalInvocationIndex) @@ -118,8 +117,8 @@ 0:61 Sequence 0:61 move second child to first child ( temp highp float) 0:61 direct index (layout( column_major shared) temp highp float) -0:61 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:61 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:61 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:61 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:61 Constant: 0:61 1 (const int) 0:61 Constant: @@ -127,8 +126,8 @@ 0:61 Constant: 0:61 4.700000 0:62 array length ( temp int) -0:62 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:62 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:62 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:62 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:62 Constant: 0:62 1 (const int) 0:63 Pre-Increment ( temp highp 4-component vector of float) @@ -281,8 +280,8 @@ 0:194 move second child to first child ( temp highp float) 0:194 'g' ( temp highp float) 0:194 direct index (layout( column_major shared) temp highp float) -0:194 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:194 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:194 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:194 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:194 Constant: 0:194 1 (const int) 0:194 Constant: @@ -291,24 +290,24 @@ 0:195 move second child to first child ( temp highp float) 0:195 'f' ( temp highp float) 0:195 direct index (layout( column_major shared) temp highp float) -0:195 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:195 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:195 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:195 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:195 Constant: 0:195 1 (const int) 0:195 Constant: 0:195 2 (const int) 0:196 Pre-Increment ( temp highp float) 0:196 direct index (layout( column_major shared) temp highp float) -0:196 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:196 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:196 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:196 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:196 Constant: 0:196 1 (const int) 0:196 Constant: 0:196 2 (const int) 0:197 Post-Decrement ( temp highp float) 0:197 direct index (layout( column_major shared) temp highp float) -0:197 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:197 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:197 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:197 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:197 Constant: 0:197 1 (const int) 0:197 Constant: @@ -316,16 +315,16 @@ 0:198 add ( temp highp float) 0:198 'f' ( temp highp float) 0:198 direct index (layout( column_major shared) temp highp float) -0:198 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:198 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:198 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:198 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:198 Constant: 0:198 1 (const int) 0:198 Constant: 0:198 2 (const int) 0:199 subtract ( temp highp float) 0:199 direct index (layout( column_major shared) temp highp float) -0:199 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:199 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:199 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:199 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:199 Constant: 0:199 1 (const int) 0:199 Constant: @@ -338,8 +337,8 @@ 0:201 'f' ( temp highp float) 0:201 false case 0:201 direct index (layout( column_major shared) temp highp float) -0:201 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:201 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:201 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:201 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:201 Constant: 0:201 1 (const int) 0:201 Constant: @@ -349,8 +348,8 @@ 0:202 'b' ( temp bool) 0:202 true case 0:202 direct index (layout( column_major shared) temp highp float) -0:202 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:202 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:202 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:202 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:202 Constant: 0:202 1 (const int) 0:202 Constant: @@ -362,8 +361,8 @@ 0:203 Compare Equal ( temp bool) 0:203 'f' ( temp highp float) 0:203 direct index (layout( column_major shared) temp highp float) -0:203 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:203 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:203 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:203 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:203 Constant: 0:203 1 (const int) 0:203 Constant: @@ -376,8 +375,8 @@ 0:205 Compare Greater Than or Equal ( temp bool) 0:205 'f' ( temp highp float) 0:205 direct index (layout( column_major shared) temp highp float) -0:205 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:205 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:205 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:205 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:205 Constant: 0:205 1 (const int) 0:205 Constant: @@ -390,8 +389,8 @@ 0:207 direct index ( temp highp float) 0:207 Construct vec3 ( temp highp 3-component vector of float) 0:207 direct index (layout( column_major shared) temp highp float) -0:207 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:207 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:207 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:207 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:207 Constant: 0:207 1 (const int) 0:207 Constant: @@ -400,13 +399,13 @@ 0:207 0 (const int) 0:208 Bitwise not ( temp highp int) 0:208 value: direct index for structure (layout( column_major shared) buffer highp int) -0:208 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:208 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:208 Constant: 0:208 0 (const int) 0:209 move second child to first child ( temp highp float) 0:209 direct index (layout( column_major shared) temp highp float) -0:209 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:209 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:209 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:209 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:209 Constant: 0:209 1 (const int) 0:209 Constant: @@ -419,21 +418,21 @@ 0:221 move second child to first child ( temp highp float) 0:221 'g' ( temp highp float) 0:221 direct index (layout( column_major shared) temp highp float) -0:221 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:221 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:221 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:221 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:221 Constant: 0:221 1 (const int) 0:221 Constant: 0:221 2 (const int) 0:222 Bitwise not ( temp highp int) 0:222 value: direct index for structure (layout( column_major shared) buffer highp int) -0:222 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:222 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:222 Constant: 0:222 0 (const int) 0:223 move second child to first child ( temp highp float) 0:223 direct index (layout( column_major shared) temp highp float) -0:223 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:223 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:223 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of highp float) +0:223 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:223 Constant: 0:223 1 (const int) 0:223 Constant: @@ -442,7 +441,7 @@ 0:223 3.400000 0:224 move second child to first child ( temp highp int) 0:224 value: direct index for structure (layout( column_major shared) buffer highp int) -0:224 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:224 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:224 Constant: 0:224 0 (const int) 0:224 Constant: @@ -464,8 +463,8 @@ 0:? 4096 (const uint) 0:? 'total' ( const highp int) 0:? 66592 (const int) -0:? 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) -0:? 'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer implicitly-sized array of highp float values, layout( column_major shared) buffer highp int value}) +0:? 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer runtime-sized array of highp float values}) +0:? 'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 1-element array of highp float values, layout( column_major shared) buffer highp int value}) 0:? 'v3' (layout( location=2) in highp 3-component vector of float) 0:? 'f' ( in highp float) 0:? 'fo' ( out highp float) @@ -475,7 +474,7 @@ 0:? 'arrX' ( global 2-element array of highp int) 0:? 'arrY' ( global 1-element array of highp int) 0:? 'arrZ' ( global 4096-element array of highp int) -0:? 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:? 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:? 'v' ( buffer highp 4-component vector of float) 0:? 'us2dbad' ( uniform mediump usampler2D) 0:? 'us2d' ( uniform highp usampler2D) @@ -514,8 +513,8 @@ 0:? 'badQ1' (layout( rgba32f) coherent volatile restrict uniform highp image2D) 0:? 'badQ2' (layout( rgba8i) coherent volatile restrict uniform highp iimage2D) 0:? 'badQ3' (layout( rgba16ui) coherent volatile restrict uniform highp uimage2D) -0:? 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) -0:? 'multio' (layout( column_major shared) buffer block{layout( column_major shared) readonly buffer highp int value, layout( column_major shared) writeonly buffer implicitly-sized array of highp float values}) +0:? 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) +0:? 'multio' (layout( column_major shared) buffer block{layout( column_major shared) readonly buffer highp int value, layout( column_major shared) writeonly buffer unsized 1-element array of highp float values}) 0:? 'inbi' ( in block{ in highp int a}) 0:? 'outbi' ( out block{ out highp int a}) 0:? 't__' ( global highp float) @@ -541,13 +540,13 @@ 0:35 GroupMemoryBarrier ( global void) 0:36 move second child to first child ( temp highp int) 0:36 value: direct index for structure (layout( column_major shared) buffer highp int) -0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer runtime-sized array of highp float values}) 0:36 Constant: 0:36 0 (const uint) 0:36 Convert float to int ( temp highp int) 0:36 indirect index (layout( column_major shared) temp highp float) -0:36 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of highp float) -0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:36 values: direct index for structure (layout( column_major shared) buffer runtime-sized array of highp float) +0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer runtime-sized array of highp float values}) 0:36 Constant: 0:36 1 (const uint) 0:36 'gl_LocalInvocationIndex' ( in highp uint LocalInvocationIndex) @@ -558,8 +557,8 @@ 0:? 4096 (const uint) 0:? 'total' ( const highp int) 0:? 66592 (const int) -0:? 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) -0:? 'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer implicitly-sized array of highp float values, layout( column_major shared) buffer highp int value}) +0:? 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer runtime-sized array of highp float values}) +0:? 'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer 1-element array of highp float values, layout( column_major shared) buffer highp int value}) 0:? 'v3' (layout( location=2) in highp 3-component vector of float) 0:? 'f' ( in highp float) 0:? 'fo' ( out highp float) @@ -569,7 +568,7 @@ 0:? 'arrX' ( global 2-element array of highp int) 0:? 'arrY' ( global 1-element array of highp int) 0:? 'arrZ' ( global 4096-element array of highp int) -0:? 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) +0:? 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) 0:? 'v' ( buffer highp 4-component vector of float) 0:? 'us2dbad' ( uniform mediump usampler2D) 0:? 'us2d' ( uniform highp usampler2D) @@ -608,8 +607,8 @@ 0:? 'badQ1' (layout( rgba32f) coherent volatile restrict uniform highp image2D) 0:? 'badQ2' (layout( rgba8i) coherent volatile restrict uniform highp iimage2D) 0:? 'badQ3' (layout( rgba16ui) coherent volatile restrict uniform highp uimage2D) -0:? 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer implicitly-sized array of highp float values}) -0:? 'multio' (layout( column_major shared) buffer block{layout( column_major shared) readonly buffer highp int value, layout( column_major shared) writeonly buffer implicitly-sized array of highp float values}) +0:? 'wo' (layout( column_major shared) writeonly buffer block{layout( column_major shared) buffer highp int value, layout( column_major shared) buffer unsized 3-element array of highp float values}) +0:? 'multio' (layout( column_major shared) buffer block{layout( column_major shared) readonly buffer highp int value, layout( column_major shared) writeonly buffer unsized 1-element array of highp float values}) 0:? 'inbi' ( in block{ in highp int a}) 0:? 'outbi' ( out block{ out highp int a}) 0:? 't__' ( global highp float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -105,7 +105,7 @@ ERROR: 0:347: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output ERROR: 0:348: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output ERROR: 0:349: 'noperspective' : Reserved word. -ERROR: 0:349: 'noperspective' : not supported with this profile: es +ERROR: 0:349: 'noperspective' : not supported for this version or the enabled extensions ERROR: 0:349: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output ERROR: 0:355: 'interpolateAtCentroid' : required extension not requested: GL_OES_shader_multisample_interpolation ERROR: 0:356: 'interpolateAtSample' : required extension not requested: GL_OES_shader_multisample_interpolation @@ -569,12 +569,12 @@ 0:259 move second child to first child ( temp highp int) 0:259 'a3' ( temp highp int) 0:259 direct index ( flat temp highp int SampleMaskIn) -0:259 'gl_SampleMaskIn' ( flat in implicitly-sized array of highp int SampleMaskIn) +0:259 'gl_SampleMaskIn' ( flat in unsized 1-element array of highp int SampleMaskIn) 0:259 Constant: 0:259 0 (const int) 0:260 move second child to first child ( temp highp int) 0:260 direct index ( temp highp int SampleMaskIn) -0:260 'gl_SampleMask' ( out implicitly-sized array of highp int SampleMaskIn) +0:260 'gl_SampleMask' ( out unsized 1-element array of highp int SampleMaskIn) 0:260 Constant: 0:260 0 (const int) 0:260 'a3' ( temp highp int) @@ -597,12 +597,12 @@ 0:272 move second child to first child ( temp highp int) 0:272 'a3' ( temp highp int) 0:272 direct index ( flat temp highp int SampleMaskIn) -0:272 'gl_SampleMaskIn' ( flat in implicitly-sized array of highp int SampleMaskIn) +0:272 'gl_SampleMaskIn' ( flat in unsized 1-element array of highp int SampleMaskIn) 0:272 Constant: 0:272 0 (const int) 0:273 move second child to first child ( temp highp int) 0:273 direct index ( temp highp int SampleMaskIn) -0:273 'gl_SampleMask' ( out implicitly-sized array of highp int SampleMaskIn) +0:273 'gl_SampleMask' ( out unsized 1-element array of highp int SampleMaskIn) 0:273 Constant: 0:273 0 (const int) 0:273 'a3' ( temp highp int) @@ -1001,8 +1001,8 @@ 0:? 'CA5' ( uniform highp samplerCubeArrayShadow) 0:? 'CA6' ( uniform highp isamplerCubeArray) 0:? 'CA7' ( uniform highp usamplerCubeArray) -0:? 'gl_SampleMaskIn' ( flat in implicitly-sized array of highp int SampleMaskIn) -0:? 'gl_SampleMask' ( out implicitly-sized array of highp int SampleMaskIn) +0:? 'gl_SampleMaskIn' ( flat in unsized 1-element array of highp int SampleMaskIn) +0:? 'gl_SampleMask' ( out unsized 1-element array of highp int SampleMaskIn) 0:? 'im2Df' (layout( r32f) uniform highp image2D) 0:? 'im2Du' (layout( r32ui) uniform highp uimage2D) 0:? 'im2Di' (layout( r32i) uniform highp iimage2D) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310implicitSizeArrayError.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310implicitSizeArrayError.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310implicitSizeArrayError.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310implicitSizeArrayError.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -11,14 +11,14 @@ 0:7 move second child to first child ( temp highp int) 0:7 'o' (layout( location=0) smooth out highp int) 0:7 direct index (layout( column_major shared) temp highp int) -0:7 a: direct index for structure (layout( column_major shared) uniform implicitly-sized array of highp int) -0:7 'uni' (layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform implicitly-sized array of highp int a}) +0:7 a: direct index for structure (layout( column_major shared) uniform unsized 3-element array of highp int) +0:7 'uni' (layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform unsized 3-element array of highp int a}) 0:7 Constant: 0:7 0 (const int) 0:7 Constant: 0:7 2 (const int) 0:? Linker Objects -0:? 'uni' (layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform implicitly-sized array of highp int a}) +0:? 'uni' (layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform unsized 3-element array of highp int a}) 0:? 'o' (layout( location=0) smooth out highp int) 0:? 'gl_VertexID' ( gl_VertexId highp int VertexId) 0:? 'gl_InstanceID' ( gl_InstanceId highp int InstanceId) @@ -35,14 +35,14 @@ 0:7 move second child to first child ( temp highp int) 0:7 'o' (layout( location=0) smooth out highp int) 0:7 direct index (layout( column_major shared) temp highp int) -0:7 a: direct index for structure (layout( column_major shared) uniform 1-element array of highp int) -0:7 'uni' (layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform 1-element array of highp int a}) +0:7 a: direct index for structure (layout( column_major shared) uniform 3-element array of highp int) +0:7 'uni' (layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform 3-element array of highp int a}) 0:7 Constant: 0:7 0 (const int) 0:7 Constant: 0:7 2 (const int) 0:? Linker Objects -0:? 'uni' (layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform 1-element array of highp int a}) +0:? 'uni' (layout( binding=0 column_major shared) uniform block{layout( column_major shared) uniform 3-element array of highp int a}) 0:? 'o' (layout( location=0) smooth out highp int) 0:? 'gl_VertexID' ( gl_VertexId highp int VertexId) 0:? 'gl_InstanceID' ( gl_InstanceId highp int InstanceId) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310runtimeArray.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310runtimeArray.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310runtimeArray.vert.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310runtimeArray.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,145 @@ +310runtimeArray.vert +ERROR: 0:9: '' : array size required +ERROR: 1 compilation errors. No code generated. + + +Shader version: 310 +ERROR: node is still EOpNull! +0:12 Function Definition: main( ( global void) +0:12 Function Parameters: +0:14 Sequence +0:14 move second child to first child ( temp highp float) +0:14 'o' (layout( location=0) smooth out highp float) +0:14 f: direct index for structure ( global highp float) +0:14 direct index (layout( column_major shared) temp structure{ global highp float f}) +0:14 s: direct index for structure (layout( column_major shared) buffer unsized 6-element array of structure{ global highp float f}) +0:14 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 6-element array of structure{ global highp float f} s}) +0:14 Constant: +0:14 0 (const uint) +0:14 Constant: +0:14 5 (const int) +0:14 Constant: +0:14 0 (const int) +0:15 add second child into first child ( temp highp float) +0:15 'o' (layout( location=0) smooth out highp float) +0:15 f: direct index for structure ( global highp float) +0:15 direct index (layout( column_major shared) temp structure{ global highp float f}) +0:15 s: direct index for structure (layout( column_major shared) buffer unsized 7-element array of structure{ global highp float f}) +0:15 'b2name' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 7-element array of structure{ global highp float f} s}) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 6 (const int) +0:15 Constant: +0:15 0 (const int) +0:16 add second child into first child ( temp highp float) +0:16 'o' (layout( location=0) smooth out highp float) +0:16 f: direct index for structure ( global highp float) +0:16 direct index (layout( column_major shared) temp structure{ global highp float f}) +0:16 s: direct index for structure (layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f}) +0:16 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f} s}) +0:16 'b3name' (layout( column_major shared) buffer unsized 4-element array of block{layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f} s}) +0:16 Constant: +0:16 3 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 7 (const int) +0:16 Constant: +0:16 0 (const int) +0:17 add second child into first child ( temp highp float) +0:17 'o' (layout( location=0) smooth out highp float) +0:17 f: direct index for structure ( global highp float) +0:17 direct index (layout( column_major shared) temp structure{ global highp float f}) +0:17 s: direct index for structure (layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f}) +0:17 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f} s}) +0:17 'b4name' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f} s}) +0:17 Constant: +0:17 2 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 8 (const int) +0:17 Constant: +0:17 0 (const int) +0:? Linker Objects +0:? 'o' (layout( location=0) smooth out highp float) +0:? 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 6-element array of structure{ global highp float f} s}) +0:? 'b2name' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 7-element array of structure{ global highp float f} s}) +0:? 'b3name' (layout( column_major shared) buffer unsized 4-element array of block{layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f} s}) +0:? 'b4name' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f} s}) +0:? 'gl_VertexID' ( gl_VertexId highp int VertexId) +0:? 'gl_InstanceID' ( gl_InstanceId highp int InstanceId) + + +Linked vertex stage: + + +Shader version: 310 +ERROR: node is still EOpNull! +0:12 Function Definition: main( ( global void) +0:12 Function Parameters: +0:14 Sequence +0:14 move second child to first child ( temp highp float) +0:14 'o' (layout( location=0) smooth out highp float) +0:14 f: direct index for structure ( global highp float) +0:14 direct index (layout( column_major shared) temp structure{ global highp float f}) +0:14 s: direct index for structure (layout( column_major shared) buffer unsized 6-element array of structure{ global highp float f}) +0:14 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 6-element array of structure{ global highp float f} s}) +0:14 Constant: +0:14 0 (const uint) +0:14 Constant: +0:14 5 (const int) +0:14 Constant: +0:14 0 (const int) +0:15 add second child into first child ( temp highp float) +0:15 'o' (layout( location=0) smooth out highp float) +0:15 f: direct index for structure ( global highp float) +0:15 direct index (layout( column_major shared) temp structure{ global highp float f}) +0:15 s: direct index for structure (layout( column_major shared) buffer unsized 7-element array of structure{ global highp float f}) +0:15 'b2name' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 7-element array of structure{ global highp float f} s}) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 6 (const int) +0:15 Constant: +0:15 0 (const int) +0:16 add second child into first child ( temp highp float) +0:16 'o' (layout( location=0) smooth out highp float) +0:16 f: direct index for structure ( global highp float) +0:16 direct index (layout( column_major shared) temp structure{ global highp float f}) +0:16 s: direct index for structure (layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f}) +0:16 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f} s}) +0:16 'b3name' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f} s}) +0:16 Constant: +0:16 3 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 7 (const int) +0:16 Constant: +0:16 0 (const int) +0:17 add second child into first child ( temp highp float) +0:17 'o' (layout( location=0) smooth out highp float) +0:17 f: direct index for structure ( global highp float) +0:17 direct index (layout( column_major shared) temp structure{ global highp float f}) +0:17 s: direct index for structure (layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f}) +0:17 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f} s}) +0:17 'b4name' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f} s}) +0:17 Constant: +0:17 2 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 8 (const int) +0:17 Constant: +0:17 0 (const int) +0:? Linker Objects +0:? 'o' (layout( location=0) smooth out highp float) +0:? 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 6-element array of structure{ global highp float f} s}) +0:? 'b2name' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 7-element array of structure{ global highp float f} s}) +0:? 'b3name' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer unsized 8-element array of structure{ global highp float f} s}) +0:? 'b4name' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer unsized 9-element array of structure{ global highp float f} s}) +0:? 'gl_VertexID' ( gl_VertexId highp int VertexId) +0:? 'gl_InstanceID' ( gl_InstanceId highp int InstanceId) + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -70,8 +70,8 @@ 0:25 move second child to first child ( temp highp 4-component vector of float) 0:25 'p' ( temp highp 4-component vector of float) 0:25 gl_Position: direct index for structure ( in highp 4-component vector of float Position) -0:25 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) -0:25 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) +0:25 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) +0:25 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) 0:25 Constant: 0:25 1 (const int) 0:25 Constant: @@ -80,8 +80,8 @@ 0:26 move second child to first child ( temp highp float) 0:26 'ps' ( temp highp float) 0:26 gl_PointSize: direct index for structure ( in highp float PointSize) -0:26 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) -0:26 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) +0:26 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) +0:26 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) 0:26 Constant: 0:26 1 (const int) 0:26 Constant: @@ -209,8 +209,8 @@ 0:114 move second child to first child ( temp highp float) 0:114 'ps' ( temp highp float) 0:114 gl_PointSize: direct index for structure ( in highp float PointSize) -0:114 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) -0:114 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) +0:114 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) +0:114 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) 0:114 Constant: 0:114 1 (const int) 0:114 Constant: @@ -357,7 +357,7 @@ 0:? 'inb' ( in 32-element array of highp 2-component vector of float) 0:? 'inc' ( in 32-element array of highp 2-component vector of float) 0:? 'ind' ( in 32-element array of highp 2-component vector of float) -0:? 'implA' ( patch out implicitly-sized array of highp float) +0:? 'implA' ( patch out unsized 1-element array of highp float) 0:? 'ivla' (layout( location=3) in 32-element array of highp 4-component vector of float) 0:? 'ivlb' (layout( location=4) in 32-element array of highp 4-component vector of float) 0:? 'ivlc' (layout( location=4) in 32-element array of highp 4-component vector of float) @@ -372,7 +372,7 @@ 0:? 'misSized' ( out 5-element array of highp float) 0:? 'okaySize' ( out 4-element array of highp float) 0:? 'pv3' ( noContraction temp highp 3-component vector of float) -0:? 'badpatchIName' ( patch out implicitly-sized array of block{ out highp float f}) +0:? 'badpatchIName' ( patch out unsized 1-element array of block{ out highp float f}) 0:? 'patchIName' ( patch out 4-element array of block{ out highp float f}) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310.tese.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310.tese.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/310.tese.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/310.tese.out 2018-04-27 11:46:26.000000000 +0000 @@ -21,11 +21,11 @@ ERROR: 0:51: 'patch' : cannot use interpolation qualifiers with patch ERROR: 0:52: 'patch' : cannot use interpolation qualifiers with patch ERROR: 0:53: 'noperspective' : Reserved word. -ERROR: 0:53: 'noperspective' : not supported with this profile: es +ERROR: 0:53: 'noperspective' : not supported for this version or the enabled extensions ERROR: 0:53: 'patch' : cannot use interpolation qualifiers with patch ERROR: 0:54: 'sample' : Reserved word. ERROR: 0:54: '' : can only have one auxiliary qualifier (centroid, patch, and sample) -ERROR: 0:58: 'gl_PerVertex' : block already declared with size, can't redeclare as implicitly-sized +ERROR: 0:58: 'gl_PerVertex' : block already declared with size, can't redeclare as unsized ERROR: 0:63: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use ERROR: 0:68: 'quads' : cannot apply to 'out' ERROR: 0:68: 'cw' : can only apply to 'in' @@ -77,8 +77,8 @@ 0:36 move second child to first child ( temp highp 4-component vector of float) 0:36 'p' ( temp highp 4-component vector of float) 0:36 gl_Position: direct index for structure ( in highp 4-component vector of float Position) -0:36 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) -0:36 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) +0:36 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) +0:36 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) 0:36 Constant: 0:36 1 (const int) 0:36 Constant: @@ -87,8 +87,8 @@ 0:37 move second child to first child ( temp highp float) 0:37 'ps' ( temp highp float) 0:37 gl_PointSize: direct index for structure ( in highp float PointSize) -0:37 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) -0:37 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) +0:37 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) +0:37 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) 0:37 Constant: 0:37 1 (const int) 0:37 Constant: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/320.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/320.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/320.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/320.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -23,7 +23,7 @@ ERROR: 0:158: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output ERROR: 0:159: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output ERROR: 0:160: 'noperspective' : Reserved word. -ERROR: 0:160: 'noperspective' : not supported with this profile: es +ERROR: 0:160: 'noperspective' : not supported for this version or the enabled extensions ERROR: 0:160: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output ERROR: 0:165: 'centroid/sample/patch' : can't use auxiliary qualifier on a fragment output ERROR: 0:180: 'interpolateAtCentroid' : no matching overloaded function found @@ -211,12 +211,12 @@ 0:113 move second child to first child ( temp highp int) 0:113 'a3' ( temp highp int) 0:113 direct index ( flat temp highp int SampleMaskIn) -0:113 'gl_SampleMaskIn' ( flat in implicitly-sized array of highp int SampleMaskIn) +0:113 'gl_SampleMaskIn' ( flat in unsized 1-element array of highp int SampleMaskIn) 0:113 Constant: 0:113 0 (const int) 0:114 move second child to first child ( temp highp int) 0:114 direct index ( temp highp int SampleMaskIn) -0:114 'gl_SampleMask' ( out implicitly-sized array of highp int SampleMaskIn) +0:114 'gl_SampleMask' ( out unsized 1-element array of highp int SampleMaskIn) 0:114 Constant: 0:114 0 (const int) 0:114 'a3' ( temp highp int) @@ -473,8 +473,8 @@ 0:? 'CA5' ( uniform highp samplerCubeArrayShadow) 0:? 'CA6' ( uniform highp isamplerCubeArray) 0:? 'CA7' ( uniform highp usamplerCubeArray) -0:? 'gl_SampleMaskIn' ( flat in implicitly-sized array of highp int SampleMaskIn) -0:? 'gl_SampleMask' ( out implicitly-sized array of highp int SampleMaskIn) +0:? 'gl_SampleMaskIn' ( flat in unsized 1-element array of highp int SampleMaskIn) +0:? 'gl_SampleMask' ( out unsized 1-element array of highp int SampleMaskIn) 0:? 'im2Df' (layout( r32f) uniform highp image2D) 0:? 'im2Du' (layout( r32ui) uniform highp uimage2D) 0:? 'im2Di' (layout( r32i) uniform highp iimage2D) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/320.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/320.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/320.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/320.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -62,8 +62,8 @@ 0:23 move second child to first child ( temp highp 4-component vector of float) 0:23 'p' ( temp highp 4-component vector of float) 0:23 gl_Position: direct index for structure ( in highp 4-component vector of float Position) -0:23 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) -0:23 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) +0:23 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) +0:23 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) 0:23 Constant: 0:23 1 (const int) 0:23 Constant: @@ -72,8 +72,8 @@ 0:24 move second child to first child ( temp highp float) 0:24 'ps' ( temp highp float) 0:24 gl_PointSize: direct index for structure ( in highp float PointSize) -0:24 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) -0:24 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) +0:24 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) +0:24 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) 0:24 Constant: 0:24 1 (const int) 0:24 Constant: @@ -192,8 +192,8 @@ 0:104 move second child to first child ( temp highp float) 0:104 'ps' ( temp highp float) 0:104 gl_PointSize: direct index for structure ( in highp float PointSize) -0:104 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) -0:104 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) +0:104 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) +0:104 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) 0:104 Constant: 0:104 1 (const int) 0:104 Constant: @@ -336,7 +336,7 @@ 0:? 'inb' ( in 32-element array of highp 2-component vector of float) 0:? 'inc' ( in 32-element array of highp 2-component vector of float) 0:? 'ind' ( in 32-element array of highp 2-component vector of float) -0:? 'implA' ( patch out implicitly-sized array of highp float) +0:? 'implA' ( patch out unsized 1-element array of highp float) 0:? 'ivla' (layout( location=3) in 32-element array of highp 4-component vector of float) 0:? 'ivlb' (layout( location=4) in 32-element array of highp 4-component vector of float) 0:? 'ivlc' (layout( location=4) in 32-element array of highp 4-component vector of float) @@ -351,7 +351,7 @@ 0:? 'misSized' ( out 5-element array of highp float) 0:? 'okaySize' ( out 4-element array of highp float) 0:? 'pv3' ( noContraction temp highp 3-component vector of float) -0:? 'badpatchIName' ( patch out implicitly-sized array of block{ out highp float f}) +0:? 'badpatchIName' ( patch out unsized 1-element array of block{ out highp float f}) 0:? 'patchIName' ( patch out 4-element array of block{ out highp float f}) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/320.tese.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/320.tese.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/320.tese.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/320.tese.out 2018-04-27 11:46:26.000000000 +0000 @@ -21,10 +21,10 @@ ERROR: 0:47: 'patch' : cannot use interpolation qualifiers with patch ERROR: 0:48: 'patch' : cannot use interpolation qualifiers with patch ERROR: 0:49: 'noperspective' : Reserved word. -ERROR: 0:49: 'noperspective' : not supported with this profile: es +ERROR: 0:49: 'noperspective' : not supported for this version or the enabled extensions ERROR: 0:49: 'patch' : cannot use interpolation qualifiers with patch ERROR: 0:50: '' : can only have one auxiliary qualifier (centroid, patch, and sample) -ERROR: 0:54: 'gl_PerVertex' : block already declared with size, can't redeclare as implicitly-sized +ERROR: 0:54: 'gl_PerVertex' : block already declared with size, can't redeclare as unsized ERROR: 0:59: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use ERROR: 0:64: 'quads' : cannot apply to 'out' ERROR: 0:64: 'cw' : can only apply to 'in' @@ -67,8 +67,8 @@ 0:32 move second child to first child ( temp highp 4-component vector of float) 0:32 'p' ( temp highp 4-component vector of float) 0:32 gl_Position: direct index for structure ( in highp 4-component vector of float Position) -0:32 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) -0:32 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) +0:32 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) +0:32 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) 0:32 Constant: 0:32 1 (const int) 0:32 Constant: @@ -77,8 +77,8 @@ 0:33 move second child to first child ( temp highp float) 0:33 'ps' ( temp highp float) 0:33 gl_PointSize: direct index for structure ( in highp float PointSize) -0:33 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) -0:33 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV}) +0:33 direct index ( temp block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) +0:33 'gl_in' ( in 32-element array of block{ in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in unsized 1-element array of highp 4-component vector of float gl_PositionPerViewNV}) 0:33 Constant: 0:33 1 (const int) 0:33 Constant: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/400.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/400.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/400.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/400.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -516,7 +516,7 @@ 0:? 'vl' (layout( location=4) smooth in 4-component vector of float) 0:? 'vl2' (layout( location=6) smooth in 4-component vector of float) 0:? 'uv3' (layout( location=3) uniform 3-component vector of float) -0:? 'anon@0' ( in block{ in float FogFragCoord gl_FogFragCoord, in implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, smooth in 4-component vector of float Color gl_Color, in 4-component vector of float SecondaryColor gl_SecondaryColor}) +0:? 'anon@0' ( in block{ in float FogFragCoord gl_FogFragCoord, in unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, smooth in 4-component vector of float Color gl_Color, in 4-component vector of float SecondaryColor gl_SecondaryColor}) 0:? 'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord) 0:? 'u2drs' ( uniform sampler2DRectShadow) 0:? 'patchIn' ( smooth patch in 4-component vector of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/400.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/400.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/400.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/400.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -44,8 +44,8 @@ 0:23 move second child to first child ( temp 4-component vector of float) 0:23 'p' ( temp 4-component vector of float) 0:23 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:23 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:23 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:23 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:23 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:23 Constant: 0:23 1 (const int) 0:23 Constant: @@ -54,8 +54,8 @@ 0:24 move second child to first child ( temp float) 0:24 'ps' ( temp float) 0:24 gl_PointSize: direct index for structure ( in float PointSize) -0:24 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:24 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:24 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:24 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:24 Constant: 0:24 1 (const int) 0:24 Constant: @@ -64,9 +64,9 @@ 0:25 move second child to first child ( temp float) 0:25 'cd' ( temp float) 0:25 direct index ( temp float ClipDistance) -0:25 gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance) -0:25 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:25 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:25 gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance) +0:25 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:25 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:25 Constant: 0:25 1 (const int) 0:25 Constant: @@ -87,25 +87,25 @@ 0:29 'gl_InvocationID' ( in int InvocationID) 0:31 move second child to first child ( temp 4-component vector of float) 0:31 gl_Position: direct index for structure ( out 4-component vector of float Position) -0:31 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:31 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:31 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) +0:31 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:31 'gl_InvocationID' ( in int InvocationID) 0:31 Constant: 0:31 0 (const int) 0:31 'p' ( temp 4-component vector of float) 0:32 move second child to first child ( temp float) 0:32 gl_PointSize: direct index for structure ( out float PointSize) -0:32 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:32 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:32 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) +0:32 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:32 'gl_InvocationID' ( in int InvocationID) 0:32 Constant: 0:32 1 (const int) 0:32 'ps' ( temp float) 0:33 move second child to first child ( temp float) 0:33 direct index ( temp float ClipDistance) -0:33 gl_ClipDistance: direct index for structure ( out implicitly-sized array of float ClipDistance) -0:33 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:33 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:33 gl_ClipDistance: direct index for structure ( out unsized 2-element array of float ClipDistance) +0:33 indirect index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) +0:33 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:33 'gl_InvocationID' ( in int InvocationID) 0:33 Constant: 0:33 2 (const int) @@ -175,8 +175,8 @@ 0:67 Function Parameters: 0:69 Sequence 0:69 gl_PointSize: direct index for structure ( out float PointSize) -0:69 direct index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:69 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:69 direct index ( temp block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) +0:69 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:69 Constant: 0:69 4 (const int) 0:69 Constant: @@ -211,7 +211,7 @@ 0:123 'gl_DeviceIndex' ( in int DeviceIndex) 0:124 'gl_ViewIndex' ( in int ViewIndex) 0:? Linker Objects -0:? 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:? 'gl_out' ( out 4-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 2-element array of float ClipDistance gl_ClipDistance}) 0:? 'outa' ( global 4-element array of int) 0:? 'patchIn' ( patch in 4-component vector of float) 0:? 'patchOut' ( patch out 4-component vector of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/400.tese.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/400.tese.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/400.tese.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/400.tese.out 2018-04-27 11:46:26.000000000 +0000 @@ -11,7 +11,7 @@ ERROR: 0:48: 'patch' : cannot use interpolation qualifiers with patch ERROR: 0:49: 'patch' : cannot use interpolation qualifiers with patch ERROR: 0:50: '' : can only have one auxiliary qualifier (centroid, patch, and sample) -ERROR: 0:54: 'gl_PerVertex' : block already declared with size, can't redeclare as implicitly-sized +ERROR: 0:54: 'gl_PerVertex' : block already declared with size, can't redeclare as unsized ERROR: 0:59: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use ERROR: 0:64: 'quads' : cannot apply to 'out' ERROR: 0:64: 'cw' : can only apply to 'in' @@ -57,8 +57,8 @@ 0:32 move second child to first child ( temp 4-component vector of float) 0:32 'p' ( temp 4-component vector of float) 0:32 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:32 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:32 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:32 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:32 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:32 Constant: 0:32 1 (const int) 0:32 Constant: @@ -67,8 +67,8 @@ 0:33 move second child to first child ( temp float) 0:33 'ps' ( temp float) 0:33 gl_PointSize: direct index for structure ( in float PointSize) -0:33 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:33 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:33 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:33 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:33 Constant: 0:33 1 (const int) 0:33 Constant: @@ -77,9 +77,9 @@ 0:34 move second child to first child ( temp float) 0:34 'cd' ( temp float) 0:34 direct index ( temp float ClipDistance) -0:34 gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance) -0:34 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:34 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:34 gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance) +0:34 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:34 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:34 Constant: 0:34 1 (const int) 0:34 Constant: @@ -114,20 +114,20 @@ 0:40 1 (const int) 0:42 move second child to first child ( temp 4-component vector of float) 0:42 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position) -0:42 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:42 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:42 Constant: 0:42 0 (const uint) 0:42 'p' ( temp 4-component vector of float) 0:43 move second child to first child ( temp float) 0:43 gl_PointSize: direct index for structure ( gl_PointSize float PointSize) -0:43 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:43 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:43 Constant: 0:43 1 (const uint) 0:43 'ps' ( temp float) 0:44 move second child to first child ( temp float) 0:44 direct index ( temp float ClipDistance) -0:44 gl_ClipDistance: direct index for structure ( out implicitly-sized array of float ClipDistance) -0:44 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:44 gl_ClipDistance: direct index for structure ( out unsized 3-element array of float ClipDistance) +0:44 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:44 Constant: 0:44 2 (const uint) 0:44 Constant: @@ -146,7 +146,7 @@ 0:? Linker Objects 0:? 'patchIn' ( patch in 4-component vector of float) 0:? 'patchOut' ( patch out 4-component vector of float) -0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:? 'badp1' ( smooth patch in 4-component vector of float) 0:? 'badp2' ( flat patch in 4-component vector of float) 0:? 'badp3' ( noperspective patch in 4-component vector of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/410.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/410.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/410.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/410.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -31,7 +31,7 @@ 0:30 'p' ( temp float) 0:30 gl_PointSize: direct index for structure ( in float PointSize) 0:30 direct index ( temp block{ in float PointSize gl_PointSize}) -0:30 'gl_in' ( in implicitly-sized array of block{ in float PointSize gl_PointSize}) +0:30 'gl_in' ( in unsized 2-element array of block{ in float PointSize gl_PointSize}) 0:30 Constant: 0:30 1 (const int) 0:30 Constant: @@ -53,7 +53,7 @@ 0:38 Constant: 0:38 4.000000 0:? Linker Objects -0:? 'gl_in' ( in implicitly-sized array of block{ in float PointSize gl_PointSize}) +0:? 'gl_in' ( in unsized 2-element array of block{ in float PointSize gl_PointSize}) 0:? 'anon@0' (layout( stream=0) out block{layout( stream=0) gl_PointSize float PointSize gl_PointSize, }) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/410.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/410.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/410.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/410.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -9,7 +9,7 @@ 0:8 Function Definition: main( ( global void) 0:8 Function Parameters: 0:? Linker Objects -0:? 'gl_out' ( out implicitly-sized array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:? 'gl_out' ( out unsized 1-element array of block{ out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance}) 0:? 'outa' ( global 1-element array of int) 0:? 'patchOut' ( patch out 4-component vector of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/420.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/420.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/420.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/420.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -19,7 +19,7 @@ 0:? Linker Objects 0:? 'gl_FragDepth' ( gl_FragDepth float FragDepth) 0:? 'depth' ( smooth in float) -0:? 'a' (layout( binding=0 offset=0) uniform implicitly-sized array of atomic_uint) +0:? 'a' (layout( binding=0 offset=0) uniform unsized 1-element array of atomic_uint) Linked fragment stage: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/420.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/420.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/420.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/420.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -20,15 +20,15 @@ 0:9 Constant: 0:9 1 (const int) 0:10 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:10 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:10 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:10 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance}) +0:10 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance}) 0:10 Constant: 0:10 1 (const int) 0:10 Constant: 0:10 0 (const int) 0:11 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:11 indirect index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:11 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:11 indirect index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance}) +0:11 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance}) 0:11 'i' ( global int) 0:11 Constant: 0:11 0 (const int) @@ -38,8 +38,8 @@ 0:20 Constant: 0:20 3 (const int) 0:21 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:21 indirect index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:21 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:21 indirect index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance}) +0:21 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance}) 0:21 'i' ( global int) 0:21 Constant: 0:21 0 (const int) @@ -121,12 +121,12 @@ 0:54 'i' ( global int) 0:? Linker Objects 0:? 'i' ( global int) -0:? 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:? 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance}) 0:? 'color3' ( in 3-element array of 4-component vector of float) 0:? 's2D' ( uniform sampler2D) 0:? 'coord' ( in 3-element array of 2-component vector of float) 0:? 'v4' ( uniform 4-component vector of float) -0:? 'anon@0' (layout( stream=0) out block{layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:? 'anon@0' (layout( stream=0) out block{layout( stream=0) gl_PointSize float PointSize gl_PointSize, layout( stream=0) out unsized 1-element array of float ClipDistance gl_ClipDistance}) Linked geometry stage: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/420_size_gl_in.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/420_size_gl_in.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/420_size_gl_in.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/420_size_gl_in.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -15,8 +15,8 @@ 0:13 Constant: 0:13 3 (const int) 0:14 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:14 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:14 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:14 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance}) +0:14 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance}) 0:14 Constant: 0:14 1 (const int) 0:14 Constant: @@ -24,8 +24,8 @@ 0:15 Constant: 0:15 3 (const int) 0:16 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:16 indirect index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:16 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:16 indirect index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance}) +0:16 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance}) 0:16 'i' ( global int) 0:16 Constant: 0:16 0 (const int) @@ -33,7 +33,7 @@ 0:? 'i' ( global int) 0:? 'colorun' ( in 3-element array of 4-component vector of float) 0:? 'color3' ( in 3-element array of 4-component vector of float) -0:? 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:? 'gl_in' ( in 3-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 1-element array of float ClipDistance gl_ClipDistance}) Linked geometry stage: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/420.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/420.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/420.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/420.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -20,8 +20,8 @@ 0:17 move second child to first child ( temp 4-component vector of float) 0:17 'p' ( temp 4-component vector of float) 0:17 gl_Position: direct index for structure ( in 4-component vector of float Position) -0:17 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:17 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:17 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:17 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:17 Constant: 0:17 1 (const int) 0:17 Constant: @@ -30,8 +30,8 @@ 0:18 move second child to first child ( temp float) 0:18 'ps' ( temp float) 0:18 gl_PointSize: direct index for structure ( in float PointSize) -0:18 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:18 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:18 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:18 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:18 Constant: 0:18 1 (const int) 0:18 Constant: @@ -40,9 +40,9 @@ 0:19 move second child to first child ( temp float) 0:19 'cd' ( temp float) 0:19 direct index ( temp float ClipDistance) -0:19 gl_ClipDistance: direct index for structure ( in implicitly-sized array of float ClipDistance) -0:19 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) -0:19 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in implicitly-sized array of float ClipDistance gl_ClipDistance}) +0:19 gl_ClipDistance: direct index for structure ( in unsized 3-element array of float ClipDistance) +0:19 direct index ( temp block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) +0:19 'gl_in' ( in 32-element array of block{ in 4-component vector of float Position gl_Position, in float PointSize gl_PointSize, in unsized 3-element array of float ClipDistance gl_ClipDistance}) 0:19 Constant: 0:19 1 (const int) 0:19 Constant: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/420.tese.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/420.tese.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/420.tese.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/420.tese.out 2018-04-27 11:46:26.000000000 +0000 @@ -139,7 +139,7 @@ 0:? 'b3' ( global 2-element array of 4-component vector of float) 0:? 'b4' ( global 2-element array of 4-component vector of float) 0:? 'c3' ( global 4X2 matrix of float) -0:? 'd2' ( global implicitly-sized array of structure{ global float s, global float t}) +0:? 'd2' ( global unsized 1-element array of structure{ global float s, global float t}) 0:? 'b5' ( global 5-element array of float) 0:? 'single1' ( global structure{ global int f}) 0:? 'single2' ( global structure{ global 2-component vector of uint v}) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/420.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/420.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/420.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/420.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -51,7 +51,7 @@ ERROR: 0:157: 'assign' : cannot convert from ' const float' to ' temp int' ERROR: 0:158: 'textureQueryLevels' : no matching overloaded function found ERROR: 0:158: 'assign' : cannot convert from ' const float' to ' temp int' -WARNING: 0:161: '[]' : assuming array size of one for compile-time checking of binding numbers for implicitly-sized array +WARNING: 0:161: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array ERROR: 51 compilation errors. No code generated. @@ -302,7 +302,7 @@ 0:? 'offcheckI' (layout( column_major shared) uniform block{layout( column_major shared offset=16) uniform int foo}) 0:? 'samp1D' ( uniform sampler1D) 0:? 'samp1Ds' ( uniform sampler1DShadow) -0:? 'badArray' (layout( binding=0) writeonly uniform implicitly-sized array of image1D) +0:? 'badArray' (layout( binding=0) writeonly uniform unsized 1-element array of image1D) 0:? 'gl_VertexID' ( gl_VertexId int VertexId) 0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/430AofA.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/430AofA.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/430AofA.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/430AofA.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -7,7 +7,7 @@ ERROR: 0:60: 'constructor' : cannot convert parameter 2 from ' const 2-element array of 4-component vector of float' to ' temp 3-element array of 4-component vector of float' ERROR: 0:64: '=' : cannot convert from ' const 3-element array of 2-element array of 4-component vector of float' to ' temp 4-element array of 2-element array of 4-component vector of float' ERROR: 0:70: 'assign' : cannot convert from ' global 4-element array of 7-element array of float' to ' global 5-element array of 7-element array of float' -ERROR: 0:71: 'assign' : cannot convert from ' global 4-element array of 7-element array of float' to ' global implicitly-sized array of 7-element array of float' +ERROR: 0:71: 'assign' : cannot convert from ' global 4-element array of 7-element array of float' to ' global unsized 1-element array of 7-element array of float' ERROR: 0:73: 'foo' : no matching overloaded function found ERROR: 0:78: '==' : wrong operand types: no operation '==' exists that takes a left-hand operand of type ' global 4-element array of 7-element array of float' and a right operand of type ' global 5-element array of 7-element array of float' (or there is no acceptable conversion) ERROR: 0:84: '[' : array index out of range '5' @@ -335,7 +335,7 @@ 0:69 Function Call: foo(f1[5][7]; ( global 4-element array of 7-element array of float) 0:69 'g5' ( global 5-element array of 7-element array of float) 0:70 'g5' ( global 5-element array of 7-element array of float) -0:71 'gu' ( global implicitly-sized array of 7-element array of float) +0:71 'gu' ( global unsized 1-element array of 7-element array of float) 0:73 Constant: 0:73 0.000000 0:74 Function Call: bar(f1[5][7]; ( global void) @@ -404,8 +404,8 @@ 0:98 0.000000 0:? Linker Objects 0:? 'many' ( global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of float) -0:? 'gu' ( global implicitly-sized array of 7-element array of float) -0:? 'gimp' ( global implicitly-sized array of 1-element array of float) +0:? 'gu' ( global unsized 1-element array of 7-element array of float) +0:? 'gimp' ( global unsized 1-element array of 1-element array of float) 0:? 'g4' ( global 4-element array of 7-element array of float) 0:? 'g5' ( global 5-element array of 7-element array of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/430.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/430.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/430.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/430.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -33,13 +33,13 @@ 0:35 GroupMemoryBarrier ( global void) 0:36 move second child to first child ( temp int) 0:36 value: direct index for structure (layout( column_major shared) buffer int) -0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values}) +0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer runtime-sized array of float values}) 0:36 Constant: 0:36 0 (const uint) 0:36 Convert float to int ( temp int) 0:36 indirect index (layout( column_major shared) temp float) -0:36 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of float) -0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values}) +0:36 values: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer runtime-sized array of float values}) 0:36 Constant: 0:36 1 (const uint) 0:36 'gl_LocalInvocationIndex' ( in uint LocalInvocationIndex) @@ -56,8 +56,8 @@ 0:65 Sequence 0:65 move second child to first child ( temp float) 0:65 direct index (layout( column_major shared) temp float) -0:65 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of float) -0:65 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values}) +0:65 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of float) +0:65 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer unsized 3-element array of float values}) 0:65 Constant: 0:65 1 (const int) 0:65 Constant: @@ -65,8 +65,8 @@ 0:65 Constant: 0:65 4.700000 0:66 array length ( temp int) -0:66 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of float) -0:66 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values}) +0:66 values: direct index for structure (layout( column_major shared) buffer unsized 3-element array of float) +0:66 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer unsized 3-element array of float values}) 0:66 Constant: 0:66 1 (const int) 0:67 Barrier ( global void) @@ -129,8 +129,8 @@ 0:? 4096 (const uint) 0:? 'total' ( const int) 0:? 66592 (const int) -0:? 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values}) -0:? 'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer implicitly-sized array of float values, layout( column_major shared) buffer int value}) +0:? 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer runtime-sized array of float values}) +0:? 'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer unsized 1-element array of float values, layout( column_major shared) buffer int value}) 0:? 'v3' (layout( location=2) in 3-component vector of float) 0:? 'f' ( in float) 0:? 'fo' ( out float) @@ -140,7 +140,7 @@ 0:? 'arrX' ( global 2-element array of int) 0:? 'arrY' ( global 1-element array of int) 0:? 'arrZ' ( global 4096-element array of int) -0:? 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values}) +0:? 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer unsized 3-element array of float values}) 0:? 'roll' ( uniform double) 0:? 'destTex' ( writeonly uniform image2D) 0:? 'inbi' ( in block{ in int a}) @@ -165,13 +165,13 @@ 0:35 GroupMemoryBarrier ( global void) 0:36 move second child to first child ( temp int) 0:36 value: direct index for structure (layout( column_major shared) buffer int) -0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values}) +0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer runtime-sized array of float values}) 0:36 Constant: 0:36 0 (const uint) 0:36 Convert float to int ( temp int) 0:36 indirect index (layout( column_major shared) temp float) -0:36 values: direct index for structure (layout( column_major shared) buffer implicitly-sized array of float) -0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values}) +0:36 values: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:36 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer runtime-sized array of float values}) 0:36 Constant: 0:36 1 (const uint) 0:36 'gl_LocalInvocationIndex' ( in uint LocalInvocationIndex) @@ -190,8 +190,8 @@ 0:? 4096 (const uint) 0:? 'total' ( const int) 0:? 66592 (const int) -0:? 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values}) -0:? 'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer implicitly-sized array of float values, layout( column_major shared) buffer int value}) +0:? 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer runtime-sized array of float values}) +0:? 'invalid' (layout( column_major shared) buffer block{layout( column_major shared) buffer 1-element array of float values, layout( column_major shared) buffer int value}) 0:? 'v3' (layout( location=2) in 3-component vector of float) 0:? 'f' ( in float) 0:? 'fo' ( out float) @@ -201,7 +201,7 @@ 0:? 'arrX' ( global 2-element array of int) 0:? 'arrY' ( global 1-element array of int) 0:? 'arrZ' ( global 4096-element array of int) -0:? 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer implicitly-sized array of float values}) +0:? 'ro' (layout( column_major shared) readonly buffer block{layout( column_major shared) buffer int value, layout( column_major shared) buffer unsized 3-element array of float values}) 0:? 'roll' ( uniform double) 0:? 'destTex' ( writeonly uniform image2D) 0:? 'inbi' ( in block{ in int a}) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/430scope.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/430scope.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/430scope.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/430scope.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -63,7 +63,7 @@ 0:47 3.000000 0:49 move second child to first child ( temp 4-component vector of float) 0:49 gl_Position: direct index for structure ( invariant gl_Position 4-component vector of float Position) -0:49 'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:49 'anon@0' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 0:49 Constant: 0:49 0 (const uint) 0:49 Construct vec4 ( temp 4-component vector of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/array100.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/array100.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/array100.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/array100.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -10,7 +10,7 @@ ERROR: 0:25: 'array assignment' : not supported for this version or the enabled extensions ERROR: 0:25: 'assign' : cannot convert from ' global 4-element array of mediump float' to ' global 5-element array of mediump float' ERROR: 0:26: 'array assignment' : not supported for this version or the enabled extensions -ERROR: 0:26: 'assign' : cannot convert from ' global 4-element array of mediump float' to ' global implicitly-sized array of mediump float' +ERROR: 0:26: 'assign' : cannot convert from ' global 4-element array of mediump float' to ' global unsized 1-element array of mediump float' ERROR: 0:28: 'foo' : no matching overloaded function found ERROR: 0:31: 'arrayed constructor' : not supported for this version or the enabled extensions ERROR: 0:31: 'array comparison' : not supported for this version or the enabled extensions @@ -67,7 +67,7 @@ 0:24 Function Call: foo(f1[5]; ( global 4-element array of mediump float) 0:24 'g5' ( global 5-element array of mediump float) 0:25 'g5' ( global 5-element array of mediump float) -0:26 'gu' ( global implicitly-sized array of mediump float) +0:26 'gu' ( global unsized 1-element array of mediump float) 0:28 Constant: 0:28 0.000000 0:29 Function Call: bar(f1[5]; ( global void) @@ -84,7 +84,7 @@ 0:31 true case 0:32 move second child to first child ( temp mediump float) 0:32 direct index ( temp mediump float) -0:32 'gu' ( global implicitly-sized array of mediump float) +0:32 'gu' ( global unsized 1-element array of mediump float) 0:32 Constant: 0:32 0 (const int) 0:32 Constant: @@ -152,7 +152,7 @@ 0:69 'initSb' ( temp structure{ global mediump 4-component vector of float v4, global structure{ global mediump 3-component vector of float v3, global 4-element array of mediump 2-component vector of float v2} sa}) 0:69 's1' ( temp structure{ global mediump 4-component vector of float v4, global structure{ global mediump 3-component vector of float v3, global 4-element array of mediump 2-component vector of float v2} sa}) 0:? Linker Objects -0:? 'gu' ( global implicitly-sized array of mediump float) +0:? 'gu' ( global unsized 1-element array of mediump float) 0:? 'g4' ( global 4-element array of mediump float) 0:? 'g5' ( global 5-element array of mediump float) 0:? 'a' ( uniform mediump int) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/array.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/array.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/array.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/array.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -2,7 +2,7 @@ ERROR: 0:21: '[' : array index out of range '2' ERROR: 0:27: '[' : array must be redeclared with a size before being indexed with a variable ERROR: 0:30: 'assign' : cannot convert from ' global 4-element array of float' to ' global 5-element array of float' -ERROR: 0:31: 'assign' : cannot convert from ' global 4-element array of float' to ' global implicitly-sized array of float' +ERROR: 0:31: 'assign' : cannot convert from ' global 4-element array of float' to ' global runtime-sized array of float' ERROR: 0:33: 'foo' : no matching overloaded function found ERROR: 0:42: '[' : array index out of range '5' ERROR: 0:45: '[' : array index out of range '1000' @@ -23,9 +23,11 @@ ERROR: 0:93: 'length' : array must be declared with a size before using this method ERROR: 0:101: '[' : array index out of range '5' ERROR: 0:104: 'constructor' : array constructor must have at least one argument -ERROR: 0:104: '=' : cannot convert from ' const float' to ' global implicitly-sized array of int' +ERROR: 0:104: '=' : cannot convert from ' const float' to ' global unsized 1-element array of int' ERROR: 0:106: 'constructor' : array argument must be sized -ERROR: 26 compilation errors. No code generated. +ERROR: 0:111: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier +ERROR: 0:111: 'variable indexing sampler array' : not supported with this profile: none +ERROR: 28 compilation errors. No code generated. Shader version: 130 @@ -68,21 +70,21 @@ 0:21 4.000000 0:24 move second child to first child ( temp float) 0:24 direct index ( temp float) -0:24 'gu' ( global implicitly-sized array of float) +0:24 'gu' ( global runtime-sized array of float) 0:24 Constant: 0:24 2 (const int) 0:24 Constant: 0:24 4.000000 0:26 move second child to first child ( temp float) 0:26 direct index ( temp float) -0:26 'gu' ( global implicitly-sized array of float) +0:26 'gu' ( global runtime-sized array of float) 0:26 Constant: 0:26 3 (const int) 0:26 Constant: 0:26 3.000000 0:27 move second child to first child ( temp float) 0:27 indirect index ( temp float) -0:27 'gu' ( global implicitly-sized array of float) +0:27 'gu' ( global runtime-sized array of float) 0:27 'a' ( uniform int) 0:27 Constant: 0:27 5.000000 @@ -91,7 +93,7 @@ 0:29 Function Call: foo(f1[5]; ( global 4-element array of float) 0:29 'g5' ( global 5-element array of float) 0:30 'g5' ( global 5-element array of float) -0:31 'gu' ( global implicitly-sized array of float) +0:31 'gu' ( global runtime-sized array of float) 0:33 Constant: 0:33 0.000000 0:34 Function Call: bar(f1[5]; ( global void) @@ -108,7 +110,7 @@ 0:36 true case 0:37 move second child to first child ( temp float) 0:37 direct index ( temp float) -0:37 'gu' ( global implicitly-sized array of float) +0:37 'gu' ( global runtime-sized array of float) 0:37 Constant: 0:37 0 (const int) 0:37 Constant: @@ -199,21 +201,21 @@ 0:? Sequence 0:71 move second child to first child ( temp int) 0:71 direct index ( temp int) -0:71 'uns' ( temp implicitly-sized array of int) +0:71 'uns' ( temp unsized 4-element array of int) 0:71 Constant: 0:71 3 (const int) 0:71 Constant: 0:71 40 (const int) 0:72 move second child to first child ( temp int) 0:72 direct index ( temp int) -0:72 'uns' ( temp implicitly-sized array of int) +0:72 'uns' ( temp unsized 4-element array of int) 0:72 Constant: 0:72 1 (const int) 0:72 Constant: 0:72 30 (const int) 0:73 move second child to first child ( temp 3-component vector of float) 0:73 direct index ( temp 3-component vector of float) -0:73 'guns' ( global implicitly-sized array of 3-component vector of float) +0:73 'guns' ( global unsized 8-element array of 3-component vector of float) 0:73 Constant: 0:73 2 (const int) 0:73 Constant: @@ -222,11 +224,11 @@ 0:73 2.400000 0:76 Constant: 0:76 0.000000 -0:79 Function Definition: foo2( ( global implicitly-sized array of float) +0:79 Function Definition: foo2( ( global unsized 1-element array of float) 0:79 Function Parameters: 0:? Sequence 0:82 Branch: Return with expression -0:82 'f' ( temp implicitly-sized array of float) +0:82 'f' ( temp unsized 1-element array of float) 0:84 Branch: Return with expression 0:84 'g' ( temp 9-element array of float) 0:89 Function Definition: foo3( ( global void) @@ -264,17 +266,24 @@ 0:106 'b' ( global float) 0:106 Constant: 0:106 0.000000 +0:109 Function Definition: foo4( ( global void) +0:109 Function Parameters: +0:111 Sequence +0:111 indirect index ( temp sampler2D) +0:111 's2d' ( uniform runtime-sized array of sampler2D) +0:111 'a' ( uniform int) 0:? Linker Objects -0:? 'gu' ( global implicitly-sized array of float) +0:? 'gu' ( global runtime-sized array of float) 0:? 'g4' ( global 4-element array of float) 0:? 'g5' ( global 5-element array of float) 0:? 'a' ( uniform int) -0:? 'guns' ( global implicitly-sized array of 3-component vector of float) +0:? 'guns' ( global unsized 8-element array of 3-component vector of float) 0:? 'f' ( global float) -0:? 'gUnusedUnsized' ( global implicitly-sized array of float) -0:? 'i' ( global implicitly-sized array of int) -0:? 'emptyA' ( global implicitly-sized array of float) +0:? 'gUnusedUnsized' ( global unsized 1-element array of float) +0:? 'i' ( global unsized 1-element array of int) +0:? 'emptyA' ( global unsized 1-element array of float) 0:? 'b' ( global float) +0:? 's2d' ( uniform runtime-sized array of sampler2D) Linked fragment stage: @@ -320,21 +329,21 @@ 0:21 4.000000 0:24 move second child to first child ( temp float) 0:24 direct index ( temp float) -0:24 'gu' ( global 4-element array of float) +0:24 'gu' ( global runtime-sized array of float) 0:24 Constant: 0:24 2 (const int) 0:24 Constant: 0:24 4.000000 0:26 move second child to first child ( temp float) 0:26 direct index ( temp float) -0:26 'gu' ( global 4-element array of float) +0:26 'gu' ( global runtime-sized array of float) 0:26 Constant: 0:26 3 (const int) 0:26 Constant: 0:26 3.000000 0:27 move second child to first child ( temp float) 0:27 indirect index ( temp float) -0:27 'gu' ( global 4-element array of float) +0:27 'gu' ( global runtime-sized array of float) 0:27 'a' ( uniform int) 0:27 Constant: 0:27 5.000000 @@ -343,7 +352,7 @@ 0:29 Function Call: foo(f1[5]; ( global 4-element array of float) 0:29 'g5' ( global 5-element array of float) 0:30 'g5' ( global 5-element array of float) -0:31 'gu' ( global 4-element array of float) +0:31 'gu' ( global runtime-sized array of float) 0:33 Constant: 0:33 0.000000 0:34 Function Call: bar(f1[5]; ( global void) @@ -360,7 +369,7 @@ 0:36 true case 0:37 move second child to first child ( temp float) 0:37 direct index ( temp float) -0:37 'gu' ( global 4-element array of float) +0:37 'gu' ( global runtime-sized array of float) 0:37 Constant: 0:37 0 (const int) 0:37 Constant: @@ -452,7 +461,7 @@ 0:106 Constant: 0:106 0.000000 0:? Linker Objects -0:? 'gu' ( global 4-element array of float) +0:? 'gu' ( global runtime-sized array of float) 0:? 'g4' ( global 4-element array of float) 0:? 'g5' ( global 5-element array of float) 0:? 'a' ( uniform int) @@ -462,4 +471,5 @@ 0:? 'i' ( global 1-element array of int) 0:? 'emptyA' ( global 1-element array of float) 0:? 'b' ( global float) +0:? 's2d' ( uniform runtime-sized array of sampler2D) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/atomic_uint.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/atomic_uint.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/atomic_uint.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/atomic_uint.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -2,7 +2,6 @@ ERROR: 0:10: 'atomic_uint' : samplers and atomic_uints cannot be output parameters ERROR: 0:12: 'return' : type does not match, or is not convertible to, the function's return type ERROR: 0:18: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: non_uniform_counter -ERROR: 0:18: 'atomic_uint' : layout(binding=X) is required ERROR: 0:23: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings ERROR: 0:28: '+' : wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( binding=0 offset=0) uniform atomic_uint' and a right operand of type 'layout( binding=0 offset=0) uniform atomic_uint' (or there is no acceptable conversion) ERROR: 0:29: '-' : wrong operand type no operation '-' exists that takes an operand of type layout( binding=0 offset=0) uniform atomic_uint (or there is no acceptable conversion) @@ -10,14 +9,10 @@ ERROR: 0:34: 'assign' : l-value required "counter" (can't modify a uniform) ERROR: 0:34: 'assign' : cannot convert from ' const int' to 'layout( binding=0 offset=0) uniform atomic_uint' ERROR: 0:37: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: acin -ERROR: 0:37: 'atomic_uint' : layout(binding=X) is required ERROR: 0:38: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: acg -ERROR: 0:38: 'atomic_uint' : layout(binding=X) is required -ERROR: 0:40: 'atomic_uint' : layout(binding=X) is required -ERROR: 0:46: 'atomic_uint' : layout(binding=X) is required ERROR: 0:47: 'offset' : atomic counters sharing the same offset: 12 ERROR: 0:48: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings -ERROR: 18 compilation errors. No code generated. +ERROR: 13 compilation errors. No code generated. Shader version: 420 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/constFoldIntMin.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/constFoldIntMin.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/constFoldIntMin.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/constFoldIntMin.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -10,7 +10,7 @@ 0:6 move second child to first child ( temp int16_t) 0:6 'u' ( temp int16_t) 0:6 Constant: -0:6 32768 (const int) +0:6 -32768 (const int16_t) 0:7 Sequence 0:7 move second child to first child ( temp int) 0:7 'v' ( temp int) @@ -25,7 +25,7 @@ 0:9 move second child to first child ( temp int16_t) 0:9 'x' ( temp int16_t) 0:9 Constant: -0:9 0 (const int) +0:9 0 (const int8_t) 0:10 Sequence 0:10 move second child to first child ( temp int) 0:10 'y' ( temp int) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/cppRelaxSkipTokensErrors.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/cppRelaxSkipTokensErrors.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/cppRelaxSkipTokensErrors.vert.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/cppRelaxSkipTokensErrors.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,14 @@ +cppRelaxSkipTokensErrors.vert +Shader version: 110 +0:? Sequence +0:? Linker Objects + + +Linked vertex stage: + +ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point + +Shader version: 110 +0:? Sequence +0:? Linker Objects + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/cppSimple.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/cppSimple.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/cppSimple.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/cppSimple.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -134,7 +134,7 @@ 0:65 0.050000 0:69 move second child to first child ( temp 4-component vector of float) 0:69 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position) -0:69 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:69 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 0:69 Constant: 0:69 0 (const uint) 0:69 Construct vec4 ( temp 4-component vector of float) @@ -174,7 +174,7 @@ 12:20033 Sequence 12:20033 move second child to first child ( temp 4-component vector of float) 12:20033 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position) -12:20033 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +12:20033 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 12:20033 Constant: 12:20033 0 (const uint) 12:20033 Constant: @@ -188,7 +188,7 @@ 12:9011 'RECURSE' ( global int) 0:? Linker Objects 0:? 'sum' ( global float) -0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 0:? 'linenumber' ( global int) 0:? 'filenumber' ( global int) 0:? 'version' ( global int) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/findFunction.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/findFunction.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/findFunction.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/findFunction.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,233 @@ +findFunction.frag +ERROR: 0:39: 'func' : ambiguous best function under implicit type conversion +ERROR: 0:40: 'func' : no matching overloaded function found +ERROR: 0:40: '=' : cannot convert from ' const float' to ' temp int64_t' +ERROR: 0:41: 'func' : no matching overloaded function found +ERROR: 0:41: '=' : cannot convert from ' const float' to ' temp int64_t' +ERROR: 0:44: 'func' : no matching overloaded function found +ERROR: 0:44: '=' : cannot convert from ' const float' to ' temp int64_t' +ERROR: 0:45: 'func' : ambiguous best function under implicit type conversion +ERROR: 8 compilation errors. No code generated. + + +Shader version: 450 +Requested GL_KHX_shader_explicit_arithmetic_types +ERROR: node is still EOpNull! +0:5 Function Definition: func(i81;i161;i161; ( global int64_t) +0:5 Function Parameters: +0:5 'a' ( in int8_t) +0:5 'b' ( in int16_t) +0:5 'c' ( in int16_t) +0:7 Sequence +0:7 Branch: Return with expression +0:7 Convert int16_t to int64 ( temp int64_t) +0:7 inclusive-or ( temp int16_t) +0:7 Convert int8_t to int16_t ( temp int16_t) +0:7 'a' ( in int8_t) +0:7 add ( temp int16_t) +0:7 'b' ( in int16_t) +0:7 'c' ( in int16_t) +0:10 Function Definition: func(i81;i161;i1; ( global int64_t) +0:10 Function Parameters: +0:10 'a' ( in int8_t) +0:10 'b' ( in int16_t) +0:10 'c' ( in int) +0:12 Sequence +0:12 Branch: Return with expression +0:12 Convert int to int64 ( temp int64_t) +0:12 inclusive-or ( temp int) +0:12 Convert int8_t to int ( temp int) +0:12 'a' ( in int8_t) +0:12 subtract ( temp int) +0:12 Convert int16_t to int ( temp int) +0:12 'b' ( in int16_t) +0:12 'c' ( in int) +0:15 Function Definition: func(i1;i1;i1; ( global int64_t) +0:15 Function Parameters: +0:15 'a' ( in int) +0:15 'b' ( in int) +0:15 'c' ( in int) +0:17 Sequence +0:17 Branch: Return with expression +0:17 Convert int to int64 ( temp int64_t) +0:17 add ( temp int) +0:17 divide ( temp int) +0:17 'a' ( in int) +0:17 'b' ( in int) +0:17 'c' ( in int) +0:20 Function Definition: func(f161;f161;f1; ( global int64_t) +0:20 Function Parameters: +0:20 'a' ( in float16_t) +0:20 'b' ( in float16_t) +0:20 'c' ( in float) +0:22 Sequence +0:22 Branch: Return with expression +0:22 Convert float to int64 ( temp int64_t) +0:22 subtract ( temp float) +0:22 Convert float16_t to float ( temp float) +0:22 'a' ( in float16_t) +0:22 component-wise multiply ( temp float) +0:22 Convert float16_t to float ( temp float) +0:22 'b' ( in float16_t) +0:22 'c' ( in float) +0:25 Function Definition: func(f161;i161;f1; ( global int64_t) +0:25 Function Parameters: +0:25 'a' ( in float16_t) +0:25 'b' ( in int16_t) +0:25 'c' ( in float) +0:27 Sequence +0:27 Branch: Return with expression +0:27 Convert float to int64 ( temp int64_t) +0:27 subtract ( temp float) +0:27 Convert float16_t to float ( temp float) +0:27 'a' ( in float16_t) +0:27 component-wise multiply ( temp float) +0:27 Convert int16_t to float ( temp float) +0:27 'b' ( in int16_t) +0:27 'c' ( in float) +0:30 Function Definition: main( ( global void) +0:30 Function Parameters: +0:? Sequence +0:38 Sequence +0:38 move second child to first child ( temp int64_t) +0:38 'b1' ( temp int64_t) +0:38 Function Call: func(i81;i161;i1; ( global int64_t) +0:38 'x' ( temp int8_t) +0:38 'y' ( temp int16_t) +0:38 'z' ( temp int) +0:39 Sequence +0:39 move second child to first child ( temp int64_t) +0:39 'b2' ( temp int64_t) +0:39 Function Call: func(f161;i161;f1; ( global int64_t) +0:39 Convert int16_t to float16_t ( temp float16_t) +0:39 'y' ( temp int16_t) +0:39 'y' ( temp int16_t) +0:39 Convert int to float ( temp float) +0:39 'z' ( temp int) +0:42 Sequence +0:42 move second child to first child ( temp int64_t) +0:42 'b5' ( temp int64_t) +0:42 Function Call: func(f161;i161;f1; ( global int64_t) +0:42 Convert int16_t to float16_t ( temp float16_t) +0:42 'y' ( temp int16_t) +0:42 'y' ( temp int16_t) +0:42 Convert float16_t to float ( temp float) +0:42 'f16' ( temp float16_t) +0:43 Sequence +0:43 move second child to first child ( temp int64_t) +0:43 'b7' ( temp int64_t) +0:43 Function Call: func(f161;f161;f1; ( global int64_t) +0:43 'f16' ( temp float16_t) +0:43 'f16' ( temp float16_t) +0:43 Convert int16_t to float ( temp float) +0:43 'y' ( temp int16_t) +0:45 Sequence +0:45 move second child to first child ( temp int64_t) +0:45 'b9' ( temp int64_t) +0:45 Function Call: func(f161;f161;f1; ( global int64_t) +0:45 'f16' ( temp float16_t) +0:45 Convert int8_t to float16_t ( temp float16_t) +0:45 'x' ( temp int8_t) +0:45 Convert float16_t to float ( temp float) +0:45 'f16' ( temp float16_t) +0:? Linker Objects + + +Linked fragment stage: + + +Shader version: 450 +Requested GL_KHX_shader_explicit_arithmetic_types +ERROR: node is still EOpNull! +0:10 Function Definition: func(i81;i161;i1; ( global int64_t) +0:10 Function Parameters: +0:10 'a' ( in int8_t) +0:10 'b' ( in int16_t) +0:10 'c' ( in int) +0:12 Sequence +0:12 Branch: Return with expression +0:12 Convert int to int64 ( temp int64_t) +0:12 inclusive-or ( temp int) +0:12 Convert int8_t to int ( temp int) +0:12 'a' ( in int8_t) +0:12 subtract ( temp int) +0:12 Convert int16_t to int ( temp int) +0:12 'b' ( in int16_t) +0:12 'c' ( in int) +0:20 Function Definition: func(f161;f161;f1; ( global int64_t) +0:20 Function Parameters: +0:20 'a' ( in float16_t) +0:20 'b' ( in float16_t) +0:20 'c' ( in float) +0:22 Sequence +0:22 Branch: Return with expression +0:22 Convert float to int64 ( temp int64_t) +0:22 subtract ( temp float) +0:22 Convert float16_t to float ( temp float) +0:22 'a' ( in float16_t) +0:22 component-wise multiply ( temp float) +0:22 Convert float16_t to float ( temp float) +0:22 'b' ( in float16_t) +0:22 'c' ( in float) +0:25 Function Definition: func(f161;i161;f1; ( global int64_t) +0:25 Function Parameters: +0:25 'a' ( in float16_t) +0:25 'b' ( in int16_t) +0:25 'c' ( in float) +0:27 Sequence +0:27 Branch: Return with expression +0:27 Convert float to int64 ( temp int64_t) +0:27 subtract ( temp float) +0:27 Convert float16_t to float ( temp float) +0:27 'a' ( in float16_t) +0:27 component-wise multiply ( temp float) +0:27 Convert int16_t to float ( temp float) +0:27 'b' ( in int16_t) +0:27 'c' ( in float) +0:30 Function Definition: main( ( global void) +0:30 Function Parameters: +0:? Sequence +0:38 Sequence +0:38 move second child to first child ( temp int64_t) +0:38 'b1' ( temp int64_t) +0:38 Function Call: func(i81;i161;i1; ( global int64_t) +0:38 'x' ( temp int8_t) +0:38 'y' ( temp int16_t) +0:38 'z' ( temp int) +0:39 Sequence +0:39 move second child to first child ( temp int64_t) +0:39 'b2' ( temp int64_t) +0:39 Function Call: func(f161;i161;f1; ( global int64_t) +0:39 Convert int16_t to float16_t ( temp float16_t) +0:39 'y' ( temp int16_t) +0:39 'y' ( temp int16_t) +0:39 Convert int to float ( temp float) +0:39 'z' ( temp int) +0:42 Sequence +0:42 move second child to first child ( temp int64_t) +0:42 'b5' ( temp int64_t) +0:42 Function Call: func(f161;i161;f1; ( global int64_t) +0:42 Convert int16_t to float16_t ( temp float16_t) +0:42 'y' ( temp int16_t) +0:42 'y' ( temp int16_t) +0:42 Convert float16_t to float ( temp float) +0:42 'f16' ( temp float16_t) +0:43 Sequence +0:43 move second child to first child ( temp int64_t) +0:43 'b7' ( temp int64_t) +0:43 Function Call: func(f161;f161;f1; ( global int64_t) +0:43 'f16' ( temp float16_t) +0:43 'f16' ( temp float16_t) +0:43 Convert int16_t to float ( temp float) +0:43 'y' ( temp int16_t) +0:45 Sequence +0:45 move second child to first child ( temp int64_t) +0:45 'b9' ( temp int64_t) +0:45 Function Call: func(f161;f161;f1; ( global int64_t) +0:45 'f16' ( temp float16_t) +0:45 Convert int8_t to float16_t ( temp float16_t) +0:45 'x' ( temp int8_t) +0:45 Convert float16_t to float ( temp float) +0:45 'f16' ( temp float16_t) +0:? Linker Objects + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/glsl.entryPointRename.vert.bad.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/glsl.entryPointRename.vert.bad.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/glsl.entryPointRename.vert.bad.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/glsl.entryPointRename.vert.bad.out 2018-04-27 11:46:26.000000000 +0000 @@ -2,7 +2,7 @@ ERROR: Source entry point must be "main" // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 20 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/glsl.entryPointRename.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/glsl.entryPointRename.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/glsl.entryPointRename.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/glsl.entryPointRename.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ glsl.entryPointRename.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 20 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/glspv.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/glspv.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/glspv.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/glspv.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,13 +1,15 @@ glspv.frag ERROR: 0:4: '#error' : GL_SPIRV is set ( correct , not an error ) ERROR: 0:6: '#error' : GL_SPIR is 100 +ERROR: 0:14: 'f' : non-opaque uniform variables need a layout(location=L) ERROR: 0:21: 'noise1' : no matching overloaded function found ERROR: 0:22: 'noise2' : no matching overloaded function found ERROR: 0:23: 'noise3' : no matching overloaded function found ERROR: 0:24: 'noise4' : no matching overloaded function found -ERROR: 0:27: 'input_attachment_index' : only allowed when using GLSL for Vulkan -ERROR: 0:27: '' : syntax error, unexpected IDENTIFIER, expecting LEFT_BRACE or COMMA or SEMICOLON -ERROR: 8 compilation errors. No code generated. +ERROR: 0:27: 'atomic_uint' : layout(binding=X) is required +ERROR: 0:28: 'input_attachment_index' : only allowed when using GLSL for Vulkan +ERROR: 0:28: '' : syntax error, unexpected IDENTIFIER, expecting LEFT_BRACE or COMMA or SEMICOLON +ERROR: 10 compilation errors. No code generated. SPIR-V is not generated for failed compile or link diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/glspv.version.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/glspv.version.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/glspv.version.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/glspv.version.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -2,7 +2,7 @@ ERROR: #version: compilation for SPIR-V does not support the compatibility profile // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 6 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.aliasOpaque.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.aliasOpaque.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.aliasOpaque.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.aliasOpaque.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -143,7 +143,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 64 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.amend.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.amend.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.amend.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.amend.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -160,7 +160,7 @@ 0:? 'm' ( global 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 57 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.array.flatten.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.array.flatten.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.array.flatten.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.array.flatten.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -345,7 +345,7 @@ 0:? 'ps_output.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 143 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.array.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.array.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.array.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.array.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -290,7 +290,7 @@ 0:? 'input' (layout( location=1) in 3-element array of 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 126 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.array.implicit-size.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.array.implicit-size.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.array.implicit-size.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.array.implicit-size.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -163,7 +163,7 @@ 0:? 'g_mystruct' ( global 2-element array of structure{ temp int i, temp float f}) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 72 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.array.multidim.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.array.multidim.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.array.multidim.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.array.multidim.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -134,7 +134,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 57 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.assoc.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.assoc.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.assoc.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.assoc.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -132,7 +132,7 @@ 0:? 'a5' (layout( location=4) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 58 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.attributeC11.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.attributeC11.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.attributeC11.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.attributeC11.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -35,8 +35,8 @@ 0:20 Function Call: @main(vf4; ( temp 4-component vector of float) 0:? 'input' ( temp 4-component vector of float) 0:? Linker Objects -0:? 'buffer1' (layout( set=0 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 2-component vector of float f} @data}) -0:? 'buffer3' (layout( set=2 binding=3 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 2-component vector of float f} @data}) +0:? 'buffer1' (layout( set=0 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 2-component vector of float f} @data}) +0:? 'buffer3' (layout( set=2 binding=3 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 2-component vector of float f} @data}) 0:? 'attach' ( uniform texture2D) 0:? 'ci' ( specialization-constant const int) 0:? 11 (const int) @@ -84,8 +84,8 @@ 0:20 Function Call: @main(vf4; ( temp 4-component vector of float) 0:? 'input' ( temp 4-component vector of float) 0:? Linker Objects -0:? 'buffer1' (layout( set=0 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 2-component vector of float f} @data}) -0:? 'buffer3' (layout( set=2 binding=3 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 2-component vector of float f} @data}) +0:? 'buffer1' (layout( set=0 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 2-component vector of float f} @data}) +0:? 'buffer3' (layout( set=2 binding=3 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 2-component vector of float f} @data}) 0:? 'attach' ( uniform texture2D) 0:? 'ci' ( specialization-constant const int) 0:? 11 (const int) @@ -94,7 +94,7 @@ 0:? 'input' (layout( location=8) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 51 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.attribute.expression.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.attribute.expression.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.attribute.expression.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.attribute.expression.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -82,7 +82,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 39 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.attribute.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.attribute.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.attribute.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.attribute.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -50,7 +50,7 @@ 0:? 'input' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 24 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -56,7 +56,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 28 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.basic.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.basic.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.basic.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.basic.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -60,7 +60,7 @@ 0:? 'gti' ( in int LocalInvocationID) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 35 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.basic.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.basic.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.basic.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.basic.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -188,7 +188,7 @@ 0:? 'OutputStream.something' (layout( location=1) out int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 68 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.boolConv.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.boolConv.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.boolConv.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.boolConv.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -204,7 +204,7 @@ 0:? '@entryPointOutput' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 99 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.buffer.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.buffer.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.buffer.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.buffer.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -146,7 +146,7 @@ 0:? 'input' ( in 4-component vector of float FragCoord) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 73 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.calculatelod.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.calculatelod.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.calculatelod.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.calculatelod.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.calculatelod.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -181,6 +182,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -356,7 +358,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 148 Capability Shader @@ -367,6 +369,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 140 144 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.calculatelodunclamped.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -13,6 +13,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any ERROR: node is still EOpNull! 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -193,6 +194,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any ERROR: node is still EOpNull! 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.cast.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.cast.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.cast.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.cast.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -72,7 +72,7 @@ 0:? 'input' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 39 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.cbuffer-identifier.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.cbuffer-identifier.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.cbuffer-identifier.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.cbuffer-identifier.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -250,7 +250,7 @@ 0:? 'input.Norm' (layout( location=1) in 3-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 106 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.charLit.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.charLit.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.charLit.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.charLit.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -146,7 +146,7 @@ 0:? '@entryPointOutput' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 58 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-1.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-1.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-1.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-1.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -98,7 +98,7 @@ 0:? 'cull' ( in 1-element array of float CullDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 53 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-1.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-1.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-1.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-1.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -550,7 +550,7 @@ 0:? 'OutputStream.clip' ( out 2-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 118 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-1.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-1.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-1.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-1.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -108,7 +108,7 @@ 0:? 'cull' ( out 1-element array of float CullDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 46 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-2.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-2.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-2.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-2.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -290,7 +290,7 @@ 0:? 'cull' ( in 4-element array of float CullDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 84 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-2.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-2.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-2.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-2.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -724,7 +724,7 @@ 0:? 'OutputStream.clip' ( out 4-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 128 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-2.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-2.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-2.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-2.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -420,7 +420,7 @@ 0:? 'cull' ( out 4-element array of float CullDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 89 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-3.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-3.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-3.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-3.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -98,7 +98,7 @@ 0:? 'cull' ( in 2-element array of float CullDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 53 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-3.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-3.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-3.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-3.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -630,7 +630,7 @@ 0:? 'OutputStream.clip1' ( out 4-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 127 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-3.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-3.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-3.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-3.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -136,7 +136,7 @@ 0:? 'cull' ( out 2-element array of float CullDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 51 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-4.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-4.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-4.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-4.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -174,7 +174,7 @@ 0:? 'v.ClipRect' ( in 4-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 57 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-4.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-4.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-4.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-4.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -612,7 +612,7 @@ 0:? 'OutputStream.clip1' ( out 4-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 130 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-4.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-4.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-4.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-4.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -270,7 +270,7 @@ 0:? '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 72 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-5.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-5.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-5.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-5.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -232,7 +232,7 @@ 0:? 'v.ClipRect' ( in 4-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 62 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-5.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-5.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-5.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-5.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -318,7 +318,7 @@ 0:? '@entryPointOutput.ClipRect' ( out 4-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 73 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-6.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-6.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-6.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-6.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -282,7 +282,7 @@ 0:? 'v.clip1' ( in 8-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 79 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-6.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-6.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-6.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-6.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -428,7 +428,7 @@ 0:? '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 86 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-7.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-7.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-7.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-7.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -270,7 +270,7 @@ 0:? 'v.clip1' ( in 8-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 78 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-7.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-7.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-7.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-7.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -384,7 +384,7 @@ 0:? '@entryPointOutput.clip1' ( out 8-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 81 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-8.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-8.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-8.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-8.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -186,7 +186,7 @@ 0:? 'v.clip1' ( in 4-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 65 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-8.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-8.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-8.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-8.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -240,7 +240,7 @@ 0:? '@entryPointOutput.clip1' ( out 4-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 62 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-9.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-9.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-9.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-9.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -144,7 +144,7 @@ 0:? 'clip0' ( in 4-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 68 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-9.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-9.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clipdistance-9.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clipdistance-9.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -194,7 +194,7 @@ 0:? 'clip0' ( out 4-element array of float ClipDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 67 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clip.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clip.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.clip.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.clip.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -74,7 +74,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 30 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.color.hull.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.color.hull.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.color.hull.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.color.hull.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -356,7 +356,7 @@ 0:? '@patchConstantOutput.inside' ( patch out 2-element array of float TessLevelInner) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 127 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.comparison.vec.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.comparison.vec.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.comparison.vec.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.comparison.vec.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -262,7 +262,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 96 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.conditional.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.conditional.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.conditional.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.conditional.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -78,7 +78,7 @@ 0:17 Sequence 0:17 move second child to first child ( temp 4-component vector of float) 0:17 'ret' ( temp 4-component vector of float) -0:17 Test condition and select ( temp 4-component vector of float) +0:17 Test condition and select ( temp 4-component vector of float): no shortcircuit 0:17 Condition 0:17 Compare Not Equal ( temp bool) 0:17 t: direct index for structure ( uniform float) @@ -169,7 +169,7 @@ 0:37 'e' ( temp int) 0:37 move second child to first child ( temp int) 0:37 'a' ( temp int) -0:37 Test condition and select ( temp int) +0:37 Test condition and select ( temp int): no shortcircuit 0:37 Condition 0:37 Convert int to bool ( temp bool) 0:37 'b' ( temp int) @@ -182,7 +182,7 @@ 0:37 10 (const int) 0:37 move second child to first child ( temp int) 0:37 'b' ( temp int) -0:37 Test condition and select ( temp int) +0:37 Test condition and select ( temp int): no shortcircuit 0:37 Condition 0:37 Convert int to bool ( temp bool) 0:37 'a' ( temp int) @@ -195,7 +195,7 @@ 0:37 11 (const int) 0:39 move second child to first child ( temp 4-component vector of float) 0:39 'f' ( temp 4-component vector of float) -0:39 Test condition and select ( temp 4-component vector of float) +0:39 Test condition and select ( temp 4-component vector of float): no shortcircuit 0:39 Condition 0:39 Compare Less Than ( temp bool) 0:39 direct index ( temp float) @@ -341,7 +341,7 @@ 0:17 Sequence 0:17 move second child to first child ( temp 4-component vector of float) 0:17 'ret' ( temp 4-component vector of float) -0:17 Test condition and select ( temp 4-component vector of float) +0:17 Test condition and select ( temp 4-component vector of float): no shortcircuit 0:17 Condition 0:17 Compare Not Equal ( temp bool) 0:17 t: direct index for structure ( uniform float) @@ -432,7 +432,7 @@ 0:37 'e' ( temp int) 0:37 move second child to first child ( temp int) 0:37 'a' ( temp int) -0:37 Test condition and select ( temp int) +0:37 Test condition and select ( temp int): no shortcircuit 0:37 Condition 0:37 Convert int to bool ( temp bool) 0:37 'b' ( temp int) @@ -445,7 +445,7 @@ 0:37 10 (const int) 0:37 move second child to first child ( temp int) 0:37 'b' ( temp int) -0:37 Test condition and select ( temp int) +0:37 Test condition and select ( temp int): no shortcircuit 0:37 Condition 0:37 Convert int to bool ( temp bool) 0:37 'a' ( temp int) @@ -458,7 +458,7 @@ 0:37 11 (const int) 0:39 move second child to first child ( temp 4-component vector of float) 0:39 'f' ( temp 4-component vector of float) -0:39 Test condition and select ( temp 4-component vector of float) +0:39 Test condition and select ( temp 4-component vector of float): no shortcircuit 0:39 Condition 0:39 Compare Less Than ( temp bool) 0:39 direct index ( temp float) @@ -522,13 +522,13 @@ 0:? 'input' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 220 +// Generated by (magic number): 80006 +// Id's are bound by 206 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "PixelShaderFunction" 213 216 + EntryPoint Fragment 4 "PixelShaderFunction" 199 202 ExecutionMode 4 OriginUpperLeft Source HLSL 500 Name 4 "PixelShaderFunction" @@ -548,20 +548,20 @@ MemberName 29($Global) 4 "f" Name 31 "" Name 85 "ret" - Name 113 "a" - Name 115 "b" - Name 117 "c" - Name 119 "d" - Name 120 "ret" - Name 140 "e" - Name 161 "f" - Name 200 "param" - Name 201 "param" - Name 202 "param" - Name 211 "input" - Name 213 "input" - Name 216 "@entryPointOutput" - Name 217 "param" + Name 110 "a" + Name 112 "b" + Name 114 "c" + Name 116 "d" + Name 117 "ret" + Name 137 "e" + Name 150 "f" + Name 186 "param" + Name 187 "param" + Name 188 "param" + Name 197 "input" + Name 199 "input" + Name 202 "@entryPointOutput" + Name 203 "param" MemberDecorate 29($Global) 0 Offset 0 MemberDecorate 29($Global) 1 Offset 16 MemberDecorate 29($Global) 2 Offset 32 @@ -569,8 +569,8 @@ MemberDecorate 29($Global) 4 Offset 52 Decorate 29($Global) Block Decorate 31 DescriptorSet 0 - Decorate 213(input) Location 0 - Decorate 216(@entryPointOutput) Location 0 + Decorate 199(input) Location 0 + Decorate 202(@entryPointOutput) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -598,41 +598,41 @@ 48: 32(int) Constant 4 49: TypePointer Uniform 6(float) 53: 32(int) Constant 3 - 100: 6(float) Constant 1065353216 - 101: 7(fvec4) ConstantComposite 100 100 100 100 - 112: TypePointer Function 32(int) - 114: 32(int) Constant 5 - 116: 32(int) Constant 6 - 118: 32(int) Constant 7 - 143: TypeInt 32 0 - 144: 143(int) Constant 0 - 150: 32(int) Constant 10 - 159: 32(int) Constant 11 - 163: TypePointer Function 6(float) - 166: 143(int) Constant 1 - 192: 13(bool) ConstantTrue - 193: 13(bool) ConstantFalse - 194: 14(bvec2) ConstantComposite 192 193 - 195: 6(float) Constant 1073741824 - 196: 16(fvec2) ConstantComposite 100 195 - 197: 6(float) Constant 1077936128 - 198: 6(float) Constant 1082130432 - 199: 16(fvec2) ConstantComposite 197 198 - 204: 6(float) Constant 1092616192 - 212: TypePointer Input 7(fvec4) - 213(input): 212(ptr) Variable Input - 215: TypePointer Output 7(fvec4) -216(@entryPointOutput): 215(ptr) Variable Output + 96: 6(float) Constant 1065353216 + 97: 7(fvec4) ConstantComposite 96 96 96 96 + 109: TypePointer Function 32(int) + 111: 32(int) Constant 5 + 113: 32(int) Constant 6 + 115: 32(int) Constant 7 + 139: TypeInt 32 0 + 140: 139(int) Constant 0 + 143: 32(int) Constant 10 + 148: 32(int) Constant 11 + 151: TypePointer Function 6(float) + 154: 139(int) Constant 1 + 178: 13(bool) ConstantTrue + 179: 13(bool) ConstantFalse + 180: 14(bvec2) ConstantComposite 178 179 + 181: 6(float) Constant 1073741824 + 182: 16(fvec2) ConstantComposite 96 181 + 183: 6(float) Constant 1077936128 + 184: 6(float) Constant 1082130432 + 185: 16(fvec2) ConstantComposite 183 184 + 190: 6(float) Constant 1092616192 + 198: TypePointer Input 7(fvec4) + 199(input): 198(ptr) Variable Input + 201: TypePointer Output 7(fvec4) +202(@entryPointOutput): 201(ptr) Variable Output 4(PixelShaderFunction): 2 Function None 3 5: Label - 211(input): 24(ptr) Variable Function - 217(param): 24(ptr) Variable Function - 214: 7(fvec4) Load 213(input) - Store 211(input) 214 - 218: 7(fvec4) Load 211(input) - Store 217(param) 218 - 219: 7(fvec4) FunctionCall 27(@PixelShaderFunction(vf4;) 217(param) - Store 216(@entryPointOutput) 219 + 197(input): 24(ptr) Variable Function + 203(param): 24(ptr) Variable Function + 200: 7(fvec4) Load 199(input) + Store 197(input) 200 + 204: 7(fvec4) Load 197(input) + Store 203(param) 204 + 205: 7(fvec4) FunctionCall 27(@PixelShaderFunction(vf4;) 203(param) + Store 202(@entryPointOutput) 205 Return FunctionEnd 9(vectorCond(): 7(fvec4) Function None 8 @@ -682,154 +682,116 @@ 11(scalarCond(): 7(fvec4) Function None 8 12: Label 85(ret): 24(ptr) Variable Function - 86: 24(ptr) Variable Function - 87: 49(ptr) AccessChain 31 53 - 88: 6(float) Load 87 - 89: 49(ptr) AccessChain 31 48 - 90: 6(float) Load 89 - 91: 13(bool) FOrdNotEqual 88 90 - SelectionMerge 93 None - BranchConditional 91 92 99 - 92: Label - 94: 49(ptr) AccessChain 31 53 - 95: 6(float) Load 94 - 96: 34(ptr) AccessChain 31 33 - 97: 7(fvec4) Load 96 - 98: 7(fvec4) VectorTimesScalar 97 95 - Store 86 98 - Branch 93 - 99: Label - Store 86 101 - Branch 93 - 93: Label - 102: 7(fvec4) Load 86 - Store 85(ret) 102 - 103: 7(fvec4) Load 85(ret) - ReturnValue 103 + 86: 49(ptr) AccessChain 31 53 + 87: 6(float) Load 86 + 88: 49(ptr) AccessChain 31 48 + 89: 6(float) Load 88 + 90: 13(bool) FOrdNotEqual 87 89 + 91: 49(ptr) AccessChain 31 53 + 92: 6(float) Load 91 + 93: 34(ptr) AccessChain 31 33 + 94: 7(fvec4) Load 93 + 95: 7(fvec4) VectorTimesScalar 94 92 + 98: 43(bvec4) CompositeConstruct 90 90 90 90 + 99: 7(fvec4) Select 98 95 97 + Store 85(ret) 99 + 100: 7(fvec4) Load 85(ret) + ReturnValue 100 FunctionEnd 22(fbSelect(vb2;vf2;vf2;): 16(fvec2) Function None 18 19(cnd): 15(ptr) FunctionParameter 20(src0): 17(ptr) FunctionParameter 21(src1): 17(ptr) FunctionParameter 23: Label - 106: 16(fvec2) Load 21(src1) - 107: 16(fvec2) Load 20(src0) - 108: 14(bvec2) Load 19(cnd) - 109: 16(fvec2) Select 108 107 106 - ReturnValue 109 + 103: 16(fvec2) Load 21(src1) + 104: 16(fvec2) Load 20(src0) + 105: 14(bvec2) Load 19(cnd) + 106: 16(fvec2) Select 105 104 103 + ReturnValue 106 FunctionEnd 27(@PixelShaderFunction(vf4;): 7(fvec4) Function None 25 26(input): 24(ptr) FunctionParameter 28: Label - 113(a): 112(ptr) Variable Function - 115(b): 112(ptr) Variable Function - 117(c): 112(ptr) Variable Function - 119(d): 112(ptr) Variable Function - 120(ret): 24(ptr) Variable Function - 140(e): 112(ptr) Variable Function - 141: 112(ptr) Variable Function - 152: 112(ptr) Variable Function - 161(f): 24(ptr) Variable Function - 162: 24(ptr) Variable Function - 200(param): 15(ptr) Variable Function - 201(param): 17(ptr) Variable Function - 202(param): 17(ptr) Variable Function - Store 113(a) 114 - Store 115(b) 116 - Store 117(c) 118 - Store 119(d) 118 - 121: 32(int) Load 113(a) - 122: 6(float) ConvertSToF 121 - 123: 7(fvec4) Load 26(input) - 124: 7(fvec4) VectorTimesScalar 123 122 - 125: 32(int) Load 115(b) - 126: 6(float) ConvertSToF 125 - 127: 7(fvec4) Load 26(input) - 128: 7(fvec4) VectorTimesScalar 127 126 - 129: 7(fvec4) FAdd 124 128 - 130: 32(int) Load 117(c) - 131: 6(float) ConvertSToF 130 - 132: 7(fvec4) Load 26(input) - 133: 7(fvec4) VectorTimesScalar 132 131 - 134: 7(fvec4) FAdd 129 133 - 135: 32(int) Load 119(d) - 136: 6(float) ConvertSToF 135 - 137: 7(fvec4) Load 26(input) - 138: 7(fvec4) VectorTimesScalar 137 136 - 139: 7(fvec4) FAdd 134 138 - Store 120(ret) 139 - 142: 32(int) Load 115(b) - 145: 13(bool) INotEqual 142 144 - SelectionMerge 147 None - BranchConditional 145 146 149 - 146: Label - 148: 32(int) Load 119(d) - Store 117(c) 148 - Store 141 148 - Branch 147 - 149: Label - Store 141 150 - Branch 147 - 147: Label - 151: 32(int) Load 141 - Store 113(a) 151 - Store 140(e) 151 - 153: 32(int) Load 113(a) - 154: 13(bool) INotEqual 153 144 - SelectionMerge 156 None - BranchConditional 154 155 158 - 155: Label - 157: 32(int) Load 117(c) - Store 119(d) 157 - Store 152 157 - Branch 156 - 158: Label - Store 152 159 - Branch 156 - 156: Label - 160: 32(int) Load 152 - Store 115(b) 160 - 164: 163(ptr) AccessChain 120(ret) 144 - 165: 6(float) Load 164 - 167: 163(ptr) AccessChain 26(input) 166 - 168: 6(float) Load 167 - 169: 13(bool) FOrdLessThan 165 168 - SelectionMerge 171 None - BranchConditional 169 170 176 - 170: Label - 172: 32(int) Load 117(c) - 173: 6(float) ConvertSToF 172 - 174: 7(fvec4) Load 26(input) - 175: 7(fvec4) VectorTimesScalar 174 173 - Store 162 175 - Branch 171 - 176: Label - 177: 32(int) Load 119(d) - 178: 6(float) ConvertSToF 177 - 179: 7(fvec4) Load 26(input) - 180: 7(fvec4) VectorTimesScalar 179 178 - Store 162 180 - Branch 171 - 171: Label - 181: 7(fvec4) Load 162 - Store 161(f) 181 - 182: 32(int) Load 140(e) - 183: 6(float) ConvertSToF 182 - 184: 7(fvec4) Load 120(ret) - 185: 7(fvec4) VectorTimesScalar 184 183 - 186: 7(fvec4) Load 161(f) - 187: 7(fvec4) FAdd 185 186 - 188: 7(fvec4) FunctionCall 9(vectorCond() - 189: 7(fvec4) FAdd 187 188 - 190: 7(fvec4) FunctionCall 11(scalarCond() - 191: 7(fvec4) FAdd 189 190 - Store 200(param) 194 - Store 201(param) 196 - Store 202(param) 199 - 203: 16(fvec2) FunctionCall 22(fbSelect(vb2;vf2;vf2;) 200(param) 201(param) 202(param) - 205: 6(float) CompositeExtract 203 0 - 206: 6(float) CompositeExtract 203 1 - 207: 7(fvec4) CompositeConstruct 205 206 204 204 - 208: 7(fvec4) FAdd 191 207 - ReturnValue 208 + 110(a): 109(ptr) Variable Function + 112(b): 109(ptr) Variable Function + 114(c): 109(ptr) Variable Function + 116(d): 109(ptr) Variable Function + 117(ret): 24(ptr) Variable Function + 137(e): 109(ptr) Variable Function + 150(f): 24(ptr) Variable Function + 186(param): 15(ptr) Variable Function + 187(param): 17(ptr) Variable Function + 188(param): 17(ptr) Variable Function + Store 110(a) 111 + Store 112(b) 113 + Store 114(c) 115 + Store 116(d) 115 + 118: 32(int) Load 110(a) + 119: 6(float) ConvertSToF 118 + 120: 7(fvec4) Load 26(input) + 121: 7(fvec4) VectorTimesScalar 120 119 + 122: 32(int) Load 112(b) + 123: 6(float) ConvertSToF 122 + 124: 7(fvec4) Load 26(input) + 125: 7(fvec4) VectorTimesScalar 124 123 + 126: 7(fvec4) FAdd 121 125 + 127: 32(int) Load 114(c) + 128: 6(float) ConvertSToF 127 + 129: 7(fvec4) Load 26(input) + 130: 7(fvec4) VectorTimesScalar 129 128 + 131: 7(fvec4) FAdd 126 130 + 132: 32(int) Load 116(d) + 133: 6(float) ConvertSToF 132 + 134: 7(fvec4) Load 26(input) + 135: 7(fvec4) VectorTimesScalar 134 133 + 136: 7(fvec4) FAdd 131 135 + Store 117(ret) 136 + 138: 32(int) Load 112(b) + 141: 13(bool) INotEqual 138 140 + 142: 32(int) Load 116(d) + Store 114(c) 142 + 144: 32(int) Select 141 142 143 + Store 110(a) 144 + Store 137(e) 144 + 145: 32(int) Load 110(a) + 146: 13(bool) INotEqual 145 140 + 147: 32(int) Load 114(c) + Store 116(d) 147 + 149: 32(int) Select 146 147 148 + Store 112(b) 149 + 152: 151(ptr) AccessChain 117(ret) 140 + 153: 6(float) Load 152 + 155: 151(ptr) AccessChain 26(input) 154 + 156: 6(float) Load 155 + 157: 13(bool) FOrdLessThan 153 156 + 158: 32(int) Load 114(c) + 159: 6(float) ConvertSToF 158 + 160: 7(fvec4) Load 26(input) + 161: 7(fvec4) VectorTimesScalar 160 159 + 162: 32(int) Load 116(d) + 163: 6(float) ConvertSToF 162 + 164: 7(fvec4) Load 26(input) + 165: 7(fvec4) VectorTimesScalar 164 163 + 166: 43(bvec4) CompositeConstruct 157 157 157 157 + 167: 7(fvec4) Select 166 161 165 + Store 150(f) 167 + 168: 32(int) Load 137(e) + 169: 6(float) ConvertSToF 168 + 170: 7(fvec4) Load 117(ret) + 171: 7(fvec4) VectorTimesScalar 170 169 + 172: 7(fvec4) Load 150(f) + 173: 7(fvec4) FAdd 171 172 + 174: 7(fvec4) FunctionCall 9(vectorCond() + 175: 7(fvec4) FAdd 173 174 + 176: 7(fvec4) FunctionCall 11(scalarCond() + 177: 7(fvec4) FAdd 175 176 + Store 186(param) 180 + Store 187(param) 182 + Store 188(param) 185 + 189: 16(fvec2) FunctionCall 22(fbSelect(vb2;vf2;vf2;) 186(param) 187(param) 188(param) + 191: 6(float) CompositeExtract 189 0 + 192: 6(float) CompositeExtract 189 1 + 193: 7(fvec4) CompositeConstruct 191 192 190 190 + 194: 7(fvec4) FAdd 177 193 + ReturnValue 194 FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.constantbuffer.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.constantbuffer.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.constantbuffer.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.constantbuffer.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -132,7 +132,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 66 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.constructArray.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.constructArray.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.constructArray.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.constructArray.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -268,7 +268,7 @@ 0:? '@entryPointOutput' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 89 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.constructexpr.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.constructexpr.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.constructexpr.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.constructexpr.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -104,7 +104,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 40 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.constructimat.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.constructimat.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.constructimat.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.constructimat.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -544,7 +544,7 @@ 0:? '@entryPointOutput' (layout( location=0) out int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 98 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.dashI.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.dashI.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.dashI.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.dashI.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ hlsl.dashI.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 40 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.deadFunctionMissingBody.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.deadFunctionMissingBody.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.deadFunctionMissingBody.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.deadFunctionMissingBody.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ hlsl.deadFunctionMissingBody.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 18 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.depthGreater.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.depthGreater.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.depthGreater.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.depthGreater.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -50,7 +50,7 @@ 0:? 'depth' ( out float FragDepth) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 20 Capability Shader @@ -59,6 +59,7 @@ EntryPoint Fragment 4 "PixelShaderFunction" 18 ExecutionMode 4 OriginUpperLeft ExecutionMode 4 DepthGreater + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "PixelShaderFunction" Name 10 "@PixelShaderFunction(f1;" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.depthLess.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.depthLess.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.depthLess.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.depthLess.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -42,7 +42,7 @@ 0:? '@entryPointOutput' ( out float FragDepth) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 16 Capability Shader @@ -51,6 +51,7 @@ EntryPoint Fragment 4 "PixelShaderFunction" 14 ExecutionMode 4 OriginUpperLeft ExecutionMode 4 DepthLess + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "PixelShaderFunction" Name 8 "@PixelShaderFunction(" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.discard.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.discard.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.discard.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.discard.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -108,7 +108,7 @@ 0:? 'input' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 50 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.doLoop.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.doLoop.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.doLoop.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.doLoop.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -144,7 +144,7 @@ 0:? 'input' (layout( location=0) in float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 71 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.domain.1.tese.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.domain.1.tese.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.domain.1.tese.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.domain.1.tese.out 2018-04-27 11:46:26.000000000 +0000 @@ -286,7 +286,7 @@ 0:? 'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 103 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.domain.2.tese.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.domain.2.tese.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.domain.2.tese.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.domain.2.tese.out 2018-04-27 11:46:26.000000000 +0000 @@ -284,7 +284,7 @@ 0:? 'pcf_data.foo' (layout( location=2) patch in float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 98 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.domain.3.tese.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.domain.3.tese.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.domain.3.tese.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.domain.3.tese.out 2018-04-27 11:46:26.000000000 +0000 @@ -264,7 +264,7 @@ 0:? 'pcf_data.flInsideTessFactor' ( patch in 2-element array of float TessLevelInner) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 100 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.emptystruct.init.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.emptystruct.init.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.emptystruct.init.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.emptystruct.init.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -60,7 +60,7 @@ 0:? 'vertexIndex' (layout( location=0) in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 29 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.emptystructreturn.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.emptystructreturn.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.emptystructreturn.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.emptystructreturn.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -50,7 +50,7 @@ 0:? Linker Objects // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 27 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.emptystructreturn.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.emptystructreturn.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.emptystructreturn.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.emptystructreturn.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -48,7 +48,7 @@ 0:? Linker Objects // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 27 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.entry-in.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.entry-in.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.entry-in.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.entry-in.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -166,7 +166,7 @@ 0:? 'i.i2' (layout( location=1) flat in 2-component vector of int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 74 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.entry-out.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.entry-out.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.entry-out.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.entry-out.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -244,7 +244,7 @@ 0:? 'out3.i' (layout( location=5) out 2-component vector of int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 89 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.entry.rename.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.entry.rename.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.entry.rename.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.entry.rename.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -72,7 +72,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 32 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.explicitDescriptorSet-2.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ hlsl.explicitDescriptorSet.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 31 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.explicitDescriptorSet.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.explicitDescriptorSet.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.explicitDescriptorSet.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.explicitDescriptorSet.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ hlsl.explicitDescriptorSet.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 31 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.flattenOpaque.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.flattenOpaque.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.flattenOpaque.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.flattenOpaque.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -295,7 +295,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 122 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -107,7 +107,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 59 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.flattenOpaqueInit.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.flattenOpaqueInit.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.flattenOpaqueInit.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.flattenOpaqueInit.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -165,7 +165,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 82 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.flatten.return.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.flatten.return.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.flatten.return.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.flatten.return.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -118,7 +118,7 @@ 0:? '@entryPointOutput.other_struct_member3' (layout( location=3) out float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 49 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.flattenSubset2.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.flattenSubset2.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.flattenSubset2.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.flattenSubset2.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -149,7 +149,7 @@ 0:? 'vpos' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 56 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.flattenSubset.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.flattenSubset.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.flattenSubset.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.flattenSubset.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -115,7 +115,7 @@ 0:? 'vpos' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 54 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.float1.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.float1.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.float1.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.float1.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -65,7 +65,7 @@ 0:? 'scalar' ( global float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 27 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.float4.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.float4.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.float4.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.float4.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -42,7 +42,7 @@ 0:? 'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor, uniform bool ff1, layout( offset=20) uniform float ff2, layout( binding=0 offset=32) uniform 4-component vector of float ff3, layout( binding=1 offset=48) uniform 4-component vector of float ff4}) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 26 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.forLoop.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.forLoop.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.forLoop.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.forLoop.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -402,7 +402,7 @@ 0:? 'input' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 183 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.fraggeom.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.fraggeom.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.fraggeom.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.fraggeom.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -64,7 +64,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 25 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gather.array.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gather.array.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gather.array.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gather.array.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.gather.array.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -133,6 +134,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -260,7 +262,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 124 Capability Shader @@ -270,6 +272,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 107 111 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gather.basic.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gather.basic.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gather.basic.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gather.basic.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.gather.basic.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:29 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:29 Function Parameters: @@ -131,6 +132,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:29 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:29 Function Parameters: @@ -256,7 +258,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 135 Capability Shader @@ -265,6 +267,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 108 112 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gather.basic.dx10.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gather.basic.dx10.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gather.basic.dx10.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gather.basic.dx10.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -220,7 +220,7 @@ 0:? '@entryPointOutput.Pos' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 126 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gathercmpRGBA.offset.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.gathercmpRGBA.offset.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -230,6 +231,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -454,7 +456,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 164 Capability Shader @@ -463,6 +465,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 129 133 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gather.offsetarray.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.gather.offsetarray.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:20 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:20 Function Parameters: @@ -103,6 +104,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:20 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:20 Function Parameters: @@ -200,7 +202,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 97 Capability Shader @@ -209,6 +211,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 80 84 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gather.offset.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gather.offset.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gather.offset.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gather.offset.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.gather.offset.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -106,6 +107,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -206,7 +208,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 114 Capability Shader @@ -215,6 +217,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 79 83 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gatherRGBA.array.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.gatherRGBA.array.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -377,6 +378,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -748,7 +750,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 255 Capability Shader @@ -758,6 +760,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 238 242 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gatherRGBA.basic.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.gatherRGBA.basic.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:34 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:34 Function Parameters: @@ -381,6 +382,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:34 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:34 Function Parameters: @@ -756,7 +758,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 265 Capability Shader @@ -765,6 +767,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 238 242 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gatherRGBA.offsetarray.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.gatherRGBA.offsetarray.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:33 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:33 Function Parameters: @@ -629,6 +630,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:33 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:33 Function Parameters: @@ -1252,7 +1254,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 389 Capability Shader @@ -1263,6 +1265,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 363 367 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gatherRGBA.offset.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.gatherRGBA.offset.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:39 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:39 Function Parameters: @@ -633,6 +634,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:39 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:39 Function Parameters: @@ -1260,7 +1262,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 399 Capability Shader @@ -1270,6 +1272,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 363 367 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.getdimensions.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.getdimensions.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.getdimensions.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.getdimensions.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.getdimensions.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:46 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:46 Function Parameters: @@ -1161,6 +1162,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:46 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:46 Function Parameters: @@ -2316,7 +2318,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 550 Capability Shader @@ -2327,6 +2329,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 540 544 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.getdimensions.dx10.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.getdimensions.dx10.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.getdimensions.dx10.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.getdimensions.dx10.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -116,7 +116,7 @@ 0:? '@entryPointOutput.Pos' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 48 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.getdimensions.rw.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.getdimensions.rw.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.getdimensions.rw.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.getdimensions.rw.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.getdimensions.rw.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:44 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:44 Function Parameters: @@ -361,6 +362,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:44 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:44 Function Parameters: @@ -716,7 +718,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 232 Capability Shader @@ -727,6 +729,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 216 220 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.getsampleposition.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.getsampleposition.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.getsampleposition.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.getsampleposition.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.getsampleposition.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:13 Function Definition: @main(i1; ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:13 Function Parameters: @@ -14,7 +15,7 @@ 0:16 '@sampleCount' ( temp uint) 0:16 imageQuerySamples ( temp uint) 0:16 'g_tTex2dmsf4' ( uniform texture2DMS) -0:16 Test condition and select ( temp 2-component vector of float) +0:16 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:16 Condition 0:16 Compare Equal ( temp bool) 0:16 '@sampleCount' ( temp uint) @@ -29,7 +30,7 @@ 0:? -0.250000 0:16 'sample' ( in int) 0:16 false case -0:16 Test condition and select ( temp 2-component vector of float) +0:16 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:16 Condition 0:16 Compare Equal ( temp bool) 0:16 '@sampleCount' ( temp uint) @@ -48,7 +49,7 @@ 0:? 0.375000 0:16 'sample' ( in int) 0:16 false case -0:16 Test condition and select ( temp 2-component vector of float) +0:16 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:16 Condition 0:16 Compare Equal ( temp bool) 0:16 '@sampleCount' ( temp uint) @@ -75,7 +76,7 @@ 0:? -0.437500 0:16 'sample' ( in int) 0:16 false case -0:16 Test condition and select ( temp 2-component vector of float) +0:16 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:16 Condition 0:16 Compare Equal ( temp bool) 0:16 '@sampleCount' ( temp uint) @@ -129,7 +130,7 @@ 0:17 '@sampleCount' ( temp uint) 0:17 imageQuerySamples ( temp uint) 0:17 'g_tTex2dmsf4a' ( uniform texture2DMSArray) -0:17 Test condition and select ( temp 2-component vector of float) +0:17 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:17 Condition 0:17 Compare Equal ( temp bool) 0:17 '@sampleCount' ( temp uint) @@ -144,7 +145,7 @@ 0:? -0.250000 0:17 'sample' ( in int) 0:17 false case -0:17 Test condition and select ( temp 2-component vector of float) +0:17 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:17 Condition 0:17 Compare Equal ( temp bool) 0:17 '@sampleCount' ( temp uint) @@ -163,7 +164,7 @@ 0:? 0.375000 0:17 'sample' ( in int) 0:17 false case -0:17 Test condition and select ( temp 2-component vector of float) +0:17 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:17 Condition 0:17 Compare Equal ( temp bool) 0:17 '@sampleCount' ( temp uint) @@ -190,7 +191,7 @@ 0:? -0.437500 0:17 'sample' ( in int) 0:17 false case -0:17 Test condition and select ( temp 2-component vector of float) +0:17 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:17 Condition 0:17 Compare Equal ( temp bool) 0:17 '@sampleCount' ( temp uint) @@ -292,6 +293,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:13 Function Definition: @main(i1; ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:13 Function Parameters: @@ -305,7 +307,7 @@ 0:16 '@sampleCount' ( temp uint) 0:16 imageQuerySamples ( temp uint) 0:16 'g_tTex2dmsf4' ( uniform texture2DMS) -0:16 Test condition and select ( temp 2-component vector of float) +0:16 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:16 Condition 0:16 Compare Equal ( temp bool) 0:16 '@sampleCount' ( temp uint) @@ -320,7 +322,7 @@ 0:? -0.250000 0:16 'sample' ( in int) 0:16 false case -0:16 Test condition and select ( temp 2-component vector of float) +0:16 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:16 Condition 0:16 Compare Equal ( temp bool) 0:16 '@sampleCount' ( temp uint) @@ -339,7 +341,7 @@ 0:? 0.375000 0:16 'sample' ( in int) 0:16 false case -0:16 Test condition and select ( temp 2-component vector of float) +0:16 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:16 Condition 0:16 Compare Equal ( temp bool) 0:16 '@sampleCount' ( temp uint) @@ -366,7 +368,7 @@ 0:? -0.437500 0:16 'sample' ( in int) 0:16 false case -0:16 Test condition and select ( temp 2-component vector of float) +0:16 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:16 Condition 0:16 Compare Equal ( temp bool) 0:16 '@sampleCount' ( temp uint) @@ -420,7 +422,7 @@ 0:17 '@sampleCount' ( temp uint) 0:17 imageQuerySamples ( temp uint) 0:17 'g_tTex2dmsf4a' ( uniform texture2DMSArray) -0:17 Test condition and select ( temp 2-component vector of float) +0:17 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:17 Condition 0:17 Compare Equal ( temp bool) 0:17 '@sampleCount' ( temp uint) @@ -435,7 +437,7 @@ 0:? -0.250000 0:17 'sample' ( in int) 0:17 false case -0:17 Test condition and select ( temp 2-component vector of float) +0:17 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:17 Condition 0:17 Compare Equal ( temp bool) 0:17 '@sampleCount' ( temp uint) @@ -454,7 +456,7 @@ 0:? 0.375000 0:17 'sample' ( in int) 0:17 false case -0:17 Test condition and select ( temp 2-component vector of float) +0:17 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:17 Condition 0:17 Compare Equal ( temp bool) 0:17 '@sampleCount' ( temp uint) @@ -481,7 +483,7 @@ 0:? -0.437500 0:17 'sample' ( in int) 0:17 false case -0:17 Test condition and select ( temp 2-component vector of float) +0:17 Test condition and select ( temp 2-component vector of float): no shortcircuit 0:17 Condition 0:17 Compare Equal ( temp bool) 0:17 '@sampleCount' ( temp uint) @@ -578,15 +580,16 @@ 0:? 'sample' (layout( location=0) flat in int) // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 221 +// Generated by (magic number): 80006 +// Id's are bound by 198 Capability Shader Capability ImageQuery 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 204 211 215 + EntryPoint Fragment 4 "main" 181 188 192 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 10 "PS_OUTPUT" @@ -597,33 +600,33 @@ Name 17 "r00" Name 20 "@sampleCount" Name 23 "g_tTex2dmsf4" - Name 42 "indexable" - Name 65 "indexable" - Name 96 "indexable" - Name 129 "indexable" - Name 138 "r01" - Name 139 "@sampleCount" - Name 142 "g_tTex2dmsf4a" - Name 151 "indexable" - Name 161 "indexable" - Name 171 "indexable" - Name 181 "indexable" - Name 190 "psout" - Name 202 "sample" - Name 204 "sample" - Name 206 "flattenTemp" - Name 207 "param" - Name 211 "@entryPointOutput.Color" - Name 215 "@entryPointOutput.Depth" - Name 220 "g_sSamp" + Name 39 "indexable" + Name 58 "indexable" + Name 85 "indexable" + Name 114 "indexable" + Name 127 "r01" + Name 128 "@sampleCount" + Name 131 "g_tTex2dmsf4a" + Name 137 "indexable" + Name 143 "indexable" + Name 149 "indexable" + Name 155 "indexable" + Name 167 "psout" + Name 179 "sample" + Name 181 "sample" + Name 183 "flattenTemp" + Name 184 "param" + Name 188 "@entryPointOutput.Color" + Name 192 "@entryPointOutput.Depth" + Name 197 "g_sSamp" Decorate 23(g_tTex2dmsf4) DescriptorSet 0 - Decorate 142(g_tTex2dmsf4a) DescriptorSet 0 - Decorate 204(sample) Flat - Decorate 204(sample) Location 0 - Decorate 211(@entryPointOutput.Color) Location 0 - Decorate 215(@entryPointOutput.Depth) BuiltIn FragDepth - Decorate 220(g_sSamp) DescriptorSet 0 - Decorate 220(g_sSamp) Binding 0 + Decorate 131(g_tTex2dmsf4a) DescriptorSet 0 + Decorate 181(sample) Flat + Decorate 181(sample) Location 0 + Decorate 188(@entryPointOutput.Color) Location 0 + Decorate 192(@entryPointOutput.Depth) BuiltIn FragDepth + Decorate 197(g_sSamp) DescriptorSet 0 + Decorate 197(g_sSamp) Binding 0 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 1 @@ -639,110 +642,111 @@ 21: TypeImage 8(float) 2D multi-sampled sampled format:Unknown 22: TypePointer UniformConstant 21 23(g_tTex2dmsf4): 22(ptr) Variable UniformConstant - 28: 6(int) Constant 2 - 29: TypeBool - 33: 18(int) Constant 2 - 34: TypeArray 15(fvec2) 33 - 35: 8(float) Constant 1048576000 - 36: 15(fvec2) ConstantComposite 35 35 - 37: 8(float) Constant 3196059648 - 38: 15(fvec2) ConstantComposite 37 37 - 39: 34 ConstantComposite 36 38 - 41: TypePointer Function 34 - 48: 6(int) Constant 4 - 52: 18(int) Constant 4 - 53: TypeArray 15(fvec2) 52 - 54: 8(float) Constant 3187671040 - 55: 8(float) Constant 3200253952 - 56: 15(fvec2) ConstantComposite 54 55 - 57: 8(float) Constant 1052770304 - 58: 15(fvec2) ConstantComposite 57 54 - 59: 8(float) Constant 1040187392 - 60: 15(fvec2) ConstantComposite 55 59 - 61: 15(fvec2) ConstantComposite 59 57 - 62: 53 ConstantComposite 56 58 60 61 - 64: TypePointer Function 53 - 71: 6(int) Constant 8 - 75: 18(int) Constant 8 - 76: TypeArray 15(fvec2) 75 - 77: 8(float) Constant 1031798784 - 78: 8(float) Constant 3191865344 - 79: 15(fvec2) ConstantComposite 77 78 - 80: 8(float) Constant 3179282432 - 81: 8(float) Constant 1044381696 - 82: 15(fvec2) ConstantComposite 80 81 - 83: 8(float) Constant 1050673152 - 84: 15(fvec2) ConstantComposite 83 77 - 85: 8(float) Constant 3198156800 - 86: 15(fvec2) ConstantComposite 78 85 - 87: 15(fvec2) ConstantComposite 85 83 - 88: 8(float) Constant 3202351104 - 89: 15(fvec2) ConstantComposite 88 80 - 90: 8(float) Constant 1054867456 - 91: 15(fvec2) ConstantComposite 81 90 - 92: 15(fvec2) ConstantComposite 90 88 - 93: 76 ConstantComposite 79 82 84 86 87 89 91 92 - 95: TypePointer Function 76 - 102: 6(int) Constant 16 - 106: 18(int) Constant 16 - 107: TypeArray 15(fvec2) 106 - 108: 15(fvec2) ConstantComposite 77 77 - 109: 15(fvec2) ConstantComposite 80 78 - 110: 15(fvec2) ConstantComposite 78 59 - 111: 15(fvec2) ConstantComposite 35 80 - 112: 15(fvec2) ConstantComposite 85 54 - 113: 15(fvec2) ConstantComposite 59 83 - 114: 15(fvec2) ConstantComposite 83 81 - 115: 15(fvec2) ConstantComposite 81 85 - 116: 15(fvec2) ConstantComposite 54 57 - 117: 8(float) Constant 0 - 118: 15(fvec2) ConstantComposite 117 88 - 119: 15(fvec2) ConstantComposite 37 55 - 120: 15(fvec2) ConstantComposite 55 35 - 121: 8(float) Constant 3204448256 - 122: 15(fvec2) ConstantComposite 121 117 - 123: 15(fvec2) ConstantComposite 90 37 - 124: 15(fvec2) ConstantComposite 57 90 - 125: 15(fvec2) ConstantComposite 88 121 - 126: 107 ConstantComposite 108 109 110 111 112 113 114 115 116 118 119 120 122 123 124 125 - 128: TypePointer Function 107 - 133: 15(fvec2) ConstantComposite 117 117 - 140: TypeImage 8(float) 2D array multi-sampled sampled format:Unknown - 141: TypePointer UniformConstant 140 -142(g_tTex2dmsf4a): 141(ptr) Variable UniformConstant - 189: TypePointer Function 10(PS_OUTPUT) - 191: 6(int) Constant 0 - 192: 8(float) Constant 1065353216 - 193: 9(fvec4) ConstantComposite 192 192 192 192 - 194: TypePointer Function 9(fvec4) - 196: 6(int) Constant 1 - 197: TypePointer Function 8(float) - 203: TypePointer Input 6(int) - 204(sample): 203(ptr) Variable Input - 210: TypePointer Output 9(fvec4) -211(@entryPointOutput.Color): 210(ptr) Variable Output - 214: TypePointer Output 8(float) -215(@entryPointOutput.Depth): 214(ptr) Variable Output - 218: TypeSampler - 219: TypePointer UniformConstant 218 - 220(g_sSamp): 219(ptr) Variable UniformConstant + 27: 6(int) Constant 2 + 28: TypeBool + 30: 18(int) Constant 2 + 31: TypeArray 15(fvec2) 30 + 32: 8(float) Constant 1048576000 + 33: 15(fvec2) ConstantComposite 32 32 + 34: 8(float) Constant 3196059648 + 35: 15(fvec2) ConstantComposite 34 34 + 36: 31 ConstantComposite 33 35 + 38: TypePointer Function 31 + 43: 6(int) Constant 4 + 45: 18(int) Constant 4 + 46: TypeArray 15(fvec2) 45 + 47: 8(float) Constant 3187671040 + 48: 8(float) Constant 3200253952 + 49: 15(fvec2) ConstantComposite 47 48 + 50: 8(float) Constant 1052770304 + 51: 15(fvec2) ConstantComposite 50 47 + 52: 8(float) Constant 1040187392 + 53: 15(fvec2) ConstantComposite 48 52 + 54: 15(fvec2) ConstantComposite 52 50 + 55: 46 ConstantComposite 49 51 53 54 + 57: TypePointer Function 46 + 62: 6(int) Constant 8 + 64: 18(int) Constant 8 + 65: TypeArray 15(fvec2) 64 + 66: 8(float) Constant 1031798784 + 67: 8(float) Constant 3191865344 + 68: 15(fvec2) ConstantComposite 66 67 + 69: 8(float) Constant 3179282432 + 70: 8(float) Constant 1044381696 + 71: 15(fvec2) ConstantComposite 69 70 + 72: 8(float) Constant 1050673152 + 73: 15(fvec2) ConstantComposite 72 66 + 74: 8(float) Constant 3198156800 + 75: 15(fvec2) ConstantComposite 67 74 + 76: 15(fvec2) ConstantComposite 74 72 + 77: 8(float) Constant 3202351104 + 78: 15(fvec2) ConstantComposite 77 69 + 79: 8(float) Constant 1054867456 + 80: 15(fvec2) ConstantComposite 70 79 + 81: 15(fvec2) ConstantComposite 79 77 + 82: 65 ConstantComposite 68 71 73 75 76 78 80 81 + 84: TypePointer Function 65 + 89: 6(int) Constant 16 + 91: 18(int) Constant 16 + 92: TypeArray 15(fvec2) 91 + 93: 15(fvec2) ConstantComposite 66 66 + 94: 15(fvec2) ConstantComposite 69 67 + 95: 15(fvec2) ConstantComposite 67 52 + 96: 15(fvec2) ConstantComposite 32 69 + 97: 15(fvec2) ConstantComposite 74 47 + 98: 15(fvec2) ConstantComposite 52 72 + 99: 15(fvec2) ConstantComposite 72 70 + 100: 15(fvec2) ConstantComposite 70 74 + 101: 15(fvec2) ConstantComposite 47 50 + 102: 8(float) Constant 0 + 103: 15(fvec2) ConstantComposite 102 77 + 104: 15(fvec2) ConstantComposite 34 48 + 105: 15(fvec2) ConstantComposite 48 32 + 106: 8(float) Constant 3204448256 + 107: 15(fvec2) ConstantComposite 106 102 + 108: 15(fvec2) ConstantComposite 79 34 + 109: 15(fvec2) ConstantComposite 50 79 + 110: 15(fvec2) ConstantComposite 77 106 + 111: 92 ConstantComposite 93 94 95 96 97 98 99 100 101 103 104 105 107 108 109 110 + 113: TypePointer Function 92 + 117: 15(fvec2) ConstantComposite 102 102 + 118: TypeVector 28(bool) 2 + 129: TypeImage 8(float) 2D array multi-sampled sampled format:Unknown + 130: TypePointer UniformConstant 129 +131(g_tTex2dmsf4a): 130(ptr) Variable UniformConstant + 166: TypePointer Function 10(PS_OUTPUT) + 168: 6(int) Constant 0 + 169: 8(float) Constant 1065353216 + 170: 9(fvec4) ConstantComposite 169 169 169 169 + 171: TypePointer Function 9(fvec4) + 173: 6(int) Constant 1 + 174: TypePointer Function 8(float) + 180: TypePointer Input 6(int) + 181(sample): 180(ptr) Variable Input + 187: TypePointer Output 9(fvec4) +188(@entryPointOutput.Color): 187(ptr) Variable Output + 191: TypePointer Output 8(float) +192(@entryPointOutput.Depth): 191(ptr) Variable Output + 195: TypeSampler + 196: TypePointer UniformConstant 195 + 197(g_sSamp): 196(ptr) Variable UniformConstant 4(main): 2 Function None 3 5: Label - 202(sample): 7(ptr) Variable Function -206(flattenTemp): 189(ptr) Variable Function - 207(param): 7(ptr) Variable Function - 205: 6(int) Load 204(sample) - Store 202(sample) 205 - 208: 6(int) Load 202(sample) - Store 207(param) 208 - 209:10(PS_OUTPUT) FunctionCall 13(@main(i1;) 207(param) - Store 206(flattenTemp) 209 - 212: 194(ptr) AccessChain 206(flattenTemp) 191 - 213: 9(fvec4) Load 212 - Store 211(@entryPointOutput.Color) 213 - 216: 197(ptr) AccessChain 206(flattenTemp) 196 - 217: 8(float) Load 216 - Store 215(@entryPointOutput.Depth) 217 + 179(sample): 7(ptr) Variable Function +183(flattenTemp): 166(ptr) Variable Function + 184(param): 7(ptr) Variable Function + 182: 6(int) Load 181(sample) + Store 179(sample) 182 + 185: 6(int) Load 179(sample) + Store 184(param) 185 + 186:10(PS_OUTPUT) FunctionCall 13(@main(i1;) 184(param) + Store 183(flattenTemp) 186 + 189: 171(ptr) AccessChain 183(flattenTemp) 168 + 190: 9(fvec4) Load 189 + Store 188(@entryPointOutput.Color) 190 + 193: 174(ptr) AccessChain 183(flattenTemp) 173 + 194: 8(float) Load 193 + Store 192(@entryPointOutput.Depth) 194 Return FunctionEnd 13(@main(i1;):10(PS_OUTPUT) Function None 11 @@ -750,165 +754,93 @@ 14: Label 17(r00): 16(ptr) Variable Function 20(@sampleCount): 19(ptr) Variable Function - 26: 16(ptr) Variable Function - 42(indexable): 41(ptr) Variable Function - 46: 16(ptr) Variable Function - 65(indexable): 64(ptr) Variable Function - 69: 16(ptr) Variable Function - 96(indexable): 95(ptr) Variable Function - 100: 16(ptr) Variable Function - 129(indexable): 128(ptr) Variable Function - 138(r01): 16(ptr) Variable Function -139(@sampleCount): 19(ptr) Variable Function - 145: 16(ptr) Variable Function - 151(indexable): 41(ptr) Variable Function - 155: 16(ptr) Variable Function - 161(indexable): 64(ptr) Variable Function - 165: 16(ptr) Variable Function - 171(indexable): 95(ptr) Variable Function - 175: 16(ptr) Variable Function - 181(indexable): 128(ptr) Variable Function - 190(psout): 189(ptr) Variable Function + 39(indexable): 38(ptr) Variable Function + 58(indexable): 57(ptr) Variable Function + 85(indexable): 84(ptr) Variable Function + 114(indexable): 113(ptr) Variable Function + 127(r01): 16(ptr) Variable Function +128(@sampleCount): 19(ptr) Variable Function + 137(indexable): 38(ptr) Variable Function + 143(indexable): 57(ptr) Variable Function + 149(indexable): 84(ptr) Variable Function + 155(indexable): 113(ptr) Variable Function + 167(psout): 166(ptr) Variable Function 24: 21 Load 23(g_tTex2dmsf4) 25: 18(int) ImageQuerySamples 24 Store 20(@sampleCount) 25 - 27: 18(int) Load 20(@sampleCount) - 30: 29(bool) IEqual 27 28 - SelectionMerge 32 None - BranchConditional 30 31 45 - 31: Label - 40: 6(int) Load 12(sample) - Store 42(indexable) 39 - 43: 16(ptr) AccessChain 42(indexable) 40 - 44: 15(fvec2) Load 43 - Store 26 44 - Branch 32 - 45: Label - 47: 18(int) Load 20(@sampleCount) - 49: 29(bool) IEqual 47 48 - SelectionMerge 51 None - BranchConditional 49 50 68 - 50: Label - 63: 6(int) Load 12(sample) - Store 65(indexable) 62 - 66: 16(ptr) AccessChain 65(indexable) 63 - 67: 15(fvec2) Load 66 - Store 46 67 - Branch 51 - 68: Label - 70: 18(int) Load 20(@sampleCount) - 72: 29(bool) IEqual 70 71 - SelectionMerge 74 None - BranchConditional 72 73 99 - 73: Label - 94: 6(int) Load 12(sample) - Store 96(indexable) 93 - 97: 16(ptr) AccessChain 96(indexable) 94 - 98: 15(fvec2) Load 97 - Store 69 98 - Branch 74 - 99: Label - 101: 18(int) Load 20(@sampleCount) - 103: 29(bool) IEqual 101 102 - SelectionMerge 105 None - BranchConditional 103 104 132 - 104: Label - 127: 6(int) Load 12(sample) - Store 129(indexable) 126 - 130: 16(ptr) AccessChain 129(indexable) 127 - 131: 15(fvec2) Load 130 - Store 100 131 - Branch 105 - 132: Label - Store 100 133 - Branch 105 - 105: Label - 134: 15(fvec2) Load 100 - Store 69 134 - Branch 74 - 74: Label - 135: 15(fvec2) Load 69 - Store 46 135 - Branch 51 - 51: Label - 136: 15(fvec2) Load 46 - Store 26 136 - Branch 32 - 32: Label - 137: 15(fvec2) Load 26 - Store 17(r00) 137 - 143: 140 Load 142(g_tTex2dmsf4a) - 144: 18(int) ImageQuerySamples 143 - Store 139(@sampleCount) 144 - 146: 18(int) Load 139(@sampleCount) - 147: 29(bool) IEqual 146 28 - SelectionMerge 149 None - BranchConditional 147 148 154 - 148: Label - 150: 6(int) Load 12(sample) - Store 151(indexable) 39 - 152: 16(ptr) AccessChain 151(indexable) 150 - 153: 15(fvec2) Load 152 - Store 145 153 - Branch 149 - 154: Label - 156: 18(int) Load 139(@sampleCount) - 157: 29(bool) IEqual 156 48 - SelectionMerge 159 None - BranchConditional 157 158 164 - 158: Label - 160: 6(int) Load 12(sample) - Store 161(indexable) 62 - 162: 16(ptr) AccessChain 161(indexable) 160 - 163: 15(fvec2) Load 162 - Store 155 163 - Branch 159 - 164: Label - 166: 18(int) Load 139(@sampleCount) - 167: 29(bool) IEqual 166 71 - SelectionMerge 169 None - BranchConditional 167 168 174 - 168: Label - 170: 6(int) Load 12(sample) - Store 171(indexable) 93 - 172: 16(ptr) AccessChain 171(indexable) 170 - 173: 15(fvec2) Load 172 - Store 165 173 - Branch 169 - 174: Label - 176: 18(int) Load 139(@sampleCount) - 177: 29(bool) IEqual 176 102 - SelectionMerge 179 None - BranchConditional 177 178 184 - 178: Label - 180: 6(int) Load 12(sample) - Store 181(indexable) 126 - 182: 16(ptr) AccessChain 181(indexable) 180 - 183: 15(fvec2) Load 182 - Store 175 183 - Branch 179 - 184: Label - Store 175 133 - Branch 179 - 179: Label - 185: 15(fvec2) Load 175 - Store 165 185 - Branch 169 - 169: Label - 186: 15(fvec2) Load 165 - Store 155 186 - Branch 159 - 159: Label - 187: 15(fvec2) Load 155 - Store 145 187 - Branch 149 - 149: Label - 188: 15(fvec2) Load 145 - Store 138(r01) 188 - 195: 194(ptr) AccessChain 190(psout) 191 - Store 195 193 - 198: 197(ptr) AccessChain 190(psout) 196 - Store 198 192 - 199:10(PS_OUTPUT) Load 190(psout) - ReturnValue 199 + 26: 18(int) Load 20(@sampleCount) + 29: 28(bool) IEqual 26 27 + 37: 6(int) Load 12(sample) + Store 39(indexable) 36 + 40: 16(ptr) AccessChain 39(indexable) 37 + 41: 15(fvec2) Load 40 + 42: 18(int) Load 20(@sampleCount) + 44: 28(bool) IEqual 42 43 + 56: 6(int) Load 12(sample) + Store 58(indexable) 55 + 59: 16(ptr) AccessChain 58(indexable) 56 + 60: 15(fvec2) Load 59 + 61: 18(int) Load 20(@sampleCount) + 63: 28(bool) IEqual 61 62 + 83: 6(int) Load 12(sample) + Store 85(indexable) 82 + 86: 16(ptr) AccessChain 85(indexable) 83 + 87: 15(fvec2) Load 86 + 88: 18(int) Load 20(@sampleCount) + 90: 28(bool) IEqual 88 89 + 112: 6(int) Load 12(sample) + Store 114(indexable) 111 + 115: 16(ptr) AccessChain 114(indexable) 112 + 116: 15(fvec2) Load 115 + 119: 118(bvec2) CompositeConstruct 90 90 + 120: 15(fvec2) Select 119 116 117 + 121: 118(bvec2) CompositeConstruct 63 63 + 122: 15(fvec2) Select 121 87 120 + 123: 118(bvec2) CompositeConstruct 44 44 + 124: 15(fvec2) Select 123 60 122 + 125: 118(bvec2) CompositeConstruct 29 29 + 126: 15(fvec2) Select 125 41 124 + Store 17(r00) 126 + 132: 129 Load 131(g_tTex2dmsf4a) + 133: 18(int) ImageQuerySamples 132 + Store 128(@sampleCount) 133 + 134: 18(int) Load 128(@sampleCount) + 135: 28(bool) IEqual 134 27 + 136: 6(int) Load 12(sample) + Store 137(indexable) 36 + 138: 16(ptr) AccessChain 137(indexable) 136 + 139: 15(fvec2) Load 138 + 140: 18(int) Load 128(@sampleCount) + 141: 28(bool) IEqual 140 43 + 142: 6(int) Load 12(sample) + Store 143(indexable) 55 + 144: 16(ptr) AccessChain 143(indexable) 142 + 145: 15(fvec2) Load 144 + 146: 18(int) Load 128(@sampleCount) + 147: 28(bool) IEqual 146 62 + 148: 6(int) Load 12(sample) + Store 149(indexable) 82 + 150: 16(ptr) AccessChain 149(indexable) 148 + 151: 15(fvec2) Load 150 + 152: 18(int) Load 128(@sampleCount) + 153: 28(bool) IEqual 152 89 + 154: 6(int) Load 12(sample) + Store 155(indexable) 111 + 156: 16(ptr) AccessChain 155(indexable) 154 + 157: 15(fvec2) Load 156 + 158: 118(bvec2) CompositeConstruct 153 153 + 159: 15(fvec2) Select 158 157 117 + 160: 118(bvec2) CompositeConstruct 147 147 + 161: 15(fvec2) Select 160 151 159 + 162: 118(bvec2) CompositeConstruct 141 141 + 163: 15(fvec2) Select 162 145 161 + 164: 118(bvec2) CompositeConstruct 135 135 + 165: 15(fvec2) Select 164 139 163 + Store 127(r01) 165 + 172: 171(ptr) AccessChain 167(psout) 168 + Store 172 170 + 175: 174(ptr) AccessChain 167(psout) 173 + Store 175 169 + 176:10(PS_OUTPUT) Load 167(psout) + ReturnValue 176 FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.global-const-init.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.global-const-init.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.global-const-init.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.global-const-init.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -102,7 +102,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 50 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gs-hs-mix.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gs-hs-mix.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.gs-hs-mix.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.gs-hs-mix.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -798,7 +798,7 @@ 0:? '@patchConstantOutput' (layout( location=1) patch out structure{ temp 3-element array of 3-component vector of float NormalWS}) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 216 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hlslOffset.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hlslOffset.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hlslOffset.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hlslOffset.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -26,7 +26,7 @@ 0:? 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform float m0, layout( row_major std140) uniform 3-component vector of float m4, layout( row_major std140) uniform float m16, layout( row_major std140 offset=20) uniform 3-component vector of float m20, layout( row_major std140 offset=36) uniform 3-component vector of float m36, layout( row_major std140 offset=56) uniform 2-component vector of float m56, layout( row_major std140) uniform float m64, layout( row_major std140) uniform 2-component vector of float m68, layout( row_major std140) uniform float m76, layout( row_major std140) uniform float m80, layout( row_major std140) uniform 1-element array of 2-component vector of float m96}) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 18 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.1.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.1.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.1.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.1.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -224,7 +224,7 @@ 0:? '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 89 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.2.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.2.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.2.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.2.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -220,7 +220,7 @@ 0:? '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 91 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.3.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.3.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.3.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.3.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -220,7 +220,7 @@ 0:? '@patchConstantOutput.edges' ( patch out 4-element array of float TessLevelOuter) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 91 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.4.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.4.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.4.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.4.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -476,7 +476,7 @@ 0:? '@patchConstantOutput.fInsideTessFactor' ( patch out 2-element array of float TessLevelInner) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 127 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.ctrlpt-1.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.ctrlpt-1.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.ctrlpt-1.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.ctrlpt-1.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -396,7 +396,7 @@ 0:? '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 124 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -414,7 +414,7 @@ 0:? '@patchConstantOutput.flInFactor' ( patch out 2-element array of float TessLevelInner) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 126 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.void.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.void.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.hull.void.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.hull.void.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -108,7 +108,7 @@ 0:? 'InvocationId' ( in uint InvocationID) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 55 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.identifier.sample.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.identifier.sample.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.identifier.sample.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.identifier.sample.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -86,7 +86,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 33 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.if.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.if.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.if.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.if.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -216,7 +216,7 @@ 0:? 'input' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 103 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.imagefetch-subvec4.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.imagefetch-subvec4.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.imagefetch-subvec4.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.imagefetch-subvec4.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,142 @@ +hlsl.imagefetch-subvec4.comp +Shader version: 500 +local_size = (8, 8, 8) +0:? Sequence +0:6 Function Definition: @main(vu3; ( temp void) +0:6 Function Parameters: +0:6 'tid' ( in 3-component vector of uint) +0:? Sequence +0:7 Sequence +0:7 move second child to first child ( temp uint) +0:7 'storeTemp' ( temp uint) +0:7 Convert int to uint ( temp uint) +0:7 textureFetch ( temp int) +0:7 'IN' (layout( binding=0) uniform itexture3D) +0:7 'tid' ( in 3-component vector of uint) +0:7 Constant: +0:7 0 (const int) +0:7 imageStore ( temp void) +0:7 'OUT' (layout( binding=1 r32ui) uniform uimage3D) +0:7 'tid' ( in 3-component vector of uint) +0:7 'storeTemp' ( temp uint) +0:7 'storeTemp' ( temp uint) +0:6 Function Definition: main( ( temp void) +0:6 Function Parameters: +0:? Sequence +0:6 move second child to first child ( temp 3-component vector of uint) +0:? 'tid' ( temp 3-component vector of uint) +0:? 'tid' ( in 3-component vector of uint GlobalInvocationID) +0:6 Function Call: @main(vu3; ( temp void) +0:? 'tid' ( temp 3-component vector of uint) +0:? Linker Objects +0:? 'IN' (layout( binding=0) uniform itexture3D) +0:? 'OUT' (layout( binding=1 r32ui) uniform uimage3D) +0:? 'tid' ( in 3-component vector of uint GlobalInvocationID) + + +Linked compute stage: + + +Shader version: 500 +local_size = (8, 8, 8) +0:? Sequence +0:6 Function Definition: @main(vu3; ( temp void) +0:6 Function Parameters: +0:6 'tid' ( in 3-component vector of uint) +0:? Sequence +0:7 Sequence +0:7 move second child to first child ( temp uint) +0:7 'storeTemp' ( temp uint) +0:7 Convert int to uint ( temp uint) +0:7 textureFetch ( temp int) +0:7 'IN' (layout( binding=0) uniform itexture3D) +0:7 'tid' ( in 3-component vector of uint) +0:7 Constant: +0:7 0 (const int) +0:7 imageStore ( temp void) +0:7 'OUT' (layout( binding=1 r32ui) uniform uimage3D) +0:7 'tid' ( in 3-component vector of uint) +0:7 'storeTemp' ( temp uint) +0:7 'storeTemp' ( temp uint) +0:6 Function Definition: main( ( temp void) +0:6 Function Parameters: +0:? Sequence +0:6 move second child to first child ( temp 3-component vector of uint) +0:? 'tid' ( temp 3-component vector of uint) +0:? 'tid' ( in 3-component vector of uint GlobalInvocationID) +0:6 Function Call: @main(vu3; ( temp void) +0:? 'tid' ( temp 3-component vector of uint) +0:? Linker Objects +0:? 'IN' (layout( binding=0) uniform itexture3D) +0:? 'OUT' (layout( binding=1 r32ui) uniform uimage3D) +0:? 'tid' ( in 3-component vector of uint GlobalInvocationID) + +// Module Version 10000 +// Generated by (magic number): 80006 +// Id's are bound by 39 + + Capability Shader + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" 34 + ExecutionMode 4 LocalSize 8 8 8 + Source HLSL 500 + Name 4 "main" + Name 11 "@main(vu3;" + Name 10 "tid" + Name 14 "storeTemp" + Name 18 "IN" + Name 28 "OUT" + Name 32 "tid" + Name 34 "tid" + Name 36 "param" + Decorate 18(IN) DescriptorSet 0 + Decorate 18(IN) Binding 0 + Decorate 28(OUT) DescriptorSet 0 + Decorate 28(OUT) Binding 1 + Decorate 34(tid) BuiltIn GlobalInvocationId + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypeVector 6(int) 3 + 8: TypePointer Function 7(ivec3) + 9: TypeFunction 2 8(ptr) + 13: TypePointer Function 6(int) + 15: TypeInt 32 1 + 16: TypeImage 15(int) 3D sampled format:Unknown + 17: TypePointer UniformConstant 16 + 18(IN): 17(ptr) Variable UniformConstant + 21: 15(int) Constant 0 + 22: TypeVector 15(int) 4 + 26: TypeImage 6(int) 3D nonsampled format:R32ui + 27: TypePointer UniformConstant 26 + 28(OUT): 27(ptr) Variable UniformConstant + 33: TypePointer Input 7(ivec3) + 34(tid): 33(ptr) Variable Input + 4(main): 2 Function None 3 + 5: Label + 32(tid): 8(ptr) Variable Function + 36(param): 8(ptr) Variable Function + 35: 7(ivec3) Load 34(tid) + Store 32(tid) 35 + 37: 7(ivec3) Load 32(tid) + Store 36(param) 37 + 38: 2 FunctionCall 11(@main(vu3;) 36(param) + Return + FunctionEnd + 11(@main(vu3;): 2 Function None 9 + 10(tid): 8(ptr) FunctionParameter + 12: Label + 14(storeTemp): 13(ptr) Variable Function + 19: 16 Load 18(IN) + 20: 7(ivec3) Load 10(tid) + 23: 22(ivec4) ImageFetch 19 20 Lod 21 + 24: 15(int) CompositeExtract 23 0 + 25: 6(int) Bitcast 24 + Store 14(storeTemp) 25 + 29: 26 Load 28(OUT) + 30: 7(ivec3) Load 10(tid) + 31: 6(int) Load 14(storeTemp) + ImageWrite 29 30 31 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.implicitBool.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.implicitBool.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.implicitBool.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.implicitBool.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -74,12 +74,11 @@ 0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1}) 0:17 Constant: 0:17 1 (const uint) -0:17 Convert int to bool ( temp bool) -0:17 Convert float to int ( temp int) -0:17 condf: direct index for structure ( uniform float) -0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1}) -0:17 Constant: -0:17 0 (const uint) +0:17 Convert float to bool ( temp bool) +0:17 condf: direct index for structure ( uniform float) +0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1}) +0:17 Constant: +0:17 0 (const uint) 0:17 Convert float to bool ( temp bool) 0:17 condf1: direct index for structure ( uniform 1-component vector of float) 0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1}) @@ -133,7 +132,7 @@ 0:28 Sequence 0:28 move second child to first child ( temp float) 0:28 'g' ( temp float) -0:28 Test condition and select ( temp float) +0:28 Test condition and select ( temp float): no shortcircuit 0:28 Condition 0:28 Convert float to bool ( temp bool) 0:28 condf: direct index for structure ( uniform float) @@ -243,12 +242,11 @@ 0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1}) 0:17 Constant: 0:17 1 (const uint) -0:17 Convert int to bool ( temp bool) -0:17 Convert float to int ( temp int) -0:17 condf: direct index for structure ( uniform float) -0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1}) -0:17 Constant: -0:17 0 (const uint) +0:17 Convert float to bool ( temp bool) +0:17 condf: direct index for structure ( uniform float) +0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1}) +0:17 Constant: +0:17 0 (const uint) 0:17 Convert float to bool ( temp bool) 0:17 condf1: direct index for structure ( uniform 1-component vector of float) 0:17 'anon@0' (layout( row_major std140) uniform block{ uniform float condf, uniform int condi, uniform 1-component vector of float condf1, uniform 1-component vector of int condi1}) @@ -302,7 +300,7 @@ 0:28 Sequence 0:28 move second child to first child ( temp float) 0:28 'g' ( temp float) -0:28 Test condition and select ( temp float) +0:28 Test condition and select ( temp float): no shortcircuit 0:28 Condition 0:28 Convert float to bool ( temp bool) 0:28 condf: direct index for structure ( uniform float) @@ -334,13 +332,13 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 140 +// Generated by (magic number): 80006 +// Id's are bound by 139 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 138 + EntryPoint Fragment 4 "main" 137 ExecutionMode 4 OriginUpperLeft Source HLSL 500 Name 4 "main" @@ -352,17 +350,17 @@ MemberName 16($Global) 2 "condf1" MemberName 16($Global) 3 "condi1" Name 18 "" - Name 88 "f" - Name 101 "i" - Name 121 "g" - Name 138 "@entryPointOutput" + Name 87 "f" + Name 100 "i" + Name 120 "g" + Name 137 "@entryPointOutput" MemberDecorate 16($Global) 0 Offset 0 MemberDecorate 16($Global) 1 Offset 4 - MemberDecorate 16($Global) 2 Offset 16 - MemberDecorate 16($Global) 3 Offset 32 + MemberDecorate 16($Global) 2 Offset 8 + MemberDecorate 16($Global) 3 Offset 12 Decorate 16($Global) Block Decorate 18 DescriptorSet 0 - Decorate 138(@entryPointOutput) Location 0 + Decorate 137(@entryPointOutput) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -388,25 +386,25 @@ 53: 6(float) Constant 1077936128 57: 15(int) Constant 3 64: 6(float) Constant 1082130432 - 83: 6(float) Constant 1084227584 - 87: TypePointer Function 6(float) - 100: TypePointer Function 15(int) - 125: 6(float) Constant 1088421888 - 126: 6(float) Constant 1090519040 - 137: TypePointer Output 7(fvec4) -138(@entryPointOutput): 137(ptr) Variable Output + 82: 6(float) Constant 1084227584 + 86: TypePointer Function 6(float) + 99: TypePointer Function 15(int) + 124: 6(float) Constant 1088421888 + 125: 6(float) Constant 1090519040 + 136: TypePointer Output 7(fvec4) +137(@entryPointOutput): 136(ptr) Variable Output 4(main): 2 Function None 3 5: Label - 139: 7(fvec4) FunctionCall 9(@main() - Store 138(@entryPointOutput) 139 + 138: 7(fvec4) FunctionCall 9(@main() + Store 137(@entryPointOutput) 138 Return FunctionEnd 9(@main(): 7(fvec4) Function None 8 10: Label 12(a): 11(ptr) Variable Function - 88(f): 87(ptr) Variable Function - 101(i): 100(ptr) Variable Function - 121(g): 87(ptr) Variable Function + 87(f): 86(ptr) Variable Function + 100(i): 99(ptr) Variable Function + 120(g): 86(ptr) Variable Function Store 12(a) 14 21: 20(ptr) AccessChain 18 19 22: 15(int) Load 21 @@ -457,85 +455,84 @@ 70: 23(bool) INotEqual 69 25 71: 35(ptr) AccessChain 18 34 72: 6(float) Load 71 - 73: 15(int) ConvertFToS 72 - 74: 23(bool) INotEqual 73 25 - 75: 23(bool) LogicalAnd 70 74 - 76: 35(ptr) AccessChain 18 46 - 77: 6(float) Load 76 - 78: 23(bool) FOrdNotEqual 77 38 - 79: 23(bool) LogicalOr 75 78 - SelectionMerge 81 None - BranchConditional 79 80 81 - 80: Label - 82: 7(fvec4) Load 12(a) - 84: 7(fvec4) CompositeConstruct 83 83 83 83 - 85: 7(fvec4) FAdd 82 84 - ReturnValue 85 - 81: Label - 89: 35(ptr) AccessChain 18 34 - 90: 6(float) Load 89 - Store 88(f) 90 - Branch 91 - 91: Label - LoopMerge 93 94 None - Branch 95 - 95: Label - 96: 6(float) Load 88(f) - 97: 23(bool) FOrdNotEqual 96 38 - BranchConditional 97 92 93 - 92: Label - 98: 6(float) Load 88(f) - 99: 6(float) FSub 98 30 - Store 88(f) 99 - Branch 94 - 94: Label - Branch 91 - 93: Label - 102: 20(ptr) AccessChain 18 19 - 103: 15(int) Load 102 - Store 101(i) 103 + 73: 23(bool) FOrdNotEqual 72 38 + 74: 23(bool) LogicalAnd 70 73 + 75: 35(ptr) AccessChain 18 46 + 76: 6(float) Load 75 + 77: 23(bool) FOrdNotEqual 76 38 + 78: 23(bool) LogicalOr 74 77 + SelectionMerge 80 None + BranchConditional 78 79 80 + 79: Label + 81: 7(fvec4) Load 12(a) + 83: 7(fvec4) CompositeConstruct 82 82 82 82 + 84: 7(fvec4) FAdd 81 83 + ReturnValue 84 + 80: Label + 88: 35(ptr) AccessChain 18 34 + 89: 6(float) Load 88 + Store 87(f) 89 + Branch 90 + 90: Label + LoopMerge 92 93 None + Branch 94 + 94: Label + 95: 6(float) Load 87(f) + 96: 23(bool) FOrdNotEqual 95 38 + BranchConditional 96 91 92 + 91: Label + 97: 6(float) Load 87(f) + 98: 6(float) FSub 97 30 + Store 87(f) 98 + Branch 93 + 93: Label + Branch 90 + 92: Label + 101: 20(ptr) AccessChain 18 19 + 102: 15(int) Load 101 + Store 100(i) 102 + Branch 103 + 103: Label + LoopMerge 105 106 None Branch 104 104: Label - LoopMerge 106 107 None - Branch 105 - 105: Label - 108: 15(int) Load 101(i) - 109: 15(int) ISub 108 19 - Store 101(i) 109 - Branch 107 - 107: Label - 110: 15(int) Load 101(i) - 111: 23(bool) INotEqual 110 25 - BranchConditional 111 104 106 + 107: 15(int) Load 100(i) + 108: 15(int) ISub 107 19 + Store 100(i) 108 + Branch 106 106: Label - Branch 112 - 112: Label - LoopMerge 114 115 None - Branch 116 - 116: Label - 117: 15(int) Load 101(i) - 118: 23(bool) INotEqual 117 25 - BranchConditional 118 113 114 - 113: Label - 119: 15(int) Load 101(i) - 120: 15(int) ISub 119 19 - Store 101(i) 120 - Branch 115 - 115: Label - Branch 112 - 114: Label - 122: 35(ptr) AccessChain 18 34 - 123: 6(float) Load 122 - 124: 23(bool) FOrdNotEqual 123 38 - 127: 6(float) Select 124 125 126 - Store 121(g) 127 - 128: 6(float) Load 121(g) - 129: 7(fvec4) Load 12(a) - 130: 7(fvec4) CompositeConstruct 128 128 128 128 - 131: 7(fvec4) FAdd 129 130 - Store 12(a) 131 - 132: 7(fvec4) Load 12(a) - 133: 7(fvec4) CompositeConstruct 30 30 30 30 - 134: 7(fvec4) FSub 132 133 - ReturnValue 134 + 109: 15(int) Load 100(i) + 110: 23(bool) INotEqual 109 25 + BranchConditional 110 103 105 + 105: Label + Branch 111 + 111: Label + LoopMerge 113 114 None + Branch 115 + 115: Label + 116: 15(int) Load 100(i) + 117: 23(bool) INotEqual 116 25 + BranchConditional 117 112 113 + 112: Label + 118: 15(int) Load 100(i) + 119: 15(int) ISub 118 19 + Store 100(i) 119 + Branch 114 + 114: Label + Branch 111 + 113: Label + 121: 35(ptr) AccessChain 18 34 + 122: 6(float) Load 121 + 123: 23(bool) FOrdNotEqual 122 38 + 126: 6(float) Select 123 124 125 + Store 120(g) 126 + 127: 6(float) Load 120(g) + 128: 7(fvec4) Load 12(a) + 129: 7(fvec4) CompositeConstruct 127 127 127 127 + 130: 7(fvec4) FAdd 128 129 + Store 12(a) 130 + 131: 7(fvec4) Load 12(a) + 132: 7(fvec4) CompositeConstruct 30 30 30 30 + 133: 7(fvec4) FSub 131 132 + ReturnValue 133 FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.include.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.include.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.include.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.include.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ ../Test/hlsl.include.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 44 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.inf.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.inf.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.inf.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.inf.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -112,7 +112,7 @@ 0:? '@entryPointOutput' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 37 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.init2.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.init2.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.init2.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.init2.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -358,7 +358,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 112 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.init.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.init.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.init.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.init.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -331,7 +331,7 @@ 0:? 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform float a, layout( row_major std140) uniform float b, layout( row_major std140) uniform float c}) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 110 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.inoutquals.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.inoutquals.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.inoutquals.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.inoutquals.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.inoutquals.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:8 Function Definition: MyFunc(f1;f1;f1;f1; ( temp void) 0:8 Function Parameters: @@ -106,6 +107,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:8 Function Definition: MyFunc(f1;f1;f1;f1; ( temp void) 0:8 Function Parameters: @@ -206,7 +208,7 @@ 0:? 'sampleMask' ( out int SampleMaskIn) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 88 Capability Shader @@ -214,6 +216,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 68 78 82 86 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 13 "MyFunc(f1;f1;f1;f1;" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsic.frexp.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsic.frexp.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsic.frexp.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsic.frexp.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -190,7 +190,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 98 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsic.frexp.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsic.frexp.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsic.frexp.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsic.frexp.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -113,7 +113,7 @@ 0:? Linker Objects // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 78 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.barriers.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.barriers.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.barriers.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.barriers.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -52,7 +52,7 @@ 0:? '@entryPointOutput' (layout( location=0) out float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 22 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -13,7 +13,7 @@ 0:21 all ( temp bool) 0:21 Convert float to bool ( temp bool) 0:21 'inF0' ( in float) -0:24 AtomicAdd ( temp void) +0:24 AtomicAdd ( temp uint) 0:24 'gs_ua' ( shared uint) 0:24 'gs_ub' ( shared uint) 0:25 move second child to first child ( temp uint) @@ -21,7 +21,7 @@ 0:25 AtomicAdd ( temp uint) 0:25 'gs_ua' ( shared uint) 0:25 'gs_ub' ( shared uint) -0:26 AtomicAnd ( temp void) +0:26 AtomicAnd ( temp uint) 0:26 'gs_ua' ( shared uint) 0:26 'gs_ub' ( shared uint) 0:27 move second child to first child ( temp uint) @@ -40,7 +40,7 @@ 0:29 AtomicExchange ( temp uint) 0:29 'gs_ua' ( shared uint) 0:29 'gs_ub' ( shared uint) -0:30 AtomicMax ( temp void) +0:30 AtomicMax ( temp uint) 0:30 'gs_ua' ( shared uint) 0:30 'gs_ub' ( shared uint) 0:31 move second child to first child ( temp uint) @@ -48,7 +48,7 @@ 0:31 AtomicMax ( temp uint) 0:31 'gs_ua' ( shared uint) 0:31 'gs_ub' ( shared uint) -0:32 AtomicMin ( temp void) +0:32 AtomicMin ( temp uint) 0:32 'gs_ua' ( shared uint) 0:32 'gs_ub' ( shared uint) 0:33 move second child to first child ( temp uint) @@ -56,7 +56,7 @@ 0:33 AtomicMin ( temp uint) 0:33 'gs_ua' ( shared uint) 0:33 'gs_ub' ( shared uint) -0:34 AtomicOr ( temp void) +0:34 AtomicOr ( temp uint) 0:34 'gs_ua' ( shared uint) 0:34 'gs_ub' ( shared uint) 0:35 move second child to first child ( temp uint) @@ -64,7 +64,7 @@ 0:35 AtomicOr ( temp uint) 0:35 'gs_ua' ( shared uint) 0:35 'gs_ub' ( shared uint) -0:36 AtomicXor ( temp void) +0:36 AtomicXor ( temp uint) 0:36 'gs_ua' ( shared uint) 0:36 'gs_ub' ( shared uint) 0:37 move second child to first child ( temp uint) @@ -95,7 +95,7 @@ 0:55 all ( temp bool) 0:55 Convert float to bool ( temp 2-component vector of bool) 0:55 'inF0' ( in 2-component vector of float) -0:58 AtomicAdd ( temp void) +0:58 AtomicAdd ( temp 2-component vector of uint) 0:58 'gs_ua2' ( shared 2-component vector of uint) 0:58 'gs_ub2' ( shared 2-component vector of uint) 0:59 move second child to first child ( temp 2-component vector of uint) @@ -103,7 +103,7 @@ 0:59 AtomicAdd ( temp 2-component vector of uint) 0:59 'gs_ua2' ( shared 2-component vector of uint) 0:59 'gs_ub2' ( shared 2-component vector of uint) -0:60 AtomicAnd ( temp void) +0:60 AtomicAnd ( temp 2-component vector of uint) 0:60 'gs_ua2' ( shared 2-component vector of uint) 0:60 'gs_ub2' ( shared 2-component vector of uint) 0:61 move second child to first child ( temp 2-component vector of uint) @@ -122,7 +122,7 @@ 0:63 AtomicExchange ( temp 2-component vector of uint) 0:63 'gs_ua2' ( shared 2-component vector of uint) 0:63 'gs_ub2' ( shared 2-component vector of uint) -0:64 AtomicMax ( temp void) +0:64 AtomicMax ( temp 2-component vector of uint) 0:64 'gs_ua2' ( shared 2-component vector of uint) 0:64 'gs_ub2' ( shared 2-component vector of uint) 0:65 move second child to first child ( temp 2-component vector of uint) @@ -130,7 +130,7 @@ 0:65 AtomicMax ( temp 2-component vector of uint) 0:65 'gs_ua2' ( shared 2-component vector of uint) 0:65 'gs_ub2' ( shared 2-component vector of uint) -0:66 AtomicMin ( temp void) +0:66 AtomicMin ( temp 2-component vector of uint) 0:66 'gs_ua2' ( shared 2-component vector of uint) 0:66 'gs_ub2' ( shared 2-component vector of uint) 0:67 move second child to first child ( temp 2-component vector of uint) @@ -138,7 +138,7 @@ 0:67 AtomicMin ( temp 2-component vector of uint) 0:67 'gs_ua2' ( shared 2-component vector of uint) 0:67 'gs_ub2' ( shared 2-component vector of uint) -0:68 AtomicOr ( temp void) +0:68 AtomicOr ( temp 2-component vector of uint) 0:68 'gs_ua2' ( shared 2-component vector of uint) 0:68 'gs_ub2' ( shared 2-component vector of uint) 0:69 move second child to first child ( temp 2-component vector of uint) @@ -146,7 +146,7 @@ 0:69 AtomicOr ( temp 2-component vector of uint) 0:69 'gs_ua2' ( shared 2-component vector of uint) 0:69 'gs_ub2' ( shared 2-component vector of uint) -0:70 AtomicXor ( temp void) +0:70 AtomicXor ( temp 2-component vector of uint) 0:70 'gs_ua2' ( shared 2-component vector of uint) 0:70 'gs_ub2' ( shared 2-component vector of uint) 0:71 move second child to first child ( temp 2-component vector of uint) @@ -169,7 +169,7 @@ 0:82 all ( temp bool) 0:82 Convert float to bool ( temp 3-component vector of bool) 0:82 'inF0' ( in 3-component vector of float) -0:85 AtomicAdd ( temp void) +0:85 AtomicAdd ( temp 3-component vector of uint) 0:85 'gs_ua3' ( shared 3-component vector of uint) 0:85 'gs_ub3' ( shared 3-component vector of uint) 0:86 move second child to first child ( temp 3-component vector of uint) @@ -177,7 +177,7 @@ 0:86 AtomicAdd ( temp 3-component vector of uint) 0:86 'gs_ua3' ( shared 3-component vector of uint) 0:86 'gs_ub3' ( shared 3-component vector of uint) -0:87 AtomicAnd ( temp void) +0:87 AtomicAnd ( temp 3-component vector of uint) 0:87 'gs_ua3' ( shared 3-component vector of uint) 0:87 'gs_ub3' ( shared 3-component vector of uint) 0:88 move second child to first child ( temp 3-component vector of uint) @@ -196,7 +196,7 @@ 0:90 AtomicExchange ( temp 3-component vector of uint) 0:90 'gs_ua3' ( shared 3-component vector of uint) 0:90 'gs_ub3' ( shared 3-component vector of uint) -0:91 AtomicMax ( temp void) +0:91 AtomicMax ( temp 3-component vector of uint) 0:91 'gs_ua3' ( shared 3-component vector of uint) 0:91 'gs_ub3' ( shared 3-component vector of uint) 0:92 move second child to first child ( temp 3-component vector of uint) @@ -204,7 +204,7 @@ 0:92 AtomicMax ( temp 3-component vector of uint) 0:92 'gs_ua3' ( shared 3-component vector of uint) 0:92 'gs_ub3' ( shared 3-component vector of uint) -0:93 AtomicMin ( temp void) +0:93 AtomicMin ( temp 3-component vector of uint) 0:93 'gs_ua3' ( shared 3-component vector of uint) 0:93 'gs_ub3' ( shared 3-component vector of uint) 0:94 move second child to first child ( temp 3-component vector of uint) @@ -212,7 +212,7 @@ 0:94 AtomicMin ( temp 3-component vector of uint) 0:94 'gs_ua3' ( shared 3-component vector of uint) 0:94 'gs_ub3' ( shared 3-component vector of uint) -0:95 AtomicOr ( temp void) +0:95 AtomicOr ( temp 3-component vector of uint) 0:95 'gs_ua3' ( shared 3-component vector of uint) 0:95 'gs_ub3' ( shared 3-component vector of uint) 0:96 move second child to first child ( temp 3-component vector of uint) @@ -220,7 +220,7 @@ 0:96 AtomicOr ( temp 3-component vector of uint) 0:96 'gs_ua3' ( shared 3-component vector of uint) 0:96 'gs_ub3' ( shared 3-component vector of uint) -0:97 AtomicXor ( temp void) +0:97 AtomicXor ( temp 3-component vector of uint) 0:97 'gs_ua3' ( shared 3-component vector of uint) 0:97 'gs_ub3' ( shared 3-component vector of uint) 0:98 move second child to first child ( temp 3-component vector of uint) @@ -244,7 +244,7 @@ 0:109 all ( temp bool) 0:109 Convert float to bool ( temp 4-component vector of bool) 0:109 'inF0' ( in 4-component vector of float) -0:112 AtomicAdd ( temp void) +0:112 AtomicAdd ( temp 4-component vector of uint) 0:112 'gs_ua4' ( shared 4-component vector of uint) 0:112 'gs_ub4' ( shared 4-component vector of uint) 0:113 move second child to first child ( temp 4-component vector of uint) @@ -252,7 +252,7 @@ 0:113 AtomicAdd ( temp 4-component vector of uint) 0:113 'gs_ua4' ( shared 4-component vector of uint) 0:113 'gs_ub4' ( shared 4-component vector of uint) -0:114 AtomicAnd ( temp void) +0:114 AtomicAnd ( temp 4-component vector of uint) 0:114 'gs_ua4' ( shared 4-component vector of uint) 0:114 'gs_ub4' ( shared 4-component vector of uint) 0:115 move second child to first child ( temp 4-component vector of uint) @@ -271,7 +271,7 @@ 0:117 AtomicExchange ( temp 4-component vector of uint) 0:117 'gs_ua4' ( shared 4-component vector of uint) 0:117 'gs_ub4' ( shared 4-component vector of uint) -0:118 AtomicMax ( temp void) +0:118 AtomicMax ( temp 4-component vector of uint) 0:118 'gs_ua4' ( shared 4-component vector of uint) 0:118 'gs_ub4' ( shared 4-component vector of uint) 0:119 move second child to first child ( temp 4-component vector of uint) @@ -279,7 +279,7 @@ 0:119 AtomicMax ( temp 4-component vector of uint) 0:119 'gs_ua4' ( shared 4-component vector of uint) 0:119 'gs_ub4' ( shared 4-component vector of uint) -0:120 AtomicMin ( temp void) +0:120 AtomicMin ( temp 4-component vector of uint) 0:120 'gs_ua4' ( shared 4-component vector of uint) 0:120 'gs_ub4' ( shared 4-component vector of uint) 0:121 move second child to first child ( temp 4-component vector of uint) @@ -287,7 +287,7 @@ 0:121 AtomicMin ( temp 4-component vector of uint) 0:121 'gs_ua4' ( shared 4-component vector of uint) 0:121 'gs_ub4' ( shared 4-component vector of uint) -0:122 AtomicOr ( temp void) +0:122 AtomicOr ( temp 4-component vector of uint) 0:122 'gs_ua4' ( shared 4-component vector of uint) 0:122 'gs_ub4' ( shared 4-component vector of uint) 0:123 move second child to first child ( temp 4-component vector of uint) @@ -295,7 +295,7 @@ 0:123 AtomicOr ( temp 4-component vector of uint) 0:123 'gs_ua4' ( shared 4-component vector of uint) 0:123 'gs_ub4' ( shared 4-component vector of uint) -0:124 AtomicXor ( temp void) +0:124 AtomicXor ( temp 4-component vector of uint) 0:124 'gs_ua4' ( shared 4-component vector of uint) 0:124 'gs_ub4' ( shared 4-component vector of uint) 0:125 move second child to first child ( temp 4-component vector of uint) @@ -373,7 +373,7 @@ 0:21 all ( temp bool) 0:21 Convert float to bool ( temp bool) 0:21 'inF0' ( in float) -0:24 AtomicAdd ( temp void) +0:24 AtomicAdd ( temp uint) 0:24 'gs_ua' ( shared uint) 0:24 'gs_ub' ( shared uint) 0:25 move second child to first child ( temp uint) @@ -381,7 +381,7 @@ 0:25 AtomicAdd ( temp uint) 0:25 'gs_ua' ( shared uint) 0:25 'gs_ub' ( shared uint) -0:26 AtomicAnd ( temp void) +0:26 AtomicAnd ( temp uint) 0:26 'gs_ua' ( shared uint) 0:26 'gs_ub' ( shared uint) 0:27 move second child to first child ( temp uint) @@ -400,7 +400,7 @@ 0:29 AtomicExchange ( temp uint) 0:29 'gs_ua' ( shared uint) 0:29 'gs_ub' ( shared uint) -0:30 AtomicMax ( temp void) +0:30 AtomicMax ( temp uint) 0:30 'gs_ua' ( shared uint) 0:30 'gs_ub' ( shared uint) 0:31 move second child to first child ( temp uint) @@ -408,7 +408,7 @@ 0:31 AtomicMax ( temp uint) 0:31 'gs_ua' ( shared uint) 0:31 'gs_ub' ( shared uint) -0:32 AtomicMin ( temp void) +0:32 AtomicMin ( temp uint) 0:32 'gs_ua' ( shared uint) 0:32 'gs_ub' ( shared uint) 0:33 move second child to first child ( temp uint) @@ -416,7 +416,7 @@ 0:33 AtomicMin ( temp uint) 0:33 'gs_ua' ( shared uint) 0:33 'gs_ub' ( shared uint) -0:34 AtomicOr ( temp void) +0:34 AtomicOr ( temp uint) 0:34 'gs_ua' ( shared uint) 0:34 'gs_ub' ( shared uint) 0:35 move second child to first child ( temp uint) @@ -424,7 +424,7 @@ 0:35 AtomicOr ( temp uint) 0:35 'gs_ua' ( shared uint) 0:35 'gs_ub' ( shared uint) -0:36 AtomicXor ( temp void) +0:36 AtomicXor ( temp uint) 0:36 'gs_ua' ( shared uint) 0:36 'gs_ub' ( shared uint) 0:37 move second child to first child ( temp uint) @@ -455,7 +455,7 @@ 0:55 all ( temp bool) 0:55 Convert float to bool ( temp 2-component vector of bool) 0:55 'inF0' ( in 2-component vector of float) -0:58 AtomicAdd ( temp void) +0:58 AtomicAdd ( temp 2-component vector of uint) 0:58 'gs_ua2' ( shared 2-component vector of uint) 0:58 'gs_ub2' ( shared 2-component vector of uint) 0:59 move second child to first child ( temp 2-component vector of uint) @@ -463,7 +463,7 @@ 0:59 AtomicAdd ( temp 2-component vector of uint) 0:59 'gs_ua2' ( shared 2-component vector of uint) 0:59 'gs_ub2' ( shared 2-component vector of uint) -0:60 AtomicAnd ( temp void) +0:60 AtomicAnd ( temp 2-component vector of uint) 0:60 'gs_ua2' ( shared 2-component vector of uint) 0:60 'gs_ub2' ( shared 2-component vector of uint) 0:61 move second child to first child ( temp 2-component vector of uint) @@ -482,7 +482,7 @@ 0:63 AtomicExchange ( temp 2-component vector of uint) 0:63 'gs_ua2' ( shared 2-component vector of uint) 0:63 'gs_ub2' ( shared 2-component vector of uint) -0:64 AtomicMax ( temp void) +0:64 AtomicMax ( temp 2-component vector of uint) 0:64 'gs_ua2' ( shared 2-component vector of uint) 0:64 'gs_ub2' ( shared 2-component vector of uint) 0:65 move second child to first child ( temp 2-component vector of uint) @@ -490,7 +490,7 @@ 0:65 AtomicMax ( temp 2-component vector of uint) 0:65 'gs_ua2' ( shared 2-component vector of uint) 0:65 'gs_ub2' ( shared 2-component vector of uint) -0:66 AtomicMin ( temp void) +0:66 AtomicMin ( temp 2-component vector of uint) 0:66 'gs_ua2' ( shared 2-component vector of uint) 0:66 'gs_ub2' ( shared 2-component vector of uint) 0:67 move second child to first child ( temp 2-component vector of uint) @@ -498,7 +498,7 @@ 0:67 AtomicMin ( temp 2-component vector of uint) 0:67 'gs_ua2' ( shared 2-component vector of uint) 0:67 'gs_ub2' ( shared 2-component vector of uint) -0:68 AtomicOr ( temp void) +0:68 AtomicOr ( temp 2-component vector of uint) 0:68 'gs_ua2' ( shared 2-component vector of uint) 0:68 'gs_ub2' ( shared 2-component vector of uint) 0:69 move second child to first child ( temp 2-component vector of uint) @@ -506,7 +506,7 @@ 0:69 AtomicOr ( temp 2-component vector of uint) 0:69 'gs_ua2' ( shared 2-component vector of uint) 0:69 'gs_ub2' ( shared 2-component vector of uint) -0:70 AtomicXor ( temp void) +0:70 AtomicXor ( temp 2-component vector of uint) 0:70 'gs_ua2' ( shared 2-component vector of uint) 0:70 'gs_ub2' ( shared 2-component vector of uint) 0:71 move second child to first child ( temp 2-component vector of uint) @@ -529,7 +529,7 @@ 0:82 all ( temp bool) 0:82 Convert float to bool ( temp 3-component vector of bool) 0:82 'inF0' ( in 3-component vector of float) -0:85 AtomicAdd ( temp void) +0:85 AtomicAdd ( temp 3-component vector of uint) 0:85 'gs_ua3' ( shared 3-component vector of uint) 0:85 'gs_ub3' ( shared 3-component vector of uint) 0:86 move second child to first child ( temp 3-component vector of uint) @@ -537,7 +537,7 @@ 0:86 AtomicAdd ( temp 3-component vector of uint) 0:86 'gs_ua3' ( shared 3-component vector of uint) 0:86 'gs_ub3' ( shared 3-component vector of uint) -0:87 AtomicAnd ( temp void) +0:87 AtomicAnd ( temp 3-component vector of uint) 0:87 'gs_ua3' ( shared 3-component vector of uint) 0:87 'gs_ub3' ( shared 3-component vector of uint) 0:88 move second child to first child ( temp 3-component vector of uint) @@ -556,7 +556,7 @@ 0:90 AtomicExchange ( temp 3-component vector of uint) 0:90 'gs_ua3' ( shared 3-component vector of uint) 0:90 'gs_ub3' ( shared 3-component vector of uint) -0:91 AtomicMax ( temp void) +0:91 AtomicMax ( temp 3-component vector of uint) 0:91 'gs_ua3' ( shared 3-component vector of uint) 0:91 'gs_ub3' ( shared 3-component vector of uint) 0:92 move second child to first child ( temp 3-component vector of uint) @@ -564,7 +564,7 @@ 0:92 AtomicMax ( temp 3-component vector of uint) 0:92 'gs_ua3' ( shared 3-component vector of uint) 0:92 'gs_ub3' ( shared 3-component vector of uint) -0:93 AtomicMin ( temp void) +0:93 AtomicMin ( temp 3-component vector of uint) 0:93 'gs_ua3' ( shared 3-component vector of uint) 0:93 'gs_ub3' ( shared 3-component vector of uint) 0:94 move second child to first child ( temp 3-component vector of uint) @@ -572,7 +572,7 @@ 0:94 AtomicMin ( temp 3-component vector of uint) 0:94 'gs_ua3' ( shared 3-component vector of uint) 0:94 'gs_ub3' ( shared 3-component vector of uint) -0:95 AtomicOr ( temp void) +0:95 AtomicOr ( temp 3-component vector of uint) 0:95 'gs_ua3' ( shared 3-component vector of uint) 0:95 'gs_ub3' ( shared 3-component vector of uint) 0:96 move second child to first child ( temp 3-component vector of uint) @@ -580,7 +580,7 @@ 0:96 AtomicOr ( temp 3-component vector of uint) 0:96 'gs_ua3' ( shared 3-component vector of uint) 0:96 'gs_ub3' ( shared 3-component vector of uint) -0:97 AtomicXor ( temp void) +0:97 AtomicXor ( temp 3-component vector of uint) 0:97 'gs_ua3' ( shared 3-component vector of uint) 0:97 'gs_ub3' ( shared 3-component vector of uint) 0:98 move second child to first child ( temp 3-component vector of uint) @@ -604,7 +604,7 @@ 0:109 all ( temp bool) 0:109 Convert float to bool ( temp 4-component vector of bool) 0:109 'inF0' ( in 4-component vector of float) -0:112 AtomicAdd ( temp void) +0:112 AtomicAdd ( temp 4-component vector of uint) 0:112 'gs_ua4' ( shared 4-component vector of uint) 0:112 'gs_ub4' ( shared 4-component vector of uint) 0:113 move second child to first child ( temp 4-component vector of uint) @@ -612,7 +612,7 @@ 0:113 AtomicAdd ( temp 4-component vector of uint) 0:113 'gs_ua4' ( shared 4-component vector of uint) 0:113 'gs_ub4' ( shared 4-component vector of uint) -0:114 AtomicAnd ( temp void) +0:114 AtomicAnd ( temp 4-component vector of uint) 0:114 'gs_ua4' ( shared 4-component vector of uint) 0:114 'gs_ub4' ( shared 4-component vector of uint) 0:115 move second child to first child ( temp 4-component vector of uint) @@ -631,7 +631,7 @@ 0:117 AtomicExchange ( temp 4-component vector of uint) 0:117 'gs_ua4' ( shared 4-component vector of uint) 0:117 'gs_ub4' ( shared 4-component vector of uint) -0:118 AtomicMax ( temp void) +0:118 AtomicMax ( temp 4-component vector of uint) 0:118 'gs_ua4' ( shared 4-component vector of uint) 0:118 'gs_ub4' ( shared 4-component vector of uint) 0:119 move second child to first child ( temp 4-component vector of uint) @@ -639,7 +639,7 @@ 0:119 AtomicMax ( temp 4-component vector of uint) 0:119 'gs_ua4' ( shared 4-component vector of uint) 0:119 'gs_ub4' ( shared 4-component vector of uint) -0:120 AtomicMin ( temp void) +0:120 AtomicMin ( temp 4-component vector of uint) 0:120 'gs_ua4' ( shared 4-component vector of uint) 0:120 'gs_ub4' ( shared 4-component vector of uint) 0:121 move second child to first child ( temp 4-component vector of uint) @@ -647,7 +647,7 @@ 0:121 AtomicMin ( temp 4-component vector of uint) 0:121 'gs_ua4' ( shared 4-component vector of uint) 0:121 'gs_ub4' ( shared 4-component vector of uint) -0:122 AtomicOr ( temp void) +0:122 AtomicOr ( temp 4-component vector of uint) 0:122 'gs_ua4' ( shared 4-component vector of uint) 0:122 'gs_ub4' ( shared 4-component vector of uint) 0:123 move second child to first child ( temp 4-component vector of uint) @@ -655,7 +655,7 @@ 0:123 AtomicOr ( temp 4-component vector of uint) 0:123 'gs_ua4' ( shared 4-component vector of uint) 0:123 'gs_ub4' ( shared 4-component vector of uint) -0:124 AtomicXor ( temp void) +0:124 AtomicXor ( temp 4-component vector of uint) 0:124 'gs_ua4' ( shared 4-component vector of uint) 0:124 'gs_ub4' ( shared 4-component vector of uint) 0:125 move second child to first child ( temp 4-component vector of uint) @@ -716,7 +716,7 @@ 0:? 'inU1' (layout( location=4) in 4-component vector of uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 265 Capability Shader @@ -905,12 +905,12 @@ 63: 61(bool) FOrdNotEqual 60 62 64: 61(bool) All 63 68: 8(int) Load 67(gs_ub) - 71: 2 AtomicIAdd 66(gs_ua) 69 70 68 + 71: 8(int) AtomicIAdd 66(gs_ua) 69 70 68 73: 8(int) Load 67(gs_ub) 74: 8(int) AtomicIAdd 66(gs_ua) 69 70 73 Store 72(out_u1) 74 75: 8(int) Load 67(gs_ub) - 76: 2 AtomicAnd 66(gs_ua) 69 70 75 + 76: 8(int) AtomicAnd 66(gs_ua) 69 70 75 77: 8(int) Load 67(gs_ub) 78: 8(int) AtomicAnd 66(gs_ua) 69 70 77 Store 72(out_u1) 78 @@ -922,22 +922,22 @@ 84: 8(int) AtomicExchange 66(gs_ua) 69 70 83 Store 72(out_u1) 84 85: 8(int) Load 67(gs_ub) - 86: 2 AtomicSMax 66(gs_ua) 69 70 85 + 86: 8(int) AtomicUMax 66(gs_ua) 69 70 85 87: 8(int) Load 67(gs_ub) 88: 8(int) AtomicUMax 66(gs_ua) 69 70 87 Store 72(out_u1) 88 89: 8(int) Load 67(gs_ub) - 90: 2 AtomicSMin 66(gs_ua) 69 70 89 + 90: 8(int) AtomicUMin 66(gs_ua) 69 70 89 91: 8(int) Load 67(gs_ub) 92: 8(int) AtomicUMin 66(gs_ua) 69 70 91 Store 72(out_u1) 92 93: 8(int) Load 67(gs_ub) - 94: 2 AtomicOr 66(gs_ua) 69 70 93 + 94: 8(int) AtomicOr 66(gs_ua) 69 70 93 95: 8(int) Load 67(gs_ub) 96: 8(int) AtomicOr 66(gs_ua) 69 70 95 Store 72(out_u1) 96 97: 8(int) Load 67(gs_ub) - 98: 2 AtomicXor 66(gs_ua) 69 70 97 + 98: 8(int) AtomicXor 66(gs_ua) 69 70 97 99: 8(int) Load 67(gs_ub) 100: 8(int) AtomicXor 66(gs_ua) 69 70 99 Store 72(out_u1) 100 @@ -962,12 +962,12 @@ 108: 106(bvec2) FOrdNotEqual 105 107 109: 61(bool) All 108 113: 26(ivec2) Load 112(gs_ub2) - 114: 2 AtomicIAdd 111(gs_ua2) 69 70 113 + 114: 26(ivec2) AtomicIAdd 111(gs_ua2) 69 70 113 116: 26(ivec2) Load 112(gs_ub2) 117: 26(ivec2) AtomicIAdd 111(gs_ua2) 69 70 116 Store 115(out_u2) 117 118: 26(ivec2) Load 112(gs_ub2) - 119: 2 AtomicAnd 111(gs_ua2) 69 70 118 + 119: 26(ivec2) AtomicAnd 111(gs_ua2) 69 70 118 120: 26(ivec2) Load 112(gs_ub2) 121: 26(ivec2) AtomicAnd 111(gs_ua2) 69 70 120 Store 115(out_u2) 121 @@ -979,22 +979,22 @@ 127: 26(ivec2) AtomicExchange 111(gs_ua2) 69 70 126 Store 115(out_u2) 127 128: 26(ivec2) Load 112(gs_ub2) - 129: 2 AtomicSMax 111(gs_ua2) 69 70 128 + 129: 26(ivec2) AtomicUMax 111(gs_ua2) 69 70 128 130: 26(ivec2) Load 112(gs_ub2) 131: 26(ivec2) AtomicUMax 111(gs_ua2) 69 70 130 Store 115(out_u2) 131 132: 26(ivec2) Load 112(gs_ub2) - 133: 2 AtomicSMin 111(gs_ua2) 69 70 132 + 133: 26(ivec2) AtomicUMin 111(gs_ua2) 69 70 132 134: 26(ivec2) Load 112(gs_ub2) 135: 26(ivec2) AtomicUMin 111(gs_ua2) 69 70 134 Store 115(out_u2) 135 136: 26(ivec2) Load 112(gs_ub2) - 137: 2 AtomicOr 111(gs_ua2) 69 70 136 + 137: 26(ivec2) AtomicOr 111(gs_ua2) 69 70 136 138: 26(ivec2) Load 112(gs_ub2) 139: 26(ivec2) AtomicOr 111(gs_ua2) 69 70 138 Store 115(out_u2) 139 140: 26(ivec2) Load 112(gs_ub2) - 141: 2 AtomicXor 111(gs_ua2) 69 70 140 + 141: 26(ivec2) AtomicXor 111(gs_ua2) 69 70 140 142: 26(ivec2) Load 112(gs_ub2) 143: 26(ivec2) AtomicXor 111(gs_ua2) 69 70 142 Store 115(out_u2) 143 @@ -1012,12 +1012,12 @@ 152: 150(bvec3) FOrdNotEqual 149 151 153: 61(bool) All 152 157: 38(ivec3) Load 156(gs_ub3) - 158: 2 AtomicIAdd 155(gs_ua3) 69 70 157 + 158: 38(ivec3) AtomicIAdd 155(gs_ua3) 69 70 157 160: 38(ivec3) Load 156(gs_ub3) 161: 38(ivec3) AtomicIAdd 155(gs_ua3) 69 70 160 Store 159(out_u3) 161 162: 38(ivec3) Load 156(gs_ub3) - 163: 2 AtomicAnd 155(gs_ua3) 69 70 162 + 163: 38(ivec3) AtomicAnd 155(gs_ua3) 69 70 162 164: 38(ivec3) Load 156(gs_ub3) 165: 38(ivec3) AtomicAnd 155(gs_ua3) 69 70 164 Store 159(out_u3) 165 @@ -1029,22 +1029,22 @@ 171: 38(ivec3) AtomicExchange 155(gs_ua3) 69 70 170 Store 159(out_u3) 171 172: 38(ivec3) Load 156(gs_ub3) - 173: 2 AtomicSMax 155(gs_ua3) 69 70 172 + 173: 38(ivec3) AtomicUMax 155(gs_ua3) 69 70 172 174: 38(ivec3) Load 156(gs_ub3) 175: 38(ivec3) AtomicUMax 155(gs_ua3) 69 70 174 Store 159(out_u3) 175 176: 38(ivec3) Load 156(gs_ub3) - 177: 2 AtomicSMin 155(gs_ua3) 69 70 176 + 177: 38(ivec3) AtomicUMin 155(gs_ua3) 69 70 176 178: 38(ivec3) Load 156(gs_ub3) 179: 38(ivec3) AtomicUMin 155(gs_ua3) 69 70 178 Store 159(out_u3) 179 180: 38(ivec3) Load 156(gs_ub3) - 181: 2 AtomicOr 155(gs_ua3) 69 70 180 + 181: 38(ivec3) AtomicOr 155(gs_ua3) 69 70 180 182: 38(ivec3) Load 156(gs_ub3) 183: 38(ivec3) AtomicOr 155(gs_ua3) 69 70 182 Store 159(out_u3) 183 184: 38(ivec3) Load 156(gs_ub3) - 185: 2 AtomicXor 155(gs_ua3) 69 70 184 + 185: 38(ivec3) AtomicXor 155(gs_ua3) 69 70 184 186: 38(ivec3) Load 156(gs_ub3) 187: 38(ivec3) AtomicXor 155(gs_ua3) 69 70 186 Store 159(out_u3) 187 @@ -1062,12 +1062,12 @@ 195: 193(bvec4) FOrdNotEqual 192 194 196: 61(bool) All 195 200: 50(ivec4) Load 199(gs_ub4) - 201: 2 AtomicIAdd 198(gs_ua4) 69 70 200 + 201: 50(ivec4) AtomicIAdd 198(gs_ua4) 69 70 200 203: 50(ivec4) Load 199(gs_ub4) 204: 50(ivec4) AtomicIAdd 198(gs_ua4) 69 70 203 Store 202(out_u4) 204 205: 50(ivec4) Load 199(gs_ub4) - 206: 2 AtomicAnd 198(gs_ua4) 69 70 205 + 206: 50(ivec4) AtomicAnd 198(gs_ua4) 69 70 205 207: 50(ivec4) Load 199(gs_ub4) 208: 50(ivec4) AtomicAnd 198(gs_ua4) 69 70 207 Store 202(out_u4) 208 @@ -1079,22 +1079,22 @@ 214: 50(ivec4) AtomicExchange 198(gs_ua4) 69 70 213 Store 202(out_u4) 214 215: 50(ivec4) Load 199(gs_ub4) - 216: 2 AtomicSMax 198(gs_ua4) 69 70 215 + 216: 50(ivec4) AtomicUMax 198(gs_ua4) 69 70 215 217: 50(ivec4) Load 199(gs_ub4) 218: 50(ivec4) AtomicUMax 198(gs_ua4) 69 70 217 Store 202(out_u4) 218 219: 50(ivec4) Load 199(gs_ub4) - 220: 2 AtomicSMin 198(gs_ua4) 69 70 219 + 220: 50(ivec4) AtomicUMin 198(gs_ua4) 69 70 219 221: 50(ivec4) Load 199(gs_ub4) 222: 50(ivec4) AtomicUMin 198(gs_ua4) 69 70 221 Store 202(out_u4) 222 223: 50(ivec4) Load 199(gs_ub4) - 224: 2 AtomicOr 198(gs_ua4) 69 70 223 + 224: 50(ivec4) AtomicOr 198(gs_ua4) 69 70 223 225: 50(ivec4) Load 199(gs_ub4) 226: 50(ivec4) AtomicOr 198(gs_ua4) 69 70 225 Store 202(out_u4) 226 227: 50(ivec4) Load 199(gs_ub4) - 228: 2 AtomicXor 198(gs_ua4) 69 70 227 + 228: 50(ivec4) AtomicXor 198(gs_ua4) 69 70 227 229: 50(ivec4) Load 199(gs_ub4) 230: 50(ivec4) AtomicXor 198(gs_ua4) 69 70 229 Store 202(out_u4) 230 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.d3dcolortoubyte4.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -74,7 +74,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 29 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.double.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.double.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.double.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.double.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -164,7 +164,7 @@ 0:? 'inU1b' (layout( location=9) flat in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 90 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.evalfns.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.evalfns.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.evalfns.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.evalfns.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -154,7 +154,7 @@ 0:? 'inI2' (layout( location=4) flat in 2-component vector of int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 80 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.f1632.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.f1632.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.f1632.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.f1632.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -260,7 +260,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 103 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.f3216.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.f3216.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.f3216.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.f3216.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -270,7 +270,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 106 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -5632,7 +5632,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 1832 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.lit.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.lit.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.lit.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.lit.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -18,7 +18,7 @@ 0:3 'n_dot_l' ( in float) 0:3 Constant: 0:3 0.000000 -0:3 Test condition and select ( temp float) +0:3 Test condition and select ( temp float): no shortcircuit 0:3 Condition 0:3 Compare Less Than ( temp bool) 0:3 min ( temp float) @@ -79,7 +79,7 @@ 0:3 'n_dot_l' ( in float) 0:3 Constant: 0:3 0.000000 -0:3 Test condition and select ( temp float) +0:3 Test condition and select ( temp float): no shortcircuit 0:3 Condition 0:3 Compare Less Than ( temp bool) 0:3 min ( temp float) @@ -118,13 +118,13 @@ 0:? 'm' (layout( location=2) in float) // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 52 +// Generated by (magic number): 80006 +// Id's are bound by 48 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "PixelShaderFunction" 37 40 43 + EntryPoint Fragment 4 "PixelShaderFunction" 33 36 39 ExecutionMode 4 OriginUpperLeft Source HLSL 500 Name 4 "PixelShaderFunction" @@ -133,18 +133,18 @@ Name 10 "n_dot_h" Name 11 "m" Name 16 "r0" - Name 35 "n_dot_l" - Name 37 "n_dot_l" - Name 39 "n_dot_h" - Name 40 "n_dot_h" - Name 42 "m" - Name 43 "m" + Name 31 "n_dot_l" + Name 33 "n_dot_l" + Name 35 "n_dot_h" + Name 36 "n_dot_h" + Name 38 "m" + Name 39 "m" + Name 41 "param" + Name 43 "param" Name 45 "param" - Name 47 "param" - Name 49 "param" - Decorate 37(n_dot_l) Location 0 - Decorate 40(n_dot_h) Location 1 - Decorate 43(m) Location 2 + Decorate 33(n_dot_l) Location 0 + Decorate 36(n_dot_h) Location 1 + Decorate 39(m) Location 2 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -154,32 +154,32 @@ 15: TypePointer Function 14(fvec4) 17: 6(float) Constant 1065353216 19: 6(float) Constant 0 - 25: TypeBool - 36: TypePointer Input 6(float) - 37(n_dot_l): 36(ptr) Variable Input - 40(n_dot_h): 36(ptr) Variable Input - 43(m): 36(ptr) Variable Input + 24: TypeBool + 32: TypePointer Input 6(float) + 33(n_dot_l): 32(ptr) Variable Input + 36(n_dot_h): 32(ptr) Variable Input + 39(m): 32(ptr) Variable Input 4(PixelShaderFunction): 2 Function None 3 5: Label - 35(n_dot_l): 7(ptr) Variable Function - 39(n_dot_h): 7(ptr) Variable Function - 42(m): 7(ptr) Variable Function + 31(n_dot_l): 7(ptr) Variable Function + 35(n_dot_h): 7(ptr) Variable Function + 38(m): 7(ptr) Variable Function + 41(param): 7(ptr) Variable Function + 43(param): 7(ptr) Variable Function 45(param): 7(ptr) Variable Function - 47(param): 7(ptr) Variable Function - 49(param): 7(ptr) Variable Function - 38: 6(float) Load 37(n_dot_l) - Store 35(n_dot_l) 38 - 41: 6(float) Load 40(n_dot_h) - Store 39(n_dot_h) 41 - 44: 6(float) Load 43(m) - Store 42(m) 44 - 46: 6(float) Load 35(n_dot_l) + 34: 6(float) Load 33(n_dot_l) + Store 31(n_dot_l) 34 + 37: 6(float) Load 36(n_dot_h) + Store 35(n_dot_h) 37 + 40: 6(float) Load 39(m) + Store 38(m) 40 + 42: 6(float) Load 31(n_dot_l) + Store 41(param) 42 + 44: 6(float) Load 35(n_dot_h) + Store 43(param) 44 + 46: 6(float) Load 38(m) Store 45(param) 46 - 48: 6(float) Load 39(n_dot_h) - Store 47(param) 48 - 50: 6(float) Load 42(m) - Store 49(param) 50 - 51: 2 FunctionCall 12(@PixelShaderFunction(f1;f1;f1;) 45(param) 47(param) 49(param) + 47: 2 FunctionCall 12(@PixelShaderFunction(f1;f1;f1;) 41(param) 43(param) 45(param) Return FunctionEnd 12(@PixelShaderFunction(f1;f1;f1;): 2 Function None 8 @@ -188,27 +188,17 @@ 11(m): 7(ptr) FunctionParameter 13: Label 16(r0): 15(ptr) Variable Function - 21: 7(ptr) Variable Function 18: 6(float) Load 9(n_dot_l) 20: 6(float) ExtInst 1(GLSL.std.450) 40(FMax) 18 19 - 22: 6(float) Load 9(n_dot_l) - 23: 6(float) Load 10(n_dot_h) - 24: 6(float) ExtInst 1(GLSL.std.450) 37(FMin) 22 23 - 26: 25(bool) FOrdLessThan 24 19 - SelectionMerge 28 None - BranchConditional 26 27 29 - 27: Label - Store 21 19 - Branch 28 - 29: Label - 30: 6(float) Load 10(n_dot_h) - 31: 6(float) Load 11(m) - 32: 6(float) FMul 30 31 - Store 21 32 - Branch 28 - 28: Label - 33: 6(float) Load 21 - 34: 14(fvec4) CompositeConstruct 17 20 33 17 - Store 16(r0) 34 + 21: 6(float) Load 9(n_dot_l) + 22: 6(float) Load 10(n_dot_h) + 23: 6(float) ExtInst 1(GLSL.std.450) 37(FMin) 21 22 + 25: 24(bool) FOrdLessThan 23 19 + 26: 6(float) Load 10(n_dot_h) + 27: 6(float) Load 11(m) + 28: 6(float) FMul 26 27 + 29: 6(float) Select 25 19 28 + 30: 14(fvec4) CompositeConstruct 17 20 29 17 + Store 16(r0) 30 Return FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.negative.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.negative.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.negative.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.negative.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -180,7 +180,7 @@ 0:? 'inI0' (layout( location=3) in 4-component vector of int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 99 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.negative.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.negative.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.negative.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.negative.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -308,7 +308,7 @@ 0:? 'inI0' (layout( location=3) in 4-component vector of int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 155 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.promote.down.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.promote.down.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.promote.down.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.promote.down.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -104,7 +104,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 50 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.promote.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.promote.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.promote.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.promote.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -888,7 +888,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 322 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -204,7 +204,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 80 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.intrinsics.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.intrinsics.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -2779,7 +2779,7 @@ 0:? Linker Objects // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 1225 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.isfinite.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.isfinite.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.isfinite.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.isfinite.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -172,7 +172,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 85 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.layout.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.layout.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.layout.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.layout.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -87,7 +87,7 @@ 0:? 'anon@2' (layout( set=4 binding=7 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v1PostLayout}) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 44 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.layoutOverride.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.layoutOverride.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.layoutOverride.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.layoutOverride.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -52,7 +52,7 @@ 0:? '@entryPointOutput' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 32 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.2dms.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.2dms.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.2dms.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.2dms.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.load.2dms.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -181,6 +182,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -356,7 +358,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 130 Capability Shader @@ -365,6 +367,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 120 124 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.array.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.array.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.array.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.array.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.load.array.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:48 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:48 Function Parameters: @@ -196,6 +197,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:48 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:48 Function Parameters: @@ -386,7 +388,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 159 Capability Shader @@ -396,6 +398,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 104 108 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.basic.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.basic.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.basic.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.basic.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.load.basic.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:48 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:48 Function Parameters: @@ -247,6 +248,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:48 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:48 Function Parameters: @@ -488,7 +490,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 179 Capability Shader @@ -498,6 +500,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 133 137 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.basic.dx10.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.basic.dx10.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.basic.dx10.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.basic.dx10.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -452,7 +452,7 @@ 0:? '@entryPointOutput.Pos' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 171 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.buffer.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.buffer.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.buffer.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.buffer.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.load.buffer.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -85,6 +86,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -164,7 +166,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 72 Capability Shader @@ -173,6 +175,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 64 68 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.buffer.float.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.buffer.float.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.buffer.float.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.buffer.float.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.load.buffer.float.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -88,6 +89,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -170,7 +172,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 75 Capability Shader @@ -179,6 +181,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 67 71 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.offsetarray.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.load.offsetarray.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:48 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:48 Function Parameters: @@ -220,6 +221,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:48 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:48 Function Parameters: @@ -434,7 +436,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 174 Capability Shader @@ -445,6 +447,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 119 123 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.offset.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.offset.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.offset.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.offset.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.load.offset.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:48 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:48 Function Parameters: @@ -283,6 +284,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:48 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:48 Function Parameters: @@ -560,7 +562,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 201 Capability Shader @@ -571,6 +573,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 155 159 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.rwbuffer.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.rwbuffer.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.rwbuffer.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.rwbuffer.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -110,7 +110,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 57 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.rwtexture.array.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.rwtexture.array.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.rwtexture.array.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.rwtexture.array.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.load.rwtexture.array.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:40 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:40 Function Parameters: @@ -106,6 +107,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:40 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:40 Function Parameters: @@ -206,7 +208,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 119 Capability Shader @@ -215,6 +217,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 82 86 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.rwtexture.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.rwtexture.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.load.rwtexture.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.load.rwtexture.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.load.rwtexture.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:40 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:40 Function Parameters: @@ -124,6 +125,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:40 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:40 Function Parameters: @@ -242,7 +244,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 132 Capability Shader @@ -251,6 +253,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 104 108 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.localStructuredBuffer.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.localStructuredBuffer.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.localStructuredBuffer.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.localStructuredBuffer.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -13,7 +13,7 @@ 0:? Sequence 0:2 Function Call: @main( ( temp void) 0:? Linker Objects -0:? 'srt0' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 'srt0' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) Linked compute stage: @@ -29,6 +29,6 @@ 0:? Sequence 0:2 Function Call: @main( ( temp void) 0:? Linker Objects -0:? 'srt0' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 'srt0' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) SPIR-V is not generated for failed compile or link diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.logical.binary.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.logical.binary.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.logical.binary.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.logical.binary.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -13,12 +13,11 @@ 0:13 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) 0:13 Constant: 0:13 0 (const uint) -0:13 Convert int to bool ( temp bool) -0:13 Convert float to int ( temp int) -0:13 fval: direct index for structure ( uniform float) -0:13 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) -0:13 Constant: -0:13 2 (const uint) +0:13 Convert float to bool ( temp bool) +0:13 fval: direct index for structure ( uniform float) +0:13 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) +0:13 Constant: +0:13 2 (const uint) 0:13 true case is null 0:14 Test condition and select ( temp void) 0:14 Condition @@ -28,12 +27,11 @@ 0:14 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) 0:14 Constant: 0:14 0 (const uint) -0:14 Convert int to bool ( temp bool) -0:14 Convert float to int ( temp int) -0:14 fval: direct index for structure ( uniform float) -0:14 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) -0:14 Constant: -0:14 2 (const uint) +0:14 Convert float to bool ( temp bool) +0:14 fval: direct index for structure ( uniform float) +0:14 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) +0:14 Constant: +0:14 2 (const uint) 0:14 true case is null 0:17 move second child to first child ( temp 4-component vector of float) 0:17 Color: direct index for structure ( temp 4-component vector of float) @@ -79,12 +77,11 @@ 0:13 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) 0:13 Constant: 0:13 0 (const uint) -0:13 Convert int to bool ( temp bool) -0:13 Convert float to int ( temp int) -0:13 fval: direct index for structure ( uniform float) -0:13 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) -0:13 Constant: -0:13 2 (const uint) +0:13 Convert float to bool ( temp bool) +0:13 fval: direct index for structure ( uniform float) +0:13 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) +0:13 Constant: +0:13 2 (const uint) 0:13 true case is null 0:14 Test condition and select ( temp void) 0:14 Condition @@ -94,12 +91,11 @@ 0:14 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) 0:14 Constant: 0:14 0 (const uint) -0:14 Convert int to bool ( temp bool) -0:14 Convert float to int ( temp int) -0:14 fval: direct index for structure ( uniform float) -0:14 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) -0:14 Constant: -0:14 2 (const uint) +0:14 Convert float to bool ( temp bool) +0:14 fval: direct index for structure ( uniform float) +0:14 'anon@0' (layout( row_major std140) uniform block{ uniform int ival, uniform 4-component vector of int ival4, uniform float fval, uniform 4-component vector of float fval4}) +0:14 Constant: +0:14 2 (const uint) 0:14 true case is null 0:17 move second child to first child ( temp 4-component vector of float) 0:17 Color: direct index for structure ( temp 4-component vector of float) @@ -128,13 +124,13 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 57 +// Generated by (magic number): 80006 +// Id's are bound by 56 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 54 + EntryPoint Fragment 4 "main" 53 ExecutionMode 4 OriginUpperLeft Source HLSL 500 Name 4 "main" @@ -147,15 +143,15 @@ MemberName 14($Global) 2 "fval" MemberName 14($Global) 3 "fval4" Name 16 "" - Name 45 "psout" - Name 54 "@entryPointOutput.Color" + Name 44 "psout" + Name 53 "@entryPointOutput.Color" MemberDecorate 14($Global) 0 Offset 0 MemberDecorate 14($Global) 1 Offset 16 MemberDecorate 14($Global) 2 Offset 32 MemberDecorate 14($Global) 3 Offset 48 Decorate 14($Global) Block Decorate 16 DescriptorSet 0 - Decorate 54(@entryPointOutput.Color) Location 0 + Decorate 53(@entryPointOutput.Color) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -174,29 +170,29 @@ 23: 22(int) Constant 0 25: 12(int) Constant 2 26: TypePointer Uniform 6(float) - 44: TypePointer Function 8(PS_OUTPUT) - 46: 6(float) Constant 1065353216 - 47: 7(fvec4) ConstantComposite 46 46 46 46 - 48: TypePointer Function 7(fvec4) - 53: TypePointer Output 7(fvec4) -54(@entryPointOutput.Color): 53(ptr) Variable Output + 29: 6(float) Constant 0 + 43: TypePointer Function 8(PS_OUTPUT) + 45: 6(float) Constant 1065353216 + 46: 7(fvec4) ConstantComposite 45 45 45 45 + 47: TypePointer Function 7(fvec4) + 52: TypePointer Output 7(fvec4) +53(@entryPointOutput.Color): 52(ptr) Variable Output 4(main): 2 Function None 3 5: Label - 55:8(PS_OUTPUT) FunctionCall 10(@main() - 56: 7(fvec4) CompositeExtract 55 0 - Store 54(@entryPointOutput.Color) 56 + 54:8(PS_OUTPUT) FunctionCall 10(@main() + 55: 7(fvec4) CompositeExtract 54 0 + Store 53(@entryPointOutput.Color) 55 Return FunctionEnd 10(@main():8(PS_OUTPUT) Function None 9 11: Label - 45(psout): 44(ptr) Variable Function + 44(psout): 43(ptr) Variable Function 19: 18(ptr) AccessChain 16 17 20: 12(int) Load 19 24: 21(bool) INotEqual 20 23 27: 26(ptr) AccessChain 16 25 28: 6(float) Load 27 - 29: 12(int) ConvertFToS 28 - 30: 21(bool) INotEqual 29 23 + 30: 21(bool) FOrdNotEqual 28 29 31: 21(bool) LogicalAnd 24 30 SelectionMerge 33 None BranchConditional 31 32 33 @@ -208,16 +204,15 @@ 36: 21(bool) INotEqual 35 23 37: 26(ptr) AccessChain 16 25 38: 6(float) Load 37 - 39: 12(int) ConvertFToS 38 - 40: 21(bool) INotEqual 39 23 - 41: 21(bool) LogicalOr 36 40 - SelectionMerge 43 None - BranchConditional 41 42 43 - 42: Label - Branch 43 - 43: Label - 49: 48(ptr) AccessChain 45(psout) 17 - Store 49 47 - 50:8(PS_OUTPUT) Load 45(psout) - ReturnValue 50 + 39: 21(bool) FOrdNotEqual 38 29 + 40: 21(bool) LogicalOr 36 39 + SelectionMerge 42 None + BranchConditional 40 41 42 + 41: Label + Branch 42 + 42: Label + 48: 47(ptr) AccessChain 44(psout) 17 + Store 48 46 + 49:8(PS_OUTPUT) Load 44(psout) + ReturnValue 49 FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.logical.binary.vec.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.logical.binary.vec.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.logical.binary.vec.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.logical.binary.vec.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -254,7 +254,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 115 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.logicalConvert.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.logicalConvert.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.logicalConvert.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.logicalConvert.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -254,7 +254,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 50 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.logical.unary.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.logical.unary.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.logical.unary.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.logical.unary.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -184,7 +184,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 84 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.loopattr.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.loopattr.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.loopattr.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.loopattr.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -136,7 +136,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 54 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matNx1.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matNx1.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matNx1.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matNx1.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -152,7 +152,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 77 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matpack-1.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matpack-1.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matpack-1.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matpack-1.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -100,7 +100,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 39 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matpack-pragma.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matpack-pragma.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matpack-pragma.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matpack-pragma.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -170,7 +170,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 44 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matrixindex.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matrixindex.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matrixindex.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matrixindex.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -272,7 +272,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 83 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matrixSwizzle.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matrixSwizzle.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matrixSwizzle.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matrixSwizzle.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -677,7 +677,7 @@ Missing functionality: matrix swizzle // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 118 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matType.bool.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matType.bool.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matType.bool.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matType.bool.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -232,7 +232,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 130 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matType.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matType.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matType.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matType.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -31,7 +31,7 @@ 0:? 'anon@0' (layout( row_major std140) uniform block{ uniform 1-component vector of float f1, uniform 1X1 matrix of float fmat11, uniform 4X1 matrix of float fmat41, uniform 1X2 matrix of float fmat12, uniform 2X3 matrix of double dmat23, uniform 4X4 matrix of int int44}) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 30 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matType.int.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matType.int.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.matType.int.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.matType.int.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -398,7 +398,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 232 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.max.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.max.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.max.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.max.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -66,7 +66,7 @@ 0:? 'input2' (layout( location=1) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 33 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.memberFunCall.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.memberFunCall.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.memberFunCall.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.memberFunCall.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -152,7 +152,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 73 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.mintypes.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.mintypes.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.mintypes.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.mintypes.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -98,7 +98,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 70 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.mip.operator.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.mip.operator.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.mip.operator.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.mip.operator.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -128,7 +128,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 61 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.multiDescriptorSet.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.multiDescriptorSet.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.multiDescriptorSet.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.multiDescriptorSet.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ hlsl.multiDescriptorSet.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 92 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.multiEntry.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.multiEntry.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.multiEntry.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.multiEntry.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -70,7 +70,7 @@ 0:? 'Index' ( in uint VertexIndex) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 41 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.multiReturn.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.multiReturn.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.multiReturn.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.multiReturn.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -48,7 +48,7 @@ 0:? 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{ temp float f, temp 3-component vector of float v, temp 3X3 matrix of float m} s}) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 42 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.mul-truncate.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.mul-truncate.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.mul-truncate.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.mul-truncate.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -383,7 +383,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 231 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.namespace.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.namespace.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.namespace.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.namespace.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -102,7 +102,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 54 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.nonint-index.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.nonint-index.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.nonint-index.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.nonint-index.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -88,7 +88,7 @@ 0:? 'input' (layout( location=0) in float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 39 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.nonstaticMemberFunction.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.nonstaticMemberFunction.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.nonstaticMemberFunction.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.nonstaticMemberFunction.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -268,7 +268,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 111 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.noSemantic.functionality1.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.noSemantic.functionality1.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.noSemantic.functionality1.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.noSemantic.functionality1.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,62 @@ +hlsl.noSemantic.functionality1.comp +// Module Version 10000 +// Generated by (magic number): 80006 +// Id's are bound by 30 + + Capability Shader + Extension "SPV_GOOGLE_hlsl_functionality1" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" + ExecutionMode 4 LocalSize 1 1 1 + Source HLSL 500 + Name 4 "main" + Name 6 "@main(" + Name 11 "Buf" + MemberName 11(Buf) 0 "@data" + Name 13 "Buf" + Name 17 "Buf@count" + MemberName 17(Buf@count) 0 "@count" + Name 19 "Buf@count" + Decorate 10 ArrayStride 16 + MemberDecorate 11(Buf) 0 Offset 0 + Decorate 11(Buf) BufferBlock + Decorate 13(Buf) DescriptorSet 0 + Decorate 13(Buf) Binding 0 + MemberDecorate 17(Buf@count) 0 Offset 0 + Decorate 17(Buf@count) BufferBlock + Decorate 19(Buf@count) DescriptorSet 0 + DecorateId 13(Buf) DecorationHlslCounterBufferGOOGLE 19(Buf@count) + 2: TypeVoid + 3: TypeFunction 2 + 8: TypeFloat 32 + 9: TypeVector 8(float) 4 + 10: TypeRuntimeArray 9(fvec4) + 11(Buf): TypeStruct 10 + 12: TypePointer Uniform 11(Buf) + 13(Buf): 12(ptr) Variable Uniform + 14: TypeInt 32 1 + 15: 14(int) Constant 0 + 16: TypeInt 32 0 + 17(Buf@count): TypeStruct 16(int) + 18: TypePointer Uniform 17(Buf@count) + 19(Buf@count): 18(ptr) Variable Uniform + 20: TypePointer Uniform 16(int) + 22: 16(int) Constant 1 + 23: 16(int) Constant 0 + 25: 8(float) Constant 1065353216 + 26: 9(fvec4) ConstantComposite 25 25 25 25 + 27: TypePointer Uniform 9(fvec4) + 4(main): 2 Function None 3 + 5: Label + 29: 2 FunctionCall 6(@main() + Return + FunctionEnd + 6(@main(): 2 Function None 3 + 7: Label + 21: 20(ptr) AccessChain 19(Buf@count) 15 + 24: 16(int) AtomicIAdd 21 22 23 22 + 28: 27(ptr) AccessChain 13(Buf) 15 24 + Store 28 26 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.numericsuffixes.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.numericsuffixes.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.numericsuffixes.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.numericsuffixes.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -192,7 +192,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 54 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.numthreads.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.numthreads.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.numthreads.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.numthreads.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -44,7 +44,7 @@ 0:? 'tid' ( in 3-component vector of uint GlobalInvocationID) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 23 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.opaque-type-bug.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.opaque-type-bug.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.opaque-type-bug.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.opaque-type-bug.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -58,7 +58,7 @@ 0:? 'MyTexture' (layout( binding=0) uniform texture2D) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 27 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.overload.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.overload.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.overload.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.overload.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -734,7 +734,7 @@ 0:? 'input' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 520 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.params.default.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.params.default.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.params.default.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.params.default.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -376,7 +376,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 178 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.partialFlattenLocal.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.partialFlattenLocal.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.partialFlattenLocal.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.partialFlattenLocal.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -237,7 +237,7 @@ 0:? 'pos' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 90 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.partialFlattenMixed.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.partialFlattenMixed.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.partialFlattenMixed.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.partialFlattenMixed.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -91,7 +91,7 @@ 0:? 'pos' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 43 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.partialInit.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.partialInit.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.partialInit.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.partialInit.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -399,7 +399,7 @@ 0:? 0 (const int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 104 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.PointSize.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.PointSize.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.PointSize.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.PointSize.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -70,7 +70,7 @@ 0:? 'OutputStream.ps' ( out float PointSize) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 36 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.PointSize.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.PointSize.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.PointSize.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.PointSize.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -38,7 +38,7 @@ 0:? '@entryPointOutput' ( out float PointSize) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 16 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.pp.line.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.pp.line.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.pp.line.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.pp.line.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.pp.line.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:4 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:4 Function Parameters: @@ -62,6 +63,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:4 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:4 Function Parameters: @@ -118,7 +120,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 42 Capability Shader @@ -126,6 +128,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 35 39 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.pp.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.pp.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.pp.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.pp.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -26,7 +26,7 @@ 0:? 'anon@0' (layout( row_major std140) uniform block{ uniform int goodGlobal1, uniform int goodGlobal2}) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 13 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.precedence2.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.precedence2.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.precedence2.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.precedence2.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -114,7 +114,7 @@ 0:? 'a4' (layout( location=3) flat in int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 56 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.precedence.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.precedence.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.precedence.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.precedence.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -148,7 +148,7 @@ 0:? 'a4' (layout( location=3) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 65 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.precise.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.precise.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.precise.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.precise.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -76,7 +76,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) noContraction out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 37 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.preprocessor.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.preprocessor.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.preprocessor.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.preprocessor.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -94,7 +94,7 @@ 0:? 'input' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 40 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.promote.atomic.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.promote.atomic.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.promote.atomic.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.promote.atomic.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -64,7 +64,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 36 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.promote.binary.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.promote.binary.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.promote.binary.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.promote.binary.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -172,7 +172,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 83 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.promote.vec1.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.promote.vec1.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.promote.vec1.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.promote.vec1.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -80,7 +80,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 31 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.promotions.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.promotions.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.promotions.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.promotions.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1582,7 +1582,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 596 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.rw.atomics.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.rw.atomics.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.rw.atomics.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.rw.atomics.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -3946,7 +3946,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 1147 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.rw.bracket.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.rw.bracket.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.rw.bracket.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.rw.bracket.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1744,7 +1744,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 607 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.rw.register.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.rw.register.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.rw.register.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.rw.register.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -98,7 +98,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 42 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.rw.scalar.bracket.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.rw.scalar.bracket.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.rw.scalar.bracket.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.rw.scalar.bracket.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1690,7 +1690,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 571 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.rw.swizzle.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.rw.swizzle.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.rw.swizzle.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.rw.swizzle.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -202,7 +202,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 63 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.rw.vec2.bracket.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.rw.vec2.bracket.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.rw.vec2.bracket.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.rw.vec2.bracket.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1708,7 +1708,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 605 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.sample.array.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.sample.array.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.sample.array.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.sample.array.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.sample.array.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -163,6 +164,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -320,7 +322,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 146 Capability Shader @@ -330,6 +332,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 138 142 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.sample.basic.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.sample.basic.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.sample.basic.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.sample.basic.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -3,6 +3,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:53 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:53 Function Parameters: @@ -278,6 +279,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:53 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:53 Function Parameters: @@ -548,7 +550,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 198 Capability Shader @@ -557,6 +559,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 188 192 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplebias.array.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplebias.array.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplebias.array.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplebias.array.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplebias.array.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -181,6 +182,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -356,7 +358,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 146 Capability Shader @@ -366,6 +368,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 138 142 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplebias.basic.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplebias.basic.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -214,6 +215,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -422,7 +424,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 170 Capability Shader @@ -431,6 +433,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 162 166 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplebias.offsetarray.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplebias.offsetarray.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:20 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:20 Function Parameters: @@ -151,6 +152,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:20 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:20 Function Parameters: @@ -296,7 +298,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 118 Capability Shader @@ -305,6 +307,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 110 114 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplebias.offset.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplebias.offset.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -202,6 +203,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -398,7 +400,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 161 Capability Shader @@ -407,6 +409,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 144 148 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmp.array.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplecmp.array.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -201,6 +202,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -396,7 +398,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 209 Capability Shader @@ -406,6 +408,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 166 170 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmp.basic.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplecmp.basic.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -192,6 +193,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -378,7 +380,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 198 Capability Shader @@ -388,6 +390,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 155 159 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmp.dualmode.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmp.dualmode.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmp.dualmode.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmp.dualmode.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -85,7 +85,7 @@ 0:? 'g_tTex' (layout( binding=3) uniform texture1D) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 43 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.array.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplecmplevelzero.array.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -219,6 +220,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -432,7 +434,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 210 Capability Shader @@ -442,6 +444,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 167 171 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.basic.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplecmplevelzero.basic.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -210,6 +211,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -414,7 +416,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 199 Capability Shader @@ -424,6 +426,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 156 160 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.offsetarray.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplecmplevelzero.offsetarray.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -183,6 +184,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -360,7 +362,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 179 Capability Shader @@ -370,6 +372,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 127 131 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmplevelzero.offset.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplecmplevelzero.offset.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -177,6 +178,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -348,7 +350,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 168 Capability Shader @@ -358,6 +360,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 116 120 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmp.offsetarray.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplecmp.offsetarray.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -171,6 +172,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -336,7 +338,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 178 Capability Shader @@ -346,6 +348,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 126 130 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplecmp.offset.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplecmp.offset.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -165,6 +166,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:38 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:38 Function Parameters: @@ -324,7 +326,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 167 Capability Shader @@ -334,6 +336,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 115 119 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplegrad.array.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplegrad.array.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -217,6 +218,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -428,7 +430,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 140 Capability Shader @@ -438,6 +440,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 132 136 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplegrad.basic.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplegrad.basic.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -268,6 +269,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -530,7 +532,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 175 Capability Shader @@ -539,6 +541,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 167 171 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplegrad.basic.dx10.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -494,7 +494,7 @@ 0:? '@entryPointOutput.Pos' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 166 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplegrad.offsetarray.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplegrad.offsetarray.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -172,6 +173,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -338,7 +340,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 120 Capability Shader @@ -348,6 +350,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 103 107 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplegrad.offset.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplegrad.offset.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -238,6 +239,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -470,7 +472,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 166 Capability Shader @@ -479,6 +481,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 149 153 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplelevel.array.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplelevel.array.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -181,6 +182,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:24 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:24 Function Parameters: @@ -356,7 +358,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 147 Capability Shader @@ -366,6 +368,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 139 143 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplelevel.basic.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplelevel.basic.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:29 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:29 Function Parameters: @@ -215,6 +216,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:29 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:29 Function Parameters: @@ -424,7 +426,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 172 Capability Shader @@ -433,6 +435,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 163 167 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplelevel.basic.dx10.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -386,7 +386,7 @@ 0:? '@entryPointOutput.Pos' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 162 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplelevel.offsetarray.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplelevel.offsetarray.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:20 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:20 Function Parameters: @@ -151,6 +152,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:20 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:20 Function Parameters: @@ -296,7 +298,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 119 Capability Shader @@ -305,6 +307,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 111 115 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.samplelevel.offset.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.samplelevel.offset.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -202,6 +203,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -398,7 +400,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 162 Capability Shader @@ -407,6 +409,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 145 149 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.sample.offsetarray.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.sample.offsetarray.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:20 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:20 Function Parameters: @@ -139,6 +140,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:20 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:20 Function Parameters: @@ -272,7 +274,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 118 Capability Shader @@ -281,6 +283,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 110 114 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.sample.offset.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.sample.offset.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.sample.offset.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.sample.offset.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,7 @@ hlsl.sample.offset.dx10.frag Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -184,6 +185,7 @@ Shader version: 500 gl_FragCoord origin is upper left +using depth_any 0:? Sequence 0:28 Function Definition: @main( ( temp structure{ temp 4-component vector of float Color, temp float Depth}) 0:28 Function Parameters: @@ -362,7 +364,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 161 Capability Shader @@ -371,6 +373,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 144 148 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.sample.sub-vec4.dx10.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.sample.sub-vec4.dx10.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.sample.sub-vec4.dx10.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.sample.sub-vec4.dx10.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -154,7 +154,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 72 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.scalar2matrix.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.scalar2matrix.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.scalar2matrix.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.scalar2matrix.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -374,7 +374,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 96 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.scalarCast.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.scalarCast.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.scalarCast.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.scalarCast.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -322,7 +322,7 @@ 0:? '@entryPointOutput.texCoord' (layout( location=0) out 2-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 120 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.scalar-length.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.scalar-length.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.scalar-length.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.scalar-length.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -64,7 +64,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 30 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.scope.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.scope.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.scope.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.scope.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -102,7 +102,7 @@ 0:? 'input' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 49 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.semantic-1.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.semantic-1.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.semantic-1.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.semantic-1.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -242,7 +242,7 @@ 0:? 'v' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 84 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.semantic.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.semantic.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.semantic.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.semantic.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -156,7 +156,7 @@ 0:? 'OutputStream.cull0' ( out 1-element array of float CullDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 65 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.semantic.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.semantic.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.semantic.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.semantic.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -210,7 +210,7 @@ 0:? '@entryPointOutput.cull1' ( out 2-element array of float CullDistance) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 70 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.semicolons.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.semicolons.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.semicolons.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.semicolons.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -74,7 +74,7 @@ 0:? '@entryPointOutput.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 31 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.shapeConv.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.shapeConv.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.shapeConv.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.shapeConv.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -321,7 +321,7 @@ 0:? Linker Objects // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 127 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.shapeConvRet.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.shapeConvRet.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.shapeConvRet.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.shapeConvRet.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -68,7 +68,7 @@ 0:? 'f' (layout( location=0) in float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 35 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.shift.per-set.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.shift.per-set.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.shift.per-set.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.shift.per-set.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -9,15 +9,15 @@ 0:36 't2' (layout( set=1 binding=2) uniform texture2D) 0:37 't3' (layout( set=2 binding=1) uniform texture3D) 0:38 direct index (layout( row_major std430) buffer 4-component vector of float) -0:38 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float) -0:38 't4' (layout( set=3 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:38 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float) +0:38 't4' (layout( set=3 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:38 Constant: 0:38 0 (const uint) 0:38 Constant: 0:38 0 (const int) 0:39 indirect index (layout( row_major std430) buffer uint) -0:39 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:39 't5' (layout( set=3 binding=2 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:39 't5' (layout( set=3 binding=2 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:39 Constant: 0:39 0 (const uint) 0:39 right-shift ( temp int) @@ -36,8 +36,8 @@ 0:49 Constant: 0:49 0 (const int) 0:50 indirect index (layout( row_major std430) buffer uint) -0:50 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:50 'u5' (layout( set=2 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:50 'u5' (layout( set=2 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:50 Constant: 0:50 0 (const uint) 0:50 right-shift ( temp int) @@ -46,14 +46,14 @@ 0:50 Constant: 0:50 2 (const int) 0:51 direct index (layout( row_major std430) buffer float) -0:51 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float) -0:51 'u6' (layout( set=3 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float) +0:51 'u6' (layout( set=3 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:51 Constant: 0:51 0 (const uint) 0:51 Constant: 0:51 0 (const int) -0:52 'u7' (layout( set=4 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) -0:53 'u8' (layout( set=5 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:52 'u7' (layout( set=4 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) +0:53 'u8' (layout( set=5 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:55 cb1: direct index for structure (layout( row_major std140) uniform int) 0:55 'anon@0' (layout( set=6 binding=1 row_major std140) uniform block{layout( row_major std140) uniform int cb1}) 0:55 Constant: @@ -80,17 +80,17 @@ 0:? 't1' (layout( set=1 binding=1) uniform texture1D) 0:? 't2' (layout( set=1 binding=2) uniform texture2D) 0:? 't3' (layout( set=2 binding=1) uniform texture3D) -0:? 't4' (layout( set=3 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:? 't5' (layout( set=3 binding=2 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 't4' (layout( set=3 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:? 't5' (layout( set=3 binding=2 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? 't6' (layout( set=3 binding=3 rgba32f) uniform textureBuffer) 0:? 'u1' (layout( set=1 binding=1 rgba32f) uniform image1D) 0:? 'u2' (layout( set=2 binding=2 rgba32f) uniform image2D) 0:? 'u3' (layout( set=2 binding=3 rgba32f) uniform image3D) 0:? 'u4' (layout( set=1 binding=4 r32f) uniform imageBuffer) -0:? 'u5' (layout( set=2 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) -0:? 'u6' (layout( set=3 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) -0:? 'u7' (layout( set=4 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) -0:? 'u8' (layout( set=5 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:? 'u5' (layout( set=2 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) +0:? 'u6' (layout( set=3 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) +0:? 'u7' (layout( set=4 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) +0:? 'u8' (layout( set=5 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:? 'anon@0' (layout( set=6 binding=1 row_major std140) uniform block{layout( row_major std140) uniform int cb1}) 0:? 'anon@1' (layout( binding=7 row_major std430) readonly buffer block{layout( row_major std430) buffer int tb1}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) @@ -109,15 +109,15 @@ 0:36 't2' (layout( set=1 binding=2) uniform texture2D) 0:37 't3' (layout( set=2 binding=1) uniform texture3D) 0:38 direct index (layout( row_major std430) buffer 4-component vector of float) -0:38 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float) -0:38 't4' (layout( set=3 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:38 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float) +0:38 't4' (layout( set=3 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:38 Constant: 0:38 0 (const uint) 0:38 Constant: 0:38 0 (const int) 0:39 indirect index (layout( row_major std430) buffer uint) -0:39 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:39 't5' (layout( set=3 binding=2 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:39 't5' (layout( set=3 binding=2 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:39 Constant: 0:39 0 (const uint) 0:39 right-shift ( temp int) @@ -136,8 +136,8 @@ 0:49 Constant: 0:49 0 (const int) 0:50 indirect index (layout( row_major std430) buffer uint) -0:50 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:50 'u5' (layout( set=2 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:50 'u5' (layout( set=2 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:50 Constant: 0:50 0 (const uint) 0:50 right-shift ( temp int) @@ -146,14 +146,14 @@ 0:50 Constant: 0:50 2 (const int) 0:51 direct index (layout( row_major std430) buffer float) -0:51 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float) -0:51 'u6' (layout( set=3 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float) +0:51 'u6' (layout( set=3 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:51 Constant: 0:51 0 (const uint) 0:51 Constant: 0:51 0 (const int) -0:52 'u7' (layout( set=4 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) -0:53 'u8' (layout( set=5 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:52 'u7' (layout( set=4 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) +0:53 'u8' (layout( set=5 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:55 cb1: direct index for structure (layout( row_major std140) uniform int) 0:55 'anon@0' (layout( set=6 binding=1 row_major std140) uniform block{layout( row_major std140) uniform int cb1}) 0:55 Constant: @@ -180,17 +180,17 @@ 0:? 't1' (layout( set=1 binding=1) uniform texture1D) 0:? 't2' (layout( set=1 binding=2) uniform texture2D) 0:? 't3' (layout( set=2 binding=1) uniform texture3D) -0:? 't4' (layout( set=3 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:? 't5' (layout( set=3 binding=2 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 't4' (layout( set=3 binding=1 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:? 't5' (layout( set=3 binding=2 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? 't6' (layout( set=3 binding=3 rgba32f) uniform textureBuffer) 0:? 'u1' (layout( set=1 binding=1 rgba32f) uniform image1D) 0:? 'u2' (layout( set=2 binding=2 rgba32f) uniform image2D) 0:? 'u3' (layout( set=2 binding=3 rgba32f) uniform image3D) 0:? 'u4' (layout( set=1 binding=4 r32f) uniform imageBuffer) -0:? 'u5' (layout( set=2 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) -0:? 'u6' (layout( set=3 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) -0:? 'u7' (layout( set=4 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) -0:? 'u8' (layout( set=5 binding=4 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:? 'u5' (layout( set=2 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) +0:? 'u6' (layout( set=3 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) +0:? 'u7' (layout( set=4 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) +0:? 'u8' (layout( set=5 binding=4 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:? 'anon@0' (layout( set=6 binding=1 row_major std140) uniform block{layout( row_major std140) uniform int cb1}) 0:? 'anon@1' (layout( binding=7 row_major std430) readonly buffer block{layout( row_major std430) buffer int tb1}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.sin.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.sin.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.sin.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.sin.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -52,7 +52,7 @@ 0:? 'input' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 26 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.snorm.uav.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.snorm.uav.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.snorm.uav.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.snorm.uav.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -112,7 +112,7 @@ 0:? 'tid' ( in 3-component vector of uint GlobalInvocationID) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 54 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.staticMemberFunction.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.staticMemberFunction.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.staticMemberFunction.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.staticMemberFunction.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -118,7 +118,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 54 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.store.rwbyteaddressbuffer.type.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.store.rwbyteaddressbuffer.type.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.store.rwbyteaddressbuffer.type.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.store.rwbyteaddressbuffer.type.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -26,8 +26,8 @@ 0:7 2 (const int) 0:7 move second child to first child ( temp uint) 0:7 indirect index (layout( row_major std430) buffer uint) -0:7 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:7 'buffer' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:7 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:7 'buffer' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:7 Constant: 0:7 0 (const uint) 0:7 'byteAddrTemp' ( temp int) @@ -42,7 +42,7 @@ 0:5 Function Call: @main(vu3; ( temp void) 0:? 'dispatchThreadID' ( temp 3-component vector of uint) 0:? Linker Objects -0:? 'buffer' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 'buffer' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? 'dispatchThreadID' ( in 3-component vector of uint GlobalInvocationID) @@ -76,8 +76,8 @@ 0:7 2 (const int) 0:7 move second child to first child ( temp uint) 0:7 indirect index (layout( row_major std430) buffer uint) -0:7 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:7 'buffer' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:7 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:7 'buffer' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:7 Constant: 0:7 0 (const uint) 0:7 'byteAddrTemp' ( temp int) @@ -92,11 +92,11 @@ 0:5 Function Call: @main(vu3; ( temp void) 0:? 'dispatchThreadID' ( temp 3-component vector of uint) 0:? Linker Objects -0:? 'buffer' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 'buffer' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? 'dispatchThreadID' ( in 3-component vector of uint GlobalInvocationID) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 42 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.string.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.string.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.string.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.string.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -50,7 +50,7 @@ 0:? 'f' (layout( location=0) in float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 24 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.stringtoken.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.stringtoken.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.stringtoken.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.stringtoken.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -70,7 +70,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 34 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structarray.flatten.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structarray.flatten.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structarray.flatten.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structarray.flatten.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -156,7 +156,7 @@ 0:? 'ps_output.color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 80 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structarray.flatten.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structarray.flatten.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structarray.flatten.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structarray.flatten.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -170,7 +170,7 @@ 0:? 'outStream.uv' (layout( location=1) out 2-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 58 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.append.fn.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.append.fn.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.append.fn.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.append.fn.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -4,24 +4,24 @@ 0:? Sequence 0:8 Function Definition: Fn2(block--vf4[0]1;block--vf4[0]1; ( temp 4-component vector of float) 0:8 Function Parameters: -0:8 'arg_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:8 'arg_a@count' ( buffer block{layout( row_major std430) buffer int @count}) -0:8 'arg_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:8 'arg_c@count' ( buffer block{layout( row_major std430) buffer int @count}) +0:8 'arg_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:8 'arg_a@count' ( buffer block{layout( row_major std430) buffer uint @count}) +0:8 'arg_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:8 'arg_c@count' ( buffer block{layout( row_major std430) buffer uint @count}) 0:? Sequence 0:9 move second child to first child ( temp 4-component vector of float) 0:9 indirect index ( buffer 4-component vector of float) -0:9 @data: direct index for structure ( buffer implicitly-sized array of 4-component vector of float) -0:9 'arg_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:9 @data: direct index for structure ( buffer unsized 1-element array of 4-component vector of float) +0:9 'arg_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:9 Constant: 0:9 0 (const uint) 0:9 AtomicAdd ( temp uint) -0:9 @count: direct index for structure ( temp int) -0:9 'arg_a@count' ( buffer block{layout( row_major std430) buffer int @count}) +0:9 @count: direct index for structure ( temp uint) +0:9 'arg_a@count' ( buffer block{layout( row_major std430) buffer uint @count}) 0:9 Constant: 0:9 0 (const int) 0:9 Constant: -0:9 1 (const int) +0:9 1 (const uint) 0:? Constant: 0:? 1.000000 0:? 2.000000 @@ -29,18 +29,18 @@ 0:? 4.000000 0:10 Branch: Return with expression 0:10 indirect index ( buffer 4-component vector of float) -0:10 @data: direct index for structure ( buffer implicitly-sized array of 4-component vector of float) -0:10 'arg_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:10 @data: direct index for structure ( buffer unsized 1-element array of 4-component vector of float) +0:10 'arg_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 add ( temp uint) 0:10 AtomicAdd ( temp uint) -0:10 @count: direct index for structure ( temp int) -0:10 'arg_c@count' ( buffer block{layout( row_major std430) buffer int @count}) +0:10 @count: direct index for structure ( temp uint) +0:10 'arg_c@count' ( buffer block{layout( row_major std430) buffer uint @count}) 0:10 Constant: 0:10 0 (const int) 0:10 Constant: -0:10 -1 (const int) +0:10 4294967295 (const uint) 0:10 Constant: 0:10 -1 (const int) 0:19 Function Definition: @main(u1; ( temp 4-component vector of float) @@ -49,10 +49,10 @@ 0:? Sequence 0:22 Branch: Return with expression 0:22 Function Call: Fn2(block--vf4[0]1;block--vf4[0]1; ( temp 4-component vector of float) -0:22 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:22 'sbuf_a@count' ( buffer block{layout( row_major std430) buffer int @count}) -0:22 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:22 'sbuf_c@count' ( buffer block{layout( row_major std430) buffer int @count}) +0:22 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:22 'sbuf_a@count' ( buffer block{layout( row_major std430) buffer uint @count}) +0:22 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:22 'sbuf_c@count' ( buffer block{layout( row_major std430) buffer uint @count}) 0:19 Function Definition: main( ( temp void) 0:19 Function Parameters: 0:? Sequence @@ -64,11 +64,11 @@ 0:19 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:? 'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:? 'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:? 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:? 'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:? 'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) @@ -81,24 +81,24 @@ 0:? Sequence 0:8 Function Definition: Fn2(block--vf4[0]1;block--vf4[0]1; ( temp 4-component vector of float) 0:8 Function Parameters: -0:8 'arg_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:8 'arg_a@count' ( buffer block{layout( row_major std430) buffer int @count}) -0:8 'arg_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:8 'arg_c@count' ( buffer block{layout( row_major std430) buffer int @count}) +0:8 'arg_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:8 'arg_a@count' ( buffer block{layout( row_major std430) buffer uint @count}) +0:8 'arg_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:8 'arg_c@count' ( buffer block{layout( row_major std430) buffer uint @count}) 0:? Sequence 0:9 move second child to first child ( temp 4-component vector of float) 0:9 indirect index ( buffer 4-component vector of float) -0:9 @data: direct index for structure ( buffer implicitly-sized array of 4-component vector of float) -0:9 'arg_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:9 @data: direct index for structure ( buffer unsized 1-element array of 4-component vector of float) +0:9 'arg_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:9 Constant: 0:9 0 (const uint) 0:9 AtomicAdd ( temp uint) -0:9 @count: direct index for structure ( temp int) -0:9 'arg_a@count' ( buffer block{layout( row_major std430) buffer int @count}) +0:9 @count: direct index for structure ( temp uint) +0:9 'arg_a@count' ( buffer block{layout( row_major std430) buffer uint @count}) 0:9 Constant: 0:9 0 (const int) 0:9 Constant: -0:9 1 (const int) +0:9 1 (const uint) 0:? Constant: 0:? 1.000000 0:? 2.000000 @@ -106,18 +106,18 @@ 0:? 4.000000 0:10 Branch: Return with expression 0:10 indirect index ( buffer 4-component vector of float) -0:10 @data: direct index for structure ( buffer implicitly-sized array of 4-component vector of float) -0:10 'arg_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:10 @data: direct index for structure ( buffer unsized 1-element array of 4-component vector of float) +0:10 'arg_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 add ( temp uint) 0:10 AtomicAdd ( temp uint) -0:10 @count: direct index for structure ( temp int) -0:10 'arg_c@count' ( buffer block{layout( row_major std430) buffer int @count}) +0:10 @count: direct index for structure ( temp uint) +0:10 'arg_c@count' ( buffer block{layout( row_major std430) buffer uint @count}) 0:10 Constant: 0:10 0 (const int) 0:10 Constant: -0:10 -1 (const int) +0:10 4294967295 (const uint) 0:10 Constant: 0:10 -1 (const int) 0:19 Function Definition: @main(u1; ( temp 4-component vector of float) @@ -126,10 +126,10 @@ 0:? Sequence 0:22 Branch: Return with expression 0:22 Function Call: Fn2(block--vf4[0]1;block--vf4[0]1; ( temp 4-component vector of float) -0:22 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:22 'sbuf_a@count' ( buffer block{layout( row_major std430) buffer int @count}) -0:22 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:22 'sbuf_c@count' ( buffer block{layout( row_major std430) buffer int @count}) +0:22 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:22 'sbuf_a@count' ( buffer block{layout( row_major std430) buffer uint @count}) +0:22 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:22 'sbuf_c@count' ( buffer block{layout( row_major std430) buffer uint @count}) 0:19 Function Definition: main( ( temp void) 0:19 Function Parameters: 0:? Sequence @@ -141,16 +141,16 @@ 0:19 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:? 'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:? 'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:? 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:? 'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:? 'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 70 Capability Shader @@ -169,8 +169,8 @@ Name 16 "arg_a@count" Name 17 "arg_c" Name 18 "arg_c@count" - Name 25 "@main(u1;" - Name 24 "pos" + Name 24 "@main(u1;" + Name 23 "pos" Name 49 "sbuf_a" Name 50 "sbuf_a@count" Name 51 "sbuf_c" @@ -207,30 +207,30 @@ 8: TypeRuntimeArray 7(fvec4) 9: TypeStruct 8 10: TypePointer Uniform 9(struct) - 11: TypeInt 32 1 + 11: TypeInt 32 0 12: TypeStruct 11(int) 13: TypePointer Uniform 12(struct) 14: TypeFunction 7(fvec4) 10(ptr) 13(ptr) 10(ptr) 13(ptr) - 21: TypeInt 32 0 - 22: TypePointer Function 21(int) - 23: TypeFunction 7(fvec4) 22(ptr) - 27: 11(int) Constant 0 + 21: TypePointer Function 11(int) + 22: TypeFunction 7(fvec4) 21(ptr) + 26: TypeInt 32 1 + 27: 26(int) Constant 0 28: TypePointer Uniform 11(int) 30: 11(int) Constant 1 - 31: 21(int) Constant 1 - 32: 21(int) Constant 0 - 34: 6(float) Constant 1065353216 - 35: 6(float) Constant 1073741824 - 36: 6(float) Constant 1077936128 - 37: 6(float) Constant 1082130432 - 38: 7(fvec4) ConstantComposite 34 35 36 37 - 39: TypePointer Uniform 7(fvec4) - 42: 11(int) Constant 4294967295 + 31: 11(int) Constant 0 + 33: 6(float) Constant 1065353216 + 34: 6(float) Constant 1073741824 + 35: 6(float) Constant 1077936128 + 36: 6(float) Constant 1082130432 + 37: 7(fvec4) ConstantComposite 33 34 35 36 + 38: TypePointer Uniform 7(fvec4) + 41: 11(int) Constant 4294967295 + 43: 26(int) Constant 4294967295 49(sbuf_a): 10(ptr) Variable Uniform 50(sbuf_a@count): 13(ptr) Variable Uniform 51(sbuf_c): 10(ptr) Variable Uniform 52(sbuf_c@count): 13(ptr) Variable Uniform - 57: TypePointer Input 21(int) + 57: TypePointer Input 11(int) 58(pos): 57(ptr) Variable Input 60: TypePointer Output 7(fvec4) 61(@entryPointOutput): 60(ptr) Variable Output @@ -241,13 +241,13 @@ 69(sbuf_unused): 10(ptr) Variable Uniform 4(main): 2 Function None 3 5: Label - 56(pos): 22(ptr) Variable Function - 62(param): 22(ptr) Variable Function - 59: 21(int) Load 58(pos) + 56(pos): 21(ptr) Variable Function + 62(param): 21(ptr) Variable Function + 59: 11(int) Load 58(pos) Store 56(pos) 59 - 63: 21(int) Load 56(pos) + 63: 11(int) Load 56(pos) Store 62(param) 63 - 64: 7(fvec4) FunctionCall 25(@main(u1;) 62(param) + 64: 7(fvec4) FunctionCall 24(@main(u1;) 62(param) Store 61(@entryPointOutput) 64 Return FunctionEnd @@ -258,19 +258,19 @@ 18(arg_c@count): 13(ptr) FunctionParameter 20: Label 29: 28(ptr) AccessChain 16(arg_a@count) 27 - 33: 21(int) AtomicIAdd 29 31 32 30 - 40: 39(ptr) AccessChain 15(arg_a) 27 33 - Store 40 38 - 41: 28(ptr) AccessChain 18(arg_c@count) 27 - 43: 21(int) AtomicIAdd 41 31 32 42 - 44: 21(int) IAdd 43 42 - 45: 39(ptr) AccessChain 17(arg_c) 27 44 + 32: 11(int) AtomicIAdd 29 30 31 30 + 39: 38(ptr) AccessChain 15(arg_a) 27 32 + Store 39 37 + 40: 28(ptr) AccessChain 18(arg_c@count) 27 + 42: 11(int) AtomicIAdd 40 30 31 41 + 44: 11(int) IAdd 42 43 + 45: 38(ptr) AccessChain 17(arg_c) 27 44 46: 7(fvec4) Load 45 ReturnValue 46 FunctionEnd - 25(@main(u1;): 7(fvec4) Function None 23 - 24(pos): 22(ptr) FunctionParameter - 26: Label + 24(@main(u1;): 7(fvec4) Function None 22 + 23(pos): 21(ptr) FunctionParameter + 25: Label 53: 7(fvec4) FunctionCall 19(Fn2(block--vf4[0]1;block--vf4[0]1;) 49(sbuf_a) 50(sbuf_a@count) 51(sbuf_c) 52(sbuf_c@count) ReturnValue 53 FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.append.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.append.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.append.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.append.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -8,17 +8,17 @@ 0:? Sequence 0:8 move second child to first child ( temp 4-component vector of float) 0:8 indirect index (layout( row_major std430) buffer 4-component vector of float) -0:8 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float) -0:8 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:8 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float) +0:8 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:8 Constant: 0:8 0 (const uint) 0:8 AtomicAdd ( temp uint) -0:8 @count: direct index for structure ( temp int) -0:8 'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) +0:8 @count: direct index for structure ( temp uint) +0:8 'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) 0:8 Constant: 0:8 0 (const int) 0:8 Constant: -0:8 1 (const int) +0:8 1 (const uint) 0:? Constant: 0:? 1.000000 0:? 2.000000 @@ -26,18 +26,18 @@ 0:? 4.000000 0:10 Branch: Return with expression 0:10 indirect index (layout( row_major std430) buffer 4-component vector of float) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float) -0:10 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float) +0:10 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 add ( temp uint) 0:10 AtomicAdd ( temp uint) -0:10 @count: direct index for structure ( temp int) -0:10 'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) +0:10 @count: direct index for structure ( temp uint) +0:10 'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) 0:10 Constant: 0:10 0 (const int) 0:10 Constant: -0:10 -1 (const int) +0:10 4294967295 (const uint) 0:10 Constant: 0:10 -1 (const int) 0:7 Function Definition: main( ( temp void) @@ -51,11 +51,11 @@ 0:7 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:? 'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:? 'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:? 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:? 'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:? 'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) @@ -72,17 +72,17 @@ 0:? Sequence 0:8 move second child to first child ( temp 4-component vector of float) 0:8 indirect index (layout( row_major std430) buffer 4-component vector of float) -0:8 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float) -0:8 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:8 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float) +0:8 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:8 Constant: 0:8 0 (const uint) 0:8 AtomicAdd ( temp uint) -0:8 @count: direct index for structure ( temp int) -0:8 'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) +0:8 @count: direct index for structure ( temp uint) +0:8 'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) 0:8 Constant: 0:8 0 (const int) 0:8 Constant: -0:8 1 (const int) +0:8 1 (const uint) 0:? Constant: 0:? 1.000000 0:? 2.000000 @@ -90,18 +90,18 @@ 0:? 4.000000 0:10 Branch: Return with expression 0:10 indirect index (layout( row_major std430) buffer 4-component vector of float) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float) -0:10 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float) +0:10 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 add ( temp uint) 0:10 AtomicAdd ( temp uint) -0:10 @count: direct index for structure ( temp int) -0:10 'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) +0:10 @count: direct index for structure ( temp uint) +0:10 'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) 0:10 Constant: 0:10 0 (const int) 0:10 Constant: -0:10 -1 (const int) +0:10 4294967295 (const uint) 0:10 Constant: 0:10 -1 (const int) 0:7 Function Definition: main( ( temp void) @@ -115,16 +115,16 @@ 0:7 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:? 'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) -0:? 'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:? 'sbuf_a' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:? 'sbuf_a@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf_c' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) +0:? 'sbuf_c@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf_unused' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 56 Capability Shader @@ -142,8 +142,8 @@ Name 20 "sbuf_a@count" MemberName 20(sbuf_a@count) 0 "@count" Name 22 "sbuf_a@count" - Name 36 "sbuf_c" - Name 37 "sbuf_c@count" + Name 35 "sbuf_c" + Name 36 "sbuf_c@count" Name 46 "pos" Name 48 "pos" Name 51 "@entryPointOutput" @@ -156,8 +156,8 @@ MemberDecorate 20(sbuf_a@count) 0 Offset 0 Decorate 20(sbuf_a@count) BufferBlock Decorate 22(sbuf_a@count) DescriptorSet 0 - Decorate 36(sbuf_c) DescriptorSet 0 - Decorate 37(sbuf_c@count) DescriptorSet 0 + Decorate 35(sbuf_c) DescriptorSet 0 + Decorate 36(sbuf_c@count) DescriptorSet 0 Decorate 48(pos) Flat Decorate 48(pos) Location 0 Decorate 51(@entryPointOutput) Location 0 @@ -175,22 +175,22 @@ 17(sbuf_a): 16(ptr) Variable Uniform 18: TypeInt 32 1 19: 18(int) Constant 0 -20(sbuf_a@count): TypeStruct 18(int) +20(sbuf_a@count): TypeStruct 6(int) 21: TypePointer Uniform 20(sbuf_a@count) 22(sbuf_a@count): 21(ptr) Variable Uniform - 23: TypePointer Uniform 18(int) - 25: 18(int) Constant 1 - 26: 6(int) Constant 1 - 27: 6(int) Constant 0 - 29: 8(float) Constant 1065353216 - 30: 8(float) Constant 1073741824 - 31: 8(float) Constant 1077936128 - 32: 8(float) Constant 1082130432 - 33: 9(fvec4) ConstantComposite 29 30 31 32 - 34: TypePointer Uniform 9(fvec4) - 36(sbuf_c): 16(ptr) Variable Uniform -37(sbuf_c@count): 21(ptr) Variable Uniform - 39: 18(int) Constant 4294967295 + 23: TypePointer Uniform 6(int) + 25: 6(int) Constant 1 + 26: 6(int) Constant 0 + 28: 8(float) Constant 1065353216 + 29: 8(float) Constant 1073741824 + 30: 8(float) Constant 1077936128 + 31: 8(float) Constant 1082130432 + 32: 9(fvec4) ConstantComposite 28 29 30 31 + 33: TypePointer Uniform 9(fvec4) + 35(sbuf_c): 16(ptr) Variable Uniform +36(sbuf_c@count): 21(ptr) Variable Uniform + 38: 6(int) Constant 4294967295 + 40: 18(int) Constant 4294967295 47: TypePointer Input 6(int) 48(pos): 47(ptr) Variable Input 50: TypePointer Output 9(fvec4) @@ -212,13 +212,13 @@ 11(pos): 7(ptr) FunctionParameter 13: Label 24: 23(ptr) AccessChain 22(sbuf_a@count) 19 - 28: 6(int) AtomicIAdd 24 26 27 25 - 35: 34(ptr) AccessChain 17(sbuf_a) 19 28 - Store 35 33 - 38: 23(ptr) AccessChain 37(sbuf_c@count) 19 - 40: 6(int) AtomicIAdd 38 26 27 39 - 41: 6(int) IAdd 40 39 - 42: 34(ptr) AccessChain 36(sbuf_c) 19 41 + 27: 6(int) AtomicIAdd 24 25 26 25 + 34: 33(ptr) AccessChain 17(sbuf_a) 19 27 + Store 34 32 + 37: 23(ptr) AccessChain 36(sbuf_c@count) 19 + 39: 6(int) AtomicIAdd 37 25 26 38 + 41: 6(int) IAdd 39 40 + 42: 33(ptr) AccessChain 35(sbuf_c) 19 41 43: 9(fvec4) Load 42 ReturnValue 43 FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.atomics.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.atomics.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.atomics.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.atomics.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -6,10 +6,10 @@ 0:5 Function Parameters: 0:5 'pos' ( in uint) 0:? Sequence -0:8 AtomicAdd ( temp void) +0:8 AtomicAdd ( temp uint) 0:8 indirect index (layout( row_major std430) buffer uint) -0:8 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:8 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:8 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:8 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:8 Constant: 0:8 0 (const uint) 0:8 right-shift ( temp int) @@ -23,8 +23,8 @@ 0:9 'u' ( temp uint) 0:9 AtomicAdd ( temp uint) 0:9 indirect index (layout( row_major std430) buffer uint) -0:9 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:9 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:9 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:9 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:9 Constant: 0:9 0 (const uint) 0:9 right-shift ( temp int) @@ -34,10 +34,10 @@ 0:9 2 (const int) 0:9 Constant: 0:9 1 (const int) -0:10 AtomicAnd ( temp void) +0:10 AtomicAnd ( temp uint) 0:10 indirect index (layout( row_major std430) buffer uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 right-shift ( temp int) @@ -51,8 +51,8 @@ 0:11 'u' ( temp uint) 0:11 AtomicAnd ( temp uint) 0:11 indirect index (layout( row_major std430) buffer uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 right-shift ( temp int) @@ -67,8 +67,8 @@ 0:12 Convert int to uint ( temp uint) 0:12 AtomicCompSwap ( temp int) 0:12 indirect index (layout( row_major std430) buffer uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 right-shift ( temp int) @@ -84,8 +84,8 @@ 0:14 'u' ( temp uint) 0:14 AtomicExchange ( temp uint) 0:14 indirect index (layout( row_major std430) buffer uint) -0:14 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:14 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:14 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:14 Constant: 0:14 0 (const uint) 0:14 right-shift ( temp int) @@ -95,10 +95,10 @@ 0:14 2 (const int) 0:14 Constant: 0:14 1 (const int) -0:15 AtomicMax ( temp void) +0:15 AtomicMax ( temp uint) 0:15 indirect index (layout( row_major std430) buffer uint) -0:15 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:15 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:15 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:15 Constant: 0:15 0 (const uint) 0:15 right-shift ( temp int) @@ -112,8 +112,8 @@ 0:16 'u' ( temp uint) 0:16 AtomicMax ( temp uint) 0:16 indirect index (layout( row_major std430) buffer uint) -0:16 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:16 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:16 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:16 Constant: 0:16 0 (const uint) 0:16 right-shift ( temp int) @@ -123,10 +123,10 @@ 0:16 2 (const int) 0:16 Constant: 0:16 1 (const int) -0:17 AtomicMin ( temp void) +0:17 AtomicMin ( temp uint) 0:17 indirect index (layout( row_major std430) buffer uint) -0:17 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:17 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:17 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:17 Constant: 0:17 0 (const uint) 0:17 right-shift ( temp int) @@ -140,8 +140,8 @@ 0:18 'u' ( temp uint) 0:18 AtomicMin ( temp uint) 0:18 indirect index (layout( row_major std430) buffer uint) -0:18 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:18 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:18 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:18 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:18 Constant: 0:18 0 (const uint) 0:18 right-shift ( temp int) @@ -151,10 +151,10 @@ 0:18 2 (const int) 0:18 Constant: 0:18 1 (const int) -0:19 AtomicOr ( temp void) +0:19 AtomicOr ( temp uint) 0:19 indirect index (layout( row_major std430) buffer uint) -0:19 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:19 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:19 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:19 Constant: 0:19 0 (const uint) 0:19 right-shift ( temp int) @@ -168,8 +168,8 @@ 0:20 'u' ( temp uint) 0:20 AtomicOr ( temp uint) 0:20 indirect index (layout( row_major std430) buffer uint) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:20 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:20 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 right-shift ( temp int) @@ -179,10 +179,10 @@ 0:20 2 (const int) 0:20 Constant: 0:20 1 (const int) -0:21 AtomicXor ( temp void) +0:21 AtomicXor ( temp uint) 0:21 indirect index (layout( row_major std430) buffer uint) -0:21 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:21 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:21 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:21 Constant: 0:21 0 (const uint) 0:21 right-shift ( temp int) @@ -196,8 +196,8 @@ 0:22 'u' ( temp uint) 0:22 AtomicXor ( temp uint) 0:22 indirect index (layout( row_major std430) buffer uint) -0:22 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:22 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:22 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:22 Constant: 0:22 0 (const uint) 0:22 right-shift ( temp int) @@ -211,8 +211,8 @@ 0:24 Construct vec4 ( temp 4-component vector of float) 0:24 Convert uint to float ( temp float) 0:24 indirect index (layout( row_major std430) buffer uint) -0:24 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:24 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:24 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:24 Constant: 0:24 0 (const uint) 0:24 right-shift ( temp int) @@ -230,7 +230,7 @@ 0:5 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) @@ -245,10 +245,10 @@ 0:5 Function Parameters: 0:5 'pos' ( in uint) 0:? Sequence -0:8 AtomicAdd ( temp void) +0:8 AtomicAdd ( temp uint) 0:8 indirect index (layout( row_major std430) buffer uint) -0:8 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:8 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:8 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:8 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:8 Constant: 0:8 0 (const uint) 0:8 right-shift ( temp int) @@ -262,8 +262,8 @@ 0:9 'u' ( temp uint) 0:9 AtomicAdd ( temp uint) 0:9 indirect index (layout( row_major std430) buffer uint) -0:9 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:9 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:9 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:9 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:9 Constant: 0:9 0 (const uint) 0:9 right-shift ( temp int) @@ -273,10 +273,10 @@ 0:9 2 (const int) 0:9 Constant: 0:9 1 (const int) -0:10 AtomicAnd ( temp void) +0:10 AtomicAnd ( temp uint) 0:10 indirect index (layout( row_major std430) buffer uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 right-shift ( temp int) @@ -290,8 +290,8 @@ 0:11 'u' ( temp uint) 0:11 AtomicAnd ( temp uint) 0:11 indirect index (layout( row_major std430) buffer uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 right-shift ( temp int) @@ -306,8 +306,8 @@ 0:12 Convert int to uint ( temp uint) 0:12 AtomicCompSwap ( temp int) 0:12 indirect index (layout( row_major std430) buffer uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 right-shift ( temp int) @@ -323,8 +323,8 @@ 0:14 'u' ( temp uint) 0:14 AtomicExchange ( temp uint) 0:14 indirect index (layout( row_major std430) buffer uint) -0:14 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:14 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:14 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:14 Constant: 0:14 0 (const uint) 0:14 right-shift ( temp int) @@ -334,10 +334,10 @@ 0:14 2 (const int) 0:14 Constant: 0:14 1 (const int) -0:15 AtomicMax ( temp void) +0:15 AtomicMax ( temp uint) 0:15 indirect index (layout( row_major std430) buffer uint) -0:15 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:15 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:15 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:15 Constant: 0:15 0 (const uint) 0:15 right-shift ( temp int) @@ -351,8 +351,8 @@ 0:16 'u' ( temp uint) 0:16 AtomicMax ( temp uint) 0:16 indirect index (layout( row_major std430) buffer uint) -0:16 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:16 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:16 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:16 Constant: 0:16 0 (const uint) 0:16 right-shift ( temp int) @@ -362,10 +362,10 @@ 0:16 2 (const int) 0:16 Constant: 0:16 1 (const int) -0:17 AtomicMin ( temp void) +0:17 AtomicMin ( temp uint) 0:17 indirect index (layout( row_major std430) buffer uint) -0:17 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:17 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:17 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:17 Constant: 0:17 0 (const uint) 0:17 right-shift ( temp int) @@ -379,8 +379,8 @@ 0:18 'u' ( temp uint) 0:18 AtomicMin ( temp uint) 0:18 indirect index (layout( row_major std430) buffer uint) -0:18 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:18 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:18 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:18 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:18 Constant: 0:18 0 (const uint) 0:18 right-shift ( temp int) @@ -390,10 +390,10 @@ 0:18 2 (const int) 0:18 Constant: 0:18 1 (const int) -0:19 AtomicOr ( temp void) +0:19 AtomicOr ( temp uint) 0:19 indirect index (layout( row_major std430) buffer uint) -0:19 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:19 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:19 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:19 Constant: 0:19 0 (const uint) 0:19 right-shift ( temp int) @@ -407,8 +407,8 @@ 0:20 'u' ( temp uint) 0:20 AtomicOr ( temp uint) 0:20 indirect index (layout( row_major std430) buffer uint) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:20 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:20 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 right-shift ( temp int) @@ -418,10 +418,10 @@ 0:20 2 (const int) 0:20 Constant: 0:20 1 (const int) -0:21 AtomicXor ( temp void) +0:21 AtomicXor ( temp uint) 0:21 indirect index (layout( row_major std430) buffer uint) -0:21 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:21 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:21 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:21 Constant: 0:21 0 (const uint) 0:21 right-shift ( temp int) @@ -435,8 +435,8 @@ 0:22 'u' ( temp uint) 0:22 AtomicXor ( temp uint) 0:22 indirect index (layout( row_major std430) buffer uint) -0:22 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:22 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:22 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:22 Constant: 0:22 0 (const uint) 0:22 right-shift ( temp int) @@ -450,8 +450,8 @@ 0:24 Construct vec4 ( temp 4-component vector of float) 0:24 Convert uint to float ( temp float) 0:24 indirect index (layout( row_major std430) buffer uint) -0:24 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:24 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:24 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:24 Constant: 0:24 0 (const uint) 0:24 right-shift ( temp int) @@ -469,12 +469,12 @@ 0:5 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 87 Capability Shader @@ -542,14 +542,14 @@ 29(u): 7(ptr) Variable Function 22: 18(int) ShiftRightArithmetic 20 21 24: 23(ptr) AccessChain 17(sbuf) 19 22 - 28: 2 AtomicIAdd 24 26 27 25 + 28: 6(int) AtomicIAdd 24 26 27 25 30: 18(int) ShiftRightArithmetic 20 21 31: 23(ptr) AccessChain 17(sbuf) 19 30 32: 6(int) AtomicIAdd 31 26 27 25 Store 29(u) 32 33: 18(int) ShiftRightArithmetic 20 21 34: 23(ptr) AccessChain 17(sbuf) 19 33 - 35: 2 AtomicAnd 34 26 27 25 + 35: 6(int) AtomicAnd 34 26 27 25 36: 18(int) ShiftRightArithmetic 20 21 37: 23(ptr) AccessChain 17(sbuf) 19 36 38: 6(int) AtomicAnd 37 26 27 25 @@ -565,28 +565,28 @@ Store 29(u) 45 46: 18(int) ShiftRightArithmetic 20 21 47: 23(ptr) AccessChain 17(sbuf) 19 46 - 48: 2 AtomicSMax 47 26 27 25 + 48: 6(int) AtomicUMax 47 26 27 25 49: 18(int) ShiftRightArithmetic 20 21 50: 23(ptr) AccessChain 17(sbuf) 19 49 51: 6(int) AtomicUMax 50 26 27 25 Store 29(u) 51 52: 18(int) ShiftRightArithmetic 20 21 53: 23(ptr) AccessChain 17(sbuf) 19 52 - 54: 2 AtomicSMin 53 26 27 25 + 54: 6(int) AtomicUMin 53 26 27 25 55: 18(int) ShiftRightArithmetic 20 21 56: 23(ptr) AccessChain 17(sbuf) 19 55 57: 6(int) AtomicUMin 56 26 27 25 Store 29(u) 57 58: 18(int) ShiftRightArithmetic 20 21 59: 23(ptr) AccessChain 17(sbuf) 19 58 - 60: 2 AtomicOr 59 26 27 25 + 60: 6(int) AtomicOr 59 26 27 25 61: 18(int) ShiftRightArithmetic 20 21 62: 23(ptr) AccessChain 17(sbuf) 19 61 63: 6(int) AtomicOr 62 26 27 25 Store 29(u) 63 64: 18(int) ShiftRightArithmetic 20 21 65: 23(ptr) AccessChain 17(sbuf) 19 64 - 66: 2 AtomicXor 65 26 27 25 + 66: 6(int) AtomicXor 65 26 27 25 67: 18(int) ShiftRightArithmetic 20 21 68: 23(ptr) AccessChain 17(sbuf) 19 67 69: 6(int) AtomicXor 68 26 27 25 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.byte.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.byte.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.byte.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.byte.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -10,8 +10,8 @@ 0:7 move second child to first child ( temp uint) 0:7 'size' ( temp uint) 0:7 array length ( temp uint) -0:7 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:7 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:7 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:7 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:7 Constant: 0:7 0 (const uint) 0:12 Branch: Return with expression @@ -20,8 +20,8 @@ 0:9 add ( temp 4-component vector of float) 0:9 Convert uint to float ( temp float) 0:9 indirect index (layout( row_major std430) buffer uint) -0:9 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:9 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:9 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:9 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:9 Constant: 0:9 0 (const uint) 0:9 right-shift ( temp int) @@ -42,14 +42,14 @@ 0:10 2 (const int) 0:? Construct vec2 ( temp 2-component vector of uint) 0:10 indirect index ( temp uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 'byteAddrTemp' ( temp int) 0:10 indirect index ( temp uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 add ( temp int) @@ -74,14 +74,14 @@ 0:11 2 (const int) 0:? Construct vec3 ( temp 3-component vector of uint) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 'byteAddrTemp' ( temp int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -89,8 +89,8 @@ 0:11 Constant: 0:11 1 (const int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -112,14 +112,14 @@ 0:12 2 (const int) 0:? Construct vec4 ( temp 4-component vector of uint) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 'byteAddrTemp' ( temp int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -127,8 +127,8 @@ 0:12 Constant: 0:12 1 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -136,8 +136,8 @@ 0:12 Constant: 0:12 2 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -155,7 +155,7 @@ 0:5 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) @@ -174,8 +174,8 @@ 0:7 move second child to first child ( temp uint) 0:7 'size' ( temp uint) 0:7 array length ( temp uint) -0:7 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:7 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:7 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:7 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:7 Constant: 0:7 0 (const uint) 0:12 Branch: Return with expression @@ -184,8 +184,8 @@ 0:9 add ( temp 4-component vector of float) 0:9 Convert uint to float ( temp float) 0:9 indirect index (layout( row_major std430) buffer uint) -0:9 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:9 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:9 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:9 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:9 Constant: 0:9 0 (const uint) 0:9 right-shift ( temp int) @@ -206,14 +206,14 @@ 0:10 2 (const int) 0:? Construct vec2 ( temp 2-component vector of uint) 0:10 indirect index ( temp uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 'byteAddrTemp' ( temp int) 0:10 indirect index ( temp uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 add ( temp int) @@ -238,14 +238,14 @@ 0:11 2 (const int) 0:? Construct vec3 ( temp 3-component vector of uint) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 'byteAddrTemp' ( temp int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -253,8 +253,8 @@ 0:11 Constant: 0:11 1 (const int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -276,14 +276,14 @@ 0:12 2 (const int) 0:? Construct vec4 ( temp 4-component vector of uint) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 'byteAddrTemp' ( temp int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -291,8 +291,8 @@ 0:12 Constant: 0:12 1 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -300,8 +300,8 @@ 0:12 Constant: 0:12 2 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -319,12 +319,12 @@ 0:5 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 'sbuf' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 114 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.coherent.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.coherent.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.coherent.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.coherent.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -8,8 +8,8 @@ 0:? Sequence 0:13 move second child to first child ( temp float) 0:13 indirect index (layout( row_major std430) buffer float) -0:13 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float) -0:13 'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:13 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float) +0:13 'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:13 Constant: 0:13 0 (const uint) 0:13 add ( temp uint) @@ -22,8 +22,8 @@ 0:17 move second child to first child ( temp uint) 0:17 'size' ( temp uint) 0:17 array length ( temp uint) -0:17 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test}) -0:17 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test}) +0:17 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) 0:17 Constant: 0:17 0 (const uint) 0:17 move second child to first child ( temp uint) @@ -34,8 +34,8 @@ 0:19 Condition 0:19 test: direct index for structure ( temp bool) 0:19 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test}) -0:19 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test}) -0:19 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test}) +0:19 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) 0:19 Constant: 0:19 0 (const uint) 0:19 'pos' ( in uint) @@ -47,16 +47,16 @@ 0:20 add ( temp 3-component vector of float) 0:20 color: direct index for structure ( temp 3-component vector of float) 0:20 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test}) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test}) -0:20 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test}) +0:20 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 'pos' ( in uint) 0:20 Constant: 0:20 0 (const int) 0:20 indirect index (layout( row_major std430) buffer float) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float) -0:20 'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float) +0:20 'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 'pos' ( in uint) @@ -80,8 +80,8 @@ 0:12 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) -0:? 'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:? 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:? 'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) @@ -98,8 +98,8 @@ 0:? Sequence 0:13 move second child to first child ( temp float) 0:13 indirect index (layout( row_major std430) buffer float) -0:13 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float) -0:13 'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:13 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float) +0:13 'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:13 Constant: 0:13 0 (const uint) 0:13 add ( temp uint) @@ -112,8 +112,8 @@ 0:17 move second child to first child ( temp uint) 0:17 'size' ( temp uint) 0:17 array length ( temp uint) -0:17 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test}) -0:17 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test}) +0:17 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) 0:17 Constant: 0:17 0 (const uint) 0:17 move second child to first child ( temp uint) @@ -124,8 +124,8 @@ 0:19 Condition 0:19 test: direct index for structure ( temp bool) 0:19 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test}) -0:19 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test}) -0:19 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test}) +0:19 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) 0:19 Constant: 0:19 0 (const uint) 0:19 'pos' ( in uint) @@ -137,16 +137,16 @@ 0:20 add ( temp 3-component vector of float) 0:20 color: direct index for structure ( temp 3-component vector of float) 0:20 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test}) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test}) -0:20 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test}) +0:20 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 'pos' ( in uint) 0:20 Constant: 0:20 0 (const int) 0:20 indirect index (layout( row_major std430) buffer float) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float) -0:20 'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float) +0:20 'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 'pos' ( in uint) @@ -170,13 +170,13 @@ 0:12 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) -0:? 'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:? 'sbuf' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:? 'sbuf2' (layout( row_major std430) coherent buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 78 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.floatidx.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.floatidx.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.floatidx.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.floatidx.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -10,18 +10,18 @@ 0:14 move second child to first child ( temp structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId}) 0:14 'data' ( temp structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId}) 0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId}) -0:14 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId}) -0:14 'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId} @data}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId}) +0:14 'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId} @data}) 0:14 Constant: 0:14 0 (const uint) 0:14 add ( temp uint) 0:14 AtomicAdd ( temp uint) -0:14 @count: direct index for structure ( temp int) -0:14 'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) +0:14 @count: direct index for structure ( temp uint) +0:14 'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) 0:14 Constant: 0:14 0 (const int) 0:14 Constant: -0:14 -1 (const int) +0:14 4294967295 (const uint) 0:14 Constant: 0:14 -1 (const int) 0:15 Sequence @@ -53,8 +53,8 @@ 0:16 'storeTemp' ( temp 4-component vector of float) 0:18 move second child to first child ( temp 4-component vector of float) 0:18 indirect index (layout( row_major std430) buffer 4-component vector of float) -0:18 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float) -0:18 'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:18 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float) +0:18 'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:18 Constant: 0:18 0 (const uint) 0:18 Convert float to uint ( temp uint) @@ -63,8 +63,8 @@ 0:18 Constant: 0:18 0 (const int) 0:18 indirect index (layout( row_major std430) buffer 4-component vector of float) -0:18 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float) -0:18 'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:18 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float) +0:18 'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:18 Constant: 0:18 0 (const uint) 0:18 Convert float to uint ( temp uint) @@ -82,9 +82,9 @@ 0:? 'nThreadId' ( temp 3-component vector of uint) 0:? Linker Objects 0:? 'outtx' (layout( rgba32f) uniform image2D) -0:? 'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId} @data}) -0:? 'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:? 'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId} @data}) +0:? 'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:? 'nThreadId' ( in 3-component vector of uint GlobalInvocationID) @@ -102,18 +102,18 @@ 0:14 move second child to first child ( temp structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId}) 0:14 'data' ( temp structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId}) 0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId}) -0:14 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId}) -0:14 'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId} @data}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId}) +0:14 'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId} @data}) 0:14 Constant: 0:14 0 (const uint) 0:14 add ( temp uint) 0:14 AtomicAdd ( temp uint) -0:14 @count: direct index for structure ( temp int) -0:14 'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) +0:14 @count: direct index for structure ( temp uint) +0:14 'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) 0:14 Constant: 0:14 0 (const int) 0:14 Constant: -0:14 -1 (const int) +0:14 4294967295 (const uint) 0:14 Constant: 0:14 -1 (const int) 0:15 Sequence @@ -145,8 +145,8 @@ 0:16 'storeTemp' ( temp 4-component vector of float) 0:18 move second child to first child ( temp 4-component vector of float) 0:18 indirect index (layout( row_major std430) buffer 4-component vector of float) -0:18 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float) -0:18 'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:18 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float) +0:18 'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:18 Constant: 0:18 0 (const uint) 0:18 Convert float to uint ( temp uint) @@ -155,8 +155,8 @@ 0:18 Constant: 0:18 0 (const int) 0:18 indirect index (layout( row_major std430) buffer 4-component vector of float) -0:18 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of float) -0:18 'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:18 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of float) +0:18 'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:18 Constant: 0:18 0 (const uint) 0:18 Convert float to uint ( temp uint) @@ -174,19 +174,19 @@ 0:? 'nThreadId' ( temp 3-component vector of uint) 0:? Linker Objects 0:? 'outtx' (layout( rgba32f) uniform image2D) -0:? 'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId} @data}) -0:? 'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of float @data}) +0:? 'csb' (layout( binding=1 row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of float color, temp 2-component vector of uint threadId} @data}) +0:? 'csb@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'rwsb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of float @data}) 0:? 'nThreadId' ( in 3-component vector of uint GlobalInvocationID) // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 84 +// Generated by (magic number): 80006 +// Id's are bound by 85 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint GLCompute 4 "main" 79 + EntryPoint GLCompute 4 "main" 80 ExecutionMode 4 LocalSize 1 1 1 Source HLSL 500 Name 4 "main" @@ -205,15 +205,15 @@ Name 26 "csb@count" MemberName 26(csb@count) 0 "@count" Name 28 "csb@count" - Name 48 "coord" - Name 52 "storeTemp" - Name 57 "outtx" - Name 63 "rwsb" - MemberName 63(rwsb) 0 "@data" - Name 65 "rwsb" - Name 77 "nThreadId" - Name 79 "nThreadId" - Name 81 "param" + Name 49 "coord" + Name 53 "storeTemp" + Name 58 "outtx" + Name 64 "rwsb" + MemberName 64(rwsb) 0 "@data" + Name 66 "rwsb" + Name 78 "nThreadId" + Name 80 "nThreadId" + Name 82 "param" MemberDecorate 19(sb_t) 0 Offset 0 MemberDecorate 19(sb_t) 1 Offset 16 Decorate 20 ArrayStride 32 @@ -224,12 +224,12 @@ MemberDecorate 26(csb@count) 0 Offset 0 Decorate 26(csb@count) BufferBlock Decorate 28(csb@count) DescriptorSet 0 - Decorate 57(outtx) DescriptorSet 0 - Decorate 62 ArrayStride 16 - MemberDecorate 63(rwsb) 0 Offset 0 - Decorate 63(rwsb) BufferBlock - Decorate 65(rwsb) DescriptorSet 0 - Decorate 79(nThreadId) BuiltIn GlobalInvocationId + Decorate 58(outtx) DescriptorSet 0 + Decorate 63 ArrayStride 16 + MemberDecorate 64(rwsb) 0 Offset 0 + Decorate 64(rwsb) BufferBlock + Decorate 66(rwsb) DescriptorSet 0 + Decorate 80(nThreadId) BuiltIn GlobalInvocationId 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 0 @@ -248,79 +248,80 @@ 23(csb): 22(ptr) Variable Uniform 24: TypeInt 32 1 25: 24(int) Constant 0 - 26(csb@count): TypeStruct 24(int) + 26(csb@count): TypeStruct 6(int) 27: TypePointer Uniform 26(csb@count) 28(csb@count): 27(ptr) Variable Uniform - 29: TypePointer Uniform 24(int) - 31: 24(int) Constant 4294967295 + 29: TypePointer Uniform 6(int) + 31: 6(int) Constant 4294967295 32: 6(int) Constant 1 33: 6(int) Constant 0 - 36: TypePointer Uniform 19(sb_t) - 40: TypePointer Function 14(fvec4) - 43: 24(int) Constant 1 - 44: TypePointer Function 15(ivec2) - 46: TypeVector 13(float) 2 - 47: TypePointer Function 46(fvec2) - 55: TypeImage 13(float) 2D nonsampled format:Rgba32f - 56: TypePointer UniformConstant 55 - 57(outtx): 56(ptr) Variable UniformConstant - 62: TypeRuntimeArray 14(fvec4) - 63(rwsb): TypeStruct 62 - 64: TypePointer Uniform 63(rwsb) - 65(rwsb): 64(ptr) Variable Uniform - 66: TypePointer Function 13(float) - 73: TypePointer Uniform 14(fvec4) - 78: TypePointer Input 7(ivec3) - 79(nThreadId): 78(ptr) Variable Input + 35: 24(int) Constant 4294967295 + 37: TypePointer Uniform 19(sb_t) + 41: TypePointer Function 14(fvec4) + 44: 24(int) Constant 1 + 45: TypePointer Function 15(ivec2) + 47: TypeVector 13(float) 2 + 48: TypePointer Function 47(fvec2) + 56: TypeImage 13(float) 2D nonsampled format:Rgba32f + 57: TypePointer UniformConstant 56 + 58(outtx): 57(ptr) Variable UniformConstant + 63: TypeRuntimeArray 14(fvec4) + 64(rwsb): TypeStruct 63 + 65: TypePointer Uniform 64(rwsb) + 66(rwsb): 65(ptr) Variable Uniform + 67: TypePointer Function 13(float) + 74: TypePointer Uniform 14(fvec4) + 79: TypePointer Input 7(ivec3) + 80(nThreadId): 79(ptr) Variable Input 4(main): 2 Function None 3 5: Label - 77(nThreadId): 8(ptr) Variable Function - 81(param): 8(ptr) Variable Function - 80: 7(ivec3) Load 79(nThreadId) - Store 77(nThreadId) 80 - 82: 7(ivec3) Load 77(nThreadId) - Store 81(param) 82 - 83: 2 FunctionCall 11(@main(vu3;) 81(param) + 78(nThreadId): 8(ptr) Variable Function + 82(param): 8(ptr) Variable Function + 81: 7(ivec3) Load 80(nThreadId) + Store 78(nThreadId) 81 + 83: 7(ivec3) Load 78(nThreadId) + Store 82(param) 83 + 84: 2 FunctionCall 11(@main(vu3;) 82(param) Return FunctionEnd 11(@main(vu3;): 2 Function None 9 10(nThreadId): 8(ptr) FunctionParameter 12: Label 18(data): 17(ptr) Variable Function - 48(coord): 47(ptr) Variable Function - 52(storeTemp): 40(ptr) Variable Function + 49(coord): 48(ptr) Variable Function + 53(storeTemp): 41(ptr) Variable Function 30: 29(ptr) AccessChain 28(csb@count) 25 34: 6(int) AtomicIAdd 30 32 33 31 - 35: 6(int) IAdd 34 31 - 37: 36(ptr) AccessChain 23(csb) 25 35 - 38: 19(sb_t) Load 37 - 39: 14(fvec4) CompositeExtract 38 0 - 41: 40(ptr) AccessChain 18(data) 25 - Store 41 39 - 42: 15(ivec2) CompositeExtract 38 1 - 45: 44(ptr) AccessChain 18(data) 43 - Store 45 42 - 49: 44(ptr) AccessChain 18(data) 43 - 50: 15(ivec2) Load 49 - 51: 46(fvec2) ConvertUToF 50 - Store 48(coord) 51 - 53: 40(ptr) AccessChain 18(data) 25 - 54: 14(fvec4) Load 53 - Store 52(storeTemp) 54 - 58: 55 Load 57(outtx) - 59: 46(fvec2) Load 48(coord) - 60: 15(ivec2) ConvertFToU 59 - 61: 14(fvec4) Load 52(storeTemp) - ImageWrite 58 60 61 - 67: 66(ptr) AccessChain 48(coord) 33 - 68: 13(float) Load 67 - 69: 6(int) ConvertFToU 68 - 70: 66(ptr) AccessChain 48(coord) 32 - 71: 13(float) Load 70 - 72: 6(int) ConvertFToU 71 - 74: 73(ptr) AccessChain 65(rwsb) 25 72 - 75: 14(fvec4) Load 74 - 76: 73(ptr) AccessChain 65(rwsb) 25 69 - Store 76 75 + 36: 6(int) IAdd 34 35 + 38: 37(ptr) AccessChain 23(csb) 25 36 + 39: 19(sb_t) Load 38 + 40: 14(fvec4) CompositeExtract 39 0 + 42: 41(ptr) AccessChain 18(data) 25 + Store 42 40 + 43: 15(ivec2) CompositeExtract 39 1 + 46: 45(ptr) AccessChain 18(data) 44 + Store 46 43 + 50: 45(ptr) AccessChain 18(data) 44 + 51: 15(ivec2) Load 50 + 52: 47(fvec2) ConvertUToF 51 + Store 49(coord) 52 + 54: 41(ptr) AccessChain 18(data) 25 + 55: 14(fvec4) Load 54 + Store 53(storeTemp) 55 + 59: 56 Load 58(outtx) + 60: 47(fvec2) Load 49(coord) + 61: 15(ivec2) ConvertFToU 60 + 62: 14(fvec4) Load 53(storeTemp) + ImageWrite 59 61 62 + 68: 67(ptr) AccessChain 49(coord) 33 + 69: 13(float) Load 68 + 70: 6(int) ConvertFToU 69 + 71: 67(ptr) AccessChain 49(coord) 32 + 72: 13(float) Load 71 + 73: 6(int) ConvertFToU 72 + 75: 74(ptr) AccessChain 66(rwsb) 25 73 + 76: 14(fvec4) Load 75 + 77: 74(ptr) AccessChain 66(rwsb) 25 70 + Store 77 76 Return FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.fn2.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.fn2.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.fn2.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.fn2.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -5,7 +5,7 @@ 0:5 Function Definition: testLoad(u1;block--u1[0]1; ( temp 2-component vector of uint) 0:5 Function Parameters: 0:5 'loc' ( in uint) -0:5 'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:5 'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? Sequence 0:6 Sequence 0:6 move second child to first child ( temp 2-component vector of uint) @@ -19,14 +19,14 @@ 0:6 2 (const int) 0:? Construct vec2 ( temp 2-component vector of uint) 0:6 indirect index ( temp uint) -0:6 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:6 'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:6 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:6 'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:6 Constant: 0:6 0 (const uint) 0:6 'byteAddrTemp' ( temp int) 0:6 indirect index ( temp uint) -0:6 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:6 'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:6 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:6 'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:6 Constant: 0:6 0 (const uint) 0:6 add ( temp int) @@ -44,7 +44,7 @@ 0:13 'result' ( temp 2-component vector of uint) 0:13 Function Call: testLoad(u1;block--u1[0]1; ( temp 2-component vector of uint) 0:13 'dispatchId' ( in uint) -0:13 'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:13 'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:14 Sequence 0:14 imageStore ( temp void) 0:14 'g_output' (layout( binding=1 rg32ui) uniform uimageBuffer) @@ -60,7 +60,7 @@ 0:12 Function Call: @main(u1; ( temp void) 0:? 'dispatchId' ( temp uint) 0:? Linker Objects -0:? 'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? 'g_output' (layout( binding=1 rg32ui) uniform uimageBuffer) 0:? 'dispatchId' ( in uint GlobalInvocationID) @@ -74,7 +74,7 @@ 0:5 Function Definition: testLoad(u1;block--u1[0]1; ( temp 2-component vector of uint) 0:5 Function Parameters: 0:5 'loc' ( in uint) -0:5 'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:5 'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? Sequence 0:6 Sequence 0:6 move second child to first child ( temp 2-component vector of uint) @@ -88,14 +88,14 @@ 0:6 2 (const int) 0:? Construct vec2 ( temp 2-component vector of uint) 0:6 indirect index ( temp uint) -0:6 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:6 'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:6 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:6 'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:6 Constant: 0:6 0 (const uint) 0:6 'byteAddrTemp' ( temp int) 0:6 indirect index ( temp uint) -0:6 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:6 'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:6 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:6 'buffer' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:6 Constant: 0:6 0 (const uint) 0:6 add ( temp int) @@ -113,7 +113,7 @@ 0:13 'result' ( temp 2-component vector of uint) 0:13 Function Call: testLoad(u1;block--u1[0]1; ( temp 2-component vector of uint) 0:13 'dispatchId' ( in uint) -0:13 'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:13 'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:14 Sequence 0:14 imageStore ( temp void) 0:14 'g_output' (layout( binding=1 rg32ui) uniform uimageBuffer) @@ -129,12 +129,12 @@ 0:12 Function Call: @main(u1; ( temp void) 0:? 'dispatchId' ( temp uint) 0:? Linker Objects -0:? 'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 'g_input' (layout( binding=0 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? 'g_output' (layout( binding=1 rg32ui) uniform uimageBuffer) 0:? 'dispatchId' ( in uint GlobalInvocationID) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 61 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.fn.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.fn.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.fn.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.fn.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -4,27 +4,27 @@ 0:? Sequence 0:5 Function Definition: get(block--vu4[0]1;u1; ( temp 4-component vector of uint) 0:5 Function Parameters: -0:5 'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:5 'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:5 'bufferOffset' ( in uint) 0:? Sequence 0:6 Branch: Return with expression 0:6 indirect index (layout( row_major std430) buffer 4-component vector of uint) -0:6 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint) -0:6 'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:6 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint) +0:6 'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:6 Constant: 0:6 0 (const uint) 0:6 'bufferOffset' ( in uint) 0:10 Function Definition: set(block--vu4[0]1;u1;vu4; ( temp void) 0:10 Function Parameters: -0:10 'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) -0:10 'sb@count' ( buffer block{layout( row_major std430) buffer int @count}) +0:10 'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) +0:10 'sb@count' ( buffer block{layout( row_major std430) buffer uint @count}) 0:10 'bufferOffset' ( in uint) 0:10 'data' ( in 4-component vector of uint) 0:? Sequence 0:11 move second child to first child ( temp 4-component vector of uint) 0:11 indirect index ( buffer 4-component vector of uint) -0:11 @data: direct index for structure ( buffer implicitly-sized array of 4-component vector of uint) -0:11 'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:11 @data: direct index for structure ( buffer unsized 1-element array of 4-component vector of uint) +0:11 'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 'bufferOffset' ( in uint) @@ -34,12 +34,12 @@ 0:20 'pos' ( in uint) 0:? Sequence 0:21 Function Call: set(block--vu4[0]1;u1;vu4; ( temp void) -0:21 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) -0:21 'sbuf2@count' ( buffer block{layout( row_major std430) buffer int @count}) +0:21 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) +0:21 'sbuf2@count' ( buffer block{layout( row_major std430) buffer uint @count}) 0:21 Constant: 0:21 2 (const uint) 0:21 Function Call: get(block--vu4[0]1;u1; ( temp 4-component vector of uint) -0:21 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:21 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:21 Constant: 0:21 3 (const uint) 0:23 Branch: Return with expression @@ -59,10 +59,10 @@ 0:20 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) -0:? 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) -0:? 'sbuf2@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf3' (layout( binding=12 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 3-component vector of uint @data}) +0:? 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) +0:? 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) +0:? 'sbuf2@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf3' (layout( binding=12 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 3-component vector of uint @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) @@ -75,27 +75,27 @@ 0:? Sequence 0:5 Function Definition: get(block--vu4[0]1;u1; ( temp 4-component vector of uint) 0:5 Function Parameters: -0:5 'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:5 'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:5 'bufferOffset' ( in uint) 0:? Sequence 0:6 Branch: Return with expression 0:6 indirect index (layout( row_major std430) buffer 4-component vector of uint) -0:6 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint) -0:6 'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:6 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint) +0:6 'sb' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:6 Constant: 0:6 0 (const uint) 0:6 'bufferOffset' ( in uint) 0:10 Function Definition: set(block--vu4[0]1;u1;vu4; ( temp void) 0:10 Function Parameters: -0:10 'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) -0:10 'sb@count' ( buffer block{layout( row_major std430) buffer int @count}) +0:10 'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) +0:10 'sb@count' ( buffer block{layout( row_major std430) buffer uint @count}) 0:10 'bufferOffset' ( in uint) 0:10 'data' ( in 4-component vector of uint) 0:? Sequence 0:11 move second child to first child ( temp 4-component vector of uint) 0:11 indirect index ( buffer 4-component vector of uint) -0:11 @data: direct index for structure ( buffer implicitly-sized array of 4-component vector of uint) -0:11 'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:11 @data: direct index for structure ( buffer unsized 1-element array of 4-component vector of uint) +0:11 'sb' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 'bufferOffset' ( in uint) @@ -105,12 +105,12 @@ 0:20 'pos' ( in uint) 0:? Sequence 0:21 Function Call: set(block--vu4[0]1;u1;vu4; ( temp void) -0:21 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) -0:21 'sbuf2@count' ( buffer block{layout( row_major std430) buffer int @count}) +0:21 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) +0:21 'sbuf2@count' ( buffer block{layout( row_major std430) buffer uint @count}) 0:21 Constant: 0:21 2 (const uint) 0:21 Function Call: get(block--vu4[0]1;u1; ( temp 4-component vector of uint) -0:21 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:21 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:21 Constant: 0:21 3 (const uint) 0:23 Branch: Return with expression @@ -130,15 +130,15 @@ 0:20 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) -0:? 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) -0:? 'sbuf2@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf3' (layout( binding=12 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of 3-component vector of uint @data}) +0:? 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) +0:? 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) +0:? 'sbuf2@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf3' (layout( binding=12 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of 3-component vector of uint @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 78 Capability Shader @@ -155,15 +155,15 @@ Name 14 "bufferOffset" Name 18 "" MemberName 18 0 "@data" - Name 21 "" - MemberName 21 0 "@count" - Name 29 "set(block--vu4[0]1;u1;vu4;" - Name 25 "sb" - Name 26 "sb@count" - Name 27 "bufferOffset" - Name 28 "data" - Name 35 "@main(u1;" - Name 34 "pos" + Name 20 "" + MemberName 20 0 "@count" + Name 28 "set(block--vu4[0]1;u1;vu4;" + Name 24 "sb" + Name 25 "sb@count" + Name 26 "bufferOffset" + Name 27 "data" + Name 34 "@main(u1;" + Name 33 "pos" Name 47 "sbuf2" Name 48 "sbuf2@count" Name 50 "sbuf" @@ -188,7 +188,7 @@ Decorate 17 ArrayStride 16 MemberDecorate 18 0 Offset 0 Decorate 18 BufferBlock - Decorate 21 BufferBlock + Decorate 20 BufferBlock Decorate 47(sbuf2) DescriptorSet 0 Decorate 48(sbuf2@count) DescriptorSet 0 Decorate 50(sbuf) DescriptorSet 0 @@ -217,28 +217,28 @@ 17: TypeRuntimeArray 7(ivec4) 18: TypeStruct 17 19: TypePointer Uniform 18(struct) - 20: TypeInt 32 1 - 21: TypeStruct 20(int) - 22: TypePointer Uniform 21(struct) - 23: TypePointer Function 7(ivec4) - 24: TypeFunction 2 19(ptr) 22(ptr) 11(ptr) 23(ptr) - 31: TypeFloat 32 - 32: TypeVector 31(float) 4 - 33: TypeFunction 32(fvec4) 11(ptr) - 37: 20(int) Constant 0 + 20: TypeStruct 6(int) + 21: TypePointer Uniform 20(struct) + 22: TypePointer Function 7(ivec4) + 23: TypeFunction 2 19(ptr) 21(ptr) 11(ptr) 22(ptr) + 30: TypeFloat 32 + 31: TypeVector 30(float) 4 + 32: TypeFunction 31(fvec4) 11(ptr) + 36: TypeInt 32 1 + 37: 36(int) Constant 0 39: TypePointer Uniform 7(ivec4) 47(sbuf2): 19(ptr) Variable Uniform - 48(sbuf2@count): 22(ptr) Variable Uniform + 48(sbuf2@count): 21(ptr) Variable Uniform 49: 6(int) Constant 2 50(sbuf): 10(ptr) Variable Uniform 51: 6(int) Constant 3 - 57: 31(float) Constant 0 - 58: 32(fvec4) ConstantComposite 57 57 57 57 + 57: 30(float) Constant 0 + 58: 31(fvec4) ConstantComposite 57 57 57 57 62: TypePointer Input 6(int) 63(pos): 62(ptr) Variable Input - 65: TypePointer Output 32(fvec4) + 65: TypePointer Output 31(fvec4) 66(@entryPointOutput): 65(ptr) Variable Output - 70(sbuf2@count): TypeStruct 20(int) + 70(sbuf2@count): TypeStruct 6(int) 71: TypePointer Uniform 70(sbuf2@count) 72(sbuf2@count): 71(ptr) Variable Uniform 73: TypeVector 6(int) 3 @@ -254,7 +254,7 @@ Store 61(pos) 64 68: 6(int) Load 61(pos) Store 67(param) 68 - 69: 32(fvec4) FunctionCall 35(@main(u1;) 67(param) + 69: 31(fvec4) FunctionCall 34(@main(u1;) 67(param) Store 66(@entryPointOutput) 69 Return FunctionEnd @@ -267,28 +267,28 @@ 41: 7(ivec4) Load 40 ReturnValue 41 FunctionEnd -29(set(block--vu4[0]1;u1;vu4;): 2 Function None 24 - 25(sb): 19(ptr) FunctionParameter - 26(sb@count): 22(ptr) FunctionParameter -27(bufferOffset): 11(ptr) FunctionParameter - 28(data): 23(ptr) FunctionParameter - 30: Label - 44: 6(int) Load 27(bufferOffset) - 45: 7(ivec4) Load 28(data) - 46: 39(ptr) AccessChain 25(sb) 37 44 +28(set(block--vu4[0]1;u1;vu4;): 2 Function None 23 + 24(sb): 19(ptr) FunctionParameter + 25(sb@count): 21(ptr) FunctionParameter +26(bufferOffset): 11(ptr) FunctionParameter + 27(data): 22(ptr) FunctionParameter + 29: Label + 44: 6(int) Load 26(bufferOffset) + 45: 7(ivec4) Load 27(data) + 46: 39(ptr) AccessChain 24(sb) 37 44 Store 46 45 Return FunctionEnd - 35(@main(u1;): 32(fvec4) Function None 33 - 34(pos): 11(ptr) FunctionParameter - 36: Label + 34(@main(u1;): 31(fvec4) Function None 32 + 33(pos): 11(ptr) FunctionParameter + 35: Label 52(param): 11(ptr) Variable Function 54(param): 11(ptr) Variable Function - 55(param): 23(ptr) Variable Function + 55(param): 22(ptr) Variable Function Store 52(param) 51 53: 7(ivec4) FunctionCall 15(get(block--vu4[0]1;u1;) 50(sbuf) 52(param) Store 54(param) 49 Store 55(param) 53 - 56: 2 FunctionCall 29(set(block--vu4[0]1;u1;vu4;) 47(sbuf2) 48(sbuf2@count) 54(param) 55(param) + 56: 2 FunctionCall 28(set(block--vu4[0]1;u1;vu4;) 47(sbuf2) 48(sbuf2@count) 54(param) 55(param) ReturnValue 58 FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -10,8 +10,8 @@ 0:13 move second child to first child ( temp structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) 0:13 'mydata' ( temp structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) 0:13 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:13 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:13 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) +0:13 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) +0:13 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) 0:13 Constant: 0:13 0 (const uint) 0:13 'pos' ( in uint) @@ -19,8 +19,8 @@ 0:17 move second child to first child ( temp uint) 0:17 'size' ( temp uint) 0:17 array length ( temp uint) -0:17 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:17 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) +0:17 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) 0:17 Constant: 0:17 0 (const uint) 0:17 move second child to first child ( temp uint) @@ -31,8 +31,8 @@ 0:19 Condition 0:19 test: direct index for structure ( temp bool) 0:19 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:19 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:19 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) +0:19 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) 0:19 Constant: 0:19 0 (const uint) 0:19 'pos' ( in uint) @@ -44,16 +44,16 @@ 0:20 add ( temp 3-component vector of float) 0:20 color: direct index for structure ( temp 3-component vector of float) 0:20 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:20 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) +0:20 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 'pos' ( in uint) 0:20 Constant: 0:20 0 (const int) 0:20 indirect index (layout( row_major std430) buffer float) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float) -0:20 'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float) +0:20 'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 'pos' ( in uint) @@ -86,8 +86,8 @@ 0:12 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) -0:? 'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:? 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) +0:? 'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) @@ -106,8 +106,8 @@ 0:13 move second child to first child ( temp structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) 0:13 'mydata' ( temp structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) 0:13 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:13 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:13 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) +0:13 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) +0:13 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) 0:13 Constant: 0:13 0 (const uint) 0:13 'pos' ( in uint) @@ -115,8 +115,8 @@ 0:17 move second child to first child ( temp uint) 0:17 'size' ( temp uint) 0:17 array length ( temp uint) -0:17 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:17 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) +0:17 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) 0:17 Constant: 0:17 0 (const uint) 0:17 move second child to first child ( temp uint) @@ -127,8 +127,8 @@ 0:19 Condition 0:19 test: direct index for structure ( temp bool) 0:19 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:19 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:19 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) +0:19 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) 0:19 Constant: 0:19 0 (const uint) 0:19 'pos' ( in uint) @@ -140,16 +140,16 @@ 0:20 add ( temp 3-component vector of float) 0:20 color: direct index for structure ( temp 3-component vector of float) 0:20 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) -0:20 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2}) +0:20 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 'pos' ( in uint) 0:20 Constant: 0:20 0 (const int) 0:20 indirect index (layout( row_major std430) buffer float) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float) -0:20 'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float) +0:20 'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 'pos' ( in uint) @@ -182,13 +182,13 @@ 0:12 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) -0:? 'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:? 'sbuf' (layout( binding=10 row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test, temp bool test2} @data}) +0:? 'sbuf2' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 96 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,125 @@ +hlsl.structbuffer.incdec.frag +// Module Version 10000 +// Generated by (magic number): 80006 +// Id's are bound by 70 + + Capability Shader + Extension "SPV_GOOGLE_hlsl_functionality1" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 63 66 + ExecutionMode 4 OriginUpperLeft + Source HLSL 500 + Name 4 "main" + Name 12 "@main(u1;" + Name 11 "pos" + Name 16 "result" + Name 20 "sbuf_rw_i" + MemberName 20(sbuf_rw_i) 0 "@data" + Name 22 "sbuf_rw_i" + Name 26 "sbuf_rw_d" + Name 27 "sbuf_rw_nocounter" + Name 33 "c1" + Name 34 "sbuf_rw_i@count" + MemberName 34(sbuf_rw_i@count) 0 "@count" + Name 36 "sbuf_rw_i@count" + Name 41 "c2" + Name 42 "sbuf_rw_d@count" + Name 61 "pos" + Name 63 "pos" + Name 66 "@entryPointOutput" + Name 67 "param" + Decorate 19 ArrayStride 16 + MemberDecorate 20(sbuf_rw_i) 0 Offset 0 + Decorate 20(sbuf_rw_i) BufferBlock + Decorate 22(sbuf_rw_i) DescriptorSet 0 + Decorate 26(sbuf_rw_d) DescriptorSet 0 + Decorate 27(sbuf_rw_nocounter) DescriptorSet 0 + MemberDecorate 34(sbuf_rw_i@count) 0 Offset 0 + Decorate 34(sbuf_rw_i@count) BufferBlock + Decorate 36(sbuf_rw_i@count) DescriptorSet 0 + Decorate 42(sbuf_rw_d@count) DescriptorSet 0 + Decorate 63(pos) Flat + Decorate 63(pos) Location 0 + DecorateStringGOOGLE 63(pos) DecorationHlslSemanticGOOGLE "FOO" + Decorate 66(@entryPointOutput) Location 0 + DecorateStringGOOGLE 66(@entryPointOutput) DecorationHlslSemanticGOOGLE "SV_TARGET0" + DecorateId 22(sbuf_rw_i) DecorationHlslCounterBufferGOOGLE 36(sbuf_rw_i@count) + DecorateId 26(sbuf_rw_d) DecorationHlslCounterBufferGOOGLE 42(sbuf_rw_d@count) + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypePointer Function 6(int) + 8: TypeFloat 32 + 9: TypeVector 8(float) 4 + 10: TypeFunction 9(fvec4) 7(ptr) + 14: TypeVector 6(int) 4 + 15: TypePointer Function 14(ivec4) + 17: 6(int) Constant 0 + 18: 14(ivec4) ConstantComposite 17 17 17 17 + 19: TypeRuntimeArray 14(ivec4) + 20(sbuf_rw_i): TypeStruct 19 + 21: TypePointer Uniform 20(sbuf_rw_i) + 22(sbuf_rw_i): 21(ptr) Variable Uniform + 23: TypeInt 32 1 + 24: 23(int) Constant 0 + 25: 23(int) Constant 7 + 26(sbuf_rw_d): 21(ptr) Variable Uniform +27(sbuf_rw_nocounter): 21(ptr) Variable Uniform + 28: 23(int) Constant 5 + 29: 6(int) Constant 2 + 30: 14(ivec4) ConstantComposite 29 29 29 29 + 31: TypePointer Uniform 14(ivec4) +34(sbuf_rw_i@count): TypeStruct 6(int) + 35: TypePointer Uniform 34(sbuf_rw_i@count) +36(sbuf_rw_i@count): 35(ptr) Variable Uniform + 37: TypePointer Uniform 6(int) + 39: 6(int) Constant 1 +42(sbuf_rw_d@count): 35(ptr) Variable Uniform + 44: 6(int) Constant 4294967295 + 46: 23(int) Constant 4294967295 + 62: TypePointer Input 6(int) + 63(pos): 62(ptr) Variable Input + 65: TypePointer Output 9(fvec4) +66(@entryPointOutput): 65(ptr) Variable Output + 4(main): 2 Function None 3 + 5: Label + 61(pos): 7(ptr) Variable Function + 67(param): 7(ptr) Variable Function + 64: 6(int) Load 63(pos) + Store 61(pos) 64 + 68: 6(int) Load 61(pos) + Store 67(param) 68 + 69: 9(fvec4) FunctionCall 12(@main(u1;) 67(param) + Store 66(@entryPointOutput) 69 + Return + FunctionEnd + 12(@main(u1;): 9(fvec4) Function None 10 + 11(pos): 7(ptr) FunctionParameter + 13: Label + 16(result): 15(ptr) Variable Function + 33(c1): 7(ptr) Variable Function + 41(c2): 7(ptr) Variable Function + Store 16(result) 18 + 32: 31(ptr) AccessChain 27(sbuf_rw_nocounter) 24 28 + Store 32 30 + 38: 37(ptr) AccessChain 36(sbuf_rw_i@count) 24 + 40: 6(int) AtomicIAdd 38 39 17 39 + Store 33(c1) 40 + 43: 37(ptr) AccessChain 42(sbuf_rw_d@count) 24 + 45: 6(int) AtomicIAdd 43 39 17 44 + 47: 6(int) IAdd 45 46 + Store 41(c2) 47 + 48: 7(ptr) AccessChain 16(result) 17 + 49: 6(int) Load 48 + 50: 8(float) ConvertUToF 49 + 51: 7(ptr) AccessChain 16(result) 39 + 52: 6(int) Load 51 + 53: 8(float) ConvertUToF 52 + 54: 6(int) Load 33(c1) + 55: 8(float) ConvertUToF 54 + 56: 6(int) Load 41(c2) + 57: 8(float) ConvertUToF 56 + 58: 9(fvec4) CompositeConstruct 50 53 55 57 + ReturnValue 58 + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.incdec.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.incdec.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.incdec.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.incdec.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -15,23 +15,23 @@ 0:8 0 (const uint) 0:8 0 (const uint) 0:10 direct index (layout( row_major std430) buffer 4-component vector of uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint) -0:10 'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint) +0:10 'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 Constant: 0:10 7 (const int) 0:11 direct index (layout( row_major std430) buffer 4-component vector of uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint) -0:11 'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint) +0:11 'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 Constant: 0:11 7 (const int) 0:13 move second child to first child ( temp 4-component vector of uint) 0:13 direct index (layout( row_major std430) buffer 4-component vector of uint) -0:13 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint) -0:13 'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:13 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint) +0:13 'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:13 Constant: 0:13 0 (const uint) 0:13 Constant: @@ -45,23 +45,23 @@ 0:15 move second child to first child ( temp uint) 0:15 'c1' ( temp uint) 0:15 AtomicAdd ( temp uint) -0:15 @count: direct index for structure ( temp int) -0:15 'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) +0:15 @count: direct index for structure ( temp uint) +0:15 'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) 0:15 Constant: 0:15 0 (const int) 0:15 Constant: -0:15 1 (const int) +0:15 1 (const uint) 0:16 Sequence 0:16 move second child to first child ( temp uint) 0:16 'c2' ( temp uint) 0:16 add ( temp uint) 0:16 AtomicAdd ( temp uint) -0:16 @count: direct index for structure ( temp int) -0:16 'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) +0:16 @count: direct index for structure ( temp uint) +0:16 'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) 0:16 Constant: 0:16 0 (const int) 0:16 Constant: -0:16 -1 (const int) +0:16 4294967295 (const uint) 0:16 Constant: 0:16 -1 (const int) 0:18 Branch: Return with expression @@ -91,11 +91,11 @@ 0:7 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) -0:? 'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) -0:? 'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:? 'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) +0:? 'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) +0:? 'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) @@ -119,23 +119,23 @@ 0:8 0 (const uint) 0:8 0 (const uint) 0:10 direct index (layout( row_major std430) buffer 4-component vector of uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint) -0:10 'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint) +0:10 'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 Constant: 0:10 7 (const int) 0:11 direct index (layout( row_major std430) buffer 4-component vector of uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint) -0:11 'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint) +0:11 'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 Constant: 0:11 7 (const int) 0:13 move second child to first child ( temp 4-component vector of uint) 0:13 direct index (layout( row_major std430) buffer 4-component vector of uint) -0:13 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint) -0:13 'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:13 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint) +0:13 'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:13 Constant: 0:13 0 (const uint) 0:13 Constant: @@ -149,23 +149,23 @@ 0:15 move second child to first child ( temp uint) 0:15 'c1' ( temp uint) 0:15 AtomicAdd ( temp uint) -0:15 @count: direct index for structure ( temp int) -0:15 'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) +0:15 @count: direct index for structure ( temp uint) +0:15 'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) 0:15 Constant: 0:15 0 (const int) 0:15 Constant: -0:15 1 (const int) +0:15 1 (const uint) 0:16 Sequence 0:16 move second child to first child ( temp uint) 0:16 'c2' ( temp uint) 0:16 add ( temp uint) 0:16 AtomicAdd ( temp uint) -0:16 @count: direct index for structure ( temp int) -0:16 'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) +0:16 @count: direct index for structure ( temp uint) +0:16 'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) 0:16 Constant: 0:16 0 (const int) 0:16 Constant: -0:16 -1 (const int) +0:16 4294967295 (const uint) 0:16 Constant: 0:16 -1 (const int) 0:18 Branch: Return with expression @@ -195,16 +195,16 @@ 0:7 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) -0:? 'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) -0:? 'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer int @count}) -0:? 'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of 4-component vector of uint @data}) +0:? 'sbuf_rw_i' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) +0:? 'sbuf_rw_i@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf_rw_d' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) +0:? 'sbuf_rw_d@count' (layout( row_major std430) buffer block{layout( row_major std430) buffer uint @count}) +0:? 'sbuf_rw_nocounter' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of 4-component vector of uint @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 70 Capability Shader @@ -226,8 +226,8 @@ Name 34 "sbuf_rw_i@count" MemberName 34(sbuf_rw_i@count) 0 "@count" Name 36 "sbuf_rw_i@count" - Name 42 "c2" - Name 43 "sbuf_rw_d@count" + Name 41 "c2" + Name 42 "sbuf_rw_d@count" Name 61 "pos" Name 63 "pos" Name 66 "@entryPointOutput" @@ -241,7 +241,7 @@ MemberDecorate 34(sbuf_rw_i@count) 0 Offset 0 Decorate 34(sbuf_rw_i@count) BufferBlock Decorate 36(sbuf_rw_i@count) DescriptorSet 0 - Decorate 43(sbuf_rw_d@count) DescriptorSet 0 + Decorate 42(sbuf_rw_d@count) DescriptorSet 0 Decorate 63(pos) Flat Decorate 63(pos) Location 0 Decorate 66(@entryPointOutput) Location 0 @@ -269,14 +269,14 @@ 29: 6(int) Constant 2 30: 14(ivec4) ConstantComposite 29 29 29 29 31: TypePointer Uniform 14(ivec4) -34(sbuf_rw_i@count): TypeStruct 23(int) +34(sbuf_rw_i@count): TypeStruct 6(int) 35: TypePointer Uniform 34(sbuf_rw_i@count) 36(sbuf_rw_i@count): 35(ptr) Variable Uniform - 37: TypePointer Uniform 23(int) - 39: 23(int) Constant 1 - 40: 6(int) Constant 1 -43(sbuf_rw_d@count): 35(ptr) Variable Uniform - 45: 23(int) Constant 4294967295 + 37: TypePointer Uniform 6(int) + 39: 6(int) Constant 1 +42(sbuf_rw_d@count): 35(ptr) Variable Uniform + 44: 6(int) Constant 4294967295 + 46: 23(int) Constant 4294967295 62: TypePointer Input 6(int) 63(pos): 62(ptr) Variable Input 65: TypePointer Output 9(fvec4) @@ -298,26 +298,26 @@ 13: Label 16(result): 15(ptr) Variable Function 33(c1): 7(ptr) Variable Function - 42(c2): 7(ptr) Variable Function + 41(c2): 7(ptr) Variable Function Store 16(result) 18 32: 31(ptr) AccessChain 27(sbuf_rw_nocounter) 24 28 Store 32 30 38: 37(ptr) AccessChain 36(sbuf_rw_i@count) 24 - 41: 6(int) AtomicIAdd 38 40 17 39 - Store 33(c1) 41 - 44: 37(ptr) AccessChain 43(sbuf_rw_d@count) 24 - 46: 6(int) AtomicIAdd 44 40 17 45 - 47: 6(int) IAdd 46 45 - Store 42(c2) 47 + 40: 6(int) AtomicIAdd 38 39 17 39 + Store 33(c1) 40 + 43: 37(ptr) AccessChain 42(sbuf_rw_d@count) 24 + 45: 6(int) AtomicIAdd 43 39 17 44 + 47: 6(int) IAdd 45 46 + Store 41(c2) 47 48: 7(ptr) AccessChain 16(result) 17 49: 6(int) Load 48 50: 8(float) ConvertUToF 49 - 51: 7(ptr) AccessChain 16(result) 40 + 51: 7(ptr) AccessChain 16(result) 39 52: 6(int) Load 51 53: 8(float) ConvertUToF 52 54: 6(int) Load 33(c1) 55: 8(float) ConvertUToF 54 - 56: 6(int) Load 42(c2) + 56: 6(int) Load 41(c2) 57: 8(float) ConvertUToF 56 58: 9(fvec4) CompositeConstruct 50 53 55 57 ReturnValue 58 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -10,8 +10,8 @@ 0:7 move second child to first child ( temp uint) 0:7 'size' ( temp uint) 0:7 array length ( temp uint) -0:7 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:7 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:7 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:7 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:7 Constant: 0:7 0 (const uint) 0:? Sequence @@ -23,14 +23,14 @@ 0:9 2 (const int) 0:9 move second child to first child ( temp uint) 0:9 indirect index (layout( row_major std430) buffer uint) -0:9 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:9 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:9 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:9 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:9 Constant: 0:9 0 (const uint) 0:9 'byteAddrTemp' ( temp int) 0:9 indirect index (layout( row_major std430) buffer uint) -0:9 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:9 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:9 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:9 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:9 Constant: 0:9 0 (const uint) 0:9 right-shift ( temp int) @@ -46,8 +46,8 @@ 0:10 2 (const int) 0:10 move second child to first child ( temp uint) 0:10 indirect index (layout( row_major std430) buffer uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 'byteAddrTemp' ( temp int) @@ -61,14 +61,14 @@ 0:10 2 (const int) 0:? Construct vec2 ( temp 2-component vector of uint) 0:10 indirect index ( temp uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 'byteAddrTemp' ( temp int) 0:10 indirect index ( temp uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 add ( temp int) @@ -79,8 +79,8 @@ 0:10 0 (const int) 0:10 move second child to first child ( temp uint) 0:10 indirect index (layout( row_major std430) buffer uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 add ( temp int) @@ -97,14 +97,14 @@ 0:10 2 (const int) 0:? Construct vec2 ( temp 2-component vector of uint) 0:10 indirect index ( temp uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 'byteAddrTemp' ( temp int) 0:10 indirect index ( temp uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 add ( temp int) @@ -122,8 +122,8 @@ 0:11 2 (const int) 0:11 move second child to first child ( temp uint) 0:11 indirect index (layout( row_major std430) buffer uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 'byteAddrTemp' ( temp int) @@ -137,14 +137,14 @@ 0:11 2 (const int) 0:? Construct vec3 ( temp 3-component vector of uint) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 'byteAddrTemp' ( temp int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -152,8 +152,8 @@ 0:11 Constant: 0:11 1 (const int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -164,8 +164,8 @@ 0:11 0 (const int) 0:11 move second child to first child ( temp uint) 0:11 indirect index (layout( row_major std430) buffer uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -182,14 +182,14 @@ 0:11 2 (const int) 0:? Construct vec3 ( temp 3-component vector of uint) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 'byteAddrTemp' ( temp int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -197,8 +197,8 @@ 0:11 Constant: 0:11 1 (const int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -209,8 +209,8 @@ 0:11 1 (const int) 0:11 move second child to first child ( temp uint) 0:11 indirect index (layout( row_major std430) buffer uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -227,14 +227,14 @@ 0:11 2 (const int) 0:? Construct vec3 ( temp 3-component vector of uint) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 'byteAddrTemp' ( temp int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -242,8 +242,8 @@ 0:11 Constant: 0:11 1 (const int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -261,8 +261,8 @@ 0:12 2 (const int) 0:12 move second child to first child ( temp uint) 0:12 indirect index (layout( row_major std430) buffer uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 'byteAddrTemp' ( temp int) @@ -276,14 +276,14 @@ 0:12 2 (const int) 0:? Construct vec4 ( temp 4-component vector of uint) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 'byteAddrTemp' ( temp int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -291,8 +291,8 @@ 0:12 Constant: 0:12 1 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -300,8 +300,8 @@ 0:12 Constant: 0:12 2 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -312,8 +312,8 @@ 0:12 0 (const int) 0:12 move second child to first child ( temp uint) 0:12 indirect index (layout( row_major std430) buffer uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -330,14 +330,14 @@ 0:12 2 (const int) 0:? Construct vec4 ( temp 4-component vector of uint) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 'byteAddrTemp' ( temp int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -345,8 +345,8 @@ 0:12 Constant: 0:12 1 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -354,8 +354,8 @@ 0:12 Constant: 0:12 2 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -366,8 +366,8 @@ 0:12 1 (const int) 0:12 move second child to first child ( temp uint) 0:12 indirect index (layout( row_major std430) buffer uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -384,14 +384,14 @@ 0:12 2 (const int) 0:? Construct vec4 ( temp 4-component vector of uint) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 'byteAddrTemp' ( temp int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -399,8 +399,8 @@ 0:12 Constant: 0:12 1 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -408,8 +408,8 @@ 0:12 Constant: 0:12 2 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -420,8 +420,8 @@ 0:12 2 (const int) 0:12 move second child to first child ( temp uint) 0:12 indirect index (layout( row_major std430) buffer uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -438,14 +438,14 @@ 0:12 2 (const int) 0:? Construct vec4 ( temp 4-component vector of uint) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 'byteAddrTemp' ( temp int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -453,8 +453,8 @@ 0:12 Constant: 0:12 1 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -462,8 +462,8 @@ 0:12 Constant: 0:12 2 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -476,8 +476,8 @@ 0:14 Construct vec4 ( temp 4-component vector of float) 0:14 Convert uint to float ( temp float) 0:14 indirect index (layout( row_major std430) buffer uint) -0:14 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:14 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:14 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:14 Constant: 0:14 0 (const uint) 0:14 right-shift ( temp int) @@ -495,7 +495,7 @@ 0:5 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) @@ -514,8 +514,8 @@ 0:7 move second child to first child ( temp uint) 0:7 'size' ( temp uint) 0:7 array length ( temp uint) -0:7 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:7 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:7 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:7 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:7 Constant: 0:7 0 (const uint) 0:? Sequence @@ -527,14 +527,14 @@ 0:9 2 (const int) 0:9 move second child to first child ( temp uint) 0:9 indirect index (layout( row_major std430) buffer uint) -0:9 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:9 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:9 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:9 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:9 Constant: 0:9 0 (const uint) 0:9 'byteAddrTemp' ( temp int) 0:9 indirect index (layout( row_major std430) buffer uint) -0:9 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:9 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:9 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:9 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:9 Constant: 0:9 0 (const uint) 0:9 right-shift ( temp int) @@ -550,8 +550,8 @@ 0:10 2 (const int) 0:10 move second child to first child ( temp uint) 0:10 indirect index (layout( row_major std430) buffer uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 'byteAddrTemp' ( temp int) @@ -565,14 +565,14 @@ 0:10 2 (const int) 0:? Construct vec2 ( temp 2-component vector of uint) 0:10 indirect index ( temp uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 'byteAddrTemp' ( temp int) 0:10 indirect index ( temp uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 add ( temp int) @@ -583,8 +583,8 @@ 0:10 0 (const int) 0:10 move second child to first child ( temp uint) 0:10 indirect index (layout( row_major std430) buffer uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 add ( temp int) @@ -601,14 +601,14 @@ 0:10 2 (const int) 0:? Construct vec2 ( temp 2-component vector of uint) 0:10 indirect index ( temp uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 'byteAddrTemp' ( temp int) 0:10 indirect index ( temp uint) -0:10 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:10 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:10 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:10 Constant: 0:10 0 (const uint) 0:10 add ( temp int) @@ -626,8 +626,8 @@ 0:11 2 (const int) 0:11 move second child to first child ( temp uint) 0:11 indirect index (layout( row_major std430) buffer uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 'byteAddrTemp' ( temp int) @@ -641,14 +641,14 @@ 0:11 2 (const int) 0:? Construct vec3 ( temp 3-component vector of uint) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 'byteAddrTemp' ( temp int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -656,8 +656,8 @@ 0:11 Constant: 0:11 1 (const int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -668,8 +668,8 @@ 0:11 0 (const int) 0:11 move second child to first child ( temp uint) 0:11 indirect index (layout( row_major std430) buffer uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -686,14 +686,14 @@ 0:11 2 (const int) 0:? Construct vec3 ( temp 3-component vector of uint) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 'byteAddrTemp' ( temp int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -701,8 +701,8 @@ 0:11 Constant: 0:11 1 (const int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -713,8 +713,8 @@ 0:11 1 (const int) 0:11 move second child to first child ( temp uint) 0:11 indirect index (layout( row_major std430) buffer uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -731,14 +731,14 @@ 0:11 2 (const int) 0:? Construct vec3 ( temp 3-component vector of uint) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 'byteAddrTemp' ( temp int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -746,8 +746,8 @@ 0:11 Constant: 0:11 1 (const int) 0:11 indirect index ( temp uint) -0:11 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:11 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:11 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:11 Constant: 0:11 0 (const uint) 0:11 add ( temp int) @@ -765,8 +765,8 @@ 0:12 2 (const int) 0:12 move second child to first child ( temp uint) 0:12 indirect index (layout( row_major std430) buffer uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 'byteAddrTemp' ( temp int) @@ -780,14 +780,14 @@ 0:12 2 (const int) 0:? Construct vec4 ( temp 4-component vector of uint) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 'byteAddrTemp' ( temp int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -795,8 +795,8 @@ 0:12 Constant: 0:12 1 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -804,8 +804,8 @@ 0:12 Constant: 0:12 2 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -816,8 +816,8 @@ 0:12 0 (const int) 0:12 move second child to first child ( temp uint) 0:12 indirect index (layout( row_major std430) buffer uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -834,14 +834,14 @@ 0:12 2 (const int) 0:? Construct vec4 ( temp 4-component vector of uint) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 'byteAddrTemp' ( temp int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -849,8 +849,8 @@ 0:12 Constant: 0:12 1 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -858,8 +858,8 @@ 0:12 Constant: 0:12 2 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -870,8 +870,8 @@ 0:12 1 (const int) 0:12 move second child to first child ( temp uint) 0:12 indirect index (layout( row_major std430) buffer uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -888,14 +888,14 @@ 0:12 2 (const int) 0:? Construct vec4 ( temp 4-component vector of uint) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 'byteAddrTemp' ( temp int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -903,8 +903,8 @@ 0:12 Constant: 0:12 1 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -912,8 +912,8 @@ 0:12 Constant: 0:12 2 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -924,8 +924,8 @@ 0:12 2 (const int) 0:12 move second child to first child ( temp uint) 0:12 indirect index (layout( row_major std430) buffer uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -942,14 +942,14 @@ 0:12 2 (const int) 0:? Construct vec4 ( temp 4-component vector of uint) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 'byteAddrTemp' ( temp int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -957,8 +957,8 @@ 0:12 Constant: 0:12 1 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -966,8 +966,8 @@ 0:12 Constant: 0:12 2 (const int) 0:12 indirect index ( temp uint) -0:12 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:12 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:12 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:12 Constant: 0:12 0 (const uint) 0:12 add ( temp int) @@ -980,8 +980,8 @@ 0:14 Construct vec4 ( temp 4-component vector of float) 0:14 Convert uint to float ( temp float) 0:14 indirect index (layout( row_major std430) buffer uint) -0:14 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of uint) -0:14 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:14 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:14 Constant: 0:14 0 (const uint) 0:14 right-shift ( temp int) @@ -999,12 +999,12 @@ 0:5 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of uint @data}) +0:? 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 239 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.rw.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.rw.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structbuffer.rw.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structbuffer.rw.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -8,8 +8,8 @@ 0:? Sequence 0:13 move second child to first child ( temp float) 0:13 indirect index (layout( row_major std430) buffer float) -0:13 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float) -0:13 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:13 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float) +0:13 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:13 Constant: 0:13 0 (const uint) 0:13 add ( temp uint) @@ -22,8 +22,8 @@ 0:17 move second child to first child ( temp uint) 0:17 'size' ( temp uint) 0:17 array length ( temp uint) -0:17 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test}) -0:17 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test}) +0:17 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) 0:17 Constant: 0:17 0 (const uint) 0:17 move second child to first child ( temp uint) @@ -34,8 +34,8 @@ 0:19 Condition 0:19 test: direct index for structure ( temp bool) 0:19 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test}) -0:19 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test}) -0:19 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test}) +0:19 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) 0:19 Constant: 0:19 0 (const uint) 0:19 'pos' ( in uint) @@ -47,16 +47,16 @@ 0:20 add ( temp 3-component vector of float) 0:20 color: direct index for structure ( temp 3-component vector of float) 0:20 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test}) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test}) -0:20 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test}) +0:20 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 'pos' ( in uint) 0:20 Constant: 0:20 0 (const int) 0:20 indirect index (layout( row_major std430) buffer float) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float) -0:20 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float) +0:20 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 'pos' ( in uint) @@ -80,8 +80,8 @@ 0:12 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) -0:? 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:? 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:? 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) @@ -98,8 +98,8 @@ 0:? Sequence 0:13 move second child to first child ( temp float) 0:13 indirect index (layout( row_major std430) buffer float) -0:13 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float) -0:13 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:13 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float) +0:13 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:13 Constant: 0:13 0 (const uint) 0:13 add ( temp uint) @@ -112,8 +112,8 @@ 0:17 move second child to first child ( temp uint) 0:17 'size' ( temp uint) 0:17 array length ( temp uint) -0:17 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test}) -0:17 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test}) +0:17 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) 0:17 Constant: 0:17 0 (const uint) 0:17 move second child to first child ( temp uint) @@ -124,8 +124,8 @@ 0:19 Condition 0:19 test: direct index for structure ( temp bool) 0:19 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test}) -0:19 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test}) -0:19 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test}) +0:19 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) 0:19 Constant: 0:19 0 (const uint) 0:19 'pos' ( in uint) @@ -137,16 +137,16 @@ 0:20 add ( temp 3-component vector of float) 0:20 color: direct index for structure ( temp 3-component vector of float) 0:20 indirect index (layout( row_major std430) buffer structure{ temp 3-component vector of float color, temp bool test}) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test}) -0:20 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test}) +0:20 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 'pos' ( in uint) 0:20 Constant: 0:20 0 (const int) 0:20 indirect index (layout( row_major std430) buffer float) -0:20 @data: direct index for structure (layout( row_major std430) buffer implicitly-sized array of float) -0:20 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of float) +0:20 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:20 Constant: 0:20 0 (const uint) 0:20 'pos' ( in uint) @@ -170,13 +170,13 @@ 0:12 Function Call: @main(u1; ( temp 4-component vector of float) 0:? 'pos' ( temp uint) 0:? Linker Objects -0:? 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of structure{ temp 3-component vector of float color, temp bool test} @data}) -0:? 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer implicitly-sized array of float @data}) +0:? 'sbuf' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 3-component vector of float color, temp bool test} @data}) +0:? 'sbuf2' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of float @data}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:? 'pos' (layout( location=0) flat in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 78 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -212,7 +212,7 @@ 0:? 's.ff4' (layout( location=7) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 102 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structin.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structin.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structin.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structin.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -340,7 +340,7 @@ 0:? 'e' (layout( location=5) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 94 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structIoFourWay.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structIoFourWay.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structIoFourWay.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structIoFourWay.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -162,7 +162,7 @@ 0:? 't.normal' (layout( location=3) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 65 Capability Shader @@ -171,6 +171,7 @@ EntryPoint Fragment 4 "main" 22 27 31 36 45 48 51 55 ExecutionMode 4 OriginUpperLeft ExecutionMode 4 DepthGreater + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "T" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split-1.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split-1.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split-1.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split-1.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -196,7 +196,7 @@ 0:? 'Pos_loose' (layout( location=3) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 70 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split.array.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split.array.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split.array.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split.array.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -160,7 +160,7 @@ 0:? 'OutputStream.VertexID' (layout( location=2) out uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 82 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split.assign.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split.assign.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split.assign.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split.assign.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -208,7 +208,7 @@ 0:? 'input[2].f' (layout( location=3) in float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 66 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split.call.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split.call.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split.call.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split.call.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -214,7 +214,7 @@ 0:? 'vsin.x1_in' (layout( location=2) in int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 77 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split.nested.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split.nested.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split.nested.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split.nested.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -448,7 +448,7 @@ 0:? 'ts.contains_no_builtin_io.m1' (layout( location=3) out int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 100 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split.trivial.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split.trivial.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split.trivial.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split.trivial.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -192,7 +192,7 @@ 0:? 'ts.pos' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 67 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split.trivial.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split.trivial.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.struct.split.trivial.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.struct.split.trivial.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -98,7 +98,7 @@ 0:? 'Pos_loose' (layout( location=1) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 45 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structStructName.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structStructName.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.structStructName.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.structStructName.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -44,7 +44,7 @@ 0:? '@entryPointOutput' (layout( location=0) out int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 22 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.subpass.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.subpass.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.subpass.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.subpass.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -430,7 +430,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 204 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.switch.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.switch.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.switch.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.switch.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -296,7 +296,7 @@ 0:? 'd' (layout( location=2) flat in int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 106 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.swizzle.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.swizzle.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.swizzle.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.swizzle.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -77,7 +77,7 @@ 0:? 'AmbientColor' ( global 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 30 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.synthesizeInput.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.synthesizeInput.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.synthesizeInput.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.synthesizeInput.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -98,7 +98,7 @@ 0:? 'input.no_interp' (layout( location=1) flat in uint) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 44 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.target.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.target.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.target.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.target.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -114,7 +114,7 @@ 0:? 'out2' (layout( location=3) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 50 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.targetStruct1.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.targetStruct1.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.targetStruct1.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.targetStruct1.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -184,7 +184,7 @@ 0:? 'po' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 65 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.targetStruct2.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.targetStruct2.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.targetStruct2.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.targetStruct2.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -184,7 +184,7 @@ 0:? 'po' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 65 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.templatetypes.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.templatetypes.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.templatetypes.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.templatetypes.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -508,7 +508,7 @@ 0:? '@entryPointOutput' (layout( location=0) out float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 153 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.texturebuffer.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.texturebuffer.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.texturebuffer.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.texturebuffer.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -70,7 +70,7 @@ 0:? 'pos' ( in 4-component vector of float FragCoord) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 39 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.texture.struct.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.texture.struct.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.texture.struct.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.texture.struct.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -838,7 +838,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 240 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.texture.subvec4.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.texture.subvec4.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.texture.subvec4.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.texture.subvec4.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -356,7 +356,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 130 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.this.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.this.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.this.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.this.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -240,7 +240,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 98 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.tx.bracket.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.tx.bracket.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.tx.bracket.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.tx.bracket.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -422,7 +422,7 @@ 0:? '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 188 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.tx.overload.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.tx.overload.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.tx.overload.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.tx.overload.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -134,7 +134,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 73 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.typedef.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.typedef.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.typedef.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.typedef.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -79,7 +79,7 @@ 0:? Linker Objects // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 34 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.typeGraphCopy.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.typeGraphCopy.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.typeGraphCopy.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.typeGraphCopy.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -62,7 +62,7 @@ 0:? '@entryPointOutput' (layout( location=0) out float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 28 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.type.half.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.type.half.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.type.half.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.type.half.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -164,7 +164,7 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 60 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.type.identifier.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.type.identifier.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.type.identifier.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.type.identifier.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -86,7 +86,7 @@ 0:25 'uint' ( temp mediump uint) 0:25 'min16float' ( temp mediump float) 0:25 'min10float' ( temp mediump float) -0:25 Test condition and select ( temp mediump float) +0:25 Test condition and select ( temp mediump float): no shortcircuit 0:25 Condition 0:25 direct index ( temp bool) 0:25 'bool' ( temp 2-element array of bool) @@ -221,7 +221,7 @@ 0:25 'uint' ( temp mediump uint) 0:25 'min16float' ( temp mediump float) 0:25 'min10float' ( temp mediump float) -0:25 Test condition and select ( temp mediump float) +0:25 Test condition and select ( temp mediump float): no shortcircuit 0:25 Condition 0:25 direct index ( temp bool) 0:25 'bool' ( temp 2-element array of bool) @@ -266,13 +266,13 @@ 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 109 +// Generated by (magic number): 80006 +// Id's are bound by 105 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 107 + EntryPoint Fragment 4 "main" 103 ExecutionMode 4 OriginUpperLeft Source HLSL 500 Name 4 "main" @@ -289,9 +289,9 @@ Name 56 "foo_t" MemberName 56(foo_t) 0 "float" Name 58 "float" - Name 86 "param" - Name 93 "half2x3" - Name 107 "@entryPointOutput" + Name 82 "param" + Name 89 "half2x3" + Name 103 "@entryPointOutput" Decorate 49(min16float) RelaxedPrecision Decorate 50 RelaxedPrecision Decorate 51 RelaxedPrecision @@ -308,15 +308,14 @@ Decorate 72 RelaxedPrecision Decorate 73 RelaxedPrecision Decorate 74 RelaxedPrecision - Decorate 80 RelaxedPrecision + Decorate 77 RelaxedPrecision + Decorate 78 RelaxedPrecision + Decorate 79 RelaxedPrecision Decorate 81 RelaxedPrecision Decorate 83 RelaxedPrecision Decorate 84 RelaxedPrecision Decorate 85 RelaxedPrecision - Decorate 87 RelaxedPrecision - Decorate 88 RelaxedPrecision - Decorate 89 RelaxedPrecision - Decorate 107(@entryPointOutput) Location 0 + Decorate 103(@entryPointOutput) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -341,16 +340,16 @@ 56(foo_t): TypeStruct 6(float) 57: TypePointer Function 56(foo_t) 59: 6(float) Constant 1109917696 - 90: TypeVector 6(float) 3 - 91: TypeMatrix 90(fvec3) 2 - 92: TypePointer Function 91 - 97: 22(int) Constant 0 - 106: TypePointer Output 12(fvec4) -107(@entryPointOutput): 106(ptr) Variable Output + 86: TypeVector 6(float) 3 + 87: TypeMatrix 86(fvec3) 2 + 88: TypePointer Function 87 + 93: 22(int) Constant 0 + 102: TypePointer Output 12(fvec4) +103(@entryPointOutput): 102(ptr) Variable Output 4(main): 2 Function None 3 5: Label - 108: 12(fvec4) FunctionCall 14(@main() - Store 107(@entryPointOutput) 108 + 104: 12(fvec4) FunctionCall 14(@main() + Store 103(@entryPointOutput) 104 Return FunctionEnd 10(fn(f1;): 6(float) Function None 8 @@ -369,9 +368,8 @@ 52(min10float): 7(ptr) Variable Function 54(half): 7(ptr) Variable Function 58(float): 57(ptr) Variable Function - 75: 7(ptr) Variable Function - 86(param): 7(ptr) Variable Function - 93(half2x3): 92(ptr) Variable Function + 82(param): 7(ptr) Variable Function + 89(half2x3): 88(ptr) Variable Function Store 19(float) 20 27: 6(float) Load 19(float) 29: 21(bool) FOrdNotEqual 27 28 @@ -412,36 +410,27 @@ 72: 6(float) FAdd 70 71 73: 6(float) Load 52(min10float) 74: 6(float) FAdd 72 73 - 76: 37(ptr) AccessChain 26(bool) 40 - 77: 21(bool) Load 76 - SelectionMerge 79 None - BranchConditional 77 78 82 - 78: Label - 80: 33(int) Load 35(int) - 81: 6(float) ConvertSToF 80 - Store 75 81 - Branch 79 - 82: Label - 83: 6(float) Load 19(float) - Store 75 83 - Branch 79 - 79: Label - 84: 6(float) Load 75 - 85: 6(float) FAdd 74 84 - 87: 6(float) Load 19(float) - Store 86(param) 87 - 88: 6(float) FunctionCall 10(fn(f1;) 86(param) - 89: 6(float) FAdd 85 88 - Store 19(float) 89 - 94: 6(float) Load 19(float) + 75: 37(ptr) AccessChain 26(bool) 40 + 76: 21(bool) Load 75 + 77: 33(int) Load 35(int) + 78: 6(float) ConvertSToF 77 + 79: 6(float) Load 19(float) + 80: 6(float) Select 76 78 79 + 81: 6(float) FAdd 74 80 + 83: 6(float) Load 19(float) + Store 82(param) 83 + 84: 6(float) FunctionCall 10(fn(f1;) 82(param) + 85: 6(float) FAdd 81 84 + Store 19(float) 85 + 90: 6(float) Load 19(float) + 91: 6(float) Load 19(float) + 92: 6(float) FMul 90 91 + 94: 7(ptr) AccessChain 89(half2x3) 40 93 + Store 94 92 95: 6(float) Load 19(float) - 96: 6(float) FMul 94 95 - 98: 7(ptr) AccessChain 93(half2x3) 40 97 - Store 98 96 - 99: 6(float) Load 19(float) - 100: 7(ptr) AccessChain 93(half2x3) 40 97 - 101: 6(float) Load 100 - 102: 6(float) FAdd 99 101 - 103: 12(fvec4) CompositeConstruct 102 102 102 102 - ReturnValue 103 + 96: 7(ptr) AccessChain 89(half2x3) 40 93 + 97: 6(float) Load 96 + 98: 6(float) FAdd 95 97 + 99: 12(fvec4) CompositeConstruct 98 98 98 98 + ReturnValue 99 FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.void.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.void.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.void.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.void.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -54,7 +54,7 @@ 0:? 'input' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 27 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.wavebroadcast.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.wavebroadcast.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.wavebroadcast.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.wavebroadcast.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,2731 @@ +hlsl.wavebroadcast.comp +Shader version: 500 +local_size = (32, 16, 1) +0:? Sequence +0:13 Function Definition: @CSMain(vu3; ( temp void) +0:13 Function Parameters: +0:13 'dti' ( in 3-component vector of uint) +0:? Sequence +0:14 move second child to first child ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:14 subgroupShuffle ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 13 (const uint) +0:15 move second child to first child ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 subgroupShuffle ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 13 (const uint) +0:16 move second child to first child ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:16 subgroupShuffle ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:16 Constant: +0:16 13 (const uint) +0:17 move second child to first child ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:17 subgroupShuffle ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:17 Constant: +0:17 13 (const uint) +0:19 move second child to first child ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:19 subgroupShuffle ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:19 Constant: +0:19 13 (const uint) +0:20 move second child to first child ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:20 subgroupShuffle ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 13 (const uint) +0:21 move second child to first child ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 subgroupShuffle ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Constant: +0:21 13 (const uint) +0:22 move second child to first child ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:22 subgroupShuffle ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:22 Constant: +0:22 13 (const uint) +0:24 move second child to first child ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:24 subgroupShuffle ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:24 Constant: +0:24 13 (const uint) +0:25 move second child to first child ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:25 subgroupShuffle ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 13 (const uint) +0:26 move second child to first child ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:26 subgroupShuffle ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:26 Constant: +0:26 13 (const uint) +0:27 move second child to first child ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 subgroupShuffle ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Constant: +0:27 13 (const uint) +0:29 move second child to first child ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:29 subgroupBroadcastFirst ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:30 move second child to first child ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:30 subgroupBroadcastFirst ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:31 move second child to first child ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:31 subgroupBroadcastFirst ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:32 move second child to first child ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:32 subgroupBroadcastFirst ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:34 move second child to first child ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:34 subgroupBroadcastFirst ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:35 move second child to first child ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 subgroupBroadcastFirst ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:36 move second child to first child ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:36 subgroupBroadcastFirst ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:37 move second child to first child ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:37 subgroupBroadcastFirst ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:39 move second child to first child ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:39 subgroupBroadcastFirst ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:40 move second child to first child ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:40 subgroupBroadcastFirst ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:41 move second child to first child ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 subgroupBroadcastFirst ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:42 move second child to first child ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:42 subgroupBroadcastFirst ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:44 move second child to first child ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:44 subgroupBroadcastFirst ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:45 move second child to first child ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:45 subgroupBroadcastFirst ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:46 move second child to first child ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:46 subgroupBroadcastFirst ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:47 move second child to first child ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 subgroupBroadcastFirst ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:49 move second child to first child ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:49 subgroupBroadcastFirst ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:50 move second child to first child ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:50 subgroupBroadcastFirst ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:51 move second child to first child ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:51 subgroupBroadcastFirst ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:52 move second child to first child ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:52 subgroupBroadcastFirst ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:13 Function Definition: CSMain( ( temp void) +0:13 Function Parameters: +0:? Sequence +0:13 move second child to first child ( temp 3-component vector of uint) +0:? 'dti' ( temp 3-component vector of uint) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) +0:13 Function Call: @CSMain(vu3; ( temp void) +0:? 'dti' ( temp 3-component vector of uint) +0:? Linker Objects +0:? 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) + + +Linked compute stage: + + +Shader version: 500 +local_size = (32, 16, 1) +0:? Sequence +0:13 Function Definition: @CSMain(vu3; ( temp void) +0:13 Function Parameters: +0:13 'dti' ( in 3-component vector of uint) +0:? Sequence +0:14 move second child to first child ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:14 subgroupShuffle ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 13 (const uint) +0:15 move second child to first child ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 subgroupShuffle ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 13 (const uint) +0:16 move second child to first child ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:16 subgroupShuffle ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:16 Constant: +0:16 13 (const uint) +0:17 move second child to first child ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:17 subgroupShuffle ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:17 Constant: +0:17 13 (const uint) +0:19 move second child to first child ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:19 subgroupShuffle ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:19 Constant: +0:19 13 (const uint) +0:20 move second child to first child ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:20 subgroupShuffle ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 13 (const uint) +0:21 move second child to first child ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 subgroupShuffle ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Constant: +0:21 13 (const uint) +0:22 move second child to first child ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:22 subgroupShuffle ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:22 Constant: +0:22 13 (const uint) +0:24 move second child to first child ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:24 subgroupShuffle ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:24 Constant: +0:24 13 (const uint) +0:25 move second child to first child ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:25 subgroupShuffle ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 13 (const uint) +0:26 move second child to first child ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:26 subgroupShuffle ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:26 Constant: +0:26 13 (const uint) +0:27 move second child to first child ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 subgroupShuffle ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Constant: +0:27 13 (const uint) +0:29 move second child to first child ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:29 subgroupBroadcastFirst ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:30 move second child to first child ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:30 subgroupBroadcastFirst ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:31 move second child to first child ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:31 subgroupBroadcastFirst ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:32 move second child to first child ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:32 subgroupBroadcastFirst ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:34 move second child to first child ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:34 subgroupBroadcastFirst ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:35 move second child to first child ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 subgroupBroadcastFirst ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:36 move second child to first child ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:36 subgroupBroadcastFirst ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:37 move second child to first child ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:37 subgroupBroadcastFirst ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:39 move second child to first child ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:39 subgroupBroadcastFirst ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:40 move second child to first child ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:40 subgroupBroadcastFirst ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:41 move second child to first child ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 subgroupBroadcastFirst ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:42 move second child to first child ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:42 subgroupBroadcastFirst ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:44 move second child to first child ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:44 subgroupBroadcastFirst ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:45 move second child to first child ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:45 subgroupBroadcastFirst ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:46 move second child to first child ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:46 subgroupBroadcastFirst ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:47 move second child to first child ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 subgroupBroadcastFirst ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:49 move second child to first child ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:49 subgroupBroadcastFirst ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:50 move second child to first child ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:50 subgroupBroadcastFirst ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:51 move second child to first child ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:51 subgroupBroadcastFirst ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:52 move second child to first child ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:52 subgroupBroadcastFirst ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:13 Function Definition: CSMain( ( temp void) +0:13 Function Parameters: +0:? Sequence +0:13 move second child to first child ( temp 3-component vector of uint) +0:? 'dti' ( temp 3-component vector of uint) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) +0:13 Function Call: @CSMain(vu3; ( temp void) +0:? 'dti' ( temp 3-component vector of uint) +0:? Linker Objects +0:? 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) + +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 359 + + Capability Shader + Capability Float64 + Capability GroupNonUniform + Capability GroupNonUniformBallot + Capability GroupNonUniformShuffle + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "CSMain" 354 + ExecutionMode 4 LocalSize 32 16 1 + Source HLSL 500 + Name 4 "CSMain" + Name 11 "@CSMain(vu3;" + Name 10 "dti" + Name 20 "Types" + MemberName 20(Types) 0 "u" + MemberName 20(Types) 1 "i" + MemberName 20(Types) 2 "f" + MemberName 20(Types) 3 "d" + Name 22 "data" + MemberName 22(data) 0 "@data" + Name 24 "data" + Name 352 "dti" + Name 354 "dti" + Name 356 "param" + MemberDecorate 20(Types) 0 Offset 0 + MemberDecorate 20(Types) 1 Offset 16 + MemberDecorate 20(Types) 2 Offset 32 + MemberDecorate 20(Types) 3 Offset 64 + Decorate 21 ArrayStride 96 + MemberDecorate 22(data) 0 Offset 0 + Decorate 22(data) BufferBlock + Decorate 24(data) DescriptorSet 0 + Decorate 354(dti) BuiltIn GlobalInvocationId + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypeVector 6(int) 3 + 8: TypePointer Function 7(ivec3) + 9: TypeFunction 2 8(ptr) + 13: TypeVector 6(int) 4 + 14: TypeInt 32 1 + 15: TypeVector 14(int) 4 + 16: TypeFloat 32 + 17: TypeVector 16(float) 4 + 18: TypeFloat 64 + 19: TypeVector 18(float) 4 + 20(Types): TypeStruct 13(ivec4) 15(ivec4) 17(fvec4) 19(fvec4) + 21: TypeRuntimeArray 20(Types) + 22(data): TypeStruct 21 + 23: TypePointer Uniform 22(data) + 24(data): 23(ptr) Variable Uniform + 25: 14(int) Constant 0 + 26: 6(int) Constant 0 + 27: TypePointer Function 6(int) + 32: TypePointer Uniform 13(ivec4) + 35: 6(int) Constant 13 + 36: 6(int) Constant 3 + 43: TypePointer Uniform 6(int) + 52: TypeVector 6(int) 2 + 73: 14(int) Constant 1 + 76: TypePointer Uniform 15(ivec4) + 85: TypePointer Uniform 14(int) + 94: TypeVector 14(int) 2 + 106: TypeVector 14(int) 3 + 116: 14(int) Constant 2 + 119: TypePointer Uniform 17(fvec4) + 128: TypePointer Uniform 16(float) + 137: TypeVector 16(float) 2 + 149: TypeVector 16(float) 3 + 159: 14(int) Constant 3 + 162: TypePointer Uniform 19(fvec4) + 171: TypePointer Uniform 18(float) + 180: TypeVector 18(float) 2 + 192: TypeVector 18(float) 3 + 353: TypePointer Input 7(ivec3) + 354(dti): 353(ptr) Variable Input + 4(CSMain): 2 Function None 3 + 5: Label + 352(dti): 8(ptr) Variable Function + 356(param): 8(ptr) Variable Function + 355: 7(ivec3) Load 354(dti) + Store 352(dti) 355 + 357: 7(ivec3) Load 352(dti) + Store 356(param) 357 + 358: 2 FunctionCall 11(@CSMain(vu3;) 356(param) + Return + FunctionEnd +11(@CSMain(vu3;): 2 Function None 9 + 10(dti): 8(ptr) FunctionParameter + 12: Label + 28: 27(ptr) AccessChain 10(dti) 26 + 29: 6(int) Load 28 + 30: 27(ptr) AccessChain 10(dti) 26 + 31: 6(int) Load 30 + 33: 32(ptr) AccessChain 24(data) 25 31 25 + 34: 13(ivec4) Load 33 + 37: 13(ivec4) GroupNonUniformShuffle 36 34 35 + 38: 32(ptr) AccessChain 24(data) 25 29 25 + Store 38 37 + 39: 27(ptr) AccessChain 10(dti) 26 + 40: 6(int) Load 39 + 41: 27(ptr) AccessChain 10(dti) 26 + 42: 6(int) Load 41 + 44: 43(ptr) AccessChain 24(data) 25 42 25 26 + 45: 6(int) Load 44 + 46: 6(int) GroupNonUniformShuffle 36 45 35 + 47: 43(ptr) AccessChain 24(data) 25 40 25 26 + Store 47 46 + 48: 27(ptr) AccessChain 10(dti) 26 + 49: 6(int) Load 48 + 50: 27(ptr) AccessChain 10(dti) 26 + 51: 6(int) Load 50 + 53: 32(ptr) AccessChain 24(data) 25 51 25 + 54: 13(ivec4) Load 53 + 55: 52(ivec2) VectorShuffle 54 54 0 1 + 56: 52(ivec2) GroupNonUniformShuffle 36 55 35 + 57: 32(ptr) AccessChain 24(data) 25 49 25 + 58: 13(ivec4) Load 57 + 59: 13(ivec4) VectorShuffle 58 56 4 5 2 3 + Store 57 59 + 60: 27(ptr) AccessChain 10(dti) 26 + 61: 6(int) Load 60 + 62: 27(ptr) AccessChain 10(dti) 26 + 63: 6(int) Load 62 + 64: 32(ptr) AccessChain 24(data) 25 63 25 + 65: 13(ivec4) Load 64 + 66: 7(ivec3) VectorShuffle 65 65 0 1 2 + 67: 7(ivec3) GroupNonUniformShuffle 36 66 35 + 68: 32(ptr) AccessChain 24(data) 25 61 25 + 69: 13(ivec4) Load 68 + 70: 13(ivec4) VectorShuffle 69 67 4 5 6 3 + Store 68 70 + 71: 27(ptr) AccessChain 10(dti) 26 + 72: 6(int) Load 71 + 74: 27(ptr) AccessChain 10(dti) 26 + 75: 6(int) Load 74 + 77: 76(ptr) AccessChain 24(data) 25 75 73 + 78: 15(ivec4) Load 77 + 79: 15(ivec4) GroupNonUniformShuffle 36 78 35 + 80: 76(ptr) AccessChain 24(data) 25 72 73 + Store 80 79 + 81: 27(ptr) AccessChain 10(dti) 26 + 82: 6(int) Load 81 + 83: 27(ptr) AccessChain 10(dti) 26 + 84: 6(int) Load 83 + 86: 85(ptr) AccessChain 24(data) 25 84 73 26 + 87: 14(int) Load 86 + 88: 14(int) GroupNonUniformShuffle 36 87 35 + 89: 85(ptr) AccessChain 24(data) 25 82 73 26 + Store 89 88 + 90: 27(ptr) AccessChain 10(dti) 26 + 91: 6(int) Load 90 + 92: 27(ptr) AccessChain 10(dti) 26 + 93: 6(int) Load 92 + 95: 76(ptr) AccessChain 24(data) 25 93 73 + 96: 15(ivec4) Load 95 + 97: 94(ivec2) VectorShuffle 96 96 0 1 + 98: 94(ivec2) GroupNonUniformShuffle 36 97 35 + 99: 76(ptr) AccessChain 24(data) 25 91 73 + 100: 15(ivec4) Load 99 + 101: 15(ivec4) VectorShuffle 100 98 4 5 2 3 + Store 99 101 + 102: 27(ptr) AccessChain 10(dti) 26 + 103: 6(int) Load 102 + 104: 27(ptr) AccessChain 10(dti) 26 + 105: 6(int) Load 104 + 107: 76(ptr) AccessChain 24(data) 25 105 73 + 108: 15(ivec4) Load 107 + 109: 106(ivec3) VectorShuffle 108 108 0 1 2 + 110: 106(ivec3) GroupNonUniformShuffle 36 109 35 + 111: 76(ptr) AccessChain 24(data) 25 103 73 + 112: 15(ivec4) Load 111 + 113: 15(ivec4) VectorShuffle 112 110 4 5 6 3 + Store 111 113 + 114: 27(ptr) AccessChain 10(dti) 26 + 115: 6(int) Load 114 + 117: 27(ptr) AccessChain 10(dti) 26 + 118: 6(int) Load 117 + 120: 119(ptr) AccessChain 24(data) 25 118 116 + 121: 17(fvec4) Load 120 + 122: 17(fvec4) GroupNonUniformShuffle 36 121 35 + 123: 119(ptr) AccessChain 24(data) 25 115 116 + Store 123 122 + 124: 27(ptr) AccessChain 10(dti) 26 + 125: 6(int) Load 124 + 126: 27(ptr) AccessChain 10(dti) 26 + 127: 6(int) Load 126 + 129: 128(ptr) AccessChain 24(data) 25 127 116 26 + 130: 16(float) Load 129 + 131: 16(float) GroupNonUniformShuffle 36 130 35 + 132: 128(ptr) AccessChain 24(data) 25 125 116 26 + Store 132 131 + 133: 27(ptr) AccessChain 10(dti) 26 + 134: 6(int) Load 133 + 135: 27(ptr) AccessChain 10(dti) 26 + 136: 6(int) Load 135 + 138: 119(ptr) AccessChain 24(data) 25 136 116 + 139: 17(fvec4) Load 138 + 140: 137(fvec2) VectorShuffle 139 139 0 1 + 141: 137(fvec2) GroupNonUniformShuffle 36 140 35 + 142: 119(ptr) AccessChain 24(data) 25 134 116 + 143: 17(fvec4) Load 142 + 144: 17(fvec4) VectorShuffle 143 141 4 5 2 3 + Store 142 144 + 145: 27(ptr) AccessChain 10(dti) 26 + 146: 6(int) Load 145 + 147: 27(ptr) AccessChain 10(dti) 26 + 148: 6(int) Load 147 + 150: 119(ptr) AccessChain 24(data) 25 148 116 + 151: 17(fvec4) Load 150 + 152: 149(fvec3) VectorShuffle 151 151 0 1 2 + 153: 149(fvec3) GroupNonUniformShuffle 36 152 35 + 154: 119(ptr) AccessChain 24(data) 25 146 116 + 155: 17(fvec4) Load 154 + 156: 17(fvec4) VectorShuffle 155 153 4 5 6 3 + Store 154 156 + 157: 27(ptr) AccessChain 10(dti) 26 + 158: 6(int) Load 157 + 160: 27(ptr) AccessChain 10(dti) 26 + 161: 6(int) Load 160 + 163: 162(ptr) AccessChain 24(data) 25 161 159 + 164: 19(fvec4) Load 163 + 165: 19(fvec4) GroupNonUniformBroadcastFirst 36 164 + 166: 162(ptr) AccessChain 24(data) 25 158 159 + Store 166 165 + 167: 27(ptr) AccessChain 10(dti) 26 + 168: 6(int) Load 167 + 169: 27(ptr) AccessChain 10(dti) 26 + 170: 6(int) Load 169 + 172: 171(ptr) AccessChain 24(data) 25 170 159 26 + 173: 18(float) Load 172 + 174: 18(float) GroupNonUniformBroadcastFirst 36 173 + 175: 171(ptr) AccessChain 24(data) 25 168 159 26 + Store 175 174 + 176: 27(ptr) AccessChain 10(dti) 26 + 177: 6(int) Load 176 + 178: 27(ptr) AccessChain 10(dti) 26 + 179: 6(int) Load 178 + 181: 162(ptr) AccessChain 24(data) 25 179 159 + 182: 19(fvec4) Load 181 + 183: 180(fvec2) VectorShuffle 182 182 0 1 + 184: 180(fvec2) GroupNonUniformBroadcastFirst 36 183 + 185: 162(ptr) AccessChain 24(data) 25 177 159 + 186: 19(fvec4) Load 185 + 187: 19(fvec4) VectorShuffle 186 184 4 5 2 3 + Store 185 187 + 188: 27(ptr) AccessChain 10(dti) 26 + 189: 6(int) Load 188 + 190: 27(ptr) AccessChain 10(dti) 26 + 191: 6(int) Load 190 + 193: 162(ptr) AccessChain 24(data) 25 191 159 + 194: 19(fvec4) Load 193 + 195: 192(fvec3) VectorShuffle 194 194 0 1 2 + 196: 192(fvec3) GroupNonUniformBroadcastFirst 36 195 + 197: 162(ptr) AccessChain 24(data) 25 189 159 + 198: 19(fvec4) Load 197 + 199: 19(fvec4) VectorShuffle 198 196 4 5 6 3 + Store 197 199 + 200: 27(ptr) AccessChain 10(dti) 26 + 201: 6(int) Load 200 + 202: 27(ptr) AccessChain 10(dti) 26 + 203: 6(int) Load 202 + 204: 32(ptr) AccessChain 24(data) 25 203 25 + 205: 13(ivec4) Load 204 + 206: 13(ivec4) GroupNonUniformBroadcastFirst 36 205 + 207: 32(ptr) AccessChain 24(data) 25 201 25 + Store 207 206 + 208: 27(ptr) AccessChain 10(dti) 26 + 209: 6(int) Load 208 + 210: 27(ptr) AccessChain 10(dti) 26 + 211: 6(int) Load 210 + 212: 43(ptr) AccessChain 24(data) 25 211 25 26 + 213: 6(int) Load 212 + 214: 6(int) GroupNonUniformBroadcastFirst 36 213 + 215: 43(ptr) AccessChain 24(data) 25 209 25 26 + Store 215 214 + 216: 27(ptr) AccessChain 10(dti) 26 + 217: 6(int) Load 216 + 218: 27(ptr) AccessChain 10(dti) 26 + 219: 6(int) Load 218 + 220: 32(ptr) AccessChain 24(data) 25 219 25 + 221: 13(ivec4) Load 220 + 222: 52(ivec2) VectorShuffle 221 221 0 1 + 223: 52(ivec2) GroupNonUniformBroadcastFirst 36 222 + 224: 32(ptr) AccessChain 24(data) 25 217 25 + 225: 13(ivec4) Load 224 + 226: 13(ivec4) VectorShuffle 225 223 4 5 2 3 + Store 224 226 + 227: 27(ptr) AccessChain 10(dti) 26 + 228: 6(int) Load 227 + 229: 27(ptr) AccessChain 10(dti) 26 + 230: 6(int) Load 229 + 231: 32(ptr) AccessChain 24(data) 25 230 25 + 232: 13(ivec4) Load 231 + 233: 7(ivec3) VectorShuffle 232 232 0 1 2 + 234: 7(ivec3) GroupNonUniformBroadcastFirst 36 233 + 235: 32(ptr) AccessChain 24(data) 25 228 25 + 236: 13(ivec4) Load 235 + 237: 13(ivec4) VectorShuffle 236 234 4 5 6 3 + Store 235 237 + 238: 27(ptr) AccessChain 10(dti) 26 + 239: 6(int) Load 238 + 240: 27(ptr) AccessChain 10(dti) 26 + 241: 6(int) Load 240 + 242: 76(ptr) AccessChain 24(data) 25 241 73 + 243: 15(ivec4) Load 242 + 244: 15(ivec4) GroupNonUniformBroadcastFirst 36 243 + 245: 76(ptr) AccessChain 24(data) 25 239 73 + Store 245 244 + 246: 27(ptr) AccessChain 10(dti) 26 + 247: 6(int) Load 246 + 248: 27(ptr) AccessChain 10(dti) 26 + 249: 6(int) Load 248 + 250: 85(ptr) AccessChain 24(data) 25 249 73 26 + 251: 14(int) Load 250 + 252: 14(int) GroupNonUniformBroadcastFirst 36 251 + 253: 85(ptr) AccessChain 24(data) 25 247 73 26 + Store 253 252 + 254: 27(ptr) AccessChain 10(dti) 26 + 255: 6(int) Load 254 + 256: 27(ptr) AccessChain 10(dti) 26 + 257: 6(int) Load 256 + 258: 76(ptr) AccessChain 24(data) 25 257 73 + 259: 15(ivec4) Load 258 + 260: 94(ivec2) VectorShuffle 259 259 0 1 + 261: 94(ivec2) GroupNonUniformBroadcastFirst 36 260 + 262: 76(ptr) AccessChain 24(data) 25 255 73 + 263: 15(ivec4) Load 262 + 264: 15(ivec4) VectorShuffle 263 261 4 5 2 3 + Store 262 264 + 265: 27(ptr) AccessChain 10(dti) 26 + 266: 6(int) Load 265 + 267: 27(ptr) AccessChain 10(dti) 26 + 268: 6(int) Load 267 + 269: 76(ptr) AccessChain 24(data) 25 268 73 + 270: 15(ivec4) Load 269 + 271: 106(ivec3) VectorShuffle 270 270 0 1 2 + 272: 106(ivec3) GroupNonUniformBroadcastFirst 36 271 + 273: 76(ptr) AccessChain 24(data) 25 266 73 + 274: 15(ivec4) Load 273 + 275: 15(ivec4) VectorShuffle 274 272 4 5 6 3 + Store 273 275 + 276: 27(ptr) AccessChain 10(dti) 26 + 277: 6(int) Load 276 + 278: 27(ptr) AccessChain 10(dti) 26 + 279: 6(int) Load 278 + 280: 119(ptr) AccessChain 24(data) 25 279 116 + 281: 17(fvec4) Load 280 + 282: 17(fvec4) GroupNonUniformBroadcastFirst 36 281 + 283: 119(ptr) AccessChain 24(data) 25 277 116 + Store 283 282 + 284: 27(ptr) AccessChain 10(dti) 26 + 285: 6(int) Load 284 + 286: 27(ptr) AccessChain 10(dti) 26 + 287: 6(int) Load 286 + 288: 128(ptr) AccessChain 24(data) 25 287 116 26 + 289: 16(float) Load 288 + 290: 16(float) GroupNonUniformBroadcastFirst 36 289 + 291: 128(ptr) AccessChain 24(data) 25 285 116 26 + Store 291 290 + 292: 27(ptr) AccessChain 10(dti) 26 + 293: 6(int) Load 292 + 294: 27(ptr) AccessChain 10(dti) 26 + 295: 6(int) Load 294 + 296: 119(ptr) AccessChain 24(data) 25 295 116 + 297: 17(fvec4) Load 296 + 298: 137(fvec2) VectorShuffle 297 297 0 1 + 299: 137(fvec2) GroupNonUniformBroadcastFirst 36 298 + 300: 119(ptr) AccessChain 24(data) 25 293 116 + 301: 17(fvec4) Load 300 + 302: 17(fvec4) VectorShuffle 301 299 4 5 2 3 + Store 300 302 + 303: 27(ptr) AccessChain 10(dti) 26 + 304: 6(int) Load 303 + 305: 27(ptr) AccessChain 10(dti) 26 + 306: 6(int) Load 305 + 307: 119(ptr) AccessChain 24(data) 25 306 116 + 308: 17(fvec4) Load 307 + 309: 149(fvec3) VectorShuffle 308 308 0 1 2 + 310: 149(fvec3) GroupNonUniformBroadcastFirst 36 309 + 311: 119(ptr) AccessChain 24(data) 25 304 116 + 312: 17(fvec4) Load 311 + 313: 17(fvec4) VectorShuffle 312 310 4 5 6 3 + Store 311 313 + 314: 27(ptr) AccessChain 10(dti) 26 + 315: 6(int) Load 314 + 316: 27(ptr) AccessChain 10(dti) 26 + 317: 6(int) Load 316 + 318: 162(ptr) AccessChain 24(data) 25 317 159 + 319: 19(fvec4) Load 318 + 320: 19(fvec4) GroupNonUniformBroadcastFirst 36 319 + 321: 162(ptr) AccessChain 24(data) 25 315 159 + Store 321 320 + 322: 27(ptr) AccessChain 10(dti) 26 + 323: 6(int) Load 322 + 324: 27(ptr) AccessChain 10(dti) 26 + 325: 6(int) Load 324 + 326: 171(ptr) AccessChain 24(data) 25 325 159 26 + 327: 18(float) Load 326 + 328: 18(float) GroupNonUniformBroadcastFirst 36 327 + 329: 171(ptr) AccessChain 24(data) 25 323 159 26 + Store 329 328 + 330: 27(ptr) AccessChain 10(dti) 26 + 331: 6(int) Load 330 + 332: 27(ptr) AccessChain 10(dti) 26 + 333: 6(int) Load 332 + 334: 162(ptr) AccessChain 24(data) 25 333 159 + 335: 19(fvec4) Load 334 + 336: 180(fvec2) VectorShuffle 335 335 0 1 + 337: 180(fvec2) GroupNonUniformBroadcastFirst 36 336 + 338: 162(ptr) AccessChain 24(data) 25 331 159 + 339: 19(fvec4) Load 338 + 340: 19(fvec4) VectorShuffle 339 337 4 5 2 3 + Store 338 340 + 341: 27(ptr) AccessChain 10(dti) 26 + 342: 6(int) Load 341 + 343: 27(ptr) AccessChain 10(dti) 26 + 344: 6(int) Load 343 + 345: 162(ptr) AccessChain 24(data) 25 344 159 + 346: 19(fvec4) Load 345 + 347: 192(fvec3) VectorShuffle 346 346 0 1 2 + 348: 192(fvec3) GroupNonUniformBroadcastFirst 36 347 + 349: 162(ptr) AccessChain 24(data) 25 342 159 + 350: 19(fvec4) Load 349 + 351: 19(fvec4) VectorShuffle 350 348 4 5 6 3 + Store 349 351 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.waveprefix.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.waveprefix.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.waveprefix.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.waveprefix.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,2766 @@ +hlsl.waveprefix.comp +Shader version: 500 +local_size = (32, 16, 1) +0:? Sequence +0:13 Function Definition: @CSMain(vu3; ( temp void) +0:13 Function Parameters: +0:13 'dti' ( in 3-component vector of uint) +0:? Sequence +0:14 move second child to first child ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:14 subgroupInclusiveAdd ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:15 move second child to first child ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 subgroupInclusiveAdd ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:16 move second child to first child ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:16 subgroupInclusiveAdd ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:17 move second child to first child ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:17 subgroupInclusiveAdd ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:19 move second child to first child ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:19 subgroupInclusiveAdd ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:20 move second child to first child ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:20 subgroupInclusiveAdd ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:21 move second child to first child ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 subgroupInclusiveAdd ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:22 move second child to first child ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:22 subgroupInclusiveAdd ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:24 move second child to first child ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:24 subgroupInclusiveAdd ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:25 move second child to first child ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:25 subgroupInclusiveAdd ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:26 move second child to first child ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:26 subgroupInclusiveAdd ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:27 move second child to first child ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 subgroupInclusiveAdd ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:29 move second child to first child ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:29 subgroupInclusiveAdd ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:30 move second child to first child ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:30 subgroupInclusiveAdd ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:31 move second child to first child ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:31 subgroupInclusiveAdd ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:32 move second child to first child ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:32 subgroupInclusiveAdd ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:34 move second child to first child ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:34 subgroupInclusiveMul ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:35 move second child to first child ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 subgroupInclusiveMul ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:36 move second child to first child ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:36 subgroupInclusiveMul ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:37 move second child to first child ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:37 subgroupInclusiveMul ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:39 move second child to first child ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:39 subgroupInclusiveMul ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:40 move second child to first child ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:40 subgroupInclusiveMul ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:41 move second child to first child ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 subgroupInclusiveMul ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:42 move second child to first child ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:42 subgroupInclusiveMul ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:44 move second child to first child ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:44 subgroupInclusiveMul ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:45 move second child to first child ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:45 subgroupInclusiveMul ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:46 move second child to first child ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:46 subgroupInclusiveMul ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:47 move second child to first child ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 subgroupInclusiveMul ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:49 move second child to first child ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:49 subgroupInclusiveMul ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:50 move second child to first child ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:50 subgroupInclusiveMul ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:51 move second child to first child ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:51 subgroupInclusiveMul ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:52 move second child to first child ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:52 subgroupInclusiveMul ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:54 move second child to first child ( temp uint) +0:54 direct index ( temp uint) +0:54 u: direct index for structure ( temp 4-component vector of uint) +0:54 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:54 Constant: +0:54 0 (const uint) +0:54 direct index ( temp uint) +0:54 'dti' ( in 3-component vector of uint) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 subgroupBallotInclusiveBitCount ( temp uint) +0:54 subgroupBallot ( temp 4-component vector of uint) +0:54 Compare Equal ( temp bool) +0:54 direct index ( temp uint) +0:54 u: direct index for structure ( temp 4-component vector of uint) +0:54 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:54 Constant: +0:54 0 (const uint) +0:54 direct index ( temp uint) +0:54 'dti' ( in 3-component vector of uint) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const uint) +0:13 Function Definition: CSMain( ( temp void) +0:13 Function Parameters: +0:? Sequence +0:13 move second child to first child ( temp 3-component vector of uint) +0:? 'dti' ( temp 3-component vector of uint) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) +0:13 Function Call: @CSMain(vu3; ( temp void) +0:? 'dti' ( temp 3-component vector of uint) +0:? Linker Objects +0:? 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) + + +Linked compute stage: + + +Shader version: 500 +local_size = (32, 16, 1) +0:? Sequence +0:13 Function Definition: @CSMain(vu3; ( temp void) +0:13 Function Parameters: +0:13 'dti' ( in 3-component vector of uint) +0:? Sequence +0:14 move second child to first child ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:14 subgroupInclusiveAdd ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:15 move second child to first child ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 subgroupInclusiveAdd ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:16 move second child to first child ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:16 subgroupInclusiveAdd ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:17 move second child to first child ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:17 subgroupInclusiveAdd ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:19 move second child to first child ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:19 subgroupInclusiveAdd ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:20 move second child to first child ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:20 subgroupInclusiveAdd ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:21 move second child to first child ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 subgroupInclusiveAdd ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:22 move second child to first child ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:22 subgroupInclusiveAdd ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:24 move second child to first child ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:24 subgroupInclusiveAdd ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:25 move second child to first child ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:25 subgroupInclusiveAdd ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:26 move second child to first child ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:26 subgroupInclusiveAdd ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:27 move second child to first child ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 subgroupInclusiveAdd ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:29 move second child to first child ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:29 subgroupInclusiveAdd ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:30 move second child to first child ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:30 subgroupInclusiveAdd ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:31 move second child to first child ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:31 subgroupInclusiveAdd ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:32 move second child to first child ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:32 subgroupInclusiveAdd ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:34 move second child to first child ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:34 subgroupInclusiveMul ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:35 move second child to first child ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 subgroupInclusiveMul ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:36 move second child to first child ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:36 subgroupInclusiveMul ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:37 move second child to first child ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:37 subgroupInclusiveMul ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:39 move second child to first child ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:39 subgroupInclusiveMul ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:40 move second child to first child ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:40 subgroupInclusiveMul ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:41 move second child to first child ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 subgroupInclusiveMul ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:42 move second child to first child ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:42 subgroupInclusiveMul ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:44 move second child to first child ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:44 subgroupInclusiveMul ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:45 move second child to first child ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:45 subgroupInclusiveMul ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:46 move second child to first child ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:46 subgroupInclusiveMul ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:47 move second child to first child ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 subgroupInclusiveMul ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:49 move second child to first child ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:49 subgroupInclusiveMul ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:50 move second child to first child ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:50 subgroupInclusiveMul ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:51 move second child to first child ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:51 subgroupInclusiveMul ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:52 move second child to first child ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:52 subgroupInclusiveMul ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:54 move second child to first child ( temp uint) +0:54 direct index ( temp uint) +0:54 u: direct index for structure ( temp 4-component vector of uint) +0:54 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:54 Constant: +0:54 0 (const uint) +0:54 direct index ( temp uint) +0:54 'dti' ( in 3-component vector of uint) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 subgroupBallotInclusiveBitCount ( temp uint) +0:54 subgroupBallot ( temp 4-component vector of uint) +0:54 Compare Equal ( temp bool) +0:54 direct index ( temp uint) +0:54 u: direct index for structure ( temp 4-component vector of uint) +0:54 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:54 Constant: +0:54 0 (const uint) +0:54 direct index ( temp uint) +0:54 'dti' ( in 3-component vector of uint) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const uint) +0:13 Function Definition: CSMain( ( temp void) +0:13 Function Parameters: +0:? Sequence +0:13 move second child to first child ( temp 3-component vector of uint) +0:? 'dti' ( temp 3-component vector of uint) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) +0:13 Function Call: @CSMain(vu3; ( temp void) +0:? 'dti' ( temp 3-component vector of uint) +0:? Linker Objects +0:? 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) + +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 369 + + Capability Shader + Capability Float64 + Capability GroupNonUniform + Capability GroupNonUniformArithmetic + Capability GroupNonUniformBallot + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "CSMain" 364 + ExecutionMode 4 LocalSize 32 16 1 + Source HLSL 500 + Name 4 "CSMain" + Name 11 "@CSMain(vu3;" + Name 10 "dti" + Name 20 "Types" + MemberName 20(Types) 0 "u" + MemberName 20(Types) 1 "i" + MemberName 20(Types) 2 "f" + MemberName 20(Types) 3 "d" + Name 22 "data" + MemberName 22(data) 0 "@data" + Name 24 "data" + Name 362 "dti" + Name 364 "dti" + Name 366 "param" + MemberDecorate 20(Types) 0 Offset 0 + MemberDecorate 20(Types) 1 Offset 16 + MemberDecorate 20(Types) 2 Offset 32 + MemberDecorate 20(Types) 3 Offset 64 + Decorate 21 ArrayStride 96 + MemberDecorate 22(data) 0 Offset 0 + Decorate 22(data) BufferBlock + Decorate 24(data) DescriptorSet 0 + Decorate 364(dti) BuiltIn GlobalInvocationId + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypeVector 6(int) 3 + 8: TypePointer Function 7(ivec3) + 9: TypeFunction 2 8(ptr) + 13: TypeVector 6(int) 4 + 14: TypeInt 32 1 + 15: TypeVector 14(int) 4 + 16: TypeFloat 32 + 17: TypeVector 16(float) 4 + 18: TypeFloat 64 + 19: TypeVector 18(float) 4 + 20(Types): TypeStruct 13(ivec4) 15(ivec4) 17(fvec4) 19(fvec4) + 21: TypeRuntimeArray 20(Types) + 22(data): TypeStruct 21 + 23: TypePointer Uniform 22(data) + 24(data): 23(ptr) Variable Uniform + 25: 14(int) Constant 0 + 26: 6(int) Constant 0 + 27: TypePointer Function 6(int) + 32: TypePointer Uniform 13(ivec4) + 35: 6(int) Constant 3 + 42: TypePointer Uniform 6(int) + 51: TypeVector 6(int) 2 + 72: 14(int) Constant 1 + 75: TypePointer Uniform 15(ivec4) + 84: TypePointer Uniform 14(int) + 93: TypeVector 14(int) 2 + 105: TypeVector 14(int) 3 + 115: 14(int) Constant 2 + 118: TypePointer Uniform 17(fvec4) + 127: TypePointer Uniform 16(float) + 136: TypeVector 16(float) 2 + 148: TypeVector 16(float) 3 + 158: 14(int) Constant 3 + 161: TypePointer Uniform 19(fvec4) + 170: TypePointer Uniform 18(float) + 179: TypeVector 18(float) 2 + 191: TypeVector 18(float) 3 + 357: TypeBool + 363: TypePointer Input 7(ivec3) + 364(dti): 363(ptr) Variable Input + 4(CSMain): 2 Function None 3 + 5: Label + 362(dti): 8(ptr) Variable Function + 366(param): 8(ptr) Variable Function + 365: 7(ivec3) Load 364(dti) + Store 362(dti) 365 + 367: 7(ivec3) Load 362(dti) + Store 366(param) 367 + 368: 2 FunctionCall 11(@CSMain(vu3;) 366(param) + Return + FunctionEnd +11(@CSMain(vu3;): 2 Function None 9 + 10(dti): 8(ptr) FunctionParameter + 12: Label + 28: 27(ptr) AccessChain 10(dti) 26 + 29: 6(int) Load 28 + 30: 27(ptr) AccessChain 10(dti) 26 + 31: 6(int) Load 30 + 33: 32(ptr) AccessChain 24(data) 25 31 25 + 34: 13(ivec4) Load 33 + 36: 13(ivec4) GroupNonUniformIAdd 35 InclusiveScan 34 + 37: 32(ptr) AccessChain 24(data) 25 29 25 + Store 37 36 + 38: 27(ptr) AccessChain 10(dti) 26 + 39: 6(int) Load 38 + 40: 27(ptr) AccessChain 10(dti) 26 + 41: 6(int) Load 40 + 43: 42(ptr) AccessChain 24(data) 25 41 25 26 + 44: 6(int) Load 43 + 45: 6(int) GroupNonUniformIAdd 35 InclusiveScan 44 + 46: 42(ptr) AccessChain 24(data) 25 39 25 26 + Store 46 45 + 47: 27(ptr) AccessChain 10(dti) 26 + 48: 6(int) Load 47 + 49: 27(ptr) AccessChain 10(dti) 26 + 50: 6(int) Load 49 + 52: 32(ptr) AccessChain 24(data) 25 50 25 + 53: 13(ivec4) Load 52 + 54: 51(ivec2) VectorShuffle 53 53 0 1 + 55: 51(ivec2) GroupNonUniformIAdd 35 InclusiveScan 54 + 56: 32(ptr) AccessChain 24(data) 25 48 25 + 57: 13(ivec4) Load 56 + 58: 13(ivec4) VectorShuffle 57 55 4 5 2 3 + Store 56 58 + 59: 27(ptr) AccessChain 10(dti) 26 + 60: 6(int) Load 59 + 61: 27(ptr) AccessChain 10(dti) 26 + 62: 6(int) Load 61 + 63: 32(ptr) AccessChain 24(data) 25 62 25 + 64: 13(ivec4) Load 63 + 65: 7(ivec3) VectorShuffle 64 64 0 1 2 + 66: 7(ivec3) GroupNonUniformIAdd 35 InclusiveScan 65 + 67: 32(ptr) AccessChain 24(data) 25 60 25 + 68: 13(ivec4) Load 67 + 69: 13(ivec4) VectorShuffle 68 66 4 5 6 3 + Store 67 69 + 70: 27(ptr) AccessChain 10(dti) 26 + 71: 6(int) Load 70 + 73: 27(ptr) AccessChain 10(dti) 26 + 74: 6(int) Load 73 + 76: 75(ptr) AccessChain 24(data) 25 74 72 + 77: 15(ivec4) Load 76 + 78: 15(ivec4) GroupNonUniformIAdd 35 InclusiveScan 77 + 79: 75(ptr) AccessChain 24(data) 25 71 72 + Store 79 78 + 80: 27(ptr) AccessChain 10(dti) 26 + 81: 6(int) Load 80 + 82: 27(ptr) AccessChain 10(dti) 26 + 83: 6(int) Load 82 + 85: 84(ptr) AccessChain 24(data) 25 83 72 26 + 86: 14(int) Load 85 + 87: 14(int) GroupNonUniformIAdd 35 InclusiveScan 86 + 88: 84(ptr) AccessChain 24(data) 25 81 72 26 + Store 88 87 + 89: 27(ptr) AccessChain 10(dti) 26 + 90: 6(int) Load 89 + 91: 27(ptr) AccessChain 10(dti) 26 + 92: 6(int) Load 91 + 94: 75(ptr) AccessChain 24(data) 25 92 72 + 95: 15(ivec4) Load 94 + 96: 93(ivec2) VectorShuffle 95 95 0 1 + 97: 93(ivec2) GroupNonUniformIAdd 35 InclusiveScan 96 + 98: 75(ptr) AccessChain 24(data) 25 90 72 + 99: 15(ivec4) Load 98 + 100: 15(ivec4) VectorShuffle 99 97 4 5 2 3 + Store 98 100 + 101: 27(ptr) AccessChain 10(dti) 26 + 102: 6(int) Load 101 + 103: 27(ptr) AccessChain 10(dti) 26 + 104: 6(int) Load 103 + 106: 75(ptr) AccessChain 24(data) 25 104 72 + 107: 15(ivec4) Load 106 + 108: 105(ivec3) VectorShuffle 107 107 0 1 2 + 109: 105(ivec3) GroupNonUniformIAdd 35 InclusiveScan 108 + 110: 75(ptr) AccessChain 24(data) 25 102 72 + 111: 15(ivec4) Load 110 + 112: 15(ivec4) VectorShuffle 111 109 4 5 6 3 + Store 110 112 + 113: 27(ptr) AccessChain 10(dti) 26 + 114: 6(int) Load 113 + 116: 27(ptr) AccessChain 10(dti) 26 + 117: 6(int) Load 116 + 119: 118(ptr) AccessChain 24(data) 25 117 115 + 120: 17(fvec4) Load 119 + 121: 17(fvec4) GroupNonUniformFAdd 35 InclusiveScan 120 + 122: 118(ptr) AccessChain 24(data) 25 114 115 + Store 122 121 + 123: 27(ptr) AccessChain 10(dti) 26 + 124: 6(int) Load 123 + 125: 27(ptr) AccessChain 10(dti) 26 + 126: 6(int) Load 125 + 128: 127(ptr) AccessChain 24(data) 25 126 115 26 + 129: 16(float) Load 128 + 130: 16(float) GroupNonUniformFAdd 35 InclusiveScan 129 + 131: 127(ptr) AccessChain 24(data) 25 124 115 26 + Store 131 130 + 132: 27(ptr) AccessChain 10(dti) 26 + 133: 6(int) Load 132 + 134: 27(ptr) AccessChain 10(dti) 26 + 135: 6(int) Load 134 + 137: 118(ptr) AccessChain 24(data) 25 135 115 + 138: 17(fvec4) Load 137 + 139: 136(fvec2) VectorShuffle 138 138 0 1 + 140: 136(fvec2) GroupNonUniformFAdd 35 InclusiveScan 139 + 141: 118(ptr) AccessChain 24(data) 25 133 115 + 142: 17(fvec4) Load 141 + 143: 17(fvec4) VectorShuffle 142 140 4 5 2 3 + Store 141 143 + 144: 27(ptr) AccessChain 10(dti) 26 + 145: 6(int) Load 144 + 146: 27(ptr) AccessChain 10(dti) 26 + 147: 6(int) Load 146 + 149: 118(ptr) AccessChain 24(data) 25 147 115 + 150: 17(fvec4) Load 149 + 151: 148(fvec3) VectorShuffle 150 150 0 1 2 + 152: 148(fvec3) GroupNonUniformFAdd 35 InclusiveScan 151 + 153: 118(ptr) AccessChain 24(data) 25 145 115 + 154: 17(fvec4) Load 153 + 155: 17(fvec4) VectorShuffle 154 152 4 5 6 3 + Store 153 155 + 156: 27(ptr) AccessChain 10(dti) 26 + 157: 6(int) Load 156 + 159: 27(ptr) AccessChain 10(dti) 26 + 160: 6(int) Load 159 + 162: 161(ptr) AccessChain 24(data) 25 160 158 + 163: 19(fvec4) Load 162 + 164: 19(fvec4) GroupNonUniformFAdd 35 InclusiveScan 163 + 165: 161(ptr) AccessChain 24(data) 25 157 158 + Store 165 164 + 166: 27(ptr) AccessChain 10(dti) 26 + 167: 6(int) Load 166 + 168: 27(ptr) AccessChain 10(dti) 26 + 169: 6(int) Load 168 + 171: 170(ptr) AccessChain 24(data) 25 169 158 26 + 172: 18(float) Load 171 + 173: 18(float) GroupNonUniformFAdd 35 InclusiveScan 172 + 174: 170(ptr) AccessChain 24(data) 25 167 158 26 + Store 174 173 + 175: 27(ptr) AccessChain 10(dti) 26 + 176: 6(int) Load 175 + 177: 27(ptr) AccessChain 10(dti) 26 + 178: 6(int) Load 177 + 180: 161(ptr) AccessChain 24(data) 25 178 158 + 181: 19(fvec4) Load 180 + 182: 179(fvec2) VectorShuffle 181 181 0 1 + 183: 179(fvec2) GroupNonUniformFAdd 35 InclusiveScan 182 + 184: 161(ptr) AccessChain 24(data) 25 176 158 + 185: 19(fvec4) Load 184 + 186: 19(fvec4) VectorShuffle 185 183 4 5 2 3 + Store 184 186 + 187: 27(ptr) AccessChain 10(dti) 26 + 188: 6(int) Load 187 + 189: 27(ptr) AccessChain 10(dti) 26 + 190: 6(int) Load 189 + 192: 161(ptr) AccessChain 24(data) 25 190 158 + 193: 19(fvec4) Load 192 + 194: 191(fvec3) VectorShuffle 193 193 0 1 2 + 195: 191(fvec3) GroupNonUniformFAdd 35 InclusiveScan 194 + 196: 161(ptr) AccessChain 24(data) 25 188 158 + 197: 19(fvec4) Load 196 + 198: 19(fvec4) VectorShuffle 197 195 4 5 6 3 + Store 196 198 + 199: 27(ptr) AccessChain 10(dti) 26 + 200: 6(int) Load 199 + 201: 27(ptr) AccessChain 10(dti) 26 + 202: 6(int) Load 201 + 203: 32(ptr) AccessChain 24(data) 25 202 25 + 204: 13(ivec4) Load 203 + 205: 13(ivec4) GroupNonUniformIMul 35 InclusiveScan 204 + 206: 32(ptr) AccessChain 24(data) 25 200 25 + Store 206 205 + 207: 27(ptr) AccessChain 10(dti) 26 + 208: 6(int) Load 207 + 209: 27(ptr) AccessChain 10(dti) 26 + 210: 6(int) Load 209 + 211: 42(ptr) AccessChain 24(data) 25 210 25 26 + 212: 6(int) Load 211 + 213: 6(int) GroupNonUniformIMul 35 InclusiveScan 212 + 214: 42(ptr) AccessChain 24(data) 25 208 25 26 + Store 214 213 + 215: 27(ptr) AccessChain 10(dti) 26 + 216: 6(int) Load 215 + 217: 27(ptr) AccessChain 10(dti) 26 + 218: 6(int) Load 217 + 219: 32(ptr) AccessChain 24(data) 25 218 25 + 220: 13(ivec4) Load 219 + 221: 51(ivec2) VectorShuffle 220 220 0 1 + 222: 51(ivec2) GroupNonUniformIMul 35 InclusiveScan 221 + 223: 32(ptr) AccessChain 24(data) 25 216 25 + 224: 13(ivec4) Load 223 + 225: 13(ivec4) VectorShuffle 224 222 4 5 2 3 + Store 223 225 + 226: 27(ptr) AccessChain 10(dti) 26 + 227: 6(int) Load 226 + 228: 27(ptr) AccessChain 10(dti) 26 + 229: 6(int) Load 228 + 230: 32(ptr) AccessChain 24(data) 25 229 25 + 231: 13(ivec4) Load 230 + 232: 7(ivec3) VectorShuffle 231 231 0 1 2 + 233: 7(ivec3) GroupNonUniformIMul 35 InclusiveScan 232 + 234: 32(ptr) AccessChain 24(data) 25 227 25 + 235: 13(ivec4) Load 234 + 236: 13(ivec4) VectorShuffle 235 233 4 5 6 3 + Store 234 236 + 237: 27(ptr) AccessChain 10(dti) 26 + 238: 6(int) Load 237 + 239: 27(ptr) AccessChain 10(dti) 26 + 240: 6(int) Load 239 + 241: 75(ptr) AccessChain 24(data) 25 240 72 + 242: 15(ivec4) Load 241 + 243: 15(ivec4) GroupNonUniformIMul 35 InclusiveScan 242 + 244: 75(ptr) AccessChain 24(data) 25 238 72 + Store 244 243 + 245: 27(ptr) AccessChain 10(dti) 26 + 246: 6(int) Load 245 + 247: 27(ptr) AccessChain 10(dti) 26 + 248: 6(int) Load 247 + 249: 84(ptr) AccessChain 24(data) 25 248 72 26 + 250: 14(int) Load 249 + 251: 14(int) GroupNonUniformIMul 35 InclusiveScan 250 + 252: 84(ptr) AccessChain 24(data) 25 246 72 26 + Store 252 251 + 253: 27(ptr) AccessChain 10(dti) 26 + 254: 6(int) Load 253 + 255: 27(ptr) AccessChain 10(dti) 26 + 256: 6(int) Load 255 + 257: 75(ptr) AccessChain 24(data) 25 256 72 + 258: 15(ivec4) Load 257 + 259: 93(ivec2) VectorShuffle 258 258 0 1 + 260: 93(ivec2) GroupNonUniformIMul 35 InclusiveScan 259 + 261: 75(ptr) AccessChain 24(data) 25 254 72 + 262: 15(ivec4) Load 261 + 263: 15(ivec4) VectorShuffle 262 260 4 5 2 3 + Store 261 263 + 264: 27(ptr) AccessChain 10(dti) 26 + 265: 6(int) Load 264 + 266: 27(ptr) AccessChain 10(dti) 26 + 267: 6(int) Load 266 + 268: 75(ptr) AccessChain 24(data) 25 267 72 + 269: 15(ivec4) Load 268 + 270: 105(ivec3) VectorShuffle 269 269 0 1 2 + 271: 105(ivec3) GroupNonUniformIMul 35 InclusiveScan 270 + 272: 75(ptr) AccessChain 24(data) 25 265 72 + 273: 15(ivec4) Load 272 + 274: 15(ivec4) VectorShuffle 273 271 4 5 6 3 + Store 272 274 + 275: 27(ptr) AccessChain 10(dti) 26 + 276: 6(int) Load 275 + 277: 27(ptr) AccessChain 10(dti) 26 + 278: 6(int) Load 277 + 279: 118(ptr) AccessChain 24(data) 25 278 115 + 280: 17(fvec4) Load 279 + 281: 17(fvec4) GroupNonUniformFMul 35 InclusiveScan 280 + 282: 118(ptr) AccessChain 24(data) 25 276 115 + Store 282 281 + 283: 27(ptr) AccessChain 10(dti) 26 + 284: 6(int) Load 283 + 285: 27(ptr) AccessChain 10(dti) 26 + 286: 6(int) Load 285 + 287: 127(ptr) AccessChain 24(data) 25 286 115 26 + 288: 16(float) Load 287 + 289: 16(float) GroupNonUniformFMul 35 InclusiveScan 288 + 290: 127(ptr) AccessChain 24(data) 25 284 115 26 + Store 290 289 + 291: 27(ptr) AccessChain 10(dti) 26 + 292: 6(int) Load 291 + 293: 27(ptr) AccessChain 10(dti) 26 + 294: 6(int) Load 293 + 295: 118(ptr) AccessChain 24(data) 25 294 115 + 296: 17(fvec4) Load 295 + 297: 136(fvec2) VectorShuffle 296 296 0 1 + 298: 136(fvec2) GroupNonUniformFMul 35 InclusiveScan 297 + 299: 118(ptr) AccessChain 24(data) 25 292 115 + 300: 17(fvec4) Load 299 + 301: 17(fvec4) VectorShuffle 300 298 4 5 2 3 + Store 299 301 + 302: 27(ptr) AccessChain 10(dti) 26 + 303: 6(int) Load 302 + 304: 27(ptr) AccessChain 10(dti) 26 + 305: 6(int) Load 304 + 306: 118(ptr) AccessChain 24(data) 25 305 115 + 307: 17(fvec4) Load 306 + 308: 148(fvec3) VectorShuffle 307 307 0 1 2 + 309: 148(fvec3) GroupNonUniformFMul 35 InclusiveScan 308 + 310: 118(ptr) AccessChain 24(data) 25 303 115 + 311: 17(fvec4) Load 310 + 312: 17(fvec4) VectorShuffle 311 309 4 5 6 3 + Store 310 312 + 313: 27(ptr) AccessChain 10(dti) 26 + 314: 6(int) Load 313 + 315: 27(ptr) AccessChain 10(dti) 26 + 316: 6(int) Load 315 + 317: 161(ptr) AccessChain 24(data) 25 316 158 + 318: 19(fvec4) Load 317 + 319: 19(fvec4) GroupNonUniformFMul 35 InclusiveScan 318 + 320: 161(ptr) AccessChain 24(data) 25 314 158 + Store 320 319 + 321: 27(ptr) AccessChain 10(dti) 26 + 322: 6(int) Load 321 + 323: 27(ptr) AccessChain 10(dti) 26 + 324: 6(int) Load 323 + 325: 170(ptr) AccessChain 24(data) 25 324 158 26 + 326: 18(float) Load 325 + 327: 18(float) GroupNonUniformFMul 35 InclusiveScan 326 + 328: 170(ptr) AccessChain 24(data) 25 322 158 26 + Store 328 327 + 329: 27(ptr) AccessChain 10(dti) 26 + 330: 6(int) Load 329 + 331: 27(ptr) AccessChain 10(dti) 26 + 332: 6(int) Load 331 + 333: 161(ptr) AccessChain 24(data) 25 332 158 + 334: 19(fvec4) Load 333 + 335: 179(fvec2) VectorShuffle 334 334 0 1 + 336: 179(fvec2) GroupNonUniformFMul 35 InclusiveScan 335 + 337: 161(ptr) AccessChain 24(data) 25 330 158 + 338: 19(fvec4) Load 337 + 339: 19(fvec4) VectorShuffle 338 336 4 5 2 3 + Store 337 339 + 340: 27(ptr) AccessChain 10(dti) 26 + 341: 6(int) Load 340 + 342: 27(ptr) AccessChain 10(dti) 26 + 343: 6(int) Load 342 + 344: 161(ptr) AccessChain 24(data) 25 343 158 + 345: 19(fvec4) Load 344 + 346: 191(fvec3) VectorShuffle 345 345 0 1 2 + 347: 191(fvec3) GroupNonUniformFMul 35 InclusiveScan 346 + 348: 161(ptr) AccessChain 24(data) 25 341 158 + 349: 19(fvec4) Load 348 + 350: 19(fvec4) VectorShuffle 349 347 4 5 6 3 + Store 348 350 + 351: 27(ptr) AccessChain 10(dti) 26 + 352: 6(int) Load 351 + 353: 27(ptr) AccessChain 10(dti) 26 + 354: 6(int) Load 353 + 355: 42(ptr) AccessChain 24(data) 25 354 25 26 + 356: 6(int) Load 355 + 358: 357(bool) IEqual 356 26 + 359: 13(ivec4) GroupNonUniformBallot 35 358 + 360: 6(int) GroupNonUniformBallotBitCount 35 InclusiveScan 359 + 361: 42(ptr) AccessChain 24(data) 25 352 25 26 + Store 361 360 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.wavequad.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.wavequad.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.wavequad.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.wavequad.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,9299 @@ +hlsl.wavequad.comp +Shader version: 500 +local_size = (32, 16, 1) +0:? Sequence +0:13 Function Definition: @CSMain(vu3; ( temp void) +0:13 Function Parameters: +0:13 'dti' ( in 3-component vector of uint) +0:? Sequence +0:14 move second child to first child ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:14 subgroupQuadBroadcast ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const uint) +0:15 move second child to first child ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 subgroupQuadBroadcast ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const uint) +0:16 move second child to first child ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:16 subgroupQuadBroadcast ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:16 Constant: +0:16 0 (const uint) +0:17 move second child to first child ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:17 subgroupQuadBroadcast ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:17 Constant: +0:17 0 (const uint) +0:19 move second child to first child ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:19 subgroupQuadBroadcast ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:19 Constant: +0:19 0 (const uint) +0:20 move second child to first child ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:20 subgroupQuadBroadcast ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 0 (const uint) +0:21 move second child to first child ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 subgroupQuadBroadcast ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Constant: +0:21 0 (const uint) +0:22 move second child to first child ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:22 subgroupQuadBroadcast ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:22 Constant: +0:22 0 (const uint) +0:24 move second child to first child ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:24 subgroupQuadBroadcast ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:24 Constant: +0:24 0 (const uint) +0:25 move second child to first child ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:25 subgroupQuadBroadcast ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 0 (const uint) +0:26 move second child to first child ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:26 subgroupQuadBroadcast ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:26 Constant: +0:26 0 (const uint) +0:27 move second child to first child ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 subgroupQuadBroadcast ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Constant: +0:27 0 (const uint) +0:29 move second child to first child ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:29 subgroupQuadBroadcast ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:29 Constant: +0:29 0 (const uint) +0:30 move second child to first child ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:30 subgroupQuadBroadcast ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 0 (const uint) +0:31 move second child to first child ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:31 subgroupQuadBroadcast ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:31 Constant: +0:31 0 (const uint) +0:32 move second child to first child ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:32 subgroupQuadBroadcast ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:32 Constant: +0:32 0 (const uint) +0:34 move second child to first child ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:34 subgroupQuadBroadcast ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 1 (const uint) +0:35 move second child to first child ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 subgroupQuadBroadcast ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 1 (const uint) +0:36 move second child to first child ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:36 subgroupQuadBroadcast ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:36 Constant: +0:36 1 (const uint) +0:37 move second child to first child ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:37 subgroupQuadBroadcast ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:37 Constant: +0:37 1 (const uint) +0:39 move second child to first child ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:39 subgroupQuadBroadcast ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:39 Constant: +0:39 1 (const uint) +0:40 move second child to first child ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:40 subgroupQuadBroadcast ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const uint) +0:41 move second child to first child ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 subgroupQuadBroadcast ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Constant: +0:41 1 (const uint) +0:42 move second child to first child ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:42 subgroupQuadBroadcast ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:42 Constant: +0:42 1 (const uint) +0:44 move second child to first child ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:44 subgroupQuadBroadcast ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:44 Constant: +0:44 1 (const uint) +0:45 move second child to first child ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:45 subgroupQuadBroadcast ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 1 (const uint) +0:46 move second child to first child ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:46 subgroupQuadBroadcast ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:46 Constant: +0:46 1 (const uint) +0:47 move second child to first child ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 subgroupQuadBroadcast ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Constant: +0:47 1 (const uint) +0:49 move second child to first child ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:49 subgroupQuadBroadcast ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:49 Constant: +0:49 1 (const uint) +0:50 move second child to first child ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:50 subgroupQuadBroadcast ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 1 (const uint) +0:51 move second child to first child ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:51 subgroupQuadBroadcast ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:51 Constant: +0:51 1 (const uint) +0:52 move second child to first child ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:52 subgroupQuadBroadcast ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:52 Constant: +0:52 1 (const uint) +0:54 move second child to first child ( temp 4-component vector of uint) +0:54 u: direct index for structure ( temp 4-component vector of uint) +0:54 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:54 Constant: +0:54 0 (const uint) +0:54 direct index ( temp uint) +0:54 'dti' ( in 3-component vector of uint) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 subgroupQuadBroadcast ( temp 4-component vector of uint) +0:54 u: direct index for structure ( temp 4-component vector of uint) +0:54 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:54 Constant: +0:54 0 (const uint) +0:54 direct index ( temp uint) +0:54 'dti' ( in 3-component vector of uint) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 2 (const uint) +0:55 move second child to first child ( temp uint) +0:55 direct index ( temp uint) +0:55 u: direct index for structure ( temp 4-component vector of uint) +0:55 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:55 Constant: +0:55 0 (const uint) +0:55 direct index ( temp uint) +0:55 'dti' ( in 3-component vector of uint) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 subgroupQuadBroadcast ( temp uint) +0:55 direct index ( temp uint) +0:55 u: direct index for structure ( temp 4-component vector of uint) +0:55 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:55 Constant: +0:55 0 (const uint) +0:55 direct index ( temp uint) +0:55 'dti' ( in 3-component vector of uint) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 2 (const uint) +0:56 move second child to first child ( temp 2-component vector of uint) +0:56 vector swizzle ( temp 2-component vector of uint) +0:56 u: direct index for structure ( temp 4-component vector of uint) +0:56 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:56 Constant: +0:56 0 (const uint) +0:56 direct index ( temp uint) +0:56 'dti' ( in 3-component vector of uint) +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 0 (const int) +0:56 Sequence +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 1 (const int) +0:56 subgroupQuadBroadcast ( temp 2-component vector of uint) +0:56 vector swizzle ( temp 2-component vector of uint) +0:56 u: direct index for structure ( temp 4-component vector of uint) +0:56 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:56 Constant: +0:56 0 (const uint) +0:56 direct index ( temp uint) +0:56 'dti' ( in 3-component vector of uint) +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 0 (const int) +0:56 Sequence +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 1 (const int) +0:56 Constant: +0:56 2 (const uint) +0:57 move second child to first child ( temp 3-component vector of uint) +0:57 vector swizzle ( temp 3-component vector of uint) +0:57 u: direct index for structure ( temp 4-component vector of uint) +0:57 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:57 Constant: +0:57 0 (const uint) +0:57 direct index ( temp uint) +0:57 'dti' ( in 3-component vector of uint) +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 0 (const int) +0:57 Sequence +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 1 (const int) +0:57 Constant: +0:57 2 (const int) +0:57 subgroupQuadBroadcast ( temp 3-component vector of uint) +0:57 vector swizzle ( temp 3-component vector of uint) +0:57 u: direct index for structure ( temp 4-component vector of uint) +0:57 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:57 Constant: +0:57 0 (const uint) +0:57 direct index ( temp uint) +0:57 'dti' ( in 3-component vector of uint) +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 0 (const int) +0:57 Sequence +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 1 (const int) +0:57 Constant: +0:57 2 (const int) +0:57 Constant: +0:57 2 (const uint) +0:59 move second child to first child ( temp 4-component vector of int) +0:59 i: direct index for structure ( temp 4-component vector of int) +0:59 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:59 Constant: +0:59 0 (const uint) +0:59 direct index ( temp uint) +0:59 'dti' ( in 3-component vector of uint) +0:59 Constant: +0:59 0 (const int) +0:59 Constant: +0:59 1 (const int) +0:59 subgroupQuadBroadcast ( temp 4-component vector of int) +0:59 i: direct index for structure ( temp 4-component vector of int) +0:59 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:59 Constant: +0:59 0 (const uint) +0:59 direct index ( temp uint) +0:59 'dti' ( in 3-component vector of uint) +0:59 Constant: +0:59 0 (const int) +0:59 Constant: +0:59 1 (const int) +0:59 Constant: +0:59 2 (const uint) +0:60 move second child to first child ( temp int) +0:60 direct index ( temp int) +0:60 i: direct index for structure ( temp 4-component vector of int) +0:60 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:60 Constant: +0:60 0 (const uint) +0:60 direct index ( temp uint) +0:60 'dti' ( in 3-component vector of uint) +0:60 Constant: +0:60 0 (const int) +0:60 Constant: +0:60 1 (const int) +0:60 Constant: +0:60 0 (const int) +0:60 subgroupQuadBroadcast ( temp int) +0:60 direct index ( temp int) +0:60 i: direct index for structure ( temp 4-component vector of int) +0:60 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:60 Constant: +0:60 0 (const uint) +0:60 direct index ( temp uint) +0:60 'dti' ( in 3-component vector of uint) +0:60 Constant: +0:60 0 (const int) +0:60 Constant: +0:60 1 (const int) +0:60 Constant: +0:60 0 (const int) +0:60 Constant: +0:60 2 (const uint) +0:61 move second child to first child ( temp 2-component vector of int) +0:61 vector swizzle ( temp 2-component vector of int) +0:61 i: direct index for structure ( temp 4-component vector of int) +0:61 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:61 Constant: +0:61 0 (const uint) +0:61 direct index ( temp uint) +0:61 'dti' ( in 3-component vector of uint) +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 Sequence +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 subgroupQuadBroadcast ( temp 2-component vector of int) +0:61 vector swizzle ( temp 2-component vector of int) +0:61 i: direct index for structure ( temp 4-component vector of int) +0:61 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:61 Constant: +0:61 0 (const uint) +0:61 direct index ( temp uint) +0:61 'dti' ( in 3-component vector of uint) +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 Sequence +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 Constant: +0:61 2 (const uint) +0:62 move second child to first child ( temp 3-component vector of int) +0:62 vector swizzle ( temp 3-component vector of int) +0:62 i: direct index for structure ( temp 4-component vector of int) +0:62 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:62 Constant: +0:62 0 (const uint) +0:62 direct index ( temp uint) +0:62 'dti' ( in 3-component vector of uint) +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Sequence +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Constant: +0:62 2 (const int) +0:62 subgroupQuadBroadcast ( temp 3-component vector of int) +0:62 vector swizzle ( temp 3-component vector of int) +0:62 i: direct index for structure ( temp 4-component vector of int) +0:62 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:62 Constant: +0:62 0 (const uint) +0:62 direct index ( temp uint) +0:62 'dti' ( in 3-component vector of uint) +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Sequence +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Constant: +0:62 2 (const int) +0:62 Constant: +0:62 2 (const uint) +0:64 move second child to first child ( temp 4-component vector of float) +0:64 f: direct index for structure ( temp 4-component vector of float) +0:64 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:64 Constant: +0:64 0 (const uint) +0:64 direct index ( temp uint) +0:64 'dti' ( in 3-component vector of uint) +0:64 Constant: +0:64 0 (const int) +0:64 Constant: +0:64 2 (const int) +0:64 subgroupQuadBroadcast ( temp 4-component vector of float) +0:64 f: direct index for structure ( temp 4-component vector of float) +0:64 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:64 Constant: +0:64 0 (const uint) +0:64 direct index ( temp uint) +0:64 'dti' ( in 3-component vector of uint) +0:64 Constant: +0:64 0 (const int) +0:64 Constant: +0:64 2 (const int) +0:64 Constant: +0:64 2 (const uint) +0:65 move second child to first child ( temp float) +0:65 direct index ( temp float) +0:65 f: direct index for structure ( temp 4-component vector of float) +0:65 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:65 Constant: +0:65 0 (const uint) +0:65 direct index ( temp uint) +0:65 'dti' ( in 3-component vector of uint) +0:65 Constant: +0:65 0 (const int) +0:65 Constant: +0:65 2 (const int) +0:65 Constant: +0:65 0 (const int) +0:65 subgroupQuadBroadcast ( temp float) +0:65 direct index ( temp float) +0:65 f: direct index for structure ( temp 4-component vector of float) +0:65 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:65 Constant: +0:65 0 (const uint) +0:65 direct index ( temp uint) +0:65 'dti' ( in 3-component vector of uint) +0:65 Constant: +0:65 0 (const int) +0:65 Constant: +0:65 2 (const int) +0:65 Constant: +0:65 0 (const int) +0:65 Constant: +0:65 2 (const uint) +0:66 move second child to first child ( temp 2-component vector of float) +0:66 vector swizzle ( temp 2-component vector of float) +0:66 f: direct index for structure ( temp 4-component vector of float) +0:66 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:66 Constant: +0:66 0 (const uint) +0:66 direct index ( temp uint) +0:66 'dti' ( in 3-component vector of uint) +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 2 (const int) +0:66 Sequence +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 1 (const int) +0:66 subgroupQuadBroadcast ( temp 2-component vector of float) +0:66 vector swizzle ( temp 2-component vector of float) +0:66 f: direct index for structure ( temp 4-component vector of float) +0:66 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:66 Constant: +0:66 0 (const uint) +0:66 direct index ( temp uint) +0:66 'dti' ( in 3-component vector of uint) +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 2 (const int) +0:66 Sequence +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 1 (const int) +0:66 Constant: +0:66 2 (const uint) +0:67 move second child to first child ( temp 3-component vector of float) +0:67 vector swizzle ( temp 3-component vector of float) +0:67 f: direct index for structure ( temp 4-component vector of float) +0:67 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:67 Constant: +0:67 0 (const uint) +0:67 direct index ( temp uint) +0:67 'dti' ( in 3-component vector of uint) +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 Sequence +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 1 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 subgroupQuadBroadcast ( temp 3-component vector of float) +0:67 vector swizzle ( temp 3-component vector of float) +0:67 f: direct index for structure ( temp 4-component vector of float) +0:67 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:67 Constant: +0:67 0 (const uint) +0:67 direct index ( temp uint) +0:67 'dti' ( in 3-component vector of uint) +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 Sequence +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 1 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 Constant: +0:67 2 (const uint) +0:69 move second child to first child ( temp 4-component vector of double) +0:69 d: direct index for structure ( temp 4-component vector of double) +0:69 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:69 Constant: +0:69 0 (const uint) +0:69 direct index ( temp uint) +0:69 'dti' ( in 3-component vector of uint) +0:69 Constant: +0:69 0 (const int) +0:69 Constant: +0:69 3 (const int) +0:69 subgroupQuadBroadcast ( temp 4-component vector of double) +0:69 d: direct index for structure ( temp 4-component vector of double) +0:69 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:69 Constant: +0:69 0 (const uint) +0:69 direct index ( temp uint) +0:69 'dti' ( in 3-component vector of uint) +0:69 Constant: +0:69 0 (const int) +0:69 Constant: +0:69 3 (const int) +0:69 Constant: +0:69 2 (const uint) +0:70 move second child to first child ( temp double) +0:70 direct index ( temp double) +0:70 d: direct index for structure ( temp 4-component vector of double) +0:70 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:70 Constant: +0:70 0 (const uint) +0:70 direct index ( temp uint) +0:70 'dti' ( in 3-component vector of uint) +0:70 Constant: +0:70 0 (const int) +0:70 Constant: +0:70 3 (const int) +0:70 Constant: +0:70 0 (const int) +0:70 subgroupQuadBroadcast ( temp double) +0:70 direct index ( temp double) +0:70 d: direct index for structure ( temp 4-component vector of double) +0:70 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:70 Constant: +0:70 0 (const uint) +0:70 direct index ( temp uint) +0:70 'dti' ( in 3-component vector of uint) +0:70 Constant: +0:70 0 (const int) +0:70 Constant: +0:70 3 (const int) +0:70 Constant: +0:70 0 (const int) +0:70 Constant: +0:70 2 (const uint) +0:71 move second child to first child ( temp 2-component vector of double) +0:71 vector swizzle ( temp 2-component vector of double) +0:71 d: direct index for structure ( temp 4-component vector of double) +0:71 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:71 Constant: +0:71 0 (const uint) +0:71 direct index ( temp uint) +0:71 'dti' ( in 3-component vector of uint) +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 3 (const int) +0:71 Sequence +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 1 (const int) +0:71 subgroupQuadBroadcast ( temp 2-component vector of double) +0:71 vector swizzle ( temp 2-component vector of double) +0:71 d: direct index for structure ( temp 4-component vector of double) +0:71 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:71 Constant: +0:71 0 (const uint) +0:71 direct index ( temp uint) +0:71 'dti' ( in 3-component vector of uint) +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 3 (const int) +0:71 Sequence +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 1 (const int) +0:71 Constant: +0:71 2 (const uint) +0:72 move second child to first child ( temp 3-component vector of double) +0:72 vector swizzle ( temp 3-component vector of double) +0:72 d: direct index for structure ( temp 4-component vector of double) +0:72 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:72 Constant: +0:72 0 (const uint) +0:72 direct index ( temp uint) +0:72 'dti' ( in 3-component vector of uint) +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 3 (const int) +0:72 Sequence +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 1 (const int) +0:72 Constant: +0:72 2 (const int) +0:72 subgroupQuadBroadcast ( temp 3-component vector of double) +0:72 vector swizzle ( temp 3-component vector of double) +0:72 d: direct index for structure ( temp 4-component vector of double) +0:72 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:72 Constant: +0:72 0 (const uint) +0:72 direct index ( temp uint) +0:72 'dti' ( in 3-component vector of uint) +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 3 (const int) +0:72 Sequence +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 1 (const int) +0:72 Constant: +0:72 2 (const int) +0:72 Constant: +0:72 2 (const uint) +0:74 move second child to first child ( temp 4-component vector of uint) +0:74 u: direct index for structure ( temp 4-component vector of uint) +0:74 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:74 Constant: +0:74 0 (const uint) +0:74 direct index ( temp uint) +0:74 'dti' ( in 3-component vector of uint) +0:74 Constant: +0:74 0 (const int) +0:74 Constant: +0:74 0 (const int) +0:74 subgroupQuadBroadcast ( temp 4-component vector of uint) +0:74 u: direct index for structure ( temp 4-component vector of uint) +0:74 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:74 Constant: +0:74 0 (const uint) +0:74 direct index ( temp uint) +0:74 'dti' ( in 3-component vector of uint) +0:74 Constant: +0:74 0 (const int) +0:74 Constant: +0:74 0 (const int) +0:74 Constant: +0:74 3 (const uint) +0:75 move second child to first child ( temp uint) +0:75 direct index ( temp uint) +0:75 u: direct index for structure ( temp 4-component vector of uint) +0:75 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:75 Constant: +0:75 0 (const uint) +0:75 direct index ( temp uint) +0:75 'dti' ( in 3-component vector of uint) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 subgroupQuadBroadcast ( temp uint) +0:75 direct index ( temp uint) +0:75 u: direct index for structure ( temp 4-component vector of uint) +0:75 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:75 Constant: +0:75 0 (const uint) +0:75 direct index ( temp uint) +0:75 'dti' ( in 3-component vector of uint) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 3 (const uint) +0:76 move second child to first child ( temp 2-component vector of uint) +0:76 vector swizzle ( temp 2-component vector of uint) +0:76 u: direct index for structure ( temp 4-component vector of uint) +0:76 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:76 Constant: +0:76 0 (const uint) +0:76 direct index ( temp uint) +0:76 'dti' ( in 3-component vector of uint) +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 0 (const int) +0:76 Sequence +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 1 (const int) +0:76 subgroupQuadBroadcast ( temp 2-component vector of uint) +0:76 vector swizzle ( temp 2-component vector of uint) +0:76 u: direct index for structure ( temp 4-component vector of uint) +0:76 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:76 Constant: +0:76 0 (const uint) +0:76 direct index ( temp uint) +0:76 'dti' ( in 3-component vector of uint) +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 0 (const int) +0:76 Sequence +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 1 (const int) +0:76 Constant: +0:76 3 (const uint) +0:77 move second child to first child ( temp 3-component vector of uint) +0:77 vector swizzle ( temp 3-component vector of uint) +0:77 u: direct index for structure ( temp 4-component vector of uint) +0:77 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:77 Constant: +0:77 0 (const uint) +0:77 direct index ( temp uint) +0:77 'dti' ( in 3-component vector of uint) +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 0 (const int) +0:77 Sequence +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 1 (const int) +0:77 Constant: +0:77 2 (const int) +0:77 subgroupQuadBroadcast ( temp 3-component vector of uint) +0:77 vector swizzle ( temp 3-component vector of uint) +0:77 u: direct index for structure ( temp 4-component vector of uint) +0:77 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:77 Constant: +0:77 0 (const uint) +0:77 direct index ( temp uint) +0:77 'dti' ( in 3-component vector of uint) +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 0 (const int) +0:77 Sequence +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 1 (const int) +0:77 Constant: +0:77 2 (const int) +0:77 Constant: +0:77 3 (const uint) +0:79 move second child to first child ( temp 4-component vector of int) +0:79 i: direct index for structure ( temp 4-component vector of int) +0:79 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:79 Constant: +0:79 0 (const uint) +0:79 direct index ( temp uint) +0:79 'dti' ( in 3-component vector of uint) +0:79 Constant: +0:79 0 (const int) +0:79 Constant: +0:79 1 (const int) +0:79 subgroupQuadBroadcast ( temp 4-component vector of int) +0:79 i: direct index for structure ( temp 4-component vector of int) +0:79 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:79 Constant: +0:79 0 (const uint) +0:79 direct index ( temp uint) +0:79 'dti' ( in 3-component vector of uint) +0:79 Constant: +0:79 0 (const int) +0:79 Constant: +0:79 1 (const int) +0:79 Constant: +0:79 3 (const uint) +0:80 move second child to first child ( temp int) +0:80 direct index ( temp int) +0:80 i: direct index for structure ( temp 4-component vector of int) +0:80 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:80 Constant: +0:80 0 (const uint) +0:80 direct index ( temp uint) +0:80 'dti' ( in 3-component vector of uint) +0:80 Constant: +0:80 0 (const int) +0:80 Constant: +0:80 1 (const int) +0:80 Constant: +0:80 0 (const int) +0:80 subgroupQuadBroadcast ( temp int) +0:80 direct index ( temp int) +0:80 i: direct index for structure ( temp 4-component vector of int) +0:80 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:80 Constant: +0:80 0 (const uint) +0:80 direct index ( temp uint) +0:80 'dti' ( in 3-component vector of uint) +0:80 Constant: +0:80 0 (const int) +0:80 Constant: +0:80 1 (const int) +0:80 Constant: +0:80 0 (const int) +0:80 Constant: +0:80 3 (const uint) +0:81 move second child to first child ( temp 2-component vector of int) +0:81 vector swizzle ( temp 2-component vector of int) +0:81 i: direct index for structure ( temp 4-component vector of int) +0:81 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:81 Constant: +0:81 0 (const uint) +0:81 direct index ( temp uint) +0:81 'dti' ( in 3-component vector of uint) +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 Sequence +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 subgroupQuadBroadcast ( temp 2-component vector of int) +0:81 vector swizzle ( temp 2-component vector of int) +0:81 i: direct index for structure ( temp 4-component vector of int) +0:81 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:81 Constant: +0:81 0 (const uint) +0:81 direct index ( temp uint) +0:81 'dti' ( in 3-component vector of uint) +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 Sequence +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 Constant: +0:81 3 (const uint) +0:82 move second child to first child ( temp 3-component vector of int) +0:82 vector swizzle ( temp 3-component vector of int) +0:82 i: direct index for structure ( temp 4-component vector of int) +0:82 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:82 Constant: +0:82 0 (const uint) +0:82 direct index ( temp uint) +0:82 'dti' ( in 3-component vector of uint) +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Sequence +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Constant: +0:82 2 (const int) +0:82 subgroupQuadBroadcast ( temp 3-component vector of int) +0:82 vector swizzle ( temp 3-component vector of int) +0:82 i: direct index for structure ( temp 4-component vector of int) +0:82 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:82 Constant: +0:82 0 (const uint) +0:82 direct index ( temp uint) +0:82 'dti' ( in 3-component vector of uint) +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Sequence +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Constant: +0:82 2 (const int) +0:82 Constant: +0:82 3 (const uint) +0:84 move second child to first child ( temp 4-component vector of float) +0:84 f: direct index for structure ( temp 4-component vector of float) +0:84 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:84 Constant: +0:84 0 (const uint) +0:84 direct index ( temp uint) +0:84 'dti' ( in 3-component vector of uint) +0:84 Constant: +0:84 0 (const int) +0:84 Constant: +0:84 2 (const int) +0:84 subgroupQuadBroadcast ( temp 4-component vector of float) +0:84 f: direct index for structure ( temp 4-component vector of float) +0:84 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:84 Constant: +0:84 0 (const uint) +0:84 direct index ( temp uint) +0:84 'dti' ( in 3-component vector of uint) +0:84 Constant: +0:84 0 (const int) +0:84 Constant: +0:84 2 (const int) +0:84 Constant: +0:84 3 (const uint) +0:85 move second child to first child ( temp float) +0:85 direct index ( temp float) +0:85 f: direct index for structure ( temp 4-component vector of float) +0:85 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:85 Constant: +0:85 0 (const uint) +0:85 direct index ( temp uint) +0:85 'dti' ( in 3-component vector of uint) +0:85 Constant: +0:85 0 (const int) +0:85 Constant: +0:85 2 (const int) +0:85 Constant: +0:85 0 (const int) +0:85 subgroupQuadBroadcast ( temp float) +0:85 direct index ( temp float) +0:85 f: direct index for structure ( temp 4-component vector of float) +0:85 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:85 Constant: +0:85 0 (const uint) +0:85 direct index ( temp uint) +0:85 'dti' ( in 3-component vector of uint) +0:85 Constant: +0:85 0 (const int) +0:85 Constant: +0:85 2 (const int) +0:85 Constant: +0:85 0 (const int) +0:85 Constant: +0:85 3 (const uint) +0:86 move second child to first child ( temp 2-component vector of float) +0:86 vector swizzle ( temp 2-component vector of float) +0:86 f: direct index for structure ( temp 4-component vector of float) +0:86 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:86 Constant: +0:86 0 (const uint) +0:86 direct index ( temp uint) +0:86 'dti' ( in 3-component vector of uint) +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 2 (const int) +0:86 Sequence +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 1 (const int) +0:86 subgroupQuadBroadcast ( temp 2-component vector of float) +0:86 vector swizzle ( temp 2-component vector of float) +0:86 f: direct index for structure ( temp 4-component vector of float) +0:86 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:86 Constant: +0:86 0 (const uint) +0:86 direct index ( temp uint) +0:86 'dti' ( in 3-component vector of uint) +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 2 (const int) +0:86 Sequence +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 1 (const int) +0:86 Constant: +0:86 3 (const uint) +0:87 move second child to first child ( temp 3-component vector of float) +0:87 vector swizzle ( temp 3-component vector of float) +0:87 f: direct index for structure ( temp 4-component vector of float) +0:87 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:87 Constant: +0:87 0 (const uint) +0:87 direct index ( temp uint) +0:87 'dti' ( in 3-component vector of uint) +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 Sequence +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 1 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 subgroupQuadBroadcast ( temp 3-component vector of float) +0:87 vector swizzle ( temp 3-component vector of float) +0:87 f: direct index for structure ( temp 4-component vector of float) +0:87 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:87 Constant: +0:87 0 (const uint) +0:87 direct index ( temp uint) +0:87 'dti' ( in 3-component vector of uint) +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 Sequence +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 1 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 Constant: +0:87 3 (const uint) +0:89 move second child to first child ( temp 4-component vector of double) +0:89 d: direct index for structure ( temp 4-component vector of double) +0:89 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:89 Constant: +0:89 0 (const uint) +0:89 direct index ( temp uint) +0:89 'dti' ( in 3-component vector of uint) +0:89 Constant: +0:89 0 (const int) +0:89 Constant: +0:89 3 (const int) +0:89 subgroupQuadBroadcast ( temp 4-component vector of double) +0:89 d: direct index for structure ( temp 4-component vector of double) +0:89 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:89 Constant: +0:89 0 (const uint) +0:89 direct index ( temp uint) +0:89 'dti' ( in 3-component vector of uint) +0:89 Constant: +0:89 0 (const int) +0:89 Constant: +0:89 3 (const int) +0:89 Constant: +0:89 3 (const uint) +0:90 move second child to first child ( temp double) +0:90 direct index ( temp double) +0:90 d: direct index for structure ( temp 4-component vector of double) +0:90 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:90 Constant: +0:90 0 (const uint) +0:90 direct index ( temp uint) +0:90 'dti' ( in 3-component vector of uint) +0:90 Constant: +0:90 0 (const int) +0:90 Constant: +0:90 3 (const int) +0:90 Constant: +0:90 0 (const int) +0:90 subgroupQuadBroadcast ( temp double) +0:90 direct index ( temp double) +0:90 d: direct index for structure ( temp 4-component vector of double) +0:90 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:90 Constant: +0:90 0 (const uint) +0:90 direct index ( temp uint) +0:90 'dti' ( in 3-component vector of uint) +0:90 Constant: +0:90 0 (const int) +0:90 Constant: +0:90 3 (const int) +0:90 Constant: +0:90 0 (const int) +0:90 Constant: +0:90 3 (const uint) +0:91 move second child to first child ( temp 2-component vector of double) +0:91 vector swizzle ( temp 2-component vector of double) +0:91 d: direct index for structure ( temp 4-component vector of double) +0:91 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:91 Constant: +0:91 0 (const uint) +0:91 direct index ( temp uint) +0:91 'dti' ( in 3-component vector of uint) +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 3 (const int) +0:91 Sequence +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 1 (const int) +0:91 subgroupQuadBroadcast ( temp 2-component vector of double) +0:91 vector swizzle ( temp 2-component vector of double) +0:91 d: direct index for structure ( temp 4-component vector of double) +0:91 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:91 Constant: +0:91 0 (const uint) +0:91 direct index ( temp uint) +0:91 'dti' ( in 3-component vector of uint) +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 3 (const int) +0:91 Sequence +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 1 (const int) +0:91 Constant: +0:91 3 (const uint) +0:92 move second child to first child ( temp 3-component vector of double) +0:92 vector swizzle ( temp 3-component vector of double) +0:92 d: direct index for structure ( temp 4-component vector of double) +0:92 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:92 Constant: +0:92 0 (const uint) +0:92 direct index ( temp uint) +0:92 'dti' ( in 3-component vector of uint) +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 3 (const int) +0:92 Sequence +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 1 (const int) +0:92 Constant: +0:92 2 (const int) +0:92 subgroupQuadBroadcast ( temp 3-component vector of double) +0:92 vector swizzle ( temp 3-component vector of double) +0:92 d: direct index for structure ( temp 4-component vector of double) +0:92 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:92 Constant: +0:92 0 (const uint) +0:92 direct index ( temp uint) +0:92 'dti' ( in 3-component vector of uint) +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 3 (const int) +0:92 Sequence +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 1 (const int) +0:92 Constant: +0:92 2 (const int) +0:92 Constant: +0:92 3 (const uint) +0:94 move second child to first child ( temp 4-component vector of uint) +0:94 u: direct index for structure ( temp 4-component vector of uint) +0:94 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:94 Constant: +0:94 0 (const uint) +0:94 direct index ( temp uint) +0:94 'dti' ( in 3-component vector of uint) +0:94 Constant: +0:94 0 (const int) +0:94 Constant: +0:94 0 (const int) +0:94 subgroupQuadSwapHorizontal ( temp 4-component vector of uint) +0:94 u: direct index for structure ( temp 4-component vector of uint) +0:94 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:94 Constant: +0:94 0 (const uint) +0:94 direct index ( temp uint) +0:94 'dti' ( in 3-component vector of uint) +0:94 Constant: +0:94 0 (const int) +0:94 Constant: +0:94 0 (const int) +0:95 move second child to first child ( temp uint) +0:95 direct index ( temp uint) +0:95 u: direct index for structure ( temp 4-component vector of uint) +0:95 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:95 Constant: +0:95 0 (const uint) +0:95 direct index ( temp uint) +0:95 'dti' ( in 3-component vector of uint) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:95 subgroupQuadSwapHorizontal ( temp uint) +0:95 direct index ( temp uint) +0:95 u: direct index for structure ( temp 4-component vector of uint) +0:95 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:95 Constant: +0:95 0 (const uint) +0:95 direct index ( temp uint) +0:95 'dti' ( in 3-component vector of uint) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:96 move second child to first child ( temp 2-component vector of uint) +0:96 vector swizzle ( temp 2-component vector of uint) +0:96 u: direct index for structure ( temp 4-component vector of uint) +0:96 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:96 Constant: +0:96 0 (const uint) +0:96 direct index ( temp uint) +0:96 'dti' ( in 3-component vector of uint) +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 0 (const int) +0:96 Sequence +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 1 (const int) +0:96 subgroupQuadSwapHorizontal ( temp 2-component vector of uint) +0:96 vector swizzle ( temp 2-component vector of uint) +0:96 u: direct index for structure ( temp 4-component vector of uint) +0:96 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:96 Constant: +0:96 0 (const uint) +0:96 direct index ( temp uint) +0:96 'dti' ( in 3-component vector of uint) +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 0 (const int) +0:96 Sequence +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 1 (const int) +0:97 move second child to first child ( temp 3-component vector of uint) +0:97 vector swizzle ( temp 3-component vector of uint) +0:97 u: direct index for structure ( temp 4-component vector of uint) +0:97 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:97 Constant: +0:97 0 (const uint) +0:97 direct index ( temp uint) +0:97 'dti' ( in 3-component vector of uint) +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 0 (const int) +0:97 Sequence +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 1 (const int) +0:97 Constant: +0:97 2 (const int) +0:97 subgroupQuadSwapHorizontal ( temp 3-component vector of uint) +0:97 vector swizzle ( temp 3-component vector of uint) +0:97 u: direct index for structure ( temp 4-component vector of uint) +0:97 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:97 Constant: +0:97 0 (const uint) +0:97 direct index ( temp uint) +0:97 'dti' ( in 3-component vector of uint) +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 0 (const int) +0:97 Sequence +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 1 (const int) +0:97 Constant: +0:97 2 (const int) +0:99 move second child to first child ( temp 4-component vector of int) +0:99 i: direct index for structure ( temp 4-component vector of int) +0:99 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:99 Constant: +0:99 0 (const uint) +0:99 direct index ( temp uint) +0:99 'dti' ( in 3-component vector of uint) +0:99 Constant: +0:99 0 (const int) +0:99 Constant: +0:99 1 (const int) +0:99 subgroupQuadSwapHorizontal ( temp 4-component vector of int) +0:99 i: direct index for structure ( temp 4-component vector of int) +0:99 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:99 Constant: +0:99 0 (const uint) +0:99 direct index ( temp uint) +0:99 'dti' ( in 3-component vector of uint) +0:99 Constant: +0:99 0 (const int) +0:99 Constant: +0:99 1 (const int) +0:100 move second child to first child ( temp int) +0:100 direct index ( temp int) +0:100 i: direct index for structure ( temp 4-component vector of int) +0:100 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:100 Constant: +0:100 0 (const uint) +0:100 direct index ( temp uint) +0:100 'dti' ( in 3-component vector of uint) +0:100 Constant: +0:100 0 (const int) +0:100 Constant: +0:100 1 (const int) +0:100 Constant: +0:100 0 (const int) +0:100 subgroupQuadSwapHorizontal ( temp int) +0:100 direct index ( temp int) +0:100 i: direct index for structure ( temp 4-component vector of int) +0:100 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:100 Constant: +0:100 0 (const uint) +0:100 direct index ( temp uint) +0:100 'dti' ( in 3-component vector of uint) +0:100 Constant: +0:100 0 (const int) +0:100 Constant: +0:100 1 (const int) +0:100 Constant: +0:100 0 (const int) +0:101 move second child to first child ( temp 2-component vector of int) +0:101 vector swizzle ( temp 2-component vector of int) +0:101 i: direct index for structure ( temp 4-component vector of int) +0:101 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:101 Constant: +0:101 0 (const uint) +0:101 direct index ( temp uint) +0:101 'dti' ( in 3-component vector of uint) +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:101 Sequence +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:101 subgroupQuadSwapHorizontal ( temp 2-component vector of int) +0:101 vector swizzle ( temp 2-component vector of int) +0:101 i: direct index for structure ( temp 4-component vector of int) +0:101 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:101 Constant: +0:101 0 (const uint) +0:101 direct index ( temp uint) +0:101 'dti' ( in 3-component vector of uint) +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:101 Sequence +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:102 move second child to first child ( temp 3-component vector of int) +0:102 vector swizzle ( temp 3-component vector of int) +0:102 i: direct index for structure ( temp 4-component vector of int) +0:102 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:102 Constant: +0:102 0 (const uint) +0:102 direct index ( temp uint) +0:102 'dti' ( in 3-component vector of uint) +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Sequence +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Constant: +0:102 2 (const int) +0:102 subgroupQuadSwapHorizontal ( temp 3-component vector of int) +0:102 vector swizzle ( temp 3-component vector of int) +0:102 i: direct index for structure ( temp 4-component vector of int) +0:102 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:102 Constant: +0:102 0 (const uint) +0:102 direct index ( temp uint) +0:102 'dti' ( in 3-component vector of uint) +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Sequence +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Constant: +0:102 2 (const int) +0:104 move second child to first child ( temp 4-component vector of float) +0:104 f: direct index for structure ( temp 4-component vector of float) +0:104 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:104 Constant: +0:104 0 (const uint) +0:104 direct index ( temp uint) +0:104 'dti' ( in 3-component vector of uint) +0:104 Constant: +0:104 0 (const int) +0:104 Constant: +0:104 2 (const int) +0:104 subgroupQuadSwapHorizontal ( temp 4-component vector of float) +0:104 f: direct index for structure ( temp 4-component vector of float) +0:104 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:104 Constant: +0:104 0 (const uint) +0:104 direct index ( temp uint) +0:104 'dti' ( in 3-component vector of uint) +0:104 Constant: +0:104 0 (const int) +0:104 Constant: +0:104 2 (const int) +0:105 move second child to first child ( temp float) +0:105 direct index ( temp float) +0:105 f: direct index for structure ( temp 4-component vector of float) +0:105 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:105 Constant: +0:105 0 (const uint) +0:105 direct index ( temp uint) +0:105 'dti' ( in 3-component vector of uint) +0:105 Constant: +0:105 0 (const int) +0:105 Constant: +0:105 2 (const int) +0:105 Constant: +0:105 0 (const int) +0:105 subgroupQuadSwapHorizontal ( temp float) +0:105 direct index ( temp float) +0:105 f: direct index for structure ( temp 4-component vector of float) +0:105 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:105 Constant: +0:105 0 (const uint) +0:105 direct index ( temp uint) +0:105 'dti' ( in 3-component vector of uint) +0:105 Constant: +0:105 0 (const int) +0:105 Constant: +0:105 2 (const int) +0:105 Constant: +0:105 0 (const int) +0:106 move second child to first child ( temp 2-component vector of float) +0:106 vector swizzle ( temp 2-component vector of float) +0:106 f: direct index for structure ( temp 4-component vector of float) +0:106 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:106 Constant: +0:106 0 (const uint) +0:106 direct index ( temp uint) +0:106 'dti' ( in 3-component vector of uint) +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 2 (const int) +0:106 Sequence +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 1 (const int) +0:106 subgroupQuadSwapHorizontal ( temp 2-component vector of float) +0:106 vector swizzle ( temp 2-component vector of float) +0:106 f: direct index for structure ( temp 4-component vector of float) +0:106 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:106 Constant: +0:106 0 (const uint) +0:106 direct index ( temp uint) +0:106 'dti' ( in 3-component vector of uint) +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 2 (const int) +0:106 Sequence +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 1 (const int) +0:107 move second child to first child ( temp 3-component vector of float) +0:107 vector swizzle ( temp 3-component vector of float) +0:107 f: direct index for structure ( temp 4-component vector of float) +0:107 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:107 Constant: +0:107 0 (const uint) +0:107 direct index ( temp uint) +0:107 'dti' ( in 3-component vector of uint) +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 2 (const int) +0:107 Sequence +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 1 (const int) +0:107 Constant: +0:107 2 (const int) +0:107 subgroupQuadSwapHorizontal ( temp 3-component vector of float) +0:107 vector swizzle ( temp 3-component vector of float) +0:107 f: direct index for structure ( temp 4-component vector of float) +0:107 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:107 Constant: +0:107 0 (const uint) +0:107 direct index ( temp uint) +0:107 'dti' ( in 3-component vector of uint) +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 2 (const int) +0:107 Sequence +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 1 (const int) +0:107 Constant: +0:107 2 (const int) +0:109 move second child to first child ( temp 4-component vector of double) +0:109 d: direct index for structure ( temp 4-component vector of double) +0:109 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:109 Constant: +0:109 0 (const uint) +0:109 direct index ( temp uint) +0:109 'dti' ( in 3-component vector of uint) +0:109 Constant: +0:109 0 (const int) +0:109 Constant: +0:109 3 (const int) +0:109 subgroupQuadSwapHorizontal ( temp 4-component vector of double) +0:109 d: direct index for structure ( temp 4-component vector of double) +0:109 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:109 Constant: +0:109 0 (const uint) +0:109 direct index ( temp uint) +0:109 'dti' ( in 3-component vector of uint) +0:109 Constant: +0:109 0 (const int) +0:109 Constant: +0:109 3 (const int) +0:110 move second child to first child ( temp double) +0:110 direct index ( temp double) +0:110 d: direct index for structure ( temp 4-component vector of double) +0:110 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:110 Constant: +0:110 0 (const uint) +0:110 direct index ( temp uint) +0:110 'dti' ( in 3-component vector of uint) +0:110 Constant: +0:110 0 (const int) +0:110 Constant: +0:110 3 (const int) +0:110 Constant: +0:110 0 (const int) +0:110 subgroupQuadSwapHorizontal ( temp double) +0:110 direct index ( temp double) +0:110 d: direct index for structure ( temp 4-component vector of double) +0:110 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:110 Constant: +0:110 0 (const uint) +0:110 direct index ( temp uint) +0:110 'dti' ( in 3-component vector of uint) +0:110 Constant: +0:110 0 (const int) +0:110 Constant: +0:110 3 (const int) +0:110 Constant: +0:110 0 (const int) +0:111 move second child to first child ( temp 2-component vector of double) +0:111 vector swizzle ( temp 2-component vector of double) +0:111 d: direct index for structure ( temp 4-component vector of double) +0:111 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:111 Constant: +0:111 0 (const uint) +0:111 direct index ( temp uint) +0:111 'dti' ( in 3-component vector of uint) +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 3 (const int) +0:111 Sequence +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1 (const int) +0:111 subgroupQuadSwapHorizontal ( temp 2-component vector of double) +0:111 vector swizzle ( temp 2-component vector of double) +0:111 d: direct index for structure ( temp 4-component vector of double) +0:111 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:111 Constant: +0:111 0 (const uint) +0:111 direct index ( temp uint) +0:111 'dti' ( in 3-component vector of uint) +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 3 (const int) +0:111 Sequence +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1 (const int) +0:112 move second child to first child ( temp 3-component vector of double) +0:112 vector swizzle ( temp 3-component vector of double) +0:112 d: direct index for structure ( temp 4-component vector of double) +0:112 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:112 Constant: +0:112 0 (const uint) +0:112 direct index ( temp uint) +0:112 'dti' ( in 3-component vector of uint) +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 3 (const int) +0:112 Sequence +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 1 (const int) +0:112 Constant: +0:112 2 (const int) +0:112 subgroupQuadSwapHorizontal ( temp 3-component vector of double) +0:112 vector swizzle ( temp 3-component vector of double) +0:112 d: direct index for structure ( temp 4-component vector of double) +0:112 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:112 Constant: +0:112 0 (const uint) +0:112 direct index ( temp uint) +0:112 'dti' ( in 3-component vector of uint) +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 3 (const int) +0:112 Sequence +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 1 (const int) +0:112 Constant: +0:112 2 (const int) +0:114 move second child to first child ( temp 4-component vector of uint) +0:114 u: direct index for structure ( temp 4-component vector of uint) +0:114 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:114 Constant: +0:114 0 (const uint) +0:114 direct index ( temp uint) +0:114 'dti' ( in 3-component vector of uint) +0:114 Constant: +0:114 0 (const int) +0:114 Constant: +0:114 0 (const int) +0:114 subgroupQuadSwapVertical ( temp 4-component vector of uint) +0:114 u: direct index for structure ( temp 4-component vector of uint) +0:114 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:114 Constant: +0:114 0 (const uint) +0:114 direct index ( temp uint) +0:114 'dti' ( in 3-component vector of uint) +0:114 Constant: +0:114 0 (const int) +0:114 Constant: +0:114 0 (const int) +0:115 move second child to first child ( temp uint) +0:115 direct index ( temp uint) +0:115 u: direct index for structure ( temp 4-component vector of uint) +0:115 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:115 Constant: +0:115 0 (const uint) +0:115 direct index ( temp uint) +0:115 'dti' ( in 3-component vector of uint) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:115 subgroupQuadSwapVertical ( temp uint) +0:115 direct index ( temp uint) +0:115 u: direct index for structure ( temp 4-component vector of uint) +0:115 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:115 Constant: +0:115 0 (const uint) +0:115 direct index ( temp uint) +0:115 'dti' ( in 3-component vector of uint) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:116 move second child to first child ( temp 2-component vector of uint) +0:116 vector swizzle ( temp 2-component vector of uint) +0:116 u: direct index for structure ( temp 4-component vector of uint) +0:116 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:116 Constant: +0:116 0 (const uint) +0:116 direct index ( temp uint) +0:116 'dti' ( in 3-component vector of uint) +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 0 (const int) +0:116 Sequence +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 1 (const int) +0:116 subgroupQuadSwapVertical ( temp 2-component vector of uint) +0:116 vector swizzle ( temp 2-component vector of uint) +0:116 u: direct index for structure ( temp 4-component vector of uint) +0:116 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:116 Constant: +0:116 0 (const uint) +0:116 direct index ( temp uint) +0:116 'dti' ( in 3-component vector of uint) +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 0 (const int) +0:116 Sequence +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 1 (const int) +0:117 move second child to first child ( temp 3-component vector of uint) +0:117 vector swizzle ( temp 3-component vector of uint) +0:117 u: direct index for structure ( temp 4-component vector of uint) +0:117 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:117 Constant: +0:117 0 (const uint) +0:117 direct index ( temp uint) +0:117 'dti' ( in 3-component vector of uint) +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 0 (const int) +0:117 Sequence +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 1 (const int) +0:117 Constant: +0:117 2 (const int) +0:117 subgroupQuadSwapVertical ( temp 3-component vector of uint) +0:117 vector swizzle ( temp 3-component vector of uint) +0:117 u: direct index for structure ( temp 4-component vector of uint) +0:117 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:117 Constant: +0:117 0 (const uint) +0:117 direct index ( temp uint) +0:117 'dti' ( in 3-component vector of uint) +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 0 (const int) +0:117 Sequence +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 1 (const int) +0:117 Constant: +0:117 2 (const int) +0:119 move second child to first child ( temp 4-component vector of int) +0:119 i: direct index for structure ( temp 4-component vector of int) +0:119 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:119 Constant: +0:119 0 (const uint) +0:119 direct index ( temp uint) +0:119 'dti' ( in 3-component vector of uint) +0:119 Constant: +0:119 0 (const int) +0:119 Constant: +0:119 1 (const int) +0:119 subgroupQuadSwapVertical ( temp 4-component vector of int) +0:119 i: direct index for structure ( temp 4-component vector of int) +0:119 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:119 Constant: +0:119 0 (const uint) +0:119 direct index ( temp uint) +0:119 'dti' ( in 3-component vector of uint) +0:119 Constant: +0:119 0 (const int) +0:119 Constant: +0:119 1 (const int) +0:120 move second child to first child ( temp int) +0:120 direct index ( temp int) +0:120 i: direct index for structure ( temp 4-component vector of int) +0:120 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:120 Constant: +0:120 0 (const uint) +0:120 direct index ( temp uint) +0:120 'dti' ( in 3-component vector of uint) +0:120 Constant: +0:120 0 (const int) +0:120 Constant: +0:120 1 (const int) +0:120 Constant: +0:120 0 (const int) +0:120 subgroupQuadSwapVertical ( temp int) +0:120 direct index ( temp int) +0:120 i: direct index for structure ( temp 4-component vector of int) +0:120 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:120 Constant: +0:120 0 (const uint) +0:120 direct index ( temp uint) +0:120 'dti' ( in 3-component vector of uint) +0:120 Constant: +0:120 0 (const int) +0:120 Constant: +0:120 1 (const int) +0:120 Constant: +0:120 0 (const int) +0:121 move second child to first child ( temp 2-component vector of int) +0:121 vector swizzle ( temp 2-component vector of int) +0:121 i: direct index for structure ( temp 4-component vector of int) +0:121 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:121 Constant: +0:121 0 (const uint) +0:121 direct index ( temp uint) +0:121 'dti' ( in 3-component vector of uint) +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:121 Sequence +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:121 subgroupQuadSwapVertical ( temp 2-component vector of int) +0:121 vector swizzle ( temp 2-component vector of int) +0:121 i: direct index for structure ( temp 4-component vector of int) +0:121 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:121 Constant: +0:121 0 (const uint) +0:121 direct index ( temp uint) +0:121 'dti' ( in 3-component vector of uint) +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:121 Sequence +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:122 move second child to first child ( temp 3-component vector of int) +0:122 vector swizzle ( temp 3-component vector of int) +0:122 i: direct index for structure ( temp 4-component vector of int) +0:122 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:122 Constant: +0:122 0 (const uint) +0:122 direct index ( temp uint) +0:122 'dti' ( in 3-component vector of uint) +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Sequence +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Constant: +0:122 2 (const int) +0:122 subgroupQuadSwapVertical ( temp 3-component vector of int) +0:122 vector swizzle ( temp 3-component vector of int) +0:122 i: direct index for structure ( temp 4-component vector of int) +0:122 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:122 Constant: +0:122 0 (const uint) +0:122 direct index ( temp uint) +0:122 'dti' ( in 3-component vector of uint) +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Sequence +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Constant: +0:122 2 (const int) +0:124 move second child to first child ( temp 4-component vector of float) +0:124 f: direct index for structure ( temp 4-component vector of float) +0:124 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:124 Constant: +0:124 0 (const uint) +0:124 direct index ( temp uint) +0:124 'dti' ( in 3-component vector of uint) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 2 (const int) +0:124 subgroupQuadSwapVertical ( temp 4-component vector of float) +0:124 f: direct index for structure ( temp 4-component vector of float) +0:124 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:124 Constant: +0:124 0 (const uint) +0:124 direct index ( temp uint) +0:124 'dti' ( in 3-component vector of uint) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 2 (const int) +0:125 move second child to first child ( temp float) +0:125 direct index ( temp float) +0:125 f: direct index for structure ( temp 4-component vector of float) +0:125 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:125 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:125 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:125 Constant: +0:125 0 (const uint) +0:125 direct index ( temp uint) +0:125 'dti' ( in 3-component vector of uint) +0:125 Constant: +0:125 0 (const int) +0:125 Constant: +0:125 2 (const int) +0:125 Constant: +0:125 0 (const int) +0:125 subgroupQuadSwapVertical ( temp float) +0:125 direct index ( temp float) +0:125 f: direct index for structure ( temp 4-component vector of float) +0:125 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:125 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:125 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:125 Constant: +0:125 0 (const uint) +0:125 direct index ( temp uint) +0:125 'dti' ( in 3-component vector of uint) +0:125 Constant: +0:125 0 (const int) +0:125 Constant: +0:125 2 (const int) +0:125 Constant: +0:125 0 (const int) +0:126 move second child to first child ( temp 2-component vector of float) +0:126 vector swizzle ( temp 2-component vector of float) +0:126 f: direct index for structure ( temp 4-component vector of float) +0:126 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:126 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:126 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:126 Constant: +0:126 0 (const uint) +0:126 direct index ( temp uint) +0:126 'dti' ( in 3-component vector of uint) +0:126 Constant: +0:126 0 (const int) +0:126 Constant: +0:126 2 (const int) +0:126 Sequence +0:126 Constant: +0:126 0 (const int) +0:126 Constant: +0:126 1 (const int) +0:126 subgroupQuadSwapVertical ( temp 2-component vector of float) +0:126 vector swizzle ( temp 2-component vector of float) +0:126 f: direct index for structure ( temp 4-component vector of float) +0:126 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:126 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:126 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:126 Constant: +0:126 0 (const uint) +0:126 direct index ( temp uint) +0:126 'dti' ( in 3-component vector of uint) +0:126 Constant: +0:126 0 (const int) +0:126 Constant: +0:126 2 (const int) +0:126 Sequence +0:126 Constant: +0:126 0 (const int) +0:126 Constant: +0:126 1 (const int) +0:127 move second child to first child ( temp 3-component vector of float) +0:127 vector swizzle ( temp 3-component vector of float) +0:127 f: direct index for structure ( temp 4-component vector of float) +0:127 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:127 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:127 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:127 Constant: +0:127 0 (const uint) +0:127 direct index ( temp uint) +0:127 'dti' ( in 3-component vector of uint) +0:127 Constant: +0:127 0 (const int) +0:127 Constant: +0:127 2 (const int) +0:127 Sequence +0:127 Constant: +0:127 0 (const int) +0:127 Constant: +0:127 1 (const int) +0:127 Constant: +0:127 2 (const int) +0:127 subgroupQuadSwapVertical ( temp 3-component vector of float) +0:127 vector swizzle ( temp 3-component vector of float) +0:127 f: direct index for structure ( temp 4-component vector of float) +0:127 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:127 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:127 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:127 Constant: +0:127 0 (const uint) +0:127 direct index ( temp uint) +0:127 'dti' ( in 3-component vector of uint) +0:127 Constant: +0:127 0 (const int) +0:127 Constant: +0:127 2 (const int) +0:127 Sequence +0:127 Constant: +0:127 0 (const int) +0:127 Constant: +0:127 1 (const int) +0:127 Constant: +0:127 2 (const int) +0:129 move second child to first child ( temp 4-component vector of double) +0:129 d: direct index for structure ( temp 4-component vector of double) +0:129 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:129 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:129 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:129 Constant: +0:129 0 (const uint) +0:129 direct index ( temp uint) +0:129 'dti' ( in 3-component vector of uint) +0:129 Constant: +0:129 0 (const int) +0:129 Constant: +0:129 3 (const int) +0:129 subgroupQuadSwapVertical ( temp 4-component vector of double) +0:129 d: direct index for structure ( temp 4-component vector of double) +0:129 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:129 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:129 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:129 Constant: +0:129 0 (const uint) +0:129 direct index ( temp uint) +0:129 'dti' ( in 3-component vector of uint) +0:129 Constant: +0:129 0 (const int) +0:129 Constant: +0:129 3 (const int) +0:130 move second child to first child ( temp double) +0:130 direct index ( temp double) +0:130 d: direct index for structure ( temp 4-component vector of double) +0:130 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:130 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:130 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:130 Constant: +0:130 0 (const uint) +0:130 direct index ( temp uint) +0:130 'dti' ( in 3-component vector of uint) +0:130 Constant: +0:130 0 (const int) +0:130 Constant: +0:130 3 (const int) +0:130 Constant: +0:130 0 (const int) +0:130 subgroupQuadSwapVertical ( temp double) +0:130 direct index ( temp double) +0:130 d: direct index for structure ( temp 4-component vector of double) +0:130 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:130 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:130 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:130 Constant: +0:130 0 (const uint) +0:130 direct index ( temp uint) +0:130 'dti' ( in 3-component vector of uint) +0:130 Constant: +0:130 0 (const int) +0:130 Constant: +0:130 3 (const int) +0:130 Constant: +0:130 0 (const int) +0:131 move second child to first child ( temp 2-component vector of double) +0:131 vector swizzle ( temp 2-component vector of double) +0:131 d: direct index for structure ( temp 4-component vector of double) +0:131 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:131 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:131 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:131 Constant: +0:131 0 (const uint) +0:131 direct index ( temp uint) +0:131 'dti' ( in 3-component vector of uint) +0:131 Constant: +0:131 0 (const int) +0:131 Constant: +0:131 3 (const int) +0:131 Sequence +0:131 Constant: +0:131 0 (const int) +0:131 Constant: +0:131 1 (const int) +0:131 subgroupQuadSwapVertical ( temp 2-component vector of double) +0:131 vector swizzle ( temp 2-component vector of double) +0:131 d: direct index for structure ( temp 4-component vector of double) +0:131 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:131 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:131 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:131 Constant: +0:131 0 (const uint) +0:131 direct index ( temp uint) +0:131 'dti' ( in 3-component vector of uint) +0:131 Constant: +0:131 0 (const int) +0:131 Constant: +0:131 3 (const int) +0:131 Sequence +0:131 Constant: +0:131 0 (const int) +0:131 Constant: +0:131 1 (const int) +0:132 move second child to first child ( temp 3-component vector of double) +0:132 vector swizzle ( temp 3-component vector of double) +0:132 d: direct index for structure ( temp 4-component vector of double) +0:132 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:132 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:132 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:132 Constant: +0:132 0 (const uint) +0:132 direct index ( temp uint) +0:132 'dti' ( in 3-component vector of uint) +0:132 Constant: +0:132 0 (const int) +0:132 Constant: +0:132 3 (const int) +0:132 Sequence +0:132 Constant: +0:132 0 (const int) +0:132 Constant: +0:132 1 (const int) +0:132 Constant: +0:132 2 (const int) +0:132 subgroupQuadSwapVertical ( temp 3-component vector of double) +0:132 vector swizzle ( temp 3-component vector of double) +0:132 d: direct index for structure ( temp 4-component vector of double) +0:132 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:132 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:132 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:132 Constant: +0:132 0 (const uint) +0:132 direct index ( temp uint) +0:132 'dti' ( in 3-component vector of uint) +0:132 Constant: +0:132 0 (const int) +0:132 Constant: +0:132 3 (const int) +0:132 Sequence +0:132 Constant: +0:132 0 (const int) +0:132 Constant: +0:132 1 (const int) +0:132 Constant: +0:132 2 (const int) +0:134 move second child to first child ( temp 4-component vector of uint) +0:134 u: direct index for structure ( temp 4-component vector of uint) +0:134 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:134 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:134 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:134 Constant: +0:134 0 (const uint) +0:134 direct index ( temp uint) +0:134 'dti' ( in 3-component vector of uint) +0:134 Constant: +0:134 0 (const int) +0:134 Constant: +0:134 0 (const int) +0:134 subgroupQuadSwapDiagonal ( temp 4-component vector of uint) +0:134 u: direct index for structure ( temp 4-component vector of uint) +0:134 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:134 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:134 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:134 Constant: +0:134 0 (const uint) +0:134 direct index ( temp uint) +0:134 'dti' ( in 3-component vector of uint) +0:134 Constant: +0:134 0 (const int) +0:134 Constant: +0:134 0 (const int) +0:135 move second child to first child ( temp uint) +0:135 direct index ( temp uint) +0:135 u: direct index for structure ( temp 4-component vector of uint) +0:135 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:135 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:135 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:135 Constant: +0:135 0 (const uint) +0:135 direct index ( temp uint) +0:135 'dti' ( in 3-component vector of uint) +0:135 Constant: +0:135 0 (const int) +0:135 Constant: +0:135 0 (const int) +0:135 Constant: +0:135 0 (const int) +0:135 subgroupQuadSwapDiagonal ( temp uint) +0:135 direct index ( temp uint) +0:135 u: direct index for structure ( temp 4-component vector of uint) +0:135 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:135 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:135 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:135 Constant: +0:135 0 (const uint) +0:135 direct index ( temp uint) +0:135 'dti' ( in 3-component vector of uint) +0:135 Constant: +0:135 0 (const int) +0:135 Constant: +0:135 0 (const int) +0:135 Constant: +0:135 0 (const int) +0:136 move second child to first child ( temp 2-component vector of uint) +0:136 vector swizzle ( temp 2-component vector of uint) +0:136 u: direct index for structure ( temp 4-component vector of uint) +0:136 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:136 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:136 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:136 Constant: +0:136 0 (const uint) +0:136 direct index ( temp uint) +0:136 'dti' ( in 3-component vector of uint) +0:136 Constant: +0:136 0 (const int) +0:136 Constant: +0:136 0 (const int) +0:136 Sequence +0:136 Constant: +0:136 0 (const int) +0:136 Constant: +0:136 1 (const int) +0:136 subgroupQuadSwapDiagonal ( temp 2-component vector of uint) +0:136 vector swizzle ( temp 2-component vector of uint) +0:136 u: direct index for structure ( temp 4-component vector of uint) +0:136 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:136 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:136 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:136 Constant: +0:136 0 (const uint) +0:136 direct index ( temp uint) +0:136 'dti' ( in 3-component vector of uint) +0:136 Constant: +0:136 0 (const int) +0:136 Constant: +0:136 0 (const int) +0:136 Sequence +0:136 Constant: +0:136 0 (const int) +0:136 Constant: +0:136 1 (const int) +0:137 move second child to first child ( temp 3-component vector of uint) +0:137 vector swizzle ( temp 3-component vector of uint) +0:137 u: direct index for structure ( temp 4-component vector of uint) +0:137 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:137 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:137 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:137 Constant: +0:137 0 (const uint) +0:137 direct index ( temp uint) +0:137 'dti' ( in 3-component vector of uint) +0:137 Constant: +0:137 0 (const int) +0:137 Constant: +0:137 0 (const int) +0:137 Sequence +0:137 Constant: +0:137 0 (const int) +0:137 Constant: +0:137 1 (const int) +0:137 Constant: +0:137 2 (const int) +0:137 subgroupQuadSwapDiagonal ( temp 3-component vector of uint) +0:137 vector swizzle ( temp 3-component vector of uint) +0:137 u: direct index for structure ( temp 4-component vector of uint) +0:137 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:137 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:137 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:137 Constant: +0:137 0 (const uint) +0:137 direct index ( temp uint) +0:137 'dti' ( in 3-component vector of uint) +0:137 Constant: +0:137 0 (const int) +0:137 Constant: +0:137 0 (const int) +0:137 Sequence +0:137 Constant: +0:137 0 (const int) +0:137 Constant: +0:137 1 (const int) +0:137 Constant: +0:137 2 (const int) +0:139 move second child to first child ( temp 4-component vector of int) +0:139 i: direct index for structure ( temp 4-component vector of int) +0:139 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:139 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:139 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:139 Constant: +0:139 0 (const uint) +0:139 direct index ( temp uint) +0:139 'dti' ( in 3-component vector of uint) +0:139 Constant: +0:139 0 (const int) +0:139 Constant: +0:139 1 (const int) +0:139 subgroupQuadSwapDiagonal ( temp 4-component vector of int) +0:139 i: direct index for structure ( temp 4-component vector of int) +0:139 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:139 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:139 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:139 Constant: +0:139 0 (const uint) +0:139 direct index ( temp uint) +0:139 'dti' ( in 3-component vector of uint) +0:139 Constant: +0:139 0 (const int) +0:139 Constant: +0:139 1 (const int) +0:140 move second child to first child ( temp int) +0:140 direct index ( temp int) +0:140 i: direct index for structure ( temp 4-component vector of int) +0:140 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:140 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:140 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:140 Constant: +0:140 0 (const uint) +0:140 direct index ( temp uint) +0:140 'dti' ( in 3-component vector of uint) +0:140 Constant: +0:140 0 (const int) +0:140 Constant: +0:140 1 (const int) +0:140 Constant: +0:140 0 (const int) +0:140 subgroupQuadSwapDiagonal ( temp int) +0:140 direct index ( temp int) +0:140 i: direct index for structure ( temp 4-component vector of int) +0:140 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:140 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:140 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:140 Constant: +0:140 0 (const uint) +0:140 direct index ( temp uint) +0:140 'dti' ( in 3-component vector of uint) +0:140 Constant: +0:140 0 (const int) +0:140 Constant: +0:140 1 (const int) +0:140 Constant: +0:140 0 (const int) +0:141 move second child to first child ( temp 2-component vector of int) +0:141 vector swizzle ( temp 2-component vector of int) +0:141 i: direct index for structure ( temp 4-component vector of int) +0:141 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:141 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:141 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:141 Constant: +0:141 0 (const uint) +0:141 direct index ( temp uint) +0:141 'dti' ( in 3-component vector of uint) +0:141 Constant: +0:141 0 (const int) +0:141 Constant: +0:141 1 (const int) +0:141 Sequence +0:141 Constant: +0:141 0 (const int) +0:141 Constant: +0:141 1 (const int) +0:141 subgroupQuadSwapDiagonal ( temp 2-component vector of int) +0:141 vector swizzle ( temp 2-component vector of int) +0:141 i: direct index for structure ( temp 4-component vector of int) +0:141 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:141 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:141 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:141 Constant: +0:141 0 (const uint) +0:141 direct index ( temp uint) +0:141 'dti' ( in 3-component vector of uint) +0:141 Constant: +0:141 0 (const int) +0:141 Constant: +0:141 1 (const int) +0:141 Sequence +0:141 Constant: +0:141 0 (const int) +0:141 Constant: +0:141 1 (const int) +0:142 move second child to first child ( temp 3-component vector of int) +0:142 vector swizzle ( temp 3-component vector of int) +0:142 i: direct index for structure ( temp 4-component vector of int) +0:142 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:142 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:142 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:142 Constant: +0:142 0 (const uint) +0:142 direct index ( temp uint) +0:142 'dti' ( in 3-component vector of uint) +0:142 Constant: +0:142 0 (const int) +0:142 Constant: +0:142 1 (const int) +0:142 Sequence +0:142 Constant: +0:142 0 (const int) +0:142 Constant: +0:142 1 (const int) +0:142 Constant: +0:142 2 (const int) +0:142 subgroupQuadSwapDiagonal ( temp 3-component vector of int) +0:142 vector swizzle ( temp 3-component vector of int) +0:142 i: direct index for structure ( temp 4-component vector of int) +0:142 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:142 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:142 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:142 Constant: +0:142 0 (const uint) +0:142 direct index ( temp uint) +0:142 'dti' ( in 3-component vector of uint) +0:142 Constant: +0:142 0 (const int) +0:142 Constant: +0:142 1 (const int) +0:142 Sequence +0:142 Constant: +0:142 0 (const int) +0:142 Constant: +0:142 1 (const int) +0:142 Constant: +0:142 2 (const int) +0:144 move second child to first child ( temp 4-component vector of float) +0:144 f: direct index for structure ( temp 4-component vector of float) +0:144 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:144 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:144 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:144 Constant: +0:144 0 (const uint) +0:144 direct index ( temp uint) +0:144 'dti' ( in 3-component vector of uint) +0:144 Constant: +0:144 0 (const int) +0:144 Constant: +0:144 2 (const int) +0:144 subgroupQuadSwapDiagonal ( temp 4-component vector of float) +0:144 f: direct index for structure ( temp 4-component vector of float) +0:144 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:144 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:144 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:144 Constant: +0:144 0 (const uint) +0:144 direct index ( temp uint) +0:144 'dti' ( in 3-component vector of uint) +0:144 Constant: +0:144 0 (const int) +0:144 Constant: +0:144 2 (const int) +0:145 move second child to first child ( temp float) +0:145 direct index ( temp float) +0:145 f: direct index for structure ( temp 4-component vector of float) +0:145 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:145 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:145 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:145 Constant: +0:145 0 (const uint) +0:145 direct index ( temp uint) +0:145 'dti' ( in 3-component vector of uint) +0:145 Constant: +0:145 0 (const int) +0:145 Constant: +0:145 2 (const int) +0:145 Constant: +0:145 0 (const int) +0:145 subgroupQuadSwapDiagonal ( temp float) +0:145 direct index ( temp float) +0:145 f: direct index for structure ( temp 4-component vector of float) +0:145 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:145 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:145 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:145 Constant: +0:145 0 (const uint) +0:145 direct index ( temp uint) +0:145 'dti' ( in 3-component vector of uint) +0:145 Constant: +0:145 0 (const int) +0:145 Constant: +0:145 2 (const int) +0:145 Constant: +0:145 0 (const int) +0:146 move second child to first child ( temp 2-component vector of float) +0:146 vector swizzle ( temp 2-component vector of float) +0:146 f: direct index for structure ( temp 4-component vector of float) +0:146 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:146 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:146 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:146 Constant: +0:146 0 (const uint) +0:146 direct index ( temp uint) +0:146 'dti' ( in 3-component vector of uint) +0:146 Constant: +0:146 0 (const int) +0:146 Constant: +0:146 2 (const int) +0:146 Sequence +0:146 Constant: +0:146 0 (const int) +0:146 Constant: +0:146 1 (const int) +0:146 subgroupQuadSwapDiagonal ( temp 2-component vector of float) +0:146 vector swizzle ( temp 2-component vector of float) +0:146 f: direct index for structure ( temp 4-component vector of float) +0:146 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:146 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:146 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:146 Constant: +0:146 0 (const uint) +0:146 direct index ( temp uint) +0:146 'dti' ( in 3-component vector of uint) +0:146 Constant: +0:146 0 (const int) +0:146 Constant: +0:146 2 (const int) +0:146 Sequence +0:146 Constant: +0:146 0 (const int) +0:146 Constant: +0:146 1 (const int) +0:147 move second child to first child ( temp 3-component vector of float) +0:147 vector swizzle ( temp 3-component vector of float) +0:147 f: direct index for structure ( temp 4-component vector of float) +0:147 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:147 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:147 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:147 Constant: +0:147 0 (const uint) +0:147 direct index ( temp uint) +0:147 'dti' ( in 3-component vector of uint) +0:147 Constant: +0:147 0 (const int) +0:147 Constant: +0:147 2 (const int) +0:147 Sequence +0:147 Constant: +0:147 0 (const int) +0:147 Constant: +0:147 1 (const int) +0:147 Constant: +0:147 2 (const int) +0:147 subgroupQuadSwapDiagonal ( temp 3-component vector of float) +0:147 vector swizzle ( temp 3-component vector of float) +0:147 f: direct index for structure ( temp 4-component vector of float) +0:147 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:147 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:147 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:147 Constant: +0:147 0 (const uint) +0:147 direct index ( temp uint) +0:147 'dti' ( in 3-component vector of uint) +0:147 Constant: +0:147 0 (const int) +0:147 Constant: +0:147 2 (const int) +0:147 Sequence +0:147 Constant: +0:147 0 (const int) +0:147 Constant: +0:147 1 (const int) +0:147 Constant: +0:147 2 (const int) +0:149 move second child to first child ( temp 4-component vector of double) +0:149 d: direct index for structure ( temp 4-component vector of double) +0:149 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:149 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:149 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:149 Constant: +0:149 0 (const uint) +0:149 direct index ( temp uint) +0:149 'dti' ( in 3-component vector of uint) +0:149 Constant: +0:149 0 (const int) +0:149 Constant: +0:149 3 (const int) +0:149 subgroupQuadSwapDiagonal ( temp 4-component vector of double) +0:149 d: direct index for structure ( temp 4-component vector of double) +0:149 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:149 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:149 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:149 Constant: +0:149 0 (const uint) +0:149 direct index ( temp uint) +0:149 'dti' ( in 3-component vector of uint) +0:149 Constant: +0:149 0 (const int) +0:149 Constant: +0:149 3 (const int) +0:150 move second child to first child ( temp double) +0:150 direct index ( temp double) +0:150 d: direct index for structure ( temp 4-component vector of double) +0:150 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:150 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:150 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:150 Constant: +0:150 0 (const uint) +0:150 direct index ( temp uint) +0:150 'dti' ( in 3-component vector of uint) +0:150 Constant: +0:150 0 (const int) +0:150 Constant: +0:150 3 (const int) +0:150 Constant: +0:150 0 (const int) +0:150 subgroupQuadSwapDiagonal ( temp double) +0:150 direct index ( temp double) +0:150 d: direct index for structure ( temp 4-component vector of double) +0:150 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:150 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:150 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:150 Constant: +0:150 0 (const uint) +0:150 direct index ( temp uint) +0:150 'dti' ( in 3-component vector of uint) +0:150 Constant: +0:150 0 (const int) +0:150 Constant: +0:150 3 (const int) +0:150 Constant: +0:150 0 (const int) +0:151 move second child to first child ( temp 2-component vector of double) +0:151 vector swizzle ( temp 2-component vector of double) +0:151 d: direct index for structure ( temp 4-component vector of double) +0:151 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:151 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:151 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:151 Constant: +0:151 0 (const uint) +0:151 direct index ( temp uint) +0:151 'dti' ( in 3-component vector of uint) +0:151 Constant: +0:151 0 (const int) +0:151 Constant: +0:151 3 (const int) +0:151 Sequence +0:151 Constant: +0:151 0 (const int) +0:151 Constant: +0:151 1 (const int) +0:151 subgroupQuadSwapDiagonal ( temp 2-component vector of double) +0:151 vector swizzle ( temp 2-component vector of double) +0:151 d: direct index for structure ( temp 4-component vector of double) +0:151 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:151 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:151 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:151 Constant: +0:151 0 (const uint) +0:151 direct index ( temp uint) +0:151 'dti' ( in 3-component vector of uint) +0:151 Constant: +0:151 0 (const int) +0:151 Constant: +0:151 3 (const int) +0:151 Sequence +0:151 Constant: +0:151 0 (const int) +0:151 Constant: +0:151 1 (const int) +0:152 move second child to first child ( temp 3-component vector of double) +0:152 vector swizzle ( temp 3-component vector of double) +0:152 d: direct index for structure ( temp 4-component vector of double) +0:152 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:152 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:152 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:152 Constant: +0:152 0 (const uint) +0:152 direct index ( temp uint) +0:152 'dti' ( in 3-component vector of uint) +0:152 Constant: +0:152 0 (const int) +0:152 Constant: +0:152 3 (const int) +0:152 Sequence +0:152 Constant: +0:152 0 (const int) +0:152 Constant: +0:152 1 (const int) +0:152 Constant: +0:152 2 (const int) +0:152 subgroupQuadSwapDiagonal ( temp 3-component vector of double) +0:152 vector swizzle ( temp 3-component vector of double) +0:152 d: direct index for structure ( temp 4-component vector of double) +0:152 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:152 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:152 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:152 Constant: +0:152 0 (const uint) +0:152 direct index ( temp uint) +0:152 'dti' ( in 3-component vector of uint) +0:152 Constant: +0:152 0 (const int) +0:152 Constant: +0:152 3 (const int) +0:152 Sequence +0:152 Constant: +0:152 0 (const int) +0:152 Constant: +0:152 1 (const int) +0:152 Constant: +0:152 2 (const int) +0:13 Function Definition: CSMain( ( temp void) +0:13 Function Parameters: +0:? Sequence +0:13 move second child to first child ( temp 3-component vector of uint) +0:? 'dti' ( temp 3-component vector of uint) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) +0:13 Function Call: @CSMain(vu3; ( temp void) +0:? 'dti' ( temp 3-component vector of uint) +0:? Linker Objects +0:? 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) + + +Linked compute stage: + + +Shader version: 500 +local_size = (32, 16, 1) +0:? Sequence +0:13 Function Definition: @CSMain(vu3; ( temp void) +0:13 Function Parameters: +0:13 'dti' ( in 3-component vector of uint) +0:? Sequence +0:14 move second child to first child ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:14 subgroupQuadBroadcast ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const uint) +0:15 move second child to first child ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 subgroupQuadBroadcast ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const uint) +0:16 move second child to first child ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:16 subgroupQuadBroadcast ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:16 Constant: +0:16 0 (const uint) +0:17 move second child to first child ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:17 subgroupQuadBroadcast ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:17 Constant: +0:17 0 (const uint) +0:19 move second child to first child ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:19 subgroupQuadBroadcast ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:19 Constant: +0:19 0 (const uint) +0:20 move second child to first child ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:20 subgroupQuadBroadcast ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 0 (const uint) +0:21 move second child to first child ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 subgroupQuadBroadcast ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Constant: +0:21 0 (const uint) +0:22 move second child to first child ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:22 subgroupQuadBroadcast ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:22 Constant: +0:22 0 (const uint) +0:24 move second child to first child ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:24 subgroupQuadBroadcast ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:24 Constant: +0:24 0 (const uint) +0:25 move second child to first child ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:25 subgroupQuadBroadcast ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 0 (const uint) +0:26 move second child to first child ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:26 subgroupQuadBroadcast ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:26 Constant: +0:26 0 (const uint) +0:27 move second child to first child ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 subgroupQuadBroadcast ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Constant: +0:27 0 (const uint) +0:29 move second child to first child ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:29 subgroupQuadBroadcast ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:29 Constant: +0:29 0 (const uint) +0:30 move second child to first child ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:30 subgroupQuadBroadcast ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 0 (const uint) +0:31 move second child to first child ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:31 subgroupQuadBroadcast ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:31 Constant: +0:31 0 (const uint) +0:32 move second child to first child ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:32 subgroupQuadBroadcast ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:32 Constant: +0:32 0 (const uint) +0:34 move second child to first child ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:34 subgroupQuadBroadcast ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 1 (const uint) +0:35 move second child to first child ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 subgroupQuadBroadcast ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 1 (const uint) +0:36 move second child to first child ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:36 subgroupQuadBroadcast ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:36 Constant: +0:36 1 (const uint) +0:37 move second child to first child ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:37 subgroupQuadBroadcast ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:37 Constant: +0:37 1 (const uint) +0:39 move second child to first child ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:39 subgroupQuadBroadcast ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:39 Constant: +0:39 1 (const uint) +0:40 move second child to first child ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:40 subgroupQuadBroadcast ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const uint) +0:41 move second child to first child ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 subgroupQuadBroadcast ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Constant: +0:41 1 (const uint) +0:42 move second child to first child ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:42 subgroupQuadBroadcast ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:42 Constant: +0:42 1 (const uint) +0:44 move second child to first child ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:44 subgroupQuadBroadcast ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:44 Constant: +0:44 1 (const uint) +0:45 move second child to first child ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:45 subgroupQuadBroadcast ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 1 (const uint) +0:46 move second child to first child ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:46 subgroupQuadBroadcast ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:46 Constant: +0:46 1 (const uint) +0:47 move second child to first child ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 subgroupQuadBroadcast ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Constant: +0:47 1 (const uint) +0:49 move second child to first child ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:49 subgroupQuadBroadcast ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:49 Constant: +0:49 1 (const uint) +0:50 move second child to first child ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:50 subgroupQuadBroadcast ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 1 (const uint) +0:51 move second child to first child ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:51 subgroupQuadBroadcast ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:51 Constant: +0:51 1 (const uint) +0:52 move second child to first child ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:52 subgroupQuadBroadcast ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:52 Constant: +0:52 1 (const uint) +0:54 move second child to first child ( temp 4-component vector of uint) +0:54 u: direct index for structure ( temp 4-component vector of uint) +0:54 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:54 Constant: +0:54 0 (const uint) +0:54 direct index ( temp uint) +0:54 'dti' ( in 3-component vector of uint) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 subgroupQuadBroadcast ( temp 4-component vector of uint) +0:54 u: direct index for structure ( temp 4-component vector of uint) +0:54 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:54 Constant: +0:54 0 (const uint) +0:54 direct index ( temp uint) +0:54 'dti' ( in 3-component vector of uint) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 2 (const uint) +0:55 move second child to first child ( temp uint) +0:55 direct index ( temp uint) +0:55 u: direct index for structure ( temp 4-component vector of uint) +0:55 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:55 Constant: +0:55 0 (const uint) +0:55 direct index ( temp uint) +0:55 'dti' ( in 3-component vector of uint) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 subgroupQuadBroadcast ( temp uint) +0:55 direct index ( temp uint) +0:55 u: direct index for structure ( temp 4-component vector of uint) +0:55 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:55 Constant: +0:55 0 (const uint) +0:55 direct index ( temp uint) +0:55 'dti' ( in 3-component vector of uint) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 2 (const uint) +0:56 move second child to first child ( temp 2-component vector of uint) +0:56 vector swizzle ( temp 2-component vector of uint) +0:56 u: direct index for structure ( temp 4-component vector of uint) +0:56 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:56 Constant: +0:56 0 (const uint) +0:56 direct index ( temp uint) +0:56 'dti' ( in 3-component vector of uint) +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 0 (const int) +0:56 Sequence +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 1 (const int) +0:56 subgroupQuadBroadcast ( temp 2-component vector of uint) +0:56 vector swizzle ( temp 2-component vector of uint) +0:56 u: direct index for structure ( temp 4-component vector of uint) +0:56 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:56 Constant: +0:56 0 (const uint) +0:56 direct index ( temp uint) +0:56 'dti' ( in 3-component vector of uint) +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 0 (const int) +0:56 Sequence +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 1 (const int) +0:56 Constant: +0:56 2 (const uint) +0:57 move second child to first child ( temp 3-component vector of uint) +0:57 vector swizzle ( temp 3-component vector of uint) +0:57 u: direct index for structure ( temp 4-component vector of uint) +0:57 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:57 Constant: +0:57 0 (const uint) +0:57 direct index ( temp uint) +0:57 'dti' ( in 3-component vector of uint) +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 0 (const int) +0:57 Sequence +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 1 (const int) +0:57 Constant: +0:57 2 (const int) +0:57 subgroupQuadBroadcast ( temp 3-component vector of uint) +0:57 vector swizzle ( temp 3-component vector of uint) +0:57 u: direct index for structure ( temp 4-component vector of uint) +0:57 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:57 Constant: +0:57 0 (const uint) +0:57 direct index ( temp uint) +0:57 'dti' ( in 3-component vector of uint) +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 0 (const int) +0:57 Sequence +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 1 (const int) +0:57 Constant: +0:57 2 (const int) +0:57 Constant: +0:57 2 (const uint) +0:59 move second child to first child ( temp 4-component vector of int) +0:59 i: direct index for structure ( temp 4-component vector of int) +0:59 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:59 Constant: +0:59 0 (const uint) +0:59 direct index ( temp uint) +0:59 'dti' ( in 3-component vector of uint) +0:59 Constant: +0:59 0 (const int) +0:59 Constant: +0:59 1 (const int) +0:59 subgroupQuadBroadcast ( temp 4-component vector of int) +0:59 i: direct index for structure ( temp 4-component vector of int) +0:59 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:59 Constant: +0:59 0 (const uint) +0:59 direct index ( temp uint) +0:59 'dti' ( in 3-component vector of uint) +0:59 Constant: +0:59 0 (const int) +0:59 Constant: +0:59 1 (const int) +0:59 Constant: +0:59 2 (const uint) +0:60 move second child to first child ( temp int) +0:60 direct index ( temp int) +0:60 i: direct index for structure ( temp 4-component vector of int) +0:60 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:60 Constant: +0:60 0 (const uint) +0:60 direct index ( temp uint) +0:60 'dti' ( in 3-component vector of uint) +0:60 Constant: +0:60 0 (const int) +0:60 Constant: +0:60 1 (const int) +0:60 Constant: +0:60 0 (const int) +0:60 subgroupQuadBroadcast ( temp int) +0:60 direct index ( temp int) +0:60 i: direct index for structure ( temp 4-component vector of int) +0:60 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:60 Constant: +0:60 0 (const uint) +0:60 direct index ( temp uint) +0:60 'dti' ( in 3-component vector of uint) +0:60 Constant: +0:60 0 (const int) +0:60 Constant: +0:60 1 (const int) +0:60 Constant: +0:60 0 (const int) +0:60 Constant: +0:60 2 (const uint) +0:61 move second child to first child ( temp 2-component vector of int) +0:61 vector swizzle ( temp 2-component vector of int) +0:61 i: direct index for structure ( temp 4-component vector of int) +0:61 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:61 Constant: +0:61 0 (const uint) +0:61 direct index ( temp uint) +0:61 'dti' ( in 3-component vector of uint) +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 Sequence +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 subgroupQuadBroadcast ( temp 2-component vector of int) +0:61 vector swizzle ( temp 2-component vector of int) +0:61 i: direct index for structure ( temp 4-component vector of int) +0:61 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:61 Constant: +0:61 0 (const uint) +0:61 direct index ( temp uint) +0:61 'dti' ( in 3-component vector of uint) +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 Sequence +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 Constant: +0:61 2 (const uint) +0:62 move second child to first child ( temp 3-component vector of int) +0:62 vector swizzle ( temp 3-component vector of int) +0:62 i: direct index for structure ( temp 4-component vector of int) +0:62 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:62 Constant: +0:62 0 (const uint) +0:62 direct index ( temp uint) +0:62 'dti' ( in 3-component vector of uint) +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Sequence +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Constant: +0:62 2 (const int) +0:62 subgroupQuadBroadcast ( temp 3-component vector of int) +0:62 vector swizzle ( temp 3-component vector of int) +0:62 i: direct index for structure ( temp 4-component vector of int) +0:62 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:62 Constant: +0:62 0 (const uint) +0:62 direct index ( temp uint) +0:62 'dti' ( in 3-component vector of uint) +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Sequence +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Constant: +0:62 2 (const int) +0:62 Constant: +0:62 2 (const uint) +0:64 move second child to first child ( temp 4-component vector of float) +0:64 f: direct index for structure ( temp 4-component vector of float) +0:64 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:64 Constant: +0:64 0 (const uint) +0:64 direct index ( temp uint) +0:64 'dti' ( in 3-component vector of uint) +0:64 Constant: +0:64 0 (const int) +0:64 Constant: +0:64 2 (const int) +0:64 subgroupQuadBroadcast ( temp 4-component vector of float) +0:64 f: direct index for structure ( temp 4-component vector of float) +0:64 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:64 Constant: +0:64 0 (const uint) +0:64 direct index ( temp uint) +0:64 'dti' ( in 3-component vector of uint) +0:64 Constant: +0:64 0 (const int) +0:64 Constant: +0:64 2 (const int) +0:64 Constant: +0:64 2 (const uint) +0:65 move second child to first child ( temp float) +0:65 direct index ( temp float) +0:65 f: direct index for structure ( temp 4-component vector of float) +0:65 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:65 Constant: +0:65 0 (const uint) +0:65 direct index ( temp uint) +0:65 'dti' ( in 3-component vector of uint) +0:65 Constant: +0:65 0 (const int) +0:65 Constant: +0:65 2 (const int) +0:65 Constant: +0:65 0 (const int) +0:65 subgroupQuadBroadcast ( temp float) +0:65 direct index ( temp float) +0:65 f: direct index for structure ( temp 4-component vector of float) +0:65 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:65 Constant: +0:65 0 (const uint) +0:65 direct index ( temp uint) +0:65 'dti' ( in 3-component vector of uint) +0:65 Constant: +0:65 0 (const int) +0:65 Constant: +0:65 2 (const int) +0:65 Constant: +0:65 0 (const int) +0:65 Constant: +0:65 2 (const uint) +0:66 move second child to first child ( temp 2-component vector of float) +0:66 vector swizzle ( temp 2-component vector of float) +0:66 f: direct index for structure ( temp 4-component vector of float) +0:66 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:66 Constant: +0:66 0 (const uint) +0:66 direct index ( temp uint) +0:66 'dti' ( in 3-component vector of uint) +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 2 (const int) +0:66 Sequence +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 1 (const int) +0:66 subgroupQuadBroadcast ( temp 2-component vector of float) +0:66 vector swizzle ( temp 2-component vector of float) +0:66 f: direct index for structure ( temp 4-component vector of float) +0:66 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:66 Constant: +0:66 0 (const uint) +0:66 direct index ( temp uint) +0:66 'dti' ( in 3-component vector of uint) +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 2 (const int) +0:66 Sequence +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 1 (const int) +0:66 Constant: +0:66 2 (const uint) +0:67 move second child to first child ( temp 3-component vector of float) +0:67 vector swizzle ( temp 3-component vector of float) +0:67 f: direct index for structure ( temp 4-component vector of float) +0:67 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:67 Constant: +0:67 0 (const uint) +0:67 direct index ( temp uint) +0:67 'dti' ( in 3-component vector of uint) +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 Sequence +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 1 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 subgroupQuadBroadcast ( temp 3-component vector of float) +0:67 vector swizzle ( temp 3-component vector of float) +0:67 f: direct index for structure ( temp 4-component vector of float) +0:67 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:67 Constant: +0:67 0 (const uint) +0:67 direct index ( temp uint) +0:67 'dti' ( in 3-component vector of uint) +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 Sequence +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 1 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 Constant: +0:67 2 (const uint) +0:69 move second child to first child ( temp 4-component vector of double) +0:69 d: direct index for structure ( temp 4-component vector of double) +0:69 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:69 Constant: +0:69 0 (const uint) +0:69 direct index ( temp uint) +0:69 'dti' ( in 3-component vector of uint) +0:69 Constant: +0:69 0 (const int) +0:69 Constant: +0:69 3 (const int) +0:69 subgroupQuadBroadcast ( temp 4-component vector of double) +0:69 d: direct index for structure ( temp 4-component vector of double) +0:69 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:69 Constant: +0:69 0 (const uint) +0:69 direct index ( temp uint) +0:69 'dti' ( in 3-component vector of uint) +0:69 Constant: +0:69 0 (const int) +0:69 Constant: +0:69 3 (const int) +0:69 Constant: +0:69 2 (const uint) +0:70 move second child to first child ( temp double) +0:70 direct index ( temp double) +0:70 d: direct index for structure ( temp 4-component vector of double) +0:70 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:70 Constant: +0:70 0 (const uint) +0:70 direct index ( temp uint) +0:70 'dti' ( in 3-component vector of uint) +0:70 Constant: +0:70 0 (const int) +0:70 Constant: +0:70 3 (const int) +0:70 Constant: +0:70 0 (const int) +0:70 subgroupQuadBroadcast ( temp double) +0:70 direct index ( temp double) +0:70 d: direct index for structure ( temp 4-component vector of double) +0:70 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:70 Constant: +0:70 0 (const uint) +0:70 direct index ( temp uint) +0:70 'dti' ( in 3-component vector of uint) +0:70 Constant: +0:70 0 (const int) +0:70 Constant: +0:70 3 (const int) +0:70 Constant: +0:70 0 (const int) +0:70 Constant: +0:70 2 (const uint) +0:71 move second child to first child ( temp 2-component vector of double) +0:71 vector swizzle ( temp 2-component vector of double) +0:71 d: direct index for structure ( temp 4-component vector of double) +0:71 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:71 Constant: +0:71 0 (const uint) +0:71 direct index ( temp uint) +0:71 'dti' ( in 3-component vector of uint) +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 3 (const int) +0:71 Sequence +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 1 (const int) +0:71 subgroupQuadBroadcast ( temp 2-component vector of double) +0:71 vector swizzle ( temp 2-component vector of double) +0:71 d: direct index for structure ( temp 4-component vector of double) +0:71 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:71 Constant: +0:71 0 (const uint) +0:71 direct index ( temp uint) +0:71 'dti' ( in 3-component vector of uint) +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 3 (const int) +0:71 Sequence +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 1 (const int) +0:71 Constant: +0:71 2 (const uint) +0:72 move second child to first child ( temp 3-component vector of double) +0:72 vector swizzle ( temp 3-component vector of double) +0:72 d: direct index for structure ( temp 4-component vector of double) +0:72 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:72 Constant: +0:72 0 (const uint) +0:72 direct index ( temp uint) +0:72 'dti' ( in 3-component vector of uint) +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 3 (const int) +0:72 Sequence +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 1 (const int) +0:72 Constant: +0:72 2 (const int) +0:72 subgroupQuadBroadcast ( temp 3-component vector of double) +0:72 vector swizzle ( temp 3-component vector of double) +0:72 d: direct index for structure ( temp 4-component vector of double) +0:72 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:72 Constant: +0:72 0 (const uint) +0:72 direct index ( temp uint) +0:72 'dti' ( in 3-component vector of uint) +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 3 (const int) +0:72 Sequence +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 1 (const int) +0:72 Constant: +0:72 2 (const int) +0:72 Constant: +0:72 2 (const uint) +0:74 move second child to first child ( temp 4-component vector of uint) +0:74 u: direct index for structure ( temp 4-component vector of uint) +0:74 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:74 Constant: +0:74 0 (const uint) +0:74 direct index ( temp uint) +0:74 'dti' ( in 3-component vector of uint) +0:74 Constant: +0:74 0 (const int) +0:74 Constant: +0:74 0 (const int) +0:74 subgroupQuadBroadcast ( temp 4-component vector of uint) +0:74 u: direct index for structure ( temp 4-component vector of uint) +0:74 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:74 Constant: +0:74 0 (const uint) +0:74 direct index ( temp uint) +0:74 'dti' ( in 3-component vector of uint) +0:74 Constant: +0:74 0 (const int) +0:74 Constant: +0:74 0 (const int) +0:74 Constant: +0:74 3 (const uint) +0:75 move second child to first child ( temp uint) +0:75 direct index ( temp uint) +0:75 u: direct index for structure ( temp 4-component vector of uint) +0:75 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:75 Constant: +0:75 0 (const uint) +0:75 direct index ( temp uint) +0:75 'dti' ( in 3-component vector of uint) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 subgroupQuadBroadcast ( temp uint) +0:75 direct index ( temp uint) +0:75 u: direct index for structure ( temp 4-component vector of uint) +0:75 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:75 Constant: +0:75 0 (const uint) +0:75 direct index ( temp uint) +0:75 'dti' ( in 3-component vector of uint) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 3 (const uint) +0:76 move second child to first child ( temp 2-component vector of uint) +0:76 vector swizzle ( temp 2-component vector of uint) +0:76 u: direct index for structure ( temp 4-component vector of uint) +0:76 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:76 Constant: +0:76 0 (const uint) +0:76 direct index ( temp uint) +0:76 'dti' ( in 3-component vector of uint) +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 0 (const int) +0:76 Sequence +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 1 (const int) +0:76 subgroupQuadBroadcast ( temp 2-component vector of uint) +0:76 vector swizzle ( temp 2-component vector of uint) +0:76 u: direct index for structure ( temp 4-component vector of uint) +0:76 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:76 Constant: +0:76 0 (const uint) +0:76 direct index ( temp uint) +0:76 'dti' ( in 3-component vector of uint) +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 0 (const int) +0:76 Sequence +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 1 (const int) +0:76 Constant: +0:76 3 (const uint) +0:77 move second child to first child ( temp 3-component vector of uint) +0:77 vector swizzle ( temp 3-component vector of uint) +0:77 u: direct index for structure ( temp 4-component vector of uint) +0:77 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:77 Constant: +0:77 0 (const uint) +0:77 direct index ( temp uint) +0:77 'dti' ( in 3-component vector of uint) +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 0 (const int) +0:77 Sequence +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 1 (const int) +0:77 Constant: +0:77 2 (const int) +0:77 subgroupQuadBroadcast ( temp 3-component vector of uint) +0:77 vector swizzle ( temp 3-component vector of uint) +0:77 u: direct index for structure ( temp 4-component vector of uint) +0:77 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:77 Constant: +0:77 0 (const uint) +0:77 direct index ( temp uint) +0:77 'dti' ( in 3-component vector of uint) +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 0 (const int) +0:77 Sequence +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 1 (const int) +0:77 Constant: +0:77 2 (const int) +0:77 Constant: +0:77 3 (const uint) +0:79 move second child to first child ( temp 4-component vector of int) +0:79 i: direct index for structure ( temp 4-component vector of int) +0:79 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:79 Constant: +0:79 0 (const uint) +0:79 direct index ( temp uint) +0:79 'dti' ( in 3-component vector of uint) +0:79 Constant: +0:79 0 (const int) +0:79 Constant: +0:79 1 (const int) +0:79 subgroupQuadBroadcast ( temp 4-component vector of int) +0:79 i: direct index for structure ( temp 4-component vector of int) +0:79 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:79 Constant: +0:79 0 (const uint) +0:79 direct index ( temp uint) +0:79 'dti' ( in 3-component vector of uint) +0:79 Constant: +0:79 0 (const int) +0:79 Constant: +0:79 1 (const int) +0:79 Constant: +0:79 3 (const uint) +0:80 move second child to first child ( temp int) +0:80 direct index ( temp int) +0:80 i: direct index for structure ( temp 4-component vector of int) +0:80 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:80 Constant: +0:80 0 (const uint) +0:80 direct index ( temp uint) +0:80 'dti' ( in 3-component vector of uint) +0:80 Constant: +0:80 0 (const int) +0:80 Constant: +0:80 1 (const int) +0:80 Constant: +0:80 0 (const int) +0:80 subgroupQuadBroadcast ( temp int) +0:80 direct index ( temp int) +0:80 i: direct index for structure ( temp 4-component vector of int) +0:80 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:80 Constant: +0:80 0 (const uint) +0:80 direct index ( temp uint) +0:80 'dti' ( in 3-component vector of uint) +0:80 Constant: +0:80 0 (const int) +0:80 Constant: +0:80 1 (const int) +0:80 Constant: +0:80 0 (const int) +0:80 Constant: +0:80 3 (const uint) +0:81 move second child to first child ( temp 2-component vector of int) +0:81 vector swizzle ( temp 2-component vector of int) +0:81 i: direct index for structure ( temp 4-component vector of int) +0:81 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:81 Constant: +0:81 0 (const uint) +0:81 direct index ( temp uint) +0:81 'dti' ( in 3-component vector of uint) +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 Sequence +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 subgroupQuadBroadcast ( temp 2-component vector of int) +0:81 vector swizzle ( temp 2-component vector of int) +0:81 i: direct index for structure ( temp 4-component vector of int) +0:81 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:81 Constant: +0:81 0 (const uint) +0:81 direct index ( temp uint) +0:81 'dti' ( in 3-component vector of uint) +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 Sequence +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 Constant: +0:81 3 (const uint) +0:82 move second child to first child ( temp 3-component vector of int) +0:82 vector swizzle ( temp 3-component vector of int) +0:82 i: direct index for structure ( temp 4-component vector of int) +0:82 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:82 Constant: +0:82 0 (const uint) +0:82 direct index ( temp uint) +0:82 'dti' ( in 3-component vector of uint) +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Sequence +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Constant: +0:82 2 (const int) +0:82 subgroupQuadBroadcast ( temp 3-component vector of int) +0:82 vector swizzle ( temp 3-component vector of int) +0:82 i: direct index for structure ( temp 4-component vector of int) +0:82 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:82 Constant: +0:82 0 (const uint) +0:82 direct index ( temp uint) +0:82 'dti' ( in 3-component vector of uint) +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Sequence +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Constant: +0:82 2 (const int) +0:82 Constant: +0:82 3 (const uint) +0:84 move second child to first child ( temp 4-component vector of float) +0:84 f: direct index for structure ( temp 4-component vector of float) +0:84 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:84 Constant: +0:84 0 (const uint) +0:84 direct index ( temp uint) +0:84 'dti' ( in 3-component vector of uint) +0:84 Constant: +0:84 0 (const int) +0:84 Constant: +0:84 2 (const int) +0:84 subgroupQuadBroadcast ( temp 4-component vector of float) +0:84 f: direct index for structure ( temp 4-component vector of float) +0:84 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:84 Constant: +0:84 0 (const uint) +0:84 direct index ( temp uint) +0:84 'dti' ( in 3-component vector of uint) +0:84 Constant: +0:84 0 (const int) +0:84 Constant: +0:84 2 (const int) +0:84 Constant: +0:84 3 (const uint) +0:85 move second child to first child ( temp float) +0:85 direct index ( temp float) +0:85 f: direct index for structure ( temp 4-component vector of float) +0:85 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:85 Constant: +0:85 0 (const uint) +0:85 direct index ( temp uint) +0:85 'dti' ( in 3-component vector of uint) +0:85 Constant: +0:85 0 (const int) +0:85 Constant: +0:85 2 (const int) +0:85 Constant: +0:85 0 (const int) +0:85 subgroupQuadBroadcast ( temp float) +0:85 direct index ( temp float) +0:85 f: direct index for structure ( temp 4-component vector of float) +0:85 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:85 Constant: +0:85 0 (const uint) +0:85 direct index ( temp uint) +0:85 'dti' ( in 3-component vector of uint) +0:85 Constant: +0:85 0 (const int) +0:85 Constant: +0:85 2 (const int) +0:85 Constant: +0:85 0 (const int) +0:85 Constant: +0:85 3 (const uint) +0:86 move second child to first child ( temp 2-component vector of float) +0:86 vector swizzle ( temp 2-component vector of float) +0:86 f: direct index for structure ( temp 4-component vector of float) +0:86 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:86 Constant: +0:86 0 (const uint) +0:86 direct index ( temp uint) +0:86 'dti' ( in 3-component vector of uint) +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 2 (const int) +0:86 Sequence +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 1 (const int) +0:86 subgroupQuadBroadcast ( temp 2-component vector of float) +0:86 vector swizzle ( temp 2-component vector of float) +0:86 f: direct index for structure ( temp 4-component vector of float) +0:86 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:86 Constant: +0:86 0 (const uint) +0:86 direct index ( temp uint) +0:86 'dti' ( in 3-component vector of uint) +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 2 (const int) +0:86 Sequence +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 1 (const int) +0:86 Constant: +0:86 3 (const uint) +0:87 move second child to first child ( temp 3-component vector of float) +0:87 vector swizzle ( temp 3-component vector of float) +0:87 f: direct index for structure ( temp 4-component vector of float) +0:87 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:87 Constant: +0:87 0 (const uint) +0:87 direct index ( temp uint) +0:87 'dti' ( in 3-component vector of uint) +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 Sequence +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 1 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 subgroupQuadBroadcast ( temp 3-component vector of float) +0:87 vector swizzle ( temp 3-component vector of float) +0:87 f: direct index for structure ( temp 4-component vector of float) +0:87 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:87 Constant: +0:87 0 (const uint) +0:87 direct index ( temp uint) +0:87 'dti' ( in 3-component vector of uint) +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 Sequence +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 1 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 Constant: +0:87 3 (const uint) +0:89 move second child to first child ( temp 4-component vector of double) +0:89 d: direct index for structure ( temp 4-component vector of double) +0:89 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:89 Constant: +0:89 0 (const uint) +0:89 direct index ( temp uint) +0:89 'dti' ( in 3-component vector of uint) +0:89 Constant: +0:89 0 (const int) +0:89 Constant: +0:89 3 (const int) +0:89 subgroupQuadBroadcast ( temp 4-component vector of double) +0:89 d: direct index for structure ( temp 4-component vector of double) +0:89 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:89 Constant: +0:89 0 (const uint) +0:89 direct index ( temp uint) +0:89 'dti' ( in 3-component vector of uint) +0:89 Constant: +0:89 0 (const int) +0:89 Constant: +0:89 3 (const int) +0:89 Constant: +0:89 3 (const uint) +0:90 move second child to first child ( temp double) +0:90 direct index ( temp double) +0:90 d: direct index for structure ( temp 4-component vector of double) +0:90 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:90 Constant: +0:90 0 (const uint) +0:90 direct index ( temp uint) +0:90 'dti' ( in 3-component vector of uint) +0:90 Constant: +0:90 0 (const int) +0:90 Constant: +0:90 3 (const int) +0:90 Constant: +0:90 0 (const int) +0:90 subgroupQuadBroadcast ( temp double) +0:90 direct index ( temp double) +0:90 d: direct index for structure ( temp 4-component vector of double) +0:90 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:90 Constant: +0:90 0 (const uint) +0:90 direct index ( temp uint) +0:90 'dti' ( in 3-component vector of uint) +0:90 Constant: +0:90 0 (const int) +0:90 Constant: +0:90 3 (const int) +0:90 Constant: +0:90 0 (const int) +0:90 Constant: +0:90 3 (const uint) +0:91 move second child to first child ( temp 2-component vector of double) +0:91 vector swizzle ( temp 2-component vector of double) +0:91 d: direct index for structure ( temp 4-component vector of double) +0:91 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:91 Constant: +0:91 0 (const uint) +0:91 direct index ( temp uint) +0:91 'dti' ( in 3-component vector of uint) +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 3 (const int) +0:91 Sequence +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 1 (const int) +0:91 subgroupQuadBroadcast ( temp 2-component vector of double) +0:91 vector swizzle ( temp 2-component vector of double) +0:91 d: direct index for structure ( temp 4-component vector of double) +0:91 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:91 Constant: +0:91 0 (const uint) +0:91 direct index ( temp uint) +0:91 'dti' ( in 3-component vector of uint) +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 3 (const int) +0:91 Sequence +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 1 (const int) +0:91 Constant: +0:91 3 (const uint) +0:92 move second child to first child ( temp 3-component vector of double) +0:92 vector swizzle ( temp 3-component vector of double) +0:92 d: direct index for structure ( temp 4-component vector of double) +0:92 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:92 Constant: +0:92 0 (const uint) +0:92 direct index ( temp uint) +0:92 'dti' ( in 3-component vector of uint) +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 3 (const int) +0:92 Sequence +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 1 (const int) +0:92 Constant: +0:92 2 (const int) +0:92 subgroupQuadBroadcast ( temp 3-component vector of double) +0:92 vector swizzle ( temp 3-component vector of double) +0:92 d: direct index for structure ( temp 4-component vector of double) +0:92 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:92 Constant: +0:92 0 (const uint) +0:92 direct index ( temp uint) +0:92 'dti' ( in 3-component vector of uint) +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 3 (const int) +0:92 Sequence +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 1 (const int) +0:92 Constant: +0:92 2 (const int) +0:92 Constant: +0:92 3 (const uint) +0:94 move second child to first child ( temp 4-component vector of uint) +0:94 u: direct index for structure ( temp 4-component vector of uint) +0:94 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:94 Constant: +0:94 0 (const uint) +0:94 direct index ( temp uint) +0:94 'dti' ( in 3-component vector of uint) +0:94 Constant: +0:94 0 (const int) +0:94 Constant: +0:94 0 (const int) +0:94 subgroupQuadSwapHorizontal ( temp 4-component vector of uint) +0:94 u: direct index for structure ( temp 4-component vector of uint) +0:94 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:94 Constant: +0:94 0 (const uint) +0:94 direct index ( temp uint) +0:94 'dti' ( in 3-component vector of uint) +0:94 Constant: +0:94 0 (const int) +0:94 Constant: +0:94 0 (const int) +0:95 move second child to first child ( temp uint) +0:95 direct index ( temp uint) +0:95 u: direct index for structure ( temp 4-component vector of uint) +0:95 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:95 Constant: +0:95 0 (const uint) +0:95 direct index ( temp uint) +0:95 'dti' ( in 3-component vector of uint) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:95 subgroupQuadSwapHorizontal ( temp uint) +0:95 direct index ( temp uint) +0:95 u: direct index for structure ( temp 4-component vector of uint) +0:95 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:95 Constant: +0:95 0 (const uint) +0:95 direct index ( temp uint) +0:95 'dti' ( in 3-component vector of uint) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:96 move second child to first child ( temp 2-component vector of uint) +0:96 vector swizzle ( temp 2-component vector of uint) +0:96 u: direct index for structure ( temp 4-component vector of uint) +0:96 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:96 Constant: +0:96 0 (const uint) +0:96 direct index ( temp uint) +0:96 'dti' ( in 3-component vector of uint) +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 0 (const int) +0:96 Sequence +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 1 (const int) +0:96 subgroupQuadSwapHorizontal ( temp 2-component vector of uint) +0:96 vector swizzle ( temp 2-component vector of uint) +0:96 u: direct index for structure ( temp 4-component vector of uint) +0:96 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:96 Constant: +0:96 0 (const uint) +0:96 direct index ( temp uint) +0:96 'dti' ( in 3-component vector of uint) +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 0 (const int) +0:96 Sequence +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 1 (const int) +0:97 move second child to first child ( temp 3-component vector of uint) +0:97 vector swizzle ( temp 3-component vector of uint) +0:97 u: direct index for structure ( temp 4-component vector of uint) +0:97 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:97 Constant: +0:97 0 (const uint) +0:97 direct index ( temp uint) +0:97 'dti' ( in 3-component vector of uint) +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 0 (const int) +0:97 Sequence +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 1 (const int) +0:97 Constant: +0:97 2 (const int) +0:97 subgroupQuadSwapHorizontal ( temp 3-component vector of uint) +0:97 vector swizzle ( temp 3-component vector of uint) +0:97 u: direct index for structure ( temp 4-component vector of uint) +0:97 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:97 Constant: +0:97 0 (const uint) +0:97 direct index ( temp uint) +0:97 'dti' ( in 3-component vector of uint) +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 0 (const int) +0:97 Sequence +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 1 (const int) +0:97 Constant: +0:97 2 (const int) +0:99 move second child to first child ( temp 4-component vector of int) +0:99 i: direct index for structure ( temp 4-component vector of int) +0:99 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:99 Constant: +0:99 0 (const uint) +0:99 direct index ( temp uint) +0:99 'dti' ( in 3-component vector of uint) +0:99 Constant: +0:99 0 (const int) +0:99 Constant: +0:99 1 (const int) +0:99 subgroupQuadSwapHorizontal ( temp 4-component vector of int) +0:99 i: direct index for structure ( temp 4-component vector of int) +0:99 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:99 Constant: +0:99 0 (const uint) +0:99 direct index ( temp uint) +0:99 'dti' ( in 3-component vector of uint) +0:99 Constant: +0:99 0 (const int) +0:99 Constant: +0:99 1 (const int) +0:100 move second child to first child ( temp int) +0:100 direct index ( temp int) +0:100 i: direct index for structure ( temp 4-component vector of int) +0:100 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:100 Constant: +0:100 0 (const uint) +0:100 direct index ( temp uint) +0:100 'dti' ( in 3-component vector of uint) +0:100 Constant: +0:100 0 (const int) +0:100 Constant: +0:100 1 (const int) +0:100 Constant: +0:100 0 (const int) +0:100 subgroupQuadSwapHorizontal ( temp int) +0:100 direct index ( temp int) +0:100 i: direct index for structure ( temp 4-component vector of int) +0:100 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:100 Constant: +0:100 0 (const uint) +0:100 direct index ( temp uint) +0:100 'dti' ( in 3-component vector of uint) +0:100 Constant: +0:100 0 (const int) +0:100 Constant: +0:100 1 (const int) +0:100 Constant: +0:100 0 (const int) +0:101 move second child to first child ( temp 2-component vector of int) +0:101 vector swizzle ( temp 2-component vector of int) +0:101 i: direct index for structure ( temp 4-component vector of int) +0:101 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:101 Constant: +0:101 0 (const uint) +0:101 direct index ( temp uint) +0:101 'dti' ( in 3-component vector of uint) +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:101 Sequence +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:101 subgroupQuadSwapHorizontal ( temp 2-component vector of int) +0:101 vector swizzle ( temp 2-component vector of int) +0:101 i: direct index for structure ( temp 4-component vector of int) +0:101 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:101 Constant: +0:101 0 (const uint) +0:101 direct index ( temp uint) +0:101 'dti' ( in 3-component vector of uint) +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:101 Sequence +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:102 move second child to first child ( temp 3-component vector of int) +0:102 vector swizzle ( temp 3-component vector of int) +0:102 i: direct index for structure ( temp 4-component vector of int) +0:102 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:102 Constant: +0:102 0 (const uint) +0:102 direct index ( temp uint) +0:102 'dti' ( in 3-component vector of uint) +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Sequence +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Constant: +0:102 2 (const int) +0:102 subgroupQuadSwapHorizontal ( temp 3-component vector of int) +0:102 vector swizzle ( temp 3-component vector of int) +0:102 i: direct index for structure ( temp 4-component vector of int) +0:102 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:102 Constant: +0:102 0 (const uint) +0:102 direct index ( temp uint) +0:102 'dti' ( in 3-component vector of uint) +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Sequence +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Constant: +0:102 2 (const int) +0:104 move second child to first child ( temp 4-component vector of float) +0:104 f: direct index for structure ( temp 4-component vector of float) +0:104 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:104 Constant: +0:104 0 (const uint) +0:104 direct index ( temp uint) +0:104 'dti' ( in 3-component vector of uint) +0:104 Constant: +0:104 0 (const int) +0:104 Constant: +0:104 2 (const int) +0:104 subgroupQuadSwapHorizontal ( temp 4-component vector of float) +0:104 f: direct index for structure ( temp 4-component vector of float) +0:104 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:104 Constant: +0:104 0 (const uint) +0:104 direct index ( temp uint) +0:104 'dti' ( in 3-component vector of uint) +0:104 Constant: +0:104 0 (const int) +0:104 Constant: +0:104 2 (const int) +0:105 move second child to first child ( temp float) +0:105 direct index ( temp float) +0:105 f: direct index for structure ( temp 4-component vector of float) +0:105 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:105 Constant: +0:105 0 (const uint) +0:105 direct index ( temp uint) +0:105 'dti' ( in 3-component vector of uint) +0:105 Constant: +0:105 0 (const int) +0:105 Constant: +0:105 2 (const int) +0:105 Constant: +0:105 0 (const int) +0:105 subgroupQuadSwapHorizontal ( temp float) +0:105 direct index ( temp float) +0:105 f: direct index for structure ( temp 4-component vector of float) +0:105 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:105 Constant: +0:105 0 (const uint) +0:105 direct index ( temp uint) +0:105 'dti' ( in 3-component vector of uint) +0:105 Constant: +0:105 0 (const int) +0:105 Constant: +0:105 2 (const int) +0:105 Constant: +0:105 0 (const int) +0:106 move second child to first child ( temp 2-component vector of float) +0:106 vector swizzle ( temp 2-component vector of float) +0:106 f: direct index for structure ( temp 4-component vector of float) +0:106 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:106 Constant: +0:106 0 (const uint) +0:106 direct index ( temp uint) +0:106 'dti' ( in 3-component vector of uint) +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 2 (const int) +0:106 Sequence +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 1 (const int) +0:106 subgroupQuadSwapHorizontal ( temp 2-component vector of float) +0:106 vector swizzle ( temp 2-component vector of float) +0:106 f: direct index for structure ( temp 4-component vector of float) +0:106 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:106 Constant: +0:106 0 (const uint) +0:106 direct index ( temp uint) +0:106 'dti' ( in 3-component vector of uint) +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 2 (const int) +0:106 Sequence +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 1 (const int) +0:107 move second child to first child ( temp 3-component vector of float) +0:107 vector swizzle ( temp 3-component vector of float) +0:107 f: direct index for structure ( temp 4-component vector of float) +0:107 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:107 Constant: +0:107 0 (const uint) +0:107 direct index ( temp uint) +0:107 'dti' ( in 3-component vector of uint) +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 2 (const int) +0:107 Sequence +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 1 (const int) +0:107 Constant: +0:107 2 (const int) +0:107 subgroupQuadSwapHorizontal ( temp 3-component vector of float) +0:107 vector swizzle ( temp 3-component vector of float) +0:107 f: direct index for structure ( temp 4-component vector of float) +0:107 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:107 Constant: +0:107 0 (const uint) +0:107 direct index ( temp uint) +0:107 'dti' ( in 3-component vector of uint) +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 2 (const int) +0:107 Sequence +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 1 (const int) +0:107 Constant: +0:107 2 (const int) +0:109 move second child to first child ( temp 4-component vector of double) +0:109 d: direct index for structure ( temp 4-component vector of double) +0:109 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:109 Constant: +0:109 0 (const uint) +0:109 direct index ( temp uint) +0:109 'dti' ( in 3-component vector of uint) +0:109 Constant: +0:109 0 (const int) +0:109 Constant: +0:109 3 (const int) +0:109 subgroupQuadSwapHorizontal ( temp 4-component vector of double) +0:109 d: direct index for structure ( temp 4-component vector of double) +0:109 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:109 Constant: +0:109 0 (const uint) +0:109 direct index ( temp uint) +0:109 'dti' ( in 3-component vector of uint) +0:109 Constant: +0:109 0 (const int) +0:109 Constant: +0:109 3 (const int) +0:110 move second child to first child ( temp double) +0:110 direct index ( temp double) +0:110 d: direct index for structure ( temp 4-component vector of double) +0:110 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:110 Constant: +0:110 0 (const uint) +0:110 direct index ( temp uint) +0:110 'dti' ( in 3-component vector of uint) +0:110 Constant: +0:110 0 (const int) +0:110 Constant: +0:110 3 (const int) +0:110 Constant: +0:110 0 (const int) +0:110 subgroupQuadSwapHorizontal ( temp double) +0:110 direct index ( temp double) +0:110 d: direct index for structure ( temp 4-component vector of double) +0:110 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:110 Constant: +0:110 0 (const uint) +0:110 direct index ( temp uint) +0:110 'dti' ( in 3-component vector of uint) +0:110 Constant: +0:110 0 (const int) +0:110 Constant: +0:110 3 (const int) +0:110 Constant: +0:110 0 (const int) +0:111 move second child to first child ( temp 2-component vector of double) +0:111 vector swizzle ( temp 2-component vector of double) +0:111 d: direct index for structure ( temp 4-component vector of double) +0:111 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:111 Constant: +0:111 0 (const uint) +0:111 direct index ( temp uint) +0:111 'dti' ( in 3-component vector of uint) +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 3 (const int) +0:111 Sequence +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1 (const int) +0:111 subgroupQuadSwapHorizontal ( temp 2-component vector of double) +0:111 vector swizzle ( temp 2-component vector of double) +0:111 d: direct index for structure ( temp 4-component vector of double) +0:111 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:111 Constant: +0:111 0 (const uint) +0:111 direct index ( temp uint) +0:111 'dti' ( in 3-component vector of uint) +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 3 (const int) +0:111 Sequence +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1 (const int) +0:112 move second child to first child ( temp 3-component vector of double) +0:112 vector swizzle ( temp 3-component vector of double) +0:112 d: direct index for structure ( temp 4-component vector of double) +0:112 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:112 Constant: +0:112 0 (const uint) +0:112 direct index ( temp uint) +0:112 'dti' ( in 3-component vector of uint) +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 3 (const int) +0:112 Sequence +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 1 (const int) +0:112 Constant: +0:112 2 (const int) +0:112 subgroupQuadSwapHorizontal ( temp 3-component vector of double) +0:112 vector swizzle ( temp 3-component vector of double) +0:112 d: direct index for structure ( temp 4-component vector of double) +0:112 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:112 Constant: +0:112 0 (const uint) +0:112 direct index ( temp uint) +0:112 'dti' ( in 3-component vector of uint) +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 3 (const int) +0:112 Sequence +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 1 (const int) +0:112 Constant: +0:112 2 (const int) +0:114 move second child to first child ( temp 4-component vector of uint) +0:114 u: direct index for structure ( temp 4-component vector of uint) +0:114 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:114 Constant: +0:114 0 (const uint) +0:114 direct index ( temp uint) +0:114 'dti' ( in 3-component vector of uint) +0:114 Constant: +0:114 0 (const int) +0:114 Constant: +0:114 0 (const int) +0:114 subgroupQuadSwapVertical ( temp 4-component vector of uint) +0:114 u: direct index for structure ( temp 4-component vector of uint) +0:114 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:114 Constant: +0:114 0 (const uint) +0:114 direct index ( temp uint) +0:114 'dti' ( in 3-component vector of uint) +0:114 Constant: +0:114 0 (const int) +0:114 Constant: +0:114 0 (const int) +0:115 move second child to first child ( temp uint) +0:115 direct index ( temp uint) +0:115 u: direct index for structure ( temp 4-component vector of uint) +0:115 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:115 Constant: +0:115 0 (const uint) +0:115 direct index ( temp uint) +0:115 'dti' ( in 3-component vector of uint) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:115 subgroupQuadSwapVertical ( temp uint) +0:115 direct index ( temp uint) +0:115 u: direct index for structure ( temp 4-component vector of uint) +0:115 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:115 Constant: +0:115 0 (const uint) +0:115 direct index ( temp uint) +0:115 'dti' ( in 3-component vector of uint) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:116 move second child to first child ( temp 2-component vector of uint) +0:116 vector swizzle ( temp 2-component vector of uint) +0:116 u: direct index for structure ( temp 4-component vector of uint) +0:116 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:116 Constant: +0:116 0 (const uint) +0:116 direct index ( temp uint) +0:116 'dti' ( in 3-component vector of uint) +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 0 (const int) +0:116 Sequence +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 1 (const int) +0:116 subgroupQuadSwapVertical ( temp 2-component vector of uint) +0:116 vector swizzle ( temp 2-component vector of uint) +0:116 u: direct index for structure ( temp 4-component vector of uint) +0:116 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:116 Constant: +0:116 0 (const uint) +0:116 direct index ( temp uint) +0:116 'dti' ( in 3-component vector of uint) +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 0 (const int) +0:116 Sequence +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 1 (const int) +0:117 move second child to first child ( temp 3-component vector of uint) +0:117 vector swizzle ( temp 3-component vector of uint) +0:117 u: direct index for structure ( temp 4-component vector of uint) +0:117 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:117 Constant: +0:117 0 (const uint) +0:117 direct index ( temp uint) +0:117 'dti' ( in 3-component vector of uint) +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 0 (const int) +0:117 Sequence +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 1 (const int) +0:117 Constant: +0:117 2 (const int) +0:117 subgroupQuadSwapVertical ( temp 3-component vector of uint) +0:117 vector swizzle ( temp 3-component vector of uint) +0:117 u: direct index for structure ( temp 4-component vector of uint) +0:117 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:117 Constant: +0:117 0 (const uint) +0:117 direct index ( temp uint) +0:117 'dti' ( in 3-component vector of uint) +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 0 (const int) +0:117 Sequence +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 1 (const int) +0:117 Constant: +0:117 2 (const int) +0:119 move second child to first child ( temp 4-component vector of int) +0:119 i: direct index for structure ( temp 4-component vector of int) +0:119 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:119 Constant: +0:119 0 (const uint) +0:119 direct index ( temp uint) +0:119 'dti' ( in 3-component vector of uint) +0:119 Constant: +0:119 0 (const int) +0:119 Constant: +0:119 1 (const int) +0:119 subgroupQuadSwapVertical ( temp 4-component vector of int) +0:119 i: direct index for structure ( temp 4-component vector of int) +0:119 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:119 Constant: +0:119 0 (const uint) +0:119 direct index ( temp uint) +0:119 'dti' ( in 3-component vector of uint) +0:119 Constant: +0:119 0 (const int) +0:119 Constant: +0:119 1 (const int) +0:120 move second child to first child ( temp int) +0:120 direct index ( temp int) +0:120 i: direct index for structure ( temp 4-component vector of int) +0:120 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:120 Constant: +0:120 0 (const uint) +0:120 direct index ( temp uint) +0:120 'dti' ( in 3-component vector of uint) +0:120 Constant: +0:120 0 (const int) +0:120 Constant: +0:120 1 (const int) +0:120 Constant: +0:120 0 (const int) +0:120 subgroupQuadSwapVertical ( temp int) +0:120 direct index ( temp int) +0:120 i: direct index for structure ( temp 4-component vector of int) +0:120 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:120 Constant: +0:120 0 (const uint) +0:120 direct index ( temp uint) +0:120 'dti' ( in 3-component vector of uint) +0:120 Constant: +0:120 0 (const int) +0:120 Constant: +0:120 1 (const int) +0:120 Constant: +0:120 0 (const int) +0:121 move second child to first child ( temp 2-component vector of int) +0:121 vector swizzle ( temp 2-component vector of int) +0:121 i: direct index for structure ( temp 4-component vector of int) +0:121 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:121 Constant: +0:121 0 (const uint) +0:121 direct index ( temp uint) +0:121 'dti' ( in 3-component vector of uint) +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:121 Sequence +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:121 subgroupQuadSwapVertical ( temp 2-component vector of int) +0:121 vector swizzle ( temp 2-component vector of int) +0:121 i: direct index for structure ( temp 4-component vector of int) +0:121 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:121 Constant: +0:121 0 (const uint) +0:121 direct index ( temp uint) +0:121 'dti' ( in 3-component vector of uint) +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:121 Sequence +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:122 move second child to first child ( temp 3-component vector of int) +0:122 vector swizzle ( temp 3-component vector of int) +0:122 i: direct index for structure ( temp 4-component vector of int) +0:122 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:122 Constant: +0:122 0 (const uint) +0:122 direct index ( temp uint) +0:122 'dti' ( in 3-component vector of uint) +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Sequence +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Constant: +0:122 2 (const int) +0:122 subgroupQuadSwapVertical ( temp 3-component vector of int) +0:122 vector swizzle ( temp 3-component vector of int) +0:122 i: direct index for structure ( temp 4-component vector of int) +0:122 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:122 Constant: +0:122 0 (const uint) +0:122 direct index ( temp uint) +0:122 'dti' ( in 3-component vector of uint) +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Sequence +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Constant: +0:122 2 (const int) +0:124 move second child to first child ( temp 4-component vector of float) +0:124 f: direct index for structure ( temp 4-component vector of float) +0:124 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:124 Constant: +0:124 0 (const uint) +0:124 direct index ( temp uint) +0:124 'dti' ( in 3-component vector of uint) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 2 (const int) +0:124 subgroupQuadSwapVertical ( temp 4-component vector of float) +0:124 f: direct index for structure ( temp 4-component vector of float) +0:124 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:124 Constant: +0:124 0 (const uint) +0:124 direct index ( temp uint) +0:124 'dti' ( in 3-component vector of uint) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 2 (const int) +0:125 move second child to first child ( temp float) +0:125 direct index ( temp float) +0:125 f: direct index for structure ( temp 4-component vector of float) +0:125 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:125 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:125 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:125 Constant: +0:125 0 (const uint) +0:125 direct index ( temp uint) +0:125 'dti' ( in 3-component vector of uint) +0:125 Constant: +0:125 0 (const int) +0:125 Constant: +0:125 2 (const int) +0:125 Constant: +0:125 0 (const int) +0:125 subgroupQuadSwapVertical ( temp float) +0:125 direct index ( temp float) +0:125 f: direct index for structure ( temp 4-component vector of float) +0:125 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:125 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:125 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:125 Constant: +0:125 0 (const uint) +0:125 direct index ( temp uint) +0:125 'dti' ( in 3-component vector of uint) +0:125 Constant: +0:125 0 (const int) +0:125 Constant: +0:125 2 (const int) +0:125 Constant: +0:125 0 (const int) +0:126 move second child to first child ( temp 2-component vector of float) +0:126 vector swizzle ( temp 2-component vector of float) +0:126 f: direct index for structure ( temp 4-component vector of float) +0:126 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:126 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:126 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:126 Constant: +0:126 0 (const uint) +0:126 direct index ( temp uint) +0:126 'dti' ( in 3-component vector of uint) +0:126 Constant: +0:126 0 (const int) +0:126 Constant: +0:126 2 (const int) +0:126 Sequence +0:126 Constant: +0:126 0 (const int) +0:126 Constant: +0:126 1 (const int) +0:126 subgroupQuadSwapVertical ( temp 2-component vector of float) +0:126 vector swizzle ( temp 2-component vector of float) +0:126 f: direct index for structure ( temp 4-component vector of float) +0:126 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:126 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:126 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:126 Constant: +0:126 0 (const uint) +0:126 direct index ( temp uint) +0:126 'dti' ( in 3-component vector of uint) +0:126 Constant: +0:126 0 (const int) +0:126 Constant: +0:126 2 (const int) +0:126 Sequence +0:126 Constant: +0:126 0 (const int) +0:126 Constant: +0:126 1 (const int) +0:127 move second child to first child ( temp 3-component vector of float) +0:127 vector swizzle ( temp 3-component vector of float) +0:127 f: direct index for structure ( temp 4-component vector of float) +0:127 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:127 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:127 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:127 Constant: +0:127 0 (const uint) +0:127 direct index ( temp uint) +0:127 'dti' ( in 3-component vector of uint) +0:127 Constant: +0:127 0 (const int) +0:127 Constant: +0:127 2 (const int) +0:127 Sequence +0:127 Constant: +0:127 0 (const int) +0:127 Constant: +0:127 1 (const int) +0:127 Constant: +0:127 2 (const int) +0:127 subgroupQuadSwapVertical ( temp 3-component vector of float) +0:127 vector swizzle ( temp 3-component vector of float) +0:127 f: direct index for structure ( temp 4-component vector of float) +0:127 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:127 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:127 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:127 Constant: +0:127 0 (const uint) +0:127 direct index ( temp uint) +0:127 'dti' ( in 3-component vector of uint) +0:127 Constant: +0:127 0 (const int) +0:127 Constant: +0:127 2 (const int) +0:127 Sequence +0:127 Constant: +0:127 0 (const int) +0:127 Constant: +0:127 1 (const int) +0:127 Constant: +0:127 2 (const int) +0:129 move second child to first child ( temp 4-component vector of double) +0:129 d: direct index for structure ( temp 4-component vector of double) +0:129 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:129 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:129 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:129 Constant: +0:129 0 (const uint) +0:129 direct index ( temp uint) +0:129 'dti' ( in 3-component vector of uint) +0:129 Constant: +0:129 0 (const int) +0:129 Constant: +0:129 3 (const int) +0:129 subgroupQuadSwapVertical ( temp 4-component vector of double) +0:129 d: direct index for structure ( temp 4-component vector of double) +0:129 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:129 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:129 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:129 Constant: +0:129 0 (const uint) +0:129 direct index ( temp uint) +0:129 'dti' ( in 3-component vector of uint) +0:129 Constant: +0:129 0 (const int) +0:129 Constant: +0:129 3 (const int) +0:130 move second child to first child ( temp double) +0:130 direct index ( temp double) +0:130 d: direct index for structure ( temp 4-component vector of double) +0:130 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:130 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:130 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:130 Constant: +0:130 0 (const uint) +0:130 direct index ( temp uint) +0:130 'dti' ( in 3-component vector of uint) +0:130 Constant: +0:130 0 (const int) +0:130 Constant: +0:130 3 (const int) +0:130 Constant: +0:130 0 (const int) +0:130 subgroupQuadSwapVertical ( temp double) +0:130 direct index ( temp double) +0:130 d: direct index for structure ( temp 4-component vector of double) +0:130 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:130 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:130 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:130 Constant: +0:130 0 (const uint) +0:130 direct index ( temp uint) +0:130 'dti' ( in 3-component vector of uint) +0:130 Constant: +0:130 0 (const int) +0:130 Constant: +0:130 3 (const int) +0:130 Constant: +0:130 0 (const int) +0:131 move second child to first child ( temp 2-component vector of double) +0:131 vector swizzle ( temp 2-component vector of double) +0:131 d: direct index for structure ( temp 4-component vector of double) +0:131 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:131 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:131 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:131 Constant: +0:131 0 (const uint) +0:131 direct index ( temp uint) +0:131 'dti' ( in 3-component vector of uint) +0:131 Constant: +0:131 0 (const int) +0:131 Constant: +0:131 3 (const int) +0:131 Sequence +0:131 Constant: +0:131 0 (const int) +0:131 Constant: +0:131 1 (const int) +0:131 subgroupQuadSwapVertical ( temp 2-component vector of double) +0:131 vector swizzle ( temp 2-component vector of double) +0:131 d: direct index for structure ( temp 4-component vector of double) +0:131 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:131 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:131 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:131 Constant: +0:131 0 (const uint) +0:131 direct index ( temp uint) +0:131 'dti' ( in 3-component vector of uint) +0:131 Constant: +0:131 0 (const int) +0:131 Constant: +0:131 3 (const int) +0:131 Sequence +0:131 Constant: +0:131 0 (const int) +0:131 Constant: +0:131 1 (const int) +0:132 move second child to first child ( temp 3-component vector of double) +0:132 vector swizzle ( temp 3-component vector of double) +0:132 d: direct index for structure ( temp 4-component vector of double) +0:132 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:132 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:132 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:132 Constant: +0:132 0 (const uint) +0:132 direct index ( temp uint) +0:132 'dti' ( in 3-component vector of uint) +0:132 Constant: +0:132 0 (const int) +0:132 Constant: +0:132 3 (const int) +0:132 Sequence +0:132 Constant: +0:132 0 (const int) +0:132 Constant: +0:132 1 (const int) +0:132 Constant: +0:132 2 (const int) +0:132 subgroupQuadSwapVertical ( temp 3-component vector of double) +0:132 vector swizzle ( temp 3-component vector of double) +0:132 d: direct index for structure ( temp 4-component vector of double) +0:132 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:132 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:132 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:132 Constant: +0:132 0 (const uint) +0:132 direct index ( temp uint) +0:132 'dti' ( in 3-component vector of uint) +0:132 Constant: +0:132 0 (const int) +0:132 Constant: +0:132 3 (const int) +0:132 Sequence +0:132 Constant: +0:132 0 (const int) +0:132 Constant: +0:132 1 (const int) +0:132 Constant: +0:132 2 (const int) +0:134 move second child to first child ( temp 4-component vector of uint) +0:134 u: direct index for structure ( temp 4-component vector of uint) +0:134 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:134 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:134 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:134 Constant: +0:134 0 (const uint) +0:134 direct index ( temp uint) +0:134 'dti' ( in 3-component vector of uint) +0:134 Constant: +0:134 0 (const int) +0:134 Constant: +0:134 0 (const int) +0:134 subgroupQuadSwapDiagonal ( temp 4-component vector of uint) +0:134 u: direct index for structure ( temp 4-component vector of uint) +0:134 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:134 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:134 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:134 Constant: +0:134 0 (const uint) +0:134 direct index ( temp uint) +0:134 'dti' ( in 3-component vector of uint) +0:134 Constant: +0:134 0 (const int) +0:134 Constant: +0:134 0 (const int) +0:135 move second child to first child ( temp uint) +0:135 direct index ( temp uint) +0:135 u: direct index for structure ( temp 4-component vector of uint) +0:135 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:135 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:135 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:135 Constant: +0:135 0 (const uint) +0:135 direct index ( temp uint) +0:135 'dti' ( in 3-component vector of uint) +0:135 Constant: +0:135 0 (const int) +0:135 Constant: +0:135 0 (const int) +0:135 Constant: +0:135 0 (const int) +0:135 subgroupQuadSwapDiagonal ( temp uint) +0:135 direct index ( temp uint) +0:135 u: direct index for structure ( temp 4-component vector of uint) +0:135 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:135 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:135 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:135 Constant: +0:135 0 (const uint) +0:135 direct index ( temp uint) +0:135 'dti' ( in 3-component vector of uint) +0:135 Constant: +0:135 0 (const int) +0:135 Constant: +0:135 0 (const int) +0:135 Constant: +0:135 0 (const int) +0:136 move second child to first child ( temp 2-component vector of uint) +0:136 vector swizzle ( temp 2-component vector of uint) +0:136 u: direct index for structure ( temp 4-component vector of uint) +0:136 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:136 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:136 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:136 Constant: +0:136 0 (const uint) +0:136 direct index ( temp uint) +0:136 'dti' ( in 3-component vector of uint) +0:136 Constant: +0:136 0 (const int) +0:136 Constant: +0:136 0 (const int) +0:136 Sequence +0:136 Constant: +0:136 0 (const int) +0:136 Constant: +0:136 1 (const int) +0:136 subgroupQuadSwapDiagonal ( temp 2-component vector of uint) +0:136 vector swizzle ( temp 2-component vector of uint) +0:136 u: direct index for structure ( temp 4-component vector of uint) +0:136 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:136 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:136 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:136 Constant: +0:136 0 (const uint) +0:136 direct index ( temp uint) +0:136 'dti' ( in 3-component vector of uint) +0:136 Constant: +0:136 0 (const int) +0:136 Constant: +0:136 0 (const int) +0:136 Sequence +0:136 Constant: +0:136 0 (const int) +0:136 Constant: +0:136 1 (const int) +0:137 move second child to first child ( temp 3-component vector of uint) +0:137 vector swizzle ( temp 3-component vector of uint) +0:137 u: direct index for structure ( temp 4-component vector of uint) +0:137 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:137 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:137 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:137 Constant: +0:137 0 (const uint) +0:137 direct index ( temp uint) +0:137 'dti' ( in 3-component vector of uint) +0:137 Constant: +0:137 0 (const int) +0:137 Constant: +0:137 0 (const int) +0:137 Sequence +0:137 Constant: +0:137 0 (const int) +0:137 Constant: +0:137 1 (const int) +0:137 Constant: +0:137 2 (const int) +0:137 subgroupQuadSwapDiagonal ( temp 3-component vector of uint) +0:137 vector swizzle ( temp 3-component vector of uint) +0:137 u: direct index for structure ( temp 4-component vector of uint) +0:137 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:137 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:137 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:137 Constant: +0:137 0 (const uint) +0:137 direct index ( temp uint) +0:137 'dti' ( in 3-component vector of uint) +0:137 Constant: +0:137 0 (const int) +0:137 Constant: +0:137 0 (const int) +0:137 Sequence +0:137 Constant: +0:137 0 (const int) +0:137 Constant: +0:137 1 (const int) +0:137 Constant: +0:137 2 (const int) +0:139 move second child to first child ( temp 4-component vector of int) +0:139 i: direct index for structure ( temp 4-component vector of int) +0:139 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:139 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:139 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:139 Constant: +0:139 0 (const uint) +0:139 direct index ( temp uint) +0:139 'dti' ( in 3-component vector of uint) +0:139 Constant: +0:139 0 (const int) +0:139 Constant: +0:139 1 (const int) +0:139 subgroupQuadSwapDiagonal ( temp 4-component vector of int) +0:139 i: direct index for structure ( temp 4-component vector of int) +0:139 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:139 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:139 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:139 Constant: +0:139 0 (const uint) +0:139 direct index ( temp uint) +0:139 'dti' ( in 3-component vector of uint) +0:139 Constant: +0:139 0 (const int) +0:139 Constant: +0:139 1 (const int) +0:140 move second child to first child ( temp int) +0:140 direct index ( temp int) +0:140 i: direct index for structure ( temp 4-component vector of int) +0:140 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:140 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:140 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:140 Constant: +0:140 0 (const uint) +0:140 direct index ( temp uint) +0:140 'dti' ( in 3-component vector of uint) +0:140 Constant: +0:140 0 (const int) +0:140 Constant: +0:140 1 (const int) +0:140 Constant: +0:140 0 (const int) +0:140 subgroupQuadSwapDiagonal ( temp int) +0:140 direct index ( temp int) +0:140 i: direct index for structure ( temp 4-component vector of int) +0:140 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:140 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:140 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:140 Constant: +0:140 0 (const uint) +0:140 direct index ( temp uint) +0:140 'dti' ( in 3-component vector of uint) +0:140 Constant: +0:140 0 (const int) +0:140 Constant: +0:140 1 (const int) +0:140 Constant: +0:140 0 (const int) +0:141 move second child to first child ( temp 2-component vector of int) +0:141 vector swizzle ( temp 2-component vector of int) +0:141 i: direct index for structure ( temp 4-component vector of int) +0:141 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:141 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:141 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:141 Constant: +0:141 0 (const uint) +0:141 direct index ( temp uint) +0:141 'dti' ( in 3-component vector of uint) +0:141 Constant: +0:141 0 (const int) +0:141 Constant: +0:141 1 (const int) +0:141 Sequence +0:141 Constant: +0:141 0 (const int) +0:141 Constant: +0:141 1 (const int) +0:141 subgroupQuadSwapDiagonal ( temp 2-component vector of int) +0:141 vector swizzle ( temp 2-component vector of int) +0:141 i: direct index for structure ( temp 4-component vector of int) +0:141 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:141 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:141 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:141 Constant: +0:141 0 (const uint) +0:141 direct index ( temp uint) +0:141 'dti' ( in 3-component vector of uint) +0:141 Constant: +0:141 0 (const int) +0:141 Constant: +0:141 1 (const int) +0:141 Sequence +0:141 Constant: +0:141 0 (const int) +0:141 Constant: +0:141 1 (const int) +0:142 move second child to first child ( temp 3-component vector of int) +0:142 vector swizzle ( temp 3-component vector of int) +0:142 i: direct index for structure ( temp 4-component vector of int) +0:142 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:142 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:142 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:142 Constant: +0:142 0 (const uint) +0:142 direct index ( temp uint) +0:142 'dti' ( in 3-component vector of uint) +0:142 Constant: +0:142 0 (const int) +0:142 Constant: +0:142 1 (const int) +0:142 Sequence +0:142 Constant: +0:142 0 (const int) +0:142 Constant: +0:142 1 (const int) +0:142 Constant: +0:142 2 (const int) +0:142 subgroupQuadSwapDiagonal ( temp 3-component vector of int) +0:142 vector swizzle ( temp 3-component vector of int) +0:142 i: direct index for structure ( temp 4-component vector of int) +0:142 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:142 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:142 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:142 Constant: +0:142 0 (const uint) +0:142 direct index ( temp uint) +0:142 'dti' ( in 3-component vector of uint) +0:142 Constant: +0:142 0 (const int) +0:142 Constant: +0:142 1 (const int) +0:142 Sequence +0:142 Constant: +0:142 0 (const int) +0:142 Constant: +0:142 1 (const int) +0:142 Constant: +0:142 2 (const int) +0:144 move second child to first child ( temp 4-component vector of float) +0:144 f: direct index for structure ( temp 4-component vector of float) +0:144 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:144 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:144 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:144 Constant: +0:144 0 (const uint) +0:144 direct index ( temp uint) +0:144 'dti' ( in 3-component vector of uint) +0:144 Constant: +0:144 0 (const int) +0:144 Constant: +0:144 2 (const int) +0:144 subgroupQuadSwapDiagonal ( temp 4-component vector of float) +0:144 f: direct index for structure ( temp 4-component vector of float) +0:144 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:144 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:144 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:144 Constant: +0:144 0 (const uint) +0:144 direct index ( temp uint) +0:144 'dti' ( in 3-component vector of uint) +0:144 Constant: +0:144 0 (const int) +0:144 Constant: +0:144 2 (const int) +0:145 move second child to first child ( temp float) +0:145 direct index ( temp float) +0:145 f: direct index for structure ( temp 4-component vector of float) +0:145 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:145 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:145 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:145 Constant: +0:145 0 (const uint) +0:145 direct index ( temp uint) +0:145 'dti' ( in 3-component vector of uint) +0:145 Constant: +0:145 0 (const int) +0:145 Constant: +0:145 2 (const int) +0:145 Constant: +0:145 0 (const int) +0:145 subgroupQuadSwapDiagonal ( temp float) +0:145 direct index ( temp float) +0:145 f: direct index for structure ( temp 4-component vector of float) +0:145 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:145 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:145 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:145 Constant: +0:145 0 (const uint) +0:145 direct index ( temp uint) +0:145 'dti' ( in 3-component vector of uint) +0:145 Constant: +0:145 0 (const int) +0:145 Constant: +0:145 2 (const int) +0:145 Constant: +0:145 0 (const int) +0:146 move second child to first child ( temp 2-component vector of float) +0:146 vector swizzle ( temp 2-component vector of float) +0:146 f: direct index for structure ( temp 4-component vector of float) +0:146 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:146 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:146 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:146 Constant: +0:146 0 (const uint) +0:146 direct index ( temp uint) +0:146 'dti' ( in 3-component vector of uint) +0:146 Constant: +0:146 0 (const int) +0:146 Constant: +0:146 2 (const int) +0:146 Sequence +0:146 Constant: +0:146 0 (const int) +0:146 Constant: +0:146 1 (const int) +0:146 subgroupQuadSwapDiagonal ( temp 2-component vector of float) +0:146 vector swizzle ( temp 2-component vector of float) +0:146 f: direct index for structure ( temp 4-component vector of float) +0:146 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:146 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:146 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:146 Constant: +0:146 0 (const uint) +0:146 direct index ( temp uint) +0:146 'dti' ( in 3-component vector of uint) +0:146 Constant: +0:146 0 (const int) +0:146 Constant: +0:146 2 (const int) +0:146 Sequence +0:146 Constant: +0:146 0 (const int) +0:146 Constant: +0:146 1 (const int) +0:147 move second child to first child ( temp 3-component vector of float) +0:147 vector swizzle ( temp 3-component vector of float) +0:147 f: direct index for structure ( temp 4-component vector of float) +0:147 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:147 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:147 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:147 Constant: +0:147 0 (const uint) +0:147 direct index ( temp uint) +0:147 'dti' ( in 3-component vector of uint) +0:147 Constant: +0:147 0 (const int) +0:147 Constant: +0:147 2 (const int) +0:147 Sequence +0:147 Constant: +0:147 0 (const int) +0:147 Constant: +0:147 1 (const int) +0:147 Constant: +0:147 2 (const int) +0:147 subgroupQuadSwapDiagonal ( temp 3-component vector of float) +0:147 vector swizzle ( temp 3-component vector of float) +0:147 f: direct index for structure ( temp 4-component vector of float) +0:147 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:147 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:147 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:147 Constant: +0:147 0 (const uint) +0:147 direct index ( temp uint) +0:147 'dti' ( in 3-component vector of uint) +0:147 Constant: +0:147 0 (const int) +0:147 Constant: +0:147 2 (const int) +0:147 Sequence +0:147 Constant: +0:147 0 (const int) +0:147 Constant: +0:147 1 (const int) +0:147 Constant: +0:147 2 (const int) +0:149 move second child to first child ( temp 4-component vector of double) +0:149 d: direct index for structure ( temp 4-component vector of double) +0:149 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:149 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:149 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:149 Constant: +0:149 0 (const uint) +0:149 direct index ( temp uint) +0:149 'dti' ( in 3-component vector of uint) +0:149 Constant: +0:149 0 (const int) +0:149 Constant: +0:149 3 (const int) +0:149 subgroupQuadSwapDiagonal ( temp 4-component vector of double) +0:149 d: direct index for structure ( temp 4-component vector of double) +0:149 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:149 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:149 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:149 Constant: +0:149 0 (const uint) +0:149 direct index ( temp uint) +0:149 'dti' ( in 3-component vector of uint) +0:149 Constant: +0:149 0 (const int) +0:149 Constant: +0:149 3 (const int) +0:150 move second child to first child ( temp double) +0:150 direct index ( temp double) +0:150 d: direct index for structure ( temp 4-component vector of double) +0:150 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:150 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:150 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:150 Constant: +0:150 0 (const uint) +0:150 direct index ( temp uint) +0:150 'dti' ( in 3-component vector of uint) +0:150 Constant: +0:150 0 (const int) +0:150 Constant: +0:150 3 (const int) +0:150 Constant: +0:150 0 (const int) +0:150 subgroupQuadSwapDiagonal ( temp double) +0:150 direct index ( temp double) +0:150 d: direct index for structure ( temp 4-component vector of double) +0:150 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:150 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:150 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:150 Constant: +0:150 0 (const uint) +0:150 direct index ( temp uint) +0:150 'dti' ( in 3-component vector of uint) +0:150 Constant: +0:150 0 (const int) +0:150 Constant: +0:150 3 (const int) +0:150 Constant: +0:150 0 (const int) +0:151 move second child to first child ( temp 2-component vector of double) +0:151 vector swizzle ( temp 2-component vector of double) +0:151 d: direct index for structure ( temp 4-component vector of double) +0:151 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:151 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:151 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:151 Constant: +0:151 0 (const uint) +0:151 direct index ( temp uint) +0:151 'dti' ( in 3-component vector of uint) +0:151 Constant: +0:151 0 (const int) +0:151 Constant: +0:151 3 (const int) +0:151 Sequence +0:151 Constant: +0:151 0 (const int) +0:151 Constant: +0:151 1 (const int) +0:151 subgroupQuadSwapDiagonal ( temp 2-component vector of double) +0:151 vector swizzle ( temp 2-component vector of double) +0:151 d: direct index for structure ( temp 4-component vector of double) +0:151 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:151 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:151 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:151 Constant: +0:151 0 (const uint) +0:151 direct index ( temp uint) +0:151 'dti' ( in 3-component vector of uint) +0:151 Constant: +0:151 0 (const int) +0:151 Constant: +0:151 3 (const int) +0:151 Sequence +0:151 Constant: +0:151 0 (const int) +0:151 Constant: +0:151 1 (const int) +0:152 move second child to first child ( temp 3-component vector of double) +0:152 vector swizzle ( temp 3-component vector of double) +0:152 d: direct index for structure ( temp 4-component vector of double) +0:152 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:152 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:152 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:152 Constant: +0:152 0 (const uint) +0:152 direct index ( temp uint) +0:152 'dti' ( in 3-component vector of uint) +0:152 Constant: +0:152 0 (const int) +0:152 Constant: +0:152 3 (const int) +0:152 Sequence +0:152 Constant: +0:152 0 (const int) +0:152 Constant: +0:152 1 (const int) +0:152 Constant: +0:152 2 (const int) +0:152 subgroupQuadSwapDiagonal ( temp 3-component vector of double) +0:152 vector swizzle ( temp 3-component vector of double) +0:152 d: direct index for structure ( temp 4-component vector of double) +0:152 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:152 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:152 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:152 Constant: +0:152 0 (const uint) +0:152 direct index ( temp uint) +0:152 'dti' ( in 3-component vector of uint) +0:152 Constant: +0:152 0 (const int) +0:152 Constant: +0:152 3 (const int) +0:152 Sequence +0:152 Constant: +0:152 0 (const int) +0:152 Constant: +0:152 1 (const int) +0:152 Constant: +0:152 2 (const int) +0:13 Function Definition: CSMain( ( temp void) +0:13 Function Parameters: +0:? Sequence +0:13 move second child to first child ( temp 3-component vector of uint) +0:? 'dti' ( temp 3-component vector of uint) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) +0:13 Function Call: @CSMain(vu3; ( temp void) +0:? 'dti' ( temp 3-component vector of uint) +0:? Linker Objects +0:? 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) + +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 1120 + + Capability Shader + Capability Float64 + Capability GroupNonUniform + Capability GroupNonUniformQuad + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "CSMain" 1115 + ExecutionMode 4 LocalSize 32 16 1 + Source HLSL 500 + Name 4 "CSMain" + Name 11 "@CSMain(vu3;" + Name 10 "dti" + Name 20 "Types" + MemberName 20(Types) 0 "u" + MemberName 20(Types) 1 "i" + MemberName 20(Types) 2 "f" + MemberName 20(Types) 3 "d" + Name 22 "data" + MemberName 22(data) 0 "@data" + Name 24 "data" + Name 1113 "dti" + Name 1115 "dti" + Name 1117 "param" + MemberDecorate 20(Types) 0 Offset 0 + MemberDecorate 20(Types) 1 Offset 16 + MemberDecorate 20(Types) 2 Offset 32 + MemberDecorate 20(Types) 3 Offset 64 + Decorate 21 ArrayStride 96 + MemberDecorate 22(data) 0 Offset 0 + Decorate 22(data) BufferBlock + Decorate 24(data) DescriptorSet 0 + Decorate 1115(dti) BuiltIn GlobalInvocationId + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypeVector 6(int) 3 + 8: TypePointer Function 7(ivec3) + 9: TypeFunction 2 8(ptr) + 13: TypeVector 6(int) 4 + 14: TypeInt 32 1 + 15: TypeVector 14(int) 4 + 16: TypeFloat 32 + 17: TypeVector 16(float) 4 + 18: TypeFloat 64 + 19: TypeVector 18(float) 4 + 20(Types): TypeStruct 13(ivec4) 15(ivec4) 17(fvec4) 19(fvec4) + 21: TypeRuntimeArray 20(Types) + 22(data): TypeStruct 21 + 23: TypePointer Uniform 22(data) + 24(data): 23(ptr) Variable Uniform + 25: 14(int) Constant 0 + 26: 6(int) Constant 0 + 27: TypePointer Function 6(int) + 32: TypePointer Uniform 13(ivec4) + 35: 6(int) Constant 3 + 42: TypePointer Uniform 6(int) + 51: TypeVector 6(int) 2 + 72: 14(int) Constant 1 + 75: TypePointer Uniform 15(ivec4) + 84: TypePointer Uniform 14(int) + 93: TypeVector 14(int) 2 + 105: TypeVector 14(int) 3 + 115: 14(int) Constant 2 + 118: TypePointer Uniform 17(fvec4) + 127: TypePointer Uniform 16(float) + 136: TypeVector 16(float) 2 + 148: TypeVector 16(float) 3 + 158: 14(int) Constant 3 + 161: TypePointer Uniform 19(fvec4) + 170: TypePointer Uniform 18(float) + 179: TypeVector 18(float) 2 + 191: TypeVector 18(float) 3 + 205: 6(int) Constant 1 + 358: 6(int) Constant 2 + 1114: TypePointer Input 7(ivec3) + 1115(dti): 1114(ptr) Variable Input + 4(CSMain): 2 Function None 3 + 5: Label + 1113(dti): 8(ptr) Variable Function + 1117(param): 8(ptr) Variable Function + 1116: 7(ivec3) Load 1115(dti) + Store 1113(dti) 1116 + 1118: 7(ivec3) Load 1113(dti) + Store 1117(param) 1118 + 1119: 2 FunctionCall 11(@CSMain(vu3;) 1117(param) + Return + FunctionEnd +11(@CSMain(vu3;): 2 Function None 9 + 10(dti): 8(ptr) FunctionParameter + 12: Label + 28: 27(ptr) AccessChain 10(dti) 26 + 29: 6(int) Load 28 + 30: 27(ptr) AccessChain 10(dti) 26 + 31: 6(int) Load 30 + 33: 32(ptr) AccessChain 24(data) 25 31 25 + 34: 13(ivec4) Load 33 + 36: 13(ivec4) GroupNonUniformQuadBroadcast 35 34 26 + 37: 32(ptr) AccessChain 24(data) 25 29 25 + Store 37 36 + 38: 27(ptr) AccessChain 10(dti) 26 + 39: 6(int) Load 38 + 40: 27(ptr) AccessChain 10(dti) 26 + 41: 6(int) Load 40 + 43: 42(ptr) AccessChain 24(data) 25 41 25 26 + 44: 6(int) Load 43 + 45: 6(int) GroupNonUniformQuadBroadcast 35 44 26 + 46: 42(ptr) AccessChain 24(data) 25 39 25 26 + Store 46 45 + 47: 27(ptr) AccessChain 10(dti) 26 + 48: 6(int) Load 47 + 49: 27(ptr) AccessChain 10(dti) 26 + 50: 6(int) Load 49 + 52: 32(ptr) AccessChain 24(data) 25 50 25 + 53: 13(ivec4) Load 52 + 54: 51(ivec2) VectorShuffle 53 53 0 1 + 55: 51(ivec2) GroupNonUniformQuadBroadcast 35 54 26 + 56: 32(ptr) AccessChain 24(data) 25 48 25 + 57: 13(ivec4) Load 56 + 58: 13(ivec4) VectorShuffle 57 55 4 5 2 3 + Store 56 58 + 59: 27(ptr) AccessChain 10(dti) 26 + 60: 6(int) Load 59 + 61: 27(ptr) AccessChain 10(dti) 26 + 62: 6(int) Load 61 + 63: 32(ptr) AccessChain 24(data) 25 62 25 + 64: 13(ivec4) Load 63 + 65: 7(ivec3) VectorShuffle 64 64 0 1 2 + 66: 7(ivec3) GroupNonUniformQuadBroadcast 35 65 26 + 67: 32(ptr) AccessChain 24(data) 25 60 25 + 68: 13(ivec4) Load 67 + 69: 13(ivec4) VectorShuffle 68 66 4 5 6 3 + Store 67 69 + 70: 27(ptr) AccessChain 10(dti) 26 + 71: 6(int) Load 70 + 73: 27(ptr) AccessChain 10(dti) 26 + 74: 6(int) Load 73 + 76: 75(ptr) AccessChain 24(data) 25 74 72 + 77: 15(ivec4) Load 76 + 78: 15(ivec4) GroupNonUniformQuadBroadcast 35 77 26 + 79: 75(ptr) AccessChain 24(data) 25 71 72 + Store 79 78 + 80: 27(ptr) AccessChain 10(dti) 26 + 81: 6(int) Load 80 + 82: 27(ptr) AccessChain 10(dti) 26 + 83: 6(int) Load 82 + 85: 84(ptr) AccessChain 24(data) 25 83 72 26 + 86: 14(int) Load 85 + 87: 14(int) GroupNonUniformQuadBroadcast 35 86 26 + 88: 84(ptr) AccessChain 24(data) 25 81 72 26 + Store 88 87 + 89: 27(ptr) AccessChain 10(dti) 26 + 90: 6(int) Load 89 + 91: 27(ptr) AccessChain 10(dti) 26 + 92: 6(int) Load 91 + 94: 75(ptr) AccessChain 24(data) 25 92 72 + 95: 15(ivec4) Load 94 + 96: 93(ivec2) VectorShuffle 95 95 0 1 + 97: 93(ivec2) GroupNonUniformQuadBroadcast 35 96 26 + 98: 75(ptr) AccessChain 24(data) 25 90 72 + 99: 15(ivec4) Load 98 + 100: 15(ivec4) VectorShuffle 99 97 4 5 2 3 + Store 98 100 + 101: 27(ptr) AccessChain 10(dti) 26 + 102: 6(int) Load 101 + 103: 27(ptr) AccessChain 10(dti) 26 + 104: 6(int) Load 103 + 106: 75(ptr) AccessChain 24(data) 25 104 72 + 107: 15(ivec4) Load 106 + 108: 105(ivec3) VectorShuffle 107 107 0 1 2 + 109: 105(ivec3) GroupNonUniformQuadBroadcast 35 108 26 + 110: 75(ptr) AccessChain 24(data) 25 102 72 + 111: 15(ivec4) Load 110 + 112: 15(ivec4) VectorShuffle 111 109 4 5 6 3 + Store 110 112 + 113: 27(ptr) AccessChain 10(dti) 26 + 114: 6(int) Load 113 + 116: 27(ptr) AccessChain 10(dti) 26 + 117: 6(int) Load 116 + 119: 118(ptr) AccessChain 24(data) 25 117 115 + 120: 17(fvec4) Load 119 + 121: 17(fvec4) GroupNonUniformQuadBroadcast 35 120 26 + 122: 118(ptr) AccessChain 24(data) 25 114 115 + Store 122 121 + 123: 27(ptr) AccessChain 10(dti) 26 + 124: 6(int) Load 123 + 125: 27(ptr) AccessChain 10(dti) 26 + 126: 6(int) Load 125 + 128: 127(ptr) AccessChain 24(data) 25 126 115 26 + 129: 16(float) Load 128 + 130: 16(float) GroupNonUniformQuadBroadcast 35 129 26 + 131: 127(ptr) AccessChain 24(data) 25 124 115 26 + Store 131 130 + 132: 27(ptr) AccessChain 10(dti) 26 + 133: 6(int) Load 132 + 134: 27(ptr) AccessChain 10(dti) 26 + 135: 6(int) Load 134 + 137: 118(ptr) AccessChain 24(data) 25 135 115 + 138: 17(fvec4) Load 137 + 139: 136(fvec2) VectorShuffle 138 138 0 1 + 140: 136(fvec2) GroupNonUniformQuadBroadcast 35 139 26 + 141: 118(ptr) AccessChain 24(data) 25 133 115 + 142: 17(fvec4) Load 141 + 143: 17(fvec4) VectorShuffle 142 140 4 5 2 3 + Store 141 143 + 144: 27(ptr) AccessChain 10(dti) 26 + 145: 6(int) Load 144 + 146: 27(ptr) AccessChain 10(dti) 26 + 147: 6(int) Load 146 + 149: 118(ptr) AccessChain 24(data) 25 147 115 + 150: 17(fvec4) Load 149 + 151: 148(fvec3) VectorShuffle 150 150 0 1 2 + 152: 148(fvec3) GroupNonUniformQuadBroadcast 35 151 26 + 153: 118(ptr) AccessChain 24(data) 25 145 115 + 154: 17(fvec4) Load 153 + 155: 17(fvec4) VectorShuffle 154 152 4 5 6 3 + Store 153 155 + 156: 27(ptr) AccessChain 10(dti) 26 + 157: 6(int) Load 156 + 159: 27(ptr) AccessChain 10(dti) 26 + 160: 6(int) Load 159 + 162: 161(ptr) AccessChain 24(data) 25 160 158 + 163: 19(fvec4) Load 162 + 164: 19(fvec4) GroupNonUniformQuadBroadcast 35 163 26 + 165: 161(ptr) AccessChain 24(data) 25 157 158 + Store 165 164 + 166: 27(ptr) AccessChain 10(dti) 26 + 167: 6(int) Load 166 + 168: 27(ptr) AccessChain 10(dti) 26 + 169: 6(int) Load 168 + 171: 170(ptr) AccessChain 24(data) 25 169 158 26 + 172: 18(float) Load 171 + 173: 18(float) GroupNonUniformQuadBroadcast 35 172 26 + 174: 170(ptr) AccessChain 24(data) 25 167 158 26 + Store 174 173 + 175: 27(ptr) AccessChain 10(dti) 26 + 176: 6(int) Load 175 + 177: 27(ptr) AccessChain 10(dti) 26 + 178: 6(int) Load 177 + 180: 161(ptr) AccessChain 24(data) 25 178 158 + 181: 19(fvec4) Load 180 + 182: 179(fvec2) VectorShuffle 181 181 0 1 + 183: 179(fvec2) GroupNonUniformQuadBroadcast 35 182 26 + 184: 161(ptr) AccessChain 24(data) 25 176 158 + 185: 19(fvec4) Load 184 + 186: 19(fvec4) VectorShuffle 185 183 4 5 2 3 + Store 184 186 + 187: 27(ptr) AccessChain 10(dti) 26 + 188: 6(int) Load 187 + 189: 27(ptr) AccessChain 10(dti) 26 + 190: 6(int) Load 189 + 192: 161(ptr) AccessChain 24(data) 25 190 158 + 193: 19(fvec4) Load 192 + 194: 191(fvec3) VectorShuffle 193 193 0 1 2 + 195: 191(fvec3) GroupNonUniformQuadBroadcast 35 194 26 + 196: 161(ptr) AccessChain 24(data) 25 188 158 + 197: 19(fvec4) Load 196 + 198: 19(fvec4) VectorShuffle 197 195 4 5 6 3 + Store 196 198 + 199: 27(ptr) AccessChain 10(dti) 26 + 200: 6(int) Load 199 + 201: 27(ptr) AccessChain 10(dti) 26 + 202: 6(int) Load 201 + 203: 32(ptr) AccessChain 24(data) 25 202 25 + 204: 13(ivec4) Load 203 + 206: 13(ivec4) GroupNonUniformQuadBroadcast 35 204 205 + 207: 32(ptr) AccessChain 24(data) 25 200 25 + Store 207 206 + 208: 27(ptr) AccessChain 10(dti) 26 + 209: 6(int) Load 208 + 210: 27(ptr) AccessChain 10(dti) 26 + 211: 6(int) Load 210 + 212: 42(ptr) AccessChain 24(data) 25 211 25 26 + 213: 6(int) Load 212 + 214: 6(int) GroupNonUniformQuadBroadcast 35 213 205 + 215: 42(ptr) AccessChain 24(data) 25 209 25 26 + Store 215 214 + 216: 27(ptr) AccessChain 10(dti) 26 + 217: 6(int) Load 216 + 218: 27(ptr) AccessChain 10(dti) 26 + 219: 6(int) Load 218 + 220: 32(ptr) AccessChain 24(data) 25 219 25 + 221: 13(ivec4) Load 220 + 222: 51(ivec2) VectorShuffle 221 221 0 1 + 223: 51(ivec2) GroupNonUniformQuadBroadcast 35 222 205 + 224: 32(ptr) AccessChain 24(data) 25 217 25 + 225: 13(ivec4) Load 224 + 226: 13(ivec4) VectorShuffle 225 223 4 5 2 3 + Store 224 226 + 227: 27(ptr) AccessChain 10(dti) 26 + 228: 6(int) Load 227 + 229: 27(ptr) AccessChain 10(dti) 26 + 230: 6(int) Load 229 + 231: 32(ptr) AccessChain 24(data) 25 230 25 + 232: 13(ivec4) Load 231 + 233: 7(ivec3) VectorShuffle 232 232 0 1 2 + 234: 7(ivec3) GroupNonUniformQuadBroadcast 35 233 205 + 235: 32(ptr) AccessChain 24(data) 25 228 25 + 236: 13(ivec4) Load 235 + 237: 13(ivec4) VectorShuffle 236 234 4 5 6 3 + Store 235 237 + 238: 27(ptr) AccessChain 10(dti) 26 + 239: 6(int) Load 238 + 240: 27(ptr) AccessChain 10(dti) 26 + 241: 6(int) Load 240 + 242: 75(ptr) AccessChain 24(data) 25 241 72 + 243: 15(ivec4) Load 242 + 244: 15(ivec4) GroupNonUniformQuadBroadcast 35 243 205 + 245: 75(ptr) AccessChain 24(data) 25 239 72 + Store 245 244 + 246: 27(ptr) AccessChain 10(dti) 26 + 247: 6(int) Load 246 + 248: 27(ptr) AccessChain 10(dti) 26 + 249: 6(int) Load 248 + 250: 84(ptr) AccessChain 24(data) 25 249 72 26 + 251: 14(int) Load 250 + 252: 14(int) GroupNonUniformQuadBroadcast 35 251 205 + 253: 84(ptr) AccessChain 24(data) 25 247 72 26 + Store 253 252 + 254: 27(ptr) AccessChain 10(dti) 26 + 255: 6(int) Load 254 + 256: 27(ptr) AccessChain 10(dti) 26 + 257: 6(int) Load 256 + 258: 75(ptr) AccessChain 24(data) 25 257 72 + 259: 15(ivec4) Load 258 + 260: 93(ivec2) VectorShuffle 259 259 0 1 + 261: 93(ivec2) GroupNonUniformQuadBroadcast 35 260 205 + 262: 75(ptr) AccessChain 24(data) 25 255 72 + 263: 15(ivec4) Load 262 + 264: 15(ivec4) VectorShuffle 263 261 4 5 2 3 + Store 262 264 + 265: 27(ptr) AccessChain 10(dti) 26 + 266: 6(int) Load 265 + 267: 27(ptr) AccessChain 10(dti) 26 + 268: 6(int) Load 267 + 269: 75(ptr) AccessChain 24(data) 25 268 72 + 270: 15(ivec4) Load 269 + 271: 105(ivec3) VectorShuffle 270 270 0 1 2 + 272: 105(ivec3) GroupNonUniformQuadBroadcast 35 271 205 + 273: 75(ptr) AccessChain 24(data) 25 266 72 + 274: 15(ivec4) Load 273 + 275: 15(ivec4) VectorShuffle 274 272 4 5 6 3 + Store 273 275 + 276: 27(ptr) AccessChain 10(dti) 26 + 277: 6(int) Load 276 + 278: 27(ptr) AccessChain 10(dti) 26 + 279: 6(int) Load 278 + 280: 118(ptr) AccessChain 24(data) 25 279 115 + 281: 17(fvec4) Load 280 + 282: 17(fvec4) GroupNonUniformQuadBroadcast 35 281 205 + 283: 118(ptr) AccessChain 24(data) 25 277 115 + Store 283 282 + 284: 27(ptr) AccessChain 10(dti) 26 + 285: 6(int) Load 284 + 286: 27(ptr) AccessChain 10(dti) 26 + 287: 6(int) Load 286 + 288: 127(ptr) AccessChain 24(data) 25 287 115 26 + 289: 16(float) Load 288 + 290: 16(float) GroupNonUniformQuadBroadcast 35 289 205 + 291: 127(ptr) AccessChain 24(data) 25 285 115 26 + Store 291 290 + 292: 27(ptr) AccessChain 10(dti) 26 + 293: 6(int) Load 292 + 294: 27(ptr) AccessChain 10(dti) 26 + 295: 6(int) Load 294 + 296: 118(ptr) AccessChain 24(data) 25 295 115 + 297: 17(fvec4) Load 296 + 298: 136(fvec2) VectorShuffle 297 297 0 1 + 299: 136(fvec2) GroupNonUniformQuadBroadcast 35 298 205 + 300: 118(ptr) AccessChain 24(data) 25 293 115 + 301: 17(fvec4) Load 300 + 302: 17(fvec4) VectorShuffle 301 299 4 5 2 3 + Store 300 302 + 303: 27(ptr) AccessChain 10(dti) 26 + 304: 6(int) Load 303 + 305: 27(ptr) AccessChain 10(dti) 26 + 306: 6(int) Load 305 + 307: 118(ptr) AccessChain 24(data) 25 306 115 + 308: 17(fvec4) Load 307 + 309: 148(fvec3) VectorShuffle 308 308 0 1 2 + 310: 148(fvec3) GroupNonUniformQuadBroadcast 35 309 205 + 311: 118(ptr) AccessChain 24(data) 25 304 115 + 312: 17(fvec4) Load 311 + 313: 17(fvec4) VectorShuffle 312 310 4 5 6 3 + Store 311 313 + 314: 27(ptr) AccessChain 10(dti) 26 + 315: 6(int) Load 314 + 316: 27(ptr) AccessChain 10(dti) 26 + 317: 6(int) Load 316 + 318: 161(ptr) AccessChain 24(data) 25 317 158 + 319: 19(fvec4) Load 318 + 320: 19(fvec4) GroupNonUniformQuadBroadcast 35 319 205 + 321: 161(ptr) AccessChain 24(data) 25 315 158 + Store 321 320 + 322: 27(ptr) AccessChain 10(dti) 26 + 323: 6(int) Load 322 + 324: 27(ptr) AccessChain 10(dti) 26 + 325: 6(int) Load 324 + 326: 170(ptr) AccessChain 24(data) 25 325 158 26 + 327: 18(float) Load 326 + 328: 18(float) GroupNonUniformQuadBroadcast 35 327 205 + 329: 170(ptr) AccessChain 24(data) 25 323 158 26 + Store 329 328 + 330: 27(ptr) AccessChain 10(dti) 26 + 331: 6(int) Load 330 + 332: 27(ptr) AccessChain 10(dti) 26 + 333: 6(int) Load 332 + 334: 161(ptr) AccessChain 24(data) 25 333 158 + 335: 19(fvec4) Load 334 + 336: 179(fvec2) VectorShuffle 335 335 0 1 + 337: 179(fvec2) GroupNonUniformQuadBroadcast 35 336 205 + 338: 161(ptr) AccessChain 24(data) 25 331 158 + 339: 19(fvec4) Load 338 + 340: 19(fvec4) VectorShuffle 339 337 4 5 2 3 + Store 338 340 + 341: 27(ptr) AccessChain 10(dti) 26 + 342: 6(int) Load 341 + 343: 27(ptr) AccessChain 10(dti) 26 + 344: 6(int) Load 343 + 345: 161(ptr) AccessChain 24(data) 25 344 158 + 346: 19(fvec4) Load 345 + 347: 191(fvec3) VectorShuffle 346 346 0 1 2 + 348: 191(fvec3) GroupNonUniformQuadBroadcast 35 347 205 + 349: 161(ptr) AccessChain 24(data) 25 342 158 + 350: 19(fvec4) Load 349 + 351: 19(fvec4) VectorShuffle 350 348 4 5 6 3 + Store 349 351 + 352: 27(ptr) AccessChain 10(dti) 26 + 353: 6(int) Load 352 + 354: 27(ptr) AccessChain 10(dti) 26 + 355: 6(int) Load 354 + 356: 32(ptr) AccessChain 24(data) 25 355 25 + 357: 13(ivec4) Load 356 + 359: 13(ivec4) GroupNonUniformQuadBroadcast 35 357 358 + 360: 32(ptr) AccessChain 24(data) 25 353 25 + Store 360 359 + 361: 27(ptr) AccessChain 10(dti) 26 + 362: 6(int) Load 361 + 363: 27(ptr) AccessChain 10(dti) 26 + 364: 6(int) Load 363 + 365: 42(ptr) AccessChain 24(data) 25 364 25 26 + 366: 6(int) Load 365 + 367: 6(int) GroupNonUniformQuadBroadcast 35 366 358 + 368: 42(ptr) AccessChain 24(data) 25 362 25 26 + Store 368 367 + 369: 27(ptr) AccessChain 10(dti) 26 + 370: 6(int) Load 369 + 371: 27(ptr) AccessChain 10(dti) 26 + 372: 6(int) Load 371 + 373: 32(ptr) AccessChain 24(data) 25 372 25 + 374: 13(ivec4) Load 373 + 375: 51(ivec2) VectorShuffle 374 374 0 1 + 376: 51(ivec2) GroupNonUniformQuadBroadcast 35 375 358 + 377: 32(ptr) AccessChain 24(data) 25 370 25 + 378: 13(ivec4) Load 377 + 379: 13(ivec4) VectorShuffle 378 376 4 5 2 3 + Store 377 379 + 380: 27(ptr) AccessChain 10(dti) 26 + 381: 6(int) Load 380 + 382: 27(ptr) AccessChain 10(dti) 26 + 383: 6(int) Load 382 + 384: 32(ptr) AccessChain 24(data) 25 383 25 + 385: 13(ivec4) Load 384 + 386: 7(ivec3) VectorShuffle 385 385 0 1 2 + 387: 7(ivec3) GroupNonUniformQuadBroadcast 35 386 358 + 388: 32(ptr) AccessChain 24(data) 25 381 25 + 389: 13(ivec4) Load 388 + 390: 13(ivec4) VectorShuffle 389 387 4 5 6 3 + Store 388 390 + 391: 27(ptr) AccessChain 10(dti) 26 + 392: 6(int) Load 391 + 393: 27(ptr) AccessChain 10(dti) 26 + 394: 6(int) Load 393 + 395: 75(ptr) AccessChain 24(data) 25 394 72 + 396: 15(ivec4) Load 395 + 397: 15(ivec4) GroupNonUniformQuadBroadcast 35 396 358 + 398: 75(ptr) AccessChain 24(data) 25 392 72 + Store 398 397 + 399: 27(ptr) AccessChain 10(dti) 26 + 400: 6(int) Load 399 + 401: 27(ptr) AccessChain 10(dti) 26 + 402: 6(int) Load 401 + 403: 84(ptr) AccessChain 24(data) 25 402 72 26 + 404: 14(int) Load 403 + 405: 14(int) GroupNonUniformQuadBroadcast 35 404 358 + 406: 84(ptr) AccessChain 24(data) 25 400 72 26 + Store 406 405 + 407: 27(ptr) AccessChain 10(dti) 26 + 408: 6(int) Load 407 + 409: 27(ptr) AccessChain 10(dti) 26 + 410: 6(int) Load 409 + 411: 75(ptr) AccessChain 24(data) 25 410 72 + 412: 15(ivec4) Load 411 + 413: 93(ivec2) VectorShuffle 412 412 0 1 + 414: 93(ivec2) GroupNonUniformQuadBroadcast 35 413 358 + 415: 75(ptr) AccessChain 24(data) 25 408 72 + 416: 15(ivec4) Load 415 + 417: 15(ivec4) VectorShuffle 416 414 4 5 2 3 + Store 415 417 + 418: 27(ptr) AccessChain 10(dti) 26 + 419: 6(int) Load 418 + 420: 27(ptr) AccessChain 10(dti) 26 + 421: 6(int) Load 420 + 422: 75(ptr) AccessChain 24(data) 25 421 72 + 423: 15(ivec4) Load 422 + 424: 105(ivec3) VectorShuffle 423 423 0 1 2 + 425: 105(ivec3) GroupNonUniformQuadBroadcast 35 424 358 + 426: 75(ptr) AccessChain 24(data) 25 419 72 + 427: 15(ivec4) Load 426 + 428: 15(ivec4) VectorShuffle 427 425 4 5 6 3 + Store 426 428 + 429: 27(ptr) AccessChain 10(dti) 26 + 430: 6(int) Load 429 + 431: 27(ptr) AccessChain 10(dti) 26 + 432: 6(int) Load 431 + 433: 118(ptr) AccessChain 24(data) 25 432 115 + 434: 17(fvec4) Load 433 + 435: 17(fvec4) GroupNonUniformQuadBroadcast 35 434 358 + 436: 118(ptr) AccessChain 24(data) 25 430 115 + Store 436 435 + 437: 27(ptr) AccessChain 10(dti) 26 + 438: 6(int) Load 437 + 439: 27(ptr) AccessChain 10(dti) 26 + 440: 6(int) Load 439 + 441: 127(ptr) AccessChain 24(data) 25 440 115 26 + 442: 16(float) Load 441 + 443: 16(float) GroupNonUniformQuadBroadcast 35 442 358 + 444: 127(ptr) AccessChain 24(data) 25 438 115 26 + Store 444 443 + 445: 27(ptr) AccessChain 10(dti) 26 + 446: 6(int) Load 445 + 447: 27(ptr) AccessChain 10(dti) 26 + 448: 6(int) Load 447 + 449: 118(ptr) AccessChain 24(data) 25 448 115 + 450: 17(fvec4) Load 449 + 451: 136(fvec2) VectorShuffle 450 450 0 1 + 452: 136(fvec2) GroupNonUniformQuadBroadcast 35 451 358 + 453: 118(ptr) AccessChain 24(data) 25 446 115 + 454: 17(fvec4) Load 453 + 455: 17(fvec4) VectorShuffle 454 452 4 5 2 3 + Store 453 455 + 456: 27(ptr) AccessChain 10(dti) 26 + 457: 6(int) Load 456 + 458: 27(ptr) AccessChain 10(dti) 26 + 459: 6(int) Load 458 + 460: 118(ptr) AccessChain 24(data) 25 459 115 + 461: 17(fvec4) Load 460 + 462: 148(fvec3) VectorShuffle 461 461 0 1 2 + 463: 148(fvec3) GroupNonUniformQuadBroadcast 35 462 358 + 464: 118(ptr) AccessChain 24(data) 25 457 115 + 465: 17(fvec4) Load 464 + 466: 17(fvec4) VectorShuffle 465 463 4 5 6 3 + Store 464 466 + 467: 27(ptr) AccessChain 10(dti) 26 + 468: 6(int) Load 467 + 469: 27(ptr) AccessChain 10(dti) 26 + 470: 6(int) Load 469 + 471: 161(ptr) AccessChain 24(data) 25 470 158 + 472: 19(fvec4) Load 471 + 473: 19(fvec4) GroupNonUniformQuadBroadcast 35 472 358 + 474: 161(ptr) AccessChain 24(data) 25 468 158 + Store 474 473 + 475: 27(ptr) AccessChain 10(dti) 26 + 476: 6(int) Load 475 + 477: 27(ptr) AccessChain 10(dti) 26 + 478: 6(int) Load 477 + 479: 170(ptr) AccessChain 24(data) 25 478 158 26 + 480: 18(float) Load 479 + 481: 18(float) GroupNonUniformQuadBroadcast 35 480 358 + 482: 170(ptr) AccessChain 24(data) 25 476 158 26 + Store 482 481 + 483: 27(ptr) AccessChain 10(dti) 26 + 484: 6(int) Load 483 + 485: 27(ptr) AccessChain 10(dti) 26 + 486: 6(int) Load 485 + 487: 161(ptr) AccessChain 24(data) 25 486 158 + 488: 19(fvec4) Load 487 + 489: 179(fvec2) VectorShuffle 488 488 0 1 + 490: 179(fvec2) GroupNonUniformQuadBroadcast 35 489 358 + 491: 161(ptr) AccessChain 24(data) 25 484 158 + 492: 19(fvec4) Load 491 + 493: 19(fvec4) VectorShuffle 492 490 4 5 2 3 + Store 491 493 + 494: 27(ptr) AccessChain 10(dti) 26 + 495: 6(int) Load 494 + 496: 27(ptr) AccessChain 10(dti) 26 + 497: 6(int) Load 496 + 498: 161(ptr) AccessChain 24(data) 25 497 158 + 499: 19(fvec4) Load 498 + 500: 191(fvec3) VectorShuffle 499 499 0 1 2 + 501: 191(fvec3) GroupNonUniformQuadBroadcast 35 500 358 + 502: 161(ptr) AccessChain 24(data) 25 495 158 + 503: 19(fvec4) Load 502 + 504: 19(fvec4) VectorShuffle 503 501 4 5 6 3 + Store 502 504 + 505: 27(ptr) AccessChain 10(dti) 26 + 506: 6(int) Load 505 + 507: 27(ptr) AccessChain 10(dti) 26 + 508: 6(int) Load 507 + 509: 32(ptr) AccessChain 24(data) 25 508 25 + 510: 13(ivec4) Load 509 + 511: 13(ivec4) GroupNonUniformQuadBroadcast 35 510 35 + 512: 32(ptr) AccessChain 24(data) 25 506 25 + Store 512 511 + 513: 27(ptr) AccessChain 10(dti) 26 + 514: 6(int) Load 513 + 515: 27(ptr) AccessChain 10(dti) 26 + 516: 6(int) Load 515 + 517: 42(ptr) AccessChain 24(data) 25 516 25 26 + 518: 6(int) Load 517 + 519: 6(int) GroupNonUniformQuadBroadcast 35 518 35 + 520: 42(ptr) AccessChain 24(data) 25 514 25 26 + Store 520 519 + 521: 27(ptr) AccessChain 10(dti) 26 + 522: 6(int) Load 521 + 523: 27(ptr) AccessChain 10(dti) 26 + 524: 6(int) Load 523 + 525: 32(ptr) AccessChain 24(data) 25 524 25 + 526: 13(ivec4) Load 525 + 527: 51(ivec2) VectorShuffle 526 526 0 1 + 528: 51(ivec2) GroupNonUniformQuadBroadcast 35 527 35 + 529: 32(ptr) AccessChain 24(data) 25 522 25 + 530: 13(ivec4) Load 529 + 531: 13(ivec4) VectorShuffle 530 528 4 5 2 3 + Store 529 531 + 532: 27(ptr) AccessChain 10(dti) 26 + 533: 6(int) Load 532 + 534: 27(ptr) AccessChain 10(dti) 26 + 535: 6(int) Load 534 + 536: 32(ptr) AccessChain 24(data) 25 535 25 + 537: 13(ivec4) Load 536 + 538: 7(ivec3) VectorShuffle 537 537 0 1 2 + 539: 7(ivec3) GroupNonUniformQuadBroadcast 35 538 35 + 540: 32(ptr) AccessChain 24(data) 25 533 25 + 541: 13(ivec4) Load 540 + 542: 13(ivec4) VectorShuffle 541 539 4 5 6 3 + Store 540 542 + 543: 27(ptr) AccessChain 10(dti) 26 + 544: 6(int) Load 543 + 545: 27(ptr) AccessChain 10(dti) 26 + 546: 6(int) Load 545 + 547: 75(ptr) AccessChain 24(data) 25 546 72 + 548: 15(ivec4) Load 547 + 549: 15(ivec4) GroupNonUniformQuadBroadcast 35 548 35 + 550: 75(ptr) AccessChain 24(data) 25 544 72 + Store 550 549 + 551: 27(ptr) AccessChain 10(dti) 26 + 552: 6(int) Load 551 + 553: 27(ptr) AccessChain 10(dti) 26 + 554: 6(int) Load 553 + 555: 84(ptr) AccessChain 24(data) 25 554 72 26 + 556: 14(int) Load 555 + 557: 14(int) GroupNonUniformQuadBroadcast 35 556 35 + 558: 84(ptr) AccessChain 24(data) 25 552 72 26 + Store 558 557 + 559: 27(ptr) AccessChain 10(dti) 26 + 560: 6(int) Load 559 + 561: 27(ptr) AccessChain 10(dti) 26 + 562: 6(int) Load 561 + 563: 75(ptr) AccessChain 24(data) 25 562 72 + 564: 15(ivec4) Load 563 + 565: 93(ivec2) VectorShuffle 564 564 0 1 + 566: 93(ivec2) GroupNonUniformQuadBroadcast 35 565 35 + 567: 75(ptr) AccessChain 24(data) 25 560 72 + 568: 15(ivec4) Load 567 + 569: 15(ivec4) VectorShuffle 568 566 4 5 2 3 + Store 567 569 + 570: 27(ptr) AccessChain 10(dti) 26 + 571: 6(int) Load 570 + 572: 27(ptr) AccessChain 10(dti) 26 + 573: 6(int) Load 572 + 574: 75(ptr) AccessChain 24(data) 25 573 72 + 575: 15(ivec4) Load 574 + 576: 105(ivec3) VectorShuffle 575 575 0 1 2 + 577: 105(ivec3) GroupNonUniformQuadBroadcast 35 576 35 + 578: 75(ptr) AccessChain 24(data) 25 571 72 + 579: 15(ivec4) Load 578 + 580: 15(ivec4) VectorShuffle 579 577 4 5 6 3 + Store 578 580 + 581: 27(ptr) AccessChain 10(dti) 26 + 582: 6(int) Load 581 + 583: 27(ptr) AccessChain 10(dti) 26 + 584: 6(int) Load 583 + 585: 118(ptr) AccessChain 24(data) 25 584 115 + 586: 17(fvec4) Load 585 + 587: 17(fvec4) GroupNonUniformQuadBroadcast 35 586 35 + 588: 118(ptr) AccessChain 24(data) 25 582 115 + Store 588 587 + 589: 27(ptr) AccessChain 10(dti) 26 + 590: 6(int) Load 589 + 591: 27(ptr) AccessChain 10(dti) 26 + 592: 6(int) Load 591 + 593: 127(ptr) AccessChain 24(data) 25 592 115 26 + 594: 16(float) Load 593 + 595: 16(float) GroupNonUniformQuadBroadcast 35 594 35 + 596: 127(ptr) AccessChain 24(data) 25 590 115 26 + Store 596 595 + 597: 27(ptr) AccessChain 10(dti) 26 + 598: 6(int) Load 597 + 599: 27(ptr) AccessChain 10(dti) 26 + 600: 6(int) Load 599 + 601: 118(ptr) AccessChain 24(data) 25 600 115 + 602: 17(fvec4) Load 601 + 603: 136(fvec2) VectorShuffle 602 602 0 1 + 604: 136(fvec2) GroupNonUniformQuadBroadcast 35 603 35 + 605: 118(ptr) AccessChain 24(data) 25 598 115 + 606: 17(fvec4) Load 605 + 607: 17(fvec4) VectorShuffle 606 604 4 5 2 3 + Store 605 607 + 608: 27(ptr) AccessChain 10(dti) 26 + 609: 6(int) Load 608 + 610: 27(ptr) AccessChain 10(dti) 26 + 611: 6(int) Load 610 + 612: 118(ptr) AccessChain 24(data) 25 611 115 + 613: 17(fvec4) Load 612 + 614: 148(fvec3) VectorShuffle 613 613 0 1 2 + 615: 148(fvec3) GroupNonUniformQuadBroadcast 35 614 35 + 616: 118(ptr) AccessChain 24(data) 25 609 115 + 617: 17(fvec4) Load 616 + 618: 17(fvec4) VectorShuffle 617 615 4 5 6 3 + Store 616 618 + 619: 27(ptr) AccessChain 10(dti) 26 + 620: 6(int) Load 619 + 621: 27(ptr) AccessChain 10(dti) 26 + 622: 6(int) Load 621 + 623: 161(ptr) AccessChain 24(data) 25 622 158 + 624: 19(fvec4) Load 623 + 625: 19(fvec4) GroupNonUniformQuadBroadcast 35 624 35 + 626: 161(ptr) AccessChain 24(data) 25 620 158 + Store 626 625 + 627: 27(ptr) AccessChain 10(dti) 26 + 628: 6(int) Load 627 + 629: 27(ptr) AccessChain 10(dti) 26 + 630: 6(int) Load 629 + 631: 170(ptr) AccessChain 24(data) 25 630 158 26 + 632: 18(float) Load 631 + 633: 18(float) GroupNonUniformQuadBroadcast 35 632 35 + 634: 170(ptr) AccessChain 24(data) 25 628 158 26 + Store 634 633 + 635: 27(ptr) AccessChain 10(dti) 26 + 636: 6(int) Load 635 + 637: 27(ptr) AccessChain 10(dti) 26 + 638: 6(int) Load 637 + 639: 161(ptr) AccessChain 24(data) 25 638 158 + 640: 19(fvec4) Load 639 + 641: 179(fvec2) VectorShuffle 640 640 0 1 + 642: 179(fvec2) GroupNonUniformQuadBroadcast 35 641 35 + 643: 161(ptr) AccessChain 24(data) 25 636 158 + 644: 19(fvec4) Load 643 + 645: 19(fvec4) VectorShuffle 644 642 4 5 2 3 + Store 643 645 + 646: 27(ptr) AccessChain 10(dti) 26 + 647: 6(int) Load 646 + 648: 27(ptr) AccessChain 10(dti) 26 + 649: 6(int) Load 648 + 650: 161(ptr) AccessChain 24(data) 25 649 158 + 651: 19(fvec4) Load 650 + 652: 191(fvec3) VectorShuffle 651 651 0 1 2 + 653: 191(fvec3) GroupNonUniformQuadBroadcast 35 652 35 + 654: 161(ptr) AccessChain 24(data) 25 647 158 + 655: 19(fvec4) Load 654 + 656: 19(fvec4) VectorShuffle 655 653 4 5 6 3 + Store 654 656 + 657: 27(ptr) AccessChain 10(dti) 26 + 658: 6(int) Load 657 + 659: 27(ptr) AccessChain 10(dti) 26 + 660: 6(int) Load 659 + 661: 32(ptr) AccessChain 24(data) 25 660 25 + 662: 13(ivec4) Load 661 + 663: 13(ivec4) GroupNonUniformQuadSwap 35 662 26 + 664: 32(ptr) AccessChain 24(data) 25 658 25 + Store 664 663 + 665: 27(ptr) AccessChain 10(dti) 26 + 666: 6(int) Load 665 + 667: 27(ptr) AccessChain 10(dti) 26 + 668: 6(int) Load 667 + 669: 42(ptr) AccessChain 24(data) 25 668 25 26 + 670: 6(int) Load 669 + 671: 6(int) GroupNonUniformQuadSwap 35 670 26 + 672: 42(ptr) AccessChain 24(data) 25 666 25 26 + Store 672 671 + 673: 27(ptr) AccessChain 10(dti) 26 + 674: 6(int) Load 673 + 675: 27(ptr) AccessChain 10(dti) 26 + 676: 6(int) Load 675 + 677: 32(ptr) AccessChain 24(data) 25 676 25 + 678: 13(ivec4) Load 677 + 679: 51(ivec2) VectorShuffle 678 678 0 1 + 680: 51(ivec2) GroupNonUniformQuadSwap 35 679 26 + 681: 32(ptr) AccessChain 24(data) 25 674 25 + 682: 13(ivec4) Load 681 + 683: 13(ivec4) VectorShuffle 682 680 4 5 2 3 + Store 681 683 + 684: 27(ptr) AccessChain 10(dti) 26 + 685: 6(int) Load 684 + 686: 27(ptr) AccessChain 10(dti) 26 + 687: 6(int) Load 686 + 688: 32(ptr) AccessChain 24(data) 25 687 25 + 689: 13(ivec4) Load 688 + 690: 7(ivec3) VectorShuffle 689 689 0 1 2 + 691: 7(ivec3) GroupNonUniformQuadSwap 35 690 26 + 692: 32(ptr) AccessChain 24(data) 25 685 25 + 693: 13(ivec4) Load 692 + 694: 13(ivec4) VectorShuffle 693 691 4 5 6 3 + Store 692 694 + 695: 27(ptr) AccessChain 10(dti) 26 + 696: 6(int) Load 695 + 697: 27(ptr) AccessChain 10(dti) 26 + 698: 6(int) Load 697 + 699: 75(ptr) AccessChain 24(data) 25 698 72 + 700: 15(ivec4) Load 699 + 701: 15(ivec4) GroupNonUniformQuadSwap 35 700 26 + 702: 75(ptr) AccessChain 24(data) 25 696 72 + Store 702 701 + 703: 27(ptr) AccessChain 10(dti) 26 + 704: 6(int) Load 703 + 705: 27(ptr) AccessChain 10(dti) 26 + 706: 6(int) Load 705 + 707: 84(ptr) AccessChain 24(data) 25 706 72 26 + 708: 14(int) Load 707 + 709: 14(int) GroupNonUniformQuadSwap 35 708 26 + 710: 84(ptr) AccessChain 24(data) 25 704 72 26 + Store 710 709 + 711: 27(ptr) AccessChain 10(dti) 26 + 712: 6(int) Load 711 + 713: 27(ptr) AccessChain 10(dti) 26 + 714: 6(int) Load 713 + 715: 75(ptr) AccessChain 24(data) 25 714 72 + 716: 15(ivec4) Load 715 + 717: 93(ivec2) VectorShuffle 716 716 0 1 + 718: 93(ivec2) GroupNonUniformQuadSwap 35 717 26 + 719: 75(ptr) AccessChain 24(data) 25 712 72 + 720: 15(ivec4) Load 719 + 721: 15(ivec4) VectorShuffle 720 718 4 5 2 3 + Store 719 721 + 722: 27(ptr) AccessChain 10(dti) 26 + 723: 6(int) Load 722 + 724: 27(ptr) AccessChain 10(dti) 26 + 725: 6(int) Load 724 + 726: 75(ptr) AccessChain 24(data) 25 725 72 + 727: 15(ivec4) Load 726 + 728: 105(ivec3) VectorShuffle 727 727 0 1 2 + 729: 105(ivec3) GroupNonUniformQuadSwap 35 728 26 + 730: 75(ptr) AccessChain 24(data) 25 723 72 + 731: 15(ivec4) Load 730 + 732: 15(ivec4) VectorShuffle 731 729 4 5 6 3 + Store 730 732 + 733: 27(ptr) AccessChain 10(dti) 26 + 734: 6(int) Load 733 + 735: 27(ptr) AccessChain 10(dti) 26 + 736: 6(int) Load 735 + 737: 118(ptr) AccessChain 24(data) 25 736 115 + 738: 17(fvec4) Load 737 + 739: 17(fvec4) GroupNonUniformQuadSwap 35 738 26 + 740: 118(ptr) AccessChain 24(data) 25 734 115 + Store 740 739 + 741: 27(ptr) AccessChain 10(dti) 26 + 742: 6(int) Load 741 + 743: 27(ptr) AccessChain 10(dti) 26 + 744: 6(int) Load 743 + 745: 127(ptr) AccessChain 24(data) 25 744 115 26 + 746: 16(float) Load 745 + 747: 16(float) GroupNonUniformQuadSwap 35 746 26 + 748: 127(ptr) AccessChain 24(data) 25 742 115 26 + Store 748 747 + 749: 27(ptr) AccessChain 10(dti) 26 + 750: 6(int) Load 749 + 751: 27(ptr) AccessChain 10(dti) 26 + 752: 6(int) Load 751 + 753: 118(ptr) AccessChain 24(data) 25 752 115 + 754: 17(fvec4) Load 753 + 755: 136(fvec2) VectorShuffle 754 754 0 1 + 756: 136(fvec2) GroupNonUniformQuadSwap 35 755 26 + 757: 118(ptr) AccessChain 24(data) 25 750 115 + 758: 17(fvec4) Load 757 + 759: 17(fvec4) VectorShuffle 758 756 4 5 2 3 + Store 757 759 + 760: 27(ptr) AccessChain 10(dti) 26 + 761: 6(int) Load 760 + 762: 27(ptr) AccessChain 10(dti) 26 + 763: 6(int) Load 762 + 764: 118(ptr) AccessChain 24(data) 25 763 115 + 765: 17(fvec4) Load 764 + 766: 148(fvec3) VectorShuffle 765 765 0 1 2 + 767: 148(fvec3) GroupNonUniformQuadSwap 35 766 26 + 768: 118(ptr) AccessChain 24(data) 25 761 115 + 769: 17(fvec4) Load 768 + 770: 17(fvec4) VectorShuffle 769 767 4 5 6 3 + Store 768 770 + 771: 27(ptr) AccessChain 10(dti) 26 + 772: 6(int) Load 771 + 773: 27(ptr) AccessChain 10(dti) 26 + 774: 6(int) Load 773 + 775: 161(ptr) AccessChain 24(data) 25 774 158 + 776: 19(fvec4) Load 775 + 777: 19(fvec4) GroupNonUniformQuadSwap 35 776 26 + 778: 161(ptr) AccessChain 24(data) 25 772 158 + Store 778 777 + 779: 27(ptr) AccessChain 10(dti) 26 + 780: 6(int) Load 779 + 781: 27(ptr) AccessChain 10(dti) 26 + 782: 6(int) Load 781 + 783: 170(ptr) AccessChain 24(data) 25 782 158 26 + 784: 18(float) Load 783 + 785: 18(float) GroupNonUniformQuadSwap 35 784 26 + 786: 170(ptr) AccessChain 24(data) 25 780 158 26 + Store 786 785 + 787: 27(ptr) AccessChain 10(dti) 26 + 788: 6(int) Load 787 + 789: 27(ptr) AccessChain 10(dti) 26 + 790: 6(int) Load 789 + 791: 161(ptr) AccessChain 24(data) 25 790 158 + 792: 19(fvec4) Load 791 + 793: 179(fvec2) VectorShuffle 792 792 0 1 + 794: 179(fvec2) GroupNonUniformQuadSwap 35 793 26 + 795: 161(ptr) AccessChain 24(data) 25 788 158 + 796: 19(fvec4) Load 795 + 797: 19(fvec4) VectorShuffle 796 794 4 5 2 3 + Store 795 797 + 798: 27(ptr) AccessChain 10(dti) 26 + 799: 6(int) Load 798 + 800: 27(ptr) AccessChain 10(dti) 26 + 801: 6(int) Load 800 + 802: 161(ptr) AccessChain 24(data) 25 801 158 + 803: 19(fvec4) Load 802 + 804: 191(fvec3) VectorShuffle 803 803 0 1 2 + 805: 191(fvec3) GroupNonUniformQuadSwap 35 804 26 + 806: 161(ptr) AccessChain 24(data) 25 799 158 + 807: 19(fvec4) Load 806 + 808: 19(fvec4) VectorShuffle 807 805 4 5 6 3 + Store 806 808 + 809: 27(ptr) AccessChain 10(dti) 26 + 810: 6(int) Load 809 + 811: 27(ptr) AccessChain 10(dti) 26 + 812: 6(int) Load 811 + 813: 32(ptr) AccessChain 24(data) 25 812 25 + 814: 13(ivec4) Load 813 + 815: 13(ivec4) GroupNonUniformQuadSwap 35 814 205 + 816: 32(ptr) AccessChain 24(data) 25 810 25 + Store 816 815 + 817: 27(ptr) AccessChain 10(dti) 26 + 818: 6(int) Load 817 + 819: 27(ptr) AccessChain 10(dti) 26 + 820: 6(int) Load 819 + 821: 42(ptr) AccessChain 24(data) 25 820 25 26 + 822: 6(int) Load 821 + 823: 6(int) GroupNonUniformQuadSwap 35 822 205 + 824: 42(ptr) AccessChain 24(data) 25 818 25 26 + Store 824 823 + 825: 27(ptr) AccessChain 10(dti) 26 + 826: 6(int) Load 825 + 827: 27(ptr) AccessChain 10(dti) 26 + 828: 6(int) Load 827 + 829: 32(ptr) AccessChain 24(data) 25 828 25 + 830: 13(ivec4) Load 829 + 831: 51(ivec2) VectorShuffle 830 830 0 1 + 832: 51(ivec2) GroupNonUniformQuadSwap 35 831 205 + 833: 32(ptr) AccessChain 24(data) 25 826 25 + 834: 13(ivec4) Load 833 + 835: 13(ivec4) VectorShuffle 834 832 4 5 2 3 + Store 833 835 + 836: 27(ptr) AccessChain 10(dti) 26 + 837: 6(int) Load 836 + 838: 27(ptr) AccessChain 10(dti) 26 + 839: 6(int) Load 838 + 840: 32(ptr) AccessChain 24(data) 25 839 25 + 841: 13(ivec4) Load 840 + 842: 7(ivec3) VectorShuffle 841 841 0 1 2 + 843: 7(ivec3) GroupNonUniformQuadSwap 35 842 205 + 844: 32(ptr) AccessChain 24(data) 25 837 25 + 845: 13(ivec4) Load 844 + 846: 13(ivec4) VectorShuffle 845 843 4 5 6 3 + Store 844 846 + 847: 27(ptr) AccessChain 10(dti) 26 + 848: 6(int) Load 847 + 849: 27(ptr) AccessChain 10(dti) 26 + 850: 6(int) Load 849 + 851: 75(ptr) AccessChain 24(data) 25 850 72 + 852: 15(ivec4) Load 851 + 853: 15(ivec4) GroupNonUniformQuadSwap 35 852 205 + 854: 75(ptr) AccessChain 24(data) 25 848 72 + Store 854 853 + 855: 27(ptr) AccessChain 10(dti) 26 + 856: 6(int) Load 855 + 857: 27(ptr) AccessChain 10(dti) 26 + 858: 6(int) Load 857 + 859: 84(ptr) AccessChain 24(data) 25 858 72 26 + 860: 14(int) Load 859 + 861: 14(int) GroupNonUniformQuadSwap 35 860 205 + 862: 84(ptr) AccessChain 24(data) 25 856 72 26 + Store 862 861 + 863: 27(ptr) AccessChain 10(dti) 26 + 864: 6(int) Load 863 + 865: 27(ptr) AccessChain 10(dti) 26 + 866: 6(int) Load 865 + 867: 75(ptr) AccessChain 24(data) 25 866 72 + 868: 15(ivec4) Load 867 + 869: 93(ivec2) VectorShuffle 868 868 0 1 + 870: 93(ivec2) GroupNonUniformQuadSwap 35 869 205 + 871: 75(ptr) AccessChain 24(data) 25 864 72 + 872: 15(ivec4) Load 871 + 873: 15(ivec4) VectorShuffle 872 870 4 5 2 3 + Store 871 873 + 874: 27(ptr) AccessChain 10(dti) 26 + 875: 6(int) Load 874 + 876: 27(ptr) AccessChain 10(dti) 26 + 877: 6(int) Load 876 + 878: 75(ptr) AccessChain 24(data) 25 877 72 + 879: 15(ivec4) Load 878 + 880: 105(ivec3) VectorShuffle 879 879 0 1 2 + 881: 105(ivec3) GroupNonUniformQuadSwap 35 880 205 + 882: 75(ptr) AccessChain 24(data) 25 875 72 + 883: 15(ivec4) Load 882 + 884: 15(ivec4) VectorShuffle 883 881 4 5 6 3 + Store 882 884 + 885: 27(ptr) AccessChain 10(dti) 26 + 886: 6(int) Load 885 + 887: 27(ptr) AccessChain 10(dti) 26 + 888: 6(int) Load 887 + 889: 118(ptr) AccessChain 24(data) 25 888 115 + 890: 17(fvec4) Load 889 + 891: 17(fvec4) GroupNonUniformQuadSwap 35 890 205 + 892: 118(ptr) AccessChain 24(data) 25 886 115 + Store 892 891 + 893: 27(ptr) AccessChain 10(dti) 26 + 894: 6(int) Load 893 + 895: 27(ptr) AccessChain 10(dti) 26 + 896: 6(int) Load 895 + 897: 127(ptr) AccessChain 24(data) 25 896 115 26 + 898: 16(float) Load 897 + 899: 16(float) GroupNonUniformQuadSwap 35 898 205 + 900: 127(ptr) AccessChain 24(data) 25 894 115 26 + Store 900 899 + 901: 27(ptr) AccessChain 10(dti) 26 + 902: 6(int) Load 901 + 903: 27(ptr) AccessChain 10(dti) 26 + 904: 6(int) Load 903 + 905: 118(ptr) AccessChain 24(data) 25 904 115 + 906: 17(fvec4) Load 905 + 907: 136(fvec2) VectorShuffle 906 906 0 1 + 908: 136(fvec2) GroupNonUniformQuadSwap 35 907 205 + 909: 118(ptr) AccessChain 24(data) 25 902 115 + 910: 17(fvec4) Load 909 + 911: 17(fvec4) VectorShuffle 910 908 4 5 2 3 + Store 909 911 + 912: 27(ptr) AccessChain 10(dti) 26 + 913: 6(int) Load 912 + 914: 27(ptr) AccessChain 10(dti) 26 + 915: 6(int) Load 914 + 916: 118(ptr) AccessChain 24(data) 25 915 115 + 917: 17(fvec4) Load 916 + 918: 148(fvec3) VectorShuffle 917 917 0 1 2 + 919: 148(fvec3) GroupNonUniformQuadSwap 35 918 205 + 920: 118(ptr) AccessChain 24(data) 25 913 115 + 921: 17(fvec4) Load 920 + 922: 17(fvec4) VectorShuffle 921 919 4 5 6 3 + Store 920 922 + 923: 27(ptr) AccessChain 10(dti) 26 + 924: 6(int) Load 923 + 925: 27(ptr) AccessChain 10(dti) 26 + 926: 6(int) Load 925 + 927: 161(ptr) AccessChain 24(data) 25 926 158 + 928: 19(fvec4) Load 927 + 929: 19(fvec4) GroupNonUniformQuadSwap 35 928 205 + 930: 161(ptr) AccessChain 24(data) 25 924 158 + Store 930 929 + 931: 27(ptr) AccessChain 10(dti) 26 + 932: 6(int) Load 931 + 933: 27(ptr) AccessChain 10(dti) 26 + 934: 6(int) Load 933 + 935: 170(ptr) AccessChain 24(data) 25 934 158 26 + 936: 18(float) Load 935 + 937: 18(float) GroupNonUniformQuadSwap 35 936 205 + 938: 170(ptr) AccessChain 24(data) 25 932 158 26 + Store 938 937 + 939: 27(ptr) AccessChain 10(dti) 26 + 940: 6(int) Load 939 + 941: 27(ptr) AccessChain 10(dti) 26 + 942: 6(int) Load 941 + 943: 161(ptr) AccessChain 24(data) 25 942 158 + 944: 19(fvec4) Load 943 + 945: 179(fvec2) VectorShuffle 944 944 0 1 + 946: 179(fvec2) GroupNonUniformQuadSwap 35 945 205 + 947: 161(ptr) AccessChain 24(data) 25 940 158 + 948: 19(fvec4) Load 947 + 949: 19(fvec4) VectorShuffle 948 946 4 5 2 3 + Store 947 949 + 950: 27(ptr) AccessChain 10(dti) 26 + 951: 6(int) Load 950 + 952: 27(ptr) AccessChain 10(dti) 26 + 953: 6(int) Load 952 + 954: 161(ptr) AccessChain 24(data) 25 953 158 + 955: 19(fvec4) Load 954 + 956: 191(fvec3) VectorShuffle 955 955 0 1 2 + 957: 191(fvec3) GroupNonUniformQuadSwap 35 956 205 + 958: 161(ptr) AccessChain 24(data) 25 951 158 + 959: 19(fvec4) Load 958 + 960: 19(fvec4) VectorShuffle 959 957 4 5 6 3 + Store 958 960 + 961: 27(ptr) AccessChain 10(dti) 26 + 962: 6(int) Load 961 + 963: 27(ptr) AccessChain 10(dti) 26 + 964: 6(int) Load 963 + 965: 32(ptr) AccessChain 24(data) 25 964 25 + 966: 13(ivec4) Load 965 + 967: 13(ivec4) GroupNonUniformQuadSwap 35 966 358 + 968: 32(ptr) AccessChain 24(data) 25 962 25 + Store 968 967 + 969: 27(ptr) AccessChain 10(dti) 26 + 970: 6(int) Load 969 + 971: 27(ptr) AccessChain 10(dti) 26 + 972: 6(int) Load 971 + 973: 42(ptr) AccessChain 24(data) 25 972 25 26 + 974: 6(int) Load 973 + 975: 6(int) GroupNonUniformQuadSwap 35 974 358 + 976: 42(ptr) AccessChain 24(data) 25 970 25 26 + Store 976 975 + 977: 27(ptr) AccessChain 10(dti) 26 + 978: 6(int) Load 977 + 979: 27(ptr) AccessChain 10(dti) 26 + 980: 6(int) Load 979 + 981: 32(ptr) AccessChain 24(data) 25 980 25 + 982: 13(ivec4) Load 981 + 983: 51(ivec2) VectorShuffle 982 982 0 1 + 984: 51(ivec2) GroupNonUniformQuadSwap 35 983 358 + 985: 32(ptr) AccessChain 24(data) 25 978 25 + 986: 13(ivec4) Load 985 + 987: 13(ivec4) VectorShuffle 986 984 4 5 2 3 + Store 985 987 + 988: 27(ptr) AccessChain 10(dti) 26 + 989: 6(int) Load 988 + 990: 27(ptr) AccessChain 10(dti) 26 + 991: 6(int) Load 990 + 992: 32(ptr) AccessChain 24(data) 25 991 25 + 993: 13(ivec4) Load 992 + 994: 7(ivec3) VectorShuffle 993 993 0 1 2 + 995: 7(ivec3) GroupNonUniformQuadSwap 35 994 358 + 996: 32(ptr) AccessChain 24(data) 25 989 25 + 997: 13(ivec4) Load 996 + 998: 13(ivec4) VectorShuffle 997 995 4 5 6 3 + Store 996 998 + 999: 27(ptr) AccessChain 10(dti) 26 + 1000: 6(int) Load 999 + 1001: 27(ptr) AccessChain 10(dti) 26 + 1002: 6(int) Load 1001 + 1003: 75(ptr) AccessChain 24(data) 25 1002 72 + 1004: 15(ivec4) Load 1003 + 1005: 15(ivec4) GroupNonUniformQuadSwap 35 1004 358 + 1006: 75(ptr) AccessChain 24(data) 25 1000 72 + Store 1006 1005 + 1007: 27(ptr) AccessChain 10(dti) 26 + 1008: 6(int) Load 1007 + 1009: 27(ptr) AccessChain 10(dti) 26 + 1010: 6(int) Load 1009 + 1011: 84(ptr) AccessChain 24(data) 25 1010 72 26 + 1012: 14(int) Load 1011 + 1013: 14(int) GroupNonUniformQuadSwap 35 1012 358 + 1014: 84(ptr) AccessChain 24(data) 25 1008 72 26 + Store 1014 1013 + 1015: 27(ptr) AccessChain 10(dti) 26 + 1016: 6(int) Load 1015 + 1017: 27(ptr) AccessChain 10(dti) 26 + 1018: 6(int) Load 1017 + 1019: 75(ptr) AccessChain 24(data) 25 1018 72 + 1020: 15(ivec4) Load 1019 + 1021: 93(ivec2) VectorShuffle 1020 1020 0 1 + 1022: 93(ivec2) GroupNonUniformQuadSwap 35 1021 358 + 1023: 75(ptr) AccessChain 24(data) 25 1016 72 + 1024: 15(ivec4) Load 1023 + 1025: 15(ivec4) VectorShuffle 1024 1022 4 5 2 3 + Store 1023 1025 + 1026: 27(ptr) AccessChain 10(dti) 26 + 1027: 6(int) Load 1026 + 1028: 27(ptr) AccessChain 10(dti) 26 + 1029: 6(int) Load 1028 + 1030: 75(ptr) AccessChain 24(data) 25 1029 72 + 1031: 15(ivec4) Load 1030 + 1032: 105(ivec3) VectorShuffle 1031 1031 0 1 2 + 1033: 105(ivec3) GroupNonUniformQuadSwap 35 1032 358 + 1034: 75(ptr) AccessChain 24(data) 25 1027 72 + 1035: 15(ivec4) Load 1034 + 1036: 15(ivec4) VectorShuffle 1035 1033 4 5 6 3 + Store 1034 1036 + 1037: 27(ptr) AccessChain 10(dti) 26 + 1038: 6(int) Load 1037 + 1039: 27(ptr) AccessChain 10(dti) 26 + 1040: 6(int) Load 1039 + 1041: 118(ptr) AccessChain 24(data) 25 1040 115 + 1042: 17(fvec4) Load 1041 + 1043: 17(fvec4) GroupNonUniformQuadSwap 35 1042 358 + 1044: 118(ptr) AccessChain 24(data) 25 1038 115 + Store 1044 1043 + 1045: 27(ptr) AccessChain 10(dti) 26 + 1046: 6(int) Load 1045 + 1047: 27(ptr) AccessChain 10(dti) 26 + 1048: 6(int) Load 1047 + 1049: 127(ptr) AccessChain 24(data) 25 1048 115 26 + 1050: 16(float) Load 1049 + 1051: 16(float) GroupNonUniformQuadSwap 35 1050 358 + 1052: 127(ptr) AccessChain 24(data) 25 1046 115 26 + Store 1052 1051 + 1053: 27(ptr) AccessChain 10(dti) 26 + 1054: 6(int) Load 1053 + 1055: 27(ptr) AccessChain 10(dti) 26 + 1056: 6(int) Load 1055 + 1057: 118(ptr) AccessChain 24(data) 25 1056 115 + 1058: 17(fvec4) Load 1057 + 1059: 136(fvec2) VectorShuffle 1058 1058 0 1 + 1060: 136(fvec2) GroupNonUniformQuadSwap 35 1059 358 + 1061: 118(ptr) AccessChain 24(data) 25 1054 115 + 1062: 17(fvec4) Load 1061 + 1063: 17(fvec4) VectorShuffle 1062 1060 4 5 2 3 + Store 1061 1063 + 1064: 27(ptr) AccessChain 10(dti) 26 + 1065: 6(int) Load 1064 + 1066: 27(ptr) AccessChain 10(dti) 26 + 1067: 6(int) Load 1066 + 1068: 118(ptr) AccessChain 24(data) 25 1067 115 + 1069: 17(fvec4) Load 1068 + 1070: 148(fvec3) VectorShuffle 1069 1069 0 1 2 + 1071: 148(fvec3) GroupNonUniformQuadSwap 35 1070 358 + 1072: 118(ptr) AccessChain 24(data) 25 1065 115 + 1073: 17(fvec4) Load 1072 + 1074: 17(fvec4) VectorShuffle 1073 1071 4 5 6 3 + Store 1072 1074 + 1075: 27(ptr) AccessChain 10(dti) 26 + 1076: 6(int) Load 1075 + 1077: 27(ptr) AccessChain 10(dti) 26 + 1078: 6(int) Load 1077 + 1079: 161(ptr) AccessChain 24(data) 25 1078 158 + 1080: 19(fvec4) Load 1079 + 1081: 19(fvec4) GroupNonUniformQuadSwap 35 1080 358 + 1082: 161(ptr) AccessChain 24(data) 25 1076 158 + Store 1082 1081 + 1083: 27(ptr) AccessChain 10(dti) 26 + 1084: 6(int) Load 1083 + 1085: 27(ptr) AccessChain 10(dti) 26 + 1086: 6(int) Load 1085 + 1087: 170(ptr) AccessChain 24(data) 25 1086 158 26 + 1088: 18(float) Load 1087 + 1089: 18(float) GroupNonUniformQuadSwap 35 1088 358 + 1090: 170(ptr) AccessChain 24(data) 25 1084 158 26 + Store 1090 1089 + 1091: 27(ptr) AccessChain 10(dti) 26 + 1092: 6(int) Load 1091 + 1093: 27(ptr) AccessChain 10(dti) 26 + 1094: 6(int) Load 1093 + 1095: 161(ptr) AccessChain 24(data) 25 1094 158 + 1096: 19(fvec4) Load 1095 + 1097: 179(fvec2) VectorShuffle 1096 1096 0 1 + 1098: 179(fvec2) GroupNonUniformQuadSwap 35 1097 358 + 1099: 161(ptr) AccessChain 24(data) 25 1092 158 + 1100: 19(fvec4) Load 1099 + 1101: 19(fvec4) VectorShuffle 1100 1098 4 5 2 3 + Store 1099 1101 + 1102: 27(ptr) AccessChain 10(dti) 26 + 1103: 6(int) Load 1102 + 1104: 27(ptr) AccessChain 10(dti) 26 + 1105: 6(int) Load 1104 + 1106: 161(ptr) AccessChain 24(data) 25 1105 158 + 1107: 19(fvec4) Load 1106 + 1108: 191(fvec3) VectorShuffle 1107 1107 0 1 2 + 1109: 191(fvec3) GroupNonUniformQuadSwap 35 1108 358 + 1110: 161(ptr) AccessChain 24(data) 25 1103 158 + 1111: 19(fvec4) Load 1110 + 1112: 19(fvec4) VectorShuffle 1111 1109 4 5 6 3 + Store 1110 1112 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.wavequery.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.wavequery.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.wavequery.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.wavequery.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,116 @@ +hlsl.wavequery.comp +Shader version: 500 +local_size = (32, 16, 1) +0:? Sequence +0:5 Function Definition: @CSMain( ( temp void) +0:5 Function Parameters: +0:? Sequence +0:6 move second child to first child ( temp uint) +0:6 indirect index (layout( row_major std430) buffer uint) +0:6 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:6 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) +0:6 Constant: +0:6 0 (const uint) +0:6 '@gl_SubgroupInvocationID' ( in uint unknown built-in variable) +0:6 Test condition and select ( temp uint): no shortcircuit +0:6 Condition +0:6 subgroupElect ( temp bool) +0:6 true case +0:6 '@gl_SubgroupSize' ( in uint unknown built-in variable) +0:6 false case +0:6 Constant: +0:6 0 (const uint) +0:5 Function Definition: CSMain( ( temp void) +0:5 Function Parameters: +0:? Sequence +0:5 Function Call: @CSMain( ( temp void) +0:? Linker Objects +0:? 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) + + +Linked compute stage: + + +Shader version: 500 +local_size = (32, 16, 1) +0:? Sequence +0:5 Function Definition: @CSMain( ( temp void) +0:5 Function Parameters: +0:? Sequence +0:6 move second child to first child ( temp uint) +0:6 indirect index (layout( row_major std430) buffer uint) +0:6 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint) +0:6 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) +0:6 Constant: +0:6 0 (const uint) +0:6 '@gl_SubgroupInvocationID' ( in uint unknown built-in variable) +0:6 Test condition and select ( temp uint): no shortcircuit +0:6 Condition +0:6 subgroupElect ( temp bool) +0:6 true case +0:6 '@gl_SubgroupSize' ( in uint unknown built-in variable) +0:6 false case +0:6 Constant: +0:6 0 (const uint) +0:5 Function Definition: CSMain( ( temp void) +0:5 Function Parameters: +0:? Sequence +0:5 Function Call: @CSMain( ( temp void) +0:? Linker Objects +0:? 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint @data}) + +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 28 + + Capability Shader + Capability GroupNonUniform + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "CSMain" 16 21 + ExecutionMode 4 LocalSize 32 16 1 + Source HLSL 500 + Name 4 "CSMain" + Name 6 "@CSMain(" + Name 10 "data" + MemberName 10(data) 0 "@data" + Name 12 "data" + Name 16 "@gl_SubgroupInvocationID" + Name 21 "@gl_SubgroupSize" + Decorate 9 ArrayStride 4 + MemberDecorate 10(data) 0 Offset 0 + Decorate 10(data) BufferBlock + Decorate 12(data) DescriptorSet 0 + Decorate 16(@gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 21(@gl_SubgroupSize) BuiltIn SubgroupSize + 2: TypeVoid + 3: TypeFunction 2 + 8: TypeInt 32 0 + 9: TypeRuntimeArray 8(int) + 10(data): TypeStruct 9 + 11: TypePointer Uniform 10(data) + 12(data): 11(ptr) Variable Uniform + 13: TypeInt 32 1 + 14: 13(int) Constant 0 + 15: TypePointer Input 8(int) +16(@gl_SubgroupInvocationID): 15(ptr) Variable Input + 18: TypeBool + 19: 8(int) Constant 3 +21(@gl_SubgroupSize): 15(ptr) Variable Input + 23: 8(int) Constant 0 + 25: TypePointer Uniform 8(int) + 4(CSMain): 2 Function None 3 + 5: Label + 27: 2 FunctionCall 6(@CSMain() + Return + FunctionEnd + 6(@CSMain(): 2 Function None 3 + 7: Label + 17: 8(int) Load 16(@gl_SubgroupInvocationID) + 20: 18(bool) GroupNonUniformElect 19 + 22: 8(int) Load 21(@gl_SubgroupSize) + 24: 8(int) Select 20 22 23 + 26: 25(ptr) AccessChain 12(data) 14 17 + Store 26 24 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.wavequery.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.wavequery.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.wavequery.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.wavequery.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,123 @@ +hlsl.wavequery.frag +Shader version: 500 +gl_FragCoord origin is upper left +0:? Sequence +0:2 Function Definition: @PixelShaderFunction( ( temp 4-component vector of float) +0:2 Function Parameters: +0:? Sequence +0:3 Test condition and select ( temp void) +0:3 Condition +0:3 subgroupElect ( temp bool) +0:3 true case +0:? Sequence +0:5 Branch: Return with expression +0:? Constant: +0:? 1.000000 +0:? 2.000000 +0:? 3.000000 +0:? 4.000000 +0:3 false case +0:? Sequence +0:9 Branch: Return with expression +0:? Constant: +0:? 4.000000 +0:? 3.000000 +0:? 2.000000 +0:? 1.000000 +0:2 Function Definition: PixelShaderFunction( ( temp void) +0:2 Function Parameters: +0:? Sequence +0:2 move second child to first child ( temp 4-component vector of float) +0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) +0:2 Function Call: @PixelShaderFunction( ( temp 4-component vector of float) +0:? Linker Objects +0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) + + +Linked fragment stage: + + +Shader version: 500 +gl_FragCoord origin is upper left +0:? Sequence +0:2 Function Definition: @PixelShaderFunction( ( temp 4-component vector of float) +0:2 Function Parameters: +0:? Sequence +0:3 Test condition and select ( temp void) +0:3 Condition +0:3 subgroupElect ( temp bool) +0:3 true case +0:? Sequence +0:5 Branch: Return with expression +0:? Constant: +0:? 1.000000 +0:? 2.000000 +0:? 3.000000 +0:? 4.000000 +0:3 false case +0:? Sequence +0:9 Branch: Return with expression +0:? Constant: +0:? 4.000000 +0:? 3.000000 +0:? 2.000000 +0:? 1.000000 +0:2 Function Definition: PixelShaderFunction( ( temp void) +0:2 Function Parameters: +0:? Sequence +0:2 move second child to first child ( temp 4-component vector of float) +0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) +0:2 Function Call: @PixelShaderFunction( ( temp 4-component vector of float) +0:? Linker Objects +0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) + +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 30 + + Capability Shader + Capability GroupNonUniform + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "PixelShaderFunction" 28 + ExecutionMode 4 OriginUpperLeft + Source HLSL 500 + Name 4 "PixelShaderFunction" + Name 9 "@PixelShaderFunction(" + Name 28 "@entryPointOutput" + Decorate 28(@entryPointOutput) Location 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeVector 6(float) 4 + 8: TypeFunction 7(fvec4) + 11: TypeBool + 12: TypeInt 32 0 + 13: 12(int) Constant 3 + 17: 6(float) Constant 1065353216 + 18: 6(float) Constant 1073741824 + 19: 6(float) Constant 1077936128 + 20: 6(float) Constant 1082130432 + 21: 7(fvec4) ConstantComposite 17 18 19 20 + 24: 7(fvec4) ConstantComposite 20 19 18 17 + 27: TypePointer Output 7(fvec4) +28(@entryPointOutput): 27(ptr) Variable Output +4(PixelShaderFunction): 2 Function None 3 + 5: Label + 29: 7(fvec4) FunctionCall 9(@PixelShaderFunction() + Store 28(@entryPointOutput) 29 + Return + FunctionEnd +9(@PixelShaderFunction(): 7(fvec4) Function None 8 + 10: Label + 14: 11(bool) GroupNonUniformElect 13 + SelectionMerge 16 None + BranchConditional 14 15 23 + 15: Label + ReturnValue 21 + 23: Label + ReturnValue 24 + 16: Label + 26: 7(fvec4) Undef + ReturnValue 26 + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.wavereduction.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.wavereduction.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.wavereduction.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.wavereduction.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,7218 @@ +hlsl.wavereduction.comp +Shader version: 500 +local_size = (32, 16, 1) +0:? Sequence +0:13 Function Definition: @CSMain(vu3; ( temp void) +0:13 Function Parameters: +0:13 'dti' ( in 3-component vector of uint) +0:? Sequence +0:14 move second child to first child ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:14 subgroupAdd ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:15 move second child to first child ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 subgroupAdd ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:16 move second child to first child ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:16 subgroupAdd ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:17 move second child to first child ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:17 subgroupAdd ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:19 move second child to first child ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:19 subgroupAdd ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:20 move second child to first child ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:20 subgroupAdd ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:21 move second child to first child ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 subgroupAdd ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:22 move second child to first child ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:22 subgroupAdd ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:24 move second child to first child ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:24 subgroupAdd ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:25 move second child to first child ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:25 subgroupAdd ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:26 move second child to first child ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:26 subgroupAdd ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:27 move second child to first child ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 subgroupAdd ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:29 move second child to first child ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:29 subgroupAdd ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:30 move second child to first child ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:30 subgroupAdd ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:31 move second child to first child ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:31 subgroupAdd ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:32 move second child to first child ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:32 subgroupAdd ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:34 move second child to first child ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:34 subgroupMul ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:35 move second child to first child ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 subgroupMul ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:36 move second child to first child ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:36 subgroupMul ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:37 move second child to first child ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:37 subgroupMul ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:39 move second child to first child ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:39 subgroupMul ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:40 move second child to first child ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:40 subgroupMul ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:41 move second child to first child ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 subgroupMul ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:42 move second child to first child ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:42 subgroupMul ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:44 move second child to first child ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:44 subgroupMul ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:45 move second child to first child ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:45 subgroupMul ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:46 move second child to first child ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:46 subgroupMul ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:47 move second child to first child ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 subgroupMul ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:49 move second child to first child ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:49 subgroupMul ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:50 move second child to first child ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:50 subgroupMul ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:51 move second child to first child ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:51 subgroupMul ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:52 move second child to first child ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:52 subgroupMul ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:54 move second child to first child ( temp 4-component vector of uint) +0:54 u: direct index for structure ( temp 4-component vector of uint) +0:54 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:54 Constant: +0:54 0 (const uint) +0:54 direct index ( temp uint) +0:54 'dti' ( in 3-component vector of uint) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 subgroupMin ( temp 4-component vector of uint) +0:54 u: direct index for structure ( temp 4-component vector of uint) +0:54 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:54 Constant: +0:54 0 (const uint) +0:54 direct index ( temp uint) +0:54 'dti' ( in 3-component vector of uint) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:55 move second child to first child ( temp uint) +0:55 direct index ( temp uint) +0:55 u: direct index for structure ( temp 4-component vector of uint) +0:55 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:55 Constant: +0:55 0 (const uint) +0:55 direct index ( temp uint) +0:55 'dti' ( in 3-component vector of uint) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 subgroupMin ( temp uint) +0:55 direct index ( temp uint) +0:55 u: direct index for structure ( temp 4-component vector of uint) +0:55 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:55 Constant: +0:55 0 (const uint) +0:55 direct index ( temp uint) +0:55 'dti' ( in 3-component vector of uint) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:56 move second child to first child ( temp 2-component vector of uint) +0:56 vector swizzle ( temp 2-component vector of uint) +0:56 u: direct index for structure ( temp 4-component vector of uint) +0:56 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:56 Constant: +0:56 0 (const uint) +0:56 direct index ( temp uint) +0:56 'dti' ( in 3-component vector of uint) +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 0 (const int) +0:56 Sequence +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 1 (const int) +0:56 subgroupMin ( temp 2-component vector of uint) +0:56 vector swizzle ( temp 2-component vector of uint) +0:56 u: direct index for structure ( temp 4-component vector of uint) +0:56 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:56 Constant: +0:56 0 (const uint) +0:56 direct index ( temp uint) +0:56 'dti' ( in 3-component vector of uint) +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 0 (const int) +0:56 Sequence +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 1 (const int) +0:57 move second child to first child ( temp 3-component vector of uint) +0:57 vector swizzle ( temp 3-component vector of uint) +0:57 u: direct index for structure ( temp 4-component vector of uint) +0:57 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:57 Constant: +0:57 0 (const uint) +0:57 direct index ( temp uint) +0:57 'dti' ( in 3-component vector of uint) +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 0 (const int) +0:57 Sequence +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 1 (const int) +0:57 Constant: +0:57 2 (const int) +0:57 subgroupMin ( temp 3-component vector of uint) +0:57 vector swizzle ( temp 3-component vector of uint) +0:57 u: direct index for structure ( temp 4-component vector of uint) +0:57 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:57 Constant: +0:57 0 (const uint) +0:57 direct index ( temp uint) +0:57 'dti' ( in 3-component vector of uint) +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 0 (const int) +0:57 Sequence +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 1 (const int) +0:57 Constant: +0:57 2 (const int) +0:59 move second child to first child ( temp 4-component vector of int) +0:59 i: direct index for structure ( temp 4-component vector of int) +0:59 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:59 Constant: +0:59 0 (const uint) +0:59 direct index ( temp uint) +0:59 'dti' ( in 3-component vector of uint) +0:59 Constant: +0:59 0 (const int) +0:59 Constant: +0:59 1 (const int) +0:59 subgroupMin ( temp 4-component vector of int) +0:59 i: direct index for structure ( temp 4-component vector of int) +0:59 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:59 Constant: +0:59 0 (const uint) +0:59 direct index ( temp uint) +0:59 'dti' ( in 3-component vector of uint) +0:59 Constant: +0:59 0 (const int) +0:59 Constant: +0:59 1 (const int) +0:60 move second child to first child ( temp int) +0:60 direct index ( temp int) +0:60 i: direct index for structure ( temp 4-component vector of int) +0:60 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:60 Constant: +0:60 0 (const uint) +0:60 direct index ( temp uint) +0:60 'dti' ( in 3-component vector of uint) +0:60 Constant: +0:60 0 (const int) +0:60 Constant: +0:60 1 (const int) +0:60 Constant: +0:60 0 (const int) +0:60 subgroupMin ( temp int) +0:60 direct index ( temp int) +0:60 i: direct index for structure ( temp 4-component vector of int) +0:60 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:60 Constant: +0:60 0 (const uint) +0:60 direct index ( temp uint) +0:60 'dti' ( in 3-component vector of uint) +0:60 Constant: +0:60 0 (const int) +0:60 Constant: +0:60 1 (const int) +0:60 Constant: +0:60 0 (const int) +0:61 move second child to first child ( temp 2-component vector of int) +0:61 vector swizzle ( temp 2-component vector of int) +0:61 i: direct index for structure ( temp 4-component vector of int) +0:61 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:61 Constant: +0:61 0 (const uint) +0:61 direct index ( temp uint) +0:61 'dti' ( in 3-component vector of uint) +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 Sequence +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 subgroupMin ( temp 2-component vector of int) +0:61 vector swizzle ( temp 2-component vector of int) +0:61 i: direct index for structure ( temp 4-component vector of int) +0:61 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:61 Constant: +0:61 0 (const uint) +0:61 direct index ( temp uint) +0:61 'dti' ( in 3-component vector of uint) +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 Sequence +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:62 move second child to first child ( temp 3-component vector of int) +0:62 vector swizzle ( temp 3-component vector of int) +0:62 i: direct index for structure ( temp 4-component vector of int) +0:62 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:62 Constant: +0:62 0 (const uint) +0:62 direct index ( temp uint) +0:62 'dti' ( in 3-component vector of uint) +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Sequence +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Constant: +0:62 2 (const int) +0:62 subgroupMin ( temp 3-component vector of int) +0:62 vector swizzle ( temp 3-component vector of int) +0:62 i: direct index for structure ( temp 4-component vector of int) +0:62 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:62 Constant: +0:62 0 (const uint) +0:62 direct index ( temp uint) +0:62 'dti' ( in 3-component vector of uint) +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Sequence +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Constant: +0:62 2 (const int) +0:64 move second child to first child ( temp 4-component vector of float) +0:64 f: direct index for structure ( temp 4-component vector of float) +0:64 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:64 Constant: +0:64 0 (const uint) +0:64 direct index ( temp uint) +0:64 'dti' ( in 3-component vector of uint) +0:64 Constant: +0:64 0 (const int) +0:64 Constant: +0:64 2 (const int) +0:64 subgroupMin ( temp 4-component vector of float) +0:64 f: direct index for structure ( temp 4-component vector of float) +0:64 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:64 Constant: +0:64 0 (const uint) +0:64 direct index ( temp uint) +0:64 'dti' ( in 3-component vector of uint) +0:64 Constant: +0:64 0 (const int) +0:64 Constant: +0:64 2 (const int) +0:65 move second child to first child ( temp float) +0:65 direct index ( temp float) +0:65 f: direct index for structure ( temp 4-component vector of float) +0:65 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:65 Constant: +0:65 0 (const uint) +0:65 direct index ( temp uint) +0:65 'dti' ( in 3-component vector of uint) +0:65 Constant: +0:65 0 (const int) +0:65 Constant: +0:65 2 (const int) +0:65 Constant: +0:65 0 (const int) +0:65 subgroupMin ( temp float) +0:65 direct index ( temp float) +0:65 f: direct index for structure ( temp 4-component vector of float) +0:65 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:65 Constant: +0:65 0 (const uint) +0:65 direct index ( temp uint) +0:65 'dti' ( in 3-component vector of uint) +0:65 Constant: +0:65 0 (const int) +0:65 Constant: +0:65 2 (const int) +0:65 Constant: +0:65 0 (const int) +0:66 move second child to first child ( temp 2-component vector of float) +0:66 vector swizzle ( temp 2-component vector of float) +0:66 f: direct index for structure ( temp 4-component vector of float) +0:66 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:66 Constant: +0:66 0 (const uint) +0:66 direct index ( temp uint) +0:66 'dti' ( in 3-component vector of uint) +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 2 (const int) +0:66 Sequence +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 1 (const int) +0:66 subgroupMin ( temp 2-component vector of float) +0:66 vector swizzle ( temp 2-component vector of float) +0:66 f: direct index for structure ( temp 4-component vector of float) +0:66 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:66 Constant: +0:66 0 (const uint) +0:66 direct index ( temp uint) +0:66 'dti' ( in 3-component vector of uint) +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 2 (const int) +0:66 Sequence +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 1 (const int) +0:67 move second child to first child ( temp 3-component vector of float) +0:67 vector swizzle ( temp 3-component vector of float) +0:67 f: direct index for structure ( temp 4-component vector of float) +0:67 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:67 Constant: +0:67 0 (const uint) +0:67 direct index ( temp uint) +0:67 'dti' ( in 3-component vector of uint) +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 Sequence +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 1 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 subgroupMin ( temp 3-component vector of float) +0:67 vector swizzle ( temp 3-component vector of float) +0:67 f: direct index for structure ( temp 4-component vector of float) +0:67 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:67 Constant: +0:67 0 (const uint) +0:67 direct index ( temp uint) +0:67 'dti' ( in 3-component vector of uint) +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 Sequence +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 1 (const int) +0:67 Constant: +0:67 2 (const int) +0:69 move second child to first child ( temp 4-component vector of double) +0:69 d: direct index for structure ( temp 4-component vector of double) +0:69 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:69 Constant: +0:69 0 (const uint) +0:69 direct index ( temp uint) +0:69 'dti' ( in 3-component vector of uint) +0:69 Constant: +0:69 0 (const int) +0:69 Constant: +0:69 3 (const int) +0:69 subgroupMin ( temp 4-component vector of double) +0:69 d: direct index for structure ( temp 4-component vector of double) +0:69 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:69 Constant: +0:69 0 (const uint) +0:69 direct index ( temp uint) +0:69 'dti' ( in 3-component vector of uint) +0:69 Constant: +0:69 0 (const int) +0:69 Constant: +0:69 3 (const int) +0:70 move second child to first child ( temp double) +0:70 direct index ( temp double) +0:70 d: direct index for structure ( temp 4-component vector of double) +0:70 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:70 Constant: +0:70 0 (const uint) +0:70 direct index ( temp uint) +0:70 'dti' ( in 3-component vector of uint) +0:70 Constant: +0:70 0 (const int) +0:70 Constant: +0:70 3 (const int) +0:70 Constant: +0:70 0 (const int) +0:70 subgroupMin ( temp double) +0:70 direct index ( temp double) +0:70 d: direct index for structure ( temp 4-component vector of double) +0:70 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:70 Constant: +0:70 0 (const uint) +0:70 direct index ( temp uint) +0:70 'dti' ( in 3-component vector of uint) +0:70 Constant: +0:70 0 (const int) +0:70 Constant: +0:70 3 (const int) +0:70 Constant: +0:70 0 (const int) +0:71 move second child to first child ( temp 2-component vector of double) +0:71 vector swizzle ( temp 2-component vector of double) +0:71 d: direct index for structure ( temp 4-component vector of double) +0:71 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:71 Constant: +0:71 0 (const uint) +0:71 direct index ( temp uint) +0:71 'dti' ( in 3-component vector of uint) +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 3 (const int) +0:71 Sequence +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 1 (const int) +0:71 subgroupMin ( temp 2-component vector of double) +0:71 vector swizzle ( temp 2-component vector of double) +0:71 d: direct index for structure ( temp 4-component vector of double) +0:71 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:71 Constant: +0:71 0 (const uint) +0:71 direct index ( temp uint) +0:71 'dti' ( in 3-component vector of uint) +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 3 (const int) +0:71 Sequence +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 1 (const int) +0:72 move second child to first child ( temp 3-component vector of double) +0:72 vector swizzle ( temp 3-component vector of double) +0:72 d: direct index for structure ( temp 4-component vector of double) +0:72 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:72 Constant: +0:72 0 (const uint) +0:72 direct index ( temp uint) +0:72 'dti' ( in 3-component vector of uint) +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 3 (const int) +0:72 Sequence +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 1 (const int) +0:72 Constant: +0:72 2 (const int) +0:72 subgroupMin ( temp 3-component vector of double) +0:72 vector swizzle ( temp 3-component vector of double) +0:72 d: direct index for structure ( temp 4-component vector of double) +0:72 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:72 Constant: +0:72 0 (const uint) +0:72 direct index ( temp uint) +0:72 'dti' ( in 3-component vector of uint) +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 3 (const int) +0:72 Sequence +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 1 (const int) +0:72 Constant: +0:72 2 (const int) +0:74 move second child to first child ( temp 4-component vector of uint) +0:74 u: direct index for structure ( temp 4-component vector of uint) +0:74 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:74 Constant: +0:74 0 (const uint) +0:74 direct index ( temp uint) +0:74 'dti' ( in 3-component vector of uint) +0:74 Constant: +0:74 0 (const int) +0:74 Constant: +0:74 0 (const int) +0:74 subgroupMax ( temp 4-component vector of uint) +0:74 u: direct index for structure ( temp 4-component vector of uint) +0:74 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:74 Constant: +0:74 0 (const uint) +0:74 direct index ( temp uint) +0:74 'dti' ( in 3-component vector of uint) +0:74 Constant: +0:74 0 (const int) +0:74 Constant: +0:74 0 (const int) +0:75 move second child to first child ( temp uint) +0:75 direct index ( temp uint) +0:75 u: direct index for structure ( temp 4-component vector of uint) +0:75 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:75 Constant: +0:75 0 (const uint) +0:75 direct index ( temp uint) +0:75 'dti' ( in 3-component vector of uint) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 subgroupMax ( temp uint) +0:75 direct index ( temp uint) +0:75 u: direct index for structure ( temp 4-component vector of uint) +0:75 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:75 Constant: +0:75 0 (const uint) +0:75 direct index ( temp uint) +0:75 'dti' ( in 3-component vector of uint) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:76 move second child to first child ( temp 2-component vector of uint) +0:76 vector swizzle ( temp 2-component vector of uint) +0:76 u: direct index for structure ( temp 4-component vector of uint) +0:76 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:76 Constant: +0:76 0 (const uint) +0:76 direct index ( temp uint) +0:76 'dti' ( in 3-component vector of uint) +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 0 (const int) +0:76 Sequence +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 1 (const int) +0:76 subgroupMax ( temp 2-component vector of uint) +0:76 vector swizzle ( temp 2-component vector of uint) +0:76 u: direct index for structure ( temp 4-component vector of uint) +0:76 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:76 Constant: +0:76 0 (const uint) +0:76 direct index ( temp uint) +0:76 'dti' ( in 3-component vector of uint) +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 0 (const int) +0:76 Sequence +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 1 (const int) +0:77 move second child to first child ( temp 3-component vector of uint) +0:77 vector swizzle ( temp 3-component vector of uint) +0:77 u: direct index for structure ( temp 4-component vector of uint) +0:77 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:77 Constant: +0:77 0 (const uint) +0:77 direct index ( temp uint) +0:77 'dti' ( in 3-component vector of uint) +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 0 (const int) +0:77 Sequence +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 1 (const int) +0:77 Constant: +0:77 2 (const int) +0:77 subgroupMax ( temp 3-component vector of uint) +0:77 vector swizzle ( temp 3-component vector of uint) +0:77 u: direct index for structure ( temp 4-component vector of uint) +0:77 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:77 Constant: +0:77 0 (const uint) +0:77 direct index ( temp uint) +0:77 'dti' ( in 3-component vector of uint) +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 0 (const int) +0:77 Sequence +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 1 (const int) +0:77 Constant: +0:77 2 (const int) +0:79 move second child to first child ( temp 4-component vector of int) +0:79 i: direct index for structure ( temp 4-component vector of int) +0:79 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:79 Constant: +0:79 0 (const uint) +0:79 direct index ( temp uint) +0:79 'dti' ( in 3-component vector of uint) +0:79 Constant: +0:79 0 (const int) +0:79 Constant: +0:79 1 (const int) +0:79 subgroupMax ( temp 4-component vector of int) +0:79 i: direct index for structure ( temp 4-component vector of int) +0:79 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:79 Constant: +0:79 0 (const uint) +0:79 direct index ( temp uint) +0:79 'dti' ( in 3-component vector of uint) +0:79 Constant: +0:79 0 (const int) +0:79 Constant: +0:79 1 (const int) +0:80 move second child to first child ( temp int) +0:80 direct index ( temp int) +0:80 i: direct index for structure ( temp 4-component vector of int) +0:80 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:80 Constant: +0:80 0 (const uint) +0:80 direct index ( temp uint) +0:80 'dti' ( in 3-component vector of uint) +0:80 Constant: +0:80 0 (const int) +0:80 Constant: +0:80 1 (const int) +0:80 Constant: +0:80 0 (const int) +0:80 subgroupMax ( temp int) +0:80 direct index ( temp int) +0:80 i: direct index for structure ( temp 4-component vector of int) +0:80 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:80 Constant: +0:80 0 (const uint) +0:80 direct index ( temp uint) +0:80 'dti' ( in 3-component vector of uint) +0:80 Constant: +0:80 0 (const int) +0:80 Constant: +0:80 1 (const int) +0:80 Constant: +0:80 0 (const int) +0:81 move second child to first child ( temp 2-component vector of int) +0:81 vector swizzle ( temp 2-component vector of int) +0:81 i: direct index for structure ( temp 4-component vector of int) +0:81 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:81 Constant: +0:81 0 (const uint) +0:81 direct index ( temp uint) +0:81 'dti' ( in 3-component vector of uint) +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 Sequence +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 subgroupMax ( temp 2-component vector of int) +0:81 vector swizzle ( temp 2-component vector of int) +0:81 i: direct index for structure ( temp 4-component vector of int) +0:81 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:81 Constant: +0:81 0 (const uint) +0:81 direct index ( temp uint) +0:81 'dti' ( in 3-component vector of uint) +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 Sequence +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:82 move second child to first child ( temp 3-component vector of int) +0:82 vector swizzle ( temp 3-component vector of int) +0:82 i: direct index for structure ( temp 4-component vector of int) +0:82 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:82 Constant: +0:82 0 (const uint) +0:82 direct index ( temp uint) +0:82 'dti' ( in 3-component vector of uint) +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Sequence +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Constant: +0:82 2 (const int) +0:82 subgroupMax ( temp 3-component vector of int) +0:82 vector swizzle ( temp 3-component vector of int) +0:82 i: direct index for structure ( temp 4-component vector of int) +0:82 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:82 Constant: +0:82 0 (const uint) +0:82 direct index ( temp uint) +0:82 'dti' ( in 3-component vector of uint) +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Sequence +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Constant: +0:82 2 (const int) +0:84 move second child to first child ( temp 4-component vector of float) +0:84 f: direct index for structure ( temp 4-component vector of float) +0:84 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:84 Constant: +0:84 0 (const uint) +0:84 direct index ( temp uint) +0:84 'dti' ( in 3-component vector of uint) +0:84 Constant: +0:84 0 (const int) +0:84 Constant: +0:84 2 (const int) +0:84 subgroupMax ( temp 4-component vector of float) +0:84 f: direct index for structure ( temp 4-component vector of float) +0:84 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:84 Constant: +0:84 0 (const uint) +0:84 direct index ( temp uint) +0:84 'dti' ( in 3-component vector of uint) +0:84 Constant: +0:84 0 (const int) +0:84 Constant: +0:84 2 (const int) +0:85 move second child to first child ( temp float) +0:85 direct index ( temp float) +0:85 f: direct index for structure ( temp 4-component vector of float) +0:85 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:85 Constant: +0:85 0 (const uint) +0:85 direct index ( temp uint) +0:85 'dti' ( in 3-component vector of uint) +0:85 Constant: +0:85 0 (const int) +0:85 Constant: +0:85 2 (const int) +0:85 Constant: +0:85 0 (const int) +0:85 subgroupMax ( temp float) +0:85 direct index ( temp float) +0:85 f: direct index for structure ( temp 4-component vector of float) +0:85 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:85 Constant: +0:85 0 (const uint) +0:85 direct index ( temp uint) +0:85 'dti' ( in 3-component vector of uint) +0:85 Constant: +0:85 0 (const int) +0:85 Constant: +0:85 2 (const int) +0:85 Constant: +0:85 0 (const int) +0:86 move second child to first child ( temp 2-component vector of float) +0:86 vector swizzle ( temp 2-component vector of float) +0:86 f: direct index for structure ( temp 4-component vector of float) +0:86 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:86 Constant: +0:86 0 (const uint) +0:86 direct index ( temp uint) +0:86 'dti' ( in 3-component vector of uint) +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 2 (const int) +0:86 Sequence +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 1 (const int) +0:86 subgroupMax ( temp 2-component vector of float) +0:86 vector swizzle ( temp 2-component vector of float) +0:86 f: direct index for structure ( temp 4-component vector of float) +0:86 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:86 Constant: +0:86 0 (const uint) +0:86 direct index ( temp uint) +0:86 'dti' ( in 3-component vector of uint) +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 2 (const int) +0:86 Sequence +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 1 (const int) +0:87 move second child to first child ( temp 3-component vector of float) +0:87 vector swizzle ( temp 3-component vector of float) +0:87 f: direct index for structure ( temp 4-component vector of float) +0:87 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:87 Constant: +0:87 0 (const uint) +0:87 direct index ( temp uint) +0:87 'dti' ( in 3-component vector of uint) +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 Sequence +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 1 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 subgroupMax ( temp 3-component vector of float) +0:87 vector swizzle ( temp 3-component vector of float) +0:87 f: direct index for structure ( temp 4-component vector of float) +0:87 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:87 Constant: +0:87 0 (const uint) +0:87 direct index ( temp uint) +0:87 'dti' ( in 3-component vector of uint) +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 Sequence +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 1 (const int) +0:87 Constant: +0:87 2 (const int) +0:89 move second child to first child ( temp 4-component vector of double) +0:89 d: direct index for structure ( temp 4-component vector of double) +0:89 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:89 Constant: +0:89 0 (const uint) +0:89 direct index ( temp uint) +0:89 'dti' ( in 3-component vector of uint) +0:89 Constant: +0:89 0 (const int) +0:89 Constant: +0:89 3 (const int) +0:89 subgroupMax ( temp 4-component vector of double) +0:89 d: direct index for structure ( temp 4-component vector of double) +0:89 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:89 Constant: +0:89 0 (const uint) +0:89 direct index ( temp uint) +0:89 'dti' ( in 3-component vector of uint) +0:89 Constant: +0:89 0 (const int) +0:89 Constant: +0:89 3 (const int) +0:90 move second child to first child ( temp double) +0:90 direct index ( temp double) +0:90 d: direct index for structure ( temp 4-component vector of double) +0:90 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:90 Constant: +0:90 0 (const uint) +0:90 direct index ( temp uint) +0:90 'dti' ( in 3-component vector of uint) +0:90 Constant: +0:90 0 (const int) +0:90 Constant: +0:90 3 (const int) +0:90 Constant: +0:90 0 (const int) +0:90 subgroupMax ( temp double) +0:90 direct index ( temp double) +0:90 d: direct index for structure ( temp 4-component vector of double) +0:90 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:90 Constant: +0:90 0 (const uint) +0:90 direct index ( temp uint) +0:90 'dti' ( in 3-component vector of uint) +0:90 Constant: +0:90 0 (const int) +0:90 Constant: +0:90 3 (const int) +0:90 Constant: +0:90 0 (const int) +0:91 move second child to first child ( temp 2-component vector of double) +0:91 vector swizzle ( temp 2-component vector of double) +0:91 d: direct index for structure ( temp 4-component vector of double) +0:91 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:91 Constant: +0:91 0 (const uint) +0:91 direct index ( temp uint) +0:91 'dti' ( in 3-component vector of uint) +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 3 (const int) +0:91 Sequence +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 1 (const int) +0:91 subgroupMax ( temp 2-component vector of double) +0:91 vector swizzle ( temp 2-component vector of double) +0:91 d: direct index for structure ( temp 4-component vector of double) +0:91 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:91 Constant: +0:91 0 (const uint) +0:91 direct index ( temp uint) +0:91 'dti' ( in 3-component vector of uint) +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 3 (const int) +0:91 Sequence +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 1 (const int) +0:92 move second child to first child ( temp 3-component vector of double) +0:92 vector swizzle ( temp 3-component vector of double) +0:92 d: direct index for structure ( temp 4-component vector of double) +0:92 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:92 Constant: +0:92 0 (const uint) +0:92 direct index ( temp uint) +0:92 'dti' ( in 3-component vector of uint) +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 3 (const int) +0:92 Sequence +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 1 (const int) +0:92 Constant: +0:92 2 (const int) +0:92 subgroupMax ( temp 3-component vector of double) +0:92 vector swizzle ( temp 3-component vector of double) +0:92 d: direct index for structure ( temp 4-component vector of double) +0:92 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:92 Constant: +0:92 0 (const uint) +0:92 direct index ( temp uint) +0:92 'dti' ( in 3-component vector of uint) +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 3 (const int) +0:92 Sequence +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 1 (const int) +0:92 Constant: +0:92 2 (const int) +0:94 move second child to first child ( temp 4-component vector of uint) +0:94 u: direct index for structure ( temp 4-component vector of uint) +0:94 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:94 Constant: +0:94 0 (const uint) +0:94 direct index ( temp uint) +0:94 'dti' ( in 3-component vector of uint) +0:94 Constant: +0:94 0 (const int) +0:94 Constant: +0:94 0 (const int) +0:94 subgroupAnd ( temp 4-component vector of uint) +0:94 u: direct index for structure ( temp 4-component vector of uint) +0:94 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:94 Constant: +0:94 0 (const uint) +0:94 direct index ( temp uint) +0:94 'dti' ( in 3-component vector of uint) +0:94 Constant: +0:94 0 (const int) +0:94 Constant: +0:94 0 (const int) +0:95 move second child to first child ( temp uint) +0:95 direct index ( temp uint) +0:95 u: direct index for structure ( temp 4-component vector of uint) +0:95 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:95 Constant: +0:95 0 (const uint) +0:95 direct index ( temp uint) +0:95 'dti' ( in 3-component vector of uint) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:95 subgroupAnd ( temp uint) +0:95 direct index ( temp uint) +0:95 u: direct index for structure ( temp 4-component vector of uint) +0:95 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:95 Constant: +0:95 0 (const uint) +0:95 direct index ( temp uint) +0:95 'dti' ( in 3-component vector of uint) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:96 move second child to first child ( temp 2-component vector of uint) +0:96 vector swizzle ( temp 2-component vector of uint) +0:96 u: direct index for structure ( temp 4-component vector of uint) +0:96 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:96 Constant: +0:96 0 (const uint) +0:96 direct index ( temp uint) +0:96 'dti' ( in 3-component vector of uint) +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 0 (const int) +0:96 Sequence +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 1 (const int) +0:96 subgroupAnd ( temp 2-component vector of uint) +0:96 vector swizzle ( temp 2-component vector of uint) +0:96 u: direct index for structure ( temp 4-component vector of uint) +0:96 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:96 Constant: +0:96 0 (const uint) +0:96 direct index ( temp uint) +0:96 'dti' ( in 3-component vector of uint) +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 0 (const int) +0:96 Sequence +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 1 (const int) +0:97 move second child to first child ( temp 3-component vector of uint) +0:97 vector swizzle ( temp 3-component vector of uint) +0:97 u: direct index for structure ( temp 4-component vector of uint) +0:97 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:97 Constant: +0:97 0 (const uint) +0:97 direct index ( temp uint) +0:97 'dti' ( in 3-component vector of uint) +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 0 (const int) +0:97 Sequence +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 1 (const int) +0:97 Constant: +0:97 2 (const int) +0:97 subgroupAnd ( temp 3-component vector of uint) +0:97 vector swizzle ( temp 3-component vector of uint) +0:97 u: direct index for structure ( temp 4-component vector of uint) +0:97 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:97 Constant: +0:97 0 (const uint) +0:97 direct index ( temp uint) +0:97 'dti' ( in 3-component vector of uint) +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 0 (const int) +0:97 Sequence +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 1 (const int) +0:97 Constant: +0:97 2 (const int) +0:99 move second child to first child ( temp 4-component vector of int) +0:99 i: direct index for structure ( temp 4-component vector of int) +0:99 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:99 Constant: +0:99 0 (const uint) +0:99 direct index ( temp uint) +0:99 'dti' ( in 3-component vector of uint) +0:99 Constant: +0:99 0 (const int) +0:99 Constant: +0:99 1 (const int) +0:99 subgroupAnd ( temp 4-component vector of int) +0:99 i: direct index for structure ( temp 4-component vector of int) +0:99 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:99 Constant: +0:99 0 (const uint) +0:99 direct index ( temp uint) +0:99 'dti' ( in 3-component vector of uint) +0:99 Constant: +0:99 0 (const int) +0:99 Constant: +0:99 1 (const int) +0:100 move second child to first child ( temp int) +0:100 direct index ( temp int) +0:100 i: direct index for structure ( temp 4-component vector of int) +0:100 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:100 Constant: +0:100 0 (const uint) +0:100 direct index ( temp uint) +0:100 'dti' ( in 3-component vector of uint) +0:100 Constant: +0:100 0 (const int) +0:100 Constant: +0:100 1 (const int) +0:100 Constant: +0:100 0 (const int) +0:100 subgroupAnd ( temp int) +0:100 direct index ( temp int) +0:100 i: direct index for structure ( temp 4-component vector of int) +0:100 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:100 Constant: +0:100 0 (const uint) +0:100 direct index ( temp uint) +0:100 'dti' ( in 3-component vector of uint) +0:100 Constant: +0:100 0 (const int) +0:100 Constant: +0:100 1 (const int) +0:100 Constant: +0:100 0 (const int) +0:101 move second child to first child ( temp 2-component vector of int) +0:101 vector swizzle ( temp 2-component vector of int) +0:101 i: direct index for structure ( temp 4-component vector of int) +0:101 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:101 Constant: +0:101 0 (const uint) +0:101 direct index ( temp uint) +0:101 'dti' ( in 3-component vector of uint) +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:101 Sequence +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:101 subgroupAnd ( temp 2-component vector of int) +0:101 vector swizzle ( temp 2-component vector of int) +0:101 i: direct index for structure ( temp 4-component vector of int) +0:101 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:101 Constant: +0:101 0 (const uint) +0:101 direct index ( temp uint) +0:101 'dti' ( in 3-component vector of uint) +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:101 Sequence +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:102 move second child to first child ( temp 3-component vector of int) +0:102 vector swizzle ( temp 3-component vector of int) +0:102 i: direct index for structure ( temp 4-component vector of int) +0:102 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:102 Constant: +0:102 0 (const uint) +0:102 direct index ( temp uint) +0:102 'dti' ( in 3-component vector of uint) +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Sequence +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Constant: +0:102 2 (const int) +0:102 subgroupAnd ( temp 3-component vector of int) +0:102 vector swizzle ( temp 3-component vector of int) +0:102 i: direct index for structure ( temp 4-component vector of int) +0:102 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:102 Constant: +0:102 0 (const uint) +0:102 direct index ( temp uint) +0:102 'dti' ( in 3-component vector of uint) +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Sequence +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Constant: +0:102 2 (const int) +0:104 move second child to first child ( temp 4-component vector of uint) +0:104 u: direct index for structure ( temp 4-component vector of uint) +0:104 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:104 Constant: +0:104 0 (const uint) +0:104 direct index ( temp uint) +0:104 'dti' ( in 3-component vector of uint) +0:104 Constant: +0:104 0 (const int) +0:104 Constant: +0:104 0 (const int) +0:104 subgroupOr ( temp 4-component vector of uint) +0:104 u: direct index for structure ( temp 4-component vector of uint) +0:104 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:104 Constant: +0:104 0 (const uint) +0:104 direct index ( temp uint) +0:104 'dti' ( in 3-component vector of uint) +0:104 Constant: +0:104 0 (const int) +0:104 Constant: +0:104 0 (const int) +0:105 move second child to first child ( temp uint) +0:105 direct index ( temp uint) +0:105 u: direct index for structure ( temp 4-component vector of uint) +0:105 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:105 Constant: +0:105 0 (const uint) +0:105 direct index ( temp uint) +0:105 'dti' ( in 3-component vector of uint) +0:105 Constant: +0:105 0 (const int) +0:105 Constant: +0:105 0 (const int) +0:105 Constant: +0:105 0 (const int) +0:105 subgroupOr ( temp uint) +0:105 direct index ( temp uint) +0:105 u: direct index for structure ( temp 4-component vector of uint) +0:105 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:105 Constant: +0:105 0 (const uint) +0:105 direct index ( temp uint) +0:105 'dti' ( in 3-component vector of uint) +0:105 Constant: +0:105 0 (const int) +0:105 Constant: +0:105 0 (const int) +0:105 Constant: +0:105 0 (const int) +0:106 move second child to first child ( temp 2-component vector of uint) +0:106 vector swizzle ( temp 2-component vector of uint) +0:106 u: direct index for structure ( temp 4-component vector of uint) +0:106 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:106 Constant: +0:106 0 (const uint) +0:106 direct index ( temp uint) +0:106 'dti' ( in 3-component vector of uint) +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 0 (const int) +0:106 Sequence +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 1 (const int) +0:106 subgroupOr ( temp 2-component vector of uint) +0:106 vector swizzle ( temp 2-component vector of uint) +0:106 u: direct index for structure ( temp 4-component vector of uint) +0:106 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:106 Constant: +0:106 0 (const uint) +0:106 direct index ( temp uint) +0:106 'dti' ( in 3-component vector of uint) +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 0 (const int) +0:106 Sequence +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 1 (const int) +0:107 move second child to first child ( temp 3-component vector of uint) +0:107 vector swizzle ( temp 3-component vector of uint) +0:107 u: direct index for structure ( temp 4-component vector of uint) +0:107 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:107 Constant: +0:107 0 (const uint) +0:107 direct index ( temp uint) +0:107 'dti' ( in 3-component vector of uint) +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 0 (const int) +0:107 Sequence +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 1 (const int) +0:107 Constant: +0:107 2 (const int) +0:107 subgroupOr ( temp 3-component vector of uint) +0:107 vector swizzle ( temp 3-component vector of uint) +0:107 u: direct index for structure ( temp 4-component vector of uint) +0:107 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:107 Constant: +0:107 0 (const uint) +0:107 direct index ( temp uint) +0:107 'dti' ( in 3-component vector of uint) +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 0 (const int) +0:107 Sequence +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 1 (const int) +0:107 Constant: +0:107 2 (const int) +0:109 move second child to first child ( temp 4-component vector of int) +0:109 i: direct index for structure ( temp 4-component vector of int) +0:109 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:109 Constant: +0:109 0 (const uint) +0:109 direct index ( temp uint) +0:109 'dti' ( in 3-component vector of uint) +0:109 Constant: +0:109 0 (const int) +0:109 Constant: +0:109 1 (const int) +0:109 subgroupOr ( temp 4-component vector of int) +0:109 i: direct index for structure ( temp 4-component vector of int) +0:109 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:109 Constant: +0:109 0 (const uint) +0:109 direct index ( temp uint) +0:109 'dti' ( in 3-component vector of uint) +0:109 Constant: +0:109 0 (const int) +0:109 Constant: +0:109 1 (const int) +0:110 move second child to first child ( temp int) +0:110 direct index ( temp int) +0:110 i: direct index for structure ( temp 4-component vector of int) +0:110 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:110 Constant: +0:110 0 (const uint) +0:110 direct index ( temp uint) +0:110 'dti' ( in 3-component vector of uint) +0:110 Constant: +0:110 0 (const int) +0:110 Constant: +0:110 1 (const int) +0:110 Constant: +0:110 0 (const int) +0:110 subgroupOr ( temp int) +0:110 direct index ( temp int) +0:110 i: direct index for structure ( temp 4-component vector of int) +0:110 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:110 Constant: +0:110 0 (const uint) +0:110 direct index ( temp uint) +0:110 'dti' ( in 3-component vector of uint) +0:110 Constant: +0:110 0 (const int) +0:110 Constant: +0:110 1 (const int) +0:110 Constant: +0:110 0 (const int) +0:111 move second child to first child ( temp 2-component vector of int) +0:111 vector swizzle ( temp 2-component vector of int) +0:111 i: direct index for structure ( temp 4-component vector of int) +0:111 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:111 Constant: +0:111 0 (const uint) +0:111 direct index ( temp uint) +0:111 'dti' ( in 3-component vector of uint) +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1 (const int) +0:111 Sequence +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1 (const int) +0:111 subgroupOr ( temp 2-component vector of int) +0:111 vector swizzle ( temp 2-component vector of int) +0:111 i: direct index for structure ( temp 4-component vector of int) +0:111 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:111 Constant: +0:111 0 (const uint) +0:111 direct index ( temp uint) +0:111 'dti' ( in 3-component vector of uint) +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1 (const int) +0:111 Sequence +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1 (const int) +0:112 move second child to first child ( temp 3-component vector of int) +0:112 vector swizzle ( temp 3-component vector of int) +0:112 i: direct index for structure ( temp 4-component vector of int) +0:112 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:112 Constant: +0:112 0 (const uint) +0:112 direct index ( temp uint) +0:112 'dti' ( in 3-component vector of uint) +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 1 (const int) +0:112 Sequence +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 1 (const int) +0:112 Constant: +0:112 2 (const int) +0:112 subgroupOr ( temp 3-component vector of int) +0:112 vector swizzle ( temp 3-component vector of int) +0:112 i: direct index for structure ( temp 4-component vector of int) +0:112 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:112 Constant: +0:112 0 (const uint) +0:112 direct index ( temp uint) +0:112 'dti' ( in 3-component vector of uint) +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 1 (const int) +0:112 Sequence +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 1 (const int) +0:112 Constant: +0:112 2 (const int) +0:114 move second child to first child ( temp 4-component vector of uint) +0:114 u: direct index for structure ( temp 4-component vector of uint) +0:114 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:114 Constant: +0:114 0 (const uint) +0:114 direct index ( temp uint) +0:114 'dti' ( in 3-component vector of uint) +0:114 Constant: +0:114 0 (const int) +0:114 Constant: +0:114 0 (const int) +0:114 subgroupXor ( temp 4-component vector of uint) +0:114 u: direct index for structure ( temp 4-component vector of uint) +0:114 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:114 Constant: +0:114 0 (const uint) +0:114 direct index ( temp uint) +0:114 'dti' ( in 3-component vector of uint) +0:114 Constant: +0:114 0 (const int) +0:114 Constant: +0:114 0 (const int) +0:115 move second child to first child ( temp uint) +0:115 direct index ( temp uint) +0:115 u: direct index for structure ( temp 4-component vector of uint) +0:115 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:115 Constant: +0:115 0 (const uint) +0:115 direct index ( temp uint) +0:115 'dti' ( in 3-component vector of uint) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:115 subgroupXor ( temp uint) +0:115 direct index ( temp uint) +0:115 u: direct index for structure ( temp 4-component vector of uint) +0:115 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:115 Constant: +0:115 0 (const uint) +0:115 direct index ( temp uint) +0:115 'dti' ( in 3-component vector of uint) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:116 move second child to first child ( temp 2-component vector of uint) +0:116 vector swizzle ( temp 2-component vector of uint) +0:116 u: direct index for structure ( temp 4-component vector of uint) +0:116 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:116 Constant: +0:116 0 (const uint) +0:116 direct index ( temp uint) +0:116 'dti' ( in 3-component vector of uint) +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 0 (const int) +0:116 Sequence +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 1 (const int) +0:116 subgroupXor ( temp 2-component vector of uint) +0:116 vector swizzle ( temp 2-component vector of uint) +0:116 u: direct index for structure ( temp 4-component vector of uint) +0:116 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:116 Constant: +0:116 0 (const uint) +0:116 direct index ( temp uint) +0:116 'dti' ( in 3-component vector of uint) +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 0 (const int) +0:116 Sequence +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 1 (const int) +0:117 move second child to first child ( temp 3-component vector of uint) +0:117 vector swizzle ( temp 3-component vector of uint) +0:117 u: direct index for structure ( temp 4-component vector of uint) +0:117 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:117 Constant: +0:117 0 (const uint) +0:117 direct index ( temp uint) +0:117 'dti' ( in 3-component vector of uint) +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 0 (const int) +0:117 Sequence +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 1 (const int) +0:117 Constant: +0:117 2 (const int) +0:117 subgroupXor ( temp 3-component vector of uint) +0:117 vector swizzle ( temp 3-component vector of uint) +0:117 u: direct index for structure ( temp 4-component vector of uint) +0:117 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:117 Constant: +0:117 0 (const uint) +0:117 direct index ( temp uint) +0:117 'dti' ( in 3-component vector of uint) +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 0 (const int) +0:117 Sequence +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 1 (const int) +0:117 Constant: +0:117 2 (const int) +0:119 move second child to first child ( temp 4-component vector of int) +0:119 i: direct index for structure ( temp 4-component vector of int) +0:119 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:119 Constant: +0:119 0 (const uint) +0:119 direct index ( temp uint) +0:119 'dti' ( in 3-component vector of uint) +0:119 Constant: +0:119 0 (const int) +0:119 Constant: +0:119 1 (const int) +0:119 subgroupXor ( temp 4-component vector of int) +0:119 i: direct index for structure ( temp 4-component vector of int) +0:119 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:119 Constant: +0:119 0 (const uint) +0:119 direct index ( temp uint) +0:119 'dti' ( in 3-component vector of uint) +0:119 Constant: +0:119 0 (const int) +0:119 Constant: +0:119 1 (const int) +0:120 move second child to first child ( temp int) +0:120 direct index ( temp int) +0:120 i: direct index for structure ( temp 4-component vector of int) +0:120 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:120 Constant: +0:120 0 (const uint) +0:120 direct index ( temp uint) +0:120 'dti' ( in 3-component vector of uint) +0:120 Constant: +0:120 0 (const int) +0:120 Constant: +0:120 1 (const int) +0:120 Constant: +0:120 0 (const int) +0:120 subgroupXor ( temp int) +0:120 direct index ( temp int) +0:120 i: direct index for structure ( temp 4-component vector of int) +0:120 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:120 Constant: +0:120 0 (const uint) +0:120 direct index ( temp uint) +0:120 'dti' ( in 3-component vector of uint) +0:120 Constant: +0:120 0 (const int) +0:120 Constant: +0:120 1 (const int) +0:120 Constant: +0:120 0 (const int) +0:121 move second child to first child ( temp 2-component vector of int) +0:121 vector swizzle ( temp 2-component vector of int) +0:121 i: direct index for structure ( temp 4-component vector of int) +0:121 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:121 Constant: +0:121 0 (const uint) +0:121 direct index ( temp uint) +0:121 'dti' ( in 3-component vector of uint) +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:121 Sequence +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:121 subgroupXor ( temp 2-component vector of int) +0:121 vector swizzle ( temp 2-component vector of int) +0:121 i: direct index for structure ( temp 4-component vector of int) +0:121 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:121 Constant: +0:121 0 (const uint) +0:121 direct index ( temp uint) +0:121 'dti' ( in 3-component vector of uint) +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:121 Sequence +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:122 move second child to first child ( temp 3-component vector of int) +0:122 vector swizzle ( temp 3-component vector of int) +0:122 i: direct index for structure ( temp 4-component vector of int) +0:122 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:122 Constant: +0:122 0 (const uint) +0:122 direct index ( temp uint) +0:122 'dti' ( in 3-component vector of uint) +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Sequence +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Constant: +0:122 2 (const int) +0:122 subgroupXor ( temp 3-component vector of int) +0:122 vector swizzle ( temp 3-component vector of int) +0:122 i: direct index for structure ( temp 4-component vector of int) +0:122 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:122 Constant: +0:122 0 (const uint) +0:122 direct index ( temp uint) +0:122 'dti' ( in 3-component vector of uint) +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Sequence +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Constant: +0:122 2 (const int) +0:124 move second child to first child ( temp uint) +0:124 direct index ( temp uint) +0:124 u: direct index for structure ( temp 4-component vector of uint) +0:124 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:124 Constant: +0:124 0 (const uint) +0:124 direct index ( temp uint) +0:124 'dti' ( in 3-component vector of uint) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 0 (const int) +0:124 subgroupBallotBitCount ( temp uint) +0:124 subgroupBallot ( temp 4-component vector of uint) +0:124 Compare Equal ( temp bool) +0:124 direct index ( temp uint) +0:124 u: direct index for structure ( temp 4-component vector of uint) +0:124 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:124 Constant: +0:124 0 (const uint) +0:124 direct index ( temp uint) +0:124 'dti' ( in 3-component vector of uint) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 0 (const uint) +0:13 Function Definition: CSMain( ( temp void) +0:13 Function Parameters: +0:? Sequence +0:13 move second child to first child ( temp 3-component vector of uint) +0:? 'dti' ( temp 3-component vector of uint) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) +0:13 Function Call: @CSMain(vu3; ( temp void) +0:? 'dti' ( temp 3-component vector of uint) +0:? Linker Objects +0:? 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) + + +Linked compute stage: + + +Shader version: 500 +local_size = (32, 16, 1) +0:? Sequence +0:13 Function Definition: @CSMain(vu3; ( temp void) +0:13 Function Parameters: +0:13 'dti' ( in 3-component vector of uint) +0:? Sequence +0:14 move second child to first child ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:14 subgroupAdd ( temp 4-component vector of uint) +0:14 u: direct index for structure ( temp 4-component vector of uint) +0:14 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:14 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:14 Constant: +0:14 0 (const uint) +0:14 direct index ( temp uint) +0:14 'dti' ( in 3-component vector of uint) +0:14 Constant: +0:14 0 (const int) +0:14 Constant: +0:14 0 (const int) +0:15 move second child to first child ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 subgroupAdd ( temp uint) +0:15 direct index ( temp uint) +0:15 u: direct index for structure ( temp 4-component vector of uint) +0:15 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:15 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:15 Constant: +0:15 0 (const uint) +0:15 direct index ( temp uint) +0:15 'dti' ( in 3-component vector of uint) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:15 Constant: +0:15 0 (const int) +0:16 move second child to first child ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:16 subgroupAdd ( temp 2-component vector of uint) +0:16 vector swizzle ( temp 2-component vector of uint) +0:16 u: direct index for structure ( temp 4-component vector of uint) +0:16 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:16 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:16 Constant: +0:16 0 (const uint) +0:16 direct index ( temp uint) +0:16 'dti' ( in 3-component vector of uint) +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 0 (const int) +0:16 Sequence +0:16 Constant: +0:16 0 (const int) +0:16 Constant: +0:16 1 (const int) +0:17 move second child to first child ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:17 subgroupAdd ( temp 3-component vector of uint) +0:17 vector swizzle ( temp 3-component vector of uint) +0:17 u: direct index for structure ( temp 4-component vector of uint) +0:17 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:17 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:17 Constant: +0:17 0 (const uint) +0:17 direct index ( temp uint) +0:17 'dti' ( in 3-component vector of uint) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Sequence +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 1 (const int) +0:17 Constant: +0:17 2 (const int) +0:19 move second child to first child ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:19 subgroupAdd ( temp 4-component vector of int) +0:19 i: direct index for structure ( temp 4-component vector of int) +0:19 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:19 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:19 Constant: +0:19 0 (const uint) +0:19 direct index ( temp uint) +0:19 'dti' ( in 3-component vector of uint) +0:19 Constant: +0:19 0 (const int) +0:19 Constant: +0:19 1 (const int) +0:20 move second child to first child ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:20 subgroupAdd ( temp int) +0:20 direct index ( temp int) +0:20 i: direct index for structure ( temp 4-component vector of int) +0:20 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:20 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:20 Constant: +0:20 0 (const uint) +0:20 direct index ( temp uint) +0:20 'dti' ( in 3-component vector of uint) +0:20 Constant: +0:20 0 (const int) +0:20 Constant: +0:20 1 (const int) +0:20 Constant: +0:20 0 (const int) +0:21 move second child to first child ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 subgroupAdd ( temp 2-component vector of int) +0:21 vector swizzle ( temp 2-component vector of int) +0:21 i: direct index for structure ( temp 4-component vector of int) +0:21 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:21 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:21 Constant: +0:21 0 (const uint) +0:21 direct index ( temp uint) +0:21 'dti' ( in 3-component vector of uint) +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:21 Sequence +0:21 Constant: +0:21 0 (const int) +0:21 Constant: +0:21 1 (const int) +0:22 move second child to first child ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:22 subgroupAdd ( temp 3-component vector of int) +0:22 vector swizzle ( temp 3-component vector of int) +0:22 i: direct index for structure ( temp 4-component vector of int) +0:22 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:22 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:22 Constant: +0:22 0 (const uint) +0:22 direct index ( temp uint) +0:22 'dti' ( in 3-component vector of uint) +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Sequence +0:22 Constant: +0:22 0 (const int) +0:22 Constant: +0:22 1 (const int) +0:22 Constant: +0:22 2 (const int) +0:24 move second child to first child ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:24 subgroupAdd ( temp 4-component vector of float) +0:24 f: direct index for structure ( temp 4-component vector of float) +0:24 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:24 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:24 Constant: +0:24 0 (const uint) +0:24 direct index ( temp uint) +0:24 'dti' ( in 3-component vector of uint) +0:24 Constant: +0:24 0 (const int) +0:24 Constant: +0:24 2 (const int) +0:25 move second child to first child ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:25 subgroupAdd ( temp float) +0:25 direct index ( temp float) +0:25 f: direct index for structure ( temp 4-component vector of float) +0:25 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:25 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:25 Constant: +0:25 0 (const uint) +0:25 direct index ( temp uint) +0:25 'dti' ( in 3-component vector of uint) +0:25 Constant: +0:25 0 (const int) +0:25 Constant: +0:25 2 (const int) +0:25 Constant: +0:25 0 (const int) +0:26 move second child to first child ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:26 subgroupAdd ( temp 2-component vector of float) +0:26 vector swizzle ( temp 2-component vector of float) +0:26 f: direct index for structure ( temp 4-component vector of float) +0:26 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:26 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:26 Constant: +0:26 0 (const uint) +0:26 direct index ( temp uint) +0:26 'dti' ( in 3-component vector of uint) +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 2 (const int) +0:26 Sequence +0:26 Constant: +0:26 0 (const int) +0:26 Constant: +0:26 1 (const int) +0:27 move second child to first child ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 subgroupAdd ( temp 3-component vector of float) +0:27 vector swizzle ( temp 3-component vector of float) +0:27 f: direct index for structure ( temp 4-component vector of float) +0:27 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:27 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:27 Constant: +0:27 0 (const uint) +0:27 direct index ( temp uint) +0:27 'dti' ( in 3-component vector of uint) +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 2 (const int) +0:27 Sequence +0:27 Constant: +0:27 0 (const int) +0:27 Constant: +0:27 1 (const int) +0:27 Constant: +0:27 2 (const int) +0:29 move second child to first child ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:29 subgroupAdd ( temp 4-component vector of double) +0:29 d: direct index for structure ( temp 4-component vector of double) +0:29 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:29 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:29 Constant: +0:29 0 (const uint) +0:29 direct index ( temp uint) +0:29 'dti' ( in 3-component vector of uint) +0:29 Constant: +0:29 0 (const int) +0:29 Constant: +0:29 3 (const int) +0:30 move second child to first child ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:30 subgroupAdd ( temp double) +0:30 direct index ( temp double) +0:30 d: direct index for structure ( temp 4-component vector of double) +0:30 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:30 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:30 Constant: +0:30 0 (const uint) +0:30 direct index ( temp uint) +0:30 'dti' ( in 3-component vector of uint) +0:30 Constant: +0:30 0 (const int) +0:30 Constant: +0:30 3 (const int) +0:30 Constant: +0:30 0 (const int) +0:31 move second child to first child ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:31 subgroupAdd ( temp 2-component vector of double) +0:31 vector swizzle ( temp 2-component vector of double) +0:31 d: direct index for structure ( temp 4-component vector of double) +0:31 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:31 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:31 Constant: +0:31 0 (const uint) +0:31 direct index ( temp uint) +0:31 'dti' ( in 3-component vector of uint) +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 3 (const int) +0:31 Sequence +0:31 Constant: +0:31 0 (const int) +0:31 Constant: +0:31 1 (const int) +0:32 move second child to first child ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:32 subgroupAdd ( temp 3-component vector of double) +0:32 vector swizzle ( temp 3-component vector of double) +0:32 d: direct index for structure ( temp 4-component vector of double) +0:32 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:32 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:32 Constant: +0:32 0 (const uint) +0:32 direct index ( temp uint) +0:32 'dti' ( in 3-component vector of uint) +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 3 (const int) +0:32 Sequence +0:32 Constant: +0:32 0 (const int) +0:32 Constant: +0:32 1 (const int) +0:32 Constant: +0:32 2 (const int) +0:34 move second child to first child ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:34 subgroupMul ( temp 4-component vector of uint) +0:34 u: direct index for structure ( temp 4-component vector of uint) +0:34 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:34 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:34 Constant: +0:34 0 (const uint) +0:34 direct index ( temp uint) +0:34 'dti' ( in 3-component vector of uint) +0:34 Constant: +0:34 0 (const int) +0:34 Constant: +0:34 0 (const int) +0:35 move second child to first child ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 subgroupMul ( temp uint) +0:35 direct index ( temp uint) +0:35 u: direct index for structure ( temp 4-component vector of uint) +0:35 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:35 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:35 Constant: +0:35 0 (const uint) +0:35 direct index ( temp uint) +0:35 'dti' ( in 3-component vector of uint) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:35 Constant: +0:35 0 (const int) +0:36 move second child to first child ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:36 subgroupMul ( temp 2-component vector of uint) +0:36 vector swizzle ( temp 2-component vector of uint) +0:36 u: direct index for structure ( temp 4-component vector of uint) +0:36 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:36 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:36 Constant: +0:36 0 (const uint) +0:36 direct index ( temp uint) +0:36 'dti' ( in 3-component vector of uint) +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 0 (const int) +0:36 Sequence +0:36 Constant: +0:36 0 (const int) +0:36 Constant: +0:36 1 (const int) +0:37 move second child to first child ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:37 subgroupMul ( temp 3-component vector of uint) +0:37 vector swizzle ( temp 3-component vector of uint) +0:37 u: direct index for structure ( temp 4-component vector of uint) +0:37 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:37 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:37 Constant: +0:37 0 (const uint) +0:37 direct index ( temp uint) +0:37 'dti' ( in 3-component vector of uint) +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 0 (const int) +0:37 Sequence +0:37 Constant: +0:37 0 (const int) +0:37 Constant: +0:37 1 (const int) +0:37 Constant: +0:37 2 (const int) +0:39 move second child to first child ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:39 subgroupMul ( temp 4-component vector of int) +0:39 i: direct index for structure ( temp 4-component vector of int) +0:39 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:39 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:39 Constant: +0:39 0 (const uint) +0:39 direct index ( temp uint) +0:39 'dti' ( in 3-component vector of uint) +0:39 Constant: +0:39 0 (const int) +0:39 Constant: +0:39 1 (const int) +0:40 move second child to first child ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:40 subgroupMul ( temp int) +0:40 direct index ( temp int) +0:40 i: direct index for structure ( temp 4-component vector of int) +0:40 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:40 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:40 Constant: +0:40 0 (const uint) +0:40 direct index ( temp uint) +0:40 'dti' ( in 3-component vector of uint) +0:40 Constant: +0:40 0 (const int) +0:40 Constant: +0:40 1 (const int) +0:40 Constant: +0:40 0 (const int) +0:41 move second child to first child ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 subgroupMul ( temp 2-component vector of int) +0:41 vector swizzle ( temp 2-component vector of int) +0:41 i: direct index for structure ( temp 4-component vector of int) +0:41 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:41 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:41 Constant: +0:41 0 (const uint) +0:41 direct index ( temp uint) +0:41 'dti' ( in 3-component vector of uint) +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:41 Sequence +0:41 Constant: +0:41 0 (const int) +0:41 Constant: +0:41 1 (const int) +0:42 move second child to first child ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:42 subgroupMul ( temp 3-component vector of int) +0:42 vector swizzle ( temp 3-component vector of int) +0:42 i: direct index for structure ( temp 4-component vector of int) +0:42 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:42 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:42 Constant: +0:42 0 (const uint) +0:42 direct index ( temp uint) +0:42 'dti' ( in 3-component vector of uint) +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Sequence +0:42 Constant: +0:42 0 (const int) +0:42 Constant: +0:42 1 (const int) +0:42 Constant: +0:42 2 (const int) +0:44 move second child to first child ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:44 subgroupMul ( temp 4-component vector of float) +0:44 f: direct index for structure ( temp 4-component vector of float) +0:44 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:44 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:44 Constant: +0:44 0 (const uint) +0:44 direct index ( temp uint) +0:44 'dti' ( in 3-component vector of uint) +0:44 Constant: +0:44 0 (const int) +0:44 Constant: +0:44 2 (const int) +0:45 move second child to first child ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:45 subgroupMul ( temp float) +0:45 direct index ( temp float) +0:45 f: direct index for structure ( temp 4-component vector of float) +0:45 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:45 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:45 Constant: +0:45 0 (const uint) +0:45 direct index ( temp uint) +0:45 'dti' ( in 3-component vector of uint) +0:45 Constant: +0:45 0 (const int) +0:45 Constant: +0:45 2 (const int) +0:45 Constant: +0:45 0 (const int) +0:46 move second child to first child ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:46 subgroupMul ( temp 2-component vector of float) +0:46 vector swizzle ( temp 2-component vector of float) +0:46 f: direct index for structure ( temp 4-component vector of float) +0:46 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:46 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:46 Constant: +0:46 0 (const uint) +0:46 direct index ( temp uint) +0:46 'dti' ( in 3-component vector of uint) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 2 (const int) +0:46 Sequence +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 1 (const int) +0:47 move second child to first child ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 subgroupMul ( temp 3-component vector of float) +0:47 vector swizzle ( temp 3-component vector of float) +0:47 f: direct index for structure ( temp 4-component vector of float) +0:47 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:47 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:47 Constant: +0:47 0 (const uint) +0:47 direct index ( temp uint) +0:47 'dti' ( in 3-component vector of uint) +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 2 (const int) +0:47 Sequence +0:47 Constant: +0:47 0 (const int) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 2 (const int) +0:49 move second child to first child ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:49 subgroupMul ( temp 4-component vector of double) +0:49 d: direct index for structure ( temp 4-component vector of double) +0:49 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:49 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:49 Constant: +0:49 0 (const uint) +0:49 direct index ( temp uint) +0:49 'dti' ( in 3-component vector of uint) +0:49 Constant: +0:49 0 (const int) +0:49 Constant: +0:49 3 (const int) +0:50 move second child to first child ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:50 subgroupMul ( temp double) +0:50 direct index ( temp double) +0:50 d: direct index for structure ( temp 4-component vector of double) +0:50 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:50 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:50 Constant: +0:50 0 (const uint) +0:50 direct index ( temp uint) +0:50 'dti' ( in 3-component vector of uint) +0:50 Constant: +0:50 0 (const int) +0:50 Constant: +0:50 3 (const int) +0:50 Constant: +0:50 0 (const int) +0:51 move second child to first child ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:51 subgroupMul ( temp 2-component vector of double) +0:51 vector swizzle ( temp 2-component vector of double) +0:51 d: direct index for structure ( temp 4-component vector of double) +0:51 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:51 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:51 Constant: +0:51 0 (const uint) +0:51 direct index ( temp uint) +0:51 'dti' ( in 3-component vector of uint) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:51 Sequence +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 1 (const int) +0:52 move second child to first child ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:52 subgroupMul ( temp 3-component vector of double) +0:52 vector swizzle ( temp 3-component vector of double) +0:52 d: direct index for structure ( temp 4-component vector of double) +0:52 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:52 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:52 Constant: +0:52 0 (const uint) +0:52 direct index ( temp uint) +0:52 'dti' ( in 3-component vector of uint) +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 3 (const int) +0:52 Sequence +0:52 Constant: +0:52 0 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 2 (const int) +0:54 move second child to first child ( temp 4-component vector of uint) +0:54 u: direct index for structure ( temp 4-component vector of uint) +0:54 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:54 Constant: +0:54 0 (const uint) +0:54 direct index ( temp uint) +0:54 'dti' ( in 3-component vector of uint) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:54 subgroupMin ( temp 4-component vector of uint) +0:54 u: direct index for structure ( temp 4-component vector of uint) +0:54 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:54 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:54 Constant: +0:54 0 (const uint) +0:54 direct index ( temp uint) +0:54 'dti' ( in 3-component vector of uint) +0:54 Constant: +0:54 0 (const int) +0:54 Constant: +0:54 0 (const int) +0:55 move second child to first child ( temp uint) +0:55 direct index ( temp uint) +0:55 u: direct index for structure ( temp 4-component vector of uint) +0:55 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:55 Constant: +0:55 0 (const uint) +0:55 direct index ( temp uint) +0:55 'dti' ( in 3-component vector of uint) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 subgroupMin ( temp uint) +0:55 direct index ( temp uint) +0:55 u: direct index for structure ( temp 4-component vector of uint) +0:55 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:55 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:55 Constant: +0:55 0 (const uint) +0:55 direct index ( temp uint) +0:55 'dti' ( in 3-component vector of uint) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:55 Constant: +0:55 0 (const int) +0:56 move second child to first child ( temp 2-component vector of uint) +0:56 vector swizzle ( temp 2-component vector of uint) +0:56 u: direct index for structure ( temp 4-component vector of uint) +0:56 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:56 Constant: +0:56 0 (const uint) +0:56 direct index ( temp uint) +0:56 'dti' ( in 3-component vector of uint) +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 0 (const int) +0:56 Sequence +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 1 (const int) +0:56 subgroupMin ( temp 2-component vector of uint) +0:56 vector swizzle ( temp 2-component vector of uint) +0:56 u: direct index for structure ( temp 4-component vector of uint) +0:56 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:56 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:56 Constant: +0:56 0 (const uint) +0:56 direct index ( temp uint) +0:56 'dti' ( in 3-component vector of uint) +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 0 (const int) +0:56 Sequence +0:56 Constant: +0:56 0 (const int) +0:56 Constant: +0:56 1 (const int) +0:57 move second child to first child ( temp 3-component vector of uint) +0:57 vector swizzle ( temp 3-component vector of uint) +0:57 u: direct index for structure ( temp 4-component vector of uint) +0:57 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:57 Constant: +0:57 0 (const uint) +0:57 direct index ( temp uint) +0:57 'dti' ( in 3-component vector of uint) +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 0 (const int) +0:57 Sequence +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 1 (const int) +0:57 Constant: +0:57 2 (const int) +0:57 subgroupMin ( temp 3-component vector of uint) +0:57 vector swizzle ( temp 3-component vector of uint) +0:57 u: direct index for structure ( temp 4-component vector of uint) +0:57 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:57 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:57 Constant: +0:57 0 (const uint) +0:57 direct index ( temp uint) +0:57 'dti' ( in 3-component vector of uint) +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 0 (const int) +0:57 Sequence +0:57 Constant: +0:57 0 (const int) +0:57 Constant: +0:57 1 (const int) +0:57 Constant: +0:57 2 (const int) +0:59 move second child to first child ( temp 4-component vector of int) +0:59 i: direct index for structure ( temp 4-component vector of int) +0:59 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:59 Constant: +0:59 0 (const uint) +0:59 direct index ( temp uint) +0:59 'dti' ( in 3-component vector of uint) +0:59 Constant: +0:59 0 (const int) +0:59 Constant: +0:59 1 (const int) +0:59 subgroupMin ( temp 4-component vector of int) +0:59 i: direct index for structure ( temp 4-component vector of int) +0:59 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:59 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:59 Constant: +0:59 0 (const uint) +0:59 direct index ( temp uint) +0:59 'dti' ( in 3-component vector of uint) +0:59 Constant: +0:59 0 (const int) +0:59 Constant: +0:59 1 (const int) +0:60 move second child to first child ( temp int) +0:60 direct index ( temp int) +0:60 i: direct index for structure ( temp 4-component vector of int) +0:60 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:60 Constant: +0:60 0 (const uint) +0:60 direct index ( temp uint) +0:60 'dti' ( in 3-component vector of uint) +0:60 Constant: +0:60 0 (const int) +0:60 Constant: +0:60 1 (const int) +0:60 Constant: +0:60 0 (const int) +0:60 subgroupMin ( temp int) +0:60 direct index ( temp int) +0:60 i: direct index for structure ( temp 4-component vector of int) +0:60 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:60 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:60 Constant: +0:60 0 (const uint) +0:60 direct index ( temp uint) +0:60 'dti' ( in 3-component vector of uint) +0:60 Constant: +0:60 0 (const int) +0:60 Constant: +0:60 1 (const int) +0:60 Constant: +0:60 0 (const int) +0:61 move second child to first child ( temp 2-component vector of int) +0:61 vector swizzle ( temp 2-component vector of int) +0:61 i: direct index for structure ( temp 4-component vector of int) +0:61 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:61 Constant: +0:61 0 (const uint) +0:61 direct index ( temp uint) +0:61 'dti' ( in 3-component vector of uint) +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 Sequence +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 subgroupMin ( temp 2-component vector of int) +0:61 vector swizzle ( temp 2-component vector of int) +0:61 i: direct index for structure ( temp 4-component vector of int) +0:61 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:61 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:61 Constant: +0:61 0 (const uint) +0:61 direct index ( temp uint) +0:61 'dti' ( in 3-component vector of uint) +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:61 Sequence +0:61 Constant: +0:61 0 (const int) +0:61 Constant: +0:61 1 (const int) +0:62 move second child to first child ( temp 3-component vector of int) +0:62 vector swizzle ( temp 3-component vector of int) +0:62 i: direct index for structure ( temp 4-component vector of int) +0:62 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:62 Constant: +0:62 0 (const uint) +0:62 direct index ( temp uint) +0:62 'dti' ( in 3-component vector of uint) +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Sequence +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Constant: +0:62 2 (const int) +0:62 subgroupMin ( temp 3-component vector of int) +0:62 vector swizzle ( temp 3-component vector of int) +0:62 i: direct index for structure ( temp 4-component vector of int) +0:62 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:62 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:62 Constant: +0:62 0 (const uint) +0:62 direct index ( temp uint) +0:62 'dti' ( in 3-component vector of uint) +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Sequence +0:62 Constant: +0:62 0 (const int) +0:62 Constant: +0:62 1 (const int) +0:62 Constant: +0:62 2 (const int) +0:64 move second child to first child ( temp 4-component vector of float) +0:64 f: direct index for structure ( temp 4-component vector of float) +0:64 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:64 Constant: +0:64 0 (const uint) +0:64 direct index ( temp uint) +0:64 'dti' ( in 3-component vector of uint) +0:64 Constant: +0:64 0 (const int) +0:64 Constant: +0:64 2 (const int) +0:64 subgroupMin ( temp 4-component vector of float) +0:64 f: direct index for structure ( temp 4-component vector of float) +0:64 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:64 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:64 Constant: +0:64 0 (const uint) +0:64 direct index ( temp uint) +0:64 'dti' ( in 3-component vector of uint) +0:64 Constant: +0:64 0 (const int) +0:64 Constant: +0:64 2 (const int) +0:65 move second child to first child ( temp float) +0:65 direct index ( temp float) +0:65 f: direct index for structure ( temp 4-component vector of float) +0:65 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:65 Constant: +0:65 0 (const uint) +0:65 direct index ( temp uint) +0:65 'dti' ( in 3-component vector of uint) +0:65 Constant: +0:65 0 (const int) +0:65 Constant: +0:65 2 (const int) +0:65 Constant: +0:65 0 (const int) +0:65 subgroupMin ( temp float) +0:65 direct index ( temp float) +0:65 f: direct index for structure ( temp 4-component vector of float) +0:65 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:65 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:65 Constant: +0:65 0 (const uint) +0:65 direct index ( temp uint) +0:65 'dti' ( in 3-component vector of uint) +0:65 Constant: +0:65 0 (const int) +0:65 Constant: +0:65 2 (const int) +0:65 Constant: +0:65 0 (const int) +0:66 move second child to first child ( temp 2-component vector of float) +0:66 vector swizzle ( temp 2-component vector of float) +0:66 f: direct index for structure ( temp 4-component vector of float) +0:66 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:66 Constant: +0:66 0 (const uint) +0:66 direct index ( temp uint) +0:66 'dti' ( in 3-component vector of uint) +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 2 (const int) +0:66 Sequence +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 1 (const int) +0:66 subgroupMin ( temp 2-component vector of float) +0:66 vector swizzle ( temp 2-component vector of float) +0:66 f: direct index for structure ( temp 4-component vector of float) +0:66 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:66 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:66 Constant: +0:66 0 (const uint) +0:66 direct index ( temp uint) +0:66 'dti' ( in 3-component vector of uint) +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 2 (const int) +0:66 Sequence +0:66 Constant: +0:66 0 (const int) +0:66 Constant: +0:66 1 (const int) +0:67 move second child to first child ( temp 3-component vector of float) +0:67 vector swizzle ( temp 3-component vector of float) +0:67 f: direct index for structure ( temp 4-component vector of float) +0:67 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:67 Constant: +0:67 0 (const uint) +0:67 direct index ( temp uint) +0:67 'dti' ( in 3-component vector of uint) +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 Sequence +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 1 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 subgroupMin ( temp 3-component vector of float) +0:67 vector swizzle ( temp 3-component vector of float) +0:67 f: direct index for structure ( temp 4-component vector of float) +0:67 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:67 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:67 Constant: +0:67 0 (const uint) +0:67 direct index ( temp uint) +0:67 'dti' ( in 3-component vector of uint) +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 2 (const int) +0:67 Sequence +0:67 Constant: +0:67 0 (const int) +0:67 Constant: +0:67 1 (const int) +0:67 Constant: +0:67 2 (const int) +0:69 move second child to first child ( temp 4-component vector of double) +0:69 d: direct index for structure ( temp 4-component vector of double) +0:69 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:69 Constant: +0:69 0 (const uint) +0:69 direct index ( temp uint) +0:69 'dti' ( in 3-component vector of uint) +0:69 Constant: +0:69 0 (const int) +0:69 Constant: +0:69 3 (const int) +0:69 subgroupMin ( temp 4-component vector of double) +0:69 d: direct index for structure ( temp 4-component vector of double) +0:69 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:69 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:69 Constant: +0:69 0 (const uint) +0:69 direct index ( temp uint) +0:69 'dti' ( in 3-component vector of uint) +0:69 Constant: +0:69 0 (const int) +0:69 Constant: +0:69 3 (const int) +0:70 move second child to first child ( temp double) +0:70 direct index ( temp double) +0:70 d: direct index for structure ( temp 4-component vector of double) +0:70 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:70 Constant: +0:70 0 (const uint) +0:70 direct index ( temp uint) +0:70 'dti' ( in 3-component vector of uint) +0:70 Constant: +0:70 0 (const int) +0:70 Constant: +0:70 3 (const int) +0:70 Constant: +0:70 0 (const int) +0:70 subgroupMin ( temp double) +0:70 direct index ( temp double) +0:70 d: direct index for structure ( temp 4-component vector of double) +0:70 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:70 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:70 Constant: +0:70 0 (const uint) +0:70 direct index ( temp uint) +0:70 'dti' ( in 3-component vector of uint) +0:70 Constant: +0:70 0 (const int) +0:70 Constant: +0:70 3 (const int) +0:70 Constant: +0:70 0 (const int) +0:71 move second child to first child ( temp 2-component vector of double) +0:71 vector swizzle ( temp 2-component vector of double) +0:71 d: direct index for structure ( temp 4-component vector of double) +0:71 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:71 Constant: +0:71 0 (const uint) +0:71 direct index ( temp uint) +0:71 'dti' ( in 3-component vector of uint) +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 3 (const int) +0:71 Sequence +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 1 (const int) +0:71 subgroupMin ( temp 2-component vector of double) +0:71 vector swizzle ( temp 2-component vector of double) +0:71 d: direct index for structure ( temp 4-component vector of double) +0:71 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:71 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:71 Constant: +0:71 0 (const uint) +0:71 direct index ( temp uint) +0:71 'dti' ( in 3-component vector of uint) +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 3 (const int) +0:71 Sequence +0:71 Constant: +0:71 0 (const int) +0:71 Constant: +0:71 1 (const int) +0:72 move second child to first child ( temp 3-component vector of double) +0:72 vector swizzle ( temp 3-component vector of double) +0:72 d: direct index for structure ( temp 4-component vector of double) +0:72 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:72 Constant: +0:72 0 (const uint) +0:72 direct index ( temp uint) +0:72 'dti' ( in 3-component vector of uint) +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 3 (const int) +0:72 Sequence +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 1 (const int) +0:72 Constant: +0:72 2 (const int) +0:72 subgroupMin ( temp 3-component vector of double) +0:72 vector swizzle ( temp 3-component vector of double) +0:72 d: direct index for structure ( temp 4-component vector of double) +0:72 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:72 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:72 Constant: +0:72 0 (const uint) +0:72 direct index ( temp uint) +0:72 'dti' ( in 3-component vector of uint) +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 3 (const int) +0:72 Sequence +0:72 Constant: +0:72 0 (const int) +0:72 Constant: +0:72 1 (const int) +0:72 Constant: +0:72 2 (const int) +0:74 move second child to first child ( temp 4-component vector of uint) +0:74 u: direct index for structure ( temp 4-component vector of uint) +0:74 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:74 Constant: +0:74 0 (const uint) +0:74 direct index ( temp uint) +0:74 'dti' ( in 3-component vector of uint) +0:74 Constant: +0:74 0 (const int) +0:74 Constant: +0:74 0 (const int) +0:74 subgroupMax ( temp 4-component vector of uint) +0:74 u: direct index for structure ( temp 4-component vector of uint) +0:74 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:74 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:74 Constant: +0:74 0 (const uint) +0:74 direct index ( temp uint) +0:74 'dti' ( in 3-component vector of uint) +0:74 Constant: +0:74 0 (const int) +0:74 Constant: +0:74 0 (const int) +0:75 move second child to first child ( temp uint) +0:75 direct index ( temp uint) +0:75 u: direct index for structure ( temp 4-component vector of uint) +0:75 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:75 Constant: +0:75 0 (const uint) +0:75 direct index ( temp uint) +0:75 'dti' ( in 3-component vector of uint) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 subgroupMax ( temp uint) +0:75 direct index ( temp uint) +0:75 u: direct index for structure ( temp 4-component vector of uint) +0:75 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:75 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:75 Constant: +0:75 0 (const uint) +0:75 direct index ( temp uint) +0:75 'dti' ( in 3-component vector of uint) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:75 Constant: +0:75 0 (const int) +0:76 move second child to first child ( temp 2-component vector of uint) +0:76 vector swizzle ( temp 2-component vector of uint) +0:76 u: direct index for structure ( temp 4-component vector of uint) +0:76 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:76 Constant: +0:76 0 (const uint) +0:76 direct index ( temp uint) +0:76 'dti' ( in 3-component vector of uint) +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 0 (const int) +0:76 Sequence +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 1 (const int) +0:76 subgroupMax ( temp 2-component vector of uint) +0:76 vector swizzle ( temp 2-component vector of uint) +0:76 u: direct index for structure ( temp 4-component vector of uint) +0:76 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:76 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:76 Constant: +0:76 0 (const uint) +0:76 direct index ( temp uint) +0:76 'dti' ( in 3-component vector of uint) +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 0 (const int) +0:76 Sequence +0:76 Constant: +0:76 0 (const int) +0:76 Constant: +0:76 1 (const int) +0:77 move second child to first child ( temp 3-component vector of uint) +0:77 vector swizzle ( temp 3-component vector of uint) +0:77 u: direct index for structure ( temp 4-component vector of uint) +0:77 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:77 Constant: +0:77 0 (const uint) +0:77 direct index ( temp uint) +0:77 'dti' ( in 3-component vector of uint) +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 0 (const int) +0:77 Sequence +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 1 (const int) +0:77 Constant: +0:77 2 (const int) +0:77 subgroupMax ( temp 3-component vector of uint) +0:77 vector swizzle ( temp 3-component vector of uint) +0:77 u: direct index for structure ( temp 4-component vector of uint) +0:77 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:77 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:77 Constant: +0:77 0 (const uint) +0:77 direct index ( temp uint) +0:77 'dti' ( in 3-component vector of uint) +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 0 (const int) +0:77 Sequence +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 1 (const int) +0:77 Constant: +0:77 2 (const int) +0:79 move second child to first child ( temp 4-component vector of int) +0:79 i: direct index for structure ( temp 4-component vector of int) +0:79 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:79 Constant: +0:79 0 (const uint) +0:79 direct index ( temp uint) +0:79 'dti' ( in 3-component vector of uint) +0:79 Constant: +0:79 0 (const int) +0:79 Constant: +0:79 1 (const int) +0:79 subgroupMax ( temp 4-component vector of int) +0:79 i: direct index for structure ( temp 4-component vector of int) +0:79 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:79 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:79 Constant: +0:79 0 (const uint) +0:79 direct index ( temp uint) +0:79 'dti' ( in 3-component vector of uint) +0:79 Constant: +0:79 0 (const int) +0:79 Constant: +0:79 1 (const int) +0:80 move second child to first child ( temp int) +0:80 direct index ( temp int) +0:80 i: direct index for structure ( temp 4-component vector of int) +0:80 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:80 Constant: +0:80 0 (const uint) +0:80 direct index ( temp uint) +0:80 'dti' ( in 3-component vector of uint) +0:80 Constant: +0:80 0 (const int) +0:80 Constant: +0:80 1 (const int) +0:80 Constant: +0:80 0 (const int) +0:80 subgroupMax ( temp int) +0:80 direct index ( temp int) +0:80 i: direct index for structure ( temp 4-component vector of int) +0:80 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:80 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:80 Constant: +0:80 0 (const uint) +0:80 direct index ( temp uint) +0:80 'dti' ( in 3-component vector of uint) +0:80 Constant: +0:80 0 (const int) +0:80 Constant: +0:80 1 (const int) +0:80 Constant: +0:80 0 (const int) +0:81 move second child to first child ( temp 2-component vector of int) +0:81 vector swizzle ( temp 2-component vector of int) +0:81 i: direct index for structure ( temp 4-component vector of int) +0:81 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:81 Constant: +0:81 0 (const uint) +0:81 direct index ( temp uint) +0:81 'dti' ( in 3-component vector of uint) +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 Sequence +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 subgroupMax ( temp 2-component vector of int) +0:81 vector swizzle ( temp 2-component vector of int) +0:81 i: direct index for structure ( temp 4-component vector of int) +0:81 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:81 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:81 Constant: +0:81 0 (const uint) +0:81 direct index ( temp uint) +0:81 'dti' ( in 3-component vector of uint) +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:81 Sequence +0:81 Constant: +0:81 0 (const int) +0:81 Constant: +0:81 1 (const int) +0:82 move second child to first child ( temp 3-component vector of int) +0:82 vector swizzle ( temp 3-component vector of int) +0:82 i: direct index for structure ( temp 4-component vector of int) +0:82 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:82 Constant: +0:82 0 (const uint) +0:82 direct index ( temp uint) +0:82 'dti' ( in 3-component vector of uint) +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Sequence +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Constant: +0:82 2 (const int) +0:82 subgroupMax ( temp 3-component vector of int) +0:82 vector swizzle ( temp 3-component vector of int) +0:82 i: direct index for structure ( temp 4-component vector of int) +0:82 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:82 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:82 Constant: +0:82 0 (const uint) +0:82 direct index ( temp uint) +0:82 'dti' ( in 3-component vector of uint) +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Sequence +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 1 (const int) +0:82 Constant: +0:82 2 (const int) +0:84 move second child to first child ( temp 4-component vector of float) +0:84 f: direct index for structure ( temp 4-component vector of float) +0:84 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:84 Constant: +0:84 0 (const uint) +0:84 direct index ( temp uint) +0:84 'dti' ( in 3-component vector of uint) +0:84 Constant: +0:84 0 (const int) +0:84 Constant: +0:84 2 (const int) +0:84 subgroupMax ( temp 4-component vector of float) +0:84 f: direct index for structure ( temp 4-component vector of float) +0:84 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:84 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:84 Constant: +0:84 0 (const uint) +0:84 direct index ( temp uint) +0:84 'dti' ( in 3-component vector of uint) +0:84 Constant: +0:84 0 (const int) +0:84 Constant: +0:84 2 (const int) +0:85 move second child to first child ( temp float) +0:85 direct index ( temp float) +0:85 f: direct index for structure ( temp 4-component vector of float) +0:85 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:85 Constant: +0:85 0 (const uint) +0:85 direct index ( temp uint) +0:85 'dti' ( in 3-component vector of uint) +0:85 Constant: +0:85 0 (const int) +0:85 Constant: +0:85 2 (const int) +0:85 Constant: +0:85 0 (const int) +0:85 subgroupMax ( temp float) +0:85 direct index ( temp float) +0:85 f: direct index for structure ( temp 4-component vector of float) +0:85 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:85 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:85 Constant: +0:85 0 (const uint) +0:85 direct index ( temp uint) +0:85 'dti' ( in 3-component vector of uint) +0:85 Constant: +0:85 0 (const int) +0:85 Constant: +0:85 2 (const int) +0:85 Constant: +0:85 0 (const int) +0:86 move second child to first child ( temp 2-component vector of float) +0:86 vector swizzle ( temp 2-component vector of float) +0:86 f: direct index for structure ( temp 4-component vector of float) +0:86 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:86 Constant: +0:86 0 (const uint) +0:86 direct index ( temp uint) +0:86 'dti' ( in 3-component vector of uint) +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 2 (const int) +0:86 Sequence +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 1 (const int) +0:86 subgroupMax ( temp 2-component vector of float) +0:86 vector swizzle ( temp 2-component vector of float) +0:86 f: direct index for structure ( temp 4-component vector of float) +0:86 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:86 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:86 Constant: +0:86 0 (const uint) +0:86 direct index ( temp uint) +0:86 'dti' ( in 3-component vector of uint) +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 2 (const int) +0:86 Sequence +0:86 Constant: +0:86 0 (const int) +0:86 Constant: +0:86 1 (const int) +0:87 move second child to first child ( temp 3-component vector of float) +0:87 vector swizzle ( temp 3-component vector of float) +0:87 f: direct index for structure ( temp 4-component vector of float) +0:87 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:87 Constant: +0:87 0 (const uint) +0:87 direct index ( temp uint) +0:87 'dti' ( in 3-component vector of uint) +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 Sequence +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 1 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 subgroupMax ( temp 3-component vector of float) +0:87 vector swizzle ( temp 3-component vector of float) +0:87 f: direct index for structure ( temp 4-component vector of float) +0:87 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:87 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:87 Constant: +0:87 0 (const uint) +0:87 direct index ( temp uint) +0:87 'dti' ( in 3-component vector of uint) +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 2 (const int) +0:87 Sequence +0:87 Constant: +0:87 0 (const int) +0:87 Constant: +0:87 1 (const int) +0:87 Constant: +0:87 2 (const int) +0:89 move second child to first child ( temp 4-component vector of double) +0:89 d: direct index for structure ( temp 4-component vector of double) +0:89 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:89 Constant: +0:89 0 (const uint) +0:89 direct index ( temp uint) +0:89 'dti' ( in 3-component vector of uint) +0:89 Constant: +0:89 0 (const int) +0:89 Constant: +0:89 3 (const int) +0:89 subgroupMax ( temp 4-component vector of double) +0:89 d: direct index for structure ( temp 4-component vector of double) +0:89 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:89 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:89 Constant: +0:89 0 (const uint) +0:89 direct index ( temp uint) +0:89 'dti' ( in 3-component vector of uint) +0:89 Constant: +0:89 0 (const int) +0:89 Constant: +0:89 3 (const int) +0:90 move second child to first child ( temp double) +0:90 direct index ( temp double) +0:90 d: direct index for structure ( temp 4-component vector of double) +0:90 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:90 Constant: +0:90 0 (const uint) +0:90 direct index ( temp uint) +0:90 'dti' ( in 3-component vector of uint) +0:90 Constant: +0:90 0 (const int) +0:90 Constant: +0:90 3 (const int) +0:90 Constant: +0:90 0 (const int) +0:90 subgroupMax ( temp double) +0:90 direct index ( temp double) +0:90 d: direct index for structure ( temp 4-component vector of double) +0:90 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:90 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:90 Constant: +0:90 0 (const uint) +0:90 direct index ( temp uint) +0:90 'dti' ( in 3-component vector of uint) +0:90 Constant: +0:90 0 (const int) +0:90 Constant: +0:90 3 (const int) +0:90 Constant: +0:90 0 (const int) +0:91 move second child to first child ( temp 2-component vector of double) +0:91 vector swizzle ( temp 2-component vector of double) +0:91 d: direct index for structure ( temp 4-component vector of double) +0:91 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:91 Constant: +0:91 0 (const uint) +0:91 direct index ( temp uint) +0:91 'dti' ( in 3-component vector of uint) +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 3 (const int) +0:91 Sequence +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 1 (const int) +0:91 subgroupMax ( temp 2-component vector of double) +0:91 vector swizzle ( temp 2-component vector of double) +0:91 d: direct index for structure ( temp 4-component vector of double) +0:91 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:91 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:91 Constant: +0:91 0 (const uint) +0:91 direct index ( temp uint) +0:91 'dti' ( in 3-component vector of uint) +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 3 (const int) +0:91 Sequence +0:91 Constant: +0:91 0 (const int) +0:91 Constant: +0:91 1 (const int) +0:92 move second child to first child ( temp 3-component vector of double) +0:92 vector swizzle ( temp 3-component vector of double) +0:92 d: direct index for structure ( temp 4-component vector of double) +0:92 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:92 Constant: +0:92 0 (const uint) +0:92 direct index ( temp uint) +0:92 'dti' ( in 3-component vector of uint) +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 3 (const int) +0:92 Sequence +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 1 (const int) +0:92 Constant: +0:92 2 (const int) +0:92 subgroupMax ( temp 3-component vector of double) +0:92 vector swizzle ( temp 3-component vector of double) +0:92 d: direct index for structure ( temp 4-component vector of double) +0:92 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:92 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:92 Constant: +0:92 0 (const uint) +0:92 direct index ( temp uint) +0:92 'dti' ( in 3-component vector of uint) +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 3 (const int) +0:92 Sequence +0:92 Constant: +0:92 0 (const int) +0:92 Constant: +0:92 1 (const int) +0:92 Constant: +0:92 2 (const int) +0:94 move second child to first child ( temp 4-component vector of uint) +0:94 u: direct index for structure ( temp 4-component vector of uint) +0:94 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:94 Constant: +0:94 0 (const uint) +0:94 direct index ( temp uint) +0:94 'dti' ( in 3-component vector of uint) +0:94 Constant: +0:94 0 (const int) +0:94 Constant: +0:94 0 (const int) +0:94 subgroupAnd ( temp 4-component vector of uint) +0:94 u: direct index for structure ( temp 4-component vector of uint) +0:94 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:94 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:94 Constant: +0:94 0 (const uint) +0:94 direct index ( temp uint) +0:94 'dti' ( in 3-component vector of uint) +0:94 Constant: +0:94 0 (const int) +0:94 Constant: +0:94 0 (const int) +0:95 move second child to first child ( temp uint) +0:95 direct index ( temp uint) +0:95 u: direct index for structure ( temp 4-component vector of uint) +0:95 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:95 Constant: +0:95 0 (const uint) +0:95 direct index ( temp uint) +0:95 'dti' ( in 3-component vector of uint) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:95 subgroupAnd ( temp uint) +0:95 direct index ( temp uint) +0:95 u: direct index for structure ( temp 4-component vector of uint) +0:95 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:95 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:95 Constant: +0:95 0 (const uint) +0:95 direct index ( temp uint) +0:95 'dti' ( in 3-component vector of uint) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:95 Constant: +0:95 0 (const int) +0:96 move second child to first child ( temp 2-component vector of uint) +0:96 vector swizzle ( temp 2-component vector of uint) +0:96 u: direct index for structure ( temp 4-component vector of uint) +0:96 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:96 Constant: +0:96 0 (const uint) +0:96 direct index ( temp uint) +0:96 'dti' ( in 3-component vector of uint) +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 0 (const int) +0:96 Sequence +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 1 (const int) +0:96 subgroupAnd ( temp 2-component vector of uint) +0:96 vector swizzle ( temp 2-component vector of uint) +0:96 u: direct index for structure ( temp 4-component vector of uint) +0:96 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:96 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:96 Constant: +0:96 0 (const uint) +0:96 direct index ( temp uint) +0:96 'dti' ( in 3-component vector of uint) +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 0 (const int) +0:96 Sequence +0:96 Constant: +0:96 0 (const int) +0:96 Constant: +0:96 1 (const int) +0:97 move second child to first child ( temp 3-component vector of uint) +0:97 vector swizzle ( temp 3-component vector of uint) +0:97 u: direct index for structure ( temp 4-component vector of uint) +0:97 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:97 Constant: +0:97 0 (const uint) +0:97 direct index ( temp uint) +0:97 'dti' ( in 3-component vector of uint) +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 0 (const int) +0:97 Sequence +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 1 (const int) +0:97 Constant: +0:97 2 (const int) +0:97 subgroupAnd ( temp 3-component vector of uint) +0:97 vector swizzle ( temp 3-component vector of uint) +0:97 u: direct index for structure ( temp 4-component vector of uint) +0:97 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:97 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:97 Constant: +0:97 0 (const uint) +0:97 direct index ( temp uint) +0:97 'dti' ( in 3-component vector of uint) +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 0 (const int) +0:97 Sequence +0:97 Constant: +0:97 0 (const int) +0:97 Constant: +0:97 1 (const int) +0:97 Constant: +0:97 2 (const int) +0:99 move second child to first child ( temp 4-component vector of int) +0:99 i: direct index for structure ( temp 4-component vector of int) +0:99 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:99 Constant: +0:99 0 (const uint) +0:99 direct index ( temp uint) +0:99 'dti' ( in 3-component vector of uint) +0:99 Constant: +0:99 0 (const int) +0:99 Constant: +0:99 1 (const int) +0:99 subgroupAnd ( temp 4-component vector of int) +0:99 i: direct index for structure ( temp 4-component vector of int) +0:99 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:99 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:99 Constant: +0:99 0 (const uint) +0:99 direct index ( temp uint) +0:99 'dti' ( in 3-component vector of uint) +0:99 Constant: +0:99 0 (const int) +0:99 Constant: +0:99 1 (const int) +0:100 move second child to first child ( temp int) +0:100 direct index ( temp int) +0:100 i: direct index for structure ( temp 4-component vector of int) +0:100 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:100 Constant: +0:100 0 (const uint) +0:100 direct index ( temp uint) +0:100 'dti' ( in 3-component vector of uint) +0:100 Constant: +0:100 0 (const int) +0:100 Constant: +0:100 1 (const int) +0:100 Constant: +0:100 0 (const int) +0:100 subgroupAnd ( temp int) +0:100 direct index ( temp int) +0:100 i: direct index for structure ( temp 4-component vector of int) +0:100 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:100 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:100 Constant: +0:100 0 (const uint) +0:100 direct index ( temp uint) +0:100 'dti' ( in 3-component vector of uint) +0:100 Constant: +0:100 0 (const int) +0:100 Constant: +0:100 1 (const int) +0:100 Constant: +0:100 0 (const int) +0:101 move second child to first child ( temp 2-component vector of int) +0:101 vector swizzle ( temp 2-component vector of int) +0:101 i: direct index for structure ( temp 4-component vector of int) +0:101 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:101 Constant: +0:101 0 (const uint) +0:101 direct index ( temp uint) +0:101 'dti' ( in 3-component vector of uint) +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:101 Sequence +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:101 subgroupAnd ( temp 2-component vector of int) +0:101 vector swizzle ( temp 2-component vector of int) +0:101 i: direct index for structure ( temp 4-component vector of int) +0:101 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:101 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:101 Constant: +0:101 0 (const uint) +0:101 direct index ( temp uint) +0:101 'dti' ( in 3-component vector of uint) +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:101 Sequence +0:101 Constant: +0:101 0 (const int) +0:101 Constant: +0:101 1 (const int) +0:102 move second child to first child ( temp 3-component vector of int) +0:102 vector swizzle ( temp 3-component vector of int) +0:102 i: direct index for structure ( temp 4-component vector of int) +0:102 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:102 Constant: +0:102 0 (const uint) +0:102 direct index ( temp uint) +0:102 'dti' ( in 3-component vector of uint) +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Sequence +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Constant: +0:102 2 (const int) +0:102 subgroupAnd ( temp 3-component vector of int) +0:102 vector swizzle ( temp 3-component vector of int) +0:102 i: direct index for structure ( temp 4-component vector of int) +0:102 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:102 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:102 Constant: +0:102 0 (const uint) +0:102 direct index ( temp uint) +0:102 'dti' ( in 3-component vector of uint) +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Sequence +0:102 Constant: +0:102 0 (const int) +0:102 Constant: +0:102 1 (const int) +0:102 Constant: +0:102 2 (const int) +0:104 move second child to first child ( temp 4-component vector of uint) +0:104 u: direct index for structure ( temp 4-component vector of uint) +0:104 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:104 Constant: +0:104 0 (const uint) +0:104 direct index ( temp uint) +0:104 'dti' ( in 3-component vector of uint) +0:104 Constant: +0:104 0 (const int) +0:104 Constant: +0:104 0 (const int) +0:104 subgroupOr ( temp 4-component vector of uint) +0:104 u: direct index for structure ( temp 4-component vector of uint) +0:104 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:104 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:104 Constant: +0:104 0 (const uint) +0:104 direct index ( temp uint) +0:104 'dti' ( in 3-component vector of uint) +0:104 Constant: +0:104 0 (const int) +0:104 Constant: +0:104 0 (const int) +0:105 move second child to first child ( temp uint) +0:105 direct index ( temp uint) +0:105 u: direct index for structure ( temp 4-component vector of uint) +0:105 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:105 Constant: +0:105 0 (const uint) +0:105 direct index ( temp uint) +0:105 'dti' ( in 3-component vector of uint) +0:105 Constant: +0:105 0 (const int) +0:105 Constant: +0:105 0 (const int) +0:105 Constant: +0:105 0 (const int) +0:105 subgroupOr ( temp uint) +0:105 direct index ( temp uint) +0:105 u: direct index for structure ( temp 4-component vector of uint) +0:105 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:105 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:105 Constant: +0:105 0 (const uint) +0:105 direct index ( temp uint) +0:105 'dti' ( in 3-component vector of uint) +0:105 Constant: +0:105 0 (const int) +0:105 Constant: +0:105 0 (const int) +0:105 Constant: +0:105 0 (const int) +0:106 move second child to first child ( temp 2-component vector of uint) +0:106 vector swizzle ( temp 2-component vector of uint) +0:106 u: direct index for structure ( temp 4-component vector of uint) +0:106 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:106 Constant: +0:106 0 (const uint) +0:106 direct index ( temp uint) +0:106 'dti' ( in 3-component vector of uint) +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 0 (const int) +0:106 Sequence +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 1 (const int) +0:106 subgroupOr ( temp 2-component vector of uint) +0:106 vector swizzle ( temp 2-component vector of uint) +0:106 u: direct index for structure ( temp 4-component vector of uint) +0:106 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:106 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:106 Constant: +0:106 0 (const uint) +0:106 direct index ( temp uint) +0:106 'dti' ( in 3-component vector of uint) +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 0 (const int) +0:106 Sequence +0:106 Constant: +0:106 0 (const int) +0:106 Constant: +0:106 1 (const int) +0:107 move second child to first child ( temp 3-component vector of uint) +0:107 vector swizzle ( temp 3-component vector of uint) +0:107 u: direct index for structure ( temp 4-component vector of uint) +0:107 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:107 Constant: +0:107 0 (const uint) +0:107 direct index ( temp uint) +0:107 'dti' ( in 3-component vector of uint) +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 0 (const int) +0:107 Sequence +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 1 (const int) +0:107 Constant: +0:107 2 (const int) +0:107 subgroupOr ( temp 3-component vector of uint) +0:107 vector swizzle ( temp 3-component vector of uint) +0:107 u: direct index for structure ( temp 4-component vector of uint) +0:107 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:107 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:107 Constant: +0:107 0 (const uint) +0:107 direct index ( temp uint) +0:107 'dti' ( in 3-component vector of uint) +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 0 (const int) +0:107 Sequence +0:107 Constant: +0:107 0 (const int) +0:107 Constant: +0:107 1 (const int) +0:107 Constant: +0:107 2 (const int) +0:109 move second child to first child ( temp 4-component vector of int) +0:109 i: direct index for structure ( temp 4-component vector of int) +0:109 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:109 Constant: +0:109 0 (const uint) +0:109 direct index ( temp uint) +0:109 'dti' ( in 3-component vector of uint) +0:109 Constant: +0:109 0 (const int) +0:109 Constant: +0:109 1 (const int) +0:109 subgroupOr ( temp 4-component vector of int) +0:109 i: direct index for structure ( temp 4-component vector of int) +0:109 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:109 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:109 Constant: +0:109 0 (const uint) +0:109 direct index ( temp uint) +0:109 'dti' ( in 3-component vector of uint) +0:109 Constant: +0:109 0 (const int) +0:109 Constant: +0:109 1 (const int) +0:110 move second child to first child ( temp int) +0:110 direct index ( temp int) +0:110 i: direct index for structure ( temp 4-component vector of int) +0:110 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:110 Constant: +0:110 0 (const uint) +0:110 direct index ( temp uint) +0:110 'dti' ( in 3-component vector of uint) +0:110 Constant: +0:110 0 (const int) +0:110 Constant: +0:110 1 (const int) +0:110 Constant: +0:110 0 (const int) +0:110 subgroupOr ( temp int) +0:110 direct index ( temp int) +0:110 i: direct index for structure ( temp 4-component vector of int) +0:110 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:110 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:110 Constant: +0:110 0 (const uint) +0:110 direct index ( temp uint) +0:110 'dti' ( in 3-component vector of uint) +0:110 Constant: +0:110 0 (const int) +0:110 Constant: +0:110 1 (const int) +0:110 Constant: +0:110 0 (const int) +0:111 move second child to first child ( temp 2-component vector of int) +0:111 vector swizzle ( temp 2-component vector of int) +0:111 i: direct index for structure ( temp 4-component vector of int) +0:111 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:111 Constant: +0:111 0 (const uint) +0:111 direct index ( temp uint) +0:111 'dti' ( in 3-component vector of uint) +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1 (const int) +0:111 Sequence +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1 (const int) +0:111 subgroupOr ( temp 2-component vector of int) +0:111 vector swizzle ( temp 2-component vector of int) +0:111 i: direct index for structure ( temp 4-component vector of int) +0:111 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:111 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:111 Constant: +0:111 0 (const uint) +0:111 direct index ( temp uint) +0:111 'dti' ( in 3-component vector of uint) +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1 (const int) +0:111 Sequence +0:111 Constant: +0:111 0 (const int) +0:111 Constant: +0:111 1 (const int) +0:112 move second child to first child ( temp 3-component vector of int) +0:112 vector swizzle ( temp 3-component vector of int) +0:112 i: direct index for structure ( temp 4-component vector of int) +0:112 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:112 Constant: +0:112 0 (const uint) +0:112 direct index ( temp uint) +0:112 'dti' ( in 3-component vector of uint) +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 1 (const int) +0:112 Sequence +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 1 (const int) +0:112 Constant: +0:112 2 (const int) +0:112 subgroupOr ( temp 3-component vector of int) +0:112 vector swizzle ( temp 3-component vector of int) +0:112 i: direct index for structure ( temp 4-component vector of int) +0:112 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:112 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:112 Constant: +0:112 0 (const uint) +0:112 direct index ( temp uint) +0:112 'dti' ( in 3-component vector of uint) +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 1 (const int) +0:112 Sequence +0:112 Constant: +0:112 0 (const int) +0:112 Constant: +0:112 1 (const int) +0:112 Constant: +0:112 2 (const int) +0:114 move second child to first child ( temp 4-component vector of uint) +0:114 u: direct index for structure ( temp 4-component vector of uint) +0:114 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:114 Constant: +0:114 0 (const uint) +0:114 direct index ( temp uint) +0:114 'dti' ( in 3-component vector of uint) +0:114 Constant: +0:114 0 (const int) +0:114 Constant: +0:114 0 (const int) +0:114 subgroupXor ( temp 4-component vector of uint) +0:114 u: direct index for structure ( temp 4-component vector of uint) +0:114 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:114 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:114 Constant: +0:114 0 (const uint) +0:114 direct index ( temp uint) +0:114 'dti' ( in 3-component vector of uint) +0:114 Constant: +0:114 0 (const int) +0:114 Constant: +0:114 0 (const int) +0:115 move second child to first child ( temp uint) +0:115 direct index ( temp uint) +0:115 u: direct index for structure ( temp 4-component vector of uint) +0:115 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:115 Constant: +0:115 0 (const uint) +0:115 direct index ( temp uint) +0:115 'dti' ( in 3-component vector of uint) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:115 subgroupXor ( temp uint) +0:115 direct index ( temp uint) +0:115 u: direct index for structure ( temp 4-component vector of uint) +0:115 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:115 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:115 Constant: +0:115 0 (const uint) +0:115 direct index ( temp uint) +0:115 'dti' ( in 3-component vector of uint) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:115 Constant: +0:115 0 (const int) +0:116 move second child to first child ( temp 2-component vector of uint) +0:116 vector swizzle ( temp 2-component vector of uint) +0:116 u: direct index for structure ( temp 4-component vector of uint) +0:116 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:116 Constant: +0:116 0 (const uint) +0:116 direct index ( temp uint) +0:116 'dti' ( in 3-component vector of uint) +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 0 (const int) +0:116 Sequence +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 1 (const int) +0:116 subgroupXor ( temp 2-component vector of uint) +0:116 vector swizzle ( temp 2-component vector of uint) +0:116 u: direct index for structure ( temp 4-component vector of uint) +0:116 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:116 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:116 Constant: +0:116 0 (const uint) +0:116 direct index ( temp uint) +0:116 'dti' ( in 3-component vector of uint) +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 0 (const int) +0:116 Sequence +0:116 Constant: +0:116 0 (const int) +0:116 Constant: +0:116 1 (const int) +0:117 move second child to first child ( temp 3-component vector of uint) +0:117 vector swizzle ( temp 3-component vector of uint) +0:117 u: direct index for structure ( temp 4-component vector of uint) +0:117 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:117 Constant: +0:117 0 (const uint) +0:117 direct index ( temp uint) +0:117 'dti' ( in 3-component vector of uint) +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 0 (const int) +0:117 Sequence +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 1 (const int) +0:117 Constant: +0:117 2 (const int) +0:117 subgroupXor ( temp 3-component vector of uint) +0:117 vector swizzle ( temp 3-component vector of uint) +0:117 u: direct index for structure ( temp 4-component vector of uint) +0:117 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:117 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:117 Constant: +0:117 0 (const uint) +0:117 direct index ( temp uint) +0:117 'dti' ( in 3-component vector of uint) +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 0 (const int) +0:117 Sequence +0:117 Constant: +0:117 0 (const int) +0:117 Constant: +0:117 1 (const int) +0:117 Constant: +0:117 2 (const int) +0:119 move second child to first child ( temp 4-component vector of int) +0:119 i: direct index for structure ( temp 4-component vector of int) +0:119 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:119 Constant: +0:119 0 (const uint) +0:119 direct index ( temp uint) +0:119 'dti' ( in 3-component vector of uint) +0:119 Constant: +0:119 0 (const int) +0:119 Constant: +0:119 1 (const int) +0:119 subgroupXor ( temp 4-component vector of int) +0:119 i: direct index for structure ( temp 4-component vector of int) +0:119 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:119 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:119 Constant: +0:119 0 (const uint) +0:119 direct index ( temp uint) +0:119 'dti' ( in 3-component vector of uint) +0:119 Constant: +0:119 0 (const int) +0:119 Constant: +0:119 1 (const int) +0:120 move second child to first child ( temp int) +0:120 direct index ( temp int) +0:120 i: direct index for structure ( temp 4-component vector of int) +0:120 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:120 Constant: +0:120 0 (const uint) +0:120 direct index ( temp uint) +0:120 'dti' ( in 3-component vector of uint) +0:120 Constant: +0:120 0 (const int) +0:120 Constant: +0:120 1 (const int) +0:120 Constant: +0:120 0 (const int) +0:120 subgroupXor ( temp int) +0:120 direct index ( temp int) +0:120 i: direct index for structure ( temp 4-component vector of int) +0:120 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:120 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:120 Constant: +0:120 0 (const uint) +0:120 direct index ( temp uint) +0:120 'dti' ( in 3-component vector of uint) +0:120 Constant: +0:120 0 (const int) +0:120 Constant: +0:120 1 (const int) +0:120 Constant: +0:120 0 (const int) +0:121 move second child to first child ( temp 2-component vector of int) +0:121 vector swizzle ( temp 2-component vector of int) +0:121 i: direct index for structure ( temp 4-component vector of int) +0:121 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:121 Constant: +0:121 0 (const uint) +0:121 direct index ( temp uint) +0:121 'dti' ( in 3-component vector of uint) +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:121 Sequence +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:121 subgroupXor ( temp 2-component vector of int) +0:121 vector swizzle ( temp 2-component vector of int) +0:121 i: direct index for structure ( temp 4-component vector of int) +0:121 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:121 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:121 Constant: +0:121 0 (const uint) +0:121 direct index ( temp uint) +0:121 'dti' ( in 3-component vector of uint) +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:121 Sequence +0:121 Constant: +0:121 0 (const int) +0:121 Constant: +0:121 1 (const int) +0:122 move second child to first child ( temp 3-component vector of int) +0:122 vector swizzle ( temp 3-component vector of int) +0:122 i: direct index for structure ( temp 4-component vector of int) +0:122 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:122 Constant: +0:122 0 (const uint) +0:122 direct index ( temp uint) +0:122 'dti' ( in 3-component vector of uint) +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Sequence +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Constant: +0:122 2 (const int) +0:122 subgroupXor ( temp 3-component vector of int) +0:122 vector swizzle ( temp 3-component vector of int) +0:122 i: direct index for structure ( temp 4-component vector of int) +0:122 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:122 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:122 Constant: +0:122 0 (const uint) +0:122 direct index ( temp uint) +0:122 'dti' ( in 3-component vector of uint) +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Sequence +0:122 Constant: +0:122 0 (const int) +0:122 Constant: +0:122 1 (const int) +0:122 Constant: +0:122 2 (const int) +0:124 move second child to first child ( temp uint) +0:124 direct index ( temp uint) +0:124 u: direct index for structure ( temp 4-component vector of uint) +0:124 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:124 Constant: +0:124 0 (const uint) +0:124 direct index ( temp uint) +0:124 'dti' ( in 3-component vector of uint) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 0 (const int) +0:124 subgroupBallotBitCount ( temp uint) +0:124 subgroupBallot ( temp 4-component vector of uint) +0:124 Compare Equal ( temp bool) +0:124 direct index ( temp uint) +0:124 u: direct index for structure ( temp 4-component vector of uint) +0:124 indirect index (layout( row_major std430) buffer structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d}) +0:124 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:124 Constant: +0:124 0 (const uint) +0:124 direct index ( temp uint) +0:124 'dti' ( in 3-component vector of uint) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 0 (const int) +0:124 Constant: +0:124 0 (const uint) +0:13 Function Definition: CSMain( ( temp void) +0:13 Function Parameters: +0:? Sequence +0:13 move second child to first child ( temp 3-component vector of uint) +0:? 'dti' ( temp 3-component vector of uint) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) +0:13 Function Call: @CSMain(vu3; ( temp void) +0:? 'dti' ( temp 3-component vector of uint) +0:? Linker Objects +0:? 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of structure{ temp 4-component vector of uint u, temp 4-component vector of int i, temp 4-component vector of float f, temp 4-component vector of double d} @data}) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) + +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 901 + + Capability Shader + Capability Float64 + Capability GroupNonUniform + Capability GroupNonUniformArithmetic + Capability GroupNonUniformBallot + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "CSMain" 896 + ExecutionMode 4 LocalSize 32 16 1 + Source HLSL 500 + Name 4 "CSMain" + Name 11 "@CSMain(vu3;" + Name 10 "dti" + Name 20 "Types" + MemberName 20(Types) 0 "u" + MemberName 20(Types) 1 "i" + MemberName 20(Types) 2 "f" + MemberName 20(Types) 3 "d" + Name 22 "data" + MemberName 22(data) 0 "@data" + Name 24 "data" + Name 894 "dti" + Name 896 "dti" + Name 898 "param" + MemberDecorate 20(Types) 0 Offset 0 + MemberDecorate 20(Types) 1 Offset 16 + MemberDecorate 20(Types) 2 Offset 32 + MemberDecorate 20(Types) 3 Offset 64 + Decorate 21 ArrayStride 96 + MemberDecorate 22(data) 0 Offset 0 + Decorate 22(data) BufferBlock + Decorate 24(data) DescriptorSet 0 + Decorate 896(dti) BuiltIn GlobalInvocationId + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypeVector 6(int) 3 + 8: TypePointer Function 7(ivec3) + 9: TypeFunction 2 8(ptr) + 13: TypeVector 6(int) 4 + 14: TypeInt 32 1 + 15: TypeVector 14(int) 4 + 16: TypeFloat 32 + 17: TypeVector 16(float) 4 + 18: TypeFloat 64 + 19: TypeVector 18(float) 4 + 20(Types): TypeStruct 13(ivec4) 15(ivec4) 17(fvec4) 19(fvec4) + 21: TypeRuntimeArray 20(Types) + 22(data): TypeStruct 21 + 23: TypePointer Uniform 22(data) + 24(data): 23(ptr) Variable Uniform + 25: 14(int) Constant 0 + 26: 6(int) Constant 0 + 27: TypePointer Function 6(int) + 32: TypePointer Uniform 13(ivec4) + 35: 6(int) Constant 3 + 42: TypePointer Uniform 6(int) + 51: TypeVector 6(int) 2 + 72: 14(int) Constant 1 + 75: TypePointer Uniform 15(ivec4) + 84: TypePointer Uniform 14(int) + 93: TypeVector 14(int) 2 + 105: TypeVector 14(int) 3 + 115: 14(int) Constant 2 + 118: TypePointer Uniform 17(fvec4) + 127: TypePointer Uniform 16(float) + 136: TypeVector 16(float) 2 + 148: TypeVector 16(float) 3 + 158: 14(int) Constant 3 + 161: TypePointer Uniform 19(fvec4) + 170: TypePointer Uniform 18(float) + 179: TypeVector 18(float) 2 + 191: TypeVector 18(float) 3 + 889: TypeBool + 895: TypePointer Input 7(ivec3) + 896(dti): 895(ptr) Variable Input + 4(CSMain): 2 Function None 3 + 5: Label + 894(dti): 8(ptr) Variable Function + 898(param): 8(ptr) Variable Function + 897: 7(ivec3) Load 896(dti) + Store 894(dti) 897 + 899: 7(ivec3) Load 894(dti) + Store 898(param) 899 + 900: 2 FunctionCall 11(@CSMain(vu3;) 898(param) + Return + FunctionEnd +11(@CSMain(vu3;): 2 Function None 9 + 10(dti): 8(ptr) FunctionParameter + 12: Label + 28: 27(ptr) AccessChain 10(dti) 26 + 29: 6(int) Load 28 + 30: 27(ptr) AccessChain 10(dti) 26 + 31: 6(int) Load 30 + 33: 32(ptr) AccessChain 24(data) 25 31 25 + 34: 13(ivec4) Load 33 + 36: 13(ivec4) GroupNonUniformIAdd 35 Reduce 34 + 37: 32(ptr) AccessChain 24(data) 25 29 25 + Store 37 36 + 38: 27(ptr) AccessChain 10(dti) 26 + 39: 6(int) Load 38 + 40: 27(ptr) AccessChain 10(dti) 26 + 41: 6(int) Load 40 + 43: 42(ptr) AccessChain 24(data) 25 41 25 26 + 44: 6(int) Load 43 + 45: 6(int) GroupNonUniformIAdd 35 Reduce 44 + 46: 42(ptr) AccessChain 24(data) 25 39 25 26 + Store 46 45 + 47: 27(ptr) AccessChain 10(dti) 26 + 48: 6(int) Load 47 + 49: 27(ptr) AccessChain 10(dti) 26 + 50: 6(int) Load 49 + 52: 32(ptr) AccessChain 24(data) 25 50 25 + 53: 13(ivec4) Load 52 + 54: 51(ivec2) VectorShuffle 53 53 0 1 + 55: 51(ivec2) GroupNonUniformIAdd 35 Reduce 54 + 56: 32(ptr) AccessChain 24(data) 25 48 25 + 57: 13(ivec4) Load 56 + 58: 13(ivec4) VectorShuffle 57 55 4 5 2 3 + Store 56 58 + 59: 27(ptr) AccessChain 10(dti) 26 + 60: 6(int) Load 59 + 61: 27(ptr) AccessChain 10(dti) 26 + 62: 6(int) Load 61 + 63: 32(ptr) AccessChain 24(data) 25 62 25 + 64: 13(ivec4) Load 63 + 65: 7(ivec3) VectorShuffle 64 64 0 1 2 + 66: 7(ivec3) GroupNonUniformIAdd 35 Reduce 65 + 67: 32(ptr) AccessChain 24(data) 25 60 25 + 68: 13(ivec4) Load 67 + 69: 13(ivec4) VectorShuffle 68 66 4 5 6 3 + Store 67 69 + 70: 27(ptr) AccessChain 10(dti) 26 + 71: 6(int) Load 70 + 73: 27(ptr) AccessChain 10(dti) 26 + 74: 6(int) Load 73 + 76: 75(ptr) AccessChain 24(data) 25 74 72 + 77: 15(ivec4) Load 76 + 78: 15(ivec4) GroupNonUniformIAdd 35 Reduce 77 + 79: 75(ptr) AccessChain 24(data) 25 71 72 + Store 79 78 + 80: 27(ptr) AccessChain 10(dti) 26 + 81: 6(int) Load 80 + 82: 27(ptr) AccessChain 10(dti) 26 + 83: 6(int) Load 82 + 85: 84(ptr) AccessChain 24(data) 25 83 72 26 + 86: 14(int) Load 85 + 87: 14(int) GroupNonUniformIAdd 35 Reduce 86 + 88: 84(ptr) AccessChain 24(data) 25 81 72 26 + Store 88 87 + 89: 27(ptr) AccessChain 10(dti) 26 + 90: 6(int) Load 89 + 91: 27(ptr) AccessChain 10(dti) 26 + 92: 6(int) Load 91 + 94: 75(ptr) AccessChain 24(data) 25 92 72 + 95: 15(ivec4) Load 94 + 96: 93(ivec2) VectorShuffle 95 95 0 1 + 97: 93(ivec2) GroupNonUniformIAdd 35 Reduce 96 + 98: 75(ptr) AccessChain 24(data) 25 90 72 + 99: 15(ivec4) Load 98 + 100: 15(ivec4) VectorShuffle 99 97 4 5 2 3 + Store 98 100 + 101: 27(ptr) AccessChain 10(dti) 26 + 102: 6(int) Load 101 + 103: 27(ptr) AccessChain 10(dti) 26 + 104: 6(int) Load 103 + 106: 75(ptr) AccessChain 24(data) 25 104 72 + 107: 15(ivec4) Load 106 + 108: 105(ivec3) VectorShuffle 107 107 0 1 2 + 109: 105(ivec3) GroupNonUniformIAdd 35 Reduce 108 + 110: 75(ptr) AccessChain 24(data) 25 102 72 + 111: 15(ivec4) Load 110 + 112: 15(ivec4) VectorShuffle 111 109 4 5 6 3 + Store 110 112 + 113: 27(ptr) AccessChain 10(dti) 26 + 114: 6(int) Load 113 + 116: 27(ptr) AccessChain 10(dti) 26 + 117: 6(int) Load 116 + 119: 118(ptr) AccessChain 24(data) 25 117 115 + 120: 17(fvec4) Load 119 + 121: 17(fvec4) GroupNonUniformFAdd 35 Reduce 120 + 122: 118(ptr) AccessChain 24(data) 25 114 115 + Store 122 121 + 123: 27(ptr) AccessChain 10(dti) 26 + 124: 6(int) Load 123 + 125: 27(ptr) AccessChain 10(dti) 26 + 126: 6(int) Load 125 + 128: 127(ptr) AccessChain 24(data) 25 126 115 26 + 129: 16(float) Load 128 + 130: 16(float) GroupNonUniformFAdd 35 Reduce 129 + 131: 127(ptr) AccessChain 24(data) 25 124 115 26 + Store 131 130 + 132: 27(ptr) AccessChain 10(dti) 26 + 133: 6(int) Load 132 + 134: 27(ptr) AccessChain 10(dti) 26 + 135: 6(int) Load 134 + 137: 118(ptr) AccessChain 24(data) 25 135 115 + 138: 17(fvec4) Load 137 + 139: 136(fvec2) VectorShuffle 138 138 0 1 + 140: 136(fvec2) GroupNonUniformFAdd 35 Reduce 139 + 141: 118(ptr) AccessChain 24(data) 25 133 115 + 142: 17(fvec4) Load 141 + 143: 17(fvec4) VectorShuffle 142 140 4 5 2 3 + Store 141 143 + 144: 27(ptr) AccessChain 10(dti) 26 + 145: 6(int) Load 144 + 146: 27(ptr) AccessChain 10(dti) 26 + 147: 6(int) Load 146 + 149: 118(ptr) AccessChain 24(data) 25 147 115 + 150: 17(fvec4) Load 149 + 151: 148(fvec3) VectorShuffle 150 150 0 1 2 + 152: 148(fvec3) GroupNonUniformFAdd 35 Reduce 151 + 153: 118(ptr) AccessChain 24(data) 25 145 115 + 154: 17(fvec4) Load 153 + 155: 17(fvec4) VectorShuffle 154 152 4 5 6 3 + Store 153 155 + 156: 27(ptr) AccessChain 10(dti) 26 + 157: 6(int) Load 156 + 159: 27(ptr) AccessChain 10(dti) 26 + 160: 6(int) Load 159 + 162: 161(ptr) AccessChain 24(data) 25 160 158 + 163: 19(fvec4) Load 162 + 164: 19(fvec4) GroupNonUniformFAdd 35 Reduce 163 + 165: 161(ptr) AccessChain 24(data) 25 157 158 + Store 165 164 + 166: 27(ptr) AccessChain 10(dti) 26 + 167: 6(int) Load 166 + 168: 27(ptr) AccessChain 10(dti) 26 + 169: 6(int) Load 168 + 171: 170(ptr) AccessChain 24(data) 25 169 158 26 + 172: 18(float) Load 171 + 173: 18(float) GroupNonUniformFAdd 35 Reduce 172 + 174: 170(ptr) AccessChain 24(data) 25 167 158 26 + Store 174 173 + 175: 27(ptr) AccessChain 10(dti) 26 + 176: 6(int) Load 175 + 177: 27(ptr) AccessChain 10(dti) 26 + 178: 6(int) Load 177 + 180: 161(ptr) AccessChain 24(data) 25 178 158 + 181: 19(fvec4) Load 180 + 182: 179(fvec2) VectorShuffle 181 181 0 1 + 183: 179(fvec2) GroupNonUniformFAdd 35 Reduce 182 + 184: 161(ptr) AccessChain 24(data) 25 176 158 + 185: 19(fvec4) Load 184 + 186: 19(fvec4) VectorShuffle 185 183 4 5 2 3 + Store 184 186 + 187: 27(ptr) AccessChain 10(dti) 26 + 188: 6(int) Load 187 + 189: 27(ptr) AccessChain 10(dti) 26 + 190: 6(int) Load 189 + 192: 161(ptr) AccessChain 24(data) 25 190 158 + 193: 19(fvec4) Load 192 + 194: 191(fvec3) VectorShuffle 193 193 0 1 2 + 195: 191(fvec3) GroupNonUniformFAdd 35 Reduce 194 + 196: 161(ptr) AccessChain 24(data) 25 188 158 + 197: 19(fvec4) Load 196 + 198: 19(fvec4) VectorShuffle 197 195 4 5 6 3 + Store 196 198 + 199: 27(ptr) AccessChain 10(dti) 26 + 200: 6(int) Load 199 + 201: 27(ptr) AccessChain 10(dti) 26 + 202: 6(int) Load 201 + 203: 32(ptr) AccessChain 24(data) 25 202 25 + 204: 13(ivec4) Load 203 + 205: 13(ivec4) GroupNonUniformIMul 35 Reduce 204 + 206: 32(ptr) AccessChain 24(data) 25 200 25 + Store 206 205 + 207: 27(ptr) AccessChain 10(dti) 26 + 208: 6(int) Load 207 + 209: 27(ptr) AccessChain 10(dti) 26 + 210: 6(int) Load 209 + 211: 42(ptr) AccessChain 24(data) 25 210 25 26 + 212: 6(int) Load 211 + 213: 6(int) GroupNonUniformIMul 35 Reduce 212 + 214: 42(ptr) AccessChain 24(data) 25 208 25 26 + Store 214 213 + 215: 27(ptr) AccessChain 10(dti) 26 + 216: 6(int) Load 215 + 217: 27(ptr) AccessChain 10(dti) 26 + 218: 6(int) Load 217 + 219: 32(ptr) AccessChain 24(data) 25 218 25 + 220: 13(ivec4) Load 219 + 221: 51(ivec2) VectorShuffle 220 220 0 1 + 222: 51(ivec2) GroupNonUniformIMul 35 Reduce 221 + 223: 32(ptr) AccessChain 24(data) 25 216 25 + 224: 13(ivec4) Load 223 + 225: 13(ivec4) VectorShuffle 224 222 4 5 2 3 + Store 223 225 + 226: 27(ptr) AccessChain 10(dti) 26 + 227: 6(int) Load 226 + 228: 27(ptr) AccessChain 10(dti) 26 + 229: 6(int) Load 228 + 230: 32(ptr) AccessChain 24(data) 25 229 25 + 231: 13(ivec4) Load 230 + 232: 7(ivec3) VectorShuffle 231 231 0 1 2 + 233: 7(ivec3) GroupNonUniformIMul 35 Reduce 232 + 234: 32(ptr) AccessChain 24(data) 25 227 25 + 235: 13(ivec4) Load 234 + 236: 13(ivec4) VectorShuffle 235 233 4 5 6 3 + Store 234 236 + 237: 27(ptr) AccessChain 10(dti) 26 + 238: 6(int) Load 237 + 239: 27(ptr) AccessChain 10(dti) 26 + 240: 6(int) Load 239 + 241: 75(ptr) AccessChain 24(data) 25 240 72 + 242: 15(ivec4) Load 241 + 243: 15(ivec4) GroupNonUniformIMul 35 Reduce 242 + 244: 75(ptr) AccessChain 24(data) 25 238 72 + Store 244 243 + 245: 27(ptr) AccessChain 10(dti) 26 + 246: 6(int) Load 245 + 247: 27(ptr) AccessChain 10(dti) 26 + 248: 6(int) Load 247 + 249: 84(ptr) AccessChain 24(data) 25 248 72 26 + 250: 14(int) Load 249 + 251: 14(int) GroupNonUniformIMul 35 Reduce 250 + 252: 84(ptr) AccessChain 24(data) 25 246 72 26 + Store 252 251 + 253: 27(ptr) AccessChain 10(dti) 26 + 254: 6(int) Load 253 + 255: 27(ptr) AccessChain 10(dti) 26 + 256: 6(int) Load 255 + 257: 75(ptr) AccessChain 24(data) 25 256 72 + 258: 15(ivec4) Load 257 + 259: 93(ivec2) VectorShuffle 258 258 0 1 + 260: 93(ivec2) GroupNonUniformIMul 35 Reduce 259 + 261: 75(ptr) AccessChain 24(data) 25 254 72 + 262: 15(ivec4) Load 261 + 263: 15(ivec4) VectorShuffle 262 260 4 5 2 3 + Store 261 263 + 264: 27(ptr) AccessChain 10(dti) 26 + 265: 6(int) Load 264 + 266: 27(ptr) AccessChain 10(dti) 26 + 267: 6(int) Load 266 + 268: 75(ptr) AccessChain 24(data) 25 267 72 + 269: 15(ivec4) Load 268 + 270: 105(ivec3) VectorShuffle 269 269 0 1 2 + 271: 105(ivec3) GroupNonUniformIMul 35 Reduce 270 + 272: 75(ptr) AccessChain 24(data) 25 265 72 + 273: 15(ivec4) Load 272 + 274: 15(ivec4) VectorShuffle 273 271 4 5 6 3 + Store 272 274 + 275: 27(ptr) AccessChain 10(dti) 26 + 276: 6(int) Load 275 + 277: 27(ptr) AccessChain 10(dti) 26 + 278: 6(int) Load 277 + 279: 118(ptr) AccessChain 24(data) 25 278 115 + 280: 17(fvec4) Load 279 + 281: 17(fvec4) GroupNonUniformFMul 35 Reduce 280 + 282: 118(ptr) AccessChain 24(data) 25 276 115 + Store 282 281 + 283: 27(ptr) AccessChain 10(dti) 26 + 284: 6(int) Load 283 + 285: 27(ptr) AccessChain 10(dti) 26 + 286: 6(int) Load 285 + 287: 127(ptr) AccessChain 24(data) 25 286 115 26 + 288: 16(float) Load 287 + 289: 16(float) GroupNonUniformFMul 35 Reduce 288 + 290: 127(ptr) AccessChain 24(data) 25 284 115 26 + Store 290 289 + 291: 27(ptr) AccessChain 10(dti) 26 + 292: 6(int) Load 291 + 293: 27(ptr) AccessChain 10(dti) 26 + 294: 6(int) Load 293 + 295: 118(ptr) AccessChain 24(data) 25 294 115 + 296: 17(fvec4) Load 295 + 297: 136(fvec2) VectorShuffle 296 296 0 1 + 298: 136(fvec2) GroupNonUniformFMul 35 Reduce 297 + 299: 118(ptr) AccessChain 24(data) 25 292 115 + 300: 17(fvec4) Load 299 + 301: 17(fvec4) VectorShuffle 300 298 4 5 2 3 + Store 299 301 + 302: 27(ptr) AccessChain 10(dti) 26 + 303: 6(int) Load 302 + 304: 27(ptr) AccessChain 10(dti) 26 + 305: 6(int) Load 304 + 306: 118(ptr) AccessChain 24(data) 25 305 115 + 307: 17(fvec4) Load 306 + 308: 148(fvec3) VectorShuffle 307 307 0 1 2 + 309: 148(fvec3) GroupNonUniformFMul 35 Reduce 308 + 310: 118(ptr) AccessChain 24(data) 25 303 115 + 311: 17(fvec4) Load 310 + 312: 17(fvec4) VectorShuffle 311 309 4 5 6 3 + Store 310 312 + 313: 27(ptr) AccessChain 10(dti) 26 + 314: 6(int) Load 313 + 315: 27(ptr) AccessChain 10(dti) 26 + 316: 6(int) Load 315 + 317: 161(ptr) AccessChain 24(data) 25 316 158 + 318: 19(fvec4) Load 317 + 319: 19(fvec4) GroupNonUniformFMul 35 Reduce 318 + 320: 161(ptr) AccessChain 24(data) 25 314 158 + Store 320 319 + 321: 27(ptr) AccessChain 10(dti) 26 + 322: 6(int) Load 321 + 323: 27(ptr) AccessChain 10(dti) 26 + 324: 6(int) Load 323 + 325: 170(ptr) AccessChain 24(data) 25 324 158 26 + 326: 18(float) Load 325 + 327: 18(float) GroupNonUniformFMul 35 Reduce 326 + 328: 170(ptr) AccessChain 24(data) 25 322 158 26 + Store 328 327 + 329: 27(ptr) AccessChain 10(dti) 26 + 330: 6(int) Load 329 + 331: 27(ptr) AccessChain 10(dti) 26 + 332: 6(int) Load 331 + 333: 161(ptr) AccessChain 24(data) 25 332 158 + 334: 19(fvec4) Load 333 + 335: 179(fvec2) VectorShuffle 334 334 0 1 + 336: 179(fvec2) GroupNonUniformFMul 35 Reduce 335 + 337: 161(ptr) AccessChain 24(data) 25 330 158 + 338: 19(fvec4) Load 337 + 339: 19(fvec4) VectorShuffle 338 336 4 5 2 3 + Store 337 339 + 340: 27(ptr) AccessChain 10(dti) 26 + 341: 6(int) Load 340 + 342: 27(ptr) AccessChain 10(dti) 26 + 343: 6(int) Load 342 + 344: 161(ptr) AccessChain 24(data) 25 343 158 + 345: 19(fvec4) Load 344 + 346: 191(fvec3) VectorShuffle 345 345 0 1 2 + 347: 191(fvec3) GroupNonUniformFMul 35 Reduce 346 + 348: 161(ptr) AccessChain 24(data) 25 341 158 + 349: 19(fvec4) Load 348 + 350: 19(fvec4) VectorShuffle 349 347 4 5 6 3 + Store 348 350 + 351: 27(ptr) AccessChain 10(dti) 26 + 352: 6(int) Load 351 + 353: 27(ptr) AccessChain 10(dti) 26 + 354: 6(int) Load 353 + 355: 32(ptr) AccessChain 24(data) 25 354 25 + 356: 13(ivec4) Load 355 + 357: 13(ivec4) GroupNonUniformUMin 35 Reduce 356 + 358: 32(ptr) AccessChain 24(data) 25 352 25 + Store 358 357 + 359: 27(ptr) AccessChain 10(dti) 26 + 360: 6(int) Load 359 + 361: 27(ptr) AccessChain 10(dti) 26 + 362: 6(int) Load 361 + 363: 42(ptr) AccessChain 24(data) 25 362 25 26 + 364: 6(int) Load 363 + 365: 6(int) GroupNonUniformUMin 35 Reduce 364 + 366: 42(ptr) AccessChain 24(data) 25 360 25 26 + Store 366 365 + 367: 27(ptr) AccessChain 10(dti) 26 + 368: 6(int) Load 367 + 369: 27(ptr) AccessChain 10(dti) 26 + 370: 6(int) Load 369 + 371: 32(ptr) AccessChain 24(data) 25 370 25 + 372: 13(ivec4) Load 371 + 373: 51(ivec2) VectorShuffle 372 372 0 1 + 374: 51(ivec2) GroupNonUniformUMin 35 Reduce 373 + 375: 32(ptr) AccessChain 24(data) 25 368 25 + 376: 13(ivec4) Load 375 + 377: 13(ivec4) VectorShuffle 376 374 4 5 2 3 + Store 375 377 + 378: 27(ptr) AccessChain 10(dti) 26 + 379: 6(int) Load 378 + 380: 27(ptr) AccessChain 10(dti) 26 + 381: 6(int) Load 380 + 382: 32(ptr) AccessChain 24(data) 25 381 25 + 383: 13(ivec4) Load 382 + 384: 7(ivec3) VectorShuffle 383 383 0 1 2 + 385: 7(ivec3) GroupNonUniformUMin 35 Reduce 384 + 386: 32(ptr) AccessChain 24(data) 25 379 25 + 387: 13(ivec4) Load 386 + 388: 13(ivec4) VectorShuffle 387 385 4 5 6 3 + Store 386 388 + 389: 27(ptr) AccessChain 10(dti) 26 + 390: 6(int) Load 389 + 391: 27(ptr) AccessChain 10(dti) 26 + 392: 6(int) Load 391 + 393: 75(ptr) AccessChain 24(data) 25 392 72 + 394: 15(ivec4) Load 393 + 395: 15(ivec4) GroupNonUniformSMin 35 Reduce 394 + 396: 75(ptr) AccessChain 24(data) 25 390 72 + Store 396 395 + 397: 27(ptr) AccessChain 10(dti) 26 + 398: 6(int) Load 397 + 399: 27(ptr) AccessChain 10(dti) 26 + 400: 6(int) Load 399 + 401: 84(ptr) AccessChain 24(data) 25 400 72 26 + 402: 14(int) Load 401 + 403: 14(int) GroupNonUniformSMin 35 Reduce 402 + 404: 84(ptr) AccessChain 24(data) 25 398 72 26 + Store 404 403 + 405: 27(ptr) AccessChain 10(dti) 26 + 406: 6(int) Load 405 + 407: 27(ptr) AccessChain 10(dti) 26 + 408: 6(int) Load 407 + 409: 75(ptr) AccessChain 24(data) 25 408 72 + 410: 15(ivec4) Load 409 + 411: 93(ivec2) VectorShuffle 410 410 0 1 + 412: 93(ivec2) GroupNonUniformSMin 35 Reduce 411 + 413: 75(ptr) AccessChain 24(data) 25 406 72 + 414: 15(ivec4) Load 413 + 415: 15(ivec4) VectorShuffle 414 412 4 5 2 3 + Store 413 415 + 416: 27(ptr) AccessChain 10(dti) 26 + 417: 6(int) Load 416 + 418: 27(ptr) AccessChain 10(dti) 26 + 419: 6(int) Load 418 + 420: 75(ptr) AccessChain 24(data) 25 419 72 + 421: 15(ivec4) Load 420 + 422: 105(ivec3) VectorShuffle 421 421 0 1 2 + 423: 105(ivec3) GroupNonUniformSMin 35 Reduce 422 + 424: 75(ptr) AccessChain 24(data) 25 417 72 + 425: 15(ivec4) Load 424 + 426: 15(ivec4) VectorShuffle 425 423 4 5 6 3 + Store 424 426 + 427: 27(ptr) AccessChain 10(dti) 26 + 428: 6(int) Load 427 + 429: 27(ptr) AccessChain 10(dti) 26 + 430: 6(int) Load 429 + 431: 118(ptr) AccessChain 24(data) 25 430 115 + 432: 17(fvec4) Load 431 + 433: 17(fvec4) GroupNonUniformFMin 35 Reduce 432 + 434: 118(ptr) AccessChain 24(data) 25 428 115 + Store 434 433 + 435: 27(ptr) AccessChain 10(dti) 26 + 436: 6(int) Load 435 + 437: 27(ptr) AccessChain 10(dti) 26 + 438: 6(int) Load 437 + 439: 127(ptr) AccessChain 24(data) 25 438 115 26 + 440: 16(float) Load 439 + 441: 16(float) GroupNonUniformFMin 35 Reduce 440 + 442: 127(ptr) AccessChain 24(data) 25 436 115 26 + Store 442 441 + 443: 27(ptr) AccessChain 10(dti) 26 + 444: 6(int) Load 443 + 445: 27(ptr) AccessChain 10(dti) 26 + 446: 6(int) Load 445 + 447: 118(ptr) AccessChain 24(data) 25 446 115 + 448: 17(fvec4) Load 447 + 449: 136(fvec2) VectorShuffle 448 448 0 1 + 450: 136(fvec2) GroupNonUniformFMin 35 Reduce 449 + 451: 118(ptr) AccessChain 24(data) 25 444 115 + 452: 17(fvec4) Load 451 + 453: 17(fvec4) VectorShuffle 452 450 4 5 2 3 + Store 451 453 + 454: 27(ptr) AccessChain 10(dti) 26 + 455: 6(int) Load 454 + 456: 27(ptr) AccessChain 10(dti) 26 + 457: 6(int) Load 456 + 458: 118(ptr) AccessChain 24(data) 25 457 115 + 459: 17(fvec4) Load 458 + 460: 148(fvec3) VectorShuffle 459 459 0 1 2 + 461: 148(fvec3) GroupNonUniformFMin 35 Reduce 460 + 462: 118(ptr) AccessChain 24(data) 25 455 115 + 463: 17(fvec4) Load 462 + 464: 17(fvec4) VectorShuffle 463 461 4 5 6 3 + Store 462 464 + 465: 27(ptr) AccessChain 10(dti) 26 + 466: 6(int) Load 465 + 467: 27(ptr) AccessChain 10(dti) 26 + 468: 6(int) Load 467 + 469: 161(ptr) AccessChain 24(data) 25 468 158 + 470: 19(fvec4) Load 469 + 471: 19(fvec4) GroupNonUniformFMin 35 Reduce 470 + 472: 161(ptr) AccessChain 24(data) 25 466 158 + Store 472 471 + 473: 27(ptr) AccessChain 10(dti) 26 + 474: 6(int) Load 473 + 475: 27(ptr) AccessChain 10(dti) 26 + 476: 6(int) Load 475 + 477: 170(ptr) AccessChain 24(data) 25 476 158 26 + 478: 18(float) Load 477 + 479: 18(float) GroupNonUniformFMin 35 Reduce 478 + 480: 170(ptr) AccessChain 24(data) 25 474 158 26 + Store 480 479 + 481: 27(ptr) AccessChain 10(dti) 26 + 482: 6(int) Load 481 + 483: 27(ptr) AccessChain 10(dti) 26 + 484: 6(int) Load 483 + 485: 161(ptr) AccessChain 24(data) 25 484 158 + 486: 19(fvec4) Load 485 + 487: 179(fvec2) VectorShuffle 486 486 0 1 + 488: 179(fvec2) GroupNonUniformFMin 35 Reduce 487 + 489: 161(ptr) AccessChain 24(data) 25 482 158 + 490: 19(fvec4) Load 489 + 491: 19(fvec4) VectorShuffle 490 488 4 5 2 3 + Store 489 491 + 492: 27(ptr) AccessChain 10(dti) 26 + 493: 6(int) Load 492 + 494: 27(ptr) AccessChain 10(dti) 26 + 495: 6(int) Load 494 + 496: 161(ptr) AccessChain 24(data) 25 495 158 + 497: 19(fvec4) Load 496 + 498: 191(fvec3) VectorShuffle 497 497 0 1 2 + 499: 191(fvec3) GroupNonUniformFMin 35 Reduce 498 + 500: 161(ptr) AccessChain 24(data) 25 493 158 + 501: 19(fvec4) Load 500 + 502: 19(fvec4) VectorShuffle 501 499 4 5 6 3 + Store 500 502 + 503: 27(ptr) AccessChain 10(dti) 26 + 504: 6(int) Load 503 + 505: 27(ptr) AccessChain 10(dti) 26 + 506: 6(int) Load 505 + 507: 32(ptr) AccessChain 24(data) 25 506 25 + 508: 13(ivec4) Load 507 + 509: 13(ivec4) GroupNonUniformUMax 35 Reduce 508 + 510: 32(ptr) AccessChain 24(data) 25 504 25 + Store 510 509 + 511: 27(ptr) AccessChain 10(dti) 26 + 512: 6(int) Load 511 + 513: 27(ptr) AccessChain 10(dti) 26 + 514: 6(int) Load 513 + 515: 42(ptr) AccessChain 24(data) 25 514 25 26 + 516: 6(int) Load 515 + 517: 6(int) GroupNonUniformUMax 35 Reduce 516 + 518: 42(ptr) AccessChain 24(data) 25 512 25 26 + Store 518 517 + 519: 27(ptr) AccessChain 10(dti) 26 + 520: 6(int) Load 519 + 521: 27(ptr) AccessChain 10(dti) 26 + 522: 6(int) Load 521 + 523: 32(ptr) AccessChain 24(data) 25 522 25 + 524: 13(ivec4) Load 523 + 525: 51(ivec2) VectorShuffle 524 524 0 1 + 526: 51(ivec2) GroupNonUniformUMax 35 Reduce 525 + 527: 32(ptr) AccessChain 24(data) 25 520 25 + 528: 13(ivec4) Load 527 + 529: 13(ivec4) VectorShuffle 528 526 4 5 2 3 + Store 527 529 + 530: 27(ptr) AccessChain 10(dti) 26 + 531: 6(int) Load 530 + 532: 27(ptr) AccessChain 10(dti) 26 + 533: 6(int) Load 532 + 534: 32(ptr) AccessChain 24(data) 25 533 25 + 535: 13(ivec4) Load 534 + 536: 7(ivec3) VectorShuffle 535 535 0 1 2 + 537: 7(ivec3) GroupNonUniformUMax 35 Reduce 536 + 538: 32(ptr) AccessChain 24(data) 25 531 25 + 539: 13(ivec4) Load 538 + 540: 13(ivec4) VectorShuffle 539 537 4 5 6 3 + Store 538 540 + 541: 27(ptr) AccessChain 10(dti) 26 + 542: 6(int) Load 541 + 543: 27(ptr) AccessChain 10(dti) 26 + 544: 6(int) Load 543 + 545: 75(ptr) AccessChain 24(data) 25 544 72 + 546: 15(ivec4) Load 545 + 547: 15(ivec4) GroupNonUniformSMax 35 Reduce 546 + 548: 75(ptr) AccessChain 24(data) 25 542 72 + Store 548 547 + 549: 27(ptr) AccessChain 10(dti) 26 + 550: 6(int) Load 549 + 551: 27(ptr) AccessChain 10(dti) 26 + 552: 6(int) Load 551 + 553: 84(ptr) AccessChain 24(data) 25 552 72 26 + 554: 14(int) Load 553 + 555: 14(int) GroupNonUniformSMax 35 Reduce 554 + 556: 84(ptr) AccessChain 24(data) 25 550 72 26 + Store 556 555 + 557: 27(ptr) AccessChain 10(dti) 26 + 558: 6(int) Load 557 + 559: 27(ptr) AccessChain 10(dti) 26 + 560: 6(int) Load 559 + 561: 75(ptr) AccessChain 24(data) 25 560 72 + 562: 15(ivec4) Load 561 + 563: 93(ivec2) VectorShuffle 562 562 0 1 + 564: 93(ivec2) GroupNonUniformSMax 35 Reduce 563 + 565: 75(ptr) AccessChain 24(data) 25 558 72 + 566: 15(ivec4) Load 565 + 567: 15(ivec4) VectorShuffle 566 564 4 5 2 3 + Store 565 567 + 568: 27(ptr) AccessChain 10(dti) 26 + 569: 6(int) Load 568 + 570: 27(ptr) AccessChain 10(dti) 26 + 571: 6(int) Load 570 + 572: 75(ptr) AccessChain 24(data) 25 571 72 + 573: 15(ivec4) Load 572 + 574: 105(ivec3) VectorShuffle 573 573 0 1 2 + 575: 105(ivec3) GroupNonUniformSMax 35 Reduce 574 + 576: 75(ptr) AccessChain 24(data) 25 569 72 + 577: 15(ivec4) Load 576 + 578: 15(ivec4) VectorShuffle 577 575 4 5 6 3 + Store 576 578 + 579: 27(ptr) AccessChain 10(dti) 26 + 580: 6(int) Load 579 + 581: 27(ptr) AccessChain 10(dti) 26 + 582: 6(int) Load 581 + 583: 118(ptr) AccessChain 24(data) 25 582 115 + 584: 17(fvec4) Load 583 + 585: 17(fvec4) GroupNonUniformFMax 35 Reduce 584 + 586: 118(ptr) AccessChain 24(data) 25 580 115 + Store 586 585 + 587: 27(ptr) AccessChain 10(dti) 26 + 588: 6(int) Load 587 + 589: 27(ptr) AccessChain 10(dti) 26 + 590: 6(int) Load 589 + 591: 127(ptr) AccessChain 24(data) 25 590 115 26 + 592: 16(float) Load 591 + 593: 16(float) GroupNonUniformFMax 35 Reduce 592 + 594: 127(ptr) AccessChain 24(data) 25 588 115 26 + Store 594 593 + 595: 27(ptr) AccessChain 10(dti) 26 + 596: 6(int) Load 595 + 597: 27(ptr) AccessChain 10(dti) 26 + 598: 6(int) Load 597 + 599: 118(ptr) AccessChain 24(data) 25 598 115 + 600: 17(fvec4) Load 599 + 601: 136(fvec2) VectorShuffle 600 600 0 1 + 602: 136(fvec2) GroupNonUniformFMax 35 Reduce 601 + 603: 118(ptr) AccessChain 24(data) 25 596 115 + 604: 17(fvec4) Load 603 + 605: 17(fvec4) VectorShuffle 604 602 4 5 2 3 + Store 603 605 + 606: 27(ptr) AccessChain 10(dti) 26 + 607: 6(int) Load 606 + 608: 27(ptr) AccessChain 10(dti) 26 + 609: 6(int) Load 608 + 610: 118(ptr) AccessChain 24(data) 25 609 115 + 611: 17(fvec4) Load 610 + 612: 148(fvec3) VectorShuffle 611 611 0 1 2 + 613: 148(fvec3) GroupNonUniformFMax 35 Reduce 612 + 614: 118(ptr) AccessChain 24(data) 25 607 115 + 615: 17(fvec4) Load 614 + 616: 17(fvec4) VectorShuffle 615 613 4 5 6 3 + Store 614 616 + 617: 27(ptr) AccessChain 10(dti) 26 + 618: 6(int) Load 617 + 619: 27(ptr) AccessChain 10(dti) 26 + 620: 6(int) Load 619 + 621: 161(ptr) AccessChain 24(data) 25 620 158 + 622: 19(fvec4) Load 621 + 623: 19(fvec4) GroupNonUniformFMax 35 Reduce 622 + 624: 161(ptr) AccessChain 24(data) 25 618 158 + Store 624 623 + 625: 27(ptr) AccessChain 10(dti) 26 + 626: 6(int) Load 625 + 627: 27(ptr) AccessChain 10(dti) 26 + 628: 6(int) Load 627 + 629: 170(ptr) AccessChain 24(data) 25 628 158 26 + 630: 18(float) Load 629 + 631: 18(float) GroupNonUniformFMax 35 Reduce 630 + 632: 170(ptr) AccessChain 24(data) 25 626 158 26 + Store 632 631 + 633: 27(ptr) AccessChain 10(dti) 26 + 634: 6(int) Load 633 + 635: 27(ptr) AccessChain 10(dti) 26 + 636: 6(int) Load 635 + 637: 161(ptr) AccessChain 24(data) 25 636 158 + 638: 19(fvec4) Load 637 + 639: 179(fvec2) VectorShuffle 638 638 0 1 + 640: 179(fvec2) GroupNonUniformFMax 35 Reduce 639 + 641: 161(ptr) AccessChain 24(data) 25 634 158 + 642: 19(fvec4) Load 641 + 643: 19(fvec4) VectorShuffle 642 640 4 5 2 3 + Store 641 643 + 644: 27(ptr) AccessChain 10(dti) 26 + 645: 6(int) Load 644 + 646: 27(ptr) AccessChain 10(dti) 26 + 647: 6(int) Load 646 + 648: 161(ptr) AccessChain 24(data) 25 647 158 + 649: 19(fvec4) Load 648 + 650: 191(fvec3) VectorShuffle 649 649 0 1 2 + 651: 191(fvec3) GroupNonUniformFMax 35 Reduce 650 + 652: 161(ptr) AccessChain 24(data) 25 645 158 + 653: 19(fvec4) Load 652 + 654: 19(fvec4) VectorShuffle 653 651 4 5 6 3 + Store 652 654 + 655: 27(ptr) AccessChain 10(dti) 26 + 656: 6(int) Load 655 + 657: 27(ptr) AccessChain 10(dti) 26 + 658: 6(int) Load 657 + 659: 32(ptr) AccessChain 24(data) 25 658 25 + 660: 13(ivec4) Load 659 + 661: 13(ivec4) GroupNonUniformBitwiseAnd 35 Reduce 660 + 662: 32(ptr) AccessChain 24(data) 25 656 25 + Store 662 661 + 663: 27(ptr) AccessChain 10(dti) 26 + 664: 6(int) Load 663 + 665: 27(ptr) AccessChain 10(dti) 26 + 666: 6(int) Load 665 + 667: 42(ptr) AccessChain 24(data) 25 666 25 26 + 668: 6(int) Load 667 + 669: 6(int) GroupNonUniformBitwiseAnd 35 Reduce 668 + 670: 42(ptr) AccessChain 24(data) 25 664 25 26 + Store 670 669 + 671: 27(ptr) AccessChain 10(dti) 26 + 672: 6(int) Load 671 + 673: 27(ptr) AccessChain 10(dti) 26 + 674: 6(int) Load 673 + 675: 32(ptr) AccessChain 24(data) 25 674 25 + 676: 13(ivec4) Load 675 + 677: 51(ivec2) VectorShuffle 676 676 0 1 + 678: 51(ivec2) GroupNonUniformBitwiseAnd 35 Reduce 677 + 679: 32(ptr) AccessChain 24(data) 25 672 25 + 680: 13(ivec4) Load 679 + 681: 13(ivec4) VectorShuffle 680 678 4 5 2 3 + Store 679 681 + 682: 27(ptr) AccessChain 10(dti) 26 + 683: 6(int) Load 682 + 684: 27(ptr) AccessChain 10(dti) 26 + 685: 6(int) Load 684 + 686: 32(ptr) AccessChain 24(data) 25 685 25 + 687: 13(ivec4) Load 686 + 688: 7(ivec3) VectorShuffle 687 687 0 1 2 + 689: 7(ivec3) GroupNonUniformBitwiseAnd 35 Reduce 688 + 690: 32(ptr) AccessChain 24(data) 25 683 25 + 691: 13(ivec4) Load 690 + 692: 13(ivec4) VectorShuffle 691 689 4 5 6 3 + Store 690 692 + 693: 27(ptr) AccessChain 10(dti) 26 + 694: 6(int) Load 693 + 695: 27(ptr) AccessChain 10(dti) 26 + 696: 6(int) Load 695 + 697: 75(ptr) AccessChain 24(data) 25 696 72 + 698: 15(ivec4) Load 697 + 699: 15(ivec4) GroupNonUniformBitwiseAnd 35 Reduce 698 + 700: 75(ptr) AccessChain 24(data) 25 694 72 + Store 700 699 + 701: 27(ptr) AccessChain 10(dti) 26 + 702: 6(int) Load 701 + 703: 27(ptr) AccessChain 10(dti) 26 + 704: 6(int) Load 703 + 705: 84(ptr) AccessChain 24(data) 25 704 72 26 + 706: 14(int) Load 705 + 707: 14(int) GroupNonUniformBitwiseAnd 35 Reduce 706 + 708: 84(ptr) AccessChain 24(data) 25 702 72 26 + Store 708 707 + 709: 27(ptr) AccessChain 10(dti) 26 + 710: 6(int) Load 709 + 711: 27(ptr) AccessChain 10(dti) 26 + 712: 6(int) Load 711 + 713: 75(ptr) AccessChain 24(data) 25 712 72 + 714: 15(ivec4) Load 713 + 715: 93(ivec2) VectorShuffle 714 714 0 1 + 716: 93(ivec2) GroupNonUniformBitwiseAnd 35 Reduce 715 + 717: 75(ptr) AccessChain 24(data) 25 710 72 + 718: 15(ivec4) Load 717 + 719: 15(ivec4) VectorShuffle 718 716 4 5 2 3 + Store 717 719 + 720: 27(ptr) AccessChain 10(dti) 26 + 721: 6(int) Load 720 + 722: 27(ptr) AccessChain 10(dti) 26 + 723: 6(int) Load 722 + 724: 75(ptr) AccessChain 24(data) 25 723 72 + 725: 15(ivec4) Load 724 + 726: 105(ivec3) VectorShuffle 725 725 0 1 2 + 727: 105(ivec3) GroupNonUniformBitwiseAnd 35 Reduce 726 + 728: 75(ptr) AccessChain 24(data) 25 721 72 + 729: 15(ivec4) Load 728 + 730: 15(ivec4) VectorShuffle 729 727 4 5 6 3 + Store 728 730 + 731: 27(ptr) AccessChain 10(dti) 26 + 732: 6(int) Load 731 + 733: 27(ptr) AccessChain 10(dti) 26 + 734: 6(int) Load 733 + 735: 32(ptr) AccessChain 24(data) 25 734 25 + 736: 13(ivec4) Load 735 + 737: 13(ivec4) GroupNonUniformBitwiseOr 35 Reduce 736 + 738: 32(ptr) AccessChain 24(data) 25 732 25 + Store 738 737 + 739: 27(ptr) AccessChain 10(dti) 26 + 740: 6(int) Load 739 + 741: 27(ptr) AccessChain 10(dti) 26 + 742: 6(int) Load 741 + 743: 42(ptr) AccessChain 24(data) 25 742 25 26 + 744: 6(int) Load 743 + 745: 6(int) GroupNonUniformBitwiseOr 35 Reduce 744 + 746: 42(ptr) AccessChain 24(data) 25 740 25 26 + Store 746 745 + 747: 27(ptr) AccessChain 10(dti) 26 + 748: 6(int) Load 747 + 749: 27(ptr) AccessChain 10(dti) 26 + 750: 6(int) Load 749 + 751: 32(ptr) AccessChain 24(data) 25 750 25 + 752: 13(ivec4) Load 751 + 753: 51(ivec2) VectorShuffle 752 752 0 1 + 754: 51(ivec2) GroupNonUniformBitwiseOr 35 Reduce 753 + 755: 32(ptr) AccessChain 24(data) 25 748 25 + 756: 13(ivec4) Load 755 + 757: 13(ivec4) VectorShuffle 756 754 4 5 2 3 + Store 755 757 + 758: 27(ptr) AccessChain 10(dti) 26 + 759: 6(int) Load 758 + 760: 27(ptr) AccessChain 10(dti) 26 + 761: 6(int) Load 760 + 762: 32(ptr) AccessChain 24(data) 25 761 25 + 763: 13(ivec4) Load 762 + 764: 7(ivec3) VectorShuffle 763 763 0 1 2 + 765: 7(ivec3) GroupNonUniformBitwiseOr 35 Reduce 764 + 766: 32(ptr) AccessChain 24(data) 25 759 25 + 767: 13(ivec4) Load 766 + 768: 13(ivec4) VectorShuffle 767 765 4 5 6 3 + Store 766 768 + 769: 27(ptr) AccessChain 10(dti) 26 + 770: 6(int) Load 769 + 771: 27(ptr) AccessChain 10(dti) 26 + 772: 6(int) Load 771 + 773: 75(ptr) AccessChain 24(data) 25 772 72 + 774: 15(ivec4) Load 773 + 775: 15(ivec4) GroupNonUniformBitwiseOr 35 Reduce 774 + 776: 75(ptr) AccessChain 24(data) 25 770 72 + Store 776 775 + 777: 27(ptr) AccessChain 10(dti) 26 + 778: 6(int) Load 777 + 779: 27(ptr) AccessChain 10(dti) 26 + 780: 6(int) Load 779 + 781: 84(ptr) AccessChain 24(data) 25 780 72 26 + 782: 14(int) Load 781 + 783: 14(int) GroupNonUniformBitwiseOr 35 Reduce 782 + 784: 84(ptr) AccessChain 24(data) 25 778 72 26 + Store 784 783 + 785: 27(ptr) AccessChain 10(dti) 26 + 786: 6(int) Load 785 + 787: 27(ptr) AccessChain 10(dti) 26 + 788: 6(int) Load 787 + 789: 75(ptr) AccessChain 24(data) 25 788 72 + 790: 15(ivec4) Load 789 + 791: 93(ivec2) VectorShuffle 790 790 0 1 + 792: 93(ivec2) GroupNonUniformBitwiseOr 35 Reduce 791 + 793: 75(ptr) AccessChain 24(data) 25 786 72 + 794: 15(ivec4) Load 793 + 795: 15(ivec4) VectorShuffle 794 792 4 5 2 3 + Store 793 795 + 796: 27(ptr) AccessChain 10(dti) 26 + 797: 6(int) Load 796 + 798: 27(ptr) AccessChain 10(dti) 26 + 799: 6(int) Load 798 + 800: 75(ptr) AccessChain 24(data) 25 799 72 + 801: 15(ivec4) Load 800 + 802: 105(ivec3) VectorShuffle 801 801 0 1 2 + 803: 105(ivec3) GroupNonUniformBitwiseOr 35 Reduce 802 + 804: 75(ptr) AccessChain 24(data) 25 797 72 + 805: 15(ivec4) Load 804 + 806: 15(ivec4) VectorShuffle 805 803 4 5 6 3 + Store 804 806 + 807: 27(ptr) AccessChain 10(dti) 26 + 808: 6(int) Load 807 + 809: 27(ptr) AccessChain 10(dti) 26 + 810: 6(int) Load 809 + 811: 32(ptr) AccessChain 24(data) 25 810 25 + 812: 13(ivec4) Load 811 + 813: 13(ivec4) GroupNonUniformBitwiseXor 35 Reduce 812 + 814: 32(ptr) AccessChain 24(data) 25 808 25 + Store 814 813 + 815: 27(ptr) AccessChain 10(dti) 26 + 816: 6(int) Load 815 + 817: 27(ptr) AccessChain 10(dti) 26 + 818: 6(int) Load 817 + 819: 42(ptr) AccessChain 24(data) 25 818 25 26 + 820: 6(int) Load 819 + 821: 6(int) GroupNonUniformBitwiseXor 35 Reduce 820 + 822: 42(ptr) AccessChain 24(data) 25 816 25 26 + Store 822 821 + 823: 27(ptr) AccessChain 10(dti) 26 + 824: 6(int) Load 823 + 825: 27(ptr) AccessChain 10(dti) 26 + 826: 6(int) Load 825 + 827: 32(ptr) AccessChain 24(data) 25 826 25 + 828: 13(ivec4) Load 827 + 829: 51(ivec2) VectorShuffle 828 828 0 1 + 830: 51(ivec2) GroupNonUniformBitwiseXor 35 Reduce 829 + 831: 32(ptr) AccessChain 24(data) 25 824 25 + 832: 13(ivec4) Load 831 + 833: 13(ivec4) VectorShuffle 832 830 4 5 2 3 + Store 831 833 + 834: 27(ptr) AccessChain 10(dti) 26 + 835: 6(int) Load 834 + 836: 27(ptr) AccessChain 10(dti) 26 + 837: 6(int) Load 836 + 838: 32(ptr) AccessChain 24(data) 25 837 25 + 839: 13(ivec4) Load 838 + 840: 7(ivec3) VectorShuffle 839 839 0 1 2 + 841: 7(ivec3) GroupNonUniformBitwiseXor 35 Reduce 840 + 842: 32(ptr) AccessChain 24(data) 25 835 25 + 843: 13(ivec4) Load 842 + 844: 13(ivec4) VectorShuffle 843 841 4 5 6 3 + Store 842 844 + 845: 27(ptr) AccessChain 10(dti) 26 + 846: 6(int) Load 845 + 847: 27(ptr) AccessChain 10(dti) 26 + 848: 6(int) Load 847 + 849: 75(ptr) AccessChain 24(data) 25 848 72 + 850: 15(ivec4) Load 849 + 851: 15(ivec4) GroupNonUniformBitwiseXor 35 Reduce 850 + 852: 75(ptr) AccessChain 24(data) 25 846 72 + Store 852 851 + 853: 27(ptr) AccessChain 10(dti) 26 + 854: 6(int) Load 853 + 855: 27(ptr) AccessChain 10(dti) 26 + 856: 6(int) Load 855 + 857: 84(ptr) AccessChain 24(data) 25 856 72 26 + 858: 14(int) Load 857 + 859: 14(int) GroupNonUniformBitwiseXor 35 Reduce 858 + 860: 84(ptr) AccessChain 24(data) 25 854 72 26 + Store 860 859 + 861: 27(ptr) AccessChain 10(dti) 26 + 862: 6(int) Load 861 + 863: 27(ptr) AccessChain 10(dti) 26 + 864: 6(int) Load 863 + 865: 75(ptr) AccessChain 24(data) 25 864 72 + 866: 15(ivec4) Load 865 + 867: 93(ivec2) VectorShuffle 866 866 0 1 + 868: 93(ivec2) GroupNonUniformBitwiseXor 35 Reduce 867 + 869: 75(ptr) AccessChain 24(data) 25 862 72 + 870: 15(ivec4) Load 869 + 871: 15(ivec4) VectorShuffle 870 868 4 5 2 3 + Store 869 871 + 872: 27(ptr) AccessChain 10(dti) 26 + 873: 6(int) Load 872 + 874: 27(ptr) AccessChain 10(dti) 26 + 875: 6(int) Load 874 + 876: 75(ptr) AccessChain 24(data) 25 875 72 + 877: 15(ivec4) Load 876 + 878: 105(ivec3) VectorShuffle 877 877 0 1 2 + 879: 105(ivec3) GroupNonUniformBitwiseXor 35 Reduce 878 + 880: 75(ptr) AccessChain 24(data) 25 873 72 + 881: 15(ivec4) Load 880 + 882: 15(ivec4) VectorShuffle 881 879 4 5 6 3 + Store 880 882 + 883: 27(ptr) AccessChain 10(dti) 26 + 884: 6(int) Load 883 + 885: 27(ptr) AccessChain 10(dti) 26 + 886: 6(int) Load 885 + 887: 42(ptr) AccessChain 24(data) 25 886 25 26 + 888: 6(int) Load 887 + 890: 889(bool) IEqual 888 26 + 891: 13(ivec4) GroupNonUniformBallot 35 890 + 892: 6(int) GroupNonUniformBallotBitCount 35 Reduce 891 + 893: 42(ptr) AccessChain 24(data) 25 884 25 26 + Store 893 892 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.wavevote.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.wavevote.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.wavevote.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.wavevote.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,316 @@ +hlsl.wavevote.comp +Shader version: 500 +local_size = (32, 16, 1) +0:? Sequence +0:5 Function Definition: @CSMain(vu3; ( temp void) +0:5 Function Parameters: +0:5 'dti' ( in 3-component vector of uint) +0:? Sequence +0:6 move second child to first child ( temp uint64_t) +0:6 indirect index (layout( row_major std430) buffer uint64_t) +0:6 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t) +0:6 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data}) +0:6 Constant: +0:6 0 (const uint) +0:6 direct index ( temp uint) +0:6 'dti' ( in 3-component vector of uint) +0:6 Constant: +0:6 0 (const int) +0:6 Construct uint64 (layout( row_major std430) buffer uint64_t) +0:6 Convert uint to uint64 ( temp 4-component vector of uint64_t) +0:6 subgroupBallot ( temp 4-component vector of uint) +0:6 subgroupAny ( temp bool) +0:6 Compare Equal ( temp bool) +0:6 direct index ( temp uint) +0:6 'dti' ( in 3-component vector of uint) +0:6 Constant: +0:6 0 (const int) +0:6 Constant: +0:6 0 (const uint) +0:7 move second child to first child ( temp uint64_t) +0:7 indirect index (layout( row_major std430) buffer uint64_t) +0:7 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t) +0:7 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data}) +0:7 Constant: +0:7 0 (const uint) +0:7 direct index ( temp uint) +0:7 'dti' ( in 3-component vector of uint) +0:7 Constant: +0:7 1 (const int) +0:7 Construct uint64 (layout( row_major std430) buffer uint64_t) +0:7 Convert uint to uint64 ( temp 4-component vector of uint64_t) +0:7 subgroupBallot ( temp 4-component vector of uint) +0:7 subgroupAll ( temp bool) +0:7 Compare Equal ( temp bool) +0:7 direct index ( temp uint) +0:7 'dti' ( in 3-component vector of uint) +0:7 Constant: +0:7 1 (const int) +0:7 Constant: +0:7 0 (const uint) +0:8 move second child to first child ( temp uint64_t) +0:8 indirect index (layout( row_major std430) buffer uint64_t) +0:8 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t) +0:8 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data}) +0:8 Constant: +0:8 0 (const uint) +0:8 direct index ( temp uint) +0:8 'dti' ( in 3-component vector of uint) +0:8 Constant: +0:8 2 (const int) +0:8 Construct uint64 (layout( row_major std430) buffer uint64_t) +0:8 Convert uint to uint64 ( temp 4-component vector of uint64_t) +0:8 subgroupBallot ( temp 4-component vector of uint) +0:8 subgroupAllEqual ( temp bool) +0:8 Compare Equal ( temp bool) +0:8 direct index ( temp uint) +0:8 'dti' ( in 3-component vector of uint) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 0 (const uint) +0:9 move second child to first child ( temp uint64_t) +0:9 indirect index (layout( row_major std430) buffer uint64_t) +0:9 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t) +0:9 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data}) +0:9 Constant: +0:9 0 (const uint) +0:9 direct index ( temp uint) +0:9 'dti' ( in 3-component vector of uint) +0:9 Constant: +0:9 2 (const int) +0:9 Construct uint64 (layout( row_major std430) buffer uint64_t) +0:9 Convert uint to uint64 ( temp 4-component vector of uint64_t) +0:9 subgroupBallot ( temp 4-component vector of uint) +0:9 subgroupAllEqual ( temp bool) +0:9 direct index ( temp uint) +0:9 'dti' ( in 3-component vector of uint) +0:9 Constant: +0:9 2 (const int) +0:5 Function Definition: CSMain( ( temp void) +0:5 Function Parameters: +0:? Sequence +0:5 move second child to first child ( temp 3-component vector of uint) +0:? 'dti' ( temp 3-component vector of uint) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) +0:5 Function Call: @CSMain(vu3; ( temp void) +0:? 'dti' ( temp 3-component vector of uint) +0:? Linker Objects +0:? 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data}) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) + + +Linked compute stage: + + +Shader version: 500 +local_size = (32, 16, 1) +0:? Sequence +0:5 Function Definition: @CSMain(vu3; ( temp void) +0:5 Function Parameters: +0:5 'dti' ( in 3-component vector of uint) +0:? Sequence +0:6 move second child to first child ( temp uint64_t) +0:6 indirect index (layout( row_major std430) buffer uint64_t) +0:6 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t) +0:6 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data}) +0:6 Constant: +0:6 0 (const uint) +0:6 direct index ( temp uint) +0:6 'dti' ( in 3-component vector of uint) +0:6 Constant: +0:6 0 (const int) +0:6 Construct uint64 (layout( row_major std430) buffer uint64_t) +0:6 Convert uint to uint64 ( temp 4-component vector of uint64_t) +0:6 subgroupBallot ( temp 4-component vector of uint) +0:6 subgroupAny ( temp bool) +0:6 Compare Equal ( temp bool) +0:6 direct index ( temp uint) +0:6 'dti' ( in 3-component vector of uint) +0:6 Constant: +0:6 0 (const int) +0:6 Constant: +0:6 0 (const uint) +0:7 move second child to first child ( temp uint64_t) +0:7 indirect index (layout( row_major std430) buffer uint64_t) +0:7 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t) +0:7 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data}) +0:7 Constant: +0:7 0 (const uint) +0:7 direct index ( temp uint) +0:7 'dti' ( in 3-component vector of uint) +0:7 Constant: +0:7 1 (const int) +0:7 Construct uint64 (layout( row_major std430) buffer uint64_t) +0:7 Convert uint to uint64 ( temp 4-component vector of uint64_t) +0:7 subgroupBallot ( temp 4-component vector of uint) +0:7 subgroupAll ( temp bool) +0:7 Compare Equal ( temp bool) +0:7 direct index ( temp uint) +0:7 'dti' ( in 3-component vector of uint) +0:7 Constant: +0:7 1 (const int) +0:7 Constant: +0:7 0 (const uint) +0:8 move second child to first child ( temp uint64_t) +0:8 indirect index (layout( row_major std430) buffer uint64_t) +0:8 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t) +0:8 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data}) +0:8 Constant: +0:8 0 (const uint) +0:8 direct index ( temp uint) +0:8 'dti' ( in 3-component vector of uint) +0:8 Constant: +0:8 2 (const int) +0:8 Construct uint64 (layout( row_major std430) buffer uint64_t) +0:8 Convert uint to uint64 ( temp 4-component vector of uint64_t) +0:8 subgroupBallot ( temp 4-component vector of uint) +0:8 subgroupAllEqual ( temp bool) +0:8 Compare Equal ( temp bool) +0:8 direct index ( temp uint) +0:8 'dti' ( in 3-component vector of uint) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 0 (const uint) +0:9 move second child to first child ( temp uint64_t) +0:9 indirect index (layout( row_major std430) buffer uint64_t) +0:9 @data: direct index for structure (layout( row_major std430) buffer unsized 1-element array of uint64_t) +0:9 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data}) +0:9 Constant: +0:9 0 (const uint) +0:9 direct index ( temp uint) +0:9 'dti' ( in 3-component vector of uint) +0:9 Constant: +0:9 2 (const int) +0:9 Construct uint64 (layout( row_major std430) buffer uint64_t) +0:9 Convert uint to uint64 ( temp 4-component vector of uint64_t) +0:9 subgroupBallot ( temp 4-component vector of uint) +0:9 subgroupAllEqual ( temp bool) +0:9 direct index ( temp uint) +0:9 'dti' ( in 3-component vector of uint) +0:9 Constant: +0:9 2 (const int) +0:5 Function Definition: CSMain( ( temp void) +0:5 Function Parameters: +0:? Sequence +0:5 move second child to first child ( temp 3-component vector of uint) +0:? 'dti' ( temp 3-component vector of uint) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) +0:5 Function Call: @CSMain(vu3; ( temp void) +0:? 'dti' ( temp 3-component vector of uint) +0:? Linker Objects +0:? 'data' (layout( row_major std430) buffer block{layout( row_major std430) buffer unsized 1-element array of uint64_t @data}) +0:? 'dti' ( in 3-component vector of uint GlobalInvocationID) + +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 75 + + Capability Shader + Capability Int64 + Capability GroupNonUniform + Capability GroupNonUniformVote + Capability GroupNonUniformBallot + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "CSMain" 70 + ExecutionMode 4 LocalSize 32 16 1 + Source HLSL 500 + Name 4 "CSMain" + Name 11 "@CSMain(vu3;" + Name 10 "dti" + Name 15 "data" + MemberName 15(data) 0 "@data" + Name 17 "data" + Name 68 "dti" + Name 70 "dti" + Name 72 "param" + Decorate 14 ArrayStride 8 + MemberDecorate 15(data) 0 Offset 0 + Decorate 15(data) BufferBlock + Decorate 17(data) DescriptorSet 0 + Decorate 70(dti) BuiltIn GlobalInvocationId + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypeVector 6(int) 3 + 8: TypePointer Function 7(ivec3) + 9: TypeFunction 2 8(ptr) + 13: TypeInt 64 0 + 14: TypeRuntimeArray 13(int) + 15(data): TypeStruct 14 + 16: TypePointer Uniform 15(data) + 17(data): 16(ptr) Variable Uniform + 18: TypeInt 32 1 + 19: 18(int) Constant 0 + 20: 6(int) Constant 0 + 21: TypePointer Function 6(int) + 26: TypeBool + 28: 6(int) Constant 3 + 30: TypeVector 6(int) 4 + 32: TypeVector 13(int) 4 + 35: TypePointer Uniform 13(int) + 37: 6(int) Constant 1 + 48: 6(int) Constant 2 + 69: TypePointer Input 7(ivec3) + 70(dti): 69(ptr) Variable Input + 4(CSMain): 2 Function None 3 + 5: Label + 68(dti): 8(ptr) Variable Function + 72(param): 8(ptr) Variable Function + 71: 7(ivec3) Load 70(dti) + Store 68(dti) 71 + 73: 7(ivec3) Load 68(dti) + Store 72(param) 73 + 74: 2 FunctionCall 11(@CSMain(vu3;) 72(param) + Return + FunctionEnd +11(@CSMain(vu3;): 2 Function None 9 + 10(dti): 8(ptr) FunctionParameter + 12: Label + 22: 21(ptr) AccessChain 10(dti) 20 + 23: 6(int) Load 22 + 24: 21(ptr) AccessChain 10(dti) 20 + 25: 6(int) Load 24 + 27: 26(bool) IEqual 25 20 + 29: 26(bool) GroupNonUniformAny 28 27 + 31: 30(ivec4) GroupNonUniformBallot 28 29 + 33: 32(ivec4) UConvert 31 + 34: 13(int) CompositeExtract 33 0 + 36: 35(ptr) AccessChain 17(data) 19 23 + Store 36 34 + 38: 21(ptr) AccessChain 10(dti) 37 + 39: 6(int) Load 38 + 40: 21(ptr) AccessChain 10(dti) 37 + 41: 6(int) Load 40 + 42: 26(bool) IEqual 41 20 + 43: 26(bool) GroupNonUniformAll 28 42 + 44: 30(ivec4) GroupNonUniformBallot 28 43 + 45: 32(ivec4) UConvert 44 + 46: 13(int) CompositeExtract 45 0 + 47: 35(ptr) AccessChain 17(data) 19 39 + Store 47 46 + 49: 21(ptr) AccessChain 10(dti) 48 + 50: 6(int) Load 49 + 51: 21(ptr) AccessChain 10(dti) 48 + 52: 6(int) Load 51 + 53: 26(bool) IEqual 52 20 + 54: 26(bool) GroupNonUniformAllEqual 28 53 + 55: 30(ivec4) GroupNonUniformBallot 28 54 + 56: 32(ivec4) UConvert 55 + 57: 13(int) CompositeExtract 56 0 + 58: 35(ptr) AccessChain 17(data) 19 50 + Store 58 57 + 59: 21(ptr) AccessChain 10(dti) 48 + 60: 6(int) Load 59 + 61: 21(ptr) AccessChain 10(dti) 48 + 62: 6(int) Load 61 + 63: 26(bool) GroupNonUniformAllEqual 28 62 + 64: 30(ivec4) GroupNonUniformBallot 28 63 + 65: 32(ivec4) UConvert 64 + 66: 13(int) CompositeExtract 65 0 + 67: 35(ptr) AccessChain 17(data) 19 60 + Store 67 66 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.whileLoop.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.whileLoop.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.whileLoop.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.whileLoop.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -96,7 +96,7 @@ 0:? 'input' (layout( location=0) in 4-component vector of float) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 52 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.y-negate-1.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.y-negate-1.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.y-negate-1.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.y-negate-1.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -72,7 +72,7 @@ 0:? '@entryPointOutput' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 34 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.y-negate-2.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.y-negate-2.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.y-negate-2.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.y-negate-2.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -80,7 +80,7 @@ 0:? 'position' ( out 4-component vector of float Position) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 37 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.y-negate-3.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.y-negate-3.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/hlsl.y-negate-3.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/hlsl.y-negate-3.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -126,7 +126,7 @@ 0:? '@entryPointOutput.somethingelse' (layout( location=0) out int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 50 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/link1.vk.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/link1.vk.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/link1.vk.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/link1.vk.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -2,30 +2,105 @@ Shader version: 450 gl_FragCoord origin is upper left 0:? Sequence -0:7 Function Definition: main( ( global void) -0:7 Function Parameters: -0:9 Sequence -0:9 move second child to first child ( temp highp 4-component vector of float) -0:9 'color' ( out highp 4-component vector of float) -0:9 Function Call: getColor( ( global highp 4-component vector of float) +0:16 Function Definition: main( ( global void) +0:16 Function Parameters: +0:18 Sequence +0:18 move second child to first child ( temp highp 4-component vector of float) +0:18 'color' (layout( location=0) out highp 4-component vector of float) +0:18 Function Call: getColor( ( global highp 4-component vector of float) +0:20 move second child to first child ( temp highp int) +0:20 direct index ( temp highp int) +0:20 'a1' ( global unsized 9-element array of highp int) +0:20 Constant: +0:20 8 (const int) +0:20 Constant: +0:20 1 (const int) +0:21 move second child to first child ( temp highp int) +0:21 direct index ( temp highp int) +0:21 'a2' ( global unsized 2-element array of highp int) +0:21 Constant: +0:21 1 (const int) +0:21 Constant: +0:21 1 (const int) +0:22 move second child to first child ( temp highp int) +0:22 indirect index ( temp highp int) +0:22 'b' ( global 5-element array of highp int) +0:22 'i' ( global highp int) +0:22 Constant: +0:22 1 (const int) +0:23 move second child to first child ( temp highp int) +0:23 direct index ( temp highp int) +0:23 'c' ( global unsized 4-element array of highp int) +0:23 Constant: +0:23 3 (const int) +0:23 Constant: +0:23 1 (const int) 0:? Linker Objects -0:? 'color' ( out highp 4-component vector of float) +0:? 'color' (layout( location=0) out highp 4-component vector of float) +0:? 'a1' ( global unsized 9-element array of highp int) +0:? 'a2' ( global unsized 2-element array of highp int) +0:? 'b' ( global 5-element array of highp int) +0:? 'c' ( global unsized 4-element array of highp int) +0:? 'i' ( global highp int) +0:? 'anon@0' (layout( column_major std430) buffer block{layout( column_major std430) buffer unsized 1-element array of highp float r}) +0:? 'anon@1' (layout( column_major std430) buffer block{layout( column_major std430) buffer unsized 1-element array of highp float m}) link2.vk.frag Shader version: 450 gl_FragCoord origin is upper left 0:? Sequence -0:5 Function Definition: getColor( ( global highp 4-component vector of float) -0:5 Function Parameters: -0:7 Sequence -0:7 Branch: Return with expression -0:7 texture ( global highp 4-component vector of float) -0:7 's2D' ( uniform highp sampler2D) -0:7 Constant: -0:7 0.500000 -0:7 0.500000 +0:14 Function Definition: getColor( ( global highp 4-component vector of float) +0:14 Function Parameters: +0:16 Sequence +0:16 move second child to first child ( temp highp int) +0:16 direct index ( temp highp int) +0:16 'a1' ( global unsized 3-element array of highp int) +0:16 Constant: +0:16 2 (const int) +0:16 Constant: +0:16 1 (const int) +0:17 move second child to first child ( temp highp int) +0:17 direct index ( temp highp int) +0:17 'a2' ( global unsized 10-element array of highp int) +0:17 Constant: +0:17 9 (const int) +0:17 Constant: +0:17 1 (const int) +0:18 move second child to first child ( temp highp int) +0:18 direct index ( temp highp int) +0:18 'b' ( global unsized 3-element array of highp int) +0:18 Constant: +0:18 2 (const int) +0:18 Constant: +0:18 1 (const int) +0:19 move second child to first child ( temp highp int) +0:19 direct index ( temp highp int) +0:19 'c' ( global 7-element array of highp int) +0:19 Constant: +0:19 3 (const int) +0:19 Constant: +0:19 1 (const int) +0:20 move second child to first child ( temp highp int) +0:20 indirect index ( temp highp int) +0:20 'c' ( global 7-element array of highp int) +0:20 'i' ( global highp int) +0:20 Constant: +0:20 1 (const int) +0:22 Branch: Return with expression +0:22 texture ( global highp 4-component vector of float) +0:22 's2D' (layout( binding=1) uniform highp sampler2D) +0:22 Constant: +0:22 0.500000 +0:22 0.500000 0:? Linker Objects -0:? 's2D' ( uniform highp sampler2D) +0:? 's2D' (layout( binding=1) uniform highp sampler2D) +0:? 'a1' ( global unsized 3-element array of highp int) +0:? 'a2' ( global unsized 10-element array of highp int) +0:? 'b' ( global unsized 3-element array of highp int) +0:? 'c' ( global 7-element array of highp int) +0:? 'i' ( global highp int) +0:? 'anon@0' (layout( column_major std430) buffer block{layout( column_major std430) buffer unsized 1-element array of highp float r}) +0:? 'anon@1' (layout( column_major std430) buffer block{layout( column_major std430) buffer 4-element array of highp float m}) Linked fragment stage: @@ -34,23 +109,207 @@ Shader version: 450 gl_FragCoord origin is upper left 0:? Sequence -0:7 Function Definition: main( ( global void) -0:7 Function Parameters: -0:9 Sequence -0:9 move second child to first child ( temp highp 4-component vector of float) -0:9 'color' ( out highp 4-component vector of float) -0:9 Function Call: getColor( ( global highp 4-component vector of float) -0:5 Function Definition: getColor( ( global highp 4-component vector of float) -0:5 Function Parameters: -0:7 Sequence -0:7 Branch: Return with expression -0:7 texture ( global highp 4-component vector of float) -0:7 's2D' ( uniform highp sampler2D) -0:7 Constant: -0:7 0.500000 -0:7 0.500000 +0:16 Function Definition: main( ( global void) +0:16 Function Parameters: +0:18 Sequence +0:18 move second child to first child ( temp highp 4-component vector of float) +0:18 'color' (layout( location=0) out highp 4-component vector of float) +0:18 Function Call: getColor( ( global highp 4-component vector of float) +0:20 move second child to first child ( temp highp int) +0:20 direct index ( temp highp int) +0:20 'a1' ( global 9-element array of highp int) +0:20 Constant: +0:20 8 (const int) +0:20 Constant: +0:20 1 (const int) +0:21 move second child to first child ( temp highp int) +0:21 direct index ( temp highp int) +0:21 'a2' ( global 10-element array of highp int) +0:21 Constant: +0:21 1 (const int) +0:21 Constant: +0:21 1 (const int) +0:22 move second child to first child ( temp highp int) +0:22 indirect index ( temp highp int) +0:22 'b' ( global 5-element array of highp int) +0:22 'i' ( global highp int) +0:22 Constant: +0:22 1 (const int) +0:23 move second child to first child ( temp highp int) +0:23 direct index ( temp highp int) +0:23 'c' ( global 7-element array of highp int) +0:23 Constant: +0:23 3 (const int) +0:23 Constant: +0:23 1 (const int) +0:14 Function Definition: getColor( ( global highp 4-component vector of float) +0:14 Function Parameters: +0:16 Sequence +0:16 move second child to first child ( temp highp int) +0:16 direct index ( temp highp int) +0:16 'a1' ( global 3-element array of highp int) +0:16 Constant: +0:16 2 (const int) +0:16 Constant: +0:16 1 (const int) +0:17 move second child to first child ( temp highp int) +0:17 direct index ( temp highp int) +0:17 'a2' ( global 10-element array of highp int) +0:17 Constant: +0:17 9 (const int) +0:17 Constant: +0:17 1 (const int) +0:18 move second child to first child ( temp highp int) +0:18 direct index ( temp highp int) +0:18 'b' ( global 3-element array of highp int) +0:18 Constant: +0:18 2 (const int) +0:18 Constant: +0:18 1 (const int) +0:19 move second child to first child ( temp highp int) +0:19 direct index ( temp highp int) +0:19 'c' ( global 7-element array of highp int) +0:19 Constant: +0:19 3 (const int) +0:19 Constant: +0:19 1 (const int) +0:20 move second child to first child ( temp highp int) +0:20 indirect index ( temp highp int) +0:20 'c' ( global 7-element array of highp int) +0:20 'i' ( global highp int) +0:20 Constant: +0:20 1 (const int) +0:22 Branch: Return with expression +0:22 texture ( global highp 4-component vector of float) +0:22 's2D' (layout( binding=1) uniform highp sampler2D) +0:22 Constant: +0:22 0.500000 +0:22 0.500000 0:? Linker Objects -0:? 'color' ( out highp 4-component vector of float) -0:? 's2D' ( uniform highp sampler2D) +0:? 'color' (layout( location=0) out highp 4-component vector of float) +0:? 'a1' ( global 9-element array of highp int) +0:? 'a2' ( global 10-element array of highp int) +0:? 'b' ( global 5-element array of highp int) +0:? 'c' ( global 7-element array of highp int) +0:? 'i' ( global highp int) +0:? 'anon@0' (layout( column_major std430) buffer block{layout( column_major std430) buffer unsized 1-element array of highp float r}) +0:? 'anon@1' (layout( column_major std430) buffer block{layout( column_major std430) buffer 4-element array of highp float m}) +0:? 's2D' (layout( binding=1) uniform highp sampler2D) -SPIR-V is not generated for failed compile or link +// Module Version 10000 +// Generated by (magic number): 80006 +// Id's are bound by 71 + + Capability Shader + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 12 + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + Name 4 "main" + Name 9 "getColor(" + Name 12 "color" + Name 19 "a1" + Name 27 "a2" + Name 32 "b" + Name 33 "i" + Name 39 "c" + Name 54 "s2D" + Name 63 "bnameRuntime" + MemberName 63(bnameRuntime) 0 "r" + Name 65 "" + Name 68 "bnameImplicit" + MemberName 68(bnameImplicit) 0 "m" + Name 70 "" + Decorate 12(color) Location 0 + Decorate 54(s2D) DescriptorSet 0 + Decorate 54(s2D) Binding 1 + Decorate 62 ArrayStride 4 + MemberDecorate 63(bnameRuntime) 0 Offset 0 + Decorate 63(bnameRuntime) BufferBlock + Decorate 65 DescriptorSet 0 + Decorate 67 ArrayStride 4 + MemberDecorate 68(bnameImplicit) 0 Offset 0 + Decorate 68(bnameImplicit) BufferBlock + Decorate 70 DescriptorSet 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeVector 6(float) 4 + 8: TypeFunction 7(fvec4) + 11: TypePointer Output 7(fvec4) + 12(color): 11(ptr) Variable Output + 14: TypeInt 32 1 + 15: TypeInt 32 0 + 16: 15(int) Constant 9 + 17: TypeArray 14(int) 16 + 18: TypePointer Private 17 + 19(a1): 18(ptr) Variable Private + 20: 14(int) Constant 8 + 21: 14(int) Constant 1 + 22: TypePointer Private 14(int) + 24: 15(int) Constant 10 + 25: TypeArray 14(int) 24 + 26: TypePointer Private 25 + 27(a2): 26(ptr) Variable Private + 29: 15(int) Constant 5 + 30: TypeArray 14(int) 29 + 31: TypePointer Private 30 + 32(b): 31(ptr) Variable Private + 33(i): 22(ptr) Variable Private + 36: 15(int) Constant 7 + 37: TypeArray 14(int) 36 + 38: TypePointer Private 37 + 39(c): 38(ptr) Variable Private + 40: 14(int) Constant 3 + 42: 14(int) Constant 2 + 43: TypePointer Output 6(float) + 45: 14(int) Constant 9 + 51: TypeImage 6(float) 2D sampled format:Unknown + 52: TypeSampledImage 51 + 53: TypePointer UniformConstant 52 + 54(s2D): 53(ptr) Variable UniformConstant + 56: TypeVector 6(float) 2 + 57: 6(float) Constant 1056964608 + 58: 56(fvec2) ConstantComposite 57 57 + 62: TypeRuntimeArray 6(float) +63(bnameRuntime): TypeStruct 62 + 64: TypePointer Uniform 63(bnameRuntime) + 65: 64(ptr) Variable Uniform + 66: 15(int) Constant 4 + 67: TypeArray 6(float) 66 +68(bnameImplicit): TypeStruct 67 + 69: TypePointer Uniform 68(bnameImplicit) + 70: 69(ptr) Variable Uniform + 4(main): 2 Function None 3 + 5: Label + 13: 7(fvec4) FunctionCall 9(getColor() + Store 12(color) 13 + 23: 22(ptr) AccessChain 19(a1) 20 + Store 23 21 + 28: 22(ptr) AccessChain 27(a2) 21 + Store 28 21 + 34: 14(int) Load 33(i) + 35: 22(ptr) AccessChain 32(b) 34 + Store 35 21 + 41: 22(ptr) AccessChain 39(c) 40 + Store 41 21 + Return + FunctionEnd + 9(getColor(): 7(fvec4) Function None 8 + 10: Label + 44: 43(ptr) AccessChain 12(color) 42 + Store 44 21 + 46: 22(ptr) AccessChain 19(a1) 45 + Store 46 21 + 47: 22(ptr) AccessChain 27(a2) 42 + Store 47 21 + 48: 22(ptr) AccessChain 32(b) 40 + Store 48 21 + 49: 37 Load 39(c) + 50: 22(ptr) AccessChain 32(b) 49 + Store 50 21 + 55: 52 Load 54(s2D) + 59: 7(fvec4) ImageSampleImplicitLod 55 58 + ReturnValue 59 + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/matrix2.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/matrix2.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/matrix2.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/matrix2.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -158,6 +158,9 @@ 0:49 'FragColor' ( out 4-component vector of float) 0:49 Constant: 0:49 3 (const int) +0:50 matrix mult second child into first child ( temp 3X4 matrix of float) +0:50 'm34' ( temp 3X4 matrix of float) +0:50 'colorTransform' ( uniform 3X3 matrix of float) 0:? Linker Objects 0:? 'colorTransform' ( uniform 3X3 matrix of float) 0:? 'Color' ( smooth in 3-component vector of float) @@ -331,6 +334,9 @@ 0:49 'FragColor' ( out 4-component vector of float) 0:49 Constant: 0:49 3 (const int) +0:50 matrix mult second child into first child ( temp 3X4 matrix of float) +0:50 'm34' ( temp 3X4 matrix of float) +0:50 'colorTransform' ( uniform 3X3 matrix of float) 0:? Linker Objects 0:? 'colorTransform' ( uniform 3X3 matrix of float) 0:? 'Color' ( smooth in 3-component vector of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/matrixError.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/matrixError.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/matrixError.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/matrixError.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -6,7 +6,9 @@ ERROR: 0:19: 'xy' : does not apply to this type: temp 2X3 matrix of float ERROR: 0:21: '[' : matrix index out of range '2' ERROR: 0:21: '[' : vector index out of range '4' -ERROR: 7 compilation errors. No code generated. +ERROR: 0:22: 'assign' : cannot convert from ' temp 2X3 matrix of float' to ' temp 2X3 matrix of float' +ERROR: 0:23: 'assign' : cannot convert from ' uniform 3X2 matrix of float' to ' temp 2X3 matrix of float' +ERROR: 9 compilation errors. No code generated. Shader version: 120 @@ -32,6 +34,8 @@ 0:21 2 (const int) 0:21 Constant: 0:21 4 (const int) +0:22 'm23' ( temp 2X3 matrix of float) +0:23 'm23' ( temp 2X3 matrix of float) 0:? Linker Objects 0:? 'v3' ( in 3-component vector of float) 0:? 'm32' ( uniform 3X2 matrix of float) @@ -64,6 +68,8 @@ 0:21 2 (const int) 0:21 Constant: 0:21 4 (const int) +0:22 'm23' ( temp 2X3 matrix of float) +0:23 'm23' ( temp 2X3 matrix of float) 0:? Linker Objects 0:? 'v3' ( in 3-component vector of float) 0:? 'm32' ( uniform 3X2 matrix of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/mixedArrayDecls.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/mixedArrayDecls.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/mixedArrayDecls.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/mixedArrayDecls.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,68 @@ +mixedArrayDecls.frag +ERROR: 0:30: '' : syntax error, unexpected LEFT_PAREN, expecting COMMA or SEMICOLON +ERROR: 1 compilation errors. No code generated. + + +Shader version: 450 +ERROR: node is still EOpNull! +0:16 Function Definition: foo(i1[14][15][6]; ( global 14-element array of 15-element array of 6-element array of int) +0:16 Function Parameters: +0:16 'p' ( in 14-element array of 15-element array of 6-element array of int) +0:16 Sequence +0:16 Branch: Return with expression +0:16 'p' ( in 14-element array of 15-element array of 6-element array of int) +0:18 Function Definition: main( ( global void) +0:18 Function Parameters: +0:20 Sequence +0:20 direct index ( temp 14-element array of int) +0:20 'g' ( global unsized 4-element array of 14-element array of int) +0:20 Constant: +0:20 3 (const int) +0:21 direct index ( temp 14-element array of int) +0:21 'h' ( global unsized 3-element array of 14-element array of int) +0:21 Constant: +0:21 2 (const int) +0:24 Function Definition: bar( ( global 4-element array of 3-element array of 2-element array of float) +0:24 Function Parameters: +0:? Sequence +0:24 Branch: Return with expression +0:24 'a' ( temp 4-element array of 3-element array of 2-element array of float) +0:? Linker Objects +0:? 's' ( global structure{ global 2-element array of 3-element array of int a, global 5-element array of 3-element array of int b}) +0:? 'c' ( global 4-element array of 5-element array of int) +0:? 'd' ( global 8-element array of 5-element array of int) +0:? 'e' ( global 11-element array of 9-element array of int) +0:? 'f' ( global 13-element array of 9-element array of int) +0:? 'g' ( global unsized 4-element array of 14-element array of int) +0:? 'h' ( global unsized 3-element array of 14-element array of int) +0:? 'inbinst' ( in 4-element array of 5-element array of 6-element array of block{ in 8-element array of 9-element array of 7-element array of float f}) +0:? 'barm' ( global 4-element array of 3-element array of 2-element array of float) + + +Linked fragment stage: + + +Shader version: 450 +ERROR: node is still EOpNull! +0:18 Function Definition: main( ( global void) +0:18 Function Parameters: +0:20 Sequence +0:20 direct index ( temp 14-element array of int) +0:20 'g' ( global 4-element array of 14-element array of int) +0:20 Constant: +0:20 3 (const int) +0:21 direct index ( temp 14-element array of int) +0:21 'h' ( global 3-element array of 14-element array of int) +0:21 Constant: +0:21 2 (const int) +0:? Linker Objects +0:? 's' ( global structure{ global 2-element array of 3-element array of int a, global 5-element array of 3-element array of int b}) +0:? 'c' ( global 4-element array of 5-element array of int) +0:? 'd' ( global 8-element array of 5-element array of int) +0:? 'e' ( global 11-element array of 9-element array of int) +0:? 'f' ( global 13-element array of 9-element array of int) +0:? 'g' ( global 4-element array of 14-element array of int) +0:? 'h' ( global 3-element array of 14-element array of int) +0:? 'inbinst' ( in 4-element array of 5-element array of 6-element array of block{ in 8-element array of 9-element array of 7-element array of float f}) +0:? 'barm' ( global 4-element array of 3-element array of 2-element array of float) + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/nonuniform.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/nonuniform.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/nonuniform.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/nonuniform.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,92 @@ +nonuniform.frag +ERROR: 0:10: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier +ERROR: 0:11: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier +ERROR: 0:12: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier +ERROR: 0:22: 'nonuniformEXT' : for non-parameter, can only apply to 'in' or no storage qualifier +ERROR: 0:28: 'constructor' : too many arguments +ERROR: 0:28: 'assign' : cannot convert from ' const float' to ' nonuniform temp int' +ERROR: 0:29: 'constructor' : not enough data provided for construction +ERROR: 0:29: 'assign' : cannot convert from ' const float' to ' nonuniform temp int' +ERROR: 0:32: 'nonuniformEXT' : not allowed on block or structure members +ERROR: 0:33: 'nonuniformEXT' : not allowed on block or structure members +ERROR: 10 compilation errors. No code generated. + + +Shader version: 450 +Requested GL_EXT_nonuniform_qualifier +ERROR: node is still EOpNull! +0:14 Function Definition: foo(i1;i1; ( nonuniform temp int) +0:14 Function Parameters: +0:14 'nupi' ( nonuniform in int) +0:14 'f' ( nonuniform out int) +0:16 Sequence +0:16 Branch: Return with expression +0:16 'nupi' ( nonuniform in int) +0:19 Function Definition: main( ( global void) +0:19 Function Parameters: +0:? Sequence +0:24 Function Call: foo(i1;i1; ( nonuniform temp int) +0:24 'nu_li' ( nonuniform temp int) +0:24 'nu_li' ( nonuniform temp int) +0:27 move second child to first child ( temp int) +0:27 'nu_li' ( nonuniform temp int) +0:27 add ( nonuniform temp int) +0:27 'a' ( nonuniform temp int) +0:27 component-wise multiply ( nonuniform temp int) +0:27 'a' ( temp int) +0:27 Constant: +0:27 2 (const int) +0:28 'nu_li' ( nonuniform temp int) +0:29 'nu_li' ( nonuniform temp int) +0:? Linker Objects +0:? 'nonuniformEXT' ( global int) +0:? 'nu_inv4' ( smooth nonuniform in 4-component vector of float) +0:? 'nu_gf' ( nonuniform temp float) +0:? 'nu_outv4' ( nonuniform out 4-component vector of float) +0:? 'nu_uv4' ( nonuniform uniform 4-component vector of float) +0:? 'nu_constf' ( nonuniform const float) +0:? 1.000000 +0:? 'ins' (layout( location=1) smooth in structure{ global float a, temp float b}) +0:? 'inb' (layout( location=3) in block{ in float a, in float b}) + + +Linked fragment stage: + + +Shader version: 450 +Requested GL_EXT_nonuniform_qualifier +ERROR: node is still EOpNull! +0:14 Function Definition: foo(i1;i1; ( nonuniform temp int) +0:14 Function Parameters: +0:14 'nupi' ( nonuniform in int) +0:14 'f' ( nonuniform out int) +0:16 Sequence +0:16 Branch: Return with expression +0:16 'nupi' ( nonuniform in int) +0:19 Function Definition: main( ( global void) +0:19 Function Parameters: +0:? Sequence +0:24 Function Call: foo(i1;i1; ( nonuniform temp int) +0:24 'nu_li' ( nonuniform temp int) +0:24 'nu_li' ( nonuniform temp int) +0:27 move second child to first child ( temp int) +0:27 'nu_li' ( nonuniform temp int) +0:27 add ( nonuniform temp int) +0:27 'a' ( nonuniform temp int) +0:27 component-wise multiply ( nonuniform temp int) +0:27 'a' ( temp int) +0:27 Constant: +0:27 2 (const int) +0:28 'nu_li' ( nonuniform temp int) +0:29 'nu_li' ( nonuniform temp int) +0:? Linker Objects +0:? 'nonuniformEXT' ( global int) +0:? 'nu_inv4' ( smooth nonuniform in 4-component vector of float) +0:? 'nu_gf' ( nonuniform temp float) +0:? 'nu_outv4' ( nonuniform out 4-component vector of float) +0:? 'nu_uv4' ( nonuniform uniform 4-component vector of float) +0:? 'nu_constf' ( nonuniform const float) +0:? 1.000000 +0:? 'ins' (layout( location=1) smooth in structure{ global float a, temp float b}) +0:? 'inb' (layout( location=3) in block{ in float a, in float b}) + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/nvShaderNoperspectiveInterpolation.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/nvShaderNoperspectiveInterpolation.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/nvShaderNoperspectiveInterpolation.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/nvShaderNoperspectiveInterpolation.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,38 @@ +nvShaderNoperspectiveInterpolation.frag +ERROR: 0:5: 'noperspective' : Reserved word. +ERROR: 0:5: 'noperspective' : not supported for this version or the enabled extensions +ERROR: 2 compilation errors. No code generated. + + +Shader version: 300 +Requested GL_NV_shader_noperspective_interpolation +ERROR: node is still EOpNull! +0:13 Function Definition: main( ( global void) +0:13 Function Parameters: +0:14 Sequence +0:14 move second child to first child ( temp mediump 4-component vector of float) +0:14 'fragColor' ( out mediump 4-component vector of float) +0:14 'color' ( noperspective in mediump 4-component vector of float) +0:? Linker Objects +0:? 'bad' ( noperspective in mediump 4-component vector of float) +0:? 'color' ( noperspective in mediump 4-component vector of float) +0:? 'fragColor' ( out mediump 4-component vector of float) + + +Linked fragment stage: + + +Shader version: 300 +Requested GL_NV_shader_noperspective_interpolation +ERROR: node is still EOpNull! +0:13 Function Definition: main( ( global void) +0:13 Function Parameters: +0:14 Sequence +0:14 move second child to first child ( temp mediump 4-component vector of float) +0:14 'fragColor' ( out mediump 4-component vector of float) +0:14 'color' ( noperspective in mediump 4-component vector of float) +0:? Linker Objects +0:? 'bad' ( noperspective in mediump 4-component vector of float) +0:? 'color' ( noperspective in mediump 4-component vector of float) +0:? 'fragColor' ( out mediump 4-component vector of float) + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/preprocessor.pragma.vert.err vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/preprocessor.pragma.vert.err --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/preprocessor.pragma.vert.err 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/preprocessor.pragma.vert.err 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,2 @@ +WARNING: 0:10: '#pragma once' : not implemented + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/preprocessor.pragma.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/preprocessor.pragma.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/preprocessor.pragma.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/preprocessor.pragma.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -7,6 +7,8 @@ #pragma undefined_pragma(x,4) +#pragma once + int main(){ } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.basic.dcefunc.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.basic.dcefunc.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.basic.dcefunc.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.basic.dcefunc.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.basic.dcefunc.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 22 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.basic.everything.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.basic.everything.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.basic.everything.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.basic.everything.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.basic.everything.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 24969 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.basic.none.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.basic.none.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.basic.none.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.basic.none.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.basic.none.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 22 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.basic.strip.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.basic.strip.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.basic.strip.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.basic.strip.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.basic.strip.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 22 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.hlsl.sample.basic.everything.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -2,7 +2,7 @@ WARNING: 0:4: 'immediate sampler state' : unimplemented // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 24878 Capability Shader @@ -11,6 +11,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 5663 "main" 4253 3709 ExecutionMode 5663 OriginUpperLeft + ExecutionMode 5663 DepthReplacing Decorate 4727 DescriptorSet 0 Decorate 4727 Binding 0 Decorate 3305 DescriptorSet 0 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.hlsl.sample.basic.none.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.hlsl.sample.basic.none.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.hlsl.sample.basic.none.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.hlsl.sample.basic.none.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -2,7 +2,7 @@ WARNING: 0:4: 'immediate sampler state' : unimplemented // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 198 Capability Shader @@ -11,6 +11,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 188 192 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Source HLSL 500 Name 4 "main" Name 8 "PS_OUTPUT" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.hlsl.sample.basic.strip.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -2,7 +2,7 @@ WARNING: 0:4: 'immediate sampler state' : unimplemented // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 198 Capability Shader @@ -11,6 +11,7 @@ MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 188 192 ExecutionMode 4 OriginUpperLeft + ExecutionMode 4 DepthReplacing Decorate 45 DescriptorSet 0 Decorate 45 Binding 0 Decorate 49 DescriptorSet 0 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.hlsl.templatetypes.everything.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.hlsl.templatetypes.everything.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 24954 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.hlsl.templatetypes.none.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.hlsl.templatetypes.none.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.hlsl.templatetypes.none.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.hlsl.templatetypes.none.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.hlsl.templatetypes.none.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 160 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.if.everything.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.if.everything.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.if.everything.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.if.everything.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.if.everything.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 22855 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.if.none.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.if.none.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.if.none.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.if.none.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.if.none.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 25 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.similar_1a.everything.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.similar_1a.everything.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.similar_1a.everything.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.similar_1a.everything.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.similar_1a.everything.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 24916 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.similar_1a.none.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.similar_1a.none.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.similar_1a.none.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.similar_1a.none.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.similar_1a.none.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 86 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.similar_1b.everything.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.similar_1b.everything.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.similar_1b.everything.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.similar_1b.everything.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.similar_1b.everything.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 24916 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.similar_1b.none.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.similar_1b.none.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.similar_1b.none.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.similar_1b.none.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.similar_1b.none.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 91 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.specconst.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.specconst.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.specconst.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.specconst.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.specconst.comp // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 16104 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.switch.everything.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.switch.everything.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.switch.everything.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.switch.everything.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -3,7 +3,7 @@ "precision mediump int; precision highp float;" // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 23990 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.switch.none.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.switch.none.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.switch.none.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.switch.none.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -3,7 +3,7 @@ "precision mediump int; precision highp float;" // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 48 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.uniformarray.everything.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.uniformarray.everything.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.uniformarray.everything.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.uniformarray.everything.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.uniformarray.everything.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 25030 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.uniformarray.none.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.uniformarray.none.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/remap.uniformarray.none.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/remap.uniformarray.none.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ remap.uniformarray.none.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 53 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/runtimeArray.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/runtimeArray.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/runtimeArray.vert.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/runtimeArray.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,632 @@ +runtimeArray.vert +WARNING: 0:33: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array +WARNING: 0:34: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array +WARNING: 0:37: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array +WARNING: 0:38: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array +WARNING: 0:39: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array +WARNING: 0:40: '[]' : assuming binding count of one for compile-time checking of binding numbers for unsized array +ERROR: 0:61: '[' : array must be redeclared with a size before being indexed with a variable +ERROR: 0:62: '[' : array must be redeclared with a size before being indexed with a variable +ERROR: 0:63: '[' : array must be redeclared with a size before being indexed with a variable +ERROR: 0:66: 'length' : array must be declared with a size before using this method +ERROR: 0:67: 'length' : array must be declared with a size before using this method +ERROR: 0:68: 'length' : array must be declared with a size before using this method +ERROR: 0:71: '[' : array must be redeclared with a size before being indexed with a variable +ERROR: 0:72: '[' : array must be redeclared with a size before being indexed with a variable +ERROR: 0:73: '[' : array must be redeclared with a size before being indexed with a variable +ERROR: 0:76: 'length' : array must be declared with a size before using this method +ERROR: 0:77: 'length' : array must be declared with a size before using this method +ERROR: 0:78: 'length' : array must be declared with a size before using this method +ERROR: 0:81: '[' : array must be redeclared with a size before being indexed with a variable +ERROR: 0:82: '[' : array must be redeclared with a size before being indexed with a variable +ERROR: 0:83: '[' : array must be redeclared with a size before being indexed with a variable +ERROR: 0:86: 'length' : array must be declared with a size before using this method +ERROR: 0:87: 'length' : array must be declared with a size before using this method +ERROR: 0:88: 'length' : array must be declared with a size before using this method +ERROR: 0:100: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier +ERROR: 0:101: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier +ERROR: 0:102: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier +ERROR: 0:103: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier +ERROR: 0:104: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier +ERROR: 0:105: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier +ERROR: 0:106: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier +ERROR: 0:107: 'variable index' : required extension not requested: GL_EXT_nonuniform_qualifier +ERROR: 26 compilation errors. No code generated. + + +Shader version: 450 +ERROR: node is still EOpNull! +0:44 Function Definition: main( ( global void) +0:44 Function Parameters: +0:46 Sequence +0:46 direct index (layout( column_major shared) temp int) +0:46 a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int) +0:46 'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 3 (const int) +0:47 direct index (layout( column_major shared) temp float) +0:47 b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float) +0:47 'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 3 (const int) +0:48 direct index (layout( column_major shared) temp int) +0:48 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int) +0:48 'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:48 Constant: +0:48 0 (const int) +0:48 Constant: +0:48 3 (const int) +0:49 direct index (layout( column_major shared) temp float) +0:49 b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:49 'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:49 Constant: +0:49 1 (const int) +0:49 Constant: +0:49 3 (const int) +0:51 direct index (layout( column_major shared) temp int) +0:51 a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int) +0:51 direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:51 'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:51 Constant: +0:51 3 (const int) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:52 direct index (layout( column_major shared) temp float) +0:52 b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float) +0:52 direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:52 'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:52 Constant: +0:52 3 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 3 (const int) +0:53 direct index (layout( column_major shared) temp int) +0:53 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int) +0:53 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:53 'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:53 Constant: +0:53 3 (const int) +0:53 Constant: +0:53 0 (const int) +0:53 Constant: +0:53 3 (const int) +0:54 direct index (layout( column_major shared) temp float) +0:54 b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:54 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:54 'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:54 Constant: +0:54 3 (const int) +0:54 Constant: +0:54 1 (const int) +0:54 Constant: +0:54 3 (const int) +0:56 direct index (layout( column_major shared) temp int) +0:56 aua: direct index for structure (layout( column_major shared) uniform runtime-sized array of int) +0:56 'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub}) +0:56 Constant: +0:56 0 (const uint) +0:56 Constant: +0:56 3 (const int) +0:57 direct index (layout( column_major shared) temp float) +0:57 aub: direct index for structure (layout( column_major shared) uniform runtime-sized array of float) +0:57 'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub}) +0:57 Constant: +0:57 1 (const uint) +0:57 Constant: +0:57 3 (const int) +0:58 direct index (layout( column_major shared) temp int) +0:58 aba: direct index for structure (layout( column_major shared) buffer runtime-sized array of int) +0:58 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb}) +0:58 Constant: +0:58 0 (const uint) +0:58 Constant: +0:58 3 (const int) +0:59 direct index (layout( column_major shared) temp float) +0:59 abb: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:59 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb}) +0:59 Constant: +0:59 1 (const uint) +0:59 Constant: +0:59 3 (const int) +0:61 indirect index (layout( column_major shared) temp int) +0:61 a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int) +0:61 'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:61 Constant: +0:61 0 (const int) +0:61 'i' ( global int) +0:62 indirect index (layout( column_major shared) temp float) +0:62 b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float) +0:62 'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:62 Constant: +0:62 1 (const int) +0:62 'i' ( global int) +0:63 indirect index (layout( column_major shared) temp int) +0:63 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int) +0:63 'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:63 Constant: +0:63 0 (const int) +0:63 'i' ( global int) +0:64 indirect index (layout( column_major shared) temp float) +0:64 b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:64 'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:64 Constant: +0:64 1 (const int) +0:64 'i' ( global int) +0:66 Constant: +0:66 1 (const int) +0:67 Constant: +0:67 1 (const int) +0:68 Constant: +0:68 1 (const int) +0:69 array length ( temp int) +0:69 b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:69 'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:69 Constant: +0:69 1 (const int) +0:71 indirect index (layout( column_major shared) temp int) +0:71 a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int) +0:71 direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:71 'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:71 Constant: +0:71 1 (const int) +0:71 Constant: +0:71 0 (const int) +0:71 'i' ( global int) +0:72 indirect index (layout( column_major shared) temp float) +0:72 b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float) +0:72 direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:72 'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:72 Constant: +0:72 1 (const int) +0:72 Constant: +0:72 1 (const int) +0:72 'i' ( global int) +0:73 indirect index (layout( column_major shared) temp int) +0:73 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int) +0:73 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:73 'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:73 Constant: +0:73 1 (const int) +0:73 Constant: +0:73 0 (const int) +0:73 'i' ( global int) +0:74 indirect index (layout( column_major shared) temp float) +0:74 b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:74 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:74 'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:74 Constant: +0:74 1 (const int) +0:74 Constant: +0:74 1 (const int) +0:74 'i' ( global int) +0:76 Constant: +0:76 1 (const int) +0:77 Constant: +0:77 1 (const int) +0:78 Constant: +0:78 1 (const int) +0:79 array length ( temp int) +0:79 b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:79 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:79 'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:79 Constant: +0:79 1 (const int) +0:79 Constant: +0:79 1 (const int) +0:81 indirect index (layout( column_major shared) temp int) +0:81 aua: direct index for structure (layout( column_major shared) uniform runtime-sized array of int) +0:81 'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub}) +0:81 Constant: +0:81 0 (const uint) +0:81 'i' ( global int) +0:82 indirect index (layout( column_major shared) temp float) +0:82 aub: direct index for structure (layout( column_major shared) uniform runtime-sized array of float) +0:82 'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub}) +0:82 Constant: +0:82 1 (const uint) +0:82 'i' ( global int) +0:83 indirect index (layout( column_major shared) temp int) +0:83 aba: direct index for structure (layout( column_major shared) buffer runtime-sized array of int) +0:83 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb}) +0:83 Constant: +0:83 0 (const uint) +0:83 'i' ( global int) +0:84 indirect index (layout( column_major shared) temp float) +0:84 abb: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:84 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb}) +0:84 Constant: +0:84 1 (const uint) +0:84 'i' ( global int) +0:86 Constant: +0:86 1 (const int) +0:87 Constant: +0:87 1 (const int) +0:88 Constant: +0:88 1 (const int) +0:89 array length ( temp int) +0:89 abb: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:89 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb}) +0:89 Constant: +0:89 1 (const uint) +0:91 direct index (layout( binding=1) temp samplerBuffer) +0:91 'uniformTexelBufferDyn' (layout( binding=1) uniform runtime-sized array of samplerBuffer) +0:91 Constant: +0:91 1 (const int) +0:92 direct index (layout( binding=2 r32f) temp imageBuffer) +0:92 'storageTexelBufferDyn' (layout( binding=2 r32f) uniform runtime-sized array of imageBuffer) +0:92 Constant: +0:92 1 (const int) +0:93 direct index (layout( binding=3 column_major shared) temp block{layout( column_major shared) uniform float a}) +0:93 'uniformBuffer' (layout( binding=3 column_major shared) uniform runtime-sized array of block{layout( column_major shared) uniform float a}) +0:93 Constant: +0:93 1 (const int) +0:94 direct index (layout( binding=4 column_major shared) temp block{layout( column_major shared) buffer float b}) +0:94 'storageBuffer' (layout( binding=4 column_major shared) buffer runtime-sized array of block{layout( column_major shared) buffer float b}) +0:94 Constant: +0:94 1 (const int) +0:95 direct index (layout( binding=5) temp sampler2D) +0:95 'sampledImage' (layout( binding=5) uniform runtime-sized array of sampler2D) +0:95 Constant: +0:95 1 (const int) +0:96 direct index (layout( binding=6 r32f) temp image2D) +0:96 'storageImage' (layout( binding=6 r32f) uniform runtime-sized array of image2D) +0:96 Constant: +0:96 1 (const int) +0:97 direct index (layout( binding=8) temp samplerBuffer) +0:97 'uniformTexelBuffer' (layout( binding=8) uniform runtime-sized array of samplerBuffer) +0:97 Constant: +0:97 1 (const int) +0:98 direct index (layout( binding=9 r32f) temp imageBuffer) +0:98 'storageTexelBuffer' (layout( binding=9 r32f) uniform runtime-sized array of imageBuffer) +0:98 Constant: +0:98 1 (const int) +0:100 indirect index (layout( binding=1) temp samplerBuffer) +0:100 'uniformTexelBufferDyn' (layout( binding=1) uniform runtime-sized array of samplerBuffer) +0:100 'i' ( global int) +0:101 indirect index (layout( binding=2 r32f) temp imageBuffer) +0:101 'storageTexelBufferDyn' (layout( binding=2 r32f) uniform runtime-sized array of imageBuffer) +0:101 'i' ( global int) +0:102 indirect index (layout( binding=3 column_major shared) temp block{layout( column_major shared) uniform float a}) +0:102 'uniformBuffer' (layout( binding=3 column_major shared) uniform runtime-sized array of block{layout( column_major shared) uniform float a}) +0:102 'i' ( global int) +0:103 indirect index (layout( binding=4 column_major shared) temp block{layout( column_major shared) buffer float b}) +0:103 'storageBuffer' (layout( binding=4 column_major shared) buffer runtime-sized array of block{layout( column_major shared) buffer float b}) +0:103 'i' ( global int) +0:104 indirect index (layout( binding=5) temp sampler2D) +0:104 'sampledImage' (layout( binding=5) uniform runtime-sized array of sampler2D) +0:104 'i' ( global int) +0:105 indirect index (layout( binding=6 r32f) temp image2D) +0:105 'storageImage' (layout( binding=6 r32f) uniform runtime-sized array of image2D) +0:105 'i' ( global int) +0:106 indirect index (layout( binding=8) temp samplerBuffer) +0:106 'uniformTexelBuffer' (layout( binding=8) uniform runtime-sized array of samplerBuffer) +0:106 'i' ( global int) +0:107 indirect index (layout( binding=9 r32f) temp imageBuffer) +0:107 'storageTexelBuffer' (layout( binding=9 r32f) uniform runtime-sized array of imageBuffer) +0:107 'i' ( global int) +0:? Linker Objects +0:? 'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:? 'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:? 'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:? 'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:? 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb}) +0:? 'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub}) +0:? 'uniformTexelBufferDyn' (layout( binding=1) uniform runtime-sized array of samplerBuffer) +0:? 'storageTexelBufferDyn' (layout( binding=2 r32f) uniform runtime-sized array of imageBuffer) +0:? 'uniformBuffer' (layout( binding=3 column_major shared) uniform runtime-sized array of block{layout( column_major shared) uniform float a}) +0:? 'storageBuffer' (layout( binding=4 column_major shared) buffer runtime-sized array of block{layout( column_major shared) buffer float b}) +0:? 'sampledImage' (layout( binding=5) uniform runtime-sized array of sampler2D) +0:? 'storageImage' (layout( binding=6 r32f) uniform runtime-sized array of image2D) +0:? 'uniformTexelBuffer' (layout( binding=8) uniform runtime-sized array of samplerBuffer) +0:? 'storageTexelBuffer' (layout( binding=9 r32f) uniform runtime-sized array of imageBuffer) +0:? 'i' ( global int) +0:? 'gl_VertexID' ( gl_VertexId int VertexId) +0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId) + + +Linked vertex stage: + + +Shader version: 450 +ERROR: node is still EOpNull! +0:44 Function Definition: main( ( global void) +0:44 Function Parameters: +0:46 Sequence +0:46 direct index (layout( column_major shared) temp int) +0:46 a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int) +0:46 'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:46 Constant: +0:46 0 (const int) +0:46 Constant: +0:46 3 (const int) +0:47 direct index (layout( column_major shared) temp float) +0:47 b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float) +0:47 'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:47 Constant: +0:47 1 (const int) +0:47 Constant: +0:47 3 (const int) +0:48 direct index (layout( column_major shared) temp int) +0:48 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int) +0:48 'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:48 Constant: +0:48 0 (const int) +0:48 Constant: +0:48 3 (const int) +0:49 direct index (layout( column_major shared) temp float) +0:49 b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:49 'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:49 Constant: +0:49 1 (const int) +0:49 Constant: +0:49 3 (const int) +0:51 direct index (layout( column_major shared) temp int) +0:51 a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int) +0:51 direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:51 'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:51 Constant: +0:51 3 (const int) +0:51 Constant: +0:51 0 (const int) +0:51 Constant: +0:51 3 (const int) +0:52 direct index (layout( column_major shared) temp float) +0:52 b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float) +0:52 direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:52 'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:52 Constant: +0:52 3 (const int) +0:52 Constant: +0:52 1 (const int) +0:52 Constant: +0:52 3 (const int) +0:53 direct index (layout( column_major shared) temp int) +0:53 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int) +0:53 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:53 'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:53 Constant: +0:53 3 (const int) +0:53 Constant: +0:53 0 (const int) +0:53 Constant: +0:53 3 (const int) +0:54 direct index (layout( column_major shared) temp float) +0:54 b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:54 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:54 'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:54 Constant: +0:54 3 (const int) +0:54 Constant: +0:54 1 (const int) +0:54 Constant: +0:54 3 (const int) +0:56 direct index (layout( column_major shared) temp int) +0:56 aua: direct index for structure (layout( column_major shared) uniform runtime-sized array of int) +0:56 'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub}) +0:56 Constant: +0:56 0 (const uint) +0:56 Constant: +0:56 3 (const int) +0:57 direct index (layout( column_major shared) temp float) +0:57 aub: direct index for structure (layout( column_major shared) uniform runtime-sized array of float) +0:57 'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub}) +0:57 Constant: +0:57 1 (const uint) +0:57 Constant: +0:57 3 (const int) +0:58 direct index (layout( column_major shared) temp int) +0:58 aba: direct index for structure (layout( column_major shared) buffer runtime-sized array of int) +0:58 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb}) +0:58 Constant: +0:58 0 (const uint) +0:58 Constant: +0:58 3 (const int) +0:59 direct index (layout( column_major shared) temp float) +0:59 abb: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:59 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb}) +0:59 Constant: +0:59 1 (const uint) +0:59 Constant: +0:59 3 (const int) +0:61 indirect index (layout( column_major shared) temp int) +0:61 a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int) +0:61 'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:61 Constant: +0:61 0 (const int) +0:61 'i' ( global int) +0:62 indirect index (layout( column_major shared) temp float) +0:62 b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float) +0:62 'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:62 Constant: +0:62 1 (const int) +0:62 'i' ( global int) +0:63 indirect index (layout( column_major shared) temp int) +0:63 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int) +0:63 'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:63 Constant: +0:63 0 (const int) +0:63 'i' ( global int) +0:64 indirect index (layout( column_major shared) temp float) +0:64 b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:64 'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:64 Constant: +0:64 1 (const int) +0:64 'i' ( global int) +0:66 Constant: +0:66 1 (const int) +0:67 Constant: +0:67 1 (const int) +0:68 Constant: +0:68 1 (const int) +0:69 array length ( temp int) +0:69 b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:69 'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:69 Constant: +0:69 1 (const int) +0:71 indirect index (layout( column_major shared) temp int) +0:71 a: direct index for structure (layout( column_major shared) uniform runtime-sized array of int) +0:71 direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:71 'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:71 Constant: +0:71 1 (const int) +0:71 Constant: +0:71 0 (const int) +0:71 'i' ( global int) +0:72 indirect index (layout( column_major shared) temp float) +0:72 b: direct index for structure (layout( column_major shared) uniform runtime-sized array of float) +0:72 direct index (layout( column_major shared) temp block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:72 'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:72 Constant: +0:72 1 (const int) +0:72 Constant: +0:72 1 (const int) +0:72 'i' ( global int) +0:73 indirect index (layout( column_major shared) temp int) +0:73 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int) +0:73 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:73 'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:73 Constant: +0:73 1 (const int) +0:73 Constant: +0:73 0 (const int) +0:73 'i' ( global int) +0:74 indirect index (layout( column_major shared) temp float) +0:74 b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:74 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:74 'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:74 Constant: +0:74 1 (const int) +0:74 Constant: +0:74 1 (const int) +0:74 'i' ( global int) +0:76 Constant: +0:76 1 (const int) +0:77 Constant: +0:77 1 (const int) +0:78 Constant: +0:78 1 (const int) +0:79 array length ( temp int) +0:79 b: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:79 direct index (layout( column_major shared) temp block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:79 'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:79 Constant: +0:79 1 (const int) +0:79 Constant: +0:79 1 (const int) +0:81 indirect index (layout( column_major shared) temp int) +0:81 aua: direct index for structure (layout( column_major shared) uniform runtime-sized array of int) +0:81 'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub}) +0:81 Constant: +0:81 0 (const uint) +0:81 'i' ( global int) +0:82 indirect index (layout( column_major shared) temp float) +0:82 aub: direct index for structure (layout( column_major shared) uniform runtime-sized array of float) +0:82 'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub}) +0:82 Constant: +0:82 1 (const uint) +0:82 'i' ( global int) +0:83 indirect index (layout( column_major shared) temp int) +0:83 aba: direct index for structure (layout( column_major shared) buffer runtime-sized array of int) +0:83 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb}) +0:83 Constant: +0:83 0 (const uint) +0:83 'i' ( global int) +0:84 indirect index (layout( column_major shared) temp float) +0:84 abb: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:84 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb}) +0:84 Constant: +0:84 1 (const uint) +0:84 'i' ( global int) +0:86 Constant: +0:86 1 (const int) +0:87 Constant: +0:87 1 (const int) +0:88 Constant: +0:88 1 (const int) +0:89 array length ( temp int) +0:89 abb: direct index for structure (layout( column_major shared) buffer runtime-sized array of float) +0:89 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb}) +0:89 Constant: +0:89 1 (const uint) +0:91 direct index (layout( binding=1) temp samplerBuffer) +0:91 'uniformTexelBufferDyn' (layout( binding=1) uniform runtime-sized array of samplerBuffer) +0:91 Constant: +0:91 1 (const int) +0:92 direct index (layout( binding=2 r32f) temp imageBuffer) +0:92 'storageTexelBufferDyn' (layout( binding=2 r32f) uniform runtime-sized array of imageBuffer) +0:92 Constant: +0:92 1 (const int) +0:93 direct index (layout( binding=3 column_major shared) temp block{layout( column_major shared) uniform float a}) +0:93 'uniformBuffer' (layout( binding=3 column_major shared) uniform runtime-sized array of block{layout( column_major shared) uniform float a}) +0:93 Constant: +0:93 1 (const int) +0:94 direct index (layout( binding=4 column_major shared) temp block{layout( column_major shared) buffer float b}) +0:94 'storageBuffer' (layout( binding=4 column_major shared) buffer runtime-sized array of block{layout( column_major shared) buffer float b}) +0:94 Constant: +0:94 1 (const int) +0:95 direct index (layout( binding=5) temp sampler2D) +0:95 'sampledImage' (layout( binding=5) uniform runtime-sized array of sampler2D) +0:95 Constant: +0:95 1 (const int) +0:96 direct index (layout( binding=6 r32f) temp image2D) +0:96 'storageImage' (layout( binding=6 r32f) uniform runtime-sized array of image2D) +0:96 Constant: +0:96 1 (const int) +0:97 direct index (layout( binding=8) temp samplerBuffer) +0:97 'uniformTexelBuffer' (layout( binding=8) uniform runtime-sized array of samplerBuffer) +0:97 Constant: +0:97 1 (const int) +0:98 direct index (layout( binding=9 r32f) temp imageBuffer) +0:98 'storageTexelBuffer' (layout( binding=9 r32f) uniform runtime-sized array of imageBuffer) +0:98 Constant: +0:98 1 (const int) +0:100 indirect index (layout( binding=1) temp samplerBuffer) +0:100 'uniformTexelBufferDyn' (layout( binding=1) uniform runtime-sized array of samplerBuffer) +0:100 'i' ( global int) +0:101 indirect index (layout( binding=2 r32f) temp imageBuffer) +0:101 'storageTexelBufferDyn' (layout( binding=2 r32f) uniform runtime-sized array of imageBuffer) +0:101 'i' ( global int) +0:102 indirect index (layout( binding=3 column_major shared) temp block{layout( column_major shared) uniform float a}) +0:102 'uniformBuffer' (layout( binding=3 column_major shared) uniform runtime-sized array of block{layout( column_major shared) uniform float a}) +0:102 'i' ( global int) +0:103 indirect index (layout( binding=4 column_major shared) temp block{layout( column_major shared) buffer float b}) +0:103 'storageBuffer' (layout( binding=4 column_major shared) buffer runtime-sized array of block{layout( column_major shared) buffer float b}) +0:103 'i' ( global int) +0:104 indirect index (layout( binding=5) temp sampler2D) +0:104 'sampledImage' (layout( binding=5) uniform runtime-sized array of sampler2D) +0:104 'i' ( global int) +0:105 indirect index (layout( binding=6 r32f) temp image2D) +0:105 'storageImage' (layout( binding=6 r32f) uniform runtime-sized array of image2D) +0:105 'i' ( global int) +0:106 indirect index (layout( binding=8) temp samplerBuffer) +0:106 'uniformTexelBuffer' (layout( binding=8) uniform runtime-sized array of samplerBuffer) +0:106 'i' ( global int) +0:107 indirect index (layout( binding=9 r32f) temp imageBuffer) +0:107 'storageTexelBuffer' (layout( binding=9 r32f) uniform runtime-sized array of imageBuffer) +0:107 'i' ( global int) +0:? Linker Objects +0:? 'buf' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:? 'ubuf' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:? 'bufa' (layout( column_major shared) buffer 4-element array of block{layout( column_major shared) buffer runtime-sized array of int a, layout( column_major shared) buffer runtime-sized array of float b}) +0:? 'ubufa' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform runtime-sized array of int a, layout( column_major shared) uniform runtime-sized array of float b}) +0:? 'anon@0' (layout( column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int aba, layout( column_major shared) buffer runtime-sized array of float abb}) +0:? 'anon@1' (layout( column_major shared) uniform block{layout( column_major shared) uniform runtime-sized array of int aua, layout( column_major shared) uniform runtime-sized array of float aub}) +0:? 'uniformTexelBufferDyn' (layout( binding=1) uniform runtime-sized array of samplerBuffer) +0:? 'storageTexelBufferDyn' (layout( binding=2 r32f) uniform runtime-sized array of imageBuffer) +0:? 'uniformBuffer' (layout( binding=3 column_major shared) uniform runtime-sized array of block{layout( column_major shared) uniform float a}) +0:? 'storageBuffer' (layout( binding=4 column_major shared) buffer runtime-sized array of block{layout( column_major shared) buffer float b}) +0:? 'sampledImage' (layout( binding=5) uniform runtime-sized array of sampler2D) +0:? 'storageImage' (layout( binding=6 r32f) uniform runtime-sized array of image2D) +0:? 'uniformTexelBuffer' (layout( binding=8) uniform runtime-sized array of samplerBuffer) +0:? 'storageTexelBuffer' (layout( binding=9 r32f) uniform runtime-sized array of imageBuffer) +0:? 'i' ( global int) +0:? 'gl_VertexID' ( gl_VertexId int VertexId) +0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId) + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/specExamplesConf.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/specExamplesConf.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/specExamplesConf.vert.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/specExamplesConf.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,599 @@ +specExamples.vert +ERROR: 0:29: 'location' : can only apply to uniform, buffer, in, or out storage qualifiers +ERROR: 0:31: 'triangles' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) +ERROR: 0:31: 'invocations' : there is no such layout identifier for this stage taking an assigned value +ERROR: 0:33: 'lines' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) +ERROR: 0:35: 'triangle_strip' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) +ERROR: 0:35: 'max_vertices' : there is no such layout identifier for this stage taking an assigned value +ERROR: 0:36: 'max_vertices' : there is no such layout identifier for this stage taking an assigned value +ERROR: 0:37: 'triangle_strip' : unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4) +ERROR: 0:41: 'stream' : there is no such layout identifier for this stage taking an assigned value +ERROR: 0:43: 'stream' : there is no such layout identifier for this stage taking an assigned value +ERROR: 0:45: 'stream' : there is no such layout identifier for this stage taking an assigned value +ERROR: 0:46: 'stream' : there is no such layout identifier for this stage taking an assigned value +ERROR: 0:47: 'stream' : there is no such layout identifier for this stage taking an assigned value +ERROR: 0:50: 'stream' : there is no such layout identifier for this stage taking an assigned value +ERROR: 0:55: 'stream' : there is no such layout identifier for this stage taking an assigned value +ERROR: 0:80: 's17' : redefinition +ERROR: 0:85: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings +ERROR: 0:87: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings +ERROR: 0:89: 'binding' : atomic_uint binding is too large +ERROR: 0:91: 'bar' : redefinition +ERROR: 0:92: 'atomic_uint' : layout(binding=X) is required +ERROR: 0:94: 'a2' : redefinition +ERROR: 0:95: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings +ERROR: 0:96: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings +ERROR: 0:97: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings +ERROR: 0:106: '' : vertex input cannot be further qualified +ERROR: 0:106: 'redeclaration' : cannot change storage, memory, or auxiliary qualification of gl_FrontColor +ERROR: 0:112: 'ColorIvn' : identifier not previously declared +ERROR: 0:132: 'shared' : not supported in this stage: vertex +ERROR: 0:134: '' : function does not return a value: funcA +ERROR: 0:136: '' : function does not return a value: funcB +ERROR: 0:153: '' : function does not return a value: func3 +ERROR: 0:170: 'coherent' : argument cannot drop memory qualifier when passed to formal parameter +ERROR: 33 compilation errors. No code generated. + + +Shader version: 430 +Requested GL_3DL_array_objects +ERROR: node is still EOpNull! +0:134 Function Definition: funcA(I21; ( global 4-component vector of float) +0:134 Function Parameters: +0:134 'a' ( restrict in image2D) +0:136 Function Definition: funcB(I21; ( global 4-component vector of float) +0:136 Function Parameters: +0:136 'a' ( in image2D) +0:140 Function Definition: func(f1;f1;f1;f1; ( global float) +0:140 Function Parameters: +0:140 'e' ( in float) +0:140 'f' ( in float) +0:140 'g' ( in float) +0:140 'h' ( in float) +0:142 Sequence +0:142 Branch: Return with expression +0:142 add ( temp float) +0:142 component-wise multiply ( temp float) +0:142 'e' ( in float) +0:142 'f' ( in float) +0:142 component-wise multiply ( temp float) +0:142 'g' ( in float) +0:142 'h' ( in float) +0:146 Function Definition: func2(f1;f1;f1;f1; ( global float) +0:146 Function Parameters: +0:146 'e' ( in float) +0:146 'f' ( in float) +0:146 'g' ( in float) +0:146 'h' ( in float) +0:148 Sequence +0:148 Sequence +0:148 move second child to first child ( temp float) +0:148 'result' ( noContraction temp float) +0:148 add ( temp float) +0:148 component-wise multiply ( temp float) +0:148 'e' ( in float) +0:148 'f' ( in float) +0:148 component-wise multiply ( temp float) +0:148 'g' ( in float) +0:148 'h' ( in float) +0:150 Branch: Return with expression +0:150 'result' ( noContraction temp float) +0:153 Function Definition: func3(f1;f1;f1; ( global float) +0:153 Function Parameters: +0:153 'i' ( in float) +0:153 'j' ( in float) +0:153 'k' ( noContraction out float) +0:155 Sequence +0:155 move second child to first child ( temp float) +0:155 'k' ( noContraction out float) +0:155 add ( temp float) +0:155 component-wise multiply ( temp float) +0:155 'i' ( in float) +0:155 'i' ( in float) +0:155 'j' ( in float) +0:158 Function Definition: main( ( global void) +0:158 Function Parameters: +0:160 Sequence +0:160 Sequence +0:160 move second child to first child ( temp 3-component vector of float) +0:160 'r' ( temp 3-component vector of float) +0:160 Construct vec3 ( temp 3-component vector of float) +0:160 component-wise multiply ( temp 4-component vector of float) +0:160 'a' ( in 4-component vector of float) +0:160 'b' ( in 4-component vector of float) +0:161 Sequence +0:161 move second child to first child ( temp 3-component vector of float) +0:161 's' ( temp 3-component vector of float) +0:161 Construct vec3 ( temp 3-component vector of float) +0:161 component-wise multiply ( temp 4-component vector of float) +0:161 'c' ( in 4-component vector of float) +0:161 'd' ( in 4-component vector of float) +0:162 move second child to first child ( temp 3-component vector of float) +0:162 vector swizzle ( noContraction temp 3-component vector of float) +0:162 'v' ( noContraction smooth out 4-component vector of float) +0:162 Sequence +0:162 Constant: +0:162 0 (const int) +0:162 Constant: +0:162 1 (const int) +0:162 Constant: +0:162 2 (const int) +0:162 add ( temp 3-component vector of float) +0:162 'r' ( temp 3-component vector of float) +0:162 's' ( temp 3-component vector of float) +0:163 move second child to first child ( temp float) +0:163 direct index ( noContraction temp float) +0:163 'v' ( noContraction smooth out 4-component vector of float) +0:163 Constant: +0:163 3 (const int) +0:163 add ( temp float) +0:163 component-wise multiply ( temp float) +0:163 direct index ( temp float) +0:163 'a' ( in 4-component vector of float) +0:163 Constant: +0:163 3 (const int) +0:163 direct index ( temp float) +0:163 'b' ( in 4-component vector of float) +0:163 Constant: +0:163 3 (const int) +0:163 component-wise multiply ( temp float) +0:163 direct index ( temp float) +0:163 'c' ( in 4-component vector of float) +0:163 Constant: +0:163 3 (const int) +0:163 direct index ( temp float) +0:163 'd' ( in 4-component vector of float) +0:163 Constant: +0:163 3 (const int) +0:164 move second child to first child ( temp float) +0:164 direct index ( noContraction temp float) +0:164 'v' ( noContraction smooth out 4-component vector of float) +0:164 Constant: +0:164 0 (const int) +0:164 Function Call: func(f1;f1;f1;f1; ( global float) +0:164 direct index ( temp float) +0:164 'a' ( in 4-component vector of float) +0:164 Constant: +0:164 0 (const int) +0:164 direct index ( temp float) +0:164 'b' ( in 4-component vector of float) +0:164 Constant: +0:164 0 (const int) +0:164 direct index ( temp float) +0:164 'c' ( in 4-component vector of float) +0:164 Constant: +0:164 0 (const int) +0:164 direct index ( temp float) +0:164 'd' ( in 4-component vector of float) +0:164 Constant: +0:164 0 (const int) +0:166 move second child to first child ( temp float) +0:166 direct index ( noContraction temp float) +0:166 'v' ( noContraction smooth out 4-component vector of float) +0:166 Constant: +0:166 0 (const int) +0:166 Function Call: func2(f1;f1;f1;f1; ( global float) +0:166 direct index ( temp float) +0:166 'a' ( in 4-component vector of float) +0:166 Constant: +0:166 0 (const int) +0:166 direct index ( temp float) +0:166 'b' ( in 4-component vector of float) +0:166 Constant: +0:166 0 (const int) +0:166 direct index ( temp float) +0:166 'c' ( in 4-component vector of float) +0:166 Constant: +0:166 0 (const int) +0:166 direct index ( temp float) +0:166 'd' ( in 4-component vector of float) +0:166 Constant: +0:166 0 (const int) +0:167 Function Call: func3(f1;f1;f1; ( global float) +0:167 component-wise multiply ( temp float) +0:167 direct index ( temp float) +0:167 'a' ( in 4-component vector of float) +0:167 Constant: +0:167 0 (const int) +0:167 direct index ( temp float) +0:167 'b' ( in 4-component vector of float) +0:167 Constant: +0:167 0 (const int) +0:167 component-wise multiply ( temp float) +0:167 direct index ( temp float) +0:167 'c' ( in 4-component vector of float) +0:167 Constant: +0:167 0 (const int) +0:167 direct index ( temp float) +0:167 'd' ( in 4-component vector of float) +0:167 Constant: +0:167 0 (const int) +0:167 direct index ( noContraction temp float) +0:167 'v' ( noContraction smooth out 4-component vector of float) +0:167 Constant: +0:167 0 (const int) +0:169 Function Call: funcA(I21; ( global 4-component vector of float) +0:169 'img1' (layout( rgba32f) uniform image2D) +0:170 Function Call: funcB(I21; ( global 4-component vector of float) +0:170 'img2' (layout( rgba32f) coherent uniform image2D) +0:? Sequence +0:178 Sequence +0:178 move second child to first child ( temp structure{ temp float intensity, temp 3-component vector of float position}) +0:178 'lightVar' ( temp structure{ temp float intensity, temp 3-component vector of float position}) +0:178 Constant: +0:178 3.000000 +0:178 1.000000 +0:178 2.000000 +0:178 3.000000 +0:? Sequence +0:185 Sequence +0:185 move second child to first child ( temp 5-element array of float) +0:185 'a' ( temp 5-element array of float) +0:185 Construct float ( temp 5-element array of float) +0:185 'g' ( temp float) +0:185 Constant: +0:185 1.000000 +0:185 'g' ( temp float) +0:185 Constant: +0:185 2.300000 +0:185 'g' ( temp float) +0:188 move second child to first child ( temp 3-element array of float) +0:188 'b' ( temp 3-element array of float) +0:188 Construct float ( temp 3-element array of float) +0:188 'g' ( temp float) +0:188 add ( temp float) +0:188 'g' ( temp float) +0:188 Constant: +0:188 1.000000 +0:188 add ( temp float) +0:188 'g' ( temp float) +0:188 Constant: +0:188 2.000000 +0:191 Sequence +0:191 Sequence +0:191 move second child to first child ( temp 2-element array of 4-component vector of float) +0:191 'b' ( temp 2-element array of 4-component vector of float) +0:191 Constant: +0:191 1.000000 +0:191 1.000000 +0:191 1.000000 +0:191 1.000000 +0:191 1.000000 +0:191 1.000000 +0:191 1.000000 +0:191 1.000000 +0:192 Construct vec4 ( temp 3-element array of 2-element array of 4-component vector of float) +0:192 'b' ( temp 2-element array of 4-component vector of float) +0:192 'b' ( temp 2-element array of 4-component vector of float) +0:192 'b' ( temp 2-element array of 4-component vector of float) +0:193 Construct vec4 ( temp 3-element array of 2-element array of 4-component vector of float) +0:193 'b' ( temp 2-element array of 4-component vector of float) +0:193 'b' ( temp 2-element array of 4-component vector of float) +0:193 'b' ( temp 2-element array of 4-component vector of float) +0:194 Construct vec4 ( temp 3-element array of 2-element array of 4-component vector of float) +0:194 'b' ( temp 2-element array of 4-component vector of float) +0:194 'b' ( temp 2-element array of 4-component vector of float) +0:194 'b' ( temp 2-element array of 4-component vector of float) +0:? Linker Objects +0:? 'Coords' ( out block{ out 4-component vector of float Position, out 2-component vector of float Texture}) +0:? 'anon@0' ( out block{ out 4-component vector of float Color}) +0:? 'transforms' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform 4X4 matrix of float ModelViewMatrix, layout( column_major shared) uniform 4X4 matrix of float ModelViewProjectionMatrix, layout( column_major shared) uniform unsized 1-element array of 4-component vector of float a, layout( column_major shared) uniform float Deformation}) +0:? 'normal' (layout( location=3) in 4-component vector of float) +0:? 'colors' (layout( location=6) in 3-element array of 4-component vector of float) +0:? 'transforms2' (layout( location=9) in 2-element array of 4X4 matrix of float) +0:? 's' (layout( location=3) temp structure{ global 3-component vector of float a1, global 2X2 matrix of float b, global 2-element array of 4-component vector of float c}) +0:? 'var1' ( smooth out 4-component vector of float) +0:? 'anon@1' ( out block{ out 4-component vector of float var2, out 2-component vector of float var3, out 3-component vector of float var4}) +0:? 'var5' ( smooth out 4-component vector of float) +0:? 'anon@2' ( out block{ out 4-component vector of float var6}) +0:? 'var7' ( smooth out 4-component vector of float) +0:? 'anon@3' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 4X4 matrix of float M1, layout( column_major std140 offset=64) uniform 4X4 matrix of float M2, layout( row_major std140 offset=128) uniform 3X3 matrix of float N1}) +0:? 'anon@4' (layout( column_major shared) uniform block{layout( column_major shared) uniform 4X4 matrix of float M13, layout( row_major shared) uniform 4X4 matrix of float m14, layout( column_major shared) uniform 3X3 matrix of float N12}) +0:? 's17' (layout( binding=3) uniform sampler2D) +0:? 'a2' (layout( binding=2 offset=4) uniform atomic_uint) +0:? 'bar' (layout( binding=2) uniform atomic_uint) +0:? 'bar23' (layout( offset=8) uniform atomic_uint) +0:? 'b2' (layout( binding=2) uniform atomic_uint) +0:? 'c2' (layout( binding=3) uniform atomic_uint) +0:? 'd2' (layout( binding=2) uniform atomic_uint) +0:? 'anon@5' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, flat out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:? 'ColorInv' ( smooth out 3-component vector of float) +0:? 'Color4' ( invariant centroid smooth out 3-component vector of float) +0:? 'position' ( noContraction smooth out 4-component vector of float) +0:? 'Color5' ( noContraction smooth out 3-component vector of float) +0:? 'a' ( in 4-component vector of float) +0:? 'b' ( in 4-component vector of float) +0:? 'c' ( in 4-component vector of float) +0:? 'd' ( in 4-component vector of float) +0:? 'v' ( noContraction smooth out 4-component vector of float) +0:? 'anon@6' (layout( column_major shared) coherent buffer block{layout( column_major shared) readonly buffer 4-component vector of float member1, layout( column_major shared) buffer 4-component vector of float member2}) +0:? 'anon@7' (layout( column_major shared) buffer block{layout( column_major shared) coherent readonly buffer 4-component vector of float member1A, layout( column_major shared) coherent buffer 4-component vector of float member2A}) +0:? 'shv' ( shared 4-component vector of float) +0:? 'img1' (layout( rgba32f) uniform image2D) +0:? 'img2' (layout( rgba32f) coherent uniform image2D) +0:? 'gl_VertexID' ( gl_VertexId int VertexId) +0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId) + + +Linked vertex stage: + + +Shader version: 430 +Requested GL_3DL_array_objects +ERROR: node is still EOpNull! +0:134 Function Definition: funcA(I21; ( global 4-component vector of float) +0:134 Function Parameters: +0:134 'a' ( restrict in image2D) +0:136 Function Definition: funcB(I21; ( global 4-component vector of float) +0:136 Function Parameters: +0:136 'a' ( in image2D) +0:140 Function Definition: func(f1;f1;f1;f1; ( global float) +0:140 Function Parameters: +0:140 'e' ( in float) +0:140 'f' ( in float) +0:140 'g' ( in float) +0:140 'h' ( in float) +0:142 Sequence +0:142 Branch: Return with expression +0:142 add ( temp float) +0:142 component-wise multiply ( temp float) +0:142 'e' ( in float) +0:142 'f' ( in float) +0:142 component-wise multiply ( temp float) +0:142 'g' ( in float) +0:142 'h' ( in float) +0:146 Function Definition: func2(f1;f1;f1;f1; ( global float) +0:146 Function Parameters: +0:146 'e' ( in float) +0:146 'f' ( in float) +0:146 'g' ( in float) +0:146 'h' ( in float) +0:148 Sequence +0:148 Sequence +0:148 move second child to first child ( temp float) +0:148 'result' ( noContraction temp float) +0:148 add ( temp float) +0:148 component-wise multiply ( temp float) +0:148 'e' ( in float) +0:148 'f' ( in float) +0:148 component-wise multiply ( temp float) +0:148 'g' ( in float) +0:148 'h' ( in float) +0:150 Branch: Return with expression +0:150 'result' ( noContraction temp float) +0:153 Function Definition: func3(f1;f1;f1; ( global float) +0:153 Function Parameters: +0:153 'i' ( in float) +0:153 'j' ( in float) +0:153 'k' ( noContraction out float) +0:155 Sequence +0:155 move second child to first child ( temp float) +0:155 'k' ( noContraction out float) +0:155 add ( temp float) +0:155 component-wise multiply ( temp float) +0:155 'i' ( in float) +0:155 'i' ( in float) +0:155 'j' ( in float) +0:158 Function Definition: main( ( global void) +0:158 Function Parameters: +0:160 Sequence +0:160 Sequence +0:160 move second child to first child ( temp 3-component vector of float) +0:160 'r' ( temp 3-component vector of float) +0:160 Construct vec3 ( temp 3-component vector of float) +0:160 component-wise multiply ( temp 4-component vector of float) +0:160 'a' ( in 4-component vector of float) +0:160 'b' ( in 4-component vector of float) +0:161 Sequence +0:161 move second child to first child ( temp 3-component vector of float) +0:161 's' ( temp 3-component vector of float) +0:161 Construct vec3 ( temp 3-component vector of float) +0:161 component-wise multiply ( temp 4-component vector of float) +0:161 'c' ( in 4-component vector of float) +0:161 'd' ( in 4-component vector of float) +0:162 move second child to first child ( temp 3-component vector of float) +0:162 vector swizzle ( noContraction temp 3-component vector of float) +0:162 'v' ( noContraction smooth out 4-component vector of float) +0:162 Sequence +0:162 Constant: +0:162 0 (const int) +0:162 Constant: +0:162 1 (const int) +0:162 Constant: +0:162 2 (const int) +0:162 add ( temp 3-component vector of float) +0:162 'r' ( temp 3-component vector of float) +0:162 's' ( temp 3-component vector of float) +0:163 move second child to first child ( temp float) +0:163 direct index ( noContraction temp float) +0:163 'v' ( noContraction smooth out 4-component vector of float) +0:163 Constant: +0:163 3 (const int) +0:163 add ( temp float) +0:163 component-wise multiply ( temp float) +0:163 direct index ( temp float) +0:163 'a' ( in 4-component vector of float) +0:163 Constant: +0:163 3 (const int) +0:163 direct index ( temp float) +0:163 'b' ( in 4-component vector of float) +0:163 Constant: +0:163 3 (const int) +0:163 component-wise multiply ( temp float) +0:163 direct index ( temp float) +0:163 'c' ( in 4-component vector of float) +0:163 Constant: +0:163 3 (const int) +0:163 direct index ( temp float) +0:163 'd' ( in 4-component vector of float) +0:163 Constant: +0:163 3 (const int) +0:164 move second child to first child ( temp float) +0:164 direct index ( noContraction temp float) +0:164 'v' ( noContraction smooth out 4-component vector of float) +0:164 Constant: +0:164 0 (const int) +0:164 Function Call: func(f1;f1;f1;f1; ( global float) +0:164 direct index ( temp float) +0:164 'a' ( in 4-component vector of float) +0:164 Constant: +0:164 0 (const int) +0:164 direct index ( temp float) +0:164 'b' ( in 4-component vector of float) +0:164 Constant: +0:164 0 (const int) +0:164 direct index ( temp float) +0:164 'c' ( in 4-component vector of float) +0:164 Constant: +0:164 0 (const int) +0:164 direct index ( temp float) +0:164 'd' ( in 4-component vector of float) +0:164 Constant: +0:164 0 (const int) +0:166 move second child to first child ( temp float) +0:166 direct index ( noContraction temp float) +0:166 'v' ( noContraction smooth out 4-component vector of float) +0:166 Constant: +0:166 0 (const int) +0:166 Function Call: func2(f1;f1;f1;f1; ( global float) +0:166 direct index ( temp float) +0:166 'a' ( in 4-component vector of float) +0:166 Constant: +0:166 0 (const int) +0:166 direct index ( temp float) +0:166 'b' ( in 4-component vector of float) +0:166 Constant: +0:166 0 (const int) +0:166 direct index ( temp float) +0:166 'c' ( in 4-component vector of float) +0:166 Constant: +0:166 0 (const int) +0:166 direct index ( temp float) +0:166 'd' ( in 4-component vector of float) +0:166 Constant: +0:166 0 (const int) +0:167 Function Call: func3(f1;f1;f1; ( global float) +0:167 component-wise multiply ( temp float) +0:167 direct index ( temp float) +0:167 'a' ( in 4-component vector of float) +0:167 Constant: +0:167 0 (const int) +0:167 direct index ( temp float) +0:167 'b' ( in 4-component vector of float) +0:167 Constant: +0:167 0 (const int) +0:167 component-wise multiply ( temp float) +0:167 direct index ( temp float) +0:167 'c' ( in 4-component vector of float) +0:167 Constant: +0:167 0 (const int) +0:167 direct index ( temp float) +0:167 'd' ( in 4-component vector of float) +0:167 Constant: +0:167 0 (const int) +0:167 direct index ( noContraction temp float) +0:167 'v' ( noContraction smooth out 4-component vector of float) +0:167 Constant: +0:167 0 (const int) +0:169 Function Call: funcA(I21; ( global 4-component vector of float) +0:169 'img1' (layout( rgba32f) uniform image2D) +0:170 Function Call: funcB(I21; ( global 4-component vector of float) +0:170 'img2' (layout( rgba32f) coherent uniform image2D) +0:? Sequence +0:178 Sequence +0:178 move second child to first child ( temp structure{ temp float intensity, temp 3-component vector of float position}) +0:178 'lightVar' ( temp structure{ temp float intensity, temp 3-component vector of float position}) +0:178 Constant: +0:178 3.000000 +0:178 1.000000 +0:178 2.000000 +0:178 3.000000 +0:? Sequence +0:185 Sequence +0:185 move second child to first child ( temp 5-element array of float) +0:185 'a' ( temp 5-element array of float) +0:185 Construct float ( temp 5-element array of float) +0:185 'g' ( temp float) +0:185 Constant: +0:185 1.000000 +0:185 'g' ( temp float) +0:185 Constant: +0:185 2.300000 +0:185 'g' ( temp float) +0:188 move second child to first child ( temp 3-element array of float) +0:188 'b' ( temp 3-element array of float) +0:188 Construct float ( temp 3-element array of float) +0:188 'g' ( temp float) +0:188 add ( temp float) +0:188 'g' ( temp float) +0:188 Constant: +0:188 1.000000 +0:188 add ( temp float) +0:188 'g' ( temp float) +0:188 Constant: +0:188 2.000000 +0:191 Sequence +0:191 Sequence +0:191 move second child to first child ( temp 2-element array of 4-component vector of float) +0:191 'b' ( temp 2-element array of 4-component vector of float) +0:191 Constant: +0:191 1.000000 +0:191 1.000000 +0:191 1.000000 +0:191 1.000000 +0:191 1.000000 +0:191 1.000000 +0:191 1.000000 +0:191 1.000000 +0:192 Construct vec4 ( temp 3-element array of 2-element array of 4-component vector of float) +0:192 'b' ( temp 2-element array of 4-component vector of float) +0:192 'b' ( temp 2-element array of 4-component vector of float) +0:192 'b' ( temp 2-element array of 4-component vector of float) +0:193 Construct vec4 ( temp 3-element array of 2-element array of 4-component vector of float) +0:193 'b' ( temp 2-element array of 4-component vector of float) +0:193 'b' ( temp 2-element array of 4-component vector of float) +0:193 'b' ( temp 2-element array of 4-component vector of float) +0:194 Construct vec4 ( temp 3-element array of 2-element array of 4-component vector of float) +0:194 'b' ( temp 2-element array of 4-component vector of float) +0:194 'b' ( temp 2-element array of 4-component vector of float) +0:194 'b' ( temp 2-element array of 4-component vector of float) +0:? Linker Objects +0:? 'Coords' ( out block{ out 4-component vector of float Position, out 2-component vector of float Texture}) +0:? 'anon@0' ( out block{ out 4-component vector of float Color}) +0:? 'transforms' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform 4X4 matrix of float ModelViewMatrix, layout( column_major shared) uniform 4X4 matrix of float ModelViewProjectionMatrix, layout( column_major shared) uniform 1-element array of 4-component vector of float a, layout( column_major shared) uniform float Deformation}) +0:? 'normal' (layout( location=3) in 4-component vector of float) +0:? 'colors' (layout( location=6) in 3-element array of 4-component vector of float) +0:? 'transforms2' (layout( location=9) in 2-element array of 4X4 matrix of float) +0:? 's' (layout( location=3) temp structure{ global 3-component vector of float a1, global 2X2 matrix of float b, global 2-element array of 4-component vector of float c}) +0:? 'var1' ( smooth out 4-component vector of float) +0:? 'anon@1' ( out block{ out 4-component vector of float var2, out 2-component vector of float var3, out 3-component vector of float var4}) +0:? 'var5' ( smooth out 4-component vector of float) +0:? 'anon@2' ( out block{ out 4-component vector of float var6}) +0:? 'var7' ( smooth out 4-component vector of float) +0:? 'anon@3' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 4X4 matrix of float M1, layout( column_major std140 offset=64) uniform 4X4 matrix of float M2, layout( row_major std140 offset=128) uniform 3X3 matrix of float N1}) +0:? 'anon@4' (layout( column_major shared) uniform block{layout( column_major shared) uniform 4X4 matrix of float M13, layout( row_major shared) uniform 4X4 matrix of float m14, layout( column_major shared) uniform 3X3 matrix of float N12}) +0:? 's17' (layout( binding=3) uniform sampler2D) +0:? 'a2' (layout( binding=2 offset=4) uniform atomic_uint) +0:? 'bar' (layout( binding=2) uniform atomic_uint) +0:? 'bar23' (layout( offset=8) uniform atomic_uint) +0:? 'b2' (layout( binding=2) uniform atomic_uint) +0:? 'c2' (layout( binding=3) uniform atomic_uint) +0:? 'd2' (layout( binding=2) uniform atomic_uint) +0:? 'anon@5' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, flat out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:? 'ColorInv' ( smooth out 3-component vector of float) +0:? 'Color4' ( invariant centroid smooth out 3-component vector of float) +0:? 'position' ( noContraction smooth out 4-component vector of float) +0:? 'Color5' ( noContraction smooth out 3-component vector of float) +0:? 'a' ( in 4-component vector of float) +0:? 'b' ( in 4-component vector of float) +0:? 'c' ( in 4-component vector of float) +0:? 'd' ( in 4-component vector of float) +0:? 'v' ( noContraction smooth out 4-component vector of float) +0:? 'anon@6' (layout( column_major shared) coherent buffer block{layout( column_major shared) readonly buffer 4-component vector of float member1, layout( column_major shared) buffer 4-component vector of float member2}) +0:? 'anon@7' (layout( column_major shared) buffer block{layout( column_major shared) coherent readonly buffer 4-component vector of float member1A, layout( column_major shared) coherent buffer 4-component vector of float member2A}) +0:? 'shv' ( shared 4-component vector of float) +0:? 'img1' (layout( rgba32f) uniform image2D) +0:? 'img2' (layout( rgba32f) coherent uniform image2D) +0:? 'gl_VertexID' ( gl_VertexId int VertexId) +0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId) + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/specExamples.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/specExamples.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/specExamples.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/specExamples.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -320,7 +320,7 @@ 0:? 'factor' (layout( location=3 index=1) out 4-component vector of float) 0:? 'colors' (layout( location=2) out 3-element array of 4-component vector of float) 0:? 'gl_FragDepth' ( gl_FragDepth float FragDepth) -0:? 'anon@2' ( in block{ in float FogFragCoord gl_FogFragCoord, in implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, flat in 4-component vector of float Color gl_Color, in 4-component vector of float SecondaryColor gl_SecondaryColor}) +0:? 'anon@2' ( in block{ in float FogFragCoord gl_FogFragCoord, in unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, flat in 4-component vector of float Color gl_Color, in 4-component vector of float SecondaryColor gl_SecondaryColor}) Linked fragment stage: diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/specExamples.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/specExamples.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/specExamples.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/specExamples.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -19,7 +19,6 @@ ERROR: 0:87: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings ERROR: 0:89: 'binding' : atomic_uint binding is too large ERROR: 0:91: 'bar' : redefinition -ERROR: 0:92: 'atomic_uint' : layout(binding=X) is required ERROR: 0:94: 'a2' : redefinition ERROR: 0:95: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings ERROR: 0:96: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings @@ -32,7 +31,7 @@ ERROR: 0:136: '' : function does not return a value: funcB ERROR: 0:153: '' : function does not return a value: func3 ERROR: 0:170: 'coherent' : argument cannot drop memory qualifier when passed to formal parameter -ERROR: 33 compilation errors. No code generated. +ERROR: 32 compilation errors. No code generated. Shader version: 430 @@ -277,7 +276,7 @@ 0:? Linker Objects 0:? 'Coords' ( out block{ out 4-component vector of float Position, out 2-component vector of float Texture}) 0:? 'anon@0' ( out block{ out 4-component vector of float Color}) -0:? 'transforms' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform 4X4 matrix of float ModelViewMatrix, layout( column_major shared) uniform 4X4 matrix of float ModelViewProjectionMatrix, layout( column_major shared) uniform implicitly-sized array of 4-component vector of float a, layout( column_major shared) uniform float Deformation}) +0:? 'transforms' (layout( column_major shared) uniform 4-element array of block{layout( column_major shared) uniform 4X4 matrix of float ModelViewMatrix, layout( column_major shared) uniform 4X4 matrix of float ModelViewProjectionMatrix, layout( column_major shared) uniform unsized 1-element array of 4-component vector of float a, layout( column_major shared) uniform float Deformation}) 0:? 'normal' (layout( location=3) in 4-component vector of float) 0:? 'colors' (layout( location=6) in 3-element array of 4-component vector of float) 0:? 'transforms2' (layout( location=9) in 2-element array of 4X4 matrix of float) @@ -296,7 +295,7 @@ 0:? 'b2' (layout( binding=2) uniform atomic_uint) 0:? 'c2' (layout( binding=3) uniform atomic_uint) 0:? 'd2' (layout( binding=2) uniform atomic_uint) -0:? 'anon@5' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, flat out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:? 'anon@5' ( out block{ invariant gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, flat out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 0:? 'ColorInv' ( smooth out 3-component vector of float) 0:? 'Color4' ( invariant centroid smooth out 3-component vector of float) 0:? 'position' ( noContraction smooth out 4-component vector of float) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.100ops.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.100ops.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.100ops.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.100ops.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.100ops.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 49 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.130.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.130.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.130.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.130.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -2,7 +2,7 @@ WARNING: 0:31: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5 // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 205 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.140.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.140.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.140.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.140.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.140.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 96 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.150.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.150.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.150.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.150.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.150.geom // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 71 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.150.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.150.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.150.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.150.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.150.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 63 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.300BuiltIns.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.300BuiltIns.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.300BuiltIns.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.300BuiltIns.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.300BuiltIns.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 42 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.300layout.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.300layout.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.300layout.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.300layout.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.300layout.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 37 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.300layoutp.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.300layoutp.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.300layoutp.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.300layoutp.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.300layoutp.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 115 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.300layout.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.300layout.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.300layout.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.300layout.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.300layout.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 163 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.310.bitcast.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.310.bitcast.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.310.bitcast.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.310.bitcast.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.310.bitcast.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 153 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.310.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.310.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.310.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.310.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.310.comp // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 71 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.330.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.330.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.330.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.330.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.330.geom // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 32 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.400.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.400.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.400.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.400.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.400.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 1118 Capability Shader @@ -273,10 +273,10 @@ 439(bvec2v): 438(ptr) Variable Function 448(bvec3v): 447(ptr) Variable Function 457(bvec4v): 456(ptr) Variable Function - 556: 429(ptr) Variable Function - 565: 438(ptr) Variable Function - 574: 447(ptr) Variable Function - 583: 456(ptr) Variable Function + 557: 429(ptr) Variable Function + 566: 438(ptr) Variable Function + 575: 447(ptr) Variable Function + 584: 456(ptr) Variable Function 739(dmat2v): 738(ptr) Variable Function 745(dmat3v): 744(ptr) Variable Function 751(dmat4v): 750(ptr) Variable Function @@ -875,61 +875,61 @@ 554: 53(fvec4) Load 55(dvec4v) 555: 455(bvec4) IsNan 554 Store 457(bvec4v) 555 - 557: 428(bool) Load 430(boolv) + 556: 428(bool) Load 430(boolv) SelectionMerge 559 None - BranchConditional 557 558 562 + BranchConditional 556 558 562 558: Label 560: 39(float) Load 41(doublev) 561: 428(bool) IsInf 560 - Store 556 561 + Store 557 561 Branch 559 562: Label - Store 556 563 + Store 557 563 Branch 559 559: Label - 564: 428(bool) Load 556 + 564: 428(bool) Load 557 Store 430(boolv) 564 - 566: 428(bool) Load 430(boolv) + 565: 428(bool) Load 430(boolv) SelectionMerge 568 None - BranchConditional 566 567 571 + BranchConditional 565 567 571 567: Label 569: 43(fvec2) Load 45(dvec2v) 570: 437(bvec2) IsInf 569 - Store 565 570 + Store 566 570 Branch 568 571: Label - Store 565 572 + Store 566 572 Branch 568 568: Label - 573: 437(bvec2) Load 565 + 573: 437(bvec2) Load 566 Store 439(bvec2v) 573 - 575: 428(bool) Load 430(boolv) + 574: 428(bool) Load 430(boolv) SelectionMerge 577 None - BranchConditional 575 576 580 + BranchConditional 574 576 580 576: Label 578: 48(fvec3) Load 50(dvec3v) 579: 446(bvec3) IsInf 578 - Store 574 579 + Store 575 579 Branch 577 580: Label - Store 574 581 + Store 575 581 Branch 577 577: Label - 582: 446(bvec3) Load 574 + 582: 446(bvec3) Load 575 Store 448(bvec3v) 582 - 584: 428(bool) Load 430(boolv) + 583: 428(bool) Load 430(boolv) SelectionMerge 586 None - BranchConditional 584 585 589 + BranchConditional 583 585 589 585: Label 587: 53(fvec4) Load 55(dvec4v) 588: 455(bvec4) IsInf 587 - Store 583 588 + Store 584 588 Branch 586 589: Label - Store 583 590 + Store 584 590 Branch 586 586: Label - 591: 455(bvec4) Load 583 + 591: 455(bvec4) Load 584 Store 457(bvec4v) 591 592: 39(float) Load 41(doublev) 593: 39(float) ExtInst 1(GLSL.std.450) 66(Length) 592 @@ -1368,18 +1368,18 @@ 997: 10(float) Select 995 996 21 998: 39(float) FConvert 997 999: 39(float) FAdd 994 998 - 1000: 437(bvec2) Load 439(bvec2v) - 1001: 428(bool) CompositeExtract 1000 0 + 1000: 429(ptr) AccessChain 439(bvec2v) 33 + 1001: 428(bool) Load 1000 1002: 10(float) Select 1001 996 21 1003: 39(float) FConvert 1002 1004: 39(float) FAdd 999 1003 - 1005: 446(bvec3) Load 448(bvec3v) - 1006: 428(bool) CompositeExtract 1005 0 + 1005: 429(ptr) AccessChain 448(bvec3v) 33 + 1006: 428(bool) Load 1005 1007: 10(float) Select 1006 996 21 1008: 39(float) FConvert 1007 1009: 39(float) FAdd 1004 1008 - 1010: 455(bvec4) Load 457(bvec4v) - 1011: 428(bool) CompositeExtract 1010 0 + 1010: 429(ptr) AccessChain 457(bvec4v) 33 + 1011: 428(bool) Load 1010 1012: 10(float) Select 1011 996 21 1013: 39(float) FConvert 1012 1014: 39(float) FAdd 1009 1013 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.400.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.400.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.400.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.400.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.400.tesc // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 92 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.400.tese.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.400.tese.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.400.tese.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.400.tese.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.400.tese // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 96 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.420.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.420.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.420.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.420.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.420.geom // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 72 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.430.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.430.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.430.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.430.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.430.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 24 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.430.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.430.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.430.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.430.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.430.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 66 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.450.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.450.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.450.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.450.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.450.geom // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 31 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.450.noRedecl.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.450.noRedecl.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.450.noRedecl.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.450.noRedecl.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.450.noRedecl.tesc // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 21 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.450.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.450.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.450.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.450.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.450.tesc // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 45 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.460.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.460.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.460.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.460.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.460.comp // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 15 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.460.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.460.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.460.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.460.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.460.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 32 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.460.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.460.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.460.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.460.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.460.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 20 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.accessChain.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.accessChain.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.accessChain.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.accessChain.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,12 @@ spv.accessChain.frag // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 206 +// Generated by (magic number): 80006 +// Id's are bound by 222 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 65 158 + EntryPoint Fragment 4 "main" 69 170 ExecutionMode 4 OriginUpperLeft Source GLSL 420 Name 4 "main" @@ -50,12 +50,12 @@ Name 62 "GetColor13(struct-S-vf31;i1;" Name 60 "i" Name 61 "comp" - Name 65 "OutColor" - Name 153 "s" - Name 158 "u" - Name 159 "param" - Name 163 "param" - Name 167 "param" + Name 66 "GetColor14(struct-S-vf31;i1;" + Name 64 "i" + Name 65 "comp" + Name 69 "OutColor" + Name 165 "s" + Name 170 "u" Name 171 "param" Name 175 "param" Name 179 "param" @@ -65,8 +65,12 @@ Name 195 "param" Name 199 "param" Name 203 "param" - Decorate 65(OutColor) Location 0 - Decorate 158(u) Flat + Name 207 "param" + Name 211 "param" + Name 215 "param" + Name 219 "param" + Decorate 69(OutColor) Location 0 + Decorate 170(u) Flat 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -76,25 +80,27 @@ 13: TypeInt 32 1 14: TypePointer Function 13(int) 15: TypeFunction 2 8(S) 14(ptr) - 64: TypePointer Output 7(fvec3) - 65(OutColor): 64(ptr) Variable Output - 66: 13(int) Constant 0 - 67: TypeInt 32 0 - 68: 67(int) Constant 0 - 95: TypeVector 6(float) 2 - 109: 67(int) Constant 2 - 136: TypePointer Output 6(float) - 150: 6(float) Constant 0 - 151: 7(fvec3) ConstantComposite 150 150 150 - 152: TypePointer Function 8(S) - 157: TypePointer Input 13(int) - 158(u): 157(ptr) Variable Input + 68: TypePointer Output 7(fvec3) + 69(OutColor): 68(ptr) Variable Output + 70: 13(int) Constant 0 + 71: TypeInt 32 0 + 72: 71(int) Constant 0 + 99: TypeVector 6(float) 2 + 113: 71(int) Constant 2 + 140: TypePointer Output 6(float) + 147: 71(int) Constant 1 + 148: TypeVector 71(int) 2 + 149: 148(ivec2) ConstantComposite 113 147 + 158: TypeVector 71(int) 3 + 159: 158(ivec3) ConstantComposite 113 147 72 + 162: 6(float) Constant 0 + 163: 7(fvec3) ConstantComposite 162 162 162 + 164: TypePointer Function 8(S) + 169: TypePointer Input 13(int) + 170(u): 169(ptr) Variable Input 4(main): 2 Function None 3 5: Label - 153(s): 152(ptr) Variable Function - 159(param): 14(ptr) Variable Function - 163(param): 14(ptr) Variable Function - 167(param): 14(ptr) Variable Function + 165(s): 164(ptr) Variable Function 171(param): 14(ptr) Variable Function 175(param): 14(ptr) Variable Function 179(param): 14(ptr) Variable Function @@ -104,224 +110,242 @@ 195(param): 14(ptr) Variable Function 199(param): 14(ptr) Variable Function 203(param): 14(ptr) Variable Function - Store 65(OutColor) 151 - 154: 8(S) Load 153(s) - 155: 2 FunctionCall 11(GetColor1(struct-S-vf31;) 154 - 156: 8(S) Load 153(s) - 160: 13(int) Load 158(u) - Store 159(param) 160 - 161: 2 FunctionCall 18(GetColor2(struct-S-vf31;i1;) 156 159(param) - 162: 8(S) Load 153(s) - 164: 13(int) Load 158(u) - Store 163(param) 164 - 165: 2 FunctionCall 22(GetColor3(struct-S-vf31;i1;) 162 163(param) - 166: 8(S) Load 153(s) - 168: 13(int) Load 158(u) - Store 167(param) 168 - 169: 2 FunctionCall 26(GetColor4(struct-S-vf31;i1;) 166 167(param) - 170: 8(S) Load 153(s) - 172: 13(int) Load 158(u) + 207(param): 14(ptr) Variable Function + 211(param): 14(ptr) Variable Function + 215(param): 14(ptr) Variable Function + 219(param): 14(ptr) Variable Function + Store 69(OutColor) 163 + 166: 8(S) Load 165(s) + 167: 2 FunctionCall 11(GetColor1(struct-S-vf31;) 166 + 168: 8(S) Load 165(s) + 172: 13(int) Load 170(u) Store 171(param) 172 - 173: 2 FunctionCall 30(GetColor5(struct-S-vf31;i1;) 170 171(param) - 174: 8(S) Load 153(s) - 176: 13(int) Load 158(u) + 173: 2 FunctionCall 18(GetColor2(struct-S-vf31;i1;) 168 171(param) + 174: 8(S) Load 165(s) + 176: 13(int) Load 170(u) Store 175(param) 176 - 177: 2 FunctionCall 34(GetColor6(struct-S-vf31;i1;) 174 175(param) - 178: 8(S) Load 153(s) - 180: 13(int) Load 158(u) + 177: 2 FunctionCall 22(GetColor3(struct-S-vf31;i1;) 174 175(param) + 178: 8(S) Load 165(s) + 180: 13(int) Load 170(u) Store 179(param) 180 - 181: 2 FunctionCall 38(GetColor7(struct-S-vf31;i1;) 178 179(param) - 182: 8(S) Load 153(s) - 184: 13(int) Load 158(u) + 181: 2 FunctionCall 26(GetColor4(struct-S-vf31;i1;) 178 179(param) + 182: 8(S) Load 165(s) + 184: 13(int) Load 170(u) Store 183(param) 184 - 185: 2 FunctionCall 42(GetColor8(struct-S-vf31;i1;) 182 183(param) - 186: 8(S) Load 153(s) - 188: 13(int) Load 158(u) + 185: 2 FunctionCall 30(GetColor5(struct-S-vf31;i1;) 182 183(param) + 186: 8(S) Load 165(s) + 188: 13(int) Load 170(u) Store 187(param) 188 - 189: 2 FunctionCall 46(GetColor9(struct-S-vf31;i1;) 186 187(param) - 190: 8(S) Load 153(s) - 192: 13(int) Load 158(u) + 189: 2 FunctionCall 34(GetColor6(struct-S-vf31;i1;) 186 187(param) + 190: 8(S) Load 165(s) + 192: 13(int) Load 170(u) Store 191(param) 192 - 193: 2 FunctionCall 50(GetColor10(struct-S-vf31;i1;) 190 191(param) - 194: 8(S) Load 153(s) - 196: 13(int) Load 158(u) + 193: 2 FunctionCall 38(GetColor7(struct-S-vf31;i1;) 190 191(param) + 194: 8(S) Load 165(s) + 196: 13(int) Load 170(u) Store 195(param) 196 - 197: 2 FunctionCall 54(GetColor11(struct-S-vf31;i1;) 194 195(param) - 198: 8(S) Load 153(s) - 200: 13(int) Load 158(u) + 197: 2 FunctionCall 42(GetColor8(struct-S-vf31;i1;) 194 195(param) + 198: 8(S) Load 165(s) + 200: 13(int) Load 170(u) Store 199(param) 200 - 201: 2 FunctionCall 58(GetColor12(struct-S-vf31;i1;) 198 199(param) - 202: 8(S) Load 153(s) - 204: 13(int) Load 158(u) + 201: 2 FunctionCall 46(GetColor9(struct-S-vf31;i1;) 198 199(param) + 202: 8(S) Load 165(s) + 204: 13(int) Load 170(u) Store 203(param) 204 - 205: 2 FunctionCall 62(GetColor13(struct-S-vf31;i1;) 202 203(param) + 205: 2 FunctionCall 50(GetColor10(struct-S-vf31;i1;) 202 203(param) + 206: 8(S) Load 165(s) + 208: 13(int) Load 170(u) + Store 207(param) 208 + 209: 2 FunctionCall 54(GetColor11(struct-S-vf31;i1;) 206 207(param) + 210: 8(S) Load 165(s) + 212: 13(int) Load 170(u) + Store 211(param) 212 + 213: 2 FunctionCall 58(GetColor12(struct-S-vf31;i1;) 210 211(param) + 214: 8(S) Load 165(s) + 216: 13(int) Load 170(u) + Store 215(param) 216 + 217: 2 FunctionCall 62(GetColor13(struct-S-vf31;i1;) 214 215(param) + 218: 8(S) Load 165(s) + 220: 13(int) Load 170(u) + Store 219(param) 220 + 221: 2 FunctionCall 66(GetColor14(struct-S-vf31;i1;) 218 219(param) Return FunctionEnd 11(GetColor1(struct-S-vf31;): 2 Function None 9 10(i): 8(S) FunctionParameter 12: Label - 69: 6(float) CompositeExtract 10(i) 0 0 - 70: 7(fvec3) Load 65(OutColor) - 71: 7(fvec3) CompositeConstruct 69 69 69 - 72: 7(fvec3) FAdd 70 71 - Store 65(OutColor) 72 + 73: 6(float) CompositeExtract 10(i) 0 0 + 74: 7(fvec3) Load 69(OutColor) + 75: 7(fvec3) CompositeConstruct 73 73 73 + 76: 7(fvec3) FAdd 74 75 + Store 69(OutColor) 76 Return FunctionEnd 18(GetColor2(struct-S-vf31;i1;): 2 Function None 15 16(i): 8(S) FunctionParameter 17(comp): 14(ptr) FunctionParameter 19: Label - 73: 13(int) Load 17(comp) - 74: 7(fvec3) CompositeExtract 16(i) 0 - 75: 6(float) VectorExtractDynamic 74 73 - 76: 7(fvec3) Load 65(OutColor) - 77: 7(fvec3) CompositeConstruct 75 75 75 - 78: 7(fvec3) FAdd 76 77 - Store 65(OutColor) 78 + 77: 13(int) Load 17(comp) + 78: 7(fvec3) CompositeExtract 16(i) 0 + 79: 6(float) VectorExtractDynamic 78 77 + 80: 7(fvec3) Load 69(OutColor) + 81: 7(fvec3) CompositeConstruct 79 79 79 + 82: 7(fvec3) FAdd 80 81 + Store 69(OutColor) 82 Return FunctionEnd 22(GetColor3(struct-S-vf31;i1;): 2 Function None 15 20(i): 8(S) FunctionParameter 21(comp): 14(ptr) FunctionParameter 23: Label - 79: 13(int) Load 21(comp) - 80: 7(fvec3) CompositeExtract 20(i) 0 - 81: 6(float) VectorExtractDynamic 80 79 - 82: 7(fvec3) Load 65(OutColor) - 83: 7(fvec3) CompositeConstruct 81 81 81 - 84: 7(fvec3) FAdd 82 83 - Store 65(OutColor) 84 + 83: 13(int) Load 21(comp) + 84: 7(fvec3) CompositeExtract 20(i) 0 + 85: 6(float) VectorExtractDynamic 84 83 + 86: 7(fvec3) Load 69(OutColor) + 87: 7(fvec3) CompositeConstruct 85 85 85 + 88: 7(fvec3) FAdd 86 87 + Store 69(OutColor) 88 Return FunctionEnd 26(GetColor4(struct-S-vf31;i1;): 2 Function None 15 24(i): 8(S) FunctionParameter 25(comp): 14(ptr) FunctionParameter 27: Label - 85: 13(int) Load 25(comp) - 86: 7(fvec3) CompositeExtract 24(i) 0 - 87: 6(float) VectorExtractDynamic 86 85 - 88: 7(fvec3) Load 65(OutColor) - 89: 7(fvec3) CompositeConstruct 87 87 87 - 90: 7(fvec3) FAdd 88 89 - Store 65(OutColor) 90 + 89: 13(int) Load 25(comp) + 90: 7(fvec3) CompositeExtract 24(i) 0 + 91: 6(float) VectorExtractDynamic 90 89 + 92: 7(fvec3) Load 69(OutColor) + 93: 7(fvec3) CompositeConstruct 91 91 91 + 94: 7(fvec3) FAdd 92 93 + Store 69(OutColor) 94 Return FunctionEnd 30(GetColor5(struct-S-vf31;i1;): 2 Function None 15 28(i): 8(S) FunctionParameter 29(comp): 14(ptr) FunctionParameter 31: Label - 91: 7(fvec3) CompositeExtract 28(i) 0 - 92: 7(fvec3) Load 65(OutColor) - 93: 7(fvec3) FAdd 92 91 - Store 65(OutColor) 93 + 95: 7(fvec3) CompositeExtract 28(i) 0 + 96: 7(fvec3) Load 69(OutColor) + 97: 7(fvec3) FAdd 96 95 + Store 69(OutColor) 97 Return FunctionEnd 34(GetColor6(struct-S-vf31;i1;): 2 Function None 15 32(i): 8(S) FunctionParameter 33(comp): 14(ptr) FunctionParameter 35: Label - 94: 13(int) Load 33(comp) - 96: 7(fvec3) CompositeExtract 32(i) 0 - 97: 95(fvec2) VectorShuffle 96 96 1 0 - 98: 6(float) VectorExtractDynamic 97 94 - 99: 7(fvec3) Load 65(OutColor) - 100: 7(fvec3) CompositeConstruct 98 98 98 - 101: 7(fvec3) FAdd 99 100 - Store 65(OutColor) 101 + 98: 13(int) Load 33(comp) + 100: 7(fvec3) CompositeExtract 32(i) 0 + 101: 99(fvec2) VectorShuffle 100 100 1 0 + 102: 6(float) VectorExtractDynamic 101 98 + 103: 7(fvec3) Load 69(OutColor) + 104: 7(fvec3) CompositeConstruct 102 102 102 + 105: 7(fvec3) FAdd 103 104 + Store 69(OutColor) 105 Return FunctionEnd 38(GetColor7(struct-S-vf31;i1;): 2 Function None 15 36(i): 8(S) FunctionParameter 37(comp): 14(ptr) FunctionParameter 39: Label - 102: 7(fvec3) CompositeExtract 36(i) 0 - 103: 95(fvec2) VectorShuffle 102 102 0 1 - 104: 7(fvec3) Load 65(OutColor) - 105: 95(fvec2) VectorShuffle 104 104 0 1 - 106: 95(fvec2) FAdd 105 103 - 107: 7(fvec3) Load 65(OutColor) - 108: 7(fvec3) VectorShuffle 107 106 3 4 2 - Store 65(OutColor) 108 + 106: 7(fvec3) CompositeExtract 36(i) 0 + 107: 99(fvec2) VectorShuffle 106 106 0 1 + 108: 7(fvec3) Load 69(OutColor) + 109: 99(fvec2) VectorShuffle 108 108 0 1 + 110: 99(fvec2) FAdd 109 107 + 111: 7(fvec3) Load 69(OutColor) + 112: 7(fvec3) VectorShuffle 111 110 3 4 2 + Store 69(OutColor) 112 Return FunctionEnd 42(GetColor8(struct-S-vf31;i1;): 2 Function None 15 40(i): 8(S) FunctionParameter 41(comp): 14(ptr) FunctionParameter 43: Label - 110: 6(float) CompositeExtract 40(i) 0 2 - 111: 7(fvec3) Load 65(OutColor) - 112: 7(fvec3) CompositeConstruct 110 110 110 - 113: 7(fvec3) FAdd 111 112 - Store 65(OutColor) 113 + 114: 6(float) CompositeExtract 40(i) 0 2 + 115: 7(fvec3) Load 69(OutColor) + 116: 7(fvec3) CompositeConstruct 114 114 114 + 117: 7(fvec3) FAdd 115 116 + Store 69(OutColor) 117 Return FunctionEnd 46(GetColor9(struct-S-vf31;i1;): 2 Function None 15 44(i): 8(S) FunctionParameter 45(comp): 14(ptr) FunctionParameter 47: Label - 114: 7(fvec3) CompositeExtract 44(i) 0 - 115: 7(fvec3) Load 65(OutColor) - 116: 7(fvec3) VectorShuffle 115 115 2 0 1 - 117: 7(fvec3) FAdd 116 114 - 118: 7(fvec3) Load 65(OutColor) - 119: 7(fvec3) VectorShuffle 118 117 4 5 3 - Store 65(OutColor) 119 + 118: 7(fvec3) CompositeExtract 44(i) 0 + 119: 7(fvec3) Load 69(OutColor) + 120: 7(fvec3) VectorShuffle 119 119 2 0 1 + 121: 7(fvec3) FAdd 120 118 + 122: 7(fvec3) Load 69(OutColor) + 123: 7(fvec3) VectorShuffle 122 121 4 5 3 + Store 69(OutColor) 123 Return FunctionEnd 50(GetColor10(struct-S-vf31;i1;): 2 Function None 15 48(i): 8(S) FunctionParameter 49(comp): 14(ptr) FunctionParameter 51: Label - 120: 7(fvec3) CompositeExtract 48(i) 0 - 121: 95(fvec2) VectorShuffle 120 120 0 1 - 122: 7(fvec3) Load 65(OutColor) - 123: 95(fvec2) VectorShuffle 122 122 2 1 - 124: 95(fvec2) FAdd 123 121 - 125: 7(fvec3) Load 65(OutColor) - 126: 7(fvec3) VectorShuffle 125 124 0 4 3 - Store 65(OutColor) 126 + 124: 7(fvec3) CompositeExtract 48(i) 0 + 125: 99(fvec2) VectorShuffle 124 124 0 1 + 126: 7(fvec3) Load 69(OutColor) + 127: 99(fvec2) VectorShuffle 126 126 2 1 + 128: 99(fvec2) FAdd 127 125 + 129: 7(fvec3) Load 69(OutColor) + 130: 7(fvec3) VectorShuffle 129 128 0 4 3 + Store 69(OutColor) 130 Return FunctionEnd 54(GetColor11(struct-S-vf31;i1;): 2 Function None 15 52(i): 8(S) FunctionParameter 53(comp): 14(ptr) FunctionParameter 55: Label - 127: 7(fvec3) CompositeExtract 52(i) 0 - 128: 95(fvec2) VectorShuffle 127 127 0 1 - 129: 7(fvec3) Load 65(OutColor) - 130: 95(fvec2) VectorShuffle 129 129 0 2 - 131: 95(fvec2) FAdd 130 128 - 132: 7(fvec3) Load 65(OutColor) - 133: 7(fvec3) VectorShuffle 132 131 3 1 4 - Store 65(OutColor) 133 + 131: 7(fvec3) CompositeExtract 52(i) 0 + 132: 99(fvec2) VectorShuffle 131 131 0 1 + 133: 7(fvec3) Load 69(OutColor) + 134: 99(fvec2) VectorShuffle 133 133 0 2 + 135: 99(fvec2) FAdd 134 132 + 136: 7(fvec3) Load 69(OutColor) + 137: 7(fvec3) VectorShuffle 136 135 3 1 4 + Store 69(OutColor) 137 Return FunctionEnd 58(GetColor12(struct-S-vf31;i1;): 2 Function None 15 56(i): 8(S) FunctionParameter 57(comp): 14(ptr) FunctionParameter 59: Label - 134: 13(int) Load 57(comp) - 135: 6(float) CompositeExtract 56(i) 0 0 - 137: 136(ptr) AccessChain 65(OutColor) 134 - 138: 6(float) Load 137 - 139: 6(float) FAdd 138 135 - 140: 136(ptr) AccessChain 65(OutColor) 134 - Store 140 139 + 138: 13(int) Load 57(comp) + 139: 6(float) CompositeExtract 56(i) 0 0 + 141: 140(ptr) AccessChain 69(OutColor) 138 + 142: 6(float) Load 141 + 143: 6(float) FAdd 142 139 + 144: 140(ptr) AccessChain 69(OutColor) 138 + Store 144 143 Return FunctionEnd 62(GetColor13(struct-S-vf31;i1;): 2 Function None 15 60(i): 8(S) FunctionParameter 61(comp): 14(ptr) FunctionParameter 63: Label - 141: 13(int) Load 61(comp) - 142: 6(float) CompositeExtract 60(i) 0 0 - 143: 7(fvec3) Load 65(OutColor) - 144: 95(fvec2) VectorShuffle 143 143 2 1 - 145: 6(float) VectorExtractDynamic 144 141 - 146: 6(float) FAdd 145 142 - 147: 7(fvec3) Load 65(OutColor) - 148: 7(fvec3) VectorShuffle 147 147 2 1 2 - 149: 7(fvec3) VectorInsertDynamic 148 146 141 - Store 65(OutColor) 149 + 145: 13(int) Load 61(comp) + 146: 6(float) CompositeExtract 60(i) 0 0 + 150: 71(int) VectorExtractDynamic 149 145 + 151: 140(ptr) AccessChain 69(OutColor) 150 + 152: 6(float) Load 151 + 153: 6(float) FAdd 152 146 + 154: 71(int) VectorExtractDynamic 149 145 + 155: 140(ptr) AccessChain 69(OutColor) 154 + Store 155 153 + Return + FunctionEnd +66(GetColor14(struct-S-vf31;i1;): 2 Function None 15 + 64(i): 8(S) FunctionParameter + 65(comp): 14(ptr) FunctionParameter + 67: Label + 156: 13(int) Load 65(comp) + 157: 6(float) CompositeExtract 64(i) 0 0 + 160: 71(int) VectorExtractDynamic 159 156 + 161: 140(ptr) AccessChain 69(OutColor) 160 + Store 161 157 Return FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.aggOps.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.aggOps.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.aggOps.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.aggOps.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -3,7 +3,7 @@ "precision mediump int; precision highp float;" // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 215 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.always-discard2.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.always-discard2.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.always-discard2.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.always-discard2.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.always-discard2.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 40 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.always-discard.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.always-discard.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.always-discard.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.always-discard.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.always-discard.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 84 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.AofA.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.AofA.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.AofA.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.AofA.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.AofA.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 104 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.arbPostDepthCoverage.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.arbPostDepthCoverage.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.arbPostDepthCoverage.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.arbPostDepthCoverage.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.arbPostDepthCoverage.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 18 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.atomic.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.atomic.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.atomic.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.atomic.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.atomic.comp // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 74 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.atomicInt64.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.atomicInt64.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.atomicInt64.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.atomicInt64.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.atomicInt64.comp // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 149 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.barrier.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.barrier.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.barrier.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.barrier.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.barrier.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 24 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.bitCast.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.bitCast.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.bitCast.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.bitCast.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.bitCast.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 172 Capability Shader @@ -86,8 +86,8 @@ 148(u4): 147(ptr) Variable Input 153: TypePointer Output 46(fvec4) 154(fragColor): 153(ptr) Variable Output - 159: TypeBool - 160: TypeVector 159(bool) 4 + 158: TypeBool + 159: TypeVector 158(bool) 4 168: 12(float) Constant 1045220557 169: 46(fvec4) ConstantComposite 168 168 168 168 4(main): 2 Function None 3 @@ -95,7 +95,7 @@ 9(idata): 8(ptr) Variable Function 55(udata): 54(ptr) Variable Function 85(fdata): 84(ptr) Variable Function - 155: 84(ptr) Variable Function + 162: 84(ptr) Variable Function Store 9(idata) 11 15: 12(float) Load 14(f1) 16: 6(int) Bitcast 15 @@ -211,24 +211,24 @@ 151: 46(fvec4) Load 85(fdata) 152: 46(fvec4) FAdd 151 150 Store 85(fdata) 152 - 156: 7(ivec4) Load 9(idata) - 157: 53(ivec4) Bitcast 156 - 158: 53(ivec4) Load 55(udata) - 161: 160(bvec4) IEqual 157 158 - 162: 159(bool) All 161 + 155: 7(ivec4) Load 9(idata) + 156: 53(ivec4) Bitcast 155 + 157: 53(ivec4) Load 55(udata) + 160: 159(bvec4) IEqual 156 157 + 161: 158(bool) All 160 SelectionMerge 164 None - BranchConditional 162 163 166 + BranchConditional 161 163 166 163: Label 165: 46(fvec4) Load 85(fdata) - Store 155 165 + Store 162 165 Branch 164 166: Label 167: 46(fvec4) Load 85(fdata) 170: 46(fvec4) FAdd 167 169 - Store 155 170 + Store 162 170 Branch 164 164: Label - 171: 46(fvec4) Load 155 + 171: 46(fvec4) Load 162 Store 154(fragColor) 171 Return FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.boolInBlock.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.boolInBlock.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.boolInBlock.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.boolInBlock.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,12 @@ spv.boolInBlock.frag // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 107 +// Generated by (magic number): 80006 +// Id's are bound by 102 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 75 + EntryPoint Fragment 4 "main" 74 ExecutionMode 4 OriginUpperLeft Source GLSL 450 Name 4 "main" @@ -14,24 +14,24 @@ Name 12 "paramb4" Name 13 "paramb2" Name 17 "b1" - Name 24 "Buffer" - MemberName 24(Buffer) 0 "b2" - Name 26 "" - Name 39 "Uniform" - MemberName 39(Uniform) 0 "b4" - Name 41 "" - Name 62 "param" - Name 67 "param" - Name 75 "fragColor" - MemberDecorate 24(Buffer) 0 Offset 0 - Decorate 24(Buffer) BufferBlock - Decorate 26 DescriptorSet 0 - Decorate 26 Binding 1 - MemberDecorate 39(Uniform) 0 Offset 0 - Decorate 39(Uniform) Block - Decorate 41 DescriptorSet 0 - Decorate 41 Binding 0 - Decorate 75(fragColor) Location 0 + Name 25 "Buffer" + MemberName 25(Buffer) 0 "b2" + Name 27 "" + Name 40 "Uniform" + MemberName 40(Uniform) 0 "b4" + Name 42 "" + Name 60 "param" + Name 66 "param" + Name 74 "fragColor" + MemberDecorate 25(Buffer) 0 Offset 0 + Decorate 25(Buffer) BufferBlock + Decorate 27 DescriptorSet 0 + Decorate 27 Binding 1 + MemberDecorate 40(Uniform) 0 Offset 0 + Decorate 40(Uniform) Block + Decorate 42 DescriptorSet 0 + Decorate 42 Binding 0 + Decorate 74(fragColor) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeBool @@ -41,111 +41,106 @@ 10: TypePointer Function 9(bvec2) 11: TypeFunction 2 8(ptr) 10(ptr) 16: TypePointer Function 6(bool) - 22: TypeInt 32 0 - 23: TypeVector 22(int) 2 - 24(Buffer): TypeStruct 23(ivec2) - 25: TypePointer Uniform 24(Buffer) - 26: 25(ptr) Variable Uniform - 27: TypeInt 32 1 - 28: 27(int) Constant 0 - 29: 6(bool) ConstantFalse - 30: 9(bvec2) ConstantComposite 29 29 - 31: 22(int) Constant 1 - 32: 23(ivec2) ConstantComposite 31 31 - 33: 22(int) Constant 0 - 34: 23(ivec2) ConstantComposite 33 33 - 36: TypePointer Uniform 23(ivec2) - 38: TypeVector 22(int) 4 - 39(Uniform): TypeStruct 38(ivec4) - 40: TypePointer Uniform 39(Uniform) - 41: 40(ptr) Variable Uniform - 42: TypePointer Uniform 38(ivec4) - 65: 38(ivec4) ConstantComposite 33 33 33 33 - 72: TypeFloat 32 - 73: TypeVector 72(float) 4 - 74: TypePointer Output 73(fvec4) - 75(fragColor): 74(ptr) Variable Output - 87: 72(float) Constant 0 - 88: 72(float) Constant 1065353216 + 18: TypeInt 32 0 + 19: 18(int) Constant 2 + 24: TypeVector 18(int) 2 + 25(Buffer): TypeStruct 24(ivec2) + 26: TypePointer Uniform 25(Buffer) + 27: 26(ptr) Variable Uniform + 28: TypeInt 32 1 + 29: 28(int) Constant 0 + 30: 6(bool) ConstantFalse + 31: 9(bvec2) ConstantComposite 30 30 + 32: 18(int) Constant 1 + 33: 24(ivec2) ConstantComposite 32 32 + 34: 18(int) Constant 0 + 35: 24(ivec2) ConstantComposite 34 34 + 37: TypePointer Uniform 24(ivec2) + 39: TypeVector 18(int) 4 + 40(Uniform): TypeStruct 39(ivec4) + 41: TypePointer Uniform 40(Uniform) + 42: 41(ptr) Variable Uniform + 43: TypePointer Uniform 18(int) + 61: TypePointer Uniform 39(ivec4) + 64: 39(ivec4) ConstantComposite 34 34 34 34 + 71: TypeFloat 32 + 72: TypeVector 71(float) 4 + 73: TypePointer Output 72(fvec4) + 74(fragColor): 73(ptr) Variable Output + 84: 71(float) Constant 0 + 85: 71(float) Constant 1065353216 4(main): 2 Function None 3 5: Label - 62(param): 8(ptr) Variable Function - 67(param): 10(ptr) Variable Function - 35: 23(ivec2) Select 30 32 34 - 37: 36(ptr) AccessChain 26 28 - Store 37 35 - 43: 42(ptr) AccessChain 41 28 - 44: 38(ivec4) Load 43 - 45: 22(int) CompositeExtract 44 2 - 46: 6(bool) INotEqual 45 33 + 60(param): 8(ptr) Variable Function + 66(param): 10(ptr) Variable Function + 36: 24(ivec2) Select 31 33 35 + 38: 37(ptr) AccessChain 27 29 + Store 38 36 + 44: 43(ptr) AccessChain 42 29 19 + 45: 18(int) Load 44 + 46: 6(bool) INotEqual 45 34 SelectionMerge 48 None BranchConditional 46 47 48 47: Label - 49: 42(ptr) AccessChain 41 28 - 50: 38(ivec4) Load 49 - 51: 22(int) CompositeExtract 50 0 - 52: 6(bool) INotEqual 51 33 - 53: 9(bvec2) CompositeConstruct 52 52 - 54: 23(ivec2) Select 53 32 34 - 55: 36(ptr) AccessChain 26 28 - Store 55 54 + 49: 43(ptr) AccessChain 42 29 34 + 50: 18(int) Load 49 + 51: 6(bool) INotEqual 50 34 + 52: 9(bvec2) CompositeConstruct 51 51 + 53: 24(ivec2) Select 52 33 35 + 54: 37(ptr) AccessChain 27 29 + Store 54 53 Branch 48 48: Label - 56: 36(ptr) AccessChain 26 28 - 57: 23(ivec2) Load 56 - 58: 22(int) CompositeExtract 57 0 - 59: 6(bool) INotEqual 58 33 - SelectionMerge 61 None - BranchConditional 59 60 61 - 60: Label - 63: 42(ptr) AccessChain 41 28 - 64: 38(ivec4) Load 63 - 66: 7(bvec4) INotEqual 64 65 - Store 62(param) 66 - 68: 2 FunctionCall 14(foo(vb4;vb2;) 62(param) 67(param) - 69: 9(bvec2) Load 67(param) - 70: 23(ivec2) Select 69 32 34 - 71: 36(ptr) AccessChain 26 28 - Store 71 70 - Branch 61 - 61: Label - 76: 42(ptr) AccessChain 41 28 - 77: 38(ivec4) Load 76 - 78: 22(int) CompositeExtract 77 0 - 79: 6(bool) INotEqual 78 33 - SelectionMerge 81 None - BranchConditional 79 80 81 - 80: Label - 82: 42(ptr) AccessChain 41 28 - 83: 38(ivec4) Load 82 - 84: 22(int) CompositeExtract 83 1 - 85: 6(bool) INotEqual 84 33 - Branch 81 - 81: Label - 86: 6(bool) Phi 79 61 85 80 - 89: 72(float) Select 86 88 87 - 90: 73(fvec4) CompositeConstruct 89 89 89 89 - Store 75(fragColor) 90 - 91: 42(ptr) AccessChain 41 28 - 92: 38(ivec4) Load 91 - 93: 22(int) CompositeExtract 92 0 - 94: 6(bool) INotEqual 93 33 - 95: 6(bool) LogicalNot 94 - SelectionMerge 97 None - BranchConditional 95 96 97 - 96: Label - 98: 42(ptr) AccessChain 41 28 - 99: 38(ivec4) Load 98 - 100: 22(int) CompositeExtract 99 1 - 101: 6(bool) INotEqual 100 33 - Branch 97 - 97: Label - 102: 6(bool) Phi 94 81 101 96 - 103: 72(float) Select 102 88 87 - 104: 73(fvec4) CompositeConstruct 103 103 103 103 - 105: 73(fvec4) Load 75(fragColor) - 106: 73(fvec4) FSub 105 104 - Store 75(fragColor) 106 + 55: 43(ptr) AccessChain 27 29 34 + 56: 18(int) Load 55 + 57: 6(bool) INotEqual 56 34 + SelectionMerge 59 None + BranchConditional 57 58 59 + 58: Label + 62: 61(ptr) AccessChain 42 29 + 63: 39(ivec4) Load 62 + 65: 7(bvec4) INotEqual 63 64 + Store 60(param) 65 + 67: 2 FunctionCall 14(foo(vb4;vb2;) 60(param) 66(param) + 68: 9(bvec2) Load 66(param) + 69: 24(ivec2) Select 68 33 35 + 70: 37(ptr) AccessChain 27 29 + Store 70 69 + Branch 59 + 59: Label + 75: 43(ptr) AccessChain 42 29 34 + 76: 18(int) Load 75 + 77: 6(bool) INotEqual 76 34 + SelectionMerge 79 None + BranchConditional 77 78 79 + 78: Label + 80: 43(ptr) AccessChain 42 29 32 + 81: 18(int) Load 80 + 82: 6(bool) INotEqual 81 34 + Branch 79 + 79: Label + 83: 6(bool) Phi 77 59 82 78 + 86: 71(float) Select 83 85 84 + 87: 72(fvec4) CompositeConstruct 86 86 86 86 + Store 74(fragColor) 87 + 88: 43(ptr) AccessChain 42 29 34 + 89: 18(int) Load 88 + 90: 6(bool) INotEqual 89 34 + 91: 6(bool) LogicalNot 90 + SelectionMerge 93 None + BranchConditional 91 92 93 + 92: Label + 94: 43(ptr) AccessChain 42 29 32 + 95: 18(int) Load 94 + 96: 6(bool) INotEqual 95 34 + Branch 93 + 93: Label + 97: 6(bool) Phi 90 79 96 92 + 98: 71(float) Select 97 85 84 + 99: 72(fvec4) CompositeConstruct 98 98 98 98 + 100: 72(fvec4) Load 74(fragColor) + 101: 72(fvec4) FSub 100 99 + Store 74(fragColor) 101 Return FunctionEnd 14(foo(vb4;vb2;): 2 Function None 11 @@ -153,11 +148,11 @@ 13(paramb2): 10(ptr) FunctionParameter 15: Label 17(b1): 16(ptr) Variable Function - 18: 7(bvec4) Load 12(paramb4) - 19: 6(bool) CompositeExtract 18 2 - Store 17(b1) 19 - 20: 6(bool) Load 17(b1) - 21: 9(bvec2) CompositeConstruct 20 20 - Store 13(paramb2) 21 + 20: 16(ptr) AccessChain 12(paramb4) 19 + 21: 6(bool) Load 20 + Store 17(b1) 21 + 22: 6(bool) Load 17(b1) + 23: 9(bvec2) CompositeConstruct 22 22 + Store 13(paramb2) 23 Return FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.bool.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.bool.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.bool.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.bool.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.bool.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 46 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.branch-return.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.branch-return.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.branch-return.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.branch-return.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.branch-return.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 38 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.buffer.autoassign.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.buffer.autoassign.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.buffer.autoassign.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.buffer.autoassign.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.buffer.autoassign.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 50 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.builtInXFB.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.builtInXFB.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.builtInXFB.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.builtInXFB.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.builtInXFB.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 21 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.conditionalDiscard.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.conditionalDiscard.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.conditionalDiscard.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.conditionalDiscard.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.conditionalDiscard.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 36 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.constStruct.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.constStruct.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.constStruct.vert.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.constStruct.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,45 @@ +spv.constStruct.vert +// Module Version 10000 +// Generated by (magic number): 80006 +// Id's are bound by 23 + + Capability Shader + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Vertex 4 "main" + Source GLSL 450 + Name 4 "main" + Name 9 "T" + MemberName 9(T) 0 "m" + Name 10 "U" + MemberName 10(U) 0 "m" + Name 11 "S" + MemberName 11(S) 0 "t" + MemberName 11(S) 1 "u" + Name 13 "s1" + Name 22 "s2" + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeVector 6(float) 2 + 8: TypeMatrix 7(fvec2) 2 + 9(T): TypeStruct 8 + 10(U): TypeStruct 8 + 11(S): TypeStruct 9(T) 10(U) + 12: TypePointer Function 11(S) + 14: 6(float) Constant 1065353216 + 15: 6(float) Constant 0 + 16: 7(fvec2) ConstantComposite 14 15 + 17: 7(fvec2) ConstantComposite 15 14 + 18: 8 ConstantComposite 16 17 + 19: 9(T) ConstantComposite 18 + 20: 10(U) ConstantComposite 18 + 21: 11(S) ConstantComposite 19 20 + 4(main): 2 Function None 3 + 5: Label + 13(s1): 12(ptr) Variable Function + 22(s2): 12(ptr) Variable Function + Store 13(s1) 21 + Store 22(s2) 21 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.controlFlowAttributes.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.controlFlowAttributes.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.controlFlowAttributes.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.controlFlowAttributes.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -8,7 +8,7 @@ WARNING: 0:26: '' : attribute with arguments not recognized, skipping // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 118 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.conversion.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.conversion.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.conversion.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.conversion.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.conversion.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 455 Capability Shader @@ -119,8 +119,8 @@ 315: 13(int) Constant 1 321: TypePointer Output 95(fvec4) 322(gl_FragColor): 321(ptr) Variable Output - 367: 13(int) Constant 2 - 380: 13(int) Constant 3 + 336: 13(int) Constant 2 + 349: 13(int) Constant 3 427: TypePointer Private 6(bool) 428(u_b): 427(ptr) Variable Private 429: TypePointer Private 23(bvec2) @@ -163,9 +163,9 @@ 110(f2): 109(ptr) Variable Function 114(f3): 113(ptr) Variable Function 118(f4): 117(ptr) Variable Function - 297: 105(ptr) Variable Function - 307: 105(ptr) Variable Function - 323: 117(ptr) Variable Function + 298: 105(ptr) Variable Function + 309: 105(ptr) Variable Function + 353: 117(ptr) Variable Function 417(cv2): 93(ptr) Variable Function 418(cv5): 44(ptr) Variable Function 12: 9(int) Load 11(u_i) @@ -425,101 +425,101 @@ SelectionMerge 296 None BranchConditional 294 295 296 295: Label - 298: 6(bool) Load 8(b) + 297: 6(bool) Load 8(b) SelectionMerge 300 None - BranchConditional 298 299 303 + BranchConditional 297 299 303 299: Label 301: 9(int) Load 58(i) 302: 16(float) ConvertSToF 301 - Store 297 302 + Store 298 302 Branch 300 303: Label 304: 105(ptr) AccessChain 110(f2) 14 305: 16(float) Load 304 - Store 297 305 + Store 298 305 Branch 300 300: Label - 306: 16(float) Load 297 - 308: 23(bvec2) Load 25(b2) - 309: 6(bool) CompositeExtract 308 0 + 306: 16(float) Load 298 + 307: 7(ptr) AccessChain 25(b2) 14 + 308: 6(bool) Load 307 SelectionMerge 311 None - BranchConditional 309 310 314 + BranchConditional 308 310 314 310: Label 312: 105(ptr) AccessChain 114(f3) 14 313: 16(float) Load 312 - Store 307 313 + Store 309 313 Branch 311 314: Label 316: 57(ptr) AccessChain 68(i2) 315 317: 9(int) Load 316 318: 16(float) ConvertSToF 317 - Store 307 318 + Store 309 318 Branch 311 311: Label - 319: 16(float) Load 307 + 319: 16(float) Load 309 320: 16(float) FAdd 306 319 Store 106(f) 320 Branch 296 296: Label - 324: 6(bool) Load 8(b) - 325: 23(bvec2) Load 25(b2) - 326: 6(bool) CompositeExtract 325 0 - 327: 6(bool) LogicalOr 324 326 - 328: 23(bvec2) Load 25(b2) - 329: 6(bool) CompositeExtract 328 1 - 330: 6(bool) LogicalOr 327 329 - 331: 31(bvec3) Load 33(b3) - 332: 6(bool) CompositeExtract 331 0 - 333: 6(bool) LogicalOr 330 332 - 334: 31(bvec3) Load 33(b3) - 335: 6(bool) CompositeExtract 334 1 - 336: 6(bool) LogicalOr 333 335 - 337: 31(bvec3) Load 33(b3) - 338: 6(bool) CompositeExtract 337 2 - 339: 6(bool) LogicalOr 336 338 - 340: 43(bvec4) Load 45(b4) - 341: 6(bool) CompositeExtract 340 0 + 323: 6(bool) Load 8(b) + 324: 7(ptr) AccessChain 25(b2) 14 + 325: 6(bool) Load 324 + 326: 6(bool) LogicalOr 323 325 + 327: 7(ptr) AccessChain 25(b2) 315 + 328: 6(bool) Load 327 + 329: 6(bool) LogicalOr 326 328 + 330: 7(ptr) AccessChain 33(b3) 14 + 331: 6(bool) Load 330 + 332: 6(bool) LogicalOr 329 331 + 333: 7(ptr) AccessChain 33(b3) 315 + 334: 6(bool) Load 333 + 335: 6(bool) LogicalOr 332 334 + 337: 7(ptr) AccessChain 33(b3) 336 + 338: 6(bool) Load 337 + 339: 6(bool) LogicalOr 335 338 + 340: 7(ptr) AccessChain 45(b4) 14 + 341: 6(bool) Load 340 342: 6(bool) LogicalOr 339 341 - 343: 43(bvec4) Load 45(b4) - 344: 6(bool) CompositeExtract 343 1 + 343: 7(ptr) AccessChain 45(b4) 315 + 344: 6(bool) Load 343 345: 6(bool) LogicalOr 342 344 - 346: 43(bvec4) Load 45(b4) - 347: 6(bool) CompositeExtract 346 2 + 346: 7(ptr) AccessChain 45(b4) 336 + 347: 6(bool) Load 346 348: 6(bool) LogicalOr 345 347 - 349: 43(bvec4) Load 45(b4) - 350: 6(bool) CompositeExtract 349 3 - 351: 6(bool) LogicalOr 348 350 - SelectionMerge 353 None - BranchConditional 351 352 415 - 352: Label - 354: 9(int) Load 58(i) - 355: 57(ptr) AccessChain 68(i2) 14 - 356: 9(int) Load 355 - 357: 9(int) IAdd 354 356 - 358: 57(ptr) AccessChain 68(i2) 315 - 359: 9(int) Load 358 - 360: 9(int) IAdd 357 359 - 361: 57(ptr) AccessChain 81(i3) 14 - 362: 9(int) Load 361 - 363: 9(int) IAdd 360 362 - 364: 57(ptr) AccessChain 81(i3) 315 - 365: 9(int) Load 364 - 366: 9(int) IAdd 363 365 - 368: 57(ptr) AccessChain 81(i3) 367 - 369: 9(int) Load 368 - 370: 9(int) IAdd 366 369 - 371: 57(ptr) AccessChain 94(i4) 14 - 372: 9(int) Load 371 - 373: 9(int) IAdd 370 372 - 374: 57(ptr) AccessChain 94(i4) 315 - 375: 9(int) Load 374 - 376: 9(int) IAdd 373 375 - 377: 57(ptr) AccessChain 94(i4) 367 - 378: 9(int) Load 377 - 379: 9(int) IAdd 376 378 - 381: 57(ptr) AccessChain 94(i4) 380 + 350: 7(ptr) AccessChain 45(b4) 349 + 351: 6(bool) Load 350 + 352: 6(bool) LogicalOr 348 351 + SelectionMerge 355 None + BranchConditional 352 354 415 + 354: Label + 356: 9(int) Load 58(i) + 357: 57(ptr) AccessChain 68(i2) 14 + 358: 9(int) Load 357 + 359: 9(int) IAdd 356 358 + 360: 57(ptr) AccessChain 68(i2) 315 + 361: 9(int) Load 360 + 362: 9(int) IAdd 359 361 + 363: 57(ptr) AccessChain 81(i3) 14 + 364: 9(int) Load 363 + 365: 9(int) IAdd 362 364 + 366: 57(ptr) AccessChain 81(i3) 315 + 367: 9(int) Load 366 + 368: 9(int) IAdd 365 367 + 369: 57(ptr) AccessChain 81(i3) 336 + 370: 9(int) Load 369 + 371: 9(int) IAdd 368 370 + 372: 57(ptr) AccessChain 94(i4) 14 + 373: 9(int) Load 372 + 374: 9(int) IAdd 371 373 + 375: 57(ptr) AccessChain 94(i4) 315 + 376: 9(int) Load 375 + 377: 9(int) IAdd 374 376 + 378: 57(ptr) AccessChain 94(i4) 336 + 379: 9(int) Load 378 + 380: 9(int) IAdd 377 379 + 381: 57(ptr) AccessChain 94(i4) 349 382: 9(int) Load 381 - 383: 9(int) IAdd 379 382 + 383: 9(int) IAdd 380 382 384: 16(float) ConvertSToF 383 385: 16(float) Load 106(f) 386: 16(float) FAdd 384 385 @@ -535,7 +535,7 @@ 396: 105(ptr) AccessChain 114(f3) 315 397: 16(float) Load 396 398: 16(float) FAdd 395 397 - 399: 105(ptr) AccessChain 114(f3) 367 + 399: 105(ptr) AccessChain 114(f3) 336 400: 16(float) Load 399 401: 16(float) FAdd 398 400 402: 105(ptr) AccessChain 118(f4) 14 @@ -544,20 +544,20 @@ 405: 105(ptr) AccessChain 118(f4) 315 406: 16(float) Load 405 407: 16(float) FAdd 404 406 - 408: 105(ptr) AccessChain 118(f4) 367 + 408: 105(ptr) AccessChain 118(f4) 336 409: 16(float) Load 408 410: 16(float) FAdd 407 409 - 411: 105(ptr) AccessChain 118(f4) 380 + 411: 105(ptr) AccessChain 118(f4) 349 412: 16(float) Load 411 413: 16(float) FAdd 410 412 414: 95(fvec4) CompositeConstruct 413 413 413 413 - Store 323 414 - Branch 353 + Store 353 414 + Branch 355 415: Label - Store 323 151 - Branch 353 - 353: Label - 416: 95(fvec4) Load 323 + Store 353 151 + Branch 355 + 355: Label + 416: 95(fvec4) Load 353 Store 322(gl_FragColor) 416 Store 417(cv2) 102 419: 92(ivec4) Load 417(cv2) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.dataOut.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.dataOut.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.dataOut.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.dataOut.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.dataOut.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 20 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.dataOutIndirect.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.dataOutIndirect.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.dataOutIndirect.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.dataOutIndirect.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.dataOutIndirect.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 26 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.dataOutIndirect.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.dataOutIndirect.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.dataOutIndirect.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.dataOutIndirect.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -2,7 +2,7 @@ WARNING: 0:3: attribute deprecated in version 130; may be removed in future release // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 38 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.debugInfo.1.1.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.debugInfo.1.1.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.debugInfo.1.1.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.debugInfo.1.1.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,280 @@ +spv.debugInfo.frag +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 126 + + Capability Shader + 2: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 5 "main" 24 52 + ExecutionMode 5 OriginLowerLeft + 1: String "spv.debugInfo.frag" + Source GLSL 450 1 "#version 450 + +struct S { + int a; +}; + +uniform ubuf { + S s; +}; + +uniform sampler2D s2d; + +layout(location = 0) in vec4 inv; +layout(location = 0) out vec4 outv; + +vec4 foo(S s) +{ + vec4 r = s.a * inv; + ++r; + if (r.x > 3.0) + --r; + else + r *= 2; + + return r; +} + +void main() +{ + outv = foo(s); + outv += texture(s2d, vec2(0.5)); + + switch (s.a) { + case 10: + ++outv; + break; + case 20: + outv = 2 * outv; + ++outv; + break; + default: + --outv; + break; + } + + for (int i = 0; i < 10; ++i) + outv *= 3.0; + + outv.x < 10.0 ? + outv = sin(outv) : + outv = cos(outv); +}" + Name 5 "main" + Name 8 "S" + MemberName 8(S) 0 "a" + Name 14 "foo(struct-S-i11;" + Name 13 "s" + Name 17 "r" + Name 24 "inv" + Name 52 "outv" + Name 53 "S" + MemberName 53(S) 0 "a" + Name 54 "ubuf" + MemberName 54(ubuf) 0 "s" + Name 56 "" + Name 57 "S" + MemberName 57(S) 0 "a" + Name 59 "param" + Name 69 "s2d" + Name 99 "i" + ModuleProcessed "no-storage-format" + ModuleProcessed "resource-set-binding 3" + ModuleProcessed "auto-map-locations" + ModuleProcessed "client opengl100" + ModuleProcessed "target-env opengl" + ModuleProcessed "relaxed-errors" + ModuleProcessed "suppress-warnings" + ModuleProcessed "hlsl-offsets" + ModuleProcessed "entry-point main" + Decorate 24(inv) Location 0 + Decorate 52(outv) Location 0 + MemberDecorate 53(S) 0 Offset 0 + MemberDecorate 54(ubuf) 0 Offset 0 + Decorate 54(ubuf) Block + Decorate 56 DescriptorSet 3 + Decorate 69(s2d) Location 0 + Decorate 69(s2d) DescriptorSet 3 + 3: TypeVoid + 4: TypeFunction 3 + 7: TypeInt 32 1 + 8(S): TypeStruct 7(int) + 9: TypePointer Function 8(S) + 10: TypeFloat 32 + 11: TypeVector 10(float) 4 + 12: TypeFunction 11(fvec4) 9(ptr) + 16: TypePointer Function 11(fvec4) + 18: 7(int) Constant 0 + 19: TypePointer Function 7(int) + 23: TypePointer Input 11(fvec4) + 24(inv): 23(ptr) Variable Input + 28: 10(float) Constant 1065353216 + 31: TypeInt 32 0 + 32: 31(int) Constant 0 + 33: TypePointer Function 10(float) + 36: 10(float) Constant 1077936128 + 37: TypeBool + 45: 10(float) Constant 1073741824 + 51: TypePointer Output 11(fvec4) + 52(outv): 51(ptr) Variable Output + 53(S): TypeStruct 7(int) + 54(ubuf): TypeStruct 53(S) + 55: TypePointer Uniform 54(ubuf) + 56: 55(ptr) Variable Uniform + 57(S): TypeStruct 7(int) + 58: TypePointer Function 57(S) + 60: TypePointer Uniform 53(S) + 66: TypeImage 10(float) 2D sampled format:Unknown + 67: TypeSampledImage 66 + 68: TypePointer UniformConstant 67 + 69(s2d): 68(ptr) Variable UniformConstant + 71: TypeVector 10(float) 2 + 72: 10(float) Constant 1056964608 + 73: 71(fvec2) ConstantComposite 72 72 + 77: TypePointer Uniform 7(int) + 106: 7(int) Constant 10 + 111: 7(int) Constant 1 + 113: TypePointer Output 10(float) + 116: 10(float) Constant 1092616192 + 5(main): 3 Function None 4 + 6: Label + 59(param): 58(ptr) Variable Function + 99(i): 19(ptr) Variable Function + 118: 16(ptr) Variable Function + Line 1 30 0 + 61: 60(ptr) AccessChain 56 18 + 62: 53(S) Load 61 + 63: 7(int) CompositeExtract 62 0 + 64: 19(ptr) AccessChain 59(param) 18 + Store 64 63 + 65: 11(fvec4) FunctionCall 14(foo(struct-S-i11;) 59(param) + Store 52(outv) 65 + Line 1 31 0 + 70: 67 Load 69(s2d) + 74: 11(fvec4) ImageSampleImplicitLod 70 73 + 75: 11(fvec4) Load 52(outv) + 76: 11(fvec4) FAdd 75 74 + Store 52(outv) 76 + Line 1 33 0 + 78: 77(ptr) AccessChain 56 18 18 + 79: 7(int) Load 78 + SelectionMerge 83 None + Switch 79 82 + case 10: 80 + case 20: 81 + 82: Label + Line 1 42 0 + 94: 11(fvec4) Load 52(outv) + 95: 11(fvec4) CompositeConstruct 28 28 28 28 + 96: 11(fvec4) FSub 94 95 + Store 52(outv) 96 + Line 1 43 0 + Branch 83 + 80: Label + Line 1 35 0 + 84: 11(fvec4) Load 52(outv) + 85: 11(fvec4) CompositeConstruct 28 28 28 28 + 86: 11(fvec4) FAdd 84 85 + Store 52(outv) 86 + Line 1 36 0 + Branch 83 + 81: Label + Line 1 38 0 + 88: 11(fvec4) Load 52(outv) + 89: 11(fvec4) VectorTimesScalar 88 45 + Store 52(outv) 89 + Line 1 39 0 + 90: 11(fvec4) Load 52(outv) + 91: 11(fvec4) CompositeConstruct 28 28 28 28 + 92: 11(fvec4) FAdd 90 91 + Store 52(outv) 92 + Line 1 40 0 + Branch 83 + 83: Label + Line 1 46 0 + Store 99(i) 18 + Branch 100 + 100: Label + LoopMerge 102 103 None + Branch 104 + 104: Label + 105: 7(int) Load 99(i) + 107: 37(bool) SLessThan 105 106 + BranchConditional 107 101 102 + 101: Label + Line 1 47 0 + 108: 11(fvec4) Load 52(outv) + 109: 11(fvec4) VectorTimesScalar 108 36 + Store 52(outv) 109 + Branch 103 + 103: Label + Line 1 46 0 + 110: 7(int) Load 99(i) + 112: 7(int) IAdd 110 111 + Store 99(i) 112 + Branch 100 + 102: Label + Line 1 49 0 + 114: 113(ptr) AccessChain 52(outv) 32 + 115: 10(float) Load 114 + 117: 37(bool) FOrdLessThan 115 116 + SelectionMerge 120 None + BranchConditional 117 119 123 + 119: Label + Line 1 50 0 + 121: 11(fvec4) Load 52(outv) + 122: 11(fvec4) ExtInst 2(GLSL.std.450) 13(Sin) 121 + Store 52(outv) 122 + Store 118 122 + Branch 120 + 123: Label + Line 1 51 0 + 124: 11(fvec4) Load 52(outv) + 125: 11(fvec4) ExtInst 2(GLSL.std.450) 14(Cos) 124 + Store 52(outv) 125 + Store 118 125 + Branch 120 + 120: Label + Return + FunctionEnd +14(foo(struct-S-i11;): 11(fvec4) Function None 12 + 13(s): 9(ptr) FunctionParameter + 15: Label + 17(r): 16(ptr) Variable Function + Line 1 18 0 + 20: 19(ptr) AccessChain 13(s) 18 + 21: 7(int) Load 20 + 22: 10(float) ConvertSToF 21 + 25: 11(fvec4) Load 24(inv) + 26: 11(fvec4) VectorTimesScalar 25 22 + Store 17(r) 26 + Line 1 19 0 + 27: 11(fvec4) Load 17(r) + 29: 11(fvec4) CompositeConstruct 28 28 28 28 + 30: 11(fvec4) FAdd 27 29 + Store 17(r) 30 + Line 1 20 0 + 34: 33(ptr) AccessChain 17(r) 32 + 35: 10(float) Load 34 + 38: 37(bool) FOrdGreaterThan 35 36 + SelectionMerge 40 None + BranchConditional 38 39 44 + 39: Label + Line 1 21 0 + 41: 11(fvec4) Load 17(r) + 42: 11(fvec4) CompositeConstruct 28 28 28 28 + 43: 11(fvec4) FSub 41 42 + Store 17(r) 43 + Branch 40 + 44: Label + Line 1 23 0 + 46: 11(fvec4) Load 17(r) + 47: 11(fvec4) VectorTimesScalar 46 45 + Store 17(r) 47 + Branch 40 + 40: Label + Line 1 25 0 + 48: 11(fvec4) Load 17(r) + ReturnValue 48 + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.debugInfo.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.debugInfo.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.debugInfo.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.debugInfo.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.debugInfo.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 126 Capability Shader @@ -11,6 +11,7 @@ 1: String "spv.debugInfo.frag" Source GLSL 450 1 "// OpModuleProcessed no-storage-format // OpModuleProcessed resource-set-binding 3 +// OpModuleProcessed auto-map-bindings // OpModuleProcessed auto-map-locations // OpModuleProcessed client opengl100 // OpModuleProcessed target-env opengl @@ -95,7 +96,10 @@ MemberDecorate 54(ubuf) 0 Offset 0 Decorate 54(ubuf) Block Decorate 56 DescriptorSet 3 + Decorate 56 Binding 0 + Decorate 69(s2d) Location 0 Decorate 69(s2d) DescriptorSet 3 + Decorate 69(s2d) Binding 1 3: TypeVoid 4: TypeFunction 3 7: TypeInt 32 1 @@ -135,13 +139,13 @@ 77: TypePointer Uniform 7(int) 106: 7(int) Constant 10 111: 7(int) Constant 1 - 114: TypePointer Output 10(float) - 117: 10(float) Constant 1092616192 + 113: TypePointer Output 10(float) + 116: 10(float) Constant 1092616192 5(main): 3 Function None 4 6: Label 59(param): 58(ptr) Variable Function 99(i): 19(ptr) Variable Function - 113: 16(ptr) Variable Function + 118: 16(ptr) Variable Function Line 1 30 0 61: 60(ptr) AccessChain 56 18 62: 53(S) Load 61 @@ -216,24 +220,24 @@ Branch 100 102: Label Line 1 49 0 - 115: 114(ptr) AccessChain 52(outv) 32 - 116: 10(float) Load 115 - 118: 37(bool) FOrdLessThan 116 117 + 114: 113(ptr) AccessChain 52(outv) 32 + 115: 10(float) Load 114 + 117: 37(bool) FOrdLessThan 115 116 SelectionMerge 120 None - BranchConditional 118 119 123 + BranchConditional 117 119 123 119: Label Line 1 50 0 121: 11(fvec4) Load 52(outv) 122: 11(fvec4) ExtInst 2(GLSL.std.450) 13(Sin) 121 Store 52(outv) 122 - Store 113 122 + Store 118 122 Branch 120 123: Label Line 1 51 0 124: 11(fvec4) Load 52(outv) 125: 11(fvec4) ExtInst 2(GLSL.std.450) 14(Cos) 124 Store 52(outv) 125 - Store 113 125 + Store 118 125 Branch 120 120: Label Return diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.deepRvalue.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.deepRvalue.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.deepRvalue.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.deepRvalue.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.deepRvalue.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 152 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.depthOut.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.depthOut.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.depthOut.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.depthOut.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.depthOut.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 15 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.deviceGroup.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.deviceGroup.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.deviceGroup.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.deviceGroup.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,11 +1,10 @@ spv.deviceGroup.frag -// Module Version 10000 -// Generated by (magic number): 80003 +// Module Version 10300 +// Generated by (magic number): 80006 // Id's are bound by 17 Capability Shader Capability DeviceGroup - Extension "SPV_KHR_device_group" 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 9 12 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.discard-dce.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.discard-dce.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.discard-dce.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.discard-dce.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.discard-dce.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 84 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.do-simple.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.do-simple.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.do-simple.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.do-simple.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.do-simple.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 21 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.double.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.double.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.double.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.double.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.double.comp // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 60 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.do-while-continue-break.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.do-while-continue-break.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.do-while-continue-break.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.do-while-continue-break.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.do-while-continue-break.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 43 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.doWhileLoop.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.doWhileLoop.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.doWhileLoop.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.doWhileLoop.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.doWhileLoop.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 34 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.drawParams.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.drawParams.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.drawParams.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.drawParams.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,11 +1,10 @@ spv.drawParams.vert -// Module Version 10000 -// Generated by (magic number): 80003 +// Module Version 10300 +// Generated by (magic number): 80006 // Id's are bound by 29 Capability Shader Capability DrawParameters - Extension "SPV_KHR_shader_draw_parameters" 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 EntryPoint Vertex 4 "main" 10 13 16 21 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.earlyReturnDiscard.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.earlyReturnDiscard.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.earlyReturnDiscard.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.earlyReturnDiscard.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.earlyReturnDiscard.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 110 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.explicittypes.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.explicittypes.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.explicittypes.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.explicittypes.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,882 @@ +spv.explicittypes.frag +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 576 + + Capability Shader + Capability Float16 + Capability Float64 + Capability Int64 + Capability Int16 + Capability Int8 + Capability StorageUniform16 + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + SourceExtension "GL_KHX_shader_explicit_arithmetic_types" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int8" + Name 4 "main" + Name 6 "literal(" + Name 8 "typeCast8(" + Name 10 "typeCast16(" + Name 12 "typeCast32(" + Name 14 "typeCast64(" + Name 18 "i64" + Name 26 "Uniforms" + MemberName 26(Uniforms) 0 "index" + Name 28 "" + Name 35 "indexable" + Name 40 "u64" + Name 49 "indexable" + Name 53 "i32" + Name 62 "indexable" + Name 66 "u32" + Name 74 "indexable" + Name 79 "i16" + Name 88 "indexable" + Name 93 "u16" + Name 101 "indexable" + Name 106 "i8" + Name 115 "indexable" + Name 120 "u8" + Name 128 "indexable" + Name 133 "u8v" + Name 136 "i8v" + Name 141 "i16v" + Name 149 "i32v" + Name 157 "u32v" + Name 163 "i64v" + Name 168 "u64v" + Name 182 "f16v" + Name 188 "f32v" + Name 194 "f64v" + Name 222 "u16v" + Name 252 "bv" + Name 268 "i32v" + Name 269 "i16v" + Name 272 "u16v" + Name 278 "u32v" + Name 282 "i64v" + Name 285 "u64v" + Name 296 "f16v" + Name 299 "f32v" + Name 302 "f64v" + Name 347 "i8v" + Name 353 "u8v" + Name 363 "bv" + Name 380 "u32v" + Name 381 "i32v" + Name 384 "i64v" + Name 387 "u64v" + Name 396 "f32v" + Name 399 "f64v" + Name 406 "i8v" + Name 412 "i16v" + Name 429 "u8v" + Name 435 "u16v" + Name 452 "f16v" + Name 465 "bv" + Name 481 "u64v" + Name 482 "i64v" + Name 485 "f64v" + Name 490 "i8v" + Name 496 "i16v" + Name 502 "i32v" + Name 510 "u8v" + Name 516 "u16v" + Name 522 "u32v" + Name 534 "f16v" + Name 537 "f32v" + Name 548 "bv" + Name 573 "Block" + MemberName 573(Block) 0 "i16" + MemberName 573(Block) 1 "i16v2" + MemberName 573(Block) 2 "i16v3" + MemberName 573(Block) 3 "i16v4" + MemberName 573(Block) 4 "u16" + MemberName 573(Block) 5 "u16v2" + MemberName 573(Block) 6 "u16v3" + MemberName 573(Block) 7 "u16v4" + MemberName 573(Block) 8 "i32" + MemberName 573(Block) 9 "i32v2" + MemberName 573(Block) 10 "i32v3" + MemberName 573(Block) 11 "i32v4" + MemberName 573(Block) 12 "u32" + MemberName 573(Block) 13 "u32v2" + MemberName 573(Block) 14 "u32v3" + MemberName 573(Block) 15 "u32v4" + Name 575 "block" + MemberDecorate 26(Uniforms) 0 Offset 0 + Decorate 26(Uniforms) Block + Decorate 28 DescriptorSet 0 + Decorate 28 Binding 0 + MemberDecorate 573(Block) 0 Offset 0 + MemberDecorate 573(Block) 1 Offset 4 + MemberDecorate 573(Block) 2 Offset 8 + MemberDecorate 573(Block) 3 Offset 16 + MemberDecorate 573(Block) 4 Offset 24 + MemberDecorate 573(Block) 5 Offset 28 + MemberDecorate 573(Block) 6 Offset 32 + MemberDecorate 573(Block) 7 Offset 40 + MemberDecorate 573(Block) 8 Offset 48 + MemberDecorate 573(Block) 9 Offset 56 + MemberDecorate 573(Block) 10 Offset 64 + MemberDecorate 573(Block) 11 Offset 80 + MemberDecorate 573(Block) 12 Offset 96 + MemberDecorate 573(Block) 13 Offset 104 + MemberDecorate 573(Block) 14 Offset 112 + MemberDecorate 573(Block) 15 Offset 128 + Decorate 573(Block) Block + Decorate 575(block) DescriptorSet 0 + Decorate 575(block) Binding 1 + 2: TypeVoid + 3: TypeFunction 2 + 16: TypeInt 64 1 + 17: TypePointer Function 16(int) + 19: TypeInt 32 0 + 20: 19(int) Constant 3 + 21: TypeArray 16(int) 20 + 22: 16(int) Constant 4008636143 4008636142 + 23: 16(int) Constant 4294967295 4294967295 + 24: 16(int) Constant 0 1 + 25: 21 ConstantComposite 22 23 24 + 26(Uniforms): TypeStruct 19(int) + 27: TypePointer Uniform 26(Uniforms) + 28: 27(ptr) Variable Uniform + 29: TypeInt 32 1 + 30: 29(int) Constant 0 + 31: TypePointer Uniform 19(int) + 34: TypePointer Function 21 + 38: TypeInt 64 0 + 39: TypePointer Function 38(int) + 41: TypeArray 38(int) 20 + 42: 38(int) Constant 4294967295 4294967295 + 43: 38(int) Constant 0 1 + 44: 38(int) Constant 4294967295 1 + 45: 41 ConstantComposite 42 43 44 + 48: TypePointer Function 41 + 52: TypePointer Function 29(int) + 54: TypeArray 29(int) 20 + 55: 29(int) Constant 4008636143 + 56: 29(int) Constant 4294967295 + 57: 29(int) Constant 536870912 + 58: 54 ConstantComposite 55 56 57 + 61: TypePointer Function 54 + 65: TypePointer Function 19(int) + 67: TypeArray 19(int) 20 + 68: 19(int) Constant 4294967295 + 69: 19(int) Constant 2147483647 + 70: 67 ConstantComposite 68 68 69 + 73: TypePointer Function 67 + 77: TypeInt 16 1 + 78: TypePointer Function 77(int) + 80: TypeArray 77(int) 20 + 81: 77(int) Constant 4294962927 + 82: 77(int) Constant 4294967295 + 83: 77(int) Constant 16384 + 84: 80 ConstantComposite 81 82 83 + 87: TypePointer Function 80 + 91: TypeInt 16 0 + 92: TypePointer Function 91(int) + 94: TypeArray 91(int) 20 + 95: 91(int) Constant 65535 + 96: 91(int) Constant 32767 + 97: 94 ConstantComposite 95 95 96 + 100: TypePointer Function 94 + 104: TypeInt 8 1 + 105: TypePointer Function 104(int) + 107: TypeArray 104(int) 20 + 108: 104(int) Constant 4294967279 + 109: 104(int) Constant 4294967295 + 110: 104(int) Constant 0 + 111: 107 ConstantComposite 108 109 110 + 114: TypePointer Function 107 + 118: TypeInt 8 0 + 119: TypePointer Function 118(int) + 121: TypeArray 118(int) 20 + 122: 118(int) Constant 255 + 123: 118(int) Constant 127 + 124: 121 ConstantComposite 122 122 123 + 127: TypePointer Function 121 + 131: TypeVector 118(int) 2 + 132: TypePointer Function 131(ivec2) + 134: TypeVector 104(int) 2 + 135: TypePointer Function 134(ivec2) + 139: TypeVector 77(int) 2 + 140: TypePointer Function 139(ivec2) + 147: TypeVector 29(int) 2 + 148: TypePointer Function 147(ivec2) + 155: TypeVector 19(int) 2 + 156: TypePointer Function 155(ivec2) + 161: TypeVector 16(int) 2 + 162: TypePointer Function 161(ivec2) + 166: TypeVector 38(int) 2 + 167: TypePointer Function 166(ivec2) + 179: TypeFloat 16 + 180: TypeVector 179(float) 2 + 181: TypePointer Function 180(fvec2) + 185: TypeFloat 32 + 186: TypeVector 185(float) 2 + 187: TypePointer Function 186(fvec2) + 191: TypeFloat 64 + 192: TypeVector 191(float) 2 + 193: TypePointer Function 192(fvec2) + 220: TypeVector 91(int) 2 + 221: TypePointer Function 220(ivec2) + 249: TypeBool + 250: TypeVector 249(bool) 2 + 251: TypePointer Function 250(bvec2) + 254: 104(int) Constant 1 + 255: 134(ivec2) ConstantComposite 110 110 + 256: 134(ivec2) ConstantComposite 254 254 + 259: 118(int) Constant 0 + 260: 118(int) Constant 1 + 261: 131(ivec2) ConstantComposite 259 259 + 262: 131(ivec2) ConstantComposite 260 260 + 365: 77(int) Constant 0 + 366: 77(int) Constant 1 + 367: 139(ivec2) ConstantComposite 365 365 + 368: 139(ivec2) ConstantComposite 366 366 + 371: 91(int) Constant 0 + 372: 91(int) Constant 1 + 373: 220(ivec2) ConstantComposite 371 371 + 374: 220(ivec2) ConstantComposite 372 372 + 467: 29(int) Constant 1 + 468: 147(ivec2) ConstantComposite 30 30 + 469: 147(ivec2) ConstantComposite 467 467 + 472: 19(int) Constant 0 + 473: 19(int) Constant 1 + 474: 155(ivec2) ConstantComposite 472 472 + 475: 155(ivec2) ConstantComposite 473 473 + 550: 16(int) Constant 0 0 + 551: 16(int) Constant 1 0 + 552: 161(ivec2) ConstantComposite 550 550 + 553: 161(ivec2) ConstantComposite 551 551 + 556: 38(int) Constant 0 0 + 557: 38(int) Constant 1 0 + 558: 166(ivec2) ConstantComposite 556 556 + 559: 166(ivec2) ConstantComposite 557 557 + 565: TypeVector 77(int) 3 + 566: TypeVector 77(int) 4 + 567: TypeVector 91(int) 3 + 568: TypeVector 91(int) 4 + 569: TypeVector 29(int) 3 + 570: TypeVector 29(int) 4 + 571: TypeVector 19(int) 3 + 572: TypeVector 19(int) 4 + 573(Block): TypeStruct 77(int) 139(ivec2) 565(ivec3) 566(ivec4) 91(int) 220(ivec2) 567(ivec3) 568(ivec4) 29(int) 147(ivec2) 569(ivec3) 570(ivec4) 19(int) 155(ivec2) 571(ivec3) 572(ivec4) + 574: TypePointer Uniform 573(Block) + 575(block): 574(ptr) Variable Uniform + 4(main): 2 Function None 3 + 5: Label + Return + FunctionEnd + 6(literal(): 2 Function None 3 + 7: Label + 18(i64): 17(ptr) Variable Function + 35(indexable): 34(ptr) Variable Function + 40(u64): 39(ptr) Variable Function + 49(indexable): 48(ptr) Variable Function + 53(i32): 52(ptr) Variable Function + 62(indexable): 61(ptr) Variable Function + 66(u32): 65(ptr) Variable Function + 74(indexable): 73(ptr) Variable Function + 79(i16): 78(ptr) Variable Function + 88(indexable): 87(ptr) Variable Function + 93(u16): 92(ptr) Variable Function + 101(indexable): 100(ptr) Variable Function + 106(i8): 105(ptr) Variable Function + 115(indexable): 114(ptr) Variable Function + 120(u8): 119(ptr) Variable Function + 128(indexable): 127(ptr) Variable Function + 32: 31(ptr) AccessChain 28 30 + 33: 19(int) Load 32 + Store 35(indexable) 25 + 36: 17(ptr) AccessChain 35(indexable) 33 + 37: 16(int) Load 36 + Store 18(i64) 37 + 46: 31(ptr) AccessChain 28 30 + 47: 19(int) Load 46 + Store 49(indexable) 45 + 50: 39(ptr) AccessChain 49(indexable) 47 + 51: 38(int) Load 50 + Store 40(u64) 51 + 59: 31(ptr) AccessChain 28 30 + 60: 19(int) Load 59 + Store 62(indexable) 58 + 63: 52(ptr) AccessChain 62(indexable) 60 + 64: 29(int) Load 63 + Store 53(i32) 64 + 71: 31(ptr) AccessChain 28 30 + 72: 19(int) Load 71 + Store 74(indexable) 70 + 75: 65(ptr) AccessChain 74(indexable) 72 + 76: 19(int) Load 75 + Store 66(u32) 76 + 85: 31(ptr) AccessChain 28 30 + 86: 19(int) Load 85 + Store 88(indexable) 84 + 89: 78(ptr) AccessChain 88(indexable) 86 + 90: 77(int) Load 89 + Store 79(i16) 90 + 98: 31(ptr) AccessChain 28 30 + 99: 19(int) Load 98 + Store 101(indexable) 97 + 102: 92(ptr) AccessChain 101(indexable) 99 + 103: 91(int) Load 102 + Store 93(u16) 103 + 112: 31(ptr) AccessChain 28 30 + 113: 19(int) Load 112 + Store 115(indexable) 111 + 116: 105(ptr) AccessChain 115(indexable) 113 + 117: 104(int) Load 116 + Store 106(i8) 117 + 125: 31(ptr) AccessChain 28 30 + 126: 19(int) Load 125 + Store 128(indexable) 124 + 129: 119(ptr) AccessChain 128(indexable) 126 + 130: 118(int) Load 129 + Store 120(u8) 130 + Return + FunctionEnd + 8(typeCast8(): 2 Function None 3 + 9: Label + 133(u8v): 132(ptr) Variable Function + 136(i8v): 135(ptr) Variable Function + 141(i16v): 140(ptr) Variable Function + 149(i32v): 148(ptr) Variable Function + 157(u32v): 156(ptr) Variable Function + 163(i64v): 162(ptr) Variable Function + 168(u64v): 167(ptr) Variable Function + 182(f16v): 181(ptr) Variable Function + 188(f32v): 187(ptr) Variable Function + 194(f64v): 193(ptr) Variable Function + 222(u16v): 221(ptr) Variable Function + 252(bv): 251(ptr) Variable Function + 137: 134(ivec2) Load 136(i8v) + 138: 131(ivec2) Bitcast 137 + Store 133(u8v) 138 + 142: 134(ivec2) Load 136(i8v) + 143: 139(ivec2) SConvert 142 + Store 141(i16v) 143 + 144: 131(ivec2) Load 133(u8v) + 145: 139(ivec2) UConvert 144 + 146: 139(ivec2) Bitcast 145 + Store 141(i16v) 146 + 150: 134(ivec2) Load 136(i8v) + 151: 147(ivec2) SConvert 150 + Store 149(i32v) 151 + 152: 131(ivec2) Load 133(u8v) + 153: 147(ivec2) UConvert 152 + 154: 147(ivec2) Bitcast 153 + Store 149(i32v) 154 + 158: 134(ivec2) Load 136(i8v) + 159: 147(ivec2) SConvert 158 + 160: 155(ivec2) Bitcast 159 + Store 157(u32v) 160 + 164: 134(ivec2) Load 136(i8v) + 165: 161(ivec2) SConvert 164 + Store 163(i64v) 165 + 169: 134(ivec2) Load 136(i8v) + 170: 161(ivec2) SConvert 169 + 171: 166(ivec2) Bitcast 170 + Store 168(u64v) 171 + 172: 131(ivec2) Load 133(u8v) + 173: 155(ivec2) UConvert 172 + Store 157(u32v) 173 + 174: 131(ivec2) Load 133(u8v) + 175: 161(ivec2) UConvert 174 + 176: 161(ivec2) Bitcast 175 + Store 163(i64v) 176 + 177: 131(ivec2) Load 133(u8v) + 178: 166(ivec2) UConvert 177 + Store 168(u64v) 178 + 183: 134(ivec2) Load 136(i8v) + 184: 180(fvec2) ConvertSToF 183 + Store 182(f16v) 184 + 189: 134(ivec2) Load 136(i8v) + 190: 186(fvec2) ConvertSToF 189 + Store 188(f32v) 190 + 195: 134(ivec2) Load 136(i8v) + 196: 192(fvec2) ConvertSToF 195 + Store 194(f64v) 196 + 197: 131(ivec2) Load 133(u8v) + 198: 180(fvec2) ConvertUToF 197 + Store 182(f16v) 198 + 199: 131(ivec2) Load 133(u8v) + 200: 186(fvec2) ConvertUToF 199 + Store 188(f32v) 200 + 201: 131(ivec2) Load 133(u8v) + 202: 192(fvec2) ConvertUToF 201 + Store 194(f64v) 202 + 203: 131(ivec2) Load 133(u8v) + 204: 134(ivec2) Bitcast 203 + Store 136(i8v) 204 + 205: 134(ivec2) Load 136(i8v) + 206: 139(ivec2) SConvert 205 + Store 141(i16v) 206 + 207: 131(ivec2) Load 133(u8v) + 208: 139(ivec2) UConvert 207 + 209: 139(ivec2) Bitcast 208 + Store 141(i16v) 209 + 210: 134(ivec2) Load 136(i8v) + 211: 147(ivec2) SConvert 210 + Store 149(i32v) 211 + 212: 131(ivec2) Load 133(u8v) + 213: 147(ivec2) UConvert 212 + 214: 147(ivec2) Bitcast 213 + Store 149(i32v) 214 + 215: 134(ivec2) Load 136(i8v) + 216: 161(ivec2) SConvert 215 + Store 163(i64v) 216 + 217: 134(ivec2) Load 136(i8v) + 218: 161(ivec2) SConvert 217 + 219: 166(ivec2) Bitcast 218 + Store 168(u64v) 219 + 223: 134(ivec2) Load 136(i8v) + 224: 139(ivec2) SConvert 223 + 225: 220(ivec2) Bitcast 224 + Store 222(u16v) 225 + 226: 131(ivec2) Load 133(u8v) + 227: 220(ivec2) UConvert 226 + Store 222(u16v) 227 + 228: 131(ivec2) Load 133(u8v) + 229: 155(ivec2) UConvert 228 + Store 157(u32v) 229 + 230: 131(ivec2) Load 133(u8v) + 231: 161(ivec2) UConvert 230 + 232: 161(ivec2) Bitcast 231 + Store 163(i64v) 232 + 233: 131(ivec2) Load 133(u8v) + 234: 161(ivec2) UConvert 233 + 235: 161(ivec2) Bitcast 234 + 236: 166(ivec2) Bitcast 235 + Store 168(u64v) 236 + 237: 134(ivec2) Load 136(i8v) + 238: 180(fvec2) ConvertSToF 237 + Store 182(f16v) 238 + 239: 134(ivec2) Load 136(i8v) + 240: 186(fvec2) ConvertSToF 239 + Store 188(f32v) 240 + 241: 134(ivec2) Load 136(i8v) + 242: 192(fvec2) ConvertSToF 241 + Store 194(f64v) 242 + 243: 131(ivec2) Load 133(u8v) + 244: 180(fvec2) ConvertUToF 243 + Store 182(f16v) 244 + 245: 131(ivec2) Load 133(u8v) + 246: 186(fvec2) ConvertUToF 245 + Store 188(f32v) 246 + 247: 131(ivec2) Load 133(u8v) + 248: 192(fvec2) ConvertUToF 247 + Store 194(f64v) 248 + 253: 250(bvec2) Load 252(bv) + 257: 134(ivec2) Select 253 256 255 + Store 136(i8v) 257 + 258: 250(bvec2) Load 252(bv) + 263: 131(ivec2) Select 258 262 261 + Store 133(u8v) 263 + 264: 134(ivec2) Load 136(i8v) + 265: 250(bvec2) INotEqual 264 261 + Store 252(bv) 265 + 266: 131(ivec2) Load 133(u8v) + 267: 250(bvec2) INotEqual 266 261 + Store 252(bv) 267 + Return + FunctionEnd + 10(typeCast16(): 2 Function None 3 + 11: Label + 268(i32v): 148(ptr) Variable Function + 269(i16v): 140(ptr) Variable Function + 272(u16v): 221(ptr) Variable Function + 278(u32v): 156(ptr) Variable Function + 282(i64v): 162(ptr) Variable Function + 285(u64v): 167(ptr) Variable Function + 296(f16v): 181(ptr) Variable Function + 299(f32v): 187(ptr) Variable Function + 302(f64v): 193(ptr) Variable Function + 347(i8v): 135(ptr) Variable Function + 353(u8v): 132(ptr) Variable Function + 363(bv): 251(ptr) Variable Function + 270: 139(ivec2) Load 269(i16v) + 271: 147(ivec2) SConvert 270 + Store 268(i32v) 271 + 273: 220(ivec2) Load 272(u16v) + 274: 147(ivec2) UConvert 273 + 275: 147(ivec2) Bitcast 274 + Store 268(i32v) 275 + 276: 139(ivec2) Load 269(i16v) + 277: 220(ivec2) Bitcast 276 + Store 272(u16v) 277 + 279: 139(ivec2) Load 269(i16v) + 280: 147(ivec2) SConvert 279 + 281: 155(ivec2) Bitcast 280 + Store 278(u32v) 281 + 283: 139(ivec2) Load 269(i16v) + 284: 161(ivec2) SConvert 283 + Store 282(i64v) 284 + 286: 139(ivec2) Load 269(i16v) + 287: 161(ivec2) SConvert 286 + 288: 166(ivec2) Bitcast 287 + Store 285(u64v) 288 + 289: 220(ivec2) Load 272(u16v) + 290: 155(ivec2) UConvert 289 + Store 278(u32v) 290 + 291: 220(ivec2) Load 272(u16v) + 292: 161(ivec2) UConvert 291 + 293: 161(ivec2) Bitcast 292 + Store 282(i64v) 293 + 294: 220(ivec2) Load 272(u16v) + 295: 166(ivec2) UConvert 294 + Store 285(u64v) 295 + 297: 139(ivec2) Load 269(i16v) + 298: 180(fvec2) ConvertSToF 297 + Store 296(f16v) 298 + 300: 139(ivec2) Load 269(i16v) + 301: 186(fvec2) ConvertSToF 300 + Store 299(f32v) 301 + 303: 139(ivec2) Load 269(i16v) + 304: 192(fvec2) ConvertSToF 303 + Store 302(f64v) 304 + 305: 220(ivec2) Load 272(u16v) + 306: 180(fvec2) ConvertUToF 305 + Store 296(f16v) 306 + 307: 220(ivec2) Load 272(u16v) + 308: 186(fvec2) ConvertUToF 307 + Store 299(f32v) 308 + 309: 220(ivec2) Load 272(u16v) + 310: 192(fvec2) ConvertUToF 309 + Store 302(f64v) 310 + 311: 139(ivec2) Load 269(i16v) + 312: 147(ivec2) SConvert 311 + Store 268(i32v) 312 + 313: 220(ivec2) Load 272(u16v) + 314: 147(ivec2) UConvert 313 + 315: 147(ivec2) Bitcast 314 + Store 268(i32v) 315 + 316: 139(ivec2) Load 269(i16v) + 317: 220(ivec2) Bitcast 316 + Store 272(u16v) 317 + 318: 139(ivec2) Load 269(i16v) + 319: 147(ivec2) SConvert 318 + 320: 155(ivec2) Bitcast 319 + Store 278(u32v) 320 + 321: 139(ivec2) Load 269(i16v) + 322: 161(ivec2) SConvert 321 + Store 282(i64v) 322 + 323: 139(ivec2) Load 269(i16v) + 324: 161(ivec2) SConvert 323 + 325: 166(ivec2) Bitcast 324 + Store 285(u64v) 325 + 326: 220(ivec2) Load 272(u16v) + 327: 155(ivec2) UConvert 326 + Store 278(u32v) 327 + 328: 220(ivec2) Load 272(u16v) + 329: 161(ivec2) UConvert 328 + 330: 161(ivec2) Bitcast 329 + Store 282(i64v) 330 + 331: 220(ivec2) Load 272(u16v) + 332: 161(ivec2) UConvert 331 + 333: 161(ivec2) Bitcast 332 + 334: 166(ivec2) Bitcast 333 + Store 285(u64v) 334 + 335: 139(ivec2) Load 269(i16v) + 336: 180(fvec2) ConvertSToF 335 + Store 296(f16v) 336 + 337: 139(ivec2) Load 269(i16v) + 338: 186(fvec2) ConvertSToF 337 + Store 299(f32v) 338 + 339: 139(ivec2) Load 269(i16v) + 340: 192(fvec2) ConvertSToF 339 + Store 302(f64v) 340 + 341: 220(ivec2) Load 272(u16v) + 342: 180(fvec2) ConvertUToF 341 + Store 296(f16v) 342 + 343: 220(ivec2) Load 272(u16v) + 344: 186(fvec2) ConvertUToF 343 + Store 299(f32v) 344 + 345: 220(ivec2) Load 272(u16v) + 346: 192(fvec2) ConvertUToF 345 + Store 302(f64v) 346 + 348: 139(ivec2) Load 269(i16v) + 349: 134(ivec2) SConvert 348 + Store 347(i8v) 349 + 350: 220(ivec2) Load 272(u16v) + 351: 134(ivec2) UConvert 350 + 352: 134(ivec2) Bitcast 351 + Store 347(i8v) 352 + 354: 139(ivec2) Load 269(i16v) + 355: 134(ivec2) SConvert 354 + 356: 131(ivec2) Bitcast 355 + Store 353(u8v) 356 + 357: 220(ivec2) Load 272(u16v) + 358: 131(ivec2) UConvert 357 + Store 353(u8v) 358 + 359: 220(ivec2) Load 272(u16v) + 360: 131(ivec2) UConvert 359 + 361: 139(ivec2) UConvert 360 + 362: 139(ivec2) Bitcast 361 + Store 269(i16v) 362 + 364: 250(bvec2) Load 363(bv) + 369: 139(ivec2) Select 364 368 367 + Store 269(i16v) 369 + 370: 250(bvec2) Load 363(bv) + 375: 220(ivec2) Select 370 374 373 + Store 272(u16v) 375 + 376: 139(ivec2) Load 269(i16v) + 377: 250(bvec2) INotEqual 376 373 + Store 363(bv) 377 + 378: 220(ivec2) Load 272(u16v) + 379: 250(bvec2) INotEqual 378 373 + Store 363(bv) 379 + Return + FunctionEnd + 12(typeCast32(): 2 Function None 3 + 13: Label + 380(u32v): 156(ptr) Variable Function + 381(i32v): 148(ptr) Variable Function + 384(i64v): 162(ptr) Variable Function + 387(u64v): 167(ptr) Variable Function + 396(f32v): 187(ptr) Variable Function + 399(f64v): 193(ptr) Variable Function + 406(i8v): 135(ptr) Variable Function + 412(i16v): 140(ptr) Variable Function + 429(u8v): 132(ptr) Variable Function + 435(u16v): 221(ptr) Variable Function + 452(f16v): 181(ptr) Variable Function + 465(bv): 251(ptr) Variable Function + 382: 147(ivec2) Load 381(i32v) + 383: 155(ivec2) Bitcast 382 + Store 380(u32v) 383 + 385: 147(ivec2) Load 381(i32v) + 386: 161(ivec2) SConvert 385 + Store 384(i64v) 386 + 388: 147(ivec2) Load 381(i32v) + 389: 161(ivec2) SConvert 388 + 390: 166(ivec2) Bitcast 389 + Store 387(u64v) 390 + 391: 155(ivec2) Load 380(u32v) + 392: 161(ivec2) UConvert 391 + 393: 161(ivec2) Bitcast 392 + Store 384(i64v) 393 + 394: 155(ivec2) Load 380(u32v) + 395: 166(ivec2) UConvert 394 + Store 387(u64v) 395 + 397: 147(ivec2) Load 381(i32v) + 398: 186(fvec2) ConvertSToF 397 + Store 396(f32v) 398 + 400: 147(ivec2) Load 381(i32v) + 401: 192(fvec2) ConvertSToF 400 + Store 399(f64v) 401 + 402: 155(ivec2) Load 380(u32v) + 403: 186(fvec2) ConvertUToF 402 + Store 396(f32v) 403 + 404: 155(ivec2) Load 380(u32v) + 405: 192(fvec2) ConvertUToF 404 + Store 399(f64v) 405 + 407: 147(ivec2) Load 381(i32v) + 408: 134(ivec2) SConvert 407 + Store 406(i8v) 408 + 409: 155(ivec2) Load 380(u32v) + 410: 134(ivec2) UConvert 409 + 411: 134(ivec2) Bitcast 410 + Store 406(i8v) 411 + 413: 147(ivec2) Load 381(i32v) + 414: 139(ivec2) SConvert 413 + Store 412(i16v) 414 + 415: 155(ivec2) Load 380(u32v) + 416: 139(ivec2) UConvert 415 + 417: 139(ivec2) Bitcast 416 + Store 412(i16v) 417 + 418: 147(ivec2) Load 381(i32v) + 419: 29(int) CompositeExtract 418 0 + 420: 29(int) CompositeExtract 418 1 + 421: 147(ivec2) CompositeConstruct 419 420 + Store 381(i32v) 421 + 422: 155(ivec2) Load 380(u32v) + 423: 147(ivec2) Bitcast 422 + Store 381(i32v) 423 + 424: 147(ivec2) Load 381(i32v) + 425: 161(ivec2) SConvert 424 + Store 384(i64v) 425 + 426: 155(ivec2) Load 380(u32v) + 427: 161(ivec2) UConvert 426 + 428: 161(ivec2) Bitcast 427 + Store 384(i64v) 428 + 430: 147(ivec2) Load 381(i32v) + 431: 134(ivec2) SConvert 430 + 432: 131(ivec2) Bitcast 431 + Store 429(u8v) 432 + 433: 155(ivec2) Load 380(u32v) + 434: 131(ivec2) UConvert 433 + Store 429(u8v) 434 + 436: 147(ivec2) Load 381(i32v) + 437: 139(ivec2) SConvert 436 + 438: 220(ivec2) Bitcast 437 + Store 435(u16v) 438 + 439: 155(ivec2) Load 380(u32v) + 440: 220(ivec2) UConvert 439 + Store 435(u16v) 440 + 441: 147(ivec2) Load 381(i32v) + 442: 155(ivec2) Bitcast 441 + Store 380(u32v) 442 + 443: 155(ivec2) Load 380(u32v) + 444: 19(int) CompositeExtract 443 0 + 445: 19(int) CompositeExtract 443 1 + 446: 155(ivec2) CompositeConstruct 444 445 + Store 380(u32v) 446 + 447: 147(ivec2) Load 381(i32v) + 448: 161(ivec2) SConvert 447 + 449: 166(ivec2) Bitcast 448 + Store 387(u64v) 449 + 450: 155(ivec2) Load 380(u32v) + 451: 166(ivec2) UConvert 450 + Store 387(u64v) 451 + 453: 147(ivec2) Load 381(i32v) + 454: 180(fvec2) ConvertSToF 453 + Store 452(f16v) 454 + 455: 147(ivec2) Load 381(i32v) + 456: 186(fvec2) ConvertSToF 455 + Store 396(f32v) 456 + 457: 147(ivec2) Load 381(i32v) + 458: 192(fvec2) ConvertSToF 457 + Store 399(f64v) 458 + 459: 155(ivec2) Load 380(u32v) + 460: 180(fvec2) ConvertUToF 459 + Store 452(f16v) 460 + 461: 155(ivec2) Load 380(u32v) + 462: 186(fvec2) ConvertUToF 461 + Store 396(f32v) 462 + 463: 155(ivec2) Load 380(u32v) + 464: 192(fvec2) ConvertUToF 463 + Store 399(f64v) 464 + 466: 250(bvec2) Load 465(bv) + 470: 147(ivec2) Select 466 469 468 + Store 381(i32v) 470 + 471: 250(bvec2) Load 465(bv) + 476: 155(ivec2) Select 471 475 474 + Store 380(u32v) 476 + 477: 147(ivec2) Load 381(i32v) + 478: 250(bvec2) INotEqual 477 474 + Store 465(bv) 478 + 479: 155(ivec2) Load 380(u32v) + 480: 250(bvec2) INotEqual 479 474 + Store 465(bv) 480 + Return + FunctionEnd + 14(typeCast64(): 2 Function None 3 + 15: Label + 481(u64v): 167(ptr) Variable Function + 482(i64v): 162(ptr) Variable Function + 485(f64v): 193(ptr) Variable Function + 490(i8v): 135(ptr) Variable Function + 496(i16v): 140(ptr) Variable Function + 502(i32v): 148(ptr) Variable Function + 510(u8v): 132(ptr) Variable Function + 516(u16v): 221(ptr) Variable Function + 522(u32v): 156(ptr) Variable Function + 534(f16v): 181(ptr) Variable Function + 537(f32v): 187(ptr) Variable Function + 548(bv): 251(ptr) Variable Function + 483: 161(ivec2) Load 482(i64v) + 484: 166(ivec2) Bitcast 483 + Store 481(u64v) 484 + 486: 161(ivec2) Load 482(i64v) + 487: 192(fvec2) ConvertSToF 486 + Store 485(f64v) 487 + 488: 166(ivec2) Load 481(u64v) + 489: 192(fvec2) ConvertUToF 488 + Store 485(f64v) 489 + 491: 161(ivec2) Load 482(i64v) + 492: 134(ivec2) SConvert 491 + Store 490(i8v) 492 + 493: 166(ivec2) Load 481(u64v) + 494: 134(ivec2) UConvert 493 + 495: 134(ivec2) Bitcast 494 + Store 490(i8v) 495 + 497: 161(ivec2) Load 482(i64v) + 498: 139(ivec2) SConvert 497 + Store 496(i16v) 498 + 499: 166(ivec2) Load 481(u64v) + 500: 139(ivec2) UConvert 499 + 501: 139(ivec2) Bitcast 500 + Store 496(i16v) 501 + 503: 161(ivec2) Load 482(i64v) + 504: 147(ivec2) SConvert 503 + Store 502(i32v) 504 + 505: 166(ivec2) Load 481(u64v) + 506: 147(ivec2) UConvert 505 + 507: 147(ivec2) Bitcast 506 + Store 502(i32v) 507 + 508: 166(ivec2) Load 481(u64v) + 509: 161(ivec2) Bitcast 508 + Store 482(i64v) 509 + 511: 161(ivec2) Load 482(i64v) + 512: 134(ivec2) SConvert 511 + 513: 131(ivec2) Bitcast 512 + Store 510(u8v) 513 + 514: 166(ivec2) Load 481(u64v) + 515: 131(ivec2) UConvert 514 + Store 510(u8v) 515 + 517: 161(ivec2) Load 482(i64v) + 518: 139(ivec2) SConvert 517 + 519: 220(ivec2) Bitcast 518 + Store 516(u16v) 519 + 520: 166(ivec2) Load 481(u64v) + 521: 220(ivec2) UConvert 520 + Store 516(u16v) 521 + 523: 161(ivec2) Load 482(i64v) + 524: 147(ivec2) SConvert 523 + 525: 155(ivec2) Bitcast 524 + Store 522(u32v) 525 + 526: 166(ivec2) Load 481(u64v) + 527: 155(ivec2) UConvert 526 + Store 522(u32v) 527 + 528: 161(ivec2) Load 482(i64v) + 529: 166(ivec2) Bitcast 528 + Store 481(u64v) 529 + 530: 166(ivec2) Load 481(u64v) + 531: 38(int) CompositeExtract 530 0 + 532: 38(int) CompositeExtract 530 1 + 533: 166(ivec2) CompositeConstruct 531 532 + Store 481(u64v) 533 + 535: 161(ivec2) Load 482(i64v) + 536: 180(fvec2) ConvertSToF 535 + Store 534(f16v) 536 + 538: 161(ivec2) Load 482(i64v) + 539: 186(fvec2) ConvertSToF 538 + Store 537(f32v) 539 + 540: 161(ivec2) Load 482(i64v) + 541: 192(fvec2) ConvertSToF 540 + Store 485(f64v) 541 + 542: 166(ivec2) Load 481(u64v) + 543: 180(fvec2) ConvertUToF 542 + Store 534(f16v) 543 + 544: 166(ivec2) Load 481(u64v) + 545: 186(fvec2) ConvertUToF 544 + Store 537(f32v) 545 + 546: 166(ivec2) Load 481(u64v) + 547: 192(fvec2) ConvertUToF 546 + Store 485(f64v) 547 + 549: 250(bvec2) Load 548(bv) + 554: 161(ivec2) Select 549 553 552 + Store 482(i64v) 554 + 555: 250(bvec2) Load 548(bv) + 560: 166(ivec2) Select 555 559 558 + Store 481(u64v) 560 + 561: 161(ivec2) Load 482(i64v) + 562: 250(bvec2) INotEqual 561 558 + Store 548(bv) 562 + 563: 166(ivec2) Load 481(u64v) + 564: 250(bvec2) INotEqual 563 558 + Store 548(bv) 564 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.extPostDepthCoverage.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.extPostDepthCoverage.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.extPostDepthCoverage.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.extPostDepthCoverage.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.extPostDepthCoverage.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 6 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.float16Fetch.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.float16Fetch.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.float16Fetch.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.float16Fetch.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,7070 @@ +spv.float16Fetch.frag +// Module Version 10000 +// Generated by (magic number): 80006 +// Id's are bound by 5923 + + Capability Shader + Capability Float16 + Capability StorageImageMultisample + Capability ImageCubeArray + Capability ImageRect + Capability SampledRect + Capability InputAttachment + Capability SparseResidency + Capability MinLod + Capability Sampled1D + Capability Image1D + Capability SampledCubeArray + Capability SampledBuffer + Capability ImageBuffer + Capability ImageMSArray + Capability ImageQuery + Capability StorageInputOutput16 + Capability Float16ImageAMD + Capability ImageGatherBiasLodAMD + Extension "SPV_AMD_gpu_shader_half_float" + Extension "SPV_AMD_gpu_shader_half_float_fetch" + Extension "SPV_AMD_texture_gather_bias_lod" + Extension "SPV_KHR_16bit_storage" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 128 135 137 148 156 169 177 215 251 309 565 572 1393 1401 1409 1417 1425 1433 4257 4264 5913 5922 + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + SourceExtension "GL_AMD_gpu_shader_half_float" + SourceExtension "GL_AMD_gpu_shader_half_float_fetch" + SourceExtension "GL_AMD_texture_gather_bias_lod" + SourceExtension "GL_ARB_sparse_texture2" + SourceExtension "GL_ARB_sparse_texture_clamp" + Name 4 "main" + Name 9 "testTexture(" + Name 11 "testTextureProj(" + Name 13 "testTextureLod(" + Name 15 "testTextureOffset(" + Name 17 "testTextureProjOffset(" + Name 19 "testTextureLodOffset(" + Name 21 "testTextureProjLodOffset(" + Name 23 "testTexelFetch(" + Name 25 "testTexelFetchOffset(" + Name 27 "testTextureGrad(" + Name 29 "testTextureGradOffset(" + Name 31 "testTextureProjGrad(" + Name 33 "testTextureProjGradoffset(" + Name 35 "testTextureGather(" + Name 37 "testTextureGatherOffset(" + Name 39 "testTextureGatherOffsets(" + Name 41 "testTextureGatherLod(" + Name 43 "testTextureGatherLodOffset(" + Name 45 "testTextureGatherLodOffsets(" + Name 50 "testTextureSize(" + Name 55 "testTextureQueryLod(" + Name 58 "testTextureQueryLevels(" + Name 60 "testTextureSamples(" + Name 62 "testImageLoad(" + Name 67 "testImageStore(vf164;" + Name 66 "data" + Name 69 "testSparseTexture(" + Name 71 "testSparseTextureLod(" + Name 73 "testSparseTextureOffset(" + Name 75 "testSparseTextureLodOffset(" + Name 77 "testSparseTextureGrad(" + Name 79 "testSparseTextureGradOffset(" + Name 81 "testSparseTexelFetch(" + Name 83 "testSparseTexelFetchOffset(" + Name 85 "testSparseTextureGather(" + Name 87 "testSparseTextureGatherOffset(" + Name 89 "testSparseTextureGatherOffsets(" + Name 91 "testSparseTextureGatherLod(" + Name 93 "testSparseTextureGatherLodOffset(" + Name 95 "testSparseTextureGatherLodOffsets(" + Name 97 "testSparseImageLoad(" + Name 99 "testSparseTextureClamp(" + Name 101 "testTextureClamp(" + Name 103 "testSparseTextureOffsetClamp(" + Name 105 "testTextureOffsetClamp(" + Name 107 "testSparseTextureGradClamp(" + Name 109 "testTextureGradClamp(" + Name 111 "testSparseTextureGradOffsetClamp(" + Name 113 "testTextureGradOffsetClamp(" + Name 115 "testCombinedTextureSampler(" + Name 117 "testSubpassLoad(" + Name 119 "texel" + Name 125 "s1D" + Name 128 "c1" + Name 135 "f16c1" + Name 137 "f16bias" + Name 145 "s2D" + Name 148 "c2" + Name 156 "f16c2" + Name 165 "s3D" + Name 169 "c3" + Name 177 "f16c3" + Name 186 "sCube" + Name 201 "s1DShadow" + Name 215 "compare" + Name 226 "s2DShadow" + Name 247 "sCubeShadow" + Name 251 "c4" + Name 271 "s1DArray" + Name 286 "s2DArray" + Name 301 "sCubeArray" + Name 309 "f16c4" + Name 318 "s1DArrayShadow" + Name 339 "s2DArrayShadow" + Name 359 "s2DRect" + Name 373 "s2DRectShadow" + Name 393 "sCubeArrayShadow" + Name 413 "texel" + Name 562 "texel" + Name 565 "lod" + Name 572 "f16lod" + Name 706 "texel" + Name 863 "texel" + Name 1012 "texel" + Name 1130 "texel" + Name 1244 "texel" + Name 1300 "sBuffer" + Name 1311 "s2DMS" + Name 1322 "s2DMSArray" + Name 1334 "texel" + Name 1390 "texel" + Name 1393 "dPdxy1" + Name 1401 "f16dPdxy1" + Name 1409 "dPdxy2" + Name 1417 "f16dPdxy2" + Name 1425 "dPdxy3" + Name 1433 "f16dPdxy3" + Name 1632 "texel" + Name 1820 "texel" + Name 2002 "texel" + Name 2184 "texel" + Name 2303 "texel" + Name 2375 "texel" + Name 2450 "texel" + Name 2502 "texel" + Name 2530 "texel" + Name 2559 "size" + Name 2733 "lod" + Name 2869 "levels" + Name 2938 "samples" + Name 2952 "texel" + Name 2955 "i1D" + Name 2964 "i2D" + Name 2973 "i3D" + Name 2982 "i2DRect" + Name 2991 "iCube" + Name 3000 "iBuffer" + Name 3009 "i1DArray" + Name 3018 "i2DArray" + Name 3027 "iCubeArray" + Name 3036 "i2DMS" + Name 3045 "i2DMSArray" + Name 3099 "texel" + Name 3102 "ResType" + Name 3138 "ResType" + Name 3242 "texel" + Name 3322 "texel" + Name 3412 "texel" + Name 3468 "texel" + Name 3628 "texel" + Name 3742 "texel" + Name 3794 "texel" + Name 3832 "texel" + Name 3950 "texel" + Name 4022 "texel" + Name 4094 "texel" + Name 4146 "texel" + Name 4174 "texel" + Name 4202 "texel" + Name 4254 "texel" + Name 4257 "lodClamp" + Name 4264 "f16lodClamp" + Name 4391 "texel" + Name 4598 "texel" + Name 4674 "texel" + Name 4818 "texel" + Name 4962 "texel" + Name 5188 "texel" + Name 5280 "texel" + Name 5452 "texel" + Name 5454 "t1D" + Name 5458 "s" + Name 5474 "t2D" + Name 5491 "t3D" + Name 5508 "tCube" + Name 5525 "sShadow" + Name 5589 "t1DArray" + Name 5606 "t2DArray" + Name 5623 "tCubeArray" + Name 5681 "t2DRect" + Name 5741 "subpass" + Name 5747 "subpassMS" + Name 5753 "result" + Name 5834 "param" + Name 5913 "fragColor" + Name 5917 "tBuffer" + Name 5919 "t2DMS" + Name 5921 "t2DMSArray" + Name 5922 "bias" + Decorate 125(s1D) DescriptorSet 0 + Decorate 125(s1D) Binding 0 + Decorate 128(c1) Location 0 + Decorate 135(f16c1) Location 11 + Decorate 137(f16bias) Location 16 + Decorate 145(s2D) DescriptorSet 0 + Decorate 145(s2D) Binding 1 + Decorate 148(c2) Location 1 + Decorate 156(f16c2) Location 12 + Decorate 165(s3D) DescriptorSet 0 + Decorate 165(s3D) Binding 2 + Decorate 169(c3) Location 2 + Decorate 177(f16c3) Location 13 + Decorate 186(sCube) DescriptorSet 0 + Decorate 186(sCube) Binding 4 + Decorate 201(s1DShadow) DescriptorSet 0 + Decorate 201(s1DShadow) Binding 11 + Decorate 215(compare) Location 4 + Decorate 226(s2DShadow) DescriptorSet 0 + Decorate 226(s2DShadow) Binding 12 + Decorate 247(sCubeShadow) DescriptorSet 0 + Decorate 247(sCubeShadow) Binding 14 + Decorate 251(c4) Location 3 + Decorate 271(s1DArray) DescriptorSet 0 + Decorate 271(s1DArray) Binding 7 + Decorate 286(s2DArray) DescriptorSet 0 + Decorate 286(s2DArray) Binding 8 + Decorate 301(sCubeArray) DescriptorSet 0 + Decorate 301(sCubeArray) Binding 9 + Decorate 309(f16c4) Location 14 + Decorate 318(s1DArrayShadow) DescriptorSet 0 + Decorate 318(s1DArrayShadow) Binding 15 + Decorate 339(s2DArrayShadow) DescriptorSet 0 + Decorate 339(s2DArrayShadow) Binding 16 + Decorate 359(s2DRect) DescriptorSet 0 + Decorate 359(s2DRect) Binding 3 + Decorate 373(s2DRectShadow) DescriptorSet 0 + Decorate 373(s2DRectShadow) Binding 13 + Decorate 393(sCubeArrayShadow) DescriptorSet 0 + Decorate 393(sCubeArrayShadow) Binding 17 + Decorate 565(lod) Location 5 + Decorate 572(f16lod) Location 15 + Decorate 1300(sBuffer) DescriptorSet 0 + Decorate 1300(sBuffer) Binding 5 + Decorate 1311(s2DMS) DescriptorSet 0 + Decorate 1311(s2DMS) Binding 6 + Decorate 1322(s2DMSArray) DescriptorSet 0 + Decorate 1322(s2DMSArray) Binding 10 + Decorate 1393(dPdxy1) Location 8 + Decorate 1401(f16dPdxy1) Location 18 + Decorate 1409(dPdxy2) Location 9 + Decorate 1417(f16dPdxy2) Location 19 + Decorate 1425(dPdxy3) Location 10 + Decorate 1433(f16dPdxy3) Location 20 + Decorate 2955(i1D) DescriptorSet 1 + Decorate 2955(i1D) Binding 0 + Decorate 2964(i2D) DescriptorSet 1 + Decorate 2964(i2D) Binding 1 + Decorate 2973(i3D) DescriptorSet 1 + Decorate 2973(i3D) Binding 2 + Decorate 2982(i2DRect) DescriptorSet 1 + Decorate 2982(i2DRect) Binding 3 + Decorate 2991(iCube) DescriptorSet 1 + Decorate 2991(iCube) Binding 4 + Decorate 3000(iBuffer) DescriptorSet 1 + Decorate 3000(iBuffer) Binding 8 + Decorate 3009(i1DArray) DescriptorSet 1 + Decorate 3009(i1DArray) Binding 5 + Decorate 3018(i2DArray) DescriptorSet 1 + Decorate 3018(i2DArray) Binding 6 + Decorate 3027(iCubeArray) DescriptorSet 1 + Decorate 3027(iCubeArray) Binding 7 + Decorate 3036(i2DMS) DescriptorSet 1 + Decorate 3036(i2DMS) Binding 9 + Decorate 3045(i2DMSArray) DescriptorSet 1 + Decorate 3045(i2DMSArray) Binding 10 + Decorate 4257(lodClamp) Location 7 + Decorate 4264(f16lodClamp) Location 17 + Decorate 5454(t1D) DescriptorSet 2 + Decorate 5454(t1D) Binding 0 + Decorate 5458(s) DescriptorSet 2 + Decorate 5458(s) Binding 11 + Decorate 5474(t2D) DescriptorSet 2 + Decorate 5474(t2D) Binding 1 + Decorate 5491(t3D) DescriptorSet 2 + Decorate 5491(t3D) Binding 2 + Decorate 5508(tCube) DescriptorSet 2 + Decorate 5508(tCube) Binding 4 + Decorate 5525(sShadow) DescriptorSet 2 + Decorate 5525(sShadow) Binding 12 + Decorate 5589(t1DArray) DescriptorSet 2 + Decorate 5589(t1DArray) Binding 5 + Decorate 5606(t2DArray) DescriptorSet 2 + Decorate 5606(t2DArray) Binding 6 + Decorate 5623(tCubeArray) DescriptorSet 2 + Decorate 5623(tCubeArray) Binding 7 + Decorate 5681(t2DRect) DescriptorSet 2 + Decorate 5681(t2DRect) Binding 3 + Decorate 5741(subpass) DescriptorSet 3 + Decorate 5741(subpass) Binding 0 + Decorate 5741(subpass) InputAttachmentIndex 0 + Decorate 5747(subpassMS) DescriptorSet 3 + Decorate 5747(subpassMS) Binding 1 + Decorate 5747(subpassMS) InputAttachmentIndex 0 + Decorate 5913(fragColor) Location 0 + Decorate 5917(tBuffer) DescriptorSet 2 + Decorate 5917(tBuffer) Binding 8 + Decorate 5919(t2DMS) DescriptorSet 2 + Decorate 5919(t2DMS) Binding 9 + Decorate 5921(t2DMSArray) DescriptorSet 2 + Decorate 5921(t2DMSArray) Binding 10 + Decorate 5922(bias) Location 6 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 16 + 7: TypeVector 6(float) 4 + 8: TypeFunction 7(fvec4) + 47: TypeInt 32 1 + 48: TypeVector 47(int) 4 + 49: TypeFunction 48(ivec4) + 52: TypeFloat 32 + 53: TypeVector 52(float) 2 + 54: TypeFunction 53(fvec2) + 57: TypeFunction 47(int) + 64: TypePointer Function 7(fvec4) + 65: TypeFunction 2 64(ptr) + 120: 6(float) Constant 0 + 121: 7(fvec4) ConstantComposite 120 120 120 120 + 122: TypeImage 6(float) 1D sampled format:Unknown + 123: TypeSampledImage 122 + 124: TypePointer UniformConstant 123 + 125(s1D): 124(ptr) Variable UniformConstant + 127: TypePointer Input 52(float) + 128(c1): 127(ptr) Variable Input + 134: TypePointer Input 6(float) + 135(f16c1): 134(ptr) Variable Input + 137(f16bias): 134(ptr) Variable Input + 142: TypeImage 6(float) 2D sampled format:Unknown + 143: TypeSampledImage 142 + 144: TypePointer UniformConstant 143 + 145(s2D): 144(ptr) Variable UniformConstant + 147: TypePointer Input 53(fvec2) + 148(c2): 147(ptr) Variable Input + 154: TypeVector 6(float) 2 + 155: TypePointer Input 154(fvec2) + 156(f16c2): 155(ptr) Variable Input + 162: TypeImage 6(float) 3D sampled format:Unknown + 163: TypeSampledImage 162 + 164: TypePointer UniformConstant 163 + 165(s3D): 164(ptr) Variable UniformConstant + 167: TypeVector 52(float) 3 + 168: TypePointer Input 167(fvec3) + 169(c3): 168(ptr) Variable Input + 175: TypeVector 6(float) 3 + 176: TypePointer Input 175(fvec3) + 177(f16c3): 176(ptr) Variable Input + 183: TypeImage 6(float) Cube sampled format:Unknown + 184: TypeSampledImage 183 + 185: TypePointer UniformConstant 184 + 186(sCube): 185(ptr) Variable UniformConstant + 198: TypeImage 6(float) 1D depth sampled format:Unknown + 199: TypeSampledImage 198 + 200: TypePointer UniformConstant 199 + 201(s1DShadow): 200(ptr) Variable UniformConstant + 206: TypeInt 32 0 + 207: 206(int) Constant 0 + 208: TypePointer Function 6(float) + 215(compare): 127(ptr) Variable Input + 223: TypeImage 6(float) 2D depth sampled format:Unknown + 224: TypeSampledImage 223 + 225: TypePointer UniformConstant 224 + 226(s2DShadow): 225(ptr) Variable UniformConstant + 244: TypeImage 6(float) Cube depth sampled format:Unknown + 245: TypeSampledImage 244 + 246: TypePointer UniformConstant 245 +247(sCubeShadow): 246(ptr) Variable UniformConstant + 249: TypeVector 52(float) 4 + 250: TypePointer Input 249(fvec4) + 251(c4): 250(ptr) Variable Input + 268: TypeImage 6(float) 1D array sampled format:Unknown + 269: TypeSampledImage 268 + 270: TypePointer UniformConstant 269 + 271(s1DArray): 270(ptr) Variable UniformConstant + 283: TypeImage 6(float) 2D array sampled format:Unknown + 284: TypeSampledImage 283 + 285: TypePointer UniformConstant 284 + 286(s2DArray): 285(ptr) Variable UniformConstant + 298: TypeImage 6(float) Cube array sampled format:Unknown + 299: TypeSampledImage 298 + 300: TypePointer UniformConstant 299 + 301(sCubeArray): 300(ptr) Variable UniformConstant + 308: TypePointer Input 7(fvec4) + 309(f16c4): 308(ptr) Variable Input + 315: TypeImage 6(float) 1D depth array sampled format:Unknown + 316: TypeSampledImage 315 + 317: TypePointer UniformConstant 316 +318(s1DArrayShadow): 317(ptr) Variable UniformConstant + 336: TypeImage 6(float) 2D depth array sampled format:Unknown + 337: TypeSampledImage 336 + 338: TypePointer UniformConstant 337 +339(s2DArrayShadow): 338(ptr) Variable UniformConstant + 356: TypeImage 6(float) Rect sampled format:Unknown + 357: TypeSampledImage 356 + 358: TypePointer UniformConstant 357 + 359(s2DRect): 358(ptr) Variable UniformConstant + 370: TypeImage 6(float) Rect depth sampled format:Unknown + 371: TypeSampledImage 370 + 372: TypePointer UniformConstant 371 +373(s2DRectShadow): 372(ptr) Variable UniformConstant + 390: TypeImage 6(float) Cube depth array sampled format:Unknown + 391: TypeSampledImage 390 + 392: TypePointer UniformConstant 391 +393(sCubeArrayShadow): 392(ptr) Variable UniformConstant + 565(lod): 127(ptr) Variable Input + 572(f16lod): 134(ptr) Variable Input + 709: 47(int) Constant 1 + 721: TypeVector 47(int) 2 + 722: 721(ivec2) ConstantComposite 709 709 + 734: TypeVector 47(int) 3 + 735: 734(ivec3) ConstantComposite 709 709 709 + 1297: TypeImage 6(float) Buffer sampled format:Unknown + 1298: TypeSampledImage 1297 + 1299: TypePointer UniformConstant 1298 + 1300(sBuffer): 1299(ptr) Variable UniformConstant + 1308: TypeImage 6(float) 2D multi-sampled sampled format:Unknown + 1309: TypeSampledImage 1308 + 1310: TypePointer UniformConstant 1309 + 1311(s2DMS): 1310(ptr) Variable UniformConstant + 1319: TypeImage 6(float) 2D array multi-sampled sampled format:Unknown + 1320: TypeSampledImage 1319 + 1321: TypePointer UniformConstant 1320 +1322(s2DMSArray): 1321(ptr) Variable UniformConstant + 1326: 47(int) Constant 2 + 1393(dPdxy1): 127(ptr) Variable Input + 1401(f16dPdxy1): 134(ptr) Variable Input + 1409(dPdxy2): 147(ptr) Variable Input + 1417(f16dPdxy2): 155(ptr) Variable Input + 1425(dPdxy3): 168(ptr) Variable Input + 1433(f16dPdxy3): 176(ptr) Variable Input + 2187: 47(int) Constant 0 + 2378: 206(int) Constant 4 + 2379: TypeArray 721(ivec2) 2378 + 2380: 2379 ConstantComposite 722 722 722 722 + 2558: TypePointer Function 48(ivec4) + 2560: 48(ivec4) ConstantComposite 2187 2187 2187 2187 + 2566: TypePointer Function 47(int) + 2732: TypePointer Function 53(fvec2) + 2734: 52(float) Constant 0 + 2735: 53(fvec2) ConstantComposite 2734 2734 + 2953: TypeImage 6(float) 1D nonsampled format:Rgba16f + 2954: TypePointer UniformConstant 2953 + 2955(i1D): 2954(ptr) Variable UniformConstant + 2962: TypeImage 6(float) 2D nonsampled format:Rgba16f + 2963: TypePointer UniformConstant 2962 + 2964(i2D): 2963(ptr) Variable UniformConstant + 2971: TypeImage 6(float) 3D nonsampled format:Rgba16f + 2972: TypePointer UniformConstant 2971 + 2973(i3D): 2972(ptr) Variable UniformConstant + 2980: TypeImage 6(float) Rect nonsampled format:Rgba16f + 2981: TypePointer UniformConstant 2980 + 2982(i2DRect): 2981(ptr) Variable UniformConstant + 2989: TypeImage 6(float) Cube nonsampled format:Rgba16f + 2990: TypePointer UniformConstant 2989 + 2991(iCube): 2990(ptr) Variable UniformConstant + 2998: TypeImage 6(float) Buffer nonsampled format:Rgba16f + 2999: TypePointer UniformConstant 2998 + 3000(iBuffer): 2999(ptr) Variable UniformConstant + 3007: TypeImage 6(float) 1D array nonsampled format:Rgba16f + 3008: TypePointer UniformConstant 3007 + 3009(i1DArray): 3008(ptr) Variable UniformConstant + 3016: TypeImage 6(float) 2D array nonsampled format:Rgba16f + 3017: TypePointer UniformConstant 3016 + 3018(i2DArray): 3017(ptr) Variable UniformConstant + 3025: TypeImage 6(float) Cube array nonsampled format:Rgba16f + 3026: TypePointer UniformConstant 3025 +3027(iCubeArray): 3026(ptr) Variable UniformConstant + 3034: TypeImage 6(float) 2D multi-sampled nonsampled format:Rgba16f + 3035: TypePointer UniformConstant 3034 + 3036(i2DMS): 3035(ptr) Variable UniformConstant + 3043: TypeImage 6(float) 2D array multi-sampled nonsampled format:Rgba16f + 3044: TypePointer UniformConstant 3043 +3045(i2DMSArray): 3044(ptr) Variable UniformConstant + 3102(ResType): TypeStruct 47(int) 7(fvec4) + 3138(ResType): TypeStruct 47(int) 6(float) + 4257(lodClamp): 127(ptr) Variable Input +4264(f16lodClamp): 134(ptr) Variable Input + 5453: TypePointer UniformConstant 122 + 5454(t1D): 5453(ptr) Variable UniformConstant + 5456: TypeSampler + 5457: TypePointer UniformConstant 5456 + 5458(s): 5457(ptr) Variable UniformConstant + 5473: TypePointer UniformConstant 142 + 5474(t2D): 5473(ptr) Variable UniformConstant + 5490: TypePointer UniformConstant 162 + 5491(t3D): 5490(ptr) Variable UniformConstant + 5507: TypePointer UniformConstant 183 + 5508(tCube): 5507(ptr) Variable UniformConstant + 5525(sShadow): 5457(ptr) Variable UniformConstant + 5588: TypePointer UniformConstant 268 + 5589(t1DArray): 5588(ptr) Variable UniformConstant + 5605: TypePointer UniformConstant 283 + 5606(t2DArray): 5605(ptr) Variable UniformConstant + 5622: TypePointer UniformConstant 298 +5623(tCubeArray): 5622(ptr) Variable UniformConstant + 5680: TypePointer UniformConstant 356 + 5681(t2DRect): 5680(ptr) Variable UniformConstant + 5739: TypeImage 6(float) SubpassData nonsampled format:Unknown + 5740: TypePointer UniformConstant 5739 + 5741(subpass): 5740(ptr) Variable UniformConstant + 5743: 721(ivec2) ConstantComposite 2187 2187 + 5745: TypeImage 6(float) SubpassData multi-sampled nonsampled format:Unknown + 5746: TypePointer UniformConstant 5745 + 5747(subpassMS): 5746(ptr) Variable UniformConstant + 5912: TypePointer Output 249(fvec4) + 5913(fragColor): 5912(ptr) Variable Output + 5916: TypePointer UniformConstant 1297 + 5917(tBuffer): 5916(ptr) Variable UniformConstant + 5918: TypePointer UniformConstant 1308 + 5919(t2DMS): 5918(ptr) Variable UniformConstant + 5920: TypePointer UniformConstant 1319 +5921(t2DMSArray): 5920(ptr) Variable UniformConstant + 5922(bias): 127(ptr) Variable Input + 4(main): 2 Function None 3 + 5: Label + 5753(result): 64(ptr) Variable Function + 5834(param): 64(ptr) Variable Function + Store 5753(result) 121 + 5754: 7(fvec4) FunctionCall 9(testTexture() + 5755: 7(fvec4) Load 5753(result) + 5756: 7(fvec4) FAdd 5755 5754 + Store 5753(result) 5756 + 5757: 7(fvec4) FunctionCall 11(testTextureProj() + 5758: 7(fvec4) Load 5753(result) + 5759: 7(fvec4) FAdd 5758 5757 + Store 5753(result) 5759 + 5760: 7(fvec4) FunctionCall 13(testTextureLod() + 5761: 7(fvec4) Load 5753(result) + 5762: 7(fvec4) FAdd 5761 5760 + Store 5753(result) 5762 + 5763: 7(fvec4) FunctionCall 15(testTextureOffset() + 5764: 7(fvec4) Load 5753(result) + 5765: 7(fvec4) FAdd 5764 5763 + Store 5753(result) 5765 + 5766: 7(fvec4) FunctionCall 19(testTextureLodOffset() + 5767: 7(fvec4) Load 5753(result) + 5768: 7(fvec4) FAdd 5767 5766 + Store 5753(result) 5768 + 5769: 7(fvec4) FunctionCall 21(testTextureProjLodOffset() + 5770: 7(fvec4) Load 5753(result) + 5771: 7(fvec4) FAdd 5770 5769 + Store 5753(result) 5771 + 5772: 7(fvec4) FunctionCall 23(testTexelFetch() + 5773: 7(fvec4) Load 5753(result) + 5774: 7(fvec4) FAdd 5773 5772 + Store 5753(result) 5774 + 5775: 7(fvec4) FunctionCall 25(testTexelFetchOffset() + 5776: 7(fvec4) Load 5753(result) + 5777: 7(fvec4) FAdd 5776 5775 + Store 5753(result) 5777 + 5778: 7(fvec4) FunctionCall 27(testTextureGrad() + 5779: 7(fvec4) Load 5753(result) + 5780: 7(fvec4) FAdd 5779 5778 + Store 5753(result) 5780 + 5781: 7(fvec4) FunctionCall 29(testTextureGradOffset() + 5782: 7(fvec4) Load 5753(result) + 5783: 7(fvec4) FAdd 5782 5781 + Store 5753(result) 5783 + 5784: 7(fvec4) FunctionCall 31(testTextureProjGrad() + 5785: 7(fvec4) Load 5753(result) + 5786: 7(fvec4) FAdd 5785 5784 + Store 5753(result) 5786 + 5787: 7(fvec4) FunctionCall 33(testTextureProjGradoffset() + 5788: 7(fvec4) Load 5753(result) + 5789: 7(fvec4) FAdd 5788 5787 + Store 5753(result) 5789 + 5790: 7(fvec4) FunctionCall 35(testTextureGather() + 5791: 7(fvec4) Load 5753(result) + 5792: 7(fvec4) FAdd 5791 5790 + Store 5753(result) 5792 + 5793: 7(fvec4) FunctionCall 37(testTextureGatherOffset() + 5794: 7(fvec4) Load 5753(result) + 5795: 7(fvec4) FAdd 5794 5793 + Store 5753(result) 5795 + 5796: 7(fvec4) FunctionCall 39(testTextureGatherOffsets() + 5797: 7(fvec4) Load 5753(result) + 5798: 7(fvec4) FAdd 5797 5796 + Store 5753(result) 5798 + 5799: 7(fvec4) FunctionCall 41(testTextureGatherLod() + 5800: 7(fvec4) Load 5753(result) + 5801: 7(fvec4) FAdd 5800 5799 + Store 5753(result) 5801 + 5802: 7(fvec4) FunctionCall 43(testTextureGatherLodOffset() + 5803: 7(fvec4) Load 5753(result) + 5804: 7(fvec4) FAdd 5803 5802 + Store 5753(result) 5804 + 5805: 7(fvec4) FunctionCall 45(testTextureGatherLodOffsets() + 5806: 7(fvec4) Load 5753(result) + 5807: 7(fvec4) FAdd 5806 5805 + Store 5753(result) 5807 + 5808: 48(ivec4) FunctionCall 50(testTextureSize() + 5809: 7(fvec4) ConvertSToF 5808 + 5810: 7(fvec4) Load 5753(result) + 5811: 7(fvec4) FAdd 5810 5809 + Store 5753(result) 5811 + 5812: 53(fvec2) FunctionCall 55(testTextureQueryLod() + 5813: 154(fvec2) FConvert 5812 + 5814: 7(fvec4) Load 5753(result) + 5815: 154(fvec2) VectorShuffle 5814 5814 0 1 + 5816: 154(fvec2) FAdd 5815 5813 + 5817: 7(fvec4) Load 5753(result) + 5818: 7(fvec4) VectorShuffle 5817 5816 4 5 2 3 + Store 5753(result) 5818 + 5819: 47(int) FunctionCall 58(testTextureQueryLevels() + 5820: 6(float) ConvertSToF 5819 + 5821: 208(ptr) AccessChain 5753(result) 207 + 5822: 6(float) Load 5821 + 5823: 6(float) FAdd 5822 5820 + 5824: 208(ptr) AccessChain 5753(result) 207 + Store 5824 5823 + 5825: 47(int) FunctionCall 60(testTextureSamples() + 5826: 6(float) ConvertSToF 5825 + 5827: 208(ptr) AccessChain 5753(result) 207 + 5828: 6(float) Load 5827 + 5829: 6(float) FAdd 5828 5826 + 5830: 208(ptr) AccessChain 5753(result) 207 + Store 5830 5829 + 5831: 7(fvec4) FunctionCall 62(testImageLoad() + 5832: 7(fvec4) Load 5753(result) + 5833: 7(fvec4) FAdd 5832 5831 + Store 5753(result) 5833 + 5835: 7(fvec4) Load 5753(result) + Store 5834(param) 5835 + 5836: 2 FunctionCall 67(testImageStore(vf164;) 5834(param) + 5837: 7(fvec4) FunctionCall 69(testSparseTexture() + 5838: 7(fvec4) Load 5753(result) + 5839: 7(fvec4) FAdd 5838 5837 + Store 5753(result) 5839 + 5840: 7(fvec4) FunctionCall 71(testSparseTextureLod() + 5841: 7(fvec4) Load 5753(result) + 5842: 7(fvec4) FAdd 5841 5840 + Store 5753(result) 5842 + 5843: 7(fvec4) FunctionCall 73(testSparseTextureOffset() + 5844: 7(fvec4) Load 5753(result) + 5845: 7(fvec4) FAdd 5844 5843 + Store 5753(result) 5845 + 5846: 7(fvec4) FunctionCall 75(testSparseTextureLodOffset() + 5847: 7(fvec4) Load 5753(result) + 5848: 7(fvec4) FAdd 5847 5846 + Store 5753(result) 5848 + 5849: 7(fvec4) FunctionCall 77(testSparseTextureGrad() + 5850: 7(fvec4) Load 5753(result) + 5851: 7(fvec4) FAdd 5850 5849 + Store 5753(result) 5851 + 5852: 7(fvec4) FunctionCall 79(testSparseTextureGradOffset() + 5853: 7(fvec4) Load 5753(result) + 5854: 7(fvec4) FAdd 5853 5852 + Store 5753(result) 5854 + 5855: 7(fvec4) FunctionCall 81(testSparseTexelFetch() + 5856: 7(fvec4) Load 5753(result) + 5857: 7(fvec4) FAdd 5856 5855 + Store 5753(result) 5857 + 5858: 7(fvec4) FunctionCall 83(testSparseTexelFetchOffset() + 5859: 7(fvec4) Load 5753(result) + 5860: 7(fvec4) FAdd 5859 5858 + Store 5753(result) 5860 + 5861: 7(fvec4) FunctionCall 85(testSparseTextureGather() + 5862: 7(fvec4) Load 5753(result) + 5863: 7(fvec4) FAdd 5862 5861 + Store 5753(result) 5863 + 5864: 7(fvec4) FunctionCall 87(testSparseTextureGatherOffset() + 5865: 7(fvec4) Load 5753(result) + 5866: 7(fvec4) FAdd 5865 5864 + Store 5753(result) 5866 + 5867: 7(fvec4) FunctionCall 89(testSparseTextureGatherOffsets() + 5868: 7(fvec4) Load 5753(result) + 5869: 7(fvec4) FAdd 5868 5867 + Store 5753(result) 5869 + 5870: 7(fvec4) FunctionCall 91(testSparseTextureGatherLod() + 5871: 7(fvec4) Load 5753(result) + 5872: 7(fvec4) FAdd 5871 5870 + Store 5753(result) 5872 + 5873: 7(fvec4) FunctionCall 93(testSparseTextureGatherLodOffset() + 5874: 7(fvec4) Load 5753(result) + 5875: 7(fvec4) FAdd 5874 5873 + Store 5753(result) 5875 + 5876: 7(fvec4) FunctionCall 95(testSparseTextureGatherLodOffsets() + 5877: 7(fvec4) Load 5753(result) + 5878: 7(fvec4) FAdd 5877 5876 + Store 5753(result) 5878 + 5879: 7(fvec4) FunctionCall 97(testSparseImageLoad() + 5880: 7(fvec4) Load 5753(result) + 5881: 7(fvec4) FAdd 5880 5879 + Store 5753(result) 5881 + 5882: 7(fvec4) FunctionCall 99(testSparseTextureClamp() + 5883: 7(fvec4) Load 5753(result) + 5884: 7(fvec4) FAdd 5883 5882 + Store 5753(result) 5884 + 5885: 7(fvec4) FunctionCall 101(testTextureClamp() + 5886: 7(fvec4) Load 5753(result) + 5887: 7(fvec4) FAdd 5886 5885 + Store 5753(result) 5887 + 5888: 7(fvec4) FunctionCall 103(testSparseTextureOffsetClamp() + 5889: 7(fvec4) Load 5753(result) + 5890: 7(fvec4) FAdd 5889 5888 + Store 5753(result) 5890 + 5891: 7(fvec4) FunctionCall 105(testTextureOffsetClamp() + 5892: 7(fvec4) Load 5753(result) + 5893: 7(fvec4) FAdd 5892 5891 + Store 5753(result) 5893 + 5894: 7(fvec4) FunctionCall 77(testSparseTextureGrad() + 5895: 7(fvec4) Load 5753(result) + 5896: 7(fvec4) FAdd 5895 5894 + Store 5753(result) 5896 + 5897: 7(fvec4) FunctionCall 27(testTextureGrad() + 5898: 7(fvec4) Load 5753(result) + 5899: 7(fvec4) FAdd 5898 5897 + Store 5753(result) 5899 + 5900: 7(fvec4) FunctionCall 111(testSparseTextureGradOffsetClamp() + 5901: 7(fvec4) Load 5753(result) + 5902: 7(fvec4) FAdd 5901 5900 + Store 5753(result) 5902 + 5903: 7(fvec4) FunctionCall 113(testTextureGradOffsetClamp() + 5904: 7(fvec4) Load 5753(result) + 5905: 7(fvec4) FAdd 5904 5903 + Store 5753(result) 5905 + 5906: 7(fvec4) FunctionCall 115(testCombinedTextureSampler() + 5907: 7(fvec4) Load 5753(result) + 5908: 7(fvec4) FAdd 5907 5906 + Store 5753(result) 5908 + 5909: 7(fvec4) FunctionCall 117(testSubpassLoad() + 5910: 7(fvec4) Load 5753(result) + 5911: 7(fvec4) FAdd 5910 5909 + Store 5753(result) 5911 + 5914: 7(fvec4) Load 5753(result) + 5915: 249(fvec4) FConvert 5914 + Store 5913(fragColor) 5915 + Return + FunctionEnd + 9(testTexture(): 7(fvec4) Function None 8 + 10: Label + 119(texel): 64(ptr) Variable Function + Store 119(texel) 121 + 126: 123 Load 125(s1D) + 129: 52(float) Load 128(c1) + 130: 7(fvec4) ImageSampleImplicitLod 126 129 + 131: 7(fvec4) Load 119(texel) + 132: 7(fvec4) FAdd 131 130 + Store 119(texel) 132 + 133: 123 Load 125(s1D) + 136: 6(float) Load 135(f16c1) + 138: 6(float) Load 137(f16bias) + 139: 7(fvec4) ImageSampleImplicitLod 133 136 Bias 138 + 140: 7(fvec4) Load 119(texel) + 141: 7(fvec4) FAdd 140 139 + Store 119(texel) 141 + 146: 143 Load 145(s2D) + 149: 53(fvec2) Load 148(c2) + 150: 7(fvec4) ImageSampleImplicitLod 146 149 + 151: 7(fvec4) Load 119(texel) + 152: 7(fvec4) FAdd 151 150 + Store 119(texel) 152 + 153: 143 Load 145(s2D) + 157: 154(fvec2) Load 156(f16c2) + 158: 6(float) Load 137(f16bias) + 159: 7(fvec4) ImageSampleImplicitLod 153 157 Bias 158 + 160: 7(fvec4) Load 119(texel) + 161: 7(fvec4) FAdd 160 159 + Store 119(texel) 161 + 166: 163 Load 165(s3D) + 170: 167(fvec3) Load 169(c3) + 171: 7(fvec4) ImageSampleImplicitLod 166 170 + 172: 7(fvec4) Load 119(texel) + 173: 7(fvec4) FAdd 172 171 + Store 119(texel) 173 + 174: 163 Load 165(s3D) + 178: 175(fvec3) Load 177(f16c3) + 179: 6(float) Load 137(f16bias) + 180: 7(fvec4) ImageSampleImplicitLod 174 178 Bias 179 + 181: 7(fvec4) Load 119(texel) + 182: 7(fvec4) FAdd 181 180 + Store 119(texel) 182 + 187: 184 Load 186(sCube) + 188: 167(fvec3) Load 169(c3) + 189: 7(fvec4) ImageSampleImplicitLod 187 188 + 190: 7(fvec4) Load 119(texel) + 191: 7(fvec4) FAdd 190 189 + Store 119(texel) 191 + 192: 184 Load 186(sCube) + 193: 175(fvec3) Load 177(f16c3) + 194: 6(float) Load 137(f16bias) + 195: 7(fvec4) ImageSampleImplicitLod 192 193 Bias 194 + 196: 7(fvec4) Load 119(texel) + 197: 7(fvec4) FAdd 196 195 + Store 119(texel) 197 + 202: 199 Load 201(s1DShadow) + 203: 167(fvec3) Load 169(c3) + 204: 52(float) CompositeExtract 203 2 + 205: 6(float) ImageSampleDrefImplicitLod 202 203 204 + 209: 208(ptr) AccessChain 119(texel) 207 + 210: 6(float) Load 209 + 211: 6(float) FAdd 210 205 + 212: 208(ptr) AccessChain 119(texel) 207 + Store 212 211 + 213: 199 Load 201(s1DShadow) + 214: 154(fvec2) Load 156(f16c2) + 216: 52(float) Load 215(compare) + 217: 6(float) Load 137(f16bias) + 218: 6(float) ImageSampleDrefImplicitLod 213 214 216 Bias 217 + 219: 208(ptr) AccessChain 119(texel) 207 + 220: 6(float) Load 219 + 221: 6(float) FAdd 220 218 + 222: 208(ptr) AccessChain 119(texel) 207 + Store 222 221 + 227: 224 Load 226(s2DShadow) + 228: 167(fvec3) Load 169(c3) + 229: 52(float) CompositeExtract 228 2 + 230: 6(float) ImageSampleDrefImplicitLod 227 228 229 + 231: 208(ptr) AccessChain 119(texel) 207 + 232: 6(float) Load 231 + 233: 6(float) FAdd 232 230 + 234: 208(ptr) AccessChain 119(texel) 207 + Store 234 233 + 235: 224 Load 226(s2DShadow) + 236: 154(fvec2) Load 156(f16c2) + 237: 52(float) Load 215(compare) + 238: 6(float) Load 137(f16bias) + 239: 6(float) ImageSampleDrefImplicitLod 235 236 237 Bias 238 + 240: 208(ptr) AccessChain 119(texel) 207 + 241: 6(float) Load 240 + 242: 6(float) FAdd 241 239 + 243: 208(ptr) AccessChain 119(texel) 207 + Store 243 242 + 248: 245 Load 247(sCubeShadow) + 252: 249(fvec4) Load 251(c4) + 253: 52(float) CompositeExtract 252 3 + 254: 6(float) ImageSampleDrefImplicitLod 248 252 253 + 255: 208(ptr) AccessChain 119(texel) 207 + 256: 6(float) Load 255 + 257: 6(float) FAdd 256 254 + 258: 208(ptr) AccessChain 119(texel) 207 + Store 258 257 + 259: 245 Load 247(sCubeShadow) + 260: 175(fvec3) Load 177(f16c3) + 261: 52(float) Load 215(compare) + 262: 6(float) Load 137(f16bias) + 263: 6(float) ImageSampleDrefImplicitLod 259 260 261 Bias 262 + 264: 208(ptr) AccessChain 119(texel) 207 + 265: 6(float) Load 264 + 266: 6(float) FAdd 265 263 + 267: 208(ptr) AccessChain 119(texel) 207 + Store 267 266 + 272: 269 Load 271(s1DArray) + 273: 53(fvec2) Load 148(c2) + 274: 7(fvec4) ImageSampleImplicitLod 272 273 + 275: 7(fvec4) Load 119(texel) + 276: 7(fvec4) FAdd 275 274 + Store 119(texel) 276 + 277: 269 Load 271(s1DArray) + 278: 154(fvec2) Load 156(f16c2) + 279: 6(float) Load 137(f16bias) + 280: 7(fvec4) ImageSampleImplicitLod 277 278 Bias 279 + 281: 7(fvec4) Load 119(texel) + 282: 7(fvec4) FAdd 281 280 + Store 119(texel) 282 + 287: 284 Load 286(s2DArray) + 288: 167(fvec3) Load 169(c3) + 289: 7(fvec4) ImageSampleImplicitLod 287 288 + 290: 7(fvec4) Load 119(texel) + 291: 7(fvec4) FAdd 290 289 + Store 119(texel) 291 + 292: 284 Load 286(s2DArray) + 293: 175(fvec3) Load 177(f16c3) + 294: 6(float) Load 137(f16bias) + 295: 7(fvec4) ImageSampleImplicitLod 292 293 Bias 294 + 296: 7(fvec4) Load 119(texel) + 297: 7(fvec4) FAdd 296 295 + Store 119(texel) 297 + 302: 299 Load 301(sCubeArray) + 303: 249(fvec4) Load 251(c4) + 304: 7(fvec4) ImageSampleImplicitLod 302 303 + 305: 7(fvec4) Load 119(texel) + 306: 7(fvec4) FAdd 305 304 + Store 119(texel) 306 + 307: 299 Load 301(sCubeArray) + 310: 7(fvec4) Load 309(f16c4) + 311: 6(float) Load 137(f16bias) + 312: 7(fvec4) ImageSampleImplicitLod 307 310 Bias 311 + 313: 7(fvec4) Load 119(texel) + 314: 7(fvec4) FAdd 313 312 + Store 119(texel) 314 + 319: 316 Load 318(s1DArrayShadow) + 320: 167(fvec3) Load 169(c3) + 321: 52(float) CompositeExtract 320 2 + 322: 6(float) ImageSampleDrefImplicitLod 319 320 321 + 323: 208(ptr) AccessChain 119(texel) 207 + 324: 6(float) Load 323 + 325: 6(float) FAdd 324 322 + 326: 208(ptr) AccessChain 119(texel) 207 + Store 326 325 + 327: 316 Load 318(s1DArrayShadow) + 328: 154(fvec2) Load 156(f16c2) + 329: 52(float) Load 215(compare) + 330: 6(float) Load 137(f16bias) + 331: 6(float) ImageSampleDrefImplicitLod 327 328 329 Bias 330 + 332: 208(ptr) AccessChain 119(texel) 207 + 333: 6(float) Load 332 + 334: 6(float) FAdd 333 331 + 335: 208(ptr) AccessChain 119(texel) 207 + Store 335 334 + 340: 337 Load 339(s2DArrayShadow) + 341: 249(fvec4) Load 251(c4) + 342: 52(float) CompositeExtract 341 3 + 343: 6(float) ImageSampleDrefImplicitLod 340 341 342 + 344: 208(ptr) AccessChain 119(texel) 207 + 345: 6(float) Load 344 + 346: 6(float) FAdd 345 343 + 347: 208(ptr) AccessChain 119(texel) 207 + Store 347 346 + 348: 337 Load 339(s2DArrayShadow) + 349: 175(fvec3) Load 177(f16c3) + 350: 52(float) Load 215(compare) + 351: 6(float) ImageSampleDrefImplicitLod 348 349 350 + 352: 208(ptr) AccessChain 119(texel) 207 + 353: 6(float) Load 352 + 354: 6(float) FAdd 353 351 + 355: 208(ptr) AccessChain 119(texel) 207 + Store 355 354 + 360: 357 Load 359(s2DRect) + 361: 53(fvec2) Load 148(c2) + 362: 7(fvec4) ImageSampleImplicitLod 360 361 + 363: 7(fvec4) Load 119(texel) + 364: 7(fvec4) FAdd 363 362 + Store 119(texel) 364 + 365: 357 Load 359(s2DRect) + 366: 154(fvec2) Load 156(f16c2) + 367: 7(fvec4) ImageSampleImplicitLod 365 366 + 368: 7(fvec4) Load 119(texel) + 369: 7(fvec4) FAdd 368 367 + Store 119(texel) 369 + 374: 371 Load 373(s2DRectShadow) + 375: 167(fvec3) Load 169(c3) + 376: 52(float) CompositeExtract 375 2 + 377: 6(float) ImageSampleDrefImplicitLod 374 375 376 + 378: 208(ptr) AccessChain 119(texel) 207 + 379: 6(float) Load 378 + 380: 6(float) FAdd 379 377 + 381: 208(ptr) AccessChain 119(texel) 207 + Store 381 380 + 382: 371 Load 373(s2DRectShadow) + 383: 154(fvec2) Load 156(f16c2) + 384: 52(float) Load 215(compare) + 385: 6(float) ImageSampleDrefImplicitLod 382 383 384 + 386: 208(ptr) AccessChain 119(texel) 207 + 387: 6(float) Load 386 + 388: 6(float) FAdd 387 385 + 389: 208(ptr) AccessChain 119(texel) 207 + Store 389 388 + 394: 391 Load 393(sCubeArrayShadow) + 395: 249(fvec4) Load 251(c4) + 396: 52(float) Load 215(compare) + 397: 6(float) ImageSampleDrefImplicitLod 394 395 396 + 398: 208(ptr) AccessChain 119(texel) 207 + 399: 6(float) Load 398 + 400: 6(float) FAdd 399 397 + 401: 208(ptr) AccessChain 119(texel) 207 + Store 401 400 + 402: 391 Load 393(sCubeArrayShadow) + 403: 7(fvec4) Load 309(f16c4) + 404: 52(float) Load 215(compare) + 405: 6(float) ImageSampleDrefImplicitLod 402 403 404 + 406: 208(ptr) AccessChain 119(texel) 207 + 407: 6(float) Load 406 + 408: 6(float) FAdd 407 405 + 409: 208(ptr) AccessChain 119(texel) 207 + Store 409 408 + 410: 7(fvec4) Load 119(texel) + ReturnValue 410 + FunctionEnd +11(testTextureProj(): 7(fvec4) Function None 8 + 12: Label + 413(texel): 64(ptr) Variable Function + Store 413(texel) 121 + 414: 123 Load 125(s1D) + 415: 53(fvec2) Load 148(c2) + 416: 7(fvec4) ImageSampleProjImplicitLod 414 415 + 417: 7(fvec4) Load 413(texel) + 418: 7(fvec4) FAdd 417 416 + Store 413(texel) 418 + 419: 123 Load 125(s1D) + 420: 154(fvec2) Load 156(f16c2) + 421: 6(float) Load 137(f16bias) + 422: 7(fvec4) ImageSampleProjImplicitLod 419 420 Bias 421 + 423: 7(fvec4) Load 413(texel) + 424: 7(fvec4) FAdd 423 422 + Store 413(texel) 424 + 425: 123 Load 125(s1D) + 426: 249(fvec4) Load 251(c4) + 427: 52(float) CompositeExtract 426 3 + 428: 249(fvec4) CompositeInsert 427 426 1 + 429: 7(fvec4) ImageSampleProjImplicitLod 425 428 + 430: 7(fvec4) Load 413(texel) + 431: 7(fvec4) FAdd 430 429 + Store 413(texel) 431 + 432: 123 Load 125(s1D) + 433: 7(fvec4) Load 309(f16c4) + 434: 6(float) Load 137(f16bias) + 435: 6(float) CompositeExtract 433 3 + 436: 7(fvec4) CompositeInsert 435 433 1 + 437: 7(fvec4) ImageSampleProjImplicitLod 432 436 Bias 434 + 438: 7(fvec4) Load 413(texel) + 439: 7(fvec4) FAdd 438 437 + Store 413(texel) 439 + 440: 143 Load 145(s2D) + 441: 167(fvec3) Load 169(c3) + 442: 7(fvec4) ImageSampleProjImplicitLod 440 441 + 443: 7(fvec4) Load 413(texel) + 444: 7(fvec4) FAdd 443 442 + Store 413(texel) 444 + 445: 143 Load 145(s2D) + 446: 175(fvec3) Load 177(f16c3) + 447: 6(float) Load 137(f16bias) + 448: 7(fvec4) ImageSampleProjImplicitLod 445 446 Bias 447 + 449: 7(fvec4) Load 413(texel) + 450: 7(fvec4) FAdd 449 448 + Store 413(texel) 450 + 451: 143 Load 145(s2D) + 452: 249(fvec4) Load 251(c4) + 453: 52(float) CompositeExtract 452 3 + 454: 249(fvec4) CompositeInsert 453 452 2 + 455: 7(fvec4) ImageSampleProjImplicitLod 451 454 + 456: 7(fvec4) Load 413(texel) + 457: 7(fvec4) FAdd 456 455 + Store 413(texel) 457 + 458: 143 Load 145(s2D) + 459: 7(fvec4) Load 309(f16c4) + 460: 6(float) Load 137(f16bias) + 461: 6(float) CompositeExtract 459 3 + 462: 7(fvec4) CompositeInsert 461 459 2 + 463: 7(fvec4) ImageSampleProjImplicitLod 458 462 Bias 460 + 464: 7(fvec4) Load 413(texel) + 465: 7(fvec4) FAdd 464 463 + Store 413(texel) 465 + 466: 163 Load 165(s3D) + 467: 249(fvec4) Load 251(c4) + 468: 7(fvec4) ImageSampleProjImplicitLod 466 467 + 469: 7(fvec4) Load 413(texel) + 470: 7(fvec4) FAdd 469 468 + Store 413(texel) 470 + 471: 163 Load 165(s3D) + 472: 7(fvec4) Load 309(f16c4) + 473: 6(float) Load 137(f16bias) + 474: 7(fvec4) ImageSampleProjImplicitLod 471 472 Bias 473 + 475: 7(fvec4) Load 413(texel) + 476: 7(fvec4) FAdd 475 474 + Store 413(texel) 476 + 477: 199 Load 201(s1DShadow) + 478: 249(fvec4) Load 251(c4) + 479: 52(float) CompositeExtract 478 2 + 480: 52(float) CompositeExtract 478 3 + 481: 249(fvec4) CompositeInsert 480 478 1 + 482: 6(float) ImageSampleProjDrefImplicitLod 477 481 479 + 483: 208(ptr) AccessChain 413(texel) 207 + 484: 6(float) Load 483 + 485: 6(float) FAdd 484 482 + 486: 208(ptr) AccessChain 413(texel) 207 + Store 486 485 + 487: 199 Load 201(s1DShadow) + 488: 175(fvec3) Load 177(f16c3) + 489: 52(float) Load 215(compare) + 490: 6(float) Load 137(f16bias) + 491: 6(float) CompositeExtract 488 2 + 492: 175(fvec3) CompositeInsert 491 488 1 + 493: 6(float) ImageSampleProjDrefImplicitLod 487 492 489 Bias 490 + 494: 208(ptr) AccessChain 413(texel) 207 + 495: 6(float) Load 494 + 496: 6(float) FAdd 495 493 + 497: 208(ptr) AccessChain 413(texel) 207 + Store 497 496 + 498: 224 Load 226(s2DShadow) + 499: 249(fvec4) Load 251(c4) + 500: 52(float) CompositeExtract 499 2 + 501: 52(float) CompositeExtract 499 3 + 502: 249(fvec4) CompositeInsert 501 499 2 + 503: 6(float) ImageSampleProjDrefImplicitLod 498 502 500 + 504: 208(ptr) AccessChain 413(texel) 207 + 505: 6(float) Load 504 + 506: 6(float) FAdd 505 503 + 507: 208(ptr) AccessChain 413(texel) 207 + Store 507 506 + 508: 224 Load 226(s2DShadow) + 509: 175(fvec3) Load 177(f16c3) + 510: 52(float) Load 215(compare) + 511: 6(float) Load 137(f16bias) + 512: 6(float) ImageSampleProjDrefImplicitLod 508 509 510 Bias 511 + 513: 208(ptr) AccessChain 413(texel) 207 + 514: 6(float) Load 513 + 515: 6(float) FAdd 514 512 + 516: 208(ptr) AccessChain 413(texel) 207 + Store 516 515 + 517: 357 Load 359(s2DRect) + 518: 167(fvec3) Load 169(c3) + 519: 7(fvec4) ImageSampleProjImplicitLod 517 518 + 520: 7(fvec4) Load 413(texel) + 521: 7(fvec4) FAdd 520 519 + Store 413(texel) 521 + 522: 357 Load 359(s2DRect) + 523: 175(fvec3) Load 177(f16c3) + 524: 7(fvec4) ImageSampleProjImplicitLod 522 523 + 525: 7(fvec4) Load 413(texel) + 526: 7(fvec4) FAdd 525 524 + Store 413(texel) 526 + 527: 357 Load 359(s2DRect) + 528: 249(fvec4) Load 251(c4) + 529: 52(float) CompositeExtract 528 3 + 530: 249(fvec4) CompositeInsert 529 528 2 + 531: 7(fvec4) ImageSampleProjImplicitLod 527 530 + 532: 7(fvec4) Load 413(texel) + 533: 7(fvec4) FAdd 532 531 + Store 413(texel) 533 + 534: 357 Load 359(s2DRect) + 535: 7(fvec4) Load 309(f16c4) + 536: 6(float) CompositeExtract 535 3 + 537: 7(fvec4) CompositeInsert 536 535 2 + 538: 7(fvec4) ImageSampleProjImplicitLod 534 537 + 539: 7(fvec4) Load 413(texel) + 540: 7(fvec4) FAdd 539 538 + Store 413(texel) 540 + 541: 371 Load 373(s2DRectShadow) + 542: 249(fvec4) Load 251(c4) + 543: 52(float) CompositeExtract 542 2 + 544: 52(float) CompositeExtract 542 3 + 545: 249(fvec4) CompositeInsert 544 542 2 + 546: 6(float) ImageSampleProjDrefImplicitLod 541 545 543 + 547: 208(ptr) AccessChain 413(texel) 207 + 548: 6(float) Load 547 + 549: 6(float) FAdd 548 546 + 550: 208(ptr) AccessChain 413(texel) 207 + Store 550 549 + 551: 371 Load 373(s2DRectShadow) + 552: 175(fvec3) Load 177(f16c3) + 553: 52(float) Load 215(compare) + 554: 6(float) ImageSampleProjDrefImplicitLod 551 552 553 + 555: 208(ptr) AccessChain 413(texel) 207 + 556: 6(float) Load 555 + 557: 6(float) FAdd 556 554 + 558: 208(ptr) AccessChain 413(texel) 207 + Store 558 557 + 559: 7(fvec4) Load 413(texel) + ReturnValue 559 + FunctionEnd +13(testTextureLod(): 7(fvec4) Function None 8 + 14: Label + 562(texel): 64(ptr) Variable Function + Store 562(texel) 121 + 563: 123 Load 125(s1D) + 564: 52(float) Load 128(c1) + 566: 52(float) Load 565(lod) + 567: 7(fvec4) ImageSampleExplicitLod 563 564 Lod 566 + 568: 7(fvec4) Load 562(texel) + 569: 7(fvec4) FAdd 568 567 + Store 562(texel) 569 + 570: 123 Load 125(s1D) + 571: 6(float) Load 135(f16c1) + 573: 6(float) Load 572(f16lod) + 574: 7(fvec4) ImageSampleExplicitLod 570 571 Lod 573 + 575: 7(fvec4) Load 562(texel) + 576: 7(fvec4) FAdd 575 574 + Store 562(texel) 576 + 577: 143 Load 145(s2D) + 578: 53(fvec2) Load 148(c2) + 579: 52(float) Load 565(lod) + 580: 7(fvec4) ImageSampleExplicitLod 577 578 Lod 579 + 581: 7(fvec4) Load 562(texel) + 582: 7(fvec4) FAdd 581 580 + Store 562(texel) 582 + 583: 143 Load 145(s2D) + 584: 154(fvec2) Load 156(f16c2) + 585: 6(float) Load 572(f16lod) + 586: 7(fvec4) ImageSampleExplicitLod 583 584 Lod 585 + 587: 7(fvec4) Load 562(texel) + 588: 7(fvec4) FAdd 587 586 + Store 562(texel) 588 + 589: 163 Load 165(s3D) + 590: 167(fvec3) Load 169(c3) + 591: 52(float) Load 565(lod) + 592: 7(fvec4) ImageSampleExplicitLod 589 590 Lod 591 + 593: 7(fvec4) Load 562(texel) + 594: 7(fvec4) FAdd 593 592 + Store 562(texel) 594 + 595: 163 Load 165(s3D) + 596: 175(fvec3) Load 177(f16c3) + 597: 6(float) Load 572(f16lod) + 598: 7(fvec4) ImageSampleExplicitLod 595 596 Lod 597 + 599: 7(fvec4) Load 562(texel) + 600: 7(fvec4) FAdd 599 598 + Store 562(texel) 600 + 601: 184 Load 186(sCube) + 602: 167(fvec3) Load 169(c3) + 603: 52(float) Load 565(lod) + 604: 7(fvec4) ImageSampleExplicitLod 601 602 Lod 603 + 605: 7(fvec4) Load 562(texel) + 606: 7(fvec4) FAdd 605 604 + Store 562(texel) 606 + 607: 184 Load 186(sCube) + 608: 175(fvec3) Load 177(f16c3) + 609: 6(float) Load 572(f16lod) + 610: 7(fvec4) ImageSampleExplicitLod 607 608 Lod 609 + 611: 7(fvec4) Load 562(texel) + 612: 7(fvec4) FAdd 611 610 + Store 562(texel) 612 + 613: 199 Load 201(s1DShadow) + 614: 167(fvec3) Load 169(c3) + 615: 52(float) Load 565(lod) + 616: 52(float) CompositeExtract 614 2 + 617: 6(float) ImageSampleDrefExplicitLod 613 614 616 Lod 615 + 618: 208(ptr) AccessChain 562(texel) 207 + 619: 6(float) Load 618 + 620: 6(float) FAdd 619 617 + 621: 208(ptr) AccessChain 562(texel) 207 + Store 621 620 + 622: 199 Load 201(s1DShadow) + 623: 154(fvec2) Load 156(f16c2) + 624: 52(float) Load 215(compare) + 625: 6(float) Load 572(f16lod) + 626: 6(float) ImageSampleDrefExplicitLod 622 623 624 Lod 625 + 627: 208(ptr) AccessChain 562(texel) 207 + 628: 6(float) Load 627 + 629: 6(float) FAdd 628 626 + 630: 208(ptr) AccessChain 562(texel) 207 + Store 630 629 + 631: 224 Load 226(s2DShadow) + 632: 167(fvec3) Load 169(c3) + 633: 52(float) Load 565(lod) + 634: 52(float) CompositeExtract 632 2 + 635: 6(float) ImageSampleDrefExplicitLod 631 632 634 Lod 633 + 636: 208(ptr) AccessChain 562(texel) 207 + 637: 6(float) Load 636 + 638: 6(float) FAdd 637 635 + 639: 208(ptr) AccessChain 562(texel) 207 + Store 639 638 + 640: 224 Load 226(s2DShadow) + 641: 154(fvec2) Load 156(f16c2) + 642: 52(float) Load 215(compare) + 643: 6(float) Load 572(f16lod) + 644: 6(float) ImageSampleDrefExplicitLod 640 641 642 Lod 643 + 645: 208(ptr) AccessChain 562(texel) 207 + 646: 6(float) Load 645 + 647: 6(float) FAdd 646 644 + 648: 208(ptr) AccessChain 562(texel) 207 + Store 648 647 + 649: 269 Load 271(s1DArray) + 650: 53(fvec2) Load 148(c2) + 651: 52(float) Load 565(lod) + 652: 7(fvec4) ImageSampleExplicitLod 649 650 Lod 651 + 653: 7(fvec4) Load 562(texel) + 654: 7(fvec4) FAdd 653 652 + Store 562(texel) 654 + 655: 269 Load 271(s1DArray) + 656: 154(fvec2) Load 156(f16c2) + 657: 6(float) Load 572(f16lod) + 658: 7(fvec4) ImageSampleExplicitLod 655 656 Lod 657 + 659: 7(fvec4) Load 562(texel) + 660: 7(fvec4) FAdd 659 658 + Store 562(texel) 660 + 661: 284 Load 286(s2DArray) + 662: 167(fvec3) Load 169(c3) + 663: 52(float) Load 565(lod) + 664: 7(fvec4) ImageSampleExplicitLod 661 662 Lod 663 + 665: 7(fvec4) Load 562(texel) + 666: 7(fvec4) FAdd 665 664 + Store 562(texel) 666 + 667: 284 Load 286(s2DArray) + 668: 175(fvec3) Load 177(f16c3) + 669: 6(float) Load 572(f16lod) + 670: 7(fvec4) ImageSampleExplicitLod 667 668 Lod 669 + 671: 7(fvec4) Load 562(texel) + 672: 7(fvec4) FAdd 671 670 + Store 562(texel) 672 + 673: 316 Load 318(s1DArrayShadow) + 674: 167(fvec3) Load 169(c3) + 675: 52(float) Load 565(lod) + 676: 52(float) CompositeExtract 674 2 + 677: 6(float) ImageSampleDrefExplicitLod 673 674 676 Lod 675 + 678: 208(ptr) AccessChain 562(texel) 207 + 679: 6(float) Load 678 + 680: 6(float) FAdd 679 677 + 681: 208(ptr) AccessChain 562(texel) 207 + Store 681 680 + 682: 316 Load 318(s1DArrayShadow) + 683: 154(fvec2) Load 156(f16c2) + 684: 52(float) Load 215(compare) + 685: 6(float) Load 572(f16lod) + 686: 6(float) ImageSampleDrefExplicitLod 682 683 684 Lod 685 + 687: 208(ptr) AccessChain 562(texel) 207 + 688: 6(float) Load 687 + 689: 6(float) FAdd 688 686 + 690: 208(ptr) AccessChain 562(texel) 207 + Store 690 689 + 691: 299 Load 301(sCubeArray) + 692: 249(fvec4) Load 251(c4) + 693: 52(float) Load 565(lod) + 694: 7(fvec4) ImageSampleExplicitLod 691 692 Lod 693 + 695: 7(fvec4) Load 562(texel) + 696: 7(fvec4) FAdd 695 694 + Store 562(texel) 696 + 697: 299 Load 301(sCubeArray) + 698: 7(fvec4) Load 309(f16c4) + 699: 6(float) Load 572(f16lod) + 700: 7(fvec4) ImageSampleExplicitLod 697 698 Lod 699 + 701: 7(fvec4) Load 562(texel) + 702: 7(fvec4) FAdd 701 700 + Store 562(texel) 702 + 703: 7(fvec4) Load 562(texel) + ReturnValue 703 + FunctionEnd +15(testTextureOffset(): 7(fvec4) Function None 8 + 16: Label + 706(texel): 64(ptr) Variable Function + Store 706(texel) 121 + 707: 123 Load 125(s1D) + 708: 52(float) Load 128(c1) + 710: 7(fvec4) ImageSampleImplicitLod 707 708 ConstOffset 709 + 711: 7(fvec4) Load 706(texel) + 712: 7(fvec4) FAdd 711 710 + Store 706(texel) 712 + 713: 123 Load 125(s1D) + 714: 6(float) Load 135(f16c1) + 715: 6(float) Load 137(f16bias) + 716: 7(fvec4) ImageSampleImplicitLod 713 714 Bias ConstOffset 715 709 + 717: 7(fvec4) Load 706(texel) + 718: 7(fvec4) FAdd 717 716 + Store 706(texel) 718 + 719: 143 Load 145(s2D) + 720: 53(fvec2) Load 148(c2) + 723: 7(fvec4) ImageSampleImplicitLod 719 720 ConstOffset 722 + 724: 7(fvec4) Load 706(texel) + 725: 7(fvec4) FAdd 724 723 + Store 706(texel) 725 + 726: 143 Load 145(s2D) + 727: 154(fvec2) Load 156(f16c2) + 728: 6(float) Load 137(f16bias) + 729: 7(fvec4) ImageSampleImplicitLod 726 727 Bias ConstOffset 728 722 + 730: 7(fvec4) Load 706(texel) + 731: 7(fvec4) FAdd 730 729 + Store 706(texel) 731 + 732: 163 Load 165(s3D) + 733: 167(fvec3) Load 169(c3) + 736: 7(fvec4) ImageSampleImplicitLod 732 733 ConstOffset 735 + 737: 7(fvec4) Load 706(texel) + 738: 7(fvec4) FAdd 737 736 + Store 706(texel) 738 + 739: 163 Load 165(s3D) + 740: 175(fvec3) Load 177(f16c3) + 741: 6(float) Load 137(f16bias) + 742: 7(fvec4) ImageSampleImplicitLod 739 740 Bias ConstOffset 741 735 + 743: 7(fvec4) Load 706(texel) + 744: 7(fvec4) FAdd 743 742 + Store 706(texel) 744 + 745: 357 Load 359(s2DRect) + 746: 53(fvec2) Load 148(c2) + 747: 7(fvec4) ImageSampleImplicitLod 745 746 ConstOffset 722 + 748: 7(fvec4) Load 706(texel) + 749: 7(fvec4) FAdd 748 747 + Store 706(texel) 749 + 750: 357 Load 359(s2DRect) + 751: 154(fvec2) Load 156(f16c2) + 752: 7(fvec4) ImageSampleImplicitLod 750 751 ConstOffset 722 + 753: 7(fvec4) Load 706(texel) + 754: 7(fvec4) FAdd 753 752 + Store 706(texel) 754 + 755: 371 Load 373(s2DRectShadow) + 756: 167(fvec3) Load 169(c3) + 757: 52(float) CompositeExtract 756 2 + 758: 6(float) ImageSampleDrefImplicitLod 755 756 757 ConstOffset 722 + 759: 208(ptr) AccessChain 706(texel) 207 + 760: 6(float) Load 759 + 761: 6(float) FAdd 760 758 + 762: 208(ptr) AccessChain 706(texel) 207 + Store 762 761 + 763: 371 Load 373(s2DRectShadow) + 764: 154(fvec2) Load 156(f16c2) + 765: 52(float) Load 215(compare) + 766: 6(float) ImageSampleDrefImplicitLod 763 764 765 ConstOffset 722 + 767: 208(ptr) AccessChain 706(texel) 207 + 768: 6(float) Load 767 + 769: 6(float) FAdd 768 766 + 770: 208(ptr) AccessChain 706(texel) 207 + Store 770 769 + 771: 199 Load 201(s1DShadow) + 772: 167(fvec3) Load 169(c3) + 773: 52(float) CompositeExtract 772 2 + 774: 6(float) ImageSampleDrefImplicitLod 771 772 773 ConstOffset 709 + 775: 208(ptr) AccessChain 706(texel) 207 + 776: 6(float) Load 775 + 777: 6(float) FAdd 776 774 + 778: 208(ptr) AccessChain 706(texel) 207 + Store 778 777 + 779: 199 Load 201(s1DShadow) + 780: 154(fvec2) Load 156(f16c2) + 781: 52(float) Load 215(compare) + 782: 6(float) Load 137(f16bias) + 783: 6(float) ImageSampleDrefImplicitLod 779 780 781 Bias ConstOffset 782 709 + 784: 208(ptr) AccessChain 706(texel) 207 + 785: 6(float) Load 784 + 786: 6(float) FAdd 785 783 + 787: 208(ptr) AccessChain 706(texel) 207 + Store 787 786 + 788: 224 Load 226(s2DShadow) + 789: 167(fvec3) Load 169(c3) + 790: 52(float) CompositeExtract 789 2 + 791: 6(float) ImageSampleDrefImplicitLod 788 789 790 ConstOffset 722 + 792: 208(ptr) AccessChain 706(texel) 207 + 793: 6(float) Load 792 + 794: 6(float) FAdd 793 791 + 795: 208(ptr) AccessChain 706(texel) 207 + Store 795 794 + 796: 224 Load 226(s2DShadow) + 797: 154(fvec2) Load 156(f16c2) + 798: 52(float) Load 215(compare) + 799: 6(float) Load 137(f16bias) + 800: 6(float) ImageSampleDrefImplicitLod 796 797 798 Bias ConstOffset 799 722 + 801: 208(ptr) AccessChain 706(texel) 207 + 802: 6(float) Load 801 + 803: 6(float) FAdd 802 800 + 804: 208(ptr) AccessChain 706(texel) 207 + Store 804 803 + 805: 269 Load 271(s1DArray) + 806: 53(fvec2) Load 148(c2) + 807: 7(fvec4) ImageSampleImplicitLod 805 806 ConstOffset 709 + 808: 7(fvec4) Load 706(texel) + 809: 7(fvec4) FAdd 808 807 + Store 706(texel) 809 + 810: 269 Load 271(s1DArray) + 811: 154(fvec2) Load 156(f16c2) + 812: 6(float) Load 137(f16bias) + 813: 7(fvec4) ImageSampleImplicitLod 810 811 Bias ConstOffset 812 709 + 814: 7(fvec4) Load 706(texel) + 815: 7(fvec4) FAdd 814 813 + Store 706(texel) 815 + 816: 284 Load 286(s2DArray) + 817: 167(fvec3) Load 169(c3) + 818: 7(fvec4) ImageSampleImplicitLod 816 817 ConstOffset 722 + 819: 7(fvec4) Load 706(texel) + 820: 7(fvec4) FAdd 819 818 + Store 706(texel) 820 + 821: 284 Load 286(s2DArray) + 822: 175(fvec3) Load 177(f16c3) + 823: 6(float) Load 137(f16bias) + 824: 7(fvec4) ImageSampleImplicitLod 821 822 Bias ConstOffset 823 722 + 825: 7(fvec4) Load 706(texel) + 826: 7(fvec4) FAdd 825 824 + Store 706(texel) 826 + 827: 316 Load 318(s1DArrayShadow) + 828: 167(fvec3) Load 169(c3) + 829: 52(float) CompositeExtract 828 2 + 830: 6(float) ImageSampleDrefImplicitLod 827 828 829 ConstOffset 709 + 831: 208(ptr) AccessChain 706(texel) 207 + 832: 6(float) Load 831 + 833: 6(float) FAdd 832 830 + 834: 208(ptr) AccessChain 706(texel) 207 + Store 834 833 + 835: 316 Load 318(s1DArrayShadow) + 836: 154(fvec2) Load 156(f16c2) + 837: 52(float) Load 215(compare) + 838: 6(float) Load 137(f16bias) + 839: 6(float) ImageSampleDrefImplicitLod 835 836 837 Bias ConstOffset 838 709 + 840: 208(ptr) AccessChain 706(texel) 207 + 841: 6(float) Load 840 + 842: 6(float) FAdd 841 839 + 843: 208(ptr) AccessChain 706(texel) 207 + Store 843 842 + 844: 337 Load 339(s2DArrayShadow) + 845: 249(fvec4) Load 251(c4) + 846: 52(float) CompositeExtract 845 3 + 847: 6(float) ImageSampleDrefImplicitLod 844 845 846 ConstOffset 722 + 848: 208(ptr) AccessChain 706(texel) 207 + 849: 6(float) Load 848 + 850: 6(float) FAdd 849 847 + 851: 208(ptr) AccessChain 706(texel) 207 + Store 851 850 + 852: 337 Load 339(s2DArrayShadow) + 853: 175(fvec3) Load 177(f16c3) + 854: 52(float) Load 215(compare) + 855: 6(float) ImageSampleDrefImplicitLod 852 853 854 ConstOffset 722 + 856: 208(ptr) AccessChain 706(texel) 207 + 857: 6(float) Load 856 + 858: 6(float) FAdd 857 855 + 859: 208(ptr) AccessChain 706(texel) 207 + Store 859 858 + 860: 7(fvec4) Load 706(texel) + ReturnValue 860 + FunctionEnd +17(testTextureProjOffset(): 7(fvec4) Function None 8 + 18: Label + 863(texel): 64(ptr) Variable Function + Store 863(texel) 121 + 864: 123 Load 125(s1D) + 865: 53(fvec2) Load 148(c2) + 866: 7(fvec4) ImageSampleProjImplicitLod 864 865 ConstOffset 709 + 867: 7(fvec4) Load 863(texel) + 868: 7(fvec4) FAdd 867 866 + Store 863(texel) 868 + 869: 123 Load 125(s1D) + 870: 154(fvec2) Load 156(f16c2) + 871: 6(float) Load 137(f16bias) + 872: 7(fvec4) ImageSampleProjImplicitLod 869 870 Bias ConstOffset 871 709 + 873: 7(fvec4) Load 863(texel) + 874: 7(fvec4) FAdd 873 872 + Store 863(texel) 874 + 875: 123 Load 125(s1D) + 876: 249(fvec4) Load 251(c4) + 877: 52(float) CompositeExtract 876 3 + 878: 249(fvec4) CompositeInsert 877 876 1 + 879: 7(fvec4) ImageSampleProjImplicitLod 875 878 ConstOffset 709 + 880: 7(fvec4) Load 863(texel) + 881: 7(fvec4) FAdd 880 879 + Store 863(texel) 881 + 882: 123 Load 125(s1D) + 883: 7(fvec4) Load 309(f16c4) + 884: 6(float) Load 137(f16bias) + 885: 6(float) CompositeExtract 883 3 + 886: 7(fvec4) CompositeInsert 885 883 1 + 887: 7(fvec4) ImageSampleProjImplicitLod 882 886 Bias ConstOffset 884 709 + 888: 7(fvec4) Load 863(texel) + 889: 7(fvec4) FAdd 888 887 + Store 863(texel) 889 + 890: 143 Load 145(s2D) + 891: 167(fvec3) Load 169(c3) + 892: 7(fvec4) ImageSampleProjImplicitLod 890 891 ConstOffset 722 + 893: 7(fvec4) Load 863(texel) + 894: 7(fvec4) FAdd 893 892 + Store 863(texel) 894 + 895: 143 Load 145(s2D) + 896: 175(fvec3) Load 177(f16c3) + 897: 6(float) Load 137(f16bias) + 898: 7(fvec4) ImageSampleProjImplicitLod 895 896 Bias ConstOffset 897 722 + 899: 7(fvec4) Load 863(texel) + 900: 7(fvec4) FAdd 899 898 + Store 863(texel) 900 + 901: 143 Load 145(s2D) + 902: 249(fvec4) Load 251(c4) + 903: 52(float) CompositeExtract 902 3 + 904: 249(fvec4) CompositeInsert 903 902 2 + 905: 7(fvec4) ImageSampleProjImplicitLod 901 904 ConstOffset 722 + 906: 7(fvec4) Load 863(texel) + 907: 7(fvec4) FAdd 906 905 + Store 863(texel) 907 + 908: 143 Load 145(s2D) + 909: 7(fvec4) Load 309(f16c4) + 910: 6(float) Load 137(f16bias) + 911: 6(float) CompositeExtract 909 3 + 912: 7(fvec4) CompositeInsert 911 909 2 + 913: 7(fvec4) ImageSampleProjImplicitLod 908 912 Bias ConstOffset 910 722 + 914: 7(fvec4) Load 863(texel) + 915: 7(fvec4) FAdd 914 913 + Store 863(texel) 915 + 916: 163 Load 165(s3D) + 917: 249(fvec4) Load 251(c4) + 918: 7(fvec4) ImageSampleProjImplicitLod 916 917 ConstOffset 735 + 919: 7(fvec4) Load 863(texel) + 920: 7(fvec4) FAdd 919 918 + Store 863(texel) 920 + 921: 163 Load 165(s3D) + 922: 7(fvec4) Load 309(f16c4) + 923: 6(float) Load 137(f16bias) + 924: 7(fvec4) ImageSampleProjImplicitLod 921 922 Bias ConstOffset 923 735 + 925: 7(fvec4) Load 863(texel) + 926: 7(fvec4) FAdd 925 924 + Store 863(texel) 926 + 927: 357 Load 359(s2DRect) + 928: 167(fvec3) Load 169(c3) + 929: 7(fvec4) ImageSampleProjImplicitLod 927 928 ConstOffset 722 + 930: 7(fvec4) Load 863(texel) + 931: 7(fvec4) FAdd 930 929 + Store 863(texel) 931 + 932: 357 Load 359(s2DRect) + 933: 175(fvec3) Load 177(f16c3) + 934: 7(fvec4) ImageSampleProjImplicitLod 932 933 ConstOffset 722 + 935: 7(fvec4) Load 863(texel) + 936: 7(fvec4) FAdd 935 934 + Store 863(texel) 936 + 937: 357 Load 359(s2DRect) + 938: 249(fvec4) Load 251(c4) + 939: 52(float) CompositeExtract 938 3 + 940: 249(fvec4) CompositeInsert 939 938 2 + 941: 7(fvec4) ImageSampleProjImplicitLod 937 940 ConstOffset 722 + 942: 7(fvec4) Load 863(texel) + 943: 7(fvec4) FAdd 942 941 + Store 863(texel) 943 + 944: 357 Load 359(s2DRect) + 945: 7(fvec4) Load 309(f16c4) + 946: 6(float) CompositeExtract 945 3 + 947: 7(fvec4) CompositeInsert 946 945 2 + 948: 7(fvec4) ImageSampleProjImplicitLod 944 947 ConstOffset 722 + 949: 7(fvec4) Load 863(texel) + 950: 7(fvec4) FAdd 949 948 + Store 863(texel) 950 + 951: 371 Load 373(s2DRectShadow) + 952: 249(fvec4) Load 251(c4) + 953: 52(float) CompositeExtract 952 2 + 954: 52(float) CompositeExtract 952 3 + 955: 249(fvec4) CompositeInsert 954 952 2 + 956: 6(float) ImageSampleProjDrefImplicitLod 951 955 953 ConstOffset 722 + 957: 208(ptr) AccessChain 863(texel) 207 + 958: 6(float) Load 957 + 959: 6(float) FAdd 958 956 + 960: 208(ptr) AccessChain 863(texel) 207 + Store 960 959 + 961: 371 Load 373(s2DRectShadow) + 962: 175(fvec3) Load 177(f16c3) + 963: 52(float) Load 215(compare) + 964: 6(float) ImageSampleProjDrefImplicitLod 961 962 963 ConstOffset 722 + 965: 208(ptr) AccessChain 863(texel) 207 + 966: 6(float) Load 965 + 967: 6(float) FAdd 966 964 + 968: 208(ptr) AccessChain 863(texel) 207 + Store 968 967 + 969: 199 Load 201(s1DShadow) + 970: 249(fvec4) Load 251(c4) + 971: 52(float) CompositeExtract 970 2 + 972: 52(float) CompositeExtract 970 3 + 973: 249(fvec4) CompositeInsert 972 970 1 + 974: 6(float) ImageSampleProjDrefImplicitLod 969 973 971 ConstOffset 709 + 975: 208(ptr) AccessChain 863(texel) 207 + 976: 6(float) Load 975 + 977: 6(float) FAdd 976 974 + 978: 208(ptr) AccessChain 863(texel) 207 + Store 978 977 + 979: 199 Load 201(s1DShadow) + 980: 175(fvec3) Load 177(f16c3) + 981: 52(float) Load 215(compare) + 982: 6(float) Load 137(f16bias) + 983: 6(float) CompositeExtract 980 2 + 984: 175(fvec3) CompositeInsert 983 980 1 + 985: 6(float) ImageSampleProjDrefImplicitLod 979 984 981 Bias ConstOffset 982 709 + 986: 208(ptr) AccessChain 863(texel) 207 + 987: 6(float) Load 986 + 988: 6(float) FAdd 987 985 + 989: 208(ptr) AccessChain 863(texel) 207 + Store 989 988 + 990: 224 Load 226(s2DShadow) + 991: 249(fvec4) Load 251(c4) + 992: 52(float) CompositeExtract 991 2 + 993: 52(float) CompositeExtract 991 3 + 994: 249(fvec4) CompositeInsert 993 991 2 + 995: 6(float) ImageSampleProjDrefImplicitLod 990 994 992 ConstOffset 722 + 996: 208(ptr) AccessChain 863(texel) 207 + 997: 6(float) Load 996 + 998: 6(float) FAdd 997 995 + 999: 208(ptr) AccessChain 863(texel) 207 + Store 999 998 + 1000: 224 Load 226(s2DShadow) + 1001: 175(fvec3) Load 177(f16c3) + 1002: 52(float) Load 215(compare) + 1003: 6(float) Load 137(f16bias) + 1004: 6(float) ImageSampleProjDrefImplicitLod 1000 1001 1002 Bias ConstOffset 1003 722 + 1005: 208(ptr) AccessChain 863(texel) 207 + 1006: 6(float) Load 1005 + 1007: 6(float) FAdd 1006 1004 + 1008: 208(ptr) AccessChain 863(texel) 207 + Store 1008 1007 + 1009: 7(fvec4) Load 863(texel) + ReturnValue 1009 + FunctionEnd +19(testTextureLodOffset(): 7(fvec4) Function None 8 + 20: Label + 1012(texel): 64(ptr) Variable Function + Store 1012(texel) 121 + 1013: 123 Load 125(s1D) + 1014: 52(float) Load 128(c1) + 1015: 52(float) Load 565(lod) + 1016: 7(fvec4) ImageSampleExplicitLod 1013 1014 Lod ConstOffset 1015 709 + 1017: 7(fvec4) Load 1012(texel) + 1018: 7(fvec4) FAdd 1017 1016 + Store 1012(texel) 1018 + 1019: 123 Load 125(s1D) + 1020: 6(float) Load 135(f16c1) + 1021: 6(float) Load 572(f16lod) + 1022: 7(fvec4) ImageSampleExplicitLod 1019 1020 Lod ConstOffset 1021 709 + 1023: 7(fvec4) Load 1012(texel) + 1024: 7(fvec4) FAdd 1023 1022 + Store 1012(texel) 1024 + 1025: 143 Load 145(s2D) + 1026: 53(fvec2) Load 148(c2) + 1027: 52(float) Load 565(lod) + 1028: 7(fvec4) ImageSampleExplicitLod 1025 1026 Lod ConstOffset 1027 722 + 1029: 7(fvec4) Load 1012(texel) + 1030: 7(fvec4) FAdd 1029 1028 + Store 1012(texel) 1030 + 1031: 143 Load 145(s2D) + 1032: 154(fvec2) Load 156(f16c2) + 1033: 6(float) Load 572(f16lod) + 1034: 7(fvec4) ImageSampleExplicitLod 1031 1032 Lod ConstOffset 1033 722 + 1035: 7(fvec4) Load 1012(texel) + 1036: 7(fvec4) FAdd 1035 1034 + Store 1012(texel) 1036 + 1037: 163 Load 165(s3D) + 1038: 167(fvec3) Load 169(c3) + 1039: 52(float) Load 565(lod) + 1040: 7(fvec4) ImageSampleExplicitLod 1037 1038 Lod ConstOffset 1039 735 + 1041: 7(fvec4) Load 1012(texel) + 1042: 7(fvec4) FAdd 1041 1040 + Store 1012(texel) 1042 + 1043: 163 Load 165(s3D) + 1044: 175(fvec3) Load 177(f16c3) + 1045: 6(float) Load 572(f16lod) + 1046: 7(fvec4) ImageSampleExplicitLod 1043 1044 Lod ConstOffset 1045 735 + 1047: 7(fvec4) Load 1012(texel) + 1048: 7(fvec4) FAdd 1047 1046 + Store 1012(texel) 1048 + 1049: 199 Load 201(s1DShadow) + 1050: 167(fvec3) Load 169(c3) + 1051: 52(float) Load 565(lod) + 1052: 52(float) CompositeExtract 1050 2 + 1053: 6(float) ImageSampleDrefExplicitLod 1049 1050 1052 Lod ConstOffset 1051 709 + 1054: 208(ptr) AccessChain 1012(texel) 207 + 1055: 6(float) Load 1054 + 1056: 6(float) FAdd 1055 1053 + 1057: 208(ptr) AccessChain 1012(texel) 207 + Store 1057 1056 + 1058: 199 Load 201(s1DShadow) + 1059: 154(fvec2) Load 156(f16c2) + 1060: 52(float) Load 215(compare) + 1061: 6(float) Load 572(f16lod) + 1062: 6(float) ImageSampleDrefExplicitLod 1058 1059 1060 Lod ConstOffset 1061 709 + 1063: 208(ptr) AccessChain 1012(texel) 207 + 1064: 6(float) Load 1063 + 1065: 6(float) FAdd 1064 1062 + 1066: 208(ptr) AccessChain 1012(texel) 207 + Store 1066 1065 + 1067: 224 Load 226(s2DShadow) + 1068: 167(fvec3) Load 169(c3) + 1069: 52(float) Load 565(lod) + 1070: 52(float) CompositeExtract 1068 2 + 1071: 6(float) ImageSampleDrefExplicitLod 1067 1068 1070 Lod ConstOffset 1069 722 + 1072: 208(ptr) AccessChain 1012(texel) 207 + 1073: 6(float) Load 1072 + 1074: 6(float) FAdd 1073 1071 + 1075: 208(ptr) AccessChain 1012(texel) 207 + Store 1075 1074 + 1076: 224 Load 226(s2DShadow) + 1077: 154(fvec2) Load 156(f16c2) + 1078: 52(float) Load 215(compare) + 1079: 6(float) Load 572(f16lod) + 1080: 6(float) ImageSampleDrefExplicitLod 1076 1077 1078 Lod ConstOffset 1079 722 + 1081: 208(ptr) AccessChain 1012(texel) 207 + 1082: 6(float) Load 1081 + 1083: 6(float) FAdd 1082 1080 + 1084: 208(ptr) AccessChain 1012(texel) 207 + Store 1084 1083 + 1085: 269 Load 271(s1DArray) + 1086: 53(fvec2) Load 148(c2) + 1087: 52(float) Load 565(lod) + 1088: 7(fvec4) ImageSampleExplicitLod 1085 1086 Lod ConstOffset 1087 709 + 1089: 7(fvec4) Load 1012(texel) + 1090: 7(fvec4) FAdd 1089 1088 + Store 1012(texel) 1090 + 1091: 269 Load 271(s1DArray) + 1092: 154(fvec2) Load 156(f16c2) + 1093: 6(float) Load 572(f16lod) + 1094: 7(fvec4) ImageSampleExplicitLod 1091 1092 Lod ConstOffset 1093 709 + 1095: 7(fvec4) Load 1012(texel) + 1096: 7(fvec4) FAdd 1095 1094 + Store 1012(texel) 1096 + 1097: 284 Load 286(s2DArray) + 1098: 167(fvec3) Load 169(c3) + 1099: 52(float) Load 565(lod) + 1100: 7(fvec4) ImageSampleExplicitLod 1097 1098 Lod ConstOffset 1099 722 + 1101: 7(fvec4) Load 1012(texel) + 1102: 7(fvec4) FAdd 1101 1100 + Store 1012(texel) 1102 + 1103: 284 Load 286(s2DArray) + 1104: 175(fvec3) Load 177(f16c3) + 1105: 6(float) Load 572(f16lod) + 1106: 7(fvec4) ImageSampleExplicitLod 1103 1104 Lod ConstOffset 1105 722 + 1107: 7(fvec4) Load 1012(texel) + 1108: 7(fvec4) FAdd 1107 1106 + Store 1012(texel) 1108 + 1109: 316 Load 318(s1DArrayShadow) + 1110: 167(fvec3) Load 169(c3) + 1111: 52(float) Load 565(lod) + 1112: 52(float) CompositeExtract 1110 2 + 1113: 6(float) ImageSampleDrefExplicitLod 1109 1110 1112 Lod ConstOffset 1111 709 + 1114: 208(ptr) AccessChain 1012(texel) 207 + 1115: 6(float) Load 1114 + 1116: 6(float) FAdd 1115 1113 + 1117: 208(ptr) AccessChain 1012(texel) 207 + Store 1117 1116 + 1118: 316 Load 318(s1DArrayShadow) + 1119: 154(fvec2) Load 156(f16c2) + 1120: 52(float) Load 215(compare) + 1121: 6(float) Load 572(f16lod) + 1122: 6(float) ImageSampleDrefExplicitLod 1118 1119 1120 Lod ConstOffset 1121 709 + 1123: 208(ptr) AccessChain 1012(texel) 207 + 1124: 6(float) Load 1123 + 1125: 6(float) FAdd 1124 1122 + 1126: 208(ptr) AccessChain 1012(texel) 207 + Store 1126 1125 + 1127: 7(fvec4) Load 1012(texel) + ReturnValue 1127 + FunctionEnd +21(testTextureProjLodOffset(): 7(fvec4) Function None 8 + 22: Label + 1130(texel): 64(ptr) Variable Function + Store 1130(texel) 121 + 1131: 123 Load 125(s1D) + 1132: 53(fvec2) Load 148(c2) + 1133: 52(float) Load 565(lod) + 1134: 7(fvec4) ImageSampleProjExplicitLod 1131 1132 Lod ConstOffset 1133 709 + 1135: 7(fvec4) Load 1130(texel) + 1136: 7(fvec4) FAdd 1135 1134 + Store 1130(texel) 1136 + 1137: 123 Load 125(s1D) + 1138: 154(fvec2) Load 156(f16c2) + 1139: 6(float) Load 572(f16lod) + 1140: 7(fvec4) ImageSampleProjExplicitLod 1137 1138 Lod ConstOffset 1139 709 + 1141: 7(fvec4) Load 1130(texel) + 1142: 7(fvec4) FAdd 1141 1140 + Store 1130(texel) 1142 + 1143: 123 Load 125(s1D) + 1144: 249(fvec4) Load 251(c4) + 1145: 52(float) Load 565(lod) + 1146: 52(float) CompositeExtract 1144 3 + 1147: 249(fvec4) CompositeInsert 1146 1144 1 + 1148: 7(fvec4) ImageSampleProjExplicitLod 1143 1147 Lod ConstOffset 1145 709 + 1149: 7(fvec4) Load 1130(texel) + 1150: 7(fvec4) FAdd 1149 1148 + Store 1130(texel) 1150 + 1151: 123 Load 125(s1D) + 1152: 7(fvec4) Load 309(f16c4) + 1153: 6(float) Load 572(f16lod) + 1154: 6(float) CompositeExtract 1152 3 + 1155: 7(fvec4) CompositeInsert 1154 1152 1 + 1156: 7(fvec4) ImageSampleProjExplicitLod 1151 1155 Lod ConstOffset 1153 709 + 1157: 7(fvec4) Load 1130(texel) + 1158: 7(fvec4) FAdd 1157 1156 + Store 1130(texel) 1158 + 1159: 143 Load 145(s2D) + 1160: 167(fvec3) Load 169(c3) + 1161: 52(float) Load 565(lod) + 1162: 7(fvec4) ImageSampleProjExplicitLod 1159 1160 Lod ConstOffset 1161 722 + 1163: 7(fvec4) Load 1130(texel) + 1164: 7(fvec4) FAdd 1163 1162 + Store 1130(texel) 1164 + 1165: 143 Load 145(s2D) + 1166: 175(fvec3) Load 177(f16c3) + 1167: 6(float) Load 572(f16lod) + 1168: 7(fvec4) ImageSampleProjExplicitLod 1165 1166 Lod ConstOffset 1167 722 + 1169: 7(fvec4) Load 1130(texel) + 1170: 7(fvec4) FAdd 1169 1168 + Store 1130(texel) 1170 + 1171: 143 Load 145(s2D) + 1172: 249(fvec4) Load 251(c4) + 1173: 52(float) Load 565(lod) + 1174: 52(float) CompositeExtract 1172 3 + 1175: 249(fvec4) CompositeInsert 1174 1172 2 + 1176: 7(fvec4) ImageSampleProjExplicitLod 1171 1175 Lod ConstOffset 1173 722 + 1177: 7(fvec4) Load 1130(texel) + 1178: 7(fvec4) FAdd 1177 1176 + Store 1130(texel) 1178 + 1179: 143 Load 145(s2D) + 1180: 7(fvec4) Load 309(f16c4) + 1181: 6(float) Load 572(f16lod) + 1182: 6(float) CompositeExtract 1180 3 + 1183: 7(fvec4) CompositeInsert 1182 1180 2 + 1184: 7(fvec4) ImageSampleProjExplicitLod 1179 1183 Lod ConstOffset 1181 722 + 1185: 7(fvec4) Load 1130(texel) + 1186: 7(fvec4) FAdd 1185 1184 + Store 1130(texel) 1186 + 1187: 163 Load 165(s3D) + 1188: 249(fvec4) Load 251(c4) + 1189: 52(float) Load 565(lod) + 1190: 7(fvec4) ImageSampleProjExplicitLod 1187 1188 Lod ConstOffset 1189 735 + 1191: 7(fvec4) Load 1130(texel) + 1192: 7(fvec4) FAdd 1191 1190 + Store 1130(texel) 1192 + 1193: 163 Load 165(s3D) + 1194: 7(fvec4) Load 309(f16c4) + 1195: 6(float) Load 572(f16lod) + 1196: 7(fvec4) ImageSampleProjExplicitLod 1193 1194 Lod ConstOffset 1195 735 + 1197: 7(fvec4) Load 1130(texel) + 1198: 7(fvec4) FAdd 1197 1196 + Store 1130(texel) 1198 + 1199: 199 Load 201(s1DShadow) + 1200: 249(fvec4) Load 251(c4) + 1201: 52(float) Load 565(lod) + 1202: 52(float) CompositeExtract 1200 2 + 1203: 52(float) CompositeExtract 1200 3 + 1204: 249(fvec4) CompositeInsert 1203 1200 1 + 1205: 6(float) ImageSampleProjDrefExplicitLod 1199 1204 1202 Lod ConstOffset 1201 709 + 1206: 208(ptr) AccessChain 1130(texel) 207 + 1207: 6(float) Load 1206 + 1208: 6(float) FAdd 1207 1205 + 1209: 208(ptr) AccessChain 1130(texel) 207 + Store 1209 1208 + 1210: 199 Load 201(s1DShadow) + 1211: 175(fvec3) Load 177(f16c3) + 1212: 52(float) Load 215(compare) + 1213: 6(float) Load 572(f16lod) + 1214: 6(float) CompositeExtract 1211 2 + 1215: 175(fvec3) CompositeInsert 1214 1211 1 + 1216: 6(float) ImageSampleProjDrefExplicitLod 1210 1215 1212 Lod ConstOffset 1213 709 + 1217: 208(ptr) AccessChain 1130(texel) 207 + 1218: 6(float) Load 1217 + 1219: 6(float) FAdd 1218 1216 + 1220: 208(ptr) AccessChain 1130(texel) 207 + Store 1220 1219 + 1221: 224 Load 226(s2DShadow) + 1222: 249(fvec4) Load 251(c4) + 1223: 52(float) Load 565(lod) + 1224: 52(float) CompositeExtract 1222 2 + 1225: 52(float) CompositeExtract 1222 3 + 1226: 249(fvec4) CompositeInsert 1225 1222 2 + 1227: 6(float) ImageSampleProjDrefExplicitLod 1221 1226 1224 Lod ConstOffset 1223 722 + 1228: 208(ptr) AccessChain 1130(texel) 207 + 1229: 6(float) Load 1228 + 1230: 6(float) FAdd 1229 1227 + 1231: 208(ptr) AccessChain 1130(texel) 207 + Store 1231 1230 + 1232: 224 Load 226(s2DShadow) + 1233: 175(fvec3) Load 177(f16c3) + 1234: 52(float) Load 215(compare) + 1235: 6(float) Load 572(f16lod) + 1236: 6(float) ImageSampleProjDrefExplicitLod 1232 1233 1234 Lod ConstOffset 1235 722 + 1237: 208(ptr) AccessChain 1130(texel) 207 + 1238: 6(float) Load 1237 + 1239: 6(float) FAdd 1238 1236 + 1240: 208(ptr) AccessChain 1130(texel) 207 + Store 1240 1239 + 1241: 7(fvec4) Load 1130(texel) + ReturnValue 1241 + FunctionEnd +23(testTexelFetch(): 7(fvec4) Function None 8 + 24: Label + 1244(texel): 64(ptr) Variable Function + Store 1244(texel) 121 + 1245: 123 Load 125(s1D) + 1246: 52(float) Load 128(c1) + 1247: 47(int) ConvertFToS 1246 + 1248: 52(float) Load 565(lod) + 1249: 47(int) ConvertFToS 1248 + 1250: 122 Image 1245 + 1251: 7(fvec4) ImageFetch 1250 1247 Lod 1249 + 1252: 7(fvec4) Load 1244(texel) + 1253: 7(fvec4) FAdd 1252 1251 + Store 1244(texel) 1253 + 1254: 143 Load 145(s2D) + 1255: 53(fvec2) Load 148(c2) + 1256: 721(ivec2) ConvertFToS 1255 + 1257: 52(float) Load 565(lod) + 1258: 47(int) ConvertFToS 1257 + 1259: 142 Image 1254 + 1260: 7(fvec4) ImageFetch 1259 1256 Lod 1258 + 1261: 7(fvec4) Load 1244(texel) + 1262: 7(fvec4) FAdd 1261 1260 + Store 1244(texel) 1262 + 1263: 163 Load 165(s3D) + 1264: 167(fvec3) Load 169(c3) + 1265: 734(ivec3) ConvertFToS 1264 + 1266: 52(float) Load 565(lod) + 1267: 47(int) ConvertFToS 1266 + 1268: 162 Image 1263 + 1269: 7(fvec4) ImageFetch 1268 1265 Lod 1267 + 1270: 7(fvec4) Load 1244(texel) + 1271: 7(fvec4) FAdd 1270 1269 + Store 1244(texel) 1271 + 1272: 357 Load 359(s2DRect) + 1273: 53(fvec2) Load 148(c2) + 1274: 721(ivec2) ConvertFToS 1273 + 1275: 356 Image 1272 + 1276: 7(fvec4) ImageFetch 1275 1274 + 1277: 7(fvec4) Load 1244(texel) + 1278: 7(fvec4) FAdd 1277 1276 + Store 1244(texel) 1278 + 1279: 269 Load 271(s1DArray) + 1280: 53(fvec2) Load 148(c2) + 1281: 721(ivec2) ConvertFToS 1280 + 1282: 52(float) Load 565(lod) + 1283: 47(int) ConvertFToS 1282 + 1284: 268 Image 1279 + 1285: 7(fvec4) ImageFetch 1284 1281 Lod 1283 + 1286: 7(fvec4) Load 1244(texel) + 1287: 7(fvec4) FAdd 1286 1285 + Store 1244(texel) 1287 + 1288: 284 Load 286(s2DArray) + 1289: 167(fvec3) Load 169(c3) + 1290: 734(ivec3) ConvertFToS 1289 + 1291: 52(float) Load 565(lod) + 1292: 47(int) ConvertFToS 1291 + 1293: 283 Image 1288 + 1294: 7(fvec4) ImageFetch 1293 1290 Lod 1292 + 1295: 7(fvec4) Load 1244(texel) + 1296: 7(fvec4) FAdd 1295 1294 + Store 1244(texel) 1296 + 1301: 1298 Load 1300(sBuffer) + 1302: 52(float) Load 128(c1) + 1303: 47(int) ConvertFToS 1302 + 1304: 1297 Image 1301 + 1305: 7(fvec4) ImageFetch 1304 1303 + 1306: 7(fvec4) Load 1244(texel) + 1307: 7(fvec4) FAdd 1306 1305 + Store 1244(texel) 1307 + 1312: 1309 Load 1311(s2DMS) + 1313: 53(fvec2) Load 148(c2) + 1314: 721(ivec2) ConvertFToS 1313 + 1315: 1308 Image 1312 + 1316: 7(fvec4) ImageFetch 1315 1314 Sample 709 + 1317: 7(fvec4) Load 1244(texel) + 1318: 7(fvec4) FAdd 1317 1316 + Store 1244(texel) 1318 + 1323: 1320 Load 1322(s2DMSArray) + 1324: 167(fvec3) Load 169(c3) + 1325: 734(ivec3) ConvertFToS 1324 + 1327: 1319 Image 1323 + 1328: 7(fvec4) ImageFetch 1327 1325 Sample 1326 + 1329: 7(fvec4) Load 1244(texel) + 1330: 7(fvec4) FAdd 1329 1328 + Store 1244(texel) 1330 + 1331: 7(fvec4) Load 1244(texel) + ReturnValue 1331 + FunctionEnd +25(testTexelFetchOffset(): 7(fvec4) Function None 8 + 26: Label + 1334(texel): 64(ptr) Variable Function + Store 1334(texel) 121 + 1335: 123 Load 125(s1D) + 1336: 52(float) Load 128(c1) + 1337: 47(int) ConvertFToS 1336 + 1338: 52(float) Load 565(lod) + 1339: 47(int) ConvertFToS 1338 + 1340: 122 Image 1335 + 1341: 7(fvec4) ImageFetch 1340 1337 Lod ConstOffset 1339 709 + 1342: 7(fvec4) Load 1334(texel) + 1343: 7(fvec4) FAdd 1342 1341 + Store 1334(texel) 1343 + 1344: 143 Load 145(s2D) + 1345: 53(fvec2) Load 148(c2) + 1346: 721(ivec2) ConvertFToS 1345 + 1347: 52(float) Load 565(lod) + 1348: 47(int) ConvertFToS 1347 + 1349: 142 Image 1344 + 1350: 7(fvec4) ImageFetch 1349 1346 Lod ConstOffset 1348 722 + 1351: 7(fvec4) Load 1334(texel) + 1352: 7(fvec4) FAdd 1351 1350 + Store 1334(texel) 1352 + 1353: 163 Load 165(s3D) + 1354: 167(fvec3) Load 169(c3) + 1355: 734(ivec3) ConvertFToS 1354 + 1356: 52(float) Load 565(lod) + 1357: 47(int) ConvertFToS 1356 + 1358: 162 Image 1353 + 1359: 7(fvec4) ImageFetch 1358 1355 Lod ConstOffset 1357 735 + 1360: 7(fvec4) Load 1334(texel) + 1361: 7(fvec4) FAdd 1360 1359 + Store 1334(texel) 1361 + 1362: 357 Load 359(s2DRect) + 1363: 53(fvec2) Load 148(c2) + 1364: 721(ivec2) ConvertFToS 1363 + 1365: 356 Image 1362 + 1366: 7(fvec4) ImageFetch 1365 1364 ConstOffset 722 + 1367: 7(fvec4) Load 1334(texel) + 1368: 7(fvec4) FAdd 1367 1366 + Store 1334(texel) 1368 + 1369: 269 Load 271(s1DArray) + 1370: 53(fvec2) Load 148(c2) + 1371: 721(ivec2) ConvertFToS 1370 + 1372: 52(float) Load 565(lod) + 1373: 47(int) ConvertFToS 1372 + 1374: 268 Image 1369 + 1375: 7(fvec4) ImageFetch 1374 1371 Lod ConstOffset 1373 709 + 1376: 7(fvec4) Load 1334(texel) + 1377: 7(fvec4) FAdd 1376 1375 + Store 1334(texel) 1377 + 1378: 284 Load 286(s2DArray) + 1379: 167(fvec3) Load 169(c3) + 1380: 734(ivec3) ConvertFToS 1379 + 1381: 52(float) Load 565(lod) + 1382: 47(int) ConvertFToS 1381 + 1383: 283 Image 1378 + 1384: 7(fvec4) ImageFetch 1383 1380 Lod ConstOffset 1382 722 + 1385: 7(fvec4) Load 1334(texel) + 1386: 7(fvec4) FAdd 1385 1384 + Store 1334(texel) 1386 + 1387: 7(fvec4) Load 1334(texel) + ReturnValue 1387 + FunctionEnd +27(testTextureGrad(): 7(fvec4) Function None 8 + 28: Label + 1390(texel): 64(ptr) Variable Function + Store 1390(texel) 121 + 1391: 123 Load 125(s1D) + 1392: 52(float) Load 128(c1) + 1394: 52(float) Load 1393(dPdxy1) + 1395: 52(float) Load 1393(dPdxy1) + 1396: 7(fvec4) ImageSampleExplicitLod 1391 1392 Grad 1394 1395 + 1397: 7(fvec4) Load 1390(texel) + 1398: 7(fvec4) FAdd 1397 1396 + Store 1390(texel) 1398 + 1399: 123 Load 125(s1D) + 1400: 6(float) Load 135(f16c1) + 1402: 6(float) Load 1401(f16dPdxy1) + 1403: 6(float) Load 1401(f16dPdxy1) + 1404: 7(fvec4) ImageSampleExplicitLod 1399 1400 Grad 1402 1403 + 1405: 7(fvec4) Load 1390(texel) + 1406: 7(fvec4) FAdd 1405 1404 + Store 1390(texel) 1406 + 1407: 143 Load 145(s2D) + 1408: 53(fvec2) Load 148(c2) + 1410: 53(fvec2) Load 1409(dPdxy2) + 1411: 53(fvec2) Load 1409(dPdxy2) + 1412: 7(fvec4) ImageSampleExplicitLod 1407 1408 Grad 1410 1411 + 1413: 7(fvec4) Load 1390(texel) + 1414: 7(fvec4) FAdd 1413 1412 + Store 1390(texel) 1414 + 1415: 143 Load 145(s2D) + 1416: 154(fvec2) Load 156(f16c2) + 1418: 154(fvec2) Load 1417(f16dPdxy2) + 1419: 154(fvec2) Load 1417(f16dPdxy2) + 1420: 7(fvec4) ImageSampleExplicitLod 1415 1416 Grad 1418 1419 + 1421: 7(fvec4) Load 1390(texel) + 1422: 7(fvec4) FAdd 1421 1420 + Store 1390(texel) 1422 + 1423: 163 Load 165(s3D) + 1424: 167(fvec3) Load 169(c3) + 1426: 167(fvec3) Load 1425(dPdxy3) + 1427: 167(fvec3) Load 1425(dPdxy3) + 1428: 7(fvec4) ImageSampleExplicitLod 1423 1424 Grad 1426 1427 + 1429: 7(fvec4) Load 1390(texel) + 1430: 7(fvec4) FAdd 1429 1428 + Store 1390(texel) 1430 + 1431: 163 Load 165(s3D) + 1432: 175(fvec3) Load 177(f16c3) + 1434: 175(fvec3) Load 1433(f16dPdxy3) + 1435: 175(fvec3) Load 1433(f16dPdxy3) + 1436: 7(fvec4) ImageSampleExplicitLod 1431 1432 Grad 1434 1435 + 1437: 7(fvec4) Load 1390(texel) + 1438: 7(fvec4) FAdd 1437 1436 + Store 1390(texel) 1438 + 1439: 184 Load 186(sCube) + 1440: 167(fvec3) Load 169(c3) + 1441: 167(fvec3) Load 1425(dPdxy3) + 1442: 167(fvec3) Load 1425(dPdxy3) + 1443: 7(fvec4) ImageSampleExplicitLod 1439 1440 Grad 1441 1442 + 1444: 7(fvec4) Load 1390(texel) + 1445: 7(fvec4) FAdd 1444 1443 + Store 1390(texel) 1445 + 1446: 184 Load 186(sCube) + 1447: 175(fvec3) Load 177(f16c3) + 1448: 175(fvec3) Load 1433(f16dPdxy3) + 1449: 175(fvec3) Load 1433(f16dPdxy3) + 1450: 7(fvec4) ImageSampleExplicitLod 1446 1447 Grad 1448 1449 + 1451: 7(fvec4) Load 1390(texel) + 1452: 7(fvec4) FAdd 1451 1450 + Store 1390(texel) 1452 + 1453: 357 Load 359(s2DRect) + 1454: 53(fvec2) Load 148(c2) + 1455: 53(fvec2) Load 1409(dPdxy2) + 1456: 53(fvec2) Load 1409(dPdxy2) + 1457: 7(fvec4) ImageSampleExplicitLod 1453 1454 Grad 1455 1456 + 1458: 7(fvec4) Load 1390(texel) + 1459: 7(fvec4) FAdd 1458 1457 + Store 1390(texel) 1459 + 1460: 357 Load 359(s2DRect) + 1461: 154(fvec2) Load 156(f16c2) + 1462: 154(fvec2) Load 1417(f16dPdxy2) + 1463: 154(fvec2) Load 1417(f16dPdxy2) + 1464: 7(fvec4) ImageSampleExplicitLod 1460 1461 Grad 1462 1463 + 1465: 7(fvec4) Load 1390(texel) + 1466: 7(fvec4) FAdd 1465 1464 + Store 1390(texel) 1466 + 1467: 371 Load 373(s2DRectShadow) + 1468: 167(fvec3) Load 169(c3) + 1469: 53(fvec2) Load 1409(dPdxy2) + 1470: 53(fvec2) Load 1409(dPdxy2) + 1471: 52(float) CompositeExtract 1468 2 + 1472: 6(float) ImageSampleDrefExplicitLod 1467 1468 1471 Grad 1469 1470 + 1473: 208(ptr) AccessChain 1390(texel) 207 + 1474: 6(float) Load 1473 + 1475: 6(float) FAdd 1474 1472 + 1476: 208(ptr) AccessChain 1390(texel) 207 + Store 1476 1475 + 1477: 371 Load 373(s2DRectShadow) + 1478: 154(fvec2) Load 156(f16c2) + 1479: 52(float) Load 215(compare) + 1480: 154(fvec2) Load 1417(f16dPdxy2) + 1481: 154(fvec2) Load 1417(f16dPdxy2) + 1482: 6(float) ImageSampleDrefExplicitLod 1477 1478 1479 Grad 1480 1481 + 1483: 208(ptr) AccessChain 1390(texel) 207 + 1484: 6(float) Load 1483 + 1485: 6(float) FAdd 1484 1482 + 1486: 208(ptr) AccessChain 1390(texel) 207 + Store 1486 1485 + 1487: 199 Load 201(s1DShadow) + 1488: 167(fvec3) Load 169(c3) + 1489: 52(float) Load 1393(dPdxy1) + 1490: 52(float) Load 1393(dPdxy1) + 1491: 52(float) CompositeExtract 1488 2 + 1492: 6(float) ImageSampleDrefExplicitLod 1487 1488 1491 Grad 1489 1490 + 1493: 208(ptr) AccessChain 1390(texel) 207 + 1494: 6(float) Load 1493 + 1495: 6(float) FAdd 1494 1492 + 1496: 208(ptr) AccessChain 1390(texel) 207 + Store 1496 1495 + 1497: 199 Load 201(s1DShadow) + 1498: 154(fvec2) Load 156(f16c2) + 1499: 52(float) Load 215(compare) + 1500: 6(float) Load 1401(f16dPdxy1) + 1501: 6(float) Load 1401(f16dPdxy1) + 1502: 6(float) ImageSampleDrefExplicitLod 1497 1498 1499 Grad 1500 1501 + 1503: 208(ptr) AccessChain 1390(texel) 207 + 1504: 6(float) Load 1503 + 1505: 6(float) FAdd 1504 1502 + 1506: 208(ptr) AccessChain 1390(texel) 207 + Store 1506 1505 + 1507: 224 Load 226(s2DShadow) + 1508: 167(fvec3) Load 169(c3) + 1509: 53(fvec2) Load 1409(dPdxy2) + 1510: 53(fvec2) Load 1409(dPdxy2) + 1511: 52(float) CompositeExtract 1508 2 + 1512: 6(float) ImageSampleDrefExplicitLod 1507 1508 1511 Grad 1509 1510 + 1513: 208(ptr) AccessChain 1390(texel) 207 + 1514: 6(float) Load 1513 + 1515: 6(float) FAdd 1514 1512 + 1516: 208(ptr) AccessChain 1390(texel) 207 + Store 1516 1515 + 1517: 224 Load 226(s2DShadow) + 1518: 154(fvec2) Load 156(f16c2) + 1519: 52(float) Load 215(compare) + 1520: 154(fvec2) Load 1417(f16dPdxy2) + 1521: 154(fvec2) Load 1417(f16dPdxy2) + 1522: 6(float) ImageSampleDrefExplicitLod 1517 1518 1519 Grad 1520 1521 + 1523: 208(ptr) AccessChain 1390(texel) 207 + 1524: 6(float) Load 1523 + 1525: 6(float) FAdd 1524 1522 + 1526: 208(ptr) AccessChain 1390(texel) 207 + Store 1526 1525 + 1527: 245 Load 247(sCubeShadow) + 1528: 249(fvec4) Load 251(c4) + 1529: 167(fvec3) Load 1425(dPdxy3) + 1530: 167(fvec3) Load 1425(dPdxy3) + 1531: 52(float) CompositeExtract 1528 3 + 1532: 6(float) ImageSampleDrefExplicitLod 1527 1528 1531 Grad 1529 1530 + 1533: 208(ptr) AccessChain 1390(texel) 207 + 1534: 6(float) Load 1533 + 1535: 6(float) FAdd 1534 1532 + 1536: 208(ptr) AccessChain 1390(texel) 207 + Store 1536 1535 + 1537: 245 Load 247(sCubeShadow) + 1538: 175(fvec3) Load 177(f16c3) + 1539: 52(float) Load 215(compare) + 1540: 175(fvec3) Load 1433(f16dPdxy3) + 1541: 175(fvec3) Load 1433(f16dPdxy3) + 1542: 6(float) ImageSampleDrefExplicitLod 1537 1538 1539 Grad 1540 1541 + 1543: 208(ptr) AccessChain 1390(texel) 207 + 1544: 6(float) Load 1543 + 1545: 6(float) FAdd 1544 1542 + 1546: 208(ptr) AccessChain 1390(texel) 207 + Store 1546 1545 + 1547: 269 Load 271(s1DArray) + 1548: 53(fvec2) Load 148(c2) + 1549: 52(float) Load 1393(dPdxy1) + 1550: 52(float) Load 1393(dPdxy1) + 1551: 7(fvec4) ImageSampleExplicitLod 1547 1548 Grad 1549 1550 + 1552: 7(fvec4) Load 1390(texel) + 1553: 7(fvec4) FAdd 1552 1551 + Store 1390(texel) 1553 + 1554: 269 Load 271(s1DArray) + 1555: 154(fvec2) Load 156(f16c2) + 1556: 6(float) Load 1401(f16dPdxy1) + 1557: 6(float) Load 1401(f16dPdxy1) + 1558: 7(fvec4) ImageSampleExplicitLod 1554 1555 Grad 1556 1557 + 1559: 7(fvec4) Load 1390(texel) + 1560: 7(fvec4) FAdd 1559 1558 + Store 1390(texel) 1560 + 1561: 284 Load 286(s2DArray) + 1562: 167(fvec3) Load 169(c3) + 1563: 53(fvec2) Load 1409(dPdxy2) + 1564: 53(fvec2) Load 1409(dPdxy2) + 1565: 7(fvec4) ImageSampleExplicitLod 1561 1562 Grad 1563 1564 + 1566: 7(fvec4) Load 1390(texel) + 1567: 7(fvec4) FAdd 1566 1565 + Store 1390(texel) 1567 + 1568: 284 Load 286(s2DArray) + 1569: 175(fvec3) Load 177(f16c3) + 1570: 154(fvec2) Load 1417(f16dPdxy2) + 1571: 154(fvec2) Load 1417(f16dPdxy2) + 1572: 7(fvec4) ImageSampleExplicitLod 1568 1569 Grad 1570 1571 + 1573: 7(fvec4) Load 1390(texel) + 1574: 7(fvec4) FAdd 1573 1572 + Store 1390(texel) 1574 + 1575: 316 Load 318(s1DArrayShadow) + 1576: 167(fvec3) Load 169(c3) + 1577: 52(float) Load 1393(dPdxy1) + 1578: 52(float) Load 1393(dPdxy1) + 1579: 52(float) CompositeExtract 1576 2 + 1580: 6(float) ImageSampleDrefExplicitLod 1575 1576 1579 Grad 1577 1578 + 1581: 208(ptr) AccessChain 1390(texel) 207 + 1582: 6(float) Load 1581 + 1583: 6(float) FAdd 1582 1580 + 1584: 208(ptr) AccessChain 1390(texel) 207 + Store 1584 1583 + 1585: 316 Load 318(s1DArrayShadow) + 1586: 154(fvec2) Load 156(f16c2) + 1587: 52(float) Load 215(compare) + 1588: 6(float) Load 1401(f16dPdxy1) + 1589: 6(float) Load 1401(f16dPdxy1) + 1590: 6(float) ImageSampleDrefExplicitLod 1585 1586 1587 Grad 1588 1589 + 1591: 208(ptr) AccessChain 1390(texel) 207 + 1592: 6(float) Load 1591 + 1593: 6(float) FAdd 1592 1590 + 1594: 208(ptr) AccessChain 1390(texel) 207 + Store 1594 1593 + 1595: 337 Load 339(s2DArrayShadow) + 1596: 249(fvec4) Load 251(c4) + 1597: 53(fvec2) Load 1409(dPdxy2) + 1598: 53(fvec2) Load 1409(dPdxy2) + 1599: 52(float) CompositeExtract 1596 3 + 1600: 6(float) ImageSampleDrefExplicitLod 1595 1596 1599 Grad 1597 1598 + 1601: 208(ptr) AccessChain 1390(texel) 207 + 1602: 6(float) Load 1601 + 1603: 6(float) FAdd 1602 1600 + 1604: 208(ptr) AccessChain 1390(texel) 207 + Store 1604 1603 + 1605: 337 Load 339(s2DArrayShadow) + 1606: 175(fvec3) Load 177(f16c3) + 1607: 52(float) Load 215(compare) + 1608: 154(fvec2) Load 1417(f16dPdxy2) + 1609: 154(fvec2) Load 1417(f16dPdxy2) + 1610: 6(float) ImageSampleDrefExplicitLod 1605 1606 1607 Grad 1608 1609 + 1611: 208(ptr) AccessChain 1390(texel) 207 + 1612: 6(float) Load 1611 + 1613: 6(float) FAdd 1612 1610 + 1614: 208(ptr) AccessChain 1390(texel) 207 + Store 1614 1613 + 1615: 299 Load 301(sCubeArray) + 1616: 249(fvec4) Load 251(c4) + 1617: 167(fvec3) Load 1425(dPdxy3) + 1618: 167(fvec3) Load 1425(dPdxy3) + 1619: 7(fvec4) ImageSampleExplicitLod 1615 1616 Grad 1617 1618 + 1620: 7(fvec4) Load 1390(texel) + 1621: 7(fvec4) FAdd 1620 1619 + Store 1390(texel) 1621 + 1622: 299 Load 301(sCubeArray) + 1623: 7(fvec4) Load 309(f16c4) + 1624: 175(fvec3) Load 1433(f16dPdxy3) + 1625: 175(fvec3) Load 1433(f16dPdxy3) + 1626: 7(fvec4) ImageSampleExplicitLod 1622 1623 Grad 1624 1625 + 1627: 7(fvec4) Load 1390(texel) + 1628: 7(fvec4) FAdd 1627 1626 + Store 1390(texel) 1628 + 1629: 7(fvec4) Load 1390(texel) + ReturnValue 1629 + FunctionEnd +29(testTextureGradOffset(): 7(fvec4) Function None 8 + 30: Label + 1632(texel): 64(ptr) Variable Function + Store 1632(texel) 121 + 1633: 123 Load 125(s1D) + 1634: 52(float) Load 128(c1) + 1635: 52(float) Load 1393(dPdxy1) + 1636: 52(float) Load 1393(dPdxy1) + 1637: 7(fvec4) ImageSampleExplicitLod 1633 1634 Grad ConstOffset 1635 1636 709 + 1638: 7(fvec4) Load 1632(texel) + 1639: 7(fvec4) FAdd 1638 1637 + Store 1632(texel) 1639 + 1640: 123 Load 125(s1D) + 1641: 6(float) Load 135(f16c1) + 1642: 6(float) Load 1401(f16dPdxy1) + 1643: 6(float) Load 1401(f16dPdxy1) + 1644: 7(fvec4) ImageSampleExplicitLod 1640 1641 Grad ConstOffset 1642 1643 709 + 1645: 7(fvec4) Load 1632(texel) + 1646: 7(fvec4) FAdd 1645 1644 + Store 1632(texel) 1646 + 1647: 143 Load 145(s2D) + 1648: 53(fvec2) Load 148(c2) + 1649: 53(fvec2) Load 1409(dPdxy2) + 1650: 53(fvec2) Load 1409(dPdxy2) + 1651: 7(fvec4) ImageSampleExplicitLod 1647 1648 Grad ConstOffset 1649 1650 722 + 1652: 7(fvec4) Load 1632(texel) + 1653: 7(fvec4) FAdd 1652 1651 + Store 1632(texel) 1653 + 1654: 143 Load 145(s2D) + 1655: 154(fvec2) Load 156(f16c2) + 1656: 154(fvec2) Load 1417(f16dPdxy2) + 1657: 154(fvec2) Load 1417(f16dPdxy2) + 1658: 7(fvec4) ImageSampleExplicitLod 1654 1655 Grad ConstOffset 1656 1657 722 + 1659: 7(fvec4) Load 1632(texel) + 1660: 7(fvec4) FAdd 1659 1658 + Store 1632(texel) 1660 + 1661: 163 Load 165(s3D) + 1662: 167(fvec3) Load 169(c3) + 1663: 167(fvec3) Load 1425(dPdxy3) + 1664: 167(fvec3) Load 1425(dPdxy3) + 1665: 7(fvec4) ImageSampleExplicitLod 1661 1662 Grad ConstOffset 1663 1664 735 + 1666: 7(fvec4) Load 1632(texel) + 1667: 7(fvec4) FAdd 1666 1665 + Store 1632(texel) 1667 + 1668: 163 Load 165(s3D) + 1669: 175(fvec3) Load 177(f16c3) + 1670: 175(fvec3) Load 1433(f16dPdxy3) + 1671: 175(fvec3) Load 1433(f16dPdxy3) + 1672: 7(fvec4) ImageSampleExplicitLod 1668 1669 Grad ConstOffset 1670 1671 735 + 1673: 7(fvec4) Load 1632(texel) + 1674: 7(fvec4) FAdd 1673 1672 + Store 1632(texel) 1674 + 1675: 357 Load 359(s2DRect) + 1676: 53(fvec2) Load 148(c2) + 1677: 53(fvec2) Load 1409(dPdxy2) + 1678: 53(fvec2) Load 1409(dPdxy2) + 1679: 7(fvec4) ImageSampleExplicitLod 1675 1676 Grad ConstOffset 1677 1678 722 + 1680: 7(fvec4) Load 1632(texel) + 1681: 7(fvec4) FAdd 1680 1679 + Store 1632(texel) 1681 + 1682: 357 Load 359(s2DRect) + 1683: 154(fvec2) Load 156(f16c2) + 1684: 154(fvec2) Load 1417(f16dPdxy2) + 1685: 154(fvec2) Load 1417(f16dPdxy2) + 1686: 7(fvec4) ImageSampleExplicitLod 1682 1683 Grad ConstOffset 1684 1685 722 + 1687: 7(fvec4) Load 1632(texel) + 1688: 7(fvec4) FAdd 1687 1686 + Store 1632(texel) 1688 + 1689: 371 Load 373(s2DRectShadow) + 1690: 167(fvec3) Load 169(c3) + 1691: 53(fvec2) Load 1409(dPdxy2) + 1692: 53(fvec2) Load 1409(dPdxy2) + 1693: 52(float) CompositeExtract 1690 2 + 1694: 6(float) ImageSampleDrefExplicitLod 1689 1690 1693 Grad ConstOffset 1691 1692 722 + 1695: 208(ptr) AccessChain 1632(texel) 207 + 1696: 6(float) Load 1695 + 1697: 6(float) FAdd 1696 1694 + 1698: 208(ptr) AccessChain 1632(texel) 207 + Store 1698 1697 + 1699: 371 Load 373(s2DRectShadow) + 1700: 154(fvec2) Load 156(f16c2) + 1701: 52(float) Load 215(compare) + 1702: 154(fvec2) Load 1417(f16dPdxy2) + 1703: 154(fvec2) Load 1417(f16dPdxy2) + 1704: 6(float) ImageSampleDrefExplicitLod 1699 1700 1701 Grad ConstOffset 1702 1703 722 + 1705: 208(ptr) AccessChain 1632(texel) 207 + 1706: 6(float) Load 1705 + 1707: 6(float) FAdd 1706 1704 + 1708: 208(ptr) AccessChain 1632(texel) 207 + Store 1708 1707 + 1709: 199 Load 201(s1DShadow) + 1710: 167(fvec3) Load 169(c3) + 1711: 52(float) Load 1393(dPdxy1) + 1712: 52(float) Load 1393(dPdxy1) + 1713: 52(float) CompositeExtract 1710 2 + 1714: 6(float) ImageSampleDrefExplicitLod 1709 1710 1713 Grad ConstOffset 1711 1712 709 + 1715: 208(ptr) AccessChain 1632(texel) 207 + 1716: 6(float) Load 1715 + 1717: 6(float) FAdd 1716 1714 + 1718: 208(ptr) AccessChain 1632(texel) 207 + Store 1718 1717 + 1719: 199 Load 201(s1DShadow) + 1720: 154(fvec2) Load 156(f16c2) + 1721: 52(float) Load 215(compare) + 1722: 6(float) Load 1401(f16dPdxy1) + 1723: 6(float) Load 1401(f16dPdxy1) + 1724: 6(float) ImageSampleDrefExplicitLod 1719 1720 1721 Grad ConstOffset 1722 1723 709 + 1725: 208(ptr) AccessChain 1632(texel) 207 + 1726: 6(float) Load 1725 + 1727: 6(float) FAdd 1726 1724 + 1728: 208(ptr) AccessChain 1632(texel) 207 + Store 1728 1727 + 1729: 224 Load 226(s2DShadow) + 1730: 167(fvec3) Load 169(c3) + 1731: 53(fvec2) Load 1409(dPdxy2) + 1732: 53(fvec2) Load 1409(dPdxy2) + 1733: 52(float) CompositeExtract 1730 2 + 1734: 6(float) ImageSampleDrefExplicitLod 1729 1730 1733 Grad ConstOffset 1731 1732 722 + 1735: 208(ptr) AccessChain 1632(texel) 207 + 1736: 6(float) Load 1735 + 1737: 6(float) FAdd 1736 1734 + 1738: 208(ptr) AccessChain 1632(texel) 207 + Store 1738 1737 + 1739: 224 Load 226(s2DShadow) + 1740: 154(fvec2) Load 156(f16c2) + 1741: 52(float) Load 215(compare) + 1742: 154(fvec2) Load 1417(f16dPdxy2) + 1743: 154(fvec2) Load 1417(f16dPdxy2) + 1744: 6(float) ImageSampleDrefExplicitLod 1739 1740 1741 Grad ConstOffset 1742 1743 722 + 1745: 208(ptr) AccessChain 1632(texel) 207 + 1746: 6(float) Load 1745 + 1747: 6(float) FAdd 1746 1744 + 1748: 208(ptr) AccessChain 1632(texel) 207 + Store 1748 1747 + 1749: 269 Load 271(s1DArray) + 1750: 53(fvec2) Load 148(c2) + 1751: 52(float) Load 1393(dPdxy1) + 1752: 52(float) Load 1393(dPdxy1) + 1753: 7(fvec4) ImageSampleExplicitLod 1749 1750 Grad ConstOffset 1751 1752 709 + 1754: 7(fvec4) Load 1632(texel) + 1755: 7(fvec4) FAdd 1754 1753 + Store 1632(texel) 1755 + 1756: 269 Load 271(s1DArray) + 1757: 154(fvec2) Load 156(f16c2) + 1758: 6(float) Load 1401(f16dPdxy1) + 1759: 6(float) Load 1401(f16dPdxy1) + 1760: 7(fvec4) ImageSampleExplicitLod 1756 1757 Grad ConstOffset 1758 1759 709 + 1761: 7(fvec4) Load 1632(texel) + 1762: 7(fvec4) FAdd 1761 1760 + Store 1632(texel) 1762 + 1763: 284 Load 286(s2DArray) + 1764: 167(fvec3) Load 169(c3) + 1765: 53(fvec2) Load 1409(dPdxy2) + 1766: 53(fvec2) Load 1409(dPdxy2) + 1767: 7(fvec4) ImageSampleExplicitLod 1763 1764 Grad ConstOffset 1765 1766 722 + 1768: 7(fvec4) Load 1632(texel) + 1769: 7(fvec4) FAdd 1768 1767 + Store 1632(texel) 1769 + 1770: 284 Load 286(s2DArray) + 1771: 175(fvec3) Load 177(f16c3) + 1772: 154(fvec2) Load 1417(f16dPdxy2) + 1773: 154(fvec2) Load 1417(f16dPdxy2) + 1774: 7(fvec4) ImageSampleExplicitLod 1770 1771 Grad ConstOffset 1772 1773 722 + 1775: 7(fvec4) Load 1632(texel) + 1776: 7(fvec4) FAdd 1775 1774 + Store 1632(texel) 1776 + 1777: 316 Load 318(s1DArrayShadow) + 1778: 167(fvec3) Load 169(c3) + 1779: 52(float) Load 1393(dPdxy1) + 1780: 52(float) Load 1393(dPdxy1) + 1781: 52(float) CompositeExtract 1778 2 + 1782: 6(float) ImageSampleDrefExplicitLod 1777 1778 1781 Grad ConstOffset 1779 1780 709 + 1783: 208(ptr) AccessChain 1632(texel) 207 + 1784: 6(float) Load 1783 + 1785: 6(float) FAdd 1784 1782 + 1786: 208(ptr) AccessChain 1632(texel) 207 + Store 1786 1785 + 1787: 316 Load 318(s1DArrayShadow) + 1788: 154(fvec2) Load 156(f16c2) + 1789: 52(float) Load 215(compare) + 1790: 6(float) Load 1401(f16dPdxy1) + 1791: 6(float) Load 1401(f16dPdxy1) + 1792: 6(float) ImageSampleDrefExplicitLod 1787 1788 1789 Grad ConstOffset 1790 1791 709 + 1793: 208(ptr) AccessChain 1632(texel) 207 + 1794: 6(float) Load 1793 + 1795: 6(float) FAdd 1794 1792 + 1796: 208(ptr) AccessChain 1632(texel) 207 + Store 1796 1795 + 1797: 337 Load 339(s2DArrayShadow) + 1798: 249(fvec4) Load 251(c4) + 1799: 53(fvec2) Load 1409(dPdxy2) + 1800: 53(fvec2) Load 1409(dPdxy2) + 1801: 52(float) CompositeExtract 1798 3 + 1802: 6(float) ImageSampleDrefExplicitLod 1797 1798 1801 Grad ConstOffset 1799 1800 722 + 1803: 208(ptr) AccessChain 1632(texel) 207 + 1804: 6(float) Load 1803 + 1805: 6(float) FAdd 1804 1802 + 1806: 208(ptr) AccessChain 1632(texel) 207 + Store 1806 1805 + 1807: 337 Load 339(s2DArrayShadow) + 1808: 175(fvec3) Load 177(f16c3) + 1809: 52(float) Load 215(compare) + 1810: 154(fvec2) Load 1417(f16dPdxy2) + 1811: 154(fvec2) Load 1417(f16dPdxy2) + 1812: 6(float) ImageSampleDrefExplicitLod 1807 1808 1809 Grad ConstOffset 1810 1811 722 + 1813: 208(ptr) AccessChain 1632(texel) 207 + 1814: 6(float) Load 1813 + 1815: 6(float) FAdd 1814 1812 + 1816: 208(ptr) AccessChain 1632(texel) 207 + Store 1816 1815 + 1817: 7(fvec4) Load 1632(texel) + ReturnValue 1817 + FunctionEnd +31(testTextureProjGrad(): 7(fvec4) Function None 8 + 32: Label + 1820(texel): 64(ptr) Variable Function + Store 1820(texel) 121 + 1821: 123 Load 125(s1D) + 1822: 53(fvec2) Load 148(c2) + 1823: 52(float) Load 1393(dPdxy1) + 1824: 52(float) Load 1393(dPdxy1) + 1825: 7(fvec4) ImageSampleProjExplicitLod 1821 1822 Grad 1823 1824 + 1826: 7(fvec4) Load 1820(texel) + 1827: 7(fvec4) FAdd 1826 1825 + Store 1820(texel) 1827 + 1828: 123 Load 125(s1D) + 1829: 154(fvec2) Load 156(f16c2) + 1830: 6(float) Load 1401(f16dPdxy1) + 1831: 6(float) Load 1401(f16dPdxy1) + 1832: 7(fvec4) ImageSampleProjExplicitLod 1828 1829 Grad 1830 1831 + 1833: 7(fvec4) Load 1820(texel) + 1834: 7(fvec4) FAdd 1833 1832 + Store 1820(texel) 1834 + 1835: 123 Load 125(s1D) + 1836: 249(fvec4) Load 251(c4) + 1837: 52(float) Load 1393(dPdxy1) + 1838: 52(float) Load 1393(dPdxy1) + 1839: 52(float) CompositeExtract 1836 3 + 1840: 249(fvec4) CompositeInsert 1839 1836 1 + 1841: 7(fvec4) ImageSampleProjExplicitLod 1835 1840 Grad 1837 1838 + 1842: 7(fvec4) Load 1820(texel) + 1843: 7(fvec4) FAdd 1842 1841 + Store 1820(texel) 1843 + 1844: 123 Load 125(s1D) + 1845: 7(fvec4) Load 309(f16c4) + 1846: 6(float) Load 1401(f16dPdxy1) + 1847: 6(float) Load 1401(f16dPdxy1) + 1848: 6(float) CompositeExtract 1845 3 + 1849: 7(fvec4) CompositeInsert 1848 1845 1 + 1850: 7(fvec4) ImageSampleProjExplicitLod 1844 1849 Grad 1846 1847 + 1851: 7(fvec4) Load 1820(texel) + 1852: 7(fvec4) FAdd 1851 1850 + Store 1820(texel) 1852 + 1853: 143 Load 145(s2D) + 1854: 167(fvec3) Load 169(c3) + 1855: 53(fvec2) Load 1409(dPdxy2) + 1856: 53(fvec2) Load 1409(dPdxy2) + 1857: 7(fvec4) ImageSampleProjExplicitLod 1853 1854 Grad 1855 1856 + 1858: 7(fvec4) Load 1820(texel) + 1859: 7(fvec4) FAdd 1858 1857 + Store 1820(texel) 1859 + 1860: 143 Load 145(s2D) + 1861: 175(fvec3) Load 177(f16c3) + 1862: 154(fvec2) Load 1417(f16dPdxy2) + 1863: 154(fvec2) Load 1417(f16dPdxy2) + 1864: 7(fvec4) ImageSampleProjExplicitLod 1860 1861 Grad 1862 1863 + 1865: 7(fvec4) Load 1820(texel) + 1866: 7(fvec4) FAdd 1865 1864 + Store 1820(texel) 1866 + 1867: 143 Load 145(s2D) + 1868: 249(fvec4) Load 251(c4) + 1869: 53(fvec2) Load 1409(dPdxy2) + 1870: 53(fvec2) Load 1409(dPdxy2) + 1871: 52(float) CompositeExtract 1868 3 + 1872: 249(fvec4) CompositeInsert 1871 1868 2 + 1873: 7(fvec4) ImageSampleProjExplicitLod 1867 1872 Grad 1869 1870 + 1874: 7(fvec4) Load 1820(texel) + 1875: 7(fvec4) FAdd 1874 1873 + Store 1820(texel) 1875 + 1876: 143 Load 145(s2D) + 1877: 7(fvec4) Load 309(f16c4) + 1878: 154(fvec2) Load 1417(f16dPdxy2) + 1879: 154(fvec2) Load 1417(f16dPdxy2) + 1880: 6(float) CompositeExtract 1877 3 + 1881: 7(fvec4) CompositeInsert 1880 1877 2 + 1882: 7(fvec4) ImageSampleProjExplicitLod 1876 1881 Grad 1878 1879 + 1883: 7(fvec4) Load 1820(texel) + 1884: 7(fvec4) FAdd 1883 1882 + Store 1820(texel) 1884 + 1885: 163 Load 165(s3D) + 1886: 249(fvec4) Load 251(c4) + 1887: 167(fvec3) Load 1425(dPdxy3) + 1888: 167(fvec3) Load 1425(dPdxy3) + 1889: 7(fvec4) ImageSampleProjExplicitLod 1885 1886 Grad 1887 1888 + 1890: 7(fvec4) Load 1820(texel) + 1891: 7(fvec4) FAdd 1890 1889 + Store 1820(texel) 1891 + 1892: 163 Load 165(s3D) + 1893: 7(fvec4) Load 309(f16c4) + 1894: 175(fvec3) Load 1433(f16dPdxy3) + 1895: 175(fvec3) Load 1433(f16dPdxy3) + 1896: 7(fvec4) ImageSampleProjExplicitLod 1892 1893 Grad 1894 1895 + 1897: 7(fvec4) Load 1820(texel) + 1898: 7(fvec4) FAdd 1897 1896 + Store 1820(texel) 1898 + 1899: 357 Load 359(s2DRect) + 1900: 167(fvec3) Load 169(c3) + 1901: 53(fvec2) Load 1409(dPdxy2) + 1902: 53(fvec2) Load 1409(dPdxy2) + 1903: 7(fvec4) ImageSampleProjExplicitLod 1899 1900 Grad 1901 1902 + 1904: 7(fvec4) Load 1820(texel) + 1905: 7(fvec4) FAdd 1904 1903 + Store 1820(texel) 1905 + 1906: 357 Load 359(s2DRect) + 1907: 175(fvec3) Load 177(f16c3) + 1908: 154(fvec2) Load 1417(f16dPdxy2) + 1909: 154(fvec2) Load 1417(f16dPdxy2) + 1910: 7(fvec4) ImageSampleProjExplicitLod 1906 1907 Grad 1908 1909 + 1911: 7(fvec4) Load 1820(texel) + 1912: 7(fvec4) FAdd 1911 1910 + Store 1820(texel) 1912 + 1913: 357 Load 359(s2DRect) + 1914: 249(fvec4) Load 251(c4) + 1915: 53(fvec2) Load 1409(dPdxy2) + 1916: 53(fvec2) Load 1409(dPdxy2) + 1917: 52(float) CompositeExtract 1914 3 + 1918: 249(fvec4) CompositeInsert 1917 1914 2 + 1919: 7(fvec4) ImageSampleProjExplicitLod 1913 1918 Grad 1915 1916 + 1920: 7(fvec4) Load 1820(texel) + 1921: 7(fvec4) FAdd 1920 1919 + Store 1820(texel) 1921 + 1922: 357 Load 359(s2DRect) + 1923: 7(fvec4) Load 309(f16c4) + 1924: 154(fvec2) Load 1417(f16dPdxy2) + 1925: 154(fvec2) Load 1417(f16dPdxy2) + 1926: 6(float) CompositeExtract 1923 3 + 1927: 7(fvec4) CompositeInsert 1926 1923 2 + 1928: 7(fvec4) ImageSampleProjExplicitLod 1922 1927 Grad 1924 1925 + 1929: 7(fvec4) Load 1820(texel) + 1930: 7(fvec4) FAdd 1929 1928 + Store 1820(texel) 1930 + 1931: 371 Load 373(s2DRectShadow) + 1932: 249(fvec4) Load 251(c4) + 1933: 53(fvec2) Load 1409(dPdxy2) + 1934: 53(fvec2) Load 1409(dPdxy2) + 1935: 52(float) CompositeExtract 1932 2 + 1936: 52(float) CompositeExtract 1932 3 + 1937: 249(fvec4) CompositeInsert 1936 1932 2 + 1938: 6(float) ImageSampleProjDrefExplicitLod 1931 1937 1935 Grad 1933 1934 + 1939: 208(ptr) AccessChain 1820(texel) 207 + 1940: 6(float) Load 1939 + 1941: 6(float) FAdd 1940 1938 + 1942: 208(ptr) AccessChain 1820(texel) 207 + Store 1942 1941 + 1943: 371 Load 373(s2DRectShadow) + 1944: 175(fvec3) Load 177(f16c3) + 1945: 52(float) Load 215(compare) + 1946: 154(fvec2) Load 1417(f16dPdxy2) + 1947: 154(fvec2) Load 1417(f16dPdxy2) + 1948: 6(float) ImageSampleProjDrefExplicitLod 1943 1944 1945 Grad 1946 1947 + 1949: 208(ptr) AccessChain 1820(texel) 207 + 1950: 6(float) Load 1949 + 1951: 6(float) FAdd 1950 1948 + 1952: 208(ptr) AccessChain 1820(texel) 207 + Store 1952 1951 + 1953: 199 Load 201(s1DShadow) + 1954: 249(fvec4) Load 251(c4) + 1955: 52(float) Load 1393(dPdxy1) + 1956: 52(float) Load 1393(dPdxy1) + 1957: 52(float) CompositeExtract 1954 2 + 1958: 52(float) CompositeExtract 1954 3 + 1959: 249(fvec4) CompositeInsert 1958 1954 1 + 1960: 6(float) ImageSampleProjDrefExplicitLod 1953 1959 1957 Grad 1955 1956 + 1961: 208(ptr) AccessChain 1820(texel) 207 + 1962: 6(float) Load 1961 + 1963: 6(float) FAdd 1962 1960 + 1964: 208(ptr) AccessChain 1820(texel) 207 + Store 1964 1963 + 1965: 199 Load 201(s1DShadow) + 1966: 175(fvec3) Load 177(f16c3) + 1967: 52(float) Load 215(compare) + 1968: 6(float) Load 1401(f16dPdxy1) + 1969: 6(float) Load 1401(f16dPdxy1) + 1970: 6(float) CompositeExtract 1966 2 + 1971: 175(fvec3) CompositeInsert 1970 1966 1 + 1972: 6(float) ImageSampleProjDrefExplicitLod 1965 1971 1967 Grad 1968 1969 + 1973: 208(ptr) AccessChain 1820(texel) 207 + 1974: 6(float) Load 1973 + 1975: 6(float) FAdd 1974 1972 + 1976: 208(ptr) AccessChain 1820(texel) 207 + Store 1976 1975 + 1977: 224 Load 226(s2DShadow) + 1978: 249(fvec4) Load 251(c4) + 1979: 53(fvec2) Load 1409(dPdxy2) + 1980: 53(fvec2) Load 1409(dPdxy2) + 1981: 52(float) CompositeExtract 1978 2 + 1982: 52(float) CompositeExtract 1978 3 + 1983: 249(fvec4) CompositeInsert 1982 1978 2 + 1984: 6(float) ImageSampleProjDrefExplicitLod 1977 1983 1981 Grad 1979 1980 + 1985: 208(ptr) AccessChain 1820(texel) 207 + 1986: 6(float) Load 1985 + 1987: 6(float) FAdd 1986 1984 + 1988: 208(ptr) AccessChain 1820(texel) 207 + Store 1988 1987 + 1989: 224 Load 226(s2DShadow) + 1990: 175(fvec3) Load 177(f16c3) + 1991: 52(float) Load 215(compare) + 1992: 154(fvec2) Load 1417(f16dPdxy2) + 1993: 154(fvec2) Load 1417(f16dPdxy2) + 1994: 6(float) ImageSampleProjDrefExplicitLod 1989 1990 1991 Grad 1992 1993 + 1995: 208(ptr) AccessChain 1820(texel) 207 + 1996: 6(float) Load 1995 + 1997: 6(float) FAdd 1996 1994 + 1998: 208(ptr) AccessChain 1820(texel) 207 + Store 1998 1997 + 1999: 7(fvec4) Load 1820(texel) + ReturnValue 1999 + FunctionEnd +33(testTextureProjGradoffset(): 7(fvec4) Function None 8 + 34: Label + 2002(texel): 64(ptr) Variable Function + Store 2002(texel) 121 + 2003: 123 Load 125(s1D) + 2004: 53(fvec2) Load 148(c2) + 2005: 52(float) Load 1393(dPdxy1) + 2006: 52(float) Load 1393(dPdxy1) + 2007: 7(fvec4) ImageSampleProjExplicitLod 2003 2004 Grad ConstOffset 2005 2006 709 + 2008: 7(fvec4) Load 2002(texel) + 2009: 7(fvec4) FAdd 2008 2007 + Store 2002(texel) 2009 + 2010: 123 Load 125(s1D) + 2011: 154(fvec2) Load 156(f16c2) + 2012: 6(float) Load 1401(f16dPdxy1) + 2013: 6(float) Load 1401(f16dPdxy1) + 2014: 7(fvec4) ImageSampleProjExplicitLod 2010 2011 Grad ConstOffset 2012 2013 709 + 2015: 7(fvec4) Load 2002(texel) + 2016: 7(fvec4) FAdd 2015 2014 + Store 2002(texel) 2016 + 2017: 123 Load 125(s1D) + 2018: 249(fvec4) Load 251(c4) + 2019: 52(float) Load 1393(dPdxy1) + 2020: 52(float) Load 1393(dPdxy1) + 2021: 52(float) CompositeExtract 2018 3 + 2022: 249(fvec4) CompositeInsert 2021 2018 1 + 2023: 7(fvec4) ImageSampleProjExplicitLod 2017 2022 Grad ConstOffset 2019 2020 709 + 2024: 7(fvec4) Load 2002(texel) + 2025: 7(fvec4) FAdd 2024 2023 + Store 2002(texel) 2025 + 2026: 123 Load 125(s1D) + 2027: 7(fvec4) Load 309(f16c4) + 2028: 6(float) Load 1401(f16dPdxy1) + 2029: 6(float) Load 1401(f16dPdxy1) + 2030: 6(float) CompositeExtract 2027 3 + 2031: 7(fvec4) CompositeInsert 2030 2027 1 + 2032: 7(fvec4) ImageSampleProjExplicitLod 2026 2031 Grad ConstOffset 2028 2029 709 + 2033: 7(fvec4) Load 2002(texel) + 2034: 7(fvec4) FAdd 2033 2032 + Store 2002(texel) 2034 + 2035: 143 Load 145(s2D) + 2036: 167(fvec3) Load 169(c3) + 2037: 53(fvec2) Load 1409(dPdxy2) + 2038: 53(fvec2) Load 1409(dPdxy2) + 2039: 7(fvec4) ImageSampleProjExplicitLod 2035 2036 Grad ConstOffset 2037 2038 722 + 2040: 7(fvec4) Load 2002(texel) + 2041: 7(fvec4) FAdd 2040 2039 + Store 2002(texel) 2041 + 2042: 143 Load 145(s2D) + 2043: 175(fvec3) Load 177(f16c3) + 2044: 154(fvec2) Load 1417(f16dPdxy2) + 2045: 154(fvec2) Load 1417(f16dPdxy2) + 2046: 7(fvec4) ImageSampleProjExplicitLod 2042 2043 Grad ConstOffset 2044 2045 722 + 2047: 7(fvec4) Load 2002(texel) + 2048: 7(fvec4) FAdd 2047 2046 + Store 2002(texel) 2048 + 2049: 143 Load 145(s2D) + 2050: 249(fvec4) Load 251(c4) + 2051: 53(fvec2) Load 1409(dPdxy2) + 2052: 53(fvec2) Load 1409(dPdxy2) + 2053: 52(float) CompositeExtract 2050 3 + 2054: 249(fvec4) CompositeInsert 2053 2050 2 + 2055: 7(fvec4) ImageSampleProjExplicitLod 2049 2054 Grad ConstOffset 2051 2052 722 + 2056: 7(fvec4) Load 2002(texel) + 2057: 7(fvec4) FAdd 2056 2055 + Store 2002(texel) 2057 + 2058: 143 Load 145(s2D) + 2059: 7(fvec4) Load 309(f16c4) + 2060: 154(fvec2) Load 1417(f16dPdxy2) + 2061: 154(fvec2) Load 1417(f16dPdxy2) + 2062: 6(float) CompositeExtract 2059 3 + 2063: 7(fvec4) CompositeInsert 2062 2059 2 + 2064: 7(fvec4) ImageSampleProjExplicitLod 2058 2063 Grad ConstOffset 2060 2061 722 + 2065: 7(fvec4) Load 2002(texel) + 2066: 7(fvec4) FAdd 2065 2064 + Store 2002(texel) 2066 + 2067: 357 Load 359(s2DRect) + 2068: 167(fvec3) Load 169(c3) + 2069: 53(fvec2) Load 1409(dPdxy2) + 2070: 53(fvec2) Load 1409(dPdxy2) + 2071: 7(fvec4) ImageSampleProjExplicitLod 2067 2068 Grad ConstOffset 2069 2070 722 + 2072: 7(fvec4) Load 2002(texel) + 2073: 7(fvec4) FAdd 2072 2071 + Store 2002(texel) 2073 + 2074: 357 Load 359(s2DRect) + 2075: 175(fvec3) Load 177(f16c3) + 2076: 154(fvec2) Load 1417(f16dPdxy2) + 2077: 154(fvec2) Load 1417(f16dPdxy2) + 2078: 7(fvec4) ImageSampleProjExplicitLod 2074 2075 Grad ConstOffset 2076 2077 722 + 2079: 7(fvec4) Load 2002(texel) + 2080: 7(fvec4) FAdd 2079 2078 + Store 2002(texel) 2080 + 2081: 357 Load 359(s2DRect) + 2082: 249(fvec4) Load 251(c4) + 2083: 53(fvec2) Load 1409(dPdxy2) + 2084: 53(fvec2) Load 1409(dPdxy2) + 2085: 52(float) CompositeExtract 2082 3 + 2086: 249(fvec4) CompositeInsert 2085 2082 2 + 2087: 7(fvec4) ImageSampleProjExplicitLod 2081 2086 Grad ConstOffset 2083 2084 722 + 2088: 7(fvec4) Load 2002(texel) + 2089: 7(fvec4) FAdd 2088 2087 + Store 2002(texel) 2089 + 2090: 357 Load 359(s2DRect) + 2091: 7(fvec4) Load 309(f16c4) + 2092: 154(fvec2) Load 1417(f16dPdxy2) + 2093: 154(fvec2) Load 1417(f16dPdxy2) + 2094: 6(float) CompositeExtract 2091 3 + 2095: 7(fvec4) CompositeInsert 2094 2091 2 + 2096: 7(fvec4) ImageSampleProjExplicitLod 2090 2095 Grad ConstOffset 2092 2093 722 + 2097: 7(fvec4) Load 2002(texel) + 2098: 7(fvec4) FAdd 2097 2096 + Store 2002(texel) 2098 + 2099: 371 Load 373(s2DRectShadow) + 2100: 249(fvec4) Load 251(c4) + 2101: 53(fvec2) Load 1409(dPdxy2) + 2102: 53(fvec2) Load 1409(dPdxy2) + 2103: 52(float) CompositeExtract 2100 2 + 2104: 52(float) CompositeExtract 2100 3 + 2105: 249(fvec4) CompositeInsert 2104 2100 2 + 2106: 6(float) ImageSampleProjDrefExplicitLod 2099 2105 2103 Grad ConstOffset 2101 2102 722 + 2107: 208(ptr) AccessChain 2002(texel) 207 + 2108: 6(float) Load 2107 + 2109: 6(float) FAdd 2108 2106 + 2110: 208(ptr) AccessChain 2002(texel) 207 + Store 2110 2109 + 2111: 371 Load 373(s2DRectShadow) + 2112: 175(fvec3) Load 177(f16c3) + 2113: 52(float) Load 215(compare) + 2114: 154(fvec2) Load 1417(f16dPdxy2) + 2115: 154(fvec2) Load 1417(f16dPdxy2) + 2116: 6(float) ImageSampleProjDrefExplicitLod 2111 2112 2113 Grad ConstOffset 2114 2115 722 + 2117: 208(ptr) AccessChain 2002(texel) 207 + 2118: 6(float) Load 2117 + 2119: 6(float) FAdd 2118 2116 + 2120: 208(ptr) AccessChain 2002(texel) 207 + Store 2120 2119 + 2121: 163 Load 165(s3D) + 2122: 249(fvec4) Load 251(c4) + 2123: 167(fvec3) Load 1425(dPdxy3) + 2124: 167(fvec3) Load 1425(dPdxy3) + 2125: 7(fvec4) ImageSampleProjExplicitLod 2121 2122 Grad ConstOffset 2123 2124 735 + 2126: 7(fvec4) Load 2002(texel) + 2127: 7(fvec4) FAdd 2126 2125 + Store 2002(texel) 2127 + 2128: 163 Load 165(s3D) + 2129: 7(fvec4) Load 309(f16c4) + 2130: 175(fvec3) Load 1433(f16dPdxy3) + 2131: 175(fvec3) Load 1433(f16dPdxy3) + 2132: 7(fvec4) ImageSampleProjExplicitLod 2128 2129 Grad ConstOffset 2130 2131 735 + 2133: 7(fvec4) Load 2002(texel) + 2134: 7(fvec4) FAdd 2133 2132 + Store 2002(texel) 2134 + 2135: 199 Load 201(s1DShadow) + 2136: 249(fvec4) Load 251(c4) + 2137: 52(float) Load 1393(dPdxy1) + 2138: 52(float) Load 1393(dPdxy1) + 2139: 52(float) CompositeExtract 2136 2 + 2140: 52(float) CompositeExtract 2136 3 + 2141: 249(fvec4) CompositeInsert 2140 2136 1 + 2142: 6(float) ImageSampleProjDrefExplicitLod 2135 2141 2139 Grad ConstOffset 2137 2138 709 + 2143: 208(ptr) AccessChain 2002(texel) 207 + 2144: 6(float) Load 2143 + 2145: 6(float) FAdd 2144 2142 + 2146: 208(ptr) AccessChain 2002(texel) 207 + Store 2146 2145 + 2147: 199 Load 201(s1DShadow) + 2148: 175(fvec3) Load 177(f16c3) + 2149: 52(float) Load 215(compare) + 2150: 6(float) Load 1401(f16dPdxy1) + 2151: 6(float) Load 1401(f16dPdxy1) + 2152: 6(float) CompositeExtract 2148 2 + 2153: 175(fvec3) CompositeInsert 2152 2148 1 + 2154: 6(float) ImageSampleProjDrefExplicitLod 2147 2153 2149 Grad ConstOffset 2150 2151 709 + 2155: 208(ptr) AccessChain 2002(texel) 207 + 2156: 6(float) Load 2155 + 2157: 6(float) FAdd 2156 2154 + 2158: 208(ptr) AccessChain 2002(texel) 207 + Store 2158 2157 + 2159: 224 Load 226(s2DShadow) + 2160: 249(fvec4) Load 251(c4) + 2161: 53(fvec2) Load 1409(dPdxy2) + 2162: 53(fvec2) Load 1409(dPdxy2) + 2163: 52(float) CompositeExtract 2160 2 + 2164: 52(float) CompositeExtract 2160 3 + 2165: 249(fvec4) CompositeInsert 2164 2160 2 + 2166: 6(float) ImageSampleProjDrefExplicitLod 2159 2165 2163 Grad ConstOffset 2161 2162 722 + 2167: 208(ptr) AccessChain 2002(texel) 207 + 2168: 6(float) Load 2167 + 2169: 6(float) FAdd 2168 2166 + 2170: 208(ptr) AccessChain 2002(texel) 207 + Store 2170 2169 + 2171: 224 Load 226(s2DShadow) + 2172: 175(fvec3) Load 177(f16c3) + 2173: 52(float) Load 215(compare) + 2174: 154(fvec2) Load 1417(f16dPdxy2) + 2175: 154(fvec2) Load 1417(f16dPdxy2) + 2176: 6(float) ImageSampleProjDrefExplicitLod 2171 2172 2173 Grad ConstOffset 2174 2175 722 + 2177: 208(ptr) AccessChain 2002(texel) 207 + 2178: 6(float) Load 2177 + 2179: 6(float) FAdd 2178 2176 + 2180: 208(ptr) AccessChain 2002(texel) 207 + Store 2180 2179 + 2181: 7(fvec4) Load 2002(texel) + ReturnValue 2181 + FunctionEnd +35(testTextureGather(): 7(fvec4) Function None 8 + 36: Label + 2184(texel): 64(ptr) Variable Function + Store 2184(texel) 121 + 2185: 143 Load 145(s2D) + 2186: 53(fvec2) Load 148(c2) + 2188: 7(fvec4) ImageGather 2185 2186 2187 + 2189: 7(fvec4) Load 2184(texel) + 2190: 7(fvec4) FAdd 2189 2188 + Store 2184(texel) 2190 + 2191: 143 Load 145(s2D) + 2192: 154(fvec2) Load 156(f16c2) + 2193: 6(float) Load 137(f16bias) + 2194: 7(fvec4) ImageGather 2191 2192 2187 Bias 2193 + 2195: 7(fvec4) Load 2184(texel) + 2196: 7(fvec4) FAdd 2195 2194 + Store 2184(texel) 2196 + 2197: 284 Load 286(s2DArray) + 2198: 167(fvec3) Load 169(c3) + 2199: 7(fvec4) ImageGather 2197 2198 2187 + 2200: 7(fvec4) Load 2184(texel) + 2201: 7(fvec4) FAdd 2200 2199 + Store 2184(texel) 2201 + 2202: 284 Load 286(s2DArray) + 2203: 175(fvec3) Load 177(f16c3) + 2204: 6(float) Load 137(f16bias) + 2205: 7(fvec4) ImageGather 2202 2203 2187 Bias 2204 + 2206: 7(fvec4) Load 2184(texel) + 2207: 7(fvec4) FAdd 2206 2205 + Store 2184(texel) 2207 + 2208: 184 Load 186(sCube) + 2209: 167(fvec3) Load 169(c3) + 2210: 7(fvec4) ImageGather 2208 2209 2187 + 2211: 7(fvec4) Load 2184(texel) + 2212: 7(fvec4) FAdd 2211 2210 + Store 2184(texel) 2212 + 2213: 184 Load 186(sCube) + 2214: 175(fvec3) Load 177(f16c3) + 2215: 6(float) Load 137(f16bias) + 2216: 7(fvec4) ImageGather 2213 2214 2187 Bias 2215 + 2217: 7(fvec4) Load 2184(texel) + 2218: 7(fvec4) FAdd 2217 2216 + Store 2184(texel) 2218 + 2219: 299 Load 301(sCubeArray) + 2220: 249(fvec4) Load 251(c4) + 2221: 7(fvec4) ImageGather 2219 2220 2187 + 2222: 7(fvec4) Load 2184(texel) + 2223: 7(fvec4) FAdd 2222 2221 + Store 2184(texel) 2223 + 2224: 299 Load 301(sCubeArray) + 2225: 7(fvec4) Load 309(f16c4) + 2226: 6(float) Load 137(f16bias) + 2227: 7(fvec4) ImageGather 2224 2225 2187 Bias 2226 + 2228: 7(fvec4) Load 2184(texel) + 2229: 7(fvec4) FAdd 2228 2227 + Store 2184(texel) 2229 + 2230: 357 Load 359(s2DRect) + 2231: 53(fvec2) Load 148(c2) + 2232: 7(fvec4) ImageGather 2230 2231 2187 + 2233: 7(fvec4) Load 2184(texel) + 2234: 7(fvec4) FAdd 2233 2232 + Store 2184(texel) 2234 + 2235: 357 Load 359(s2DRect) + 2236: 154(fvec2) Load 156(f16c2) + 2237: 7(fvec4) ImageGather 2235 2236 2187 + 2238: 7(fvec4) Load 2184(texel) + 2239: 7(fvec4) FAdd 2238 2237 + Store 2184(texel) 2239 + 2240: 224 Load 226(s2DShadow) + 2241: 53(fvec2) Load 148(c2) + 2242: 52(float) Load 215(compare) + 2243: 7(fvec4) ImageDrefGather 2240 2241 2242 + 2244: 7(fvec4) Load 2184(texel) + 2245: 7(fvec4) FAdd 2244 2243 + Store 2184(texel) 2245 + 2246: 224 Load 226(s2DShadow) + 2247: 154(fvec2) Load 156(f16c2) + 2248: 52(float) Load 215(compare) + 2249: 7(fvec4) ImageDrefGather 2246 2247 2248 + 2250: 7(fvec4) Load 2184(texel) + 2251: 7(fvec4) FAdd 2250 2249 + Store 2184(texel) 2251 + 2252: 337 Load 339(s2DArrayShadow) + 2253: 167(fvec3) Load 169(c3) + 2254: 52(float) Load 215(compare) + 2255: 7(fvec4) ImageDrefGather 2252 2253 2254 + 2256: 7(fvec4) Load 2184(texel) + 2257: 7(fvec4) FAdd 2256 2255 + Store 2184(texel) 2257 + 2258: 337 Load 339(s2DArrayShadow) + 2259: 175(fvec3) Load 177(f16c3) + 2260: 52(float) Load 215(compare) + 2261: 7(fvec4) ImageDrefGather 2258 2259 2260 + 2262: 7(fvec4) Load 2184(texel) + 2263: 7(fvec4) FAdd 2262 2261 + Store 2184(texel) 2263 + 2264: 245 Load 247(sCubeShadow) + 2265: 167(fvec3) Load 169(c3) + 2266: 52(float) Load 215(compare) + 2267: 7(fvec4) ImageDrefGather 2264 2265 2266 + 2268: 7(fvec4) Load 2184(texel) + 2269: 7(fvec4) FAdd 2268 2267 + Store 2184(texel) 2269 + 2270: 245 Load 247(sCubeShadow) + 2271: 175(fvec3) Load 177(f16c3) + 2272: 52(float) Load 215(compare) + 2273: 7(fvec4) ImageDrefGather 2270 2271 2272 + 2274: 7(fvec4) Load 2184(texel) + 2275: 7(fvec4) FAdd 2274 2273 + Store 2184(texel) 2275 + 2276: 391 Load 393(sCubeArrayShadow) + 2277: 249(fvec4) Load 251(c4) + 2278: 52(float) Load 215(compare) + 2279: 7(fvec4) ImageDrefGather 2276 2277 2278 + 2280: 7(fvec4) Load 2184(texel) + 2281: 7(fvec4) FAdd 2280 2279 + Store 2184(texel) 2281 + 2282: 391 Load 393(sCubeArrayShadow) + 2283: 7(fvec4) Load 309(f16c4) + 2284: 52(float) Load 215(compare) + 2285: 7(fvec4) ImageDrefGather 2282 2283 2284 + 2286: 7(fvec4) Load 2184(texel) + 2287: 7(fvec4) FAdd 2286 2285 + Store 2184(texel) 2287 + 2288: 371 Load 373(s2DRectShadow) + 2289: 53(fvec2) Load 148(c2) + 2290: 52(float) Load 215(compare) + 2291: 7(fvec4) ImageDrefGather 2288 2289 2290 + 2292: 7(fvec4) Load 2184(texel) + 2293: 7(fvec4) FAdd 2292 2291 + Store 2184(texel) 2293 + 2294: 371 Load 373(s2DRectShadow) + 2295: 154(fvec2) Load 156(f16c2) + 2296: 52(float) Load 215(compare) + 2297: 7(fvec4) ImageDrefGather 2294 2295 2296 + 2298: 7(fvec4) Load 2184(texel) + 2299: 7(fvec4) FAdd 2298 2297 + Store 2184(texel) 2299 + 2300: 7(fvec4) Load 2184(texel) + ReturnValue 2300 + FunctionEnd +37(testTextureGatherOffset(): 7(fvec4) Function None 8 + 38: Label + 2303(texel): 64(ptr) Variable Function + Store 2303(texel) 121 + 2304: 143 Load 145(s2D) + 2305: 53(fvec2) Load 148(c2) + 2306: 7(fvec4) ImageGather 2304 2305 2187 ConstOffset 722 + 2307: 7(fvec4) Load 2303(texel) + 2308: 7(fvec4) FAdd 2307 2306 + Store 2303(texel) 2308 + 2309: 143 Load 145(s2D) + 2310: 154(fvec2) Load 156(f16c2) + 2311: 6(float) Load 137(f16bias) + 2312: 7(fvec4) ImageGather 2309 2310 2187 Bias ConstOffset 2311 722 + 2313: 7(fvec4) Load 2303(texel) + 2314: 7(fvec4) FAdd 2313 2312 + Store 2303(texel) 2314 + 2315: 284 Load 286(s2DArray) + 2316: 167(fvec3) Load 169(c3) + 2317: 7(fvec4) ImageGather 2315 2316 2187 ConstOffset 722 + 2318: 7(fvec4) Load 2303(texel) + 2319: 7(fvec4) FAdd 2318 2317 + Store 2303(texel) 2319 + 2320: 284 Load 286(s2DArray) + 2321: 175(fvec3) Load 177(f16c3) + 2322: 6(float) Load 137(f16bias) + 2323: 7(fvec4) ImageGather 2320 2321 2187 Bias ConstOffset 2322 722 + 2324: 7(fvec4) Load 2303(texel) + 2325: 7(fvec4) FAdd 2324 2323 + Store 2303(texel) 2325 + 2326: 357 Load 359(s2DRect) + 2327: 53(fvec2) Load 148(c2) + 2328: 7(fvec4) ImageGather 2326 2327 2187 ConstOffset 722 + 2329: 7(fvec4) Load 2303(texel) + 2330: 7(fvec4) FAdd 2329 2328 + Store 2303(texel) 2330 + 2331: 357 Load 359(s2DRect) + 2332: 154(fvec2) Load 156(f16c2) + 2333: 7(fvec4) ImageGather 2331 2332 2187 ConstOffset 722 + 2334: 7(fvec4) Load 2303(texel) + 2335: 7(fvec4) FAdd 2334 2333 + Store 2303(texel) 2335 + 2336: 224 Load 226(s2DShadow) + 2337: 53(fvec2) Load 148(c2) + 2338: 52(float) Load 215(compare) + 2339: 7(fvec4) ImageDrefGather 2336 2337 2338 ConstOffset 722 + 2340: 7(fvec4) Load 2303(texel) + 2341: 7(fvec4) FAdd 2340 2339 + Store 2303(texel) 2341 + 2342: 224 Load 226(s2DShadow) + 2343: 154(fvec2) Load 156(f16c2) + 2344: 52(float) Load 215(compare) + 2345: 7(fvec4) ImageDrefGather 2342 2343 2344 ConstOffset 722 + 2346: 7(fvec4) Load 2303(texel) + 2347: 7(fvec4) FAdd 2346 2345 + Store 2303(texel) 2347 + 2348: 337 Load 339(s2DArrayShadow) + 2349: 167(fvec3) Load 169(c3) + 2350: 52(float) Load 215(compare) + 2351: 7(fvec4) ImageDrefGather 2348 2349 2350 ConstOffset 722 + 2352: 7(fvec4) Load 2303(texel) + 2353: 7(fvec4) FAdd 2352 2351 + Store 2303(texel) 2353 + 2354: 337 Load 339(s2DArrayShadow) + 2355: 175(fvec3) Load 177(f16c3) + 2356: 52(float) Load 215(compare) + 2357: 7(fvec4) ImageDrefGather 2354 2355 2356 ConstOffset 722 + 2358: 7(fvec4) Load 2303(texel) + 2359: 7(fvec4) FAdd 2358 2357 + Store 2303(texel) 2359 + 2360: 371 Load 373(s2DRectShadow) + 2361: 53(fvec2) Load 148(c2) + 2362: 52(float) Load 215(compare) + 2363: 7(fvec4) ImageDrefGather 2360 2361 2362 ConstOffset 722 + 2364: 7(fvec4) Load 2303(texel) + 2365: 7(fvec4) FAdd 2364 2363 + Store 2303(texel) 2365 + 2366: 371 Load 373(s2DRectShadow) + 2367: 154(fvec2) Load 156(f16c2) + 2368: 52(float) Load 215(compare) + 2369: 7(fvec4) ImageDrefGather 2366 2367 2368 ConstOffset 722 + 2370: 7(fvec4) Load 2303(texel) + 2371: 7(fvec4) FAdd 2370 2369 + Store 2303(texel) 2371 + 2372: 7(fvec4) Load 2303(texel) + ReturnValue 2372 + FunctionEnd +39(testTextureGatherOffsets(): 7(fvec4) Function None 8 + 40: Label + 2375(texel): 64(ptr) Variable Function + Store 2375(texel) 121 + 2376: 143 Load 145(s2D) + 2377: 53(fvec2) Load 148(c2) + 2381: 7(fvec4) ImageGather 2376 2377 2187 ConstOffsets 2380 + 2382: 7(fvec4) Load 2375(texel) + 2383: 7(fvec4) FAdd 2382 2381 + Store 2375(texel) 2383 + 2384: 143 Load 145(s2D) + 2385: 154(fvec2) Load 156(f16c2) + 2386: 6(float) Load 137(f16bias) + 2387: 7(fvec4) ImageGather 2384 2385 2187 Bias ConstOffsets 2386 2380 + 2388: 7(fvec4) Load 2375(texel) + 2389: 7(fvec4) FAdd 2388 2387 + Store 2375(texel) 2389 + 2390: 284 Load 286(s2DArray) + 2391: 167(fvec3) Load 169(c3) + 2392: 7(fvec4) ImageGather 2390 2391 2187 ConstOffsets 2380 + 2393: 7(fvec4) Load 2375(texel) + 2394: 7(fvec4) FAdd 2393 2392 + Store 2375(texel) 2394 + 2395: 284 Load 286(s2DArray) + 2396: 175(fvec3) Load 177(f16c3) + 2397: 6(float) Load 137(f16bias) + 2398: 7(fvec4) ImageGather 2395 2396 2187 Bias ConstOffsets 2397 2380 + 2399: 7(fvec4) Load 2375(texel) + 2400: 7(fvec4) FAdd 2399 2398 + Store 2375(texel) 2400 + 2401: 357 Load 359(s2DRect) + 2402: 53(fvec2) Load 148(c2) + 2403: 7(fvec4) ImageGather 2401 2402 2187 ConstOffsets 2380 + 2404: 7(fvec4) Load 2375(texel) + 2405: 7(fvec4) FAdd 2404 2403 + Store 2375(texel) 2405 + 2406: 357 Load 359(s2DRect) + 2407: 154(fvec2) Load 156(f16c2) + 2408: 7(fvec4) ImageGather 2406 2407 2187 ConstOffsets 2380 + 2409: 7(fvec4) Load 2375(texel) + 2410: 7(fvec4) FAdd 2409 2408 + Store 2375(texel) 2410 + 2411: 224 Load 226(s2DShadow) + 2412: 53(fvec2) Load 148(c2) + 2413: 52(float) Load 215(compare) + 2414: 7(fvec4) ImageDrefGather 2411 2412 2413 ConstOffsets 2380 + 2415: 7(fvec4) Load 2375(texel) + 2416: 7(fvec4) FAdd 2415 2414 + Store 2375(texel) 2416 + 2417: 224 Load 226(s2DShadow) + 2418: 154(fvec2) Load 156(f16c2) + 2419: 52(float) Load 215(compare) + 2420: 7(fvec4) ImageDrefGather 2417 2418 2419 ConstOffsets 2380 + 2421: 7(fvec4) Load 2375(texel) + 2422: 7(fvec4) FAdd 2421 2420 + Store 2375(texel) 2422 + 2423: 337 Load 339(s2DArrayShadow) + 2424: 167(fvec3) Load 169(c3) + 2425: 52(float) Load 215(compare) + 2426: 7(fvec4) ImageDrefGather 2423 2424 2425 ConstOffsets 2380 + 2427: 7(fvec4) Load 2375(texel) + 2428: 7(fvec4) FAdd 2427 2426 + Store 2375(texel) 2428 + 2429: 337 Load 339(s2DArrayShadow) + 2430: 175(fvec3) Load 177(f16c3) + 2431: 52(float) Load 215(compare) + 2432: 7(fvec4) ImageDrefGather 2429 2430 2431 ConstOffsets 2380 + 2433: 7(fvec4) Load 2375(texel) + 2434: 7(fvec4) FAdd 2433 2432 + Store 2375(texel) 2434 + 2435: 371 Load 373(s2DRectShadow) + 2436: 53(fvec2) Load 148(c2) + 2437: 52(float) Load 215(compare) + 2438: 7(fvec4) ImageDrefGather 2435 2436 2437 ConstOffsets 2380 + 2439: 7(fvec4) Load 2375(texel) + 2440: 7(fvec4) FAdd 2439 2438 + Store 2375(texel) 2440 + 2441: 371 Load 373(s2DRectShadow) + 2442: 154(fvec2) Load 156(f16c2) + 2443: 52(float) Load 215(compare) + 2444: 7(fvec4) ImageDrefGather 2441 2442 2443 ConstOffsets 2380 + 2445: 7(fvec4) Load 2375(texel) + 2446: 7(fvec4) FAdd 2445 2444 + Store 2375(texel) 2446 + 2447: 7(fvec4) Load 2375(texel) + ReturnValue 2447 + FunctionEnd +41(testTextureGatherLod(): 7(fvec4) Function None 8 + 42: Label + 2450(texel): 64(ptr) Variable Function + Store 2450(texel) 121 + 2451: 143 Load 145(s2D) + 2452: 53(fvec2) Load 148(c2) + 2453: 52(float) Load 565(lod) + 2454: 7(fvec4) ImageGather 2451 2452 2187 Lod 2453 + 2455: 7(fvec4) Load 2450(texel) + 2456: 7(fvec4) FAdd 2455 2454 + Store 2450(texel) 2456 + 2457: 143 Load 145(s2D) + 2458: 154(fvec2) Load 156(f16c2) + 2459: 6(float) Load 572(f16lod) + 2460: 7(fvec4) ImageGather 2457 2458 2187 Lod 2459 + 2461: 7(fvec4) Load 2450(texel) + 2462: 7(fvec4) FAdd 2461 2460 + Store 2450(texel) 2462 + 2463: 284 Load 286(s2DArray) + 2464: 167(fvec3) Load 169(c3) + 2465: 52(float) Load 565(lod) + 2466: 7(fvec4) ImageGather 2463 2464 2187 Lod 2465 + 2467: 7(fvec4) Load 2450(texel) + 2468: 7(fvec4) FAdd 2467 2466 + Store 2450(texel) 2468 + 2469: 284 Load 286(s2DArray) + 2470: 175(fvec3) Load 177(f16c3) + 2471: 6(float) Load 572(f16lod) + 2472: 7(fvec4) ImageGather 2469 2470 2187 Lod 2471 + 2473: 7(fvec4) Load 2450(texel) + 2474: 7(fvec4) FAdd 2473 2472 + Store 2450(texel) 2474 + 2475: 184 Load 186(sCube) + 2476: 167(fvec3) Load 169(c3) + 2477: 52(float) Load 565(lod) + 2478: 7(fvec4) ImageGather 2475 2476 2187 Lod 2477 + 2479: 7(fvec4) Load 2450(texel) + 2480: 7(fvec4) FAdd 2479 2478 + Store 2450(texel) 2480 + 2481: 184 Load 186(sCube) + 2482: 175(fvec3) Load 177(f16c3) + 2483: 6(float) Load 572(f16lod) + 2484: 7(fvec4) ImageGather 2481 2482 2187 Lod 2483 + 2485: 7(fvec4) Load 2450(texel) + 2486: 7(fvec4) FAdd 2485 2484 + Store 2450(texel) 2486 + 2487: 299 Load 301(sCubeArray) + 2488: 249(fvec4) Load 251(c4) + 2489: 52(float) Load 565(lod) + 2490: 7(fvec4) ImageGather 2487 2488 2187 Lod 2489 + 2491: 7(fvec4) Load 2450(texel) + 2492: 7(fvec4) FAdd 2491 2490 + Store 2450(texel) 2492 + 2493: 299 Load 301(sCubeArray) + 2494: 7(fvec4) Load 309(f16c4) + 2495: 6(float) Load 572(f16lod) + 2496: 7(fvec4) ImageGather 2493 2494 2187 Lod 2495 + 2497: 7(fvec4) Load 2450(texel) + 2498: 7(fvec4) FAdd 2497 2496 + Store 2450(texel) 2498 + 2499: 7(fvec4) Load 2450(texel) + ReturnValue 2499 + FunctionEnd +43(testTextureGatherLodOffset(): 7(fvec4) Function None 8 + 44: Label + 2502(texel): 64(ptr) Variable Function + Store 2502(texel) 121 + 2503: 143 Load 145(s2D) + 2504: 53(fvec2) Load 148(c2) + 2505: 52(float) Load 565(lod) + 2506: 7(fvec4) ImageGather 2503 2504 2187 Lod ConstOffset 2505 722 + 2507: 7(fvec4) Load 2502(texel) + 2508: 7(fvec4) FAdd 2507 2506 + Store 2502(texel) 2508 + 2509: 143 Load 145(s2D) + 2510: 154(fvec2) Load 156(f16c2) + 2511: 6(float) Load 572(f16lod) + 2512: 7(fvec4) ImageGather 2509 2510 2187 Lod ConstOffset 2511 722 + 2513: 7(fvec4) Load 2502(texel) + 2514: 7(fvec4) FAdd 2513 2512 + Store 2502(texel) 2514 + 2515: 284 Load 286(s2DArray) + 2516: 167(fvec3) Load 169(c3) + 2517: 52(float) Load 565(lod) + 2518: 7(fvec4) ImageGather 2515 2516 2187 Lod ConstOffset 2517 722 + 2519: 7(fvec4) Load 2502(texel) + 2520: 7(fvec4) FAdd 2519 2518 + Store 2502(texel) 2520 + 2521: 284 Load 286(s2DArray) + 2522: 175(fvec3) Load 177(f16c3) + 2523: 6(float) Load 572(f16lod) + 2524: 7(fvec4) ImageGather 2521 2522 2187 Lod ConstOffset 2523 722 + 2525: 7(fvec4) Load 2502(texel) + 2526: 7(fvec4) FAdd 2525 2524 + Store 2502(texel) 2526 + 2527: 7(fvec4) Load 2502(texel) + ReturnValue 2527 + FunctionEnd +45(testTextureGatherLodOffsets(): 7(fvec4) Function None 8 + 46: Label + 2530(texel): 64(ptr) Variable Function + Store 2530(texel) 121 + 2531: 143 Load 145(s2D) + 2532: 53(fvec2) Load 148(c2) + 2533: 52(float) Load 565(lod) + 2534: 7(fvec4) ImageGather 2531 2532 2187 Lod ConstOffsets 2533 2380 + 2535: 7(fvec4) Load 2530(texel) + 2536: 7(fvec4) FAdd 2535 2534 + Store 2530(texel) 2536 + 2537: 143 Load 145(s2D) + 2538: 154(fvec2) Load 156(f16c2) + 2539: 6(float) Load 572(f16lod) + 2540: 7(fvec4) ImageGather 2537 2538 2187 Lod ConstOffsets 2539 2380 + 2541: 7(fvec4) Load 2530(texel) + 2542: 7(fvec4) FAdd 2541 2540 + Store 2530(texel) 2542 + 2543: 284 Load 286(s2DArray) + 2544: 167(fvec3) Load 169(c3) + 2545: 52(float) Load 565(lod) + 2546: 7(fvec4) ImageGather 2543 2544 2187 Lod ConstOffsets 2545 2380 + 2547: 7(fvec4) Load 2530(texel) + 2548: 7(fvec4) FAdd 2547 2546 + Store 2530(texel) 2548 + 2549: 284 Load 286(s2DArray) + 2550: 175(fvec3) Load 177(f16c3) + 2551: 6(float) Load 572(f16lod) + 2552: 7(fvec4) ImageGather 2549 2550 2187 Lod ConstOffsets 2551 2380 + 2553: 7(fvec4) Load 2530(texel) + 2554: 7(fvec4) FAdd 2553 2552 + Store 2530(texel) 2554 + 2555: 7(fvec4) Load 2530(texel) + ReturnValue 2555 + FunctionEnd +50(testTextureSize(): 48(ivec4) Function None 49 + 51: Label + 2559(size): 2558(ptr) Variable Function + Store 2559(size) 2560 + 2561: 123 Load 125(s1D) + 2562: 52(float) Load 565(lod) + 2563: 47(int) ConvertFToS 2562 + 2564: 122 Image 2561 + 2565: 47(int) ImageQuerySizeLod 2564 2563 + 2567: 2566(ptr) AccessChain 2559(size) 207 + 2568: 47(int) Load 2567 + 2569: 47(int) IAdd 2568 2565 + 2570: 2566(ptr) AccessChain 2559(size) 207 + Store 2570 2569 + 2571: 143 Load 145(s2D) + 2572: 52(float) Load 565(lod) + 2573: 47(int) ConvertFToS 2572 + 2574: 142 Image 2571 + 2575: 721(ivec2) ImageQuerySizeLod 2574 2573 + 2576: 48(ivec4) Load 2559(size) + 2577: 721(ivec2) VectorShuffle 2576 2576 0 1 + 2578: 721(ivec2) IAdd 2577 2575 + 2579: 48(ivec4) Load 2559(size) + 2580: 48(ivec4) VectorShuffle 2579 2578 4 5 2 3 + Store 2559(size) 2580 + 2581: 163 Load 165(s3D) + 2582: 52(float) Load 565(lod) + 2583: 47(int) ConvertFToS 2582 + 2584: 162 Image 2581 + 2585: 734(ivec3) ImageQuerySizeLod 2584 2583 + 2586: 48(ivec4) Load 2559(size) + 2587: 734(ivec3) VectorShuffle 2586 2586 0 1 2 + 2588: 734(ivec3) IAdd 2587 2585 + 2589: 48(ivec4) Load 2559(size) + 2590: 48(ivec4) VectorShuffle 2589 2588 4 5 6 3 + Store 2559(size) 2590 + 2591: 184 Load 186(sCube) + 2592: 52(float) Load 565(lod) + 2593: 47(int) ConvertFToS 2592 + 2594: 183 Image 2591 + 2595: 721(ivec2) ImageQuerySizeLod 2594 2593 + 2596: 48(ivec4) Load 2559(size) + 2597: 721(ivec2) VectorShuffle 2596 2596 0 1 + 2598: 721(ivec2) IAdd 2597 2595 + 2599: 48(ivec4) Load 2559(size) + 2600: 48(ivec4) VectorShuffle 2599 2598 4 5 2 3 + Store 2559(size) 2600 + 2601: 199 Load 201(s1DShadow) + 2602: 52(float) Load 565(lod) + 2603: 47(int) ConvertFToS 2602 + 2604: 198 Image 2601 + 2605: 47(int) ImageQuerySizeLod 2604 2603 + 2606: 2566(ptr) AccessChain 2559(size) 207 + 2607: 47(int) Load 2606 + 2608: 47(int) IAdd 2607 2605 + 2609: 2566(ptr) AccessChain 2559(size) 207 + Store 2609 2608 + 2610: 224 Load 226(s2DShadow) + 2611: 52(float) Load 565(lod) + 2612: 47(int) ConvertFToS 2611 + 2613: 223 Image 2610 + 2614: 721(ivec2) ImageQuerySizeLod 2613 2612 + 2615: 48(ivec4) Load 2559(size) + 2616: 721(ivec2) VectorShuffle 2615 2615 0 1 + 2617: 721(ivec2) IAdd 2616 2614 + 2618: 48(ivec4) Load 2559(size) + 2619: 48(ivec4) VectorShuffle 2618 2617 4 5 2 3 + Store 2559(size) 2619 + 2620: 245 Load 247(sCubeShadow) + 2621: 52(float) Load 565(lod) + 2622: 47(int) ConvertFToS 2621 + 2623: 244 Image 2620 + 2624: 721(ivec2) ImageQuerySizeLod 2623 2622 + 2625: 48(ivec4) Load 2559(size) + 2626: 721(ivec2) VectorShuffle 2625 2625 0 1 + 2627: 721(ivec2) IAdd 2626 2624 + 2628: 48(ivec4) Load 2559(size) + 2629: 48(ivec4) VectorShuffle 2628 2627 4 5 2 3 + Store 2559(size) 2629 + 2630: 299 Load 301(sCubeArray) + 2631: 52(float) Load 565(lod) + 2632: 47(int) ConvertFToS 2631 + 2633: 298 Image 2630 + 2634: 734(ivec3) ImageQuerySizeLod 2633 2632 + 2635: 48(ivec4) Load 2559(size) + 2636: 734(ivec3) VectorShuffle 2635 2635 0 1 2 + 2637: 734(ivec3) IAdd 2636 2634 + 2638: 48(ivec4) Load 2559(size) + 2639: 48(ivec4) VectorShuffle 2638 2637 4 5 6 3 + Store 2559(size) 2639 + 2640: 391 Load 393(sCubeArrayShadow) + 2641: 52(float) Load 565(lod) + 2642: 47(int) ConvertFToS 2641 + 2643: 390 Image 2640 + 2644: 734(ivec3) ImageQuerySizeLod 2643 2642 + 2645: 48(ivec4) Load 2559(size) + 2646: 734(ivec3) VectorShuffle 2645 2645 0 1 2 + 2647: 734(ivec3) IAdd 2646 2644 + 2648: 48(ivec4) Load 2559(size) + 2649: 48(ivec4) VectorShuffle 2648 2647 4 5 6 3 + Store 2559(size) 2649 + 2650: 357 Load 359(s2DRect) + 2651: 356 Image 2650 + 2652: 721(ivec2) ImageQuerySize 2651 + 2653: 48(ivec4) Load 2559(size) + 2654: 721(ivec2) VectorShuffle 2653 2653 0 1 + 2655: 721(ivec2) IAdd 2654 2652 + 2656: 48(ivec4) Load 2559(size) + 2657: 48(ivec4) VectorShuffle 2656 2655 4 5 2 3 + Store 2559(size) 2657 + 2658: 371 Load 373(s2DRectShadow) + 2659: 370 Image 2658 + 2660: 721(ivec2) ImageQuerySize 2659 + 2661: 48(ivec4) Load 2559(size) + 2662: 721(ivec2) VectorShuffle 2661 2661 0 1 + 2663: 721(ivec2) IAdd 2662 2660 + 2664: 48(ivec4) Load 2559(size) + 2665: 48(ivec4) VectorShuffle 2664 2663 4 5 2 3 + Store 2559(size) 2665 + 2666: 269 Load 271(s1DArray) + 2667: 52(float) Load 565(lod) + 2668: 47(int) ConvertFToS 2667 + 2669: 268 Image 2666 + 2670: 721(ivec2) ImageQuerySizeLod 2669 2668 + 2671: 48(ivec4) Load 2559(size) + 2672: 721(ivec2) VectorShuffle 2671 2671 0 1 + 2673: 721(ivec2) IAdd 2672 2670 + 2674: 48(ivec4) Load 2559(size) + 2675: 48(ivec4) VectorShuffle 2674 2673 4 5 2 3 + Store 2559(size) 2675 + 2676: 284 Load 286(s2DArray) + 2677: 52(float) Load 565(lod) + 2678: 47(int) ConvertFToS 2677 + 2679: 283 Image 2676 + 2680: 734(ivec3) ImageQuerySizeLod 2679 2678 + 2681: 48(ivec4) Load 2559(size) + 2682: 734(ivec3) VectorShuffle 2681 2681 0 1 2 + 2683: 734(ivec3) IAdd 2682 2680 + 2684: 48(ivec4) Load 2559(size) + 2685: 48(ivec4) VectorShuffle 2684 2683 4 5 6 3 + Store 2559(size) 2685 + 2686: 316 Load 318(s1DArrayShadow) + 2687: 52(float) Load 565(lod) + 2688: 47(int) ConvertFToS 2687 + 2689: 315 Image 2686 + 2690: 721(ivec2) ImageQuerySizeLod 2689 2688 + 2691: 48(ivec4) Load 2559(size) + 2692: 721(ivec2) VectorShuffle 2691 2691 0 1 + 2693: 721(ivec2) IAdd 2692 2690 + 2694: 48(ivec4) Load 2559(size) + 2695: 48(ivec4) VectorShuffle 2694 2693 4 5 2 3 + Store 2559(size) 2695 + 2696: 337 Load 339(s2DArrayShadow) + 2697: 52(float) Load 565(lod) + 2698: 47(int) ConvertFToS 2697 + 2699: 336 Image 2696 + 2700: 734(ivec3) ImageQuerySizeLod 2699 2698 + 2701: 48(ivec4) Load 2559(size) + 2702: 734(ivec3) VectorShuffle 2701 2701 0 1 2 + 2703: 734(ivec3) IAdd 2702 2700 + 2704: 48(ivec4) Load 2559(size) + 2705: 48(ivec4) VectorShuffle 2704 2703 4 5 6 3 + Store 2559(size) 2705 + 2706: 1298 Load 1300(sBuffer) + 2707: 1297 Image 2706 + 2708: 47(int) ImageQuerySize 2707 + 2709: 2566(ptr) AccessChain 2559(size) 207 + 2710: 47(int) Load 2709 + 2711: 47(int) IAdd 2710 2708 + 2712: 2566(ptr) AccessChain 2559(size) 207 + Store 2712 2711 + 2713: 1309 Load 1311(s2DMS) + 2714: 1308 Image 2713 + 2715: 721(ivec2) ImageQuerySize 2714 + 2716: 48(ivec4) Load 2559(size) + 2717: 721(ivec2) VectorShuffle 2716 2716 0 1 + 2718: 721(ivec2) IAdd 2717 2715 + 2719: 48(ivec4) Load 2559(size) + 2720: 48(ivec4) VectorShuffle 2719 2718 4 5 2 3 + Store 2559(size) 2720 + 2721: 1320 Load 1322(s2DMSArray) + 2722: 1319 Image 2721 + 2723: 734(ivec3) ImageQuerySize 2722 + 2724: 48(ivec4) Load 2559(size) + 2725: 734(ivec3) VectorShuffle 2724 2724 0 1 2 + 2726: 734(ivec3) IAdd 2725 2723 + 2727: 48(ivec4) Load 2559(size) + 2728: 48(ivec4) VectorShuffle 2727 2726 4 5 6 3 + Store 2559(size) 2728 + 2729: 48(ivec4) Load 2559(size) + ReturnValue 2729 + FunctionEnd +55(testTextureQueryLod(): 53(fvec2) Function None 54 + 56: Label + 2733(lod): 2732(ptr) Variable Function + Store 2733(lod) 2735 + 2736: 123 Load 125(s1D) + 2737: 52(float) Load 128(c1) + 2738: 53(fvec2) ImageQueryLod 2736 2737 + 2739: 53(fvec2) Load 2733(lod) + 2740: 53(fvec2) FAdd 2739 2738 + Store 2733(lod) 2740 + 2741: 123 Load 125(s1D) + 2742: 6(float) Load 135(f16c1) + 2743: 154(fvec2) ImageQueryLod 2741 2742 + 2744: 53(fvec2) Load 2733(lod) + 2745: 53(fvec2) FAdd 2744 2743 + Store 2733(lod) 2745 + 2746: 143 Load 145(s2D) + 2747: 53(fvec2) Load 148(c2) + 2748: 53(fvec2) ImageQueryLod 2746 2747 + 2749: 53(fvec2) Load 2733(lod) + 2750: 53(fvec2) FAdd 2749 2748 + Store 2733(lod) 2750 + 2751: 143 Load 145(s2D) + 2752: 154(fvec2) Load 156(f16c2) + 2753: 154(fvec2) ImageQueryLod 2751 2752 + 2754: 53(fvec2) Load 2733(lod) + 2755: 53(fvec2) FAdd 2754 2753 + Store 2733(lod) 2755 + 2756: 163 Load 165(s3D) + 2757: 167(fvec3) Load 169(c3) + 2758: 53(fvec2) ImageQueryLod 2756 2757 + 2759: 53(fvec2) Load 2733(lod) + 2760: 53(fvec2) FAdd 2759 2758 + Store 2733(lod) 2760 + 2761: 163 Load 165(s3D) + 2762: 175(fvec3) Load 177(f16c3) + 2763: 154(fvec2) ImageQueryLod 2761 2762 + 2764: 53(fvec2) Load 2733(lod) + 2765: 53(fvec2) FAdd 2764 2763 + Store 2733(lod) 2765 + 2766: 184 Load 186(sCube) + 2767: 167(fvec3) Load 169(c3) + 2768: 53(fvec2) ImageQueryLod 2766 2767 + 2769: 53(fvec2) Load 2733(lod) + 2770: 53(fvec2) FAdd 2769 2768 + Store 2733(lod) 2770 + 2771: 184 Load 186(sCube) + 2772: 175(fvec3) Load 177(f16c3) + 2773: 154(fvec2) ImageQueryLod 2771 2772 + 2774: 53(fvec2) Load 2733(lod) + 2775: 53(fvec2) FAdd 2774 2773 + Store 2733(lod) 2775 + 2776: 269 Load 271(s1DArray) + 2777: 52(float) Load 128(c1) + 2778: 53(fvec2) ImageQueryLod 2776 2777 + 2779: 53(fvec2) Load 2733(lod) + 2780: 53(fvec2) FAdd 2779 2778 + Store 2733(lod) 2780 + 2781: 269 Load 271(s1DArray) + 2782: 6(float) Load 135(f16c1) + 2783: 154(fvec2) ImageQueryLod 2781 2782 + 2784: 53(fvec2) Load 2733(lod) + 2785: 53(fvec2) FAdd 2784 2783 + Store 2733(lod) 2785 + 2786: 284 Load 286(s2DArray) + 2787: 53(fvec2) Load 148(c2) + 2788: 53(fvec2) ImageQueryLod 2786 2787 + 2789: 53(fvec2) Load 2733(lod) + 2790: 53(fvec2) FAdd 2789 2788 + Store 2733(lod) 2790 + 2791: 284 Load 286(s2DArray) + 2792: 154(fvec2) Load 156(f16c2) + 2793: 154(fvec2) ImageQueryLod 2791 2792 + 2794: 53(fvec2) Load 2733(lod) + 2795: 53(fvec2) FAdd 2794 2793 + Store 2733(lod) 2795 + 2796: 299 Load 301(sCubeArray) + 2797: 167(fvec3) Load 169(c3) + 2798: 53(fvec2) ImageQueryLod 2796 2797 + 2799: 53(fvec2) Load 2733(lod) + 2800: 53(fvec2) FAdd 2799 2798 + Store 2733(lod) 2800 + 2801: 299 Load 301(sCubeArray) + 2802: 175(fvec3) Load 177(f16c3) + 2803: 154(fvec2) ImageQueryLod 2801 2802 + 2804: 53(fvec2) Load 2733(lod) + 2805: 53(fvec2) FAdd 2804 2803 + Store 2733(lod) 2805 + 2806: 199 Load 201(s1DShadow) + 2807: 52(float) Load 128(c1) + 2808: 53(fvec2) ImageQueryLod 2806 2807 + 2809: 53(fvec2) Load 2733(lod) + 2810: 53(fvec2) FAdd 2809 2808 + Store 2733(lod) 2810 + 2811: 199 Load 201(s1DShadow) + 2812: 6(float) Load 135(f16c1) + 2813: 154(fvec2) ImageQueryLod 2811 2812 + 2814: 53(fvec2) Load 2733(lod) + 2815: 53(fvec2) FAdd 2814 2813 + Store 2733(lod) 2815 + 2816: 224 Load 226(s2DShadow) + 2817: 53(fvec2) Load 148(c2) + 2818: 53(fvec2) ImageQueryLod 2816 2817 + 2819: 53(fvec2) Load 2733(lod) + 2820: 53(fvec2) FAdd 2819 2818 + Store 2733(lod) 2820 + 2821: 224 Load 226(s2DShadow) + 2822: 154(fvec2) Load 156(f16c2) + 2823: 154(fvec2) ImageQueryLod 2821 2822 + 2824: 53(fvec2) Load 2733(lod) + 2825: 53(fvec2) FAdd 2824 2823 + Store 2733(lod) 2825 + 2826: 391 Load 393(sCubeArrayShadow) + 2827: 167(fvec3) Load 169(c3) + 2828: 53(fvec2) ImageQueryLod 2826 2827 + 2829: 53(fvec2) Load 2733(lod) + 2830: 53(fvec2) FAdd 2829 2828 + Store 2733(lod) 2830 + 2831: 391 Load 393(sCubeArrayShadow) + 2832: 175(fvec3) Load 177(f16c3) + 2833: 154(fvec2) ImageQueryLod 2831 2832 + 2834: 53(fvec2) Load 2733(lod) + 2835: 53(fvec2) FAdd 2834 2833 + Store 2733(lod) 2835 + 2836: 316 Load 318(s1DArrayShadow) + 2837: 52(float) Load 128(c1) + 2838: 53(fvec2) ImageQueryLod 2836 2837 + 2839: 53(fvec2) Load 2733(lod) + 2840: 53(fvec2) FAdd 2839 2838 + Store 2733(lod) 2840 + 2841: 316 Load 318(s1DArrayShadow) + 2842: 6(float) Load 135(f16c1) + 2843: 154(fvec2) ImageQueryLod 2841 2842 + 2844: 53(fvec2) Load 2733(lod) + 2845: 53(fvec2) FAdd 2844 2843 + Store 2733(lod) 2845 + 2846: 337 Load 339(s2DArrayShadow) + 2847: 53(fvec2) Load 148(c2) + 2848: 53(fvec2) ImageQueryLod 2846 2847 + 2849: 53(fvec2) Load 2733(lod) + 2850: 53(fvec2) FAdd 2849 2848 + Store 2733(lod) 2850 + 2851: 337 Load 339(s2DArrayShadow) + 2852: 154(fvec2) Load 156(f16c2) + 2853: 154(fvec2) ImageQueryLod 2851 2852 + 2854: 53(fvec2) Load 2733(lod) + 2855: 53(fvec2) FAdd 2854 2853 + Store 2733(lod) 2855 + 2856: 391 Load 393(sCubeArrayShadow) + 2857: 167(fvec3) Load 169(c3) + 2858: 53(fvec2) ImageQueryLod 2856 2857 + 2859: 53(fvec2) Load 2733(lod) + 2860: 53(fvec2) FAdd 2859 2858 + Store 2733(lod) 2860 + 2861: 391 Load 393(sCubeArrayShadow) + 2862: 175(fvec3) Load 177(f16c3) + 2863: 154(fvec2) ImageQueryLod 2861 2862 + 2864: 53(fvec2) Load 2733(lod) + 2865: 53(fvec2) FAdd 2864 2863 + Store 2733(lod) 2865 + 2866: 53(fvec2) Load 2733(lod) + ReturnValue 2866 + FunctionEnd +58(testTextureQueryLevels(): 47(int) Function None 57 + 59: Label + 2869(levels): 2566(ptr) Variable Function + Store 2869(levels) 2187 + 2870: 123 Load 125(s1D) + 2871: 122 Image 2870 + 2872: 47(int) ImageQueryLevels 2871 + 2873: 47(int) Load 2869(levels) + 2874: 47(int) IAdd 2873 2872 + Store 2869(levels) 2874 + 2875: 143 Load 145(s2D) + 2876: 142 Image 2875 + 2877: 47(int) ImageQueryLevels 2876 + 2878: 47(int) Load 2869(levels) + 2879: 47(int) IAdd 2878 2877 + Store 2869(levels) 2879 + 2880: 163 Load 165(s3D) + 2881: 162 Image 2880 + 2882: 47(int) ImageQueryLevels 2881 + 2883: 47(int) Load 2869(levels) + 2884: 47(int) IAdd 2883 2882 + Store 2869(levels) 2884 + 2885: 184 Load 186(sCube) + 2886: 183 Image 2885 + 2887: 47(int) ImageQueryLevels 2886 + 2888: 47(int) Load 2869(levels) + 2889: 47(int) IAdd 2888 2887 + Store 2869(levels) 2889 + 2890: 199 Load 201(s1DShadow) + 2891: 198 Image 2890 + 2892: 47(int) ImageQueryLevels 2891 + 2893: 47(int) Load 2869(levels) + 2894: 47(int) IAdd 2893 2892 + Store 2869(levels) 2894 + 2895: 224 Load 226(s2DShadow) + 2896: 223 Image 2895 + 2897: 47(int) ImageQueryLevels 2896 + 2898: 47(int) Load 2869(levels) + 2899: 47(int) IAdd 2898 2897 + Store 2869(levels) 2899 + 2900: 245 Load 247(sCubeShadow) + 2901: 244 Image 2900 + 2902: 47(int) ImageQueryLevels 2901 + 2903: 47(int) Load 2869(levels) + 2904: 47(int) IAdd 2903 2902 + Store 2869(levels) 2904 + 2905: 299 Load 301(sCubeArray) + 2906: 298 Image 2905 + 2907: 47(int) ImageQueryLevels 2906 + 2908: 47(int) Load 2869(levels) + 2909: 47(int) IAdd 2908 2907 + Store 2869(levels) 2909 + 2910: 391 Load 393(sCubeArrayShadow) + 2911: 390 Image 2910 + 2912: 47(int) ImageQueryLevels 2911 + 2913: 47(int) Load 2869(levels) + 2914: 47(int) IAdd 2913 2912 + Store 2869(levels) 2914 + 2915: 269 Load 271(s1DArray) + 2916: 268 Image 2915 + 2917: 47(int) ImageQueryLevels 2916 + 2918: 47(int) Load 2869(levels) + 2919: 47(int) IAdd 2918 2917 + Store 2869(levels) 2919 + 2920: 284 Load 286(s2DArray) + 2921: 283 Image 2920 + 2922: 47(int) ImageQueryLevels 2921 + 2923: 47(int) Load 2869(levels) + 2924: 47(int) IAdd 2923 2922 + Store 2869(levels) 2924 + 2925: 316 Load 318(s1DArrayShadow) + 2926: 315 Image 2925 + 2927: 47(int) ImageQueryLevels 2926 + 2928: 47(int) Load 2869(levels) + 2929: 47(int) IAdd 2928 2927 + Store 2869(levels) 2929 + 2930: 337 Load 339(s2DArrayShadow) + 2931: 336 Image 2930 + 2932: 47(int) ImageQueryLevels 2931 + 2933: 47(int) Load 2869(levels) + 2934: 47(int) IAdd 2933 2932 + Store 2869(levels) 2934 + 2935: 47(int) Load 2869(levels) + ReturnValue 2935 + FunctionEnd +60(testTextureSamples(): 47(int) Function None 57 + 61: Label + 2938(samples): 2566(ptr) Variable Function + Store 2938(samples) 2187 + 2939: 1309 Load 1311(s2DMS) + 2940: 1308 Image 2939 + 2941: 47(int) ImageQuerySamples 2940 + 2942: 47(int) Load 2938(samples) + 2943: 47(int) IAdd 2942 2941 + Store 2938(samples) 2943 + 2944: 1320 Load 1322(s2DMSArray) + 2945: 1319 Image 2944 + 2946: 47(int) ImageQuerySamples 2945 + 2947: 47(int) Load 2938(samples) + 2948: 47(int) IAdd 2947 2946 + Store 2938(samples) 2948 + 2949: 47(int) Load 2938(samples) + ReturnValue 2949 + FunctionEnd +62(testImageLoad(): 7(fvec4) Function None 8 + 63: Label + 2952(texel): 64(ptr) Variable Function + Store 2952(texel) 121 + 2956: 2953 Load 2955(i1D) + 2957: 52(float) Load 128(c1) + 2958: 47(int) ConvertFToS 2957 + 2959: 7(fvec4) ImageRead 2956 2958 + 2960: 7(fvec4) Load 2952(texel) + 2961: 7(fvec4) FAdd 2960 2959 + Store 2952(texel) 2961 + 2965: 2962 Load 2964(i2D) + 2966: 53(fvec2) Load 148(c2) + 2967: 721(ivec2) ConvertFToS 2966 + 2968: 7(fvec4) ImageRead 2965 2967 + 2969: 7(fvec4) Load 2952(texel) + 2970: 7(fvec4) FAdd 2969 2968 + Store 2952(texel) 2970 + 2974: 2971 Load 2973(i3D) + 2975: 167(fvec3) Load 169(c3) + 2976: 734(ivec3) ConvertFToS 2975 + 2977: 7(fvec4) ImageRead 2974 2976 + 2978: 7(fvec4) Load 2952(texel) + 2979: 7(fvec4) FAdd 2978 2977 + Store 2952(texel) 2979 + 2983: 2980 Load 2982(i2DRect) + 2984: 53(fvec2) Load 148(c2) + 2985: 721(ivec2) ConvertFToS 2984 + 2986: 7(fvec4) ImageRead 2983 2985 + 2987: 7(fvec4) Load 2952(texel) + 2988: 7(fvec4) FAdd 2987 2986 + Store 2952(texel) 2988 + 2992: 2989 Load 2991(iCube) + 2993: 167(fvec3) Load 169(c3) + 2994: 734(ivec3) ConvertFToS 2993 + 2995: 7(fvec4) ImageRead 2992 2994 + 2996: 7(fvec4) Load 2952(texel) + 2997: 7(fvec4) FAdd 2996 2995 + Store 2952(texel) 2997 + 3001: 2998 Load 3000(iBuffer) + 3002: 52(float) Load 128(c1) + 3003: 47(int) ConvertFToS 3002 + 3004: 7(fvec4) ImageRead 3001 3003 + 3005: 7(fvec4) Load 2952(texel) + 3006: 7(fvec4) FAdd 3005 3004 + Store 2952(texel) 3006 + 3010: 3007 Load 3009(i1DArray) + 3011: 53(fvec2) Load 148(c2) + 3012: 721(ivec2) ConvertFToS 3011 + 3013: 7(fvec4) ImageRead 3010 3012 + 3014: 7(fvec4) Load 2952(texel) + 3015: 7(fvec4) FAdd 3014 3013 + Store 2952(texel) 3015 + 3019: 3016 Load 3018(i2DArray) + 3020: 167(fvec3) Load 169(c3) + 3021: 734(ivec3) ConvertFToS 3020 + 3022: 7(fvec4) ImageRead 3019 3021 + 3023: 7(fvec4) Load 2952(texel) + 3024: 7(fvec4) FAdd 3023 3022 + Store 2952(texel) 3024 + 3028: 3025 Load 3027(iCubeArray) + 3029: 167(fvec3) Load 169(c3) + 3030: 734(ivec3) ConvertFToS 3029 + 3031: 7(fvec4) ImageRead 3028 3030 + 3032: 7(fvec4) Load 2952(texel) + 3033: 7(fvec4) FAdd 3032 3031 + Store 2952(texel) 3033 + 3037: 3034 Load 3036(i2DMS) + 3038: 53(fvec2) Load 148(c2) + 3039: 721(ivec2) ConvertFToS 3038 + 3040: 7(fvec4) ImageRead 3037 3039 Sample 709 + 3041: 7(fvec4) Load 2952(texel) + 3042: 7(fvec4) FAdd 3041 3040 + Store 2952(texel) 3042 + 3046: 3043 Load 3045(i2DMSArray) + 3047: 167(fvec3) Load 169(c3) + 3048: 734(ivec3) ConvertFToS 3047 + 3049: 7(fvec4) ImageRead 3046 3048 Sample 709 + 3050: 7(fvec4) Load 2952(texel) + 3051: 7(fvec4) FAdd 3050 3049 + Store 2952(texel) 3051 + 3052: 7(fvec4) Load 2952(texel) + ReturnValue 3052 + FunctionEnd +67(testImageStore(vf164;): 2 Function None 65 + 66(data): 64(ptr) FunctionParameter + 68: Label + 3055: 2953 Load 2955(i1D) + 3056: 52(float) Load 128(c1) + 3057: 47(int) ConvertFToS 3056 + 3058: 7(fvec4) Load 66(data) + ImageWrite 3055 3057 3058 + 3059: 2962 Load 2964(i2D) + 3060: 53(fvec2) Load 148(c2) + 3061: 721(ivec2) ConvertFToS 3060 + 3062: 7(fvec4) Load 66(data) + ImageWrite 3059 3061 3062 + 3063: 2971 Load 2973(i3D) + 3064: 167(fvec3) Load 169(c3) + 3065: 734(ivec3) ConvertFToS 3064 + 3066: 7(fvec4) Load 66(data) + ImageWrite 3063 3065 3066 + 3067: 2980 Load 2982(i2DRect) + 3068: 53(fvec2) Load 148(c2) + 3069: 721(ivec2) ConvertFToS 3068 + 3070: 7(fvec4) Load 66(data) + ImageWrite 3067 3069 3070 + 3071: 2989 Load 2991(iCube) + 3072: 167(fvec3) Load 169(c3) + 3073: 734(ivec3) ConvertFToS 3072 + 3074: 7(fvec4) Load 66(data) + ImageWrite 3071 3073 3074 + 3075: 2998 Load 3000(iBuffer) + 3076: 52(float) Load 128(c1) + 3077: 47(int) ConvertFToS 3076 + 3078: 7(fvec4) Load 66(data) + ImageWrite 3075 3077 3078 + 3079: 3007 Load 3009(i1DArray) + 3080: 53(fvec2) Load 148(c2) + 3081: 721(ivec2) ConvertFToS 3080 + 3082: 7(fvec4) Load 66(data) + ImageWrite 3079 3081 3082 + 3083: 3016 Load 3018(i2DArray) + 3084: 167(fvec3) Load 169(c3) + 3085: 734(ivec3) ConvertFToS 3084 + 3086: 7(fvec4) Load 66(data) + ImageWrite 3083 3085 3086 + 3087: 3025 Load 3027(iCubeArray) + 3088: 167(fvec3) Load 169(c3) + 3089: 734(ivec3) ConvertFToS 3088 + 3090: 7(fvec4) Load 66(data) + ImageWrite 3087 3089 3090 + 3091: 3034 Load 3036(i2DMS) + 3092: 53(fvec2) Load 148(c2) + 3093: 721(ivec2) ConvertFToS 3092 + 3094: 7(fvec4) Load 66(data) + ImageWrite 3091 3093 3094 Sample 709 + 3095: 3043 Load 3045(i2DMSArray) + 3096: 167(fvec3) Load 169(c3) + 3097: 734(ivec3) ConvertFToS 3096 + 3098: 7(fvec4) Load 66(data) + ImageWrite 3095 3097 3098 Sample 709 + Return + FunctionEnd +69(testSparseTexture(): 7(fvec4) Function None 8 + 70: Label + 3099(texel): 64(ptr) Variable Function + Store 3099(texel) 121 + 3100: 143 Load 145(s2D) + 3101: 53(fvec2) Load 148(c2) + 3103:3102(ResType) ImageSparseSampleImplicitLod 3100 3101 + 3104: 7(fvec4) CompositeExtract 3103 1 + Store 3099(texel) 3104 + 3105: 47(int) CompositeExtract 3103 0 + 3106: 143 Load 145(s2D) + 3107: 154(fvec2) Load 156(f16c2) + 3108: 6(float) Load 137(f16bias) + 3109:3102(ResType) ImageSparseSampleImplicitLod 3106 3107 Bias 3108 + 3110: 7(fvec4) CompositeExtract 3109 1 + Store 3099(texel) 3110 + 3111: 47(int) CompositeExtract 3109 0 + 3112: 163 Load 165(s3D) + 3113: 167(fvec3) Load 169(c3) + 3114:3102(ResType) ImageSparseSampleImplicitLod 3112 3113 + 3115: 7(fvec4) CompositeExtract 3114 1 + Store 3099(texel) 3115 + 3116: 47(int) CompositeExtract 3114 0 + 3117: 163 Load 165(s3D) + 3118: 175(fvec3) Load 177(f16c3) + 3119: 6(float) Load 137(f16bias) + 3120:3102(ResType) ImageSparseSampleImplicitLod 3117 3118 Bias 3119 + 3121: 7(fvec4) CompositeExtract 3120 1 + Store 3099(texel) 3121 + 3122: 47(int) CompositeExtract 3120 0 + 3123: 184 Load 186(sCube) + 3124: 167(fvec3) Load 169(c3) + 3125:3102(ResType) ImageSparseSampleImplicitLod 3123 3124 + 3126: 7(fvec4) CompositeExtract 3125 1 + Store 3099(texel) 3126 + 3127: 47(int) CompositeExtract 3125 0 + 3128: 184 Load 186(sCube) + 3129: 175(fvec3) Load 177(f16c3) + 3130: 6(float) Load 137(f16bias) + 3131:3102(ResType) ImageSparseSampleImplicitLod 3128 3129 Bias 3130 + 3132: 7(fvec4) CompositeExtract 3131 1 + Store 3099(texel) 3132 + 3133: 47(int) CompositeExtract 3131 0 + 3134: 224 Load 226(s2DShadow) + 3135: 167(fvec3) Load 169(c3) + 3136: 208(ptr) AccessChain 3099(texel) 207 + 3137: 52(float) CompositeExtract 3135 2 + 3139:3138(ResType) ImageSparseSampleDrefImplicitLod 3134 3135 3137 + 3140: 6(float) CompositeExtract 3139 1 + Store 3136 3140 + 3141: 47(int) CompositeExtract 3139 0 + 3142: 224 Load 226(s2DShadow) + 3143: 154(fvec2) Load 156(f16c2) + 3144: 52(float) Load 215(compare) + 3145: 208(ptr) AccessChain 3099(texel) 207 + 3146: 6(float) Load 137(f16bias) + 3147:3138(ResType) ImageSparseSampleDrefImplicitLod 3142 3143 3144 Bias 3146 + 3148: 6(float) CompositeExtract 3147 1 + Store 3145 3148 + 3149: 47(int) CompositeExtract 3147 0 + 3150: 245 Load 247(sCubeShadow) + 3151: 249(fvec4) Load 251(c4) + 3152: 208(ptr) AccessChain 3099(texel) 207 + 3153: 52(float) CompositeExtract 3151 3 + 3154:3138(ResType) ImageSparseSampleDrefImplicitLod 3150 3151 3153 + 3155: 6(float) CompositeExtract 3154 1 + Store 3152 3155 + 3156: 47(int) CompositeExtract 3154 0 + 3157: 245 Load 247(sCubeShadow) + 3158: 175(fvec3) Load 177(f16c3) + 3159: 52(float) Load 215(compare) + 3160: 208(ptr) AccessChain 3099(texel) 207 + 3161: 6(float) Load 137(f16bias) + 3162:3138(ResType) ImageSparseSampleDrefImplicitLod 3157 3158 3159 Bias 3161 + 3163: 6(float) CompositeExtract 3162 1 + Store 3160 3163 + 3164: 47(int) CompositeExtract 3162 0 + 3165: 284 Load 286(s2DArray) + 3166: 167(fvec3) Load 169(c3) + 3167:3102(ResType) ImageSparseSampleImplicitLod 3165 3166 + 3168: 7(fvec4) CompositeExtract 3167 1 + Store 3099(texel) 3168 + 3169: 47(int) CompositeExtract 3167 0 + 3170: 284 Load 286(s2DArray) + 3171: 175(fvec3) Load 177(f16c3) + 3172: 6(float) Load 137(f16bias) + 3173:3102(ResType) ImageSparseSampleImplicitLod 3170 3171 Bias 3172 + 3174: 7(fvec4) CompositeExtract 3173 1 + Store 3099(texel) 3174 + 3175: 47(int) CompositeExtract 3173 0 + 3176: 299 Load 301(sCubeArray) + 3177: 249(fvec4) Load 251(c4) + 3178:3102(ResType) ImageSparseSampleImplicitLod 3176 3177 + 3179: 7(fvec4) CompositeExtract 3178 1 + Store 3099(texel) 3179 + 3180: 47(int) CompositeExtract 3178 0 + 3181: 299 Load 301(sCubeArray) + 3182: 7(fvec4) Load 309(f16c4) + 3183: 6(float) Load 137(f16bias) + 3184:3102(ResType) ImageSparseSampleImplicitLod 3181 3182 Bias 3183 + 3185: 7(fvec4) CompositeExtract 3184 1 + Store 3099(texel) 3185 + 3186: 47(int) CompositeExtract 3184 0 + 3187: 337 Load 339(s2DArrayShadow) + 3188: 249(fvec4) Load 251(c4) + 3189: 208(ptr) AccessChain 3099(texel) 207 + 3190: 52(float) CompositeExtract 3188 3 + 3191:3138(ResType) ImageSparseSampleDrefImplicitLod 3187 3188 3190 + 3192: 6(float) CompositeExtract 3191 1 + Store 3189 3192 + 3193: 47(int) CompositeExtract 3191 0 + 3194: 337 Load 339(s2DArrayShadow) + 3195: 175(fvec3) Load 177(f16c3) + 3196: 52(float) Load 215(compare) + 3197: 208(ptr) AccessChain 3099(texel) 207 + 3198:3138(ResType) ImageSparseSampleDrefImplicitLod 3194 3195 3196 + 3199: 6(float) CompositeExtract 3198 1 + Store 3197 3199 + 3200: 47(int) CompositeExtract 3198 0 + 3201: 357 Load 359(s2DRect) + 3202: 53(fvec2) Load 148(c2) + 3203:3102(ResType) ImageSparseSampleImplicitLod 3201 3202 + 3204: 7(fvec4) CompositeExtract 3203 1 + Store 3099(texel) 3204 + 3205: 47(int) CompositeExtract 3203 0 + 3206: 357 Load 359(s2DRect) + 3207: 154(fvec2) Load 156(f16c2) + 3208:3102(ResType) ImageSparseSampleImplicitLod 3206 3207 + 3209: 7(fvec4) CompositeExtract 3208 1 + Store 3099(texel) 3209 + 3210: 47(int) CompositeExtract 3208 0 + 3211: 371 Load 373(s2DRectShadow) + 3212: 167(fvec3) Load 169(c3) + 3213: 208(ptr) AccessChain 3099(texel) 207 + 3214: 52(float) CompositeExtract 3212 2 + 3215:3138(ResType) ImageSparseSampleDrefImplicitLod 3211 3212 3214 + 3216: 6(float) CompositeExtract 3215 1 + Store 3213 3216 + 3217: 47(int) CompositeExtract 3215 0 + 3218: 371 Load 373(s2DRectShadow) + 3219: 154(fvec2) Load 156(f16c2) + 3220: 52(float) Load 215(compare) + 3221: 208(ptr) AccessChain 3099(texel) 207 + 3222:3138(ResType) ImageSparseSampleDrefImplicitLod 3218 3219 3220 + 3223: 6(float) CompositeExtract 3222 1 + Store 3221 3223 + 3224: 47(int) CompositeExtract 3222 0 + 3225: 391 Load 393(sCubeArrayShadow) + 3226: 249(fvec4) Load 251(c4) + 3227: 52(float) Load 215(compare) + 3228: 208(ptr) AccessChain 3099(texel) 207 + 3229:3138(ResType) ImageSparseSampleDrefImplicitLod 3225 3226 3227 + 3230: 6(float) CompositeExtract 3229 1 + Store 3228 3230 + 3231: 47(int) CompositeExtract 3229 0 + 3232: 391 Load 393(sCubeArrayShadow) + 3233: 7(fvec4) Load 309(f16c4) + 3234: 52(float) Load 215(compare) + 3235: 208(ptr) AccessChain 3099(texel) 207 + 3236:3138(ResType) ImageSparseSampleDrefImplicitLod 3232 3233 3234 + 3237: 6(float) CompositeExtract 3236 1 + Store 3235 3237 + 3238: 47(int) CompositeExtract 3236 0 + 3239: 7(fvec4) Load 3099(texel) + ReturnValue 3239 + FunctionEnd +71(testSparseTextureLod(): 7(fvec4) Function None 8 + 72: Label + 3242(texel): 64(ptr) Variable Function + Store 3242(texel) 121 + 3243: 143 Load 145(s2D) + 3244: 53(fvec2) Load 148(c2) + 3245: 52(float) Load 565(lod) + 3246:3102(ResType) ImageSparseSampleExplicitLod 3243 3244 Lod 3245 + 3247: 7(fvec4) CompositeExtract 3246 1 + Store 3242(texel) 3247 + 3248: 47(int) CompositeExtract 3246 0 + 3249: 143 Load 145(s2D) + 3250: 154(fvec2) Load 156(f16c2) + 3251: 6(float) Load 572(f16lod) + 3252:3102(ResType) ImageSparseSampleExplicitLod 3249 3250 Lod 3251 + 3253: 7(fvec4) CompositeExtract 3252 1 + Store 3242(texel) 3253 + 3254: 47(int) CompositeExtract 3252 0 + 3255: 163 Load 165(s3D) + 3256: 167(fvec3) Load 169(c3) + 3257: 52(float) Load 565(lod) + 3258:3102(ResType) ImageSparseSampleExplicitLod 3255 3256 Lod 3257 + 3259: 7(fvec4) CompositeExtract 3258 1 + Store 3242(texel) 3259 + 3260: 47(int) CompositeExtract 3258 0 + 3261: 163 Load 165(s3D) + 3262: 175(fvec3) Load 177(f16c3) + 3263: 6(float) Load 572(f16lod) + 3264:3102(ResType) ImageSparseSampleExplicitLod 3261 3262 Lod 3263 + 3265: 7(fvec4) CompositeExtract 3264 1 + Store 3242(texel) 3265 + 3266: 47(int) CompositeExtract 3264 0 + 3267: 184 Load 186(sCube) + 3268: 167(fvec3) Load 169(c3) + 3269: 52(float) Load 565(lod) + 3270:3102(ResType) ImageSparseSampleExplicitLod 3267 3268 Lod 3269 + 3271: 7(fvec4) CompositeExtract 3270 1 + Store 3242(texel) 3271 + 3272: 47(int) CompositeExtract 3270 0 + 3273: 184 Load 186(sCube) + 3274: 175(fvec3) Load 177(f16c3) + 3275: 6(float) Load 572(f16lod) + 3276:3102(ResType) ImageSparseSampleExplicitLod 3273 3274 Lod 3275 + 3277: 7(fvec4) CompositeExtract 3276 1 + Store 3242(texel) 3277 + 3278: 47(int) CompositeExtract 3276 0 + 3279: 224 Load 226(s2DShadow) + 3280: 167(fvec3) Load 169(c3) + 3281: 52(float) Load 565(lod) + 3282: 208(ptr) AccessChain 3242(texel) 207 + 3283: 52(float) CompositeExtract 3280 2 + 3284:3138(ResType) ImageSparseSampleDrefExplicitLod 3279 3280 3283 Lod 3281 + 3285: 6(float) CompositeExtract 3284 1 + Store 3282 3285 + 3286: 47(int) CompositeExtract 3284 0 + 3287: 224 Load 226(s2DShadow) + 3288: 154(fvec2) Load 156(f16c2) + 3289: 52(float) Load 215(compare) + 3290: 6(float) Load 572(f16lod) + 3291: 208(ptr) AccessChain 3242(texel) 207 + 3292:3138(ResType) ImageSparseSampleDrefExplicitLod 3287 3288 3289 Lod 3290 + 3293: 6(float) CompositeExtract 3292 1 + Store 3291 3293 + 3294: 47(int) CompositeExtract 3292 0 + 3295: 284 Load 286(s2DArray) + 3296: 167(fvec3) Load 169(c3) + 3297: 52(float) Load 565(lod) + 3298:3102(ResType) ImageSparseSampleExplicitLod 3295 3296 Lod 3297 + 3299: 7(fvec4) CompositeExtract 3298 1 + Store 3242(texel) 3299 + 3300: 47(int) CompositeExtract 3298 0 + 3301: 284 Load 286(s2DArray) + 3302: 175(fvec3) Load 177(f16c3) + 3303: 6(float) Load 572(f16lod) + 3304:3102(ResType) ImageSparseSampleExplicitLod 3301 3302 Lod 3303 + 3305: 7(fvec4) CompositeExtract 3304 1 + Store 3242(texel) 3305 + 3306: 47(int) CompositeExtract 3304 0 + 3307: 299 Load 301(sCubeArray) + 3308: 249(fvec4) Load 251(c4) + 3309: 52(float) Load 565(lod) + 3310:3102(ResType) ImageSparseSampleExplicitLod 3307 3308 Lod 3309 + 3311: 7(fvec4) CompositeExtract 3310 1 + Store 3242(texel) 3311 + 3312: 47(int) CompositeExtract 3310 0 + 3313: 299 Load 301(sCubeArray) + 3314: 7(fvec4) Load 309(f16c4) + 3315: 6(float) Load 572(f16lod) + 3316:3102(ResType) ImageSparseSampleExplicitLod 3313 3314 Lod 3315 + 3317: 7(fvec4) CompositeExtract 3316 1 + Store 3242(texel) 3317 + 3318: 47(int) CompositeExtract 3316 0 + 3319: 7(fvec4) Load 3242(texel) + ReturnValue 3319 + FunctionEnd +73(testSparseTextureOffset(): 7(fvec4) Function None 8 + 74: Label + 3322(texel): 64(ptr) Variable Function + Store 3322(texel) 121 + 3323: 143 Load 145(s2D) + 3324: 53(fvec2) Load 148(c2) + 3325:3102(ResType) ImageSparseSampleImplicitLod 3323 3324 ConstOffset 722 + 3326: 7(fvec4) CompositeExtract 3325 1 + Store 3322(texel) 3326 + 3327: 47(int) CompositeExtract 3325 0 + 3328: 143 Load 145(s2D) + 3329: 154(fvec2) Load 156(f16c2) + 3330: 6(float) Load 137(f16bias) + 3331:3102(ResType) ImageSparseSampleImplicitLod 3328 3329 Bias ConstOffset 3330 722 + 3332: 7(fvec4) CompositeExtract 3331 1 + Store 3322(texel) 3332 + 3333: 47(int) CompositeExtract 3331 0 + 3334: 163 Load 165(s3D) + 3335: 167(fvec3) Load 169(c3) + 3336:3102(ResType) ImageSparseSampleImplicitLod 3334 3335 ConstOffset 735 + 3337: 7(fvec4) CompositeExtract 3336 1 + Store 3322(texel) 3337 + 3338: 47(int) CompositeExtract 3336 0 + 3339: 163 Load 165(s3D) + 3340: 175(fvec3) Load 177(f16c3) + 3341: 6(float) Load 137(f16bias) + 3342:3102(ResType) ImageSparseSampleImplicitLod 3339 3340 Bias ConstOffset 3341 735 + 3343: 7(fvec4) CompositeExtract 3342 1 + Store 3322(texel) 3343 + 3344: 47(int) CompositeExtract 3342 0 + 3345: 357 Load 359(s2DRect) + 3346: 53(fvec2) Load 148(c2) + 3347:3102(ResType) ImageSparseSampleImplicitLod 3345 3346 ConstOffset 722 + 3348: 7(fvec4) CompositeExtract 3347 1 + Store 3322(texel) 3348 + 3349: 47(int) CompositeExtract 3347 0 + 3350: 357 Load 359(s2DRect) + 3351: 154(fvec2) Load 156(f16c2) + 3352:3102(ResType) ImageSparseSampleImplicitLod 3350 3351 ConstOffset 722 + 3353: 7(fvec4) CompositeExtract 3352 1 + Store 3322(texel) 3353 + 3354: 47(int) CompositeExtract 3352 0 + 3355: 371 Load 373(s2DRectShadow) + 3356: 167(fvec3) Load 169(c3) + 3357: 208(ptr) AccessChain 3322(texel) 207 + 3358: 52(float) CompositeExtract 3356 2 + 3359:3138(ResType) ImageSparseSampleDrefImplicitLod 3355 3356 3358 ConstOffset 722 + 3360: 6(float) CompositeExtract 3359 1 + Store 3357 3360 + 3361: 47(int) CompositeExtract 3359 0 + 3362: 371 Load 373(s2DRectShadow) + 3363: 154(fvec2) Load 156(f16c2) + 3364: 52(float) Load 215(compare) + 3365: 208(ptr) AccessChain 3322(texel) 207 + 3366:3138(ResType) ImageSparseSampleDrefImplicitLod 3362 3363 3364 ConstOffset 722 + 3367: 6(float) CompositeExtract 3366 1 + Store 3365 3367 + 3368: 47(int) CompositeExtract 3366 0 + 3369: 224 Load 226(s2DShadow) + 3370: 167(fvec3) Load 169(c3) + 3371: 208(ptr) AccessChain 3322(texel) 207 + 3372: 52(float) CompositeExtract 3370 2 + 3373:3138(ResType) ImageSparseSampleDrefImplicitLod 3369 3370 3372 ConstOffset 722 + 3374: 6(float) CompositeExtract 3373 1 + Store 3371 3374 + 3375: 47(int) CompositeExtract 3373 0 + 3376: 224 Load 226(s2DShadow) + 3377: 154(fvec2) Load 156(f16c2) + 3378: 52(float) Load 215(compare) + 3379: 208(ptr) AccessChain 3322(texel) 207 + 3380: 6(float) Load 137(f16bias) + 3381:3138(ResType) ImageSparseSampleDrefImplicitLod 3376 3377 3378 Bias ConstOffset 3380 722 + 3382: 6(float) CompositeExtract 3381 1 + Store 3379 3382 + 3383: 47(int) CompositeExtract 3381 0 + 3384: 284 Load 286(s2DArray) + 3385: 167(fvec3) Load 169(c3) + 3386:3102(ResType) ImageSparseSampleImplicitLod 3384 3385 ConstOffset 722 + 3387: 7(fvec4) CompositeExtract 3386 1 + Store 3322(texel) 3387 + 3388: 47(int) CompositeExtract 3386 0 + 3389: 284 Load 286(s2DArray) + 3390: 175(fvec3) Load 177(f16c3) + 3391: 6(float) Load 137(f16bias) + 3392:3102(ResType) ImageSparseSampleImplicitLod 3389 3390 Bias ConstOffset 3391 722 + 3393: 7(fvec4) CompositeExtract 3392 1 + Store 3322(texel) 3393 + 3394: 47(int) CompositeExtract 3392 0 + 3395: 337 Load 339(s2DArrayShadow) + 3396: 249(fvec4) Load 251(c4) + 3397: 208(ptr) AccessChain 3322(texel) 207 + 3398: 52(float) CompositeExtract 3396 3 + 3399:3138(ResType) ImageSparseSampleDrefImplicitLod 3395 3396 3398 ConstOffset 722 + 3400: 6(float) CompositeExtract 3399 1 + Store 3397 3400 + 3401: 47(int) CompositeExtract 3399 0 + 3402: 337 Load 339(s2DArrayShadow) + 3403: 175(fvec3) Load 177(f16c3) + 3404: 52(float) Load 215(compare) + 3405: 208(ptr) AccessChain 3322(texel) 207 + 3406:3138(ResType) ImageSparseSampleDrefImplicitLod 3402 3403 3404 ConstOffset 722 + 3407: 6(float) CompositeExtract 3406 1 + Store 3405 3407 + 3408: 47(int) CompositeExtract 3406 0 + 3409: 7(fvec4) Load 3322(texel) + ReturnValue 3409 + FunctionEnd +75(testSparseTextureLodOffset(): 7(fvec4) Function None 8 + 76: Label + 3412(texel): 64(ptr) Variable Function + Store 3412(texel) 121 + 3413: 143 Load 145(s2D) + 3414: 53(fvec2) Load 148(c2) + 3415: 52(float) Load 565(lod) + 3416:3102(ResType) ImageSparseSampleExplicitLod 3413 3414 Lod ConstOffset 3415 722 + 3417: 7(fvec4) CompositeExtract 3416 1 + Store 3412(texel) 3417 + 3418: 47(int) CompositeExtract 3416 0 + 3419: 143 Load 145(s2D) + 3420: 154(fvec2) Load 156(f16c2) + 3421: 6(float) Load 572(f16lod) + 3422:3102(ResType) ImageSparseSampleExplicitLod 3419 3420 Lod ConstOffset 3421 722 + 3423: 7(fvec4) CompositeExtract 3422 1 + Store 3412(texel) 3423 + 3424: 47(int) CompositeExtract 3422 0 + 3425: 163 Load 165(s3D) + 3426: 167(fvec3) Load 169(c3) + 3427: 52(float) Load 565(lod) + 3428:3102(ResType) ImageSparseSampleExplicitLod 3425 3426 Lod ConstOffset 3427 735 + 3429: 7(fvec4) CompositeExtract 3428 1 + Store 3412(texel) 3429 + 3430: 47(int) CompositeExtract 3428 0 + 3431: 163 Load 165(s3D) + 3432: 175(fvec3) Load 177(f16c3) + 3433: 6(float) Load 572(f16lod) + 3434:3102(ResType) ImageSparseSampleExplicitLod 3431 3432 Lod ConstOffset 3433 735 + 3435: 7(fvec4) CompositeExtract 3434 1 + Store 3412(texel) 3435 + 3436: 47(int) CompositeExtract 3434 0 + 3437: 224 Load 226(s2DShadow) + 3438: 167(fvec3) Load 169(c3) + 3439: 52(float) Load 565(lod) + 3440: 208(ptr) AccessChain 3412(texel) 207 + 3441: 52(float) CompositeExtract 3438 2 + 3442:3138(ResType) ImageSparseSampleDrefExplicitLod 3437 3438 3441 Lod ConstOffset 3439 722 + 3443: 6(float) CompositeExtract 3442 1 + Store 3440 3443 + 3444: 47(int) CompositeExtract 3442 0 + 3445: 224 Load 226(s2DShadow) + 3446: 154(fvec2) Load 156(f16c2) + 3447: 52(float) Load 215(compare) + 3448: 6(float) Load 572(f16lod) + 3449: 208(ptr) AccessChain 3412(texel) 207 + 3450:3138(ResType) ImageSparseSampleDrefExplicitLod 3445 3446 3447 Lod ConstOffset 3448 722 + 3451: 6(float) CompositeExtract 3450 1 + Store 3449 3451 + 3452: 47(int) CompositeExtract 3450 0 + 3453: 284 Load 286(s2DArray) + 3454: 167(fvec3) Load 169(c3) + 3455: 52(float) Load 565(lod) + 3456:3102(ResType) ImageSparseSampleExplicitLod 3453 3454 Lod ConstOffset 3455 722 + 3457: 7(fvec4) CompositeExtract 3456 1 + Store 3412(texel) 3457 + 3458: 47(int) CompositeExtract 3456 0 + 3459: 284 Load 286(s2DArray) + 3460: 175(fvec3) Load 177(f16c3) + 3461: 6(float) Load 572(f16lod) + 3462:3102(ResType) ImageSparseSampleExplicitLod 3459 3460 Lod ConstOffset 3461 722 + 3463: 7(fvec4) CompositeExtract 3462 1 + Store 3412(texel) 3463 + 3464: 47(int) CompositeExtract 3462 0 + 3465: 7(fvec4) Load 3412(texel) + ReturnValue 3465 + FunctionEnd +77(testSparseTextureGrad(): 7(fvec4) Function None 8 + 78: Label + 3468(texel): 64(ptr) Variable Function + Store 3468(texel) 121 + 3469: 143 Load 145(s2D) + 3470: 53(fvec2) Load 148(c2) + 3471: 53(fvec2) Load 1409(dPdxy2) + 3472: 53(fvec2) Load 1409(dPdxy2) + 3473:3102(ResType) ImageSparseSampleExplicitLod 3469 3470 Grad 3471 3472 + 3474: 7(fvec4) CompositeExtract 3473 1 + Store 3468(texel) 3474 + 3475: 47(int) CompositeExtract 3473 0 + 3476: 143 Load 145(s2D) + 3477: 154(fvec2) Load 156(f16c2) + 3478: 154(fvec2) Load 1417(f16dPdxy2) + 3479: 154(fvec2) Load 1417(f16dPdxy2) + 3480:3102(ResType) ImageSparseSampleExplicitLod 3476 3477 Grad 3478 3479 + 3481: 7(fvec4) CompositeExtract 3480 1 + Store 3468(texel) 3481 + 3482: 47(int) CompositeExtract 3480 0 + 3483: 163 Load 165(s3D) + 3484: 167(fvec3) Load 169(c3) + 3485: 167(fvec3) Load 1425(dPdxy3) + 3486: 167(fvec3) Load 1425(dPdxy3) + 3487:3102(ResType) ImageSparseSampleExplicitLod 3483 3484 Grad 3485 3486 + 3488: 7(fvec4) CompositeExtract 3487 1 + Store 3468(texel) 3488 + 3489: 47(int) CompositeExtract 3487 0 + 3490: 163 Load 165(s3D) + 3491: 175(fvec3) Load 177(f16c3) + 3492: 175(fvec3) Load 1433(f16dPdxy3) + 3493: 175(fvec3) Load 1433(f16dPdxy3) + 3494:3102(ResType) ImageSparseSampleExplicitLod 3490 3491 Grad 3492 3493 + 3495: 7(fvec4) CompositeExtract 3494 1 + Store 3468(texel) 3495 + 3496: 47(int) CompositeExtract 3494 0 + 3497: 184 Load 186(sCube) + 3498: 167(fvec3) Load 169(c3) + 3499: 167(fvec3) Load 1425(dPdxy3) + 3500: 167(fvec3) Load 1425(dPdxy3) + 3501:3102(ResType) ImageSparseSampleExplicitLod 3497 3498 Grad 3499 3500 + 3502: 7(fvec4) CompositeExtract 3501 1 + Store 3468(texel) 3502 + 3503: 47(int) CompositeExtract 3501 0 + 3504: 184 Load 186(sCube) + 3505: 175(fvec3) Load 177(f16c3) + 3506: 175(fvec3) Load 1433(f16dPdxy3) + 3507: 175(fvec3) Load 1433(f16dPdxy3) + 3508:3102(ResType) ImageSparseSampleExplicitLod 3504 3505 Grad 3506 3507 + 3509: 7(fvec4) CompositeExtract 3508 1 + Store 3468(texel) 3509 + 3510: 47(int) CompositeExtract 3508 0 + 3511: 357 Load 359(s2DRect) + 3512: 53(fvec2) Load 148(c2) + 3513: 53(fvec2) Load 1409(dPdxy2) + 3514: 53(fvec2) Load 1409(dPdxy2) + 3515:3102(ResType) ImageSparseSampleExplicitLod 3511 3512 Grad 3513 3514 + 3516: 7(fvec4) CompositeExtract 3515 1 + Store 3468(texel) 3516 + 3517: 47(int) CompositeExtract 3515 0 + 3518: 357 Load 359(s2DRect) + 3519: 154(fvec2) Load 156(f16c2) + 3520: 154(fvec2) Load 1417(f16dPdxy2) + 3521: 154(fvec2) Load 1417(f16dPdxy2) + 3522:3102(ResType) ImageSparseSampleExplicitLod 3518 3519 Grad 3520 3521 + 3523: 7(fvec4) CompositeExtract 3522 1 + Store 3468(texel) 3523 + 3524: 47(int) CompositeExtract 3522 0 + 3525: 371 Load 373(s2DRectShadow) + 3526: 167(fvec3) Load 169(c3) + 3527: 53(fvec2) Load 1409(dPdxy2) + 3528: 53(fvec2) Load 1409(dPdxy2) + 3529: 208(ptr) AccessChain 3468(texel) 207 + 3530: 52(float) CompositeExtract 3526 2 + 3531:3138(ResType) ImageSparseSampleDrefExplicitLod 3525 3526 3530 Grad 3527 3528 + 3532: 6(float) CompositeExtract 3531 1 + Store 3529 3532 + 3533: 47(int) CompositeExtract 3531 0 + 3534: 371 Load 373(s2DRectShadow) + 3535: 154(fvec2) Load 156(f16c2) + 3536: 52(float) Load 215(compare) + 3537: 154(fvec2) Load 1417(f16dPdxy2) + 3538: 154(fvec2) Load 1417(f16dPdxy2) + 3539: 208(ptr) AccessChain 3468(texel) 207 + 3540:3138(ResType) ImageSparseSampleDrefExplicitLod 3534 3535 3536 Grad 3537 3538 + 3541: 6(float) CompositeExtract 3540 1 + Store 3539 3541 + 3542: 47(int) CompositeExtract 3540 0 + 3543: 224 Load 226(s2DShadow) + 3544: 167(fvec3) Load 169(c3) + 3545: 53(fvec2) Load 1409(dPdxy2) + 3546: 53(fvec2) Load 1409(dPdxy2) + 3547: 208(ptr) AccessChain 3468(texel) 207 + 3548: 52(float) CompositeExtract 3544 2 + 3549:3138(ResType) ImageSparseSampleDrefExplicitLod 3543 3544 3548 Grad 3545 3546 + 3550: 6(float) CompositeExtract 3549 1 + Store 3547 3550 + 3551: 47(int) CompositeExtract 3549 0 + 3552: 224 Load 226(s2DShadow) + 3553: 154(fvec2) Load 156(f16c2) + 3554: 52(float) Load 215(compare) + 3555: 154(fvec2) Load 1417(f16dPdxy2) + 3556: 154(fvec2) Load 1417(f16dPdxy2) + 3557: 208(ptr) AccessChain 3468(texel) 207 + 3558:3138(ResType) ImageSparseSampleDrefExplicitLod 3552 3553 3554 Grad 3555 3556 + 3559: 6(float) CompositeExtract 3558 1 + Store 3557 3559 + 3560: 47(int) CompositeExtract 3558 0 + 3561: 245 Load 247(sCubeShadow) + 3562: 249(fvec4) Load 251(c4) + 3563: 167(fvec3) Load 1425(dPdxy3) + 3564: 167(fvec3) Load 1425(dPdxy3) + 3565: 208(ptr) AccessChain 3468(texel) 207 + 3566: 52(float) CompositeExtract 3562 3 + 3567:3138(ResType) ImageSparseSampleDrefExplicitLod 3561 3562 3566 Grad 3563 3564 + 3568: 6(float) CompositeExtract 3567 1 + Store 3565 3568 + 3569: 47(int) CompositeExtract 3567 0 + 3570: 245 Load 247(sCubeShadow) + 3571: 175(fvec3) Load 177(f16c3) + 3572: 52(float) Load 215(compare) + 3573: 175(fvec3) Load 1433(f16dPdxy3) + 3574: 175(fvec3) Load 1433(f16dPdxy3) + 3575: 208(ptr) AccessChain 3468(texel) 207 + 3576:3138(ResType) ImageSparseSampleDrefExplicitLod 3570 3571 3572 Grad 3573 3574 + 3577: 6(float) CompositeExtract 3576 1 + Store 3575 3577 + 3578: 47(int) CompositeExtract 3576 0 + 3579: 284 Load 286(s2DArray) + 3580: 167(fvec3) Load 169(c3) + 3581: 53(fvec2) Load 1409(dPdxy2) + 3582: 53(fvec2) Load 1409(dPdxy2) + 3583:3102(ResType) ImageSparseSampleExplicitLod 3579 3580 Grad 3581 3582 + 3584: 7(fvec4) CompositeExtract 3583 1 + Store 3468(texel) 3584 + 3585: 47(int) CompositeExtract 3583 0 + 3586: 284 Load 286(s2DArray) + 3587: 175(fvec3) Load 177(f16c3) + 3588: 154(fvec2) Load 1417(f16dPdxy2) + 3589: 154(fvec2) Load 1417(f16dPdxy2) + 3590:3102(ResType) ImageSparseSampleExplicitLod 3586 3587 Grad 3588 3589 + 3591: 7(fvec4) CompositeExtract 3590 1 + Store 3468(texel) 3591 + 3592: 47(int) CompositeExtract 3590 0 + 3593: 337 Load 339(s2DArrayShadow) + 3594: 249(fvec4) Load 251(c4) + 3595: 53(fvec2) Load 1409(dPdxy2) + 3596: 53(fvec2) Load 1409(dPdxy2) + 3597: 208(ptr) AccessChain 3468(texel) 207 + 3598: 52(float) CompositeExtract 3594 3 + 3599:3138(ResType) ImageSparseSampleDrefExplicitLod 3593 3594 3598 Grad 3595 3596 + 3600: 6(float) CompositeExtract 3599 1 + Store 3597 3600 + 3601: 47(int) CompositeExtract 3599 0 + 3602: 337 Load 339(s2DArrayShadow) + 3603: 175(fvec3) Load 177(f16c3) + 3604: 52(float) Load 215(compare) + 3605: 154(fvec2) Load 1417(f16dPdxy2) + 3606: 154(fvec2) Load 1417(f16dPdxy2) + 3607: 208(ptr) AccessChain 3468(texel) 207 + 3608:3138(ResType) ImageSparseSampleDrefExplicitLod 3602 3603 3604 Grad 3605 3606 + 3609: 6(float) CompositeExtract 3608 1 + Store 3607 3609 + 3610: 47(int) CompositeExtract 3608 0 + 3611: 299 Load 301(sCubeArray) + 3612: 249(fvec4) Load 251(c4) + 3613: 167(fvec3) Load 1425(dPdxy3) + 3614: 167(fvec3) Load 1425(dPdxy3) + 3615:3102(ResType) ImageSparseSampleExplicitLod 3611 3612 Grad 3613 3614 + 3616: 7(fvec4) CompositeExtract 3615 1 + Store 3468(texel) 3616 + 3617: 47(int) CompositeExtract 3615 0 + 3618: 299 Load 301(sCubeArray) + 3619: 7(fvec4) Load 309(f16c4) + 3620: 175(fvec3) Load 1433(f16dPdxy3) + 3621: 175(fvec3) Load 1433(f16dPdxy3) + 3622:3102(ResType) ImageSparseSampleExplicitLod 3618 3619 Grad 3620 3621 + 3623: 7(fvec4) CompositeExtract 3622 1 + Store 3468(texel) 3623 + 3624: 47(int) CompositeExtract 3622 0 + 3625: 7(fvec4) Load 3468(texel) + ReturnValue 3625 + FunctionEnd +79(testSparseTextureGradOffset(): 7(fvec4) Function None 8 + 80: Label + 3628(texel): 64(ptr) Variable Function + Store 3628(texel) 121 + 3629: 143 Load 145(s2D) + 3630: 53(fvec2) Load 148(c2) + 3631: 53(fvec2) Load 1409(dPdxy2) + 3632: 53(fvec2) Load 1409(dPdxy2) + 3633:3102(ResType) ImageSparseSampleExplicitLod 3629 3630 Grad ConstOffset 3631 3632 722 + 3634: 7(fvec4) CompositeExtract 3633 1 + Store 3628(texel) 3634 + 3635: 47(int) CompositeExtract 3633 0 + 3636: 143 Load 145(s2D) + 3637: 154(fvec2) Load 156(f16c2) + 3638: 154(fvec2) Load 1417(f16dPdxy2) + 3639: 154(fvec2) Load 1417(f16dPdxy2) + 3640:3102(ResType) ImageSparseSampleExplicitLod 3636 3637 Grad ConstOffset 3638 3639 722 + 3641: 7(fvec4) CompositeExtract 3640 1 + Store 3628(texel) 3641 + 3642: 47(int) CompositeExtract 3640 0 + 3643: 163 Load 165(s3D) + 3644: 167(fvec3) Load 169(c3) + 3645: 167(fvec3) Load 1425(dPdxy3) + 3646: 167(fvec3) Load 1425(dPdxy3) + 3647:3102(ResType) ImageSparseSampleExplicitLod 3643 3644 Grad ConstOffset 3645 3646 735 + 3648: 7(fvec4) CompositeExtract 3647 1 + Store 3628(texel) 3648 + 3649: 47(int) CompositeExtract 3647 0 + 3650: 163 Load 165(s3D) + 3651: 175(fvec3) Load 177(f16c3) + 3652: 175(fvec3) Load 1433(f16dPdxy3) + 3653: 175(fvec3) Load 1433(f16dPdxy3) + 3654:3102(ResType) ImageSparseSampleExplicitLod 3650 3651 Grad ConstOffset 3652 3653 735 + 3655: 7(fvec4) CompositeExtract 3654 1 + Store 3628(texel) 3655 + 3656: 47(int) CompositeExtract 3654 0 + 3657: 357 Load 359(s2DRect) + 3658: 53(fvec2) Load 148(c2) + 3659: 53(fvec2) Load 1409(dPdxy2) + 3660: 53(fvec2) Load 1409(dPdxy2) + 3661:3102(ResType) ImageSparseSampleExplicitLod 3657 3658 Grad ConstOffset 3659 3660 722 + 3662: 7(fvec4) CompositeExtract 3661 1 + Store 3628(texel) 3662 + 3663: 47(int) CompositeExtract 3661 0 + 3664: 357 Load 359(s2DRect) + 3665: 154(fvec2) Load 156(f16c2) + 3666: 154(fvec2) Load 1417(f16dPdxy2) + 3667: 154(fvec2) Load 1417(f16dPdxy2) + 3668:3102(ResType) ImageSparseSampleExplicitLod 3664 3665 Grad ConstOffset 3666 3667 722 + 3669: 7(fvec4) CompositeExtract 3668 1 + Store 3628(texel) 3669 + 3670: 47(int) CompositeExtract 3668 0 + 3671: 371 Load 373(s2DRectShadow) + 3672: 167(fvec3) Load 169(c3) + 3673: 53(fvec2) Load 1409(dPdxy2) + 3674: 53(fvec2) Load 1409(dPdxy2) + 3675: 208(ptr) AccessChain 3628(texel) 207 + 3676: 52(float) CompositeExtract 3672 2 + 3677:3138(ResType) ImageSparseSampleDrefExplicitLod 3671 3672 3676 Grad ConstOffset 3673 3674 722 + 3678: 6(float) CompositeExtract 3677 1 + Store 3675 3678 + 3679: 47(int) CompositeExtract 3677 0 + 3680: 371 Load 373(s2DRectShadow) + 3681: 154(fvec2) Load 156(f16c2) + 3682: 52(float) Load 215(compare) + 3683: 154(fvec2) Load 1417(f16dPdxy2) + 3684: 154(fvec2) Load 1417(f16dPdxy2) + 3685: 208(ptr) AccessChain 3628(texel) 207 + 3686:3138(ResType) ImageSparseSampleDrefExplicitLod 3680 3681 3682 Grad ConstOffset 3683 3684 722 + 3687: 6(float) CompositeExtract 3686 1 + Store 3685 3687 + 3688: 47(int) CompositeExtract 3686 0 + 3689: 224 Load 226(s2DShadow) + 3690: 167(fvec3) Load 169(c3) + 3691: 53(fvec2) Load 1409(dPdxy2) + 3692: 53(fvec2) Load 1409(dPdxy2) + 3693: 208(ptr) AccessChain 3628(texel) 207 + 3694: 52(float) CompositeExtract 3690 2 + 3695:3138(ResType) ImageSparseSampleDrefExplicitLod 3689 3690 3694 Grad ConstOffset 3691 3692 722 + 3696: 6(float) CompositeExtract 3695 1 + Store 3693 3696 + 3697: 47(int) CompositeExtract 3695 0 + 3698: 224 Load 226(s2DShadow) + 3699: 154(fvec2) Load 156(f16c2) + 3700: 52(float) Load 215(compare) + 3701: 154(fvec2) Load 1417(f16dPdxy2) + 3702: 154(fvec2) Load 1417(f16dPdxy2) + 3703: 208(ptr) AccessChain 3628(texel) 207 + 3704:3138(ResType) ImageSparseSampleDrefExplicitLod 3698 3699 3700 Grad ConstOffset 3701 3702 722 + 3705: 6(float) CompositeExtract 3704 1 + Store 3703 3705 + 3706: 47(int) CompositeExtract 3704 0 + 3707: 284 Load 286(s2DArray) + 3708: 167(fvec3) Load 169(c3) + 3709: 53(fvec2) Load 1409(dPdxy2) + 3710: 53(fvec2) Load 1409(dPdxy2) + 3711:3102(ResType) ImageSparseSampleExplicitLod 3707 3708 Grad ConstOffset 3709 3710 722 + 3712: 7(fvec4) CompositeExtract 3711 1 + Store 3628(texel) 3712 + 3713: 47(int) CompositeExtract 3711 0 + 3714: 284 Load 286(s2DArray) + 3715: 175(fvec3) Load 177(f16c3) + 3716: 154(fvec2) Load 1417(f16dPdxy2) + 3717: 154(fvec2) Load 1417(f16dPdxy2) + 3718:3102(ResType) ImageSparseSampleExplicitLod 3714 3715 Grad ConstOffset 3716 3717 722 + 3719: 7(fvec4) CompositeExtract 3718 1 + Store 3628(texel) 3719 + 3720: 47(int) CompositeExtract 3718 0 + 3721: 337 Load 339(s2DArrayShadow) + 3722: 249(fvec4) Load 251(c4) + 3723: 53(fvec2) Load 1409(dPdxy2) + 3724: 53(fvec2) Load 1409(dPdxy2) + 3725: 208(ptr) AccessChain 3628(texel) 207 + 3726: 52(float) CompositeExtract 3722 3 + 3727:3138(ResType) ImageSparseSampleDrefExplicitLod 3721 3722 3726 Grad ConstOffset 3723 3724 722 + 3728: 6(float) CompositeExtract 3727 1 + Store 3725 3728 + 3729: 47(int) CompositeExtract 3727 0 + 3730: 337 Load 339(s2DArrayShadow) + 3731: 175(fvec3) Load 177(f16c3) + 3732: 52(float) Load 215(compare) + 3733: 154(fvec2) Load 1417(f16dPdxy2) + 3734: 154(fvec2) Load 1417(f16dPdxy2) + 3735: 208(ptr) AccessChain 3628(texel) 207 + 3736:3138(ResType) ImageSparseSampleDrefExplicitLod 3730 3731 3732 Grad ConstOffset 3733 3734 722 + 3737: 6(float) CompositeExtract 3736 1 + Store 3735 3737 + 3738: 47(int) CompositeExtract 3736 0 + 3739: 7(fvec4) Load 3628(texel) + ReturnValue 3739 + FunctionEnd +81(testSparseTexelFetch(): 7(fvec4) Function None 8 + 82: Label + 3742(texel): 64(ptr) Variable Function + Store 3742(texel) 121 + 3743: 143 Load 145(s2D) + 3744: 53(fvec2) Load 148(c2) + 3745: 721(ivec2) ConvertFToS 3744 + 3746: 52(float) Load 565(lod) + 3747: 47(int) ConvertFToS 3746 + 3748: 142 Image 3743 + 3749:3102(ResType) ImageSparseFetch 3748 3745 Lod 3747 + 3750: 7(fvec4) CompositeExtract 3749 1 + Store 3742(texel) 3750 + 3751: 47(int) CompositeExtract 3749 0 + 3752: 163 Load 165(s3D) + 3753: 167(fvec3) Load 169(c3) + 3754: 734(ivec3) ConvertFToS 3753 + 3755: 52(float) Load 565(lod) + 3756: 47(int) ConvertFToS 3755 + 3757: 162 Image 3752 + 3758:3102(ResType) ImageSparseFetch 3757 3754 Lod 3756 + 3759: 7(fvec4) CompositeExtract 3758 1 + Store 3742(texel) 3759 + 3760: 47(int) CompositeExtract 3758 0 + 3761: 357 Load 359(s2DRect) + 3762: 53(fvec2) Load 148(c2) + 3763: 721(ivec2) ConvertFToS 3762 + 3764: 356 Image 3761 + 3765:3102(ResType) ImageSparseFetch 3764 3763 + 3766: 7(fvec4) CompositeExtract 3765 1 + Store 3742(texel) 3766 + 3767: 47(int) CompositeExtract 3765 0 + 3768: 284 Load 286(s2DArray) + 3769: 167(fvec3) Load 169(c3) + 3770: 734(ivec3) ConvertFToS 3769 + 3771: 52(float) Load 565(lod) + 3772: 47(int) ConvertFToS 3771 + 3773: 283 Image 3768 + 3774:3102(ResType) ImageSparseFetch 3773 3770 Lod 3772 + 3775: 7(fvec4) CompositeExtract 3774 1 + Store 3742(texel) 3775 + 3776: 47(int) CompositeExtract 3774 0 + 3777: 1309 Load 1311(s2DMS) + 3778: 53(fvec2) Load 148(c2) + 3779: 721(ivec2) ConvertFToS 3778 + 3780: 1308 Image 3777 + 3781:3102(ResType) ImageSparseFetch 3780 3779 Sample 709 + 3782: 7(fvec4) CompositeExtract 3781 1 + Store 3742(texel) 3782 + 3783: 47(int) CompositeExtract 3781 0 + 3784: 1320 Load 1322(s2DMSArray) + 3785: 167(fvec3) Load 169(c3) + 3786: 734(ivec3) ConvertFToS 3785 + 3787: 1319 Image 3784 + 3788:3102(ResType) ImageSparseFetch 3787 3786 Sample 1326 + 3789: 7(fvec4) CompositeExtract 3788 1 + Store 3742(texel) 3789 + 3790: 47(int) CompositeExtract 3788 0 + 3791: 7(fvec4) Load 3742(texel) + ReturnValue 3791 + FunctionEnd +83(testSparseTexelFetchOffset(): 7(fvec4) Function None 8 + 84: Label + 3794(texel): 64(ptr) Variable Function + Store 3794(texel) 121 + 3795: 143 Load 145(s2D) + 3796: 53(fvec2) Load 148(c2) + 3797: 721(ivec2) ConvertFToS 3796 + 3798: 52(float) Load 565(lod) + 3799: 47(int) ConvertFToS 3798 + 3800: 142 Image 3795 + 3801:3102(ResType) ImageSparseFetch 3800 3797 Lod ConstOffset 3799 722 + 3802: 7(fvec4) CompositeExtract 3801 1 + Store 3794(texel) 3802 + 3803: 47(int) CompositeExtract 3801 0 + 3804: 163 Load 165(s3D) + 3805: 167(fvec3) Load 169(c3) + 3806: 734(ivec3) ConvertFToS 3805 + 3807: 52(float) Load 565(lod) + 3808: 47(int) ConvertFToS 3807 + 3809: 162 Image 3804 + 3810:3102(ResType) ImageSparseFetch 3809 3806 Lod ConstOffset 3808 735 + 3811: 7(fvec4) CompositeExtract 3810 1 + Store 3794(texel) 3811 + 3812: 47(int) CompositeExtract 3810 0 + 3813: 357 Load 359(s2DRect) + 3814: 53(fvec2) Load 148(c2) + 3815: 721(ivec2) ConvertFToS 3814 + 3816: 356 Image 3813 + 3817:3102(ResType) ImageSparseFetch 3816 3815 ConstOffset 722 + 3818: 7(fvec4) CompositeExtract 3817 1 + Store 3794(texel) 3818 + 3819: 47(int) CompositeExtract 3817 0 + 3820: 284 Load 286(s2DArray) + 3821: 167(fvec3) Load 169(c3) + 3822: 734(ivec3) ConvertFToS 3821 + 3823: 52(float) Load 565(lod) + 3824: 47(int) ConvertFToS 3823 + 3825: 283 Image 3820 + 3826:3102(ResType) ImageSparseFetch 3825 3822 Lod ConstOffset 3824 722 + 3827: 7(fvec4) CompositeExtract 3826 1 + Store 3794(texel) 3827 + 3828: 47(int) CompositeExtract 3826 0 + 3829: 7(fvec4) Load 3794(texel) + ReturnValue 3829 + FunctionEnd +85(testSparseTextureGather(): 7(fvec4) Function None 8 + 86: Label + 3832(texel): 64(ptr) Variable Function + Store 3832(texel) 121 + 3833: 143 Load 145(s2D) + 3834: 53(fvec2) Load 148(c2) + 3835:3102(ResType) ImageSparseGather 3833 3834 2187 + 3836: 7(fvec4) CompositeExtract 3835 1 + Store 3832(texel) 3836 + 3837: 47(int) CompositeExtract 3835 0 + 3838: 143 Load 145(s2D) + 3839: 154(fvec2) Load 156(f16c2) + 3840: 6(float) Load 137(f16bias) + 3841:3102(ResType) ImageSparseGather 3838 3839 2187 Bias 3840 + 3842: 7(fvec4) CompositeExtract 3841 1 + Store 3832(texel) 3842 + 3843: 47(int) CompositeExtract 3841 0 + 3844: 284 Load 286(s2DArray) + 3845: 167(fvec3) Load 169(c3) + 3846:3102(ResType) ImageSparseGather 3844 3845 2187 + 3847: 7(fvec4) CompositeExtract 3846 1 + Store 3832(texel) 3847 + 3848: 47(int) CompositeExtract 3846 0 + 3849: 284 Load 286(s2DArray) + 3850: 175(fvec3) Load 177(f16c3) + 3851: 6(float) Load 137(f16bias) + 3852:3102(ResType) ImageSparseGather 3849 3850 2187 Bias 3851 + 3853: 7(fvec4) CompositeExtract 3852 1 + Store 3832(texel) 3853 + 3854: 47(int) CompositeExtract 3852 0 + 3855: 184 Load 186(sCube) + 3856: 167(fvec3) Load 169(c3) + 3857:3102(ResType) ImageSparseGather 3855 3856 2187 + 3858: 7(fvec4) CompositeExtract 3857 1 + Store 3832(texel) 3858 + 3859: 47(int) CompositeExtract 3857 0 + 3860: 184 Load 186(sCube) + 3861: 175(fvec3) Load 177(f16c3) + 3862: 6(float) Load 137(f16bias) + 3863:3102(ResType) ImageSparseGather 3860 3861 2187 Bias 3862 + 3864: 7(fvec4) CompositeExtract 3863 1 + Store 3832(texel) 3864 + 3865: 47(int) CompositeExtract 3863 0 + 3866: 299 Load 301(sCubeArray) + 3867: 249(fvec4) Load 251(c4) + 3868:3102(ResType) ImageSparseGather 3866 3867 2187 + 3869: 7(fvec4) CompositeExtract 3868 1 + Store 3832(texel) 3869 + 3870: 47(int) CompositeExtract 3868 0 + 3871: 299 Load 301(sCubeArray) + 3872: 7(fvec4) Load 309(f16c4) + 3873: 6(float) Load 137(f16bias) + 3874:3102(ResType) ImageSparseGather 3871 3872 2187 Bias 3873 + 3875: 7(fvec4) CompositeExtract 3874 1 + Store 3832(texel) 3875 + 3876: 47(int) CompositeExtract 3874 0 + 3877: 357 Load 359(s2DRect) + 3878: 53(fvec2) Load 148(c2) + 3879:3102(ResType) ImageSparseGather 3877 3878 2187 + 3880: 7(fvec4) CompositeExtract 3879 1 + Store 3832(texel) 3880 + 3881: 47(int) CompositeExtract 3879 0 + 3882: 357 Load 359(s2DRect) + 3883: 154(fvec2) Load 156(f16c2) + 3884:3102(ResType) ImageSparseGather 3882 3883 2187 + 3885: 7(fvec4) CompositeExtract 3884 1 + Store 3832(texel) 3885 + 3886: 47(int) CompositeExtract 3884 0 + 3887: 224 Load 226(s2DShadow) + 3888: 53(fvec2) Load 148(c2) + 3889: 52(float) Load 215(compare) + 3890:3102(ResType) ImageSparseDrefGather 3887 3888 3889 + 3891: 7(fvec4) CompositeExtract 3890 1 + Store 3832(texel) 3891 + 3892: 47(int) CompositeExtract 3890 0 + 3893: 224 Load 226(s2DShadow) + 3894: 154(fvec2) Load 156(f16c2) + 3895: 52(float) Load 215(compare) + 3896:3102(ResType) ImageSparseDrefGather 3893 3894 3895 + 3897: 7(fvec4) CompositeExtract 3896 1 + Store 3832(texel) 3897 + 3898: 47(int) CompositeExtract 3896 0 + 3899: 337 Load 339(s2DArrayShadow) + 3900: 167(fvec3) Load 169(c3) + 3901: 52(float) Load 215(compare) + 3902:3102(ResType) ImageSparseDrefGather 3899 3900 3901 + 3903: 7(fvec4) CompositeExtract 3902 1 + Store 3832(texel) 3903 + 3904: 47(int) CompositeExtract 3902 0 + 3905: 337 Load 339(s2DArrayShadow) + 3906: 175(fvec3) Load 177(f16c3) + 3907: 52(float) Load 215(compare) + 3908:3102(ResType) ImageSparseDrefGather 3905 3906 3907 + 3909: 7(fvec4) CompositeExtract 3908 1 + Store 3832(texel) 3909 + 3910: 47(int) CompositeExtract 3908 0 + 3911: 245 Load 247(sCubeShadow) + 3912: 167(fvec3) Load 169(c3) + 3913: 52(float) Load 215(compare) + 3914:3102(ResType) ImageSparseDrefGather 3911 3912 3913 + 3915: 7(fvec4) CompositeExtract 3914 1 + Store 3832(texel) 3915 + 3916: 47(int) CompositeExtract 3914 0 + 3917: 245 Load 247(sCubeShadow) + 3918: 175(fvec3) Load 177(f16c3) + 3919: 52(float) Load 215(compare) + 3920:3102(ResType) ImageSparseDrefGather 3917 3918 3919 + 3921: 7(fvec4) CompositeExtract 3920 1 + Store 3832(texel) 3921 + 3922: 47(int) CompositeExtract 3920 0 + 3923: 391 Load 393(sCubeArrayShadow) + 3924: 249(fvec4) Load 251(c4) + 3925: 52(float) Load 215(compare) + 3926:3102(ResType) ImageSparseDrefGather 3923 3924 3925 + 3927: 7(fvec4) CompositeExtract 3926 1 + Store 3832(texel) 3927 + 3928: 47(int) CompositeExtract 3926 0 + 3929: 391 Load 393(sCubeArrayShadow) + 3930: 7(fvec4) Load 309(f16c4) + 3931: 52(float) Load 215(compare) + 3932:3102(ResType) ImageSparseDrefGather 3929 3930 3931 + 3933: 7(fvec4) CompositeExtract 3932 1 + Store 3832(texel) 3933 + 3934: 47(int) CompositeExtract 3932 0 + 3935: 371 Load 373(s2DRectShadow) + 3936: 53(fvec2) Load 148(c2) + 3937: 52(float) Load 215(compare) + 3938:3102(ResType) ImageSparseDrefGather 3935 3936 3937 + 3939: 7(fvec4) CompositeExtract 3938 1 + Store 3832(texel) 3939 + 3940: 47(int) CompositeExtract 3938 0 + 3941: 371 Load 373(s2DRectShadow) + 3942: 154(fvec2) Load 156(f16c2) + 3943: 52(float) Load 215(compare) + 3944:3102(ResType) ImageSparseDrefGather 3941 3942 3943 + 3945: 7(fvec4) CompositeExtract 3944 1 + Store 3832(texel) 3945 + 3946: 47(int) CompositeExtract 3944 0 + 3947: 7(fvec4) Load 3832(texel) + ReturnValue 3947 + FunctionEnd +87(testSparseTextureGatherOffset(): 7(fvec4) Function None 8 + 88: Label + 3950(texel): 64(ptr) Variable Function + Store 3950(texel) 121 + 3951: 143 Load 145(s2D) + 3952: 53(fvec2) Load 148(c2) + 3953:3102(ResType) ImageSparseGather 3951 3952 2187 ConstOffset 722 + 3954: 7(fvec4) CompositeExtract 3953 1 + Store 3950(texel) 3954 + 3955: 47(int) CompositeExtract 3953 0 + 3956: 143 Load 145(s2D) + 3957: 154(fvec2) Load 156(f16c2) + 3958: 6(float) Load 137(f16bias) + 3959:3102(ResType) ImageSparseGather 3956 3957 2187 Bias ConstOffset 3958 722 + 3960: 7(fvec4) CompositeExtract 3959 1 + Store 3950(texel) 3960 + 3961: 47(int) CompositeExtract 3959 0 + 3962: 284 Load 286(s2DArray) + 3963: 167(fvec3) Load 169(c3) + 3964:3102(ResType) ImageSparseGather 3962 3963 2187 ConstOffset 722 + 3965: 7(fvec4) CompositeExtract 3964 1 + Store 3950(texel) 3965 + 3966: 47(int) CompositeExtract 3964 0 + 3967: 284 Load 286(s2DArray) + 3968: 175(fvec3) Load 177(f16c3) + 3969: 6(float) Load 137(f16bias) + 3970:3102(ResType) ImageSparseGather 3967 3968 2187 Bias ConstOffset 3969 722 + 3971: 7(fvec4) CompositeExtract 3970 1 + Store 3950(texel) 3971 + 3972: 47(int) CompositeExtract 3970 0 + 3973: 357 Load 359(s2DRect) + 3974: 53(fvec2) Load 148(c2) + 3975:3102(ResType) ImageSparseGather 3973 3974 2187 ConstOffset 722 + 3976: 7(fvec4) CompositeExtract 3975 1 + Store 3950(texel) 3976 + 3977: 47(int) CompositeExtract 3975 0 + 3978: 357 Load 359(s2DRect) + 3979: 154(fvec2) Load 156(f16c2) + 3980:3102(ResType) ImageSparseGather 3978 3979 2187 ConstOffset 722 + 3981: 7(fvec4) CompositeExtract 3980 1 + Store 3950(texel) 3981 + 3982: 47(int) CompositeExtract 3980 0 + 3983: 224 Load 226(s2DShadow) + 3984: 53(fvec2) Load 148(c2) + 3985: 52(float) Load 215(compare) + 3986:3102(ResType) ImageSparseDrefGather 3983 3984 3985 ConstOffset 722 + 3987: 7(fvec4) CompositeExtract 3986 1 + Store 3950(texel) 3987 + 3988: 47(int) CompositeExtract 3986 0 + 3989: 224 Load 226(s2DShadow) + 3990: 154(fvec2) Load 156(f16c2) + 3991: 52(float) Load 215(compare) + 3992:3102(ResType) ImageSparseDrefGather 3989 3990 3991 ConstOffset 722 + 3993: 7(fvec4) CompositeExtract 3992 1 + Store 3950(texel) 3993 + 3994: 47(int) CompositeExtract 3992 0 + 3995: 337 Load 339(s2DArrayShadow) + 3996: 167(fvec3) Load 169(c3) + 3997: 52(float) Load 215(compare) + 3998:3102(ResType) ImageSparseDrefGather 3995 3996 3997 ConstOffset 722 + 3999: 7(fvec4) CompositeExtract 3998 1 + Store 3950(texel) 3999 + 4000: 47(int) CompositeExtract 3998 0 + 4001: 337 Load 339(s2DArrayShadow) + 4002: 175(fvec3) Load 177(f16c3) + 4003: 52(float) Load 215(compare) + 4004:3102(ResType) ImageSparseDrefGather 4001 4002 4003 ConstOffset 722 + 4005: 7(fvec4) CompositeExtract 4004 1 + Store 3950(texel) 4005 + 4006: 47(int) CompositeExtract 4004 0 + 4007: 371 Load 373(s2DRectShadow) + 4008: 53(fvec2) Load 148(c2) + 4009: 52(float) Load 215(compare) + 4010:3102(ResType) ImageSparseDrefGather 4007 4008 4009 ConstOffset 722 + 4011: 7(fvec4) CompositeExtract 4010 1 + Store 3950(texel) 4011 + 4012: 47(int) CompositeExtract 4010 0 + 4013: 371 Load 373(s2DRectShadow) + 4014: 154(fvec2) Load 156(f16c2) + 4015: 52(float) Load 215(compare) + 4016:3102(ResType) ImageSparseDrefGather 4013 4014 4015 ConstOffset 722 + 4017: 7(fvec4) CompositeExtract 4016 1 + Store 3950(texel) 4017 + 4018: 47(int) CompositeExtract 4016 0 + 4019: 7(fvec4) Load 3950(texel) + ReturnValue 4019 + FunctionEnd +89(testSparseTextureGatherOffsets(): 7(fvec4) Function None 8 + 90: Label + 4022(texel): 64(ptr) Variable Function + Store 4022(texel) 121 + 4023: 143 Load 145(s2D) + 4024: 53(fvec2) Load 148(c2) + 4025:3102(ResType) ImageSparseGather 4023 4024 2187 ConstOffsets 2380 + 4026: 7(fvec4) CompositeExtract 4025 1 + Store 4022(texel) 4026 + 4027: 47(int) CompositeExtract 4025 0 + 4028: 143 Load 145(s2D) + 4029: 154(fvec2) Load 156(f16c2) + 4030: 6(float) Load 137(f16bias) + 4031:3102(ResType) ImageSparseGather 4028 4029 2187 Bias ConstOffsets 4030 2380 + 4032: 7(fvec4) CompositeExtract 4031 1 + Store 4022(texel) 4032 + 4033: 47(int) CompositeExtract 4031 0 + 4034: 284 Load 286(s2DArray) + 4035: 167(fvec3) Load 169(c3) + 4036:3102(ResType) ImageSparseGather 4034 4035 2187 ConstOffsets 2380 + 4037: 7(fvec4) CompositeExtract 4036 1 + Store 4022(texel) 4037 + 4038: 47(int) CompositeExtract 4036 0 + 4039: 284 Load 286(s2DArray) + 4040: 175(fvec3) Load 177(f16c3) + 4041: 6(float) Load 137(f16bias) + 4042:3102(ResType) ImageSparseGather 4039 4040 2187 Bias ConstOffsets 4041 2380 + 4043: 7(fvec4) CompositeExtract 4042 1 + Store 4022(texel) 4043 + 4044: 47(int) CompositeExtract 4042 0 + 4045: 357 Load 359(s2DRect) + 4046: 53(fvec2) Load 148(c2) + 4047:3102(ResType) ImageSparseGather 4045 4046 2187 ConstOffsets 2380 + 4048: 7(fvec4) CompositeExtract 4047 1 + Store 4022(texel) 4048 + 4049: 47(int) CompositeExtract 4047 0 + 4050: 357 Load 359(s2DRect) + 4051: 154(fvec2) Load 156(f16c2) + 4052:3102(ResType) ImageSparseGather 4050 4051 2187 ConstOffsets 2380 + 4053: 7(fvec4) CompositeExtract 4052 1 + Store 4022(texel) 4053 + 4054: 47(int) CompositeExtract 4052 0 + 4055: 224 Load 226(s2DShadow) + 4056: 53(fvec2) Load 148(c2) + 4057: 52(float) Load 215(compare) + 4058:3102(ResType) ImageSparseDrefGather 4055 4056 4057 ConstOffsets 2380 + 4059: 7(fvec4) CompositeExtract 4058 1 + Store 4022(texel) 4059 + 4060: 47(int) CompositeExtract 4058 0 + 4061: 224 Load 226(s2DShadow) + 4062: 154(fvec2) Load 156(f16c2) + 4063: 52(float) Load 215(compare) + 4064:3102(ResType) ImageSparseDrefGather 4061 4062 4063 ConstOffsets 2380 + 4065: 7(fvec4) CompositeExtract 4064 1 + Store 4022(texel) 4065 + 4066: 47(int) CompositeExtract 4064 0 + 4067: 337 Load 339(s2DArrayShadow) + 4068: 167(fvec3) Load 169(c3) + 4069: 52(float) Load 215(compare) + 4070:3102(ResType) ImageSparseDrefGather 4067 4068 4069 ConstOffsets 2380 + 4071: 7(fvec4) CompositeExtract 4070 1 + Store 4022(texel) 4071 + 4072: 47(int) CompositeExtract 4070 0 + 4073: 337 Load 339(s2DArrayShadow) + 4074: 175(fvec3) Load 177(f16c3) + 4075: 52(float) Load 215(compare) + 4076:3102(ResType) ImageSparseDrefGather 4073 4074 4075 ConstOffsets 2380 + 4077: 7(fvec4) CompositeExtract 4076 1 + Store 4022(texel) 4077 + 4078: 47(int) CompositeExtract 4076 0 + 4079: 371 Load 373(s2DRectShadow) + 4080: 53(fvec2) Load 148(c2) + 4081: 52(float) Load 215(compare) + 4082:3102(ResType) ImageSparseDrefGather 4079 4080 4081 ConstOffsets 2380 + 4083: 7(fvec4) CompositeExtract 4082 1 + Store 4022(texel) 4083 + 4084: 47(int) CompositeExtract 4082 0 + 4085: 371 Load 373(s2DRectShadow) + 4086: 154(fvec2) Load 156(f16c2) + 4087: 52(float) Load 215(compare) + 4088:3102(ResType) ImageSparseDrefGather 4085 4086 4087 ConstOffsets 2380 + 4089: 7(fvec4) CompositeExtract 4088 1 + Store 4022(texel) 4089 + 4090: 47(int) CompositeExtract 4088 0 + 4091: 7(fvec4) Load 4022(texel) + ReturnValue 4091 + FunctionEnd +91(testSparseTextureGatherLod(): 7(fvec4) Function None 8 + 92: Label + 4094(texel): 64(ptr) Variable Function + Store 4094(texel) 121 + 4095: 143 Load 145(s2D) + 4096: 53(fvec2) Load 148(c2) + 4097: 52(float) Load 565(lod) + 4098:3102(ResType) ImageSparseGather 4095 4096 2187 Lod 4097 + 4099: 7(fvec4) CompositeExtract 4098 1 + Store 4094(texel) 4099 + 4100: 47(int) CompositeExtract 4098 0 + 4101: 143 Load 145(s2D) + 4102: 154(fvec2) Load 156(f16c2) + 4103: 6(float) Load 572(f16lod) + 4104:3102(ResType) ImageSparseGather 4101 4102 2187 Lod 4103 + 4105: 7(fvec4) CompositeExtract 4104 1 + Store 4094(texel) 4105 + 4106: 47(int) CompositeExtract 4104 0 + 4107: 284 Load 286(s2DArray) + 4108: 167(fvec3) Load 169(c3) + 4109: 52(float) Load 565(lod) + 4110:3102(ResType) ImageSparseGather 4107 4108 2187 Lod 4109 + 4111: 7(fvec4) CompositeExtract 4110 1 + Store 4094(texel) 4111 + 4112: 47(int) CompositeExtract 4110 0 + 4113: 284 Load 286(s2DArray) + 4114: 175(fvec3) Load 177(f16c3) + 4115: 6(float) Load 572(f16lod) + 4116:3102(ResType) ImageSparseGather 4113 4114 2187 Lod 4115 + 4117: 7(fvec4) CompositeExtract 4116 1 + Store 4094(texel) 4117 + 4118: 47(int) CompositeExtract 4116 0 + 4119: 184 Load 186(sCube) + 4120: 167(fvec3) Load 169(c3) + 4121: 52(float) Load 565(lod) + 4122:3102(ResType) ImageSparseGather 4119 4120 2187 Lod 4121 + 4123: 7(fvec4) CompositeExtract 4122 1 + Store 4094(texel) 4123 + 4124: 47(int) CompositeExtract 4122 0 + 4125: 184 Load 186(sCube) + 4126: 175(fvec3) Load 177(f16c3) + 4127: 6(float) Load 572(f16lod) + 4128:3102(ResType) ImageSparseGather 4125 4126 2187 Lod 4127 + 4129: 7(fvec4) CompositeExtract 4128 1 + Store 4094(texel) 4129 + 4130: 47(int) CompositeExtract 4128 0 + 4131: 299 Load 301(sCubeArray) + 4132: 249(fvec4) Load 251(c4) + 4133: 52(float) Load 565(lod) + 4134:3102(ResType) ImageSparseGather 4131 4132 2187 Lod 4133 + 4135: 7(fvec4) CompositeExtract 4134 1 + Store 4094(texel) 4135 + 4136: 47(int) CompositeExtract 4134 0 + 4137: 299 Load 301(sCubeArray) + 4138: 7(fvec4) Load 309(f16c4) + 4139: 6(float) Load 572(f16lod) + 4140:3102(ResType) ImageSparseGather 4137 4138 2187 Lod 4139 + 4141: 7(fvec4) CompositeExtract 4140 1 + Store 4094(texel) 4141 + 4142: 47(int) CompositeExtract 4140 0 + 4143: 7(fvec4) Load 4094(texel) + ReturnValue 4143 + FunctionEnd +93(testSparseTextureGatherLodOffset(): 7(fvec4) Function None 8 + 94: Label + 4146(texel): 64(ptr) Variable Function + Store 4146(texel) 121 + 4147: 143 Load 145(s2D) + 4148: 53(fvec2) Load 148(c2) + 4149: 52(float) Load 565(lod) + 4150:3102(ResType) ImageSparseGather 4147 4148 2187 Lod ConstOffset 4149 722 + 4151: 7(fvec4) CompositeExtract 4150 1 + Store 4146(texel) 4151 + 4152: 47(int) CompositeExtract 4150 0 + 4153: 143 Load 145(s2D) + 4154: 154(fvec2) Load 156(f16c2) + 4155: 6(float) Load 572(f16lod) + 4156:3102(ResType) ImageSparseGather 4153 4154 2187 Lod ConstOffset 4155 722 + 4157: 7(fvec4) CompositeExtract 4156 1 + Store 4146(texel) 4157 + 4158: 47(int) CompositeExtract 4156 0 + 4159: 284 Load 286(s2DArray) + 4160: 167(fvec3) Load 169(c3) + 4161: 52(float) Load 565(lod) + 4162:3102(ResType) ImageSparseGather 4159 4160 2187 Lod ConstOffset 4161 722 + 4163: 7(fvec4) CompositeExtract 4162 1 + Store 4146(texel) 4163 + 4164: 47(int) CompositeExtract 4162 0 + 4165: 284 Load 286(s2DArray) + 4166: 175(fvec3) Load 177(f16c3) + 4167: 6(float) Load 572(f16lod) + 4168:3102(ResType) ImageSparseGather 4165 4166 2187 Lod ConstOffset 4167 722 + 4169: 7(fvec4) CompositeExtract 4168 1 + Store 4146(texel) 4169 + 4170: 47(int) CompositeExtract 4168 0 + 4171: 7(fvec4) Load 4146(texel) + ReturnValue 4171 + FunctionEnd +95(testSparseTextureGatherLodOffsets(): 7(fvec4) Function None 8 + 96: Label + 4174(texel): 64(ptr) Variable Function + Store 4174(texel) 121 + 4175: 143 Load 145(s2D) + 4176: 53(fvec2) Load 148(c2) + 4177: 52(float) Load 565(lod) + 4178:3102(ResType) ImageSparseGather 4175 4176 2187 Lod ConstOffsets 4177 2380 + 4179: 7(fvec4) CompositeExtract 4178 1 + Store 4174(texel) 4179 + 4180: 47(int) CompositeExtract 4178 0 + 4181: 143 Load 145(s2D) + 4182: 154(fvec2) Load 156(f16c2) + 4183: 6(float) Load 572(f16lod) + 4184:3102(ResType) ImageSparseGather 4181 4182 2187 Lod ConstOffsets 4183 2380 + 4185: 7(fvec4) CompositeExtract 4184 1 + Store 4174(texel) 4185 + 4186: 47(int) CompositeExtract 4184 0 + 4187: 284 Load 286(s2DArray) + 4188: 167(fvec3) Load 169(c3) + 4189: 52(float) Load 565(lod) + 4190:3102(ResType) ImageSparseGather 4187 4188 2187 Lod ConstOffsets 4189 2380 + 4191: 7(fvec4) CompositeExtract 4190 1 + Store 4174(texel) 4191 + 4192: 47(int) CompositeExtract 4190 0 + 4193: 284 Load 286(s2DArray) + 4194: 175(fvec3) Load 177(f16c3) + 4195: 6(float) Load 572(f16lod) + 4196:3102(ResType) ImageSparseGather 4193 4194 2187 Lod ConstOffsets 4195 2380 + 4197: 7(fvec4) CompositeExtract 4196 1 + Store 4174(texel) 4197 + 4198: 47(int) CompositeExtract 4196 0 + 4199: 7(fvec4) Load 4174(texel) + ReturnValue 4199 + FunctionEnd +97(testSparseImageLoad(): 7(fvec4) Function None 8 + 98: Label + 4202(texel): 64(ptr) Variable Function + Store 4202(texel) 121 + 4203: 2962 Load 2964(i2D) + 4204: 53(fvec2) Load 148(c2) + 4205: 721(ivec2) ConvertFToS 4204 + 4206:3102(ResType) ImageSparseRead 4203 4205 + 4207: 7(fvec4) CompositeExtract 4206 1 + Store 4202(texel) 4207 + 4208: 47(int) CompositeExtract 4206 0 + 4209: 2971 Load 2973(i3D) + 4210: 167(fvec3) Load 169(c3) + 4211: 734(ivec3) ConvertFToS 4210 + 4212:3102(ResType) ImageSparseRead 4209 4211 + 4213: 7(fvec4) CompositeExtract 4212 1 + Store 4202(texel) 4213 + 4214: 47(int) CompositeExtract 4212 0 + 4215: 2980 Load 2982(i2DRect) + 4216: 53(fvec2) Load 148(c2) + 4217: 721(ivec2) ConvertFToS 4216 + 4218:3102(ResType) ImageSparseRead 4215 4217 + 4219: 7(fvec4) CompositeExtract 4218 1 + Store 4202(texel) 4219 + 4220: 47(int) CompositeExtract 4218 0 + 4221: 2989 Load 2991(iCube) + 4222: 167(fvec3) Load 169(c3) + 4223: 734(ivec3) ConvertFToS 4222 + 4224:3102(ResType) ImageSparseRead 4221 4223 + 4225: 7(fvec4) CompositeExtract 4224 1 + Store 4202(texel) 4225 + 4226: 47(int) CompositeExtract 4224 0 + 4227: 3016 Load 3018(i2DArray) + 4228: 167(fvec3) Load 169(c3) + 4229: 734(ivec3) ConvertFToS 4228 + 4230:3102(ResType) ImageSparseRead 4227 4229 + 4231: 7(fvec4) CompositeExtract 4230 1 + Store 4202(texel) 4231 + 4232: 47(int) CompositeExtract 4230 0 + 4233: 3025 Load 3027(iCubeArray) + 4234: 167(fvec3) Load 169(c3) + 4235: 734(ivec3) ConvertFToS 4234 + 4236:3102(ResType) ImageSparseRead 4233 4235 + 4237: 7(fvec4) CompositeExtract 4236 1 + Store 4202(texel) 4237 + 4238: 47(int) CompositeExtract 4236 0 + 4239: 3034 Load 3036(i2DMS) + 4240: 53(fvec2) Load 148(c2) + 4241: 721(ivec2) ConvertFToS 4240 + 4242:3102(ResType) ImageSparseRead 4239 4241 Sample 709 + 4243: 7(fvec4) CompositeExtract 4242 1 + Store 4202(texel) 4243 + 4244: 47(int) CompositeExtract 4242 0 + 4245: 3043 Load 3045(i2DMSArray) + 4246: 167(fvec3) Load 169(c3) + 4247: 734(ivec3) ConvertFToS 4246 + 4248:3102(ResType) ImageSparseRead 4245 4247 Sample 1326 + 4249: 7(fvec4) CompositeExtract 4248 1 + Store 4202(texel) 4249 + 4250: 47(int) CompositeExtract 4248 0 + 4251: 7(fvec4) Load 4202(texel) + ReturnValue 4251 + FunctionEnd +99(testSparseTextureClamp(): 7(fvec4) Function None 8 + 100: Label + 4254(texel): 64(ptr) Variable Function + Store 4254(texel) 121 + 4255: 143 Load 145(s2D) + 4256: 53(fvec2) Load 148(c2) + 4258: 52(float) Load 4257(lodClamp) + 4259:3102(ResType) ImageSparseSampleImplicitLod 4255 4256 MinLod 4258 + 4260: 7(fvec4) CompositeExtract 4259 1 + Store 4254(texel) 4260 + 4261: 47(int) CompositeExtract 4259 0 + 4262: 143 Load 145(s2D) + 4263: 154(fvec2) Load 156(f16c2) + 4265: 6(float) Load 4264(f16lodClamp) + 4266: 6(float) Load 137(f16bias) + 4267:3102(ResType) ImageSparseSampleImplicitLod 4262 4263 Bias MinLod 4266 4265 + 4268: 7(fvec4) CompositeExtract 4267 1 + Store 4254(texel) 4268 + 4269: 47(int) CompositeExtract 4267 0 + 4270: 163 Load 165(s3D) + 4271: 167(fvec3) Load 169(c3) + 4272: 52(float) Load 4257(lodClamp) + 4273:3102(ResType) ImageSparseSampleImplicitLod 4270 4271 MinLod 4272 + 4274: 7(fvec4) CompositeExtract 4273 1 + Store 4254(texel) 4274 + 4275: 47(int) CompositeExtract 4273 0 + 4276: 163 Load 165(s3D) + 4277: 175(fvec3) Load 177(f16c3) + 4278: 6(float) Load 4264(f16lodClamp) + 4279: 6(float) Load 137(f16bias) + 4280:3102(ResType) ImageSparseSampleImplicitLod 4276 4277 Bias MinLod 4279 4278 + 4281: 7(fvec4) CompositeExtract 4280 1 + Store 4254(texel) 4281 + 4282: 47(int) CompositeExtract 4280 0 + 4283: 184 Load 186(sCube) + 4284: 167(fvec3) Load 169(c3) + 4285: 52(float) Load 4257(lodClamp) + 4286:3102(ResType) ImageSparseSampleImplicitLod 4283 4284 MinLod 4285 + 4287: 7(fvec4) CompositeExtract 4286 1 + Store 4254(texel) 4287 + 4288: 47(int) CompositeExtract 4286 0 + 4289: 184 Load 186(sCube) + 4290: 175(fvec3) Load 177(f16c3) + 4291: 6(float) Load 4264(f16lodClamp) + 4292: 6(float) Load 137(f16bias) + 4293:3102(ResType) ImageSparseSampleImplicitLod 4289 4290 Bias MinLod 4292 4291 + 4294: 7(fvec4) CompositeExtract 4293 1 + Store 4254(texel) 4294 + 4295: 47(int) CompositeExtract 4293 0 + 4296: 224 Load 226(s2DShadow) + 4297: 167(fvec3) Load 169(c3) + 4298: 52(float) Load 4257(lodClamp) + 4299: 208(ptr) AccessChain 4254(texel) 207 + 4300: 52(float) CompositeExtract 4297 2 + 4301:3138(ResType) ImageSparseSampleDrefImplicitLod 4296 4297 4300 MinLod 4298 + 4302: 6(float) CompositeExtract 4301 1 + Store 4299 4302 + 4303: 47(int) CompositeExtract 4301 0 + 4304: 224 Load 226(s2DShadow) + 4305: 154(fvec2) Load 156(f16c2) + 4306: 52(float) Load 215(compare) + 4307: 6(float) Load 4264(f16lodClamp) + 4308: 208(ptr) AccessChain 4254(texel) 207 + 4309: 6(float) Load 137(f16bias) + 4310:3138(ResType) ImageSparseSampleDrefImplicitLod 4304 4305 4306 Bias MinLod 4309 4307 + 4311: 6(float) CompositeExtract 4310 1 + Store 4308 4311 + 4312: 47(int) CompositeExtract 4310 0 + 4313: 245 Load 247(sCubeShadow) + 4314: 249(fvec4) Load 251(c4) + 4315: 52(float) Load 4257(lodClamp) + 4316: 208(ptr) AccessChain 4254(texel) 207 + 4317: 52(float) CompositeExtract 4314 3 + 4318:3138(ResType) ImageSparseSampleDrefImplicitLod 4313 4314 4317 MinLod 4315 + 4319: 6(float) CompositeExtract 4318 1 + Store 4316 4319 + 4320: 47(int) CompositeExtract 4318 0 + 4321: 245 Load 247(sCubeShadow) + 4322: 175(fvec3) Load 177(f16c3) + 4323: 52(float) Load 215(compare) + 4324: 6(float) Load 4264(f16lodClamp) + 4325: 208(ptr) AccessChain 4254(texel) 207 + 4326: 6(float) Load 137(f16bias) + 4327:3138(ResType) ImageSparseSampleDrefImplicitLod 4321 4322 4323 Bias MinLod 4326 4324 + 4328: 6(float) CompositeExtract 4327 1 + Store 4325 4328 + 4329: 47(int) CompositeExtract 4327 0 + 4330: 284 Load 286(s2DArray) + 4331: 167(fvec3) Load 169(c3) + 4332: 52(float) Load 4257(lodClamp) + 4333:3102(ResType) ImageSparseSampleImplicitLod 4330 4331 MinLod 4332 + 4334: 7(fvec4) CompositeExtract 4333 1 + Store 4254(texel) 4334 + 4335: 47(int) CompositeExtract 4333 0 + 4336: 284 Load 286(s2DArray) + 4337: 175(fvec3) Load 177(f16c3) + 4338: 6(float) Load 4264(f16lodClamp) + 4339: 6(float) Load 137(f16bias) + 4340:3102(ResType) ImageSparseSampleImplicitLod 4336 4337 Bias MinLod 4339 4338 + 4341: 7(fvec4) CompositeExtract 4340 1 + Store 4254(texel) 4341 + 4342: 47(int) CompositeExtract 4340 0 + 4343: 299 Load 301(sCubeArray) + 4344: 249(fvec4) Load 251(c4) + 4345: 52(float) Load 4257(lodClamp) + 4346:3102(ResType) ImageSparseSampleImplicitLod 4343 4344 MinLod 4345 + 4347: 7(fvec4) CompositeExtract 4346 1 + Store 4254(texel) 4347 + 4348: 47(int) CompositeExtract 4346 0 + 4349: 299 Load 301(sCubeArray) + 4350: 7(fvec4) Load 309(f16c4) + 4351: 6(float) Load 4264(f16lodClamp) + 4352: 6(float) Load 137(f16bias) + 4353:3102(ResType) ImageSparseSampleImplicitLod 4349 4350 Bias MinLod 4352 4351 + 4354: 7(fvec4) CompositeExtract 4353 1 + Store 4254(texel) 4354 + 4355: 47(int) CompositeExtract 4353 0 + 4356: 337 Load 339(s2DArrayShadow) + 4357: 249(fvec4) Load 251(c4) + 4358: 52(float) Load 4257(lodClamp) + 4359: 208(ptr) AccessChain 4254(texel) 207 + 4360: 52(float) CompositeExtract 4357 3 + 4361:3138(ResType) ImageSparseSampleDrefImplicitLod 4356 4357 4360 MinLod 4358 + 4362: 6(float) CompositeExtract 4361 1 + Store 4359 4362 + 4363: 47(int) CompositeExtract 4361 0 + 4364: 337 Load 339(s2DArrayShadow) + 4365: 175(fvec3) Load 177(f16c3) + 4366: 52(float) Load 215(compare) + 4367: 6(float) Load 4264(f16lodClamp) + 4368: 208(ptr) AccessChain 4254(texel) 207 + 4369:3138(ResType) ImageSparseSampleDrefImplicitLod 4364 4365 4366 MinLod 4367 + 4370: 6(float) CompositeExtract 4369 1 + Store 4368 4370 + 4371: 47(int) CompositeExtract 4369 0 + 4372: 391 Load 393(sCubeArrayShadow) + 4373: 249(fvec4) Load 251(c4) + 4374: 52(float) Load 215(compare) + 4375: 52(float) Load 4257(lodClamp) + 4376: 208(ptr) AccessChain 4254(texel) 207 + 4377:3138(ResType) ImageSparseSampleDrefImplicitLod 4372 4373 4374 MinLod 4375 + 4378: 6(float) CompositeExtract 4377 1 + Store 4376 4378 + 4379: 47(int) CompositeExtract 4377 0 + 4380: 391 Load 393(sCubeArrayShadow) + 4381: 7(fvec4) Load 309(f16c4) + 4382: 52(float) Load 215(compare) + 4383: 6(float) Load 4264(f16lodClamp) + 4384: 208(ptr) AccessChain 4254(texel) 207 + 4385:3138(ResType) ImageSparseSampleDrefImplicitLod 4380 4381 4382 MinLod 4383 + 4386: 6(float) CompositeExtract 4385 1 + Store 4384 4386 + 4387: 47(int) CompositeExtract 4385 0 + 4388: 7(fvec4) Load 4254(texel) + ReturnValue 4388 + FunctionEnd +101(testTextureClamp(): 7(fvec4) Function None 8 + 102: Label + 4391(texel): 64(ptr) Variable Function + Store 4391(texel) 121 + 4392: 123 Load 125(s1D) + 4393: 52(float) Load 128(c1) + 4394: 52(float) Load 4257(lodClamp) + 4395: 7(fvec4) ImageSampleImplicitLod 4392 4393 MinLod 4394 + 4396: 7(fvec4) Load 4391(texel) + 4397: 7(fvec4) FAdd 4396 4395 + Store 4391(texel) 4397 + 4398: 123 Load 125(s1D) + 4399: 6(float) Load 135(f16c1) + 4400: 6(float) Load 4264(f16lodClamp) + 4401: 6(float) Load 137(f16bias) + 4402: 7(fvec4) ImageSampleImplicitLod 4398 4399 Bias MinLod 4401 4400 + 4403: 7(fvec4) Load 4391(texel) + 4404: 7(fvec4) FAdd 4403 4402 + Store 4391(texel) 4404 + 4405: 143 Load 145(s2D) + 4406: 53(fvec2) Load 148(c2) + 4407: 52(float) Load 4257(lodClamp) + 4408: 7(fvec4) ImageSampleImplicitLod 4405 4406 MinLod 4407 + 4409: 7(fvec4) Load 4391(texel) + 4410: 7(fvec4) FAdd 4409 4408 + Store 4391(texel) 4410 + 4411: 143 Load 145(s2D) + 4412: 154(fvec2) Load 156(f16c2) + 4413: 6(float) Load 4264(f16lodClamp) + 4414: 6(float) Load 137(f16bias) + 4415: 7(fvec4) ImageSampleImplicitLod 4411 4412 Bias MinLod 4414 4413 + 4416: 7(fvec4) Load 4391(texel) + 4417: 7(fvec4) FAdd 4416 4415 + Store 4391(texel) 4417 + 4418: 163 Load 165(s3D) + 4419: 167(fvec3) Load 169(c3) + 4420: 52(float) Load 4257(lodClamp) + 4421: 7(fvec4) ImageSampleImplicitLod 4418 4419 MinLod 4420 + 4422: 7(fvec4) Load 4391(texel) + 4423: 7(fvec4) FAdd 4422 4421 + Store 4391(texel) 4423 + 4424: 163 Load 165(s3D) + 4425: 175(fvec3) Load 177(f16c3) + 4426: 6(float) Load 4264(f16lodClamp) + 4427: 6(float) Load 137(f16bias) + 4428: 7(fvec4) ImageSampleImplicitLod 4424 4425 Bias MinLod 4427 4426 + 4429: 7(fvec4) Load 4391(texel) + 4430: 7(fvec4) FAdd 4429 4428 + Store 4391(texel) 4430 + 4431: 184 Load 186(sCube) + 4432: 167(fvec3) Load 169(c3) + 4433: 52(float) Load 4257(lodClamp) + 4434: 7(fvec4) ImageSampleImplicitLod 4431 4432 MinLod 4433 + 4435: 7(fvec4) Load 4391(texel) + 4436: 7(fvec4) FAdd 4435 4434 + Store 4391(texel) 4436 + 4437: 184 Load 186(sCube) + 4438: 175(fvec3) Load 177(f16c3) + 4439: 6(float) Load 4264(f16lodClamp) + 4440: 6(float) Load 137(f16bias) + 4441: 7(fvec4) ImageSampleImplicitLod 4437 4438 Bias MinLod 4440 4439 + 4442: 7(fvec4) Load 4391(texel) + 4443: 7(fvec4) FAdd 4442 4441 + Store 4391(texel) 4443 + 4444: 199 Load 201(s1DShadow) + 4445: 167(fvec3) Load 169(c3) + 4446: 52(float) Load 4257(lodClamp) + 4447: 52(float) CompositeExtract 4445 2 + 4448: 6(float) ImageSampleDrefImplicitLod 4444 4445 4447 MinLod 4446 + 4449: 208(ptr) AccessChain 4391(texel) 207 + 4450: 6(float) Load 4449 + 4451: 6(float) FAdd 4450 4448 + 4452: 208(ptr) AccessChain 4391(texel) 207 + Store 4452 4451 + 4453: 199 Load 201(s1DShadow) + 4454: 154(fvec2) Load 156(f16c2) + 4455: 52(float) Load 215(compare) + 4456: 6(float) Load 4264(f16lodClamp) + 4457: 6(float) Load 137(f16bias) + 4458: 6(float) ImageSampleDrefImplicitLod 4453 4454 4455 Bias MinLod 4457 4456 + 4459: 208(ptr) AccessChain 4391(texel) 207 + 4460: 6(float) Load 4459 + 4461: 6(float) FAdd 4460 4458 + 4462: 208(ptr) AccessChain 4391(texel) 207 + Store 4462 4461 + 4463: 224 Load 226(s2DShadow) + 4464: 167(fvec3) Load 169(c3) + 4465: 52(float) Load 4257(lodClamp) + 4466: 52(float) CompositeExtract 4464 2 + 4467: 6(float) ImageSampleDrefImplicitLod 4463 4464 4466 MinLod 4465 + 4468: 208(ptr) AccessChain 4391(texel) 207 + 4469: 6(float) Load 4468 + 4470: 6(float) FAdd 4469 4467 + 4471: 208(ptr) AccessChain 4391(texel) 207 + Store 4471 4470 + 4472: 224 Load 226(s2DShadow) + 4473: 154(fvec2) Load 156(f16c2) + 4474: 52(float) Load 215(compare) + 4475: 6(float) Load 4264(f16lodClamp) + 4476: 6(float) Load 137(f16bias) + 4477: 6(float) ImageSampleDrefImplicitLod 4472 4473 4474 Bias MinLod 4476 4475 + 4478: 208(ptr) AccessChain 4391(texel) 207 + 4479: 6(float) Load 4478 + 4480: 6(float) FAdd 4479 4477 + 4481: 208(ptr) AccessChain 4391(texel) 207 + Store 4481 4480 + 4482: 245 Load 247(sCubeShadow) + 4483: 249(fvec4) Load 251(c4) + 4484: 52(float) Load 4257(lodClamp) + 4485: 52(float) CompositeExtract 4483 3 + 4486: 6(float) ImageSampleDrefImplicitLod 4482 4483 4485 MinLod 4484 + 4487: 208(ptr) AccessChain 4391(texel) 207 + 4488: 6(float) Load 4487 + 4489: 6(float) FAdd 4488 4486 + 4490: 208(ptr) AccessChain 4391(texel) 207 + Store 4490 4489 + 4491: 245 Load 247(sCubeShadow) + 4492: 175(fvec3) Load 177(f16c3) + 4493: 52(float) Load 215(compare) + 4494: 6(float) Load 4264(f16lodClamp) + 4495: 6(float) Load 137(f16bias) + 4496: 6(float) ImageSampleDrefImplicitLod 4491 4492 4493 Bias MinLod 4495 4494 + 4497: 208(ptr) AccessChain 4391(texel) 207 + 4498: 6(float) Load 4497 + 4499: 6(float) FAdd 4498 4496 + 4500: 208(ptr) AccessChain 4391(texel) 207 + Store 4500 4499 + 4501: 269 Load 271(s1DArray) + 4502: 53(fvec2) Load 148(c2) + 4503: 52(float) Load 4257(lodClamp) + 4504: 7(fvec4) ImageSampleImplicitLod 4501 4502 MinLod 4503 + 4505: 7(fvec4) Load 4391(texel) + 4506: 7(fvec4) FAdd 4505 4504 + Store 4391(texel) 4506 + 4507: 269 Load 271(s1DArray) + 4508: 154(fvec2) Load 156(f16c2) + 4509: 6(float) Load 4264(f16lodClamp) + 4510: 6(float) Load 137(f16bias) + 4511: 7(fvec4) ImageSampleImplicitLod 4507 4508 Bias MinLod 4510 4509 + 4512: 7(fvec4) Load 4391(texel) + 4513: 7(fvec4) FAdd 4512 4511 + Store 4391(texel) 4513 + 4514: 284 Load 286(s2DArray) + 4515: 167(fvec3) Load 169(c3) + 4516: 52(float) Load 4257(lodClamp) + 4517: 7(fvec4) ImageSampleImplicitLod 4514 4515 MinLod 4516 + 4518: 7(fvec4) Load 4391(texel) + 4519: 7(fvec4) FAdd 4518 4517 + Store 4391(texel) 4519 + 4520: 284 Load 286(s2DArray) + 4521: 175(fvec3) Load 177(f16c3) + 4522: 6(float) Load 4264(f16lodClamp) + 4523: 6(float) Load 137(f16bias) + 4524: 7(fvec4) ImageSampleImplicitLod 4520 4521 Bias MinLod 4523 4522 + 4525: 7(fvec4) Load 4391(texel) + 4526: 7(fvec4) FAdd 4525 4524 + Store 4391(texel) 4526 + 4527: 299 Load 301(sCubeArray) + 4528: 249(fvec4) Load 251(c4) + 4529: 52(float) Load 4257(lodClamp) + 4530: 7(fvec4) ImageSampleImplicitLod 4527 4528 MinLod 4529 + 4531: 7(fvec4) Load 4391(texel) + 4532: 7(fvec4) FAdd 4531 4530 + Store 4391(texel) 4532 + 4533: 299 Load 301(sCubeArray) + 4534: 7(fvec4) Load 309(f16c4) + 4535: 6(float) Load 4264(f16lodClamp) + 4536: 6(float) Load 137(f16bias) + 4537: 7(fvec4) ImageSampleImplicitLod 4533 4534 Bias MinLod 4536 4535 + 4538: 7(fvec4) Load 4391(texel) + 4539: 7(fvec4) FAdd 4538 4537 + Store 4391(texel) 4539 + 4540: 316 Load 318(s1DArrayShadow) + 4541: 167(fvec3) Load 169(c3) + 4542: 52(float) Load 4257(lodClamp) + 4543: 52(float) CompositeExtract 4541 2 + 4544: 6(float) ImageSampleDrefImplicitLod 4540 4541 4543 MinLod 4542 + 4545: 208(ptr) AccessChain 4391(texel) 207 + 4546: 6(float) Load 4545 + 4547: 6(float) FAdd 4546 4544 + 4548: 208(ptr) AccessChain 4391(texel) 207 + Store 4548 4547 + 4549: 316 Load 318(s1DArrayShadow) + 4550: 154(fvec2) Load 156(f16c2) + 4551: 52(float) Load 215(compare) + 4552: 6(float) Load 4264(f16lodClamp) + 4553: 6(float) Load 137(f16bias) + 4554: 6(float) ImageSampleDrefImplicitLod 4549 4550 4551 Bias MinLod 4553 4552 + 4555: 208(ptr) AccessChain 4391(texel) 207 + 4556: 6(float) Load 4555 + 4557: 6(float) FAdd 4556 4554 + 4558: 208(ptr) AccessChain 4391(texel) 207 + Store 4558 4557 + 4559: 337 Load 339(s2DArrayShadow) + 4560: 249(fvec4) Load 251(c4) + 4561: 52(float) Load 4257(lodClamp) + 4562: 52(float) CompositeExtract 4560 3 + 4563: 6(float) ImageSampleDrefImplicitLod 4559 4560 4562 MinLod 4561 + 4564: 208(ptr) AccessChain 4391(texel) 207 + 4565: 6(float) Load 4564 + 4566: 6(float) FAdd 4565 4563 + 4567: 208(ptr) AccessChain 4391(texel) 207 + Store 4567 4566 + 4568: 337 Load 339(s2DArrayShadow) + 4569: 175(fvec3) Load 177(f16c3) + 4570: 52(float) Load 215(compare) + 4571: 6(float) Load 4264(f16lodClamp) + 4572: 6(float) ImageSampleDrefImplicitLod 4568 4569 4570 MinLod 4571 + 4573: 208(ptr) AccessChain 4391(texel) 207 + 4574: 6(float) Load 4573 + 4575: 6(float) FAdd 4574 4572 + 4576: 208(ptr) AccessChain 4391(texel) 207 + Store 4576 4575 + 4577: 391 Load 393(sCubeArrayShadow) + 4578: 249(fvec4) Load 251(c4) + 4579: 52(float) Load 215(compare) + 4580: 52(float) Load 4257(lodClamp) + 4581: 6(float) ImageSampleDrefImplicitLod 4577 4578 4579 MinLod 4580 + 4582: 208(ptr) AccessChain 4391(texel) 207 + 4583: 6(float) Load 4582 + 4584: 6(float) FAdd 4583 4581 + 4585: 208(ptr) AccessChain 4391(texel) 207 + Store 4585 4584 + 4586: 391 Load 393(sCubeArrayShadow) + 4587: 7(fvec4) Load 309(f16c4) + 4588: 52(float) Load 215(compare) + 4589: 6(float) Load 4264(f16lodClamp) + 4590: 6(float) ImageSampleDrefImplicitLod 4586 4587 4588 MinLod 4589 + 4591: 208(ptr) AccessChain 4391(texel) 207 + 4592: 6(float) Load 4591 + 4593: 6(float) FAdd 4592 4590 + 4594: 208(ptr) AccessChain 4391(texel) 207 + Store 4594 4593 + 4595: 7(fvec4) Load 4391(texel) + ReturnValue 4595 + FunctionEnd +103(testSparseTextureOffsetClamp(): 7(fvec4) Function None 8 + 104: Label + 4598(texel): 64(ptr) Variable Function + Store 4598(texel) 121 + 4599: 143 Load 145(s2D) + 4600: 53(fvec2) Load 148(c2) + 4601: 52(float) Load 4257(lodClamp) + 4602:3102(ResType) ImageSparseSampleImplicitLod 4599 4600 ConstOffset MinLod 722 4601 + 4603: 7(fvec4) CompositeExtract 4602 1 + Store 4598(texel) 4603 + 4604: 47(int) CompositeExtract 4602 0 + 4605: 143 Load 145(s2D) + 4606: 154(fvec2) Load 156(f16c2) + 4607: 6(float) Load 4264(f16lodClamp) + 4608: 6(float) Load 137(f16bias) + 4609:3102(ResType) ImageSparseSampleImplicitLod 4605 4606 Bias ConstOffset MinLod 4608 722 4607 + 4610: 7(fvec4) CompositeExtract 4609 1 + Store 4598(texel) 4610 + 4611: 47(int) CompositeExtract 4609 0 + 4612: 163 Load 165(s3D) + 4613: 167(fvec3) Load 169(c3) + 4614: 52(float) Load 4257(lodClamp) + 4615:3102(ResType) ImageSparseSampleImplicitLod 4612 4613 ConstOffset MinLod 735 4614 + 4616: 7(fvec4) CompositeExtract 4615 1 + Store 4598(texel) 4616 + 4617: 47(int) CompositeExtract 4615 0 + 4618: 163 Load 165(s3D) + 4619: 175(fvec3) Load 177(f16c3) + 4620: 6(float) Load 4264(f16lodClamp) + 4621: 6(float) Load 137(f16bias) + 4622:3102(ResType) ImageSparseSampleImplicitLod 4618 4619 Bias ConstOffset MinLod 4621 735 4620 + 4623: 7(fvec4) CompositeExtract 4622 1 + Store 4598(texel) 4623 + 4624: 47(int) CompositeExtract 4622 0 + 4625: 224 Load 226(s2DShadow) + 4626: 167(fvec3) Load 169(c3) + 4627: 52(float) Load 4257(lodClamp) + 4628: 208(ptr) AccessChain 4598(texel) 207 + 4629: 52(float) CompositeExtract 4626 2 + 4630:3138(ResType) ImageSparseSampleDrefImplicitLod 4625 4626 4629 ConstOffset MinLod 722 4627 + 4631: 6(float) CompositeExtract 4630 1 + Store 4628 4631 + 4632: 47(int) CompositeExtract 4630 0 + 4633: 224 Load 226(s2DShadow) + 4634: 154(fvec2) Load 156(f16c2) + 4635: 52(float) Load 215(compare) + 4636: 6(float) Load 4264(f16lodClamp) + 4637: 208(ptr) AccessChain 4598(texel) 207 + 4638: 6(float) Load 137(f16bias) + 4639:3138(ResType) ImageSparseSampleDrefImplicitLod 4633 4634 4635 Bias ConstOffset MinLod 4638 722 4636 + 4640: 6(float) CompositeExtract 4639 1 + Store 4637 4640 + 4641: 47(int) CompositeExtract 4639 0 + 4642: 284 Load 286(s2DArray) + 4643: 167(fvec3) Load 169(c3) + 4644: 52(float) Load 4257(lodClamp) + 4645:3102(ResType) ImageSparseSampleImplicitLod 4642 4643 ConstOffset MinLod 722 4644 + 4646: 7(fvec4) CompositeExtract 4645 1 + Store 4598(texel) 4646 + 4647: 47(int) CompositeExtract 4645 0 + 4648: 284 Load 286(s2DArray) + 4649: 175(fvec3) Load 177(f16c3) + 4650: 6(float) Load 4264(f16lodClamp) + 4651: 6(float) Load 137(f16bias) + 4652:3102(ResType) ImageSparseSampleImplicitLod 4648 4649 Bias ConstOffset MinLod 4651 722 4650 + 4653: 7(fvec4) CompositeExtract 4652 1 + Store 4598(texel) 4653 + 4654: 47(int) CompositeExtract 4652 0 + 4655: 337 Load 339(s2DArrayShadow) + 4656: 249(fvec4) Load 251(c4) + 4657: 52(float) Load 4257(lodClamp) + 4658: 208(ptr) AccessChain 4598(texel) 207 + 4659: 52(float) CompositeExtract 4656 3 + 4660:3138(ResType) ImageSparseSampleDrefImplicitLod 4655 4656 4659 ConstOffset MinLod 722 4657 + 4661: 6(float) CompositeExtract 4660 1 + Store 4658 4661 + 4662: 47(int) CompositeExtract 4660 0 + 4663: 337 Load 339(s2DArrayShadow) + 4664: 175(fvec3) Load 177(f16c3) + 4665: 52(float) Load 215(compare) + 4666: 6(float) Load 4264(f16lodClamp) + 4667: 208(ptr) AccessChain 4598(texel) 207 + 4668:3138(ResType) ImageSparseSampleDrefImplicitLod 4663 4664 4665 ConstOffset MinLod 722 4666 + 4669: 6(float) CompositeExtract 4668 1 + Store 4667 4669 + 4670: 47(int) CompositeExtract 4668 0 + 4671: 7(fvec4) Load 4598(texel) + ReturnValue 4671 + FunctionEnd +105(testTextureOffsetClamp(): 7(fvec4) Function None 8 + 106: Label + 4674(texel): 64(ptr) Variable Function + Store 4674(texel) 121 + 4675: 123 Load 125(s1D) + 4676: 52(float) Load 128(c1) + 4677: 52(float) Load 4257(lodClamp) + 4678: 7(fvec4) ImageSampleImplicitLod 4675 4676 ConstOffset MinLod 709 4677 + 4679: 7(fvec4) Load 4674(texel) + 4680: 7(fvec4) FAdd 4679 4678 + Store 4674(texel) 4680 + 4681: 123 Load 125(s1D) + 4682: 6(float) Load 135(f16c1) + 4683: 6(float) Load 4264(f16lodClamp) + 4684: 6(float) Load 137(f16bias) + 4685: 7(fvec4) ImageSampleImplicitLod 4681 4682 Bias ConstOffset MinLod 4684 709 4683 + 4686: 7(fvec4) Load 4674(texel) + 4687: 7(fvec4) FAdd 4686 4685 + Store 4674(texel) 4687 + 4688: 143 Load 145(s2D) + 4689: 53(fvec2) Load 148(c2) + 4690: 52(float) Load 4257(lodClamp) + 4691: 7(fvec4) ImageSampleImplicitLod 4688 4689 ConstOffset MinLod 722 4690 + 4692: 7(fvec4) Load 4674(texel) + 4693: 7(fvec4) FAdd 4692 4691 + Store 4674(texel) 4693 + 4694: 143 Load 145(s2D) + 4695: 154(fvec2) Load 156(f16c2) + 4696: 6(float) Load 4264(f16lodClamp) + 4697: 6(float) Load 137(f16bias) + 4698: 7(fvec4) ImageSampleImplicitLod 4694 4695 Bias ConstOffset MinLod 4697 722 4696 + 4699: 7(fvec4) Load 4674(texel) + 4700: 7(fvec4) FAdd 4699 4698 + Store 4674(texel) 4700 + 4701: 163 Load 165(s3D) + 4702: 167(fvec3) Load 169(c3) + 4703: 52(float) Load 4257(lodClamp) + 4704: 7(fvec4) ImageSampleImplicitLod 4701 4702 ConstOffset MinLod 735 4703 + 4705: 7(fvec4) Load 4674(texel) + 4706: 7(fvec4) FAdd 4705 4704 + Store 4674(texel) 4706 + 4707: 163 Load 165(s3D) + 4708: 175(fvec3) Load 177(f16c3) + 4709: 6(float) Load 4264(f16lodClamp) + 4710: 6(float) Load 137(f16bias) + 4711: 7(fvec4) ImageSampleImplicitLod 4707 4708 Bias ConstOffset MinLod 4710 735 4709 + 4712: 7(fvec4) Load 4674(texel) + 4713: 7(fvec4) FAdd 4712 4711 + Store 4674(texel) 4713 + 4714: 199 Load 201(s1DShadow) + 4715: 167(fvec3) Load 169(c3) + 4716: 52(float) Load 4257(lodClamp) + 4717: 52(float) CompositeExtract 4715 2 + 4718: 6(float) ImageSampleDrefImplicitLod 4714 4715 4717 ConstOffset MinLod 709 4716 + 4719: 208(ptr) AccessChain 4674(texel) 207 + 4720: 6(float) Load 4719 + 4721: 6(float) FAdd 4720 4718 + 4722: 208(ptr) AccessChain 4674(texel) 207 + Store 4722 4721 + 4723: 199 Load 201(s1DShadow) + 4724: 154(fvec2) Load 156(f16c2) + 4725: 52(float) Load 215(compare) + 4726: 6(float) Load 4264(f16lodClamp) + 4727: 6(float) Load 137(f16bias) + 4728: 6(float) ImageSampleDrefImplicitLod 4723 4724 4725 Bias ConstOffset MinLod 4727 709 4726 + 4729: 208(ptr) AccessChain 4674(texel) 207 + 4730: 6(float) Load 4729 + 4731: 6(float) FAdd 4730 4728 + 4732: 208(ptr) AccessChain 4674(texel) 207 + Store 4732 4731 + 4733: 224 Load 226(s2DShadow) + 4734: 167(fvec3) Load 169(c3) + 4735: 52(float) Load 4257(lodClamp) + 4736: 52(float) CompositeExtract 4734 2 + 4737: 6(float) ImageSampleDrefImplicitLod 4733 4734 4736 ConstOffset MinLod 722 4735 + 4738: 208(ptr) AccessChain 4674(texel) 207 + 4739: 6(float) Load 4738 + 4740: 6(float) FAdd 4739 4737 + 4741: 208(ptr) AccessChain 4674(texel) 207 + Store 4741 4740 + 4742: 224 Load 226(s2DShadow) + 4743: 154(fvec2) Load 156(f16c2) + 4744: 52(float) Load 215(compare) + 4745: 6(float) Load 4264(f16lodClamp) + 4746: 6(float) Load 137(f16bias) + 4747: 6(float) ImageSampleDrefImplicitLod 4742 4743 4744 Bias ConstOffset MinLod 4746 722 4745 + 4748: 208(ptr) AccessChain 4674(texel) 207 + 4749: 6(float) Load 4748 + 4750: 6(float) FAdd 4749 4747 + 4751: 208(ptr) AccessChain 4674(texel) 207 + Store 4751 4750 + 4752: 269 Load 271(s1DArray) + 4753: 53(fvec2) Load 148(c2) + 4754: 52(float) Load 4257(lodClamp) + 4755: 7(fvec4) ImageSampleImplicitLod 4752 4753 ConstOffset MinLod 709 4754 + 4756: 7(fvec4) Load 4674(texel) + 4757: 7(fvec4) FAdd 4756 4755 + Store 4674(texel) 4757 + 4758: 269 Load 271(s1DArray) + 4759: 154(fvec2) Load 156(f16c2) + 4760: 6(float) Load 4264(f16lodClamp) + 4761: 6(float) Load 137(f16bias) + 4762: 7(fvec4) ImageSampleImplicitLod 4758 4759 Bias ConstOffset MinLod 4761 709 4760 + 4763: 7(fvec4) Load 4674(texel) + 4764: 7(fvec4) FAdd 4763 4762 + Store 4674(texel) 4764 + 4765: 284 Load 286(s2DArray) + 4766: 167(fvec3) Load 169(c3) + 4767: 52(float) Load 4257(lodClamp) + 4768: 7(fvec4) ImageSampleImplicitLod 4765 4766 ConstOffset MinLod 722 4767 + 4769: 7(fvec4) Load 4674(texel) + 4770: 7(fvec4) FAdd 4769 4768 + Store 4674(texel) 4770 + 4771: 284 Load 286(s2DArray) + 4772: 175(fvec3) Load 177(f16c3) + 4773: 6(float) Load 4264(f16lodClamp) + 4774: 6(float) Load 137(f16bias) + 4775: 7(fvec4) ImageSampleImplicitLod 4771 4772 Bias ConstOffset MinLod 4774 722 4773 + 4776: 7(fvec4) Load 4674(texel) + 4777: 7(fvec4) FAdd 4776 4775 + Store 4674(texel) 4777 + 4778: 316 Load 318(s1DArrayShadow) + 4779: 167(fvec3) Load 169(c3) + 4780: 52(float) Load 4257(lodClamp) + 4781: 52(float) CompositeExtract 4779 2 + 4782: 6(float) ImageSampleDrefImplicitLod 4778 4779 4781 ConstOffset MinLod 709 4780 + 4783: 208(ptr) AccessChain 4674(texel) 207 + 4784: 6(float) Load 4783 + 4785: 6(float) FAdd 4784 4782 + 4786: 208(ptr) AccessChain 4674(texel) 207 + Store 4786 4785 + 4787: 316 Load 318(s1DArrayShadow) + 4788: 154(fvec2) Load 156(f16c2) + 4789: 52(float) Load 215(compare) + 4790: 6(float) Load 4264(f16lodClamp) + 4791: 6(float) Load 137(f16bias) + 4792: 6(float) ImageSampleDrefImplicitLod 4787 4788 4789 Bias ConstOffset MinLod 4791 709 4790 + 4793: 208(ptr) AccessChain 4674(texel) 207 + 4794: 6(float) Load 4793 + 4795: 6(float) FAdd 4794 4792 + 4796: 208(ptr) AccessChain 4674(texel) 207 + Store 4796 4795 + 4797: 337 Load 339(s2DArrayShadow) + 4798: 249(fvec4) Load 251(c4) + 4799: 52(float) Load 4257(lodClamp) + 4800: 52(float) CompositeExtract 4798 3 + 4801: 6(float) ImageSampleDrefImplicitLod 4797 4798 4800 ConstOffset MinLod 722 4799 + 4802: 208(ptr) AccessChain 4674(texel) 207 + 4803: 6(float) Load 4802 + 4804: 6(float) FAdd 4803 4801 + 4805: 208(ptr) AccessChain 4674(texel) 207 + Store 4805 4804 + 4806: 337 Load 339(s2DArrayShadow) + 4807: 175(fvec3) Load 177(f16c3) + 4808: 52(float) Load 215(compare) + 4809: 6(float) Load 4264(f16lodClamp) + 4810: 6(float) ImageSampleDrefImplicitLod 4806 4807 4808 ConstOffset MinLod 722 4809 + 4811: 208(ptr) AccessChain 4674(texel) 207 + 4812: 6(float) Load 4811 + 4813: 6(float) FAdd 4812 4810 + 4814: 208(ptr) AccessChain 4674(texel) 207 + Store 4814 4813 + 4815: 7(fvec4) Load 4674(texel) + ReturnValue 4815 + FunctionEnd +107(testSparseTextureGradClamp(): 7(fvec4) Function None 8 + 108: Label + 4818(texel): 64(ptr) Variable Function + Store 4818(texel) 121 + 4819: 143 Load 145(s2D) + 4820: 53(fvec2) Load 148(c2) + 4821: 53(fvec2) Load 1409(dPdxy2) + 4822: 53(fvec2) Load 1409(dPdxy2) + 4823: 52(float) Load 4257(lodClamp) + 4824:3102(ResType) ImageSparseSampleExplicitLod 4819 4820 Grad MinLod 4821 4822 4823 + 4825: 7(fvec4) CompositeExtract 4824 1 + Store 4818(texel) 4825 + 4826: 47(int) CompositeExtract 4824 0 + 4827: 143 Load 145(s2D) + 4828: 154(fvec2) Load 156(f16c2) + 4829: 154(fvec2) Load 1417(f16dPdxy2) + 4830: 154(fvec2) Load 1417(f16dPdxy2) + 4831: 6(float) Load 4264(f16lodClamp) + 4832:3102(ResType) ImageSparseSampleExplicitLod 4827 4828 Grad MinLod 4829 4830 4831 + 4833: 7(fvec4) CompositeExtract 4832 1 + Store 4818(texel) 4833 + 4834: 47(int) CompositeExtract 4832 0 + 4835: 163 Load 165(s3D) + 4836: 167(fvec3) Load 169(c3) + 4837: 167(fvec3) Load 1425(dPdxy3) + 4838: 167(fvec3) Load 1425(dPdxy3) + 4839: 52(float) Load 4257(lodClamp) + 4840:3102(ResType) ImageSparseSampleExplicitLod 4835 4836 Grad MinLod 4837 4838 4839 + 4841: 7(fvec4) CompositeExtract 4840 1 + Store 4818(texel) 4841 + 4842: 47(int) CompositeExtract 4840 0 + 4843: 163 Load 165(s3D) + 4844: 175(fvec3) Load 177(f16c3) + 4845: 175(fvec3) Load 1433(f16dPdxy3) + 4846: 175(fvec3) Load 1433(f16dPdxy3) + 4847: 6(float) Load 4264(f16lodClamp) + 4848:3102(ResType) ImageSparseSampleExplicitLod 4843 4844 Grad MinLod 4845 4846 4847 + 4849: 7(fvec4) CompositeExtract 4848 1 + Store 4818(texel) 4849 + 4850: 47(int) CompositeExtract 4848 0 + 4851: 184 Load 186(sCube) + 4852: 167(fvec3) Load 169(c3) + 4853: 167(fvec3) Load 1425(dPdxy3) + 4854: 167(fvec3) Load 1425(dPdxy3) + 4855: 52(float) Load 4257(lodClamp) + 4856:3102(ResType) ImageSparseSampleExplicitLod 4851 4852 Grad MinLod 4853 4854 4855 + 4857: 7(fvec4) CompositeExtract 4856 1 + Store 4818(texel) 4857 + 4858: 47(int) CompositeExtract 4856 0 + 4859: 184 Load 186(sCube) + 4860: 175(fvec3) Load 177(f16c3) + 4861: 175(fvec3) Load 1433(f16dPdxy3) + 4862: 175(fvec3) Load 1433(f16dPdxy3) + 4863: 6(float) Load 4264(f16lodClamp) + 4864:3102(ResType) ImageSparseSampleExplicitLod 4859 4860 Grad MinLod 4861 4862 4863 + 4865: 7(fvec4) CompositeExtract 4864 1 + Store 4818(texel) 4865 + 4866: 47(int) CompositeExtract 4864 0 + 4867: 224 Load 226(s2DShadow) + 4868: 167(fvec3) Load 169(c3) + 4869: 53(fvec2) Load 1409(dPdxy2) + 4870: 53(fvec2) Load 1409(dPdxy2) + 4871: 52(float) Load 4257(lodClamp) + 4872: 208(ptr) AccessChain 4818(texel) 207 + 4873: 52(float) CompositeExtract 4868 2 + 4874:3138(ResType) ImageSparseSampleDrefExplicitLod 4867 4868 4873 Grad MinLod 4869 4870 4871 + 4875: 6(float) CompositeExtract 4874 1 + Store 4872 4875 + 4876: 47(int) CompositeExtract 4874 0 + 4877: 224 Load 226(s2DShadow) + 4878: 154(fvec2) Load 156(f16c2) + 4879: 52(float) Load 215(compare) + 4880: 154(fvec2) Load 1417(f16dPdxy2) + 4881: 154(fvec2) Load 1417(f16dPdxy2) + 4882: 6(float) Load 4264(f16lodClamp) + 4883: 208(ptr) AccessChain 4818(texel) 207 + 4884:3138(ResType) ImageSparseSampleDrefExplicitLod 4877 4878 4879 Grad MinLod 4880 4881 4882 + 4885: 6(float) CompositeExtract 4884 1 + Store 4883 4885 + 4886: 47(int) CompositeExtract 4884 0 + 4887: 245 Load 247(sCubeShadow) + 4888: 249(fvec4) Load 251(c4) + 4889: 167(fvec3) Load 1425(dPdxy3) + 4890: 167(fvec3) Load 1425(dPdxy3) + 4891: 52(float) Load 4257(lodClamp) + 4892: 208(ptr) AccessChain 4818(texel) 207 + 4893: 52(float) CompositeExtract 4888 3 + 4894:3138(ResType) ImageSparseSampleDrefExplicitLod 4887 4888 4893 Grad MinLod 4889 4890 4891 + 4895: 6(float) CompositeExtract 4894 1 + Store 4892 4895 + 4896: 47(int) CompositeExtract 4894 0 + 4897: 245 Load 247(sCubeShadow) + 4898: 175(fvec3) Load 177(f16c3) + 4899: 52(float) Load 215(compare) + 4900: 175(fvec3) Load 1433(f16dPdxy3) + 4901: 175(fvec3) Load 1433(f16dPdxy3) + 4902: 6(float) Load 4264(f16lodClamp) + 4903: 208(ptr) AccessChain 4818(texel) 207 + 4904:3138(ResType) ImageSparseSampleDrefExplicitLod 4897 4898 4899 Grad MinLod 4900 4901 4902 + 4905: 6(float) CompositeExtract 4904 1 + Store 4903 4905 + 4906: 47(int) CompositeExtract 4904 0 + 4907: 284 Load 286(s2DArray) + 4908: 167(fvec3) Load 169(c3) + 4909: 53(fvec2) Load 1409(dPdxy2) + 4910: 53(fvec2) Load 1409(dPdxy2) + 4911: 52(float) Load 4257(lodClamp) + 4912:3102(ResType) ImageSparseSampleExplicitLod 4907 4908 Grad MinLod 4909 4910 4911 + 4913: 7(fvec4) CompositeExtract 4912 1 + Store 4818(texel) 4913 + 4914: 47(int) CompositeExtract 4912 0 + 4915: 284 Load 286(s2DArray) + 4916: 175(fvec3) Load 177(f16c3) + 4917: 154(fvec2) Load 1417(f16dPdxy2) + 4918: 154(fvec2) Load 1417(f16dPdxy2) + 4919: 6(float) Load 4264(f16lodClamp) + 4920:3102(ResType) ImageSparseSampleExplicitLod 4915 4916 Grad MinLod 4917 4918 4919 + 4921: 7(fvec4) CompositeExtract 4920 1 + Store 4818(texel) 4921 + 4922: 47(int) CompositeExtract 4920 0 + 4923: 337 Load 339(s2DArrayShadow) + 4924: 249(fvec4) Load 251(c4) + 4925: 53(fvec2) Load 1409(dPdxy2) + 4926: 53(fvec2) Load 1409(dPdxy2) + 4927: 52(float) Load 4257(lodClamp) + 4928: 208(ptr) AccessChain 4818(texel) 207 + 4929: 52(float) CompositeExtract 4924 3 + 4930:3138(ResType) ImageSparseSampleDrefExplicitLod 4923 4924 4929 Grad MinLod 4925 4926 4927 + 4931: 6(float) CompositeExtract 4930 1 + Store 4928 4931 + 4932: 47(int) CompositeExtract 4930 0 + 4933: 337 Load 339(s2DArrayShadow) + 4934: 175(fvec3) Load 177(f16c3) + 4935: 52(float) Load 215(compare) + 4936: 154(fvec2) Load 1417(f16dPdxy2) + 4937: 154(fvec2) Load 1417(f16dPdxy2) + 4938: 6(float) Load 4264(f16lodClamp) + 4939: 208(ptr) AccessChain 4818(texel) 207 + 4940:3138(ResType) ImageSparseSampleDrefExplicitLod 4933 4934 4935 Grad MinLod 4936 4937 4938 + 4941: 6(float) CompositeExtract 4940 1 + Store 4939 4941 + 4942: 47(int) CompositeExtract 4940 0 + 4943: 299 Load 301(sCubeArray) + 4944: 249(fvec4) Load 251(c4) + 4945: 167(fvec3) Load 1425(dPdxy3) + 4946: 167(fvec3) Load 1425(dPdxy3) + 4947: 52(float) Load 4257(lodClamp) + 4948:3102(ResType) ImageSparseSampleExplicitLod 4943 4944 Grad MinLod 4945 4946 4947 + 4949: 7(fvec4) CompositeExtract 4948 1 + Store 4818(texel) 4949 + 4950: 47(int) CompositeExtract 4948 0 + 4951: 299 Load 301(sCubeArray) + 4952: 7(fvec4) Load 309(f16c4) + 4953: 175(fvec3) Load 1433(f16dPdxy3) + 4954: 175(fvec3) Load 1433(f16dPdxy3) + 4955: 6(float) Load 4264(f16lodClamp) + 4956:3102(ResType) ImageSparseSampleExplicitLod 4951 4952 Grad MinLod 4953 4954 4955 + 4957: 7(fvec4) CompositeExtract 4956 1 + Store 4818(texel) 4957 + 4958: 47(int) CompositeExtract 4956 0 + 4959: 7(fvec4) Load 4818(texel) + ReturnValue 4959 + FunctionEnd +109(testTextureGradClamp(): 7(fvec4) Function None 8 + 110: Label + 4962(texel): 64(ptr) Variable Function + Store 4962(texel) 121 + 4963: 123 Load 125(s1D) + 4964: 52(float) Load 128(c1) + 4965: 52(float) Load 1393(dPdxy1) + 4966: 52(float) Load 1393(dPdxy1) + 4967: 52(float) Load 4257(lodClamp) + 4968: 7(fvec4) ImageSampleExplicitLod 4963 4964 Grad MinLod 4965 4966 4967 + 4969: 7(fvec4) Load 4962(texel) + 4970: 7(fvec4) FAdd 4969 4968 + Store 4962(texel) 4970 + 4971: 123 Load 125(s1D) + 4972: 6(float) Load 135(f16c1) + 4973: 6(float) Load 1401(f16dPdxy1) + 4974: 6(float) Load 1401(f16dPdxy1) + 4975: 6(float) Load 4264(f16lodClamp) + 4976: 7(fvec4) ImageSampleExplicitLod 4971 4972 Grad MinLod 4973 4974 4975 + 4977: 7(fvec4) Load 4962(texel) + 4978: 7(fvec4) FAdd 4977 4976 + Store 4962(texel) 4978 + 4979: 143 Load 145(s2D) + 4980: 53(fvec2) Load 148(c2) + 4981: 53(fvec2) Load 1409(dPdxy2) + 4982: 53(fvec2) Load 1409(dPdxy2) + 4983: 52(float) Load 4257(lodClamp) + 4984: 7(fvec4) ImageSampleExplicitLod 4979 4980 Grad MinLod 4981 4982 4983 + 4985: 7(fvec4) Load 4962(texel) + 4986: 7(fvec4) FAdd 4985 4984 + Store 4962(texel) 4986 + 4987: 143 Load 145(s2D) + 4988: 154(fvec2) Load 156(f16c2) + 4989: 154(fvec2) Load 1417(f16dPdxy2) + 4990: 154(fvec2) Load 1417(f16dPdxy2) + 4991: 6(float) Load 4264(f16lodClamp) + 4992: 7(fvec4) ImageSampleExplicitLod 4987 4988 Grad MinLod 4989 4990 4991 + 4993: 7(fvec4) Load 4962(texel) + 4994: 7(fvec4) FAdd 4993 4992 + Store 4962(texel) 4994 + 4995: 163 Load 165(s3D) + 4996: 167(fvec3) Load 169(c3) + 4997: 167(fvec3) Load 1425(dPdxy3) + 4998: 167(fvec3) Load 1425(dPdxy3) + 4999: 52(float) Load 4257(lodClamp) + 5000: 7(fvec4) ImageSampleExplicitLod 4995 4996 Grad MinLod 4997 4998 4999 + 5001: 7(fvec4) Load 4962(texel) + 5002: 7(fvec4) FAdd 5001 5000 + Store 4962(texel) 5002 + 5003: 163 Load 165(s3D) + 5004: 175(fvec3) Load 177(f16c3) + 5005: 175(fvec3) Load 1433(f16dPdxy3) + 5006: 175(fvec3) Load 1433(f16dPdxy3) + 5007: 6(float) Load 4264(f16lodClamp) + 5008: 7(fvec4) ImageSampleExplicitLod 5003 5004 Grad MinLod 5005 5006 5007 + 5009: 7(fvec4) Load 4962(texel) + 5010: 7(fvec4) FAdd 5009 5008 + Store 4962(texel) 5010 + 5011: 184 Load 186(sCube) + 5012: 167(fvec3) Load 169(c3) + 5013: 167(fvec3) Load 1425(dPdxy3) + 5014: 167(fvec3) Load 1425(dPdxy3) + 5015: 52(float) Load 4257(lodClamp) + 5016: 7(fvec4) ImageSampleExplicitLod 5011 5012 Grad MinLod 5013 5014 5015 + 5017: 7(fvec4) Load 4962(texel) + 5018: 7(fvec4) FAdd 5017 5016 + Store 4962(texel) 5018 + 5019: 184 Load 186(sCube) + 5020: 175(fvec3) Load 177(f16c3) + 5021: 175(fvec3) Load 1433(f16dPdxy3) + 5022: 175(fvec3) Load 1433(f16dPdxy3) + 5023: 6(float) Load 4264(f16lodClamp) + 5024: 7(fvec4) ImageSampleExplicitLod 5019 5020 Grad MinLod 5021 5022 5023 + 5025: 7(fvec4) Load 4962(texel) + 5026: 7(fvec4) FAdd 5025 5024 + Store 4962(texel) 5026 + 5027: 199 Load 201(s1DShadow) + 5028: 167(fvec3) Load 169(c3) + 5029: 52(float) Load 1393(dPdxy1) + 5030: 52(float) Load 1393(dPdxy1) + 5031: 52(float) Load 4257(lodClamp) + 5032: 52(float) CompositeExtract 5028 2 + 5033: 6(float) ImageSampleDrefExplicitLod 5027 5028 5032 Grad MinLod 5029 5030 5031 + 5034: 208(ptr) AccessChain 4962(texel) 207 + 5035: 6(float) Load 5034 + 5036: 6(float) FAdd 5035 5033 + 5037: 208(ptr) AccessChain 4962(texel) 207 + Store 5037 5036 + 5038: 199 Load 201(s1DShadow) + 5039: 154(fvec2) Load 156(f16c2) + 5040: 52(float) Load 215(compare) + 5041: 6(float) Load 1401(f16dPdxy1) + 5042: 6(float) Load 1401(f16dPdxy1) + 5043: 6(float) Load 4264(f16lodClamp) + 5044: 6(float) ImageSampleDrefExplicitLod 5038 5039 5040 Grad MinLod 5041 5042 5043 + 5045: 208(ptr) AccessChain 4962(texel) 207 + 5046: 6(float) Load 5045 + 5047: 6(float) FAdd 5046 5044 + 5048: 208(ptr) AccessChain 4962(texel) 207 + Store 5048 5047 + 5049: 224 Load 226(s2DShadow) + 5050: 167(fvec3) Load 169(c3) + 5051: 53(fvec2) Load 1409(dPdxy2) + 5052: 53(fvec2) Load 1409(dPdxy2) + 5053: 52(float) Load 4257(lodClamp) + 5054: 52(float) CompositeExtract 5050 2 + 5055: 6(float) ImageSampleDrefExplicitLod 5049 5050 5054 Grad MinLod 5051 5052 5053 + 5056: 208(ptr) AccessChain 4962(texel) 207 + 5057: 6(float) Load 5056 + 5058: 6(float) FAdd 5057 5055 + 5059: 208(ptr) AccessChain 4962(texel) 207 + Store 5059 5058 + 5060: 224 Load 226(s2DShadow) + 5061: 154(fvec2) Load 156(f16c2) + 5062: 52(float) Load 215(compare) + 5063: 154(fvec2) Load 1417(f16dPdxy2) + 5064: 154(fvec2) Load 1417(f16dPdxy2) + 5065: 6(float) Load 4264(f16lodClamp) + 5066: 6(float) ImageSampleDrefExplicitLod 5060 5061 5062 Grad MinLod 5063 5064 5065 + 5067: 208(ptr) AccessChain 4962(texel) 207 + 5068: 6(float) Load 5067 + 5069: 6(float) FAdd 5068 5066 + 5070: 208(ptr) AccessChain 4962(texel) 207 + Store 5070 5069 + 5071: 245 Load 247(sCubeShadow) + 5072: 249(fvec4) Load 251(c4) + 5073: 167(fvec3) Load 1425(dPdxy3) + 5074: 167(fvec3) Load 1425(dPdxy3) + 5075: 52(float) Load 4257(lodClamp) + 5076: 52(float) CompositeExtract 5072 3 + 5077: 6(float) ImageSampleDrefExplicitLod 5071 5072 5076 Grad MinLod 5073 5074 5075 + 5078: 208(ptr) AccessChain 4962(texel) 207 + 5079: 6(float) Load 5078 + 5080: 6(float) FAdd 5079 5077 + 5081: 208(ptr) AccessChain 4962(texel) 207 + Store 5081 5080 + 5082: 245 Load 247(sCubeShadow) + 5083: 175(fvec3) Load 177(f16c3) + 5084: 52(float) Load 215(compare) + 5085: 175(fvec3) Load 1433(f16dPdxy3) + 5086: 175(fvec3) Load 1433(f16dPdxy3) + 5087: 6(float) Load 4264(f16lodClamp) + 5088: 6(float) ImageSampleDrefExplicitLod 5082 5083 5084 Grad MinLod 5085 5086 5087 + 5089: 208(ptr) AccessChain 4962(texel) 207 + 5090: 6(float) Load 5089 + 5091: 6(float) FAdd 5090 5088 + 5092: 208(ptr) AccessChain 4962(texel) 207 + Store 5092 5091 + 5093: 269 Load 271(s1DArray) + 5094: 53(fvec2) Load 148(c2) + 5095: 52(float) Load 1393(dPdxy1) + 5096: 52(float) Load 1393(dPdxy1) + 5097: 52(float) Load 4257(lodClamp) + 5098: 7(fvec4) ImageSampleExplicitLod 5093 5094 Grad MinLod 5095 5096 5097 + 5099: 7(fvec4) Load 4962(texel) + 5100: 7(fvec4) FAdd 5099 5098 + Store 4962(texel) 5100 + 5101: 269 Load 271(s1DArray) + 5102: 154(fvec2) Load 156(f16c2) + 5103: 6(float) Load 1401(f16dPdxy1) + 5104: 6(float) Load 1401(f16dPdxy1) + 5105: 6(float) Load 4264(f16lodClamp) + 5106: 7(fvec4) ImageSampleExplicitLod 5101 5102 Grad MinLod 5103 5104 5105 + 5107: 7(fvec4) Load 4962(texel) + 5108: 7(fvec4) FAdd 5107 5106 + Store 4962(texel) 5108 + 5109: 284 Load 286(s2DArray) + 5110: 167(fvec3) Load 169(c3) + 5111: 53(fvec2) Load 1409(dPdxy2) + 5112: 53(fvec2) Load 1409(dPdxy2) + 5113: 52(float) Load 4257(lodClamp) + 5114: 7(fvec4) ImageSampleExplicitLod 5109 5110 Grad MinLod 5111 5112 5113 + 5115: 7(fvec4) Load 4962(texel) + 5116: 7(fvec4) FAdd 5115 5114 + Store 4962(texel) 5116 + 5117: 284 Load 286(s2DArray) + 5118: 175(fvec3) Load 177(f16c3) + 5119: 154(fvec2) Load 1417(f16dPdxy2) + 5120: 154(fvec2) Load 1417(f16dPdxy2) + 5121: 6(float) Load 4264(f16lodClamp) + 5122: 7(fvec4) ImageSampleExplicitLod 5117 5118 Grad MinLod 5119 5120 5121 + 5123: 7(fvec4) Load 4962(texel) + 5124: 7(fvec4) FAdd 5123 5122 + Store 4962(texel) 5124 + 5125: 316 Load 318(s1DArrayShadow) + 5126: 167(fvec3) Load 169(c3) + 5127: 52(float) Load 1393(dPdxy1) + 5128: 52(float) Load 1393(dPdxy1) + 5129: 52(float) Load 4257(lodClamp) + 5130: 52(float) CompositeExtract 5126 2 + 5131: 6(float) ImageSampleDrefExplicitLod 5125 5126 5130 Grad MinLod 5127 5128 5129 + 5132: 208(ptr) AccessChain 4962(texel) 207 + 5133: 6(float) Load 5132 + 5134: 6(float) FAdd 5133 5131 + 5135: 208(ptr) AccessChain 4962(texel) 207 + Store 5135 5134 + 5136: 316 Load 318(s1DArrayShadow) + 5137: 154(fvec2) Load 156(f16c2) + 5138: 52(float) Load 215(compare) + 5139: 6(float) Load 1401(f16dPdxy1) + 5140: 6(float) Load 1401(f16dPdxy1) + 5141: 6(float) Load 4264(f16lodClamp) + 5142: 6(float) ImageSampleDrefExplicitLod 5136 5137 5138 Grad MinLod 5139 5140 5141 + 5143: 208(ptr) AccessChain 4962(texel) 207 + 5144: 6(float) Load 5143 + 5145: 6(float) FAdd 5144 5142 + 5146: 208(ptr) AccessChain 4962(texel) 207 + Store 5146 5145 + 5147: 337 Load 339(s2DArrayShadow) + 5148: 249(fvec4) Load 251(c4) + 5149: 53(fvec2) Load 1409(dPdxy2) + 5150: 53(fvec2) Load 1409(dPdxy2) + 5151: 52(float) Load 4257(lodClamp) + 5152: 52(float) CompositeExtract 5148 3 + 5153: 6(float) ImageSampleDrefExplicitLod 5147 5148 5152 Grad MinLod 5149 5150 5151 + 5154: 208(ptr) AccessChain 4962(texel) 207 + 5155: 6(float) Load 5154 + 5156: 6(float) FAdd 5155 5153 + 5157: 208(ptr) AccessChain 4962(texel) 207 + Store 5157 5156 + 5158: 337 Load 339(s2DArrayShadow) + 5159: 175(fvec3) Load 177(f16c3) + 5160: 52(float) Load 215(compare) + 5161: 154(fvec2) Load 1417(f16dPdxy2) + 5162: 154(fvec2) Load 1417(f16dPdxy2) + 5163: 6(float) Load 4264(f16lodClamp) + 5164: 6(float) ImageSampleDrefExplicitLod 5158 5159 5160 Grad MinLod 5161 5162 5163 + 5165: 208(ptr) AccessChain 4962(texel) 207 + 5166: 6(float) Load 5165 + 5167: 6(float) FAdd 5166 5164 + 5168: 208(ptr) AccessChain 4962(texel) 207 + Store 5168 5167 + 5169: 299 Load 301(sCubeArray) + 5170: 249(fvec4) Load 251(c4) + 5171: 167(fvec3) Load 1425(dPdxy3) + 5172: 167(fvec3) Load 1425(dPdxy3) + 5173: 52(float) Load 4257(lodClamp) + 5174: 7(fvec4) ImageSampleExplicitLod 5169 5170 Grad MinLod 5171 5172 5173 + 5175: 7(fvec4) Load 4962(texel) + 5176: 7(fvec4) FAdd 5175 5174 + Store 4962(texel) 5176 + 5177: 299 Load 301(sCubeArray) + 5178: 7(fvec4) Load 309(f16c4) + 5179: 175(fvec3) Load 1433(f16dPdxy3) + 5180: 175(fvec3) Load 1433(f16dPdxy3) + 5181: 6(float) Load 4264(f16lodClamp) + 5182: 7(fvec4) ImageSampleExplicitLod 5177 5178 Grad MinLod 5179 5180 5181 + 5183: 7(fvec4) Load 4962(texel) + 5184: 7(fvec4) FAdd 5183 5182 + Store 4962(texel) 5184 + 5185: 7(fvec4) Load 4962(texel) + ReturnValue 5185 + FunctionEnd +111(testSparseTextureGradOffsetClamp(): 7(fvec4) Function None 8 + 112: Label + 5188(texel): 64(ptr) Variable Function + Store 5188(texel) 121 + 5189: 143 Load 145(s2D) + 5190: 53(fvec2) Load 148(c2) + 5191: 53(fvec2) Load 1409(dPdxy2) + 5192: 53(fvec2) Load 1409(dPdxy2) + 5193: 52(float) Load 4257(lodClamp) + 5194:3102(ResType) ImageSparseSampleExplicitLod 5189 5190 Grad ConstOffset MinLod 5191 5192 722 5193 + 5195: 7(fvec4) CompositeExtract 5194 1 + Store 5188(texel) 5195 + 5196: 47(int) CompositeExtract 5194 0 + 5197: 143 Load 145(s2D) + 5198: 154(fvec2) Load 156(f16c2) + 5199: 154(fvec2) Load 1417(f16dPdxy2) + 5200: 154(fvec2) Load 1417(f16dPdxy2) + 5201: 6(float) Load 4264(f16lodClamp) + 5202:3102(ResType) ImageSparseSampleExplicitLod 5197 5198 Grad ConstOffset MinLod 5199 5200 722 5201 + 5203: 7(fvec4) CompositeExtract 5202 1 + Store 5188(texel) 5203 + 5204: 47(int) CompositeExtract 5202 0 + 5205: 163 Load 165(s3D) + 5206: 167(fvec3) Load 169(c3) + 5207: 167(fvec3) Load 1425(dPdxy3) + 5208: 167(fvec3) Load 1425(dPdxy3) + 5209: 52(float) Load 4257(lodClamp) + 5210:3102(ResType) ImageSparseSampleExplicitLod 5205 5206 Grad ConstOffset MinLod 5207 5208 735 5209 + 5211: 7(fvec4) CompositeExtract 5210 1 + Store 5188(texel) 5211 + 5212: 47(int) CompositeExtract 5210 0 + 5213: 163 Load 165(s3D) + 5214: 175(fvec3) Load 177(f16c3) + 5215: 175(fvec3) Load 1433(f16dPdxy3) + 5216: 175(fvec3) Load 1433(f16dPdxy3) + 5217: 6(float) Load 4264(f16lodClamp) + 5218:3102(ResType) ImageSparseSampleExplicitLod 5213 5214 Grad ConstOffset MinLod 5215 5216 735 5217 + 5219: 7(fvec4) CompositeExtract 5218 1 + Store 5188(texel) 5219 + 5220: 47(int) CompositeExtract 5218 0 + 5221: 224 Load 226(s2DShadow) + 5222: 167(fvec3) Load 169(c3) + 5223: 53(fvec2) Load 1409(dPdxy2) + 5224: 53(fvec2) Load 1409(dPdxy2) + 5225: 52(float) Load 4257(lodClamp) + 5226: 208(ptr) AccessChain 5188(texel) 207 + 5227: 52(float) CompositeExtract 5222 2 + 5228:3138(ResType) ImageSparseSampleDrefExplicitLod 5221 5222 5227 Grad ConstOffset MinLod 5223 5224 722 5225 + 5229: 6(float) CompositeExtract 5228 1 + Store 5226 5229 + 5230: 47(int) CompositeExtract 5228 0 + 5231: 224 Load 226(s2DShadow) + 5232: 154(fvec2) Load 156(f16c2) + 5233: 52(float) Load 215(compare) + 5234: 154(fvec2) Load 1417(f16dPdxy2) + 5235: 154(fvec2) Load 1417(f16dPdxy2) + 5236: 6(float) Load 4264(f16lodClamp) + 5237: 208(ptr) AccessChain 5188(texel) 207 + 5238:3138(ResType) ImageSparseSampleDrefExplicitLod 5231 5232 5233 Grad ConstOffset MinLod 5234 5235 722 5236 + 5239: 6(float) CompositeExtract 5238 1 + Store 5237 5239 + 5240: 47(int) CompositeExtract 5238 0 + 5241: 284 Load 286(s2DArray) + 5242: 167(fvec3) Load 169(c3) + 5243: 53(fvec2) Load 1409(dPdxy2) + 5244: 53(fvec2) Load 1409(dPdxy2) + 5245: 52(float) Load 4257(lodClamp) + 5246:3102(ResType) ImageSparseSampleExplicitLod 5241 5242 Grad ConstOffset MinLod 5243 5244 722 5245 + 5247: 7(fvec4) CompositeExtract 5246 1 + Store 5188(texel) 5247 + 5248: 47(int) CompositeExtract 5246 0 + 5249: 284 Load 286(s2DArray) + 5250: 175(fvec3) Load 177(f16c3) + 5251: 154(fvec2) Load 1417(f16dPdxy2) + 5252: 154(fvec2) Load 1417(f16dPdxy2) + 5253: 6(float) Load 4264(f16lodClamp) + 5254:3102(ResType) ImageSparseSampleExplicitLod 5249 5250 Grad ConstOffset MinLod 5251 5252 722 5253 + 5255: 7(fvec4) CompositeExtract 5254 1 + Store 5188(texel) 5255 + 5256: 47(int) CompositeExtract 5254 0 + 5257: 337 Load 339(s2DArrayShadow) + 5258: 249(fvec4) Load 251(c4) + 5259: 53(fvec2) Load 1409(dPdxy2) + 5260: 53(fvec2) Load 1409(dPdxy2) + 5261: 52(float) Load 4257(lodClamp) + 5262: 208(ptr) AccessChain 5188(texel) 207 + 5263: 52(float) CompositeExtract 5258 3 + 5264:3138(ResType) ImageSparseSampleDrefExplicitLod 5257 5258 5263 Grad ConstOffset MinLod 5259 5260 722 5261 + 5265: 6(float) CompositeExtract 5264 1 + Store 5262 5265 + 5266: 47(int) CompositeExtract 5264 0 + 5267: 337 Load 339(s2DArrayShadow) + 5268: 175(fvec3) Load 177(f16c3) + 5269: 52(float) Load 215(compare) + 5270: 154(fvec2) Load 1417(f16dPdxy2) + 5271: 154(fvec2) Load 1417(f16dPdxy2) + 5272: 6(float) Load 4264(f16lodClamp) + 5273: 208(ptr) AccessChain 5188(texel) 207 + 5274:3138(ResType) ImageSparseSampleDrefExplicitLod 5267 5268 5269 Grad ConstOffset MinLod 5270 5271 722 5272 + 5275: 6(float) CompositeExtract 5274 1 + Store 5273 5275 + 5276: 47(int) CompositeExtract 5274 0 + 5277: 7(fvec4) Load 5188(texel) + ReturnValue 5277 + FunctionEnd +113(testTextureGradOffsetClamp(): 7(fvec4) Function None 8 + 114: Label + 5280(texel): 64(ptr) Variable Function + Store 5280(texel) 121 + 5281: 123 Load 125(s1D) + 5282: 52(float) Load 128(c1) + 5283: 52(float) Load 1393(dPdxy1) + 5284: 52(float) Load 1393(dPdxy1) + 5285: 52(float) Load 4257(lodClamp) + 5286: 7(fvec4) ImageSampleExplicitLod 5281 5282 Grad ConstOffset MinLod 5283 5284 709 5285 + 5287: 7(fvec4) Load 5280(texel) + 5288: 7(fvec4) FAdd 5287 5286 + Store 5280(texel) 5288 + 5289: 123 Load 125(s1D) + 5290: 6(float) Load 135(f16c1) + 5291: 6(float) Load 1401(f16dPdxy1) + 5292: 6(float) Load 1401(f16dPdxy1) + 5293: 6(float) Load 4264(f16lodClamp) + 5294: 7(fvec4) ImageSampleExplicitLod 5289 5290 Grad ConstOffset MinLod 5291 5292 709 5293 + 5295: 7(fvec4) Load 5280(texel) + 5296: 7(fvec4) FAdd 5295 5294 + Store 5280(texel) 5296 + 5297: 143 Load 145(s2D) + 5298: 53(fvec2) Load 148(c2) + 5299: 53(fvec2) Load 1409(dPdxy2) + 5300: 53(fvec2) Load 1409(dPdxy2) + 5301: 52(float) Load 4257(lodClamp) + 5302: 7(fvec4) ImageSampleExplicitLod 5297 5298 Grad ConstOffset MinLod 5299 5300 722 5301 + 5303: 7(fvec4) Load 5280(texel) + 5304: 7(fvec4) FAdd 5303 5302 + Store 5280(texel) 5304 + 5305: 143 Load 145(s2D) + 5306: 154(fvec2) Load 156(f16c2) + 5307: 154(fvec2) Load 1417(f16dPdxy2) + 5308: 154(fvec2) Load 1417(f16dPdxy2) + 5309: 6(float) Load 4264(f16lodClamp) + 5310: 7(fvec4) ImageSampleExplicitLod 5305 5306 Grad ConstOffset MinLod 5307 5308 722 5309 + 5311: 7(fvec4) Load 5280(texel) + 5312: 7(fvec4) FAdd 5311 5310 + Store 5280(texel) 5312 + 5313: 163 Load 165(s3D) + 5314: 167(fvec3) Load 169(c3) + 5315: 167(fvec3) Load 1425(dPdxy3) + 5316: 167(fvec3) Load 1425(dPdxy3) + 5317: 52(float) Load 4257(lodClamp) + 5318: 7(fvec4) ImageSampleExplicitLod 5313 5314 Grad ConstOffset MinLod 5315 5316 735 5317 + 5319: 7(fvec4) Load 5280(texel) + 5320: 7(fvec4) FAdd 5319 5318 + Store 5280(texel) 5320 + 5321: 163 Load 165(s3D) + 5322: 175(fvec3) Load 177(f16c3) + 5323: 175(fvec3) Load 1433(f16dPdxy3) + 5324: 175(fvec3) Load 1433(f16dPdxy3) + 5325: 6(float) Load 4264(f16lodClamp) + 5326: 7(fvec4) ImageSampleExplicitLod 5321 5322 Grad ConstOffset MinLod 5323 5324 735 5325 + 5327: 7(fvec4) Load 5280(texel) + 5328: 7(fvec4) FAdd 5327 5326 + Store 5280(texel) 5328 + 5329: 199 Load 201(s1DShadow) + 5330: 167(fvec3) Load 169(c3) + 5331: 52(float) Load 1393(dPdxy1) + 5332: 52(float) Load 1393(dPdxy1) + 5333: 52(float) Load 4257(lodClamp) + 5334: 52(float) CompositeExtract 5330 2 + 5335: 6(float) ImageSampleDrefExplicitLod 5329 5330 5334 Grad ConstOffset MinLod 5331 5332 709 5333 + 5336: 208(ptr) AccessChain 5280(texel) 207 + 5337: 6(float) Load 5336 + 5338: 6(float) FAdd 5337 5335 + 5339: 208(ptr) AccessChain 5280(texel) 207 + Store 5339 5338 + 5340: 199 Load 201(s1DShadow) + 5341: 154(fvec2) Load 156(f16c2) + 5342: 52(float) Load 215(compare) + 5343: 6(float) Load 1401(f16dPdxy1) + 5344: 6(float) Load 1401(f16dPdxy1) + 5345: 6(float) Load 4264(f16lodClamp) + 5346: 6(float) ImageSampleDrefExplicitLod 5340 5341 5342 Grad ConstOffset MinLod 5343 5344 709 5345 + 5347: 208(ptr) AccessChain 5280(texel) 207 + 5348: 6(float) Load 5347 + 5349: 6(float) FAdd 5348 5346 + 5350: 208(ptr) AccessChain 5280(texel) 207 + Store 5350 5349 + 5351: 224 Load 226(s2DShadow) + 5352: 167(fvec3) Load 169(c3) + 5353: 53(fvec2) Load 1409(dPdxy2) + 5354: 53(fvec2) Load 1409(dPdxy2) + 5355: 52(float) Load 4257(lodClamp) + 5356: 52(float) CompositeExtract 5352 2 + 5357: 6(float) ImageSampleDrefExplicitLod 5351 5352 5356 Grad ConstOffset MinLod 5353 5354 722 5355 + 5358: 208(ptr) AccessChain 5280(texel) 207 + 5359: 6(float) Load 5358 + 5360: 6(float) FAdd 5359 5357 + 5361: 208(ptr) AccessChain 5280(texel) 207 + Store 5361 5360 + 5362: 224 Load 226(s2DShadow) + 5363: 154(fvec2) Load 156(f16c2) + 5364: 52(float) Load 215(compare) + 5365: 154(fvec2) Load 1417(f16dPdxy2) + 5366: 154(fvec2) Load 1417(f16dPdxy2) + 5367: 6(float) Load 4264(f16lodClamp) + 5368: 6(float) ImageSampleDrefExplicitLod 5362 5363 5364 Grad ConstOffset MinLod 5365 5366 722 5367 + 5369: 208(ptr) AccessChain 5280(texel) 207 + 5370: 6(float) Load 5369 + 5371: 6(float) FAdd 5370 5368 + 5372: 208(ptr) AccessChain 5280(texel) 207 + Store 5372 5371 + 5373: 269 Load 271(s1DArray) + 5374: 53(fvec2) Load 148(c2) + 5375: 52(float) Load 1393(dPdxy1) + 5376: 52(float) Load 1393(dPdxy1) + 5377: 52(float) Load 4257(lodClamp) + 5378: 7(fvec4) ImageSampleExplicitLod 5373 5374 Grad ConstOffset MinLod 5375 5376 709 5377 + 5379: 7(fvec4) Load 5280(texel) + 5380: 7(fvec4) FAdd 5379 5378 + Store 5280(texel) 5380 + 5381: 269 Load 271(s1DArray) + 5382: 154(fvec2) Load 156(f16c2) + 5383: 6(float) Load 1401(f16dPdxy1) + 5384: 6(float) Load 1401(f16dPdxy1) + 5385: 6(float) Load 4264(f16lodClamp) + 5386: 7(fvec4) ImageSampleExplicitLod 5381 5382 Grad ConstOffset MinLod 5383 5384 709 5385 + 5387: 7(fvec4) Load 5280(texel) + 5388: 7(fvec4) FAdd 5387 5386 + Store 5280(texel) 5388 + 5389: 284 Load 286(s2DArray) + 5390: 167(fvec3) Load 169(c3) + 5391: 53(fvec2) Load 1409(dPdxy2) + 5392: 53(fvec2) Load 1409(dPdxy2) + 5393: 52(float) Load 4257(lodClamp) + 5394: 7(fvec4) ImageSampleExplicitLod 5389 5390 Grad ConstOffset MinLod 5391 5392 722 5393 + 5395: 7(fvec4) Load 5280(texel) + 5396: 7(fvec4) FAdd 5395 5394 + Store 5280(texel) 5396 + 5397: 284 Load 286(s2DArray) + 5398: 175(fvec3) Load 177(f16c3) + 5399: 154(fvec2) Load 1417(f16dPdxy2) + 5400: 154(fvec2) Load 1417(f16dPdxy2) + 5401: 6(float) Load 4264(f16lodClamp) + 5402: 7(fvec4) ImageSampleExplicitLod 5397 5398 Grad ConstOffset MinLod 5399 5400 722 5401 + 5403: 7(fvec4) Load 5280(texel) + 5404: 7(fvec4) FAdd 5403 5402 + Store 5280(texel) 5404 + 5405: 316 Load 318(s1DArrayShadow) + 5406: 167(fvec3) Load 169(c3) + 5407: 52(float) Load 1393(dPdxy1) + 5408: 52(float) Load 1393(dPdxy1) + 5409: 52(float) Load 4257(lodClamp) + 5410: 52(float) CompositeExtract 5406 2 + 5411: 6(float) ImageSampleDrefExplicitLod 5405 5406 5410 Grad ConstOffset MinLod 5407 5408 709 5409 + 5412: 208(ptr) AccessChain 5280(texel) 207 + 5413: 6(float) Load 5412 + 5414: 6(float) FAdd 5413 5411 + 5415: 208(ptr) AccessChain 5280(texel) 207 + Store 5415 5414 + 5416: 316 Load 318(s1DArrayShadow) + 5417: 154(fvec2) Load 156(f16c2) + 5418: 52(float) Load 215(compare) + 5419: 6(float) Load 1401(f16dPdxy1) + 5420: 6(float) Load 1401(f16dPdxy1) + 5421: 6(float) Load 4264(f16lodClamp) + 5422: 6(float) ImageSampleDrefExplicitLod 5416 5417 5418 Grad ConstOffset MinLod 5419 5420 709 5421 + 5423: 208(ptr) AccessChain 5280(texel) 207 + 5424: 6(float) Load 5423 + 5425: 6(float) FAdd 5424 5422 + 5426: 208(ptr) AccessChain 5280(texel) 207 + Store 5426 5425 + 5427: 337 Load 339(s2DArrayShadow) + 5428: 249(fvec4) Load 251(c4) + 5429: 53(fvec2) Load 1409(dPdxy2) + 5430: 53(fvec2) Load 1409(dPdxy2) + 5431: 52(float) Load 4257(lodClamp) + 5432: 52(float) CompositeExtract 5428 3 + 5433: 6(float) ImageSampleDrefExplicitLod 5427 5428 5432 Grad ConstOffset MinLod 5429 5430 722 5431 + 5434: 208(ptr) AccessChain 5280(texel) 207 + 5435: 6(float) Load 5434 + 5436: 6(float) FAdd 5435 5433 + 5437: 208(ptr) AccessChain 5280(texel) 207 + Store 5437 5436 + 5438: 337 Load 339(s2DArrayShadow) + 5439: 175(fvec3) Load 177(f16c3) + 5440: 52(float) Load 215(compare) + 5441: 154(fvec2) Load 1417(f16dPdxy2) + 5442: 154(fvec2) Load 1417(f16dPdxy2) + 5443: 6(float) Load 4264(f16lodClamp) + 5444: 6(float) ImageSampleDrefExplicitLod 5438 5439 5440 Grad ConstOffset MinLod 5441 5442 722 5443 + 5445: 208(ptr) AccessChain 5280(texel) 207 + 5446: 6(float) Load 5445 + 5447: 6(float) FAdd 5446 5444 + 5448: 208(ptr) AccessChain 5280(texel) 207 + Store 5448 5447 + 5449: 7(fvec4) Load 5280(texel) + ReturnValue 5449 + FunctionEnd +115(testCombinedTextureSampler(): 7(fvec4) Function None 8 + 116: Label + 5452(texel): 64(ptr) Variable Function + Store 5452(texel) 121 + 5455: 122 Load 5454(t1D) + 5459: 5456 Load 5458(s) + 5460: 123 SampledImage 5455 5459 + 5461: 52(float) Load 128(c1) + 5462: 7(fvec4) ImageSampleImplicitLod 5460 5461 + 5463: 7(fvec4) Load 5452(texel) + 5464: 7(fvec4) FAdd 5463 5462 + Store 5452(texel) 5464 + 5465: 122 Load 5454(t1D) + 5466: 5456 Load 5458(s) + 5467: 123 SampledImage 5465 5466 + 5468: 6(float) Load 135(f16c1) + 5469: 6(float) Load 137(f16bias) + 5470: 7(fvec4) ImageSampleImplicitLod 5467 5468 Bias 5469 + 5471: 7(fvec4) Load 5452(texel) + 5472: 7(fvec4) FAdd 5471 5470 + Store 5452(texel) 5472 + 5475: 142 Load 5474(t2D) + 5476: 5456 Load 5458(s) + 5477: 143 SampledImage 5475 5476 + 5478: 53(fvec2) Load 148(c2) + 5479: 7(fvec4) ImageSampleImplicitLod 5477 5478 + 5480: 7(fvec4) Load 5452(texel) + 5481: 7(fvec4) FAdd 5480 5479 + Store 5452(texel) 5481 + 5482: 142 Load 5474(t2D) + 5483: 5456 Load 5458(s) + 5484: 143 SampledImage 5482 5483 + 5485: 154(fvec2) Load 156(f16c2) + 5486: 6(float) Load 137(f16bias) + 5487: 7(fvec4) ImageSampleImplicitLod 5484 5485 Bias 5486 + 5488: 7(fvec4) Load 5452(texel) + 5489: 7(fvec4) FAdd 5488 5487 + Store 5452(texel) 5489 + 5492: 162 Load 5491(t3D) + 5493: 5456 Load 5458(s) + 5494: 163 SampledImage 5492 5493 + 5495: 167(fvec3) Load 169(c3) + 5496: 7(fvec4) ImageSampleImplicitLod 5494 5495 + 5497: 7(fvec4) Load 5452(texel) + 5498: 7(fvec4) FAdd 5497 5496 + Store 5452(texel) 5498 + 5499: 162 Load 5491(t3D) + 5500: 5456 Load 5458(s) + 5501: 163 SampledImage 5499 5500 + 5502: 175(fvec3) Load 177(f16c3) + 5503: 6(float) Load 137(f16bias) + 5504: 7(fvec4) ImageSampleImplicitLod 5501 5502 Bias 5503 + 5505: 7(fvec4) Load 5452(texel) + 5506: 7(fvec4) FAdd 5505 5504 + Store 5452(texel) 5506 + 5509: 183 Load 5508(tCube) + 5510: 5456 Load 5458(s) + 5511: 184 SampledImage 5509 5510 + 5512: 167(fvec3) Load 169(c3) + 5513: 7(fvec4) ImageSampleImplicitLod 5511 5512 + 5514: 7(fvec4) Load 5452(texel) + 5515: 7(fvec4) FAdd 5514 5513 + Store 5452(texel) 5515 + 5516: 183 Load 5508(tCube) + 5517: 5456 Load 5458(s) + 5518: 184 SampledImage 5516 5517 + 5519: 175(fvec3) Load 177(f16c3) + 5520: 6(float) Load 137(f16bias) + 5521: 7(fvec4) ImageSampleImplicitLod 5518 5519 Bias 5520 + 5522: 7(fvec4) Load 5452(texel) + 5523: 7(fvec4) FAdd 5522 5521 + Store 5452(texel) 5523 + 5524: 122 Load 5454(t1D) + 5526: 5456 Load 5525(sShadow) + 5527: 199 SampledImage 5524 5526 + 5528: 167(fvec3) Load 169(c3) + 5529: 52(float) CompositeExtract 5528 2 + 5530: 6(float) ImageSampleDrefImplicitLod 5527 5528 5529 + 5531: 208(ptr) AccessChain 5452(texel) 207 + 5532: 6(float) Load 5531 + 5533: 6(float) FAdd 5532 5530 + 5534: 208(ptr) AccessChain 5452(texel) 207 + Store 5534 5533 + 5535: 122 Load 5454(t1D) + 5536: 5456 Load 5525(sShadow) + 5537: 199 SampledImage 5535 5536 + 5538: 154(fvec2) Load 156(f16c2) + 5539: 52(float) Load 215(compare) + 5540: 6(float) Load 137(f16bias) + 5541: 6(float) ImageSampleDrefImplicitLod 5537 5538 5539 Bias 5540 + 5542: 208(ptr) AccessChain 5452(texel) 207 + 5543: 6(float) Load 5542 + 5544: 6(float) FAdd 5543 5541 + 5545: 208(ptr) AccessChain 5452(texel) 207 + Store 5545 5544 + 5546: 142 Load 5474(t2D) + 5547: 5456 Load 5525(sShadow) + 5548: 224 SampledImage 5546 5547 + 5549: 167(fvec3) Load 169(c3) + 5550: 52(float) CompositeExtract 5549 2 + 5551: 6(float) ImageSampleDrefImplicitLod 5548 5549 5550 + 5552: 208(ptr) AccessChain 5452(texel) 207 + 5553: 6(float) Load 5552 + 5554: 6(float) FAdd 5553 5551 + 5555: 208(ptr) AccessChain 5452(texel) 207 + Store 5555 5554 + 5556: 142 Load 5474(t2D) + 5557: 5456 Load 5525(sShadow) + 5558: 224 SampledImage 5556 5557 + 5559: 154(fvec2) Load 156(f16c2) + 5560: 52(float) Load 215(compare) + 5561: 6(float) Load 137(f16bias) + 5562: 6(float) ImageSampleDrefImplicitLod 5558 5559 5560 Bias 5561 + 5563: 208(ptr) AccessChain 5452(texel) 207 + 5564: 6(float) Load 5563 + 5565: 6(float) FAdd 5564 5562 + 5566: 208(ptr) AccessChain 5452(texel) 207 + Store 5566 5565 + 5567: 183 Load 5508(tCube) + 5568: 5456 Load 5525(sShadow) + 5569: 245 SampledImage 5567 5568 + 5570: 249(fvec4) Load 251(c4) + 5571: 52(float) CompositeExtract 5570 3 + 5572: 6(float) ImageSampleDrefImplicitLod 5569 5570 5571 + 5573: 208(ptr) AccessChain 5452(texel) 207 + 5574: 6(float) Load 5573 + 5575: 6(float) FAdd 5574 5572 + 5576: 208(ptr) AccessChain 5452(texel) 207 + Store 5576 5575 + 5577: 183 Load 5508(tCube) + 5578: 5456 Load 5525(sShadow) + 5579: 245 SampledImage 5577 5578 + 5580: 175(fvec3) Load 177(f16c3) + 5581: 52(float) Load 215(compare) + 5582: 6(float) Load 137(f16bias) + 5583: 6(float) ImageSampleDrefImplicitLod 5579 5580 5581 Bias 5582 + 5584: 208(ptr) AccessChain 5452(texel) 207 + 5585: 6(float) Load 5584 + 5586: 6(float) FAdd 5585 5583 + 5587: 208(ptr) AccessChain 5452(texel) 207 + Store 5587 5586 + 5590: 268 Load 5589(t1DArray) + 5591: 5456 Load 5458(s) + 5592: 269 SampledImage 5590 5591 + 5593: 53(fvec2) Load 148(c2) + 5594: 7(fvec4) ImageSampleImplicitLod 5592 5593 + 5595: 7(fvec4) Load 5452(texel) + 5596: 7(fvec4) FAdd 5595 5594 + Store 5452(texel) 5596 + 5597: 268 Load 5589(t1DArray) + 5598: 5456 Load 5458(s) + 5599: 269 SampledImage 5597 5598 + 5600: 154(fvec2) Load 156(f16c2) + 5601: 6(float) Load 137(f16bias) + 5602: 7(fvec4) ImageSampleImplicitLod 5599 5600 Bias 5601 + 5603: 7(fvec4) Load 5452(texel) + 5604: 7(fvec4) FAdd 5603 5602 + Store 5452(texel) 5604 + 5607: 283 Load 5606(t2DArray) + 5608: 5456 Load 5458(s) + 5609: 284 SampledImage 5607 5608 + 5610: 167(fvec3) Load 169(c3) + 5611: 7(fvec4) ImageSampleImplicitLod 5609 5610 + 5612: 7(fvec4) Load 5452(texel) + 5613: 7(fvec4) FAdd 5612 5611 + Store 5452(texel) 5613 + 5614: 283 Load 5606(t2DArray) + 5615: 5456 Load 5458(s) + 5616: 284 SampledImage 5614 5615 + 5617: 175(fvec3) Load 177(f16c3) + 5618: 6(float) Load 137(f16bias) + 5619: 7(fvec4) ImageSampleImplicitLod 5616 5617 Bias 5618 + 5620: 7(fvec4) Load 5452(texel) + 5621: 7(fvec4) FAdd 5620 5619 + Store 5452(texel) 5621 + 5624: 298 Load 5623(tCubeArray) + 5625: 5456 Load 5458(s) + 5626: 299 SampledImage 5624 5625 + 5627: 249(fvec4) Load 251(c4) + 5628: 7(fvec4) ImageSampleImplicitLod 5626 5627 + 5629: 7(fvec4) Load 5452(texel) + 5630: 7(fvec4) FAdd 5629 5628 + Store 5452(texel) 5630 + 5631: 298 Load 5623(tCubeArray) + 5632: 5456 Load 5458(s) + 5633: 299 SampledImage 5631 5632 + 5634: 7(fvec4) Load 309(f16c4) + 5635: 6(float) Load 137(f16bias) + 5636: 7(fvec4) ImageSampleImplicitLod 5633 5634 Bias 5635 + 5637: 7(fvec4) Load 5452(texel) + 5638: 7(fvec4) FAdd 5637 5636 + Store 5452(texel) 5638 + 5639: 268 Load 5589(t1DArray) + 5640: 5456 Load 5525(sShadow) + 5641: 316 SampledImage 5639 5640 + 5642: 167(fvec3) Load 169(c3) + 5643: 52(float) CompositeExtract 5642 2 + 5644: 6(float) ImageSampleDrefImplicitLod 5641 5642 5643 + 5645: 208(ptr) AccessChain 5452(texel) 207 + 5646: 6(float) Load 5645 + 5647: 6(float) FAdd 5646 5644 + 5648: 208(ptr) AccessChain 5452(texel) 207 + Store 5648 5647 + 5649: 268 Load 5589(t1DArray) + 5650: 5456 Load 5525(sShadow) + 5651: 316 SampledImage 5649 5650 + 5652: 154(fvec2) Load 156(f16c2) + 5653: 52(float) Load 215(compare) + 5654: 6(float) Load 137(f16bias) + 5655: 6(float) ImageSampleDrefImplicitLod 5651 5652 5653 Bias 5654 + 5656: 208(ptr) AccessChain 5452(texel) 207 + 5657: 6(float) Load 5656 + 5658: 6(float) FAdd 5657 5655 + 5659: 208(ptr) AccessChain 5452(texel) 207 + Store 5659 5658 + 5660: 283 Load 5606(t2DArray) + 5661: 5456 Load 5525(sShadow) + 5662: 337 SampledImage 5660 5661 + 5663: 249(fvec4) Load 251(c4) + 5664: 52(float) CompositeExtract 5663 3 + 5665: 6(float) ImageSampleDrefImplicitLod 5662 5663 5664 + 5666: 208(ptr) AccessChain 5452(texel) 207 + 5667: 6(float) Load 5666 + 5668: 6(float) FAdd 5667 5665 + 5669: 208(ptr) AccessChain 5452(texel) 207 + Store 5669 5668 + 5670: 283 Load 5606(t2DArray) + 5671: 5456 Load 5525(sShadow) + 5672: 337 SampledImage 5670 5671 + 5673: 175(fvec3) Load 177(f16c3) + 5674: 52(float) Load 215(compare) + 5675: 6(float) ImageSampleDrefImplicitLod 5672 5673 5674 + 5676: 208(ptr) AccessChain 5452(texel) 207 + 5677: 6(float) Load 5676 + 5678: 6(float) FAdd 5677 5675 + 5679: 208(ptr) AccessChain 5452(texel) 207 + Store 5679 5678 + 5682: 356 Load 5681(t2DRect) + 5683: 5456 Load 5458(s) + 5684: 357 SampledImage 5682 5683 + 5685: 53(fvec2) Load 148(c2) + 5686: 7(fvec4) ImageSampleImplicitLod 5684 5685 + 5687: 7(fvec4) Load 5452(texel) + 5688: 7(fvec4) FAdd 5687 5686 + Store 5452(texel) 5688 + 5689: 356 Load 5681(t2DRect) + 5690: 5456 Load 5458(s) + 5691: 357 SampledImage 5689 5690 + 5692: 154(fvec2) Load 156(f16c2) + 5693: 7(fvec4) ImageSampleImplicitLod 5691 5692 + 5694: 7(fvec4) Load 5452(texel) + 5695: 7(fvec4) FAdd 5694 5693 + Store 5452(texel) 5695 + 5696: 356 Load 5681(t2DRect) + 5697: 5456 Load 5525(sShadow) + 5698: 371 SampledImage 5696 5697 + 5699: 167(fvec3) Load 169(c3) + 5700: 52(float) CompositeExtract 5699 2 + 5701: 6(float) ImageSampleDrefImplicitLod 5698 5699 5700 + 5702: 208(ptr) AccessChain 5452(texel) 207 + 5703: 6(float) Load 5702 + 5704: 6(float) FAdd 5703 5701 + 5705: 208(ptr) AccessChain 5452(texel) 207 + Store 5705 5704 + 5706: 356 Load 5681(t2DRect) + 5707: 5456 Load 5525(sShadow) + 5708: 371 SampledImage 5706 5707 + 5709: 154(fvec2) Load 156(f16c2) + 5710: 52(float) Load 215(compare) + 5711: 6(float) ImageSampleDrefImplicitLod 5708 5709 5710 + 5712: 208(ptr) AccessChain 5452(texel) 207 + 5713: 6(float) Load 5712 + 5714: 6(float) FAdd 5713 5711 + 5715: 208(ptr) AccessChain 5452(texel) 207 + Store 5715 5714 + 5716: 298 Load 5623(tCubeArray) + 5717: 5456 Load 5525(sShadow) + 5718: 391 SampledImage 5716 5717 + 5719: 249(fvec4) Load 251(c4) + 5720: 52(float) Load 215(compare) + 5721: 6(float) ImageSampleDrefImplicitLod 5718 5719 5720 + 5722: 208(ptr) AccessChain 5452(texel) 207 + 5723: 6(float) Load 5722 + 5724: 6(float) FAdd 5723 5721 + 5725: 208(ptr) AccessChain 5452(texel) 207 + Store 5725 5724 + 5726: 298 Load 5623(tCubeArray) + 5727: 5456 Load 5525(sShadow) + 5728: 391 SampledImage 5726 5727 + 5729: 7(fvec4) Load 309(f16c4) + 5730: 52(float) Load 215(compare) + 5731: 6(float) ImageSampleDrefImplicitLod 5728 5729 5730 + 5732: 208(ptr) AccessChain 5452(texel) 207 + 5733: 6(float) Load 5732 + 5734: 6(float) FAdd 5733 5731 + 5735: 208(ptr) AccessChain 5452(texel) 207 + Store 5735 5734 + 5736: 7(fvec4) Load 5452(texel) + ReturnValue 5736 + FunctionEnd +117(testSubpassLoad(): 7(fvec4) Function None 8 + 118: Label + 5742: 5739 Load 5741(subpass) + 5744: 7(fvec4) ImageRead 5742 5743 + 5748: 5745 Load 5747(subpassMS) + 5749: 7(fvec4) ImageRead 5748 5743 Sample 1326 + 5750: 7(fvec4) FAdd 5744 5749 + ReturnValue 5750 + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.float16.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.float16.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.float16.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.float16.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.float16.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 534 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.float32.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.float32.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.float32.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.float32.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,800 @@ +spv.float32.frag +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 530 + + Capability Shader + Capability Float16 + Capability Float64 + Capability Int64 + Capability Int16 + Capability Int8 + Capability DerivativeControl + Capability InterpolationFunction + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 468 + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + SourceExtension "GL_KHX_shader_explicit_arithmetic_types" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int8" + Name 4 "main" + Name 6 "literal(" + Name 8 "operators(" + Name 10 "typeCast(" + Name 12 "builtinAngleTrigFuncs(" + Name 14 "builtinExpFuncs(" + Name 16 "builtinCommonFuncs(" + Name 18 "builtinGeometryFuncs(" + Name 20 "builtinMatrixFuncs(" + Name 22 "builtinVecRelFuncs(" + Name 24 "builtinFragProcFuncs(" + Name 29 "f32v" + Name 40 "f32v" + Name 62 "f32m" + Name 85 "f32" + Name 109 "b" + Name 152 "f64v" + Name 155 "f32v" + Name 160 "bv" + Name 175 "f16v" + Name 183 "i8v" + Name 189 "i16v" + Name 195 "i32v" + Name 201 "i64v" + Name 204 "u8v" + Name 210 "u16v" + Name 215 "u32v" + Name 221 "u64v" + Name 226 "f32v2" + Name 227 "f32v1" + Name 259 "f32v2" + Name 260 "f32v1" + Name 276 "f32v2" + Name 277 "f32v1" + Name 298 "f32" + Name 302 "f32v3" + Name 342 "bv" + Name 363 "b" + Name 373 "iv" + Name 374 "ResType" + Name 381 "f32" + Name 382 "f32v1" + Name 386 "f32v2" + Name 392 "f32v3" + Name 411 "f32m3" + Name 412 "f32m1" + Name 414 "f32m2" + Name 423 "f32v1" + Name 425 "f32v2" + Name 430 "f32m4" + Name 433 "f32" + Name 436 "f32m5" + Name 441 "f32m6" + Name 442 "f32m7" + Name 445 "bv" + Name 446 "f32v1" + Name 448 "f32v2" + Name 466 "f32v" + Name 468 "if32v" + Name 517 "S" + MemberName 517(S) 0 "x" + MemberName 517(S) 1 "y" + MemberName 517(S) 2 "z" + Name 519 "B1" + MemberName 519(B1) 0 "a" + MemberName 519(B1) 1 "b" + MemberName 519(B1) 2 "c" + MemberName 519(B1) 3 "d" + MemberName 519(B1) 4 "e" + MemberName 519(B1) 5 "f" + MemberName 519(B1) 6 "g" + MemberName 519(B1) 7 "h" + Name 521 "" + Name 522 "sf16" + Name 523 "sf" + Name 524 "sd" + Decorate 515 ArrayStride 16 + Decorate 516 ArrayStride 32 + MemberDecorate 517(S) 0 Offset 0 + MemberDecorate 517(S) 1 Offset 8 + MemberDecorate 517(S) 2 Offset 16 + Decorate 518 ArrayStride 32 + MemberDecorate 519(B1) 0 Offset 0 + MemberDecorate 519(B1) 1 Offset 8 + MemberDecorate 519(B1) 2 Offset 16 + MemberDecorate 519(B1) 3 Offset 32 + MemberDecorate 519(B1) 4 ColMajor + MemberDecorate 519(B1) 4 Offset 64 + MemberDecorate 519(B1) 4 MatrixStride 16 + MemberDecorate 519(B1) 5 ColMajor + MemberDecorate 519(B1) 5 Offset 96 + MemberDecorate 519(B1) 5 MatrixStride 16 + MemberDecorate 519(B1) 6 Offset 160 + MemberDecorate 519(B1) 7 Offset 192 + Decorate 519(B1) Block + Decorate 521 DescriptorSet 0 + Decorate 522(sf16) SpecId 100 + Decorate 523(sf) SpecId 101 + Decorate 524(sd) SpecId 102 + 2: TypeVoid + 3: TypeFunction 2 + 26: TypeFloat 32 + 27: TypeVector 26(float) 2 + 28: TypePointer Function 27(fvec2) + 30: 26(float) Constant 897988541 + 31: TypeInt 32 0 + 32: 31(int) Constant 0 + 33: TypePointer Function 26(float) + 35: 26(float) Constant 3196059648 + 36: 26(float) Constant 1022739087 + 37: 27(fvec2) ConstantComposite 35 36 + 54: 26(float) Constant 1065353216 + 60: TypeMatrix 27(fvec2) 2 + 61: TypePointer Function 60 + 88: 31(int) Constant 1 + 107: TypeBool + 108: TypePointer Function 107(bool) + 149: TypeFloat 64 + 150: TypeVector 149(float) 3 + 151: TypePointer Function 150(fvec3) + 153: TypeVector 26(float) 3 + 154: TypePointer Function 153(fvec3) + 158: TypeVector 107(bool) 3 + 159: TypePointer Function 158(bvec3) + 162: 26(float) Constant 0 + 163: 153(fvec3) ConstantComposite 162 162 162 + 164: 153(fvec3) ConstantComposite 54 54 54 + 172: TypeFloat 16 + 173: TypeVector 172(float) 3 + 174: TypePointer Function 173(fvec3) + 180: TypeInt 8 1 + 181: TypeVector 180(int) 3 + 182: TypePointer Function 181(ivec3) + 186: TypeInt 16 1 + 187: TypeVector 186(int) 3 + 188: TypePointer Function 187(ivec3) + 192: TypeInt 32 1 + 193: TypeVector 192(int) 3 + 194: TypePointer Function 193(ivec3) + 198: TypeInt 64 1 + 199: TypeVector 198(int) 3 + 200: TypePointer Function 199(ivec3) + 207: TypeInt 16 0 + 208: TypeVector 207(int) 3 + 209: TypePointer Function 208(ivec3) + 213: TypeVector 31(int) 3 + 214: TypePointer Function 213(ivec3) + 218: TypeInt 64 0 + 219: TypeVector 218(int) 3 + 220: TypePointer Function 219(ivec3) + 224: TypeVector 26(float) 4 + 225: TypePointer Function 224(fvec4) + 374(ResType): TypeStruct 153(fvec3) 193(ivec3) + 409: TypeMatrix 153(fvec3) 2 + 410: TypePointer Function 409 + 428: TypeMatrix 27(fvec2) 3 + 429: TypePointer Function 428 + 434: TypeMatrix 153(fvec3) 3 + 435: TypePointer Function 434 + 439: TypeMatrix 224(fvec4) 4 + 440: TypePointer Function 439 + 467: TypePointer Input 153(fvec3) + 468(if32v): 467(ptr) Variable Input + 469: TypePointer Input 26(float) + 506: 192(int) Constant 1 + 511: 26(float) Constant 1056964608 + 512: 27(fvec2) ConstantComposite 511 511 + 514: 31(int) Constant 2 + 515: TypeArray 26(float) 514 + 516: TypeArray 409 514 + 517(S): TypeStruct 26(float) 27(fvec2) 153(fvec3) + 518: TypeArray 517(S) 514 + 519(B1): TypeStruct 26(float) 27(fvec2) 153(fvec3) 515 409 516 517(S) 518 + 520: TypePointer Uniform 519(B1) + 521: 520(ptr) Variable Uniform + 522(sf16): 172(float) SpecConstant 12288 + 523(sf): 26(float) SpecConstant 1048576000 + 524(sd): 149(float) SpecConstant 0 1071644672 + 525: 26(float) SpecConstantOp 115 522(sf16) + 526: 26(float) SpecConstantOp 115 522(sf16) + 527: 149(float) SpecConstantOp 115 526 + 528: 172(float) SpecConstantOp 115 523(sf) + 529: 172(float) SpecConstantOp 115 524(sd) + 4(main): 2 Function None 3 + 5: Label + Return + FunctionEnd + 6(literal(): 2 Function None 3 + 7: Label + 29(f32v): 28(ptr) Variable Function + 34: 33(ptr) AccessChain 29(f32v) 32 + Store 34 30 + 38: 27(fvec2) Load 29(f32v) + 39: 27(fvec2) FAdd 38 37 + Store 29(f32v) 39 + Return + FunctionEnd + 8(operators(): 2 Function None 3 + 9: Label + 40(f32v): 28(ptr) Variable Function + 62(f32m): 61(ptr) Variable Function + 85(f32): 33(ptr) Variable Function + 109(b): 108(ptr) Variable Function + 41: 27(fvec2) Load 40(f32v) + 42: 27(fvec2) Load 40(f32v) + 43: 27(fvec2) FAdd 42 41 + Store 40(f32v) 43 + 44: 27(fvec2) Load 40(f32v) + 45: 27(fvec2) Load 40(f32v) + 46: 27(fvec2) FSub 45 44 + Store 40(f32v) 46 + 47: 27(fvec2) Load 40(f32v) + 48: 27(fvec2) Load 40(f32v) + 49: 27(fvec2) FMul 48 47 + Store 40(f32v) 49 + 50: 27(fvec2) Load 40(f32v) + 51: 27(fvec2) Load 40(f32v) + 52: 27(fvec2) FDiv 51 50 + Store 40(f32v) 52 + 53: 27(fvec2) Load 40(f32v) + 55: 27(fvec2) CompositeConstruct 54 54 + 56: 27(fvec2) FAdd 53 55 + Store 40(f32v) 56 + 57: 27(fvec2) Load 40(f32v) + 58: 27(fvec2) CompositeConstruct 54 54 + 59: 27(fvec2) FSub 57 58 + Store 40(f32v) 59 + 63: 60 Load 62(f32m) + 64: 27(fvec2) CompositeConstruct 54 54 + 65: 27(fvec2) CompositeExtract 63 0 + 66: 27(fvec2) FAdd 65 64 + 67: 27(fvec2) CompositeExtract 63 1 + 68: 27(fvec2) FAdd 67 64 + 69: 60 CompositeConstruct 66 68 + Store 62(f32m) 69 + 70: 60 Load 62(f32m) + 71: 27(fvec2) CompositeConstruct 54 54 + 72: 27(fvec2) CompositeExtract 70 0 + 73: 27(fvec2) FSub 72 71 + 74: 27(fvec2) CompositeExtract 70 1 + 75: 27(fvec2) FSub 74 71 + 76: 60 CompositeConstruct 73 75 + Store 62(f32m) 76 + 77: 27(fvec2) Load 40(f32v) + 78: 27(fvec2) FNegate 77 + Store 40(f32v) 78 + 79: 60 Load 62(f32m) + 80: 27(fvec2) CompositeExtract 79 0 + 81: 27(fvec2) FNegate 80 + 82: 27(fvec2) CompositeExtract 79 1 + 83: 27(fvec2) FNegate 82 + 84: 60 CompositeConstruct 81 83 + Store 62(f32m) 84 + 86: 33(ptr) AccessChain 40(f32v) 32 + 87: 26(float) Load 86 + 89: 33(ptr) AccessChain 40(f32v) 88 + 90: 26(float) Load 89 + 91: 26(float) FAdd 87 90 + Store 85(f32) 91 + 92: 33(ptr) AccessChain 40(f32v) 32 + 93: 26(float) Load 92 + 94: 33(ptr) AccessChain 40(f32v) 88 + 95: 26(float) Load 94 + 96: 26(float) FSub 93 95 + Store 85(f32) 96 + 97: 33(ptr) AccessChain 40(f32v) 32 + 98: 26(float) Load 97 + 99: 33(ptr) AccessChain 40(f32v) 88 + 100: 26(float) Load 99 + 101: 26(float) FMul 98 100 + Store 85(f32) 101 + 102: 33(ptr) AccessChain 40(f32v) 32 + 103: 26(float) Load 102 + 104: 33(ptr) AccessChain 40(f32v) 88 + 105: 26(float) Load 104 + 106: 26(float) FDiv 103 105 + Store 85(f32) 106 + 110: 33(ptr) AccessChain 40(f32v) 32 + 111: 26(float) Load 110 + 112: 26(float) Load 85(f32) + 113: 107(bool) FOrdNotEqual 111 112 + Store 109(b) 113 + 114: 33(ptr) AccessChain 40(f32v) 88 + 115: 26(float) Load 114 + 116: 26(float) Load 85(f32) + 117: 107(bool) FOrdEqual 115 116 + Store 109(b) 117 + 118: 33(ptr) AccessChain 40(f32v) 32 + 119: 26(float) Load 118 + 120: 26(float) Load 85(f32) + 121: 107(bool) FOrdGreaterThan 119 120 + Store 109(b) 121 + 122: 33(ptr) AccessChain 40(f32v) 88 + 123: 26(float) Load 122 + 124: 26(float) Load 85(f32) + 125: 107(bool) FOrdLessThan 123 124 + Store 109(b) 125 + 126: 33(ptr) AccessChain 40(f32v) 32 + 127: 26(float) Load 126 + 128: 26(float) Load 85(f32) + 129: 107(bool) FOrdGreaterThanEqual 127 128 + Store 109(b) 129 + 130: 33(ptr) AccessChain 40(f32v) 88 + 131: 26(float) Load 130 + 132: 26(float) Load 85(f32) + 133: 107(bool) FOrdLessThanEqual 131 132 + Store 109(b) 133 + 134: 27(fvec2) Load 40(f32v) + 135: 26(float) Load 85(f32) + 136: 27(fvec2) VectorTimesScalar 134 135 + Store 40(f32v) 136 + 137: 60 Load 62(f32m) + 138: 26(float) Load 85(f32) + 139: 60 MatrixTimesScalar 137 138 + Store 62(f32m) 139 + 140: 60 Load 62(f32m) + 141: 27(fvec2) Load 40(f32v) + 142: 27(fvec2) MatrixTimesVector 140 141 + Store 40(f32v) 142 + 143: 27(fvec2) Load 40(f32v) + 144: 60 Load 62(f32m) + 145: 27(fvec2) VectorTimesMatrix 143 144 + Store 40(f32v) 145 + 146: 60 Load 62(f32m) + 147: 60 Load 62(f32m) + 148: 60 MatrixTimesMatrix 146 147 + Store 62(f32m) 148 + Return + FunctionEnd + 10(typeCast(): 2 Function None 3 + 11: Label + 152(f64v): 151(ptr) Variable Function + 155(f32v): 154(ptr) Variable Function + 160(bv): 159(ptr) Variable Function + 175(f16v): 174(ptr) Variable Function + 183(i8v): 182(ptr) Variable Function + 189(i16v): 188(ptr) Variable Function + 195(i32v): 194(ptr) Variable Function + 201(i64v): 200(ptr) Variable Function + 204(u8v): 182(ptr) Variable Function + 210(u16v): 209(ptr) Variable Function + 215(u32v): 214(ptr) Variable Function + 221(u64v): 220(ptr) Variable Function + 156: 153(fvec3) Load 155(f32v) + 157: 150(fvec3) FConvert 156 + Store 152(f64v) 157 + 161: 158(bvec3) Load 160(bv) + 165: 153(fvec3) Select 161 164 163 + Store 155(f32v) 165 + 166: 153(fvec3) Load 155(f32v) + 167: 158(bvec3) FOrdNotEqual 166 163 + Store 160(bv) 167 + 168: 150(fvec3) Load 152(f64v) + 169: 153(fvec3) FConvert 168 + Store 155(f32v) 169 + 170: 153(fvec3) Load 155(f32v) + 171: 150(fvec3) FConvert 170 + Store 152(f64v) 171 + 176: 173(fvec3) Load 175(f16v) + 177: 153(fvec3) FConvert 176 + Store 155(f32v) 177 + 178: 153(fvec3) Load 155(f32v) + 179: 173(fvec3) FConvert 178 + Store 175(f16v) 179 + 184: 153(fvec3) Load 155(f32v) + 185: 181(ivec3) ConvertFToS 184 + Store 183(i8v) 185 + 190: 153(fvec3) Load 155(f32v) + 191: 187(ivec3) ConvertFToS 190 + Store 189(i16v) 191 + 196: 153(fvec3) Load 155(f32v) + 197: 193(ivec3) ConvertFToS 196 + Store 195(i32v) 197 + 202: 153(fvec3) Load 155(f32v) + 203: 199(ivec3) ConvertFToS 202 + Store 201(i64v) 203 + 205: 153(fvec3) Load 155(f32v) + 206: 181(ivec3) ConvertFToS 205 + Store 204(u8v) 206 + 211: 153(fvec3) Load 155(f32v) + 212: 208(ivec3) ConvertFToU 211 + Store 210(u16v) 212 + 216: 153(fvec3) Load 155(f32v) + 217: 213(ivec3) ConvertFToU 216 + Store 215(u32v) 217 + 222: 153(fvec3) Load 155(f32v) + 223: 219(ivec3) ConvertFToU 222 + Store 221(u64v) 223 + Return + FunctionEnd +12(builtinAngleTrigFuncs(): 2 Function None 3 + 13: Label + 226(f32v2): 225(ptr) Variable Function + 227(f32v1): 225(ptr) Variable Function + 228: 224(fvec4) Load 227(f32v1) + 229: 224(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 228 + Store 226(f32v2) 229 + 230: 224(fvec4) Load 227(f32v1) + 231: 224(fvec4) ExtInst 1(GLSL.std.450) 12(Degrees) 230 + Store 226(f32v2) 231 + 232: 224(fvec4) Load 227(f32v1) + 233: 224(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 232 + Store 226(f32v2) 233 + 234: 224(fvec4) Load 227(f32v1) + 235: 224(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 234 + Store 226(f32v2) 235 + 236: 224(fvec4) Load 227(f32v1) + 237: 224(fvec4) ExtInst 1(GLSL.std.450) 15(Tan) 236 + Store 226(f32v2) 237 + 238: 224(fvec4) Load 227(f32v1) + 239: 224(fvec4) ExtInst 1(GLSL.std.450) 16(Asin) 238 + Store 226(f32v2) 239 + 240: 224(fvec4) Load 227(f32v1) + 241: 224(fvec4) ExtInst 1(GLSL.std.450) 17(Acos) 240 + Store 226(f32v2) 241 + 242: 224(fvec4) Load 227(f32v1) + 243: 224(fvec4) Load 226(f32v2) + 244: 224(fvec4) ExtInst 1(GLSL.std.450) 25(Atan2) 242 243 + Store 226(f32v2) 244 + 245: 224(fvec4) Load 227(f32v1) + 246: 224(fvec4) ExtInst 1(GLSL.std.450) 18(Atan) 245 + Store 226(f32v2) 246 + 247: 224(fvec4) Load 227(f32v1) + 248: 224(fvec4) ExtInst 1(GLSL.std.450) 19(Sinh) 247 + Store 226(f32v2) 248 + 249: 224(fvec4) Load 227(f32v1) + 250: 224(fvec4) ExtInst 1(GLSL.std.450) 20(Cosh) 249 + Store 226(f32v2) 250 + 251: 224(fvec4) Load 227(f32v1) + 252: 224(fvec4) ExtInst 1(GLSL.std.450) 21(Tanh) 251 + Store 226(f32v2) 252 + 253: 224(fvec4) Load 227(f32v1) + 254: 224(fvec4) ExtInst 1(GLSL.std.450) 22(Asinh) 253 + Store 226(f32v2) 254 + 255: 224(fvec4) Load 227(f32v1) + 256: 224(fvec4) ExtInst 1(GLSL.std.450) 23(Acosh) 255 + Store 226(f32v2) 256 + 257: 224(fvec4) Load 227(f32v1) + 258: 224(fvec4) ExtInst 1(GLSL.std.450) 24(Atanh) 257 + Store 226(f32v2) 258 + Return + FunctionEnd +14(builtinExpFuncs(): 2 Function None 3 + 15: Label + 259(f32v2): 28(ptr) Variable Function + 260(f32v1): 28(ptr) Variable Function + 261: 27(fvec2) Load 260(f32v1) + 262: 27(fvec2) Load 259(f32v2) + 263: 27(fvec2) ExtInst 1(GLSL.std.450) 26(Pow) 261 262 + Store 259(f32v2) 263 + 264: 27(fvec2) Load 260(f32v1) + 265: 27(fvec2) ExtInst 1(GLSL.std.450) 27(Exp) 264 + Store 259(f32v2) 265 + 266: 27(fvec2) Load 260(f32v1) + 267: 27(fvec2) ExtInst 1(GLSL.std.450) 28(Log) 266 + Store 259(f32v2) 267 + 268: 27(fvec2) Load 260(f32v1) + 269: 27(fvec2) ExtInst 1(GLSL.std.450) 29(Exp2) 268 + Store 259(f32v2) 269 + 270: 27(fvec2) Load 260(f32v1) + 271: 27(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 270 + Store 259(f32v2) 271 + 272: 27(fvec2) Load 260(f32v1) + 273: 27(fvec2) ExtInst 1(GLSL.std.450) 31(Sqrt) 272 + Store 259(f32v2) 273 + 274: 27(fvec2) Load 260(f32v1) + 275: 27(fvec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 274 + Store 259(f32v2) 275 + Return + FunctionEnd +16(builtinCommonFuncs(): 2 Function None 3 + 17: Label + 276(f32v2): 154(ptr) Variable Function + 277(f32v1): 154(ptr) Variable Function + 298(f32): 33(ptr) Variable Function + 302(f32v3): 154(ptr) Variable Function + 342(bv): 159(ptr) Variable Function + 363(b): 108(ptr) Variable Function + 373(iv): 194(ptr) Variable Function + 278: 153(fvec3) Load 277(f32v1) + 279: 153(fvec3) ExtInst 1(GLSL.std.450) 4(FAbs) 278 + Store 276(f32v2) 279 + 280: 153(fvec3) Load 277(f32v1) + 281: 153(fvec3) ExtInst 1(GLSL.std.450) 6(FSign) 280 + Store 276(f32v2) 281 + 282: 153(fvec3) Load 277(f32v1) + 283: 153(fvec3) ExtInst 1(GLSL.std.450) 8(Floor) 282 + Store 276(f32v2) 283 + 284: 153(fvec3) Load 277(f32v1) + 285: 153(fvec3) ExtInst 1(GLSL.std.450) 3(Trunc) 284 + Store 276(f32v2) 285 + 286: 153(fvec3) Load 277(f32v1) + 287: 153(fvec3) ExtInst 1(GLSL.std.450) 1(Round) 286 + Store 276(f32v2) 287 + 288: 153(fvec3) Load 277(f32v1) + 289: 153(fvec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 288 + Store 276(f32v2) 289 + 290: 153(fvec3) Load 277(f32v1) + 291: 153(fvec3) ExtInst 1(GLSL.std.450) 9(Ceil) 290 + Store 276(f32v2) 291 + 292: 153(fvec3) Load 277(f32v1) + 293: 153(fvec3) ExtInst 1(GLSL.std.450) 10(Fract) 292 + Store 276(f32v2) 293 + 294: 153(fvec3) Load 277(f32v1) + 295: 153(fvec3) Load 276(f32v2) + 296: 153(fvec3) FMod 294 295 + Store 276(f32v2) 296 + 297: 153(fvec3) Load 277(f32v1) + 299: 26(float) Load 298(f32) + 300: 153(fvec3) CompositeConstruct 299 299 299 + 301: 153(fvec3) FMod 297 300 + Store 276(f32v2) 301 + 303: 153(fvec3) Load 277(f32v1) + 304: 153(fvec3) ExtInst 1(GLSL.std.450) 35(Modf) 303 276(f32v2) + Store 302(f32v3) 304 + 305: 153(fvec3) Load 277(f32v1) + 306: 153(fvec3) Load 276(f32v2) + 307: 153(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 305 306 + Store 302(f32v3) 307 + 308: 153(fvec3) Load 277(f32v1) + 309: 26(float) Load 298(f32) + 310: 153(fvec3) CompositeConstruct 309 309 309 + 311: 153(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 308 310 + Store 302(f32v3) 311 + 312: 153(fvec3) Load 277(f32v1) + 313: 153(fvec3) Load 276(f32v2) + 314: 153(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 312 313 + Store 302(f32v3) 314 + 315: 153(fvec3) Load 277(f32v1) + 316: 26(float) Load 298(f32) + 317: 153(fvec3) CompositeConstruct 316 316 316 + 318: 153(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 315 317 + Store 302(f32v3) 318 + 319: 153(fvec3) Load 277(f32v1) + 320: 26(float) Load 298(f32) + 321: 33(ptr) AccessChain 276(f32v2) 32 + 322: 26(float) Load 321 + 323: 153(fvec3) CompositeConstruct 320 320 320 + 324: 153(fvec3) CompositeConstruct 322 322 322 + 325: 153(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 319 323 324 + Store 302(f32v3) 325 + 326: 153(fvec3) Load 277(f32v1) + 327: 153(fvec3) Load 276(f32v2) + 328: 26(float) Load 298(f32) + 329: 153(fvec3) CompositeConstruct 328 328 328 + 330: 153(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 326 327 329 + Store 302(f32v3) 330 + 331: 153(fvec3) Load 277(f32v1) + 332: 153(fvec3) Load 276(f32v2) + 333: 26(float) Load 298(f32) + 334: 153(fvec3) CompositeConstruct 333 333 333 + 335: 153(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 331 332 334 + Store 302(f32v3) 335 + 336: 153(fvec3) Load 277(f32v1) + 337: 153(fvec3) Load 276(f32v2) + 338: 153(fvec3) Load 302(f32v3) + 339: 153(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 336 337 338 + Store 302(f32v3) 339 + 340: 153(fvec3) Load 277(f32v1) + 341: 153(fvec3) Load 276(f32v2) + 343: 158(bvec3) Load 342(bv) + 344: 153(fvec3) Select 343 341 340 + Store 302(f32v3) 344 + 345: 153(fvec3) Load 277(f32v1) + 346: 153(fvec3) Load 276(f32v2) + 347: 153(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 345 346 + Store 302(f32v3) 347 + 348: 26(float) Load 298(f32) + 349: 153(fvec3) Load 302(f32v3) + 350: 153(fvec3) CompositeConstruct 348 348 348 + 351: 153(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 350 349 + Store 302(f32v3) 351 + 352: 153(fvec3) Load 277(f32v1) + 353: 153(fvec3) Load 276(f32v2) + 354: 153(fvec3) Load 302(f32v3) + 355: 153(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 352 353 354 + Store 302(f32v3) 355 + 356: 26(float) Load 298(f32) + 357: 33(ptr) AccessChain 277(f32v1) 32 + 358: 26(float) Load 357 + 359: 153(fvec3) Load 276(f32v2) + 360: 153(fvec3) CompositeConstruct 356 356 356 + 361: 153(fvec3) CompositeConstruct 358 358 358 + 362: 153(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 360 361 359 + Store 302(f32v3) 362 + 364: 26(float) Load 298(f32) + 365: 107(bool) IsNan 364 + Store 363(b) 365 + 366: 153(fvec3) Load 277(f32v1) + 367: 158(bvec3) IsInf 366 + Store 342(bv) 367 + 368: 153(fvec3) Load 277(f32v1) + 369: 153(fvec3) Load 276(f32v2) + 370: 153(fvec3) Load 302(f32v3) + 371: 153(fvec3) ExtInst 1(GLSL.std.450) 50(Fma) 368 369 370 + Store 302(f32v3) 371 + 372: 153(fvec3) Load 277(f32v1) + 375:374(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 372 + 376: 193(ivec3) CompositeExtract 375 1 + Store 373(iv) 376 + 377: 153(fvec3) CompositeExtract 375 0 + Store 276(f32v2) 377 + 378: 153(fvec3) Load 277(f32v1) + 379: 193(ivec3) Load 373(iv) + 380: 153(fvec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 378 379 + Store 276(f32v2) 380 + Return + FunctionEnd +18(builtinGeometryFuncs(): 2 Function None 3 + 19: Label + 381(f32): 33(ptr) Variable Function + 382(f32v1): 154(ptr) Variable Function + 386(f32v2): 154(ptr) Variable Function + 392(f32v3): 154(ptr) Variable Function + 383: 153(fvec3) Load 382(f32v1) + 384: 26(float) ExtInst 1(GLSL.std.450) 66(Length) 383 + Store 381(f32) 384 + 385: 153(fvec3) Load 382(f32v1) + 387: 153(fvec3) Load 386(f32v2) + 388: 26(float) ExtInst 1(GLSL.std.450) 67(Distance) 385 387 + Store 381(f32) 388 + 389: 153(fvec3) Load 382(f32v1) + 390: 153(fvec3) Load 386(f32v2) + 391: 26(float) Dot 389 390 + Store 381(f32) 391 + 393: 153(fvec3) Load 382(f32v1) + 394: 153(fvec3) Load 386(f32v2) + 395: 153(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 393 394 + Store 392(f32v3) 395 + 396: 153(fvec3) Load 382(f32v1) + 397: 153(fvec3) ExtInst 1(GLSL.std.450) 69(Normalize) 396 + Store 386(f32v2) 397 + 398: 153(fvec3) Load 382(f32v1) + 399: 153(fvec3) Load 386(f32v2) + 400: 153(fvec3) Load 392(f32v3) + 401: 153(fvec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 398 399 400 + Store 392(f32v3) 401 + 402: 153(fvec3) Load 382(f32v1) + 403: 153(fvec3) Load 386(f32v2) + 404: 153(fvec3) ExtInst 1(GLSL.std.450) 71(Reflect) 402 403 + Store 392(f32v3) 404 + 405: 153(fvec3) Load 382(f32v1) + 406: 153(fvec3) Load 386(f32v2) + 407: 26(float) Load 381(f32) + 408: 153(fvec3) ExtInst 1(GLSL.std.450) 72(Refract) 405 406 407 + Store 392(f32v3) 408 + Return + FunctionEnd +20(builtinMatrixFuncs(): 2 Function None 3 + 21: Label + 411(f32m3): 410(ptr) Variable Function + 412(f32m1): 410(ptr) Variable Function + 414(f32m2): 410(ptr) Variable Function + 423(f32v1): 154(ptr) Variable Function + 425(f32v2): 28(ptr) Variable Function + 430(f32m4): 429(ptr) Variable Function + 433(f32): 33(ptr) Variable Function + 436(f32m5): 435(ptr) Variable Function + 441(f32m6): 440(ptr) Variable Function + 442(f32m7): 440(ptr) Variable Function + 413: 409 Load 412(f32m1) + 415: 409 Load 414(f32m2) + 416: 153(fvec3) CompositeExtract 413 0 + 417: 153(fvec3) CompositeExtract 415 0 + 418: 153(fvec3) FMul 416 417 + 419: 153(fvec3) CompositeExtract 413 1 + 420: 153(fvec3) CompositeExtract 415 1 + 421: 153(fvec3) FMul 419 420 + 422: 409 CompositeConstruct 418 421 + Store 411(f32m3) 422 + 424: 153(fvec3) Load 423(f32v1) + 426: 27(fvec2) Load 425(f32v2) + 427: 409 OuterProduct 424 426 + Store 412(f32m1) 427 + 431: 409 Load 412(f32m1) + 432: 428 Transpose 431 + Store 430(f32m4) 432 + 437: 434 Load 436(f32m5) + 438: 26(float) ExtInst 1(GLSL.std.450) 33(Determinant) 437 + Store 433(f32) 438 + 443: 439 Load 442(f32m7) + 444: 439 ExtInst 1(GLSL.std.450) 34(MatrixInverse) 443 + Store 441(f32m6) 444 + Return + FunctionEnd +22(builtinVecRelFuncs(): 2 Function None 3 + 23: Label + 445(bv): 159(ptr) Variable Function + 446(f32v1): 154(ptr) Variable Function + 448(f32v2): 154(ptr) Variable Function + 447: 153(fvec3) Load 446(f32v1) + 449: 153(fvec3) Load 448(f32v2) + 450: 158(bvec3) FOrdLessThan 447 449 + Store 445(bv) 450 + 451: 153(fvec3) Load 446(f32v1) + 452: 153(fvec3) Load 448(f32v2) + 453: 158(bvec3) FOrdLessThanEqual 451 452 + Store 445(bv) 453 + 454: 153(fvec3) Load 446(f32v1) + 455: 153(fvec3) Load 448(f32v2) + 456: 158(bvec3) FOrdGreaterThan 454 455 + Store 445(bv) 456 + 457: 153(fvec3) Load 446(f32v1) + 458: 153(fvec3) Load 448(f32v2) + 459: 158(bvec3) FOrdGreaterThanEqual 457 458 + Store 445(bv) 459 + 460: 153(fvec3) Load 446(f32v1) + 461: 153(fvec3) Load 448(f32v2) + 462: 158(bvec3) FOrdEqual 460 461 + Store 445(bv) 462 + 463: 153(fvec3) Load 446(f32v1) + 464: 153(fvec3) Load 448(f32v2) + 465: 158(bvec3) FOrdNotEqual 463 464 + Store 445(bv) 465 + Return + FunctionEnd +24(builtinFragProcFuncs(): 2 Function None 3 + 25: Label + 466(f32v): 154(ptr) Variable Function + 470: 469(ptr) AccessChain 468(if32v) 32 + 471: 26(float) Load 470 + 472: 26(float) DPdx 471 + 473: 33(ptr) AccessChain 466(f32v) 32 + Store 473 472 + 474: 469(ptr) AccessChain 468(if32v) 88 + 475: 26(float) Load 474 + 476: 26(float) DPdy 475 + 477: 33(ptr) AccessChain 466(f32v) 88 + Store 477 476 + 478: 153(fvec3) Load 468(if32v) + 479: 27(fvec2) VectorShuffle 478 478 0 1 + 480: 27(fvec2) DPdxFine 479 + 481: 153(fvec3) Load 466(f32v) + 482: 153(fvec3) VectorShuffle 481 480 3 4 2 + Store 466(f32v) 482 + 483: 153(fvec3) Load 468(if32v) + 484: 27(fvec2) VectorShuffle 483 483 0 1 + 485: 27(fvec2) DPdyFine 484 + 486: 153(fvec3) Load 466(f32v) + 487: 153(fvec3) VectorShuffle 486 485 3 4 2 + Store 466(f32v) 487 + 488: 153(fvec3) Load 468(if32v) + 489: 153(fvec3) DPdxCoarse 488 + Store 466(f32v) 489 + 490: 153(fvec3) Load 468(if32v) + 491: 153(fvec3) DPdxCoarse 490 + Store 466(f32v) 491 + 492: 469(ptr) AccessChain 468(if32v) 32 + 493: 26(float) Load 492 + 494: 26(float) Fwidth 493 + 495: 33(ptr) AccessChain 466(f32v) 32 + Store 495 494 + 496: 153(fvec3) Load 468(if32v) + 497: 27(fvec2) VectorShuffle 496 496 0 1 + 498: 27(fvec2) FwidthFine 497 + 499: 153(fvec3) Load 466(f32v) + 500: 153(fvec3) VectorShuffle 499 498 3 4 2 + Store 466(f32v) 500 + 501: 153(fvec3) Load 468(if32v) + 502: 153(fvec3) FwidthCoarse 501 + Store 466(f32v) 502 + 503: 469(ptr) AccessChain 468(if32v) 32 + 504: 26(float) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 503 + 505: 33(ptr) AccessChain 466(f32v) 32 + Store 505 504 + 507: 153(fvec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 468(if32v) 506 + 508: 27(fvec2) VectorShuffle 507 507 0 1 + 509: 153(fvec3) Load 466(f32v) + 510: 153(fvec3) VectorShuffle 509 508 3 4 2 + Store 466(f32v) 510 + 513: 153(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 468(if32v) 512 + Store 466(f32v) 513 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.float64.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.float64.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.float64.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.float64.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,788 @@ +spv.float64.frag +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 521 + + Capability Shader + Capability Float16 + Capability Float64 + Capability Int64 + Capability Int16 + Capability Int8 + Capability DerivativeControl + Capability InterpolationFunction + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 458 + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + SourceExtension "GL_KHX_shader_explicit_arithmetic_types" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int8" + Name 4 "main" + Name 6 "literal(" + Name 8 "operators(" + Name 10 "typeCast(" + Name 12 "builtinAngleTrigFuncs(" + Name 14 "builtinExpFuncs(" + Name 16 "builtinCommonFuncs(" + Name 18 "builtinGeometryFuncs(" + Name 20 "builtinMatrixFuncs(" + Name 22 "builtinVecRelFuncs(" + Name 24 "builtinFragProcFuncs(" + Name 29 "f64v" + Name 40 "f64v" + Name 62 "f64m" + Name 85 "f64" + Name 109 "b" + Name 151 "f64v" + Name 154 "bv" + Name 165 "f16v" + Name 173 "i8v" + Name 179 "i16v" + Name 185 "i32v" + Name 191 "i64v" + Name 194 "u8v" + Name 200 "u16v" + Name 205 "u32v" + Name 211 "u64v" + Name 216 "f64v2" + Name 217 "f64v1" + Name 249 "f64v2" + Name 250 "f64v1" + Name 266 "f64v2" + Name 267 "f64v1" + Name 288 "f64" + Name 292 "f64v3" + Name 332 "bv" + Name 353 "b" + Name 363 "iv" + Name 364 "ResType" + Name 371 "f64" + Name 372 "f64v1" + Name 376 "f64v2" + Name 382 "f64v3" + Name 401 "f64m3" + Name 402 "f64m1" + Name 404 "f64m2" + Name 413 "f64v1" + Name 415 "f64v2" + Name 420 "f64m4" + Name 423 "f64" + Name 426 "f64m5" + Name 431 "f64m6" + Name 432 "f64m7" + Name 435 "bv" + Name 436 "f64v1" + Name 438 "f64v2" + Name 456 "f64v" + Name 458 "if64v" + Name 507 "S" + MemberName 507(S) 0 "x" + MemberName 507(S) 1 "y" + MemberName 507(S) 2 "z" + Name 509 "B1" + MemberName 509(B1) 0 "a" + MemberName 509(B1) 1 "b" + MemberName 509(B1) 2 "c" + MemberName 509(B1) 3 "d" + MemberName 509(B1) 4 "e" + MemberName 509(B1) 5 "f" + MemberName 509(B1) 6 "g" + MemberName 509(B1) 7 "h" + Name 511 "" + Name 512 "sf16" + Name 514 "sf" + Name 515 "sd" + Decorate 458(if64v) Flat + Decorate 505 ArrayStride 16 + Decorate 506 ArrayStride 64 + MemberDecorate 507(S) 0 Offset 0 + MemberDecorate 507(S) 1 Offset 16 + MemberDecorate 507(S) 2 Offset 32 + Decorate 508 ArrayStride 64 + MemberDecorate 509(B1) 0 Offset 0 + MemberDecorate 509(B1) 1 Offset 16 + MemberDecorate 509(B1) 2 Offset 32 + MemberDecorate 509(B1) 3 Offset 64 + MemberDecorate 509(B1) 4 ColMajor + MemberDecorate 509(B1) 4 Offset 96 + MemberDecorate 509(B1) 4 MatrixStride 32 + MemberDecorate 509(B1) 5 ColMajor + MemberDecorate 509(B1) 5 Offset 160 + MemberDecorate 509(B1) 5 MatrixStride 32 + MemberDecorate 509(B1) 6 Offset 288 + MemberDecorate 509(B1) 7 Offset 352 + Decorate 509(B1) Block + Decorate 511 DescriptorSet 0 + Decorate 512(sf16) SpecId 100 + Decorate 514(sf) SpecId 101 + Decorate 515(sd) SpecId 102 + 2: TypeVoid + 3: TypeFunction 2 + 26: TypeFloat 64 + 27: TypeVector 26(float) 2 + 28: TypePointer Function 27(fvec2) + 30: 26(float) Constant 2696277389 1051772663 + 31: TypeInt 32 0 + 32: 31(int) Constant 0 + 33: TypePointer Function 26(float) + 35: 26(float) Constant 0 3218079744 + 36: 26(float) Constant 3951369912 1067366481 + 37: 27(fvec2) ConstantComposite 35 36 + 54: 26(float) Constant 0 1072693248 + 60: TypeMatrix 27(fvec2) 2 + 61: TypePointer Function 60 + 88: 31(int) Constant 1 + 107: TypeBool + 108: TypePointer Function 107(bool) + 149: TypeVector 26(float) 3 + 150: TypePointer Function 149(fvec3) + 152: TypeVector 107(bool) 3 + 153: TypePointer Function 152(bvec3) + 156: 26(float) Constant 0 0 + 157: 149(fvec3) ConstantComposite 156 156 156 + 158: 149(fvec3) ConstantComposite 54 54 54 + 162: TypeFloat 16 + 163: TypeVector 162(float) 3 + 164: TypePointer Function 163(fvec3) + 170: TypeInt 8 1 + 171: TypeVector 170(int) 3 + 172: TypePointer Function 171(ivec3) + 176: TypeInt 16 1 + 177: TypeVector 176(int) 3 + 178: TypePointer Function 177(ivec3) + 182: TypeInt 32 1 + 183: TypeVector 182(int) 3 + 184: TypePointer Function 183(ivec3) + 188: TypeInt 64 1 + 189: TypeVector 188(int) 3 + 190: TypePointer Function 189(ivec3) + 197: TypeInt 16 0 + 198: TypeVector 197(int) 3 + 199: TypePointer Function 198(ivec3) + 203: TypeVector 31(int) 3 + 204: TypePointer Function 203(ivec3) + 208: TypeInt 64 0 + 209: TypeVector 208(int) 3 + 210: TypePointer Function 209(ivec3) + 214: TypeVector 26(float) 4 + 215: TypePointer Function 214(fvec4) + 364(ResType): TypeStruct 149(fvec3) 183(ivec3) + 399: TypeMatrix 149(fvec3) 2 + 400: TypePointer Function 399 + 418: TypeMatrix 27(fvec2) 3 + 419: TypePointer Function 418 + 424: TypeMatrix 149(fvec3) 3 + 425: TypePointer Function 424 + 429: TypeMatrix 214(fvec4) 4 + 430: TypePointer Function 429 + 457: TypePointer Input 149(fvec3) + 458(if64v): 457(ptr) Variable Input + 459: TypePointer Input 26(float) + 496: 182(int) Constant 1 + 501: 26(float) Constant 0 1071644672 + 502: 27(fvec2) ConstantComposite 501 501 + 504: 31(int) Constant 2 + 505: TypeArray 26(float) 504 + 506: TypeArray 399 504 + 507(S): TypeStruct 26(float) 27(fvec2) 149(fvec3) + 508: TypeArray 507(S) 504 + 509(B1): TypeStruct 26(float) 27(fvec2) 149(fvec3) 505 399 506 507(S) 508 + 510: TypePointer Uniform 509(B1) + 511: 510(ptr) Variable Uniform + 512(sf16): 162(float) SpecConstant 12288 + 513: TypeFloat 32 + 514(sf): 513(float) SpecConstant 1048576000 + 515(sd): 26(float) SpecConstant 0 1071644672 + 516: 513(float) SpecConstantOp 115 512(sf16) + 517: 513(float) SpecConstantOp 115 512(sf16) + 518: 26(float) SpecConstantOp 115 517 + 519: 162(float) SpecConstantOp 115 514(sf) + 520: 162(float) SpecConstantOp 115 515(sd) + 4(main): 2 Function None 3 + 5: Label + Return + FunctionEnd + 6(literal(): 2 Function None 3 + 7: Label + 29(f64v): 28(ptr) Variable Function + 34: 33(ptr) AccessChain 29(f64v) 32 + Store 34 30 + 38: 27(fvec2) Load 29(f64v) + 39: 27(fvec2) FAdd 38 37 + Store 29(f64v) 39 + Return + FunctionEnd + 8(operators(): 2 Function None 3 + 9: Label + 40(f64v): 28(ptr) Variable Function + 62(f64m): 61(ptr) Variable Function + 85(f64): 33(ptr) Variable Function + 109(b): 108(ptr) Variable Function + 41: 27(fvec2) Load 40(f64v) + 42: 27(fvec2) Load 40(f64v) + 43: 27(fvec2) FAdd 42 41 + Store 40(f64v) 43 + 44: 27(fvec2) Load 40(f64v) + 45: 27(fvec2) Load 40(f64v) + 46: 27(fvec2) FSub 45 44 + Store 40(f64v) 46 + 47: 27(fvec2) Load 40(f64v) + 48: 27(fvec2) Load 40(f64v) + 49: 27(fvec2) FMul 48 47 + Store 40(f64v) 49 + 50: 27(fvec2) Load 40(f64v) + 51: 27(fvec2) Load 40(f64v) + 52: 27(fvec2) FDiv 51 50 + Store 40(f64v) 52 + 53: 27(fvec2) Load 40(f64v) + 55: 27(fvec2) CompositeConstruct 54 54 + 56: 27(fvec2) FAdd 53 55 + Store 40(f64v) 56 + 57: 27(fvec2) Load 40(f64v) + 58: 27(fvec2) CompositeConstruct 54 54 + 59: 27(fvec2) FSub 57 58 + Store 40(f64v) 59 + 63: 60 Load 62(f64m) + 64: 27(fvec2) CompositeConstruct 54 54 + 65: 27(fvec2) CompositeExtract 63 0 + 66: 27(fvec2) FAdd 65 64 + 67: 27(fvec2) CompositeExtract 63 1 + 68: 27(fvec2) FAdd 67 64 + 69: 60 CompositeConstruct 66 68 + Store 62(f64m) 69 + 70: 60 Load 62(f64m) + 71: 27(fvec2) CompositeConstruct 54 54 + 72: 27(fvec2) CompositeExtract 70 0 + 73: 27(fvec2) FSub 72 71 + 74: 27(fvec2) CompositeExtract 70 1 + 75: 27(fvec2) FSub 74 71 + 76: 60 CompositeConstruct 73 75 + Store 62(f64m) 76 + 77: 27(fvec2) Load 40(f64v) + 78: 27(fvec2) FNegate 77 + Store 40(f64v) 78 + 79: 60 Load 62(f64m) + 80: 27(fvec2) CompositeExtract 79 0 + 81: 27(fvec2) FNegate 80 + 82: 27(fvec2) CompositeExtract 79 1 + 83: 27(fvec2) FNegate 82 + 84: 60 CompositeConstruct 81 83 + Store 62(f64m) 84 + 86: 33(ptr) AccessChain 40(f64v) 32 + 87: 26(float) Load 86 + 89: 33(ptr) AccessChain 40(f64v) 88 + 90: 26(float) Load 89 + 91: 26(float) FAdd 87 90 + Store 85(f64) 91 + 92: 33(ptr) AccessChain 40(f64v) 32 + 93: 26(float) Load 92 + 94: 33(ptr) AccessChain 40(f64v) 88 + 95: 26(float) Load 94 + 96: 26(float) FSub 93 95 + Store 85(f64) 96 + 97: 33(ptr) AccessChain 40(f64v) 32 + 98: 26(float) Load 97 + 99: 33(ptr) AccessChain 40(f64v) 88 + 100: 26(float) Load 99 + 101: 26(float) FMul 98 100 + Store 85(f64) 101 + 102: 33(ptr) AccessChain 40(f64v) 32 + 103: 26(float) Load 102 + 104: 33(ptr) AccessChain 40(f64v) 88 + 105: 26(float) Load 104 + 106: 26(float) FDiv 103 105 + Store 85(f64) 106 + 110: 33(ptr) AccessChain 40(f64v) 32 + 111: 26(float) Load 110 + 112: 26(float) Load 85(f64) + 113: 107(bool) FOrdNotEqual 111 112 + Store 109(b) 113 + 114: 33(ptr) AccessChain 40(f64v) 88 + 115: 26(float) Load 114 + 116: 26(float) Load 85(f64) + 117: 107(bool) FOrdEqual 115 116 + Store 109(b) 117 + 118: 33(ptr) AccessChain 40(f64v) 32 + 119: 26(float) Load 118 + 120: 26(float) Load 85(f64) + 121: 107(bool) FOrdGreaterThan 119 120 + Store 109(b) 121 + 122: 33(ptr) AccessChain 40(f64v) 88 + 123: 26(float) Load 122 + 124: 26(float) Load 85(f64) + 125: 107(bool) FOrdLessThan 123 124 + Store 109(b) 125 + 126: 33(ptr) AccessChain 40(f64v) 32 + 127: 26(float) Load 126 + 128: 26(float) Load 85(f64) + 129: 107(bool) FOrdGreaterThanEqual 127 128 + Store 109(b) 129 + 130: 33(ptr) AccessChain 40(f64v) 88 + 131: 26(float) Load 130 + 132: 26(float) Load 85(f64) + 133: 107(bool) FOrdLessThanEqual 131 132 + Store 109(b) 133 + 134: 27(fvec2) Load 40(f64v) + 135: 26(float) Load 85(f64) + 136: 27(fvec2) VectorTimesScalar 134 135 + Store 40(f64v) 136 + 137: 60 Load 62(f64m) + 138: 26(float) Load 85(f64) + 139: 60 MatrixTimesScalar 137 138 + Store 62(f64m) 139 + 140: 60 Load 62(f64m) + 141: 27(fvec2) Load 40(f64v) + 142: 27(fvec2) MatrixTimesVector 140 141 + Store 40(f64v) 142 + 143: 27(fvec2) Load 40(f64v) + 144: 60 Load 62(f64m) + 145: 27(fvec2) VectorTimesMatrix 143 144 + Store 40(f64v) 145 + 146: 60 Load 62(f64m) + 147: 60 Load 62(f64m) + 148: 60 MatrixTimesMatrix 146 147 + Store 62(f64m) 148 + Return + FunctionEnd + 10(typeCast(): 2 Function None 3 + 11: Label + 151(f64v): 150(ptr) Variable Function + 154(bv): 153(ptr) Variable Function + 165(f16v): 164(ptr) Variable Function + 173(i8v): 172(ptr) Variable Function + 179(i16v): 178(ptr) Variable Function + 185(i32v): 184(ptr) Variable Function + 191(i64v): 190(ptr) Variable Function + 194(u8v): 172(ptr) Variable Function + 200(u16v): 199(ptr) Variable Function + 205(u32v): 204(ptr) Variable Function + 211(u64v): 210(ptr) Variable Function + 155: 152(bvec3) Load 154(bv) + 159: 149(fvec3) Select 155 158 157 + Store 151(f64v) 159 + 160: 149(fvec3) Load 151(f64v) + 161: 152(bvec3) FOrdNotEqual 160 157 + Store 154(bv) 161 + 166: 163(fvec3) Load 165(f16v) + 167: 149(fvec3) FConvert 166 + Store 151(f64v) 167 + 168: 149(fvec3) Load 151(f64v) + 169: 163(fvec3) FConvert 168 + Store 165(f16v) 169 + 174: 149(fvec3) Load 151(f64v) + 175: 171(ivec3) ConvertFToS 174 + Store 173(i8v) 175 + 180: 149(fvec3) Load 151(f64v) + 181: 177(ivec3) ConvertFToS 180 + Store 179(i16v) 181 + 186: 149(fvec3) Load 151(f64v) + 187: 183(ivec3) ConvertFToS 186 + Store 185(i32v) 187 + 192: 149(fvec3) Load 151(f64v) + 193: 189(ivec3) ConvertFToS 192 + Store 191(i64v) 193 + 195: 149(fvec3) Load 151(f64v) + 196: 171(ivec3) ConvertFToS 195 + Store 194(u8v) 196 + 201: 149(fvec3) Load 151(f64v) + 202: 198(ivec3) ConvertFToU 201 + Store 200(u16v) 202 + 206: 149(fvec3) Load 151(f64v) + 207: 203(ivec3) ConvertFToU 206 + Store 205(u32v) 207 + 212: 149(fvec3) Load 151(f64v) + 213: 209(ivec3) ConvertFToU 212 + Store 211(u64v) 213 + Return + FunctionEnd +12(builtinAngleTrigFuncs(): 2 Function None 3 + 13: Label + 216(f64v2): 215(ptr) Variable Function + 217(f64v1): 215(ptr) Variable Function + 218: 214(fvec4) Load 217(f64v1) + 219: 214(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 218 + Store 216(f64v2) 219 + 220: 214(fvec4) Load 217(f64v1) + 221: 214(fvec4) ExtInst 1(GLSL.std.450) 12(Degrees) 220 + Store 216(f64v2) 221 + 222: 214(fvec4) Load 217(f64v1) + 223: 214(fvec4) ExtInst 1(GLSL.std.450) 13(Sin) 222 + Store 216(f64v2) 223 + 224: 214(fvec4) Load 217(f64v1) + 225: 214(fvec4) ExtInst 1(GLSL.std.450) 14(Cos) 224 + Store 216(f64v2) 225 + 226: 214(fvec4) Load 217(f64v1) + 227: 214(fvec4) ExtInst 1(GLSL.std.450) 15(Tan) 226 + Store 216(f64v2) 227 + 228: 214(fvec4) Load 217(f64v1) + 229: 214(fvec4) ExtInst 1(GLSL.std.450) 16(Asin) 228 + Store 216(f64v2) 229 + 230: 214(fvec4) Load 217(f64v1) + 231: 214(fvec4) ExtInst 1(GLSL.std.450) 17(Acos) 230 + Store 216(f64v2) 231 + 232: 214(fvec4) Load 217(f64v1) + 233: 214(fvec4) Load 216(f64v2) + 234: 214(fvec4) ExtInst 1(GLSL.std.450) 25(Atan2) 232 233 + Store 216(f64v2) 234 + 235: 214(fvec4) Load 217(f64v1) + 236: 214(fvec4) ExtInst 1(GLSL.std.450) 18(Atan) 235 + Store 216(f64v2) 236 + 237: 214(fvec4) Load 217(f64v1) + 238: 214(fvec4) ExtInst 1(GLSL.std.450) 19(Sinh) 237 + Store 216(f64v2) 238 + 239: 214(fvec4) Load 217(f64v1) + 240: 214(fvec4) ExtInst 1(GLSL.std.450) 20(Cosh) 239 + Store 216(f64v2) 240 + 241: 214(fvec4) Load 217(f64v1) + 242: 214(fvec4) ExtInst 1(GLSL.std.450) 21(Tanh) 241 + Store 216(f64v2) 242 + 243: 214(fvec4) Load 217(f64v1) + 244: 214(fvec4) ExtInst 1(GLSL.std.450) 22(Asinh) 243 + Store 216(f64v2) 244 + 245: 214(fvec4) Load 217(f64v1) + 246: 214(fvec4) ExtInst 1(GLSL.std.450) 23(Acosh) 245 + Store 216(f64v2) 246 + 247: 214(fvec4) Load 217(f64v1) + 248: 214(fvec4) ExtInst 1(GLSL.std.450) 24(Atanh) 247 + Store 216(f64v2) 248 + Return + FunctionEnd +14(builtinExpFuncs(): 2 Function None 3 + 15: Label + 249(f64v2): 28(ptr) Variable Function + 250(f64v1): 28(ptr) Variable Function + 251: 27(fvec2) Load 250(f64v1) + 252: 27(fvec2) Load 249(f64v2) + 253: 27(fvec2) ExtInst 1(GLSL.std.450) 26(Pow) 251 252 + Store 249(f64v2) 253 + 254: 27(fvec2) Load 250(f64v1) + 255: 27(fvec2) ExtInst 1(GLSL.std.450) 27(Exp) 254 + Store 249(f64v2) 255 + 256: 27(fvec2) Load 250(f64v1) + 257: 27(fvec2) ExtInst 1(GLSL.std.450) 28(Log) 256 + Store 249(f64v2) 257 + 258: 27(fvec2) Load 250(f64v1) + 259: 27(fvec2) ExtInst 1(GLSL.std.450) 29(Exp2) 258 + Store 249(f64v2) 259 + 260: 27(fvec2) Load 250(f64v1) + 261: 27(fvec2) ExtInst 1(GLSL.std.450) 30(Log2) 260 + Store 249(f64v2) 261 + 262: 27(fvec2) Load 250(f64v1) + 263: 27(fvec2) ExtInst 1(GLSL.std.450) 31(Sqrt) 262 + Store 249(f64v2) 263 + 264: 27(fvec2) Load 250(f64v1) + 265: 27(fvec2) ExtInst 1(GLSL.std.450) 32(InverseSqrt) 264 + Store 249(f64v2) 265 + Return + FunctionEnd +16(builtinCommonFuncs(): 2 Function None 3 + 17: Label + 266(f64v2): 150(ptr) Variable Function + 267(f64v1): 150(ptr) Variable Function + 288(f64): 33(ptr) Variable Function + 292(f64v3): 150(ptr) Variable Function + 332(bv): 153(ptr) Variable Function + 353(b): 108(ptr) Variable Function + 363(iv): 184(ptr) Variable Function + 268: 149(fvec3) Load 267(f64v1) + 269: 149(fvec3) ExtInst 1(GLSL.std.450) 4(FAbs) 268 + Store 266(f64v2) 269 + 270: 149(fvec3) Load 267(f64v1) + 271: 149(fvec3) ExtInst 1(GLSL.std.450) 6(FSign) 270 + Store 266(f64v2) 271 + 272: 149(fvec3) Load 267(f64v1) + 273: 149(fvec3) ExtInst 1(GLSL.std.450) 8(Floor) 272 + Store 266(f64v2) 273 + 274: 149(fvec3) Load 267(f64v1) + 275: 149(fvec3) ExtInst 1(GLSL.std.450) 3(Trunc) 274 + Store 266(f64v2) 275 + 276: 149(fvec3) Load 267(f64v1) + 277: 149(fvec3) ExtInst 1(GLSL.std.450) 1(Round) 276 + Store 266(f64v2) 277 + 278: 149(fvec3) Load 267(f64v1) + 279: 149(fvec3) ExtInst 1(GLSL.std.450) 2(RoundEven) 278 + Store 266(f64v2) 279 + 280: 149(fvec3) Load 267(f64v1) + 281: 149(fvec3) ExtInst 1(GLSL.std.450) 9(Ceil) 280 + Store 266(f64v2) 281 + 282: 149(fvec3) Load 267(f64v1) + 283: 149(fvec3) ExtInst 1(GLSL.std.450) 10(Fract) 282 + Store 266(f64v2) 283 + 284: 149(fvec3) Load 267(f64v1) + 285: 149(fvec3) Load 266(f64v2) + 286: 149(fvec3) FMod 284 285 + Store 266(f64v2) 286 + 287: 149(fvec3) Load 267(f64v1) + 289: 26(float) Load 288(f64) + 290: 149(fvec3) CompositeConstruct 289 289 289 + 291: 149(fvec3) FMod 287 290 + Store 266(f64v2) 291 + 293: 149(fvec3) Load 267(f64v1) + 294: 149(fvec3) ExtInst 1(GLSL.std.450) 35(Modf) 293 266(f64v2) + Store 292(f64v3) 294 + 295: 149(fvec3) Load 267(f64v1) + 296: 149(fvec3) Load 266(f64v2) + 297: 149(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 295 296 + Store 292(f64v3) 297 + 298: 149(fvec3) Load 267(f64v1) + 299: 26(float) Load 288(f64) + 300: 149(fvec3) CompositeConstruct 299 299 299 + 301: 149(fvec3) ExtInst 1(GLSL.std.450) 37(FMin) 298 300 + Store 292(f64v3) 301 + 302: 149(fvec3) Load 267(f64v1) + 303: 149(fvec3) Load 266(f64v2) + 304: 149(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 302 303 + Store 292(f64v3) 304 + 305: 149(fvec3) Load 267(f64v1) + 306: 26(float) Load 288(f64) + 307: 149(fvec3) CompositeConstruct 306 306 306 + 308: 149(fvec3) ExtInst 1(GLSL.std.450) 40(FMax) 305 307 + Store 292(f64v3) 308 + 309: 149(fvec3) Load 267(f64v1) + 310: 26(float) Load 288(f64) + 311: 33(ptr) AccessChain 266(f64v2) 32 + 312: 26(float) Load 311 + 313: 149(fvec3) CompositeConstruct 310 310 310 + 314: 149(fvec3) CompositeConstruct 312 312 312 + 315: 149(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 309 313 314 + Store 292(f64v3) 315 + 316: 149(fvec3) Load 267(f64v1) + 317: 149(fvec3) Load 266(f64v2) + 318: 26(float) Load 288(f64) + 319: 149(fvec3) CompositeConstruct 318 318 318 + 320: 149(fvec3) ExtInst 1(GLSL.std.450) 43(FClamp) 316 317 319 + Store 292(f64v3) 320 + 321: 149(fvec3) Load 267(f64v1) + 322: 149(fvec3) Load 266(f64v2) + 323: 26(float) Load 288(f64) + 324: 149(fvec3) CompositeConstruct 323 323 323 + 325: 149(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 321 322 324 + Store 292(f64v3) 325 + 326: 149(fvec3) Load 267(f64v1) + 327: 149(fvec3) Load 266(f64v2) + 328: 149(fvec3) Load 292(f64v3) + 329: 149(fvec3) ExtInst 1(GLSL.std.450) 46(FMix) 326 327 328 + Store 292(f64v3) 329 + 330: 149(fvec3) Load 267(f64v1) + 331: 149(fvec3) Load 266(f64v2) + 333: 152(bvec3) Load 332(bv) + 334: 149(fvec3) Select 333 331 330 + Store 292(f64v3) 334 + 335: 149(fvec3) Load 267(f64v1) + 336: 149(fvec3) Load 266(f64v2) + 337: 149(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 335 336 + Store 292(f64v3) 337 + 338: 26(float) Load 288(f64) + 339: 149(fvec3) Load 292(f64v3) + 340: 149(fvec3) CompositeConstruct 338 338 338 + 341: 149(fvec3) ExtInst 1(GLSL.std.450) 48(Step) 340 339 + Store 292(f64v3) 341 + 342: 149(fvec3) Load 267(f64v1) + 343: 149(fvec3) Load 266(f64v2) + 344: 149(fvec3) Load 292(f64v3) + 345: 149(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 342 343 344 + Store 292(f64v3) 345 + 346: 26(float) Load 288(f64) + 347: 33(ptr) AccessChain 267(f64v1) 32 + 348: 26(float) Load 347 + 349: 149(fvec3) Load 266(f64v2) + 350: 149(fvec3) CompositeConstruct 346 346 346 + 351: 149(fvec3) CompositeConstruct 348 348 348 + 352: 149(fvec3) ExtInst 1(GLSL.std.450) 49(SmoothStep) 350 351 349 + Store 292(f64v3) 352 + 354: 26(float) Load 288(f64) + 355: 107(bool) IsNan 354 + Store 353(b) 355 + 356: 149(fvec3) Load 267(f64v1) + 357: 152(bvec3) IsInf 356 + Store 332(bv) 357 + 358: 149(fvec3) Load 267(f64v1) + 359: 149(fvec3) Load 266(f64v2) + 360: 149(fvec3) Load 292(f64v3) + 361: 149(fvec3) ExtInst 1(GLSL.std.450) 50(Fma) 358 359 360 + Store 292(f64v3) 361 + 362: 149(fvec3) Load 267(f64v1) + 365:364(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 362 + 366: 183(ivec3) CompositeExtract 365 1 + Store 363(iv) 366 + 367: 149(fvec3) CompositeExtract 365 0 + Store 266(f64v2) 367 + 368: 149(fvec3) Load 267(f64v1) + 369: 183(ivec3) Load 363(iv) + 370: 149(fvec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 368 369 + Store 266(f64v2) 370 + Return + FunctionEnd +18(builtinGeometryFuncs(): 2 Function None 3 + 19: Label + 371(f64): 33(ptr) Variable Function + 372(f64v1): 150(ptr) Variable Function + 376(f64v2): 150(ptr) Variable Function + 382(f64v3): 150(ptr) Variable Function + 373: 149(fvec3) Load 372(f64v1) + 374: 26(float) ExtInst 1(GLSL.std.450) 66(Length) 373 + Store 371(f64) 374 + 375: 149(fvec3) Load 372(f64v1) + 377: 149(fvec3) Load 376(f64v2) + 378: 26(float) ExtInst 1(GLSL.std.450) 67(Distance) 375 377 + Store 371(f64) 378 + 379: 149(fvec3) Load 372(f64v1) + 380: 149(fvec3) Load 376(f64v2) + 381: 26(float) Dot 379 380 + Store 371(f64) 381 + 383: 149(fvec3) Load 372(f64v1) + 384: 149(fvec3) Load 376(f64v2) + 385: 149(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 383 384 + Store 382(f64v3) 385 + 386: 149(fvec3) Load 372(f64v1) + 387: 149(fvec3) ExtInst 1(GLSL.std.450) 69(Normalize) 386 + Store 376(f64v2) 387 + 388: 149(fvec3) Load 372(f64v1) + 389: 149(fvec3) Load 376(f64v2) + 390: 149(fvec3) Load 382(f64v3) + 391: 149(fvec3) ExtInst 1(GLSL.std.450) 70(FaceForward) 388 389 390 + Store 382(f64v3) 391 + 392: 149(fvec3) Load 372(f64v1) + 393: 149(fvec3) Load 376(f64v2) + 394: 149(fvec3) ExtInst 1(GLSL.std.450) 71(Reflect) 392 393 + Store 382(f64v3) 394 + 395: 149(fvec3) Load 372(f64v1) + 396: 149(fvec3) Load 376(f64v2) + 397: 26(float) Load 371(f64) + 398: 149(fvec3) ExtInst 1(GLSL.std.450) 72(Refract) 395 396 397 + Store 382(f64v3) 398 + Return + FunctionEnd +20(builtinMatrixFuncs(): 2 Function None 3 + 21: Label + 401(f64m3): 400(ptr) Variable Function + 402(f64m1): 400(ptr) Variable Function + 404(f64m2): 400(ptr) Variable Function + 413(f64v1): 150(ptr) Variable Function + 415(f64v2): 28(ptr) Variable Function + 420(f64m4): 419(ptr) Variable Function + 423(f64): 33(ptr) Variable Function + 426(f64m5): 425(ptr) Variable Function + 431(f64m6): 430(ptr) Variable Function + 432(f64m7): 430(ptr) Variable Function + 403: 399 Load 402(f64m1) + 405: 399 Load 404(f64m2) + 406: 149(fvec3) CompositeExtract 403 0 + 407: 149(fvec3) CompositeExtract 405 0 + 408: 149(fvec3) FMul 406 407 + 409: 149(fvec3) CompositeExtract 403 1 + 410: 149(fvec3) CompositeExtract 405 1 + 411: 149(fvec3) FMul 409 410 + 412: 399 CompositeConstruct 408 411 + Store 401(f64m3) 412 + 414: 149(fvec3) Load 413(f64v1) + 416: 27(fvec2) Load 415(f64v2) + 417: 399 OuterProduct 414 416 + Store 402(f64m1) 417 + 421: 399 Load 402(f64m1) + 422: 418 Transpose 421 + Store 420(f64m4) 422 + 427: 424 Load 426(f64m5) + 428: 26(float) ExtInst 1(GLSL.std.450) 33(Determinant) 427 + Store 423(f64) 428 + 433: 429 Load 432(f64m7) + 434: 429 ExtInst 1(GLSL.std.450) 34(MatrixInverse) 433 + Store 431(f64m6) 434 + Return + FunctionEnd +22(builtinVecRelFuncs(): 2 Function None 3 + 23: Label + 435(bv): 153(ptr) Variable Function + 436(f64v1): 150(ptr) Variable Function + 438(f64v2): 150(ptr) Variable Function + 437: 149(fvec3) Load 436(f64v1) + 439: 149(fvec3) Load 438(f64v2) + 440: 152(bvec3) FOrdLessThan 437 439 + Store 435(bv) 440 + 441: 149(fvec3) Load 436(f64v1) + 442: 149(fvec3) Load 438(f64v2) + 443: 152(bvec3) FOrdLessThanEqual 441 442 + Store 435(bv) 443 + 444: 149(fvec3) Load 436(f64v1) + 445: 149(fvec3) Load 438(f64v2) + 446: 152(bvec3) FOrdGreaterThan 444 445 + Store 435(bv) 446 + 447: 149(fvec3) Load 436(f64v1) + 448: 149(fvec3) Load 438(f64v2) + 449: 152(bvec3) FOrdGreaterThanEqual 447 448 + Store 435(bv) 449 + 450: 149(fvec3) Load 436(f64v1) + 451: 149(fvec3) Load 438(f64v2) + 452: 152(bvec3) FOrdEqual 450 451 + Store 435(bv) 452 + 453: 149(fvec3) Load 436(f64v1) + 454: 149(fvec3) Load 438(f64v2) + 455: 152(bvec3) FOrdNotEqual 453 454 + Store 435(bv) 455 + Return + FunctionEnd +24(builtinFragProcFuncs(): 2 Function None 3 + 25: Label + 456(f64v): 150(ptr) Variable Function + 460: 459(ptr) AccessChain 458(if64v) 32 + 461: 26(float) Load 460 + 462: 26(float) DPdx 461 + 463: 33(ptr) AccessChain 456(f64v) 32 + Store 463 462 + 464: 459(ptr) AccessChain 458(if64v) 88 + 465: 26(float) Load 464 + 466: 26(float) DPdy 465 + 467: 33(ptr) AccessChain 456(f64v) 88 + Store 467 466 + 468: 149(fvec3) Load 458(if64v) + 469: 27(fvec2) VectorShuffle 468 468 0 1 + 470: 27(fvec2) DPdxFine 469 + 471: 149(fvec3) Load 456(f64v) + 472: 149(fvec3) VectorShuffle 471 470 3 4 2 + Store 456(f64v) 472 + 473: 149(fvec3) Load 458(if64v) + 474: 27(fvec2) VectorShuffle 473 473 0 1 + 475: 27(fvec2) DPdyFine 474 + 476: 149(fvec3) Load 456(f64v) + 477: 149(fvec3) VectorShuffle 476 475 3 4 2 + Store 456(f64v) 477 + 478: 149(fvec3) Load 458(if64v) + 479: 149(fvec3) DPdxCoarse 478 + Store 456(f64v) 479 + 480: 149(fvec3) Load 458(if64v) + 481: 149(fvec3) DPdxCoarse 480 + Store 456(f64v) 481 + 482: 459(ptr) AccessChain 458(if64v) 32 + 483: 26(float) Load 482 + 484: 26(float) Fwidth 483 + 485: 33(ptr) AccessChain 456(f64v) 32 + Store 485 484 + 486: 149(fvec3) Load 458(if64v) + 487: 27(fvec2) VectorShuffle 486 486 0 1 + 488: 27(fvec2) FwidthFine 487 + 489: 149(fvec3) Load 456(f64v) + 490: 149(fvec3) VectorShuffle 489 488 3 4 2 + Store 456(f64v) 490 + 491: 149(fvec3) Load 458(if64v) + 492: 149(fvec3) FwidthCoarse 491 + Store 456(f64v) 492 + 493: 459(ptr) AccessChain 458(if64v) 32 + 494: 26(float) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 493 + 495: 33(ptr) AccessChain 456(f64v) 32 + Store 495 494 + 497: 149(fvec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 458(if64v) 496 + 498: 27(fvec2) VectorShuffle 497 497 0 1 + 499: 149(fvec3) Load 456(f64v) + 500: 149(fvec3) VectorShuffle 499 498 3 4 2 + Store 456(f64v) 500 + 503: 149(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 458(if64v) 502 + Store 456(f64v) 503 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.flowControl.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.flowControl.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.flowControl.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.flowControl.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.flowControl.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 39 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.for-complex-condition.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.for-complex-condition.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.for-complex-condition.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.for-complex-condition.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.for-complex-condition.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 31 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.for-continue-break.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.for-continue-break.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.for-continue-break.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.for-continue-break.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.for-continue-break.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 45 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.forLoop.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.forLoop.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.forLoop.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.forLoop.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.forLoop.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 131 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.for-nobody.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.for-nobody.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.for-nobody.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.for-nobody.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.for-nobody.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 25 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.for-notest.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.for-notest.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.for-notest.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.for-notest.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.for-notest.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 20 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.for-simple.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.for-simple.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.for-simple.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.for-simple.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.for-simple.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 24 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.forwardFun.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.forwardFun.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.forwardFun.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.forwardFun.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.forwardFun.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 60 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.fullyCovered.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.fullyCovered.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.fullyCovered.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.fullyCovered.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.fullyCovered.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 18 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.functionCall.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.functionCall.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.functionCall.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.functionCall.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -4,7 +4,7 @@ WARNING: 0:5: varying deprecated in version 130; may be removed in future release // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 76 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.functionNestedOpaque.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.functionNestedOpaque.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.functionNestedOpaque.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.functionNestedOpaque.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.functionNestedOpaque.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 39 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.functionSemantics.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.functionSemantics.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.functionSemantics.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.functionSemantics.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.functionSemantics.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 156 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.GeometryShaderPassthrough.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.GeometryShaderPassthrough.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.GeometryShaderPassthrough.geom.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.GeometryShaderPassthrough.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.GeometryShaderPassthrough.geom // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 15 Capability Geometry @@ -11,7 +11,7 @@ EntryPoint Geometry 4 "main" 10 14 ExecutionMode 4 Triangles ExecutionMode 4 Invocations 1 - ExecutionMode 4 OutputVertices + ExecutionMode 4 OutputVertices 3 Source GLSL 450 SourceExtension "GL_NV_geometry_shader_passthrough" Name 4 "main" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.glFragColor.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.glFragColor.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.glFragColor.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.glFragColor.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.glFragColor.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 12 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.glsl.register.autoassign.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.glsl.register.autoassign.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.glsl.register.autoassign.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.glsl.register.autoassign.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.glsl.register.autoassign.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 142 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.glsl.register.noautoassign.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.glsl.register.noautoassign.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.glsl.register.noautoassign.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.glsl.register.noautoassign.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.glsl.register.noautoassign.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 142 Capability Shader @@ -41,19 +41,25 @@ Name 137 "FragColor" Name 141 "g_tTex_unused3" Decorate 17(g_tTex1) DescriptorSet 0 - Decorate 17(g_tTex1) Binding 11 + Decorate 17(g_tTex1) Binding 17 Decorate 21(g_sSamp1) DescriptorSet 0 Decorate 21(g_sSamp1) Binding 5 Decorate 27(g_tTex2) DescriptorSet 0 + Decorate 27(g_tTex2) Binding 18 Decorate 29(g_sSamp2) DescriptorSet 0 + Decorate 29(g_sSamp2) Binding 6 Decorate 39(g_tTex3) DescriptorSet 0 - Decorate 39(g_tTex3) Binding 13 + Decorate 39(g_tTex3) Binding 19 Decorate 46(g_sSamp3) DescriptorSet 0 Decorate 46(g_sSamp3) Binding 7 Decorate 64(g_tTex4) DescriptorSet 0 + Decorate 64(g_tTex4) Binding 20 Decorate 69(g_sSamp4) DescriptorSet 0 + Decorate 69(g_sSamp4) Binding 8 Decorate 84(g_tTex5) DescriptorSet 0 + Decorate 84(g_tTex5) Binding 21 Decorate 86(g_sSamp5) DescriptorSet 0 + Decorate 86(g_sSamp5) Binding 9 MemberDecorate 93(MyStruct_t) 0 Offset 0 MemberDecorate 93(MyStruct_t) 1 Offset 4 MemberDecorate 93(MyStruct_t) 2 Offset 16 @@ -65,13 +71,16 @@ Decorate 97 DescriptorSet 0 Decorate 97 Binding 19 Decorate 119(g_tTex_unused1) DescriptorSet 0 - Decorate 119(g_tTex_unused1) Binding 10 + Decorate 119(g_tTex_unused1) Binding 22 Decorate 121(g_sSamp_unused1) DescriptorSet 0 + Decorate 121(g_sSamp_unused1) Binding 10 Decorate 126(g_tTex_unused2) DescriptorSet 0 - Decorate 126(g_tTex_unused2) Binding 12 + Decorate 126(g_tTex_unused2) Binding 23 Decorate 128(g_sSamp_unused2) DescriptorSet 0 + Decorate 128(g_sSamp_unused2) Binding 11 Decorate 137(FragColor) Location 0 Decorate 141(g_tTex_unused3) DescriptorSet 0 + Decorate 141(g_tTex_unused3) Binding 24 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.hlslDebugInfo.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.hlslDebugInfo.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.hlslDebugInfo.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.hlslDebugInfo.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.hlslDebugInfo.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 19 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.hlslOffsets.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.hlslOffsets.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.hlslOffsets.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.hlslOffsets.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -18,7 +18,7 @@ 0:? 'anon@0' (layout( column_major std430) buffer block{layout( column_major std430) buffer highp float m0, layout( column_major std430) buffer highp 3-component vector of float m4, layout( column_major std430) buffer highp float m16, layout( column_major std430 offset=20) buffer highp 3-component vector of float m20, layout( column_major std430) buffer highp 3-component vector of float m32, layout( column_major std430) buffer highp 2-component vector of float m48, layout( column_major std430) buffer highp 2-component vector of float m56, layout( column_major std430) buffer highp float m64, layout( column_major std430) buffer highp 2-component vector of float m68, layout( column_major std430) buffer highp float m76, layout( column_major std430) buffer highp float m80, layout( column_major std430 offset=88) buffer highp 2-component vector of float m88, layout( column_major std430) buffer highp 2-component vector of float m96, layout( column_major std430) buffer 2-component vector of double m112}) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 14 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.image.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.image.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.image.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.image.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.image.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 376 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.imageLoadStoreLod.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.imageLoadStoreLod.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.imageLoadStoreLod.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.imageLoadStoreLod.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.imageLoadStoreLod.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 82 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.int16.amd.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.int16.amd.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.int16.amd.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.int16.amd.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,778 @@ +spv.int16.amd.frag +// Module Version 10000 +// Generated by (magic number): 80006 +// Id's are bound by 560 + + Capability Shader + Capability Float16 + Capability Float64 + Capability Int64 + Capability Int16 + Capability StorageUniform16 + Capability StorageInputOutput16 + Extension "SPV_AMD_gpu_shader_half_float" + Extension "SPV_AMD_gpu_shader_int16" + Extension "SPV_KHR_16bit_storage" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 519 521 + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + SourceExtension "GL_AMD_gpu_shader_half_float" + SourceExtension "GL_AMD_gpu_shader_int16" + SourceExtension "GL_ARB_gpu_shader_int64" + Name 4 "main" + Name 6 "literal(" + Name 8 "operators(" + Name 10 "typeCast(" + Name 12 "builtinFuncs(" + Name 16 "u16" + Name 25 "Uniforms" + MemberName 25(Uniforms) 0 "i" + Name 27 "" + Name 34 "indexable" + Name 45 "indexable" + Name 51 "u16v" + Name 57 "i16" + Name 70 "u16" + Name 127 "b" + Name 148 "u" + Name 159 "i" + Name 189 "i16v" + Name 192 "bv" + Name 200 "u16v" + Name 213 "iv" + Name 226 "uv" + Name 240 "fv" + Name 252 "dv" + Name 264 "f16v" + Name 276 "i64v" + Name 290 "u64v" + Name 305 "i16v" + Name 311 "i16" + Name 319 "u16v" + Name 321 "u16" + Name 393 "f16v" + Name 396 "exp" + Name 397 "ResType" + Name 418 "packi" + Name 423 "packu" + Name 432 "packi64" + Name 441 "packu64" + Name 450 "bv" + Name 515 "Block" + MemberName 515(Block) 0 "i16v" + MemberName 515(Block) 1 "u16" + Name 517 "block" + Name 519 "iu16v" + Name 521 "ii16" + Name 522 "si64" + Name 523 "su64" + Name 524 "si" + Name 525 "su" + Name 526 "sb" + Name 527 "si16" + Name 528 "su16" + MemberDecorate 25(Uniforms) 0 Offset 0 + Decorate 25(Uniforms) Block + Decorate 27 DescriptorSet 0 + Decorate 27 Binding 0 + MemberDecorate 515(Block) 0 Offset 0 + MemberDecorate 515(Block) 1 Offset 6 + Decorate 515(Block) Block + Decorate 517(block) DescriptorSet 0 + Decorate 517(block) Binding 1 + Decorate 519(iu16v) Flat + Decorate 519(iu16v) Location 0 + Decorate 521(ii16) Flat + Decorate 521(ii16) Location 1 + Decorate 522(si64) SpecId 100 + Decorate 523(su64) SpecId 101 + Decorate 524(si) SpecId 102 + Decorate 525(su) SpecId 103 + Decorate 526(sb) SpecId 104 + Decorate 527(si16) SpecId 105 + Decorate 528(su16) SpecId 106 + 2: TypeVoid + 3: TypeFunction 2 + 14: TypeInt 16 0 + 15: TypePointer Function 14(int) + 17: TypeInt 16 1 + 18: TypeInt 32 0 + 19: 18(int) Constant 3 + 20: TypeArray 17(int) 19 + 21: 17(int) Constant 273 + 22: 17(int) Constant 4294967294 + 23: 17(int) Constant 256 + 24: 20 ConstantComposite 21 22 23 + 25(Uniforms): TypeStruct 18(int) + 26: TypePointer Uniform 25(Uniforms) + 27: 26(ptr) Variable Uniform + 28: TypeInt 32 1 + 29: 28(int) Constant 0 + 30: TypePointer Uniform 18(int) + 33: TypePointer Function 20 + 35: TypePointer Function 17(int) + 39: TypeArray 14(int) 19 + 40: 14(int) Constant 65535 + 41: 39 ConstantComposite 40 40 40 + 44: TypePointer Function 39 + 49: TypeVector 14(int) 3 + 50: TypePointer Function 49(ivec3) + 53: 17(int) Constant 1 + 54: TypeVector 17(int) 3 + 111: 18(int) Constant 1 + 117: 18(int) Constant 2 + 125: TypeBool + 126: TypePointer Function 125(bool) + 128: 18(int) Constant 0 + 147: TypePointer Function 18(int) + 158: TypePointer Function 28(int) + 187: TypeVector 17(int) 2 + 188: TypePointer Function 187(ivec2) + 190: TypeVector 125(bool) 2 + 191: TypePointer Function 190(bvec2) + 194: 17(int) Constant 0 + 195: 187(ivec2) ConstantComposite 194 194 + 196: 187(ivec2) ConstantComposite 53 53 + 198: TypeVector 14(int) 2 + 199: TypePointer Function 198(ivec2) + 202: 14(int) Constant 0 + 203: 14(int) Constant 1 + 204: 198(ivec2) ConstantComposite 202 202 + 205: 198(ivec2) ConstantComposite 203 203 + 211: TypeVector 28(int) 2 + 212: TypePointer Function 211(ivec2) + 224: TypeVector 18(int) 2 + 225: TypePointer Function 224(ivec2) + 237: TypeFloat 32 + 238: TypeVector 237(float) 2 + 239: TypePointer Function 238(fvec2) + 249: TypeFloat 64 + 250: TypeVector 249(float) 2 + 251: TypePointer Function 250(fvec2) + 261: TypeFloat 16 + 262: TypeVector 261(float) 2 + 263: TypePointer Function 262(fvec2) + 273: TypeInt 64 1 + 274: TypeVector 273(int) 2 + 275: TypePointer Function 274(ivec2) + 287: TypeInt 64 0 + 288: TypeVector 287(int) 2 + 289: TypePointer Function 288(ivec2) + 316: 17(int) Constant 4294967295 + 317: 187(ivec2) ConstantComposite 316 316 + 326: 49(ivec3) ConstantComposite 202 202 202 + 368: 125(bool) ConstantTrue + 375: 125(bool) ConstantFalse + 376: 190(bvec2) ConstantComposite 375 375 + 388: TypeVector 125(bool) 3 + 389: 388(bvec3) ConstantComposite 375 375 375 + 391: TypeVector 261(float) 3 + 392: TypePointer Function 391(fvec3) + 395: TypePointer Function 54(ivec3) + 397(ResType): TypeStruct 391(fvec3) 54(ivec3) + 407: TypePointer Function 261(float) + 431: TypePointer Function 273(int) + 434: TypeVector 17(int) 4 + 440: TypePointer Function 287(int) + 443: TypeVector 14(int) 4 + 449: TypePointer Function 388(bvec3) + 515(Block): TypeStruct 54(ivec3) 14(int) + 516: TypePointer Uniform 515(Block) + 517(block): 516(ptr) Variable Uniform + 518: TypePointer Input 49(ivec3) + 519(iu16v): 518(ptr) Variable Input + 520: TypePointer Input 17(int) + 521(ii16): 520(ptr) Variable Input + 522(si64): 273(int) SpecConstant 4294967286 4294967295 + 523(su64): 287(int) SpecConstant 20 0 + 524(si): 28(int) SpecConstant 4294967291 + 525(su): 18(int) SpecConstant 4 + 526(sb): 125(bool) SpecConstantTrue + 527(si16): 17(int) SpecConstant 4294967291 + 528(su16): 14(int) SpecConstant 4 + 529: 125(bool) SpecConstantOp 171 527(si16) 202 + 530: 125(bool) SpecConstantOp 171 528(su16) 202 + 531: 17(int) SpecConstantOp 169 526(sb) 53 194 + 532: 14(int) SpecConstantOp 169 526(sb) 203 202 + 533: 28(int) SpecConstantOp 114 527(si16) + 534: 28(int) SpecConstantOp 113 528(su16) + 535: 28(int) SpecConstantOp 128 534 128 + 536: 17(int) SpecConstantOp 114 524(si) + 537: 17(int) SpecConstantOp 114 524(si) + 538: 14(int) SpecConstantOp 128 537 202 + 539: 28(int) SpecConstantOp 114 527(si16) + 540: 18(int) SpecConstantOp 128 539 128 + 541: 18(int) SpecConstantOp 113 528(su16) + 542: 17(int) SpecConstantOp 113 525(su) + 543: 17(int) SpecConstantOp 128 542 202 + 544: 14(int) SpecConstantOp 113 525(su) + 545: 273(int) SpecConstantOp 114 527(si16) + 546: 273(int) SpecConstantOp 113 528(su16) + 547: 287(int) Constant 0 0 + 548: 273(int) SpecConstantOp 128 546 547 + 549: 17(int) SpecConstantOp 114 522(si64) + 550: 17(int) SpecConstantOp 114 522(si64) + 551: 14(int) SpecConstantOp 128 550 202 + 552: 273(int) SpecConstantOp 114 527(si16) + 553: 287(int) SpecConstantOp 128 552 547 + 554: 287(int) SpecConstantOp 113 528(su16) + 555: 17(int) SpecConstantOp 113 523(su64) + 556: 17(int) SpecConstantOp 128 555 202 + 557: 14(int) SpecConstantOp 113 523(su64) + 558: 14(int) SpecConstantOp 128 527(si16) 202 + 559: 17(int) SpecConstantOp 128 528(su16) 202 + 4(main): 2 Function None 3 + 5: Label + 511: 2 FunctionCall 6(literal() + 512: 2 FunctionCall 8(operators() + 513: 2 FunctionCall 10(typeCast() + 514: 2 FunctionCall 12(builtinFuncs() + Return + FunctionEnd + 6(literal(): 2 Function None 3 + 7: Label + 16(u16): 15(ptr) Variable Function + 34(indexable): 33(ptr) Variable Function + 45(indexable): 44(ptr) Variable Function + 31: 30(ptr) AccessChain 27 29 + 32: 18(int) Load 31 + Store 34(indexable) 24 + 36: 35(ptr) AccessChain 34(indexable) 32 + 37: 17(int) Load 36 + 38: 14(int) Bitcast 37 + 42: 30(ptr) AccessChain 27 29 + 43: 18(int) Load 42 + Store 45(indexable) 41 + 46: 15(ptr) AccessChain 45(indexable) 43 + 47: 14(int) Load 46 + 48: 14(int) IAdd 38 47 + Store 16(u16) 48 + Return + FunctionEnd + 8(operators(): 2 Function None 3 + 9: Label + 51(u16v): 50(ptr) Variable Function + 57(i16): 35(ptr) Variable Function + 70(u16): 15(ptr) Variable Function + 127(b): 126(ptr) Variable Function + 148(u): 147(ptr) Variable Function + 159(i): 158(ptr) Variable Function + 52: 49(ivec3) Load 51(u16v) + 55: 54(ivec3) CompositeConstruct 53 53 53 + 56: 49(ivec3) IAdd 52 55 + Store 51(u16v) 56 + 58: 17(int) Load 57(i16) + 59: 17(int) ISub 58 53 + Store 57(i16) 59 + 60: 17(int) Load 57(i16) + 61: 17(int) IAdd 60 53 + Store 57(i16) 61 + 62: 49(ivec3) Load 51(u16v) + 63: 54(ivec3) CompositeConstruct 53 53 53 + 64: 49(ivec3) ISub 62 63 + Store 51(u16v) 64 + 65: 49(ivec3) Load 51(u16v) + 66: 49(ivec3) Not 65 + Store 51(u16v) 66 + 67: 17(int) Load 57(i16) + Store 57(i16) 67 + 68: 49(ivec3) Load 51(u16v) + 69: 49(ivec3) SNegate 68 + Store 51(u16v) 69 + 71: 17(int) Load 57(i16) + 72: 14(int) Bitcast 71 + 73: 14(int) Load 70(u16) + 74: 14(int) IAdd 73 72 + Store 70(u16) 74 + 75: 49(ivec3) Load 51(u16v) + 76: 49(ivec3) Load 51(u16v) + 77: 49(ivec3) ISub 76 75 + Store 51(u16v) 77 + 78: 17(int) Load 57(i16) + 79: 17(int) Load 57(i16) + 80: 17(int) IMul 79 78 + Store 57(i16) 80 + 81: 49(ivec3) Load 51(u16v) + 82: 49(ivec3) Load 51(u16v) + 83: 49(ivec3) UDiv 82 81 + Store 51(u16v) 83 + 84: 17(int) Load 57(i16) + 85: 14(int) Bitcast 84 + 86: 49(ivec3) Load 51(u16v) + 87: 49(ivec3) CompositeConstruct 85 85 85 + 88: 49(ivec3) UMod 86 87 + Store 51(u16v) 88 + 89: 49(ivec3) Load 51(u16v) + 90: 49(ivec3) Load 51(u16v) + 91: 49(ivec3) IAdd 89 90 + Store 51(u16v) 91 + 92: 17(int) Load 57(i16) + 93: 14(int) Bitcast 92 + 94: 14(int) Load 70(u16) + 95: 14(int) ISub 93 94 + Store 70(u16) 95 + 96: 49(ivec3) Load 51(u16v) + 97: 17(int) Load 57(i16) + 98: 14(int) Bitcast 97 + 99: 49(ivec3) CompositeConstruct 98 98 98 + 100: 49(ivec3) IMul 96 99 + Store 51(u16v) 100 + 101: 17(int) Load 57(i16) + 102: 17(int) Load 57(i16) + 103: 17(int) IMul 101 102 + Store 57(i16) 103 + 104: 17(int) Load 57(i16) + 105: 17(int) Load 57(i16) + 106: 17(int) SMod 104 105 + Store 57(i16) 106 + 107: 17(int) Load 57(i16) + 108: 49(ivec3) Load 51(u16v) + 109: 54(ivec3) CompositeConstruct 107 107 107 + 110: 49(ivec3) ShiftLeftLogical 108 109 + Store 51(u16v) 110 + 112: 15(ptr) AccessChain 51(u16v) 111 + 113: 14(int) Load 112 + 114: 17(int) Load 57(i16) + 115: 17(int) ShiftRightArithmetic 114 113 + Store 57(i16) 115 + 116: 17(int) Load 57(i16) + 118: 15(ptr) AccessChain 51(u16v) 117 + 119: 14(int) Load 118 + 120: 17(int) ShiftLeftLogical 116 119 + Store 57(i16) 120 + 121: 49(ivec3) Load 51(u16v) + 122: 17(int) Load 57(i16) + 123: 54(ivec3) CompositeConstruct 122 122 122 + 124: 49(ivec3) ShiftLeftLogical 121 123 + Store 51(u16v) 124 + 129: 15(ptr) AccessChain 51(u16v) 128 + 130: 14(int) Load 129 + 131: 17(int) Load 57(i16) + 132: 14(int) Bitcast 131 + 133: 125(bool) INotEqual 130 132 + Store 127(b) 133 + 134: 17(int) Load 57(i16) + 135: 14(int) Bitcast 134 + 136: 15(ptr) AccessChain 51(u16v) 128 + 137: 14(int) Load 136 + 138: 125(bool) IEqual 135 137 + Store 127(b) 138 + 139: 15(ptr) AccessChain 51(u16v) 128 + 140: 14(int) Load 139 + 141: 15(ptr) AccessChain 51(u16v) 111 + 142: 14(int) Load 141 + 143: 125(bool) UGreaterThan 140 142 + Store 127(b) 143 + 144: 17(int) Load 57(i16) + 145: 28(int) SConvert 144 + 146: 18(int) Bitcast 145 + 149: 18(int) Load 148(u) + 150: 125(bool) ULessThan 146 149 + Store 127(b) 150 + 151: 15(ptr) AccessChain 51(u16v) 111 + 152: 14(int) Load 151 + 153: 15(ptr) AccessChain 51(u16v) 128 + 154: 14(int) Load 153 + 155: 125(bool) UGreaterThanEqual 152 154 + Store 127(b) 155 + 156: 17(int) Load 57(i16) + 157: 28(int) SConvert 156 + 160: 28(int) Load 159(i) + 161: 125(bool) SLessThanEqual 157 160 + Store 127(b) 161 + 162: 17(int) Load 57(i16) + 163: 14(int) Bitcast 162 + 164: 49(ivec3) Load 51(u16v) + 165: 49(ivec3) CompositeConstruct 163 163 163 + 166: 49(ivec3) BitwiseOr 164 165 + Store 51(u16v) 166 + 167: 17(int) Load 57(i16) + 168: 14(int) Bitcast 167 + 169: 14(int) Load 70(u16) + 170: 14(int) BitwiseOr 168 169 + Store 70(u16) 170 + 171: 17(int) Load 57(i16) + 172: 17(int) Load 57(i16) + 173: 17(int) BitwiseAnd 172 171 + Store 57(i16) 173 + 174: 49(ivec3) Load 51(u16v) + 175: 49(ivec3) Load 51(u16v) + 176: 49(ivec3) BitwiseAnd 174 175 + Store 51(u16v) 176 + 177: 17(int) Load 57(i16) + 178: 14(int) Bitcast 177 + 179: 49(ivec3) Load 51(u16v) + 180: 49(ivec3) CompositeConstruct 178 178 178 + 181: 49(ivec3) BitwiseXor 179 180 + Store 51(u16v) 181 + 182: 49(ivec3) Load 51(u16v) + 183: 17(int) Load 57(i16) + 184: 14(int) Bitcast 183 + 185: 49(ivec3) CompositeConstruct 184 184 184 + 186: 49(ivec3) BitwiseXor 182 185 + Store 51(u16v) 186 + Return + FunctionEnd + 10(typeCast(): 2 Function None 3 + 11: Label + 189(i16v): 188(ptr) Variable Function + 192(bv): 191(ptr) Variable Function + 200(u16v): 199(ptr) Variable Function + 213(iv): 212(ptr) Variable Function + 226(uv): 225(ptr) Variable Function + 240(fv): 239(ptr) Variable Function + 252(dv): 251(ptr) Variable Function + 264(f16v): 263(ptr) Variable Function + 276(i64v): 275(ptr) Variable Function + 290(u64v): 289(ptr) Variable Function + 193: 190(bvec2) Load 192(bv) + 197: 187(ivec2) Select 193 196 195 + Store 189(i16v) 197 + 201: 190(bvec2) Load 192(bv) + 206: 198(ivec2) Select 201 205 204 + Store 200(u16v) 206 + 207: 187(ivec2) Load 189(i16v) + 208: 190(bvec2) INotEqual 207 204 + Store 192(bv) 208 + 209: 198(ivec2) Load 200(u16v) + 210: 190(bvec2) INotEqual 209 204 + Store 192(bv) 210 + 214: 211(ivec2) Load 213(iv) + 215: 187(ivec2) SConvert 214 + Store 189(i16v) 215 + 216: 211(ivec2) Load 213(iv) + 217: 187(ivec2) SConvert 216 + 218: 198(ivec2) Bitcast 217 + Store 200(u16v) 218 + 219: 187(ivec2) Load 189(i16v) + 220: 211(ivec2) SConvert 219 + Store 213(iv) 220 + 221: 198(ivec2) Load 200(u16v) + 222: 211(ivec2) UConvert 221 + 223: 211(ivec2) Bitcast 222 + Store 213(iv) 223 + 227: 224(ivec2) Load 226(uv) + 228: 187(ivec2) UConvert 227 + 229: 187(ivec2) Bitcast 228 + Store 189(i16v) 229 + 230: 224(ivec2) Load 226(uv) + 231: 198(ivec2) UConvert 230 + Store 200(u16v) 231 + 232: 187(ivec2) Load 189(i16v) + 233: 211(ivec2) SConvert 232 + 234: 224(ivec2) Bitcast 233 + Store 226(uv) 234 + 235: 198(ivec2) Load 200(u16v) + 236: 224(ivec2) UConvert 235 + Store 226(uv) 236 + 241: 238(fvec2) Load 240(fv) + 242: 187(ivec2) ConvertFToS 241 + Store 189(i16v) 242 + 243: 238(fvec2) Load 240(fv) + 244: 198(ivec2) ConvertFToU 243 + Store 200(u16v) 244 + 245: 187(ivec2) Load 189(i16v) + 246: 238(fvec2) ConvertSToF 245 + Store 240(fv) 246 + 247: 198(ivec2) Load 200(u16v) + 248: 238(fvec2) ConvertUToF 247 + Store 240(fv) 248 + 253: 250(fvec2) Load 252(dv) + 254: 187(ivec2) ConvertFToS 253 + Store 189(i16v) 254 + 255: 250(fvec2) Load 252(dv) + 256: 198(ivec2) ConvertFToU 255 + Store 200(u16v) 256 + 257: 187(ivec2) Load 189(i16v) + 258: 250(fvec2) ConvertSToF 257 + Store 252(dv) 258 + 259: 198(ivec2) Load 200(u16v) + 260: 250(fvec2) ConvertUToF 259 + Store 252(dv) 260 + 265: 262(fvec2) Load 264(f16v) + 266: 187(ivec2) ConvertFToS 265 + Store 189(i16v) 266 + 267: 262(fvec2) Load 264(f16v) + 268: 198(ivec2) ConvertFToU 267 + Store 200(u16v) 268 + 269: 187(ivec2) Load 189(i16v) + 270: 262(fvec2) ConvertSToF 269 + Store 264(f16v) 270 + 271: 198(ivec2) Load 200(u16v) + 272: 262(fvec2) ConvertUToF 271 + Store 264(f16v) 272 + 277: 274(ivec2) Load 276(i64v) + 278: 187(ivec2) SConvert 277 + Store 189(i16v) 278 + 279: 274(ivec2) Load 276(i64v) + 280: 187(ivec2) SConvert 279 + 281: 198(ivec2) Bitcast 280 + Store 200(u16v) 281 + 282: 187(ivec2) Load 189(i16v) + 283: 274(ivec2) SConvert 282 + Store 276(i64v) 283 + 284: 198(ivec2) Load 200(u16v) + 285: 274(ivec2) UConvert 284 + 286: 274(ivec2) Bitcast 285 + Store 276(i64v) 286 + 291: 288(ivec2) Load 290(u64v) + 292: 187(ivec2) UConvert 291 + 293: 187(ivec2) Bitcast 292 + Store 189(i16v) 293 + 294: 288(ivec2) Load 290(u64v) + 295: 198(ivec2) UConvert 294 + Store 200(u16v) 295 + 296: 187(ivec2) Load 189(i16v) + 297: 274(ivec2) SConvert 296 + 298: 288(ivec2) Bitcast 297 + Store 290(u64v) 298 + 299: 198(ivec2) Load 200(u16v) + 300: 288(ivec2) UConvert 299 + Store 290(u64v) 300 + 301: 198(ivec2) Load 200(u16v) + 302: 187(ivec2) Bitcast 301 + Store 189(i16v) 302 + 303: 187(ivec2) Load 189(i16v) + 304: 198(ivec2) Bitcast 303 + Store 200(u16v) 304 + Return + FunctionEnd +12(builtinFuncs(): 2 Function None 3 + 13: Label + 305(i16v): 188(ptr) Variable Function + 311(i16): 35(ptr) Variable Function + 319(u16v): 50(ptr) Variable Function + 321(u16): 15(ptr) Variable Function + 393(f16v): 392(ptr) Variable Function + 396(exp): 395(ptr) Variable Function + 418(packi): 158(ptr) Variable Function + 423(packu): 147(ptr) Variable Function + 432(packi64): 431(ptr) Variable Function + 441(packu64): 440(ptr) Variable Function + 450(bv): 449(ptr) Variable Function + 306: 187(ivec2) Load 305(i16v) + 307: 187(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 306 + Store 305(i16v) 307 + 308: 187(ivec2) Load 305(i16v) + 309: 187(ivec2) ExtInst 1(GLSL.std.450) 7(SSign) 308 + Store 305(i16v) 309 + 310: 187(ivec2) Load 305(i16v) + 312: 17(int) Load 311(i16) + 313: 187(ivec2) CompositeConstruct 312 312 + 314: 187(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 310 313 + Store 305(i16v) 314 + 315: 187(ivec2) Load 305(i16v) + 318: 187(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 315 317 + Store 305(i16v) 318 + 320: 49(ivec3) Load 319(u16v) + 322: 14(int) Load 321(u16) + 323: 49(ivec3) CompositeConstruct 322 322 322 + 324: 49(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 320 323 + Store 319(u16v) 324 + 325: 49(ivec3) Load 319(u16v) + 327: 49(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 325 326 + Store 319(u16v) 327 + 328: 187(ivec2) Load 305(i16v) + 329: 17(int) Load 311(i16) + 330: 187(ivec2) CompositeConstruct 329 329 + 331: 187(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 328 330 + Store 305(i16v) 331 + 332: 187(ivec2) Load 305(i16v) + 333: 187(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 332 317 + Store 305(i16v) 333 + 334: 49(ivec3) Load 319(u16v) + 335: 14(int) Load 321(u16) + 336: 49(ivec3) CompositeConstruct 335 335 335 + 337: 49(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 334 336 + Store 319(u16v) 337 + 338: 49(ivec3) Load 319(u16v) + 339: 49(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 338 326 + Store 319(u16v) 339 + 340: 187(ivec2) Load 305(i16v) + 341: 17(int) Load 311(i16) + 342: 17(int) SNegate 341 + 343: 17(int) Load 311(i16) + 344: 187(ivec2) CompositeConstruct 342 342 + 345: 187(ivec2) CompositeConstruct 343 343 + 346: 187(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 340 344 345 + Store 305(i16v) 346 + 347: 187(ivec2) Load 305(i16v) + 348: 187(ivec2) Load 305(i16v) + 349: 187(ivec2) SNegate 348 + 350: 187(ivec2) Load 305(i16v) + 351: 187(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 347 349 350 + Store 305(i16v) 351 + 352: 49(ivec3) Load 319(u16v) + 353: 14(int) Load 321(u16) + 354: 14(int) SNegate 353 + 355: 14(int) Load 321(u16) + 356: 49(ivec3) CompositeConstruct 354 354 354 + 357: 49(ivec3) CompositeConstruct 355 355 355 + 358: 49(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 352 356 357 + Store 319(u16v) 358 + 359: 49(ivec3) Load 319(u16v) + 360: 49(ivec3) Load 319(u16v) + 361: 49(ivec3) SNegate 360 + 362: 49(ivec3) Load 319(u16v) + 363: 49(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 359 361 362 + Store 319(u16v) 363 + 364: 35(ptr) AccessChain 305(i16v) 128 + 365: 17(int) Load 364 + 366: 35(ptr) AccessChain 305(i16v) 111 + 367: 17(int) Load 366 + 369: 17(int) Select 368 367 365 + Store 311(i16) 369 + 370: 17(int) Load 311(i16) + 371: 187(ivec2) CompositeConstruct 370 370 + 372: 17(int) Load 311(i16) + 373: 17(int) SNegate 372 + 374: 187(ivec2) CompositeConstruct 373 373 + 377: 187(ivec2) Select 376 374 371 + Store 305(i16v) 377 + 378: 15(ptr) AccessChain 319(u16v) 128 + 379: 14(int) Load 378 + 380: 15(ptr) AccessChain 319(u16v) 111 + 381: 14(int) Load 380 + 382: 14(int) Select 368 381 379 + Store 321(u16) 382 + 383: 14(int) Load 321(u16) + 384: 49(ivec3) CompositeConstruct 383 383 383 + 385: 14(int) Load 321(u16) + 386: 14(int) SNegate 385 + 387: 49(ivec3) CompositeConstruct 386 386 386 + 390: 49(ivec3) Select 389 387 384 + Store 319(u16v) 390 + 394: 391(fvec3) Load 393(f16v) + 398:397(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 394 + 399: 54(ivec3) CompositeExtract 398 1 + Store 396(exp) 399 + 400: 391(fvec3) CompositeExtract 398 0 + Store 393(f16v) 400 + 401: 391(fvec3) Load 393(f16v) + 402: 54(ivec3) Load 396(exp) + 403: 391(fvec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 401 402 + Store 393(f16v) 403 + 404: 391(fvec3) Load 393(f16v) + 405: 262(fvec2) VectorShuffle 404 404 0 1 + 406: 187(ivec2) Bitcast 405 + Store 305(i16v) 406 + 408: 407(ptr) AccessChain 393(f16v) 117 + 409: 261(float) Load 408 + 410: 14(int) Bitcast 409 + 411: 15(ptr) AccessChain 319(u16v) 128 + Store 411 410 + 412: 187(ivec2) Load 305(i16v) + 413: 262(fvec2) Bitcast 412 + 414: 391(fvec3) Load 393(f16v) + 415: 391(fvec3) VectorShuffle 414 413 3 4 2 + Store 393(f16v) 415 + 416: 49(ivec3) Load 319(u16v) + 417: 391(fvec3) Bitcast 416 + Store 393(f16v) 417 + 419: 187(ivec2) Load 305(i16v) + 420: 28(int) Bitcast 419 + Store 418(packi) 420 + 421: 28(int) Load 418(packi) + 422: 187(ivec2) Bitcast 421 + Store 305(i16v) 422 + 424: 49(ivec3) Load 319(u16v) + 425: 198(ivec2) VectorShuffle 424 424 0 1 + 426: 18(int) Bitcast 425 + Store 423(packu) 426 + 427: 18(int) Load 423(packu) + 428: 198(ivec2) Bitcast 427 + 429: 49(ivec3) Load 319(u16v) + 430: 49(ivec3) VectorShuffle 429 428 3 4 2 + Store 319(u16v) 430 + 433: 17(int) Load 311(i16) + 435: 434(ivec4) CompositeConstruct 433 433 433 433 + 436: 273(int) Bitcast 435 + Store 432(packi64) 436 + 437: 273(int) Load 432(packi64) + 438: 434(ivec4) Bitcast 437 + 439: 187(ivec2) VectorShuffle 438 438 0 1 + Store 305(i16v) 439 + 442: 14(int) Load 321(u16) + 444: 443(ivec4) CompositeConstruct 442 442 442 442 + 445: 287(int) Bitcast 444 + Store 441(packu64) 445 + 446: 287(int) Load 441(packu64) + 447: 443(ivec4) Bitcast 446 + 448: 49(ivec3) VectorShuffle 447 447 0 1 2 + Store 319(u16v) 448 + 451: 49(ivec3) Load 319(u16v) + 452: 14(int) Load 321(u16) + 453: 49(ivec3) CompositeConstruct 452 452 452 + 454: 388(bvec3) ULessThan 451 453 + Store 450(bv) 454 + 455: 187(ivec2) Load 305(i16v) + 456: 17(int) Load 311(i16) + 457: 187(ivec2) CompositeConstruct 456 456 + 458: 190(bvec2) SLessThan 455 457 + 459: 388(bvec3) Load 450(bv) + 460: 388(bvec3) VectorShuffle 459 458 3 4 2 + Store 450(bv) 460 + 461: 49(ivec3) Load 319(u16v) + 462: 14(int) Load 321(u16) + 463: 49(ivec3) CompositeConstruct 462 462 462 + 464: 388(bvec3) ULessThanEqual 461 463 + Store 450(bv) 464 + 465: 187(ivec2) Load 305(i16v) + 466: 17(int) Load 311(i16) + 467: 187(ivec2) CompositeConstruct 466 466 + 468: 190(bvec2) SLessThanEqual 465 467 + 469: 388(bvec3) Load 450(bv) + 470: 388(bvec3) VectorShuffle 469 468 3 4 2 + Store 450(bv) 470 + 471: 49(ivec3) Load 319(u16v) + 472: 14(int) Load 321(u16) + 473: 49(ivec3) CompositeConstruct 472 472 472 + 474: 388(bvec3) UGreaterThan 471 473 + Store 450(bv) 474 + 475: 187(ivec2) Load 305(i16v) + 476: 17(int) Load 311(i16) + 477: 187(ivec2) CompositeConstruct 476 476 + 478: 190(bvec2) SGreaterThan 475 477 + 479: 388(bvec3) Load 450(bv) + 480: 388(bvec3) VectorShuffle 479 478 3 4 2 + Store 450(bv) 480 + 481: 49(ivec3) Load 319(u16v) + 482: 14(int) Load 321(u16) + 483: 49(ivec3) CompositeConstruct 482 482 482 + 484: 388(bvec3) UGreaterThanEqual 481 483 + Store 450(bv) 484 + 485: 187(ivec2) Load 305(i16v) + 486: 17(int) Load 311(i16) + 487: 187(ivec2) CompositeConstruct 486 486 + 488: 190(bvec2) SGreaterThanEqual 485 487 + 489: 388(bvec3) Load 450(bv) + 490: 388(bvec3) VectorShuffle 489 488 3 4 2 + Store 450(bv) 490 + 491: 49(ivec3) Load 319(u16v) + 492: 14(int) Load 321(u16) + 493: 49(ivec3) CompositeConstruct 492 492 492 + 494: 388(bvec3) IEqual 491 493 + Store 450(bv) 494 + 495: 187(ivec2) Load 305(i16v) + 496: 17(int) Load 311(i16) + 497: 187(ivec2) CompositeConstruct 496 496 + 498: 190(bvec2) IEqual 495 497 + 499: 388(bvec3) Load 450(bv) + 500: 388(bvec3) VectorShuffle 499 498 3 4 2 + Store 450(bv) 500 + 501: 49(ivec3) Load 319(u16v) + 502: 14(int) Load 321(u16) + 503: 49(ivec3) CompositeConstruct 502 502 502 + 504: 388(bvec3) INotEqual 501 503 + Store 450(bv) 504 + 505: 187(ivec2) Load 305(i16v) + 506: 17(int) Load 311(i16) + 507: 187(ivec2) CompositeConstruct 506 506 + 508: 190(bvec2) INotEqual 505 507 + 509: 388(bvec3) Load 450(bv) + 510: 388(bvec3) VectorShuffle 509 508 3 4 2 + Store 450(bv) 510 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.int16.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.int16.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.int16.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.int16.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,779 +1,744 @@ spv.int16.frag // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 561 +// Generated by (magic number): 80006 +// Id's are bound by 523 Capability Shader Capability Float16 Capability Float64 Capability Int64 Capability Int16 + Capability Int8 Capability StorageUniform16 - Capability StorageInputOutput16 Extension "SPV_AMD_gpu_shader_half_float" Extension "SPV_AMD_gpu_shader_int16" Extension "SPV_KHR_16bit_storage" 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 520 522 + EntryPoint Fragment 4 "main" ExecutionMode 4 OriginUpperLeft Source GLSL 450 - SourceExtension "GL_AMD_gpu_shader_half_float" - SourceExtension "GL_AMD_gpu_shader_int16" - SourceExtension "GL_ARB_gpu_shader_int64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int8" Name 4 "main" Name 6 "literal(" - Name 8 "operators(" - Name 10 "typeCast(" + Name 8 "typeCast16(" + Name 10 "operators(" Name 12 "builtinFuncs(" - Name 16 "u16" - Name 25 "Uniforms" - MemberName 25(Uniforms) 0 "i" - Name 27 "" - Name 34 "indexable" - Name 45 "indexable" - Name 51 "u16v" - Name 57 "i16" - Name 70 "u16" - Name 108 "i" - Name 130 "b" - Name 151 "u" - Name 190 "i16v" - Name 193 "bv" - Name 201 "u16v" - Name 214 "iv" + Name 16 "i16" + Name 24 "Uniforms" + MemberName 24(Uniforms) 0 "index" + Name 26 "" + Name 33 "indexable" + Name 38 "u16" + Name 46 "indexable" + Name 51 "i32v" + Name 54 "i16v" + Name 59 "u16v" + Name 67 "u32v" + Name 74 "i64v" + Name 80 "u64v" + Name 94 "f16v" + Name 100 "f32v" + Name 106 "f64v" + Name 154 "i8v" + Name 163 "u8v" + Name 176 "bv" + Name 195 "u16v" + Name 200 "i16" + Name 220 "i" Name 227 "uv" - Name 241 "fv" - Name 253 "dv" - Name 265 "f16v" - Name 277 "i64v" - Name 291 "u64v" - Name 306 "i16v" - Name 312 "i16" - Name 320 "u16v" - Name 322 "u16" - Name 394 "f16v" - Name 397 "exp" - Name 398 "ResType" - Name 419 "packi" - Name 424 "packu" - Name 433 "packi64" - Name 442 "packu64" - Name 451 "bv" - Name 516 "Block" - MemberName 516(Block) 0 "i16v" - MemberName 516(Block) 1 "u16" - Name 518 "block" - Name 520 "iu16v" - Name 522 "ii16" - Name 523 "si64" - Name 524 "su64" - Name 525 "si" - Name 526 "su" - Name 527 "sb" - Name 528 "si16" - Name 529 "su16" - MemberDecorate 25(Uniforms) 0 Offset 0 - Decorate 25(Uniforms) Block - Decorate 27 DescriptorSet 0 - Decorate 27 Binding 0 - MemberDecorate 516(Block) 0 Offset 0 - MemberDecorate 516(Block) 1 Offset 6 - Decorate 516(Block) Block - Decorate 518(block) DescriptorSet 0 - Decorate 518(block) Binding 1 - Decorate 520(iu16v) Flat - Decorate 520(iu16v) Location 0 - Decorate 522(ii16) Flat - Decorate 522(ii16) Location 1 - Decorate 523(si64) SpecId 100 - Decorate 524(su64) SpecId 101 - Decorate 525(si) SpecId 102 - Decorate 526(su) SpecId 103 - Decorate 527(sb) SpecId 104 - Decorate 528(si16) SpecId 105 - Decorate 529(su16) SpecId 106 + Name 243 "i64" + Name 281 "b" + Name 343 "i16v" + Name 346 "i16" + Name 356 "u16v" + Name 358 "u16" + Name 428 "i32" + Name 431 "i64" + Name 434 "i16v4" + Name 437 "u32" + Name 438 "u16v2" + Name 442 "u64" + Name 445 "u16v4" + Name 457 "bv" + Name 518 "Block" + MemberName 518(Block) 0 "i16" + MemberName 518(Block) 1 "i16v2" + MemberName 518(Block) 2 "i16v3" + MemberName 518(Block) 3 "i16v4" + MemberName 518(Block) 4 "u16" + MemberName 518(Block) 5 "u16v2" + MemberName 518(Block) 6 "u16v3" + MemberName 518(Block) 7 "u16v4" + Name 520 "block" + Name 521 "si16" + Name 522 "su16" + MemberDecorate 24(Uniforms) 0 Offset 0 + Decorate 24(Uniforms) Block + Decorate 26 DescriptorSet 0 + Decorate 26 Binding 0 + MemberDecorate 518(Block) 0 Offset 0 + MemberDecorate 518(Block) 1 Offset 4 + MemberDecorate 518(Block) 2 Offset 8 + MemberDecorate 518(Block) 3 Offset 16 + MemberDecorate 518(Block) 4 Offset 24 + MemberDecorate 518(Block) 5 Offset 28 + MemberDecorate 518(Block) 6 Offset 32 + MemberDecorate 518(Block) 7 Offset 40 + Decorate 518(Block) Block + Decorate 520(block) DescriptorSet 0 + Decorate 520(block) Binding 1 + Decorate 521(si16) SpecId 100 + Decorate 522(su16) SpecId 101 2: TypeVoid 3: TypeFunction 2 - 14: TypeInt 16 0 + 14: TypeInt 16 1 15: TypePointer Function 14(int) - 17: TypeInt 16 1 - 18: TypeInt 32 0 - 19: 18(int) Constant 3 - 20: TypeArray 17(int) 19 - 21: 17(int) Constant 273 - 22: 17(int) Constant 65534 - 23: 17(int) Constant 256 - 24: 20 ConstantComposite 21 22 23 - 25(Uniforms): TypeStruct 18(int) - 26: TypePointer Uniform 25(Uniforms) - 27: 26(ptr) Variable Uniform - 28: TypeInt 32 1 - 29: 28(int) Constant 0 - 30: TypePointer Uniform 18(int) - 33: TypePointer Function 20 - 35: TypePointer Function 17(int) - 39: TypeArray 14(int) 19 - 40: 14(int) Constant 65535 - 41: 39 ConstantComposite 40 40 40 - 44: TypePointer Function 39 - 49: TypeVector 14(int) 3 - 50: TypePointer Function 49(ivec3) - 53: 17(int) Constant 1 - 54: TypeVector 17(int) 3 - 107: TypePointer Function 28(int) - 111: TypeVector 28(int) 3 - 114: 18(int) Constant 1 - 120: 18(int) Constant 2 - 128: TypeBool - 129: TypePointer Function 128(bool) - 131: 18(int) Constant 0 - 150: TypePointer Function 18(int) - 188: TypeVector 17(int) 2 - 189: TypePointer Function 188(ivec2) - 191: TypeVector 128(bool) 2 - 192: TypePointer Function 191(bvec2) - 195: 17(int) Constant 0 - 196: 188(ivec2) ConstantComposite 195 195 - 197: 188(ivec2) ConstantComposite 53 53 - 199: TypeVector 14(int) 2 - 200: TypePointer Function 199(ivec2) - 203: 14(int) Constant 0 - 204: 14(int) Constant 1 - 205: 199(ivec2) ConstantComposite 203 203 - 206: 199(ivec2) ConstantComposite 204 204 - 212: TypeVector 28(int) 2 - 213: TypePointer Function 212(ivec2) - 223: TypeVector 18(int) 2 - 226: TypePointer Function 223(ivec2) - 238: TypeFloat 32 - 239: TypeVector 238(float) 2 - 240: TypePointer Function 239(fvec2) - 250: TypeFloat 64 - 251: TypeVector 250(float) 2 - 252: TypePointer Function 251(fvec2) - 262: TypeFloat 16 - 263: TypeVector 262(float) 2 - 264: TypePointer Function 263(fvec2) - 274: TypeInt 64 1 - 275: TypeVector 274(int) 2 - 276: TypePointer Function 275(ivec2) - 286: TypeInt 64 0 - 287: TypeVector 286(int) 2 - 290: TypePointer Function 287(ivec2) - 317: 17(int) Constant 65535 - 318: 188(ivec2) ConstantComposite 317 317 - 327: 49(ivec3) ConstantComposite 203 203 203 - 369: 128(bool) ConstantTrue - 376: 128(bool) ConstantFalse - 377: 191(bvec2) ConstantComposite 376 376 - 389: TypeVector 128(bool) 3 - 390: 389(bvec3) ConstantComposite 376 376 376 - 392: TypeVector 262(float) 3 - 393: TypePointer Function 392(fvec3) - 396: TypePointer Function 54(ivec3) - 398(ResType): TypeStruct 392(fvec3) 54(ivec3) - 408: TypePointer Function 262(float) - 432: TypePointer Function 274(int) - 435: TypeVector 17(int) 4 - 441: TypePointer Function 286(int) - 444: TypeVector 14(int) 4 - 450: TypePointer Function 389(bvec3) - 516(Block): TypeStruct 54(ivec3) 14(int) - 517: TypePointer Uniform 516(Block) - 518(block): 517(ptr) Variable Uniform - 519: TypePointer Input 49(ivec3) - 520(iu16v): 519(ptr) Variable Input - 521: TypePointer Input 17(int) - 522(ii16): 521(ptr) Variable Input - 523(si64): 274(int) SpecConstant 4294967286 4294967295 - 524(su64): 286(int) SpecConstant 20 0 - 525(si): 28(int) SpecConstant 4294967291 - 526(su): 18(int) SpecConstant 4 - 527(sb): 128(bool) SpecConstantTrue - 528(si16): 17(int) SpecConstant 65531 - 529(su16): 14(int) SpecConstant 4 - 530: 128(bool) SpecConstantOp 171 528(si16) 203 - 531: 128(bool) SpecConstantOp 171 529(su16) 203 - 532: 17(int) SpecConstantOp 169 527(sb) 53 195 - 533: 14(int) SpecConstantOp 169 527(sb) 204 203 - 534: 28(int) SpecConstantOp 114 528(si16) - 535: 18(int) SpecConstantOp 113 529(su16) - 536: 28(int) SpecConstantOp 128 535 131 - 537: 17(int) SpecConstantOp 114 525(si) - 538: 17(int) SpecConstantOp 114 525(si) - 539: 14(int) SpecConstantOp 128 538 203 - 540: 28(int) SpecConstantOp 114 528(si16) - 541: 18(int) SpecConstantOp 128 540 131 - 542: 18(int) SpecConstantOp 113 529(su16) - 543: 14(int) SpecConstantOp 113 526(su) - 544: 17(int) SpecConstantOp 128 543 203 - 545: 14(int) SpecConstantOp 113 526(su) - 546: 274(int) SpecConstantOp 114 528(si16) - 547: 286(int) SpecConstantOp 113 529(su16) - 548: 286(int) Constant 0 0 - 549: 274(int) SpecConstantOp 128 547 548 - 550: 17(int) SpecConstantOp 114 523(si64) - 551: 17(int) SpecConstantOp 114 523(si64) - 552: 14(int) SpecConstantOp 128 551 203 - 553: 274(int) SpecConstantOp 114 528(si16) - 554: 286(int) SpecConstantOp 128 553 548 - 555: 286(int) SpecConstantOp 113 529(su16) - 556: 14(int) SpecConstantOp 113 524(su64) - 557: 17(int) SpecConstantOp 128 556 203 - 558: 14(int) SpecConstantOp 113 524(su64) - 559: 14(int) SpecConstantOp 128 528(si16) 203 - 560: 17(int) SpecConstantOp 128 529(su16) 203 + 17: TypeInt 32 0 + 18: 17(int) Constant 3 + 19: TypeArray 14(int) 18 + 20: 14(int) Constant 4294962927 + 21: 14(int) Constant 4294967295 + 22: 14(int) Constant 16384 + 23: 19 ConstantComposite 20 21 22 + 24(Uniforms): TypeStruct 17(int) + 25: TypePointer Uniform 24(Uniforms) + 26: 25(ptr) Variable Uniform + 27: TypeInt 32 1 + 28: 27(int) Constant 0 + 29: TypePointer Uniform 17(int) + 32: TypePointer Function 19 + 36: TypeInt 16 0 + 37: TypePointer Function 36(int) + 39: TypeArray 36(int) 18 + 40: 36(int) Constant 65535 + 41: 36(int) Constant 32767 + 42: 39 ConstantComposite 40 40 41 + 45: TypePointer Function 39 + 49: TypeVector 27(int) 2 + 50: TypePointer Function 49(ivec2) + 52: TypeVector 14(int) 2 + 53: TypePointer Function 52(ivec2) + 57: TypeVector 36(int) 2 + 58: TypePointer Function 57(ivec2) + 65: TypeVector 17(int) 2 + 66: TypePointer Function 65(ivec2) + 71: TypeInt 64 1 + 72: TypeVector 71(int) 2 + 73: TypePointer Function 72(ivec2) + 77: TypeInt 64 0 + 78: TypeVector 77(int) 2 + 79: TypePointer Function 78(ivec2) + 91: TypeFloat 16 + 92: TypeVector 91(float) 2 + 93: TypePointer Function 92(fvec2) + 97: TypeFloat 32 + 98: TypeVector 97(float) 2 + 99: TypePointer Function 98(fvec2) + 103: TypeFloat 64 + 104: TypeVector 103(float) 2 + 105: TypePointer Function 104(fvec2) + 151: TypeInt 8 1 + 152: TypeVector 151(int) 2 + 153: TypePointer Function 152(ivec2) + 160: TypeInt 8 0 + 161: TypeVector 160(int) 2 + 162: TypePointer Function 161(ivec2) + 173: TypeBool + 174: TypeVector 173(bool) 2 + 175: TypePointer Function 174(bvec2) + 178: 14(int) Constant 0 + 179: 14(int) Constant 1 + 180: 52(ivec2) ConstantComposite 178 178 + 181: 52(ivec2) ConstantComposite 179 179 + 184: 36(int) Constant 0 + 185: 36(int) Constant 1 + 186: 57(ivec2) ConstantComposite 184 184 + 187: 57(ivec2) ConstantComposite 185 185 + 193: TypeVector 36(int) 3 + 194: TypePointer Function 193(ivec3) + 197: TypeVector 14(int) 3 + 219: TypePointer Function 27(int) + 225: TypeVector 17(int) 3 + 226: TypePointer Function 225(ivec3) + 242: TypePointer Function 71(int) + 264: 17(int) Constant 1 + 270: 17(int) Constant 2 + 276: TypeVector 27(int) 3 + 280: TypePointer Function 173(bool) + 282: 17(int) Constant 0 + 296: TypePointer Function 17(int) + 354: 52(ivec2) ConstantComposite 21 21 + 363: 193(ivec3) ConstantComposite 184 184 184 + 405: 173(bool) ConstantTrue + 412: 173(bool) ConstantFalse + 413: 174(bvec2) ConstantComposite 412 412 + 425: TypeVector 173(bool) 3 + 426: 425(bvec3) ConstantComposite 412 412 412 + 432: TypeVector 14(int) 4 + 433: TypePointer Function 432(ivec4) + 441: TypePointer Function 77(int) + 443: TypeVector 36(int) 4 + 444: TypePointer Function 443(ivec4) + 456: TypePointer Function 425(bvec3) + 518(Block): TypeStruct 14(int) 52(ivec2) 197(ivec3) 432(ivec4) 36(int) 57(ivec2) 193(ivec3) 443(ivec4) + 519: TypePointer Uniform 518(Block) + 520(block): 519(ptr) Variable Uniform + 521(si16): 14(int) SpecConstant 4294967286 + 522(su16): 36(int) SpecConstant 20 4(main): 2 Function None 3 5: Label - 512: 2 FunctionCall 6(literal() - 513: 2 FunctionCall 8(operators() - 514: 2 FunctionCall 10(typeCast() - 515: 2 FunctionCall 12(builtinFuncs() Return FunctionEnd 6(literal(): 2 Function None 3 7: Label - 16(u16): 15(ptr) Variable Function - 34(indexable): 33(ptr) Variable Function - 45(indexable): 44(ptr) Variable Function - 31: 30(ptr) AccessChain 27 29 - 32: 18(int) Load 31 - Store 34(indexable) 24 - 36: 35(ptr) AccessChain 34(indexable) 32 - 37: 17(int) Load 36 - 38: 14(int) Bitcast 37 - 42: 30(ptr) AccessChain 27 29 - 43: 18(int) Load 42 - Store 45(indexable) 41 - 46: 15(ptr) AccessChain 45(indexable) 43 - 47: 14(int) Load 46 - 48: 14(int) IAdd 38 47 - Store 16(u16) 48 + 16(i16): 15(ptr) Variable Function + 33(indexable): 32(ptr) Variable Function + 38(u16): 37(ptr) Variable Function + 46(indexable): 45(ptr) Variable Function + 30: 29(ptr) AccessChain 26 28 + 31: 17(int) Load 30 + Store 33(indexable) 23 + 34: 15(ptr) AccessChain 33(indexable) 31 + 35: 14(int) Load 34 + Store 16(i16) 35 + 43: 29(ptr) AccessChain 26 28 + 44: 17(int) Load 43 + Store 46(indexable) 42 + 47: 37(ptr) AccessChain 46(indexable) 44 + 48: 36(int) Load 47 + Store 38(u16) 48 Return FunctionEnd - 8(operators(): 2 Function None 3 + 8(typeCast16(): 2 Function None 3 9: Label - 51(u16v): 50(ptr) Variable Function - 57(i16): 35(ptr) Variable Function - 70(u16): 15(ptr) Variable Function - 108(i): 107(ptr) Variable Function - 130(b): 129(ptr) Variable Function - 151(u): 150(ptr) Variable Function - 52: 49(ivec3) Load 51(u16v) - 55: 54(ivec3) CompositeConstruct 53 53 53 - 56: 49(ivec3) IAdd 52 55 - Store 51(u16v) 56 - 58: 17(int) Load 57(i16) - 59: 17(int) ISub 58 53 - Store 57(i16) 59 - 60: 17(int) Load 57(i16) - 61: 17(int) IAdd 60 53 - Store 57(i16) 61 - 62: 49(ivec3) Load 51(u16v) - 63: 54(ivec3) CompositeConstruct 53 53 53 - 64: 49(ivec3) ISub 62 63 - Store 51(u16v) 64 - 65: 49(ivec3) Load 51(u16v) - 66: 49(ivec3) Not 65 - Store 51(u16v) 66 - 67: 17(int) Load 57(i16) - Store 57(i16) 67 - 68: 49(ivec3) Load 51(u16v) - 69: 49(ivec3) SNegate 68 - Store 51(u16v) 69 - 71: 17(int) Load 57(i16) - 72: 14(int) Bitcast 71 - 73: 14(int) Load 70(u16) - 74: 14(int) IAdd 73 72 - Store 70(u16) 74 - 75: 49(ivec3) Load 51(u16v) - 76: 49(ivec3) Load 51(u16v) - 77: 49(ivec3) ISub 76 75 - Store 51(u16v) 77 - 78: 17(int) Load 57(i16) - 79: 17(int) Load 57(i16) - 80: 17(int) IMul 79 78 - Store 57(i16) 80 - 81: 49(ivec3) Load 51(u16v) - 82: 49(ivec3) Load 51(u16v) - 83: 49(ivec3) UDiv 82 81 - Store 51(u16v) 83 - 84: 17(int) Load 57(i16) - 85: 14(int) Bitcast 84 - 86: 49(ivec3) Load 51(u16v) - 87: 49(ivec3) CompositeConstruct 85 85 85 - 88: 49(ivec3) UMod 86 87 - Store 51(u16v) 88 - 89: 49(ivec3) Load 51(u16v) - 90: 49(ivec3) Load 51(u16v) - 91: 49(ivec3) IAdd 89 90 - Store 51(u16v) 91 - 92: 17(int) Load 57(i16) - 93: 14(int) Bitcast 92 - 94: 14(int) Load 70(u16) - 95: 14(int) ISub 93 94 - Store 70(u16) 95 - 96: 49(ivec3) Load 51(u16v) - 97: 17(int) Load 57(i16) - 98: 14(int) Bitcast 97 - 99: 49(ivec3) CompositeConstruct 98 98 98 - 100: 49(ivec3) IMul 96 99 - Store 51(u16v) 100 - 101: 17(int) Load 57(i16) - 102: 17(int) Load 57(i16) - 103: 17(int) IMul 101 102 - Store 57(i16) 103 - 104: 17(int) Load 57(i16) - 105: 17(int) Load 57(i16) - 106: 17(int) SMod 104 105 - Store 57(i16) 106 - 109: 28(int) Load 108(i) - 110: 49(ivec3) Load 51(u16v) - 112: 111(ivec3) CompositeConstruct 109 109 109 - 113: 49(ivec3) ShiftLeftLogical 110 112 - Store 51(u16v) 113 - 115: 15(ptr) AccessChain 51(u16v) 114 - 116: 14(int) Load 115 - 117: 17(int) Load 57(i16) - 118: 17(int) ShiftRightArithmetic 117 116 - Store 57(i16) 118 - 119: 17(int) Load 57(i16) - 121: 15(ptr) AccessChain 51(u16v) 120 - 122: 14(int) Load 121 - 123: 17(int) ShiftLeftLogical 119 122 - Store 57(i16) 123 - 124: 49(ivec3) Load 51(u16v) - 125: 17(int) Load 57(i16) - 126: 54(ivec3) CompositeConstruct 125 125 125 - 127: 49(ivec3) ShiftLeftLogical 124 126 - Store 51(u16v) 127 - 132: 15(ptr) AccessChain 51(u16v) 131 - 133: 14(int) Load 132 - 134: 17(int) Load 57(i16) - 135: 14(int) Bitcast 134 - 136: 128(bool) INotEqual 133 135 - Store 130(b) 136 - 137: 17(int) Load 57(i16) - 138: 14(int) Bitcast 137 - 139: 15(ptr) AccessChain 51(u16v) 131 - 140: 14(int) Load 139 - 141: 128(bool) IEqual 138 140 - Store 130(b) 141 - 142: 15(ptr) AccessChain 51(u16v) 131 - 143: 14(int) Load 142 - 144: 15(ptr) AccessChain 51(u16v) 114 - 145: 14(int) Load 144 - 146: 128(bool) UGreaterThan 143 145 - Store 130(b) 146 - 147: 17(int) Load 57(i16) - 148: 28(int) SConvert 147 - 149: 18(int) Bitcast 148 - 152: 18(int) Load 151(u) - 153: 128(bool) ULessThan 149 152 - Store 130(b) 153 - 154: 15(ptr) AccessChain 51(u16v) 114 - 155: 14(int) Load 154 - 156: 15(ptr) AccessChain 51(u16v) 131 - 157: 14(int) Load 156 - 158: 128(bool) UGreaterThanEqual 155 157 - Store 130(b) 158 - 159: 17(int) Load 57(i16) - 160: 28(int) SConvert 159 - 161: 28(int) Load 108(i) - 162: 128(bool) SLessThanEqual 160 161 - Store 130(b) 162 - 163: 17(int) Load 57(i16) - 164: 14(int) Bitcast 163 - 165: 49(ivec3) Load 51(u16v) - 166: 49(ivec3) CompositeConstruct 164 164 164 - 167: 49(ivec3) BitwiseOr 165 166 - Store 51(u16v) 167 - 168: 17(int) Load 57(i16) - 169: 14(int) Bitcast 168 - 170: 14(int) Load 70(u16) - 171: 14(int) BitwiseOr 169 170 - Store 70(u16) 171 - 172: 17(int) Load 57(i16) - 173: 17(int) Load 57(i16) - 174: 17(int) BitwiseAnd 173 172 - Store 57(i16) 174 - 175: 49(ivec3) Load 51(u16v) - 176: 49(ivec3) Load 51(u16v) - 177: 49(ivec3) BitwiseAnd 175 176 - Store 51(u16v) 177 - 178: 17(int) Load 57(i16) - 179: 14(int) Bitcast 178 - 180: 49(ivec3) Load 51(u16v) - 181: 49(ivec3) CompositeConstruct 179 179 179 - 182: 49(ivec3) BitwiseXor 180 181 - Store 51(u16v) 182 - 183: 49(ivec3) Load 51(u16v) - 184: 17(int) Load 57(i16) - 185: 14(int) Bitcast 184 - 186: 49(ivec3) CompositeConstruct 185 185 185 - 187: 49(ivec3) BitwiseXor 183 186 - Store 51(u16v) 187 + 51(i32v): 50(ptr) Variable Function + 54(i16v): 53(ptr) Variable Function + 59(u16v): 58(ptr) Variable Function + 67(u32v): 66(ptr) Variable Function + 74(i64v): 73(ptr) Variable Function + 80(u64v): 79(ptr) Variable Function + 94(f16v): 93(ptr) Variable Function + 100(f32v): 99(ptr) Variable Function + 106(f64v): 105(ptr) Variable Function + 154(i8v): 153(ptr) Variable Function + 163(u8v): 162(ptr) Variable Function + 176(bv): 175(ptr) Variable Function + 55: 52(ivec2) Load 54(i16v) + 56: 49(ivec2) SConvert 55 + Store 51(i32v) 56 + 60: 57(ivec2) Load 59(u16v) + 61: 49(ivec2) UConvert 60 + 62: 49(ivec2) Bitcast 61 + Store 51(i32v) 62 + 63: 52(ivec2) Load 54(i16v) + 64: 57(ivec2) Bitcast 63 + Store 59(u16v) 64 + 68: 52(ivec2) Load 54(i16v) + 69: 49(ivec2) SConvert 68 + 70: 65(ivec2) Bitcast 69 + Store 67(u32v) 70 + 75: 52(ivec2) Load 54(i16v) + 76: 72(ivec2) SConvert 75 + Store 74(i64v) 76 + 81: 52(ivec2) Load 54(i16v) + 82: 72(ivec2) SConvert 81 + 83: 78(ivec2) Bitcast 82 + Store 80(u64v) 83 + 84: 57(ivec2) Load 59(u16v) + 85: 65(ivec2) UConvert 84 + Store 67(u32v) 85 + 86: 57(ivec2) Load 59(u16v) + 87: 72(ivec2) UConvert 86 + 88: 72(ivec2) Bitcast 87 + Store 74(i64v) 88 + 89: 57(ivec2) Load 59(u16v) + 90: 78(ivec2) UConvert 89 + Store 80(u64v) 90 + 95: 52(ivec2) Load 54(i16v) + 96: 92(fvec2) ConvertSToF 95 + Store 94(f16v) 96 + 101: 52(ivec2) Load 54(i16v) + 102: 98(fvec2) ConvertSToF 101 + Store 100(f32v) 102 + 107: 52(ivec2) Load 54(i16v) + 108: 104(fvec2) ConvertSToF 107 + Store 106(f64v) 108 + 109: 57(ivec2) Load 59(u16v) + 110: 92(fvec2) ConvertUToF 109 + Store 94(f16v) 110 + 111: 57(ivec2) Load 59(u16v) + 112: 98(fvec2) ConvertUToF 111 + Store 100(f32v) 112 + 113: 57(ivec2) Load 59(u16v) + 114: 104(fvec2) ConvertUToF 113 + Store 106(f64v) 114 + 115: 52(ivec2) Load 54(i16v) + 116: 49(ivec2) SConvert 115 + Store 51(i32v) 116 + 117: 57(ivec2) Load 59(u16v) + 118: 49(ivec2) UConvert 117 + 119: 49(ivec2) Bitcast 118 + Store 51(i32v) 119 + 120: 52(ivec2) Load 54(i16v) + 121: 57(ivec2) Bitcast 120 + Store 59(u16v) 121 + 122: 52(ivec2) Load 54(i16v) + 123: 49(ivec2) SConvert 122 + 124: 65(ivec2) Bitcast 123 + Store 67(u32v) 124 + 125: 52(ivec2) Load 54(i16v) + 126: 72(ivec2) SConvert 125 + Store 74(i64v) 126 + 127: 52(ivec2) Load 54(i16v) + 128: 72(ivec2) SConvert 127 + 129: 78(ivec2) Bitcast 128 + Store 80(u64v) 129 + 130: 57(ivec2) Load 59(u16v) + 131: 65(ivec2) UConvert 130 + Store 67(u32v) 131 + 132: 57(ivec2) Load 59(u16v) + 133: 72(ivec2) UConvert 132 + 134: 72(ivec2) Bitcast 133 + Store 74(i64v) 134 + 135: 57(ivec2) Load 59(u16v) + 136: 72(ivec2) UConvert 135 + 137: 72(ivec2) Bitcast 136 + 138: 78(ivec2) Bitcast 137 + Store 80(u64v) 138 + 139: 52(ivec2) Load 54(i16v) + 140: 92(fvec2) ConvertSToF 139 + Store 94(f16v) 140 + 141: 52(ivec2) Load 54(i16v) + 142: 98(fvec2) ConvertSToF 141 + Store 100(f32v) 142 + 143: 52(ivec2) Load 54(i16v) + 144: 104(fvec2) ConvertSToF 143 + Store 106(f64v) 144 + 145: 57(ivec2) Load 59(u16v) + 146: 92(fvec2) ConvertUToF 145 + Store 94(f16v) 146 + 147: 57(ivec2) Load 59(u16v) + 148: 98(fvec2) ConvertUToF 147 + Store 100(f32v) 148 + 149: 57(ivec2) Load 59(u16v) + 150: 104(fvec2) ConvertUToF 149 + Store 106(f64v) 150 + 155: 52(ivec2) Load 54(i16v) + 156: 152(ivec2) SConvert 155 + Store 154(i8v) 156 + 157: 57(ivec2) Load 59(u16v) + 158: 152(ivec2) UConvert 157 + 159: 152(ivec2) Bitcast 158 + Store 154(i8v) 159 + 164: 52(ivec2) Load 54(i16v) + 165: 152(ivec2) SConvert 164 + 166: 161(ivec2) Bitcast 165 + Store 163(u8v) 166 + 167: 57(ivec2) Load 59(u16v) + 168: 161(ivec2) UConvert 167 + Store 163(u8v) 168 + 169: 57(ivec2) Load 59(u16v) + 170: 161(ivec2) UConvert 169 + 171: 52(ivec2) UConvert 170 + 172: 52(ivec2) Bitcast 171 + Store 54(i16v) 172 + 177: 174(bvec2) Load 176(bv) + 182: 52(ivec2) Select 177 181 180 + Store 54(i16v) 182 + 183: 174(bvec2) Load 176(bv) + 188: 57(ivec2) Select 183 187 186 + Store 59(u16v) 188 + 189: 52(ivec2) Load 54(i16v) + 190: 174(bvec2) INotEqual 189 186 + Store 176(bv) 190 + 191: 57(ivec2) Load 59(u16v) + 192: 174(bvec2) INotEqual 191 186 + Store 176(bv) 192 Return FunctionEnd - 10(typeCast(): 2 Function None 3 + 10(operators(): 2 Function None 3 11: Label - 190(i16v): 189(ptr) Variable Function - 193(bv): 192(ptr) Variable Function - 201(u16v): 200(ptr) Variable Function - 214(iv): 213(ptr) Variable Function + 195(u16v): 194(ptr) Variable Function + 200(i16): 15(ptr) Variable Function + 220(i): 219(ptr) Variable Function 227(uv): 226(ptr) Variable Function - 241(fv): 240(ptr) Variable Function - 253(dv): 252(ptr) Variable Function - 265(f16v): 264(ptr) Variable Function - 277(i64v): 276(ptr) Variable Function - 291(u64v): 290(ptr) Variable Function - 194: 191(bvec2) Load 193(bv) - 198: 188(ivec2) Select 194 197 196 - Store 190(i16v) 198 - 202: 191(bvec2) Load 193(bv) - 207: 199(ivec2) Select 202 206 205 - Store 201(u16v) 207 - 208: 188(ivec2) Load 190(i16v) - 209: 191(bvec2) INotEqual 208 205 - Store 193(bv) 209 - 210: 199(ivec2) Load 201(u16v) - 211: 191(bvec2) INotEqual 210 205 - Store 193(bv) 211 - 215: 212(ivec2) Load 214(iv) - 216: 188(ivec2) SConvert 215 - Store 190(i16v) 216 - 217: 212(ivec2) Load 214(iv) - 218: 188(ivec2) SConvert 217 - 219: 199(ivec2) Bitcast 218 - Store 201(u16v) 219 - 220: 188(ivec2) Load 190(i16v) - 221: 212(ivec2) SConvert 220 - Store 214(iv) 221 - 222: 199(ivec2) Load 201(u16v) - 224: 223(ivec2) UConvert 222 - 225: 212(ivec2) Bitcast 224 - Store 214(iv) 225 - 228: 223(ivec2) Load 227(uv) - 229: 199(ivec2) UConvert 228 - 230: 188(ivec2) Bitcast 229 - Store 190(i16v) 230 - 231: 223(ivec2) Load 227(uv) - 232: 199(ivec2) UConvert 231 - Store 201(u16v) 232 - 233: 188(ivec2) Load 190(i16v) - 234: 212(ivec2) SConvert 233 - 235: 223(ivec2) Bitcast 234 - Store 227(uv) 235 - 236: 199(ivec2) Load 201(u16v) - 237: 223(ivec2) UConvert 236 + 243(i64): 242(ptr) Variable Function + 281(b): 280(ptr) Variable Function + 196: 193(ivec3) Load 195(u16v) + 198: 197(ivec3) CompositeConstruct 179 179 179 + 199: 193(ivec3) IAdd 196 198 + Store 195(u16v) 199 + 201: 14(int) Load 200(i16) + 202: 14(int) ISub 201 179 + Store 200(i16) 202 + 203: 14(int) Load 200(i16) + 204: 14(int) IAdd 203 179 + Store 200(i16) 204 + 205: 193(ivec3) Load 195(u16v) + 206: 197(ivec3) CompositeConstruct 179 179 179 + 207: 193(ivec3) ISub 205 206 + Store 195(u16v) 207 + 208: 193(ivec3) Load 195(u16v) + 209: 193(ivec3) Not 208 + Store 195(u16v) 209 + 210: 14(int) Load 200(i16) + Store 200(i16) 210 + 211: 193(ivec3) Load 195(u16v) + 212: 193(ivec3) SNegate 211 + Store 195(u16v) 212 + 213: 14(int) Load 200(i16) + 214: 14(int) Load 200(i16) + 215: 14(int) IAdd 214 213 + Store 200(i16) 215 + 216: 193(ivec3) Load 195(u16v) + 217: 193(ivec3) Load 195(u16v) + 218: 193(ivec3) ISub 217 216 + Store 195(u16v) 218 + 221: 14(int) Load 200(i16) + 222: 27(int) SConvert 221 + 223: 27(int) Load 220(i) + 224: 27(int) IMul 223 222 + Store 220(i) 224 + 228: 193(ivec3) Load 195(u16v) + 229: 225(ivec3) UConvert 228 + 230: 225(ivec3) Load 227(uv) + 231: 225(ivec3) UDiv 230 229 + Store 227(uv) 231 + 232: 14(int) Load 200(i16) + 233: 27(int) SConvert 232 + 234: 17(int) Bitcast 233 + 235: 225(ivec3) Load 227(uv) + 236: 225(ivec3) CompositeConstruct 234 234 234 + 237: 225(ivec3) UMod 235 236 Store 227(uv) 237 - 242: 239(fvec2) Load 241(fv) - 243: 188(ivec2) ConvertFToS 242 - Store 190(i16v) 243 - 244: 239(fvec2) Load 241(fv) - 245: 199(ivec2) ConvertFToU 244 - Store 201(u16v) 245 - 246: 188(ivec2) Load 190(i16v) - 247: 239(fvec2) ConvertSToF 246 - Store 241(fv) 247 - 248: 199(ivec2) Load 201(u16v) - 249: 239(fvec2) ConvertUToF 248 - Store 241(fv) 249 - 254: 251(fvec2) Load 253(dv) - 255: 188(ivec2) ConvertFToS 254 - Store 190(i16v) 255 - 256: 251(fvec2) Load 253(dv) - 257: 199(ivec2) ConvertFToU 256 - Store 201(u16v) 257 - 258: 188(ivec2) Load 190(i16v) - 259: 251(fvec2) ConvertSToF 258 - Store 253(dv) 259 - 260: 199(ivec2) Load 201(u16v) - 261: 251(fvec2) ConvertUToF 260 - Store 253(dv) 261 - 266: 263(fvec2) Load 265(f16v) - 267: 188(ivec2) ConvertFToS 266 - Store 190(i16v) 267 - 268: 263(fvec2) Load 265(f16v) - 269: 199(ivec2) ConvertFToU 268 - Store 201(u16v) 269 - 270: 188(ivec2) Load 190(i16v) - 271: 263(fvec2) ConvertSToF 270 - Store 265(f16v) 271 - 272: 199(ivec2) Load 201(u16v) - 273: 263(fvec2) ConvertUToF 272 - Store 265(f16v) 273 - 278: 275(ivec2) Load 277(i64v) - 279: 188(ivec2) SConvert 278 - Store 190(i16v) 279 - 280: 275(ivec2) Load 277(i64v) - 281: 188(ivec2) SConvert 280 - 282: 199(ivec2) Bitcast 281 - Store 201(u16v) 282 - 283: 188(ivec2) Load 190(i16v) - 284: 275(ivec2) SConvert 283 - Store 277(i64v) 284 - 285: 199(ivec2) Load 201(u16v) - 288: 287(ivec2) UConvert 285 - 289: 275(ivec2) Bitcast 288 - Store 277(i64v) 289 - 292: 287(ivec2) Load 291(u64v) - 293: 199(ivec2) UConvert 292 - 294: 188(ivec2) Bitcast 293 - Store 190(i16v) 294 - 295: 287(ivec2) Load 291(u64v) - 296: 199(ivec2) UConvert 295 - Store 201(u16v) 296 - 297: 188(ivec2) Load 190(i16v) - 298: 275(ivec2) SConvert 297 - 299: 287(ivec2) Bitcast 298 - Store 291(u64v) 299 - 300: 199(ivec2) Load 201(u16v) - 301: 287(ivec2) UConvert 300 - Store 291(u64v) 301 - 302: 199(ivec2) Load 201(u16v) - 303: 188(ivec2) Bitcast 302 - Store 190(i16v) 303 - 304: 188(ivec2) Load 190(i16v) - 305: 199(ivec2) Bitcast 304 - Store 201(u16v) 305 + 238: 193(ivec3) Load 195(u16v) + 239: 225(ivec3) UConvert 238 + 240: 225(ivec3) Load 227(uv) + 241: 225(ivec3) IAdd 239 240 + Store 227(uv) 241 + 244: 14(int) Load 200(i16) + 245: 71(int) SConvert 244 + 246: 71(int) Load 243(i64) + 247: 71(int) ISub 245 246 + Store 243(i64) 247 + 248: 193(ivec3) Load 195(u16v) + 249: 225(ivec3) UConvert 248 + 250: 225(ivec3) Load 227(uv) + 251: 225(ivec3) IMul 249 250 + Store 227(uv) 251 + 252: 14(int) Load 200(i16) + 253: 71(int) SConvert 252 + 254: 71(int) Load 243(i64) + 255: 71(int) IMul 253 254 + Store 243(i64) 255 + 256: 14(int) Load 200(i16) + 257: 27(int) SConvert 256 + 258: 27(int) Load 220(i) + 259: 27(int) SMod 257 258 + Store 220(i) 259 + 260: 14(int) Load 200(i16) + 261: 193(ivec3) Load 195(u16v) + 262: 197(ivec3) CompositeConstruct 260 260 260 + 263: 193(ivec3) ShiftLeftLogical 261 262 + Store 195(u16v) 263 + 265: 37(ptr) AccessChain 195(u16v) 264 + 266: 36(int) Load 265 + 267: 14(int) Load 200(i16) + 268: 14(int) ShiftRightArithmetic 267 266 + Store 200(i16) 268 + 269: 14(int) Load 200(i16) + 271: 37(ptr) AccessChain 195(u16v) 270 + 272: 36(int) Load 271 + 273: 14(int) ShiftLeftLogical 269 272 + Store 200(i16) 273 + 274: 193(ivec3) Load 195(u16v) + 275: 27(int) Load 220(i) + 277: 276(ivec3) CompositeConstruct 275 275 275 + 278: 193(ivec3) ShiftLeftLogical 274 277 + 279: 225(ivec3) UConvert 278 + Store 227(uv) 279 + 283: 37(ptr) AccessChain 195(u16v) 282 + 284: 36(int) Load 283 + 285: 14(int) Load 200(i16) + 286: 36(int) Bitcast 285 + 287: 173(bool) INotEqual 284 286 + Store 281(b) 287 + 288: 14(int) Load 200(i16) + 289: 36(int) Bitcast 288 + 290: 37(ptr) AccessChain 195(u16v) 282 + 291: 36(int) Load 290 + 292: 173(bool) IEqual 289 291 + Store 281(b) 292 + 293: 37(ptr) AccessChain 195(u16v) 282 + 294: 36(int) Load 293 + 295: 17(int) UConvert 294 + 297: 296(ptr) AccessChain 227(uv) 264 + 298: 17(int) Load 297 + 299: 173(bool) UGreaterThan 295 298 + Store 281(b) 299 + 300: 14(int) Load 200(i16) + 301: 27(int) SConvert 300 + 302: 27(int) Load 220(i) + 303: 173(bool) SLessThan 301 302 + Store 281(b) 303 + 304: 37(ptr) AccessChain 195(u16v) 264 + 305: 36(int) Load 304 + 306: 17(int) UConvert 305 + 307: 296(ptr) AccessChain 227(uv) 282 + 308: 17(int) Load 307 + 309: 173(bool) UGreaterThanEqual 306 308 + Store 281(b) 309 + 310: 14(int) Load 200(i16) + 311: 27(int) SConvert 310 + 312: 27(int) Load 220(i) + 313: 173(bool) SLessThanEqual 311 312 + Store 281(b) 313 + 314: 14(int) Load 200(i16) + 315: 27(int) SConvert 314 + 316: 17(int) Bitcast 315 + 317: 225(ivec3) Load 227(uv) + 318: 225(ivec3) CompositeConstruct 316 316 316 + 319: 225(ivec3) BitwiseOr 317 318 + Store 227(uv) 319 + 320: 14(int) Load 200(i16) + 321: 27(int) SConvert 320 + 322: 27(int) Load 220(i) + 323: 27(int) BitwiseOr 321 322 + Store 220(i) 323 + 324: 14(int) Load 200(i16) + 325: 71(int) SConvert 324 + 326: 71(int) Load 243(i64) + 327: 71(int) BitwiseAnd 326 325 + Store 243(i64) 327 + 328: 193(ivec3) Load 195(u16v) + 329: 225(ivec3) UConvert 328 + 330: 225(ivec3) Load 227(uv) + 331: 225(ivec3) BitwiseAnd 329 330 + Store 227(uv) 331 + 332: 14(int) Load 200(i16) + 333: 27(int) SConvert 332 + 334: 17(int) Bitcast 333 + 335: 225(ivec3) Load 227(uv) + 336: 225(ivec3) CompositeConstruct 334 334 334 + 337: 225(ivec3) BitwiseXor 335 336 + Store 227(uv) 337 + 338: 193(ivec3) Load 195(u16v) + 339: 14(int) Load 200(i16) + 340: 36(int) Bitcast 339 + 341: 193(ivec3) CompositeConstruct 340 340 340 + 342: 193(ivec3) BitwiseXor 338 341 + Store 195(u16v) 342 Return FunctionEnd 12(builtinFuncs(): 2 Function None 3 13: Label - 306(i16v): 189(ptr) Variable Function - 312(i16): 35(ptr) Variable Function - 320(u16v): 50(ptr) Variable Function - 322(u16): 15(ptr) Variable Function - 394(f16v): 393(ptr) Variable Function - 397(exp): 396(ptr) Variable Function - 419(packi): 107(ptr) Variable Function - 424(packu): 150(ptr) Variable Function - 433(packi64): 432(ptr) Variable Function - 442(packu64): 441(ptr) Variable Function - 451(bv): 450(ptr) Variable Function - 307: 188(ivec2) Load 306(i16v) - 308: 188(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 307 - Store 306(i16v) 308 - 309: 188(ivec2) Load 306(i16v) - 310: 188(ivec2) ExtInst 1(GLSL.std.450) 7(SSign) 309 - Store 306(i16v) 310 - 311: 188(ivec2) Load 306(i16v) - 313: 17(int) Load 312(i16) - 314: 188(ivec2) CompositeConstruct 313 313 - 315: 188(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 311 314 - Store 306(i16v) 315 - 316: 188(ivec2) Load 306(i16v) - 319: 188(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 316 318 - Store 306(i16v) 319 - 321: 49(ivec3) Load 320(u16v) - 323: 14(int) Load 322(u16) - 324: 49(ivec3) CompositeConstruct 323 323 323 - 325: 49(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 321 324 - Store 320(u16v) 325 - 326: 49(ivec3) Load 320(u16v) - 328: 49(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 326 327 - Store 320(u16v) 328 - 329: 188(ivec2) Load 306(i16v) - 330: 17(int) Load 312(i16) - 331: 188(ivec2) CompositeConstruct 330 330 - 332: 188(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 329 331 - Store 306(i16v) 332 - 333: 188(ivec2) Load 306(i16v) - 334: 188(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 333 318 - Store 306(i16v) 334 - 335: 49(ivec3) Load 320(u16v) - 336: 14(int) Load 322(u16) - 337: 49(ivec3) CompositeConstruct 336 336 336 - 338: 49(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 335 337 - Store 320(u16v) 338 - 339: 49(ivec3) Load 320(u16v) - 340: 49(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 339 327 - Store 320(u16v) 340 - 341: 188(ivec2) Load 306(i16v) - 342: 17(int) Load 312(i16) - 343: 17(int) SNegate 342 - 344: 17(int) Load 312(i16) - 345: 188(ivec2) CompositeConstruct 343 343 - 346: 188(ivec2) CompositeConstruct 344 344 - 347: 188(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 341 345 346 - Store 306(i16v) 347 - 348: 188(ivec2) Load 306(i16v) - 349: 188(ivec2) Load 306(i16v) - 350: 188(ivec2) SNegate 349 - 351: 188(ivec2) Load 306(i16v) - 352: 188(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 348 350 351 - Store 306(i16v) 352 - 353: 49(ivec3) Load 320(u16v) - 354: 14(int) Load 322(u16) - 355: 14(int) SNegate 354 - 356: 14(int) Load 322(u16) - 357: 49(ivec3) CompositeConstruct 355 355 355 - 358: 49(ivec3) CompositeConstruct 356 356 356 - 359: 49(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 353 357 358 - Store 320(u16v) 359 - 360: 49(ivec3) Load 320(u16v) - 361: 49(ivec3) Load 320(u16v) - 362: 49(ivec3) SNegate 361 - 363: 49(ivec3) Load 320(u16v) - 364: 49(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 360 362 363 - Store 320(u16v) 364 - 365: 35(ptr) AccessChain 306(i16v) 131 - 366: 17(int) Load 365 - 367: 35(ptr) AccessChain 306(i16v) 114 - 368: 17(int) Load 367 - 370: 17(int) Select 369 368 366 - Store 312(i16) 370 - 371: 17(int) Load 312(i16) - 372: 188(ivec2) CompositeConstruct 371 371 - 373: 17(int) Load 312(i16) - 374: 17(int) SNegate 373 - 375: 188(ivec2) CompositeConstruct 374 374 - 378: 188(ivec2) Select 377 375 372 - Store 306(i16v) 378 - 379: 15(ptr) AccessChain 320(u16v) 131 - 380: 14(int) Load 379 - 381: 15(ptr) AccessChain 320(u16v) 114 - 382: 14(int) Load 381 - 383: 14(int) Select 369 382 380 - Store 322(u16) 383 - 384: 14(int) Load 322(u16) - 385: 49(ivec3) CompositeConstruct 384 384 384 - 386: 14(int) Load 322(u16) - 387: 14(int) SNegate 386 - 388: 49(ivec3) CompositeConstruct 387 387 387 - 391: 49(ivec3) Select 390 388 385 - Store 320(u16v) 391 - 395: 392(fvec3) Load 394(f16v) - 399:398(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 395 - 400: 54(ivec3) CompositeExtract 399 1 - Store 397(exp) 400 - 401: 392(fvec3) CompositeExtract 399 0 - Store 394(f16v) 401 - 402: 392(fvec3) Load 394(f16v) - 403: 54(ivec3) Load 397(exp) - 404: 392(fvec3) ExtInst 1(GLSL.std.450) 53(Ldexp) 402 403 - Store 394(f16v) 404 - 405: 392(fvec3) Load 394(f16v) - 406: 263(fvec2) VectorShuffle 405 405 0 1 - 407: 188(ivec2) Bitcast 406 - Store 306(i16v) 407 - 409: 408(ptr) AccessChain 394(f16v) 120 - 410: 262(float) Load 409 - 411: 14(int) Bitcast 410 - 412: 15(ptr) AccessChain 320(u16v) 131 - Store 412 411 - 413: 188(ivec2) Load 306(i16v) - 414: 263(fvec2) Bitcast 413 - 415: 392(fvec3) Load 394(f16v) - 416: 392(fvec3) VectorShuffle 415 414 3 4 2 - Store 394(f16v) 416 - 417: 49(ivec3) Load 320(u16v) - 418: 392(fvec3) Bitcast 417 - Store 394(f16v) 418 - 420: 188(ivec2) Load 306(i16v) - 421: 28(int) Bitcast 420 - Store 419(packi) 421 - 422: 28(int) Load 419(packi) - 423: 188(ivec2) Bitcast 422 - Store 306(i16v) 423 - 425: 49(ivec3) Load 320(u16v) - 426: 199(ivec2) VectorShuffle 425 425 0 1 - 427: 18(int) Bitcast 426 - Store 424(packu) 427 - 428: 18(int) Load 424(packu) - 429: 199(ivec2) Bitcast 428 - 430: 49(ivec3) Load 320(u16v) - 431: 49(ivec3) VectorShuffle 430 429 3 4 2 - Store 320(u16v) 431 - 434: 17(int) Load 312(i16) - 436: 435(ivec4) CompositeConstruct 434 434 434 434 - 437: 274(int) Bitcast 436 - Store 433(packi64) 437 - 438: 274(int) Load 433(packi64) - 439: 435(ivec4) Bitcast 438 - 440: 188(ivec2) VectorShuffle 439 439 0 1 - Store 306(i16v) 440 - 443: 14(int) Load 322(u16) - 445: 444(ivec4) CompositeConstruct 443 443 443 443 - 446: 286(int) Bitcast 445 - Store 442(packu64) 446 - 447: 286(int) Load 442(packu64) - 448: 444(ivec4) Bitcast 447 - 449: 49(ivec3) VectorShuffle 448 448 0 1 2 - Store 320(u16v) 449 - 452: 49(ivec3) Load 320(u16v) - 453: 14(int) Load 322(u16) - 454: 49(ivec3) CompositeConstruct 453 453 453 - 455: 389(bvec3) ULessThan 452 454 - Store 451(bv) 455 - 456: 188(ivec2) Load 306(i16v) - 457: 17(int) Load 312(i16) - 458: 188(ivec2) CompositeConstruct 457 457 - 459: 191(bvec2) SLessThan 456 458 - 460: 389(bvec3) Load 451(bv) - 461: 389(bvec3) VectorShuffle 460 459 3 4 2 - Store 451(bv) 461 - 462: 49(ivec3) Load 320(u16v) - 463: 14(int) Load 322(u16) - 464: 49(ivec3) CompositeConstruct 463 463 463 - 465: 389(bvec3) ULessThanEqual 462 464 - Store 451(bv) 465 - 466: 188(ivec2) Load 306(i16v) - 467: 17(int) Load 312(i16) - 468: 188(ivec2) CompositeConstruct 467 467 - 469: 191(bvec2) SLessThanEqual 466 468 - 470: 389(bvec3) Load 451(bv) - 471: 389(bvec3) VectorShuffle 470 469 3 4 2 - Store 451(bv) 471 - 472: 49(ivec3) Load 320(u16v) - 473: 14(int) Load 322(u16) - 474: 49(ivec3) CompositeConstruct 473 473 473 - 475: 389(bvec3) UGreaterThan 472 474 - Store 451(bv) 475 - 476: 188(ivec2) Load 306(i16v) - 477: 17(int) Load 312(i16) - 478: 188(ivec2) CompositeConstruct 477 477 - 479: 191(bvec2) SGreaterThan 476 478 - 480: 389(bvec3) Load 451(bv) - 481: 389(bvec3) VectorShuffle 480 479 3 4 2 - Store 451(bv) 481 - 482: 49(ivec3) Load 320(u16v) - 483: 14(int) Load 322(u16) - 484: 49(ivec3) CompositeConstruct 483 483 483 - 485: 389(bvec3) UGreaterThanEqual 482 484 - Store 451(bv) 485 - 486: 188(ivec2) Load 306(i16v) - 487: 17(int) Load 312(i16) - 488: 188(ivec2) CompositeConstruct 487 487 - 489: 191(bvec2) SGreaterThanEqual 486 488 - 490: 389(bvec3) Load 451(bv) - 491: 389(bvec3) VectorShuffle 490 489 3 4 2 - Store 451(bv) 491 - 492: 49(ivec3) Load 320(u16v) - 493: 14(int) Load 322(u16) - 494: 49(ivec3) CompositeConstruct 493 493 493 - 495: 389(bvec3) IEqual 492 494 - Store 451(bv) 495 - 496: 188(ivec2) Load 306(i16v) - 497: 17(int) Load 312(i16) - 498: 188(ivec2) CompositeConstruct 497 497 - 499: 191(bvec2) IEqual 496 498 - 500: 389(bvec3) Load 451(bv) - 501: 389(bvec3) VectorShuffle 500 499 3 4 2 - Store 451(bv) 501 - 502: 49(ivec3) Load 320(u16v) - 503: 14(int) Load 322(u16) - 504: 49(ivec3) CompositeConstruct 503 503 503 - 505: 389(bvec3) INotEqual 502 504 - Store 451(bv) 505 - 506: 188(ivec2) Load 306(i16v) - 507: 17(int) Load 312(i16) - 508: 188(ivec2) CompositeConstruct 507 507 - 509: 191(bvec2) INotEqual 506 508 - 510: 389(bvec3) Load 451(bv) - 511: 389(bvec3) VectorShuffle 510 509 3 4 2 - Store 451(bv) 511 + 343(i16v): 53(ptr) Variable Function + 346(i16): 15(ptr) Variable Function + 356(u16v): 194(ptr) Variable Function + 358(u16): 37(ptr) Variable Function + 428(i32): 219(ptr) Variable Function + 431(i64): 242(ptr) Variable Function + 434(i16v4): 433(ptr) Variable Function + 437(u32): 296(ptr) Variable Function + 438(u16v2): 58(ptr) Variable Function + 442(u64): 441(ptr) Variable Function + 445(u16v4): 444(ptr) Variable Function + 457(bv): 456(ptr) Variable Function + 344: 52(ivec2) Load 343(i16v) + 345: 52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 344 + Store 343(i16v) 345 + 347: 14(int) Load 346(i16) + 348: 14(int) ExtInst 1(GLSL.std.450) 7(SSign) 347 + Store 346(i16) 348 + 349: 52(ivec2) Load 343(i16v) + 350: 14(int) Load 346(i16) + 351: 52(ivec2) CompositeConstruct 350 350 + 352: 52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 349 351 + Store 343(i16v) 352 + 353: 52(ivec2) Load 343(i16v) + 355: 52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 353 354 + Store 343(i16v) 355 + 357: 193(ivec3) Load 356(u16v) + 359: 36(int) Load 358(u16) + 360: 193(ivec3) CompositeConstruct 359 359 359 + 361: 193(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 357 360 + Store 356(u16v) 361 + 362: 193(ivec3) Load 356(u16v) + 364: 193(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 362 363 + Store 356(u16v) 364 + 365: 52(ivec2) Load 343(i16v) + 366: 14(int) Load 346(i16) + 367: 52(ivec2) CompositeConstruct 366 366 + 368: 52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 365 367 + Store 343(i16v) 368 + 369: 52(ivec2) Load 343(i16v) + 370: 52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 369 354 + Store 343(i16v) 370 + 371: 193(ivec3) Load 356(u16v) + 372: 36(int) Load 358(u16) + 373: 193(ivec3) CompositeConstruct 372 372 372 + 374: 193(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 371 373 + Store 356(u16v) 374 + 375: 193(ivec3) Load 356(u16v) + 376: 193(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 375 363 + Store 356(u16v) 376 + 377: 52(ivec2) Load 343(i16v) + 378: 14(int) Load 346(i16) + 379: 14(int) SNegate 378 + 380: 14(int) Load 346(i16) + 381: 52(ivec2) CompositeConstruct 379 379 + 382: 52(ivec2) CompositeConstruct 380 380 + 383: 52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 377 381 382 + Store 343(i16v) 383 + 384: 52(ivec2) Load 343(i16v) + 385: 52(ivec2) Load 343(i16v) + 386: 52(ivec2) SNegate 385 + 387: 52(ivec2) Load 343(i16v) + 388: 52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 384 386 387 + Store 343(i16v) 388 + 389: 193(ivec3) Load 356(u16v) + 390: 36(int) Load 358(u16) + 391: 36(int) SNegate 390 + 392: 36(int) Load 358(u16) + 393: 193(ivec3) CompositeConstruct 391 391 391 + 394: 193(ivec3) CompositeConstruct 392 392 392 + 395: 193(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 389 393 394 + Store 356(u16v) 395 + 396: 193(ivec3) Load 356(u16v) + 397: 193(ivec3) Load 356(u16v) + 398: 193(ivec3) SNegate 397 + 399: 193(ivec3) Load 356(u16v) + 400: 193(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 396 398 399 + Store 356(u16v) 400 + 401: 15(ptr) AccessChain 343(i16v) 282 + 402: 14(int) Load 401 + 403: 15(ptr) AccessChain 343(i16v) 264 + 404: 14(int) Load 403 + 406: 14(int) Select 405 404 402 + Store 346(i16) 406 + 407: 14(int) Load 346(i16) + 408: 52(ivec2) CompositeConstruct 407 407 + 409: 14(int) Load 346(i16) + 410: 14(int) SNegate 409 + 411: 52(ivec2) CompositeConstruct 410 410 + 414: 52(ivec2) Select 413 411 408 + Store 343(i16v) 414 + 415: 37(ptr) AccessChain 356(u16v) 282 + 416: 36(int) Load 415 + 417: 37(ptr) AccessChain 356(u16v) 264 + 418: 36(int) Load 417 + 419: 36(int) Select 405 418 416 + Store 358(u16) 419 + 420: 36(int) Load 358(u16) + 421: 193(ivec3) CompositeConstruct 420 420 420 + 422: 36(int) Load 358(u16) + 423: 36(int) SNegate 422 + 424: 193(ivec3) CompositeConstruct 423 423 423 + 427: 193(ivec3) Select 426 424 421 + Store 356(u16v) 427 + 429: 52(ivec2) Load 343(i16v) + 430: 27(int) Bitcast 429 + Store 428(i32) 430 + 435: 432(ivec4) Load 434(i16v4) + 436: 71(int) Bitcast 435 + Store 431(i64) 436 + 439: 57(ivec2) Load 438(u16v2) + 440: 17(int) Bitcast 439 + Store 437(u32) 440 + 446: 443(ivec4) Load 445(u16v4) + 447: 77(int) Bitcast 446 + Store 442(u64) 447 + 448: 27(int) Load 428(i32) + 449: 52(ivec2) Bitcast 448 + Store 343(i16v) 449 + 450: 71(int) Load 431(i64) + 451: 432(ivec4) Bitcast 450 + Store 434(i16v4) 451 + 452: 17(int) Load 437(u32) + 453: 57(ivec2) Bitcast 452 + Store 438(u16v2) 453 + 454: 77(int) Load 442(u64) + 455: 443(ivec4) Bitcast 454 + Store 445(u16v4) 455 + 458: 193(ivec3) Load 356(u16v) + 459: 36(int) Load 358(u16) + 460: 193(ivec3) CompositeConstruct 459 459 459 + 461: 425(bvec3) ULessThan 458 460 + Store 457(bv) 461 + 462: 52(ivec2) Load 343(i16v) + 463: 14(int) Load 346(i16) + 464: 52(ivec2) CompositeConstruct 463 463 + 465: 174(bvec2) SLessThan 462 464 + 466: 425(bvec3) Load 457(bv) + 467: 425(bvec3) VectorShuffle 466 465 3 4 2 + Store 457(bv) 467 + 468: 193(ivec3) Load 356(u16v) + 469: 36(int) Load 358(u16) + 470: 193(ivec3) CompositeConstruct 469 469 469 + 471: 425(bvec3) ULessThanEqual 468 470 + Store 457(bv) 471 + 472: 52(ivec2) Load 343(i16v) + 473: 14(int) Load 346(i16) + 474: 52(ivec2) CompositeConstruct 473 473 + 475: 174(bvec2) SLessThanEqual 472 474 + 476: 425(bvec3) Load 457(bv) + 477: 425(bvec3) VectorShuffle 476 475 3 4 2 + Store 457(bv) 477 + 478: 193(ivec3) Load 356(u16v) + 479: 36(int) Load 358(u16) + 480: 193(ivec3) CompositeConstruct 479 479 479 + 481: 425(bvec3) UGreaterThan 478 480 + Store 457(bv) 481 + 482: 52(ivec2) Load 343(i16v) + 483: 14(int) Load 346(i16) + 484: 52(ivec2) CompositeConstruct 483 483 + 485: 174(bvec2) SGreaterThan 482 484 + 486: 425(bvec3) Load 457(bv) + 487: 425(bvec3) VectorShuffle 486 485 3 4 2 + Store 457(bv) 487 + 488: 193(ivec3) Load 356(u16v) + 489: 36(int) Load 358(u16) + 490: 193(ivec3) CompositeConstruct 489 489 489 + 491: 425(bvec3) UGreaterThanEqual 488 490 + Store 457(bv) 491 + 492: 52(ivec2) Load 343(i16v) + 493: 14(int) Load 346(i16) + 494: 52(ivec2) CompositeConstruct 493 493 + 495: 174(bvec2) SGreaterThanEqual 492 494 + 496: 425(bvec3) Load 457(bv) + 497: 425(bvec3) VectorShuffle 496 495 3 4 2 + Store 457(bv) 497 + 498: 193(ivec3) Load 356(u16v) + 499: 36(int) Load 358(u16) + 500: 193(ivec3) CompositeConstruct 499 499 499 + 501: 425(bvec3) IEqual 498 500 + Store 457(bv) 501 + 502: 52(ivec2) Load 343(i16v) + 503: 14(int) Load 346(i16) + 504: 52(ivec2) CompositeConstruct 503 503 + 505: 174(bvec2) IEqual 502 504 + 506: 425(bvec3) Load 457(bv) + 507: 425(bvec3) VectorShuffle 506 505 3 4 2 + Store 457(bv) 507 + 508: 193(ivec3) Load 356(u16v) + 509: 36(int) Load 358(u16) + 510: 193(ivec3) CompositeConstruct 509 509 509 + 511: 425(bvec3) INotEqual 508 510 + Store 457(bv) 511 + 512: 52(ivec2) Load 343(i16v) + 513: 14(int) Load 346(i16) + 514: 52(ivec2) CompositeConstruct 513 513 + 515: 174(bvec2) INotEqual 512 514 + 516: 425(bvec3) Load 457(bv) + 517: 425(bvec3) VectorShuffle 516 515 3 4 2 + Store 457(bv) 517 Return FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.int32.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.int32.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.int32.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.int32.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,712 @@ +spv.int32.frag +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 493 + + Capability Shader + Capability Float16 + Capability Float64 + Capability Int64 + Capability Int16 + Capability Int8 + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + SourceExtension "GL_KHX_shader_explicit_arithmetic_types" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int8" + Name 4 "main" + Name 6 "literal(" + Name 8 "typeCast32(" + Name 10 "operators(" + Name 12 "builtinFuncs(" + Name 16 "u32Max" + Name 20 "i32" + Name 27 "Uniforms" + MemberName 27(Uniforms) 0 "index" + Name 29 "" + Name 35 "indexable" + Name 39 "u32" + Name 46 "indexable" + Name 51 "u32v" + Name 54 "i32v" + Name 60 "i64v" + Name 66 "u64v" + Name 78 "f32v" + Name 84 "f64v" + Name 94 "i8v" + Name 103 "i16v" + Name 123 "u8v" + Name 132 "u16v" + Name 152 "f16v" + Name 168 "bv" + Name 186 "u32v" + Name 191 "i32" + Name 210 "i" + Name 214 "uv" + Name 227 "i64" + Name 260 "b" + Name 312 "i32v" + Name 315 "i32" + Name 325 "u32v" + Name 327 "u32" + Name 399 "i8v4" + Name 402 "i16v2" + Name 407 "u8v4" + Name 410 "u16v2" + Name 413 "i64" + Name 416 "u32v2" + Name 418 "u64" + Name 422 "bv" + Name 485 "Block" + MemberName 485(Block) 0 "i32" + MemberName 485(Block) 1 "i32v2" + MemberName 485(Block) 2 "i32v3" + MemberName 485(Block) 3 "i32v4" + MemberName 485(Block) 4 "u32" + MemberName 485(Block) 5 "u32v2" + MemberName 485(Block) 6 "u32v3" + MemberName 485(Block) 7 "u32v4" + Name 487 "block" + Name 488 "si32" + Name 489 "su32" + Name 490 "si" + Name 491 "su" + Name 492 "sb" + MemberDecorate 27(Uniforms) 0 Offset 0 + Decorate 27(Uniforms) Block + Decorate 29 DescriptorSet 0 + Decorate 29 Binding 0 + MemberDecorate 485(Block) 0 Offset 0 + MemberDecorate 485(Block) 1 Offset 8 + MemberDecorate 485(Block) 2 Offset 16 + MemberDecorate 485(Block) 3 Offset 32 + MemberDecorate 485(Block) 4 Offset 48 + MemberDecorate 485(Block) 5 Offset 56 + MemberDecorate 485(Block) 6 Offset 64 + MemberDecorate 485(Block) 7 Offset 80 + Decorate 485(Block) Block + Decorate 487(block) DescriptorSet 0 + Decorate 487(block) Binding 1 + Decorate 488(si32) SpecId 100 + Decorate 489(su32) SpecId 101 + Decorate 490(si) SpecId 102 + Decorate 491(su) SpecId 103 + Decorate 492(sb) SpecId 104 + 2: TypeVoid + 3: TypeFunction 2 + 14: TypeInt 32 0 + 15: TypePointer Private 14(int) + 16(u32Max): 15(ptr) Variable Private + 17: 14(int) Constant 4294967295 + 18: TypeInt 32 1 + 19: TypePointer Function 18(int) + 21: 14(int) Constant 3 + 22: TypeArray 18(int) 21 + 23: 18(int) Constant 4008636143 + 24: 18(int) Constant 4294967295 + 25: 18(int) Constant 536870912 + 26: 22 ConstantComposite 23 24 25 + 27(Uniforms): TypeStruct 14(int) + 28: TypePointer Uniform 27(Uniforms) + 29: 28(ptr) Variable Uniform + 30: 18(int) Constant 0 + 31: TypePointer Uniform 14(int) + 34: TypePointer Function 22 + 38: TypePointer Function 14(int) + 40: TypeArray 14(int) 21 + 41: 14(int) Constant 2147483647 + 42: 40 ConstantComposite 17 17 41 + 45: TypePointer Function 40 + 49: TypeVector 14(int) 2 + 50: TypePointer Function 49(ivec2) + 52: TypeVector 18(int) 2 + 53: TypePointer Function 52(ivec2) + 57: TypeInt 64 1 + 58: TypeVector 57(int) 2 + 59: TypePointer Function 58(ivec2) + 63: TypeInt 64 0 + 64: TypeVector 63(int) 2 + 65: TypePointer Function 64(ivec2) + 75: TypeFloat 32 + 76: TypeVector 75(float) 2 + 77: TypePointer Function 76(fvec2) + 81: TypeFloat 64 + 82: TypeVector 81(float) 2 + 83: TypePointer Function 82(fvec2) + 91: TypeInt 8 1 + 92: TypeVector 91(int) 2 + 93: TypePointer Function 92(ivec2) + 100: TypeInt 16 1 + 101: TypeVector 100(int) 2 + 102: TypePointer Function 101(ivec2) + 120: TypeInt 8 0 + 121: TypeVector 120(int) 2 + 122: TypePointer Function 121(ivec2) + 129: TypeInt 16 0 + 130: TypeVector 129(int) 2 + 131: TypePointer Function 130(ivec2) + 149: TypeFloat 16 + 150: TypeVector 149(float) 2 + 151: TypePointer Function 150(fvec2) + 165: TypeBool + 166: TypeVector 165(bool) 2 + 167: TypePointer Function 166(bvec2) + 170: 18(int) Constant 1 + 171: 52(ivec2) ConstantComposite 30 30 + 172: 52(ivec2) ConstantComposite 170 170 + 175: 14(int) Constant 0 + 176: 14(int) Constant 1 + 177: 49(ivec2) ConstantComposite 175 175 + 178: 49(ivec2) ConstantComposite 176 176 + 184: TypeVector 14(int) 3 + 185: TypePointer Function 184(ivec3) + 188: TypeVector 18(int) 3 + 226: TypePointer Function 57(int) + 251: 14(int) Constant 2 + 259: TypePointer Function 165(bool) + 323: 52(ivec2) ConstantComposite 24 24 + 332: 184(ivec3) ConstantComposite 175 175 175 + 374: 165(bool) ConstantTrue + 381: 165(bool) ConstantFalse + 382: 166(bvec2) ConstantComposite 381 381 + 394: TypeVector 165(bool) 3 + 395: 394(bvec3) ConstantComposite 381 381 381 + 397: TypeVector 91(int) 4 + 398: TypePointer Function 397(ivec4) + 405: TypeVector 120(int) 4 + 406: TypePointer Function 405(ivec4) + 417: TypePointer Function 63(int) + 421: TypePointer Function 394(bvec3) + 483: TypeVector 18(int) 4 + 484: TypeVector 14(int) 4 + 485(Block): TypeStruct 18(int) 52(ivec2) 188(ivec3) 483(ivec4) 14(int) 49(ivec2) 184(ivec3) 484(ivec4) + 486: TypePointer Uniform 485(Block) + 487(block): 486(ptr) Variable Uniform + 488(si32): 18(int) SpecConstant 4294967286 + 489(su32): 14(int) SpecConstant 20 + 490(si): 18(int) SpecConstant 4294967291 + 491(su): 14(int) SpecConstant 4 + 492(sb): 165(bool) SpecConstantTrue + 4(main): 2 Function None 3 + 5: Label + Store 16(u32Max) 17 + Return + FunctionEnd + 6(literal(): 2 Function None 3 + 7: Label + 20(i32): 19(ptr) Variable Function + 35(indexable): 34(ptr) Variable Function + 39(u32): 38(ptr) Variable Function + 46(indexable): 45(ptr) Variable Function + 32: 31(ptr) AccessChain 29 30 + 33: 14(int) Load 32 + Store 35(indexable) 26 + 36: 19(ptr) AccessChain 35(indexable) 33 + 37: 18(int) Load 36 + Store 20(i32) 37 + 43: 31(ptr) AccessChain 29 30 + 44: 14(int) Load 43 + Store 46(indexable) 42 + 47: 38(ptr) AccessChain 46(indexable) 44 + 48: 14(int) Load 47 + Store 39(u32) 48 + Return + FunctionEnd + 8(typeCast32(): 2 Function None 3 + 9: Label + 51(u32v): 50(ptr) Variable Function + 54(i32v): 53(ptr) Variable Function + 60(i64v): 59(ptr) Variable Function + 66(u64v): 65(ptr) Variable Function + 78(f32v): 77(ptr) Variable Function + 84(f64v): 83(ptr) Variable Function + 94(i8v): 93(ptr) Variable Function + 103(i16v): 102(ptr) Variable Function + 123(u8v): 122(ptr) Variable Function + 132(u16v): 131(ptr) Variable Function + 152(f16v): 151(ptr) Variable Function + 168(bv): 167(ptr) Variable Function + 55: 52(ivec2) Load 54(i32v) + 56: 49(ivec2) Bitcast 55 + Store 51(u32v) 56 + 61: 52(ivec2) Load 54(i32v) + 62: 58(ivec2) SConvert 61 + Store 60(i64v) 62 + 67: 52(ivec2) Load 54(i32v) + 68: 58(ivec2) SConvert 67 + 69: 64(ivec2) Bitcast 68 + Store 66(u64v) 69 + 70: 49(ivec2) Load 51(u32v) + 71: 58(ivec2) UConvert 70 + 72: 58(ivec2) Bitcast 71 + Store 60(i64v) 72 + 73: 49(ivec2) Load 51(u32v) + 74: 64(ivec2) UConvert 73 + Store 66(u64v) 74 + 79: 52(ivec2) Load 54(i32v) + 80: 76(fvec2) ConvertSToF 79 + Store 78(f32v) 80 + 85: 52(ivec2) Load 54(i32v) + 86: 82(fvec2) ConvertSToF 85 + Store 84(f64v) 86 + 87: 49(ivec2) Load 51(u32v) + 88: 76(fvec2) ConvertUToF 87 + Store 78(f32v) 88 + 89: 49(ivec2) Load 51(u32v) + 90: 82(fvec2) ConvertUToF 89 + Store 84(f64v) 90 + 95: 52(ivec2) Load 54(i32v) + 96: 92(ivec2) SConvert 95 + Store 94(i8v) 96 + 97: 49(ivec2) Load 51(u32v) + 98: 92(ivec2) UConvert 97 + 99: 92(ivec2) Bitcast 98 + Store 94(i8v) 99 + 104: 52(ivec2) Load 54(i32v) + 105: 101(ivec2) SConvert 104 + Store 103(i16v) 105 + 106: 49(ivec2) Load 51(u32v) + 107: 101(ivec2) UConvert 106 + 108: 101(ivec2) Bitcast 107 + Store 103(i16v) 108 + 109: 52(ivec2) Load 54(i32v) + 110: 18(int) CompositeExtract 109 0 + 111: 18(int) CompositeExtract 109 1 + 112: 52(ivec2) CompositeConstruct 110 111 + Store 54(i32v) 112 + 113: 49(ivec2) Load 51(u32v) + 114: 52(ivec2) Bitcast 113 + Store 54(i32v) 114 + 115: 52(ivec2) Load 54(i32v) + 116: 58(ivec2) SConvert 115 + Store 60(i64v) 116 + 117: 49(ivec2) Load 51(u32v) + 118: 58(ivec2) UConvert 117 + 119: 58(ivec2) Bitcast 118 + Store 60(i64v) 119 + 124: 52(ivec2) Load 54(i32v) + 125: 92(ivec2) SConvert 124 + 126: 121(ivec2) Bitcast 125 + Store 123(u8v) 126 + 127: 49(ivec2) Load 51(u32v) + 128: 121(ivec2) UConvert 127 + Store 123(u8v) 128 + 133: 52(ivec2) Load 54(i32v) + 134: 101(ivec2) SConvert 133 + 135: 130(ivec2) Bitcast 134 + Store 132(u16v) 135 + 136: 49(ivec2) Load 51(u32v) + 137: 130(ivec2) UConvert 136 + Store 132(u16v) 137 + 138: 52(ivec2) Load 54(i32v) + 139: 49(ivec2) Bitcast 138 + Store 51(u32v) 139 + 140: 49(ivec2) Load 51(u32v) + 141: 14(int) CompositeExtract 140 0 + 142: 14(int) CompositeExtract 140 1 + 143: 49(ivec2) CompositeConstruct 141 142 + Store 51(u32v) 143 + 144: 52(ivec2) Load 54(i32v) + 145: 58(ivec2) SConvert 144 + 146: 64(ivec2) Bitcast 145 + Store 66(u64v) 146 + 147: 49(ivec2) Load 51(u32v) + 148: 64(ivec2) UConvert 147 + Store 66(u64v) 148 + 153: 52(ivec2) Load 54(i32v) + 154: 150(fvec2) ConvertSToF 153 + Store 152(f16v) 154 + 155: 52(ivec2) Load 54(i32v) + 156: 76(fvec2) ConvertSToF 155 + Store 78(f32v) 156 + 157: 52(ivec2) Load 54(i32v) + 158: 82(fvec2) ConvertSToF 157 + Store 84(f64v) 158 + 159: 49(ivec2) Load 51(u32v) + 160: 150(fvec2) ConvertUToF 159 + Store 152(f16v) 160 + 161: 49(ivec2) Load 51(u32v) + 162: 76(fvec2) ConvertUToF 161 + Store 78(f32v) 162 + 163: 49(ivec2) Load 51(u32v) + 164: 82(fvec2) ConvertUToF 163 + Store 84(f64v) 164 + 169: 166(bvec2) Load 168(bv) + 173: 52(ivec2) Select 169 172 171 + Store 54(i32v) 173 + 174: 166(bvec2) Load 168(bv) + 179: 49(ivec2) Select 174 178 177 + Store 51(u32v) 179 + 180: 52(ivec2) Load 54(i32v) + 181: 166(bvec2) INotEqual 180 177 + Store 168(bv) 181 + 182: 49(ivec2) Load 51(u32v) + 183: 166(bvec2) INotEqual 182 177 + Store 168(bv) 183 + Return + FunctionEnd + 10(operators(): 2 Function None 3 + 11: Label + 186(u32v): 185(ptr) Variable Function + 191(i32): 19(ptr) Variable Function + 210(i): 19(ptr) Variable Function + 214(uv): 185(ptr) Variable Function + 227(i64): 226(ptr) Variable Function + 260(b): 259(ptr) Variable Function + 187: 184(ivec3) Load 186(u32v) + 189: 188(ivec3) CompositeConstruct 170 170 170 + 190: 184(ivec3) IAdd 187 189 + Store 186(u32v) 190 + 192: 18(int) Load 191(i32) + 193: 18(int) ISub 192 170 + Store 191(i32) 193 + 194: 18(int) Load 191(i32) + 195: 18(int) IAdd 194 170 + Store 191(i32) 195 + 196: 184(ivec3) Load 186(u32v) + 197: 188(ivec3) CompositeConstruct 170 170 170 + 198: 184(ivec3) ISub 196 197 + Store 186(u32v) 198 + 199: 184(ivec3) Load 186(u32v) + 200: 184(ivec3) Not 199 + Store 186(u32v) 200 + 201: 18(int) Load 191(i32) + Store 191(i32) 201 + 202: 184(ivec3) Load 186(u32v) + 203: 184(ivec3) SNegate 202 + Store 186(u32v) 203 + 204: 18(int) Load 191(i32) + 205: 18(int) Load 191(i32) + 206: 18(int) IAdd 205 204 + Store 191(i32) 206 + 207: 184(ivec3) Load 186(u32v) + 208: 184(ivec3) Load 186(u32v) + 209: 184(ivec3) ISub 208 207 + Store 186(u32v) 209 + 211: 18(int) Load 191(i32) + 212: 18(int) Load 210(i) + 213: 18(int) IMul 212 211 + Store 210(i) 213 + 215: 184(ivec3) Load 186(u32v) + 216: 184(ivec3) Load 214(uv) + 217: 184(ivec3) UDiv 216 215 + Store 214(uv) 217 + 218: 18(int) Load 191(i32) + 219: 14(int) Bitcast 218 + 220: 184(ivec3) Load 214(uv) + 221: 184(ivec3) CompositeConstruct 219 219 219 + 222: 184(ivec3) UMod 220 221 + Store 214(uv) 222 + 223: 184(ivec3) Load 186(u32v) + 224: 184(ivec3) Load 214(uv) + 225: 184(ivec3) IAdd 223 224 + Store 214(uv) 225 + 228: 18(int) Load 191(i32) + 229: 57(int) SConvert 228 + 230: 57(int) Load 227(i64) + 231: 57(int) ISub 229 230 + Store 227(i64) 231 + 232: 184(ivec3) Load 186(u32v) + 233: 184(ivec3) Load 214(uv) + 234: 184(ivec3) IMul 232 233 + Store 214(uv) 234 + 235: 18(int) Load 191(i32) + 236: 57(int) SConvert 235 + 237: 57(int) Load 227(i64) + 238: 57(int) IMul 236 237 + Store 227(i64) 238 + 239: 18(int) Load 191(i32) + 240: 18(int) Load 210(i) + 241: 18(int) SMod 239 240 + Store 210(i) 241 + 242: 18(int) Load 191(i32) + 243: 184(ivec3) Load 186(u32v) + 244: 188(ivec3) CompositeConstruct 242 242 242 + 245: 184(ivec3) ShiftLeftLogical 243 244 + Store 186(u32v) 245 + 246: 38(ptr) AccessChain 186(u32v) 176 + 247: 14(int) Load 246 + 248: 18(int) Load 191(i32) + 249: 18(int) ShiftRightArithmetic 248 247 + Store 191(i32) 249 + 250: 57(int) Load 227(i64) + 252: 38(ptr) AccessChain 186(u32v) 251 + 253: 14(int) Load 252 + 254: 57(int) ShiftLeftLogical 250 253 + Store 227(i64) 254 + 255: 184(ivec3) Load 186(u32v) + 256: 18(int) Load 210(i) + 257: 188(ivec3) CompositeConstruct 256 256 256 + 258: 184(ivec3) ShiftLeftLogical 255 257 + Store 214(uv) 258 + 261: 38(ptr) AccessChain 186(u32v) 175 + 262: 14(int) Load 261 + 263: 18(int) Load 191(i32) + 264: 14(int) Bitcast 263 + 265: 165(bool) INotEqual 262 264 + Store 260(b) 265 + 266: 18(int) Load 191(i32) + 267: 14(int) Bitcast 266 + 268: 38(ptr) AccessChain 186(u32v) 175 + 269: 14(int) Load 268 + 270: 165(bool) IEqual 267 269 + Store 260(b) 270 + 271: 38(ptr) AccessChain 186(u32v) 175 + 272: 14(int) Load 271 + 273: 38(ptr) AccessChain 214(uv) 176 + 274: 14(int) Load 273 + 275: 165(bool) UGreaterThan 272 274 + Store 260(b) 275 + 276: 18(int) Load 191(i32) + 277: 18(int) Load 210(i) + 278: 165(bool) SLessThan 276 277 + Store 260(b) 278 + 279: 38(ptr) AccessChain 186(u32v) 176 + 280: 14(int) Load 279 + 281: 38(ptr) AccessChain 214(uv) 175 + 282: 14(int) Load 281 + 283: 165(bool) UGreaterThanEqual 280 282 + Store 260(b) 283 + 284: 18(int) Load 191(i32) + 285: 18(int) Load 210(i) + 286: 165(bool) SLessThanEqual 284 285 + Store 260(b) 286 + 287: 18(int) Load 191(i32) + 288: 14(int) Bitcast 287 + 289: 184(ivec3) Load 214(uv) + 290: 184(ivec3) CompositeConstruct 288 288 288 + 291: 184(ivec3) BitwiseOr 289 290 + Store 214(uv) 291 + 292: 18(int) Load 191(i32) + 293: 18(int) Load 210(i) + 294: 18(int) BitwiseOr 292 293 + Store 210(i) 294 + 295: 18(int) Load 191(i32) + 296: 57(int) SConvert 295 + 297: 57(int) Load 227(i64) + 298: 57(int) BitwiseAnd 297 296 + Store 227(i64) 298 + 299: 184(ivec3) Load 186(u32v) + 300: 184(ivec3) Load 214(uv) + 301: 184(ivec3) BitwiseAnd 299 300 + Store 214(uv) 301 + 302: 18(int) Load 191(i32) + 303: 14(int) Bitcast 302 + 304: 184(ivec3) Load 214(uv) + 305: 184(ivec3) CompositeConstruct 303 303 303 + 306: 184(ivec3) BitwiseXor 304 305 + Store 214(uv) 306 + 307: 184(ivec3) Load 186(u32v) + 308: 18(int) Load 191(i32) + 309: 14(int) Bitcast 308 + 310: 184(ivec3) CompositeConstruct 309 309 309 + 311: 184(ivec3) BitwiseXor 307 310 + Store 186(u32v) 311 + Return + FunctionEnd +12(builtinFuncs(): 2 Function None 3 + 13: Label + 312(i32v): 53(ptr) Variable Function + 315(i32): 19(ptr) Variable Function + 325(u32v): 185(ptr) Variable Function + 327(u32): 38(ptr) Variable Function + 399(i8v4): 398(ptr) Variable Function + 402(i16v2): 102(ptr) Variable Function + 407(u8v4): 406(ptr) Variable Function + 410(u16v2): 131(ptr) Variable Function + 413(i64): 226(ptr) Variable Function + 416(u32v2): 50(ptr) Variable Function + 418(u64): 417(ptr) Variable Function + 422(bv): 421(ptr) Variable Function + 313: 52(ivec2) Load 312(i32v) + 314: 52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 313 + Store 312(i32v) 314 + 316: 18(int) Load 315(i32) + 317: 18(int) ExtInst 1(GLSL.std.450) 7(SSign) 316 + Store 315(i32) 317 + 318: 52(ivec2) Load 312(i32v) + 319: 18(int) Load 315(i32) + 320: 52(ivec2) CompositeConstruct 319 319 + 321: 52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 318 320 + Store 312(i32v) 321 + 322: 52(ivec2) Load 312(i32v) + 324: 52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 322 323 + Store 312(i32v) 324 + 326: 184(ivec3) Load 325(u32v) + 328: 14(int) Load 327(u32) + 329: 184(ivec3) CompositeConstruct 328 328 328 + 330: 184(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 326 329 + Store 325(u32v) 330 + 331: 184(ivec3) Load 325(u32v) + 333: 184(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 331 332 + Store 325(u32v) 333 + 334: 52(ivec2) Load 312(i32v) + 335: 18(int) Load 315(i32) + 336: 52(ivec2) CompositeConstruct 335 335 + 337: 52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 334 336 + Store 312(i32v) 337 + 338: 52(ivec2) Load 312(i32v) + 339: 52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 338 323 + Store 312(i32v) 339 + 340: 184(ivec3) Load 325(u32v) + 341: 14(int) Load 327(u32) + 342: 184(ivec3) CompositeConstruct 341 341 341 + 343: 184(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 340 342 + Store 325(u32v) 343 + 344: 184(ivec3) Load 325(u32v) + 345: 184(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 344 332 + Store 325(u32v) 345 + 346: 52(ivec2) Load 312(i32v) + 347: 18(int) Load 315(i32) + 348: 18(int) SNegate 347 + 349: 18(int) Load 315(i32) + 350: 52(ivec2) CompositeConstruct 348 348 + 351: 52(ivec2) CompositeConstruct 349 349 + 352: 52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 346 350 351 + Store 312(i32v) 352 + 353: 52(ivec2) Load 312(i32v) + 354: 52(ivec2) Load 312(i32v) + 355: 52(ivec2) SNegate 354 + 356: 52(ivec2) Load 312(i32v) + 357: 52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 353 355 356 + Store 312(i32v) 357 + 358: 184(ivec3) Load 325(u32v) + 359: 14(int) Load 327(u32) + 360: 14(int) SNegate 359 + 361: 14(int) Load 327(u32) + 362: 184(ivec3) CompositeConstruct 360 360 360 + 363: 184(ivec3) CompositeConstruct 361 361 361 + 364: 184(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 358 362 363 + Store 325(u32v) 364 + 365: 184(ivec3) Load 325(u32v) + 366: 184(ivec3) Load 325(u32v) + 367: 184(ivec3) SNegate 366 + 368: 184(ivec3) Load 325(u32v) + 369: 184(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 365 367 368 + Store 325(u32v) 369 + 370: 19(ptr) AccessChain 312(i32v) 175 + 371: 18(int) Load 370 + 372: 19(ptr) AccessChain 312(i32v) 176 + 373: 18(int) Load 372 + 375: 18(int) Select 374 373 371 + Store 315(i32) 375 + 376: 18(int) Load 315(i32) + 377: 52(ivec2) CompositeConstruct 376 376 + 378: 18(int) Load 315(i32) + 379: 18(int) SNegate 378 + 380: 52(ivec2) CompositeConstruct 379 379 + 383: 52(ivec2) Select 382 380 377 + Store 312(i32v) 383 + 384: 38(ptr) AccessChain 325(u32v) 175 + 385: 14(int) Load 384 + 386: 38(ptr) AccessChain 325(u32v) 176 + 387: 14(int) Load 386 + 388: 14(int) Select 374 387 385 + Store 327(u32) 388 + 389: 14(int) Load 327(u32) + 390: 184(ivec3) CompositeConstruct 389 389 389 + 391: 14(int) Load 327(u32) + 392: 14(int) SNegate 391 + 393: 184(ivec3) CompositeConstruct 392 392 392 + 396: 184(ivec3) Select 395 393 390 + Store 325(u32v) 396 + 400: 397(ivec4) Load 399(i8v4) + 401: 18(int) Bitcast 400 + Store 315(i32) 401 + 403: 101(ivec2) Load 402(i16v2) + 404: 18(int) Bitcast 403 + Store 315(i32) 404 + 408: 405(ivec4) Load 407(u8v4) + 409: 14(int) Bitcast 408 + Store 327(u32) 409 + 411: 130(ivec2) Load 410(u16v2) + 412: 14(int) Bitcast 411 + Store 327(u32) 412 + 414: 57(int) Load 413(i64) + 415: 52(ivec2) Bitcast 414 + Store 312(i32v) 415 + 419: 63(int) Load 418(u64) + 420: 49(ivec2) Bitcast 419 + Store 416(u32v2) 420 + 423: 184(ivec3) Load 325(u32v) + 424: 14(int) Load 327(u32) + 425: 184(ivec3) CompositeConstruct 424 424 424 + 426: 394(bvec3) ULessThan 423 425 + Store 422(bv) 426 + 427: 52(ivec2) Load 312(i32v) + 428: 18(int) Load 315(i32) + 429: 52(ivec2) CompositeConstruct 428 428 + 430: 166(bvec2) SLessThan 427 429 + 431: 394(bvec3) Load 422(bv) + 432: 394(bvec3) VectorShuffle 431 430 3 4 2 + Store 422(bv) 432 + 433: 184(ivec3) Load 325(u32v) + 434: 14(int) Load 327(u32) + 435: 184(ivec3) CompositeConstruct 434 434 434 + 436: 394(bvec3) ULessThanEqual 433 435 + Store 422(bv) 436 + 437: 52(ivec2) Load 312(i32v) + 438: 18(int) Load 315(i32) + 439: 52(ivec2) CompositeConstruct 438 438 + 440: 166(bvec2) SLessThanEqual 437 439 + 441: 394(bvec3) Load 422(bv) + 442: 394(bvec3) VectorShuffle 441 440 3 4 2 + Store 422(bv) 442 + 443: 184(ivec3) Load 325(u32v) + 444: 14(int) Load 327(u32) + 445: 184(ivec3) CompositeConstruct 444 444 444 + 446: 394(bvec3) UGreaterThan 443 445 + Store 422(bv) 446 + 447: 52(ivec2) Load 312(i32v) + 448: 18(int) Load 315(i32) + 449: 52(ivec2) CompositeConstruct 448 448 + 450: 166(bvec2) SGreaterThan 447 449 + 451: 394(bvec3) Load 422(bv) + 452: 394(bvec3) VectorShuffle 451 450 3 4 2 + Store 422(bv) 452 + 453: 184(ivec3) Load 325(u32v) + 454: 14(int) Load 327(u32) + 455: 184(ivec3) CompositeConstruct 454 454 454 + 456: 394(bvec3) UGreaterThanEqual 453 455 + Store 422(bv) 456 + 457: 52(ivec2) Load 312(i32v) + 458: 18(int) Load 315(i32) + 459: 52(ivec2) CompositeConstruct 458 458 + 460: 166(bvec2) SGreaterThanEqual 457 459 + 461: 394(bvec3) Load 422(bv) + 462: 394(bvec3) VectorShuffle 461 460 3 4 2 + Store 422(bv) 462 + 463: 184(ivec3) Load 325(u32v) + 464: 14(int) Load 327(u32) + 465: 184(ivec3) CompositeConstruct 464 464 464 + 466: 394(bvec3) IEqual 463 465 + Store 422(bv) 466 + 467: 52(ivec2) Load 312(i32v) + 468: 18(int) Load 315(i32) + 469: 52(ivec2) CompositeConstruct 468 468 + 470: 166(bvec2) IEqual 467 469 + 471: 394(bvec3) Load 422(bv) + 472: 394(bvec3) VectorShuffle 471 470 3 4 2 + Store 422(bv) 472 + 473: 184(ivec3) Load 325(u32v) + 474: 14(int) Load 327(u32) + 475: 184(ivec3) CompositeConstruct 474 474 474 + 476: 394(bvec3) INotEqual 473 475 + Store 422(bv) 476 + 477: 52(ivec2) Load 312(i32v) + 478: 18(int) Load 315(i32) + 479: 52(ivec2) CompositeConstruct 478 478 + 480: 166(bvec2) INotEqual 477 479 + 481: 394(bvec3) Load 422(bv) + 482: 394(bvec3) VectorShuffle 481 480 3 4 2 + Store 422(bv) 482 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.int64.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.int64.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.int64.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.int64.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,7 @@ spv.int64.frag // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 480 +// Generated by (magic number): 80006 +// Id's are bound by 488 Capability Shader Capability Float64 @@ -12,6 +12,7 @@ ExecutionMode 4 OriginUpperLeft Source GLSL 450 SourceExtension "GL_ARB_gpu_shader_int64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int64" Name 4 "main" Name 6 "literal(" Name 8 "typeCast(" @@ -36,38 +37,38 @@ Name 139 "i64" Name 159 "i" Name 166 "uv" - Name 218 "b" - Name 278 "i64v" - Name 281 "i64" - Name 291 "u64v" - Name 293 "u64" - Name 365 "dv" - Name 384 "iv" - Name 389 "uv" - Name 393 "bv" - Name 454 "Block" - MemberName 454(Block) 0 "i64v" - MemberName 454(Block) 1 "u64" - Name 456 "block" - Name 457 "si64" - Name 458 "su64" - Name 459 "si" - Name 460 "su" - Name 461 "sb" + Name 226 "b" + Name 286 "i64v" + Name 289 "i64" + Name 299 "u64v" + Name 301 "u64" + Name 373 "dv" + Name 392 "iv" + Name 397 "uv" + Name 401 "bv" + Name 462 "Block" + MemberName 462(Block) 0 "i64v" + MemberName 462(Block) 1 "u64" + Name 464 "block" + Name 465 "si64" + Name 466 "su64" + Name 467 "si" + Name 468 "su" + Name 469 "sb" MemberDecorate 28(Uniforms) 0 Offset 0 Decorate 28(Uniforms) Block Decorate 30 DescriptorSet 0 Decorate 30 Binding 0 - MemberDecorate 454(Block) 0 Offset 0 - MemberDecorate 454(Block) 1 Offset 24 - Decorate 454(Block) Block - Decorate 456(block) DescriptorSet 0 - Decorate 456(block) Binding 1 - Decorate 457(si64) SpecId 100 - Decorate 458(su64) SpecId 101 - Decorate 459(si) SpecId 102 - Decorate 460(su) SpecId 103 - Decorate 461(sb) SpecId 104 + MemberDecorate 462(Block) 0 Offset 0 + MemberDecorate 462(Block) 1 Offset 24 + Decorate 462(Block) Block + Decorate 464(block) DescriptorSet 0 + Decorate 464(block) Binding 1 + Decorate 465(si64) SpecId 100 + Decorate 466(su64) SpecId 101 + Decorate 467(si) SpecId 102 + Decorate 468(su) SpecId 103 + Decorate 469(sb) SpecId 104 2: TypeVoid 3: TypeFunction 2 14: TypeInt 64 0 @@ -128,52 +129,52 @@ 164: TypeVector 21(int) 3 165: TypePointer Function 164(ivec3) 199: TypeVector 31(int) 3 - 202: 21(int) Constant 1 - 203: TypePointer Function 21(int) - 209: 21(int) Constant 2 - 217: TypePointer Function 55(bool) - 219: 21(int) Constant 0 - 289: 52(ivec2) ConstantComposite 25 25 - 298: 132(ivec3) ConstantComposite 69 69 69 - 340: 55(bool) ConstantTrue - 347: 55(bool) ConstantFalse - 348: 56(bvec2) ConstantComposite 347 347 - 360: TypeVector 55(bool) 3 - 361: 360(bvec3) ConstantComposite 347 347 347 - 363: TypeVector 94(float) 3 - 364: TypePointer Function 363(fvec3) - 369: TypePointer Function 94(float) - 380: 31(int) Constant 1 - 381: 31(int) Constant 2 - 382: 74(ivec2) ConstantComposite 380 381 - 387: 81(ivec2) ConstantComposite 209 22 - 392: TypePointer Function 360(bvec3) - 454(Block): TypeStruct 136(ivec3) 14(int) - 455: TypePointer Uniform 454(Block) - 456(block): 455(ptr) Variable Uniform - 457(si64): 18(int) SpecConstant 4294967286 4294967295 - 458(su64): 14(int) SpecConstant 20 0 - 459(si): 31(int) SpecConstant 4294967291 - 460(su): 21(int) SpecConstant 4 - 461(sb): 55(bool) SpecConstantTrue - 462: 55(bool) SpecConstantOp 171 457(si64) 69 - 463: 55(bool) SpecConstantOp 171 458(su64) 69 - 464: 18(int) SpecConstantOp 169 461(sb) 61 60 - 465: 14(int) SpecConstantOp 169 461(sb) 70 69 - 466: 31(int) SpecConstantOp 114 457(si64) - 467: 18(int) SpecConstantOp 114 459(si) - 468: 21(int) SpecConstantOp 113 458(su64) - 469: 14(int) SpecConstantOp 113 460(su) - 470: 18(int) SpecConstantOp 128 458(su64) 69 - 471: 14(int) SpecConstantOp 128 457(si64) 69 - 472: 21(int) SpecConstantOp 113 458(su64) - 473: 31(int) SpecConstantOp 128 472 219 - 474: 18(int) SpecConstantOp 114 459(si) - 475: 14(int) SpecConstantOp 128 474 69 - 476: 31(int) SpecConstantOp 114 457(si64) - 477: 21(int) SpecConstantOp 128 476 219 - 478: 14(int) SpecConstantOp 113 460(su) - 479: 18(int) SpecConstantOp 128 478 69 + 203: 21(int) Constant 1 + 204: TypePointer Function 21(int) + 217: 21(int) Constant 2 + 225: TypePointer Function 55(bool) + 227: 21(int) Constant 0 + 297: 52(ivec2) ConstantComposite 25 25 + 306: 132(ivec3) ConstantComposite 69 69 69 + 348: 55(bool) ConstantTrue + 355: 55(bool) ConstantFalse + 356: 56(bvec2) ConstantComposite 355 355 + 368: TypeVector 55(bool) 3 + 369: 368(bvec3) ConstantComposite 355 355 355 + 371: TypeVector 94(float) 3 + 372: TypePointer Function 371(fvec3) + 377: TypePointer Function 94(float) + 388: 31(int) Constant 1 + 389: 31(int) Constant 2 + 390: 74(ivec2) ConstantComposite 388 389 + 395: 81(ivec2) ConstantComposite 217 22 + 400: TypePointer Function 368(bvec3) + 462(Block): TypeStruct 136(ivec3) 14(int) + 463: TypePointer Uniform 462(Block) + 464(block): 463(ptr) Variable Uniform + 465(si64): 18(int) SpecConstant 4294967286 4294967295 + 466(su64): 14(int) SpecConstant 20 0 + 467(si): 31(int) SpecConstant 4294967291 + 468(su): 21(int) SpecConstant 4 + 469(sb): 55(bool) SpecConstantTrue + 470: 55(bool) SpecConstantOp 171 465(si64) 69 + 471: 55(bool) SpecConstantOp 171 466(su64) 69 + 472: 18(int) SpecConstantOp 169 469(sb) 61 60 + 473: 14(int) SpecConstantOp 169 469(sb) 70 69 + 474: 31(int) SpecConstantOp 114 465(si64) + 475: 18(int) SpecConstantOp 114 467(si) + 476: 21(int) SpecConstantOp 113 466(su64) + 477: 14(int) SpecConstantOp 113 468(su) + 478: 18(int) SpecConstantOp 128 466(su64) 69 + 479: 14(int) SpecConstantOp 128 465(si64) 69 + 480: 31(int) SpecConstantOp 113 466(su64) + 481: 31(int) SpecConstantOp 128 480 227 + 482: 18(int) SpecConstantOp 114 467(si) + 483: 14(int) SpecConstantOp 128 482 69 + 484: 31(int) SpecConstantOp 114 465(si64) + 485: 21(int) SpecConstantOp 128 484 227 + 486: 18(int) SpecConstantOp 113 468(su) + 487: 18(int) SpecConstantOp 128 486 69 4(main): 2 Function None 3 5: Label Store 16(u64Max) 17 @@ -267,11 +268,11 @@ 122: 81(ivec2) Bitcast 121 Store 83(uv) 122 123: 81(ivec2) Load 83(uv) - 124: 65(ivec2) UConvert 123 + 124: 52(ivec2) UConvert 123 125: 52(ivec2) Bitcast 124 Store 54(i64v) 125 126: 65(ivec2) Load 67(u64v) - 127: 81(ivec2) UConvert 126 + 127: 74(ivec2) UConvert 126 128: 74(ivec2) Bitcast 127 Store 76(iv) 128 129: 74(ivec2) Load 76(iv) @@ -286,7 +287,7 @@ 139(i64): 19(ptr) Variable Function 159(i): 158(ptr) Variable Function 166(uv): 165(ptr) Variable Function - 218(b): 217(ptr) Variable Function + 226(b): 225(ptr) Variable Function 135: 132(ivec3) Load 134(u64v) 137: 136(ivec3) CompositeConstruct 61 61 61 138: 132(ivec3) IAdd 135 137 @@ -359,298 +360,308 @@ 195: 18(int) SConvert 194 196: 18(int) SMod 193 195 Store 139(i64) 196 - 197: 31(int) Load 159(i) - 198: 132(ivec3) Load 134(u64v) - 200: 199(ivec3) CompositeConstruct 197 197 197 - 201: 132(ivec3) ShiftLeftLogical 198 200 + 197: 132(ivec3) Load 134(u64v) + 198: 31(int) Load 159(i) + 200: 199(ivec3) CompositeConstruct 198 198 198 + 201: 132(ivec3) ShiftLeftLogical 197 200 Store 134(u64v) 201 - 204: 203(ptr) AccessChain 166(uv) 202 - 205: 21(int) Load 204 - 206: 18(int) Load 139(i64) - 207: 18(int) ShiftRightArithmetic 206 205 + 202: 18(int) Load 139(i64) + 205: 204(ptr) AccessChain 166(uv) 203 + 206: 21(int) Load 205 + 207: 18(int) ShiftRightArithmetic 202 206 Store 139(i64) 207 - 208: 18(int) Load 139(i64) - 210: 40(ptr) AccessChain 134(u64v) 209 - 211: 14(int) Load 210 - 212: 18(int) ShiftLeftLogical 208 211 - Store 139(i64) 212 - 213: 132(ivec3) Load 134(u64v) + 208: 31(int) Load 159(i) + 209: 132(ivec3) Load 134(u64v) + 210: 199(ivec3) CompositeConstruct 208 208 208 + 211: 132(ivec3) ShiftLeftLogical 209 210 + Store 134(u64v) 211 + 212: 204(ptr) AccessChain 166(uv) 203 + 213: 21(int) Load 212 214: 18(int) Load 139(i64) - 215: 136(ivec3) CompositeConstruct 214 214 214 - 216: 132(ivec3) ShiftLeftLogical 213 215 - Store 134(u64v) 216 - 220: 40(ptr) AccessChain 134(u64v) 219 - 221: 14(int) Load 220 + 215: 18(int) ShiftRightArithmetic 214 213 + Store 139(i64) 215 + 216: 18(int) Load 139(i64) + 218: 40(ptr) AccessChain 134(u64v) 217 + 219: 14(int) Load 218 + 220: 18(int) ShiftLeftLogical 216 219 + Store 139(i64) 220 + 221: 132(ivec3) Load 134(u64v) 222: 18(int) Load 139(i64) - 223: 14(int) Bitcast 222 - 224: 55(bool) INotEqual 221 223 - Store 218(b) 224 - 225: 18(int) Load 139(i64) - 226: 14(int) Bitcast 225 - 227: 40(ptr) AccessChain 134(u64v) 219 - 228: 14(int) Load 227 - 229: 55(bool) IEqual 226 228 - Store 218(b) 229 - 230: 40(ptr) AccessChain 134(u64v) 219 - 231: 14(int) Load 230 - 232: 203(ptr) AccessChain 166(uv) 202 - 233: 21(int) Load 232 - 234: 14(int) UConvert 233 - 235: 55(bool) UGreaterThan 231 234 - Store 218(b) 235 - 236: 18(int) Load 139(i64) - 237: 31(int) Load 159(i) - 238: 18(int) SConvert 237 - 239: 55(bool) SLessThan 236 238 - Store 218(b) 239 - 240: 40(ptr) AccessChain 134(u64v) 202 - 241: 14(int) Load 240 - 242: 203(ptr) AccessChain 166(uv) 219 - 243: 21(int) Load 242 - 244: 14(int) UConvert 243 - 245: 55(bool) UGreaterThanEqual 241 244 - Store 218(b) 245 - 246: 18(int) Load 139(i64) - 247: 31(int) Load 159(i) - 248: 18(int) SConvert 247 - 249: 55(bool) SLessThanEqual 246 248 - Store 218(b) 249 - 250: 31(int) Load 159(i) - 251: 18(int) SConvert 250 - 252: 14(int) Bitcast 251 - 253: 132(ivec3) Load 134(u64v) - 254: 132(ivec3) CompositeConstruct 252 252 252 - 255: 132(ivec3) BitwiseOr 253 254 - Store 134(u64v) 255 - 256: 18(int) Load 139(i64) - 257: 31(int) Load 159(i) - 258: 18(int) SConvert 257 - 259: 18(int) BitwiseOr 256 258 - Store 139(i64) 259 - 260: 31(int) Load 159(i) - 261: 18(int) SConvert 260 - 262: 18(int) Load 139(i64) - 263: 18(int) BitwiseAnd 262 261 - Store 139(i64) 263 - 264: 132(ivec3) Load 134(u64v) - 265: 164(ivec3) Load 166(uv) - 266: 132(ivec3) UConvert 265 - 267: 132(ivec3) BitwiseAnd 264 266 - Store 134(u64v) 267 - 268: 18(int) Load 139(i64) - 269: 14(int) Bitcast 268 - 270: 132(ivec3) Load 134(u64v) - 271: 132(ivec3) CompositeConstruct 269 269 269 - 272: 132(ivec3) BitwiseXor 270 271 - Store 134(u64v) 272 - 273: 132(ivec3) Load 134(u64v) - 274: 18(int) Load 139(i64) - 275: 14(int) Bitcast 274 - 276: 132(ivec3) CompositeConstruct 275 275 275 - 277: 132(ivec3) BitwiseXor 273 276 - Store 134(u64v) 277 + 223: 136(ivec3) CompositeConstruct 222 222 222 + 224: 132(ivec3) ShiftLeftLogical 221 223 + Store 134(u64v) 224 + 228: 40(ptr) AccessChain 134(u64v) 227 + 229: 14(int) Load 228 + 230: 18(int) Load 139(i64) + 231: 14(int) Bitcast 230 + 232: 55(bool) INotEqual 229 231 + Store 226(b) 232 + 233: 18(int) Load 139(i64) + 234: 14(int) Bitcast 233 + 235: 40(ptr) AccessChain 134(u64v) 227 + 236: 14(int) Load 235 + 237: 55(bool) IEqual 234 236 + Store 226(b) 237 + 238: 40(ptr) AccessChain 134(u64v) 227 + 239: 14(int) Load 238 + 240: 204(ptr) AccessChain 166(uv) 203 + 241: 21(int) Load 240 + 242: 14(int) UConvert 241 + 243: 55(bool) UGreaterThan 239 242 + Store 226(b) 243 + 244: 18(int) Load 139(i64) + 245: 31(int) Load 159(i) + 246: 18(int) SConvert 245 + 247: 55(bool) SLessThan 244 246 + Store 226(b) 247 + 248: 40(ptr) AccessChain 134(u64v) 203 + 249: 14(int) Load 248 + 250: 204(ptr) AccessChain 166(uv) 227 + 251: 21(int) Load 250 + 252: 14(int) UConvert 251 + 253: 55(bool) UGreaterThanEqual 249 252 + Store 226(b) 253 + 254: 18(int) Load 139(i64) + 255: 31(int) Load 159(i) + 256: 18(int) SConvert 255 + 257: 55(bool) SLessThanEqual 254 256 + Store 226(b) 257 + 258: 31(int) Load 159(i) + 259: 18(int) SConvert 258 + 260: 14(int) Bitcast 259 + 261: 132(ivec3) Load 134(u64v) + 262: 132(ivec3) CompositeConstruct 260 260 260 + 263: 132(ivec3) BitwiseOr 261 262 + Store 134(u64v) 263 + 264: 18(int) Load 139(i64) + 265: 31(int) Load 159(i) + 266: 18(int) SConvert 265 + 267: 18(int) BitwiseOr 264 266 + Store 139(i64) 267 + 268: 31(int) Load 159(i) + 269: 18(int) SConvert 268 + 270: 18(int) Load 139(i64) + 271: 18(int) BitwiseAnd 270 269 + Store 139(i64) 271 + 272: 132(ivec3) Load 134(u64v) + 273: 164(ivec3) Load 166(uv) + 274: 132(ivec3) UConvert 273 + 275: 132(ivec3) BitwiseAnd 272 274 + Store 134(u64v) 275 + 276: 18(int) Load 139(i64) + 277: 14(int) Bitcast 276 + 278: 132(ivec3) Load 134(u64v) + 279: 132(ivec3) CompositeConstruct 277 277 277 + 280: 132(ivec3) BitwiseXor 278 279 + Store 134(u64v) 280 + 281: 132(ivec3) Load 134(u64v) + 282: 18(int) Load 139(i64) + 283: 14(int) Bitcast 282 + 284: 132(ivec3) CompositeConstruct 283 283 283 + 285: 132(ivec3) BitwiseXor 281 284 + Store 134(u64v) 285 Return FunctionEnd 12(builtinFuncs(): 2 Function None 3 13: Label - 278(i64v): 53(ptr) Variable Function - 281(i64): 19(ptr) Variable Function - 291(u64v): 133(ptr) Variable Function - 293(u64): 40(ptr) Variable Function - 365(dv): 364(ptr) Variable Function - 384(iv): 75(ptr) Variable Function - 389(uv): 82(ptr) Variable Function - 393(bv): 392(ptr) Variable Function - 279: 52(ivec2) Load 278(i64v) - 280: 52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 279 - Store 278(i64v) 280 - 282: 18(int) Load 281(i64) - 283: 18(int) ExtInst 1(GLSL.std.450) 7(SSign) 282 - Store 281(i64) 283 - 284: 52(ivec2) Load 278(i64v) - 285: 18(int) Load 281(i64) - 286: 52(ivec2) CompositeConstruct 285 285 - 287: 52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 284 286 - Store 278(i64v) 287 - 288: 52(ivec2) Load 278(i64v) - 290: 52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 288 289 - Store 278(i64v) 290 - 292: 132(ivec3) Load 291(u64v) - 294: 14(int) Load 293(u64) - 295: 132(ivec3) CompositeConstruct 294 294 294 - 296: 132(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 292 295 - Store 291(u64v) 296 - 297: 132(ivec3) Load 291(u64v) - 299: 132(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 297 298 - Store 291(u64v) 299 - 300: 52(ivec2) Load 278(i64v) - 301: 18(int) Load 281(i64) - 302: 52(ivec2) CompositeConstruct 301 301 - 303: 52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 300 302 - Store 278(i64v) 303 - 304: 52(ivec2) Load 278(i64v) - 305: 52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 304 289 - Store 278(i64v) 305 - 306: 132(ivec3) Load 291(u64v) - 307: 14(int) Load 293(u64) - 308: 132(ivec3) CompositeConstruct 307 307 307 - 309: 132(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 306 308 - Store 291(u64v) 309 - 310: 132(ivec3) Load 291(u64v) - 311: 132(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 310 298 - Store 291(u64v) 311 - 312: 52(ivec2) Load 278(i64v) - 313: 18(int) Load 281(i64) - 314: 18(int) SNegate 313 - 315: 18(int) Load 281(i64) - 316: 52(ivec2) CompositeConstruct 314 314 - 317: 52(ivec2) CompositeConstruct 315 315 - 318: 52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 312 316 317 - Store 278(i64v) 318 - 319: 52(ivec2) Load 278(i64v) - 320: 52(ivec2) Load 278(i64v) - 321: 52(ivec2) SNegate 320 - 322: 52(ivec2) Load 278(i64v) - 323: 52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 319 321 322 - Store 278(i64v) 323 - 324: 132(ivec3) Load 291(u64v) - 325: 14(int) Load 293(u64) - 326: 14(int) SNegate 325 - 327: 14(int) Load 293(u64) - 328: 132(ivec3) CompositeConstruct 326 326 326 - 329: 132(ivec3) CompositeConstruct 327 327 327 - 330: 132(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 324 328 329 - Store 291(u64v) 330 - 331: 132(ivec3) Load 291(u64v) - 332: 132(ivec3) Load 291(u64v) - 333: 132(ivec3) SNegate 332 - 334: 132(ivec3) Load 291(u64v) - 335: 132(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 331 333 334 - Store 291(u64v) 335 - 336: 19(ptr) AccessChain 278(i64v) 219 - 337: 18(int) Load 336 - 338: 19(ptr) AccessChain 278(i64v) 202 - 339: 18(int) Load 338 - 341: 18(int) Select 340 339 337 - Store 281(i64) 341 - 342: 18(int) Load 281(i64) - 343: 52(ivec2) CompositeConstruct 342 342 - 344: 18(int) Load 281(i64) - 345: 18(int) SNegate 344 - 346: 52(ivec2) CompositeConstruct 345 345 - 349: 52(ivec2) Select 348 346 343 - Store 278(i64v) 349 - 350: 40(ptr) AccessChain 291(u64v) 219 - 351: 14(int) Load 350 - 352: 40(ptr) AccessChain 291(u64v) 202 - 353: 14(int) Load 352 - 354: 14(int) Select 340 353 351 - Store 293(u64) 354 - 355: 14(int) Load 293(u64) - 356: 132(ivec3) CompositeConstruct 355 355 355 - 357: 14(int) Load 293(u64) - 358: 14(int) SNegate 357 - 359: 132(ivec3) CompositeConstruct 358 358 358 - 362: 132(ivec3) Select 361 359 356 - Store 291(u64v) 362 - 366: 363(fvec3) Load 365(dv) - 367: 95(fvec2) VectorShuffle 366 366 0 1 - 368: 52(ivec2) Bitcast 367 - Store 278(i64v) 368 - 370: 369(ptr) AccessChain 365(dv) 209 - 371: 94(float) Load 370 - 372: 14(int) Bitcast 371 - 373: 40(ptr) AccessChain 291(u64v) 219 - Store 373 372 - 374: 52(ivec2) Load 278(i64v) - 375: 95(fvec2) Bitcast 374 - 376: 363(fvec3) Load 365(dv) - 377: 363(fvec3) VectorShuffle 376 375 3 4 2 - Store 365(dv) 377 - 378: 132(ivec3) Load 291(u64v) - 379: 363(fvec3) Bitcast 378 - Store 365(dv) 379 - 383: 18(int) Bitcast 382 - Store 281(i64) 383 - 385: 18(int) Load 281(i64) - 386: 74(ivec2) Bitcast 385 - Store 384(iv) 386 - 388: 14(int) Bitcast 387 - Store 293(u64) 388 - 390: 14(int) Load 293(u64) - 391: 81(ivec2) Bitcast 390 - Store 389(uv) 391 - 394: 132(ivec3) Load 291(u64v) - 395: 14(int) Load 293(u64) - 396: 132(ivec3) CompositeConstruct 395 395 395 - 397: 360(bvec3) ULessThan 394 396 - Store 393(bv) 397 - 398: 52(ivec2) Load 278(i64v) - 399: 18(int) Load 281(i64) - 400: 52(ivec2) CompositeConstruct 399 399 - 401: 56(bvec2) SLessThan 398 400 - 402: 360(bvec3) Load 393(bv) - 403: 360(bvec3) VectorShuffle 402 401 3 4 2 - Store 393(bv) 403 - 404: 132(ivec3) Load 291(u64v) - 405: 14(int) Load 293(u64) - 406: 132(ivec3) CompositeConstruct 405 405 405 - 407: 360(bvec3) ULessThanEqual 404 406 - Store 393(bv) 407 - 408: 52(ivec2) Load 278(i64v) - 409: 18(int) Load 281(i64) - 410: 52(ivec2) CompositeConstruct 409 409 - 411: 56(bvec2) SLessThanEqual 408 410 - 412: 360(bvec3) Load 393(bv) - 413: 360(bvec3) VectorShuffle 412 411 3 4 2 - Store 393(bv) 413 - 414: 132(ivec3) Load 291(u64v) - 415: 14(int) Load 293(u64) - 416: 132(ivec3) CompositeConstruct 415 415 415 - 417: 360(bvec3) UGreaterThan 414 416 - Store 393(bv) 417 - 418: 52(ivec2) Load 278(i64v) - 419: 18(int) Load 281(i64) - 420: 52(ivec2) CompositeConstruct 419 419 - 421: 56(bvec2) SGreaterThan 418 420 - 422: 360(bvec3) Load 393(bv) - 423: 360(bvec3) VectorShuffle 422 421 3 4 2 - Store 393(bv) 423 - 424: 132(ivec3) Load 291(u64v) - 425: 14(int) Load 293(u64) - 426: 132(ivec3) CompositeConstruct 425 425 425 - 427: 360(bvec3) UGreaterThanEqual 424 426 - Store 393(bv) 427 - 428: 52(ivec2) Load 278(i64v) - 429: 18(int) Load 281(i64) - 430: 52(ivec2) CompositeConstruct 429 429 - 431: 56(bvec2) SGreaterThanEqual 428 430 - 432: 360(bvec3) Load 393(bv) - 433: 360(bvec3) VectorShuffle 432 431 3 4 2 - Store 393(bv) 433 - 434: 132(ivec3) Load 291(u64v) - 435: 14(int) Load 293(u64) - 436: 132(ivec3) CompositeConstruct 435 435 435 - 437: 360(bvec3) IEqual 434 436 - Store 393(bv) 437 - 438: 52(ivec2) Load 278(i64v) - 439: 18(int) Load 281(i64) - 440: 52(ivec2) CompositeConstruct 439 439 - 441: 56(bvec2) IEqual 438 440 - 442: 360(bvec3) Load 393(bv) - 443: 360(bvec3) VectorShuffle 442 441 3 4 2 - Store 393(bv) 443 - 444: 132(ivec3) Load 291(u64v) - 445: 14(int) Load 293(u64) - 446: 132(ivec3) CompositeConstruct 445 445 445 - 447: 360(bvec3) INotEqual 444 446 - Store 393(bv) 447 - 448: 52(ivec2) Load 278(i64v) - 449: 18(int) Load 281(i64) - 450: 52(ivec2) CompositeConstruct 449 449 - 451: 56(bvec2) INotEqual 448 450 - 452: 360(bvec3) Load 393(bv) - 453: 360(bvec3) VectorShuffle 452 451 3 4 2 - Store 393(bv) 453 + 286(i64v): 53(ptr) Variable Function + 289(i64): 19(ptr) Variable Function + 299(u64v): 133(ptr) Variable Function + 301(u64): 40(ptr) Variable Function + 373(dv): 372(ptr) Variable Function + 392(iv): 75(ptr) Variable Function + 397(uv): 82(ptr) Variable Function + 401(bv): 400(ptr) Variable Function + 287: 52(ivec2) Load 286(i64v) + 288: 52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 287 + Store 286(i64v) 288 + 290: 18(int) Load 289(i64) + 291: 18(int) ExtInst 1(GLSL.std.450) 7(SSign) 290 + Store 289(i64) 291 + 292: 52(ivec2) Load 286(i64v) + 293: 18(int) Load 289(i64) + 294: 52(ivec2) CompositeConstruct 293 293 + 295: 52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 292 294 + Store 286(i64v) 295 + 296: 52(ivec2) Load 286(i64v) + 298: 52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 296 297 + Store 286(i64v) 298 + 300: 132(ivec3) Load 299(u64v) + 302: 14(int) Load 301(u64) + 303: 132(ivec3) CompositeConstruct 302 302 302 + 304: 132(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 300 303 + Store 299(u64v) 304 + 305: 132(ivec3) Load 299(u64v) + 307: 132(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 305 306 + Store 299(u64v) 307 + 308: 52(ivec2) Load 286(i64v) + 309: 18(int) Load 289(i64) + 310: 52(ivec2) CompositeConstruct 309 309 + 311: 52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 308 310 + Store 286(i64v) 311 + 312: 52(ivec2) Load 286(i64v) + 313: 52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 312 297 + Store 286(i64v) 313 + 314: 132(ivec3) Load 299(u64v) + 315: 14(int) Load 301(u64) + 316: 132(ivec3) CompositeConstruct 315 315 315 + 317: 132(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 314 316 + Store 299(u64v) 317 + 318: 132(ivec3) Load 299(u64v) + 319: 132(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 318 306 + Store 299(u64v) 319 + 320: 52(ivec2) Load 286(i64v) + 321: 18(int) Load 289(i64) + 322: 18(int) SNegate 321 + 323: 18(int) Load 289(i64) + 324: 52(ivec2) CompositeConstruct 322 322 + 325: 52(ivec2) CompositeConstruct 323 323 + 326: 52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 320 324 325 + Store 286(i64v) 326 + 327: 52(ivec2) Load 286(i64v) + 328: 52(ivec2) Load 286(i64v) + 329: 52(ivec2) SNegate 328 + 330: 52(ivec2) Load 286(i64v) + 331: 52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 327 329 330 + Store 286(i64v) 331 + 332: 132(ivec3) Load 299(u64v) + 333: 14(int) Load 301(u64) + 334: 14(int) SNegate 333 + 335: 14(int) Load 301(u64) + 336: 132(ivec3) CompositeConstruct 334 334 334 + 337: 132(ivec3) CompositeConstruct 335 335 335 + 338: 132(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 332 336 337 + Store 299(u64v) 338 + 339: 132(ivec3) Load 299(u64v) + 340: 132(ivec3) Load 299(u64v) + 341: 132(ivec3) SNegate 340 + 342: 132(ivec3) Load 299(u64v) + 343: 132(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 339 341 342 + Store 299(u64v) 343 + 344: 19(ptr) AccessChain 286(i64v) 227 + 345: 18(int) Load 344 + 346: 19(ptr) AccessChain 286(i64v) 203 + 347: 18(int) Load 346 + 349: 18(int) Select 348 347 345 + Store 289(i64) 349 + 350: 18(int) Load 289(i64) + 351: 52(ivec2) CompositeConstruct 350 350 + 352: 18(int) Load 289(i64) + 353: 18(int) SNegate 352 + 354: 52(ivec2) CompositeConstruct 353 353 + 357: 52(ivec2) Select 356 354 351 + Store 286(i64v) 357 + 358: 40(ptr) AccessChain 299(u64v) 227 + 359: 14(int) Load 358 + 360: 40(ptr) AccessChain 299(u64v) 203 + 361: 14(int) Load 360 + 362: 14(int) Select 348 361 359 + Store 301(u64) 362 + 363: 14(int) Load 301(u64) + 364: 132(ivec3) CompositeConstruct 363 363 363 + 365: 14(int) Load 301(u64) + 366: 14(int) SNegate 365 + 367: 132(ivec3) CompositeConstruct 366 366 366 + 370: 132(ivec3) Select 369 367 364 + Store 299(u64v) 370 + 374: 371(fvec3) Load 373(dv) + 375: 95(fvec2) VectorShuffle 374 374 0 1 + 376: 52(ivec2) Bitcast 375 + Store 286(i64v) 376 + 378: 377(ptr) AccessChain 373(dv) 217 + 379: 94(float) Load 378 + 380: 14(int) Bitcast 379 + 381: 40(ptr) AccessChain 299(u64v) 227 + Store 381 380 + 382: 52(ivec2) Load 286(i64v) + 383: 95(fvec2) Bitcast 382 + 384: 371(fvec3) Load 373(dv) + 385: 371(fvec3) VectorShuffle 384 383 3 4 2 + Store 373(dv) 385 + 386: 132(ivec3) Load 299(u64v) + 387: 371(fvec3) Bitcast 386 + Store 373(dv) 387 + 391: 18(int) Bitcast 390 + Store 289(i64) 391 + 393: 18(int) Load 289(i64) + 394: 74(ivec2) Bitcast 393 + Store 392(iv) 394 + 396: 14(int) Bitcast 395 + Store 301(u64) 396 + 398: 14(int) Load 301(u64) + 399: 81(ivec2) Bitcast 398 + Store 397(uv) 399 + 402: 132(ivec3) Load 299(u64v) + 403: 14(int) Load 301(u64) + 404: 132(ivec3) CompositeConstruct 403 403 403 + 405: 368(bvec3) ULessThan 402 404 + Store 401(bv) 405 + 406: 52(ivec2) Load 286(i64v) + 407: 18(int) Load 289(i64) + 408: 52(ivec2) CompositeConstruct 407 407 + 409: 56(bvec2) SLessThan 406 408 + 410: 368(bvec3) Load 401(bv) + 411: 368(bvec3) VectorShuffle 410 409 3 4 2 + Store 401(bv) 411 + 412: 132(ivec3) Load 299(u64v) + 413: 14(int) Load 301(u64) + 414: 132(ivec3) CompositeConstruct 413 413 413 + 415: 368(bvec3) ULessThanEqual 412 414 + Store 401(bv) 415 + 416: 52(ivec2) Load 286(i64v) + 417: 18(int) Load 289(i64) + 418: 52(ivec2) CompositeConstruct 417 417 + 419: 56(bvec2) SLessThanEqual 416 418 + 420: 368(bvec3) Load 401(bv) + 421: 368(bvec3) VectorShuffle 420 419 3 4 2 + Store 401(bv) 421 + 422: 132(ivec3) Load 299(u64v) + 423: 14(int) Load 301(u64) + 424: 132(ivec3) CompositeConstruct 423 423 423 + 425: 368(bvec3) UGreaterThan 422 424 + Store 401(bv) 425 + 426: 52(ivec2) Load 286(i64v) + 427: 18(int) Load 289(i64) + 428: 52(ivec2) CompositeConstruct 427 427 + 429: 56(bvec2) SGreaterThan 426 428 + 430: 368(bvec3) Load 401(bv) + 431: 368(bvec3) VectorShuffle 430 429 3 4 2 + Store 401(bv) 431 + 432: 132(ivec3) Load 299(u64v) + 433: 14(int) Load 301(u64) + 434: 132(ivec3) CompositeConstruct 433 433 433 + 435: 368(bvec3) UGreaterThanEqual 432 434 + Store 401(bv) 435 + 436: 52(ivec2) Load 286(i64v) + 437: 18(int) Load 289(i64) + 438: 52(ivec2) CompositeConstruct 437 437 + 439: 56(bvec2) SGreaterThanEqual 436 438 + 440: 368(bvec3) Load 401(bv) + 441: 368(bvec3) VectorShuffle 440 439 3 4 2 + Store 401(bv) 441 + 442: 132(ivec3) Load 299(u64v) + 443: 14(int) Load 301(u64) + 444: 132(ivec3) CompositeConstruct 443 443 443 + 445: 368(bvec3) IEqual 442 444 + Store 401(bv) 445 + 446: 52(ivec2) Load 286(i64v) + 447: 18(int) Load 289(i64) + 448: 52(ivec2) CompositeConstruct 447 447 + 449: 56(bvec2) IEqual 446 448 + 450: 368(bvec3) Load 401(bv) + 451: 368(bvec3) VectorShuffle 450 449 3 4 2 + Store 401(bv) 451 + 452: 132(ivec3) Load 299(u64v) + 453: 14(int) Load 301(u64) + 454: 132(ivec3) CompositeConstruct 453 453 453 + 455: 368(bvec3) INotEqual 452 454 + Store 401(bv) 455 + 456: 52(ivec2) Load 286(i64v) + 457: 18(int) Load 289(i64) + 458: 52(ivec2) CompositeConstruct 457 457 + 459: 56(bvec2) INotEqual 456 458 + 460: 368(bvec3) Load 401(bv) + 461: 368(bvec3) VectorShuffle 460 459 3 4 2 + Store 401(bv) 461 Return FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.int8.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.int8.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.int8.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.int8.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,748 @@ +spv.int8.frag +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 531 + + Capability Shader + Capability Float16 + Capability Float64 + Capability Int64 + Capability Int16 + Capability Int8 + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + SourceExtension "GL_KHX_shader_explicit_arithmetic_types" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int8" + Name 4 "main" + Name 6 "literal(" + Name 8 "typeCast8(" + Name 10 "operators(" + Name 12 "builtinFuncs(" + Name 16 "i8" + Name 24 "Uniforms" + MemberName 24(Uniforms) 0 "index" + Name 26 "" + Name 33 "indexable" + Name 38 "u8" + Name 46 "indexable" + Name 51 "u8v" + Name 54 "i8v" + Name 60 "i16v" + Name 68 "i32v" + Name 76 "u32v" + Name 83 "i64v" + Name 89 "u64v" + Name 103 "f16v" + Name 109 "f32v" + Name 115 "f64v" + Name 144 "u16v" + Name 174 "bv" + Name 192 "u8v" + Name 196 "i8" + Name 216 "i" + Name 223 "uv" + Name 242 "i16" + Name 279 "b" + Name 341 "i8v" + Name 344 "i8" + Name 354 "u8v" + Name 356 "u8" + Name 430 "i16" + Name 433 "i32" + Name 436 "i8v4" + Name 440 "u16" + Name 441 "u8v2" + Name 444 "u32" + Name 447 "u8v4" + Name 459 "bv" + Name 526 "Block" + MemberName 526(Block) 0 "i8" + MemberName 526(Block) 1 "i8v2" + MemberName 526(Block) 2 "i8v3" + MemberName 526(Block) 3 "i8v4" + MemberName 526(Block) 4 "u8" + MemberName 526(Block) 5 "u8v2" + MemberName 526(Block) 6 "u8v3" + MemberName 526(Block) 7 "u8v4" + Name 528 "block" + Name 529 "si8" + Name 530 "su8" + MemberDecorate 24(Uniforms) 0 Offset 0 + Decorate 24(Uniforms) Block + Decorate 26 DescriptorSet 0 + Decorate 26 Binding 0 + MemberDecorate 526(Block) 0 Offset 0 + MemberDecorate 526(Block) 1 Offset 2 + MemberDecorate 526(Block) 2 Offset 4 + MemberDecorate 526(Block) 3 Offset 8 + MemberDecorate 526(Block) 4 Offset 12 + MemberDecorate 526(Block) 5 Offset 14 + MemberDecorate 526(Block) 6 Offset 16 + MemberDecorate 526(Block) 7 Offset 20 + Decorate 526(Block) Block + Decorate 528(block) DescriptorSet 0 + Decorate 528(block) Binding 1 + Decorate 529(si8) SpecId 100 + Decorate 530(su8) SpecId 101 + 2: TypeVoid + 3: TypeFunction 2 + 14: TypeInt 8 1 + 15: TypePointer Function 14(int) + 17: TypeInt 32 0 + 18: 17(int) Constant 3 + 19: TypeArray 14(int) 18 + 20: 14(int) Constant 4294967279 + 21: 14(int) Constant 4294967295 + 22: 14(int) Constant 0 + 23: 19 ConstantComposite 20 21 22 + 24(Uniforms): TypeStruct 17(int) + 25: TypePointer Uniform 24(Uniforms) + 26: 25(ptr) Variable Uniform + 27: TypeInt 32 1 + 28: 27(int) Constant 0 + 29: TypePointer Uniform 17(int) + 32: TypePointer Function 19 + 36: TypeInt 8 0 + 37: TypePointer Function 36(int) + 39: TypeArray 36(int) 18 + 40: 36(int) Constant 255 + 41: 36(int) Constant 127 + 42: 39 ConstantComposite 40 40 41 + 45: TypePointer Function 39 + 49: TypeVector 36(int) 2 + 50: TypePointer Function 49(ivec2) + 52: TypeVector 14(int) 2 + 53: TypePointer Function 52(ivec2) + 57: TypeInt 16 1 + 58: TypeVector 57(int) 2 + 59: TypePointer Function 58(ivec2) + 66: TypeVector 27(int) 2 + 67: TypePointer Function 66(ivec2) + 74: TypeVector 17(int) 2 + 75: TypePointer Function 74(ivec2) + 80: TypeInt 64 1 + 81: TypeVector 80(int) 2 + 82: TypePointer Function 81(ivec2) + 86: TypeInt 64 0 + 87: TypeVector 86(int) 2 + 88: TypePointer Function 87(ivec2) + 100: TypeFloat 16 + 101: TypeVector 100(float) 2 + 102: TypePointer Function 101(fvec2) + 106: TypeFloat 32 + 107: TypeVector 106(float) 2 + 108: TypePointer Function 107(fvec2) + 112: TypeFloat 64 + 113: TypeVector 112(float) 2 + 114: TypePointer Function 113(fvec2) + 141: TypeInt 16 0 + 142: TypeVector 141(int) 2 + 143: TypePointer Function 142(ivec2) + 171: TypeBool + 172: TypeVector 171(bool) 2 + 173: TypePointer Function 172(bvec2) + 176: 14(int) Constant 1 + 177: 52(ivec2) ConstantComposite 22 22 + 178: 52(ivec2) ConstantComposite 176 176 + 181: 36(int) Constant 0 + 182: 36(int) Constant 1 + 183: 49(ivec2) ConstantComposite 181 181 + 184: 49(ivec2) ConstantComposite 182 182 + 190: TypeVector 14(int) 3 + 191: TypePointer Function 190(ivec3) + 215: TypePointer Function 27(int) + 221: TypeVector 17(int) 3 + 222: TypePointer Function 221(ivec3) + 225: TypeVector 27(int) 3 + 241: TypePointer Function 57(int) + 264: 17(int) Constant 1 + 270: 17(int) Constant 2 + 278: TypePointer Function 171(bool) + 280: 17(int) Constant 0 + 293: TypePointer Function 17(int) + 352: 52(ivec2) ConstantComposite 21 21 + 358: TypeVector 36(int) 3 + 362: 190(ivec3) ConstantComposite 22 22 22 + 404: 171(bool) ConstantTrue + 411: 171(bool) ConstantFalse + 412: 172(bvec2) ConstantComposite 411 411 + 427: TypeVector 171(bool) 3 + 428: 427(bvec3) ConstantComposite 411 411 411 + 434: TypeVector 14(int) 4 + 435: TypePointer Function 434(ivec4) + 439: TypePointer Function 141(int) + 445: TypeVector 36(int) 4 + 446: TypePointer Function 445(ivec4) + 458: TypePointer Function 427(bvec3) + 526(Block): TypeStruct 14(int) 52(ivec2) 190(ivec3) 434(ivec4) 36(int) 49(ivec2) 190(ivec3) 445(ivec4) + 527: TypePointer Uniform 526(Block) + 528(block): 527(ptr) Variable Uniform + 529(si8): 14(int) SpecConstant 4294967286 + 530(su8): 36(int) SpecConstant 20 + 4(main): 2 Function None 3 + 5: Label + Return + FunctionEnd + 6(literal(): 2 Function None 3 + 7: Label + 16(i8): 15(ptr) Variable Function + 33(indexable): 32(ptr) Variable Function + 38(u8): 37(ptr) Variable Function + 46(indexable): 45(ptr) Variable Function + 30: 29(ptr) AccessChain 26 28 + 31: 17(int) Load 30 + Store 33(indexable) 23 + 34: 15(ptr) AccessChain 33(indexable) 31 + 35: 14(int) Load 34 + Store 16(i8) 35 + 43: 29(ptr) AccessChain 26 28 + 44: 17(int) Load 43 + Store 46(indexable) 42 + 47: 37(ptr) AccessChain 46(indexable) 44 + 48: 36(int) Load 47 + Store 38(u8) 48 + Return + FunctionEnd + 8(typeCast8(): 2 Function None 3 + 9: Label + 51(u8v): 50(ptr) Variable Function + 54(i8v): 53(ptr) Variable Function + 60(i16v): 59(ptr) Variable Function + 68(i32v): 67(ptr) Variable Function + 76(u32v): 75(ptr) Variable Function + 83(i64v): 82(ptr) Variable Function + 89(u64v): 88(ptr) Variable Function + 103(f16v): 102(ptr) Variable Function + 109(f32v): 108(ptr) Variable Function + 115(f64v): 114(ptr) Variable Function + 144(u16v): 143(ptr) Variable Function + 174(bv): 173(ptr) Variable Function + 55: 52(ivec2) Load 54(i8v) + 56: 49(ivec2) Bitcast 55 + Store 51(u8v) 56 + 61: 52(ivec2) Load 54(i8v) + 62: 58(ivec2) SConvert 61 + Store 60(i16v) 62 + 63: 49(ivec2) Load 51(u8v) + 64: 58(ivec2) UConvert 63 + 65: 58(ivec2) Bitcast 64 + Store 60(i16v) 65 + 69: 52(ivec2) Load 54(i8v) + 70: 66(ivec2) SConvert 69 + Store 68(i32v) 70 + 71: 49(ivec2) Load 51(u8v) + 72: 66(ivec2) UConvert 71 + 73: 66(ivec2) Bitcast 72 + Store 68(i32v) 73 + 77: 52(ivec2) Load 54(i8v) + 78: 66(ivec2) SConvert 77 + 79: 74(ivec2) Bitcast 78 + Store 76(u32v) 79 + 84: 52(ivec2) Load 54(i8v) + 85: 81(ivec2) SConvert 84 + Store 83(i64v) 85 + 90: 52(ivec2) Load 54(i8v) + 91: 81(ivec2) SConvert 90 + 92: 87(ivec2) Bitcast 91 + Store 89(u64v) 92 + 93: 49(ivec2) Load 51(u8v) + 94: 74(ivec2) UConvert 93 + Store 76(u32v) 94 + 95: 49(ivec2) Load 51(u8v) + 96: 81(ivec2) UConvert 95 + 97: 81(ivec2) Bitcast 96 + Store 83(i64v) 97 + 98: 49(ivec2) Load 51(u8v) + 99: 87(ivec2) UConvert 98 + Store 89(u64v) 99 + 104: 52(ivec2) Load 54(i8v) + 105: 101(fvec2) ConvertSToF 104 + Store 103(f16v) 105 + 110: 52(ivec2) Load 54(i8v) + 111: 107(fvec2) ConvertSToF 110 + Store 109(f32v) 111 + 116: 52(ivec2) Load 54(i8v) + 117: 113(fvec2) ConvertSToF 116 + Store 115(f64v) 117 + 118: 49(ivec2) Load 51(u8v) + 119: 101(fvec2) ConvertUToF 118 + Store 103(f16v) 119 + 120: 49(ivec2) Load 51(u8v) + 121: 107(fvec2) ConvertUToF 120 + Store 109(f32v) 121 + 122: 49(ivec2) Load 51(u8v) + 123: 113(fvec2) ConvertUToF 122 + Store 115(f64v) 123 + 124: 49(ivec2) Load 51(u8v) + 125: 52(ivec2) Bitcast 124 + Store 54(i8v) 125 + 126: 52(ivec2) Load 54(i8v) + 127: 58(ivec2) SConvert 126 + Store 60(i16v) 127 + 128: 49(ivec2) Load 51(u8v) + 129: 58(ivec2) UConvert 128 + 130: 58(ivec2) Bitcast 129 + Store 60(i16v) 130 + 131: 52(ivec2) Load 54(i8v) + 132: 66(ivec2) SConvert 131 + Store 68(i32v) 132 + 133: 49(ivec2) Load 51(u8v) + 134: 66(ivec2) UConvert 133 + 135: 66(ivec2) Bitcast 134 + Store 68(i32v) 135 + 136: 52(ivec2) Load 54(i8v) + 137: 81(ivec2) SConvert 136 + Store 83(i64v) 137 + 138: 52(ivec2) Load 54(i8v) + 139: 81(ivec2) SConvert 138 + 140: 87(ivec2) Bitcast 139 + Store 89(u64v) 140 + 145: 52(ivec2) Load 54(i8v) + 146: 58(ivec2) SConvert 145 + 147: 142(ivec2) Bitcast 146 + Store 144(u16v) 147 + 148: 49(ivec2) Load 51(u8v) + 149: 142(ivec2) UConvert 148 + Store 144(u16v) 149 + 150: 49(ivec2) Load 51(u8v) + 151: 74(ivec2) UConvert 150 + Store 76(u32v) 151 + 152: 49(ivec2) Load 51(u8v) + 153: 81(ivec2) UConvert 152 + 154: 81(ivec2) Bitcast 153 + Store 83(i64v) 154 + 155: 49(ivec2) Load 51(u8v) + 156: 81(ivec2) UConvert 155 + 157: 81(ivec2) Bitcast 156 + 158: 87(ivec2) Bitcast 157 + Store 89(u64v) 158 + 159: 52(ivec2) Load 54(i8v) + 160: 101(fvec2) ConvertSToF 159 + Store 103(f16v) 160 + 161: 52(ivec2) Load 54(i8v) + 162: 107(fvec2) ConvertSToF 161 + Store 109(f32v) 162 + 163: 52(ivec2) Load 54(i8v) + 164: 113(fvec2) ConvertSToF 163 + Store 115(f64v) 164 + 165: 49(ivec2) Load 51(u8v) + 166: 101(fvec2) ConvertUToF 165 + Store 103(f16v) 166 + 167: 49(ivec2) Load 51(u8v) + 168: 107(fvec2) ConvertUToF 167 + Store 109(f32v) 168 + 169: 49(ivec2) Load 51(u8v) + 170: 113(fvec2) ConvertUToF 169 + Store 115(f64v) 170 + 175: 172(bvec2) Load 174(bv) + 179: 52(ivec2) Select 175 178 177 + Store 54(i8v) 179 + 180: 172(bvec2) Load 174(bv) + 185: 49(ivec2) Select 180 184 183 + Store 51(u8v) 185 + 186: 52(ivec2) Load 54(i8v) + 187: 172(bvec2) INotEqual 186 183 + Store 174(bv) 187 + 188: 49(ivec2) Load 51(u8v) + 189: 172(bvec2) INotEqual 188 183 + Store 174(bv) 189 + Return + FunctionEnd + 10(operators(): 2 Function None 3 + 11: Label + 192(u8v): 191(ptr) Variable Function + 196(i8): 15(ptr) Variable Function + 216(i): 215(ptr) Variable Function + 223(uv): 222(ptr) Variable Function + 242(i16): 241(ptr) Variable Function + 279(b): 278(ptr) Variable Function + 193: 190(ivec3) Load 192(u8v) + 194: 190(ivec3) CompositeConstruct 176 176 176 + 195: 190(ivec3) IAdd 193 194 + Store 192(u8v) 195 + 197: 14(int) Load 196(i8) + 198: 14(int) ISub 197 176 + Store 196(i8) 198 + 199: 14(int) Load 196(i8) + 200: 14(int) IAdd 199 176 + Store 196(i8) 200 + 201: 190(ivec3) Load 192(u8v) + 202: 190(ivec3) CompositeConstruct 176 176 176 + 203: 190(ivec3) ISub 201 202 + Store 192(u8v) 203 + 204: 190(ivec3) Load 192(u8v) + 205: 190(ivec3) Not 204 + Store 192(u8v) 205 + 206: 14(int) Load 196(i8) + Store 196(i8) 206 + 207: 190(ivec3) Load 192(u8v) + 208: 190(ivec3) SNegate 207 + Store 192(u8v) 208 + 209: 14(int) Load 196(i8) + 210: 14(int) Load 196(i8) + 211: 14(int) IAdd 210 209 + Store 196(i8) 211 + 212: 190(ivec3) Load 192(u8v) + 213: 190(ivec3) Load 192(u8v) + 214: 190(ivec3) ISub 213 212 + Store 192(u8v) 214 + 217: 14(int) Load 196(i8) + 218: 27(int) SConvert 217 + 219: 27(int) Load 216(i) + 220: 27(int) IMul 219 218 + Store 216(i) 220 + 224: 190(ivec3) Load 192(u8v) + 226: 225(ivec3) SConvert 224 + 227: 221(ivec3) Bitcast 226 + 228: 221(ivec3) Load 223(uv) + 229: 221(ivec3) UDiv 228 227 + Store 223(uv) 229 + 230: 14(int) Load 196(i8) + 231: 27(int) SConvert 230 + 232: 17(int) Bitcast 231 + 233: 221(ivec3) Load 223(uv) + 234: 221(ivec3) CompositeConstruct 232 232 232 + 235: 221(ivec3) UMod 233 234 + Store 223(uv) 235 + 236: 190(ivec3) Load 192(u8v) + 237: 225(ivec3) SConvert 236 + 238: 221(ivec3) Bitcast 237 + 239: 221(ivec3) Load 223(uv) + 240: 221(ivec3) IAdd 238 239 + Store 223(uv) 240 + 243: 14(int) Load 196(i8) + 244: 57(int) SConvert 243 + 245: 57(int) Load 242(i16) + 246: 57(int) ISub 244 245 + Store 242(i16) 246 + 247: 190(ivec3) Load 192(u8v) + 248: 225(ivec3) SConvert 247 + 249: 221(ivec3) Bitcast 248 + 250: 221(ivec3) Load 223(uv) + 251: 221(ivec3) IMul 249 250 + Store 223(uv) 251 + 252: 14(int) Load 196(i8) + 253: 57(int) SConvert 252 + 254: 57(int) Load 242(i16) + 255: 57(int) IMul 253 254 + Store 242(i16) 255 + 256: 14(int) Load 196(i8) + 257: 27(int) SConvert 256 + 258: 27(int) Load 216(i) + 259: 27(int) SMod 257 258 + Store 216(i) 259 + 260: 14(int) Load 196(i8) + 261: 190(ivec3) Load 192(u8v) + 262: 190(ivec3) CompositeConstruct 260 260 260 + 263: 190(ivec3) ShiftLeftLogical 261 262 + Store 192(u8v) 263 + 265: 15(ptr) AccessChain 192(u8v) 264 + 266: 14(int) Load 265 + 267: 14(int) Load 196(i8) + 268: 14(int) ShiftRightArithmetic 267 266 + Store 196(i8) 268 + 269: 14(int) Load 196(i8) + 271: 15(ptr) AccessChain 192(u8v) 270 + 272: 14(int) Load 271 + 273: 14(int) ShiftLeftLogical 269 272 + Store 196(i8) 273 + 274: 190(ivec3) Load 192(u8v) + 275: 14(int) Load 196(i8) + 276: 190(ivec3) CompositeConstruct 275 275 275 + 277: 190(ivec3) ShiftLeftLogical 274 276 + Store 192(u8v) 277 + 281: 15(ptr) AccessChain 192(u8v) 280 + 282: 14(int) Load 281 + 283: 14(int) Load 196(i8) + 284: 171(bool) INotEqual 282 283 + Store 279(b) 284 + 285: 14(int) Load 196(i8) + 286: 15(ptr) AccessChain 192(u8v) 280 + 287: 14(int) Load 286 + 288: 171(bool) IEqual 285 287 + Store 279(b) 288 + 289: 15(ptr) AccessChain 192(u8v) 280 + 290: 14(int) Load 289 + 291: 27(int) SConvert 290 + 292: 17(int) Bitcast 291 + 294: 293(ptr) AccessChain 223(uv) 264 + 295: 17(int) Load 294 + 296: 171(bool) UGreaterThan 292 295 + Store 279(b) 296 + 297: 14(int) Load 196(i8) + 298: 27(int) SConvert 297 + 299: 27(int) Load 216(i) + 300: 171(bool) SLessThan 298 299 + Store 279(b) 300 + 301: 15(ptr) AccessChain 192(u8v) 264 + 302: 14(int) Load 301 + 303: 27(int) SConvert 302 + 304: 17(int) Bitcast 303 + 305: 293(ptr) AccessChain 223(uv) 280 + 306: 17(int) Load 305 + 307: 171(bool) UGreaterThanEqual 304 306 + Store 279(b) 307 + 308: 14(int) Load 196(i8) + 309: 27(int) SConvert 308 + 310: 27(int) Load 216(i) + 311: 171(bool) SLessThanEqual 309 310 + Store 279(b) 311 + 312: 14(int) Load 196(i8) + 313: 27(int) SConvert 312 + 314: 17(int) Bitcast 313 + 315: 221(ivec3) Load 223(uv) + 316: 221(ivec3) CompositeConstruct 314 314 314 + 317: 221(ivec3) BitwiseOr 315 316 + Store 223(uv) 317 + 318: 14(int) Load 196(i8) + 319: 27(int) SConvert 318 + 320: 27(int) Load 216(i) + 321: 27(int) BitwiseOr 319 320 + Store 216(i) 321 + 322: 14(int) Load 196(i8) + 323: 57(int) SConvert 322 + 324: 57(int) Load 242(i16) + 325: 57(int) BitwiseAnd 324 323 + Store 242(i16) 325 + 326: 190(ivec3) Load 192(u8v) + 327: 225(ivec3) SConvert 326 + 328: 221(ivec3) Bitcast 327 + 329: 221(ivec3) Load 223(uv) + 330: 221(ivec3) BitwiseAnd 328 329 + Store 223(uv) 330 + 331: 14(int) Load 196(i8) + 332: 27(int) SConvert 331 + 333: 17(int) Bitcast 332 + 334: 221(ivec3) Load 223(uv) + 335: 221(ivec3) CompositeConstruct 333 333 333 + 336: 221(ivec3) BitwiseXor 334 335 + Store 223(uv) 336 + 337: 190(ivec3) Load 192(u8v) + 338: 14(int) Load 196(i8) + 339: 190(ivec3) CompositeConstruct 338 338 338 + 340: 190(ivec3) BitwiseXor 337 339 + Store 192(u8v) 340 + Return + FunctionEnd +12(builtinFuncs(): 2 Function None 3 + 13: Label + 341(i8v): 53(ptr) Variable Function + 344(i8): 15(ptr) Variable Function + 354(u8v): 191(ptr) Variable Function + 356(u8): 37(ptr) Variable Function + 430(i16): 241(ptr) Variable Function + 433(i32): 215(ptr) Variable Function + 436(i8v4): 435(ptr) Variable Function + 440(u16): 439(ptr) Variable Function + 441(u8v2): 50(ptr) Variable Function + 444(u32): 293(ptr) Variable Function + 447(u8v4): 446(ptr) Variable Function + 459(bv): 458(ptr) Variable Function + 342: 52(ivec2) Load 341(i8v) + 343: 52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 342 + Store 341(i8v) 343 + 345: 14(int) Load 344(i8) + 346: 14(int) ExtInst 1(GLSL.std.450) 7(SSign) 345 + Store 344(i8) 346 + 347: 52(ivec2) Load 341(i8v) + 348: 14(int) Load 344(i8) + 349: 52(ivec2) CompositeConstruct 348 348 + 350: 52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 347 349 + Store 341(i8v) 350 + 351: 52(ivec2) Load 341(i8v) + 353: 52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 351 352 + Store 341(i8v) 353 + 355: 190(ivec3) Load 354(u8v) + 357: 36(int) Load 356(u8) + 359: 358(ivec3) CompositeConstruct 357 357 357 + 360: 190(ivec3) ExtInst 1(GLSL.std.450) 39(SMin) 355 359 + Store 354(u8v) 360 + 361: 190(ivec3) Load 354(u8v) + 363: 190(ivec3) ExtInst 1(GLSL.std.450) 39(SMin) 361 362 + Store 354(u8v) 363 + 364: 52(ivec2) Load 341(i8v) + 365: 14(int) Load 344(i8) + 366: 52(ivec2) CompositeConstruct 365 365 + 367: 52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 364 366 + Store 341(i8v) 367 + 368: 52(ivec2) Load 341(i8v) + 369: 52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 368 352 + Store 341(i8v) 369 + 370: 190(ivec3) Load 354(u8v) + 371: 36(int) Load 356(u8) + 372: 358(ivec3) CompositeConstruct 371 371 371 + 373: 190(ivec3) ExtInst 1(GLSL.std.450) 42(SMax) 370 372 + Store 354(u8v) 373 + 374: 190(ivec3) Load 354(u8v) + 375: 190(ivec3) ExtInst 1(GLSL.std.450) 42(SMax) 374 362 + Store 354(u8v) 375 + 376: 52(ivec2) Load 341(i8v) + 377: 14(int) Load 344(i8) + 378: 14(int) SNegate 377 + 379: 14(int) Load 344(i8) + 380: 52(ivec2) CompositeConstruct 378 378 + 381: 52(ivec2) CompositeConstruct 379 379 + 382: 52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 376 380 381 + Store 341(i8v) 382 + 383: 52(ivec2) Load 341(i8v) + 384: 52(ivec2) Load 341(i8v) + 385: 52(ivec2) SNegate 384 + 386: 52(ivec2) Load 341(i8v) + 387: 52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 383 385 386 + Store 341(i8v) 387 + 388: 190(ivec3) Load 354(u8v) + 389: 36(int) Load 356(u8) + 390: 36(int) SNegate 389 + 391: 36(int) Load 356(u8) + 392: 358(ivec3) CompositeConstruct 390 390 390 + 393: 358(ivec3) CompositeConstruct 391 391 391 + 394: 190(ivec3) ExtInst 1(GLSL.std.450) 45(SClamp) 388 392 393 + Store 354(u8v) 394 + 395: 190(ivec3) Load 354(u8v) + 396: 190(ivec3) Load 354(u8v) + 397: 190(ivec3) SNegate 396 + 398: 190(ivec3) Load 354(u8v) + 399: 190(ivec3) ExtInst 1(GLSL.std.450) 45(SClamp) 395 397 398 + Store 354(u8v) 399 + 400: 15(ptr) AccessChain 341(i8v) 280 + 401: 14(int) Load 400 + 402: 15(ptr) AccessChain 341(i8v) 264 + 403: 14(int) Load 402 + 405: 14(int) Select 404 403 401 + Store 344(i8) 405 + 406: 14(int) Load 344(i8) + 407: 52(ivec2) CompositeConstruct 406 406 + 408: 14(int) Load 344(i8) + 409: 14(int) SNegate 408 + 410: 52(ivec2) CompositeConstruct 409 409 + 413: 52(ivec2) Select 412 410 407 + Store 341(i8v) 413 + 414: 15(ptr) AccessChain 354(u8v) 280 + 415: 14(int) Load 414 + 416: 15(ptr) AccessChain 354(u8v) 264 + 417: 14(int) Load 416 + 418: 14(int) Select 404 417 415 + 419: 36(int) Bitcast 418 + Store 356(u8) 419 + 420: 36(int) Load 356(u8) + 421: 14(int) Bitcast 420 + 422: 190(ivec3) CompositeConstruct 421 421 421 + 423: 36(int) Load 356(u8) + 424: 36(int) SNegate 423 + 425: 14(int) Bitcast 424 + 426: 190(ivec3) CompositeConstruct 425 425 425 + 429: 190(ivec3) Select 428 426 422 + Store 354(u8v) 429 + 431: 52(ivec2) Load 341(i8v) + 432: 57(int) Bitcast 431 + Store 430(i16) 432 + 437: 434(ivec4) Load 436(i8v4) + 438: 27(int) Bitcast 437 + Store 433(i32) 438 + 442: 49(ivec2) Load 441(u8v2) + 443: 141(int) Bitcast 442 + Store 440(u16) 443 + 448: 445(ivec4) Load 447(u8v4) + 449: 17(int) Bitcast 448 + Store 444(u32) 449 + 450: 57(int) Load 430(i16) + 451: 52(ivec2) Bitcast 450 + Store 341(i8v) 451 + 452: 27(int) Load 433(i32) + 453: 434(ivec4) Bitcast 452 + Store 436(i8v4) 453 + 454: 141(int) Load 440(u16) + 455: 49(ivec2) Bitcast 454 + Store 441(u8v2) 455 + 456: 17(int) Load 444(u32) + 457: 445(ivec4) Bitcast 456 + Store 447(u8v4) 457 + 460: 190(ivec3) Load 354(u8v) + 461: 36(int) Load 356(u8) + 462: 14(int) Bitcast 461 + 463: 190(ivec3) CompositeConstruct 462 462 462 + 464: 427(bvec3) SLessThan 460 463 + Store 459(bv) 464 + 465: 52(ivec2) Load 341(i8v) + 466: 14(int) Load 344(i8) + 467: 52(ivec2) CompositeConstruct 466 466 + 468: 172(bvec2) SLessThan 465 467 + 469: 427(bvec3) Load 459(bv) + 470: 427(bvec3) VectorShuffle 469 468 3 4 2 + Store 459(bv) 470 + 471: 190(ivec3) Load 354(u8v) + 472: 36(int) Load 356(u8) + 473: 14(int) Bitcast 472 + 474: 190(ivec3) CompositeConstruct 473 473 473 + 475: 427(bvec3) SLessThanEqual 471 474 + Store 459(bv) 475 + 476: 52(ivec2) Load 341(i8v) + 477: 14(int) Load 344(i8) + 478: 52(ivec2) CompositeConstruct 477 477 + 479: 172(bvec2) SLessThanEqual 476 478 + 480: 427(bvec3) Load 459(bv) + 481: 427(bvec3) VectorShuffle 480 479 3 4 2 + Store 459(bv) 481 + 482: 190(ivec3) Load 354(u8v) + 483: 36(int) Load 356(u8) + 484: 14(int) Bitcast 483 + 485: 190(ivec3) CompositeConstruct 484 484 484 + 486: 427(bvec3) SGreaterThan 482 485 + Store 459(bv) 486 + 487: 52(ivec2) Load 341(i8v) + 488: 14(int) Load 344(i8) + 489: 52(ivec2) CompositeConstruct 488 488 + 490: 172(bvec2) SGreaterThan 487 489 + 491: 427(bvec3) Load 459(bv) + 492: 427(bvec3) VectorShuffle 491 490 3 4 2 + Store 459(bv) 492 + 493: 190(ivec3) Load 354(u8v) + 494: 36(int) Load 356(u8) + 495: 14(int) Bitcast 494 + 496: 190(ivec3) CompositeConstruct 495 495 495 + 497: 427(bvec3) SGreaterThanEqual 493 496 + Store 459(bv) 497 + 498: 52(ivec2) Load 341(i8v) + 499: 14(int) Load 344(i8) + 500: 52(ivec2) CompositeConstruct 499 499 + 501: 172(bvec2) SGreaterThanEqual 498 500 + 502: 427(bvec3) Load 459(bv) + 503: 427(bvec3) VectorShuffle 502 501 3 4 2 + Store 459(bv) 503 + 504: 190(ivec3) Load 354(u8v) + 505: 36(int) Load 356(u8) + 506: 14(int) Bitcast 505 + 507: 190(ivec3) CompositeConstruct 506 506 506 + 508: 427(bvec3) IEqual 504 507 + Store 459(bv) 508 + 509: 52(ivec2) Load 341(i8v) + 510: 14(int) Load 344(i8) + 511: 52(ivec2) CompositeConstruct 510 510 + 512: 172(bvec2) IEqual 509 511 + 513: 427(bvec3) Load 459(bv) + 514: 427(bvec3) VectorShuffle 513 512 3 4 2 + Store 459(bv) 514 + 515: 190(ivec3) Load 354(u8v) + 516: 36(int) Load 356(u8) + 517: 14(int) Bitcast 516 + 518: 190(ivec3) CompositeConstruct 517 517 517 + 519: 427(bvec3) INotEqual 515 518 + Store 459(bv) 519 + 520: 52(ivec2) Load 341(i8v) + 521: 14(int) Load 344(i8) + 522: 52(ivec2) CompositeConstruct 521 521 + 523: 172(bvec2) INotEqual 520 522 + 524: 427(bvec3) Load 459(bv) + 525: 427(bvec3) VectorShuffle 524 523 3 4 2 + Store 459(bv) 525 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.interpOps.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.interpOps.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.interpOps.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.interpOps.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.interpOps.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 100 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.intOps.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.intOps.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.intOps.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.intOps.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.intOps.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 268 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.layoutNested.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.layoutNested.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.layoutNested.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.layoutNested.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.layoutNested.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 66 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.length.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.length.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.length.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.length.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.length.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 33 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.localAggregates.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.localAggregates.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.localAggregates.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.localAggregates.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.localAggregates.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 136 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.loopsArtificial.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.loopsArtificial.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.loopsArtificial.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.loopsArtificial.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.loopsArtificial.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 158 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.loops.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.loops.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.loops.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.loops.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.loops.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 725 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.matFun.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.matFun.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.matFun.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.matFun.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.matFun.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 103 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.matrix2.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.matrix2.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.matrix2.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.matrix2.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.matrix2.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 221 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.matrix.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.matrix.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.matrix.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.matrix.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.matrix.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 286 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.memoryQualifier.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.memoryQualifier.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.memoryQualifier.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.memoryQualifier.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.memoryQualifier.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 97 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.merge-unreachable.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.merge-unreachable.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.merge-unreachable.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.merge-unreachable.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.merge-unreachable.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 25 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.multiStruct.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.multiStruct.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.multiStruct.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.multiStruct.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.multiStruct.comp // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 161 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.multiStructFuncall.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.multiStructFuncall.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.multiStructFuncall.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.multiStructFuncall.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.multiStructFuncall.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 63 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.multiView.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.multiView.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.multiView.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.multiView.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,11 +1,10 @@ spv.multiView.frag -// Module Version 10000 -// Generated by (magic number): 80003 +// Module Version 10300 +// Generated by (magic number): 80006 // Id's are bound by 17 Capability Shader Capability MultiView - Extension "SPV_KHR_multiview" 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 EntryPoint Fragment 4 "main" 9 12 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.multiviewPerViewAttributes.tesc // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 37 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.multiviewPerViewAttributes.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.multiviewPerViewAttributes.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.multiviewPerViewAttributes.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.multiviewPerViewAttributes.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.multiviewPerViewAttributes.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 29 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.newTexture.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.newTexture.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.newTexture.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.newTexture.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.newTexture.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 284 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.noBuiltInLoc.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.noBuiltInLoc.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.noBuiltInLoc.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.noBuiltInLoc.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,13 @@ spv.noBuiltInLoc.vert // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 33 +// Generated by (magic number): 80006 +// Id's are bound by 35 Capability Shader + Capability AtomicStorage 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Vertex 4 "main" 9 11 18 31 32 + EntryPoint Vertex 4 "main" 9 11 18 33 34 Source GLSL 450 Name 4 "main" Name 9 "bar" @@ -20,8 +21,9 @@ Name 24 "uv1" Name 26 "uv2" Name 29 "uv3" - Name 31 "gl_VertexID" - Name 32 "gl_InstanceID" + Name 31 "a_uint" + Name 33 "gl_VertexID" + Name 34 "gl_InstanceID" Decorate 9(bar) Location 0 Decorate 11(foo) Location 0 MemberDecorate 16(gl_PerVertex) 0 BuiltIn Position @@ -35,8 +37,11 @@ Decorate 26(uv2) DescriptorSet 0 Decorate 29(uv3) Location 2 Decorate 29(uv3) DescriptorSet 0 - Decorate 31(gl_VertexID) BuiltIn VertexId - Decorate 32(gl_InstanceID) BuiltIn InstanceId + Decorate 31(a_uint) Offset 0 + Decorate 31(a_uint) DescriptorSet 0 + Decorate 31(a_uint) Binding 0 + Decorate 33(gl_VertexID) BuiltIn VertexId + Decorate 34(gl_InstanceID) BuiltIn InstanceId 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -60,9 +65,11 @@ 27: TypeVector 6(float) 3 28: TypePointer UniformConstant 27(fvec3) 29(uv3): 28(ptr) Variable UniformConstant - 30: TypePointer Input 19(int) - 31(gl_VertexID): 30(ptr) Variable Input -32(gl_InstanceID): 30(ptr) Variable Input + 30: TypePointer AtomicCounter 13(int) + 31(a_uint): 30(ptr) Variable AtomicCounter + 32: TypePointer Input 19(int) + 33(gl_VertexID): 32(ptr) Variable Input +34(gl_InstanceID): 32(ptr) Variable Input 4(main): 2 Function None 3 5: Label 12: 7(fvec4) Load 11(foo) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.noDeadDecorations.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.noDeadDecorations.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.noDeadDecorations.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.noDeadDecorations.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.noDeadDecorations.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 32 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.nonSquare.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.nonSquare.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.nonSquare.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.nonSquare.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.nonSquare.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 90 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.nonuniform.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.nonuniform.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.nonuniform.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.nonuniform.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,359 @@ +spv.nonuniform.frag +// Module Version 10000 +// Generated by (magic number): 80006 +// Id's are bound by 210 + + Capability Shader + Capability InputAttachment + Capability SampledBuffer + Capability ImageBuffer + Capability CapabilityShaderNonUniformEXT + Capability CapabilityRuntimeDescriptorArrayEXT + Capability CapabilityInputAttachmentArrayDynamicIndexingEXT + Capability CapabilityUniformTexelBufferArrayDynamicIndexingEXT + Capability CapabilityStorageTexelBufferArrayDynamicIndexingEXT + Capability CapabilityUniformBufferArrayNonUniformIndexingEXT + Capability CapabilitySampledImageArrayNonUniformIndexingEXT + Capability CapabilityStorageBufferArrayNonUniformIndexingEXT + Capability CapabilityStorageImageArrayNonUniformIndexingEXT + Capability CapabilityInputAttachmentArrayNonUniformIndexingEXT + Capability CapabilityUniformTexelBufferArrayNonUniformIndexingEXT + Capability CapabilityStorageTexelBufferArrayNonUniformIndexingEXT + Extension "SPV_EXT_descriptor_indexing" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 33 90 + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + SourceExtension "GL_EXT_nonuniform_qualifier" + Name 4 "main" + Name 11 "foo(i1;i1;" + Name 9 "nupi" + Name 10 "f" + Name 16 "a" + Name 17 "nu_li" + Name 18 "param" + Name 20 "param" + Name 30 "b" + Name 33 "nu_inv4" + Name 39 "nu_gf" + Name 45 "inputAttachmentDyn" + Name 46 "dyn_i" + Name 62 "uniformTexelBufferDyn" + Name 76 "storageTexelBufferDyn" + Name 85 "uname" + MemberName 85(uname) 0 "a" + Name 88 "uniformBuffer" + Name 90 "nu_ii" + Name 97 "bname" + MemberName 97(bname) 0 "b" + Name 100 "storageBuffer" + Name 110 "sampledImage" + Name 125 "storageImage" + Name 137 "inputAttachment" + Name 147 "uniformTexelBuffer" + Name 158 "storageTexelBuffer" + Name 168 "v" + Name 183 "uv" + Name 193 "m" + Name 201 "S" + MemberName 201(S) 0 "a" + Name 203 "s" + Decorate 13 DecorationNonUniformEXT + Decorate 17(nu_li) DecorationNonUniformEXT + Decorate 19 DecorationNonUniformEXT + Decorate 23 DecorationNonUniformEXT + Decorate 26 DecorationNonUniformEXT + Decorate 27 DecorationNonUniformEXT + Decorate 33(nu_inv4) Location 0 + Decorate 33(nu_inv4) DecorationNonUniformEXT + Decorate 38 DecorationNonUniformEXT + Decorate 39(nu_gf) DecorationNonUniformEXT + Decorate 40 DecorationNonUniformEXT + Decorate 41 DecorationNonUniformEXT + Decorate 45(inputAttachmentDyn) DescriptorSet 0 + Decorate 45(inputAttachmentDyn) Binding 0 + Decorate 45(inputAttachmentDyn) InputAttachmentIndex 0 + Decorate 62(uniformTexelBufferDyn) DescriptorSet 0 + Decorate 62(uniformTexelBufferDyn) Binding 1 + Decorate 76(storageTexelBufferDyn) DescriptorSet 0 + Decorate 76(storageTexelBufferDyn) Binding 2 + MemberDecorate 85(uname) 0 Offset 0 + Decorate 85(uname) Block + Decorate 88(uniformBuffer) DescriptorSet 0 + Decorate 88(uniformBuffer) Binding 3 + Decorate 90(nu_ii) Flat + Decorate 90(nu_ii) Location 1 + Decorate 90(nu_ii) DecorationNonUniformEXT + Decorate 91 DecorationNonUniformEXT + Decorate 94 DecorationNonUniformEXT + MemberDecorate 97(bname) 0 Offset 0 + Decorate 97(bname) BufferBlock + Decorate 100(storageBuffer) DescriptorSet 0 + Decorate 100(storageBuffer) Binding 4 + Decorate 101 DecorationNonUniformEXT + Decorate 103 DecorationNonUniformEXT + Decorate 110(sampledImage) DescriptorSet 0 + Decorate 110(sampledImage) Binding 5 + Decorate 111 DecorationNonUniformEXT + Decorate 114 DecorationNonUniformEXT + Decorate 125(storageImage) DescriptorSet 0 + Decorate 125(storageImage) Binding 6 + Decorate 126 DecorationNonUniformEXT + Decorate 129 DecorationNonUniformEXT + Decorate 137(inputAttachment) DescriptorSet 0 + Decorate 137(inputAttachment) Binding 7 + Decorate 137(inputAttachment) InputAttachmentIndex 1 + Decorate 138 DecorationNonUniformEXT + Decorate 140 DecorationNonUniformEXT + Decorate 147(uniformTexelBuffer) DescriptorSet 0 + Decorate 147(uniformTexelBuffer) Binding 8 + Decorate 148 DecorationNonUniformEXT + Decorate 150 DecorationNonUniformEXT + Decorate 158(storageTexelBuffer) DescriptorSet 0 + Decorate 158(storageTexelBuffer) Binding 9 + Decorate 159 DecorationNonUniformEXT + Decorate 161 DecorationNonUniformEXT + Decorate 168(v) DecorationNonUniformEXT + Decorate 171 DecorationNonUniformEXT + Decorate 173 DecorationNonUniformEXT + Decorate 178 DecorationNonUniformEXT + Decorate 180 DecorationNonUniformEXT + Decorate 184 DecorationNonUniformEXT + Decorate 186 DecorationNonUniformEXT + Decorate 188 DecorationNonUniformEXT + Decorate 193(m) DecorationNonUniformEXT + Decorate 195 DecorationNonUniformEXT + Decorate 203(s) DecorationNonUniformEXT + Decorate 205 DecorationNonUniformEXT + Decorate 207 DecorationNonUniformEXT + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 1 + 7: TypePointer Function 6(int) + 8: TypeFunction 6(int) 7(ptr) 7(ptr) + 25: 6(int) Constant 2 + 28: TypeFloat 32 + 29: TypePointer Function 28(float) + 31: TypeVector 28(float) 4 + 32: TypePointer Input 31(fvec4) + 33(nu_inv4): 32(ptr) Variable Input + 34: TypeInt 32 0 + 35: 34(int) Constant 0 + 36: TypePointer Input 28(float) + 42: TypeImage 28(float) SubpassData nonsampled format:Unknown + 43: TypeRuntimeArray 42 + 44: TypePointer UniformConstant 43 +45(inputAttachmentDyn): 44(ptr) Variable UniformConstant + 48: TypePointer UniformConstant 42 + 51: 6(int) Constant 0 + 52: TypeVector 6(int) 2 + 53: 52(ivec2) ConstantComposite 51 51 + 58: TypeImage 28(float) Buffer sampled format:Unknown + 59: TypeSampledImage 58 + 60: TypeRuntimeArray 59 + 61: TypePointer UniformConstant 60 +62(uniformTexelBufferDyn): 61(ptr) Variable UniformConstant + 64: TypePointer UniformConstant 59 + 67: 6(int) Constant 1 + 73: TypeImage 28(float) Buffer nonsampled format:R32f + 74: TypeRuntimeArray 73 + 75: TypePointer UniformConstant 74 +76(storageTexelBufferDyn): 75(ptr) Variable UniformConstant + 78: TypePointer UniformConstant 73 + 85(uname): TypeStruct 28(float) + 86: TypeRuntimeArray 85(uname) + 87: TypePointer Uniform 86 +88(uniformBuffer): 87(ptr) Variable Uniform + 89: TypePointer Input 6(int) + 90(nu_ii): 89(ptr) Variable Input + 92: TypePointer Uniform 28(float) + 97(bname): TypeStruct 28(float) + 98: TypeRuntimeArray 97(bname) + 99: TypePointer Uniform 98 +100(storageBuffer): 99(ptr) Variable Uniform + 106: TypeImage 28(float) 2D sampled format:Unknown + 107: TypeSampledImage 106 + 108: TypeRuntimeArray 107 + 109: TypePointer UniformConstant 108 +110(sampledImage): 109(ptr) Variable UniformConstant + 112: TypePointer UniformConstant 107 + 115: TypeVector 28(float) 2 + 116: 28(float) Constant 1056964608 + 117: 115(fvec2) ConstantComposite 116 116 + 122: TypeImage 28(float) 2D nonsampled format:R32f + 123: TypeRuntimeArray 122 + 124: TypePointer UniformConstant 123 +125(storageImage): 124(ptr) Variable UniformConstant + 127: TypePointer UniformConstant 122 + 130: 52(ivec2) ConstantComposite 67 67 + 135: TypeRuntimeArray 42 + 136: TypePointer UniformConstant 135 +137(inputAttachment): 136(ptr) Variable UniformConstant + 145: TypeRuntimeArray 59 + 146: TypePointer UniformConstant 145 +147(uniformTexelBuffer): 146(ptr) Variable UniformConstant + 156: TypeRuntimeArray 73 + 157: TypePointer UniformConstant 156 +158(storageTexelBuffer): 157(ptr) Variable UniformConstant + 166: TypeVector 6(int) 4 + 167: TypePointer Function 166(ivec4) + 169: 34(int) Constant 1 + 176: 34(int) Constant 2 + 191: TypeMatrix 31(fvec4) 4 + 192: TypePointer Function 191 + 201(S): TypeStruct 6(int) + 202: TypePointer Function 201(S) + 4(main): 2 Function None 3 + 5: Label + 16(a): 7(ptr) Variable Function + 17(nu_li): 7(ptr) Variable Function + 18(param): 7(ptr) Variable Function + 20(param): 7(ptr) Variable Function + 30(b): 29(ptr) Variable Function + 39(nu_gf): 29(ptr) Variable Function + 46(dyn_i): 7(ptr) Variable Function + 168(v): 167(ptr) Variable Function + 183(uv): 167(ptr) Variable Function + 193(m): 192(ptr) Variable Function + 203(s): 202(ptr) Variable Function + 19: 6(int) Load 17(nu_li) + Store 18(param) 19 + 21: 6(int) FunctionCall 11(foo(i1;i1;) 18(param) 20(param) + 22: 6(int) Load 20(param) + Store 17(nu_li) 22 + Store 16(a) 21 + 23: 6(int) Load 16(a) + 24: 6(int) Load 16(a) + 26: 6(int) IMul 24 25 + 27: 6(int) IAdd 23 26 + Store 17(nu_li) 27 + 37: 36(ptr) AccessChain 33(nu_inv4) 35 + 38: 28(float) Load 37 + 40: 28(float) Load 39(nu_gf) + 41: 28(float) FMul 38 40 + Store 30(b) 41 + 47: 6(int) Load 46(dyn_i) + 49: 48(ptr) AccessChain 45(inputAttachmentDyn) 47 + 50: 42 Load 49 + 54: 31(fvec4) ImageRead 50 53 + 55: 28(float) CompositeExtract 54 0 + 56: 28(float) Load 30(b) + 57: 28(float) FAdd 56 55 + Store 30(b) 57 + 63: 6(int) Load 46(dyn_i) + 65: 64(ptr) AccessChain 62(uniformTexelBufferDyn) 63 + 66: 59 Load 65 + 68: 58 Image 66 + 69: 31(fvec4) ImageFetch 68 67 + 70: 28(float) CompositeExtract 69 0 + 71: 28(float) Load 30(b) + 72: 28(float) FAdd 71 70 + Store 30(b) 72 + 77: 6(int) Load 46(dyn_i) + 79: 78(ptr) AccessChain 76(storageTexelBufferDyn) 77 + 80: 73 Load 79 + 81: 31(fvec4) ImageRead 80 67 + 82: 28(float) CompositeExtract 81 0 + 83: 28(float) Load 30(b) + 84: 28(float) FAdd 83 82 + Store 30(b) 84 + 91: 6(int) Load 90(nu_ii) + 93: 92(ptr) AccessChain 88(uniformBuffer) 91 51 + 94: 28(float) Load 93 + 95: 28(float) Load 30(b) + 96: 28(float) FAdd 95 94 + Store 30(b) 96 + 101: 6(int) Load 90(nu_ii) + 102: 92(ptr) AccessChain 100(storageBuffer) 101 51 + 103: 28(float) Load 102 + 104: 28(float) Load 30(b) + 105: 28(float) FAdd 104 103 + Store 30(b) 105 + 111: 6(int) Load 90(nu_ii) + 113: 112(ptr) AccessChain 110(sampledImage) 111 + 114: 107 Load 113 + 118: 31(fvec4) ImageSampleImplicitLod 114 117 + 119: 28(float) CompositeExtract 118 0 + 120: 28(float) Load 30(b) + 121: 28(float) FAdd 120 119 + Store 30(b) 121 + 126: 6(int) Load 90(nu_ii) + 128: 127(ptr) AccessChain 125(storageImage) 126 + 129: 122 Load 128 + 131: 31(fvec4) ImageRead 129 130 + 132: 28(float) CompositeExtract 131 0 + 133: 28(float) Load 30(b) + 134: 28(float) FAdd 133 132 + Store 30(b) 134 + 138: 6(int) Load 90(nu_ii) + 139: 48(ptr) AccessChain 137(inputAttachment) 138 + 140: 42 Load 139 + 141: 31(fvec4) ImageRead 140 53 + 142: 28(float) CompositeExtract 141 0 + 143: 28(float) Load 30(b) + 144: 28(float) FAdd 143 142 + Store 30(b) 144 + 148: 6(int) Load 90(nu_ii) + 149: 64(ptr) AccessChain 147(uniformTexelBuffer) 148 + 150: 59 Load 149 + 151: 58 Image 150 + 152: 31(fvec4) ImageFetch 151 67 + 153: 28(float) CompositeExtract 152 0 + 154: 28(float) Load 30(b) + 155: 28(float) FAdd 154 153 + Store 30(b) 155 + 159: 6(int) Load 90(nu_ii) + 160: 78(ptr) AccessChain 158(storageTexelBuffer) 159 + 161: 73 Load 160 + 162: 31(fvec4) ImageRead 161 67 + 163: 28(float) CompositeExtract 162 0 + 164: 28(float) Load 30(b) + 165: 28(float) FAdd 164 163 + Store 30(b) 165 + 170: 7(ptr) AccessChain 168(v) 169 + 171: 6(int) Load 170 + 172: 92(ptr) AccessChain 88(uniformBuffer) 171 51 + 173: 28(float) Load 172 + 174: 28(float) Load 30(b) + 175: 28(float) FAdd 174 173 + Store 30(b) 175 + 177: 7(ptr) AccessChain 168(v) 176 + 178: 6(int) Load 177 + 179: 92(ptr) AccessChain 88(uniformBuffer) 178 51 + 180: 28(float) Load 179 + 181: 28(float) Load 30(b) + 182: 28(float) FAdd 181 180 + Store 30(b) 182 + 184: 6(int) Load 90(nu_ii) + 185: 7(ptr) AccessChain 183(uv) 184 + 186: 6(int) Load 185 + 187: 92(ptr) AccessChain 88(uniformBuffer) 186 51 + 188: 28(float) Load 187 + 189: 28(float) Load 30(b) + 190: 28(float) FAdd 189 188 + Store 30(b) 190 + 194: 29(ptr) AccessChain 193(m) 25 176 + 195: 28(float) Load 194 + 196: 6(int) ConvertFToS 195 + 197: 92(ptr) AccessChain 88(uniformBuffer) 196 51 + 198: 28(float) Load 197 + 199: 28(float) Load 30(b) + 200: 28(float) FAdd 199 198 + Store 30(b) 200 + 204: 7(ptr) AccessChain 203(s) 51 + 205: 6(int) Load 204 + 206: 92(ptr) AccessChain 88(uniformBuffer) 205 51 + 207: 28(float) Load 206 + 208: 28(float) Load 30(b) + 209: 28(float) FAdd 208 207 + Store 30(b) 209 + Return + FunctionEnd + 11(foo(i1;i1;): 6(int) Function None 8 + 9(nupi): 7(ptr) FunctionParameter + 10(f): 7(ptr) FunctionParameter + 12: Label + 13: 6(int) Load 9(nupi) + ReturnValue 13 + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.noWorkgroup.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.noWorkgroup.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.noWorkgroup.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.noWorkgroup.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.noWorkgroup.comp // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 12 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.offsets.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.offsets.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.offsets.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.offsets.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.offsets.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 15 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.Operations.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.Operations.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.Operations.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.Operations.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.Operations.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 532 Capability Shader @@ -90,10 +90,10 @@ 188(f): 143(ptr) Variable Function 285(u): 284(ptr) Variable Function 305(b): 304(ptr) Variable Function - 486: 8(ptr) Variable Function + 487: 8(ptr) Variable Function 503(m1): 502(ptr) Variable Function 510(m2): 502(ptr) Variable Function - 513: 502(ptr) Variable Function + 514: 502(ptr) Variable Function 12: 7(fvec4) Load 11(uv4) 13: 7(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 12 Store 9(v) 13 @@ -658,9 +658,9 @@ 482: 178(bool) Load 305(b) 483: 178(bool) LogicalNot 482 Store 305(b) 483 - 487: 178(bool) Load 305(b) + 486: 178(bool) Load 305(b) SelectionMerge 489 None - BranchConditional 487 488 498 + BranchConditional 486 488 498 488: Label 490: 18(int) Load 20(i) 491: 6(float) ConvertSToF 490 @@ -670,30 +670,30 @@ 495: 7(fvec4) FAdd 492 494 496: 7(fvec4) Load 9(v) 497: 7(fvec4) FAdd 495 496 - Store 486 497 + Store 487 497 Branch 489 498: Label 499: 7(fvec4) Load 9(v) - Store 486 499 + Store 487 499 Branch 489 489: Label - 500: 7(fvec4) Load 486 + 500: 7(fvec4) Load 487 Store 485(FragColor) 500 Store 503(m1) 509 Store 510(m2) 512 - 514: 178(bool) Load 305(b) + 513: 178(bool) Load 305(b) SelectionMerge 516 None - BranchConditional 514 515 518 + BranchConditional 513 515 518 515: Label 517: 501 Load 503(m1) - Store 513 517 + Store 514 517 Branch 516 518: Label 519: 501 Load 510(m2) - Store 513 519 + Store 514 519 Branch 516 516: Label - 520: 8(ptr) AccessChain 513 405 + 520: 8(ptr) AccessChain 514 405 521: 7(fvec4) Load 520 522: 7(fvec4) Load 485(FragColor) 523: 7(fvec4) FAdd 522 521 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.OVR_multiview.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.OVR_multiview.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.OVR_multiview.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.OVR_multiview.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.OVR_multiview.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 27 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.paramMemory.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.paramMemory.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.paramMemory.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.paramMemory.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.paramMemory.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 69 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.precise.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.precise.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.precise.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.precise.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.precise.tesc // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 72 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.precise.tese.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.precise.tese.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.precise.tese.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.precise.tese.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.precise.tese // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 119 Capability Tessellation diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.precision.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.precision.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.precision.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.precision.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.precision.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 127 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.precisionNonESSamp.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.precisionNonESSamp.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.precisionNonESSamp.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.precisionNonESSamp.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.precisionNonESSamp.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 47 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.prepost.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.prepost.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.prepost.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.prepost.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.prepost.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 94 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.pushConstantAnon.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.pushConstantAnon.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.pushConstantAnon.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.pushConstantAnon.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.pushConstantAnon.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 38 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.pushConstant.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.pushConstant.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.pushConstant.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.pushConstant.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.pushConstant.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 35 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.qualifiers.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.qualifiers.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.qualifiers.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.qualifiers.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.qualifiers.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 21 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.queryL.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.queryL.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.queryL.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.queryL.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.queryL.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 224 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.rankShift.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.rankShift.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.rankShift.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.rankShift.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,57 @@ +spv.rankShift.comp +// Module Version 10000 +// Generated by (magic number): 80006 +// Id's are bound by 33 + + Capability Shader + Capability Int64 + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" + ExecutionMode 4 LocalSize 54 1 1 + Source GLSL 450 + SourceExtension "GL_ARB_gpu_shader_int64" + Name 4 "main" + Name 8 "result" + Name 11 "arg0" + Name 15 "arg1" + Decorate 11(arg0) Location 4 + Decorate 15(arg1) Location 5 + Decorate 32 BuiltIn WorkgroupSize + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 64 0 + 7: TypePointer Function 6(int) + 9: TypeInt 64 1 + 10: TypePointer UniformConstant 9(int) + 11(arg0): 10(ptr) Variable UniformConstant + 13: TypeInt 32 0 + 14: TypePointer UniformConstant 13(int) + 15(arg1): 14(ptr) Variable UniformConstant + 29: TypeVector 13(int) 3 + 30: 13(int) Constant 54 + 31: 13(int) Constant 1 + 32: 29(ivec3) ConstantComposite 30 31 31 + 4(main): 2 Function None 3 + 5: Label + 8(result): 7(ptr) Variable Function + 12: 9(int) Load 11(arg0) + 16: 13(int) Load 15(arg1) + 17: 9(int) ShiftLeftLogical 12 16 + 18: 6(int) Bitcast 17 + Store 8(result) 18 + 19: 9(int) Load 11(arg0) + 20: 13(int) Load 15(arg1) + 21: 9(int) ShiftRightArithmetic 19 20 + 22: 6(int) Bitcast 21 + Store 8(result) 22 + 23: 13(int) Load 15(arg1) + 24: 6(int) Load 8(result) + 25: 6(int) ShiftLeftLogical 24 23 + Store 8(result) 25 + 26: 13(int) Load 15(arg1) + 27: 6(int) Load 8(result) + 28: 6(int) ShiftRightLogical 27 26 + Store 8(result) 28 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.register.autoassign-2.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.register.autoassign-2.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.register.autoassign-2.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.register.autoassign-2.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.register.autoassign-2.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 47 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.register.autoassign.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.register.autoassign.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.register.autoassign.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.register.autoassign.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.register.autoassign.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 155 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.register.noautoassign.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.register.noautoassign.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.register.noautoassign.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.register.noautoassign.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.register.noautoassign.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 155 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.register.subpass.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.register.subpass.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.register.subpass.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.register.subpass.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.register.subpass.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 40 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.rw.autoassign.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.rw.autoassign.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.rw.autoassign.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.rw.autoassign.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.rw.autoassign.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 42 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.sample.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.sample.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.sample.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.sample.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.sample.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 13 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.sampleId.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.sampleId.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.sampleId.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.sampleId.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.sampleId.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 26 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.sampleMaskOverrideCoverage.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.sampleMaskOverrideCoverage.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.sampleMaskOverrideCoverage.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.sampleMaskOverrideCoverage.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.sampleMaskOverrideCoverage.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 20 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.samplePosition.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.samplePosition.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.samplePosition.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.samplePosition.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.samplePosition.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 30 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.separate.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.separate.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.separate.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.separate.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.separate.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 319 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.set.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.set.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.set.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.set.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.set.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 22 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shaderBallotAMD.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shaderBallotAMD.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shaderBallotAMD.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shaderBallotAMD.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,18 @@ spv.shaderBallotAMD.comp // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 1048 +// Generated by (magic number): 80006 +// Id's are bound by 1343 Capability Shader Capability Float16 Capability Float64 Capability Int64 Capability Groups + Capability Int16 Capability StorageUniformBufferBlock16 Capability StorageUniform16 Extension "SPV_AMD_gpu_shader_half_float" + Extension "SPV_AMD_gpu_shader_int16" Extension "SPV_AMD_shader_ballot" Extension "SPV_KHR_16bit_storage" 1: ExtInstImport "GLSL.std.450" @@ -19,29 +21,34 @@ ExecutionMode 4 LocalSize 8 8 1 Source GLSL 450 SourceExtension "GL_AMD_gpu_shader_half_float" + SourceExtension "GL_AMD_gpu_shader_int16" SourceExtension "GL_AMD_shader_ballot" SourceExtension "GL_ARB_gpu_shader_int64" Name 4 "main" - Name 18 "Buffers" - MemberName 18(Buffers) 0 "i" - MemberName 18(Buffers) 1 "uv" - MemberName 18(Buffers) 2 "fv" - MemberName 18(Buffers) 3 "dv" - MemberName 18(Buffers) 4 "i64" - MemberName 18(Buffers) 5 "u64v" - MemberName 18(Buffers) 6 "f16v" - Name 20 "" - MemberDecorate 18(Buffers) 0 Offset 0 - MemberDecorate 18(Buffers) 1 Offset 8 - MemberDecorate 18(Buffers) 2 Offset 16 - MemberDecorate 18(Buffers) 3 Offset 32 - MemberDecorate 18(Buffers) 4 Offset 64 - MemberDecorate 18(Buffers) 5 Offset 80 - MemberDecorate 18(Buffers) 6 Offset 96 - Decorate 18(Buffers) BufferBlock - Decorate 20 DescriptorSet 0 - Decorate 20 Binding 0 - Decorate 1047 BuiltIn WorkgroupSize + Name 21 "Buffers" + MemberName 21(Buffers) 0 "i" + MemberName 21(Buffers) 1 "uv" + MemberName 21(Buffers) 2 "fv" + MemberName 21(Buffers) 3 "dv" + MemberName 21(Buffers) 4 "i64" + MemberName 21(Buffers) 5 "u64v" + MemberName 21(Buffers) 6 "f16v" + MemberName 21(Buffers) 7 "i16v" + MemberName 21(Buffers) 8 "u16" + Name 23 "" + MemberDecorate 21(Buffers) 0 Offset 0 + MemberDecorate 21(Buffers) 1 Offset 8 + MemberDecorate 21(Buffers) 2 Offset 16 + MemberDecorate 21(Buffers) 3 Offset 32 + MemberDecorate 21(Buffers) 4 Offset 64 + MemberDecorate 21(Buffers) 5 Offset 80 + MemberDecorate 21(Buffers) 6 Offset 96 + MemberDecorate 21(Buffers) 7 Offset 104 + MemberDecorate 21(Buffers) 8 Offset 112 + Decorate 21(Buffers) BufferBlock + Decorate 23 DescriptorSet 0 + Decorate 23 Binding 0 + Decorate 1342 BuiltIn WorkgroupSize 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 1 @@ -56,1163 +63,1494 @@ 15: TypeVector 14(int) 2 16: TypeFloat 16 17: TypeVector 16(float) 3 - 18(Buffers): TypeStruct 6(int) 8(ivec2) 10(fvec3) 12(fvec4) 13(int) 15(ivec2) 17(fvec3) - 19: TypePointer Uniform 18(Buffers) - 20: 19(ptr) Variable Uniform - 21: 6(int) Constant 0 - 22: TypePointer Uniform 6(int) - 25: 7(int) Constant 3 - 28: 6(int) Constant 1 - 29: TypePointer Uniform 8(ivec2) - 38: 6(int) Constant 2 - 39: TypePointer Uniform 10(fvec3) - 50: 6(int) Constant 3 - 51: TypePointer Uniform 12(fvec4) - 64: 6(int) Constant 4 - 65: TypePointer Uniform 13(int) - 70: 6(int) Constant 5 - 71: TypePointer Uniform 15(ivec2) - 80: 6(int) Constant 6 - 81: TypePointer Uniform 17(fvec3) - 1044: TypeVector 7(int) 3 - 1045: 7(int) Constant 8 - 1046: 7(int) Constant 1 - 1047: 1044(ivec3) ConstantComposite 1045 1045 1046 + 18: TypeInt 16 1 + 19: TypeVector 18(int) 4 + 20: TypeInt 16 0 + 21(Buffers): TypeStruct 6(int) 8(ivec2) 10(fvec3) 12(fvec4) 13(int) 15(ivec2) 17(fvec3) 19(ivec4) 20(int) + 22: TypePointer Uniform 21(Buffers) + 23: 22(ptr) Variable Uniform + 24: 6(int) Constant 0 + 25: TypePointer Uniform 6(int) + 28: 7(int) Constant 3 + 31: 6(int) Constant 1 + 32: TypePointer Uniform 8(ivec2) + 41: 6(int) Constant 2 + 42: TypePointer Uniform 10(fvec3) + 53: 6(int) Constant 3 + 54: TypePointer Uniform 12(fvec4) + 67: 6(int) Constant 4 + 68: TypePointer Uniform 13(int) + 73: 6(int) Constant 5 + 74: TypePointer Uniform 15(ivec2) + 83: 6(int) Constant 6 + 84: TypePointer Uniform 17(fvec3) + 95: 6(int) Constant 7 + 96: TypePointer Uniform 19(ivec4) + 109: 6(int) Constant 8 + 110: TypePointer Uniform 20(int) + 1339: TypeVector 7(int) 3 + 1340: 7(int) Constant 8 + 1341: 7(int) Constant 1 + 1342: 1339(ivec3) ConstantComposite 1340 1340 1341 4(main): 2 Function None 3 5: Label - 23: 22(ptr) AccessChain 20 21 - 24: 6(int) Load 23 - 26: 6(int) GroupSMin 25 Reduce 24 - 27: 22(ptr) AccessChain 20 21 - Store 27 26 - 30: 29(ptr) AccessChain 20 28 - 31: 8(ivec2) Load 30 - 32: 7(int) CompositeExtract 31 0 - 33: 7(int) GroupUMin 25 Reduce 32 - 34: 7(int) CompositeExtract 31 1 - 35: 7(int) GroupUMin 25 Reduce 34 - 36: 8(ivec2) CompositeConstruct 33 35 - 37: 29(ptr) AccessChain 20 28 - Store 37 36 - 40: 39(ptr) AccessChain 20 38 - 41: 10(fvec3) Load 40 - 42: 9(float) CompositeExtract 41 0 - 43: 9(float) GroupFMin 25 Reduce 42 - 44: 9(float) CompositeExtract 41 1 - 45: 9(float) GroupFMin 25 Reduce 44 - 46: 9(float) CompositeExtract 41 2 - 47: 9(float) GroupFMin 25 Reduce 46 - 48: 10(fvec3) CompositeConstruct 43 45 47 - 49: 39(ptr) AccessChain 20 38 - Store 49 48 - 52: 51(ptr) AccessChain 20 50 - 53: 12(fvec4) Load 52 - 54: 11(float) CompositeExtract 53 0 - 55: 11(float) GroupFMin 25 Reduce 54 - 56: 11(float) CompositeExtract 53 1 - 57: 11(float) GroupFMin 25 Reduce 56 - 58: 11(float) CompositeExtract 53 2 - 59: 11(float) GroupFMin 25 Reduce 58 - 60: 11(float) CompositeExtract 53 3 - 61: 11(float) GroupFMin 25 Reduce 60 - 62: 12(fvec4) CompositeConstruct 55 57 59 61 - 63: 51(ptr) AccessChain 20 50 - Store 63 62 - 66: 65(ptr) AccessChain 20 64 - 67: 13(int) Load 66 - 68: 13(int) GroupSMin 25 Reduce 67 - 69: 65(ptr) AccessChain 20 64 - Store 69 68 - 72: 71(ptr) AccessChain 20 70 - 73: 15(ivec2) Load 72 - 74: 14(int) CompositeExtract 73 0 - 75: 14(int) GroupUMin 25 Reduce 74 - 76: 14(int) CompositeExtract 73 1 - 77: 14(int) GroupUMin 25 Reduce 76 - 78: 15(ivec2) CompositeConstruct 75 77 - 79: 71(ptr) AccessChain 20 70 - Store 79 78 - 82: 81(ptr) AccessChain 20 80 - 83: 17(fvec3) Load 82 - 84: 16(float) CompositeExtract 83 0 - 85: 16(float) GroupFMin 25 Reduce 84 - 86: 16(float) CompositeExtract 83 1 - 87: 16(float) GroupFMin 25 Reduce 86 - 88: 16(float) CompositeExtract 83 2 - 89: 16(float) GroupFMin 25 Reduce 88 - 90: 17(fvec3) CompositeConstruct 85 87 89 - 91: 81(ptr) AccessChain 20 80 - Store 91 90 - 92: 22(ptr) AccessChain 20 21 - 93: 6(int) Load 92 - 94: 6(int) GroupSMax 25 Reduce 93 - 95: 22(ptr) AccessChain 20 21 - Store 95 94 - 96: 29(ptr) AccessChain 20 28 - 97: 8(ivec2) Load 96 - 98: 7(int) CompositeExtract 97 0 - 99: 7(int) GroupUMax 25 Reduce 98 - 100: 7(int) CompositeExtract 97 1 - 101: 7(int) GroupUMax 25 Reduce 100 - 102: 8(ivec2) CompositeConstruct 99 101 - 103: 29(ptr) AccessChain 20 28 - Store 103 102 - 104: 39(ptr) AccessChain 20 38 - 105: 10(fvec3) Load 104 - 106: 9(float) CompositeExtract 105 0 - 107: 9(float) GroupFMax 25 Reduce 106 - 108: 9(float) CompositeExtract 105 1 - 109: 9(float) GroupFMax 25 Reduce 108 - 110: 9(float) CompositeExtract 105 2 - 111: 9(float) GroupFMax 25 Reduce 110 - 112: 10(fvec3) CompositeConstruct 107 109 111 - 113: 39(ptr) AccessChain 20 38 - Store 113 112 - 114: 51(ptr) AccessChain 20 50 - 115: 12(fvec4) Load 114 - 116: 11(float) CompositeExtract 115 0 - 117: 11(float) GroupFMax 25 Reduce 116 - 118: 11(float) CompositeExtract 115 1 - 119: 11(float) GroupFMax 25 Reduce 118 - 120: 11(float) CompositeExtract 115 2 - 121: 11(float) GroupFMax 25 Reduce 120 - 122: 11(float) CompositeExtract 115 3 - 123: 11(float) GroupFMax 25 Reduce 122 - 124: 12(fvec4) CompositeConstruct 117 119 121 123 - 125: 51(ptr) AccessChain 20 50 - Store 125 124 - 126: 65(ptr) AccessChain 20 64 - 127: 13(int) Load 126 - 128: 13(int) GroupSMax 25 Reduce 127 - 129: 65(ptr) AccessChain 20 64 - Store 129 128 - 130: 71(ptr) AccessChain 20 70 - 131: 15(ivec2) Load 130 - 132: 14(int) CompositeExtract 131 0 - 133: 14(int) GroupUMax 25 Reduce 132 - 134: 14(int) CompositeExtract 131 1 - 135: 14(int) GroupUMax 25 Reduce 134 - 136: 15(ivec2) CompositeConstruct 133 135 - 137: 71(ptr) AccessChain 20 70 - Store 137 136 - 138: 81(ptr) AccessChain 20 80 - 139: 17(fvec3) Load 138 - 140: 16(float) CompositeExtract 139 0 - 141: 16(float) GroupFMax 25 Reduce 140 - 142: 16(float) CompositeExtract 139 1 - 143: 16(float) GroupFMax 25 Reduce 142 - 144: 16(float) CompositeExtract 139 2 - 145: 16(float) GroupFMax 25 Reduce 144 - 146: 17(fvec3) CompositeConstruct 141 143 145 - 147: 81(ptr) AccessChain 20 80 - Store 147 146 - 148: 22(ptr) AccessChain 20 21 - 149: 6(int) Load 148 - 150: 6(int) GroupIAdd 25 Reduce 149 - 151: 22(ptr) AccessChain 20 21 - Store 151 150 - 152: 29(ptr) AccessChain 20 28 - 153: 8(ivec2) Load 152 - 154: 7(int) CompositeExtract 153 0 - 155: 7(int) GroupIAdd 25 Reduce 154 - 156: 7(int) CompositeExtract 153 1 - 157: 7(int) GroupIAdd 25 Reduce 156 - 158: 8(ivec2) CompositeConstruct 155 157 - 159: 29(ptr) AccessChain 20 28 - Store 159 158 - 160: 39(ptr) AccessChain 20 38 - 161: 10(fvec3) Load 160 - 162: 9(float) CompositeExtract 161 0 - 163: 9(float) GroupFAdd 25 Reduce 162 - 164: 9(float) CompositeExtract 161 1 - 165: 9(float) GroupFAdd 25 Reduce 164 - 166: 9(float) CompositeExtract 161 2 - 167: 9(float) GroupFAdd 25 Reduce 166 - 168: 10(fvec3) CompositeConstruct 163 165 167 - 169: 39(ptr) AccessChain 20 38 - Store 169 168 - 170: 51(ptr) AccessChain 20 50 - 171: 12(fvec4) Load 170 - 172: 11(float) CompositeExtract 171 0 - 173: 11(float) GroupFAdd 25 Reduce 172 - 174: 11(float) CompositeExtract 171 1 - 175: 11(float) GroupFAdd 25 Reduce 174 - 176: 11(float) CompositeExtract 171 2 - 177: 11(float) GroupFAdd 25 Reduce 176 - 178: 11(float) CompositeExtract 171 3 - 179: 11(float) GroupFAdd 25 Reduce 178 - 180: 12(fvec4) CompositeConstruct 173 175 177 179 - 181: 51(ptr) AccessChain 20 50 - Store 181 180 - 182: 65(ptr) AccessChain 20 64 - 183: 13(int) Load 182 - 184: 13(int) GroupIAdd 25 Reduce 183 - 185: 65(ptr) AccessChain 20 64 - Store 185 184 - 186: 71(ptr) AccessChain 20 70 - 187: 15(ivec2) Load 186 - 188: 14(int) CompositeExtract 187 0 - 189: 14(int) GroupIAdd 25 Reduce 188 - 190: 14(int) CompositeExtract 187 1 - 191: 14(int) GroupIAdd 25 Reduce 190 - 192: 15(ivec2) CompositeConstruct 189 191 - 193: 71(ptr) AccessChain 20 70 - Store 193 192 - 194: 81(ptr) AccessChain 20 80 - 195: 17(fvec3) Load 194 - 196: 16(float) CompositeExtract 195 0 - 197: 16(float) GroupFAdd 25 Reduce 196 - 198: 16(float) CompositeExtract 195 1 - 199: 16(float) GroupFAdd 25 Reduce 198 - 200: 16(float) CompositeExtract 195 2 - 201: 16(float) GroupFAdd 25 Reduce 200 - 202: 17(fvec3) CompositeConstruct 197 199 201 - 203: 81(ptr) AccessChain 20 80 - Store 203 202 - 204: 22(ptr) AccessChain 20 21 - 205: 6(int) Load 204 - 206: 6(int) GroupSMinNonUniformAMD 25 Reduce 205 - 207: 22(ptr) AccessChain 20 21 - Store 207 206 - 208: 29(ptr) AccessChain 20 28 - 209: 8(ivec2) Load 208 - 210: 7(int) CompositeExtract 209 0 - 211: 7(int) GroupUMinNonUniformAMD 25 Reduce 210 - 212: 7(int) CompositeExtract 209 1 - 213: 7(int) GroupUMinNonUniformAMD 25 Reduce 212 - 214: 8(ivec2) CompositeConstruct 211 213 - 215: 29(ptr) AccessChain 20 28 - Store 215 214 - 216: 39(ptr) AccessChain 20 38 - 217: 10(fvec3) Load 216 - 218: 9(float) CompositeExtract 217 0 - 219: 9(float) GroupFMinNonUniformAMD 25 Reduce 218 - 220: 9(float) CompositeExtract 217 1 - 221: 9(float) GroupFMinNonUniformAMD 25 Reduce 220 - 222: 9(float) CompositeExtract 217 2 - 223: 9(float) GroupFMinNonUniformAMD 25 Reduce 222 - 224: 10(fvec3) CompositeConstruct 219 221 223 - 225: 39(ptr) AccessChain 20 38 - Store 225 224 - 226: 51(ptr) AccessChain 20 50 - 227: 12(fvec4) Load 226 - 228: 11(float) CompositeExtract 227 0 - 229: 11(float) GroupFMinNonUniformAMD 25 Reduce 228 - 230: 11(float) CompositeExtract 227 1 - 231: 11(float) GroupFMinNonUniformAMD 25 Reduce 230 - 232: 11(float) CompositeExtract 227 2 - 233: 11(float) GroupFMinNonUniformAMD 25 Reduce 232 - 234: 11(float) CompositeExtract 227 3 - 235: 11(float) GroupFMinNonUniformAMD 25 Reduce 234 - 236: 12(fvec4) CompositeConstruct 229 231 233 235 - 237: 51(ptr) AccessChain 20 50 - Store 237 236 - 238: 65(ptr) AccessChain 20 64 - 239: 13(int) Load 238 - 240: 13(int) GroupSMinNonUniformAMD 25 Reduce 239 - 241: 65(ptr) AccessChain 20 64 - Store 241 240 - 242: 71(ptr) AccessChain 20 70 - 243: 15(ivec2) Load 242 - 244: 14(int) CompositeExtract 243 0 - 245: 14(int) GroupUMinNonUniformAMD 25 Reduce 244 - 246: 14(int) CompositeExtract 243 1 - 247: 14(int) GroupUMinNonUniformAMD 25 Reduce 246 - 248: 15(ivec2) CompositeConstruct 245 247 - 249: 71(ptr) AccessChain 20 70 - Store 249 248 - 250: 81(ptr) AccessChain 20 80 - 251: 17(fvec3) Load 250 - 252: 16(float) CompositeExtract 251 0 - 253: 16(float) GroupFMinNonUniformAMD 25 Reduce 252 - 254: 16(float) CompositeExtract 251 1 - 255: 16(float) GroupFMinNonUniformAMD 25 Reduce 254 - 256: 16(float) CompositeExtract 251 2 - 257: 16(float) GroupFMinNonUniformAMD 25 Reduce 256 - 258: 17(fvec3) CompositeConstruct 253 255 257 - 259: 81(ptr) AccessChain 20 80 - Store 259 258 - 260: 22(ptr) AccessChain 20 21 - 261: 6(int) Load 260 - 262: 6(int) GroupSMaxNonUniformAMD 25 Reduce 261 - 263: 22(ptr) AccessChain 20 21 - Store 263 262 - 264: 29(ptr) AccessChain 20 28 - 265: 8(ivec2) Load 264 - 266: 7(int) CompositeExtract 265 0 - 267: 7(int) GroupUMaxNonUniformAMD 25 Reduce 266 - 268: 7(int) CompositeExtract 265 1 - 269: 7(int) GroupUMaxNonUniformAMD 25 Reduce 268 - 270: 8(ivec2) CompositeConstruct 267 269 - 271: 29(ptr) AccessChain 20 28 - Store 271 270 - 272: 39(ptr) AccessChain 20 38 - 273: 10(fvec3) Load 272 - 274: 9(float) CompositeExtract 273 0 - 275: 9(float) GroupFMaxNonUniformAMD 25 Reduce 274 - 276: 9(float) CompositeExtract 273 1 - 277: 9(float) GroupFMaxNonUniformAMD 25 Reduce 276 - 278: 9(float) CompositeExtract 273 2 - 279: 9(float) GroupFMaxNonUniformAMD 25 Reduce 278 - 280: 10(fvec3) CompositeConstruct 275 277 279 - 281: 39(ptr) AccessChain 20 38 - Store 281 280 - 282: 51(ptr) AccessChain 20 50 - 283: 12(fvec4) Load 282 - 284: 11(float) CompositeExtract 283 0 - 285: 11(float) GroupFMaxNonUniformAMD 25 Reduce 284 - 286: 11(float) CompositeExtract 283 1 - 287: 11(float) GroupFMaxNonUniformAMD 25 Reduce 286 - 288: 11(float) CompositeExtract 283 2 - 289: 11(float) GroupFMaxNonUniformAMD 25 Reduce 288 - 290: 11(float) CompositeExtract 283 3 - 291: 11(float) GroupFMaxNonUniformAMD 25 Reduce 290 - 292: 12(fvec4) CompositeConstruct 285 287 289 291 - 293: 51(ptr) AccessChain 20 50 - Store 293 292 - 294: 65(ptr) AccessChain 20 64 - 295: 13(int) Load 294 - 296: 13(int) GroupSMaxNonUniformAMD 25 Reduce 295 - 297: 65(ptr) AccessChain 20 64 - Store 297 296 - 298: 71(ptr) AccessChain 20 70 - 299: 15(ivec2) Load 298 - 300: 14(int) CompositeExtract 299 0 - 301: 14(int) GroupUMaxNonUniformAMD 25 Reduce 300 - 302: 14(int) CompositeExtract 299 1 - 303: 14(int) GroupUMaxNonUniformAMD 25 Reduce 302 - 304: 15(ivec2) CompositeConstruct 301 303 - 305: 71(ptr) AccessChain 20 70 - Store 305 304 - 306: 81(ptr) AccessChain 20 80 - 307: 17(fvec3) Load 306 - 308: 16(float) CompositeExtract 307 0 - 309: 16(float) GroupFMaxNonUniformAMD 25 Reduce 308 - 310: 16(float) CompositeExtract 307 1 - 311: 16(float) GroupFMaxNonUniformAMD 25 Reduce 310 - 312: 16(float) CompositeExtract 307 2 - 313: 16(float) GroupFMaxNonUniformAMD 25 Reduce 312 - 314: 17(fvec3) CompositeConstruct 309 311 313 - 315: 81(ptr) AccessChain 20 80 - Store 315 314 - 316: 22(ptr) AccessChain 20 21 - 317: 6(int) Load 316 - 318: 6(int) GroupIAddNonUniformAMD 25 Reduce 317 - 319: 22(ptr) AccessChain 20 21 - Store 319 318 - 320: 29(ptr) AccessChain 20 28 - 321: 8(ivec2) Load 320 - 322: 7(int) CompositeExtract 321 0 - 323: 7(int) GroupIAddNonUniformAMD 25 Reduce 322 - 324: 7(int) CompositeExtract 321 1 - 325: 7(int) GroupIAddNonUniformAMD 25 Reduce 324 - 326: 8(ivec2) CompositeConstruct 323 325 - 327: 29(ptr) AccessChain 20 28 - Store 327 326 - 328: 39(ptr) AccessChain 20 38 - 329: 10(fvec3) Load 328 - 330: 9(float) CompositeExtract 329 0 - 331: 9(float) GroupFAddNonUniformAMD 25 Reduce 330 - 332: 9(float) CompositeExtract 329 1 - 333: 9(float) GroupFAddNonUniformAMD 25 Reduce 332 - 334: 9(float) CompositeExtract 329 2 - 335: 9(float) GroupFAddNonUniformAMD 25 Reduce 334 - 336: 10(fvec3) CompositeConstruct 331 333 335 - 337: 39(ptr) AccessChain 20 38 - Store 337 336 - 338: 51(ptr) AccessChain 20 50 - 339: 12(fvec4) Load 338 - 340: 11(float) CompositeExtract 339 0 - 341: 11(float) GroupFAddNonUniformAMD 25 Reduce 340 - 342: 11(float) CompositeExtract 339 1 - 343: 11(float) GroupFAddNonUniformAMD 25 Reduce 342 - 344: 11(float) CompositeExtract 339 2 - 345: 11(float) GroupFAddNonUniformAMD 25 Reduce 344 - 346: 11(float) CompositeExtract 339 3 - 347: 11(float) GroupFAddNonUniformAMD 25 Reduce 346 - 348: 12(fvec4) CompositeConstruct 341 343 345 347 - 349: 51(ptr) AccessChain 20 50 - Store 349 348 - 350: 65(ptr) AccessChain 20 64 - 351: 13(int) Load 350 - 352: 13(int) GroupIAddNonUniformAMD 25 Reduce 351 - 353: 65(ptr) AccessChain 20 64 - Store 353 352 - 354: 71(ptr) AccessChain 20 70 - 355: 15(ivec2) Load 354 - 356: 14(int) CompositeExtract 355 0 - 357: 14(int) GroupIAddNonUniformAMD 25 Reduce 356 - 358: 14(int) CompositeExtract 355 1 - 359: 14(int) GroupIAddNonUniformAMD 25 Reduce 358 - 360: 15(ivec2) CompositeConstruct 357 359 - 361: 71(ptr) AccessChain 20 70 - Store 361 360 - 362: 81(ptr) AccessChain 20 80 - 363: 17(fvec3) Load 362 - 364: 16(float) CompositeExtract 363 0 - 365: 16(float) GroupFAddNonUniformAMD 25 Reduce 364 - 366: 16(float) CompositeExtract 363 1 - 367: 16(float) GroupFAddNonUniformAMD 25 Reduce 366 - 368: 16(float) CompositeExtract 363 2 - 369: 16(float) GroupFAddNonUniformAMD 25 Reduce 368 - 370: 17(fvec3) CompositeConstruct 365 367 369 - 371: 81(ptr) AccessChain 20 80 - Store 371 370 - 372: 22(ptr) AccessChain 20 21 - 373: 6(int) Load 372 - 374: 6(int) GroupSMin 25 InclusiveScan 373 - 375: 22(ptr) AccessChain 20 21 - Store 375 374 - 376: 29(ptr) AccessChain 20 28 - 377: 8(ivec2) Load 376 - 378: 7(int) CompositeExtract 377 0 - 379: 7(int) GroupUMin 25 InclusiveScan 378 - 380: 7(int) CompositeExtract 377 1 - 381: 7(int) GroupUMin 25 InclusiveScan 380 - 382: 8(ivec2) CompositeConstruct 379 381 - 383: 29(ptr) AccessChain 20 28 - Store 383 382 - 384: 39(ptr) AccessChain 20 38 - 385: 10(fvec3) Load 384 - 386: 9(float) CompositeExtract 385 0 - 387: 9(float) GroupFMin 25 InclusiveScan 386 - 388: 9(float) CompositeExtract 385 1 - 389: 9(float) GroupFMin 25 InclusiveScan 388 - 390: 9(float) CompositeExtract 385 2 - 391: 9(float) GroupFMin 25 InclusiveScan 390 - 392: 10(fvec3) CompositeConstruct 387 389 391 - 393: 39(ptr) AccessChain 20 38 - Store 393 392 - 394: 51(ptr) AccessChain 20 50 - 395: 12(fvec4) Load 394 - 396: 11(float) CompositeExtract 395 0 - 397: 11(float) GroupFMin 25 InclusiveScan 396 - 398: 11(float) CompositeExtract 395 1 - 399: 11(float) GroupFMin 25 InclusiveScan 398 - 400: 11(float) CompositeExtract 395 2 - 401: 11(float) GroupFMin 25 InclusiveScan 400 - 402: 11(float) CompositeExtract 395 3 - 403: 11(float) GroupFMin 25 InclusiveScan 402 - 404: 12(fvec4) CompositeConstruct 397 399 401 403 - 405: 51(ptr) AccessChain 20 50 - Store 405 404 - 406: 65(ptr) AccessChain 20 64 - 407: 13(int) Load 406 - 408: 13(int) GroupSMin 25 InclusiveScan 407 - 409: 65(ptr) AccessChain 20 64 - Store 409 408 - 410: 71(ptr) AccessChain 20 70 - 411: 15(ivec2) Load 410 - 412: 14(int) CompositeExtract 411 0 - 413: 14(int) GroupUMin 25 InclusiveScan 412 - 414: 14(int) CompositeExtract 411 1 - 415: 14(int) GroupUMin 25 InclusiveScan 414 - 416: 15(ivec2) CompositeConstruct 413 415 - 417: 71(ptr) AccessChain 20 70 - Store 417 416 - 418: 81(ptr) AccessChain 20 80 - 419: 17(fvec3) Load 418 - 420: 16(float) CompositeExtract 419 0 - 421: 16(float) GroupFMin 25 InclusiveScan 420 - 422: 16(float) CompositeExtract 419 1 - 423: 16(float) GroupFMin 25 InclusiveScan 422 - 424: 16(float) CompositeExtract 419 2 - 425: 16(float) GroupFMin 25 InclusiveScan 424 - 426: 17(fvec3) CompositeConstruct 421 423 425 - 427: 81(ptr) AccessChain 20 80 - Store 427 426 - 428: 22(ptr) AccessChain 20 21 - 429: 6(int) Load 428 - 430: 6(int) GroupSMax 25 InclusiveScan 429 - 431: 22(ptr) AccessChain 20 21 - Store 431 430 - 432: 29(ptr) AccessChain 20 28 - 433: 8(ivec2) Load 432 - 434: 7(int) CompositeExtract 433 0 - 435: 7(int) GroupUMax 25 InclusiveScan 434 - 436: 7(int) CompositeExtract 433 1 - 437: 7(int) GroupUMax 25 InclusiveScan 436 - 438: 8(ivec2) CompositeConstruct 435 437 - 439: 29(ptr) AccessChain 20 28 - Store 439 438 - 440: 39(ptr) AccessChain 20 38 - 441: 10(fvec3) Load 440 - 442: 9(float) CompositeExtract 441 0 - 443: 9(float) GroupFMax 25 InclusiveScan 442 - 444: 9(float) CompositeExtract 441 1 - 445: 9(float) GroupFMax 25 InclusiveScan 444 - 446: 9(float) CompositeExtract 441 2 - 447: 9(float) GroupFMax 25 InclusiveScan 446 - 448: 10(fvec3) CompositeConstruct 443 445 447 - 449: 39(ptr) AccessChain 20 38 - Store 449 448 - 450: 51(ptr) AccessChain 20 50 - 451: 12(fvec4) Load 450 - 452: 11(float) CompositeExtract 451 0 - 453: 11(float) GroupFMax 25 InclusiveScan 452 - 454: 11(float) CompositeExtract 451 1 - 455: 11(float) GroupFMax 25 InclusiveScan 454 - 456: 11(float) CompositeExtract 451 2 - 457: 11(float) GroupFMax 25 InclusiveScan 456 - 458: 11(float) CompositeExtract 451 3 - 459: 11(float) GroupFMax 25 InclusiveScan 458 - 460: 12(fvec4) CompositeConstruct 453 455 457 459 - 461: 51(ptr) AccessChain 20 50 - Store 461 460 - 462: 65(ptr) AccessChain 20 64 - 463: 13(int) Load 462 - 464: 13(int) GroupSMax 25 InclusiveScan 463 - 465: 65(ptr) AccessChain 20 64 - Store 465 464 - 466: 71(ptr) AccessChain 20 70 - 467: 15(ivec2) Load 466 - 468: 14(int) CompositeExtract 467 0 - 469: 14(int) GroupUMax 25 InclusiveScan 468 - 470: 14(int) CompositeExtract 467 1 - 471: 14(int) GroupUMax 25 InclusiveScan 470 - 472: 15(ivec2) CompositeConstruct 469 471 - 473: 71(ptr) AccessChain 20 70 - Store 473 472 - 474: 81(ptr) AccessChain 20 80 - 475: 17(fvec3) Load 474 - 476: 16(float) CompositeExtract 475 0 - 477: 16(float) GroupFMax 25 InclusiveScan 476 - 478: 16(float) CompositeExtract 475 1 - 479: 16(float) GroupFMax 25 InclusiveScan 478 - 480: 16(float) CompositeExtract 475 2 - 481: 16(float) GroupFMax 25 InclusiveScan 480 - 482: 17(fvec3) CompositeConstruct 477 479 481 - 483: 81(ptr) AccessChain 20 80 - Store 483 482 - 484: 22(ptr) AccessChain 20 21 - 485: 6(int) Load 484 - 486: 6(int) GroupIAdd 25 InclusiveScan 485 - 487: 22(ptr) AccessChain 20 21 - Store 487 486 - 488: 29(ptr) AccessChain 20 28 - 489: 8(ivec2) Load 488 - 490: 7(int) CompositeExtract 489 0 - 491: 7(int) GroupIAdd 25 InclusiveScan 490 - 492: 7(int) CompositeExtract 489 1 - 493: 7(int) GroupIAdd 25 InclusiveScan 492 - 494: 8(ivec2) CompositeConstruct 491 493 - 495: 29(ptr) AccessChain 20 28 - Store 495 494 - 496: 39(ptr) AccessChain 20 38 - 497: 10(fvec3) Load 496 - 498: 9(float) CompositeExtract 497 0 - 499: 9(float) GroupFAdd 25 InclusiveScan 498 - 500: 9(float) CompositeExtract 497 1 - 501: 9(float) GroupFAdd 25 InclusiveScan 500 - 502: 9(float) CompositeExtract 497 2 - 503: 9(float) GroupFAdd 25 InclusiveScan 502 - 504: 10(fvec3) CompositeConstruct 499 501 503 - 505: 39(ptr) AccessChain 20 38 - Store 505 504 - 506: 51(ptr) AccessChain 20 50 - 507: 12(fvec4) Load 506 - 508: 11(float) CompositeExtract 507 0 - 509: 11(float) GroupFAdd 25 InclusiveScan 508 - 510: 11(float) CompositeExtract 507 1 - 511: 11(float) GroupFAdd 25 InclusiveScan 510 - 512: 11(float) CompositeExtract 507 2 - 513: 11(float) GroupFAdd 25 InclusiveScan 512 - 514: 11(float) CompositeExtract 507 3 - 515: 11(float) GroupFAdd 25 InclusiveScan 514 - 516: 12(fvec4) CompositeConstruct 509 511 513 515 - 517: 51(ptr) AccessChain 20 50 - Store 517 516 - 518: 65(ptr) AccessChain 20 64 - 519: 13(int) Load 518 - 520: 13(int) GroupIAdd 25 InclusiveScan 519 - 521: 65(ptr) AccessChain 20 64 - Store 521 520 - 522: 71(ptr) AccessChain 20 70 - 523: 15(ivec2) Load 522 - 524: 14(int) CompositeExtract 523 0 - 525: 14(int) GroupIAdd 25 InclusiveScan 524 - 526: 14(int) CompositeExtract 523 1 - 527: 14(int) GroupIAdd 25 InclusiveScan 526 - 528: 15(ivec2) CompositeConstruct 525 527 - 529: 71(ptr) AccessChain 20 70 - Store 529 528 - 530: 81(ptr) AccessChain 20 80 - 531: 17(fvec3) Load 530 - 532: 16(float) CompositeExtract 531 0 - 533: 16(float) GroupFAdd 25 InclusiveScan 532 - 534: 16(float) CompositeExtract 531 1 - 535: 16(float) GroupFAdd 25 InclusiveScan 534 - 536: 16(float) CompositeExtract 531 2 - 537: 16(float) GroupFAdd 25 InclusiveScan 536 - 538: 17(fvec3) CompositeConstruct 533 535 537 - 539: 81(ptr) AccessChain 20 80 - Store 539 538 - 540: 22(ptr) AccessChain 20 21 - 541: 6(int) Load 540 - 542: 6(int) GroupSMin 25 ExclusiveScan 541 - 543: 22(ptr) AccessChain 20 21 - Store 543 542 - 544: 29(ptr) AccessChain 20 28 - 545: 8(ivec2) Load 544 - 546: 7(int) CompositeExtract 545 0 - 547: 7(int) GroupUMin 25 ExclusiveScan 546 - 548: 7(int) CompositeExtract 545 1 - 549: 7(int) GroupUMin 25 ExclusiveScan 548 - 550: 8(ivec2) CompositeConstruct 547 549 - 551: 29(ptr) AccessChain 20 28 - Store 551 550 - 552: 39(ptr) AccessChain 20 38 - 553: 10(fvec3) Load 552 - 554: 9(float) CompositeExtract 553 0 - 555: 9(float) GroupFMin 25 ExclusiveScan 554 - 556: 9(float) CompositeExtract 553 1 - 557: 9(float) GroupFMin 25 ExclusiveScan 556 - 558: 9(float) CompositeExtract 553 2 - 559: 9(float) GroupFMin 25 ExclusiveScan 558 - 560: 10(fvec3) CompositeConstruct 555 557 559 - 561: 39(ptr) AccessChain 20 38 - Store 561 560 - 562: 51(ptr) AccessChain 20 50 - 563: 12(fvec4) Load 562 - 564: 11(float) CompositeExtract 563 0 - 565: 11(float) GroupFMin 25 ExclusiveScan 564 - 566: 11(float) CompositeExtract 563 1 - 567: 11(float) GroupFMin 25 ExclusiveScan 566 - 568: 11(float) CompositeExtract 563 2 - 569: 11(float) GroupFMin 25 ExclusiveScan 568 - 570: 11(float) CompositeExtract 563 3 - 571: 11(float) GroupFMin 25 ExclusiveScan 570 - 572: 12(fvec4) CompositeConstruct 565 567 569 571 - 573: 51(ptr) AccessChain 20 50 - Store 573 572 - 574: 65(ptr) AccessChain 20 64 - 575: 13(int) Load 574 - 576: 13(int) GroupSMin 25 ExclusiveScan 575 - 577: 65(ptr) AccessChain 20 64 - Store 577 576 - 578: 71(ptr) AccessChain 20 70 - 579: 15(ivec2) Load 578 - 580: 14(int) CompositeExtract 579 0 - 581: 14(int) GroupUMin 25 ExclusiveScan 580 - 582: 14(int) CompositeExtract 579 1 - 583: 14(int) GroupUMin 25 ExclusiveScan 582 - 584: 15(ivec2) CompositeConstruct 581 583 - 585: 71(ptr) AccessChain 20 70 - Store 585 584 - 586: 81(ptr) AccessChain 20 80 - 587: 17(fvec3) Load 586 - 588: 16(float) CompositeExtract 587 0 - 589: 16(float) GroupFMin 25 ExclusiveScan 588 - 590: 16(float) CompositeExtract 587 1 - 591: 16(float) GroupFMin 25 ExclusiveScan 590 - 592: 16(float) CompositeExtract 587 2 - 593: 16(float) GroupFMin 25 ExclusiveScan 592 - 594: 17(fvec3) CompositeConstruct 589 591 593 - 595: 81(ptr) AccessChain 20 80 - Store 595 594 - 596: 22(ptr) AccessChain 20 21 - 597: 6(int) Load 596 - 598: 6(int) GroupSMax 25 ExclusiveScan 597 - 599: 22(ptr) AccessChain 20 21 - Store 599 598 - 600: 29(ptr) AccessChain 20 28 - 601: 8(ivec2) Load 600 - 602: 7(int) CompositeExtract 601 0 - 603: 7(int) GroupUMax 25 ExclusiveScan 602 - 604: 7(int) CompositeExtract 601 1 - 605: 7(int) GroupUMax 25 ExclusiveScan 604 - 606: 8(ivec2) CompositeConstruct 603 605 - 607: 29(ptr) AccessChain 20 28 - Store 607 606 - 608: 39(ptr) AccessChain 20 38 - 609: 10(fvec3) Load 608 - 610: 9(float) CompositeExtract 609 0 - 611: 9(float) GroupFMax 25 ExclusiveScan 610 - 612: 9(float) CompositeExtract 609 1 - 613: 9(float) GroupFMax 25 ExclusiveScan 612 - 614: 9(float) CompositeExtract 609 2 - 615: 9(float) GroupFMax 25 ExclusiveScan 614 - 616: 10(fvec3) CompositeConstruct 611 613 615 - 617: 39(ptr) AccessChain 20 38 - Store 617 616 - 618: 51(ptr) AccessChain 20 50 - 619: 12(fvec4) Load 618 - 620: 11(float) CompositeExtract 619 0 - 621: 11(float) GroupFMax 25 ExclusiveScan 620 - 622: 11(float) CompositeExtract 619 1 - 623: 11(float) GroupFMax 25 ExclusiveScan 622 - 624: 11(float) CompositeExtract 619 2 - 625: 11(float) GroupFMax 25 ExclusiveScan 624 - 626: 11(float) CompositeExtract 619 3 - 627: 11(float) GroupFMax 25 ExclusiveScan 626 - 628: 12(fvec4) CompositeConstruct 621 623 625 627 - 629: 51(ptr) AccessChain 20 50 - Store 629 628 - 630: 65(ptr) AccessChain 20 64 - 631: 13(int) Load 630 - 632: 13(int) GroupSMax 25 ExclusiveScan 631 - 633: 65(ptr) AccessChain 20 64 - Store 633 632 - 634: 71(ptr) AccessChain 20 70 - 635: 15(ivec2) Load 634 - 636: 14(int) CompositeExtract 635 0 - 637: 14(int) GroupUMax 25 ExclusiveScan 636 - 638: 14(int) CompositeExtract 635 1 - 639: 14(int) GroupUMax 25 ExclusiveScan 638 - 640: 15(ivec2) CompositeConstruct 637 639 - 641: 71(ptr) AccessChain 20 70 - Store 641 640 - 642: 81(ptr) AccessChain 20 80 - 643: 17(fvec3) Load 642 - 644: 16(float) CompositeExtract 643 0 - 645: 16(float) GroupFMax 25 ExclusiveScan 644 - 646: 16(float) CompositeExtract 643 1 - 647: 16(float) GroupFMax 25 ExclusiveScan 646 - 648: 16(float) CompositeExtract 643 2 - 649: 16(float) GroupFMax 25 ExclusiveScan 648 - 650: 17(fvec3) CompositeConstruct 645 647 649 - 651: 81(ptr) AccessChain 20 80 - Store 651 650 - 652: 22(ptr) AccessChain 20 21 - 653: 6(int) Load 652 - 654: 6(int) GroupIAdd 25 ExclusiveScan 653 - 655: 22(ptr) AccessChain 20 21 - Store 655 654 - 656: 29(ptr) AccessChain 20 28 - 657: 8(ivec2) Load 656 - 658: 7(int) CompositeExtract 657 0 - 659: 7(int) GroupIAdd 25 ExclusiveScan 658 - 660: 7(int) CompositeExtract 657 1 - 661: 7(int) GroupIAdd 25 ExclusiveScan 660 - 662: 8(ivec2) CompositeConstruct 659 661 - 663: 29(ptr) AccessChain 20 28 - Store 663 662 - 664: 39(ptr) AccessChain 20 38 - 665: 10(fvec3) Load 664 - 666: 9(float) CompositeExtract 665 0 - 667: 9(float) GroupFAdd 25 ExclusiveScan 666 - 668: 9(float) CompositeExtract 665 1 - 669: 9(float) GroupFAdd 25 ExclusiveScan 668 - 670: 9(float) CompositeExtract 665 2 - 671: 9(float) GroupFAdd 25 ExclusiveScan 670 - 672: 10(fvec3) CompositeConstruct 667 669 671 - 673: 39(ptr) AccessChain 20 38 - Store 673 672 - 674: 51(ptr) AccessChain 20 50 - 675: 12(fvec4) Load 674 - 676: 11(float) CompositeExtract 675 0 - 677: 11(float) GroupFAdd 25 ExclusiveScan 676 - 678: 11(float) CompositeExtract 675 1 - 679: 11(float) GroupFAdd 25 ExclusiveScan 678 - 680: 11(float) CompositeExtract 675 2 - 681: 11(float) GroupFAdd 25 ExclusiveScan 680 - 682: 11(float) CompositeExtract 675 3 - 683: 11(float) GroupFAdd 25 ExclusiveScan 682 - 684: 12(fvec4) CompositeConstruct 677 679 681 683 - 685: 51(ptr) AccessChain 20 50 - Store 685 684 - 686: 65(ptr) AccessChain 20 64 - 687: 13(int) Load 686 - 688: 13(int) GroupIAdd 25 ExclusiveScan 687 - 689: 65(ptr) AccessChain 20 64 - Store 689 688 - 690: 71(ptr) AccessChain 20 70 - 691: 15(ivec2) Load 690 - 692: 14(int) CompositeExtract 691 0 - 693: 14(int) GroupIAdd 25 ExclusiveScan 692 - 694: 14(int) CompositeExtract 691 1 - 695: 14(int) GroupIAdd 25 ExclusiveScan 694 - 696: 15(ivec2) CompositeConstruct 693 695 - 697: 71(ptr) AccessChain 20 70 - Store 697 696 - 698: 81(ptr) AccessChain 20 80 - 699: 17(fvec3) Load 698 - 700: 16(float) CompositeExtract 699 0 - 701: 16(float) GroupFAdd 25 ExclusiveScan 700 - 702: 16(float) CompositeExtract 699 1 - 703: 16(float) GroupFAdd 25 ExclusiveScan 702 - 704: 16(float) CompositeExtract 699 2 - 705: 16(float) GroupFAdd 25 ExclusiveScan 704 - 706: 17(fvec3) CompositeConstruct 701 703 705 - 707: 81(ptr) AccessChain 20 80 - Store 707 706 - 708: 22(ptr) AccessChain 20 21 - 709: 6(int) Load 708 - 710: 6(int) GroupSMinNonUniformAMD 25 InclusiveScan 709 - 711: 22(ptr) AccessChain 20 21 - Store 711 710 - 712: 29(ptr) AccessChain 20 28 - 713: 8(ivec2) Load 712 - 714: 7(int) CompositeExtract 713 0 - 715: 7(int) GroupUMinNonUniformAMD 25 InclusiveScan 714 - 716: 7(int) CompositeExtract 713 1 - 717: 7(int) GroupUMinNonUniformAMD 25 InclusiveScan 716 - 718: 8(ivec2) CompositeConstruct 715 717 - 719: 29(ptr) AccessChain 20 28 - Store 719 718 - 720: 39(ptr) AccessChain 20 38 - 721: 10(fvec3) Load 720 - 722: 9(float) CompositeExtract 721 0 - 723: 9(float) GroupFMinNonUniformAMD 25 InclusiveScan 722 - 724: 9(float) CompositeExtract 721 1 - 725: 9(float) GroupFMinNonUniformAMD 25 InclusiveScan 724 - 726: 9(float) CompositeExtract 721 2 - 727: 9(float) GroupFMinNonUniformAMD 25 InclusiveScan 726 - 728: 10(fvec3) CompositeConstruct 723 725 727 - 729: 39(ptr) AccessChain 20 38 - Store 729 728 - 730: 51(ptr) AccessChain 20 50 - 731: 12(fvec4) Load 730 - 732: 11(float) CompositeExtract 731 0 - 733: 11(float) GroupFMinNonUniformAMD 25 InclusiveScan 732 - 734: 11(float) CompositeExtract 731 1 - 735: 11(float) GroupFMinNonUniformAMD 25 InclusiveScan 734 - 736: 11(float) CompositeExtract 731 2 - 737: 11(float) GroupFMinNonUniformAMD 25 InclusiveScan 736 - 738: 11(float) CompositeExtract 731 3 - 739: 11(float) GroupFMinNonUniformAMD 25 InclusiveScan 738 - 740: 12(fvec4) CompositeConstruct 733 735 737 739 - 741: 51(ptr) AccessChain 20 50 - Store 741 740 - 742: 65(ptr) AccessChain 20 64 - 743: 13(int) Load 742 - 744: 13(int) GroupSMinNonUniformAMD 25 InclusiveScan 743 - 745: 65(ptr) AccessChain 20 64 - Store 745 744 - 746: 71(ptr) AccessChain 20 70 - 747: 15(ivec2) Load 746 - 748: 14(int) CompositeExtract 747 0 - 749: 14(int) GroupUMinNonUniformAMD 25 InclusiveScan 748 - 750: 14(int) CompositeExtract 747 1 - 751: 14(int) GroupUMinNonUniformAMD 25 InclusiveScan 750 - 752: 15(ivec2) CompositeConstruct 749 751 - 753: 71(ptr) AccessChain 20 70 - Store 753 752 - 754: 81(ptr) AccessChain 20 80 - 755: 17(fvec3) Load 754 - 756: 16(float) CompositeExtract 755 0 - 757: 16(float) GroupFMinNonUniformAMD 25 InclusiveScan 756 - 758: 16(float) CompositeExtract 755 1 - 759: 16(float) GroupFMinNonUniformAMD 25 InclusiveScan 758 - 760: 16(float) CompositeExtract 755 2 - 761: 16(float) GroupFMinNonUniformAMD 25 InclusiveScan 760 - 762: 17(fvec3) CompositeConstruct 757 759 761 - 763: 81(ptr) AccessChain 20 80 - Store 763 762 - 764: 22(ptr) AccessChain 20 21 - 765: 6(int) Load 764 - 766: 6(int) GroupSMaxNonUniformAMD 25 InclusiveScan 765 - 767: 22(ptr) AccessChain 20 21 - Store 767 766 - 768: 29(ptr) AccessChain 20 28 - 769: 8(ivec2) Load 768 - 770: 7(int) CompositeExtract 769 0 - 771: 7(int) GroupUMaxNonUniformAMD 25 InclusiveScan 770 - 772: 7(int) CompositeExtract 769 1 - 773: 7(int) GroupUMaxNonUniformAMD 25 InclusiveScan 772 - 774: 8(ivec2) CompositeConstruct 771 773 - 775: 29(ptr) AccessChain 20 28 - Store 775 774 - 776: 39(ptr) AccessChain 20 38 - 777: 10(fvec3) Load 776 - 778: 9(float) CompositeExtract 777 0 - 779: 9(float) GroupFMaxNonUniformAMD 25 InclusiveScan 778 - 780: 9(float) CompositeExtract 777 1 - 781: 9(float) GroupFMaxNonUniformAMD 25 InclusiveScan 780 - 782: 9(float) CompositeExtract 777 2 - 783: 9(float) GroupFMaxNonUniformAMD 25 InclusiveScan 782 - 784: 10(fvec3) CompositeConstruct 779 781 783 - 785: 39(ptr) AccessChain 20 38 - Store 785 784 - 786: 51(ptr) AccessChain 20 50 - 787: 12(fvec4) Load 786 - 788: 11(float) CompositeExtract 787 0 - 789: 11(float) GroupFMaxNonUniformAMD 25 InclusiveScan 788 - 790: 11(float) CompositeExtract 787 1 - 791: 11(float) GroupFMaxNonUniformAMD 25 InclusiveScan 790 - 792: 11(float) CompositeExtract 787 2 - 793: 11(float) GroupFMaxNonUniformAMD 25 InclusiveScan 792 - 794: 11(float) CompositeExtract 787 3 - 795: 11(float) GroupFMaxNonUniformAMD 25 InclusiveScan 794 - 796: 12(fvec4) CompositeConstruct 789 791 793 795 - 797: 51(ptr) AccessChain 20 50 - Store 797 796 - 798: 65(ptr) AccessChain 20 64 - 799: 13(int) Load 798 - 800: 13(int) GroupSMaxNonUniformAMD 25 InclusiveScan 799 - 801: 65(ptr) AccessChain 20 64 - Store 801 800 - 802: 71(ptr) AccessChain 20 70 - 803: 15(ivec2) Load 802 - 804: 14(int) CompositeExtract 803 0 - 805: 14(int) GroupUMaxNonUniformAMD 25 InclusiveScan 804 - 806: 14(int) CompositeExtract 803 1 - 807: 14(int) GroupUMaxNonUniformAMD 25 InclusiveScan 806 - 808: 15(ivec2) CompositeConstruct 805 807 - 809: 71(ptr) AccessChain 20 70 - Store 809 808 - 810: 81(ptr) AccessChain 20 80 - 811: 17(fvec3) Load 810 - 812: 16(float) CompositeExtract 811 0 - 813: 16(float) GroupFMaxNonUniformAMD 25 InclusiveScan 812 - 814: 16(float) CompositeExtract 811 1 - 815: 16(float) GroupFMaxNonUniformAMD 25 InclusiveScan 814 - 816: 16(float) CompositeExtract 811 2 - 817: 16(float) GroupFMaxNonUniformAMD 25 InclusiveScan 816 - 818: 17(fvec3) CompositeConstruct 813 815 817 - 819: 81(ptr) AccessChain 20 80 - Store 819 818 - 820: 22(ptr) AccessChain 20 21 - 821: 6(int) Load 820 - 822: 6(int) GroupIAddNonUniformAMD 25 InclusiveScan 821 - 823: 22(ptr) AccessChain 20 21 - Store 823 822 - 824: 29(ptr) AccessChain 20 28 - 825: 8(ivec2) Load 824 - 826: 7(int) CompositeExtract 825 0 - 827: 7(int) GroupIAddNonUniformAMD 25 InclusiveScan 826 - 828: 7(int) CompositeExtract 825 1 - 829: 7(int) GroupIAddNonUniformAMD 25 InclusiveScan 828 - 830: 8(ivec2) CompositeConstruct 827 829 - 831: 29(ptr) AccessChain 20 28 - Store 831 830 - 832: 39(ptr) AccessChain 20 38 - 833: 10(fvec3) Load 832 - 834: 9(float) CompositeExtract 833 0 - 835: 9(float) GroupFAddNonUniformAMD 25 InclusiveScan 834 - 836: 9(float) CompositeExtract 833 1 - 837: 9(float) GroupFAddNonUniformAMD 25 InclusiveScan 836 - 838: 9(float) CompositeExtract 833 2 - 839: 9(float) GroupFAddNonUniformAMD 25 InclusiveScan 838 - 840: 10(fvec3) CompositeConstruct 835 837 839 - 841: 39(ptr) AccessChain 20 38 - Store 841 840 - 842: 51(ptr) AccessChain 20 50 - 843: 12(fvec4) Load 842 - 844: 11(float) CompositeExtract 843 0 - 845: 11(float) GroupFAddNonUniformAMD 25 InclusiveScan 844 - 846: 11(float) CompositeExtract 843 1 - 847: 11(float) GroupFAddNonUniformAMD 25 InclusiveScan 846 - 848: 11(float) CompositeExtract 843 2 - 849: 11(float) GroupFAddNonUniformAMD 25 InclusiveScan 848 - 850: 11(float) CompositeExtract 843 3 - 851: 11(float) GroupFAddNonUniformAMD 25 InclusiveScan 850 - 852: 12(fvec4) CompositeConstruct 845 847 849 851 - 853: 51(ptr) AccessChain 20 50 - Store 853 852 - 854: 65(ptr) AccessChain 20 64 - 855: 13(int) Load 854 - 856: 13(int) GroupIAddNonUniformAMD 25 InclusiveScan 855 - 857: 65(ptr) AccessChain 20 64 - Store 857 856 - 858: 71(ptr) AccessChain 20 70 - 859: 15(ivec2) Load 858 - 860: 14(int) CompositeExtract 859 0 - 861: 14(int) GroupIAddNonUniformAMD 25 InclusiveScan 860 - 862: 14(int) CompositeExtract 859 1 - 863: 14(int) GroupIAddNonUniformAMD 25 InclusiveScan 862 - 864: 15(ivec2) CompositeConstruct 861 863 - 865: 71(ptr) AccessChain 20 70 - Store 865 864 - 866: 81(ptr) AccessChain 20 80 - 867: 17(fvec3) Load 866 - 868: 16(float) CompositeExtract 867 0 - 869: 16(float) GroupFAddNonUniformAMD 25 InclusiveScan 868 - 870: 16(float) CompositeExtract 867 1 - 871: 16(float) GroupFAddNonUniformAMD 25 InclusiveScan 870 - 872: 16(float) CompositeExtract 867 2 - 873: 16(float) GroupFAddNonUniformAMD 25 InclusiveScan 872 - 874: 17(fvec3) CompositeConstruct 869 871 873 - 875: 81(ptr) AccessChain 20 80 - Store 875 874 - 876: 22(ptr) AccessChain 20 21 - 877: 6(int) Load 876 - 878: 6(int) GroupSMinNonUniformAMD 25 ExclusiveScan 877 - 879: 22(ptr) AccessChain 20 21 - Store 879 878 - 880: 29(ptr) AccessChain 20 28 - 881: 8(ivec2) Load 880 - 882: 7(int) CompositeExtract 881 0 - 883: 7(int) GroupUMinNonUniformAMD 25 ExclusiveScan 882 - 884: 7(int) CompositeExtract 881 1 - 885: 7(int) GroupUMinNonUniformAMD 25 ExclusiveScan 884 - 886: 8(ivec2) CompositeConstruct 883 885 - 887: 29(ptr) AccessChain 20 28 - Store 887 886 - 888: 39(ptr) AccessChain 20 38 - 889: 10(fvec3) Load 888 - 890: 9(float) CompositeExtract 889 0 - 891: 9(float) GroupFMinNonUniformAMD 25 ExclusiveScan 890 - 892: 9(float) CompositeExtract 889 1 - 893: 9(float) GroupFMinNonUniformAMD 25 ExclusiveScan 892 - 894: 9(float) CompositeExtract 889 2 - 895: 9(float) GroupFMinNonUniformAMD 25 ExclusiveScan 894 - 896: 10(fvec3) CompositeConstruct 891 893 895 - 897: 39(ptr) AccessChain 20 38 - Store 897 896 - 898: 51(ptr) AccessChain 20 50 - 899: 12(fvec4) Load 898 - 900: 11(float) CompositeExtract 899 0 - 901: 11(float) GroupFMinNonUniformAMD 25 ExclusiveScan 900 - 902: 11(float) CompositeExtract 899 1 - 903: 11(float) GroupFMinNonUniformAMD 25 ExclusiveScan 902 - 904: 11(float) CompositeExtract 899 2 - 905: 11(float) GroupFMinNonUniformAMD 25 ExclusiveScan 904 - 906: 11(float) CompositeExtract 899 3 - 907: 11(float) GroupFMinNonUniformAMD 25 ExclusiveScan 906 - 908: 12(fvec4) CompositeConstruct 901 903 905 907 - 909: 51(ptr) AccessChain 20 50 - Store 909 908 - 910: 65(ptr) AccessChain 20 64 - 911: 13(int) Load 910 - 912: 13(int) GroupSMinNonUniformAMD 25 ExclusiveScan 911 - 913: 65(ptr) AccessChain 20 64 - Store 913 912 - 914: 71(ptr) AccessChain 20 70 - 915: 15(ivec2) Load 914 - 916: 14(int) CompositeExtract 915 0 - 917: 14(int) GroupUMinNonUniformAMD 25 ExclusiveScan 916 - 918: 14(int) CompositeExtract 915 1 - 919: 14(int) GroupUMinNonUniformAMD 25 ExclusiveScan 918 - 920: 15(ivec2) CompositeConstruct 917 919 - 921: 71(ptr) AccessChain 20 70 - Store 921 920 - 922: 81(ptr) AccessChain 20 80 - 923: 17(fvec3) Load 922 - 924: 16(float) CompositeExtract 923 0 - 925: 16(float) GroupFMinNonUniformAMD 25 ExclusiveScan 924 - 926: 16(float) CompositeExtract 923 1 - 927: 16(float) GroupFMinNonUniformAMD 25 ExclusiveScan 926 - 928: 16(float) CompositeExtract 923 2 - 929: 16(float) GroupFMinNonUniformAMD 25 ExclusiveScan 928 - 930: 17(fvec3) CompositeConstruct 925 927 929 - 931: 81(ptr) AccessChain 20 80 - Store 931 930 - 932: 22(ptr) AccessChain 20 21 - 933: 6(int) Load 932 - 934: 6(int) GroupSMaxNonUniformAMD 25 ExclusiveScan 933 - 935: 22(ptr) AccessChain 20 21 - Store 935 934 - 936: 29(ptr) AccessChain 20 28 - 937: 8(ivec2) Load 936 - 938: 7(int) CompositeExtract 937 0 - 939: 7(int) GroupUMaxNonUniformAMD 25 ExclusiveScan 938 - 940: 7(int) CompositeExtract 937 1 - 941: 7(int) GroupUMaxNonUniformAMD 25 ExclusiveScan 940 - 942: 8(ivec2) CompositeConstruct 939 941 - 943: 29(ptr) AccessChain 20 28 - Store 943 942 - 944: 39(ptr) AccessChain 20 38 - 945: 10(fvec3) Load 944 - 946: 9(float) CompositeExtract 945 0 - 947: 9(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 946 - 948: 9(float) CompositeExtract 945 1 - 949: 9(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 948 - 950: 9(float) CompositeExtract 945 2 - 951: 9(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 950 - 952: 10(fvec3) CompositeConstruct 947 949 951 - 953: 39(ptr) AccessChain 20 38 - Store 953 952 - 954: 51(ptr) AccessChain 20 50 - 955: 12(fvec4) Load 954 - 956: 11(float) CompositeExtract 955 0 - 957: 11(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 956 - 958: 11(float) CompositeExtract 955 1 - 959: 11(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 958 - 960: 11(float) CompositeExtract 955 2 - 961: 11(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 960 - 962: 11(float) CompositeExtract 955 3 - 963: 11(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 962 - 964: 12(fvec4) CompositeConstruct 957 959 961 963 - 965: 51(ptr) AccessChain 20 50 - Store 965 964 - 966: 65(ptr) AccessChain 20 64 - 967: 13(int) Load 966 - 968: 13(int) GroupSMaxNonUniformAMD 25 ExclusiveScan 967 - 969: 65(ptr) AccessChain 20 64 - Store 969 968 - 970: 71(ptr) AccessChain 20 70 - 971: 15(ivec2) Load 970 - 972: 14(int) CompositeExtract 971 0 - 973: 14(int) GroupUMaxNonUniformAMD 25 ExclusiveScan 972 - 974: 14(int) CompositeExtract 971 1 - 975: 14(int) GroupUMaxNonUniformAMD 25 ExclusiveScan 974 - 976: 15(ivec2) CompositeConstruct 973 975 - 977: 71(ptr) AccessChain 20 70 - Store 977 976 - 978: 81(ptr) AccessChain 20 80 - 979: 17(fvec3) Load 978 - 980: 16(float) CompositeExtract 979 0 - 981: 16(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 980 - 982: 16(float) CompositeExtract 979 1 - 983: 16(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 982 - 984: 16(float) CompositeExtract 979 2 - 985: 16(float) GroupFMaxNonUniformAMD 25 ExclusiveScan 984 - 986: 17(fvec3) CompositeConstruct 981 983 985 - 987: 81(ptr) AccessChain 20 80 - Store 987 986 - 988: 22(ptr) AccessChain 20 21 - 989: 6(int) Load 988 - 990: 6(int) GroupIAddNonUniformAMD 25 ExclusiveScan 989 - 991: 22(ptr) AccessChain 20 21 - Store 991 990 - 992: 29(ptr) AccessChain 20 28 - 993: 8(ivec2) Load 992 - 994: 7(int) CompositeExtract 993 0 - 995: 7(int) GroupIAddNonUniformAMD 25 ExclusiveScan 994 - 996: 7(int) CompositeExtract 993 1 - 997: 7(int) GroupIAddNonUniformAMD 25 ExclusiveScan 996 - 998: 8(ivec2) CompositeConstruct 995 997 - 999: 29(ptr) AccessChain 20 28 - Store 999 998 - 1000: 39(ptr) AccessChain 20 38 - 1001: 10(fvec3) Load 1000 - 1002: 9(float) CompositeExtract 1001 0 - 1003: 9(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1002 - 1004: 9(float) CompositeExtract 1001 1 - 1005: 9(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1004 - 1006: 9(float) CompositeExtract 1001 2 - 1007: 9(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1006 - 1008: 10(fvec3) CompositeConstruct 1003 1005 1007 - 1009: 39(ptr) AccessChain 20 38 - Store 1009 1008 - 1010: 51(ptr) AccessChain 20 50 - 1011: 12(fvec4) Load 1010 - 1012: 11(float) CompositeExtract 1011 0 - 1013: 11(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1012 - 1014: 11(float) CompositeExtract 1011 1 - 1015: 11(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1014 - 1016: 11(float) CompositeExtract 1011 2 - 1017: 11(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1016 - 1018: 11(float) CompositeExtract 1011 3 - 1019: 11(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1018 - 1020: 12(fvec4) CompositeConstruct 1013 1015 1017 1019 - 1021: 51(ptr) AccessChain 20 50 - Store 1021 1020 - 1022: 65(ptr) AccessChain 20 64 - 1023: 13(int) Load 1022 - 1024: 13(int) GroupIAddNonUniformAMD 25 ExclusiveScan 1023 - 1025: 65(ptr) AccessChain 20 64 - Store 1025 1024 - 1026: 71(ptr) AccessChain 20 70 - 1027: 15(ivec2) Load 1026 - 1028: 14(int) CompositeExtract 1027 0 - 1029: 14(int) GroupIAddNonUniformAMD 25 ExclusiveScan 1028 - 1030: 14(int) CompositeExtract 1027 1 - 1031: 14(int) GroupIAddNonUniformAMD 25 ExclusiveScan 1030 - 1032: 15(ivec2) CompositeConstruct 1029 1031 - 1033: 71(ptr) AccessChain 20 70 - Store 1033 1032 - 1034: 81(ptr) AccessChain 20 80 - 1035: 17(fvec3) Load 1034 - 1036: 16(float) CompositeExtract 1035 0 - 1037: 16(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1036 - 1038: 16(float) CompositeExtract 1035 1 - 1039: 16(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1038 - 1040: 16(float) CompositeExtract 1035 2 - 1041: 16(float) GroupFAddNonUniformAMD 25 ExclusiveScan 1040 - 1042: 17(fvec3) CompositeConstruct 1037 1039 1041 - 1043: 81(ptr) AccessChain 20 80 - Store 1043 1042 + 26: 25(ptr) AccessChain 23 24 + 27: 6(int) Load 26 + 29: 6(int) GroupSMin 28 Reduce 27 + 30: 25(ptr) AccessChain 23 24 + Store 30 29 + 33: 32(ptr) AccessChain 23 31 + 34: 8(ivec2) Load 33 + 35: 7(int) CompositeExtract 34 0 + 36: 7(int) GroupUMin 28 Reduce 35 + 37: 7(int) CompositeExtract 34 1 + 38: 7(int) GroupUMin 28 Reduce 37 + 39: 8(ivec2) CompositeConstruct 36 38 + 40: 32(ptr) AccessChain 23 31 + Store 40 39 + 43: 42(ptr) AccessChain 23 41 + 44: 10(fvec3) Load 43 + 45: 9(float) CompositeExtract 44 0 + 46: 9(float) GroupFMin 28 Reduce 45 + 47: 9(float) CompositeExtract 44 1 + 48: 9(float) GroupFMin 28 Reduce 47 + 49: 9(float) CompositeExtract 44 2 + 50: 9(float) GroupFMin 28 Reduce 49 + 51: 10(fvec3) CompositeConstruct 46 48 50 + 52: 42(ptr) AccessChain 23 41 + Store 52 51 + 55: 54(ptr) AccessChain 23 53 + 56: 12(fvec4) Load 55 + 57: 11(float) CompositeExtract 56 0 + 58: 11(float) GroupFMin 28 Reduce 57 + 59: 11(float) CompositeExtract 56 1 + 60: 11(float) GroupFMin 28 Reduce 59 + 61: 11(float) CompositeExtract 56 2 + 62: 11(float) GroupFMin 28 Reduce 61 + 63: 11(float) CompositeExtract 56 3 + 64: 11(float) GroupFMin 28 Reduce 63 + 65: 12(fvec4) CompositeConstruct 58 60 62 64 + 66: 54(ptr) AccessChain 23 53 + Store 66 65 + 69: 68(ptr) AccessChain 23 67 + 70: 13(int) Load 69 + 71: 13(int) GroupSMin 28 Reduce 70 + 72: 68(ptr) AccessChain 23 67 + Store 72 71 + 75: 74(ptr) AccessChain 23 73 + 76: 15(ivec2) Load 75 + 77: 14(int) CompositeExtract 76 0 + 78: 14(int) GroupUMin 28 Reduce 77 + 79: 14(int) CompositeExtract 76 1 + 80: 14(int) GroupUMin 28 Reduce 79 + 81: 15(ivec2) CompositeConstruct 78 80 + 82: 74(ptr) AccessChain 23 73 + Store 82 81 + 85: 84(ptr) AccessChain 23 83 + 86: 17(fvec3) Load 85 + 87: 16(float) CompositeExtract 86 0 + 88: 16(float) GroupFMin 28 Reduce 87 + 89: 16(float) CompositeExtract 86 1 + 90: 16(float) GroupFMin 28 Reduce 89 + 91: 16(float) CompositeExtract 86 2 + 92: 16(float) GroupFMin 28 Reduce 91 + 93: 17(fvec3) CompositeConstruct 88 90 92 + 94: 84(ptr) AccessChain 23 83 + Store 94 93 + 97: 96(ptr) AccessChain 23 95 + 98: 19(ivec4) Load 97 + 99: 18(int) CompositeExtract 98 0 + 100: 18(int) GroupSMin 28 Reduce 99 + 101: 18(int) CompositeExtract 98 1 + 102: 18(int) GroupSMin 28 Reduce 101 + 103: 18(int) CompositeExtract 98 2 + 104: 18(int) GroupSMin 28 Reduce 103 + 105: 18(int) CompositeExtract 98 3 + 106: 18(int) GroupSMin 28 Reduce 105 + 107: 19(ivec4) CompositeConstruct 100 102 104 106 + 108: 96(ptr) AccessChain 23 95 + Store 108 107 + 111: 110(ptr) AccessChain 23 109 + 112: 20(int) Load 111 + 113: 20(int) GroupUMin 28 Reduce 112 + 114: 110(ptr) AccessChain 23 109 + Store 114 113 + 115: 25(ptr) AccessChain 23 24 + 116: 6(int) Load 115 + 117: 6(int) GroupSMax 28 Reduce 116 + 118: 25(ptr) AccessChain 23 24 + Store 118 117 + 119: 32(ptr) AccessChain 23 31 + 120: 8(ivec2) Load 119 + 121: 7(int) CompositeExtract 120 0 + 122: 7(int) GroupUMax 28 Reduce 121 + 123: 7(int) CompositeExtract 120 1 + 124: 7(int) GroupUMax 28 Reduce 123 + 125: 8(ivec2) CompositeConstruct 122 124 + 126: 32(ptr) AccessChain 23 31 + Store 126 125 + 127: 42(ptr) AccessChain 23 41 + 128: 10(fvec3) Load 127 + 129: 9(float) CompositeExtract 128 0 + 130: 9(float) GroupFMax 28 Reduce 129 + 131: 9(float) CompositeExtract 128 1 + 132: 9(float) GroupFMax 28 Reduce 131 + 133: 9(float) CompositeExtract 128 2 + 134: 9(float) GroupFMax 28 Reduce 133 + 135: 10(fvec3) CompositeConstruct 130 132 134 + 136: 42(ptr) AccessChain 23 41 + Store 136 135 + 137: 54(ptr) AccessChain 23 53 + 138: 12(fvec4) Load 137 + 139: 11(float) CompositeExtract 138 0 + 140: 11(float) GroupFMax 28 Reduce 139 + 141: 11(float) CompositeExtract 138 1 + 142: 11(float) GroupFMax 28 Reduce 141 + 143: 11(float) CompositeExtract 138 2 + 144: 11(float) GroupFMax 28 Reduce 143 + 145: 11(float) CompositeExtract 138 3 + 146: 11(float) GroupFMax 28 Reduce 145 + 147: 12(fvec4) CompositeConstruct 140 142 144 146 + 148: 54(ptr) AccessChain 23 53 + Store 148 147 + 149: 68(ptr) AccessChain 23 67 + 150: 13(int) Load 149 + 151: 13(int) GroupSMax 28 Reduce 150 + 152: 68(ptr) AccessChain 23 67 + Store 152 151 + 153: 74(ptr) AccessChain 23 73 + 154: 15(ivec2) Load 153 + 155: 14(int) CompositeExtract 154 0 + 156: 14(int) GroupUMax 28 Reduce 155 + 157: 14(int) CompositeExtract 154 1 + 158: 14(int) GroupUMax 28 Reduce 157 + 159: 15(ivec2) CompositeConstruct 156 158 + 160: 74(ptr) AccessChain 23 73 + Store 160 159 + 161: 84(ptr) AccessChain 23 83 + 162: 17(fvec3) Load 161 + 163: 16(float) CompositeExtract 162 0 + 164: 16(float) GroupFMax 28 Reduce 163 + 165: 16(float) CompositeExtract 162 1 + 166: 16(float) GroupFMax 28 Reduce 165 + 167: 16(float) CompositeExtract 162 2 + 168: 16(float) GroupFMax 28 Reduce 167 + 169: 17(fvec3) CompositeConstruct 164 166 168 + 170: 84(ptr) AccessChain 23 83 + Store 170 169 + 171: 96(ptr) AccessChain 23 95 + 172: 19(ivec4) Load 171 + 173: 18(int) CompositeExtract 172 0 + 174: 18(int) GroupSMax 28 Reduce 173 + 175: 18(int) CompositeExtract 172 1 + 176: 18(int) GroupSMax 28 Reduce 175 + 177: 18(int) CompositeExtract 172 2 + 178: 18(int) GroupSMax 28 Reduce 177 + 179: 18(int) CompositeExtract 172 3 + 180: 18(int) GroupSMax 28 Reduce 179 + 181: 19(ivec4) CompositeConstruct 174 176 178 180 + 182: 96(ptr) AccessChain 23 95 + Store 182 181 + 183: 110(ptr) AccessChain 23 109 + 184: 20(int) Load 183 + 185: 20(int) GroupUMax 28 Reduce 184 + 186: 110(ptr) AccessChain 23 109 + Store 186 185 + 187: 25(ptr) AccessChain 23 24 + 188: 6(int) Load 187 + 189: 6(int) GroupIAdd 28 Reduce 188 + 190: 25(ptr) AccessChain 23 24 + Store 190 189 + 191: 32(ptr) AccessChain 23 31 + 192: 8(ivec2) Load 191 + 193: 7(int) CompositeExtract 192 0 + 194: 7(int) GroupIAdd 28 Reduce 193 + 195: 7(int) CompositeExtract 192 1 + 196: 7(int) GroupIAdd 28 Reduce 195 + 197: 8(ivec2) CompositeConstruct 194 196 + 198: 32(ptr) AccessChain 23 31 + Store 198 197 + 199: 42(ptr) AccessChain 23 41 + 200: 10(fvec3) Load 199 + 201: 9(float) CompositeExtract 200 0 + 202: 9(float) GroupFAdd 28 Reduce 201 + 203: 9(float) CompositeExtract 200 1 + 204: 9(float) GroupFAdd 28 Reduce 203 + 205: 9(float) CompositeExtract 200 2 + 206: 9(float) GroupFAdd 28 Reduce 205 + 207: 10(fvec3) CompositeConstruct 202 204 206 + 208: 42(ptr) AccessChain 23 41 + Store 208 207 + 209: 54(ptr) AccessChain 23 53 + 210: 12(fvec4) Load 209 + 211: 11(float) CompositeExtract 210 0 + 212: 11(float) GroupFAdd 28 Reduce 211 + 213: 11(float) CompositeExtract 210 1 + 214: 11(float) GroupFAdd 28 Reduce 213 + 215: 11(float) CompositeExtract 210 2 + 216: 11(float) GroupFAdd 28 Reduce 215 + 217: 11(float) CompositeExtract 210 3 + 218: 11(float) GroupFAdd 28 Reduce 217 + 219: 12(fvec4) CompositeConstruct 212 214 216 218 + 220: 54(ptr) AccessChain 23 53 + Store 220 219 + 221: 68(ptr) AccessChain 23 67 + 222: 13(int) Load 221 + 223: 13(int) GroupIAdd 28 Reduce 222 + 224: 68(ptr) AccessChain 23 67 + Store 224 223 + 225: 74(ptr) AccessChain 23 73 + 226: 15(ivec2) Load 225 + 227: 14(int) CompositeExtract 226 0 + 228: 14(int) GroupIAdd 28 Reduce 227 + 229: 14(int) CompositeExtract 226 1 + 230: 14(int) GroupIAdd 28 Reduce 229 + 231: 15(ivec2) CompositeConstruct 228 230 + 232: 74(ptr) AccessChain 23 73 + Store 232 231 + 233: 84(ptr) AccessChain 23 83 + 234: 17(fvec3) Load 233 + 235: 16(float) CompositeExtract 234 0 + 236: 16(float) GroupFAdd 28 Reduce 235 + 237: 16(float) CompositeExtract 234 1 + 238: 16(float) GroupFAdd 28 Reduce 237 + 239: 16(float) CompositeExtract 234 2 + 240: 16(float) GroupFAdd 28 Reduce 239 + 241: 17(fvec3) CompositeConstruct 236 238 240 + 242: 84(ptr) AccessChain 23 83 + Store 242 241 + 243: 96(ptr) AccessChain 23 95 + 244: 19(ivec4) Load 243 + 245: 18(int) CompositeExtract 244 0 + 246: 18(int) GroupIAdd 28 Reduce 245 + 247: 18(int) CompositeExtract 244 1 + 248: 18(int) GroupIAdd 28 Reduce 247 + 249: 18(int) CompositeExtract 244 2 + 250: 18(int) GroupIAdd 28 Reduce 249 + 251: 18(int) CompositeExtract 244 3 + 252: 18(int) GroupIAdd 28 Reduce 251 + 253: 19(ivec4) CompositeConstruct 246 248 250 252 + 254: 96(ptr) AccessChain 23 95 + Store 254 253 + 255: 110(ptr) AccessChain 23 109 + 256: 20(int) Load 255 + 257: 20(int) GroupIAdd 28 Reduce 256 + 258: 110(ptr) AccessChain 23 109 + Store 258 257 + 259: 25(ptr) AccessChain 23 24 + 260: 6(int) Load 259 + 261: 6(int) GroupSMinNonUniformAMD 28 Reduce 260 + 262: 25(ptr) AccessChain 23 24 + Store 262 261 + 263: 32(ptr) AccessChain 23 31 + 264: 8(ivec2) Load 263 + 265: 7(int) CompositeExtract 264 0 + 266: 7(int) GroupUMinNonUniformAMD 28 Reduce 265 + 267: 7(int) CompositeExtract 264 1 + 268: 7(int) GroupUMinNonUniformAMD 28 Reduce 267 + 269: 8(ivec2) CompositeConstruct 266 268 + 270: 32(ptr) AccessChain 23 31 + Store 270 269 + 271: 42(ptr) AccessChain 23 41 + 272: 10(fvec3) Load 271 + 273: 9(float) CompositeExtract 272 0 + 274: 9(float) GroupFMinNonUniformAMD 28 Reduce 273 + 275: 9(float) CompositeExtract 272 1 + 276: 9(float) GroupFMinNonUniformAMD 28 Reduce 275 + 277: 9(float) CompositeExtract 272 2 + 278: 9(float) GroupFMinNonUniformAMD 28 Reduce 277 + 279: 10(fvec3) CompositeConstruct 274 276 278 + 280: 42(ptr) AccessChain 23 41 + Store 280 279 + 281: 54(ptr) AccessChain 23 53 + 282: 12(fvec4) Load 281 + 283: 11(float) CompositeExtract 282 0 + 284: 11(float) GroupFMinNonUniformAMD 28 Reduce 283 + 285: 11(float) CompositeExtract 282 1 + 286: 11(float) GroupFMinNonUniformAMD 28 Reduce 285 + 287: 11(float) CompositeExtract 282 2 + 288: 11(float) GroupFMinNonUniformAMD 28 Reduce 287 + 289: 11(float) CompositeExtract 282 3 + 290: 11(float) GroupFMinNonUniformAMD 28 Reduce 289 + 291: 12(fvec4) CompositeConstruct 284 286 288 290 + 292: 54(ptr) AccessChain 23 53 + Store 292 291 + 293: 68(ptr) AccessChain 23 67 + 294: 13(int) Load 293 + 295: 13(int) GroupSMinNonUniformAMD 28 Reduce 294 + 296: 68(ptr) AccessChain 23 67 + Store 296 295 + 297: 74(ptr) AccessChain 23 73 + 298: 15(ivec2) Load 297 + 299: 14(int) CompositeExtract 298 0 + 300: 14(int) GroupUMinNonUniformAMD 28 Reduce 299 + 301: 14(int) CompositeExtract 298 1 + 302: 14(int) GroupUMinNonUniformAMD 28 Reduce 301 + 303: 15(ivec2) CompositeConstruct 300 302 + 304: 74(ptr) AccessChain 23 73 + Store 304 303 + 305: 84(ptr) AccessChain 23 83 + 306: 17(fvec3) Load 305 + 307: 16(float) CompositeExtract 306 0 + 308: 16(float) GroupFMinNonUniformAMD 28 Reduce 307 + 309: 16(float) CompositeExtract 306 1 + 310: 16(float) GroupFMinNonUniformAMD 28 Reduce 309 + 311: 16(float) CompositeExtract 306 2 + 312: 16(float) GroupFMinNonUniformAMD 28 Reduce 311 + 313: 17(fvec3) CompositeConstruct 308 310 312 + 314: 84(ptr) AccessChain 23 83 + Store 314 313 + 315: 96(ptr) AccessChain 23 95 + 316: 19(ivec4) Load 315 + 317: 18(int) CompositeExtract 316 0 + 318: 18(int) GroupSMinNonUniformAMD 28 Reduce 317 + 319: 18(int) CompositeExtract 316 1 + 320: 18(int) GroupSMinNonUniformAMD 28 Reduce 319 + 321: 18(int) CompositeExtract 316 2 + 322: 18(int) GroupSMinNonUniformAMD 28 Reduce 321 + 323: 18(int) CompositeExtract 316 3 + 324: 18(int) GroupSMinNonUniformAMD 28 Reduce 323 + 325: 19(ivec4) CompositeConstruct 318 320 322 324 + 326: 96(ptr) AccessChain 23 95 + Store 326 325 + 327: 110(ptr) AccessChain 23 109 + 328: 20(int) Load 327 + 329: 20(int) GroupUMinNonUniformAMD 28 Reduce 328 + 330: 110(ptr) AccessChain 23 109 + Store 330 329 + 331: 25(ptr) AccessChain 23 24 + 332: 6(int) Load 331 + 333: 6(int) GroupSMaxNonUniformAMD 28 Reduce 332 + 334: 25(ptr) AccessChain 23 24 + Store 334 333 + 335: 32(ptr) AccessChain 23 31 + 336: 8(ivec2) Load 335 + 337: 7(int) CompositeExtract 336 0 + 338: 7(int) GroupUMaxNonUniformAMD 28 Reduce 337 + 339: 7(int) CompositeExtract 336 1 + 340: 7(int) GroupUMaxNonUniformAMD 28 Reduce 339 + 341: 8(ivec2) CompositeConstruct 338 340 + 342: 32(ptr) AccessChain 23 31 + Store 342 341 + 343: 42(ptr) AccessChain 23 41 + 344: 10(fvec3) Load 343 + 345: 9(float) CompositeExtract 344 0 + 346: 9(float) GroupFMaxNonUniformAMD 28 Reduce 345 + 347: 9(float) CompositeExtract 344 1 + 348: 9(float) GroupFMaxNonUniformAMD 28 Reduce 347 + 349: 9(float) CompositeExtract 344 2 + 350: 9(float) GroupFMaxNonUniformAMD 28 Reduce 349 + 351: 10(fvec3) CompositeConstruct 346 348 350 + 352: 42(ptr) AccessChain 23 41 + Store 352 351 + 353: 54(ptr) AccessChain 23 53 + 354: 12(fvec4) Load 353 + 355: 11(float) CompositeExtract 354 0 + 356: 11(float) GroupFMaxNonUniformAMD 28 Reduce 355 + 357: 11(float) CompositeExtract 354 1 + 358: 11(float) GroupFMaxNonUniformAMD 28 Reduce 357 + 359: 11(float) CompositeExtract 354 2 + 360: 11(float) GroupFMaxNonUniformAMD 28 Reduce 359 + 361: 11(float) CompositeExtract 354 3 + 362: 11(float) GroupFMaxNonUniformAMD 28 Reduce 361 + 363: 12(fvec4) CompositeConstruct 356 358 360 362 + 364: 54(ptr) AccessChain 23 53 + Store 364 363 + 365: 68(ptr) AccessChain 23 67 + 366: 13(int) Load 365 + 367: 13(int) GroupSMaxNonUniformAMD 28 Reduce 366 + 368: 68(ptr) AccessChain 23 67 + Store 368 367 + 369: 74(ptr) AccessChain 23 73 + 370: 15(ivec2) Load 369 + 371: 14(int) CompositeExtract 370 0 + 372: 14(int) GroupUMaxNonUniformAMD 28 Reduce 371 + 373: 14(int) CompositeExtract 370 1 + 374: 14(int) GroupUMaxNonUniformAMD 28 Reduce 373 + 375: 15(ivec2) CompositeConstruct 372 374 + 376: 74(ptr) AccessChain 23 73 + Store 376 375 + 377: 84(ptr) AccessChain 23 83 + 378: 17(fvec3) Load 377 + 379: 16(float) CompositeExtract 378 0 + 380: 16(float) GroupFMaxNonUniformAMD 28 Reduce 379 + 381: 16(float) CompositeExtract 378 1 + 382: 16(float) GroupFMaxNonUniformAMD 28 Reduce 381 + 383: 16(float) CompositeExtract 378 2 + 384: 16(float) GroupFMaxNonUniformAMD 28 Reduce 383 + 385: 17(fvec3) CompositeConstruct 380 382 384 + 386: 84(ptr) AccessChain 23 83 + Store 386 385 + 387: 96(ptr) AccessChain 23 95 + 388: 19(ivec4) Load 387 + 389: 18(int) CompositeExtract 388 0 + 390: 18(int) GroupSMaxNonUniformAMD 28 Reduce 389 + 391: 18(int) CompositeExtract 388 1 + 392: 18(int) GroupSMaxNonUniformAMD 28 Reduce 391 + 393: 18(int) CompositeExtract 388 2 + 394: 18(int) GroupSMaxNonUniformAMD 28 Reduce 393 + 395: 18(int) CompositeExtract 388 3 + 396: 18(int) GroupSMaxNonUniformAMD 28 Reduce 395 + 397: 19(ivec4) CompositeConstruct 390 392 394 396 + 398: 96(ptr) AccessChain 23 95 + Store 398 397 + 399: 110(ptr) AccessChain 23 109 + 400: 20(int) Load 399 + 401: 20(int) GroupUMaxNonUniformAMD 28 Reduce 400 + 402: 110(ptr) AccessChain 23 109 + Store 402 401 + 403: 25(ptr) AccessChain 23 24 + 404: 6(int) Load 403 + 405: 6(int) GroupIAddNonUniformAMD 28 Reduce 404 + 406: 25(ptr) AccessChain 23 24 + Store 406 405 + 407: 32(ptr) AccessChain 23 31 + 408: 8(ivec2) Load 407 + 409: 7(int) CompositeExtract 408 0 + 410: 7(int) GroupIAddNonUniformAMD 28 Reduce 409 + 411: 7(int) CompositeExtract 408 1 + 412: 7(int) GroupIAddNonUniformAMD 28 Reduce 411 + 413: 8(ivec2) CompositeConstruct 410 412 + 414: 32(ptr) AccessChain 23 31 + Store 414 413 + 415: 42(ptr) AccessChain 23 41 + 416: 10(fvec3) Load 415 + 417: 9(float) CompositeExtract 416 0 + 418: 9(float) GroupFAddNonUniformAMD 28 Reduce 417 + 419: 9(float) CompositeExtract 416 1 + 420: 9(float) GroupFAddNonUniformAMD 28 Reduce 419 + 421: 9(float) CompositeExtract 416 2 + 422: 9(float) GroupFAddNonUniformAMD 28 Reduce 421 + 423: 10(fvec3) CompositeConstruct 418 420 422 + 424: 42(ptr) AccessChain 23 41 + Store 424 423 + 425: 54(ptr) AccessChain 23 53 + 426: 12(fvec4) Load 425 + 427: 11(float) CompositeExtract 426 0 + 428: 11(float) GroupFAddNonUniformAMD 28 Reduce 427 + 429: 11(float) CompositeExtract 426 1 + 430: 11(float) GroupFAddNonUniformAMD 28 Reduce 429 + 431: 11(float) CompositeExtract 426 2 + 432: 11(float) GroupFAddNonUniformAMD 28 Reduce 431 + 433: 11(float) CompositeExtract 426 3 + 434: 11(float) GroupFAddNonUniformAMD 28 Reduce 433 + 435: 12(fvec4) CompositeConstruct 428 430 432 434 + 436: 54(ptr) AccessChain 23 53 + Store 436 435 + 437: 68(ptr) AccessChain 23 67 + 438: 13(int) Load 437 + 439: 13(int) GroupIAddNonUniformAMD 28 Reduce 438 + 440: 68(ptr) AccessChain 23 67 + Store 440 439 + 441: 74(ptr) AccessChain 23 73 + 442: 15(ivec2) Load 441 + 443: 14(int) CompositeExtract 442 0 + 444: 14(int) GroupIAddNonUniformAMD 28 Reduce 443 + 445: 14(int) CompositeExtract 442 1 + 446: 14(int) GroupIAddNonUniformAMD 28 Reduce 445 + 447: 15(ivec2) CompositeConstruct 444 446 + 448: 74(ptr) AccessChain 23 73 + Store 448 447 + 449: 84(ptr) AccessChain 23 83 + 450: 17(fvec3) Load 449 + 451: 16(float) CompositeExtract 450 0 + 452: 16(float) GroupFAddNonUniformAMD 28 Reduce 451 + 453: 16(float) CompositeExtract 450 1 + 454: 16(float) GroupFAddNonUniformAMD 28 Reduce 453 + 455: 16(float) CompositeExtract 450 2 + 456: 16(float) GroupFAddNonUniformAMD 28 Reduce 455 + 457: 17(fvec3) CompositeConstruct 452 454 456 + 458: 84(ptr) AccessChain 23 83 + Store 458 457 + 459: 96(ptr) AccessChain 23 95 + 460: 19(ivec4) Load 459 + 461: 18(int) CompositeExtract 460 0 + 462: 18(int) GroupIAddNonUniformAMD 28 Reduce 461 + 463: 18(int) CompositeExtract 460 1 + 464: 18(int) GroupIAddNonUniformAMD 28 Reduce 463 + 465: 18(int) CompositeExtract 460 2 + 466: 18(int) GroupIAddNonUniformAMD 28 Reduce 465 + 467: 18(int) CompositeExtract 460 3 + 468: 18(int) GroupIAddNonUniformAMD 28 Reduce 467 + 469: 19(ivec4) CompositeConstruct 462 464 466 468 + 470: 96(ptr) AccessChain 23 95 + Store 470 469 + 471: 110(ptr) AccessChain 23 109 + 472: 20(int) Load 471 + 473: 20(int) GroupIAddNonUniformAMD 28 Reduce 472 + 474: 110(ptr) AccessChain 23 109 + Store 474 473 + 475: 25(ptr) AccessChain 23 24 + 476: 6(int) Load 475 + 477: 6(int) GroupSMin 28 InclusiveScan 476 + 478: 25(ptr) AccessChain 23 24 + Store 478 477 + 479: 32(ptr) AccessChain 23 31 + 480: 8(ivec2) Load 479 + 481: 7(int) CompositeExtract 480 0 + 482: 7(int) GroupUMin 28 InclusiveScan 481 + 483: 7(int) CompositeExtract 480 1 + 484: 7(int) GroupUMin 28 InclusiveScan 483 + 485: 8(ivec2) CompositeConstruct 482 484 + 486: 32(ptr) AccessChain 23 31 + Store 486 485 + 487: 42(ptr) AccessChain 23 41 + 488: 10(fvec3) Load 487 + 489: 9(float) CompositeExtract 488 0 + 490: 9(float) GroupFMin 28 InclusiveScan 489 + 491: 9(float) CompositeExtract 488 1 + 492: 9(float) GroupFMin 28 InclusiveScan 491 + 493: 9(float) CompositeExtract 488 2 + 494: 9(float) GroupFMin 28 InclusiveScan 493 + 495: 10(fvec3) CompositeConstruct 490 492 494 + 496: 42(ptr) AccessChain 23 41 + Store 496 495 + 497: 54(ptr) AccessChain 23 53 + 498: 12(fvec4) Load 497 + 499: 11(float) CompositeExtract 498 0 + 500: 11(float) GroupFMin 28 InclusiveScan 499 + 501: 11(float) CompositeExtract 498 1 + 502: 11(float) GroupFMin 28 InclusiveScan 501 + 503: 11(float) CompositeExtract 498 2 + 504: 11(float) GroupFMin 28 InclusiveScan 503 + 505: 11(float) CompositeExtract 498 3 + 506: 11(float) GroupFMin 28 InclusiveScan 505 + 507: 12(fvec4) CompositeConstruct 500 502 504 506 + 508: 54(ptr) AccessChain 23 53 + Store 508 507 + 509: 68(ptr) AccessChain 23 67 + 510: 13(int) Load 509 + 511: 13(int) GroupSMin 28 InclusiveScan 510 + 512: 68(ptr) AccessChain 23 67 + Store 512 511 + 513: 74(ptr) AccessChain 23 73 + 514: 15(ivec2) Load 513 + 515: 14(int) CompositeExtract 514 0 + 516: 14(int) GroupUMin 28 InclusiveScan 515 + 517: 14(int) CompositeExtract 514 1 + 518: 14(int) GroupUMin 28 InclusiveScan 517 + 519: 15(ivec2) CompositeConstruct 516 518 + 520: 74(ptr) AccessChain 23 73 + Store 520 519 + 521: 84(ptr) AccessChain 23 83 + 522: 17(fvec3) Load 521 + 523: 16(float) CompositeExtract 522 0 + 524: 16(float) GroupFMin 28 InclusiveScan 523 + 525: 16(float) CompositeExtract 522 1 + 526: 16(float) GroupFMin 28 InclusiveScan 525 + 527: 16(float) CompositeExtract 522 2 + 528: 16(float) GroupFMin 28 InclusiveScan 527 + 529: 17(fvec3) CompositeConstruct 524 526 528 + 530: 84(ptr) AccessChain 23 83 + Store 530 529 + 531: 96(ptr) AccessChain 23 95 + 532: 19(ivec4) Load 531 + 533: 18(int) CompositeExtract 532 0 + 534: 18(int) GroupSMin 28 InclusiveScan 533 + 535: 18(int) CompositeExtract 532 1 + 536: 18(int) GroupSMin 28 InclusiveScan 535 + 537: 18(int) CompositeExtract 532 2 + 538: 18(int) GroupSMin 28 InclusiveScan 537 + 539: 18(int) CompositeExtract 532 3 + 540: 18(int) GroupSMin 28 InclusiveScan 539 + 541: 19(ivec4) CompositeConstruct 534 536 538 540 + 542: 96(ptr) AccessChain 23 95 + Store 542 541 + 543: 110(ptr) AccessChain 23 109 + 544: 20(int) Load 543 + 545: 20(int) GroupUMin 28 InclusiveScan 544 + 546: 110(ptr) AccessChain 23 109 + Store 546 545 + 547: 25(ptr) AccessChain 23 24 + 548: 6(int) Load 547 + 549: 6(int) GroupSMax 28 InclusiveScan 548 + 550: 25(ptr) AccessChain 23 24 + Store 550 549 + 551: 32(ptr) AccessChain 23 31 + 552: 8(ivec2) Load 551 + 553: 7(int) CompositeExtract 552 0 + 554: 7(int) GroupUMax 28 InclusiveScan 553 + 555: 7(int) CompositeExtract 552 1 + 556: 7(int) GroupUMax 28 InclusiveScan 555 + 557: 8(ivec2) CompositeConstruct 554 556 + 558: 32(ptr) AccessChain 23 31 + Store 558 557 + 559: 42(ptr) AccessChain 23 41 + 560: 10(fvec3) Load 559 + 561: 9(float) CompositeExtract 560 0 + 562: 9(float) GroupFMax 28 InclusiveScan 561 + 563: 9(float) CompositeExtract 560 1 + 564: 9(float) GroupFMax 28 InclusiveScan 563 + 565: 9(float) CompositeExtract 560 2 + 566: 9(float) GroupFMax 28 InclusiveScan 565 + 567: 10(fvec3) CompositeConstruct 562 564 566 + 568: 42(ptr) AccessChain 23 41 + Store 568 567 + 569: 54(ptr) AccessChain 23 53 + 570: 12(fvec4) Load 569 + 571: 11(float) CompositeExtract 570 0 + 572: 11(float) GroupFMax 28 InclusiveScan 571 + 573: 11(float) CompositeExtract 570 1 + 574: 11(float) GroupFMax 28 InclusiveScan 573 + 575: 11(float) CompositeExtract 570 2 + 576: 11(float) GroupFMax 28 InclusiveScan 575 + 577: 11(float) CompositeExtract 570 3 + 578: 11(float) GroupFMax 28 InclusiveScan 577 + 579: 12(fvec4) CompositeConstruct 572 574 576 578 + 580: 54(ptr) AccessChain 23 53 + Store 580 579 + 581: 68(ptr) AccessChain 23 67 + 582: 13(int) Load 581 + 583: 13(int) GroupSMax 28 InclusiveScan 582 + 584: 68(ptr) AccessChain 23 67 + Store 584 583 + 585: 74(ptr) AccessChain 23 73 + 586: 15(ivec2) Load 585 + 587: 14(int) CompositeExtract 586 0 + 588: 14(int) GroupUMax 28 InclusiveScan 587 + 589: 14(int) CompositeExtract 586 1 + 590: 14(int) GroupUMax 28 InclusiveScan 589 + 591: 15(ivec2) CompositeConstruct 588 590 + 592: 74(ptr) AccessChain 23 73 + Store 592 591 + 593: 84(ptr) AccessChain 23 83 + 594: 17(fvec3) Load 593 + 595: 16(float) CompositeExtract 594 0 + 596: 16(float) GroupFMax 28 InclusiveScan 595 + 597: 16(float) CompositeExtract 594 1 + 598: 16(float) GroupFMax 28 InclusiveScan 597 + 599: 16(float) CompositeExtract 594 2 + 600: 16(float) GroupFMax 28 InclusiveScan 599 + 601: 17(fvec3) CompositeConstruct 596 598 600 + 602: 84(ptr) AccessChain 23 83 + Store 602 601 + 603: 96(ptr) AccessChain 23 95 + 604: 19(ivec4) Load 603 + 605: 18(int) CompositeExtract 604 0 + 606: 18(int) GroupSMax 28 InclusiveScan 605 + 607: 18(int) CompositeExtract 604 1 + 608: 18(int) GroupSMax 28 InclusiveScan 607 + 609: 18(int) CompositeExtract 604 2 + 610: 18(int) GroupSMax 28 InclusiveScan 609 + 611: 18(int) CompositeExtract 604 3 + 612: 18(int) GroupSMax 28 InclusiveScan 611 + 613: 19(ivec4) CompositeConstruct 606 608 610 612 + 614: 96(ptr) AccessChain 23 95 + Store 614 613 + 615: 110(ptr) AccessChain 23 109 + 616: 20(int) Load 615 + 617: 20(int) GroupUMax 28 InclusiveScan 616 + 618: 110(ptr) AccessChain 23 109 + Store 618 617 + 619: 25(ptr) AccessChain 23 24 + 620: 6(int) Load 619 + 621: 6(int) GroupIAdd 28 InclusiveScan 620 + 622: 25(ptr) AccessChain 23 24 + Store 622 621 + 623: 32(ptr) AccessChain 23 31 + 624: 8(ivec2) Load 623 + 625: 7(int) CompositeExtract 624 0 + 626: 7(int) GroupIAdd 28 InclusiveScan 625 + 627: 7(int) CompositeExtract 624 1 + 628: 7(int) GroupIAdd 28 InclusiveScan 627 + 629: 8(ivec2) CompositeConstruct 626 628 + 630: 32(ptr) AccessChain 23 31 + Store 630 629 + 631: 42(ptr) AccessChain 23 41 + 632: 10(fvec3) Load 631 + 633: 9(float) CompositeExtract 632 0 + 634: 9(float) GroupFAdd 28 InclusiveScan 633 + 635: 9(float) CompositeExtract 632 1 + 636: 9(float) GroupFAdd 28 InclusiveScan 635 + 637: 9(float) CompositeExtract 632 2 + 638: 9(float) GroupFAdd 28 InclusiveScan 637 + 639: 10(fvec3) CompositeConstruct 634 636 638 + 640: 42(ptr) AccessChain 23 41 + Store 640 639 + 641: 54(ptr) AccessChain 23 53 + 642: 12(fvec4) Load 641 + 643: 11(float) CompositeExtract 642 0 + 644: 11(float) GroupFAdd 28 InclusiveScan 643 + 645: 11(float) CompositeExtract 642 1 + 646: 11(float) GroupFAdd 28 InclusiveScan 645 + 647: 11(float) CompositeExtract 642 2 + 648: 11(float) GroupFAdd 28 InclusiveScan 647 + 649: 11(float) CompositeExtract 642 3 + 650: 11(float) GroupFAdd 28 InclusiveScan 649 + 651: 12(fvec4) CompositeConstruct 644 646 648 650 + 652: 54(ptr) AccessChain 23 53 + Store 652 651 + 653: 68(ptr) AccessChain 23 67 + 654: 13(int) Load 653 + 655: 13(int) GroupIAdd 28 InclusiveScan 654 + 656: 68(ptr) AccessChain 23 67 + Store 656 655 + 657: 74(ptr) AccessChain 23 73 + 658: 15(ivec2) Load 657 + 659: 14(int) CompositeExtract 658 0 + 660: 14(int) GroupIAdd 28 InclusiveScan 659 + 661: 14(int) CompositeExtract 658 1 + 662: 14(int) GroupIAdd 28 InclusiveScan 661 + 663: 15(ivec2) CompositeConstruct 660 662 + 664: 74(ptr) AccessChain 23 73 + Store 664 663 + 665: 84(ptr) AccessChain 23 83 + 666: 17(fvec3) Load 665 + 667: 16(float) CompositeExtract 666 0 + 668: 16(float) GroupFAdd 28 InclusiveScan 667 + 669: 16(float) CompositeExtract 666 1 + 670: 16(float) GroupFAdd 28 InclusiveScan 669 + 671: 16(float) CompositeExtract 666 2 + 672: 16(float) GroupFAdd 28 InclusiveScan 671 + 673: 17(fvec3) CompositeConstruct 668 670 672 + 674: 84(ptr) AccessChain 23 83 + Store 674 673 + 675: 96(ptr) AccessChain 23 95 + 676: 19(ivec4) Load 675 + 677: 18(int) CompositeExtract 676 0 + 678: 18(int) GroupIAdd 28 InclusiveScan 677 + 679: 18(int) CompositeExtract 676 1 + 680: 18(int) GroupIAdd 28 InclusiveScan 679 + 681: 18(int) CompositeExtract 676 2 + 682: 18(int) GroupIAdd 28 InclusiveScan 681 + 683: 18(int) CompositeExtract 676 3 + 684: 18(int) GroupIAdd 28 InclusiveScan 683 + 685: 19(ivec4) CompositeConstruct 678 680 682 684 + 686: 96(ptr) AccessChain 23 95 + Store 686 685 + 687: 110(ptr) AccessChain 23 109 + 688: 20(int) Load 687 + 689: 20(int) GroupIAdd 28 InclusiveScan 688 + 690: 110(ptr) AccessChain 23 109 + Store 690 689 + 691: 25(ptr) AccessChain 23 24 + 692: 6(int) Load 691 + 693: 6(int) GroupSMin 28 ExclusiveScan 692 + 694: 25(ptr) AccessChain 23 24 + Store 694 693 + 695: 32(ptr) AccessChain 23 31 + 696: 8(ivec2) Load 695 + 697: 7(int) CompositeExtract 696 0 + 698: 7(int) GroupUMin 28 ExclusiveScan 697 + 699: 7(int) CompositeExtract 696 1 + 700: 7(int) GroupUMin 28 ExclusiveScan 699 + 701: 8(ivec2) CompositeConstruct 698 700 + 702: 32(ptr) AccessChain 23 31 + Store 702 701 + 703: 42(ptr) AccessChain 23 41 + 704: 10(fvec3) Load 703 + 705: 9(float) CompositeExtract 704 0 + 706: 9(float) GroupFMin 28 ExclusiveScan 705 + 707: 9(float) CompositeExtract 704 1 + 708: 9(float) GroupFMin 28 ExclusiveScan 707 + 709: 9(float) CompositeExtract 704 2 + 710: 9(float) GroupFMin 28 ExclusiveScan 709 + 711: 10(fvec3) CompositeConstruct 706 708 710 + 712: 42(ptr) AccessChain 23 41 + Store 712 711 + 713: 54(ptr) AccessChain 23 53 + 714: 12(fvec4) Load 713 + 715: 11(float) CompositeExtract 714 0 + 716: 11(float) GroupFMin 28 ExclusiveScan 715 + 717: 11(float) CompositeExtract 714 1 + 718: 11(float) GroupFMin 28 ExclusiveScan 717 + 719: 11(float) CompositeExtract 714 2 + 720: 11(float) GroupFMin 28 ExclusiveScan 719 + 721: 11(float) CompositeExtract 714 3 + 722: 11(float) GroupFMin 28 ExclusiveScan 721 + 723: 12(fvec4) CompositeConstruct 716 718 720 722 + 724: 54(ptr) AccessChain 23 53 + Store 724 723 + 725: 68(ptr) AccessChain 23 67 + 726: 13(int) Load 725 + 727: 13(int) GroupSMin 28 ExclusiveScan 726 + 728: 68(ptr) AccessChain 23 67 + Store 728 727 + 729: 74(ptr) AccessChain 23 73 + 730: 15(ivec2) Load 729 + 731: 14(int) CompositeExtract 730 0 + 732: 14(int) GroupUMin 28 ExclusiveScan 731 + 733: 14(int) CompositeExtract 730 1 + 734: 14(int) GroupUMin 28 ExclusiveScan 733 + 735: 15(ivec2) CompositeConstruct 732 734 + 736: 74(ptr) AccessChain 23 73 + Store 736 735 + 737: 84(ptr) AccessChain 23 83 + 738: 17(fvec3) Load 737 + 739: 16(float) CompositeExtract 738 0 + 740: 16(float) GroupFMin 28 ExclusiveScan 739 + 741: 16(float) CompositeExtract 738 1 + 742: 16(float) GroupFMin 28 ExclusiveScan 741 + 743: 16(float) CompositeExtract 738 2 + 744: 16(float) GroupFMin 28 ExclusiveScan 743 + 745: 17(fvec3) CompositeConstruct 740 742 744 + 746: 84(ptr) AccessChain 23 83 + Store 746 745 + 747: 96(ptr) AccessChain 23 95 + 748: 19(ivec4) Load 747 + 749: 18(int) CompositeExtract 748 0 + 750: 18(int) GroupSMin 28 ExclusiveScan 749 + 751: 18(int) CompositeExtract 748 1 + 752: 18(int) GroupSMin 28 ExclusiveScan 751 + 753: 18(int) CompositeExtract 748 2 + 754: 18(int) GroupSMin 28 ExclusiveScan 753 + 755: 18(int) CompositeExtract 748 3 + 756: 18(int) GroupSMin 28 ExclusiveScan 755 + 757: 19(ivec4) CompositeConstruct 750 752 754 756 + 758: 96(ptr) AccessChain 23 95 + Store 758 757 + 759: 110(ptr) AccessChain 23 109 + 760: 20(int) Load 759 + 761: 20(int) GroupUMin 28 ExclusiveScan 760 + 762: 110(ptr) AccessChain 23 109 + Store 762 761 + 763: 25(ptr) AccessChain 23 24 + 764: 6(int) Load 763 + 765: 6(int) GroupSMax 28 ExclusiveScan 764 + 766: 25(ptr) AccessChain 23 24 + Store 766 765 + 767: 32(ptr) AccessChain 23 31 + 768: 8(ivec2) Load 767 + 769: 7(int) CompositeExtract 768 0 + 770: 7(int) GroupUMax 28 ExclusiveScan 769 + 771: 7(int) CompositeExtract 768 1 + 772: 7(int) GroupUMax 28 ExclusiveScan 771 + 773: 8(ivec2) CompositeConstruct 770 772 + 774: 32(ptr) AccessChain 23 31 + Store 774 773 + 775: 42(ptr) AccessChain 23 41 + 776: 10(fvec3) Load 775 + 777: 9(float) CompositeExtract 776 0 + 778: 9(float) GroupFMax 28 ExclusiveScan 777 + 779: 9(float) CompositeExtract 776 1 + 780: 9(float) GroupFMax 28 ExclusiveScan 779 + 781: 9(float) CompositeExtract 776 2 + 782: 9(float) GroupFMax 28 ExclusiveScan 781 + 783: 10(fvec3) CompositeConstruct 778 780 782 + 784: 42(ptr) AccessChain 23 41 + Store 784 783 + 785: 54(ptr) AccessChain 23 53 + 786: 12(fvec4) Load 785 + 787: 11(float) CompositeExtract 786 0 + 788: 11(float) GroupFMax 28 ExclusiveScan 787 + 789: 11(float) CompositeExtract 786 1 + 790: 11(float) GroupFMax 28 ExclusiveScan 789 + 791: 11(float) CompositeExtract 786 2 + 792: 11(float) GroupFMax 28 ExclusiveScan 791 + 793: 11(float) CompositeExtract 786 3 + 794: 11(float) GroupFMax 28 ExclusiveScan 793 + 795: 12(fvec4) CompositeConstruct 788 790 792 794 + 796: 54(ptr) AccessChain 23 53 + Store 796 795 + 797: 68(ptr) AccessChain 23 67 + 798: 13(int) Load 797 + 799: 13(int) GroupSMax 28 ExclusiveScan 798 + 800: 68(ptr) AccessChain 23 67 + Store 800 799 + 801: 74(ptr) AccessChain 23 73 + 802: 15(ivec2) Load 801 + 803: 14(int) CompositeExtract 802 0 + 804: 14(int) GroupUMax 28 ExclusiveScan 803 + 805: 14(int) CompositeExtract 802 1 + 806: 14(int) GroupUMax 28 ExclusiveScan 805 + 807: 15(ivec2) CompositeConstruct 804 806 + 808: 74(ptr) AccessChain 23 73 + Store 808 807 + 809: 84(ptr) AccessChain 23 83 + 810: 17(fvec3) Load 809 + 811: 16(float) CompositeExtract 810 0 + 812: 16(float) GroupFMax 28 ExclusiveScan 811 + 813: 16(float) CompositeExtract 810 1 + 814: 16(float) GroupFMax 28 ExclusiveScan 813 + 815: 16(float) CompositeExtract 810 2 + 816: 16(float) GroupFMax 28 ExclusiveScan 815 + 817: 17(fvec3) CompositeConstruct 812 814 816 + 818: 84(ptr) AccessChain 23 83 + Store 818 817 + 819: 96(ptr) AccessChain 23 95 + 820: 19(ivec4) Load 819 + 821: 18(int) CompositeExtract 820 0 + 822: 18(int) GroupSMax 28 ExclusiveScan 821 + 823: 18(int) CompositeExtract 820 1 + 824: 18(int) GroupSMax 28 ExclusiveScan 823 + 825: 18(int) CompositeExtract 820 2 + 826: 18(int) GroupSMax 28 ExclusiveScan 825 + 827: 18(int) CompositeExtract 820 3 + 828: 18(int) GroupSMax 28 ExclusiveScan 827 + 829: 19(ivec4) CompositeConstruct 822 824 826 828 + 830: 96(ptr) AccessChain 23 95 + Store 830 829 + 831: 110(ptr) AccessChain 23 109 + 832: 20(int) Load 831 + 833: 20(int) GroupUMax 28 ExclusiveScan 832 + 834: 110(ptr) AccessChain 23 109 + Store 834 833 + 835: 25(ptr) AccessChain 23 24 + 836: 6(int) Load 835 + 837: 6(int) GroupIAdd 28 ExclusiveScan 836 + 838: 25(ptr) AccessChain 23 24 + Store 838 837 + 839: 32(ptr) AccessChain 23 31 + 840: 8(ivec2) Load 839 + 841: 7(int) CompositeExtract 840 0 + 842: 7(int) GroupIAdd 28 ExclusiveScan 841 + 843: 7(int) CompositeExtract 840 1 + 844: 7(int) GroupIAdd 28 ExclusiveScan 843 + 845: 8(ivec2) CompositeConstruct 842 844 + 846: 32(ptr) AccessChain 23 31 + Store 846 845 + 847: 42(ptr) AccessChain 23 41 + 848: 10(fvec3) Load 847 + 849: 9(float) CompositeExtract 848 0 + 850: 9(float) GroupFAdd 28 ExclusiveScan 849 + 851: 9(float) CompositeExtract 848 1 + 852: 9(float) GroupFAdd 28 ExclusiveScan 851 + 853: 9(float) CompositeExtract 848 2 + 854: 9(float) GroupFAdd 28 ExclusiveScan 853 + 855: 10(fvec3) CompositeConstruct 850 852 854 + 856: 42(ptr) AccessChain 23 41 + Store 856 855 + 857: 54(ptr) AccessChain 23 53 + 858: 12(fvec4) Load 857 + 859: 11(float) CompositeExtract 858 0 + 860: 11(float) GroupFAdd 28 ExclusiveScan 859 + 861: 11(float) CompositeExtract 858 1 + 862: 11(float) GroupFAdd 28 ExclusiveScan 861 + 863: 11(float) CompositeExtract 858 2 + 864: 11(float) GroupFAdd 28 ExclusiveScan 863 + 865: 11(float) CompositeExtract 858 3 + 866: 11(float) GroupFAdd 28 ExclusiveScan 865 + 867: 12(fvec4) CompositeConstruct 860 862 864 866 + 868: 54(ptr) AccessChain 23 53 + Store 868 867 + 869: 68(ptr) AccessChain 23 67 + 870: 13(int) Load 869 + 871: 13(int) GroupIAdd 28 ExclusiveScan 870 + 872: 68(ptr) AccessChain 23 67 + Store 872 871 + 873: 74(ptr) AccessChain 23 73 + 874: 15(ivec2) Load 873 + 875: 14(int) CompositeExtract 874 0 + 876: 14(int) GroupIAdd 28 ExclusiveScan 875 + 877: 14(int) CompositeExtract 874 1 + 878: 14(int) GroupIAdd 28 ExclusiveScan 877 + 879: 15(ivec2) CompositeConstruct 876 878 + 880: 74(ptr) AccessChain 23 73 + Store 880 879 + 881: 84(ptr) AccessChain 23 83 + 882: 17(fvec3) Load 881 + 883: 16(float) CompositeExtract 882 0 + 884: 16(float) GroupFAdd 28 ExclusiveScan 883 + 885: 16(float) CompositeExtract 882 1 + 886: 16(float) GroupFAdd 28 ExclusiveScan 885 + 887: 16(float) CompositeExtract 882 2 + 888: 16(float) GroupFAdd 28 ExclusiveScan 887 + 889: 17(fvec3) CompositeConstruct 884 886 888 + 890: 84(ptr) AccessChain 23 83 + Store 890 889 + 891: 96(ptr) AccessChain 23 95 + 892: 19(ivec4) Load 891 + 893: 18(int) CompositeExtract 892 0 + 894: 18(int) GroupIAdd 28 ExclusiveScan 893 + 895: 18(int) CompositeExtract 892 1 + 896: 18(int) GroupIAdd 28 ExclusiveScan 895 + 897: 18(int) CompositeExtract 892 2 + 898: 18(int) GroupIAdd 28 ExclusiveScan 897 + 899: 18(int) CompositeExtract 892 3 + 900: 18(int) GroupIAdd 28 ExclusiveScan 899 + 901: 19(ivec4) CompositeConstruct 894 896 898 900 + 902: 96(ptr) AccessChain 23 95 + Store 902 901 + 903: 110(ptr) AccessChain 23 109 + 904: 20(int) Load 903 + 905: 20(int) GroupIAdd 28 ExclusiveScan 904 + 906: 110(ptr) AccessChain 23 109 + Store 906 905 + 907: 25(ptr) AccessChain 23 24 + 908: 6(int) Load 907 + 909: 6(int) GroupSMinNonUniformAMD 28 InclusiveScan 908 + 910: 25(ptr) AccessChain 23 24 + Store 910 909 + 911: 32(ptr) AccessChain 23 31 + 912: 8(ivec2) Load 911 + 913: 7(int) CompositeExtract 912 0 + 914: 7(int) GroupUMinNonUniformAMD 28 InclusiveScan 913 + 915: 7(int) CompositeExtract 912 1 + 916: 7(int) GroupUMinNonUniformAMD 28 InclusiveScan 915 + 917: 8(ivec2) CompositeConstruct 914 916 + 918: 32(ptr) AccessChain 23 31 + Store 918 917 + 919: 42(ptr) AccessChain 23 41 + 920: 10(fvec3) Load 919 + 921: 9(float) CompositeExtract 920 0 + 922: 9(float) GroupFMinNonUniformAMD 28 InclusiveScan 921 + 923: 9(float) CompositeExtract 920 1 + 924: 9(float) GroupFMinNonUniformAMD 28 InclusiveScan 923 + 925: 9(float) CompositeExtract 920 2 + 926: 9(float) GroupFMinNonUniformAMD 28 InclusiveScan 925 + 927: 10(fvec3) CompositeConstruct 922 924 926 + 928: 42(ptr) AccessChain 23 41 + Store 928 927 + 929: 54(ptr) AccessChain 23 53 + 930: 12(fvec4) Load 929 + 931: 11(float) CompositeExtract 930 0 + 932: 11(float) GroupFMinNonUniformAMD 28 InclusiveScan 931 + 933: 11(float) CompositeExtract 930 1 + 934: 11(float) GroupFMinNonUniformAMD 28 InclusiveScan 933 + 935: 11(float) CompositeExtract 930 2 + 936: 11(float) GroupFMinNonUniformAMD 28 InclusiveScan 935 + 937: 11(float) CompositeExtract 930 3 + 938: 11(float) GroupFMinNonUniformAMD 28 InclusiveScan 937 + 939: 12(fvec4) CompositeConstruct 932 934 936 938 + 940: 54(ptr) AccessChain 23 53 + Store 940 939 + 941: 68(ptr) AccessChain 23 67 + 942: 13(int) Load 941 + 943: 13(int) GroupSMinNonUniformAMD 28 InclusiveScan 942 + 944: 68(ptr) AccessChain 23 67 + Store 944 943 + 945: 74(ptr) AccessChain 23 73 + 946: 15(ivec2) Load 945 + 947: 14(int) CompositeExtract 946 0 + 948: 14(int) GroupUMinNonUniformAMD 28 InclusiveScan 947 + 949: 14(int) CompositeExtract 946 1 + 950: 14(int) GroupUMinNonUniformAMD 28 InclusiveScan 949 + 951: 15(ivec2) CompositeConstruct 948 950 + 952: 74(ptr) AccessChain 23 73 + Store 952 951 + 953: 84(ptr) AccessChain 23 83 + 954: 17(fvec3) Load 953 + 955: 16(float) CompositeExtract 954 0 + 956: 16(float) GroupFMinNonUniformAMD 28 InclusiveScan 955 + 957: 16(float) CompositeExtract 954 1 + 958: 16(float) GroupFMinNonUniformAMD 28 InclusiveScan 957 + 959: 16(float) CompositeExtract 954 2 + 960: 16(float) GroupFMinNonUniformAMD 28 InclusiveScan 959 + 961: 17(fvec3) CompositeConstruct 956 958 960 + 962: 84(ptr) AccessChain 23 83 + Store 962 961 + 963: 96(ptr) AccessChain 23 95 + 964: 19(ivec4) Load 963 + 965: 18(int) CompositeExtract 964 0 + 966: 18(int) GroupSMinNonUniformAMD 28 InclusiveScan 965 + 967: 18(int) CompositeExtract 964 1 + 968: 18(int) GroupSMinNonUniformAMD 28 InclusiveScan 967 + 969: 18(int) CompositeExtract 964 2 + 970: 18(int) GroupSMinNonUniformAMD 28 InclusiveScan 969 + 971: 18(int) CompositeExtract 964 3 + 972: 18(int) GroupSMinNonUniformAMD 28 InclusiveScan 971 + 973: 19(ivec4) CompositeConstruct 966 968 970 972 + 974: 96(ptr) AccessChain 23 95 + Store 974 973 + 975: 110(ptr) AccessChain 23 109 + 976: 20(int) Load 975 + 977: 20(int) GroupUMinNonUniformAMD 28 InclusiveScan 976 + 978: 110(ptr) AccessChain 23 109 + Store 978 977 + 979: 25(ptr) AccessChain 23 24 + 980: 6(int) Load 979 + 981: 6(int) GroupSMaxNonUniformAMD 28 InclusiveScan 980 + 982: 25(ptr) AccessChain 23 24 + Store 982 981 + 983: 32(ptr) AccessChain 23 31 + 984: 8(ivec2) Load 983 + 985: 7(int) CompositeExtract 984 0 + 986: 7(int) GroupUMaxNonUniformAMD 28 InclusiveScan 985 + 987: 7(int) CompositeExtract 984 1 + 988: 7(int) GroupUMaxNonUniformAMD 28 InclusiveScan 987 + 989: 8(ivec2) CompositeConstruct 986 988 + 990: 32(ptr) AccessChain 23 31 + Store 990 989 + 991: 42(ptr) AccessChain 23 41 + 992: 10(fvec3) Load 991 + 993: 9(float) CompositeExtract 992 0 + 994: 9(float) GroupFMaxNonUniformAMD 28 InclusiveScan 993 + 995: 9(float) CompositeExtract 992 1 + 996: 9(float) GroupFMaxNonUniformAMD 28 InclusiveScan 995 + 997: 9(float) CompositeExtract 992 2 + 998: 9(float) GroupFMaxNonUniformAMD 28 InclusiveScan 997 + 999: 10(fvec3) CompositeConstruct 994 996 998 + 1000: 42(ptr) AccessChain 23 41 + Store 1000 999 + 1001: 54(ptr) AccessChain 23 53 + 1002: 12(fvec4) Load 1001 + 1003: 11(float) CompositeExtract 1002 0 + 1004: 11(float) GroupFMaxNonUniformAMD 28 InclusiveScan 1003 + 1005: 11(float) CompositeExtract 1002 1 + 1006: 11(float) GroupFMaxNonUniformAMD 28 InclusiveScan 1005 + 1007: 11(float) CompositeExtract 1002 2 + 1008: 11(float) GroupFMaxNonUniformAMD 28 InclusiveScan 1007 + 1009: 11(float) CompositeExtract 1002 3 + 1010: 11(float) GroupFMaxNonUniformAMD 28 InclusiveScan 1009 + 1011: 12(fvec4) CompositeConstruct 1004 1006 1008 1010 + 1012: 54(ptr) AccessChain 23 53 + Store 1012 1011 + 1013: 68(ptr) AccessChain 23 67 + 1014: 13(int) Load 1013 + 1015: 13(int) GroupSMaxNonUniformAMD 28 InclusiveScan 1014 + 1016: 68(ptr) AccessChain 23 67 + Store 1016 1015 + 1017: 74(ptr) AccessChain 23 73 + 1018: 15(ivec2) Load 1017 + 1019: 14(int) CompositeExtract 1018 0 + 1020: 14(int) GroupUMaxNonUniformAMD 28 InclusiveScan 1019 + 1021: 14(int) CompositeExtract 1018 1 + 1022: 14(int) GroupUMaxNonUniformAMD 28 InclusiveScan 1021 + 1023: 15(ivec2) CompositeConstruct 1020 1022 + 1024: 74(ptr) AccessChain 23 73 + Store 1024 1023 + 1025: 84(ptr) AccessChain 23 83 + 1026: 17(fvec3) Load 1025 + 1027: 16(float) CompositeExtract 1026 0 + 1028: 16(float) GroupFMaxNonUniformAMD 28 InclusiveScan 1027 + 1029: 16(float) CompositeExtract 1026 1 + 1030: 16(float) GroupFMaxNonUniformAMD 28 InclusiveScan 1029 + 1031: 16(float) CompositeExtract 1026 2 + 1032: 16(float) GroupFMaxNonUniformAMD 28 InclusiveScan 1031 + 1033: 17(fvec3) CompositeConstruct 1028 1030 1032 + 1034: 84(ptr) AccessChain 23 83 + Store 1034 1033 + 1035: 96(ptr) AccessChain 23 95 + 1036: 19(ivec4) Load 1035 + 1037: 18(int) CompositeExtract 1036 0 + 1038: 18(int) GroupSMaxNonUniformAMD 28 InclusiveScan 1037 + 1039: 18(int) CompositeExtract 1036 1 + 1040: 18(int) GroupSMaxNonUniformAMD 28 InclusiveScan 1039 + 1041: 18(int) CompositeExtract 1036 2 + 1042: 18(int) GroupSMaxNonUniformAMD 28 InclusiveScan 1041 + 1043: 18(int) CompositeExtract 1036 3 + 1044: 18(int) GroupSMaxNonUniformAMD 28 InclusiveScan 1043 + 1045: 19(ivec4) CompositeConstruct 1038 1040 1042 1044 + 1046: 96(ptr) AccessChain 23 95 + Store 1046 1045 + 1047: 110(ptr) AccessChain 23 109 + 1048: 20(int) Load 1047 + 1049: 20(int) GroupUMaxNonUniformAMD 28 InclusiveScan 1048 + 1050: 110(ptr) AccessChain 23 109 + Store 1050 1049 + 1051: 25(ptr) AccessChain 23 24 + 1052: 6(int) Load 1051 + 1053: 6(int) GroupIAddNonUniformAMD 28 InclusiveScan 1052 + 1054: 25(ptr) AccessChain 23 24 + Store 1054 1053 + 1055: 32(ptr) AccessChain 23 31 + 1056: 8(ivec2) Load 1055 + 1057: 7(int) CompositeExtract 1056 0 + 1058: 7(int) GroupIAddNonUniformAMD 28 InclusiveScan 1057 + 1059: 7(int) CompositeExtract 1056 1 + 1060: 7(int) GroupIAddNonUniformAMD 28 InclusiveScan 1059 + 1061: 8(ivec2) CompositeConstruct 1058 1060 + 1062: 32(ptr) AccessChain 23 31 + Store 1062 1061 + 1063: 42(ptr) AccessChain 23 41 + 1064: 10(fvec3) Load 1063 + 1065: 9(float) CompositeExtract 1064 0 + 1066: 9(float) GroupFAddNonUniformAMD 28 InclusiveScan 1065 + 1067: 9(float) CompositeExtract 1064 1 + 1068: 9(float) GroupFAddNonUniformAMD 28 InclusiveScan 1067 + 1069: 9(float) CompositeExtract 1064 2 + 1070: 9(float) GroupFAddNonUniformAMD 28 InclusiveScan 1069 + 1071: 10(fvec3) CompositeConstruct 1066 1068 1070 + 1072: 42(ptr) AccessChain 23 41 + Store 1072 1071 + 1073: 54(ptr) AccessChain 23 53 + 1074: 12(fvec4) Load 1073 + 1075: 11(float) CompositeExtract 1074 0 + 1076: 11(float) GroupFAddNonUniformAMD 28 InclusiveScan 1075 + 1077: 11(float) CompositeExtract 1074 1 + 1078: 11(float) GroupFAddNonUniformAMD 28 InclusiveScan 1077 + 1079: 11(float) CompositeExtract 1074 2 + 1080: 11(float) GroupFAddNonUniformAMD 28 InclusiveScan 1079 + 1081: 11(float) CompositeExtract 1074 3 + 1082: 11(float) GroupFAddNonUniformAMD 28 InclusiveScan 1081 + 1083: 12(fvec4) CompositeConstruct 1076 1078 1080 1082 + 1084: 54(ptr) AccessChain 23 53 + Store 1084 1083 + 1085: 68(ptr) AccessChain 23 67 + 1086: 13(int) Load 1085 + 1087: 13(int) GroupIAddNonUniformAMD 28 InclusiveScan 1086 + 1088: 68(ptr) AccessChain 23 67 + Store 1088 1087 + 1089: 74(ptr) AccessChain 23 73 + 1090: 15(ivec2) Load 1089 + 1091: 14(int) CompositeExtract 1090 0 + 1092: 14(int) GroupIAddNonUniformAMD 28 InclusiveScan 1091 + 1093: 14(int) CompositeExtract 1090 1 + 1094: 14(int) GroupIAddNonUniformAMD 28 InclusiveScan 1093 + 1095: 15(ivec2) CompositeConstruct 1092 1094 + 1096: 74(ptr) AccessChain 23 73 + Store 1096 1095 + 1097: 84(ptr) AccessChain 23 83 + 1098: 17(fvec3) Load 1097 + 1099: 16(float) CompositeExtract 1098 0 + 1100: 16(float) GroupFAddNonUniformAMD 28 InclusiveScan 1099 + 1101: 16(float) CompositeExtract 1098 1 + 1102: 16(float) GroupFAddNonUniformAMD 28 InclusiveScan 1101 + 1103: 16(float) CompositeExtract 1098 2 + 1104: 16(float) GroupFAddNonUniformAMD 28 InclusiveScan 1103 + 1105: 17(fvec3) CompositeConstruct 1100 1102 1104 + 1106: 84(ptr) AccessChain 23 83 + Store 1106 1105 + 1107: 96(ptr) AccessChain 23 95 + 1108: 19(ivec4) Load 1107 + 1109: 18(int) CompositeExtract 1108 0 + 1110: 18(int) GroupIAddNonUniformAMD 28 InclusiveScan 1109 + 1111: 18(int) CompositeExtract 1108 1 + 1112: 18(int) GroupIAddNonUniformAMD 28 InclusiveScan 1111 + 1113: 18(int) CompositeExtract 1108 2 + 1114: 18(int) GroupIAddNonUniformAMD 28 InclusiveScan 1113 + 1115: 18(int) CompositeExtract 1108 3 + 1116: 18(int) GroupIAddNonUniformAMD 28 InclusiveScan 1115 + 1117: 19(ivec4) CompositeConstruct 1110 1112 1114 1116 + 1118: 96(ptr) AccessChain 23 95 + Store 1118 1117 + 1119: 110(ptr) AccessChain 23 109 + 1120: 20(int) Load 1119 + 1121: 20(int) GroupIAddNonUniformAMD 28 InclusiveScan 1120 + 1122: 110(ptr) AccessChain 23 109 + Store 1122 1121 + 1123: 25(ptr) AccessChain 23 24 + 1124: 6(int) Load 1123 + 1125: 6(int) GroupSMinNonUniformAMD 28 ExclusiveScan 1124 + 1126: 25(ptr) AccessChain 23 24 + Store 1126 1125 + 1127: 32(ptr) AccessChain 23 31 + 1128: 8(ivec2) Load 1127 + 1129: 7(int) CompositeExtract 1128 0 + 1130: 7(int) GroupUMinNonUniformAMD 28 ExclusiveScan 1129 + 1131: 7(int) CompositeExtract 1128 1 + 1132: 7(int) GroupUMinNonUniformAMD 28 ExclusiveScan 1131 + 1133: 8(ivec2) CompositeConstruct 1130 1132 + 1134: 32(ptr) AccessChain 23 31 + Store 1134 1133 + 1135: 42(ptr) AccessChain 23 41 + 1136: 10(fvec3) Load 1135 + 1137: 9(float) CompositeExtract 1136 0 + 1138: 9(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1137 + 1139: 9(float) CompositeExtract 1136 1 + 1140: 9(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1139 + 1141: 9(float) CompositeExtract 1136 2 + 1142: 9(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1141 + 1143: 10(fvec3) CompositeConstruct 1138 1140 1142 + 1144: 42(ptr) AccessChain 23 41 + Store 1144 1143 + 1145: 54(ptr) AccessChain 23 53 + 1146: 12(fvec4) Load 1145 + 1147: 11(float) CompositeExtract 1146 0 + 1148: 11(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1147 + 1149: 11(float) CompositeExtract 1146 1 + 1150: 11(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1149 + 1151: 11(float) CompositeExtract 1146 2 + 1152: 11(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1151 + 1153: 11(float) CompositeExtract 1146 3 + 1154: 11(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1153 + 1155: 12(fvec4) CompositeConstruct 1148 1150 1152 1154 + 1156: 54(ptr) AccessChain 23 53 + Store 1156 1155 + 1157: 68(ptr) AccessChain 23 67 + 1158: 13(int) Load 1157 + 1159: 13(int) GroupSMinNonUniformAMD 28 ExclusiveScan 1158 + 1160: 68(ptr) AccessChain 23 67 + Store 1160 1159 + 1161: 74(ptr) AccessChain 23 73 + 1162: 15(ivec2) Load 1161 + 1163: 14(int) CompositeExtract 1162 0 + 1164: 14(int) GroupUMinNonUniformAMD 28 ExclusiveScan 1163 + 1165: 14(int) CompositeExtract 1162 1 + 1166: 14(int) GroupUMinNonUniformAMD 28 ExclusiveScan 1165 + 1167: 15(ivec2) CompositeConstruct 1164 1166 + 1168: 74(ptr) AccessChain 23 73 + Store 1168 1167 + 1169: 84(ptr) AccessChain 23 83 + 1170: 17(fvec3) Load 1169 + 1171: 16(float) CompositeExtract 1170 0 + 1172: 16(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1171 + 1173: 16(float) CompositeExtract 1170 1 + 1174: 16(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1173 + 1175: 16(float) CompositeExtract 1170 2 + 1176: 16(float) GroupFMinNonUniformAMD 28 ExclusiveScan 1175 + 1177: 17(fvec3) CompositeConstruct 1172 1174 1176 + 1178: 84(ptr) AccessChain 23 83 + Store 1178 1177 + 1179: 96(ptr) AccessChain 23 95 + 1180: 19(ivec4) Load 1179 + 1181: 18(int) CompositeExtract 1180 0 + 1182: 18(int) GroupSMinNonUniformAMD 28 ExclusiveScan 1181 + 1183: 18(int) CompositeExtract 1180 1 + 1184: 18(int) GroupSMinNonUniformAMD 28 ExclusiveScan 1183 + 1185: 18(int) CompositeExtract 1180 2 + 1186: 18(int) GroupSMinNonUniformAMD 28 ExclusiveScan 1185 + 1187: 18(int) CompositeExtract 1180 3 + 1188: 18(int) GroupSMinNonUniformAMD 28 ExclusiveScan 1187 + 1189: 19(ivec4) CompositeConstruct 1182 1184 1186 1188 + 1190: 96(ptr) AccessChain 23 95 + Store 1190 1189 + 1191: 110(ptr) AccessChain 23 109 + 1192: 20(int) Load 1191 + 1193: 20(int) GroupUMinNonUniformAMD 28 ExclusiveScan 1192 + 1194: 110(ptr) AccessChain 23 109 + Store 1194 1193 + 1195: 25(ptr) AccessChain 23 24 + 1196: 6(int) Load 1195 + 1197: 6(int) GroupSMaxNonUniformAMD 28 ExclusiveScan 1196 + 1198: 25(ptr) AccessChain 23 24 + Store 1198 1197 + 1199: 32(ptr) AccessChain 23 31 + 1200: 8(ivec2) Load 1199 + 1201: 7(int) CompositeExtract 1200 0 + 1202: 7(int) GroupUMaxNonUniformAMD 28 ExclusiveScan 1201 + 1203: 7(int) CompositeExtract 1200 1 + 1204: 7(int) GroupUMaxNonUniformAMD 28 ExclusiveScan 1203 + 1205: 8(ivec2) CompositeConstruct 1202 1204 + 1206: 32(ptr) AccessChain 23 31 + Store 1206 1205 + 1207: 42(ptr) AccessChain 23 41 + 1208: 10(fvec3) Load 1207 + 1209: 9(float) CompositeExtract 1208 0 + 1210: 9(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1209 + 1211: 9(float) CompositeExtract 1208 1 + 1212: 9(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1211 + 1213: 9(float) CompositeExtract 1208 2 + 1214: 9(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1213 + 1215: 10(fvec3) CompositeConstruct 1210 1212 1214 + 1216: 42(ptr) AccessChain 23 41 + Store 1216 1215 + 1217: 54(ptr) AccessChain 23 53 + 1218: 12(fvec4) Load 1217 + 1219: 11(float) CompositeExtract 1218 0 + 1220: 11(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1219 + 1221: 11(float) CompositeExtract 1218 1 + 1222: 11(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1221 + 1223: 11(float) CompositeExtract 1218 2 + 1224: 11(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1223 + 1225: 11(float) CompositeExtract 1218 3 + 1226: 11(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1225 + 1227: 12(fvec4) CompositeConstruct 1220 1222 1224 1226 + 1228: 54(ptr) AccessChain 23 53 + Store 1228 1227 + 1229: 68(ptr) AccessChain 23 67 + 1230: 13(int) Load 1229 + 1231: 13(int) GroupSMaxNonUniformAMD 28 ExclusiveScan 1230 + 1232: 68(ptr) AccessChain 23 67 + Store 1232 1231 + 1233: 74(ptr) AccessChain 23 73 + 1234: 15(ivec2) Load 1233 + 1235: 14(int) CompositeExtract 1234 0 + 1236: 14(int) GroupUMaxNonUniformAMD 28 ExclusiveScan 1235 + 1237: 14(int) CompositeExtract 1234 1 + 1238: 14(int) GroupUMaxNonUniformAMD 28 ExclusiveScan 1237 + 1239: 15(ivec2) CompositeConstruct 1236 1238 + 1240: 74(ptr) AccessChain 23 73 + Store 1240 1239 + 1241: 84(ptr) AccessChain 23 83 + 1242: 17(fvec3) Load 1241 + 1243: 16(float) CompositeExtract 1242 0 + 1244: 16(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1243 + 1245: 16(float) CompositeExtract 1242 1 + 1246: 16(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1245 + 1247: 16(float) CompositeExtract 1242 2 + 1248: 16(float) GroupFMaxNonUniformAMD 28 ExclusiveScan 1247 + 1249: 17(fvec3) CompositeConstruct 1244 1246 1248 + 1250: 84(ptr) AccessChain 23 83 + Store 1250 1249 + 1251: 96(ptr) AccessChain 23 95 + 1252: 19(ivec4) Load 1251 + 1253: 18(int) CompositeExtract 1252 0 + 1254: 18(int) GroupSMaxNonUniformAMD 28 ExclusiveScan 1253 + 1255: 18(int) CompositeExtract 1252 1 + 1256: 18(int) GroupSMaxNonUniformAMD 28 ExclusiveScan 1255 + 1257: 18(int) CompositeExtract 1252 2 + 1258: 18(int) GroupSMaxNonUniformAMD 28 ExclusiveScan 1257 + 1259: 18(int) CompositeExtract 1252 3 + 1260: 18(int) GroupSMaxNonUniformAMD 28 ExclusiveScan 1259 + 1261: 19(ivec4) CompositeConstruct 1254 1256 1258 1260 + 1262: 96(ptr) AccessChain 23 95 + Store 1262 1261 + 1263: 110(ptr) AccessChain 23 109 + 1264: 20(int) Load 1263 + 1265: 20(int) GroupUMaxNonUniformAMD 28 ExclusiveScan 1264 + 1266: 110(ptr) AccessChain 23 109 + Store 1266 1265 + 1267: 25(ptr) AccessChain 23 24 + 1268: 6(int) Load 1267 + 1269: 6(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1268 + 1270: 25(ptr) AccessChain 23 24 + Store 1270 1269 + 1271: 32(ptr) AccessChain 23 31 + 1272: 8(ivec2) Load 1271 + 1273: 7(int) CompositeExtract 1272 0 + 1274: 7(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1273 + 1275: 7(int) CompositeExtract 1272 1 + 1276: 7(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1275 + 1277: 8(ivec2) CompositeConstruct 1274 1276 + 1278: 32(ptr) AccessChain 23 31 + Store 1278 1277 + 1279: 42(ptr) AccessChain 23 41 + 1280: 10(fvec3) Load 1279 + 1281: 9(float) CompositeExtract 1280 0 + 1282: 9(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1281 + 1283: 9(float) CompositeExtract 1280 1 + 1284: 9(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1283 + 1285: 9(float) CompositeExtract 1280 2 + 1286: 9(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1285 + 1287: 10(fvec3) CompositeConstruct 1282 1284 1286 + 1288: 42(ptr) AccessChain 23 41 + Store 1288 1287 + 1289: 54(ptr) AccessChain 23 53 + 1290: 12(fvec4) Load 1289 + 1291: 11(float) CompositeExtract 1290 0 + 1292: 11(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1291 + 1293: 11(float) CompositeExtract 1290 1 + 1294: 11(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1293 + 1295: 11(float) CompositeExtract 1290 2 + 1296: 11(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1295 + 1297: 11(float) CompositeExtract 1290 3 + 1298: 11(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1297 + 1299: 12(fvec4) CompositeConstruct 1292 1294 1296 1298 + 1300: 54(ptr) AccessChain 23 53 + Store 1300 1299 + 1301: 68(ptr) AccessChain 23 67 + 1302: 13(int) Load 1301 + 1303: 13(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1302 + 1304: 68(ptr) AccessChain 23 67 + Store 1304 1303 + 1305: 74(ptr) AccessChain 23 73 + 1306: 15(ivec2) Load 1305 + 1307: 14(int) CompositeExtract 1306 0 + 1308: 14(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1307 + 1309: 14(int) CompositeExtract 1306 1 + 1310: 14(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1309 + 1311: 15(ivec2) CompositeConstruct 1308 1310 + 1312: 74(ptr) AccessChain 23 73 + Store 1312 1311 + 1313: 84(ptr) AccessChain 23 83 + 1314: 17(fvec3) Load 1313 + 1315: 16(float) CompositeExtract 1314 0 + 1316: 16(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1315 + 1317: 16(float) CompositeExtract 1314 1 + 1318: 16(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1317 + 1319: 16(float) CompositeExtract 1314 2 + 1320: 16(float) GroupFAddNonUniformAMD 28 ExclusiveScan 1319 + 1321: 17(fvec3) CompositeConstruct 1316 1318 1320 + 1322: 84(ptr) AccessChain 23 83 + Store 1322 1321 + 1323: 96(ptr) AccessChain 23 95 + 1324: 19(ivec4) Load 1323 + 1325: 18(int) CompositeExtract 1324 0 + 1326: 18(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1325 + 1327: 18(int) CompositeExtract 1324 1 + 1328: 18(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1327 + 1329: 18(int) CompositeExtract 1324 2 + 1330: 18(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1329 + 1331: 18(int) CompositeExtract 1324 3 + 1332: 18(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1331 + 1333: 19(ivec4) CompositeConstruct 1326 1328 1330 1332 + 1334: 96(ptr) AccessChain 23 95 + Store 1334 1333 + 1335: 110(ptr) AccessChain 23 109 + 1336: 20(int) Load 1335 + 1337: 20(int) GroupIAddNonUniformAMD 28 ExclusiveScan 1336 + 1338: 110(ptr) AccessChain 23 109 + Store 1338 1337 Return FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shaderBallot.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shaderBallot.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shaderBallot.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shaderBallot.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.shaderBallot.comp // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 298 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shaderDrawParams.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shaderDrawParams.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shaderDrawParams.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shaderDrawParams.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.shaderDrawParams.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 53 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shaderFragMaskAMD.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shaderFragMaskAMD.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shaderFragMaskAMD.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shaderFragMaskAMD.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.shaderFragMaskAMD.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 80 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shaderGroupVote.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shaderGroupVote.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shaderGroupVote.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shaderGroupVote.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.shaderGroupVote.comp // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 33 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shaderStencilExport.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shaderStencilExport.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shaderStencilExport.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shaderStencilExport.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.shaderStencilExport.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 10 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shiftOps.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shiftOps.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shiftOps.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shiftOps.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.shiftOps.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 38 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shortCircuit.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shortCircuit.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.shortCircuit.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.shortCircuit.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.shortCircuit.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 147 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.simpleFunctionCall.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.simpleFunctionCall.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.simpleFunctionCall.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.simpleFunctionCall.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.simpleFunctionCall.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 19 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.simpleMat.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.simpleMat.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.simpleMat.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.simpleMat.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -2,7 +2,7 @@ WARNING: 0:3: varying deprecated in version 130; may be removed in future release // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 39 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.sparseTextureClamp.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.sparseTextureClamp.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.sparseTextureClamp.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.sparseTextureClamp.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.sparseTextureClamp.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 360 Capability Shader @@ -145,14 +145,14 @@ 310: 157(ivec2) ConstantComposite 143 143 344: TypePointer Output 11(fvec4) 345(outColor): 344(ptr) Variable Output - 348: TypeBool + 347: TypeBool 4(main): 2 Function None 3 5: Label 8(resident): 7(ptr) Variable Function 13(texel): 12(ptr) Variable Function 18(itexel): 17(ptr) Variable Function 23(utexel): 22(ptr) Variable Function - 346: 12(ptr) Variable Function + 349: 12(ptr) Variable Function Store 8(resident) 9 Store 13(texel) 15 Store 18(itexel) 19 @@ -442,13 +442,13 @@ 342: 16(ivec4) Load 18(itexel) 343: 16(ivec4) IAdd 342 341 Store 18(itexel) 343 - 347: 6(int) Load 8(resident) - 349: 348(bool) ImageSparseTexelsResident 347 + 346: 6(int) Load 8(resident) + 348: 347(bool) ImageSparseTexelsResident 346 SelectionMerge 351 None - BranchConditional 349 350 353 + BranchConditional 348 350 353 350: Label 352: 11(fvec4) Load 13(texel) - Store 346 352 + Store 349 352 Branch 351 353: Label 354: 16(ivec4) Load 18(itexel) @@ -456,10 +456,10 @@ 356: 21(ivec4) Load 23(utexel) 357: 11(fvec4) ConvertUToF 356 358: 11(fvec4) FAdd 355 357 - Store 346 358 + Store 349 358 Branch 351 351: Label - 359: 11(fvec4) Load 346 + 359: 11(fvec4) Load 349 Store 345(outColor) 359 Return FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.sparseTexture.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.sparseTexture.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.sparseTexture.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.sparseTexture.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.sparseTexture.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 438 Capability Shader @@ -182,14 +182,14 @@ 414(i2DMS): 413(ptr) Variable UniformConstant 422: TypePointer Output 11(fvec4) 423(outColor): 422(ptr) Variable Output - 426: TypeBool + 425: TypeBool 4(main): 2 Function None 3 5: Label 8(resident): 7(ptr) Variable Function 13(texel): 12(ptr) Variable Function 18(itexel): 17(ptr) Variable Function 23(utexel): 22(ptr) Variable Function - 424: 12(ptr) Variable Function + 427: 12(ptr) Variable Function Store 8(resident) 9 Store 13(texel) 15 Store 18(itexel) 19 @@ -565,13 +565,13 @@ 420: 6(int) Load 8(resident) 421: 6(int) BitwiseOr 420 419 Store 8(resident) 421 - 425: 6(int) Load 8(resident) - 427: 426(bool) ImageSparseTexelsResident 425 + 424: 6(int) Load 8(resident) + 426: 425(bool) ImageSparseTexelsResident 424 SelectionMerge 429 None - BranchConditional 427 428 431 + BranchConditional 426 428 431 428: Label 430: 11(fvec4) Load 13(texel) - Store 424 430 + Store 427 430 Branch 429 431: Label 432: 16(ivec4) Load 18(itexel) @@ -579,10 +579,10 @@ 434: 21(ivec4) Load 23(utexel) 435: 11(fvec4) ConvertUToF 434 436: 11(fvec4) FAdd 433 435 - Store 424 436 + Store 427 436 Branch 429 429: Label - 437: 11(fvec4) Load 424 + 437: 11(fvec4) Load 427 Store 423(outColor) 437 Return FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.specConstantComposite.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.specConstantComposite.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.specConstantComposite.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.specConstantComposite.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.specConstantComposite.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 43 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.specConstant.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.specConstant.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.specConstant.comp.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.specConstant.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.specConstant.comp // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 27 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.specConstantOperations.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.specConstantOperations.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.specConstantOperations.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.specConstantOperations.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.specConstantOperations.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 162 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.specConstant.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.specConstant.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.specConstant.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.specConstant.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.specConstant.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 81 Capability Shader @@ -11,7 +11,7 @@ Source GLSL 400 Name 4 "main" Name 9 "arraySize" - Name 14 "foo(vf4[s1506];" + Name 14 "foo(vf4[s2468];" Name 13 "p" Name 17 "builtin_spec_constant(" Name 20 "color" @@ -102,10 +102,10 @@ Store 20(color) 46 48: 10 Load 22(ucol) Store 47(param) 48 - 49: 2 FunctionCall 14(foo(vf4[s1506];) 47(param) + 49: 2 FunctionCall 14(foo(vf4[s2468];) 47(param) Return FunctionEnd -14(foo(vf4[s1506];): 2 Function None 12 +14(foo(vf4[s2468];): 2 Function None 12 13(p): 11(ptr) FunctionParameter 15: Label 54: 24(ptr) AccessChain 53(dupUcol) 23 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.specConst.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.specConst.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.specConst.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.specConst.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.specConst.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 27 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.ssboAlias.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.ssboAlias.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.ssboAlias.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.ssboAlias.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,12 @@ spv.ssboAlias.frag // Module Version 10000 -// Generated by (magic number): 80003 -// Id's are bound by 46 +// Generated by (magic number): 80006 +// Id's are bound by 44 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 43 + EntryPoint Fragment 4 "main" 41 ExecutionMode 4 OriginUpperLeft Source HLSL 500 Name 4 "main" @@ -17,10 +17,10 @@ Name 18 "Buf1@count" MemberName 18(Buf1@count) 0 "@count" Name 20 "Buf1@count" - Name 30 "Buf2" - Name 31 "Buf2@count" - Name 43 "@entryPointOutput" - Name 45 "Buf3" + Name 28 "Buf2" + Name 29 "Buf2@count" + Name 41 "@entryPointOutput" + Name 43 "Buf3" Decorate 12 ArrayStride 4 MemberDecorate 13(Buf1) 0 Offset 0 Decorate 13(Buf1) BufferBlock @@ -30,13 +30,13 @@ Decorate 18(Buf1@count) BufferBlock Decorate 20(Buf1@count) DescriptorSet 0 Decorate 20(Buf1@count) Binding 83 - Decorate 30(Buf2) DescriptorSet 0 - Decorate 30(Buf2) Binding 85 - Decorate 31(Buf2@count) DescriptorSet 0 - Decorate 31(Buf2@count) Binding 86 - Decorate 43(@entryPointOutput) Location 0 - Decorate 45(Buf3) DescriptorSet 0 - Decorate 45(Buf3) Binding 84 + Decorate 28(Buf2) DescriptorSet 0 + Decorate 28(Buf2) Binding 85 + Decorate 29(Buf2@count) DescriptorSet 0 + Decorate 29(Buf2@count) Binding 86 + Decorate 41(@entryPointOutput) Location 0 + Decorate 43(Buf3) DescriptorSet 0 + Decorate 43(Buf3) Binding 84 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -49,40 +49,38 @@ 15(Buf1): 14(ptr) Variable Uniform 16: TypeInt 32 1 17: 16(int) Constant 0 - 18(Buf1@count): TypeStruct 16(int) + 18(Buf1@count): TypeStruct 11(int) 19: TypePointer Uniform 18(Buf1@count) 20(Buf1@count): 19(ptr) Variable Uniform - 21: TypePointer Uniform 16(int) - 23: 16(int) Constant 1 - 24: 11(int) Constant 1 - 25: 11(int) Constant 0 - 27: 11(int) Constant 10 - 28: TypePointer Uniform 11(int) - 30(Buf2): 14(ptr) Variable Uniform - 31(Buf2@count): 19(ptr) Variable Uniform - 34: 11(int) Constant 20 - 36: 6(float) Constant 1065353216 - 37: 6(float) Constant 1077936128 - 38: 6(float) Constant 1084227584 - 39: 7(fvec4) ConstantComposite 36 37 38 36 - 42: TypePointer Output 7(fvec4) -43(@entryPointOutput): 42(ptr) Variable Output - 45(Buf3): 14(ptr) Variable Uniform + 21: TypePointer Uniform 11(int) + 23: 11(int) Constant 1 + 24: 11(int) Constant 0 + 26: 11(int) Constant 10 + 28(Buf2): 14(ptr) Variable Uniform + 29(Buf2@count): 19(ptr) Variable Uniform + 32: 11(int) Constant 20 + 34: 6(float) Constant 1065353216 + 35: 6(float) Constant 1077936128 + 36: 6(float) Constant 1084227584 + 37: 7(fvec4) ConstantComposite 34 35 36 34 + 40: TypePointer Output 7(fvec4) +41(@entryPointOutput): 40(ptr) Variable Output + 43(Buf3): 14(ptr) Variable Uniform 4(main): 2 Function None 3 5: Label - 44: 7(fvec4) FunctionCall 9(@main() - Store 43(@entryPointOutput) 44 + 42: 7(fvec4) FunctionCall 9(@main() + Store 41(@entryPointOutput) 42 Return FunctionEnd 9(@main(): 7(fvec4) Function None 8 10: Label 22: 21(ptr) AccessChain 20(Buf1@count) 17 - 26: 11(int) AtomicIAdd 22 24 25 23 - 29: 28(ptr) AccessChain 15(Buf1) 17 26 - Store 29 27 - 32: 21(ptr) AccessChain 31(Buf2@count) 17 - 33: 11(int) AtomicIAdd 32 24 25 23 - 35: 28(ptr) AccessChain 30(Buf2) 17 33 - Store 35 34 - ReturnValue 39 + 25: 11(int) AtomicIAdd 22 23 24 23 + 27: 21(ptr) AccessChain 15(Buf1) 17 25 + Store 27 26 + 30: 21(ptr) AccessChain 29(Buf2@count) 17 + 31: 11(int) AtomicIAdd 30 23 24 23 + 33: 21(ptr) AccessChain 28(Buf2) 17 31 + Store 33 32 + ReturnValue 37 FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.ssbo.autoassign.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.ssbo.autoassign.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.ssbo.autoassign.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.ssbo.autoassign.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.ssbo.autoassign.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 99 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.stereoViewRendering.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.stereoViewRendering.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.stereoViewRendering.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.stereoViewRendering.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.stereoViewRendering.tesc // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 38 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.stereoViewRendering.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.stereoViewRendering.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.stereoViewRendering.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.stereoViewRendering.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.stereoViewRendering.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 27 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.storageBuffer.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.storageBuffer.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.storageBuffer.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.storageBuffer.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.storageBuffer.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 31 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.structAssignment.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.structAssignment.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.structAssignment.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.structAssignment.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -3,7 +3,7 @@ "precision mediump int; precision highp float;" // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 50 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.structDeref.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.structDeref.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.structDeref.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.structDeref.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.structDeref.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 123 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.structure.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.structure.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.structure.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.structure.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.structure.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 60 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupArithmetic.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupArithmetic.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupArithmetic.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupArithmetic.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,2428 @@ +spv.subgroupArithmetic.comp +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 2085 + + Capability Shader + Capability Float64 + Capability GroupNonUniform + Capability GroupNonUniformArithmetic + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" 10 12 + ExecutionMode 4 LocalSize 8 1 1 + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_arithmetic" + SourceExtension "GL_KHR_shader_subgroup_basic" + Name 4 "main" + Name 8 "invocation" + Name 10 "gl_SubgroupInvocationID" + Name 12 "gl_SubgroupSize" + Name 24 "Buffers" + MemberName 24(Buffers) 0 "f4" + MemberName 24(Buffers) 1 "i4" + MemberName 24(Buffers) 2 "u4" + MemberName 24(Buffers) 3 "d4" + Name 27 "data" + Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 11 RelaxedPrecision + Decorate 12(gl_SubgroupSize) RelaxedPrecision + Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 13 RelaxedPrecision + Decorate 14 RelaxedPrecision + Decorate 16 RelaxedPrecision + MemberDecorate 24(Buffers) 0 Offset 0 + MemberDecorate 24(Buffers) 1 Offset 16 + MemberDecorate 24(Buffers) 2 Offset 32 + MemberDecorate 24(Buffers) 3 Offset 64 + Decorate 24(Buffers) BufferBlock + Decorate 27(data) DescriptorSet 0 + Decorate 27(data) Binding 0 + Decorate 2084 BuiltIn WorkgroupSize + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypePointer Function 6(int) + 9: TypePointer Input 6(int) +10(gl_SubgroupInvocationID): 9(ptr) Variable Input +12(gl_SubgroupSize): 9(ptr) Variable Input + 15: 6(int) Constant 4 + 17: TypeFloat 32 + 18: TypeVector 17(float) 4 + 19: TypeInt 32 1 + 20: TypeVector 19(int) 4 + 21: TypeVector 6(int) 4 + 22: TypeFloat 64 + 23: TypeVector 22(float) 4 + 24(Buffers): TypeStruct 18(fvec4) 20(ivec4) 21(ivec4) 23(fvec4) + 25: TypeArray 24(Buffers) 15 + 26: TypePointer Uniform 25 + 27(data): 26(ptr) Variable Uniform + 29: 19(int) Constant 0 + 30: 6(int) Constant 0 + 31: TypePointer Uniform 17(float) + 34: 6(int) Constant 3 + 38: 19(int) Constant 1 + 39: TypeVector 17(float) 2 + 40: TypePointer Uniform 18(fvec4) + 49: 19(int) Constant 2 + 50: TypeVector 17(float) 3 + 59: 19(int) Constant 3 + 65: TypePointer Uniform 19(int) + 71: TypeVector 19(int) 2 + 72: TypePointer Uniform 20(ivec4) + 81: TypeVector 19(int) 3 + 95: TypePointer Uniform 6(int) + 101: TypeVector 6(int) 2 + 102: TypePointer Uniform 21(ivec4) + 111: TypeVector 6(int) 3 + 125: TypePointer Uniform 22(float) + 131: TypeVector 22(float) 2 + 132: TypePointer Uniform 23(fvec4) + 141: TypeVector 22(float) 3 + 521: TypeBool + 530: 71(ivec2) ConstantComposite 29 29 + 531: TypeVector 521(bool) 2 + 534: 71(ivec2) ConstantComposite 38 38 + 543: 81(ivec3) ConstantComposite 29 29 29 + 544: TypeVector 521(bool) 3 + 547: 81(ivec3) ConstantComposite 38 38 38 + 555: 20(ivec4) ConstantComposite 29 29 29 29 + 556: TypeVector 521(bool) 4 + 559: 20(ivec4) ConstantComposite 38 38 38 38 + 2082: 6(int) Constant 8 + 2083: 6(int) Constant 1 + 2084: 111(ivec3) ConstantComposite 2082 2083 2083 + 4(main): 2 Function None 3 + 5: Label + 8(invocation): 7(ptr) Variable Function + 11: 6(int) Load 10(gl_SubgroupInvocationID) + 13: 6(int) Load 12(gl_SubgroupSize) + 14: 6(int) IAdd 11 13 + 16: 6(int) UMod 14 15 + Store 8(invocation) 16 + 28: 6(int) Load 8(invocation) + 32: 31(ptr) AccessChain 27(data) 29 29 30 + 33: 17(float) Load 32 + 35: 17(float) GroupNonUniformFAdd 34 Reduce 33 + 36: 31(ptr) AccessChain 27(data) 28 29 30 + Store 36 35 + 37: 6(int) Load 8(invocation) + 41: 40(ptr) AccessChain 27(data) 38 29 + 42: 18(fvec4) Load 41 + 43: 39(fvec2) VectorShuffle 42 42 0 1 + 44: 39(fvec2) GroupNonUniformFAdd 34 Reduce 43 + 45: 40(ptr) AccessChain 27(data) 37 29 + 46: 18(fvec4) Load 45 + 47: 18(fvec4) VectorShuffle 46 44 4 5 2 3 + Store 45 47 + 48: 6(int) Load 8(invocation) + 51: 40(ptr) AccessChain 27(data) 49 29 + 52: 18(fvec4) Load 51 + 53: 50(fvec3) VectorShuffle 52 52 0 1 2 + 54: 50(fvec3) GroupNonUniformFAdd 34 Reduce 53 + 55: 40(ptr) AccessChain 27(data) 48 29 + 56: 18(fvec4) Load 55 + 57: 18(fvec4) VectorShuffle 56 54 4 5 6 3 + Store 55 57 + 58: 6(int) Load 8(invocation) + 60: 40(ptr) AccessChain 27(data) 59 29 + 61: 18(fvec4) Load 60 + 62: 18(fvec4) GroupNonUniformFAdd 34 Reduce 61 + 63: 40(ptr) AccessChain 27(data) 58 29 + Store 63 62 + 64: 6(int) Load 8(invocation) + 66: 65(ptr) AccessChain 27(data) 29 38 30 + 67: 19(int) Load 66 + 68: 19(int) GroupNonUniformIAdd 34 Reduce 67 + 69: 65(ptr) AccessChain 27(data) 64 38 30 + Store 69 68 + 70: 6(int) Load 8(invocation) + 73: 72(ptr) AccessChain 27(data) 38 38 + 74: 20(ivec4) Load 73 + 75: 71(ivec2) VectorShuffle 74 74 0 1 + 76: 71(ivec2) GroupNonUniformIAdd 34 Reduce 75 + 77: 72(ptr) AccessChain 27(data) 70 38 + 78: 20(ivec4) Load 77 + 79: 20(ivec4) VectorShuffle 78 76 4 5 2 3 + Store 77 79 + 80: 6(int) Load 8(invocation) + 82: 72(ptr) AccessChain 27(data) 49 38 + 83: 20(ivec4) Load 82 + 84: 81(ivec3) VectorShuffle 83 83 0 1 2 + 85: 81(ivec3) GroupNonUniformIAdd 34 Reduce 84 + 86: 72(ptr) AccessChain 27(data) 80 38 + 87: 20(ivec4) Load 86 + 88: 20(ivec4) VectorShuffle 87 85 4 5 6 3 + Store 86 88 + 89: 6(int) Load 8(invocation) + 90: 72(ptr) AccessChain 27(data) 59 38 + 91: 20(ivec4) Load 90 + 92: 20(ivec4) GroupNonUniformIAdd 34 Reduce 91 + 93: 72(ptr) AccessChain 27(data) 89 38 + Store 93 92 + 94: 6(int) Load 8(invocation) + 96: 95(ptr) AccessChain 27(data) 29 49 30 + 97: 6(int) Load 96 + 98: 6(int) GroupNonUniformIAdd 34 Reduce 97 + 99: 95(ptr) AccessChain 27(data) 94 49 30 + Store 99 98 + 100: 6(int) Load 8(invocation) + 103: 102(ptr) AccessChain 27(data) 38 49 + 104: 21(ivec4) Load 103 + 105: 101(ivec2) VectorShuffle 104 104 0 1 + 106: 101(ivec2) GroupNonUniformIAdd 34 Reduce 105 + 107: 102(ptr) AccessChain 27(data) 100 49 + 108: 21(ivec4) Load 107 + 109: 21(ivec4) VectorShuffle 108 106 4 5 2 3 + Store 107 109 + 110: 6(int) Load 8(invocation) + 112: 102(ptr) AccessChain 27(data) 49 49 + 113: 21(ivec4) Load 112 + 114: 111(ivec3) VectorShuffle 113 113 0 1 2 + 115: 111(ivec3) GroupNonUniformIAdd 34 Reduce 114 + 116: 102(ptr) AccessChain 27(data) 110 49 + 117: 21(ivec4) Load 116 + 118: 21(ivec4) VectorShuffle 117 115 4 5 6 3 + Store 116 118 + 119: 6(int) Load 8(invocation) + 120: 102(ptr) AccessChain 27(data) 59 49 + 121: 21(ivec4) Load 120 + 122: 21(ivec4) GroupNonUniformIAdd 34 Reduce 121 + 123: 102(ptr) AccessChain 27(data) 119 49 + Store 123 122 + 124: 6(int) Load 8(invocation) + 126: 125(ptr) AccessChain 27(data) 29 59 30 + 127: 22(float) Load 126 + 128: 22(float) GroupNonUniformFAdd 34 Reduce 127 + 129: 125(ptr) AccessChain 27(data) 124 59 30 + Store 129 128 + 130: 6(int) Load 8(invocation) + 133: 132(ptr) AccessChain 27(data) 38 59 + 134: 23(fvec4) Load 133 + 135: 131(fvec2) VectorShuffle 134 134 0 1 + 136: 131(fvec2) GroupNonUniformFAdd 34 Reduce 135 + 137: 132(ptr) AccessChain 27(data) 130 59 + 138: 23(fvec4) Load 137 + 139: 23(fvec4) VectorShuffle 138 136 4 5 2 3 + Store 137 139 + 140: 6(int) Load 8(invocation) + 142: 132(ptr) AccessChain 27(data) 49 59 + 143: 23(fvec4) Load 142 + 144: 141(fvec3) VectorShuffle 143 143 0 1 2 + 145: 141(fvec3) GroupNonUniformFAdd 34 Reduce 144 + 146: 132(ptr) AccessChain 27(data) 140 59 + 147: 23(fvec4) Load 146 + 148: 23(fvec4) VectorShuffle 147 145 4 5 6 3 + Store 146 148 + 149: 6(int) Load 8(invocation) + 150: 132(ptr) AccessChain 27(data) 59 59 + 151: 23(fvec4) Load 150 + 152: 23(fvec4) GroupNonUniformFAdd 34 Reduce 151 + 153: 132(ptr) AccessChain 27(data) 149 59 + Store 153 152 + 154: 6(int) Load 8(invocation) + 155: 31(ptr) AccessChain 27(data) 29 29 30 + 156: 17(float) Load 155 + 157: 17(float) GroupNonUniformFMul 34 Reduce 156 + 158: 31(ptr) AccessChain 27(data) 154 29 30 + Store 158 157 + 159: 6(int) Load 8(invocation) + 160: 40(ptr) AccessChain 27(data) 38 29 + 161: 18(fvec4) Load 160 + 162: 39(fvec2) VectorShuffle 161 161 0 1 + 163: 39(fvec2) GroupNonUniformFMul 34 Reduce 162 + 164: 40(ptr) AccessChain 27(data) 159 29 + 165: 18(fvec4) Load 164 + 166: 18(fvec4) VectorShuffle 165 163 4 5 2 3 + Store 164 166 + 167: 6(int) Load 8(invocation) + 168: 40(ptr) AccessChain 27(data) 49 29 + 169: 18(fvec4) Load 168 + 170: 50(fvec3) VectorShuffle 169 169 0 1 2 + 171: 50(fvec3) GroupNonUniformFMul 34 Reduce 170 + 172: 40(ptr) AccessChain 27(data) 167 29 + 173: 18(fvec4) Load 172 + 174: 18(fvec4) VectorShuffle 173 171 4 5 6 3 + Store 172 174 + 175: 6(int) Load 8(invocation) + 176: 40(ptr) AccessChain 27(data) 59 29 + 177: 18(fvec4) Load 176 + 178: 18(fvec4) GroupNonUniformFMul 34 Reduce 177 + 179: 40(ptr) AccessChain 27(data) 175 29 + Store 179 178 + 180: 6(int) Load 8(invocation) + 181: 65(ptr) AccessChain 27(data) 29 38 30 + 182: 19(int) Load 181 + 183: 19(int) GroupNonUniformIMul 34 Reduce 182 + 184: 65(ptr) AccessChain 27(data) 180 38 30 + Store 184 183 + 185: 6(int) Load 8(invocation) + 186: 72(ptr) AccessChain 27(data) 38 38 + 187: 20(ivec4) Load 186 + 188: 71(ivec2) VectorShuffle 187 187 0 1 + 189: 71(ivec2) GroupNonUniformIMul 34 Reduce 188 + 190: 72(ptr) AccessChain 27(data) 185 38 + 191: 20(ivec4) Load 190 + 192: 20(ivec4) VectorShuffle 191 189 4 5 2 3 + Store 190 192 + 193: 6(int) Load 8(invocation) + 194: 72(ptr) AccessChain 27(data) 49 38 + 195: 20(ivec4) Load 194 + 196: 81(ivec3) VectorShuffle 195 195 0 1 2 + 197: 81(ivec3) GroupNonUniformIMul 34 Reduce 196 + 198: 72(ptr) AccessChain 27(data) 193 38 + 199: 20(ivec4) Load 198 + 200: 20(ivec4) VectorShuffle 199 197 4 5 6 3 + Store 198 200 + 201: 6(int) Load 8(invocation) + 202: 72(ptr) AccessChain 27(data) 59 38 + 203: 20(ivec4) Load 202 + 204: 20(ivec4) GroupNonUniformIMul 34 Reduce 203 + 205: 72(ptr) AccessChain 27(data) 201 38 + Store 205 204 + 206: 6(int) Load 8(invocation) + 207: 95(ptr) AccessChain 27(data) 29 49 30 + 208: 6(int) Load 207 + 209: 6(int) GroupNonUniformIMul 34 Reduce 208 + 210: 95(ptr) AccessChain 27(data) 206 49 30 + Store 210 209 + 211: 6(int) Load 8(invocation) + 212: 102(ptr) AccessChain 27(data) 38 49 + 213: 21(ivec4) Load 212 + 214: 101(ivec2) VectorShuffle 213 213 0 1 + 215: 101(ivec2) GroupNonUniformIMul 34 Reduce 214 + 216: 102(ptr) AccessChain 27(data) 211 49 + 217: 21(ivec4) Load 216 + 218: 21(ivec4) VectorShuffle 217 215 4 5 2 3 + Store 216 218 + 219: 6(int) Load 8(invocation) + 220: 102(ptr) AccessChain 27(data) 49 49 + 221: 21(ivec4) Load 220 + 222: 111(ivec3) VectorShuffle 221 221 0 1 2 + 223: 111(ivec3) GroupNonUniformIMul 34 Reduce 222 + 224: 102(ptr) AccessChain 27(data) 219 49 + 225: 21(ivec4) Load 224 + 226: 21(ivec4) VectorShuffle 225 223 4 5 6 3 + Store 224 226 + 227: 6(int) Load 8(invocation) + 228: 102(ptr) AccessChain 27(data) 59 49 + 229: 21(ivec4) Load 228 + 230: 21(ivec4) GroupNonUniformIMul 34 Reduce 229 + 231: 102(ptr) AccessChain 27(data) 227 49 + Store 231 230 + 232: 6(int) Load 8(invocation) + 233: 125(ptr) AccessChain 27(data) 29 59 30 + 234: 22(float) Load 233 + 235: 22(float) GroupNonUniformFMul 34 Reduce 234 + 236: 125(ptr) AccessChain 27(data) 232 59 30 + Store 236 235 + 237: 6(int) Load 8(invocation) + 238: 132(ptr) AccessChain 27(data) 38 59 + 239: 23(fvec4) Load 238 + 240: 131(fvec2) VectorShuffle 239 239 0 1 + 241: 131(fvec2) GroupNonUniformFMul 34 Reduce 240 + 242: 132(ptr) AccessChain 27(data) 237 59 + 243: 23(fvec4) Load 242 + 244: 23(fvec4) VectorShuffle 243 241 4 5 2 3 + Store 242 244 + 245: 6(int) Load 8(invocation) + 246: 132(ptr) AccessChain 27(data) 49 59 + 247: 23(fvec4) Load 246 + 248: 141(fvec3) VectorShuffle 247 247 0 1 2 + 249: 141(fvec3) GroupNonUniformFMul 34 Reduce 248 + 250: 132(ptr) AccessChain 27(data) 245 59 + 251: 23(fvec4) Load 250 + 252: 23(fvec4) VectorShuffle 251 249 4 5 6 3 + Store 250 252 + 253: 6(int) Load 8(invocation) + 254: 132(ptr) AccessChain 27(data) 59 59 + 255: 23(fvec4) Load 254 + 256: 23(fvec4) GroupNonUniformFMul 34 Reduce 255 + 257: 132(ptr) AccessChain 27(data) 253 59 + Store 257 256 + 258: 6(int) Load 8(invocation) + 259: 31(ptr) AccessChain 27(data) 29 29 30 + 260: 17(float) Load 259 + 261: 17(float) GroupNonUniformFMin 34 Reduce 260 + 262: 31(ptr) AccessChain 27(data) 258 29 30 + Store 262 261 + 263: 6(int) Load 8(invocation) + 264: 40(ptr) AccessChain 27(data) 38 29 + 265: 18(fvec4) Load 264 + 266: 39(fvec2) VectorShuffle 265 265 0 1 + 267: 39(fvec2) GroupNonUniformFMin 34 Reduce 266 + 268: 40(ptr) AccessChain 27(data) 263 29 + 269: 18(fvec4) Load 268 + 270: 18(fvec4) VectorShuffle 269 267 4 5 2 3 + Store 268 270 + 271: 6(int) Load 8(invocation) + 272: 40(ptr) AccessChain 27(data) 49 29 + 273: 18(fvec4) Load 272 + 274: 50(fvec3) VectorShuffle 273 273 0 1 2 + 275: 50(fvec3) GroupNonUniformFMin 34 Reduce 274 + 276: 40(ptr) AccessChain 27(data) 271 29 + 277: 18(fvec4) Load 276 + 278: 18(fvec4) VectorShuffle 277 275 4 5 6 3 + Store 276 278 + 279: 6(int) Load 8(invocation) + 280: 40(ptr) AccessChain 27(data) 59 29 + 281: 18(fvec4) Load 280 + 282: 18(fvec4) GroupNonUniformFMin 34 Reduce 281 + 283: 40(ptr) AccessChain 27(data) 279 29 + Store 283 282 + 284: 6(int) Load 8(invocation) + 285: 65(ptr) AccessChain 27(data) 29 38 30 + 286: 19(int) Load 285 + 287: 19(int) GroupNonUniformSMin 34 Reduce 286 + 288: 65(ptr) AccessChain 27(data) 284 38 30 + Store 288 287 + 289: 6(int) Load 8(invocation) + 290: 72(ptr) AccessChain 27(data) 38 38 + 291: 20(ivec4) Load 290 + 292: 71(ivec2) VectorShuffle 291 291 0 1 + 293: 71(ivec2) GroupNonUniformSMin 34 Reduce 292 + 294: 72(ptr) AccessChain 27(data) 289 38 + 295: 20(ivec4) Load 294 + 296: 20(ivec4) VectorShuffle 295 293 4 5 2 3 + Store 294 296 + 297: 6(int) Load 8(invocation) + 298: 72(ptr) AccessChain 27(data) 49 38 + 299: 20(ivec4) Load 298 + 300: 81(ivec3) VectorShuffle 299 299 0 1 2 + 301: 81(ivec3) GroupNonUniformSMin 34 Reduce 300 + 302: 72(ptr) AccessChain 27(data) 297 38 + 303: 20(ivec4) Load 302 + 304: 20(ivec4) VectorShuffle 303 301 4 5 6 3 + Store 302 304 + 305: 6(int) Load 8(invocation) + 306: 72(ptr) AccessChain 27(data) 59 38 + 307: 20(ivec4) Load 306 + 308: 20(ivec4) GroupNonUniformSMin 34 Reduce 307 + 309: 72(ptr) AccessChain 27(data) 305 38 + Store 309 308 + 310: 6(int) Load 8(invocation) + 311: 95(ptr) AccessChain 27(data) 29 49 30 + 312: 6(int) Load 311 + 313: 6(int) GroupNonUniformUMin 34 Reduce 312 + 314: 95(ptr) AccessChain 27(data) 310 49 30 + Store 314 313 + 315: 6(int) Load 8(invocation) + 316: 102(ptr) AccessChain 27(data) 38 49 + 317: 21(ivec4) Load 316 + 318: 101(ivec2) VectorShuffle 317 317 0 1 + 319: 101(ivec2) GroupNonUniformUMin 34 Reduce 318 + 320: 102(ptr) AccessChain 27(data) 315 49 + 321: 21(ivec4) Load 320 + 322: 21(ivec4) VectorShuffle 321 319 4 5 2 3 + Store 320 322 + 323: 6(int) Load 8(invocation) + 324: 102(ptr) AccessChain 27(data) 49 49 + 325: 21(ivec4) Load 324 + 326: 111(ivec3) VectorShuffle 325 325 0 1 2 + 327: 111(ivec3) GroupNonUniformUMin 34 Reduce 326 + 328: 102(ptr) AccessChain 27(data) 323 49 + 329: 21(ivec4) Load 328 + 330: 21(ivec4) VectorShuffle 329 327 4 5 6 3 + Store 328 330 + 331: 6(int) Load 8(invocation) + 332: 102(ptr) AccessChain 27(data) 59 49 + 333: 21(ivec4) Load 332 + 334: 21(ivec4) GroupNonUniformUMin 34 Reduce 333 + 335: 102(ptr) AccessChain 27(data) 331 49 + Store 335 334 + 336: 6(int) Load 8(invocation) + 337: 125(ptr) AccessChain 27(data) 29 59 30 + 338: 22(float) Load 337 + 339: 22(float) GroupNonUniformFMin 34 Reduce 338 + 340: 125(ptr) AccessChain 27(data) 336 59 30 + Store 340 339 + 341: 6(int) Load 8(invocation) + 342: 132(ptr) AccessChain 27(data) 38 59 + 343: 23(fvec4) Load 342 + 344: 131(fvec2) VectorShuffle 343 343 0 1 + 345: 131(fvec2) GroupNonUniformFMin 34 Reduce 344 + 346: 132(ptr) AccessChain 27(data) 341 59 + 347: 23(fvec4) Load 346 + 348: 23(fvec4) VectorShuffle 347 345 4 5 2 3 + Store 346 348 + 349: 6(int) Load 8(invocation) + 350: 132(ptr) AccessChain 27(data) 49 59 + 351: 23(fvec4) Load 350 + 352: 141(fvec3) VectorShuffle 351 351 0 1 2 + 353: 141(fvec3) GroupNonUniformFMin 34 Reduce 352 + 354: 132(ptr) AccessChain 27(data) 349 59 + 355: 23(fvec4) Load 354 + 356: 23(fvec4) VectorShuffle 355 353 4 5 6 3 + Store 354 356 + 357: 6(int) Load 8(invocation) + 358: 132(ptr) AccessChain 27(data) 59 59 + 359: 23(fvec4) Load 358 + 360: 23(fvec4) GroupNonUniformFMin 34 Reduce 359 + 361: 132(ptr) AccessChain 27(data) 357 59 + Store 361 360 + 362: 6(int) Load 8(invocation) + 363: 31(ptr) AccessChain 27(data) 29 29 30 + 364: 17(float) Load 363 + 365: 17(float) GroupNonUniformFMax 34 Reduce 364 + 366: 31(ptr) AccessChain 27(data) 362 29 30 + Store 366 365 + 367: 6(int) Load 8(invocation) + 368: 40(ptr) AccessChain 27(data) 38 29 + 369: 18(fvec4) Load 368 + 370: 39(fvec2) VectorShuffle 369 369 0 1 + 371: 39(fvec2) GroupNonUniformFMax 34 Reduce 370 + 372: 40(ptr) AccessChain 27(data) 367 29 + 373: 18(fvec4) Load 372 + 374: 18(fvec4) VectorShuffle 373 371 4 5 2 3 + Store 372 374 + 375: 6(int) Load 8(invocation) + 376: 40(ptr) AccessChain 27(data) 49 29 + 377: 18(fvec4) Load 376 + 378: 50(fvec3) VectorShuffle 377 377 0 1 2 + 379: 50(fvec3) GroupNonUniformFMax 34 Reduce 378 + 380: 40(ptr) AccessChain 27(data) 375 29 + 381: 18(fvec4) Load 380 + 382: 18(fvec4) VectorShuffle 381 379 4 5 6 3 + Store 380 382 + 383: 6(int) Load 8(invocation) + 384: 40(ptr) AccessChain 27(data) 59 29 + 385: 18(fvec4) Load 384 + 386: 18(fvec4) GroupNonUniformFMax 34 Reduce 385 + 387: 40(ptr) AccessChain 27(data) 383 29 + Store 387 386 + 388: 6(int) Load 8(invocation) + 389: 65(ptr) AccessChain 27(data) 29 38 30 + 390: 19(int) Load 389 + 391: 19(int) GroupNonUniformSMax 34 Reduce 390 + 392: 65(ptr) AccessChain 27(data) 388 38 30 + Store 392 391 + 393: 6(int) Load 8(invocation) + 394: 72(ptr) AccessChain 27(data) 38 38 + 395: 20(ivec4) Load 394 + 396: 71(ivec2) VectorShuffle 395 395 0 1 + 397: 71(ivec2) GroupNonUniformSMax 34 Reduce 396 + 398: 72(ptr) AccessChain 27(data) 393 38 + 399: 20(ivec4) Load 398 + 400: 20(ivec4) VectorShuffle 399 397 4 5 2 3 + Store 398 400 + 401: 6(int) Load 8(invocation) + 402: 72(ptr) AccessChain 27(data) 49 38 + 403: 20(ivec4) Load 402 + 404: 81(ivec3) VectorShuffle 403 403 0 1 2 + 405: 81(ivec3) GroupNonUniformSMax 34 Reduce 404 + 406: 72(ptr) AccessChain 27(data) 401 38 + 407: 20(ivec4) Load 406 + 408: 20(ivec4) VectorShuffle 407 405 4 5 6 3 + Store 406 408 + 409: 6(int) Load 8(invocation) + 410: 72(ptr) AccessChain 27(data) 59 38 + 411: 20(ivec4) Load 410 + 412: 20(ivec4) GroupNonUniformSMax 34 Reduce 411 + 413: 72(ptr) AccessChain 27(data) 409 38 + Store 413 412 + 414: 6(int) Load 8(invocation) + 415: 95(ptr) AccessChain 27(data) 29 49 30 + 416: 6(int) Load 415 + 417: 6(int) GroupNonUniformUMax 34 Reduce 416 + 418: 95(ptr) AccessChain 27(data) 414 49 30 + Store 418 417 + 419: 6(int) Load 8(invocation) + 420: 102(ptr) AccessChain 27(data) 38 49 + 421: 21(ivec4) Load 420 + 422: 101(ivec2) VectorShuffle 421 421 0 1 + 423: 101(ivec2) GroupNonUniformUMax 34 Reduce 422 + 424: 102(ptr) AccessChain 27(data) 419 49 + 425: 21(ivec4) Load 424 + 426: 21(ivec4) VectorShuffle 425 423 4 5 2 3 + Store 424 426 + 427: 6(int) Load 8(invocation) + 428: 102(ptr) AccessChain 27(data) 49 49 + 429: 21(ivec4) Load 428 + 430: 111(ivec3) VectorShuffle 429 429 0 1 2 + 431: 111(ivec3) GroupNonUniformUMax 34 Reduce 430 + 432: 102(ptr) AccessChain 27(data) 427 49 + 433: 21(ivec4) Load 432 + 434: 21(ivec4) VectorShuffle 433 431 4 5 6 3 + Store 432 434 + 435: 6(int) Load 8(invocation) + 436: 102(ptr) AccessChain 27(data) 59 49 + 437: 21(ivec4) Load 436 + 438: 21(ivec4) GroupNonUniformUMax 34 Reduce 437 + 439: 102(ptr) AccessChain 27(data) 435 49 + Store 439 438 + 440: 6(int) Load 8(invocation) + 441: 125(ptr) AccessChain 27(data) 29 59 30 + 442: 22(float) Load 441 + 443: 22(float) GroupNonUniformFMax 34 Reduce 442 + 444: 125(ptr) AccessChain 27(data) 440 59 30 + Store 444 443 + 445: 6(int) Load 8(invocation) + 446: 132(ptr) AccessChain 27(data) 38 59 + 447: 23(fvec4) Load 446 + 448: 131(fvec2) VectorShuffle 447 447 0 1 + 449: 131(fvec2) GroupNonUniformFMax 34 Reduce 448 + 450: 132(ptr) AccessChain 27(data) 445 59 + 451: 23(fvec4) Load 450 + 452: 23(fvec4) VectorShuffle 451 449 4 5 2 3 + Store 450 452 + 453: 6(int) Load 8(invocation) + 454: 132(ptr) AccessChain 27(data) 49 59 + 455: 23(fvec4) Load 454 + 456: 141(fvec3) VectorShuffle 455 455 0 1 2 + 457: 141(fvec3) GroupNonUniformFMax 34 Reduce 456 + 458: 132(ptr) AccessChain 27(data) 453 59 + 459: 23(fvec4) Load 458 + 460: 23(fvec4) VectorShuffle 459 457 4 5 6 3 + Store 458 460 + 461: 6(int) Load 8(invocation) + 462: 132(ptr) AccessChain 27(data) 59 59 + 463: 23(fvec4) Load 462 + 464: 23(fvec4) GroupNonUniformFMax 34 Reduce 463 + 465: 132(ptr) AccessChain 27(data) 461 59 + Store 465 464 + 466: 6(int) Load 8(invocation) + 467: 65(ptr) AccessChain 27(data) 29 38 30 + 468: 19(int) Load 467 + 469: 19(int) GroupNonUniformBitwiseAnd 34 Reduce 468 + 470: 65(ptr) AccessChain 27(data) 466 38 30 + Store 470 469 + 471: 6(int) Load 8(invocation) + 472: 72(ptr) AccessChain 27(data) 38 38 + 473: 20(ivec4) Load 472 + 474: 71(ivec2) VectorShuffle 473 473 0 1 + 475: 71(ivec2) GroupNonUniformBitwiseAnd 34 Reduce 474 + 476: 72(ptr) AccessChain 27(data) 471 38 + 477: 20(ivec4) Load 476 + 478: 20(ivec4) VectorShuffle 477 475 4 5 2 3 + Store 476 478 + 479: 6(int) Load 8(invocation) + 480: 72(ptr) AccessChain 27(data) 49 38 + 481: 20(ivec4) Load 480 + 482: 81(ivec3) VectorShuffle 481 481 0 1 2 + 483: 81(ivec3) GroupNonUniformBitwiseAnd 34 Reduce 482 + 484: 72(ptr) AccessChain 27(data) 479 38 + 485: 20(ivec4) Load 484 + 486: 20(ivec4) VectorShuffle 485 483 4 5 6 3 + Store 484 486 + 487: 6(int) Load 8(invocation) + 488: 72(ptr) AccessChain 27(data) 59 38 + 489: 20(ivec4) Load 488 + 490: 20(ivec4) GroupNonUniformBitwiseAnd 34 Reduce 489 + 491: 72(ptr) AccessChain 27(data) 487 38 + Store 491 490 + 492: 6(int) Load 8(invocation) + 493: 95(ptr) AccessChain 27(data) 29 49 30 + 494: 6(int) Load 493 + 495: 6(int) GroupNonUniformBitwiseAnd 34 Reduce 494 + 496: 95(ptr) AccessChain 27(data) 492 49 30 + Store 496 495 + 497: 6(int) Load 8(invocation) + 498: 102(ptr) AccessChain 27(data) 38 49 + 499: 21(ivec4) Load 498 + 500: 101(ivec2) VectorShuffle 499 499 0 1 + 501: 101(ivec2) GroupNonUniformBitwiseAnd 34 Reduce 500 + 502: 102(ptr) AccessChain 27(data) 497 49 + 503: 21(ivec4) Load 502 + 504: 21(ivec4) VectorShuffle 503 501 4 5 2 3 + Store 502 504 + 505: 6(int) Load 8(invocation) + 506: 102(ptr) AccessChain 27(data) 49 49 + 507: 21(ivec4) Load 506 + 508: 111(ivec3) VectorShuffle 507 507 0 1 2 + 509: 111(ivec3) GroupNonUniformBitwiseAnd 34 Reduce 508 + 510: 102(ptr) AccessChain 27(data) 505 49 + 511: 21(ivec4) Load 510 + 512: 21(ivec4) VectorShuffle 511 509 4 5 6 3 + Store 510 512 + 513: 6(int) Load 8(invocation) + 514: 102(ptr) AccessChain 27(data) 59 49 + 515: 21(ivec4) Load 514 + 516: 21(ivec4) GroupNonUniformBitwiseAnd 34 Reduce 515 + 517: 102(ptr) AccessChain 27(data) 513 49 + Store 517 516 + 518: 6(int) Load 8(invocation) + 519: 65(ptr) AccessChain 27(data) 29 38 30 + 520: 19(int) Load 519 + 522: 521(bool) SLessThan 520 29 + 523: 521(bool) GroupNonUniformLogicalAnd 34 Reduce 522 + 524: 19(int) Select 523 38 29 + 525: 65(ptr) AccessChain 27(data) 518 38 30 + Store 525 524 + 526: 6(int) Load 8(invocation) + 527: 72(ptr) AccessChain 27(data) 38 38 + 528: 20(ivec4) Load 527 + 529: 71(ivec2) VectorShuffle 528 528 0 1 + 532: 531(bvec2) SLessThan 529 530 + 533: 531(bvec2) GroupNonUniformLogicalAnd 34 Reduce 532 + 535: 71(ivec2) Select 533 534 530 + 536: 72(ptr) AccessChain 27(data) 526 38 + 537: 20(ivec4) Load 536 + 538: 20(ivec4) VectorShuffle 537 535 4 5 2 3 + Store 536 538 + 539: 6(int) Load 8(invocation) + 540: 72(ptr) AccessChain 27(data) 38 38 + 541: 20(ivec4) Load 540 + 542: 81(ivec3) VectorShuffle 541 541 0 1 2 + 545: 544(bvec3) SLessThan 542 543 + 546: 544(bvec3) GroupNonUniformLogicalAnd 34 Reduce 545 + 548: 81(ivec3) Select 546 547 543 + 549: 72(ptr) AccessChain 27(data) 539 38 + 550: 20(ivec4) Load 549 + 551: 20(ivec4) VectorShuffle 550 548 4 5 6 3 + Store 549 551 + 552: 6(int) Load 8(invocation) + 553: 72(ptr) AccessChain 27(data) 38 38 + 554: 20(ivec4) Load 553 + 557: 556(bvec4) SLessThan 554 555 + 558: 556(bvec4) GroupNonUniformLogicalAnd 34 Reduce 557 + 560: 20(ivec4) Select 558 559 555 + 561: 72(ptr) AccessChain 27(data) 552 38 + Store 561 560 + 562: 6(int) Load 8(invocation) + 563: 65(ptr) AccessChain 27(data) 29 38 30 + 564: 19(int) Load 563 + 565: 19(int) GroupNonUniformBitwiseOr 34 Reduce 564 + 566: 65(ptr) AccessChain 27(data) 562 38 30 + Store 566 565 + 567: 6(int) Load 8(invocation) + 568: 72(ptr) AccessChain 27(data) 38 38 + 569: 20(ivec4) Load 568 + 570: 71(ivec2) VectorShuffle 569 569 0 1 + 571: 71(ivec2) GroupNonUniformBitwiseOr 34 Reduce 570 + 572: 72(ptr) AccessChain 27(data) 567 38 + 573: 20(ivec4) Load 572 + 574: 20(ivec4) VectorShuffle 573 571 4 5 2 3 + Store 572 574 + 575: 6(int) Load 8(invocation) + 576: 72(ptr) AccessChain 27(data) 49 38 + 577: 20(ivec4) Load 576 + 578: 81(ivec3) VectorShuffle 577 577 0 1 2 + 579: 81(ivec3) GroupNonUniformBitwiseOr 34 Reduce 578 + 580: 72(ptr) AccessChain 27(data) 575 38 + 581: 20(ivec4) Load 580 + 582: 20(ivec4) VectorShuffle 581 579 4 5 6 3 + Store 580 582 + 583: 6(int) Load 8(invocation) + 584: 72(ptr) AccessChain 27(data) 59 38 + 585: 20(ivec4) Load 584 + 586: 20(ivec4) GroupNonUniformBitwiseOr 34 Reduce 585 + 587: 72(ptr) AccessChain 27(data) 583 38 + Store 587 586 + 588: 6(int) Load 8(invocation) + 589: 95(ptr) AccessChain 27(data) 29 49 30 + 590: 6(int) Load 589 + 591: 6(int) GroupNonUniformBitwiseOr 34 Reduce 590 + 592: 95(ptr) AccessChain 27(data) 588 49 30 + Store 592 591 + 593: 6(int) Load 8(invocation) + 594: 102(ptr) AccessChain 27(data) 38 49 + 595: 21(ivec4) Load 594 + 596: 101(ivec2) VectorShuffle 595 595 0 1 + 597: 101(ivec2) GroupNonUniformBitwiseOr 34 Reduce 596 + 598: 102(ptr) AccessChain 27(data) 593 49 + 599: 21(ivec4) Load 598 + 600: 21(ivec4) VectorShuffle 599 597 4 5 2 3 + Store 598 600 + 601: 6(int) Load 8(invocation) + 602: 102(ptr) AccessChain 27(data) 49 49 + 603: 21(ivec4) Load 602 + 604: 111(ivec3) VectorShuffle 603 603 0 1 2 + 605: 111(ivec3) GroupNonUniformBitwiseOr 34 Reduce 604 + 606: 102(ptr) AccessChain 27(data) 601 49 + 607: 21(ivec4) Load 606 + 608: 21(ivec4) VectorShuffle 607 605 4 5 6 3 + Store 606 608 + 609: 6(int) Load 8(invocation) + 610: 102(ptr) AccessChain 27(data) 59 49 + 611: 21(ivec4) Load 610 + 612: 21(ivec4) GroupNonUniformBitwiseOr 34 Reduce 611 + 613: 102(ptr) AccessChain 27(data) 609 49 + Store 613 612 + 614: 6(int) Load 8(invocation) + 615: 65(ptr) AccessChain 27(data) 29 38 30 + 616: 19(int) Load 615 + 617: 521(bool) SLessThan 616 29 + 618: 521(bool) GroupNonUniformLogicalOr 34 Reduce 617 + 619: 19(int) Select 618 38 29 + 620: 65(ptr) AccessChain 27(data) 614 38 30 + Store 620 619 + 621: 6(int) Load 8(invocation) + 622: 72(ptr) AccessChain 27(data) 38 38 + 623: 20(ivec4) Load 622 + 624: 71(ivec2) VectorShuffle 623 623 0 1 + 625: 531(bvec2) SLessThan 624 530 + 626: 531(bvec2) GroupNonUniformLogicalOr 34 Reduce 625 + 627: 71(ivec2) Select 626 534 530 + 628: 72(ptr) AccessChain 27(data) 621 38 + 629: 20(ivec4) Load 628 + 630: 20(ivec4) VectorShuffle 629 627 4 5 2 3 + Store 628 630 + 631: 6(int) Load 8(invocation) + 632: 72(ptr) AccessChain 27(data) 38 38 + 633: 20(ivec4) Load 632 + 634: 81(ivec3) VectorShuffle 633 633 0 1 2 + 635: 544(bvec3) SLessThan 634 543 + 636: 544(bvec3) GroupNonUniformLogicalOr 34 Reduce 635 + 637: 81(ivec3) Select 636 547 543 + 638: 72(ptr) AccessChain 27(data) 631 38 + 639: 20(ivec4) Load 638 + 640: 20(ivec4) VectorShuffle 639 637 4 5 6 3 + Store 638 640 + 641: 6(int) Load 8(invocation) + 642: 72(ptr) AccessChain 27(data) 38 38 + 643: 20(ivec4) Load 642 + 644: 556(bvec4) SLessThan 643 555 + 645: 556(bvec4) GroupNonUniformLogicalOr 34 Reduce 644 + 646: 20(ivec4) Select 645 559 555 + 647: 72(ptr) AccessChain 27(data) 641 38 + Store 647 646 + 648: 6(int) Load 8(invocation) + 649: 65(ptr) AccessChain 27(data) 29 38 30 + 650: 19(int) Load 649 + 651: 19(int) GroupNonUniformBitwiseXor 34 Reduce 650 + 652: 65(ptr) AccessChain 27(data) 648 38 30 + Store 652 651 + 653: 6(int) Load 8(invocation) + 654: 72(ptr) AccessChain 27(data) 38 38 + 655: 20(ivec4) Load 654 + 656: 71(ivec2) VectorShuffle 655 655 0 1 + 657: 71(ivec2) GroupNonUniformBitwiseXor 34 Reduce 656 + 658: 72(ptr) AccessChain 27(data) 653 38 + 659: 20(ivec4) Load 658 + 660: 20(ivec4) VectorShuffle 659 657 4 5 2 3 + Store 658 660 + 661: 6(int) Load 8(invocation) + 662: 72(ptr) AccessChain 27(data) 49 38 + 663: 20(ivec4) Load 662 + 664: 81(ivec3) VectorShuffle 663 663 0 1 2 + 665: 81(ivec3) GroupNonUniformBitwiseXor 34 Reduce 664 + 666: 72(ptr) AccessChain 27(data) 661 38 + 667: 20(ivec4) Load 666 + 668: 20(ivec4) VectorShuffle 667 665 4 5 6 3 + Store 666 668 + 669: 6(int) Load 8(invocation) + 670: 72(ptr) AccessChain 27(data) 59 38 + 671: 20(ivec4) Load 670 + 672: 20(ivec4) GroupNonUniformBitwiseXor 34 Reduce 671 + 673: 72(ptr) AccessChain 27(data) 669 38 + Store 673 672 + 674: 6(int) Load 8(invocation) + 675: 95(ptr) AccessChain 27(data) 29 49 30 + 676: 6(int) Load 675 + 677: 6(int) GroupNonUniformBitwiseXor 34 Reduce 676 + 678: 95(ptr) AccessChain 27(data) 674 49 30 + Store 678 677 + 679: 6(int) Load 8(invocation) + 680: 102(ptr) AccessChain 27(data) 38 49 + 681: 21(ivec4) Load 680 + 682: 101(ivec2) VectorShuffle 681 681 0 1 + 683: 101(ivec2) GroupNonUniformBitwiseXor 34 Reduce 682 + 684: 102(ptr) AccessChain 27(data) 679 49 + 685: 21(ivec4) Load 684 + 686: 21(ivec4) VectorShuffle 685 683 4 5 2 3 + Store 684 686 + 687: 6(int) Load 8(invocation) + 688: 102(ptr) AccessChain 27(data) 49 49 + 689: 21(ivec4) Load 688 + 690: 111(ivec3) VectorShuffle 689 689 0 1 2 + 691: 111(ivec3) GroupNonUniformBitwiseXor 34 Reduce 690 + 692: 102(ptr) AccessChain 27(data) 687 49 + 693: 21(ivec4) Load 692 + 694: 21(ivec4) VectorShuffle 693 691 4 5 6 3 + Store 692 694 + 695: 6(int) Load 8(invocation) + 696: 102(ptr) AccessChain 27(data) 59 49 + 697: 21(ivec4) Load 696 + 698: 21(ivec4) GroupNonUniformBitwiseXor 34 Reduce 697 + 699: 102(ptr) AccessChain 27(data) 695 49 + Store 699 698 + 700: 6(int) Load 8(invocation) + 701: 65(ptr) AccessChain 27(data) 29 38 30 + 702: 19(int) Load 701 + 703: 521(bool) SLessThan 702 29 + 704: 521(bool) GroupNonUniformLogicalXor 34 Reduce 703 + 705: 19(int) Select 704 38 29 + 706: 65(ptr) AccessChain 27(data) 700 38 30 + Store 706 705 + 707: 6(int) Load 8(invocation) + 708: 72(ptr) AccessChain 27(data) 38 38 + 709: 20(ivec4) Load 708 + 710: 71(ivec2) VectorShuffle 709 709 0 1 + 711: 531(bvec2) SLessThan 710 530 + 712: 531(bvec2) GroupNonUniformLogicalXor 34 Reduce 711 + 713: 71(ivec2) Select 712 534 530 + 714: 72(ptr) AccessChain 27(data) 707 38 + 715: 20(ivec4) Load 714 + 716: 20(ivec4) VectorShuffle 715 713 4 5 2 3 + Store 714 716 + 717: 6(int) Load 8(invocation) + 718: 72(ptr) AccessChain 27(data) 38 38 + 719: 20(ivec4) Load 718 + 720: 81(ivec3) VectorShuffle 719 719 0 1 2 + 721: 544(bvec3) SLessThan 720 543 + 722: 544(bvec3) GroupNonUniformLogicalXor 34 Reduce 721 + 723: 81(ivec3) Select 722 547 543 + 724: 72(ptr) AccessChain 27(data) 717 38 + 725: 20(ivec4) Load 724 + 726: 20(ivec4) VectorShuffle 725 723 4 5 6 3 + Store 724 726 + 727: 6(int) Load 8(invocation) + 728: 72(ptr) AccessChain 27(data) 38 38 + 729: 20(ivec4) Load 728 + 730: 556(bvec4) SLessThan 729 555 + 731: 556(bvec4) GroupNonUniformLogicalXor 34 Reduce 730 + 732: 20(ivec4) Select 731 559 555 + 733: 72(ptr) AccessChain 27(data) 727 38 + Store 733 732 + 734: 6(int) Load 8(invocation) + 735: 31(ptr) AccessChain 27(data) 29 29 30 + 736: 17(float) Load 735 + 737: 17(float) GroupNonUniformFAdd 34 InclusiveScan 736 + 738: 31(ptr) AccessChain 27(data) 734 29 30 + Store 738 737 + 739: 6(int) Load 8(invocation) + 740: 40(ptr) AccessChain 27(data) 38 29 + 741: 18(fvec4) Load 740 + 742: 39(fvec2) VectorShuffle 741 741 0 1 + 743: 39(fvec2) GroupNonUniformFAdd 34 InclusiveScan 742 + 744: 40(ptr) AccessChain 27(data) 739 29 + 745: 18(fvec4) Load 744 + 746: 18(fvec4) VectorShuffle 745 743 4 5 2 3 + Store 744 746 + 747: 6(int) Load 8(invocation) + 748: 40(ptr) AccessChain 27(data) 49 29 + 749: 18(fvec4) Load 748 + 750: 50(fvec3) VectorShuffle 749 749 0 1 2 + 751: 50(fvec3) GroupNonUniformFAdd 34 InclusiveScan 750 + 752: 40(ptr) AccessChain 27(data) 747 29 + 753: 18(fvec4) Load 752 + 754: 18(fvec4) VectorShuffle 753 751 4 5 6 3 + Store 752 754 + 755: 6(int) Load 8(invocation) + 756: 40(ptr) AccessChain 27(data) 59 29 + 757: 18(fvec4) Load 756 + 758: 18(fvec4) GroupNonUniformFAdd 34 InclusiveScan 757 + 759: 40(ptr) AccessChain 27(data) 755 29 + Store 759 758 + 760: 6(int) Load 8(invocation) + 761: 65(ptr) AccessChain 27(data) 29 38 30 + 762: 19(int) Load 761 + 763: 19(int) GroupNonUniformIAdd 34 InclusiveScan 762 + 764: 65(ptr) AccessChain 27(data) 760 38 30 + Store 764 763 + 765: 6(int) Load 8(invocation) + 766: 72(ptr) AccessChain 27(data) 38 38 + 767: 20(ivec4) Load 766 + 768: 71(ivec2) VectorShuffle 767 767 0 1 + 769: 71(ivec2) GroupNonUniformIAdd 34 InclusiveScan 768 + 770: 72(ptr) AccessChain 27(data) 765 38 + 771: 20(ivec4) Load 770 + 772: 20(ivec4) VectorShuffle 771 769 4 5 2 3 + Store 770 772 + 773: 6(int) Load 8(invocation) + 774: 72(ptr) AccessChain 27(data) 49 38 + 775: 20(ivec4) Load 774 + 776: 81(ivec3) VectorShuffle 775 775 0 1 2 + 777: 81(ivec3) GroupNonUniformIAdd 34 InclusiveScan 776 + 778: 72(ptr) AccessChain 27(data) 773 38 + 779: 20(ivec4) Load 778 + 780: 20(ivec4) VectorShuffle 779 777 4 5 6 3 + Store 778 780 + 781: 6(int) Load 8(invocation) + 782: 72(ptr) AccessChain 27(data) 59 38 + 783: 20(ivec4) Load 782 + 784: 20(ivec4) GroupNonUniformIAdd 34 InclusiveScan 783 + 785: 72(ptr) AccessChain 27(data) 781 38 + Store 785 784 + 786: 6(int) Load 8(invocation) + 787: 95(ptr) AccessChain 27(data) 29 49 30 + 788: 6(int) Load 787 + 789: 6(int) GroupNonUniformIAdd 34 InclusiveScan 788 + 790: 95(ptr) AccessChain 27(data) 786 49 30 + Store 790 789 + 791: 6(int) Load 8(invocation) + 792: 102(ptr) AccessChain 27(data) 38 49 + 793: 21(ivec4) Load 792 + 794: 101(ivec2) VectorShuffle 793 793 0 1 + 795: 101(ivec2) GroupNonUniformIAdd 34 InclusiveScan 794 + 796: 102(ptr) AccessChain 27(data) 791 49 + 797: 21(ivec4) Load 796 + 798: 21(ivec4) VectorShuffle 797 795 4 5 2 3 + Store 796 798 + 799: 6(int) Load 8(invocation) + 800: 102(ptr) AccessChain 27(data) 49 49 + 801: 21(ivec4) Load 800 + 802: 111(ivec3) VectorShuffle 801 801 0 1 2 + 803: 111(ivec3) GroupNonUniformIAdd 34 InclusiveScan 802 + 804: 102(ptr) AccessChain 27(data) 799 49 + 805: 21(ivec4) Load 804 + 806: 21(ivec4) VectorShuffle 805 803 4 5 6 3 + Store 804 806 + 807: 6(int) Load 8(invocation) + 808: 102(ptr) AccessChain 27(data) 59 49 + 809: 21(ivec4) Load 808 + 810: 21(ivec4) GroupNonUniformIAdd 34 InclusiveScan 809 + 811: 102(ptr) AccessChain 27(data) 807 49 + Store 811 810 + 812: 6(int) Load 8(invocation) + 813: 125(ptr) AccessChain 27(data) 29 59 30 + 814: 22(float) Load 813 + 815: 22(float) GroupNonUniformFAdd 34 InclusiveScan 814 + 816: 125(ptr) AccessChain 27(data) 812 59 30 + Store 816 815 + 817: 6(int) Load 8(invocation) + 818: 132(ptr) AccessChain 27(data) 38 59 + 819: 23(fvec4) Load 818 + 820: 131(fvec2) VectorShuffle 819 819 0 1 + 821: 131(fvec2) GroupNonUniformFAdd 34 InclusiveScan 820 + 822: 132(ptr) AccessChain 27(data) 817 59 + 823: 23(fvec4) Load 822 + 824: 23(fvec4) VectorShuffle 823 821 4 5 2 3 + Store 822 824 + 825: 6(int) Load 8(invocation) + 826: 132(ptr) AccessChain 27(data) 49 59 + 827: 23(fvec4) Load 826 + 828: 141(fvec3) VectorShuffle 827 827 0 1 2 + 829: 141(fvec3) GroupNonUniformFAdd 34 InclusiveScan 828 + 830: 132(ptr) AccessChain 27(data) 825 59 + 831: 23(fvec4) Load 830 + 832: 23(fvec4) VectorShuffle 831 829 4 5 6 3 + Store 830 832 + 833: 6(int) Load 8(invocation) + 834: 132(ptr) AccessChain 27(data) 59 59 + 835: 23(fvec4) Load 834 + 836: 23(fvec4) GroupNonUniformFAdd 34 InclusiveScan 835 + 837: 132(ptr) AccessChain 27(data) 833 59 + Store 837 836 + 838: 6(int) Load 8(invocation) + 839: 31(ptr) AccessChain 27(data) 29 29 30 + 840: 17(float) Load 839 + 841: 17(float) GroupNonUniformFMul 34 InclusiveScan 840 + 842: 31(ptr) AccessChain 27(data) 838 29 30 + Store 842 841 + 843: 6(int) Load 8(invocation) + 844: 40(ptr) AccessChain 27(data) 38 29 + 845: 18(fvec4) Load 844 + 846: 39(fvec2) VectorShuffle 845 845 0 1 + 847: 39(fvec2) GroupNonUniformFMul 34 InclusiveScan 846 + 848: 40(ptr) AccessChain 27(data) 843 29 + 849: 18(fvec4) Load 848 + 850: 18(fvec4) VectorShuffle 849 847 4 5 2 3 + Store 848 850 + 851: 6(int) Load 8(invocation) + 852: 40(ptr) AccessChain 27(data) 49 29 + 853: 18(fvec4) Load 852 + 854: 50(fvec3) VectorShuffle 853 853 0 1 2 + 855: 50(fvec3) GroupNonUniformFMul 34 InclusiveScan 854 + 856: 40(ptr) AccessChain 27(data) 851 29 + 857: 18(fvec4) Load 856 + 858: 18(fvec4) VectorShuffle 857 855 4 5 6 3 + Store 856 858 + 859: 6(int) Load 8(invocation) + 860: 40(ptr) AccessChain 27(data) 59 29 + 861: 18(fvec4) Load 860 + 862: 18(fvec4) GroupNonUniformFMul 34 InclusiveScan 861 + 863: 40(ptr) AccessChain 27(data) 859 29 + Store 863 862 + 864: 6(int) Load 8(invocation) + 865: 65(ptr) AccessChain 27(data) 29 38 30 + 866: 19(int) Load 865 + 867: 19(int) GroupNonUniformIMul 34 InclusiveScan 866 + 868: 65(ptr) AccessChain 27(data) 864 38 30 + Store 868 867 + 869: 6(int) Load 8(invocation) + 870: 72(ptr) AccessChain 27(data) 38 38 + 871: 20(ivec4) Load 870 + 872: 71(ivec2) VectorShuffle 871 871 0 1 + 873: 71(ivec2) GroupNonUniformIMul 34 InclusiveScan 872 + 874: 72(ptr) AccessChain 27(data) 869 38 + 875: 20(ivec4) Load 874 + 876: 20(ivec4) VectorShuffle 875 873 4 5 2 3 + Store 874 876 + 877: 6(int) Load 8(invocation) + 878: 72(ptr) AccessChain 27(data) 49 38 + 879: 20(ivec4) Load 878 + 880: 81(ivec3) VectorShuffle 879 879 0 1 2 + 881: 81(ivec3) GroupNonUniformIMul 34 InclusiveScan 880 + 882: 72(ptr) AccessChain 27(data) 877 38 + 883: 20(ivec4) Load 882 + 884: 20(ivec4) VectorShuffle 883 881 4 5 6 3 + Store 882 884 + 885: 6(int) Load 8(invocation) + 886: 72(ptr) AccessChain 27(data) 59 38 + 887: 20(ivec4) Load 886 + 888: 20(ivec4) GroupNonUniformIMul 34 InclusiveScan 887 + 889: 72(ptr) AccessChain 27(data) 885 38 + Store 889 888 + 890: 6(int) Load 8(invocation) + 891: 95(ptr) AccessChain 27(data) 29 49 30 + 892: 6(int) Load 891 + 893: 6(int) GroupNonUniformIMul 34 InclusiveScan 892 + 894: 95(ptr) AccessChain 27(data) 890 49 30 + Store 894 893 + 895: 6(int) Load 8(invocation) + 896: 102(ptr) AccessChain 27(data) 38 49 + 897: 21(ivec4) Load 896 + 898: 101(ivec2) VectorShuffle 897 897 0 1 + 899: 101(ivec2) GroupNonUniformIMul 34 InclusiveScan 898 + 900: 102(ptr) AccessChain 27(data) 895 49 + 901: 21(ivec4) Load 900 + 902: 21(ivec4) VectorShuffle 901 899 4 5 2 3 + Store 900 902 + 903: 6(int) Load 8(invocation) + 904: 102(ptr) AccessChain 27(data) 49 49 + 905: 21(ivec4) Load 904 + 906: 111(ivec3) VectorShuffle 905 905 0 1 2 + 907: 111(ivec3) GroupNonUniformIMul 34 InclusiveScan 906 + 908: 102(ptr) AccessChain 27(data) 903 49 + 909: 21(ivec4) Load 908 + 910: 21(ivec4) VectorShuffle 909 907 4 5 6 3 + Store 908 910 + 911: 6(int) Load 8(invocation) + 912: 102(ptr) AccessChain 27(data) 59 49 + 913: 21(ivec4) Load 912 + 914: 21(ivec4) GroupNonUniformIMul 34 InclusiveScan 913 + 915: 102(ptr) AccessChain 27(data) 911 49 + Store 915 914 + 916: 6(int) Load 8(invocation) + 917: 125(ptr) AccessChain 27(data) 29 59 30 + 918: 22(float) Load 917 + 919: 22(float) GroupNonUniformFMul 34 InclusiveScan 918 + 920: 125(ptr) AccessChain 27(data) 916 59 30 + Store 920 919 + 921: 6(int) Load 8(invocation) + 922: 132(ptr) AccessChain 27(data) 38 59 + 923: 23(fvec4) Load 922 + 924: 131(fvec2) VectorShuffle 923 923 0 1 + 925: 131(fvec2) GroupNonUniformFMul 34 InclusiveScan 924 + 926: 132(ptr) AccessChain 27(data) 921 59 + 927: 23(fvec4) Load 926 + 928: 23(fvec4) VectorShuffle 927 925 4 5 2 3 + Store 926 928 + 929: 6(int) Load 8(invocation) + 930: 132(ptr) AccessChain 27(data) 49 59 + 931: 23(fvec4) Load 930 + 932: 141(fvec3) VectorShuffle 931 931 0 1 2 + 933: 141(fvec3) GroupNonUniformFMul 34 InclusiveScan 932 + 934: 132(ptr) AccessChain 27(data) 929 59 + 935: 23(fvec4) Load 934 + 936: 23(fvec4) VectorShuffle 935 933 4 5 6 3 + Store 934 936 + 937: 6(int) Load 8(invocation) + 938: 132(ptr) AccessChain 27(data) 59 59 + 939: 23(fvec4) Load 938 + 940: 23(fvec4) GroupNonUniformFMul 34 InclusiveScan 939 + 941: 132(ptr) AccessChain 27(data) 937 59 + Store 941 940 + 942: 6(int) Load 8(invocation) + 943: 31(ptr) AccessChain 27(data) 29 29 30 + 944: 17(float) Load 943 + 945: 17(float) GroupNonUniformFMin 34 InclusiveScan 944 + 946: 31(ptr) AccessChain 27(data) 942 29 30 + Store 946 945 + 947: 6(int) Load 8(invocation) + 948: 40(ptr) AccessChain 27(data) 38 29 + 949: 18(fvec4) Load 948 + 950: 39(fvec2) VectorShuffle 949 949 0 1 + 951: 39(fvec2) GroupNonUniformFMin 34 InclusiveScan 950 + 952: 40(ptr) AccessChain 27(data) 947 29 + 953: 18(fvec4) Load 952 + 954: 18(fvec4) VectorShuffle 953 951 4 5 2 3 + Store 952 954 + 955: 6(int) Load 8(invocation) + 956: 40(ptr) AccessChain 27(data) 49 29 + 957: 18(fvec4) Load 956 + 958: 50(fvec3) VectorShuffle 957 957 0 1 2 + 959: 50(fvec3) GroupNonUniformFMin 34 InclusiveScan 958 + 960: 40(ptr) AccessChain 27(data) 955 29 + 961: 18(fvec4) Load 960 + 962: 18(fvec4) VectorShuffle 961 959 4 5 6 3 + Store 960 962 + 963: 6(int) Load 8(invocation) + 964: 40(ptr) AccessChain 27(data) 59 29 + 965: 18(fvec4) Load 964 + 966: 18(fvec4) GroupNonUniformFMin 34 InclusiveScan 965 + 967: 40(ptr) AccessChain 27(data) 963 29 + Store 967 966 + 968: 6(int) Load 8(invocation) + 969: 65(ptr) AccessChain 27(data) 29 38 30 + 970: 19(int) Load 969 + 971: 19(int) GroupNonUniformSMin 34 InclusiveScan 970 + 972: 65(ptr) AccessChain 27(data) 968 38 30 + Store 972 971 + 973: 6(int) Load 8(invocation) + 974: 72(ptr) AccessChain 27(data) 38 38 + 975: 20(ivec4) Load 974 + 976: 71(ivec2) VectorShuffle 975 975 0 1 + 977: 71(ivec2) GroupNonUniformSMin 34 InclusiveScan 976 + 978: 72(ptr) AccessChain 27(data) 973 38 + 979: 20(ivec4) Load 978 + 980: 20(ivec4) VectorShuffle 979 977 4 5 2 3 + Store 978 980 + 981: 6(int) Load 8(invocation) + 982: 72(ptr) AccessChain 27(data) 49 38 + 983: 20(ivec4) Load 982 + 984: 81(ivec3) VectorShuffle 983 983 0 1 2 + 985: 81(ivec3) GroupNonUniformSMin 34 InclusiveScan 984 + 986: 72(ptr) AccessChain 27(data) 981 38 + 987: 20(ivec4) Load 986 + 988: 20(ivec4) VectorShuffle 987 985 4 5 6 3 + Store 986 988 + 989: 6(int) Load 8(invocation) + 990: 72(ptr) AccessChain 27(data) 59 38 + 991: 20(ivec4) Load 990 + 992: 20(ivec4) GroupNonUniformSMin 34 InclusiveScan 991 + 993: 72(ptr) AccessChain 27(data) 989 38 + Store 993 992 + 994: 6(int) Load 8(invocation) + 995: 95(ptr) AccessChain 27(data) 29 49 30 + 996: 6(int) Load 995 + 997: 6(int) GroupNonUniformUMin 34 InclusiveScan 996 + 998: 95(ptr) AccessChain 27(data) 994 49 30 + Store 998 997 + 999: 6(int) Load 8(invocation) + 1000: 102(ptr) AccessChain 27(data) 38 49 + 1001: 21(ivec4) Load 1000 + 1002: 101(ivec2) VectorShuffle 1001 1001 0 1 + 1003: 101(ivec2) GroupNonUniformUMin 34 InclusiveScan 1002 + 1004: 102(ptr) AccessChain 27(data) 999 49 + 1005: 21(ivec4) Load 1004 + 1006: 21(ivec4) VectorShuffle 1005 1003 4 5 2 3 + Store 1004 1006 + 1007: 6(int) Load 8(invocation) + 1008: 102(ptr) AccessChain 27(data) 49 49 + 1009: 21(ivec4) Load 1008 + 1010: 111(ivec3) VectorShuffle 1009 1009 0 1 2 + 1011: 111(ivec3) GroupNonUniformUMin 34 InclusiveScan 1010 + 1012: 102(ptr) AccessChain 27(data) 1007 49 + 1013: 21(ivec4) Load 1012 + 1014: 21(ivec4) VectorShuffle 1013 1011 4 5 6 3 + Store 1012 1014 + 1015: 6(int) Load 8(invocation) + 1016: 102(ptr) AccessChain 27(data) 59 49 + 1017: 21(ivec4) Load 1016 + 1018: 21(ivec4) GroupNonUniformUMin 34 InclusiveScan 1017 + 1019: 102(ptr) AccessChain 27(data) 1015 49 + Store 1019 1018 + 1020: 6(int) Load 8(invocation) + 1021: 125(ptr) AccessChain 27(data) 29 59 30 + 1022: 22(float) Load 1021 + 1023: 22(float) GroupNonUniformFMin 34 InclusiveScan 1022 + 1024: 125(ptr) AccessChain 27(data) 1020 59 30 + Store 1024 1023 + 1025: 6(int) Load 8(invocation) + 1026: 132(ptr) AccessChain 27(data) 38 59 + 1027: 23(fvec4) Load 1026 + 1028: 131(fvec2) VectorShuffle 1027 1027 0 1 + 1029: 131(fvec2) GroupNonUniformFMin 34 InclusiveScan 1028 + 1030: 132(ptr) AccessChain 27(data) 1025 59 + 1031: 23(fvec4) Load 1030 + 1032: 23(fvec4) VectorShuffle 1031 1029 4 5 2 3 + Store 1030 1032 + 1033: 6(int) Load 8(invocation) + 1034: 132(ptr) AccessChain 27(data) 49 59 + 1035: 23(fvec4) Load 1034 + 1036: 141(fvec3) VectorShuffle 1035 1035 0 1 2 + 1037: 141(fvec3) GroupNonUniformFMin 34 InclusiveScan 1036 + 1038: 132(ptr) AccessChain 27(data) 1033 59 + 1039: 23(fvec4) Load 1038 + 1040: 23(fvec4) VectorShuffle 1039 1037 4 5 6 3 + Store 1038 1040 + 1041: 6(int) Load 8(invocation) + 1042: 132(ptr) AccessChain 27(data) 59 59 + 1043: 23(fvec4) Load 1042 + 1044: 23(fvec4) GroupNonUniformFMin 34 InclusiveScan 1043 + 1045: 132(ptr) AccessChain 27(data) 1041 59 + Store 1045 1044 + 1046: 6(int) Load 8(invocation) + 1047: 31(ptr) AccessChain 27(data) 29 29 30 + 1048: 17(float) Load 1047 + 1049: 17(float) GroupNonUniformFMax 34 InclusiveScan 1048 + 1050: 31(ptr) AccessChain 27(data) 1046 29 30 + Store 1050 1049 + 1051: 6(int) Load 8(invocation) + 1052: 40(ptr) AccessChain 27(data) 38 29 + 1053: 18(fvec4) Load 1052 + 1054: 39(fvec2) VectorShuffle 1053 1053 0 1 + 1055: 39(fvec2) GroupNonUniformFMax 34 InclusiveScan 1054 + 1056: 40(ptr) AccessChain 27(data) 1051 29 + 1057: 18(fvec4) Load 1056 + 1058: 18(fvec4) VectorShuffle 1057 1055 4 5 2 3 + Store 1056 1058 + 1059: 6(int) Load 8(invocation) + 1060: 40(ptr) AccessChain 27(data) 49 29 + 1061: 18(fvec4) Load 1060 + 1062: 50(fvec3) VectorShuffle 1061 1061 0 1 2 + 1063: 50(fvec3) GroupNonUniformFMax 34 InclusiveScan 1062 + 1064: 40(ptr) AccessChain 27(data) 1059 29 + 1065: 18(fvec4) Load 1064 + 1066: 18(fvec4) VectorShuffle 1065 1063 4 5 6 3 + Store 1064 1066 + 1067: 6(int) Load 8(invocation) + 1068: 40(ptr) AccessChain 27(data) 59 29 + 1069: 18(fvec4) Load 1068 + 1070: 18(fvec4) GroupNonUniformFMax 34 InclusiveScan 1069 + 1071: 40(ptr) AccessChain 27(data) 1067 29 + Store 1071 1070 + 1072: 6(int) Load 8(invocation) + 1073: 65(ptr) AccessChain 27(data) 29 38 30 + 1074: 19(int) Load 1073 + 1075: 19(int) GroupNonUniformSMax 34 InclusiveScan 1074 + 1076: 65(ptr) AccessChain 27(data) 1072 38 30 + Store 1076 1075 + 1077: 6(int) Load 8(invocation) + 1078: 72(ptr) AccessChain 27(data) 38 38 + 1079: 20(ivec4) Load 1078 + 1080: 71(ivec2) VectorShuffle 1079 1079 0 1 + 1081: 71(ivec2) GroupNonUniformSMax 34 InclusiveScan 1080 + 1082: 72(ptr) AccessChain 27(data) 1077 38 + 1083: 20(ivec4) Load 1082 + 1084: 20(ivec4) VectorShuffle 1083 1081 4 5 2 3 + Store 1082 1084 + 1085: 6(int) Load 8(invocation) + 1086: 72(ptr) AccessChain 27(data) 49 38 + 1087: 20(ivec4) Load 1086 + 1088: 81(ivec3) VectorShuffle 1087 1087 0 1 2 + 1089: 81(ivec3) GroupNonUniformSMax 34 InclusiveScan 1088 + 1090: 72(ptr) AccessChain 27(data) 1085 38 + 1091: 20(ivec4) Load 1090 + 1092: 20(ivec4) VectorShuffle 1091 1089 4 5 6 3 + Store 1090 1092 + 1093: 6(int) Load 8(invocation) + 1094: 72(ptr) AccessChain 27(data) 59 38 + 1095: 20(ivec4) Load 1094 + 1096: 20(ivec4) GroupNonUniformSMax 34 InclusiveScan 1095 + 1097: 72(ptr) AccessChain 27(data) 1093 38 + Store 1097 1096 + 1098: 6(int) Load 8(invocation) + 1099: 95(ptr) AccessChain 27(data) 29 49 30 + 1100: 6(int) Load 1099 + 1101: 6(int) GroupNonUniformUMax 34 InclusiveScan 1100 + 1102: 95(ptr) AccessChain 27(data) 1098 49 30 + Store 1102 1101 + 1103: 6(int) Load 8(invocation) + 1104: 102(ptr) AccessChain 27(data) 38 49 + 1105: 21(ivec4) Load 1104 + 1106: 101(ivec2) VectorShuffle 1105 1105 0 1 + 1107: 101(ivec2) GroupNonUniformUMax 34 InclusiveScan 1106 + 1108: 102(ptr) AccessChain 27(data) 1103 49 + 1109: 21(ivec4) Load 1108 + 1110: 21(ivec4) VectorShuffle 1109 1107 4 5 2 3 + Store 1108 1110 + 1111: 6(int) Load 8(invocation) + 1112: 102(ptr) AccessChain 27(data) 49 49 + 1113: 21(ivec4) Load 1112 + 1114: 111(ivec3) VectorShuffle 1113 1113 0 1 2 + 1115: 111(ivec3) GroupNonUniformUMax 34 InclusiveScan 1114 + 1116: 102(ptr) AccessChain 27(data) 1111 49 + 1117: 21(ivec4) Load 1116 + 1118: 21(ivec4) VectorShuffle 1117 1115 4 5 6 3 + Store 1116 1118 + 1119: 6(int) Load 8(invocation) + 1120: 102(ptr) AccessChain 27(data) 59 49 + 1121: 21(ivec4) Load 1120 + 1122: 21(ivec4) GroupNonUniformUMax 34 InclusiveScan 1121 + 1123: 102(ptr) AccessChain 27(data) 1119 49 + Store 1123 1122 + 1124: 6(int) Load 8(invocation) + 1125: 125(ptr) AccessChain 27(data) 29 59 30 + 1126: 22(float) Load 1125 + 1127: 22(float) GroupNonUniformFMax 34 InclusiveScan 1126 + 1128: 125(ptr) AccessChain 27(data) 1124 59 30 + Store 1128 1127 + 1129: 6(int) Load 8(invocation) + 1130: 132(ptr) AccessChain 27(data) 38 59 + 1131: 23(fvec4) Load 1130 + 1132: 131(fvec2) VectorShuffle 1131 1131 0 1 + 1133: 131(fvec2) GroupNonUniformFMax 34 InclusiveScan 1132 + 1134: 132(ptr) AccessChain 27(data) 1129 59 + 1135: 23(fvec4) Load 1134 + 1136: 23(fvec4) VectorShuffle 1135 1133 4 5 2 3 + Store 1134 1136 + 1137: 6(int) Load 8(invocation) + 1138: 132(ptr) AccessChain 27(data) 49 59 + 1139: 23(fvec4) Load 1138 + 1140: 141(fvec3) VectorShuffle 1139 1139 0 1 2 + 1141: 141(fvec3) GroupNonUniformFMax 34 InclusiveScan 1140 + 1142: 132(ptr) AccessChain 27(data) 1137 59 + 1143: 23(fvec4) Load 1142 + 1144: 23(fvec4) VectorShuffle 1143 1141 4 5 6 3 + Store 1142 1144 + 1145: 6(int) Load 8(invocation) + 1146: 132(ptr) AccessChain 27(data) 59 59 + 1147: 23(fvec4) Load 1146 + 1148: 23(fvec4) GroupNonUniformFMax 34 InclusiveScan 1147 + 1149: 132(ptr) AccessChain 27(data) 1145 59 + Store 1149 1148 + 1150: 6(int) Load 8(invocation) + 1151: 65(ptr) AccessChain 27(data) 29 38 30 + 1152: 19(int) Load 1151 + 1153: 19(int) GroupNonUniformBitwiseAnd 34 InclusiveScan 1152 + 1154: 65(ptr) AccessChain 27(data) 1150 38 30 + Store 1154 1153 + 1155: 6(int) Load 8(invocation) + 1156: 72(ptr) AccessChain 27(data) 38 38 + 1157: 20(ivec4) Load 1156 + 1158: 71(ivec2) VectorShuffle 1157 1157 0 1 + 1159: 71(ivec2) GroupNonUniformBitwiseAnd 34 InclusiveScan 1158 + 1160: 72(ptr) AccessChain 27(data) 1155 38 + 1161: 20(ivec4) Load 1160 + 1162: 20(ivec4) VectorShuffle 1161 1159 4 5 2 3 + Store 1160 1162 + 1163: 6(int) Load 8(invocation) + 1164: 72(ptr) AccessChain 27(data) 49 38 + 1165: 20(ivec4) Load 1164 + 1166: 81(ivec3) VectorShuffle 1165 1165 0 1 2 + 1167: 81(ivec3) GroupNonUniformBitwiseAnd 34 InclusiveScan 1166 + 1168: 72(ptr) AccessChain 27(data) 1163 38 + 1169: 20(ivec4) Load 1168 + 1170: 20(ivec4) VectorShuffle 1169 1167 4 5 6 3 + Store 1168 1170 + 1171: 6(int) Load 8(invocation) + 1172: 72(ptr) AccessChain 27(data) 59 38 + 1173: 20(ivec4) Load 1172 + 1174: 20(ivec4) GroupNonUniformBitwiseAnd 34 InclusiveScan 1173 + 1175: 72(ptr) AccessChain 27(data) 1171 38 + Store 1175 1174 + 1176: 6(int) Load 8(invocation) + 1177: 95(ptr) AccessChain 27(data) 29 49 30 + 1178: 6(int) Load 1177 + 1179: 6(int) GroupNonUniformBitwiseAnd 34 InclusiveScan 1178 + 1180: 95(ptr) AccessChain 27(data) 1176 49 30 + Store 1180 1179 + 1181: 6(int) Load 8(invocation) + 1182: 102(ptr) AccessChain 27(data) 38 49 + 1183: 21(ivec4) Load 1182 + 1184: 101(ivec2) VectorShuffle 1183 1183 0 1 + 1185: 101(ivec2) GroupNonUniformBitwiseAnd 34 InclusiveScan 1184 + 1186: 102(ptr) AccessChain 27(data) 1181 49 + 1187: 21(ivec4) Load 1186 + 1188: 21(ivec4) VectorShuffle 1187 1185 4 5 2 3 + Store 1186 1188 + 1189: 6(int) Load 8(invocation) + 1190: 102(ptr) AccessChain 27(data) 49 49 + 1191: 21(ivec4) Load 1190 + 1192: 111(ivec3) VectorShuffle 1191 1191 0 1 2 + 1193: 111(ivec3) GroupNonUniformBitwiseAnd 34 InclusiveScan 1192 + 1194: 102(ptr) AccessChain 27(data) 1189 49 + 1195: 21(ivec4) Load 1194 + 1196: 21(ivec4) VectorShuffle 1195 1193 4 5 6 3 + Store 1194 1196 + 1197: 6(int) Load 8(invocation) + 1198: 102(ptr) AccessChain 27(data) 59 49 + 1199: 21(ivec4) Load 1198 + 1200: 21(ivec4) GroupNonUniformBitwiseAnd 34 InclusiveScan 1199 + 1201: 102(ptr) AccessChain 27(data) 1197 49 + Store 1201 1200 + 1202: 6(int) Load 8(invocation) + 1203: 65(ptr) AccessChain 27(data) 29 38 30 + 1204: 19(int) Load 1203 + 1205: 521(bool) SLessThan 1204 29 + 1206: 521(bool) GroupNonUniformLogicalAnd 34 InclusiveScan 1205 + 1207: 19(int) Select 1206 38 29 + 1208: 65(ptr) AccessChain 27(data) 1202 38 30 + Store 1208 1207 + 1209: 6(int) Load 8(invocation) + 1210: 72(ptr) AccessChain 27(data) 38 38 + 1211: 20(ivec4) Load 1210 + 1212: 71(ivec2) VectorShuffle 1211 1211 0 1 + 1213: 531(bvec2) SLessThan 1212 530 + 1214: 531(bvec2) GroupNonUniformLogicalAnd 34 InclusiveScan 1213 + 1215: 71(ivec2) Select 1214 534 530 + 1216: 72(ptr) AccessChain 27(data) 1209 38 + 1217: 20(ivec4) Load 1216 + 1218: 20(ivec4) VectorShuffle 1217 1215 4 5 2 3 + Store 1216 1218 + 1219: 6(int) Load 8(invocation) + 1220: 72(ptr) AccessChain 27(data) 38 38 + 1221: 20(ivec4) Load 1220 + 1222: 81(ivec3) VectorShuffle 1221 1221 0 1 2 + 1223: 544(bvec3) SLessThan 1222 543 + 1224: 544(bvec3) GroupNonUniformLogicalAnd 34 InclusiveScan 1223 + 1225: 81(ivec3) Select 1224 547 543 + 1226: 72(ptr) AccessChain 27(data) 1219 38 + 1227: 20(ivec4) Load 1226 + 1228: 20(ivec4) VectorShuffle 1227 1225 4 5 6 3 + Store 1226 1228 + 1229: 6(int) Load 8(invocation) + 1230: 72(ptr) AccessChain 27(data) 38 38 + 1231: 20(ivec4) Load 1230 + 1232: 556(bvec4) SLessThan 1231 555 + 1233: 556(bvec4) GroupNonUniformLogicalAnd 34 InclusiveScan 1232 + 1234: 20(ivec4) Select 1233 559 555 + 1235: 72(ptr) AccessChain 27(data) 1229 38 + Store 1235 1234 + 1236: 6(int) Load 8(invocation) + 1237: 65(ptr) AccessChain 27(data) 29 38 30 + 1238: 19(int) Load 1237 + 1239: 19(int) GroupNonUniformBitwiseOr 34 InclusiveScan 1238 + 1240: 65(ptr) AccessChain 27(data) 1236 38 30 + Store 1240 1239 + 1241: 6(int) Load 8(invocation) + 1242: 72(ptr) AccessChain 27(data) 38 38 + 1243: 20(ivec4) Load 1242 + 1244: 71(ivec2) VectorShuffle 1243 1243 0 1 + 1245: 71(ivec2) GroupNonUniformBitwiseOr 34 InclusiveScan 1244 + 1246: 72(ptr) AccessChain 27(data) 1241 38 + 1247: 20(ivec4) Load 1246 + 1248: 20(ivec4) VectorShuffle 1247 1245 4 5 2 3 + Store 1246 1248 + 1249: 6(int) Load 8(invocation) + 1250: 72(ptr) AccessChain 27(data) 49 38 + 1251: 20(ivec4) Load 1250 + 1252: 81(ivec3) VectorShuffle 1251 1251 0 1 2 + 1253: 81(ivec3) GroupNonUniformBitwiseOr 34 InclusiveScan 1252 + 1254: 72(ptr) AccessChain 27(data) 1249 38 + 1255: 20(ivec4) Load 1254 + 1256: 20(ivec4) VectorShuffle 1255 1253 4 5 6 3 + Store 1254 1256 + 1257: 6(int) Load 8(invocation) + 1258: 72(ptr) AccessChain 27(data) 59 38 + 1259: 20(ivec4) Load 1258 + 1260: 20(ivec4) GroupNonUniformBitwiseOr 34 InclusiveScan 1259 + 1261: 72(ptr) AccessChain 27(data) 1257 38 + Store 1261 1260 + 1262: 6(int) Load 8(invocation) + 1263: 95(ptr) AccessChain 27(data) 29 49 30 + 1264: 6(int) Load 1263 + 1265: 6(int) GroupNonUniformBitwiseOr 34 InclusiveScan 1264 + 1266: 95(ptr) AccessChain 27(data) 1262 49 30 + Store 1266 1265 + 1267: 6(int) Load 8(invocation) + 1268: 102(ptr) AccessChain 27(data) 38 49 + 1269: 21(ivec4) Load 1268 + 1270: 101(ivec2) VectorShuffle 1269 1269 0 1 + 1271: 101(ivec2) GroupNonUniformBitwiseOr 34 InclusiveScan 1270 + 1272: 102(ptr) AccessChain 27(data) 1267 49 + 1273: 21(ivec4) Load 1272 + 1274: 21(ivec4) VectorShuffle 1273 1271 4 5 2 3 + Store 1272 1274 + 1275: 6(int) Load 8(invocation) + 1276: 102(ptr) AccessChain 27(data) 49 49 + 1277: 21(ivec4) Load 1276 + 1278: 111(ivec3) VectorShuffle 1277 1277 0 1 2 + 1279: 111(ivec3) GroupNonUniformBitwiseOr 34 InclusiveScan 1278 + 1280: 102(ptr) AccessChain 27(data) 1275 49 + 1281: 21(ivec4) Load 1280 + 1282: 21(ivec4) VectorShuffle 1281 1279 4 5 6 3 + Store 1280 1282 + 1283: 6(int) Load 8(invocation) + 1284: 102(ptr) AccessChain 27(data) 59 49 + 1285: 21(ivec4) Load 1284 + 1286: 21(ivec4) GroupNonUniformBitwiseOr 34 InclusiveScan 1285 + 1287: 102(ptr) AccessChain 27(data) 1283 49 + Store 1287 1286 + 1288: 6(int) Load 8(invocation) + 1289: 65(ptr) AccessChain 27(data) 29 38 30 + 1290: 19(int) Load 1289 + 1291: 521(bool) SLessThan 1290 29 + 1292: 521(bool) GroupNonUniformLogicalOr 34 InclusiveScan 1291 + 1293: 19(int) Select 1292 38 29 + 1294: 65(ptr) AccessChain 27(data) 1288 38 30 + Store 1294 1293 + 1295: 6(int) Load 8(invocation) + 1296: 72(ptr) AccessChain 27(data) 38 38 + 1297: 20(ivec4) Load 1296 + 1298: 71(ivec2) VectorShuffle 1297 1297 0 1 + 1299: 531(bvec2) SLessThan 1298 530 + 1300: 531(bvec2) GroupNonUniformLogicalOr 34 InclusiveScan 1299 + 1301: 71(ivec2) Select 1300 534 530 + 1302: 72(ptr) AccessChain 27(data) 1295 38 + 1303: 20(ivec4) Load 1302 + 1304: 20(ivec4) VectorShuffle 1303 1301 4 5 2 3 + Store 1302 1304 + 1305: 6(int) Load 8(invocation) + 1306: 72(ptr) AccessChain 27(data) 38 38 + 1307: 20(ivec4) Load 1306 + 1308: 81(ivec3) VectorShuffle 1307 1307 0 1 2 + 1309: 544(bvec3) SLessThan 1308 543 + 1310: 544(bvec3) GroupNonUniformLogicalOr 34 InclusiveScan 1309 + 1311: 81(ivec3) Select 1310 547 543 + 1312: 72(ptr) AccessChain 27(data) 1305 38 + 1313: 20(ivec4) Load 1312 + 1314: 20(ivec4) VectorShuffle 1313 1311 4 5 6 3 + Store 1312 1314 + 1315: 6(int) Load 8(invocation) + 1316: 72(ptr) AccessChain 27(data) 38 38 + 1317: 20(ivec4) Load 1316 + 1318: 556(bvec4) SLessThan 1317 555 + 1319: 556(bvec4) GroupNonUniformLogicalOr 34 InclusiveScan 1318 + 1320: 20(ivec4) Select 1319 559 555 + 1321: 72(ptr) AccessChain 27(data) 1315 38 + Store 1321 1320 + 1322: 6(int) Load 8(invocation) + 1323: 65(ptr) AccessChain 27(data) 29 38 30 + 1324: 19(int) Load 1323 + 1325: 19(int) GroupNonUniformBitwiseXor 34 InclusiveScan 1324 + 1326: 65(ptr) AccessChain 27(data) 1322 38 30 + Store 1326 1325 + 1327: 6(int) Load 8(invocation) + 1328: 72(ptr) AccessChain 27(data) 38 38 + 1329: 20(ivec4) Load 1328 + 1330: 71(ivec2) VectorShuffle 1329 1329 0 1 + 1331: 71(ivec2) GroupNonUniformBitwiseXor 34 InclusiveScan 1330 + 1332: 72(ptr) AccessChain 27(data) 1327 38 + 1333: 20(ivec4) Load 1332 + 1334: 20(ivec4) VectorShuffle 1333 1331 4 5 2 3 + Store 1332 1334 + 1335: 6(int) Load 8(invocation) + 1336: 72(ptr) AccessChain 27(data) 49 38 + 1337: 20(ivec4) Load 1336 + 1338: 81(ivec3) VectorShuffle 1337 1337 0 1 2 + 1339: 81(ivec3) GroupNonUniformBitwiseXor 34 InclusiveScan 1338 + 1340: 72(ptr) AccessChain 27(data) 1335 38 + 1341: 20(ivec4) Load 1340 + 1342: 20(ivec4) VectorShuffle 1341 1339 4 5 6 3 + Store 1340 1342 + 1343: 6(int) Load 8(invocation) + 1344: 72(ptr) AccessChain 27(data) 59 38 + 1345: 20(ivec4) Load 1344 + 1346: 20(ivec4) GroupNonUniformBitwiseXor 34 InclusiveScan 1345 + 1347: 72(ptr) AccessChain 27(data) 1343 38 + Store 1347 1346 + 1348: 6(int) Load 8(invocation) + 1349: 95(ptr) AccessChain 27(data) 29 49 30 + 1350: 6(int) Load 1349 + 1351: 6(int) GroupNonUniformBitwiseXor 34 InclusiveScan 1350 + 1352: 95(ptr) AccessChain 27(data) 1348 49 30 + Store 1352 1351 + 1353: 6(int) Load 8(invocation) + 1354: 102(ptr) AccessChain 27(data) 38 49 + 1355: 21(ivec4) Load 1354 + 1356: 101(ivec2) VectorShuffle 1355 1355 0 1 + 1357: 101(ivec2) GroupNonUniformBitwiseXor 34 InclusiveScan 1356 + 1358: 102(ptr) AccessChain 27(data) 1353 49 + 1359: 21(ivec4) Load 1358 + 1360: 21(ivec4) VectorShuffle 1359 1357 4 5 2 3 + Store 1358 1360 + 1361: 6(int) Load 8(invocation) + 1362: 102(ptr) AccessChain 27(data) 49 49 + 1363: 21(ivec4) Load 1362 + 1364: 111(ivec3) VectorShuffle 1363 1363 0 1 2 + 1365: 111(ivec3) GroupNonUniformBitwiseXor 34 InclusiveScan 1364 + 1366: 102(ptr) AccessChain 27(data) 1361 49 + 1367: 21(ivec4) Load 1366 + 1368: 21(ivec4) VectorShuffle 1367 1365 4 5 6 3 + Store 1366 1368 + 1369: 6(int) Load 8(invocation) + 1370: 102(ptr) AccessChain 27(data) 59 49 + 1371: 21(ivec4) Load 1370 + 1372: 21(ivec4) GroupNonUniformBitwiseXor 34 InclusiveScan 1371 + 1373: 102(ptr) AccessChain 27(data) 1369 49 + Store 1373 1372 + 1374: 6(int) Load 8(invocation) + 1375: 65(ptr) AccessChain 27(data) 29 38 30 + 1376: 19(int) Load 1375 + 1377: 521(bool) SLessThan 1376 29 + 1378: 521(bool) GroupNonUniformLogicalXor 34 InclusiveScan 1377 + 1379: 19(int) Select 1378 38 29 + 1380: 65(ptr) AccessChain 27(data) 1374 38 30 + Store 1380 1379 + 1381: 6(int) Load 8(invocation) + 1382: 72(ptr) AccessChain 27(data) 38 38 + 1383: 20(ivec4) Load 1382 + 1384: 71(ivec2) VectorShuffle 1383 1383 0 1 + 1385: 531(bvec2) SLessThan 1384 530 + 1386: 531(bvec2) GroupNonUniformLogicalXor 34 InclusiveScan 1385 + 1387: 71(ivec2) Select 1386 534 530 + 1388: 72(ptr) AccessChain 27(data) 1381 38 + 1389: 20(ivec4) Load 1388 + 1390: 20(ivec4) VectorShuffle 1389 1387 4 5 2 3 + Store 1388 1390 + 1391: 6(int) Load 8(invocation) + 1392: 72(ptr) AccessChain 27(data) 38 38 + 1393: 20(ivec4) Load 1392 + 1394: 81(ivec3) VectorShuffle 1393 1393 0 1 2 + 1395: 544(bvec3) SLessThan 1394 543 + 1396: 544(bvec3) GroupNonUniformLogicalXor 34 InclusiveScan 1395 + 1397: 81(ivec3) Select 1396 547 543 + 1398: 72(ptr) AccessChain 27(data) 1391 38 + 1399: 20(ivec4) Load 1398 + 1400: 20(ivec4) VectorShuffle 1399 1397 4 5 6 3 + Store 1398 1400 + 1401: 6(int) Load 8(invocation) + 1402: 72(ptr) AccessChain 27(data) 38 38 + 1403: 20(ivec4) Load 1402 + 1404: 556(bvec4) SLessThan 1403 555 + 1405: 556(bvec4) GroupNonUniformLogicalXor 34 InclusiveScan 1404 + 1406: 20(ivec4) Select 1405 559 555 + 1407: 72(ptr) AccessChain 27(data) 1401 38 + Store 1407 1406 + 1408: 6(int) Load 8(invocation) + 1409: 31(ptr) AccessChain 27(data) 29 29 30 + 1410: 17(float) Load 1409 + 1411: 17(float) GroupNonUniformFAdd 34 ExclusiveScan 1410 + 1412: 31(ptr) AccessChain 27(data) 1408 29 30 + Store 1412 1411 + 1413: 6(int) Load 8(invocation) + 1414: 40(ptr) AccessChain 27(data) 38 29 + 1415: 18(fvec4) Load 1414 + 1416: 39(fvec2) VectorShuffle 1415 1415 0 1 + 1417: 39(fvec2) GroupNonUniformFAdd 34 ExclusiveScan 1416 + 1418: 40(ptr) AccessChain 27(data) 1413 29 + 1419: 18(fvec4) Load 1418 + 1420: 18(fvec4) VectorShuffle 1419 1417 4 5 2 3 + Store 1418 1420 + 1421: 6(int) Load 8(invocation) + 1422: 40(ptr) AccessChain 27(data) 49 29 + 1423: 18(fvec4) Load 1422 + 1424: 50(fvec3) VectorShuffle 1423 1423 0 1 2 + 1425: 50(fvec3) GroupNonUniformFAdd 34 ExclusiveScan 1424 + 1426: 40(ptr) AccessChain 27(data) 1421 29 + 1427: 18(fvec4) Load 1426 + 1428: 18(fvec4) VectorShuffle 1427 1425 4 5 6 3 + Store 1426 1428 + 1429: 6(int) Load 8(invocation) + 1430: 40(ptr) AccessChain 27(data) 59 29 + 1431: 18(fvec4) Load 1430 + 1432: 18(fvec4) GroupNonUniformFAdd 34 ExclusiveScan 1431 + 1433: 40(ptr) AccessChain 27(data) 1429 29 + Store 1433 1432 + 1434: 6(int) Load 8(invocation) + 1435: 65(ptr) AccessChain 27(data) 29 38 30 + 1436: 19(int) Load 1435 + 1437: 19(int) GroupNonUniformIAdd 34 ExclusiveScan 1436 + 1438: 65(ptr) AccessChain 27(data) 1434 38 30 + Store 1438 1437 + 1439: 6(int) Load 8(invocation) + 1440: 72(ptr) AccessChain 27(data) 38 38 + 1441: 20(ivec4) Load 1440 + 1442: 71(ivec2) VectorShuffle 1441 1441 0 1 + 1443: 71(ivec2) GroupNonUniformIAdd 34 ExclusiveScan 1442 + 1444: 72(ptr) AccessChain 27(data) 1439 38 + 1445: 20(ivec4) Load 1444 + 1446: 20(ivec4) VectorShuffle 1445 1443 4 5 2 3 + Store 1444 1446 + 1447: 6(int) Load 8(invocation) + 1448: 72(ptr) AccessChain 27(data) 49 38 + 1449: 20(ivec4) Load 1448 + 1450: 81(ivec3) VectorShuffle 1449 1449 0 1 2 + 1451: 81(ivec3) GroupNonUniformIAdd 34 ExclusiveScan 1450 + 1452: 72(ptr) AccessChain 27(data) 1447 38 + 1453: 20(ivec4) Load 1452 + 1454: 20(ivec4) VectorShuffle 1453 1451 4 5 6 3 + Store 1452 1454 + 1455: 6(int) Load 8(invocation) + 1456: 72(ptr) AccessChain 27(data) 59 38 + 1457: 20(ivec4) Load 1456 + 1458: 20(ivec4) GroupNonUniformIAdd 34 ExclusiveScan 1457 + 1459: 72(ptr) AccessChain 27(data) 1455 38 + Store 1459 1458 + 1460: 6(int) Load 8(invocation) + 1461: 95(ptr) AccessChain 27(data) 29 49 30 + 1462: 6(int) Load 1461 + 1463: 6(int) GroupNonUniformIAdd 34 ExclusiveScan 1462 + 1464: 95(ptr) AccessChain 27(data) 1460 49 30 + Store 1464 1463 + 1465: 6(int) Load 8(invocation) + 1466: 102(ptr) AccessChain 27(data) 38 49 + 1467: 21(ivec4) Load 1466 + 1468: 101(ivec2) VectorShuffle 1467 1467 0 1 + 1469: 101(ivec2) GroupNonUniformIAdd 34 ExclusiveScan 1468 + 1470: 102(ptr) AccessChain 27(data) 1465 49 + 1471: 21(ivec4) Load 1470 + 1472: 21(ivec4) VectorShuffle 1471 1469 4 5 2 3 + Store 1470 1472 + 1473: 6(int) Load 8(invocation) + 1474: 102(ptr) AccessChain 27(data) 49 49 + 1475: 21(ivec4) Load 1474 + 1476: 111(ivec3) VectorShuffle 1475 1475 0 1 2 + 1477: 111(ivec3) GroupNonUniformIAdd 34 ExclusiveScan 1476 + 1478: 102(ptr) AccessChain 27(data) 1473 49 + 1479: 21(ivec4) Load 1478 + 1480: 21(ivec4) VectorShuffle 1479 1477 4 5 6 3 + Store 1478 1480 + 1481: 6(int) Load 8(invocation) + 1482: 102(ptr) AccessChain 27(data) 59 49 + 1483: 21(ivec4) Load 1482 + 1484: 21(ivec4) GroupNonUniformIAdd 34 ExclusiveScan 1483 + 1485: 102(ptr) AccessChain 27(data) 1481 49 + Store 1485 1484 + 1486: 6(int) Load 8(invocation) + 1487: 125(ptr) AccessChain 27(data) 29 59 30 + 1488: 22(float) Load 1487 + 1489: 22(float) GroupNonUniformFAdd 34 ExclusiveScan 1488 + 1490: 125(ptr) AccessChain 27(data) 1486 59 30 + Store 1490 1489 + 1491: 6(int) Load 8(invocation) + 1492: 132(ptr) AccessChain 27(data) 38 59 + 1493: 23(fvec4) Load 1492 + 1494: 131(fvec2) VectorShuffle 1493 1493 0 1 + 1495: 131(fvec2) GroupNonUniformFAdd 34 ExclusiveScan 1494 + 1496: 132(ptr) AccessChain 27(data) 1491 59 + 1497: 23(fvec4) Load 1496 + 1498: 23(fvec4) VectorShuffle 1497 1495 4 5 2 3 + Store 1496 1498 + 1499: 6(int) Load 8(invocation) + 1500: 132(ptr) AccessChain 27(data) 49 59 + 1501: 23(fvec4) Load 1500 + 1502: 141(fvec3) VectorShuffle 1501 1501 0 1 2 + 1503: 141(fvec3) GroupNonUniformFAdd 34 ExclusiveScan 1502 + 1504: 132(ptr) AccessChain 27(data) 1499 59 + 1505: 23(fvec4) Load 1504 + 1506: 23(fvec4) VectorShuffle 1505 1503 4 5 6 3 + Store 1504 1506 + 1507: 6(int) Load 8(invocation) + 1508: 132(ptr) AccessChain 27(data) 59 59 + 1509: 23(fvec4) Load 1508 + 1510: 23(fvec4) GroupNonUniformFAdd 34 ExclusiveScan 1509 + 1511: 132(ptr) AccessChain 27(data) 1507 59 + Store 1511 1510 + 1512: 6(int) Load 8(invocation) + 1513: 31(ptr) AccessChain 27(data) 29 29 30 + 1514: 17(float) Load 1513 + 1515: 17(float) GroupNonUniformFMul 34 ExclusiveScan 1514 + 1516: 31(ptr) AccessChain 27(data) 1512 29 30 + Store 1516 1515 + 1517: 6(int) Load 8(invocation) + 1518: 40(ptr) AccessChain 27(data) 38 29 + 1519: 18(fvec4) Load 1518 + 1520: 39(fvec2) VectorShuffle 1519 1519 0 1 + 1521: 39(fvec2) GroupNonUniformFMul 34 ExclusiveScan 1520 + 1522: 40(ptr) AccessChain 27(data) 1517 29 + 1523: 18(fvec4) Load 1522 + 1524: 18(fvec4) VectorShuffle 1523 1521 4 5 2 3 + Store 1522 1524 + 1525: 6(int) Load 8(invocation) + 1526: 40(ptr) AccessChain 27(data) 49 29 + 1527: 18(fvec4) Load 1526 + 1528: 50(fvec3) VectorShuffle 1527 1527 0 1 2 + 1529: 50(fvec3) GroupNonUniformFMul 34 ExclusiveScan 1528 + 1530: 40(ptr) AccessChain 27(data) 1525 29 + 1531: 18(fvec4) Load 1530 + 1532: 18(fvec4) VectorShuffle 1531 1529 4 5 6 3 + Store 1530 1532 + 1533: 6(int) Load 8(invocation) + 1534: 40(ptr) AccessChain 27(data) 59 29 + 1535: 18(fvec4) Load 1534 + 1536: 18(fvec4) GroupNonUniformFMul 34 ExclusiveScan 1535 + 1537: 40(ptr) AccessChain 27(data) 1533 29 + Store 1537 1536 + 1538: 6(int) Load 8(invocation) + 1539: 65(ptr) AccessChain 27(data) 29 38 30 + 1540: 19(int) Load 1539 + 1541: 19(int) GroupNonUniformIMul 34 ExclusiveScan 1540 + 1542: 65(ptr) AccessChain 27(data) 1538 38 30 + Store 1542 1541 + 1543: 6(int) Load 8(invocation) + 1544: 72(ptr) AccessChain 27(data) 38 38 + 1545: 20(ivec4) Load 1544 + 1546: 71(ivec2) VectorShuffle 1545 1545 0 1 + 1547: 71(ivec2) GroupNonUniformIMul 34 ExclusiveScan 1546 + 1548: 72(ptr) AccessChain 27(data) 1543 38 + 1549: 20(ivec4) Load 1548 + 1550: 20(ivec4) VectorShuffle 1549 1547 4 5 2 3 + Store 1548 1550 + 1551: 6(int) Load 8(invocation) + 1552: 72(ptr) AccessChain 27(data) 49 38 + 1553: 20(ivec4) Load 1552 + 1554: 81(ivec3) VectorShuffle 1553 1553 0 1 2 + 1555: 81(ivec3) GroupNonUniformIMul 34 ExclusiveScan 1554 + 1556: 72(ptr) AccessChain 27(data) 1551 38 + 1557: 20(ivec4) Load 1556 + 1558: 20(ivec4) VectorShuffle 1557 1555 4 5 6 3 + Store 1556 1558 + 1559: 6(int) Load 8(invocation) + 1560: 72(ptr) AccessChain 27(data) 59 38 + 1561: 20(ivec4) Load 1560 + 1562: 20(ivec4) GroupNonUniformIMul 34 ExclusiveScan 1561 + 1563: 72(ptr) AccessChain 27(data) 1559 38 + Store 1563 1562 + 1564: 6(int) Load 8(invocation) + 1565: 95(ptr) AccessChain 27(data) 29 49 30 + 1566: 6(int) Load 1565 + 1567: 6(int) GroupNonUniformIMul 34 ExclusiveScan 1566 + 1568: 95(ptr) AccessChain 27(data) 1564 49 30 + Store 1568 1567 + 1569: 6(int) Load 8(invocation) + 1570: 102(ptr) AccessChain 27(data) 38 49 + 1571: 21(ivec4) Load 1570 + 1572: 101(ivec2) VectorShuffle 1571 1571 0 1 + 1573: 101(ivec2) GroupNonUniformIMul 34 ExclusiveScan 1572 + 1574: 102(ptr) AccessChain 27(data) 1569 49 + 1575: 21(ivec4) Load 1574 + 1576: 21(ivec4) VectorShuffle 1575 1573 4 5 2 3 + Store 1574 1576 + 1577: 6(int) Load 8(invocation) + 1578: 102(ptr) AccessChain 27(data) 49 49 + 1579: 21(ivec4) Load 1578 + 1580: 111(ivec3) VectorShuffle 1579 1579 0 1 2 + 1581: 111(ivec3) GroupNonUniformIMul 34 ExclusiveScan 1580 + 1582: 102(ptr) AccessChain 27(data) 1577 49 + 1583: 21(ivec4) Load 1582 + 1584: 21(ivec4) VectorShuffle 1583 1581 4 5 6 3 + Store 1582 1584 + 1585: 6(int) Load 8(invocation) + 1586: 102(ptr) AccessChain 27(data) 59 49 + 1587: 21(ivec4) Load 1586 + 1588: 21(ivec4) GroupNonUniformIMul 34 ExclusiveScan 1587 + 1589: 102(ptr) AccessChain 27(data) 1585 49 + Store 1589 1588 + 1590: 6(int) Load 8(invocation) + 1591: 125(ptr) AccessChain 27(data) 29 59 30 + 1592: 22(float) Load 1591 + 1593: 22(float) GroupNonUniformFMul 34 ExclusiveScan 1592 + 1594: 125(ptr) AccessChain 27(data) 1590 59 30 + Store 1594 1593 + 1595: 6(int) Load 8(invocation) + 1596: 132(ptr) AccessChain 27(data) 38 59 + 1597: 23(fvec4) Load 1596 + 1598: 131(fvec2) VectorShuffle 1597 1597 0 1 + 1599: 131(fvec2) GroupNonUniformFMul 34 ExclusiveScan 1598 + 1600: 132(ptr) AccessChain 27(data) 1595 59 + 1601: 23(fvec4) Load 1600 + 1602: 23(fvec4) VectorShuffle 1601 1599 4 5 2 3 + Store 1600 1602 + 1603: 6(int) Load 8(invocation) + 1604: 132(ptr) AccessChain 27(data) 49 59 + 1605: 23(fvec4) Load 1604 + 1606: 141(fvec3) VectorShuffle 1605 1605 0 1 2 + 1607: 141(fvec3) GroupNonUniformFMul 34 ExclusiveScan 1606 + 1608: 132(ptr) AccessChain 27(data) 1603 59 + 1609: 23(fvec4) Load 1608 + 1610: 23(fvec4) VectorShuffle 1609 1607 4 5 6 3 + Store 1608 1610 + 1611: 6(int) Load 8(invocation) + 1612: 132(ptr) AccessChain 27(data) 59 59 + 1613: 23(fvec4) Load 1612 + 1614: 23(fvec4) GroupNonUniformFMul 34 ExclusiveScan 1613 + 1615: 132(ptr) AccessChain 27(data) 1611 59 + Store 1615 1614 + 1616: 6(int) Load 8(invocation) + 1617: 31(ptr) AccessChain 27(data) 29 29 30 + 1618: 17(float) Load 1617 + 1619: 17(float) GroupNonUniformFMin 34 ExclusiveScan 1618 + 1620: 31(ptr) AccessChain 27(data) 1616 29 30 + Store 1620 1619 + 1621: 6(int) Load 8(invocation) + 1622: 40(ptr) AccessChain 27(data) 38 29 + 1623: 18(fvec4) Load 1622 + 1624: 39(fvec2) VectorShuffle 1623 1623 0 1 + 1625: 39(fvec2) GroupNonUniformFMin 34 ExclusiveScan 1624 + 1626: 40(ptr) AccessChain 27(data) 1621 29 + 1627: 18(fvec4) Load 1626 + 1628: 18(fvec4) VectorShuffle 1627 1625 4 5 2 3 + Store 1626 1628 + 1629: 6(int) Load 8(invocation) + 1630: 40(ptr) AccessChain 27(data) 49 29 + 1631: 18(fvec4) Load 1630 + 1632: 50(fvec3) VectorShuffle 1631 1631 0 1 2 + 1633: 50(fvec3) GroupNonUniformFMin 34 ExclusiveScan 1632 + 1634: 40(ptr) AccessChain 27(data) 1629 29 + 1635: 18(fvec4) Load 1634 + 1636: 18(fvec4) VectorShuffle 1635 1633 4 5 6 3 + Store 1634 1636 + 1637: 6(int) Load 8(invocation) + 1638: 40(ptr) AccessChain 27(data) 59 29 + 1639: 18(fvec4) Load 1638 + 1640: 18(fvec4) GroupNonUniformFMin 34 ExclusiveScan 1639 + 1641: 40(ptr) AccessChain 27(data) 1637 29 + Store 1641 1640 + 1642: 6(int) Load 8(invocation) + 1643: 65(ptr) AccessChain 27(data) 29 38 30 + 1644: 19(int) Load 1643 + 1645: 19(int) GroupNonUniformSMin 34 ExclusiveScan 1644 + 1646: 65(ptr) AccessChain 27(data) 1642 38 30 + Store 1646 1645 + 1647: 6(int) Load 8(invocation) + 1648: 72(ptr) AccessChain 27(data) 38 38 + 1649: 20(ivec4) Load 1648 + 1650: 71(ivec2) VectorShuffle 1649 1649 0 1 + 1651: 71(ivec2) GroupNonUniformSMin 34 ExclusiveScan 1650 + 1652: 72(ptr) AccessChain 27(data) 1647 38 + 1653: 20(ivec4) Load 1652 + 1654: 20(ivec4) VectorShuffle 1653 1651 4 5 2 3 + Store 1652 1654 + 1655: 6(int) Load 8(invocation) + 1656: 72(ptr) AccessChain 27(data) 49 38 + 1657: 20(ivec4) Load 1656 + 1658: 81(ivec3) VectorShuffle 1657 1657 0 1 2 + 1659: 81(ivec3) GroupNonUniformSMin 34 ExclusiveScan 1658 + 1660: 72(ptr) AccessChain 27(data) 1655 38 + 1661: 20(ivec4) Load 1660 + 1662: 20(ivec4) VectorShuffle 1661 1659 4 5 6 3 + Store 1660 1662 + 1663: 6(int) Load 8(invocation) + 1664: 72(ptr) AccessChain 27(data) 59 38 + 1665: 20(ivec4) Load 1664 + 1666: 20(ivec4) GroupNonUniformSMin 34 ExclusiveScan 1665 + 1667: 72(ptr) AccessChain 27(data) 1663 38 + Store 1667 1666 + 1668: 6(int) Load 8(invocation) + 1669: 95(ptr) AccessChain 27(data) 29 49 30 + 1670: 6(int) Load 1669 + 1671: 6(int) GroupNonUniformUMin 34 ExclusiveScan 1670 + 1672: 95(ptr) AccessChain 27(data) 1668 49 30 + Store 1672 1671 + 1673: 6(int) Load 8(invocation) + 1674: 102(ptr) AccessChain 27(data) 38 49 + 1675: 21(ivec4) Load 1674 + 1676: 101(ivec2) VectorShuffle 1675 1675 0 1 + 1677: 101(ivec2) GroupNonUniformUMin 34 ExclusiveScan 1676 + 1678: 102(ptr) AccessChain 27(data) 1673 49 + 1679: 21(ivec4) Load 1678 + 1680: 21(ivec4) VectorShuffle 1679 1677 4 5 2 3 + Store 1678 1680 + 1681: 6(int) Load 8(invocation) + 1682: 102(ptr) AccessChain 27(data) 49 49 + 1683: 21(ivec4) Load 1682 + 1684: 111(ivec3) VectorShuffle 1683 1683 0 1 2 + 1685: 111(ivec3) GroupNonUniformUMin 34 ExclusiveScan 1684 + 1686: 102(ptr) AccessChain 27(data) 1681 49 + 1687: 21(ivec4) Load 1686 + 1688: 21(ivec4) VectorShuffle 1687 1685 4 5 6 3 + Store 1686 1688 + 1689: 6(int) Load 8(invocation) + 1690: 102(ptr) AccessChain 27(data) 59 49 + 1691: 21(ivec4) Load 1690 + 1692: 21(ivec4) GroupNonUniformUMin 34 ExclusiveScan 1691 + 1693: 102(ptr) AccessChain 27(data) 1689 49 + Store 1693 1692 + 1694: 6(int) Load 8(invocation) + 1695: 125(ptr) AccessChain 27(data) 29 59 30 + 1696: 22(float) Load 1695 + 1697: 22(float) GroupNonUniformFMin 34 ExclusiveScan 1696 + 1698: 125(ptr) AccessChain 27(data) 1694 59 30 + Store 1698 1697 + 1699: 6(int) Load 8(invocation) + 1700: 132(ptr) AccessChain 27(data) 38 59 + 1701: 23(fvec4) Load 1700 + 1702: 131(fvec2) VectorShuffle 1701 1701 0 1 + 1703: 131(fvec2) GroupNonUniformFMin 34 ExclusiveScan 1702 + 1704: 132(ptr) AccessChain 27(data) 1699 59 + 1705: 23(fvec4) Load 1704 + 1706: 23(fvec4) VectorShuffle 1705 1703 4 5 2 3 + Store 1704 1706 + 1707: 6(int) Load 8(invocation) + 1708: 132(ptr) AccessChain 27(data) 49 59 + 1709: 23(fvec4) Load 1708 + 1710: 141(fvec3) VectorShuffle 1709 1709 0 1 2 + 1711: 141(fvec3) GroupNonUniformFMin 34 ExclusiveScan 1710 + 1712: 132(ptr) AccessChain 27(data) 1707 59 + 1713: 23(fvec4) Load 1712 + 1714: 23(fvec4) VectorShuffle 1713 1711 4 5 6 3 + Store 1712 1714 + 1715: 6(int) Load 8(invocation) + 1716: 132(ptr) AccessChain 27(data) 59 59 + 1717: 23(fvec4) Load 1716 + 1718: 23(fvec4) GroupNonUniformFMin 34 ExclusiveScan 1717 + 1719: 132(ptr) AccessChain 27(data) 1715 59 + Store 1719 1718 + 1720: 6(int) Load 8(invocation) + 1721: 31(ptr) AccessChain 27(data) 29 29 30 + 1722: 17(float) Load 1721 + 1723: 17(float) GroupNonUniformFMax 34 ExclusiveScan 1722 + 1724: 31(ptr) AccessChain 27(data) 1720 29 30 + Store 1724 1723 + 1725: 6(int) Load 8(invocation) + 1726: 40(ptr) AccessChain 27(data) 38 29 + 1727: 18(fvec4) Load 1726 + 1728: 39(fvec2) VectorShuffle 1727 1727 0 1 + 1729: 39(fvec2) GroupNonUniformFMax 34 ExclusiveScan 1728 + 1730: 40(ptr) AccessChain 27(data) 1725 29 + 1731: 18(fvec4) Load 1730 + 1732: 18(fvec4) VectorShuffle 1731 1729 4 5 2 3 + Store 1730 1732 + 1733: 6(int) Load 8(invocation) + 1734: 40(ptr) AccessChain 27(data) 49 29 + 1735: 18(fvec4) Load 1734 + 1736: 50(fvec3) VectorShuffle 1735 1735 0 1 2 + 1737: 50(fvec3) GroupNonUniformFMax 34 ExclusiveScan 1736 + 1738: 40(ptr) AccessChain 27(data) 1733 29 + 1739: 18(fvec4) Load 1738 + 1740: 18(fvec4) VectorShuffle 1739 1737 4 5 6 3 + Store 1738 1740 + 1741: 6(int) Load 8(invocation) + 1742: 40(ptr) AccessChain 27(data) 59 29 + 1743: 18(fvec4) Load 1742 + 1744: 18(fvec4) GroupNonUniformFMax 34 ExclusiveScan 1743 + 1745: 40(ptr) AccessChain 27(data) 1741 29 + Store 1745 1744 + 1746: 6(int) Load 8(invocation) + 1747: 65(ptr) AccessChain 27(data) 29 38 30 + 1748: 19(int) Load 1747 + 1749: 19(int) GroupNonUniformSMax 34 ExclusiveScan 1748 + 1750: 65(ptr) AccessChain 27(data) 1746 38 30 + Store 1750 1749 + 1751: 6(int) Load 8(invocation) + 1752: 72(ptr) AccessChain 27(data) 38 38 + 1753: 20(ivec4) Load 1752 + 1754: 71(ivec2) VectorShuffle 1753 1753 0 1 + 1755: 71(ivec2) GroupNonUniformSMax 34 ExclusiveScan 1754 + 1756: 72(ptr) AccessChain 27(data) 1751 38 + 1757: 20(ivec4) Load 1756 + 1758: 20(ivec4) VectorShuffle 1757 1755 4 5 2 3 + Store 1756 1758 + 1759: 6(int) Load 8(invocation) + 1760: 72(ptr) AccessChain 27(data) 49 38 + 1761: 20(ivec4) Load 1760 + 1762: 81(ivec3) VectorShuffle 1761 1761 0 1 2 + 1763: 81(ivec3) GroupNonUniformSMax 34 ExclusiveScan 1762 + 1764: 72(ptr) AccessChain 27(data) 1759 38 + 1765: 20(ivec4) Load 1764 + 1766: 20(ivec4) VectorShuffle 1765 1763 4 5 6 3 + Store 1764 1766 + 1767: 6(int) Load 8(invocation) + 1768: 72(ptr) AccessChain 27(data) 59 38 + 1769: 20(ivec4) Load 1768 + 1770: 20(ivec4) GroupNonUniformSMax 34 ExclusiveScan 1769 + 1771: 72(ptr) AccessChain 27(data) 1767 38 + Store 1771 1770 + 1772: 6(int) Load 8(invocation) + 1773: 95(ptr) AccessChain 27(data) 29 49 30 + 1774: 6(int) Load 1773 + 1775: 6(int) GroupNonUniformUMax 34 ExclusiveScan 1774 + 1776: 95(ptr) AccessChain 27(data) 1772 49 30 + Store 1776 1775 + 1777: 6(int) Load 8(invocation) + 1778: 102(ptr) AccessChain 27(data) 38 49 + 1779: 21(ivec4) Load 1778 + 1780: 101(ivec2) VectorShuffle 1779 1779 0 1 + 1781: 101(ivec2) GroupNonUniformUMax 34 ExclusiveScan 1780 + 1782: 102(ptr) AccessChain 27(data) 1777 49 + 1783: 21(ivec4) Load 1782 + 1784: 21(ivec4) VectorShuffle 1783 1781 4 5 2 3 + Store 1782 1784 + 1785: 6(int) Load 8(invocation) + 1786: 102(ptr) AccessChain 27(data) 49 49 + 1787: 21(ivec4) Load 1786 + 1788: 111(ivec3) VectorShuffle 1787 1787 0 1 2 + 1789: 111(ivec3) GroupNonUniformUMax 34 ExclusiveScan 1788 + 1790: 102(ptr) AccessChain 27(data) 1785 49 + 1791: 21(ivec4) Load 1790 + 1792: 21(ivec4) VectorShuffle 1791 1789 4 5 6 3 + Store 1790 1792 + 1793: 6(int) Load 8(invocation) + 1794: 102(ptr) AccessChain 27(data) 59 49 + 1795: 21(ivec4) Load 1794 + 1796: 21(ivec4) GroupNonUniformUMax 34 ExclusiveScan 1795 + 1797: 102(ptr) AccessChain 27(data) 1793 49 + Store 1797 1796 + 1798: 6(int) Load 8(invocation) + 1799: 125(ptr) AccessChain 27(data) 29 59 30 + 1800: 22(float) Load 1799 + 1801: 22(float) GroupNonUniformFMax 34 ExclusiveScan 1800 + 1802: 125(ptr) AccessChain 27(data) 1798 59 30 + Store 1802 1801 + 1803: 6(int) Load 8(invocation) + 1804: 132(ptr) AccessChain 27(data) 38 59 + 1805: 23(fvec4) Load 1804 + 1806: 131(fvec2) VectorShuffle 1805 1805 0 1 + 1807: 131(fvec2) GroupNonUniformFMax 34 ExclusiveScan 1806 + 1808: 132(ptr) AccessChain 27(data) 1803 59 + 1809: 23(fvec4) Load 1808 + 1810: 23(fvec4) VectorShuffle 1809 1807 4 5 2 3 + Store 1808 1810 + 1811: 6(int) Load 8(invocation) + 1812: 132(ptr) AccessChain 27(data) 49 59 + 1813: 23(fvec4) Load 1812 + 1814: 141(fvec3) VectorShuffle 1813 1813 0 1 2 + 1815: 141(fvec3) GroupNonUniformFMax 34 ExclusiveScan 1814 + 1816: 132(ptr) AccessChain 27(data) 1811 59 + 1817: 23(fvec4) Load 1816 + 1818: 23(fvec4) VectorShuffle 1817 1815 4 5 6 3 + Store 1816 1818 + 1819: 6(int) Load 8(invocation) + 1820: 132(ptr) AccessChain 27(data) 59 59 + 1821: 23(fvec4) Load 1820 + 1822: 23(fvec4) GroupNonUniformFMax 34 ExclusiveScan 1821 + 1823: 132(ptr) AccessChain 27(data) 1819 59 + Store 1823 1822 + 1824: 6(int) Load 8(invocation) + 1825: 65(ptr) AccessChain 27(data) 29 38 30 + 1826: 19(int) Load 1825 + 1827: 19(int) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1826 + 1828: 65(ptr) AccessChain 27(data) 1824 38 30 + Store 1828 1827 + 1829: 6(int) Load 8(invocation) + 1830: 72(ptr) AccessChain 27(data) 38 38 + 1831: 20(ivec4) Load 1830 + 1832: 71(ivec2) VectorShuffle 1831 1831 0 1 + 1833: 71(ivec2) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1832 + 1834: 72(ptr) AccessChain 27(data) 1829 38 + 1835: 20(ivec4) Load 1834 + 1836: 20(ivec4) VectorShuffle 1835 1833 4 5 2 3 + Store 1834 1836 + 1837: 6(int) Load 8(invocation) + 1838: 72(ptr) AccessChain 27(data) 49 38 + 1839: 20(ivec4) Load 1838 + 1840: 81(ivec3) VectorShuffle 1839 1839 0 1 2 + 1841: 81(ivec3) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1840 + 1842: 72(ptr) AccessChain 27(data) 1837 38 + 1843: 20(ivec4) Load 1842 + 1844: 20(ivec4) VectorShuffle 1843 1841 4 5 6 3 + Store 1842 1844 + 1845: 6(int) Load 8(invocation) + 1846: 72(ptr) AccessChain 27(data) 59 38 + 1847: 20(ivec4) Load 1846 + 1848: 20(ivec4) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1847 + 1849: 72(ptr) AccessChain 27(data) 1845 38 + Store 1849 1848 + 1850: 6(int) Load 8(invocation) + 1851: 95(ptr) AccessChain 27(data) 29 49 30 + 1852: 6(int) Load 1851 + 1853: 6(int) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1852 + 1854: 95(ptr) AccessChain 27(data) 1850 49 30 + Store 1854 1853 + 1855: 6(int) Load 8(invocation) + 1856: 102(ptr) AccessChain 27(data) 38 49 + 1857: 21(ivec4) Load 1856 + 1858: 101(ivec2) VectorShuffle 1857 1857 0 1 + 1859: 101(ivec2) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1858 + 1860: 102(ptr) AccessChain 27(data) 1855 49 + 1861: 21(ivec4) Load 1860 + 1862: 21(ivec4) VectorShuffle 1861 1859 4 5 2 3 + Store 1860 1862 + 1863: 6(int) Load 8(invocation) + 1864: 102(ptr) AccessChain 27(data) 49 49 + 1865: 21(ivec4) Load 1864 + 1866: 111(ivec3) VectorShuffle 1865 1865 0 1 2 + 1867: 111(ivec3) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1866 + 1868: 102(ptr) AccessChain 27(data) 1863 49 + 1869: 21(ivec4) Load 1868 + 1870: 21(ivec4) VectorShuffle 1869 1867 4 5 6 3 + Store 1868 1870 + 1871: 6(int) Load 8(invocation) + 1872: 102(ptr) AccessChain 27(data) 59 49 + 1873: 21(ivec4) Load 1872 + 1874: 21(ivec4) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1873 + 1875: 102(ptr) AccessChain 27(data) 1871 49 + Store 1875 1874 + 1876: 6(int) Load 8(invocation) + 1877: 65(ptr) AccessChain 27(data) 29 38 30 + 1878: 19(int) Load 1877 + 1879: 521(bool) SLessThan 1878 29 + 1880: 521(bool) GroupNonUniformLogicalAnd 34 ExclusiveScan 1879 + 1881: 19(int) Select 1880 38 29 + 1882: 65(ptr) AccessChain 27(data) 1876 38 30 + Store 1882 1881 + 1883: 6(int) Load 8(invocation) + 1884: 72(ptr) AccessChain 27(data) 38 38 + 1885: 20(ivec4) Load 1884 + 1886: 71(ivec2) VectorShuffle 1885 1885 0 1 + 1887: 531(bvec2) SLessThan 1886 530 + 1888: 531(bvec2) GroupNonUniformLogicalAnd 34 ExclusiveScan 1887 + 1889: 71(ivec2) Select 1888 534 530 + 1890: 72(ptr) AccessChain 27(data) 1883 38 + 1891: 20(ivec4) Load 1890 + 1892: 20(ivec4) VectorShuffle 1891 1889 4 5 2 3 + Store 1890 1892 + 1893: 6(int) Load 8(invocation) + 1894: 72(ptr) AccessChain 27(data) 38 38 + 1895: 20(ivec4) Load 1894 + 1896: 81(ivec3) VectorShuffle 1895 1895 0 1 2 + 1897: 544(bvec3) SLessThan 1896 543 + 1898: 544(bvec3) GroupNonUniformLogicalAnd 34 ExclusiveScan 1897 + 1899: 81(ivec3) Select 1898 547 543 + 1900: 72(ptr) AccessChain 27(data) 1893 38 + 1901: 20(ivec4) Load 1900 + 1902: 20(ivec4) VectorShuffle 1901 1899 4 5 6 3 + Store 1900 1902 + 1903: 6(int) Load 8(invocation) + 1904: 72(ptr) AccessChain 27(data) 38 38 + 1905: 20(ivec4) Load 1904 + 1906: 556(bvec4) SLessThan 1905 555 + 1907: 556(bvec4) GroupNonUniformLogicalAnd 34 ExclusiveScan 1906 + 1908: 20(ivec4) Select 1907 559 555 + 1909: 72(ptr) AccessChain 27(data) 1903 38 + Store 1909 1908 + 1910: 6(int) Load 8(invocation) + 1911: 65(ptr) AccessChain 27(data) 29 38 30 + 1912: 19(int) Load 1911 + 1913: 19(int) GroupNonUniformBitwiseOr 34 ExclusiveScan 1912 + 1914: 65(ptr) AccessChain 27(data) 1910 38 30 + Store 1914 1913 + 1915: 6(int) Load 8(invocation) + 1916: 72(ptr) AccessChain 27(data) 38 38 + 1917: 20(ivec4) Load 1916 + 1918: 71(ivec2) VectorShuffle 1917 1917 0 1 + 1919: 71(ivec2) GroupNonUniformBitwiseOr 34 ExclusiveScan 1918 + 1920: 72(ptr) AccessChain 27(data) 1915 38 + 1921: 20(ivec4) Load 1920 + 1922: 20(ivec4) VectorShuffle 1921 1919 4 5 2 3 + Store 1920 1922 + 1923: 6(int) Load 8(invocation) + 1924: 72(ptr) AccessChain 27(data) 49 38 + 1925: 20(ivec4) Load 1924 + 1926: 81(ivec3) VectorShuffle 1925 1925 0 1 2 + 1927: 81(ivec3) GroupNonUniformBitwiseOr 34 ExclusiveScan 1926 + 1928: 72(ptr) AccessChain 27(data) 1923 38 + 1929: 20(ivec4) Load 1928 + 1930: 20(ivec4) VectorShuffle 1929 1927 4 5 6 3 + Store 1928 1930 + 1931: 6(int) Load 8(invocation) + 1932: 72(ptr) AccessChain 27(data) 59 38 + 1933: 20(ivec4) Load 1932 + 1934: 20(ivec4) GroupNonUniformBitwiseOr 34 ExclusiveScan 1933 + 1935: 72(ptr) AccessChain 27(data) 1931 38 + Store 1935 1934 + 1936: 6(int) Load 8(invocation) + 1937: 95(ptr) AccessChain 27(data) 29 49 30 + 1938: 6(int) Load 1937 + 1939: 6(int) GroupNonUniformBitwiseOr 34 ExclusiveScan 1938 + 1940: 95(ptr) AccessChain 27(data) 1936 49 30 + Store 1940 1939 + 1941: 6(int) Load 8(invocation) + 1942: 102(ptr) AccessChain 27(data) 38 49 + 1943: 21(ivec4) Load 1942 + 1944: 101(ivec2) VectorShuffle 1943 1943 0 1 + 1945: 101(ivec2) GroupNonUniformBitwiseOr 34 ExclusiveScan 1944 + 1946: 102(ptr) AccessChain 27(data) 1941 49 + 1947: 21(ivec4) Load 1946 + 1948: 21(ivec4) VectorShuffle 1947 1945 4 5 2 3 + Store 1946 1948 + 1949: 6(int) Load 8(invocation) + 1950: 102(ptr) AccessChain 27(data) 49 49 + 1951: 21(ivec4) Load 1950 + 1952: 111(ivec3) VectorShuffle 1951 1951 0 1 2 + 1953: 111(ivec3) GroupNonUniformBitwiseOr 34 ExclusiveScan 1952 + 1954: 102(ptr) AccessChain 27(data) 1949 49 + 1955: 21(ivec4) Load 1954 + 1956: 21(ivec4) VectorShuffle 1955 1953 4 5 6 3 + Store 1954 1956 + 1957: 6(int) Load 8(invocation) + 1958: 102(ptr) AccessChain 27(data) 59 49 + 1959: 21(ivec4) Load 1958 + 1960: 21(ivec4) GroupNonUniformBitwiseOr 34 ExclusiveScan 1959 + 1961: 102(ptr) AccessChain 27(data) 1957 49 + Store 1961 1960 + 1962: 6(int) Load 8(invocation) + 1963: 65(ptr) AccessChain 27(data) 29 38 30 + 1964: 19(int) Load 1963 + 1965: 521(bool) SLessThan 1964 29 + 1966: 521(bool) GroupNonUniformLogicalOr 34 ExclusiveScan 1965 + 1967: 19(int) Select 1966 38 29 + 1968: 65(ptr) AccessChain 27(data) 1962 38 30 + Store 1968 1967 + 1969: 6(int) Load 8(invocation) + 1970: 72(ptr) AccessChain 27(data) 38 38 + 1971: 20(ivec4) Load 1970 + 1972: 71(ivec2) VectorShuffle 1971 1971 0 1 + 1973: 531(bvec2) SLessThan 1972 530 + 1974: 531(bvec2) GroupNonUniformLogicalOr 34 ExclusiveScan 1973 + 1975: 71(ivec2) Select 1974 534 530 + 1976: 72(ptr) AccessChain 27(data) 1969 38 + 1977: 20(ivec4) Load 1976 + 1978: 20(ivec4) VectorShuffle 1977 1975 4 5 2 3 + Store 1976 1978 + 1979: 6(int) Load 8(invocation) + 1980: 72(ptr) AccessChain 27(data) 38 38 + 1981: 20(ivec4) Load 1980 + 1982: 81(ivec3) VectorShuffle 1981 1981 0 1 2 + 1983: 544(bvec3) SLessThan 1982 543 + 1984: 544(bvec3) GroupNonUniformLogicalOr 34 ExclusiveScan 1983 + 1985: 81(ivec3) Select 1984 547 543 + 1986: 72(ptr) AccessChain 27(data) 1979 38 + 1987: 20(ivec4) Load 1986 + 1988: 20(ivec4) VectorShuffle 1987 1985 4 5 6 3 + Store 1986 1988 + 1989: 6(int) Load 8(invocation) + 1990: 72(ptr) AccessChain 27(data) 38 38 + 1991: 20(ivec4) Load 1990 + 1992: 556(bvec4) SLessThan 1991 555 + 1993: 556(bvec4) GroupNonUniformLogicalOr 34 ExclusiveScan 1992 + 1994: 20(ivec4) Select 1993 559 555 + 1995: 72(ptr) AccessChain 27(data) 1989 38 + Store 1995 1994 + 1996: 6(int) Load 8(invocation) + 1997: 65(ptr) AccessChain 27(data) 29 38 30 + 1998: 19(int) Load 1997 + 1999: 19(int) GroupNonUniformBitwiseXor 34 ExclusiveScan 1998 + 2000: 65(ptr) AccessChain 27(data) 1996 38 30 + Store 2000 1999 + 2001: 6(int) Load 8(invocation) + 2002: 72(ptr) AccessChain 27(data) 38 38 + 2003: 20(ivec4) Load 2002 + 2004: 71(ivec2) VectorShuffle 2003 2003 0 1 + 2005: 71(ivec2) GroupNonUniformBitwiseXor 34 ExclusiveScan 2004 + 2006: 72(ptr) AccessChain 27(data) 2001 38 + 2007: 20(ivec4) Load 2006 + 2008: 20(ivec4) VectorShuffle 2007 2005 4 5 2 3 + Store 2006 2008 + 2009: 6(int) Load 8(invocation) + 2010: 72(ptr) AccessChain 27(data) 49 38 + 2011: 20(ivec4) Load 2010 + 2012: 81(ivec3) VectorShuffle 2011 2011 0 1 2 + 2013: 81(ivec3) GroupNonUniformBitwiseXor 34 ExclusiveScan 2012 + 2014: 72(ptr) AccessChain 27(data) 2009 38 + 2015: 20(ivec4) Load 2014 + 2016: 20(ivec4) VectorShuffle 2015 2013 4 5 6 3 + Store 2014 2016 + 2017: 6(int) Load 8(invocation) + 2018: 72(ptr) AccessChain 27(data) 59 38 + 2019: 20(ivec4) Load 2018 + 2020: 20(ivec4) GroupNonUniformBitwiseXor 34 ExclusiveScan 2019 + 2021: 72(ptr) AccessChain 27(data) 2017 38 + Store 2021 2020 + 2022: 6(int) Load 8(invocation) + 2023: 95(ptr) AccessChain 27(data) 29 49 30 + 2024: 6(int) Load 2023 + 2025: 6(int) GroupNonUniformBitwiseXor 34 ExclusiveScan 2024 + 2026: 95(ptr) AccessChain 27(data) 2022 49 30 + Store 2026 2025 + 2027: 6(int) Load 8(invocation) + 2028: 102(ptr) AccessChain 27(data) 38 49 + 2029: 21(ivec4) Load 2028 + 2030: 101(ivec2) VectorShuffle 2029 2029 0 1 + 2031: 101(ivec2) GroupNonUniformBitwiseXor 34 ExclusiveScan 2030 + 2032: 102(ptr) AccessChain 27(data) 2027 49 + 2033: 21(ivec4) Load 2032 + 2034: 21(ivec4) VectorShuffle 2033 2031 4 5 2 3 + Store 2032 2034 + 2035: 6(int) Load 8(invocation) + 2036: 102(ptr) AccessChain 27(data) 49 49 + 2037: 21(ivec4) Load 2036 + 2038: 111(ivec3) VectorShuffle 2037 2037 0 1 2 + 2039: 111(ivec3) GroupNonUniformBitwiseXor 34 ExclusiveScan 2038 + 2040: 102(ptr) AccessChain 27(data) 2035 49 + 2041: 21(ivec4) Load 2040 + 2042: 21(ivec4) VectorShuffle 2041 2039 4 5 6 3 + Store 2040 2042 + 2043: 6(int) Load 8(invocation) + 2044: 102(ptr) AccessChain 27(data) 59 49 + 2045: 21(ivec4) Load 2044 + 2046: 21(ivec4) GroupNonUniformBitwiseXor 34 ExclusiveScan 2045 + 2047: 102(ptr) AccessChain 27(data) 2043 49 + Store 2047 2046 + 2048: 6(int) Load 8(invocation) + 2049: 65(ptr) AccessChain 27(data) 29 38 30 + 2050: 19(int) Load 2049 + 2051: 521(bool) SLessThan 2050 29 + 2052: 521(bool) GroupNonUniformLogicalXor 34 ExclusiveScan 2051 + 2053: 19(int) Select 2052 38 29 + 2054: 65(ptr) AccessChain 27(data) 2048 38 30 + Store 2054 2053 + 2055: 6(int) Load 8(invocation) + 2056: 72(ptr) AccessChain 27(data) 38 38 + 2057: 20(ivec4) Load 2056 + 2058: 71(ivec2) VectorShuffle 2057 2057 0 1 + 2059: 531(bvec2) SLessThan 2058 530 + 2060: 531(bvec2) GroupNonUniformLogicalXor 34 ExclusiveScan 2059 + 2061: 71(ivec2) Select 2060 534 530 + 2062: 72(ptr) AccessChain 27(data) 2055 38 + 2063: 20(ivec4) Load 2062 + 2064: 20(ivec4) VectorShuffle 2063 2061 4 5 2 3 + Store 2062 2064 + 2065: 6(int) Load 8(invocation) + 2066: 72(ptr) AccessChain 27(data) 38 38 + 2067: 20(ivec4) Load 2066 + 2068: 81(ivec3) VectorShuffle 2067 2067 0 1 2 + 2069: 544(bvec3) SLessThan 2068 543 + 2070: 544(bvec3) GroupNonUniformLogicalXor 34 ExclusiveScan 2069 + 2071: 81(ivec3) Select 2070 547 543 + 2072: 72(ptr) AccessChain 27(data) 2065 38 + 2073: 20(ivec4) Load 2072 + 2074: 20(ivec4) VectorShuffle 2073 2071 4 5 6 3 + Store 2072 2074 + 2075: 6(int) Load 8(invocation) + 2076: 72(ptr) AccessChain 27(data) 38 38 + 2077: 20(ivec4) Load 2076 + 2078: 556(bvec4) SLessThan 2077 555 + 2079: 556(bvec4) GroupNonUniformLogicalXor 34 ExclusiveScan 2078 + 2080: 20(ivec4) Select 2079 559 555 + 2081: 72(ptr) AccessChain 27(data) 2075 38 + Store 2081 2080 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupBallot.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupBallot.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupBallot.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupBallot.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,525 @@ +spv.subgroupBallot.comp +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 417 + + Capability Shader + Capability Float64 + Capability GroupNonUniform + Capability GroupNonUniformBallot + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" 10 12 21 23 26 29 32 + ExecutionMode 4 LocalSize 8 8 1 + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_ballot" + SourceExtension "GL_KHR_shader_subgroup_basic" + Name 4 "main" + Name 8 "invocation" + Name 10 "gl_SubgroupInvocationID" + Name 12 "gl_SubgroupSize" + Name 19 "relMask" + Name 21 "gl_SubgroupEqMask" + Name 23 "gl_SubgroupGeMask" + Name 26 "gl_SubgroupGtMask" + Name 29 "gl_SubgroupLeMask" + Name 32 "gl_SubgroupLtMask" + Name 35 "result" + Name 46 "Buffers" + MemberName 46(Buffers) 0 "f4" + MemberName 46(Buffers) 1 "i4" + MemberName 46(Buffers) 2 "u4" + MemberName 46(Buffers) 3 "d4" + Name 49 "data" + Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 11 RelaxedPrecision + Decorate 12(gl_SubgroupSize) RelaxedPrecision + Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 13 RelaxedPrecision + Decorate 14 RelaxedPrecision + Decorate 16 RelaxedPrecision + Decorate 21(gl_SubgroupEqMask) BuiltIn SubgroupEqMaskKHR + Decorate 23(gl_SubgroupGeMask) BuiltIn SubgroupGeMaskKHR + Decorate 26(gl_SubgroupGtMask) BuiltIn SubgroupGtMaskKHR + Decorate 29(gl_SubgroupLeMask) BuiltIn SubgroupLeMaskKHR + Decorate 32(gl_SubgroupLtMask) BuiltIn SubgroupLtMaskKHR + MemberDecorate 46(Buffers) 0 Offset 0 + MemberDecorate 46(Buffers) 1 Offset 16 + MemberDecorate 46(Buffers) 2 Offset 32 + MemberDecorate 46(Buffers) 3 Offset 64 + Decorate 46(Buffers) BufferBlock + Decorate 49(data) DescriptorSet 0 + Decorate 49(data) Binding 0 + Decorate 416 BuiltIn WorkgroupSize + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypePointer Function 6(int) + 9: TypePointer Input 6(int) +10(gl_SubgroupInvocationID): 9(ptr) Variable Input +12(gl_SubgroupSize): 9(ptr) Variable Input + 15: 6(int) Constant 4 + 17: TypeVector 6(int) 4 + 18: TypePointer Function 17(ivec4) + 20: TypePointer Input 17(ivec4) +21(gl_SubgroupEqMask): 20(ptr) Variable Input +23(gl_SubgroupGeMask): 20(ptr) Variable Input +26(gl_SubgroupGtMask): 20(ptr) Variable Input +29(gl_SubgroupLeMask): 20(ptr) Variable Input +32(gl_SubgroupLtMask): 20(ptr) Variable Input + 36: TypeBool + 37: 36(bool) ConstantTrue + 38: 6(int) Constant 3 + 40: TypeFloat 32 + 41: TypeVector 40(float) 4 + 42: TypeInt 32 1 + 43: TypeVector 42(int) 4 + 44: TypeFloat 64 + 45: TypeVector 44(float) 4 + 46(Buffers): TypeStruct 41(fvec4) 43(ivec4) 17(ivec4) 45(fvec4) + 47: TypeArray 46(Buffers) 15 + 48: TypePointer Uniform 47 + 49(data): 48(ptr) Variable Uniform + 51: 42(int) Constant 2 + 54: 6(int) Constant 0 + 55: TypePointer Uniform 6(int) + 60: 42(int) Constant 1 + 61: 42(int) Constant 0 + 64: 6(int) Constant 1 + 72: 6(int) Constant 2 + 83: TypeVector 36(bool) 4 + 88: TypePointer Uniform 17(ivec4) + 96: TypePointer Uniform 40(float) + 103: TypeVector 40(float) 2 + 104: TypePointer Uniform 41(fvec4) + 114: TypeVector 40(float) 3 + 124: 42(int) Constant 3 + 131: TypePointer Uniform 42(int) + 138: TypeVector 42(int) 2 + 139: TypePointer Uniform 43(ivec4) + 149: TypeVector 42(int) 3 + 171: TypeVector 6(int) 2 + 181: TypeVector 6(int) 3 + 197: TypePointer Uniform 44(float) + 204: TypeVector 44(float) 2 + 205: TypePointer Uniform 45(fvec4) + 215: TypeVector 44(float) 3 + 242: 138(ivec2) ConstantComposite 61 61 + 243: TypeVector 36(bool) 2 + 247: 138(ivec2) ConstantComposite 60 60 + 256: 149(ivec3) ConstantComposite 61 61 61 + 257: TypeVector 36(bool) 3 + 261: 149(ivec3) ConstantComposite 60 60 60 + 269: 43(ivec4) ConstantComposite 61 61 61 61 + 273: 43(ivec4) ConstantComposite 60 60 60 60 + 415: 6(int) Constant 8 + 416: 181(ivec3) ConstantComposite 415 415 64 + 4(main): 2 Function None 3 + 5: Label + 8(invocation): 7(ptr) Variable Function + 19(relMask): 18(ptr) Variable Function + 35(result): 18(ptr) Variable Function + 11: 6(int) Load 10(gl_SubgroupInvocationID) + 13: 6(int) Load 12(gl_SubgroupSize) + 14: 6(int) IAdd 11 13 + 16: 6(int) UMod 14 15 + Store 8(invocation) 16 + 22: 17(ivec4) Load 21(gl_SubgroupEqMask) + 24: 17(ivec4) Load 23(gl_SubgroupGeMask) + 25: 17(ivec4) IAdd 22 24 + 27: 17(ivec4) Load 26(gl_SubgroupGtMask) + 28: 17(ivec4) IAdd 25 27 + 30: 17(ivec4) Load 29(gl_SubgroupLeMask) + 31: 17(ivec4) IAdd 28 30 + 33: 17(ivec4) Load 32(gl_SubgroupLtMask) + 34: 17(ivec4) IAdd 31 33 + Store 19(relMask) 34 + 39: 17(ivec4) GroupNonUniformBallot 38 37 + Store 35(result) 39 + 50: 6(int) Load 8(invocation) + 52: 17(ivec4) Load 35(result) + 53: 6(int) GroupNonUniformBallotBitCount 38 Reduce 52 + 56: 55(ptr) AccessChain 49(data) 50 51 54 + Store 56 53 + 57: 6(int) Load 8(invocation) + 58: 17(ivec4) Load 35(result) + 59: 36(bool) GroupNonUniformBallotBitExtract 38 58 54 + 62: 42(int) Select 59 60 61 + 63: 6(int) Bitcast 62 + 65: 55(ptr) AccessChain 49(data) 57 51 64 + Store 65 63 + 66: 6(int) Load 8(invocation) + 67: 17(ivec4) Load 35(result) + 68: 6(int) GroupNonUniformBallotBitCount 38 InclusiveScan 67 + 69: 17(ivec4) Load 35(result) + 70: 6(int) GroupNonUniformBallotBitCount 38 ExclusiveScan 69 + 71: 6(int) IAdd 68 70 + 73: 55(ptr) AccessChain 49(data) 66 51 72 + Store 73 71 + 74: 6(int) Load 8(invocation) + 75: 17(ivec4) Load 35(result) + 76: 6(int) GroupNonUniformBallotFindLSB 38 75 + 77: 17(ivec4) Load 35(result) + 78: 6(int) GroupNonUniformBallotFindMSB 38 77 + 79: 6(int) IAdd 76 78 + 80: 55(ptr) AccessChain 49(data) 74 51 38 + Store 80 79 + 81: 17(ivec4) Load 19(relMask) + 82: 17(ivec4) Load 35(result) + 84: 83(bvec4) IEqual 81 82 + 85: 36(bool) All 84 + SelectionMerge 87 None + BranchConditional 85 86 87 + 86: Label + 89: 88(ptr) AccessChain 49(data) 61 51 + 90: 17(ivec4) Load 89 + 91: 36(bool) GroupNonUniformInverseBallot 38 90 + Branch 87 + 87: Label + 92: 36(bool) Phi 85 5 91 86 + SelectionMerge 94 None + BranchConditional 92 93 276 + 93: Label + 95: 6(int) Load 8(invocation) + 97: 96(ptr) AccessChain 49(data) 61 61 54 + 98: 40(float) Load 97 + 99: 6(int) Load 8(invocation) + 100: 40(float) GroupNonUniformBroadcast 38 98 99 + 101: 96(ptr) AccessChain 49(data) 95 61 54 + Store 101 100 + 102: 6(int) Load 8(invocation) + 105: 104(ptr) AccessChain 49(data) 60 61 + 106: 41(fvec4) Load 105 + 107: 103(fvec2) VectorShuffle 106 106 0 1 + 108: 6(int) Load 8(invocation) + 109: 103(fvec2) GroupNonUniformBroadcast 38 107 108 + 110: 104(ptr) AccessChain 49(data) 102 61 + 111: 41(fvec4) Load 110 + 112: 41(fvec4) VectorShuffle 111 109 4 5 2 3 + Store 110 112 + 113: 6(int) Load 8(invocation) + 115: 104(ptr) AccessChain 49(data) 51 61 + 116: 41(fvec4) Load 115 + 117: 114(fvec3) VectorShuffle 116 116 0 1 2 + 118: 6(int) Load 8(invocation) + 119: 114(fvec3) GroupNonUniformBroadcast 38 117 118 + 120: 104(ptr) AccessChain 49(data) 113 61 + 121: 41(fvec4) Load 120 + 122: 41(fvec4) VectorShuffle 121 119 4 5 6 3 + Store 120 122 + 123: 6(int) Load 8(invocation) + 125: 104(ptr) AccessChain 49(data) 124 61 + 126: 41(fvec4) Load 125 + 127: 6(int) Load 8(invocation) + 128: 41(fvec4) GroupNonUniformBroadcast 38 126 127 + 129: 104(ptr) AccessChain 49(data) 123 61 + Store 129 128 + 130: 6(int) Load 8(invocation) + 132: 131(ptr) AccessChain 49(data) 61 60 54 + 133: 42(int) Load 132 + 134: 6(int) Load 8(invocation) + 135: 42(int) GroupNonUniformBroadcast 38 133 134 + 136: 131(ptr) AccessChain 49(data) 130 60 54 + Store 136 135 + 137: 6(int) Load 8(invocation) + 140: 139(ptr) AccessChain 49(data) 60 60 + 141: 43(ivec4) Load 140 + 142: 138(ivec2) VectorShuffle 141 141 0 1 + 143: 6(int) Load 8(invocation) + 144: 138(ivec2) GroupNonUniformBroadcast 38 142 143 + 145: 139(ptr) AccessChain 49(data) 137 60 + 146: 43(ivec4) Load 145 + 147: 43(ivec4) VectorShuffle 146 144 4 5 2 3 + Store 145 147 + 148: 6(int) Load 8(invocation) + 150: 139(ptr) AccessChain 49(data) 51 60 + 151: 43(ivec4) Load 150 + 152: 149(ivec3) VectorShuffle 151 151 0 1 2 + 153: 6(int) Load 8(invocation) + 154: 149(ivec3) GroupNonUniformBroadcast 38 152 153 + 155: 139(ptr) AccessChain 49(data) 148 60 + 156: 43(ivec4) Load 155 + 157: 43(ivec4) VectorShuffle 156 154 4 5 6 3 + Store 155 157 + 158: 6(int) Load 8(invocation) + 159: 139(ptr) AccessChain 49(data) 124 60 + 160: 43(ivec4) Load 159 + 161: 6(int) Load 8(invocation) + 162: 43(ivec4) GroupNonUniformBroadcast 38 160 161 + 163: 139(ptr) AccessChain 49(data) 158 60 + Store 163 162 + 164: 6(int) Load 8(invocation) + 165: 55(ptr) AccessChain 49(data) 61 51 54 + 166: 6(int) Load 165 + 167: 6(int) Load 8(invocation) + 168: 6(int) GroupNonUniformBroadcast 38 166 167 + 169: 55(ptr) AccessChain 49(data) 164 51 54 + Store 169 168 + 170: 6(int) Load 8(invocation) + 172: 88(ptr) AccessChain 49(data) 60 51 + 173: 17(ivec4) Load 172 + 174: 171(ivec2) VectorShuffle 173 173 0 1 + 175: 6(int) Load 8(invocation) + 176: 171(ivec2) GroupNonUniformBroadcast 38 174 175 + 177: 88(ptr) AccessChain 49(data) 170 51 + 178: 17(ivec4) Load 177 + 179: 17(ivec4) VectorShuffle 178 176 4 5 2 3 + Store 177 179 + 180: 6(int) Load 8(invocation) + 182: 88(ptr) AccessChain 49(data) 51 51 + 183: 17(ivec4) Load 182 + 184: 181(ivec3) VectorShuffle 183 183 0 1 2 + 185: 6(int) Load 8(invocation) + 186: 181(ivec3) GroupNonUniformBroadcast 38 184 185 + 187: 88(ptr) AccessChain 49(data) 180 51 + 188: 17(ivec4) Load 187 + 189: 17(ivec4) VectorShuffle 188 186 4 5 6 3 + Store 187 189 + 190: 6(int) Load 8(invocation) + 191: 88(ptr) AccessChain 49(data) 124 51 + 192: 17(ivec4) Load 191 + 193: 6(int) Load 8(invocation) + 194: 17(ivec4) GroupNonUniformBroadcast 38 192 193 + 195: 88(ptr) AccessChain 49(data) 190 51 + Store 195 194 + 196: 6(int) Load 8(invocation) + 198: 197(ptr) AccessChain 49(data) 61 124 54 + 199: 44(float) Load 198 + 200: 6(int) Load 8(invocation) + 201: 44(float) GroupNonUniformBroadcast 38 199 200 + 202: 197(ptr) AccessChain 49(data) 196 124 54 + Store 202 201 + 203: 6(int) Load 8(invocation) + 206: 205(ptr) AccessChain 49(data) 60 124 + 207: 45(fvec4) Load 206 + 208: 204(fvec2) VectorShuffle 207 207 0 1 + 209: 6(int) Load 8(invocation) + 210: 204(fvec2) GroupNonUniformBroadcast 38 208 209 + 211: 205(ptr) AccessChain 49(data) 203 124 + 212: 45(fvec4) Load 211 + 213: 45(fvec4) VectorShuffle 212 210 4 5 2 3 + Store 211 213 + 214: 6(int) Load 8(invocation) + 216: 205(ptr) AccessChain 49(data) 51 124 + 217: 45(fvec4) Load 216 + 218: 215(fvec3) VectorShuffle 217 217 0 1 2 + 219: 6(int) Load 8(invocation) + 220: 215(fvec3) GroupNonUniformBroadcast 38 218 219 + 221: 205(ptr) AccessChain 49(data) 214 124 + 222: 45(fvec4) Load 221 + 223: 45(fvec4) VectorShuffle 222 220 4 5 6 3 + Store 221 223 + 224: 6(int) Load 8(invocation) + 225: 205(ptr) AccessChain 49(data) 124 124 + 226: 45(fvec4) Load 225 + 227: 6(int) Load 8(invocation) + 228: 45(fvec4) GroupNonUniformBroadcast 38 226 227 + 229: 205(ptr) AccessChain 49(data) 224 124 + Store 229 228 + 230: 6(int) Load 8(invocation) + 231: 131(ptr) AccessChain 49(data) 61 60 54 + 232: 42(int) Load 231 + 233: 36(bool) SLessThan 232 61 + 234: 6(int) Load 8(invocation) + 235: 36(bool) GroupNonUniformBroadcast 38 233 234 + 236: 42(int) Select 235 60 61 + 237: 131(ptr) AccessChain 49(data) 230 60 54 + Store 237 236 + 238: 6(int) Load 8(invocation) + 239: 139(ptr) AccessChain 49(data) 60 60 + 240: 43(ivec4) Load 239 + 241: 138(ivec2) VectorShuffle 240 240 0 1 + 244: 243(bvec2) SLessThan 241 242 + 245: 6(int) Load 8(invocation) + 246: 243(bvec2) GroupNonUniformBroadcast 38 244 245 + 248: 138(ivec2) Select 246 247 242 + 249: 139(ptr) AccessChain 49(data) 238 60 + 250: 43(ivec4) Load 249 + 251: 43(ivec4) VectorShuffle 250 248 4 5 2 3 + Store 249 251 + 252: 6(int) Load 8(invocation) + 253: 139(ptr) AccessChain 49(data) 60 60 + 254: 43(ivec4) Load 253 + 255: 149(ivec3) VectorShuffle 254 254 0 1 2 + 258: 257(bvec3) SLessThan 255 256 + 259: 6(int) Load 8(invocation) + 260: 257(bvec3) GroupNonUniformBroadcast 38 258 259 + 262: 149(ivec3) Select 260 261 256 + 263: 139(ptr) AccessChain 49(data) 252 60 + 264: 43(ivec4) Load 263 + 265: 43(ivec4) VectorShuffle 264 262 4 5 6 3 + Store 263 265 + 266: 6(int) Load 8(invocation) + 267: 139(ptr) AccessChain 49(data) 60 60 + 268: 43(ivec4) Load 267 + 270: 83(bvec4) SLessThan 268 269 + 271: 6(int) Load 8(invocation) + 272: 83(bvec4) GroupNonUniformBroadcast 38 270 271 + 274: 43(ivec4) Select 272 273 269 + 275: 139(ptr) AccessChain 49(data) 266 60 + Store 275 274 + Branch 94 + 276: Label + 277: 6(int) Load 8(invocation) + 278: 96(ptr) AccessChain 49(data) 61 61 54 + 279: 40(float) Load 278 + 280: 40(float) GroupNonUniformBroadcastFirst 38 279 + 281: 96(ptr) AccessChain 49(data) 277 61 54 + Store 281 280 + 282: 6(int) Load 8(invocation) + 283: 104(ptr) AccessChain 49(data) 60 61 + 284: 41(fvec4) Load 283 + 285: 103(fvec2) VectorShuffle 284 284 0 1 + 286: 103(fvec2) GroupNonUniformBroadcastFirst 38 285 + 287: 104(ptr) AccessChain 49(data) 282 61 + 288: 41(fvec4) Load 287 + 289: 41(fvec4) VectorShuffle 288 286 4 5 2 3 + Store 287 289 + 290: 6(int) Load 8(invocation) + 291: 104(ptr) AccessChain 49(data) 51 61 + 292: 41(fvec4) Load 291 + 293: 114(fvec3) VectorShuffle 292 292 0 1 2 + 294: 114(fvec3) GroupNonUniformBroadcastFirst 38 293 + 295: 104(ptr) AccessChain 49(data) 290 61 + 296: 41(fvec4) Load 295 + 297: 41(fvec4) VectorShuffle 296 294 4 5 6 3 + Store 295 297 + 298: 6(int) Load 8(invocation) + 299: 104(ptr) AccessChain 49(data) 124 61 + 300: 41(fvec4) Load 299 + 301: 41(fvec4) GroupNonUniformBroadcastFirst 38 300 + 302: 104(ptr) AccessChain 49(data) 298 61 + Store 302 301 + 303: 6(int) Load 8(invocation) + 304: 131(ptr) AccessChain 49(data) 61 60 54 + 305: 42(int) Load 304 + 306: 42(int) GroupNonUniformBroadcastFirst 38 305 + 307: 131(ptr) AccessChain 49(data) 303 60 54 + Store 307 306 + 308: 6(int) Load 8(invocation) + 309: 139(ptr) AccessChain 49(data) 60 60 + 310: 43(ivec4) Load 309 + 311: 138(ivec2) VectorShuffle 310 310 0 1 + 312: 138(ivec2) GroupNonUniformBroadcastFirst 38 311 + 313: 139(ptr) AccessChain 49(data) 308 60 + 314: 43(ivec4) Load 313 + 315: 43(ivec4) VectorShuffle 314 312 4 5 2 3 + Store 313 315 + 316: 6(int) Load 8(invocation) + 317: 139(ptr) AccessChain 49(data) 51 60 + 318: 43(ivec4) Load 317 + 319: 149(ivec3) VectorShuffle 318 318 0 1 2 + 320: 149(ivec3) GroupNonUniformBroadcastFirst 38 319 + 321: 139(ptr) AccessChain 49(data) 316 60 + 322: 43(ivec4) Load 321 + 323: 43(ivec4) VectorShuffle 322 320 4 5 6 3 + Store 321 323 + 324: 6(int) Load 8(invocation) + 325: 139(ptr) AccessChain 49(data) 124 60 + 326: 43(ivec4) Load 325 + 327: 43(ivec4) GroupNonUniformBroadcastFirst 38 326 + 328: 139(ptr) AccessChain 49(data) 324 60 + Store 328 327 + 329: 6(int) Load 8(invocation) + 330: 55(ptr) AccessChain 49(data) 61 51 54 + 331: 6(int) Load 330 + 332: 6(int) GroupNonUniformBroadcastFirst 38 331 + 333: 55(ptr) AccessChain 49(data) 329 51 54 + Store 333 332 + 334: 6(int) Load 8(invocation) + 335: 88(ptr) AccessChain 49(data) 60 51 + 336: 17(ivec4) Load 335 + 337: 171(ivec2) VectorShuffle 336 336 0 1 + 338: 171(ivec2) GroupNonUniformBroadcastFirst 38 337 + 339: 88(ptr) AccessChain 49(data) 334 51 + 340: 17(ivec4) Load 339 + 341: 17(ivec4) VectorShuffle 340 338 4 5 2 3 + Store 339 341 + 342: 6(int) Load 8(invocation) + 343: 88(ptr) AccessChain 49(data) 51 51 + 344: 17(ivec4) Load 343 + 345: 181(ivec3) VectorShuffle 344 344 0 1 2 + 346: 181(ivec3) GroupNonUniformBroadcastFirst 38 345 + 347: 88(ptr) AccessChain 49(data) 342 51 + 348: 17(ivec4) Load 347 + 349: 17(ivec4) VectorShuffle 348 346 4 5 6 3 + Store 347 349 + 350: 6(int) Load 8(invocation) + 351: 88(ptr) AccessChain 49(data) 124 51 + 352: 17(ivec4) Load 351 + 353: 17(ivec4) GroupNonUniformBroadcastFirst 38 352 + 354: 88(ptr) AccessChain 49(data) 350 51 + Store 354 353 + 355: 6(int) Load 8(invocation) + 356: 197(ptr) AccessChain 49(data) 61 124 54 + 357: 44(float) Load 356 + 358: 44(float) GroupNonUniformBroadcastFirst 38 357 + 359: 197(ptr) AccessChain 49(data) 355 124 54 + Store 359 358 + 360: 6(int) Load 8(invocation) + 361: 205(ptr) AccessChain 49(data) 60 124 + 362: 45(fvec4) Load 361 + 363: 204(fvec2) VectorShuffle 362 362 0 1 + 364: 204(fvec2) GroupNonUniformBroadcastFirst 38 363 + 365: 205(ptr) AccessChain 49(data) 360 124 + 366: 45(fvec4) Load 365 + 367: 45(fvec4) VectorShuffle 366 364 4 5 2 3 + Store 365 367 + 368: 6(int) Load 8(invocation) + 369: 205(ptr) AccessChain 49(data) 51 124 + 370: 45(fvec4) Load 369 + 371: 215(fvec3) VectorShuffle 370 370 0 1 2 + 372: 215(fvec3) GroupNonUniformBroadcastFirst 38 371 + 373: 205(ptr) AccessChain 49(data) 368 124 + 374: 45(fvec4) Load 373 + 375: 45(fvec4) VectorShuffle 374 372 4 5 6 3 + Store 373 375 + 376: 6(int) Load 8(invocation) + 377: 205(ptr) AccessChain 49(data) 124 124 + 378: 45(fvec4) Load 377 + 379: 45(fvec4) GroupNonUniformBroadcastFirst 38 378 + 380: 205(ptr) AccessChain 49(data) 376 124 + Store 380 379 + 381: 6(int) Load 8(invocation) + 382: 131(ptr) AccessChain 49(data) 61 60 54 + 383: 42(int) Load 382 + 384: 36(bool) SLessThan 383 61 + 385: 36(bool) GroupNonUniformBroadcastFirst 38 384 + 386: 42(int) Select 385 60 61 + 387: 131(ptr) AccessChain 49(data) 381 60 54 + Store 387 386 + 388: 6(int) Load 8(invocation) + 389: 139(ptr) AccessChain 49(data) 60 60 + 390: 43(ivec4) Load 389 + 391: 138(ivec2) VectorShuffle 390 390 0 1 + 392: 243(bvec2) SLessThan 391 242 + 393: 243(bvec2) GroupNonUniformBroadcastFirst 38 392 + 394: 138(ivec2) Select 393 247 242 + 395: 139(ptr) AccessChain 49(data) 388 60 + 396: 43(ivec4) Load 395 + 397: 43(ivec4) VectorShuffle 396 394 4 5 2 3 + Store 395 397 + 398: 6(int) Load 8(invocation) + 399: 139(ptr) AccessChain 49(data) 60 60 + 400: 43(ivec4) Load 399 + 401: 149(ivec3) VectorShuffle 400 400 0 1 2 + 402: 257(bvec3) SLessThan 401 256 + 403: 257(bvec3) GroupNonUniformBroadcastFirst 38 402 + 404: 149(ivec3) Select 403 261 256 + 405: 139(ptr) AccessChain 49(data) 398 60 + 406: 43(ivec4) Load 405 + 407: 43(ivec4) VectorShuffle 406 404 4 5 6 3 + Store 405 407 + 408: 6(int) Load 8(invocation) + 409: 139(ptr) AccessChain 49(data) 60 60 + 410: 43(ivec4) Load 409 + 411: 83(bvec4) SLessThan 410 269 + 412: 83(bvec4) GroupNonUniformBroadcastFirst 38 411 + 413: 43(ivec4) Select 412 273 269 + 414: 139(ptr) AccessChain 49(data) 408 60 + Store 414 413 + Branch 94 + 94: Label + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupBasic.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupBasic.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupBasic.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupBasic.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,84 @@ +spv.subgroupBasic.comp +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 40 + + Capability Shader + Capability GroupNonUniform + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" 14 19 22 25 + ExecutionMode 4 LocalSize 8 8 1 + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_basic" + Name 4 "main" + Name 8 "Buffer" + MemberName 8(Buffer) 0 "a" + Name 10 "data" + Name 14 "gl_SubgroupSize" + Name 19 "gl_SubgroupInvocationID" + Name 22 "gl_NumSubgroups" + Name 25 "gl_SubgroupID" + Decorate 7 ArrayStride 4 + MemberDecorate 8(Buffer) 0 Offset 0 + Decorate 8(Buffer) BufferBlock + Decorate 10(data) DescriptorSet 0 + Decorate 10(data) Binding 0 + Decorate 14(gl_SubgroupSize) RelaxedPrecision + Decorate 14(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 15 RelaxedPrecision + Decorate 19(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 19(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 20 RelaxedPrecision + Decorate 22(gl_NumSubgroups) BuiltIn NumSubgroups + Decorate 25(gl_SubgroupID) BuiltIn SubgroupId + Decorate 39 BuiltIn WorkgroupSize + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 1 + 7: TypeRuntimeArray 6(int) + 8(Buffer): TypeStruct 7 + 9: TypePointer Uniform 8(Buffer) + 10(data): 9(ptr) Variable Uniform + 11: 6(int) Constant 0 + 12: TypeInt 32 0 + 13: TypePointer Input 12(int) +14(gl_SubgroupSize): 13(ptr) Variable Input + 16: 6(int) Constant 1 + 17: TypePointer Uniform 6(int) +19(gl_SubgroupInvocationID): 13(ptr) Variable Input +22(gl_NumSubgroups): 13(ptr) Variable Input +25(gl_SubgroupID): 13(ptr) Variable Input + 27: TypeBool + 28: 12(int) Constant 3 + 32: 12(int) Constant 3400 + 33: 12(int) Constant 72 + 34: 12(int) Constant 264 + 35: 12(int) Constant 2056 + 36: TypeVector 12(int) 3 + 37: 12(int) Constant 8 + 38: 12(int) Constant 1 + 39: 36(ivec3) ConstantComposite 37 37 38 + 4(main): 2 Function None 3 + 5: Label + 15: 12(int) Load 14(gl_SubgroupSize) + 18: 17(ptr) AccessChain 10(data) 11 15 + Store 18 16 + 20: 12(int) Load 19(gl_SubgroupInvocationID) + 21: 17(ptr) AccessChain 10(data) 11 20 + Store 21 16 + 23: 12(int) Load 22(gl_NumSubgroups) + 24: 17(ptr) AccessChain 10(data) 11 23 + Store 24 16 + 26: 12(int) Load 25(gl_SubgroupID) + 29: 27(bool) GroupNonUniformElect 28 + 30: 6(int) Select 29 16 11 + 31: 17(ptr) AccessChain 10(data) 11 26 + Store 31 30 + ControlBarrier 28 28 32 + MemoryBarrier 28 32 + MemoryBarrier 28 33 + MemoryBarrier 28 34 + MemoryBarrier 28 35 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupClustered.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupClustered.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupClustered.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupClustered.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,880 @@ +spv.subgroupClustered.comp +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 737 + + Capability Shader + Capability Float64 + Capability GroupNonUniform + Capability GroupNonUniformClustered + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" 10 12 + ExecutionMode 4 LocalSize 8 1 1 + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_basic" + SourceExtension "GL_KHR_shader_subgroup_clustered" + Name 4 "main" + Name 8 "invocation" + Name 10 "gl_SubgroupInvocationID" + Name 12 "gl_SubgroupSize" + Name 24 "Buffers" + MemberName 24(Buffers) 0 "f4" + MemberName 24(Buffers) 1 "i4" + MemberName 24(Buffers) 2 "u4" + MemberName 24(Buffers) 3 "d4" + Name 27 "data" + Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 11 RelaxedPrecision + Decorate 12(gl_SubgroupSize) RelaxedPrecision + Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 13 RelaxedPrecision + Decorate 14 RelaxedPrecision + Decorate 16 RelaxedPrecision + MemberDecorate 24(Buffers) 0 Offset 0 + MemberDecorate 24(Buffers) 1 Offset 16 + MemberDecorate 24(Buffers) 2 Offset 32 + MemberDecorate 24(Buffers) 3 Offset 64 + Decorate 24(Buffers) BufferBlock + Decorate 27(data) DescriptorSet 0 + Decorate 27(data) Binding 0 + Decorate 736 BuiltIn WorkgroupSize + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypePointer Function 6(int) + 9: TypePointer Input 6(int) +10(gl_SubgroupInvocationID): 9(ptr) Variable Input +12(gl_SubgroupSize): 9(ptr) Variable Input + 15: 6(int) Constant 4 + 17: TypeFloat 32 + 18: TypeVector 17(float) 4 + 19: TypeInt 32 1 + 20: TypeVector 19(int) 4 + 21: TypeVector 6(int) 4 + 22: TypeFloat 64 + 23: TypeVector 22(float) 4 + 24(Buffers): TypeStruct 18(fvec4) 20(ivec4) 21(ivec4) 23(fvec4) + 25: TypeArray 24(Buffers) 15 + 26: TypePointer Uniform 25 + 27(data): 26(ptr) Variable Uniform + 29: 19(int) Constant 0 + 30: 6(int) Constant 0 + 31: TypePointer Uniform 17(float) + 34: 6(int) Constant 1 + 35: 6(int) Constant 3 + 39: 19(int) Constant 1 + 40: TypeVector 17(float) 2 + 41: TypePointer Uniform 18(fvec4) + 50: 19(int) Constant 2 + 51: TypeVector 17(float) 3 + 60: 19(int) Constant 3 + 66: TypePointer Uniform 19(int) + 72: TypeVector 19(int) 2 + 73: TypePointer Uniform 20(ivec4) + 82: TypeVector 19(int) 3 + 96: TypePointer Uniform 6(int) + 102: TypeVector 6(int) 2 + 103: TypePointer Uniform 21(ivec4) + 112: TypeVector 6(int) 3 + 126: TypePointer Uniform 22(float) + 132: TypeVector 22(float) 2 + 133: TypePointer Uniform 23(fvec4) + 142: TypeVector 22(float) 3 + 522: TypeBool + 531: 72(ivec2) ConstantComposite 29 29 + 532: TypeVector 522(bool) 2 + 535: 72(ivec2) ConstantComposite 39 39 + 544: 82(ivec3) ConstantComposite 29 29 29 + 545: TypeVector 522(bool) 3 + 548: 82(ivec3) ConstantComposite 39 39 39 + 556: 20(ivec4) ConstantComposite 29 29 29 29 + 557: TypeVector 522(bool) 4 + 560: 20(ivec4) ConstantComposite 39 39 39 39 + 735: 6(int) Constant 8 + 736: 112(ivec3) ConstantComposite 735 34 34 + 4(main): 2 Function None 3 + 5: Label + 8(invocation): 7(ptr) Variable Function + 11: 6(int) Load 10(gl_SubgroupInvocationID) + 13: 6(int) Load 12(gl_SubgroupSize) + 14: 6(int) IAdd 11 13 + 16: 6(int) UMod 14 15 + Store 8(invocation) 16 + 28: 6(int) Load 8(invocation) + 32: 31(ptr) AccessChain 27(data) 29 29 30 + 33: 17(float) Load 32 + 36: 17(float) GroupNonUniformFAdd 35 ClusteredReduce 33 34 + 37: 31(ptr) AccessChain 27(data) 28 29 30 + Store 37 36 + 38: 6(int) Load 8(invocation) + 42: 41(ptr) AccessChain 27(data) 39 29 + 43: 18(fvec4) Load 42 + 44: 40(fvec2) VectorShuffle 43 43 0 1 + 45: 40(fvec2) GroupNonUniformFAdd 35 ClusteredReduce 44 34 + 46: 41(ptr) AccessChain 27(data) 38 29 + 47: 18(fvec4) Load 46 + 48: 18(fvec4) VectorShuffle 47 45 4 5 2 3 + Store 46 48 + 49: 6(int) Load 8(invocation) + 52: 41(ptr) AccessChain 27(data) 50 29 + 53: 18(fvec4) Load 52 + 54: 51(fvec3) VectorShuffle 53 53 0 1 2 + 55: 51(fvec3) GroupNonUniformFAdd 35 ClusteredReduce 54 34 + 56: 41(ptr) AccessChain 27(data) 49 29 + 57: 18(fvec4) Load 56 + 58: 18(fvec4) VectorShuffle 57 55 4 5 6 3 + Store 56 58 + 59: 6(int) Load 8(invocation) + 61: 41(ptr) AccessChain 27(data) 60 29 + 62: 18(fvec4) Load 61 + 63: 18(fvec4) GroupNonUniformFAdd 35 ClusteredReduce 62 34 + 64: 41(ptr) AccessChain 27(data) 59 29 + Store 64 63 + 65: 6(int) Load 8(invocation) + 67: 66(ptr) AccessChain 27(data) 29 39 30 + 68: 19(int) Load 67 + 69: 19(int) GroupNonUniformIAdd 35 ClusteredReduce 68 34 + 70: 66(ptr) AccessChain 27(data) 65 39 30 + Store 70 69 + 71: 6(int) Load 8(invocation) + 74: 73(ptr) AccessChain 27(data) 39 39 + 75: 20(ivec4) Load 74 + 76: 72(ivec2) VectorShuffle 75 75 0 1 + 77: 72(ivec2) GroupNonUniformIAdd 35 ClusteredReduce 76 34 + 78: 73(ptr) AccessChain 27(data) 71 39 + 79: 20(ivec4) Load 78 + 80: 20(ivec4) VectorShuffle 79 77 4 5 2 3 + Store 78 80 + 81: 6(int) Load 8(invocation) + 83: 73(ptr) AccessChain 27(data) 50 39 + 84: 20(ivec4) Load 83 + 85: 82(ivec3) VectorShuffle 84 84 0 1 2 + 86: 82(ivec3) GroupNonUniformIAdd 35 ClusteredReduce 85 34 + 87: 73(ptr) AccessChain 27(data) 81 39 + 88: 20(ivec4) Load 87 + 89: 20(ivec4) VectorShuffle 88 86 4 5 6 3 + Store 87 89 + 90: 6(int) Load 8(invocation) + 91: 73(ptr) AccessChain 27(data) 60 39 + 92: 20(ivec4) Load 91 + 93: 20(ivec4) GroupNonUniformIAdd 35 ClusteredReduce 92 34 + 94: 73(ptr) AccessChain 27(data) 90 39 + Store 94 93 + 95: 6(int) Load 8(invocation) + 97: 96(ptr) AccessChain 27(data) 29 50 30 + 98: 6(int) Load 97 + 99: 6(int) GroupNonUniformIAdd 35 ClusteredReduce 98 34 + 100: 96(ptr) AccessChain 27(data) 95 50 30 + Store 100 99 + 101: 6(int) Load 8(invocation) + 104: 103(ptr) AccessChain 27(data) 39 50 + 105: 21(ivec4) Load 104 + 106: 102(ivec2) VectorShuffle 105 105 0 1 + 107: 102(ivec2) GroupNonUniformIAdd 35 ClusteredReduce 106 34 + 108: 103(ptr) AccessChain 27(data) 101 50 + 109: 21(ivec4) Load 108 + 110: 21(ivec4) VectorShuffle 109 107 4 5 2 3 + Store 108 110 + 111: 6(int) Load 8(invocation) + 113: 103(ptr) AccessChain 27(data) 50 50 + 114: 21(ivec4) Load 113 + 115: 112(ivec3) VectorShuffle 114 114 0 1 2 + 116: 112(ivec3) GroupNonUniformIAdd 35 ClusteredReduce 115 34 + 117: 103(ptr) AccessChain 27(data) 111 50 + 118: 21(ivec4) Load 117 + 119: 21(ivec4) VectorShuffle 118 116 4 5 6 3 + Store 117 119 + 120: 6(int) Load 8(invocation) + 121: 103(ptr) AccessChain 27(data) 60 50 + 122: 21(ivec4) Load 121 + 123: 21(ivec4) GroupNonUniformIAdd 35 ClusteredReduce 122 34 + 124: 103(ptr) AccessChain 27(data) 120 50 + Store 124 123 + 125: 6(int) Load 8(invocation) + 127: 126(ptr) AccessChain 27(data) 29 60 30 + 128: 22(float) Load 127 + 129: 22(float) GroupNonUniformFAdd 35 ClusteredReduce 128 34 + 130: 126(ptr) AccessChain 27(data) 125 60 30 + Store 130 129 + 131: 6(int) Load 8(invocation) + 134: 133(ptr) AccessChain 27(data) 39 60 + 135: 23(fvec4) Load 134 + 136: 132(fvec2) VectorShuffle 135 135 0 1 + 137: 132(fvec2) GroupNonUniformFAdd 35 ClusteredReduce 136 34 + 138: 133(ptr) AccessChain 27(data) 131 60 + 139: 23(fvec4) Load 138 + 140: 23(fvec4) VectorShuffle 139 137 4 5 2 3 + Store 138 140 + 141: 6(int) Load 8(invocation) + 143: 133(ptr) AccessChain 27(data) 50 60 + 144: 23(fvec4) Load 143 + 145: 142(fvec3) VectorShuffle 144 144 0 1 2 + 146: 142(fvec3) GroupNonUniformFAdd 35 ClusteredReduce 145 34 + 147: 133(ptr) AccessChain 27(data) 141 60 + 148: 23(fvec4) Load 147 + 149: 23(fvec4) VectorShuffle 148 146 4 5 6 3 + Store 147 149 + 150: 6(int) Load 8(invocation) + 151: 133(ptr) AccessChain 27(data) 60 60 + 152: 23(fvec4) Load 151 + 153: 23(fvec4) GroupNonUniformFAdd 35 ClusteredReduce 152 34 + 154: 133(ptr) AccessChain 27(data) 150 60 + Store 154 153 + 155: 6(int) Load 8(invocation) + 156: 31(ptr) AccessChain 27(data) 29 29 30 + 157: 17(float) Load 156 + 158: 17(float) GroupNonUniformFMul 35 ClusteredReduce 157 34 + 159: 31(ptr) AccessChain 27(data) 155 29 30 + Store 159 158 + 160: 6(int) Load 8(invocation) + 161: 41(ptr) AccessChain 27(data) 39 29 + 162: 18(fvec4) Load 161 + 163: 40(fvec2) VectorShuffle 162 162 0 1 + 164: 40(fvec2) GroupNonUniformFMul 35 ClusteredReduce 163 34 + 165: 41(ptr) AccessChain 27(data) 160 29 + 166: 18(fvec4) Load 165 + 167: 18(fvec4) VectorShuffle 166 164 4 5 2 3 + Store 165 167 + 168: 6(int) Load 8(invocation) + 169: 41(ptr) AccessChain 27(data) 50 29 + 170: 18(fvec4) Load 169 + 171: 51(fvec3) VectorShuffle 170 170 0 1 2 + 172: 51(fvec3) GroupNonUniformFMul 35 ClusteredReduce 171 34 + 173: 41(ptr) AccessChain 27(data) 168 29 + 174: 18(fvec4) Load 173 + 175: 18(fvec4) VectorShuffle 174 172 4 5 6 3 + Store 173 175 + 176: 6(int) Load 8(invocation) + 177: 41(ptr) AccessChain 27(data) 60 29 + 178: 18(fvec4) Load 177 + 179: 18(fvec4) GroupNonUniformFMul 35 ClusteredReduce 178 34 + 180: 41(ptr) AccessChain 27(data) 176 29 + Store 180 179 + 181: 6(int) Load 8(invocation) + 182: 66(ptr) AccessChain 27(data) 29 39 30 + 183: 19(int) Load 182 + 184: 19(int) GroupNonUniformIMul 35 ClusteredReduce 183 34 + 185: 66(ptr) AccessChain 27(data) 181 39 30 + Store 185 184 + 186: 6(int) Load 8(invocation) + 187: 73(ptr) AccessChain 27(data) 39 39 + 188: 20(ivec4) Load 187 + 189: 72(ivec2) VectorShuffle 188 188 0 1 + 190: 72(ivec2) GroupNonUniformIMul 35 ClusteredReduce 189 34 + 191: 73(ptr) AccessChain 27(data) 186 39 + 192: 20(ivec4) Load 191 + 193: 20(ivec4) VectorShuffle 192 190 4 5 2 3 + Store 191 193 + 194: 6(int) Load 8(invocation) + 195: 73(ptr) AccessChain 27(data) 50 39 + 196: 20(ivec4) Load 195 + 197: 82(ivec3) VectorShuffle 196 196 0 1 2 + 198: 82(ivec3) GroupNonUniformIMul 35 ClusteredReduce 197 34 + 199: 73(ptr) AccessChain 27(data) 194 39 + 200: 20(ivec4) Load 199 + 201: 20(ivec4) VectorShuffle 200 198 4 5 6 3 + Store 199 201 + 202: 6(int) Load 8(invocation) + 203: 73(ptr) AccessChain 27(data) 60 39 + 204: 20(ivec4) Load 203 + 205: 20(ivec4) GroupNonUniformIMul 35 ClusteredReduce 204 34 + 206: 73(ptr) AccessChain 27(data) 202 39 + Store 206 205 + 207: 6(int) Load 8(invocation) + 208: 96(ptr) AccessChain 27(data) 29 50 30 + 209: 6(int) Load 208 + 210: 6(int) GroupNonUniformIMul 35 ClusteredReduce 209 34 + 211: 96(ptr) AccessChain 27(data) 207 50 30 + Store 211 210 + 212: 6(int) Load 8(invocation) + 213: 103(ptr) AccessChain 27(data) 39 50 + 214: 21(ivec4) Load 213 + 215: 102(ivec2) VectorShuffle 214 214 0 1 + 216: 102(ivec2) GroupNonUniformIMul 35 ClusteredReduce 215 34 + 217: 103(ptr) AccessChain 27(data) 212 50 + 218: 21(ivec4) Load 217 + 219: 21(ivec4) VectorShuffle 218 216 4 5 2 3 + Store 217 219 + 220: 6(int) Load 8(invocation) + 221: 103(ptr) AccessChain 27(data) 50 50 + 222: 21(ivec4) Load 221 + 223: 112(ivec3) VectorShuffle 222 222 0 1 2 + 224: 112(ivec3) GroupNonUniformIMul 35 ClusteredReduce 223 34 + 225: 103(ptr) AccessChain 27(data) 220 50 + 226: 21(ivec4) Load 225 + 227: 21(ivec4) VectorShuffle 226 224 4 5 6 3 + Store 225 227 + 228: 6(int) Load 8(invocation) + 229: 103(ptr) AccessChain 27(data) 60 50 + 230: 21(ivec4) Load 229 + 231: 21(ivec4) GroupNonUniformIMul 35 ClusteredReduce 230 34 + 232: 103(ptr) AccessChain 27(data) 228 50 + Store 232 231 + 233: 6(int) Load 8(invocation) + 234: 126(ptr) AccessChain 27(data) 29 60 30 + 235: 22(float) Load 234 + 236: 22(float) GroupNonUniformFMul 35 ClusteredReduce 235 34 + 237: 126(ptr) AccessChain 27(data) 233 60 30 + Store 237 236 + 238: 6(int) Load 8(invocation) + 239: 133(ptr) AccessChain 27(data) 39 60 + 240: 23(fvec4) Load 239 + 241: 132(fvec2) VectorShuffle 240 240 0 1 + 242: 132(fvec2) GroupNonUniformFMul 35 ClusteredReduce 241 34 + 243: 133(ptr) AccessChain 27(data) 238 60 + 244: 23(fvec4) Load 243 + 245: 23(fvec4) VectorShuffle 244 242 4 5 2 3 + Store 243 245 + 246: 6(int) Load 8(invocation) + 247: 133(ptr) AccessChain 27(data) 50 60 + 248: 23(fvec4) Load 247 + 249: 142(fvec3) VectorShuffle 248 248 0 1 2 + 250: 142(fvec3) GroupNonUniformFMul 35 ClusteredReduce 249 34 + 251: 133(ptr) AccessChain 27(data) 246 60 + 252: 23(fvec4) Load 251 + 253: 23(fvec4) VectorShuffle 252 250 4 5 6 3 + Store 251 253 + 254: 6(int) Load 8(invocation) + 255: 133(ptr) AccessChain 27(data) 60 60 + 256: 23(fvec4) Load 255 + 257: 23(fvec4) GroupNonUniformFMul 35 ClusteredReduce 256 34 + 258: 133(ptr) AccessChain 27(data) 254 60 + Store 258 257 + 259: 6(int) Load 8(invocation) + 260: 31(ptr) AccessChain 27(data) 29 29 30 + 261: 17(float) Load 260 + 262: 17(float) GroupNonUniformFMin 35 ClusteredReduce 261 34 + 263: 31(ptr) AccessChain 27(data) 259 29 30 + Store 263 262 + 264: 6(int) Load 8(invocation) + 265: 41(ptr) AccessChain 27(data) 39 29 + 266: 18(fvec4) Load 265 + 267: 40(fvec2) VectorShuffle 266 266 0 1 + 268: 40(fvec2) GroupNonUniformFMin 35 ClusteredReduce 267 34 + 269: 41(ptr) AccessChain 27(data) 264 29 + 270: 18(fvec4) Load 269 + 271: 18(fvec4) VectorShuffle 270 268 4 5 2 3 + Store 269 271 + 272: 6(int) Load 8(invocation) + 273: 41(ptr) AccessChain 27(data) 50 29 + 274: 18(fvec4) Load 273 + 275: 51(fvec3) VectorShuffle 274 274 0 1 2 + 276: 51(fvec3) GroupNonUniformFMin 35 ClusteredReduce 275 34 + 277: 41(ptr) AccessChain 27(data) 272 29 + 278: 18(fvec4) Load 277 + 279: 18(fvec4) VectorShuffle 278 276 4 5 6 3 + Store 277 279 + 280: 6(int) Load 8(invocation) + 281: 41(ptr) AccessChain 27(data) 60 29 + 282: 18(fvec4) Load 281 + 283: 18(fvec4) GroupNonUniformFMin 35 ClusteredReduce 282 34 + 284: 41(ptr) AccessChain 27(data) 280 29 + Store 284 283 + 285: 6(int) Load 8(invocation) + 286: 66(ptr) AccessChain 27(data) 29 39 30 + 287: 19(int) Load 286 + 288: 19(int) GroupNonUniformSMin 35 ClusteredReduce 287 34 + 289: 66(ptr) AccessChain 27(data) 285 39 30 + Store 289 288 + 290: 6(int) Load 8(invocation) + 291: 73(ptr) AccessChain 27(data) 39 39 + 292: 20(ivec4) Load 291 + 293: 72(ivec2) VectorShuffle 292 292 0 1 + 294: 72(ivec2) GroupNonUniformSMin 35 ClusteredReduce 293 34 + 295: 73(ptr) AccessChain 27(data) 290 39 + 296: 20(ivec4) Load 295 + 297: 20(ivec4) VectorShuffle 296 294 4 5 2 3 + Store 295 297 + 298: 6(int) Load 8(invocation) + 299: 73(ptr) AccessChain 27(data) 50 39 + 300: 20(ivec4) Load 299 + 301: 82(ivec3) VectorShuffle 300 300 0 1 2 + 302: 82(ivec3) GroupNonUniformSMin 35 ClusteredReduce 301 34 + 303: 73(ptr) AccessChain 27(data) 298 39 + 304: 20(ivec4) Load 303 + 305: 20(ivec4) VectorShuffle 304 302 4 5 6 3 + Store 303 305 + 306: 6(int) Load 8(invocation) + 307: 73(ptr) AccessChain 27(data) 60 39 + 308: 20(ivec4) Load 307 + 309: 20(ivec4) GroupNonUniformSMin 35 ClusteredReduce 308 34 + 310: 73(ptr) AccessChain 27(data) 306 39 + Store 310 309 + 311: 6(int) Load 8(invocation) + 312: 96(ptr) AccessChain 27(data) 29 50 30 + 313: 6(int) Load 312 + 314: 6(int) GroupNonUniformUMin 35 ClusteredReduce 313 34 + 315: 96(ptr) AccessChain 27(data) 311 50 30 + Store 315 314 + 316: 6(int) Load 8(invocation) + 317: 103(ptr) AccessChain 27(data) 39 50 + 318: 21(ivec4) Load 317 + 319: 102(ivec2) VectorShuffle 318 318 0 1 + 320: 102(ivec2) GroupNonUniformUMin 35 ClusteredReduce 319 34 + 321: 103(ptr) AccessChain 27(data) 316 50 + 322: 21(ivec4) Load 321 + 323: 21(ivec4) VectorShuffle 322 320 4 5 2 3 + Store 321 323 + 324: 6(int) Load 8(invocation) + 325: 103(ptr) AccessChain 27(data) 50 50 + 326: 21(ivec4) Load 325 + 327: 112(ivec3) VectorShuffle 326 326 0 1 2 + 328: 112(ivec3) GroupNonUniformUMin 35 ClusteredReduce 327 34 + 329: 103(ptr) AccessChain 27(data) 324 50 + 330: 21(ivec4) Load 329 + 331: 21(ivec4) VectorShuffle 330 328 4 5 6 3 + Store 329 331 + 332: 6(int) Load 8(invocation) + 333: 103(ptr) AccessChain 27(data) 60 50 + 334: 21(ivec4) Load 333 + 335: 21(ivec4) GroupNonUniformUMin 35 ClusteredReduce 334 34 + 336: 103(ptr) AccessChain 27(data) 332 50 + Store 336 335 + 337: 6(int) Load 8(invocation) + 338: 126(ptr) AccessChain 27(data) 29 60 30 + 339: 22(float) Load 338 + 340: 22(float) GroupNonUniformFMin 35 ClusteredReduce 339 34 + 341: 126(ptr) AccessChain 27(data) 337 60 30 + Store 341 340 + 342: 6(int) Load 8(invocation) + 343: 133(ptr) AccessChain 27(data) 39 60 + 344: 23(fvec4) Load 343 + 345: 132(fvec2) VectorShuffle 344 344 0 1 + 346: 132(fvec2) GroupNonUniformFMin 35 ClusteredReduce 345 34 + 347: 133(ptr) AccessChain 27(data) 342 60 + 348: 23(fvec4) Load 347 + 349: 23(fvec4) VectorShuffle 348 346 4 5 2 3 + Store 347 349 + 350: 6(int) Load 8(invocation) + 351: 133(ptr) AccessChain 27(data) 50 60 + 352: 23(fvec4) Load 351 + 353: 142(fvec3) VectorShuffle 352 352 0 1 2 + 354: 142(fvec3) GroupNonUniformFMin 35 ClusteredReduce 353 34 + 355: 133(ptr) AccessChain 27(data) 350 60 + 356: 23(fvec4) Load 355 + 357: 23(fvec4) VectorShuffle 356 354 4 5 6 3 + Store 355 357 + 358: 6(int) Load 8(invocation) + 359: 133(ptr) AccessChain 27(data) 60 60 + 360: 23(fvec4) Load 359 + 361: 23(fvec4) GroupNonUniformFMin 35 ClusteredReduce 360 34 + 362: 133(ptr) AccessChain 27(data) 358 60 + Store 362 361 + 363: 6(int) Load 8(invocation) + 364: 31(ptr) AccessChain 27(data) 29 29 30 + 365: 17(float) Load 364 + 366: 17(float) GroupNonUniformFMax 35 ClusteredReduce 365 34 + 367: 31(ptr) AccessChain 27(data) 363 29 30 + Store 367 366 + 368: 6(int) Load 8(invocation) + 369: 41(ptr) AccessChain 27(data) 39 29 + 370: 18(fvec4) Load 369 + 371: 40(fvec2) VectorShuffle 370 370 0 1 + 372: 40(fvec2) GroupNonUniformFMax 35 ClusteredReduce 371 34 + 373: 41(ptr) AccessChain 27(data) 368 29 + 374: 18(fvec4) Load 373 + 375: 18(fvec4) VectorShuffle 374 372 4 5 2 3 + Store 373 375 + 376: 6(int) Load 8(invocation) + 377: 41(ptr) AccessChain 27(data) 50 29 + 378: 18(fvec4) Load 377 + 379: 51(fvec3) VectorShuffle 378 378 0 1 2 + 380: 51(fvec3) GroupNonUniformFMax 35 ClusteredReduce 379 34 + 381: 41(ptr) AccessChain 27(data) 376 29 + 382: 18(fvec4) Load 381 + 383: 18(fvec4) VectorShuffle 382 380 4 5 6 3 + Store 381 383 + 384: 6(int) Load 8(invocation) + 385: 41(ptr) AccessChain 27(data) 60 29 + 386: 18(fvec4) Load 385 + 387: 18(fvec4) GroupNonUniformFMax 35 ClusteredReduce 386 34 + 388: 41(ptr) AccessChain 27(data) 384 29 + Store 388 387 + 389: 6(int) Load 8(invocation) + 390: 66(ptr) AccessChain 27(data) 29 39 30 + 391: 19(int) Load 390 + 392: 19(int) GroupNonUniformSMax 35 ClusteredReduce 391 34 + 393: 66(ptr) AccessChain 27(data) 389 39 30 + Store 393 392 + 394: 6(int) Load 8(invocation) + 395: 73(ptr) AccessChain 27(data) 39 39 + 396: 20(ivec4) Load 395 + 397: 72(ivec2) VectorShuffle 396 396 0 1 + 398: 72(ivec2) GroupNonUniformSMax 35 ClusteredReduce 397 34 + 399: 73(ptr) AccessChain 27(data) 394 39 + 400: 20(ivec4) Load 399 + 401: 20(ivec4) VectorShuffle 400 398 4 5 2 3 + Store 399 401 + 402: 6(int) Load 8(invocation) + 403: 73(ptr) AccessChain 27(data) 50 39 + 404: 20(ivec4) Load 403 + 405: 82(ivec3) VectorShuffle 404 404 0 1 2 + 406: 82(ivec3) GroupNonUniformSMax 35 ClusteredReduce 405 34 + 407: 73(ptr) AccessChain 27(data) 402 39 + 408: 20(ivec4) Load 407 + 409: 20(ivec4) VectorShuffle 408 406 4 5 6 3 + Store 407 409 + 410: 6(int) Load 8(invocation) + 411: 73(ptr) AccessChain 27(data) 60 39 + 412: 20(ivec4) Load 411 + 413: 20(ivec4) GroupNonUniformSMax 35 ClusteredReduce 412 34 + 414: 73(ptr) AccessChain 27(data) 410 39 + Store 414 413 + 415: 6(int) Load 8(invocation) + 416: 96(ptr) AccessChain 27(data) 29 50 30 + 417: 6(int) Load 416 + 418: 6(int) GroupNonUniformUMax 35 ClusteredReduce 417 34 + 419: 96(ptr) AccessChain 27(data) 415 50 30 + Store 419 418 + 420: 6(int) Load 8(invocation) + 421: 103(ptr) AccessChain 27(data) 39 50 + 422: 21(ivec4) Load 421 + 423: 102(ivec2) VectorShuffle 422 422 0 1 + 424: 102(ivec2) GroupNonUniformUMax 35 ClusteredReduce 423 34 + 425: 103(ptr) AccessChain 27(data) 420 50 + 426: 21(ivec4) Load 425 + 427: 21(ivec4) VectorShuffle 426 424 4 5 2 3 + Store 425 427 + 428: 6(int) Load 8(invocation) + 429: 103(ptr) AccessChain 27(data) 50 50 + 430: 21(ivec4) Load 429 + 431: 112(ivec3) VectorShuffle 430 430 0 1 2 + 432: 112(ivec3) GroupNonUniformUMax 35 ClusteredReduce 431 34 + 433: 103(ptr) AccessChain 27(data) 428 50 + 434: 21(ivec4) Load 433 + 435: 21(ivec4) VectorShuffle 434 432 4 5 6 3 + Store 433 435 + 436: 6(int) Load 8(invocation) + 437: 103(ptr) AccessChain 27(data) 60 50 + 438: 21(ivec4) Load 437 + 439: 21(ivec4) GroupNonUniformUMax 35 ClusteredReduce 438 34 + 440: 103(ptr) AccessChain 27(data) 436 50 + Store 440 439 + 441: 6(int) Load 8(invocation) + 442: 126(ptr) AccessChain 27(data) 29 60 30 + 443: 22(float) Load 442 + 444: 22(float) GroupNonUniformFMax 35 ClusteredReduce 443 34 + 445: 126(ptr) AccessChain 27(data) 441 60 30 + Store 445 444 + 446: 6(int) Load 8(invocation) + 447: 133(ptr) AccessChain 27(data) 39 60 + 448: 23(fvec4) Load 447 + 449: 132(fvec2) VectorShuffle 448 448 0 1 + 450: 132(fvec2) GroupNonUniformFMax 35 ClusteredReduce 449 34 + 451: 133(ptr) AccessChain 27(data) 446 60 + 452: 23(fvec4) Load 451 + 453: 23(fvec4) VectorShuffle 452 450 4 5 2 3 + Store 451 453 + 454: 6(int) Load 8(invocation) + 455: 133(ptr) AccessChain 27(data) 50 60 + 456: 23(fvec4) Load 455 + 457: 142(fvec3) VectorShuffle 456 456 0 1 2 + 458: 142(fvec3) GroupNonUniformFMax 35 ClusteredReduce 457 34 + 459: 133(ptr) AccessChain 27(data) 454 60 + 460: 23(fvec4) Load 459 + 461: 23(fvec4) VectorShuffle 460 458 4 5 6 3 + Store 459 461 + 462: 6(int) Load 8(invocation) + 463: 133(ptr) AccessChain 27(data) 60 60 + 464: 23(fvec4) Load 463 + 465: 23(fvec4) GroupNonUniformFMax 35 ClusteredReduce 464 34 + 466: 133(ptr) AccessChain 27(data) 462 60 + Store 466 465 + 467: 6(int) Load 8(invocation) + 468: 66(ptr) AccessChain 27(data) 29 39 30 + 469: 19(int) Load 468 + 470: 19(int) GroupNonUniformBitwiseAnd 35 ClusteredReduce 469 34 + 471: 66(ptr) AccessChain 27(data) 467 39 30 + Store 471 470 + 472: 6(int) Load 8(invocation) + 473: 73(ptr) AccessChain 27(data) 39 39 + 474: 20(ivec4) Load 473 + 475: 72(ivec2) VectorShuffle 474 474 0 1 + 476: 72(ivec2) GroupNonUniformBitwiseAnd 35 ClusteredReduce 475 34 + 477: 73(ptr) AccessChain 27(data) 472 39 + 478: 20(ivec4) Load 477 + 479: 20(ivec4) VectorShuffle 478 476 4 5 2 3 + Store 477 479 + 480: 6(int) Load 8(invocation) + 481: 73(ptr) AccessChain 27(data) 50 39 + 482: 20(ivec4) Load 481 + 483: 82(ivec3) VectorShuffle 482 482 0 1 2 + 484: 82(ivec3) GroupNonUniformBitwiseAnd 35 ClusteredReduce 483 34 + 485: 73(ptr) AccessChain 27(data) 480 39 + 486: 20(ivec4) Load 485 + 487: 20(ivec4) VectorShuffle 486 484 4 5 6 3 + Store 485 487 + 488: 6(int) Load 8(invocation) + 489: 73(ptr) AccessChain 27(data) 60 39 + 490: 20(ivec4) Load 489 + 491: 20(ivec4) GroupNonUniformBitwiseAnd 35 ClusteredReduce 490 34 + 492: 73(ptr) AccessChain 27(data) 488 39 + Store 492 491 + 493: 6(int) Load 8(invocation) + 494: 96(ptr) AccessChain 27(data) 29 50 30 + 495: 6(int) Load 494 + 496: 6(int) GroupNonUniformBitwiseAnd 35 ClusteredReduce 495 34 + 497: 96(ptr) AccessChain 27(data) 493 50 30 + Store 497 496 + 498: 6(int) Load 8(invocation) + 499: 103(ptr) AccessChain 27(data) 39 50 + 500: 21(ivec4) Load 499 + 501: 102(ivec2) VectorShuffle 500 500 0 1 + 502: 102(ivec2) GroupNonUniformBitwiseAnd 35 ClusteredReduce 501 34 + 503: 103(ptr) AccessChain 27(data) 498 50 + 504: 21(ivec4) Load 503 + 505: 21(ivec4) VectorShuffle 504 502 4 5 2 3 + Store 503 505 + 506: 6(int) Load 8(invocation) + 507: 103(ptr) AccessChain 27(data) 50 50 + 508: 21(ivec4) Load 507 + 509: 112(ivec3) VectorShuffle 508 508 0 1 2 + 510: 112(ivec3) GroupNonUniformBitwiseAnd 35 ClusteredReduce 509 34 + 511: 103(ptr) AccessChain 27(data) 506 50 + 512: 21(ivec4) Load 511 + 513: 21(ivec4) VectorShuffle 512 510 4 5 6 3 + Store 511 513 + 514: 6(int) Load 8(invocation) + 515: 103(ptr) AccessChain 27(data) 60 50 + 516: 21(ivec4) Load 515 + 517: 21(ivec4) GroupNonUniformBitwiseAnd 35 ClusteredReduce 516 34 + 518: 103(ptr) AccessChain 27(data) 514 50 + Store 518 517 + 519: 6(int) Load 8(invocation) + 520: 66(ptr) AccessChain 27(data) 29 39 30 + 521: 19(int) Load 520 + 523: 522(bool) SLessThan 521 29 + 524: 522(bool) GroupNonUniformLogicalAnd 35 ClusteredReduce 523 34 + 525: 19(int) Select 524 39 29 + 526: 66(ptr) AccessChain 27(data) 519 39 30 + Store 526 525 + 527: 6(int) Load 8(invocation) + 528: 73(ptr) AccessChain 27(data) 39 39 + 529: 20(ivec4) Load 528 + 530: 72(ivec2) VectorShuffle 529 529 0 1 + 533: 532(bvec2) SLessThan 530 531 + 534: 532(bvec2) GroupNonUniformLogicalAnd 35 ClusteredReduce 533 34 + 536: 72(ivec2) Select 534 535 531 + 537: 73(ptr) AccessChain 27(data) 527 39 + 538: 20(ivec4) Load 537 + 539: 20(ivec4) VectorShuffle 538 536 4 5 2 3 + Store 537 539 + 540: 6(int) Load 8(invocation) + 541: 73(ptr) AccessChain 27(data) 39 39 + 542: 20(ivec4) Load 541 + 543: 82(ivec3) VectorShuffle 542 542 0 1 2 + 546: 545(bvec3) SLessThan 543 544 + 547: 545(bvec3) GroupNonUniformLogicalAnd 35 ClusteredReduce 546 34 + 549: 82(ivec3) Select 547 548 544 + 550: 73(ptr) AccessChain 27(data) 540 39 + 551: 20(ivec4) Load 550 + 552: 20(ivec4) VectorShuffle 551 549 4 5 6 3 + Store 550 552 + 553: 6(int) Load 8(invocation) + 554: 73(ptr) AccessChain 27(data) 39 39 + 555: 20(ivec4) Load 554 + 558: 557(bvec4) SLessThan 555 556 + 559: 557(bvec4) GroupNonUniformLogicalAnd 35 ClusteredReduce 558 34 + 561: 20(ivec4) Select 559 560 556 + 562: 73(ptr) AccessChain 27(data) 553 39 + Store 562 561 + 563: 6(int) Load 8(invocation) + 564: 66(ptr) AccessChain 27(data) 29 39 30 + 565: 19(int) Load 564 + 566: 19(int) GroupNonUniformBitwiseOr 35 ClusteredReduce 565 34 + 567: 66(ptr) AccessChain 27(data) 563 39 30 + Store 567 566 + 568: 6(int) Load 8(invocation) + 569: 73(ptr) AccessChain 27(data) 39 39 + 570: 20(ivec4) Load 569 + 571: 72(ivec2) VectorShuffle 570 570 0 1 + 572: 72(ivec2) GroupNonUniformBitwiseOr 35 ClusteredReduce 571 34 + 573: 73(ptr) AccessChain 27(data) 568 39 + 574: 20(ivec4) Load 573 + 575: 20(ivec4) VectorShuffle 574 572 4 5 2 3 + Store 573 575 + 576: 6(int) Load 8(invocation) + 577: 73(ptr) AccessChain 27(data) 50 39 + 578: 20(ivec4) Load 577 + 579: 82(ivec3) VectorShuffle 578 578 0 1 2 + 580: 82(ivec3) GroupNonUniformBitwiseOr 35 ClusteredReduce 579 34 + 581: 73(ptr) AccessChain 27(data) 576 39 + 582: 20(ivec4) Load 581 + 583: 20(ivec4) VectorShuffle 582 580 4 5 6 3 + Store 581 583 + 584: 6(int) Load 8(invocation) + 585: 73(ptr) AccessChain 27(data) 60 39 + 586: 20(ivec4) Load 585 + 587: 20(ivec4) GroupNonUniformBitwiseOr 35 ClusteredReduce 586 34 + 588: 73(ptr) AccessChain 27(data) 584 39 + Store 588 587 + 589: 6(int) Load 8(invocation) + 590: 96(ptr) AccessChain 27(data) 29 50 30 + 591: 6(int) Load 590 + 592: 6(int) GroupNonUniformBitwiseOr 35 ClusteredReduce 591 34 + 593: 96(ptr) AccessChain 27(data) 589 50 30 + Store 593 592 + 594: 6(int) Load 8(invocation) + 595: 103(ptr) AccessChain 27(data) 39 50 + 596: 21(ivec4) Load 595 + 597: 102(ivec2) VectorShuffle 596 596 0 1 + 598: 102(ivec2) GroupNonUniformBitwiseOr 35 ClusteredReduce 597 34 + 599: 103(ptr) AccessChain 27(data) 594 50 + 600: 21(ivec4) Load 599 + 601: 21(ivec4) VectorShuffle 600 598 4 5 2 3 + Store 599 601 + 602: 6(int) Load 8(invocation) + 603: 103(ptr) AccessChain 27(data) 50 50 + 604: 21(ivec4) Load 603 + 605: 112(ivec3) VectorShuffle 604 604 0 1 2 + 606: 112(ivec3) GroupNonUniformBitwiseOr 35 ClusteredReduce 605 34 + 607: 103(ptr) AccessChain 27(data) 602 50 + 608: 21(ivec4) Load 607 + 609: 21(ivec4) VectorShuffle 608 606 4 5 6 3 + Store 607 609 + 610: 6(int) Load 8(invocation) + 611: 103(ptr) AccessChain 27(data) 60 50 + 612: 21(ivec4) Load 611 + 613: 21(ivec4) GroupNonUniformBitwiseOr 35 ClusteredReduce 612 34 + 614: 103(ptr) AccessChain 27(data) 610 50 + Store 614 613 + 615: 6(int) Load 8(invocation) + 616: 66(ptr) AccessChain 27(data) 29 39 30 + 617: 19(int) Load 616 + 618: 522(bool) SLessThan 617 29 + 619: 522(bool) GroupNonUniformLogicalOr 35 ClusteredReduce 618 34 + 620: 19(int) Select 619 39 29 + 621: 66(ptr) AccessChain 27(data) 615 39 30 + Store 621 620 + 622: 6(int) Load 8(invocation) + 623: 73(ptr) AccessChain 27(data) 39 39 + 624: 20(ivec4) Load 623 + 625: 72(ivec2) VectorShuffle 624 624 0 1 + 626: 532(bvec2) SLessThan 625 531 + 627: 532(bvec2) GroupNonUniformLogicalOr 35 ClusteredReduce 626 34 + 628: 72(ivec2) Select 627 535 531 + 629: 73(ptr) AccessChain 27(data) 622 39 + 630: 20(ivec4) Load 629 + 631: 20(ivec4) VectorShuffle 630 628 4 5 2 3 + Store 629 631 + 632: 6(int) Load 8(invocation) + 633: 73(ptr) AccessChain 27(data) 39 39 + 634: 20(ivec4) Load 633 + 635: 82(ivec3) VectorShuffle 634 634 0 1 2 + 636: 545(bvec3) SLessThan 635 544 + 637: 545(bvec3) GroupNonUniformLogicalOr 35 ClusteredReduce 636 34 + 638: 82(ivec3) Select 637 548 544 + 639: 73(ptr) AccessChain 27(data) 632 39 + 640: 20(ivec4) Load 639 + 641: 20(ivec4) VectorShuffle 640 638 4 5 6 3 + Store 639 641 + 642: 6(int) Load 8(invocation) + 643: 73(ptr) AccessChain 27(data) 39 39 + 644: 20(ivec4) Load 643 + 645: 557(bvec4) SLessThan 644 556 + 646: 557(bvec4) GroupNonUniformLogicalOr 35 ClusteredReduce 645 34 + 647: 20(ivec4) Select 646 560 556 + 648: 73(ptr) AccessChain 27(data) 642 39 + Store 648 647 + 649: 6(int) Load 8(invocation) + 650: 66(ptr) AccessChain 27(data) 29 39 30 + 651: 19(int) Load 650 + 652: 19(int) GroupNonUniformBitwiseXor 35 ClusteredReduce 651 34 + 653: 66(ptr) AccessChain 27(data) 649 39 30 + Store 653 652 + 654: 6(int) Load 8(invocation) + 655: 73(ptr) AccessChain 27(data) 39 39 + 656: 20(ivec4) Load 655 + 657: 72(ivec2) VectorShuffle 656 656 0 1 + 658: 72(ivec2) GroupNonUniformBitwiseXor 35 ClusteredReduce 657 34 + 659: 73(ptr) AccessChain 27(data) 654 39 + 660: 20(ivec4) Load 659 + 661: 20(ivec4) VectorShuffle 660 658 4 5 2 3 + Store 659 661 + 662: 6(int) Load 8(invocation) + 663: 73(ptr) AccessChain 27(data) 50 39 + 664: 20(ivec4) Load 663 + 665: 82(ivec3) VectorShuffle 664 664 0 1 2 + 666: 82(ivec3) GroupNonUniformBitwiseXor 35 ClusteredReduce 665 34 + 667: 73(ptr) AccessChain 27(data) 662 39 + 668: 20(ivec4) Load 667 + 669: 20(ivec4) VectorShuffle 668 666 4 5 6 3 + Store 667 669 + 670: 6(int) Load 8(invocation) + 671: 73(ptr) AccessChain 27(data) 60 39 + 672: 20(ivec4) Load 671 + 673: 20(ivec4) GroupNonUniformBitwiseXor 35 ClusteredReduce 672 34 + 674: 73(ptr) AccessChain 27(data) 670 39 + Store 674 673 + 675: 6(int) Load 8(invocation) + 676: 96(ptr) AccessChain 27(data) 29 50 30 + 677: 6(int) Load 676 + 678: 6(int) GroupNonUniformBitwiseXor 35 ClusteredReduce 677 34 + 679: 96(ptr) AccessChain 27(data) 675 50 30 + Store 679 678 + 680: 6(int) Load 8(invocation) + 681: 103(ptr) AccessChain 27(data) 39 50 + 682: 21(ivec4) Load 681 + 683: 102(ivec2) VectorShuffle 682 682 0 1 + 684: 102(ivec2) GroupNonUniformBitwiseXor 35 ClusteredReduce 683 34 + 685: 103(ptr) AccessChain 27(data) 680 50 + 686: 21(ivec4) Load 685 + 687: 21(ivec4) VectorShuffle 686 684 4 5 2 3 + Store 685 687 + 688: 6(int) Load 8(invocation) + 689: 103(ptr) AccessChain 27(data) 50 50 + 690: 21(ivec4) Load 689 + 691: 112(ivec3) VectorShuffle 690 690 0 1 2 + 692: 112(ivec3) GroupNonUniformBitwiseXor 35 ClusteredReduce 691 34 + 693: 103(ptr) AccessChain 27(data) 688 50 + 694: 21(ivec4) Load 693 + 695: 21(ivec4) VectorShuffle 694 692 4 5 6 3 + Store 693 695 + 696: 6(int) Load 8(invocation) + 697: 103(ptr) AccessChain 27(data) 60 50 + 698: 21(ivec4) Load 697 + 699: 21(ivec4) GroupNonUniformBitwiseXor 35 ClusteredReduce 698 34 + 700: 103(ptr) AccessChain 27(data) 696 50 + Store 700 699 + 701: 6(int) Load 8(invocation) + 702: 66(ptr) AccessChain 27(data) 29 39 30 + 703: 19(int) Load 702 + 704: 522(bool) SLessThan 703 29 + 705: 522(bool) GroupNonUniformLogicalXor 35 ClusteredReduce 704 34 + 706: 19(int) Select 705 39 29 + 707: 66(ptr) AccessChain 27(data) 701 39 30 + Store 707 706 + 708: 6(int) Load 8(invocation) + 709: 73(ptr) AccessChain 27(data) 39 39 + 710: 20(ivec4) Load 709 + 711: 72(ivec2) VectorShuffle 710 710 0 1 + 712: 532(bvec2) SLessThan 711 531 + 713: 532(bvec2) GroupNonUniformLogicalXor 35 ClusteredReduce 712 34 + 714: 72(ivec2) Select 713 535 531 + 715: 73(ptr) AccessChain 27(data) 708 39 + 716: 20(ivec4) Load 715 + 717: 20(ivec4) VectorShuffle 716 714 4 5 2 3 + Store 715 717 + 718: 6(int) Load 8(invocation) + 719: 73(ptr) AccessChain 27(data) 39 39 + 720: 20(ivec4) Load 719 + 721: 82(ivec3) VectorShuffle 720 720 0 1 2 + 722: 545(bvec3) SLessThan 721 544 + 723: 545(bvec3) GroupNonUniformLogicalXor 35 ClusteredReduce 722 34 + 724: 82(ivec3) Select 723 548 544 + 725: 73(ptr) AccessChain 27(data) 718 39 + 726: 20(ivec4) Load 725 + 727: 20(ivec4) VectorShuffle 726 724 4 5 6 3 + Store 725 727 + 728: 6(int) Load 8(invocation) + 729: 73(ptr) AccessChain 27(data) 39 39 + 730: 20(ivec4) Load 729 + 731: 557(bvec4) SLessThan 730 556 + 732: 557(bvec4) GroupNonUniformLogicalXor 35 ClusteredReduce 731 34 + 733: 20(ivec4) Select 732 560 556 + 734: 73(ptr) AccessChain 27(data) 728 39 + Store 734 733 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupClusteredNeg.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupClusteredNeg.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupClusteredNeg.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupClusteredNeg.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,13 @@ +spv.subgroupClusteredNeg.comp +ERROR: 0:22: 'cluster size' : argument must be at least 1 +ERROR: 0:24: 'cluster size' : argument must be a power of 2 +ERROR: 0:27: 'cluster size' : argument must be a power of 2 +ERROR: 0:29: 'cluster size' : argument must be at least 1 +ERROR: 0:31: 'cluster size' : argument must be at least 1 +ERROR: 0:33: 'cluster size' : argument must be compile-time constant +ERROR: 0:36: 'cluster size' : argument must be compile-time constant +ERROR: 0:37: 'cluster size' : argument must be compile-time constant +ERROR: 8 compilation errors. No code generated. + + +SPIR-V is not generated for failed compile or link diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroup.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroup.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroup.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroup.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,44 @@ +spv.subgroup.frag +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 17 + + Capability Shader + Capability GroupNonUniform + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 9 11 13 + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_basic" + Name 4 "main" + Name 9 "data" + Name 11 "gl_SubgroupSize" + Name 13 "gl_SubgroupInvocationID" + Decorate 9(data) Location 0 + Decorate 11(gl_SubgroupSize) RelaxedPrecision + Decorate 11(gl_SubgroupSize) Flat + Decorate 11(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 12 RelaxedPrecision + Decorate 13(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 13(gl_SubgroupInvocationID) Flat + Decorate 13(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 14 RelaxedPrecision + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypeVector 6(int) 4 + 8: TypePointer Output 7(ivec4) + 9(data): 8(ptr) Variable Output + 10: TypePointer Input 6(int) +11(gl_SubgroupSize): 10(ptr) Variable Input +13(gl_SubgroupInvocationID): 10(ptr) Variable Input + 15: 6(int) Constant 0 + 4(main): 2 Function None 3 + 5: Label + 12: 6(int) Load 11(gl_SubgroupSize) + 14: 6(int) Load 13(gl_SubgroupInvocationID) + 16: 7(ivec4) CompositeConstruct 12 14 15 15 + Store 9(data) 16 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroup.geom.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroup.geom.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroup.geom.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroup.geom.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,62 @@ +spv.subgroup.geom +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 26 + + Capability Geometry + Capability GroupNonUniform + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Geometry 4 "main" 15 18 20 + ExecutionMode 4 InputPoints + ExecutionMode 4 Invocations 1 + ExecutionMode 4 OutputPoints + ExecutionMode 4 OutputVertices 1 + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_basic" + Name 4 "main" + Name 9 "Output" + MemberName 9(Output) 0 "result" + Name 11 "" + Name 15 "gl_PrimitiveIDIn" + Name 18 "gl_SubgroupSize" + Name 20 "gl_SubgroupInvocationID" + Decorate 8 ArrayStride 16 + MemberDecorate 9(Output) 0 Offset 0 + Decorate 9(Output) BufferBlock + Decorate 11 DescriptorSet 0 + Decorate 11 Binding 0 + Decorate 15(gl_PrimitiveIDIn) BuiltIn PrimitiveId + Decorate 18(gl_SubgroupSize) RelaxedPrecision + Decorate 18(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 19 RelaxedPrecision + Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 21 RelaxedPrecision + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypeVector 6(int) 4 + 8: TypeRuntimeArray 7(ivec4) + 9(Output): TypeStruct 8 + 10: TypePointer Uniform 9(Output) + 11: 10(ptr) Variable Uniform + 12: TypeInt 32 1 + 13: 12(int) Constant 0 + 14: TypePointer Input 12(int) +15(gl_PrimitiveIDIn): 14(ptr) Variable Input + 17: TypePointer Input 6(int) +18(gl_SubgroupSize): 17(ptr) Variable Input +20(gl_SubgroupInvocationID): 17(ptr) Variable Input + 22: 6(int) Constant 0 + 24: TypePointer Uniform 7(ivec4) + 4(main): 2 Function None 3 + 5: Label + 16: 12(int) Load 15(gl_PrimitiveIDIn) + 19: 6(int) Load 18(gl_SubgroupSize) + 21: 6(int) Load 20(gl_SubgroupInvocationID) + 23: 7(ivec4) CompositeConstruct 19 21 22 22 + 25: 24(ptr) AccessChain 11 13 16 + Store 25 23 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupPartitioned.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupPartitioned.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupPartitioned.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupPartitioned.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,2872 @@ +spv.subgroupPartitioned.comp +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 2506 + + Capability Shader + Capability Float64 + Capability GroupNonUniform + Capability GroupNonUniformPartitionedNV + Extension "SPV_NV_shader_subgroup_partitioned" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" 10 12 + ExecutionMode 4 LocalSize 8 1 1 + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_basic" + SourceExtension "GL_NV_shader_subgroup_partitioned" + Name 4 "main" + Name 8 "invocation" + Name 10 "gl_SubgroupInvocationID" + Name 12 "gl_SubgroupSize" + Name 19 "ballot" + Name 28 "Buffers" + MemberName 28(Buffers) 0 "f4" + MemberName 28(Buffers) 1 "i4" + MemberName 28(Buffers) 2 "u4" + MemberName 28(Buffers) 3 "d4" + Name 31 "data" + Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 11 RelaxedPrecision + Decorate 12(gl_SubgroupSize) RelaxedPrecision + Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 13 RelaxedPrecision + Decorate 14 RelaxedPrecision + Decorate 16 RelaxedPrecision + MemberDecorate 28(Buffers) 0 Offset 0 + MemberDecorate 28(Buffers) 1 Offset 16 + MemberDecorate 28(Buffers) 2 Offset 32 + MemberDecorate 28(Buffers) 3 Offset 64 + Decorate 28(Buffers) BufferBlock + Decorate 31(data) DescriptorSet 0 + Decorate 31(data) Binding 0 + Decorate 2505 BuiltIn WorkgroupSize + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypePointer Function 6(int) + 9: TypePointer Input 6(int) +10(gl_SubgroupInvocationID): 9(ptr) Variable Input +12(gl_SubgroupSize): 9(ptr) Variable Input + 15: 6(int) Constant 4 + 17: TypeVector 6(int) 4 + 18: TypePointer Function 17(ivec4) + 22: TypeFloat 32 + 23: TypeVector 22(float) 4 + 24: TypeInt 32 1 + 25: TypeVector 24(int) 4 + 26: TypeFloat 64 + 27: TypeVector 26(float) 4 + 28(Buffers): TypeStruct 23(fvec4) 25(ivec4) 17(ivec4) 27(fvec4) + 29: TypeArray 28(Buffers) 15 + 30: TypePointer Uniform 29 + 31(data): 30(ptr) Variable Uniform + 33: 24(int) Constant 2 + 34: 24(int) Constant 0 + 35: 6(int) Constant 0 + 36: TypePointer Uniform 22(float) + 40: TypePointer Uniform 17(ivec4) + 43: TypeVector 22(float) 2 + 44: TypePointer Uniform 23(fvec4) + 51: TypeVector 22(float) 3 + 63: 24(int) Constant 1 + 64: TypePointer Uniform 24(int) + 70: TypeVector 24(int) 2 + 71: TypePointer Uniform 25(ivec4) + 78: TypeVector 24(int) 3 + 90: TypePointer Uniform 6(int) + 96: TypeVector 6(int) 2 + 103: TypeVector 6(int) 3 + 115: 24(int) Constant 3 + 116: TypePointer Uniform 26(float) + 122: TypeVector 26(float) 2 + 123: TypePointer Uniform 27(fvec4) + 130: TypeVector 26(float) 3 + 144: TypeBool + 152: TypeVector 144(bool) 2 + 153: 96(ivec2) ConstantComposite 35 35 + 161: TypeVector 144(bool) 3 + 162: 103(ivec3) ConstantComposite 35 35 35 + 169: TypeVector 144(bool) 4 + 170: 17(ivec4) ConstantComposite 35 35 35 35 + 178: 6(int) Constant 3 + 727: 70(ivec2) ConstantComposite 34 34 + 731: 70(ivec2) ConstantComposite 63 63 + 740: 78(ivec3) ConstantComposite 34 34 34 + 744: 78(ivec3) ConstantComposite 63 63 63 + 752: 25(ivec4) ConstantComposite 34 34 34 34 + 756: 25(ivec4) ConstantComposite 63 63 63 63 + 2503: 6(int) Constant 8 + 2504: 6(int) Constant 1 + 2505: 103(ivec3) ConstantComposite 2503 2504 2504 + 4(main): 2 Function None 3 + 5: Label + 8(invocation): 7(ptr) Variable Function + 19(ballot): 18(ptr) Variable Function + 11: 6(int) Load 10(gl_SubgroupInvocationID) + 13: 6(int) Load 12(gl_SubgroupSize) + 14: 6(int) IAdd 11 13 + 16: 6(int) UMod 14 15 + Store 8(invocation) 16 + 20: 6(int) Load 8(invocation) + 21: 17(ivec4) GroupNonUniformPartitionNV 20 + Store 19(ballot) 21 + 32: 6(int) Load 8(invocation) + 37: 36(ptr) AccessChain 31(data) 34 34 35 + 38: 22(float) Load 37 + 39: 17(ivec4) GroupNonUniformPartitionNV 38 + 41: 40(ptr) AccessChain 31(data) 32 33 + Store 41 39 + 42: 6(int) Load 8(invocation) + 45: 44(ptr) AccessChain 31(data) 34 34 + 46: 23(fvec4) Load 45 + 47: 43(fvec2) VectorShuffle 46 46 0 1 + 48: 17(ivec4) GroupNonUniformPartitionNV 47 + 49: 40(ptr) AccessChain 31(data) 42 33 + Store 49 48 + 50: 6(int) Load 8(invocation) + 52: 44(ptr) AccessChain 31(data) 34 34 + 53: 23(fvec4) Load 52 + 54: 51(fvec3) VectorShuffle 53 53 0 1 2 + 55: 17(ivec4) GroupNonUniformPartitionNV 54 + 56: 40(ptr) AccessChain 31(data) 50 33 + Store 56 55 + 57: 6(int) Load 8(invocation) + 58: 44(ptr) AccessChain 31(data) 34 34 + 59: 23(fvec4) Load 58 + 60: 17(ivec4) GroupNonUniformPartitionNV 59 + 61: 40(ptr) AccessChain 31(data) 57 33 + Store 61 60 + 62: 6(int) Load 8(invocation) + 65: 64(ptr) AccessChain 31(data) 34 63 35 + 66: 24(int) Load 65 + 67: 17(ivec4) GroupNonUniformPartitionNV 66 + 68: 40(ptr) AccessChain 31(data) 62 33 + Store 68 67 + 69: 6(int) Load 8(invocation) + 72: 71(ptr) AccessChain 31(data) 34 63 + 73: 25(ivec4) Load 72 + 74: 70(ivec2) VectorShuffle 73 73 0 1 + 75: 17(ivec4) GroupNonUniformPartitionNV 74 + 76: 40(ptr) AccessChain 31(data) 69 33 + Store 76 75 + 77: 6(int) Load 8(invocation) + 79: 71(ptr) AccessChain 31(data) 34 63 + 80: 25(ivec4) Load 79 + 81: 78(ivec3) VectorShuffle 80 80 0 1 2 + 82: 17(ivec4) GroupNonUniformPartitionNV 81 + 83: 40(ptr) AccessChain 31(data) 77 33 + Store 83 82 + 84: 6(int) Load 8(invocation) + 85: 71(ptr) AccessChain 31(data) 34 63 + 86: 25(ivec4) Load 85 + 87: 17(ivec4) GroupNonUniformPartitionNV 86 + 88: 40(ptr) AccessChain 31(data) 84 33 + Store 88 87 + 89: 6(int) Load 8(invocation) + 91: 90(ptr) AccessChain 31(data) 34 33 35 + 92: 6(int) Load 91 + 93: 17(ivec4) GroupNonUniformPartitionNV 92 + 94: 40(ptr) AccessChain 31(data) 89 33 + Store 94 93 + 95: 6(int) Load 8(invocation) + 97: 40(ptr) AccessChain 31(data) 34 33 + 98: 17(ivec4) Load 97 + 99: 96(ivec2) VectorShuffle 98 98 0 1 + 100: 17(ivec4) GroupNonUniformPartitionNV 99 + 101: 40(ptr) AccessChain 31(data) 95 33 + Store 101 100 + 102: 6(int) Load 8(invocation) + 104: 40(ptr) AccessChain 31(data) 34 33 + 105: 17(ivec4) Load 104 + 106: 103(ivec3) VectorShuffle 105 105 0 1 2 + 107: 17(ivec4) GroupNonUniformPartitionNV 106 + 108: 40(ptr) AccessChain 31(data) 102 33 + Store 108 107 + 109: 6(int) Load 8(invocation) + 110: 40(ptr) AccessChain 31(data) 34 33 + 111: 17(ivec4) Load 110 + 112: 17(ivec4) GroupNonUniformPartitionNV 111 + 113: 40(ptr) AccessChain 31(data) 109 33 + Store 113 112 + 114: 6(int) Load 8(invocation) + 117: 116(ptr) AccessChain 31(data) 34 115 35 + 118: 26(float) Load 117 + 119: 17(ivec4) GroupNonUniformPartitionNV 118 + 120: 40(ptr) AccessChain 31(data) 114 33 + Store 120 119 + 121: 6(int) Load 8(invocation) + 124: 123(ptr) AccessChain 31(data) 34 115 + 125: 27(fvec4) Load 124 + 126: 122(fvec2) VectorShuffle 125 125 0 1 + 127: 17(ivec4) GroupNonUniformPartitionNV 126 + 128: 40(ptr) AccessChain 31(data) 121 33 + Store 128 127 + 129: 6(int) Load 8(invocation) + 131: 123(ptr) AccessChain 31(data) 34 115 + 132: 27(fvec4) Load 131 + 133: 130(fvec3) VectorShuffle 132 132 0 1 2 + 134: 17(ivec4) GroupNonUniformPartitionNV 133 + 135: 40(ptr) AccessChain 31(data) 129 33 + Store 135 134 + 136: 6(int) Load 8(invocation) + 137: 123(ptr) AccessChain 31(data) 34 115 + 138: 27(fvec4) Load 137 + 139: 17(ivec4) GroupNonUniformPartitionNV 138 + 140: 40(ptr) AccessChain 31(data) 136 33 + Store 140 139 + 141: 6(int) Load 8(invocation) + 142: 64(ptr) AccessChain 31(data) 34 63 35 + 143: 24(int) Load 142 + 145: 144(bool) INotEqual 143 35 + 146: 17(ivec4) GroupNonUniformPartitionNV 145 + 147: 40(ptr) AccessChain 31(data) 141 33 + Store 147 146 + 148: 6(int) Load 8(invocation) + 149: 71(ptr) AccessChain 31(data) 34 63 + 150: 25(ivec4) Load 149 + 151: 70(ivec2) VectorShuffle 150 150 0 1 + 154: 152(bvec2) INotEqual 151 153 + 155: 17(ivec4) GroupNonUniformPartitionNV 154 + 156: 40(ptr) AccessChain 31(data) 148 33 + Store 156 155 + 157: 6(int) Load 8(invocation) + 158: 71(ptr) AccessChain 31(data) 34 63 + 159: 25(ivec4) Load 158 + 160: 78(ivec3) VectorShuffle 159 159 0 1 2 + 163: 161(bvec3) INotEqual 160 162 + 164: 17(ivec4) GroupNonUniformPartitionNV 163 + 165: 40(ptr) AccessChain 31(data) 157 33 + Store 165 164 + 166: 6(int) Load 8(invocation) + 167: 71(ptr) AccessChain 31(data) 34 63 + 168: 25(ivec4) Load 167 + 171: 169(bvec4) INotEqual 168 170 + 172: 17(ivec4) GroupNonUniformPartitionNV 171 + 173: 40(ptr) AccessChain 31(data) 166 33 + Store 173 172 + 174: 6(int) Load 8(invocation) + 175: 36(ptr) AccessChain 31(data) 34 34 35 + 176: 22(float) Load 175 + 177: 17(ivec4) Load 19(ballot) + 179: 22(float) GroupNonUniformFAdd 178 PartitionedReduceNV 176 177 + 180: 36(ptr) AccessChain 31(data) 174 34 35 + Store 180 179 + 181: 6(int) Load 8(invocation) + 182: 44(ptr) AccessChain 31(data) 63 34 + 183: 23(fvec4) Load 182 + 184: 43(fvec2) VectorShuffle 183 183 0 1 + 185: 17(ivec4) Load 19(ballot) + 186: 43(fvec2) GroupNonUniformFAdd 178 PartitionedReduceNV 184 185 + 187: 44(ptr) AccessChain 31(data) 181 34 + 188: 23(fvec4) Load 187 + 189: 23(fvec4) VectorShuffle 188 186 4 5 2 3 + Store 187 189 + 190: 6(int) Load 8(invocation) + 191: 44(ptr) AccessChain 31(data) 33 34 + 192: 23(fvec4) Load 191 + 193: 51(fvec3) VectorShuffle 192 192 0 1 2 + 194: 17(ivec4) Load 19(ballot) + 195: 51(fvec3) GroupNonUniformFAdd 178 PartitionedReduceNV 193 194 + 196: 44(ptr) AccessChain 31(data) 190 34 + 197: 23(fvec4) Load 196 + 198: 23(fvec4) VectorShuffle 197 195 4 5 6 3 + Store 196 198 + 199: 6(int) Load 8(invocation) + 200: 44(ptr) AccessChain 31(data) 115 34 + 201: 23(fvec4) Load 200 + 202: 17(ivec4) Load 19(ballot) + 203: 23(fvec4) GroupNonUniformFAdd 178 PartitionedReduceNV 201 202 + 204: 44(ptr) AccessChain 31(data) 199 34 + Store 204 203 + 205: 6(int) Load 8(invocation) + 206: 64(ptr) AccessChain 31(data) 34 63 35 + 207: 24(int) Load 206 + 208: 17(ivec4) Load 19(ballot) + 209: 24(int) GroupNonUniformIAdd 178 PartitionedReduceNV 207 208 + 210: 64(ptr) AccessChain 31(data) 205 63 35 + Store 210 209 + 211: 6(int) Load 8(invocation) + 212: 71(ptr) AccessChain 31(data) 63 63 + 213: 25(ivec4) Load 212 + 214: 70(ivec2) VectorShuffle 213 213 0 1 + 215: 17(ivec4) Load 19(ballot) + 216: 70(ivec2) GroupNonUniformIAdd 178 PartitionedReduceNV 214 215 + 217: 71(ptr) AccessChain 31(data) 211 63 + 218: 25(ivec4) Load 217 + 219: 25(ivec4) VectorShuffle 218 216 4 5 2 3 + Store 217 219 + 220: 6(int) Load 8(invocation) + 221: 71(ptr) AccessChain 31(data) 33 63 + 222: 25(ivec4) Load 221 + 223: 78(ivec3) VectorShuffle 222 222 0 1 2 + 224: 17(ivec4) Load 19(ballot) + 225: 78(ivec3) GroupNonUniformIAdd 178 PartitionedReduceNV 223 224 + 226: 71(ptr) AccessChain 31(data) 220 63 + 227: 25(ivec4) Load 226 + 228: 25(ivec4) VectorShuffle 227 225 4 5 6 3 + Store 226 228 + 229: 6(int) Load 8(invocation) + 230: 71(ptr) AccessChain 31(data) 115 63 + 231: 25(ivec4) Load 230 + 232: 17(ivec4) Load 19(ballot) + 233: 25(ivec4) GroupNonUniformIAdd 178 PartitionedReduceNV 231 232 + 234: 71(ptr) AccessChain 31(data) 229 63 + Store 234 233 + 235: 6(int) Load 8(invocation) + 236: 90(ptr) AccessChain 31(data) 34 33 35 + 237: 6(int) Load 236 + 238: 17(ivec4) Load 19(ballot) + 239: 6(int) GroupNonUniformIAdd 178 PartitionedReduceNV 237 238 + 240: 90(ptr) AccessChain 31(data) 235 33 35 + Store 240 239 + 241: 6(int) Load 8(invocation) + 242: 40(ptr) AccessChain 31(data) 63 33 + 243: 17(ivec4) Load 242 + 244: 96(ivec2) VectorShuffle 243 243 0 1 + 245: 17(ivec4) Load 19(ballot) + 246: 96(ivec2) GroupNonUniformIAdd 178 PartitionedReduceNV 244 245 + 247: 40(ptr) AccessChain 31(data) 241 33 + 248: 17(ivec4) Load 247 + 249: 17(ivec4) VectorShuffle 248 246 4 5 2 3 + Store 247 249 + 250: 6(int) Load 8(invocation) + 251: 40(ptr) AccessChain 31(data) 33 33 + 252: 17(ivec4) Load 251 + 253: 103(ivec3) VectorShuffle 252 252 0 1 2 + 254: 17(ivec4) Load 19(ballot) + 255: 103(ivec3) GroupNonUniformIAdd 178 PartitionedReduceNV 253 254 + 256: 40(ptr) AccessChain 31(data) 250 33 + 257: 17(ivec4) Load 256 + 258: 17(ivec4) VectorShuffle 257 255 4 5 6 3 + Store 256 258 + 259: 6(int) Load 8(invocation) + 260: 40(ptr) AccessChain 31(data) 115 33 + 261: 17(ivec4) Load 260 + 262: 17(ivec4) Load 19(ballot) + 263: 17(ivec4) GroupNonUniformIAdd 178 PartitionedReduceNV 261 262 + 264: 40(ptr) AccessChain 31(data) 259 33 + Store 264 263 + 265: 6(int) Load 8(invocation) + 266: 116(ptr) AccessChain 31(data) 34 115 35 + 267: 26(float) Load 266 + 268: 17(ivec4) Load 19(ballot) + 269: 26(float) GroupNonUniformFAdd 178 PartitionedReduceNV 267 268 + 270: 116(ptr) AccessChain 31(data) 265 115 35 + Store 270 269 + 271: 6(int) Load 8(invocation) + 272: 123(ptr) AccessChain 31(data) 63 115 + 273: 27(fvec4) Load 272 + 274: 122(fvec2) VectorShuffle 273 273 0 1 + 275: 17(ivec4) Load 19(ballot) + 276: 122(fvec2) GroupNonUniformFAdd 178 PartitionedReduceNV 274 275 + 277: 123(ptr) AccessChain 31(data) 271 115 + 278: 27(fvec4) Load 277 + 279: 27(fvec4) VectorShuffle 278 276 4 5 2 3 + Store 277 279 + 280: 6(int) Load 8(invocation) + 281: 123(ptr) AccessChain 31(data) 33 115 + 282: 27(fvec4) Load 281 + 283: 130(fvec3) VectorShuffle 282 282 0 1 2 + 284: 17(ivec4) Load 19(ballot) + 285: 130(fvec3) GroupNonUniformFAdd 178 PartitionedReduceNV 283 284 + 286: 123(ptr) AccessChain 31(data) 280 115 + 287: 27(fvec4) Load 286 + 288: 27(fvec4) VectorShuffle 287 285 4 5 6 3 + Store 286 288 + 289: 6(int) Load 8(invocation) + 290: 123(ptr) AccessChain 31(data) 115 115 + 291: 27(fvec4) Load 290 + 292: 17(ivec4) Load 19(ballot) + 293: 27(fvec4) GroupNonUniformFAdd 178 PartitionedReduceNV 291 292 + 294: 123(ptr) AccessChain 31(data) 289 115 + Store 294 293 + 295: 6(int) Load 8(invocation) + 296: 36(ptr) AccessChain 31(data) 34 34 35 + 297: 22(float) Load 296 + 298: 17(ivec4) Load 19(ballot) + 299: 22(float) GroupNonUniformFMul 178 PartitionedReduceNV 297 298 + 300: 36(ptr) AccessChain 31(data) 295 34 35 + Store 300 299 + 301: 6(int) Load 8(invocation) + 302: 44(ptr) AccessChain 31(data) 63 34 + 303: 23(fvec4) Load 302 + 304: 43(fvec2) VectorShuffle 303 303 0 1 + 305: 17(ivec4) Load 19(ballot) + 306: 43(fvec2) GroupNonUniformFMul 178 PartitionedReduceNV 304 305 + 307: 44(ptr) AccessChain 31(data) 301 34 + 308: 23(fvec4) Load 307 + 309: 23(fvec4) VectorShuffle 308 306 4 5 2 3 + Store 307 309 + 310: 6(int) Load 8(invocation) + 311: 44(ptr) AccessChain 31(data) 33 34 + 312: 23(fvec4) Load 311 + 313: 51(fvec3) VectorShuffle 312 312 0 1 2 + 314: 17(ivec4) Load 19(ballot) + 315: 51(fvec3) GroupNonUniformFMul 178 PartitionedReduceNV 313 314 + 316: 44(ptr) AccessChain 31(data) 310 34 + 317: 23(fvec4) Load 316 + 318: 23(fvec4) VectorShuffle 317 315 4 5 6 3 + Store 316 318 + 319: 6(int) Load 8(invocation) + 320: 44(ptr) AccessChain 31(data) 115 34 + 321: 23(fvec4) Load 320 + 322: 17(ivec4) Load 19(ballot) + 323: 23(fvec4) GroupNonUniformFMul 178 PartitionedReduceNV 321 322 + 324: 44(ptr) AccessChain 31(data) 319 34 + Store 324 323 + 325: 6(int) Load 8(invocation) + 326: 64(ptr) AccessChain 31(data) 34 63 35 + 327: 24(int) Load 326 + 328: 17(ivec4) Load 19(ballot) + 329: 24(int) GroupNonUniformIMul 178 PartitionedReduceNV 327 328 + 330: 64(ptr) AccessChain 31(data) 325 63 35 + Store 330 329 + 331: 6(int) Load 8(invocation) + 332: 71(ptr) AccessChain 31(data) 63 63 + 333: 25(ivec4) Load 332 + 334: 70(ivec2) VectorShuffle 333 333 0 1 + 335: 17(ivec4) Load 19(ballot) + 336: 70(ivec2) GroupNonUniformIMul 178 PartitionedReduceNV 334 335 + 337: 71(ptr) AccessChain 31(data) 331 63 + 338: 25(ivec4) Load 337 + 339: 25(ivec4) VectorShuffle 338 336 4 5 2 3 + Store 337 339 + 340: 6(int) Load 8(invocation) + 341: 71(ptr) AccessChain 31(data) 33 63 + 342: 25(ivec4) Load 341 + 343: 78(ivec3) VectorShuffle 342 342 0 1 2 + 344: 17(ivec4) Load 19(ballot) + 345: 78(ivec3) GroupNonUniformIMul 178 PartitionedReduceNV 343 344 + 346: 71(ptr) AccessChain 31(data) 340 63 + 347: 25(ivec4) Load 346 + 348: 25(ivec4) VectorShuffle 347 345 4 5 6 3 + Store 346 348 + 349: 6(int) Load 8(invocation) + 350: 71(ptr) AccessChain 31(data) 115 63 + 351: 25(ivec4) Load 350 + 352: 17(ivec4) Load 19(ballot) + 353: 25(ivec4) GroupNonUniformIMul 178 PartitionedReduceNV 351 352 + 354: 71(ptr) AccessChain 31(data) 349 63 + Store 354 353 + 355: 6(int) Load 8(invocation) + 356: 90(ptr) AccessChain 31(data) 34 33 35 + 357: 6(int) Load 356 + 358: 17(ivec4) Load 19(ballot) + 359: 6(int) GroupNonUniformIMul 178 PartitionedReduceNV 357 358 + 360: 90(ptr) AccessChain 31(data) 355 33 35 + Store 360 359 + 361: 6(int) Load 8(invocation) + 362: 40(ptr) AccessChain 31(data) 63 33 + 363: 17(ivec4) Load 362 + 364: 96(ivec2) VectorShuffle 363 363 0 1 + 365: 17(ivec4) Load 19(ballot) + 366: 96(ivec2) GroupNonUniformIMul 178 PartitionedReduceNV 364 365 + 367: 40(ptr) AccessChain 31(data) 361 33 + 368: 17(ivec4) Load 367 + 369: 17(ivec4) VectorShuffle 368 366 4 5 2 3 + Store 367 369 + 370: 6(int) Load 8(invocation) + 371: 40(ptr) AccessChain 31(data) 33 33 + 372: 17(ivec4) Load 371 + 373: 103(ivec3) VectorShuffle 372 372 0 1 2 + 374: 17(ivec4) Load 19(ballot) + 375: 103(ivec3) GroupNonUniformIMul 178 PartitionedReduceNV 373 374 + 376: 40(ptr) AccessChain 31(data) 370 33 + 377: 17(ivec4) Load 376 + 378: 17(ivec4) VectorShuffle 377 375 4 5 6 3 + Store 376 378 + 379: 6(int) Load 8(invocation) + 380: 40(ptr) AccessChain 31(data) 115 33 + 381: 17(ivec4) Load 380 + 382: 17(ivec4) Load 19(ballot) + 383: 17(ivec4) GroupNonUniformIMul 178 PartitionedReduceNV 381 382 + 384: 40(ptr) AccessChain 31(data) 379 33 + Store 384 383 + 385: 6(int) Load 8(invocation) + 386: 116(ptr) AccessChain 31(data) 34 115 35 + 387: 26(float) Load 386 + 388: 17(ivec4) Load 19(ballot) + 389: 26(float) GroupNonUniformFMul 178 PartitionedReduceNV 387 388 + 390: 116(ptr) AccessChain 31(data) 385 115 35 + Store 390 389 + 391: 6(int) Load 8(invocation) + 392: 123(ptr) AccessChain 31(data) 63 115 + 393: 27(fvec4) Load 392 + 394: 122(fvec2) VectorShuffle 393 393 0 1 + 395: 17(ivec4) Load 19(ballot) + 396: 122(fvec2) GroupNonUniformFMul 178 PartitionedReduceNV 394 395 + 397: 123(ptr) AccessChain 31(data) 391 115 + 398: 27(fvec4) Load 397 + 399: 27(fvec4) VectorShuffle 398 396 4 5 2 3 + Store 397 399 + 400: 6(int) Load 8(invocation) + 401: 123(ptr) AccessChain 31(data) 33 115 + 402: 27(fvec4) Load 401 + 403: 130(fvec3) VectorShuffle 402 402 0 1 2 + 404: 17(ivec4) Load 19(ballot) + 405: 130(fvec3) GroupNonUniformFMul 178 PartitionedReduceNV 403 404 + 406: 123(ptr) AccessChain 31(data) 400 115 + 407: 27(fvec4) Load 406 + 408: 27(fvec4) VectorShuffle 407 405 4 5 6 3 + Store 406 408 + 409: 6(int) Load 8(invocation) + 410: 123(ptr) AccessChain 31(data) 115 115 + 411: 27(fvec4) Load 410 + 412: 17(ivec4) Load 19(ballot) + 413: 27(fvec4) GroupNonUniformFMul 178 PartitionedReduceNV 411 412 + 414: 123(ptr) AccessChain 31(data) 409 115 + Store 414 413 + 415: 6(int) Load 8(invocation) + 416: 36(ptr) AccessChain 31(data) 34 34 35 + 417: 22(float) Load 416 + 418: 17(ivec4) Load 19(ballot) + 419: 22(float) GroupNonUniformFMin 178 PartitionedReduceNV 417 418 + 420: 36(ptr) AccessChain 31(data) 415 34 35 + Store 420 419 + 421: 6(int) Load 8(invocation) + 422: 44(ptr) AccessChain 31(data) 63 34 + 423: 23(fvec4) Load 422 + 424: 43(fvec2) VectorShuffle 423 423 0 1 + 425: 17(ivec4) Load 19(ballot) + 426: 43(fvec2) GroupNonUniformFMin 178 PartitionedReduceNV 424 425 + 427: 44(ptr) AccessChain 31(data) 421 34 + 428: 23(fvec4) Load 427 + 429: 23(fvec4) VectorShuffle 428 426 4 5 2 3 + Store 427 429 + 430: 6(int) Load 8(invocation) + 431: 44(ptr) AccessChain 31(data) 33 34 + 432: 23(fvec4) Load 431 + 433: 51(fvec3) VectorShuffle 432 432 0 1 2 + 434: 17(ivec4) Load 19(ballot) + 435: 51(fvec3) GroupNonUniformFMin 178 PartitionedReduceNV 433 434 + 436: 44(ptr) AccessChain 31(data) 430 34 + 437: 23(fvec4) Load 436 + 438: 23(fvec4) VectorShuffle 437 435 4 5 6 3 + Store 436 438 + 439: 6(int) Load 8(invocation) + 440: 44(ptr) AccessChain 31(data) 115 34 + 441: 23(fvec4) Load 440 + 442: 17(ivec4) Load 19(ballot) + 443: 23(fvec4) GroupNonUniformFMin 178 PartitionedReduceNV 441 442 + 444: 44(ptr) AccessChain 31(data) 439 34 + Store 444 443 + 445: 6(int) Load 8(invocation) + 446: 64(ptr) AccessChain 31(data) 34 63 35 + 447: 24(int) Load 446 + 448: 17(ivec4) Load 19(ballot) + 449: 24(int) GroupNonUniformSMin 178 PartitionedReduceNV 447 448 + 450: 64(ptr) AccessChain 31(data) 445 63 35 + Store 450 449 + 451: 6(int) Load 8(invocation) + 452: 71(ptr) AccessChain 31(data) 63 63 + 453: 25(ivec4) Load 452 + 454: 70(ivec2) VectorShuffle 453 453 0 1 + 455: 17(ivec4) Load 19(ballot) + 456: 70(ivec2) GroupNonUniformSMin 178 PartitionedReduceNV 454 455 + 457: 71(ptr) AccessChain 31(data) 451 63 + 458: 25(ivec4) Load 457 + 459: 25(ivec4) VectorShuffle 458 456 4 5 2 3 + Store 457 459 + 460: 6(int) Load 8(invocation) + 461: 71(ptr) AccessChain 31(data) 33 63 + 462: 25(ivec4) Load 461 + 463: 78(ivec3) VectorShuffle 462 462 0 1 2 + 464: 17(ivec4) Load 19(ballot) + 465: 78(ivec3) GroupNonUniformSMin 178 PartitionedReduceNV 463 464 + 466: 71(ptr) AccessChain 31(data) 460 63 + 467: 25(ivec4) Load 466 + 468: 25(ivec4) VectorShuffle 467 465 4 5 6 3 + Store 466 468 + 469: 6(int) Load 8(invocation) + 470: 71(ptr) AccessChain 31(data) 115 63 + 471: 25(ivec4) Load 470 + 472: 17(ivec4) Load 19(ballot) + 473: 25(ivec4) GroupNonUniformSMin 178 PartitionedReduceNV 471 472 + 474: 71(ptr) AccessChain 31(data) 469 63 + Store 474 473 + 475: 6(int) Load 8(invocation) + 476: 90(ptr) AccessChain 31(data) 34 33 35 + 477: 6(int) Load 476 + 478: 17(ivec4) Load 19(ballot) + 479: 6(int) GroupNonUniformUMin 178 PartitionedReduceNV 477 478 + 480: 90(ptr) AccessChain 31(data) 475 33 35 + Store 480 479 + 481: 6(int) Load 8(invocation) + 482: 40(ptr) AccessChain 31(data) 63 33 + 483: 17(ivec4) Load 482 + 484: 96(ivec2) VectorShuffle 483 483 0 1 + 485: 17(ivec4) Load 19(ballot) + 486: 96(ivec2) GroupNonUniformUMin 178 PartitionedReduceNV 484 485 + 487: 40(ptr) AccessChain 31(data) 481 33 + 488: 17(ivec4) Load 487 + 489: 17(ivec4) VectorShuffle 488 486 4 5 2 3 + Store 487 489 + 490: 6(int) Load 8(invocation) + 491: 40(ptr) AccessChain 31(data) 33 33 + 492: 17(ivec4) Load 491 + 493: 103(ivec3) VectorShuffle 492 492 0 1 2 + 494: 17(ivec4) Load 19(ballot) + 495: 103(ivec3) GroupNonUniformUMin 178 PartitionedReduceNV 493 494 + 496: 40(ptr) AccessChain 31(data) 490 33 + 497: 17(ivec4) Load 496 + 498: 17(ivec4) VectorShuffle 497 495 4 5 6 3 + Store 496 498 + 499: 6(int) Load 8(invocation) + 500: 40(ptr) AccessChain 31(data) 115 33 + 501: 17(ivec4) Load 500 + 502: 17(ivec4) Load 19(ballot) + 503: 17(ivec4) GroupNonUniformUMin 178 PartitionedReduceNV 501 502 + 504: 40(ptr) AccessChain 31(data) 499 33 + Store 504 503 + 505: 6(int) Load 8(invocation) + 506: 116(ptr) AccessChain 31(data) 34 115 35 + 507: 26(float) Load 506 + 508: 17(ivec4) Load 19(ballot) + 509: 26(float) GroupNonUniformFMin 178 PartitionedReduceNV 507 508 + 510: 116(ptr) AccessChain 31(data) 505 115 35 + Store 510 509 + 511: 6(int) Load 8(invocation) + 512: 123(ptr) AccessChain 31(data) 63 115 + 513: 27(fvec4) Load 512 + 514: 122(fvec2) VectorShuffle 513 513 0 1 + 515: 17(ivec4) Load 19(ballot) + 516: 122(fvec2) GroupNonUniformFMin 178 PartitionedReduceNV 514 515 + 517: 123(ptr) AccessChain 31(data) 511 115 + 518: 27(fvec4) Load 517 + 519: 27(fvec4) VectorShuffle 518 516 4 5 2 3 + Store 517 519 + 520: 6(int) Load 8(invocation) + 521: 123(ptr) AccessChain 31(data) 33 115 + 522: 27(fvec4) Load 521 + 523: 130(fvec3) VectorShuffle 522 522 0 1 2 + 524: 17(ivec4) Load 19(ballot) + 525: 130(fvec3) GroupNonUniformFMin 178 PartitionedReduceNV 523 524 + 526: 123(ptr) AccessChain 31(data) 520 115 + 527: 27(fvec4) Load 526 + 528: 27(fvec4) VectorShuffle 527 525 4 5 6 3 + Store 526 528 + 529: 6(int) Load 8(invocation) + 530: 123(ptr) AccessChain 31(data) 115 115 + 531: 27(fvec4) Load 530 + 532: 17(ivec4) Load 19(ballot) + 533: 27(fvec4) GroupNonUniformFMin 178 PartitionedReduceNV 531 532 + 534: 123(ptr) AccessChain 31(data) 529 115 + Store 534 533 + 535: 6(int) Load 8(invocation) + 536: 36(ptr) AccessChain 31(data) 34 34 35 + 537: 22(float) Load 536 + 538: 17(ivec4) Load 19(ballot) + 539: 22(float) GroupNonUniformFMax 178 PartitionedReduceNV 537 538 + 540: 36(ptr) AccessChain 31(data) 535 34 35 + Store 540 539 + 541: 6(int) Load 8(invocation) + 542: 44(ptr) AccessChain 31(data) 63 34 + 543: 23(fvec4) Load 542 + 544: 43(fvec2) VectorShuffle 543 543 0 1 + 545: 17(ivec4) Load 19(ballot) + 546: 43(fvec2) GroupNonUniformFMax 178 PartitionedReduceNV 544 545 + 547: 44(ptr) AccessChain 31(data) 541 34 + 548: 23(fvec4) Load 547 + 549: 23(fvec4) VectorShuffle 548 546 4 5 2 3 + Store 547 549 + 550: 6(int) Load 8(invocation) + 551: 44(ptr) AccessChain 31(data) 33 34 + 552: 23(fvec4) Load 551 + 553: 51(fvec3) VectorShuffle 552 552 0 1 2 + 554: 17(ivec4) Load 19(ballot) + 555: 51(fvec3) GroupNonUniformFMax 178 PartitionedReduceNV 553 554 + 556: 44(ptr) AccessChain 31(data) 550 34 + 557: 23(fvec4) Load 556 + 558: 23(fvec4) VectorShuffle 557 555 4 5 6 3 + Store 556 558 + 559: 6(int) Load 8(invocation) + 560: 44(ptr) AccessChain 31(data) 115 34 + 561: 23(fvec4) Load 560 + 562: 17(ivec4) Load 19(ballot) + 563: 23(fvec4) GroupNonUniformFMax 178 PartitionedReduceNV 561 562 + 564: 44(ptr) AccessChain 31(data) 559 34 + Store 564 563 + 565: 6(int) Load 8(invocation) + 566: 64(ptr) AccessChain 31(data) 34 63 35 + 567: 24(int) Load 566 + 568: 17(ivec4) Load 19(ballot) + 569: 24(int) GroupNonUniformSMax 178 PartitionedReduceNV 567 568 + 570: 64(ptr) AccessChain 31(data) 565 63 35 + Store 570 569 + 571: 6(int) Load 8(invocation) + 572: 71(ptr) AccessChain 31(data) 63 63 + 573: 25(ivec4) Load 572 + 574: 70(ivec2) VectorShuffle 573 573 0 1 + 575: 17(ivec4) Load 19(ballot) + 576: 70(ivec2) GroupNonUniformSMax 178 PartitionedReduceNV 574 575 + 577: 71(ptr) AccessChain 31(data) 571 63 + 578: 25(ivec4) Load 577 + 579: 25(ivec4) VectorShuffle 578 576 4 5 2 3 + Store 577 579 + 580: 6(int) Load 8(invocation) + 581: 71(ptr) AccessChain 31(data) 33 63 + 582: 25(ivec4) Load 581 + 583: 78(ivec3) VectorShuffle 582 582 0 1 2 + 584: 17(ivec4) Load 19(ballot) + 585: 78(ivec3) GroupNonUniformSMax 178 PartitionedReduceNV 583 584 + 586: 71(ptr) AccessChain 31(data) 580 63 + 587: 25(ivec4) Load 586 + 588: 25(ivec4) VectorShuffle 587 585 4 5 6 3 + Store 586 588 + 589: 6(int) Load 8(invocation) + 590: 71(ptr) AccessChain 31(data) 115 63 + 591: 25(ivec4) Load 590 + 592: 17(ivec4) Load 19(ballot) + 593: 25(ivec4) GroupNonUniformSMax 178 PartitionedReduceNV 591 592 + 594: 71(ptr) AccessChain 31(data) 589 63 + Store 594 593 + 595: 6(int) Load 8(invocation) + 596: 90(ptr) AccessChain 31(data) 34 33 35 + 597: 6(int) Load 596 + 598: 17(ivec4) Load 19(ballot) + 599: 6(int) GroupNonUniformUMax 178 PartitionedReduceNV 597 598 + 600: 90(ptr) AccessChain 31(data) 595 33 35 + Store 600 599 + 601: 6(int) Load 8(invocation) + 602: 40(ptr) AccessChain 31(data) 63 33 + 603: 17(ivec4) Load 602 + 604: 96(ivec2) VectorShuffle 603 603 0 1 + 605: 17(ivec4) Load 19(ballot) + 606: 96(ivec2) GroupNonUniformUMax 178 PartitionedReduceNV 604 605 + 607: 40(ptr) AccessChain 31(data) 601 33 + 608: 17(ivec4) Load 607 + 609: 17(ivec4) VectorShuffle 608 606 4 5 2 3 + Store 607 609 + 610: 6(int) Load 8(invocation) + 611: 40(ptr) AccessChain 31(data) 33 33 + 612: 17(ivec4) Load 611 + 613: 103(ivec3) VectorShuffle 612 612 0 1 2 + 614: 17(ivec4) Load 19(ballot) + 615: 103(ivec3) GroupNonUniformUMax 178 PartitionedReduceNV 613 614 + 616: 40(ptr) AccessChain 31(data) 610 33 + 617: 17(ivec4) Load 616 + 618: 17(ivec4) VectorShuffle 617 615 4 5 6 3 + Store 616 618 + 619: 6(int) Load 8(invocation) + 620: 40(ptr) AccessChain 31(data) 115 33 + 621: 17(ivec4) Load 620 + 622: 17(ivec4) Load 19(ballot) + 623: 17(ivec4) GroupNonUniformUMax 178 PartitionedReduceNV 621 622 + 624: 40(ptr) AccessChain 31(data) 619 33 + Store 624 623 + 625: 6(int) Load 8(invocation) + 626: 116(ptr) AccessChain 31(data) 34 115 35 + 627: 26(float) Load 626 + 628: 17(ivec4) Load 19(ballot) + 629: 26(float) GroupNonUniformFMax 178 PartitionedReduceNV 627 628 + 630: 116(ptr) AccessChain 31(data) 625 115 35 + Store 630 629 + 631: 6(int) Load 8(invocation) + 632: 123(ptr) AccessChain 31(data) 63 115 + 633: 27(fvec4) Load 632 + 634: 122(fvec2) VectorShuffle 633 633 0 1 + 635: 17(ivec4) Load 19(ballot) + 636: 122(fvec2) GroupNonUniformFMax 178 PartitionedReduceNV 634 635 + 637: 123(ptr) AccessChain 31(data) 631 115 + 638: 27(fvec4) Load 637 + 639: 27(fvec4) VectorShuffle 638 636 4 5 2 3 + Store 637 639 + 640: 6(int) Load 8(invocation) + 641: 123(ptr) AccessChain 31(data) 33 115 + 642: 27(fvec4) Load 641 + 643: 130(fvec3) VectorShuffle 642 642 0 1 2 + 644: 17(ivec4) Load 19(ballot) + 645: 130(fvec3) GroupNonUniformFMax 178 PartitionedReduceNV 643 644 + 646: 123(ptr) AccessChain 31(data) 640 115 + 647: 27(fvec4) Load 646 + 648: 27(fvec4) VectorShuffle 647 645 4 5 6 3 + Store 646 648 + 649: 6(int) Load 8(invocation) + 650: 123(ptr) AccessChain 31(data) 115 115 + 651: 27(fvec4) Load 650 + 652: 17(ivec4) Load 19(ballot) + 653: 27(fvec4) GroupNonUniformFMax 178 PartitionedReduceNV 651 652 + 654: 123(ptr) AccessChain 31(data) 649 115 + Store 654 653 + 655: 6(int) Load 8(invocation) + 656: 64(ptr) AccessChain 31(data) 34 63 35 + 657: 24(int) Load 656 + 658: 17(ivec4) Load 19(ballot) + 659: 24(int) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 657 658 + 660: 64(ptr) AccessChain 31(data) 655 63 35 + Store 660 659 + 661: 6(int) Load 8(invocation) + 662: 71(ptr) AccessChain 31(data) 63 63 + 663: 25(ivec4) Load 662 + 664: 70(ivec2) VectorShuffle 663 663 0 1 + 665: 17(ivec4) Load 19(ballot) + 666: 70(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 664 665 + 667: 71(ptr) AccessChain 31(data) 661 63 + 668: 25(ivec4) Load 667 + 669: 25(ivec4) VectorShuffle 668 666 4 5 2 3 + Store 667 669 + 670: 6(int) Load 8(invocation) + 671: 71(ptr) AccessChain 31(data) 33 63 + 672: 25(ivec4) Load 671 + 673: 78(ivec3) VectorShuffle 672 672 0 1 2 + 674: 17(ivec4) Load 19(ballot) + 675: 78(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 673 674 + 676: 71(ptr) AccessChain 31(data) 670 63 + 677: 25(ivec4) Load 676 + 678: 25(ivec4) VectorShuffle 677 675 4 5 6 3 + Store 676 678 + 679: 6(int) Load 8(invocation) + 680: 71(ptr) AccessChain 31(data) 115 63 + 681: 25(ivec4) Load 680 + 682: 17(ivec4) Load 19(ballot) + 683: 25(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 681 682 + 684: 71(ptr) AccessChain 31(data) 679 63 + Store 684 683 + 685: 6(int) Load 8(invocation) + 686: 90(ptr) AccessChain 31(data) 34 33 35 + 687: 6(int) Load 686 + 688: 17(ivec4) Load 19(ballot) + 689: 6(int) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 687 688 + 690: 90(ptr) AccessChain 31(data) 685 33 35 + Store 690 689 + 691: 6(int) Load 8(invocation) + 692: 40(ptr) AccessChain 31(data) 63 33 + 693: 17(ivec4) Load 692 + 694: 96(ivec2) VectorShuffle 693 693 0 1 + 695: 17(ivec4) Load 19(ballot) + 696: 96(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 694 695 + 697: 40(ptr) AccessChain 31(data) 691 33 + 698: 17(ivec4) Load 697 + 699: 17(ivec4) VectorShuffle 698 696 4 5 2 3 + Store 697 699 + 700: 6(int) Load 8(invocation) + 701: 40(ptr) AccessChain 31(data) 33 33 + 702: 17(ivec4) Load 701 + 703: 103(ivec3) VectorShuffle 702 702 0 1 2 + 704: 17(ivec4) Load 19(ballot) + 705: 103(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 703 704 + 706: 40(ptr) AccessChain 31(data) 700 33 + 707: 17(ivec4) Load 706 + 708: 17(ivec4) VectorShuffle 707 705 4 5 6 3 + Store 706 708 + 709: 6(int) Load 8(invocation) + 710: 40(ptr) AccessChain 31(data) 115 33 + 711: 17(ivec4) Load 710 + 712: 17(ivec4) Load 19(ballot) + 713: 17(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 711 712 + 714: 40(ptr) AccessChain 31(data) 709 33 + Store 714 713 + 715: 6(int) Load 8(invocation) + 716: 64(ptr) AccessChain 31(data) 34 63 35 + 717: 24(int) Load 716 + 718: 144(bool) SLessThan 717 34 + 719: 17(ivec4) Load 19(ballot) + 720: 144(bool) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 718 719 + 721: 24(int) Select 720 63 34 + 722: 64(ptr) AccessChain 31(data) 715 63 35 + Store 722 721 + 723: 6(int) Load 8(invocation) + 724: 71(ptr) AccessChain 31(data) 63 63 + 725: 25(ivec4) Load 724 + 726: 70(ivec2) VectorShuffle 725 725 0 1 + 728: 152(bvec2) SLessThan 726 727 + 729: 17(ivec4) Load 19(ballot) + 730: 152(bvec2) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 728 729 + 732: 70(ivec2) Select 730 731 727 + 733: 71(ptr) AccessChain 31(data) 723 63 + 734: 25(ivec4) Load 733 + 735: 25(ivec4) VectorShuffle 734 732 4 5 2 3 + Store 733 735 + 736: 6(int) Load 8(invocation) + 737: 71(ptr) AccessChain 31(data) 63 63 + 738: 25(ivec4) Load 737 + 739: 78(ivec3) VectorShuffle 738 738 0 1 2 + 741: 161(bvec3) SLessThan 739 740 + 742: 17(ivec4) Load 19(ballot) + 743: 161(bvec3) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 741 742 + 745: 78(ivec3) Select 743 744 740 + 746: 71(ptr) AccessChain 31(data) 736 63 + 747: 25(ivec4) Load 746 + 748: 25(ivec4) VectorShuffle 747 745 4 5 6 3 + Store 746 748 + 749: 6(int) Load 8(invocation) + 750: 71(ptr) AccessChain 31(data) 63 63 + 751: 25(ivec4) Load 750 + 753: 169(bvec4) SLessThan 751 752 + 754: 17(ivec4) Load 19(ballot) + 755: 169(bvec4) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 753 754 + 757: 25(ivec4) Select 755 756 752 + 758: 71(ptr) AccessChain 31(data) 749 63 + Store 758 757 + 759: 6(int) Load 8(invocation) + 760: 64(ptr) AccessChain 31(data) 34 63 35 + 761: 24(int) Load 760 + 762: 17(ivec4) Load 19(ballot) + 763: 24(int) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 761 762 + 764: 64(ptr) AccessChain 31(data) 759 63 35 + Store 764 763 + 765: 6(int) Load 8(invocation) + 766: 71(ptr) AccessChain 31(data) 63 63 + 767: 25(ivec4) Load 766 + 768: 70(ivec2) VectorShuffle 767 767 0 1 + 769: 17(ivec4) Load 19(ballot) + 770: 70(ivec2) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 768 769 + 771: 71(ptr) AccessChain 31(data) 765 63 + 772: 25(ivec4) Load 771 + 773: 25(ivec4) VectorShuffle 772 770 4 5 2 3 + Store 771 773 + 774: 6(int) Load 8(invocation) + 775: 71(ptr) AccessChain 31(data) 33 63 + 776: 25(ivec4) Load 775 + 777: 78(ivec3) VectorShuffle 776 776 0 1 2 + 778: 17(ivec4) Load 19(ballot) + 779: 78(ivec3) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 777 778 + 780: 71(ptr) AccessChain 31(data) 774 63 + 781: 25(ivec4) Load 780 + 782: 25(ivec4) VectorShuffle 781 779 4 5 6 3 + Store 780 782 + 783: 6(int) Load 8(invocation) + 784: 71(ptr) AccessChain 31(data) 115 63 + 785: 25(ivec4) Load 784 + 786: 17(ivec4) Load 19(ballot) + 787: 25(ivec4) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 785 786 + 788: 71(ptr) AccessChain 31(data) 783 63 + Store 788 787 + 789: 6(int) Load 8(invocation) + 790: 90(ptr) AccessChain 31(data) 34 33 35 + 791: 6(int) Load 790 + 792: 17(ivec4) Load 19(ballot) + 793: 6(int) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 791 792 + 794: 90(ptr) AccessChain 31(data) 789 33 35 + Store 794 793 + 795: 6(int) Load 8(invocation) + 796: 40(ptr) AccessChain 31(data) 63 33 + 797: 17(ivec4) Load 796 + 798: 96(ivec2) VectorShuffle 797 797 0 1 + 799: 17(ivec4) Load 19(ballot) + 800: 96(ivec2) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 798 799 + 801: 40(ptr) AccessChain 31(data) 795 33 + 802: 17(ivec4) Load 801 + 803: 17(ivec4) VectorShuffle 802 800 4 5 2 3 + Store 801 803 + 804: 6(int) Load 8(invocation) + 805: 40(ptr) AccessChain 31(data) 33 33 + 806: 17(ivec4) Load 805 + 807: 103(ivec3) VectorShuffle 806 806 0 1 2 + 808: 17(ivec4) Load 19(ballot) + 809: 103(ivec3) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 807 808 + 810: 40(ptr) AccessChain 31(data) 804 33 + 811: 17(ivec4) Load 810 + 812: 17(ivec4) VectorShuffle 811 809 4 5 6 3 + Store 810 812 + 813: 6(int) Load 8(invocation) + 814: 40(ptr) AccessChain 31(data) 115 33 + 815: 17(ivec4) Load 814 + 816: 17(ivec4) Load 19(ballot) + 817: 17(ivec4) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 815 816 + 818: 40(ptr) AccessChain 31(data) 813 33 + Store 818 817 + 819: 6(int) Load 8(invocation) + 820: 64(ptr) AccessChain 31(data) 34 63 35 + 821: 24(int) Load 820 + 822: 144(bool) SLessThan 821 34 + 823: 17(ivec4) Load 19(ballot) + 824: 144(bool) GroupNonUniformLogicalOr 178 PartitionedReduceNV 822 823 + 825: 24(int) Select 824 63 34 + 826: 64(ptr) AccessChain 31(data) 819 63 35 + Store 826 825 + 827: 6(int) Load 8(invocation) + 828: 71(ptr) AccessChain 31(data) 63 63 + 829: 25(ivec4) Load 828 + 830: 70(ivec2) VectorShuffle 829 829 0 1 + 831: 152(bvec2) SLessThan 830 727 + 832: 17(ivec4) Load 19(ballot) + 833: 152(bvec2) GroupNonUniformLogicalOr 178 PartitionedReduceNV 831 832 + 834: 70(ivec2) Select 833 731 727 + 835: 71(ptr) AccessChain 31(data) 827 63 + 836: 25(ivec4) Load 835 + 837: 25(ivec4) VectorShuffle 836 834 4 5 2 3 + Store 835 837 + 838: 6(int) Load 8(invocation) + 839: 71(ptr) AccessChain 31(data) 63 63 + 840: 25(ivec4) Load 839 + 841: 78(ivec3) VectorShuffle 840 840 0 1 2 + 842: 161(bvec3) SLessThan 841 740 + 843: 17(ivec4) Load 19(ballot) + 844: 161(bvec3) GroupNonUniformLogicalOr 178 PartitionedReduceNV 842 843 + 845: 78(ivec3) Select 844 744 740 + 846: 71(ptr) AccessChain 31(data) 838 63 + 847: 25(ivec4) Load 846 + 848: 25(ivec4) VectorShuffle 847 845 4 5 6 3 + Store 846 848 + 849: 6(int) Load 8(invocation) + 850: 71(ptr) AccessChain 31(data) 63 63 + 851: 25(ivec4) Load 850 + 852: 169(bvec4) SLessThan 851 752 + 853: 17(ivec4) Load 19(ballot) + 854: 169(bvec4) GroupNonUniformLogicalOr 178 PartitionedReduceNV 852 853 + 855: 25(ivec4) Select 854 756 752 + 856: 71(ptr) AccessChain 31(data) 849 63 + Store 856 855 + 857: 6(int) Load 8(invocation) + 858: 64(ptr) AccessChain 31(data) 34 63 35 + 859: 24(int) Load 858 + 860: 17(ivec4) Load 19(ballot) + 861: 24(int) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 859 860 + 862: 64(ptr) AccessChain 31(data) 857 63 35 + Store 862 861 + 863: 6(int) Load 8(invocation) + 864: 71(ptr) AccessChain 31(data) 63 63 + 865: 25(ivec4) Load 864 + 866: 70(ivec2) VectorShuffle 865 865 0 1 + 867: 17(ivec4) Load 19(ballot) + 868: 70(ivec2) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 866 867 + 869: 71(ptr) AccessChain 31(data) 863 63 + 870: 25(ivec4) Load 869 + 871: 25(ivec4) VectorShuffle 870 868 4 5 2 3 + Store 869 871 + 872: 6(int) Load 8(invocation) + 873: 71(ptr) AccessChain 31(data) 33 63 + 874: 25(ivec4) Load 873 + 875: 78(ivec3) VectorShuffle 874 874 0 1 2 + 876: 17(ivec4) Load 19(ballot) + 877: 78(ivec3) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 875 876 + 878: 71(ptr) AccessChain 31(data) 872 63 + 879: 25(ivec4) Load 878 + 880: 25(ivec4) VectorShuffle 879 877 4 5 6 3 + Store 878 880 + 881: 6(int) Load 8(invocation) + 882: 71(ptr) AccessChain 31(data) 115 63 + 883: 25(ivec4) Load 882 + 884: 17(ivec4) Load 19(ballot) + 885: 25(ivec4) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 883 884 + 886: 71(ptr) AccessChain 31(data) 881 63 + Store 886 885 + 887: 6(int) Load 8(invocation) + 888: 90(ptr) AccessChain 31(data) 34 33 35 + 889: 6(int) Load 888 + 890: 17(ivec4) Load 19(ballot) + 891: 6(int) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 889 890 + 892: 90(ptr) AccessChain 31(data) 887 33 35 + Store 892 891 + 893: 6(int) Load 8(invocation) + 894: 40(ptr) AccessChain 31(data) 63 33 + 895: 17(ivec4) Load 894 + 896: 96(ivec2) VectorShuffle 895 895 0 1 + 897: 17(ivec4) Load 19(ballot) + 898: 96(ivec2) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 896 897 + 899: 40(ptr) AccessChain 31(data) 893 33 + 900: 17(ivec4) Load 899 + 901: 17(ivec4) VectorShuffle 900 898 4 5 2 3 + Store 899 901 + 902: 6(int) Load 8(invocation) + 903: 40(ptr) AccessChain 31(data) 33 33 + 904: 17(ivec4) Load 903 + 905: 103(ivec3) VectorShuffle 904 904 0 1 2 + 906: 17(ivec4) Load 19(ballot) + 907: 103(ivec3) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 905 906 + 908: 40(ptr) AccessChain 31(data) 902 33 + 909: 17(ivec4) Load 908 + 910: 17(ivec4) VectorShuffle 909 907 4 5 6 3 + Store 908 910 + 911: 6(int) Load 8(invocation) + 912: 40(ptr) AccessChain 31(data) 115 33 + 913: 17(ivec4) Load 912 + 914: 17(ivec4) Load 19(ballot) + 915: 17(ivec4) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 913 914 + 916: 40(ptr) AccessChain 31(data) 911 33 + Store 916 915 + 917: 6(int) Load 8(invocation) + 918: 64(ptr) AccessChain 31(data) 34 63 35 + 919: 24(int) Load 918 + 920: 144(bool) SLessThan 919 34 + 921: 17(ivec4) Load 19(ballot) + 922: 144(bool) GroupNonUniformLogicalXor 178 PartitionedReduceNV 920 921 + 923: 24(int) Select 922 63 34 + 924: 64(ptr) AccessChain 31(data) 917 63 35 + Store 924 923 + 925: 6(int) Load 8(invocation) + 926: 71(ptr) AccessChain 31(data) 63 63 + 927: 25(ivec4) Load 926 + 928: 70(ivec2) VectorShuffle 927 927 0 1 + 929: 152(bvec2) SLessThan 928 727 + 930: 17(ivec4) Load 19(ballot) + 931: 152(bvec2) GroupNonUniformLogicalXor 178 PartitionedReduceNV 929 930 + 932: 70(ivec2) Select 931 731 727 + 933: 71(ptr) AccessChain 31(data) 925 63 + 934: 25(ivec4) Load 933 + 935: 25(ivec4) VectorShuffle 934 932 4 5 2 3 + Store 933 935 + 936: 6(int) Load 8(invocation) + 937: 71(ptr) AccessChain 31(data) 63 63 + 938: 25(ivec4) Load 937 + 939: 78(ivec3) VectorShuffle 938 938 0 1 2 + 940: 161(bvec3) SLessThan 939 740 + 941: 17(ivec4) Load 19(ballot) + 942: 161(bvec3) GroupNonUniformLogicalXor 178 PartitionedReduceNV 940 941 + 943: 78(ivec3) Select 942 744 740 + 944: 71(ptr) AccessChain 31(data) 936 63 + 945: 25(ivec4) Load 944 + 946: 25(ivec4) VectorShuffle 945 943 4 5 6 3 + Store 944 946 + 947: 6(int) Load 8(invocation) + 948: 71(ptr) AccessChain 31(data) 63 63 + 949: 25(ivec4) Load 948 + 950: 169(bvec4) SLessThan 949 752 + 951: 17(ivec4) Load 19(ballot) + 952: 169(bvec4) GroupNonUniformLogicalXor 178 PartitionedReduceNV 950 951 + 953: 25(ivec4) Select 952 756 752 + 954: 71(ptr) AccessChain 31(data) 947 63 + Store 954 953 + 955: 6(int) Load 8(invocation) + 956: 36(ptr) AccessChain 31(data) 34 34 35 + 957: 22(float) Load 956 + 958: 17(ivec4) Load 19(ballot) + 959: 22(float) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 957 958 + 960: 36(ptr) AccessChain 31(data) 955 34 35 + Store 960 959 + 961: 6(int) Load 8(invocation) + 962: 44(ptr) AccessChain 31(data) 63 34 + 963: 23(fvec4) Load 962 + 964: 43(fvec2) VectorShuffle 963 963 0 1 + 965: 17(ivec4) Load 19(ballot) + 966: 43(fvec2) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 964 965 + 967: 44(ptr) AccessChain 31(data) 961 34 + 968: 23(fvec4) Load 967 + 969: 23(fvec4) VectorShuffle 968 966 4 5 2 3 + Store 967 969 + 970: 6(int) Load 8(invocation) + 971: 44(ptr) AccessChain 31(data) 33 34 + 972: 23(fvec4) Load 971 + 973: 51(fvec3) VectorShuffle 972 972 0 1 2 + 974: 17(ivec4) Load 19(ballot) + 975: 51(fvec3) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 973 974 + 976: 44(ptr) AccessChain 31(data) 970 34 + 977: 23(fvec4) Load 976 + 978: 23(fvec4) VectorShuffle 977 975 4 5 6 3 + Store 976 978 + 979: 6(int) Load 8(invocation) + 980: 44(ptr) AccessChain 31(data) 115 34 + 981: 23(fvec4) Load 980 + 982: 17(ivec4) Load 19(ballot) + 983: 23(fvec4) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 981 982 + 984: 44(ptr) AccessChain 31(data) 979 34 + Store 984 983 + 985: 6(int) Load 8(invocation) + 986: 64(ptr) AccessChain 31(data) 34 63 35 + 987: 24(int) Load 986 + 988: 17(ivec4) Load 19(ballot) + 989: 24(int) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 987 988 + 990: 64(ptr) AccessChain 31(data) 985 63 35 + Store 990 989 + 991: 6(int) Load 8(invocation) + 992: 71(ptr) AccessChain 31(data) 63 63 + 993: 25(ivec4) Load 992 + 994: 70(ivec2) VectorShuffle 993 993 0 1 + 995: 17(ivec4) Load 19(ballot) + 996: 70(ivec2) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 994 995 + 997: 71(ptr) AccessChain 31(data) 991 63 + 998: 25(ivec4) Load 997 + 999: 25(ivec4) VectorShuffle 998 996 4 5 2 3 + Store 997 999 + 1000: 6(int) Load 8(invocation) + 1001: 71(ptr) AccessChain 31(data) 33 63 + 1002: 25(ivec4) Load 1001 + 1003: 78(ivec3) VectorShuffle 1002 1002 0 1 2 + 1004: 17(ivec4) Load 19(ballot) + 1005: 78(ivec3) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1003 1004 + 1006: 71(ptr) AccessChain 31(data) 1000 63 + 1007: 25(ivec4) Load 1006 + 1008: 25(ivec4) VectorShuffle 1007 1005 4 5 6 3 + Store 1006 1008 + 1009: 6(int) Load 8(invocation) + 1010: 71(ptr) AccessChain 31(data) 115 63 + 1011: 25(ivec4) Load 1010 + 1012: 17(ivec4) Load 19(ballot) + 1013: 25(ivec4) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1011 1012 + 1014: 71(ptr) AccessChain 31(data) 1009 63 + Store 1014 1013 + 1015: 6(int) Load 8(invocation) + 1016: 90(ptr) AccessChain 31(data) 34 33 35 + 1017: 6(int) Load 1016 + 1018: 17(ivec4) Load 19(ballot) + 1019: 6(int) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1017 1018 + 1020: 90(ptr) AccessChain 31(data) 1015 33 35 + Store 1020 1019 + 1021: 6(int) Load 8(invocation) + 1022: 40(ptr) AccessChain 31(data) 63 33 + 1023: 17(ivec4) Load 1022 + 1024: 96(ivec2) VectorShuffle 1023 1023 0 1 + 1025: 17(ivec4) Load 19(ballot) + 1026: 96(ivec2) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1024 1025 + 1027: 40(ptr) AccessChain 31(data) 1021 33 + 1028: 17(ivec4) Load 1027 + 1029: 17(ivec4) VectorShuffle 1028 1026 4 5 2 3 + Store 1027 1029 + 1030: 6(int) Load 8(invocation) + 1031: 40(ptr) AccessChain 31(data) 33 33 + 1032: 17(ivec4) Load 1031 + 1033: 103(ivec3) VectorShuffle 1032 1032 0 1 2 + 1034: 17(ivec4) Load 19(ballot) + 1035: 103(ivec3) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1033 1034 + 1036: 40(ptr) AccessChain 31(data) 1030 33 + 1037: 17(ivec4) Load 1036 + 1038: 17(ivec4) VectorShuffle 1037 1035 4 5 6 3 + Store 1036 1038 + 1039: 6(int) Load 8(invocation) + 1040: 40(ptr) AccessChain 31(data) 115 33 + 1041: 17(ivec4) Load 1040 + 1042: 17(ivec4) Load 19(ballot) + 1043: 17(ivec4) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1041 1042 + 1044: 40(ptr) AccessChain 31(data) 1039 33 + Store 1044 1043 + 1045: 6(int) Load 8(invocation) + 1046: 116(ptr) AccessChain 31(data) 34 115 35 + 1047: 26(float) Load 1046 + 1048: 17(ivec4) Load 19(ballot) + 1049: 26(float) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1047 1048 + 1050: 116(ptr) AccessChain 31(data) 1045 115 35 + Store 1050 1049 + 1051: 6(int) Load 8(invocation) + 1052: 123(ptr) AccessChain 31(data) 63 115 + 1053: 27(fvec4) Load 1052 + 1054: 122(fvec2) VectorShuffle 1053 1053 0 1 + 1055: 17(ivec4) Load 19(ballot) + 1056: 122(fvec2) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1054 1055 + 1057: 123(ptr) AccessChain 31(data) 1051 115 + 1058: 27(fvec4) Load 1057 + 1059: 27(fvec4) VectorShuffle 1058 1056 4 5 2 3 + Store 1057 1059 + 1060: 6(int) Load 8(invocation) + 1061: 123(ptr) AccessChain 31(data) 33 115 + 1062: 27(fvec4) Load 1061 + 1063: 130(fvec3) VectorShuffle 1062 1062 0 1 2 + 1064: 17(ivec4) Load 19(ballot) + 1065: 130(fvec3) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1063 1064 + 1066: 123(ptr) AccessChain 31(data) 1060 115 + 1067: 27(fvec4) Load 1066 + 1068: 27(fvec4) VectorShuffle 1067 1065 4 5 6 3 + Store 1066 1068 + 1069: 6(int) Load 8(invocation) + 1070: 123(ptr) AccessChain 31(data) 115 115 + 1071: 27(fvec4) Load 1070 + 1072: 17(ivec4) Load 19(ballot) + 1073: 27(fvec4) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1071 1072 + 1074: 123(ptr) AccessChain 31(data) 1069 115 + Store 1074 1073 + 1075: 6(int) Load 8(invocation) + 1076: 36(ptr) AccessChain 31(data) 34 34 35 + 1077: 22(float) Load 1076 + 1078: 17(ivec4) Load 19(ballot) + 1079: 22(float) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1077 1078 + 1080: 36(ptr) AccessChain 31(data) 1075 34 35 + Store 1080 1079 + 1081: 6(int) Load 8(invocation) + 1082: 44(ptr) AccessChain 31(data) 63 34 + 1083: 23(fvec4) Load 1082 + 1084: 43(fvec2) VectorShuffle 1083 1083 0 1 + 1085: 17(ivec4) Load 19(ballot) + 1086: 43(fvec2) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1084 1085 + 1087: 44(ptr) AccessChain 31(data) 1081 34 + 1088: 23(fvec4) Load 1087 + 1089: 23(fvec4) VectorShuffle 1088 1086 4 5 2 3 + Store 1087 1089 + 1090: 6(int) Load 8(invocation) + 1091: 44(ptr) AccessChain 31(data) 33 34 + 1092: 23(fvec4) Load 1091 + 1093: 51(fvec3) VectorShuffle 1092 1092 0 1 2 + 1094: 17(ivec4) Load 19(ballot) + 1095: 51(fvec3) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1093 1094 + 1096: 44(ptr) AccessChain 31(data) 1090 34 + 1097: 23(fvec4) Load 1096 + 1098: 23(fvec4) VectorShuffle 1097 1095 4 5 6 3 + Store 1096 1098 + 1099: 6(int) Load 8(invocation) + 1100: 44(ptr) AccessChain 31(data) 115 34 + 1101: 23(fvec4) Load 1100 + 1102: 17(ivec4) Load 19(ballot) + 1103: 23(fvec4) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1101 1102 + 1104: 44(ptr) AccessChain 31(data) 1099 34 + Store 1104 1103 + 1105: 6(int) Load 8(invocation) + 1106: 64(ptr) AccessChain 31(data) 34 63 35 + 1107: 24(int) Load 1106 + 1108: 17(ivec4) Load 19(ballot) + 1109: 24(int) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1107 1108 + 1110: 64(ptr) AccessChain 31(data) 1105 63 35 + Store 1110 1109 + 1111: 6(int) Load 8(invocation) + 1112: 71(ptr) AccessChain 31(data) 63 63 + 1113: 25(ivec4) Load 1112 + 1114: 70(ivec2) VectorShuffle 1113 1113 0 1 + 1115: 17(ivec4) Load 19(ballot) + 1116: 70(ivec2) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1114 1115 + 1117: 71(ptr) AccessChain 31(data) 1111 63 + 1118: 25(ivec4) Load 1117 + 1119: 25(ivec4) VectorShuffle 1118 1116 4 5 2 3 + Store 1117 1119 + 1120: 6(int) Load 8(invocation) + 1121: 71(ptr) AccessChain 31(data) 33 63 + 1122: 25(ivec4) Load 1121 + 1123: 78(ivec3) VectorShuffle 1122 1122 0 1 2 + 1124: 17(ivec4) Load 19(ballot) + 1125: 78(ivec3) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1123 1124 + 1126: 71(ptr) AccessChain 31(data) 1120 63 + 1127: 25(ivec4) Load 1126 + 1128: 25(ivec4) VectorShuffle 1127 1125 4 5 6 3 + Store 1126 1128 + 1129: 6(int) Load 8(invocation) + 1130: 71(ptr) AccessChain 31(data) 115 63 + 1131: 25(ivec4) Load 1130 + 1132: 17(ivec4) Load 19(ballot) + 1133: 25(ivec4) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1131 1132 + 1134: 71(ptr) AccessChain 31(data) 1129 63 + Store 1134 1133 + 1135: 6(int) Load 8(invocation) + 1136: 90(ptr) AccessChain 31(data) 34 33 35 + 1137: 6(int) Load 1136 + 1138: 17(ivec4) Load 19(ballot) + 1139: 6(int) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1137 1138 + 1140: 90(ptr) AccessChain 31(data) 1135 33 35 + Store 1140 1139 + 1141: 6(int) Load 8(invocation) + 1142: 40(ptr) AccessChain 31(data) 63 33 + 1143: 17(ivec4) Load 1142 + 1144: 96(ivec2) VectorShuffle 1143 1143 0 1 + 1145: 17(ivec4) Load 19(ballot) + 1146: 96(ivec2) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1144 1145 + 1147: 40(ptr) AccessChain 31(data) 1141 33 + 1148: 17(ivec4) Load 1147 + 1149: 17(ivec4) VectorShuffle 1148 1146 4 5 2 3 + Store 1147 1149 + 1150: 6(int) Load 8(invocation) + 1151: 40(ptr) AccessChain 31(data) 33 33 + 1152: 17(ivec4) Load 1151 + 1153: 103(ivec3) VectorShuffle 1152 1152 0 1 2 + 1154: 17(ivec4) Load 19(ballot) + 1155: 103(ivec3) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1153 1154 + 1156: 40(ptr) AccessChain 31(data) 1150 33 + 1157: 17(ivec4) Load 1156 + 1158: 17(ivec4) VectorShuffle 1157 1155 4 5 6 3 + Store 1156 1158 + 1159: 6(int) Load 8(invocation) + 1160: 40(ptr) AccessChain 31(data) 115 33 + 1161: 17(ivec4) Load 1160 + 1162: 17(ivec4) Load 19(ballot) + 1163: 17(ivec4) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1161 1162 + 1164: 40(ptr) AccessChain 31(data) 1159 33 + Store 1164 1163 + 1165: 6(int) Load 8(invocation) + 1166: 116(ptr) AccessChain 31(data) 34 115 35 + 1167: 26(float) Load 1166 + 1168: 17(ivec4) Load 19(ballot) + 1169: 26(float) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1167 1168 + 1170: 116(ptr) AccessChain 31(data) 1165 115 35 + Store 1170 1169 + 1171: 6(int) Load 8(invocation) + 1172: 123(ptr) AccessChain 31(data) 63 115 + 1173: 27(fvec4) Load 1172 + 1174: 122(fvec2) VectorShuffle 1173 1173 0 1 + 1175: 17(ivec4) Load 19(ballot) + 1176: 122(fvec2) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1174 1175 + 1177: 123(ptr) AccessChain 31(data) 1171 115 + 1178: 27(fvec4) Load 1177 + 1179: 27(fvec4) VectorShuffle 1178 1176 4 5 2 3 + Store 1177 1179 + 1180: 6(int) Load 8(invocation) + 1181: 123(ptr) AccessChain 31(data) 33 115 + 1182: 27(fvec4) Load 1181 + 1183: 130(fvec3) VectorShuffle 1182 1182 0 1 2 + 1184: 17(ivec4) Load 19(ballot) + 1185: 130(fvec3) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1183 1184 + 1186: 123(ptr) AccessChain 31(data) 1180 115 + 1187: 27(fvec4) Load 1186 + 1188: 27(fvec4) VectorShuffle 1187 1185 4 5 6 3 + Store 1186 1188 + 1189: 6(int) Load 8(invocation) + 1190: 123(ptr) AccessChain 31(data) 115 115 + 1191: 27(fvec4) Load 1190 + 1192: 17(ivec4) Load 19(ballot) + 1193: 27(fvec4) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1191 1192 + 1194: 123(ptr) AccessChain 31(data) 1189 115 + Store 1194 1193 + 1195: 6(int) Load 8(invocation) + 1196: 36(ptr) AccessChain 31(data) 34 34 35 + 1197: 22(float) Load 1196 + 1198: 17(ivec4) Load 19(ballot) + 1199: 22(float) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1197 1198 + 1200: 36(ptr) AccessChain 31(data) 1195 34 35 + Store 1200 1199 + 1201: 6(int) Load 8(invocation) + 1202: 44(ptr) AccessChain 31(data) 63 34 + 1203: 23(fvec4) Load 1202 + 1204: 43(fvec2) VectorShuffle 1203 1203 0 1 + 1205: 17(ivec4) Load 19(ballot) + 1206: 43(fvec2) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1204 1205 + 1207: 44(ptr) AccessChain 31(data) 1201 34 + 1208: 23(fvec4) Load 1207 + 1209: 23(fvec4) VectorShuffle 1208 1206 4 5 2 3 + Store 1207 1209 + 1210: 6(int) Load 8(invocation) + 1211: 44(ptr) AccessChain 31(data) 33 34 + 1212: 23(fvec4) Load 1211 + 1213: 51(fvec3) VectorShuffle 1212 1212 0 1 2 + 1214: 17(ivec4) Load 19(ballot) + 1215: 51(fvec3) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1213 1214 + 1216: 44(ptr) AccessChain 31(data) 1210 34 + 1217: 23(fvec4) Load 1216 + 1218: 23(fvec4) VectorShuffle 1217 1215 4 5 6 3 + Store 1216 1218 + 1219: 6(int) Load 8(invocation) + 1220: 44(ptr) AccessChain 31(data) 115 34 + 1221: 23(fvec4) Load 1220 + 1222: 17(ivec4) Load 19(ballot) + 1223: 23(fvec4) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1221 1222 + 1224: 44(ptr) AccessChain 31(data) 1219 34 + Store 1224 1223 + 1225: 6(int) Load 8(invocation) + 1226: 64(ptr) AccessChain 31(data) 34 63 35 + 1227: 24(int) Load 1226 + 1228: 17(ivec4) Load 19(ballot) + 1229: 24(int) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1227 1228 + 1230: 64(ptr) AccessChain 31(data) 1225 63 35 + Store 1230 1229 + 1231: 6(int) Load 8(invocation) + 1232: 71(ptr) AccessChain 31(data) 63 63 + 1233: 25(ivec4) Load 1232 + 1234: 70(ivec2) VectorShuffle 1233 1233 0 1 + 1235: 17(ivec4) Load 19(ballot) + 1236: 70(ivec2) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1234 1235 + 1237: 71(ptr) AccessChain 31(data) 1231 63 + 1238: 25(ivec4) Load 1237 + 1239: 25(ivec4) VectorShuffle 1238 1236 4 5 2 3 + Store 1237 1239 + 1240: 6(int) Load 8(invocation) + 1241: 71(ptr) AccessChain 31(data) 33 63 + 1242: 25(ivec4) Load 1241 + 1243: 78(ivec3) VectorShuffle 1242 1242 0 1 2 + 1244: 17(ivec4) Load 19(ballot) + 1245: 78(ivec3) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1243 1244 + 1246: 71(ptr) AccessChain 31(data) 1240 63 + 1247: 25(ivec4) Load 1246 + 1248: 25(ivec4) VectorShuffle 1247 1245 4 5 6 3 + Store 1246 1248 + 1249: 6(int) Load 8(invocation) + 1250: 71(ptr) AccessChain 31(data) 115 63 + 1251: 25(ivec4) Load 1250 + 1252: 17(ivec4) Load 19(ballot) + 1253: 25(ivec4) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1251 1252 + 1254: 71(ptr) AccessChain 31(data) 1249 63 + Store 1254 1253 + 1255: 6(int) Load 8(invocation) + 1256: 90(ptr) AccessChain 31(data) 34 33 35 + 1257: 6(int) Load 1256 + 1258: 17(ivec4) Load 19(ballot) + 1259: 6(int) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1257 1258 + 1260: 90(ptr) AccessChain 31(data) 1255 33 35 + Store 1260 1259 + 1261: 6(int) Load 8(invocation) + 1262: 40(ptr) AccessChain 31(data) 63 33 + 1263: 17(ivec4) Load 1262 + 1264: 96(ivec2) VectorShuffle 1263 1263 0 1 + 1265: 17(ivec4) Load 19(ballot) + 1266: 96(ivec2) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1264 1265 + 1267: 40(ptr) AccessChain 31(data) 1261 33 + 1268: 17(ivec4) Load 1267 + 1269: 17(ivec4) VectorShuffle 1268 1266 4 5 2 3 + Store 1267 1269 + 1270: 6(int) Load 8(invocation) + 1271: 40(ptr) AccessChain 31(data) 33 33 + 1272: 17(ivec4) Load 1271 + 1273: 103(ivec3) VectorShuffle 1272 1272 0 1 2 + 1274: 17(ivec4) Load 19(ballot) + 1275: 103(ivec3) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1273 1274 + 1276: 40(ptr) AccessChain 31(data) 1270 33 + 1277: 17(ivec4) Load 1276 + 1278: 17(ivec4) VectorShuffle 1277 1275 4 5 6 3 + Store 1276 1278 + 1279: 6(int) Load 8(invocation) + 1280: 40(ptr) AccessChain 31(data) 115 33 + 1281: 17(ivec4) Load 1280 + 1282: 17(ivec4) Load 19(ballot) + 1283: 17(ivec4) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1281 1282 + 1284: 40(ptr) AccessChain 31(data) 1279 33 + Store 1284 1283 + 1285: 6(int) Load 8(invocation) + 1286: 116(ptr) AccessChain 31(data) 34 115 35 + 1287: 26(float) Load 1286 + 1288: 17(ivec4) Load 19(ballot) + 1289: 26(float) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1287 1288 + 1290: 116(ptr) AccessChain 31(data) 1285 115 35 + Store 1290 1289 + 1291: 6(int) Load 8(invocation) + 1292: 123(ptr) AccessChain 31(data) 63 115 + 1293: 27(fvec4) Load 1292 + 1294: 122(fvec2) VectorShuffle 1293 1293 0 1 + 1295: 17(ivec4) Load 19(ballot) + 1296: 122(fvec2) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1294 1295 + 1297: 123(ptr) AccessChain 31(data) 1291 115 + 1298: 27(fvec4) Load 1297 + 1299: 27(fvec4) VectorShuffle 1298 1296 4 5 2 3 + Store 1297 1299 + 1300: 6(int) Load 8(invocation) + 1301: 123(ptr) AccessChain 31(data) 33 115 + 1302: 27(fvec4) Load 1301 + 1303: 130(fvec3) VectorShuffle 1302 1302 0 1 2 + 1304: 17(ivec4) Load 19(ballot) + 1305: 130(fvec3) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1303 1304 + 1306: 123(ptr) AccessChain 31(data) 1300 115 + 1307: 27(fvec4) Load 1306 + 1308: 27(fvec4) VectorShuffle 1307 1305 4 5 6 3 + Store 1306 1308 + 1309: 6(int) Load 8(invocation) + 1310: 123(ptr) AccessChain 31(data) 115 115 + 1311: 27(fvec4) Load 1310 + 1312: 17(ivec4) Load 19(ballot) + 1313: 27(fvec4) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1311 1312 + 1314: 123(ptr) AccessChain 31(data) 1309 115 + Store 1314 1313 + 1315: 6(int) Load 8(invocation) + 1316: 36(ptr) AccessChain 31(data) 34 34 35 + 1317: 22(float) Load 1316 + 1318: 17(ivec4) Load 19(ballot) + 1319: 22(float) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1317 1318 + 1320: 36(ptr) AccessChain 31(data) 1315 34 35 + Store 1320 1319 + 1321: 6(int) Load 8(invocation) + 1322: 44(ptr) AccessChain 31(data) 63 34 + 1323: 23(fvec4) Load 1322 + 1324: 43(fvec2) VectorShuffle 1323 1323 0 1 + 1325: 17(ivec4) Load 19(ballot) + 1326: 43(fvec2) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1324 1325 + 1327: 44(ptr) AccessChain 31(data) 1321 34 + 1328: 23(fvec4) Load 1327 + 1329: 23(fvec4) VectorShuffle 1328 1326 4 5 2 3 + Store 1327 1329 + 1330: 6(int) Load 8(invocation) + 1331: 44(ptr) AccessChain 31(data) 33 34 + 1332: 23(fvec4) Load 1331 + 1333: 51(fvec3) VectorShuffle 1332 1332 0 1 2 + 1334: 17(ivec4) Load 19(ballot) + 1335: 51(fvec3) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1333 1334 + 1336: 44(ptr) AccessChain 31(data) 1330 34 + 1337: 23(fvec4) Load 1336 + 1338: 23(fvec4) VectorShuffle 1337 1335 4 5 6 3 + Store 1336 1338 + 1339: 6(int) Load 8(invocation) + 1340: 44(ptr) AccessChain 31(data) 115 34 + 1341: 23(fvec4) Load 1340 + 1342: 17(ivec4) Load 19(ballot) + 1343: 23(fvec4) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1341 1342 + 1344: 44(ptr) AccessChain 31(data) 1339 34 + Store 1344 1343 + 1345: 6(int) Load 8(invocation) + 1346: 64(ptr) AccessChain 31(data) 34 63 35 + 1347: 24(int) Load 1346 + 1348: 17(ivec4) Load 19(ballot) + 1349: 24(int) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1347 1348 + 1350: 64(ptr) AccessChain 31(data) 1345 63 35 + Store 1350 1349 + 1351: 6(int) Load 8(invocation) + 1352: 71(ptr) AccessChain 31(data) 63 63 + 1353: 25(ivec4) Load 1352 + 1354: 70(ivec2) VectorShuffle 1353 1353 0 1 + 1355: 17(ivec4) Load 19(ballot) + 1356: 70(ivec2) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1354 1355 + 1357: 71(ptr) AccessChain 31(data) 1351 63 + 1358: 25(ivec4) Load 1357 + 1359: 25(ivec4) VectorShuffle 1358 1356 4 5 2 3 + Store 1357 1359 + 1360: 6(int) Load 8(invocation) + 1361: 71(ptr) AccessChain 31(data) 33 63 + 1362: 25(ivec4) Load 1361 + 1363: 78(ivec3) VectorShuffle 1362 1362 0 1 2 + 1364: 17(ivec4) Load 19(ballot) + 1365: 78(ivec3) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1363 1364 + 1366: 71(ptr) AccessChain 31(data) 1360 63 + 1367: 25(ivec4) Load 1366 + 1368: 25(ivec4) VectorShuffle 1367 1365 4 5 6 3 + Store 1366 1368 + 1369: 6(int) Load 8(invocation) + 1370: 71(ptr) AccessChain 31(data) 115 63 + 1371: 25(ivec4) Load 1370 + 1372: 17(ivec4) Load 19(ballot) + 1373: 25(ivec4) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1371 1372 + 1374: 71(ptr) AccessChain 31(data) 1369 63 + Store 1374 1373 + 1375: 6(int) Load 8(invocation) + 1376: 90(ptr) AccessChain 31(data) 34 33 35 + 1377: 6(int) Load 1376 + 1378: 17(ivec4) Load 19(ballot) + 1379: 6(int) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1377 1378 + 1380: 90(ptr) AccessChain 31(data) 1375 33 35 + Store 1380 1379 + 1381: 6(int) Load 8(invocation) + 1382: 40(ptr) AccessChain 31(data) 63 33 + 1383: 17(ivec4) Load 1382 + 1384: 96(ivec2) VectorShuffle 1383 1383 0 1 + 1385: 17(ivec4) Load 19(ballot) + 1386: 96(ivec2) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1384 1385 + 1387: 40(ptr) AccessChain 31(data) 1381 33 + 1388: 17(ivec4) Load 1387 + 1389: 17(ivec4) VectorShuffle 1388 1386 4 5 2 3 + Store 1387 1389 + 1390: 6(int) Load 8(invocation) + 1391: 40(ptr) AccessChain 31(data) 33 33 + 1392: 17(ivec4) Load 1391 + 1393: 103(ivec3) VectorShuffle 1392 1392 0 1 2 + 1394: 17(ivec4) Load 19(ballot) + 1395: 103(ivec3) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1393 1394 + 1396: 40(ptr) AccessChain 31(data) 1390 33 + 1397: 17(ivec4) Load 1396 + 1398: 17(ivec4) VectorShuffle 1397 1395 4 5 6 3 + Store 1396 1398 + 1399: 6(int) Load 8(invocation) + 1400: 40(ptr) AccessChain 31(data) 115 33 + 1401: 17(ivec4) Load 1400 + 1402: 17(ivec4) Load 19(ballot) + 1403: 17(ivec4) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1401 1402 + 1404: 40(ptr) AccessChain 31(data) 1399 33 + Store 1404 1403 + 1405: 6(int) Load 8(invocation) + 1406: 116(ptr) AccessChain 31(data) 34 115 35 + 1407: 26(float) Load 1406 + 1408: 17(ivec4) Load 19(ballot) + 1409: 26(float) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1407 1408 + 1410: 116(ptr) AccessChain 31(data) 1405 115 35 + Store 1410 1409 + 1411: 6(int) Load 8(invocation) + 1412: 123(ptr) AccessChain 31(data) 63 115 + 1413: 27(fvec4) Load 1412 + 1414: 122(fvec2) VectorShuffle 1413 1413 0 1 + 1415: 17(ivec4) Load 19(ballot) + 1416: 122(fvec2) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1414 1415 + 1417: 123(ptr) AccessChain 31(data) 1411 115 + 1418: 27(fvec4) Load 1417 + 1419: 27(fvec4) VectorShuffle 1418 1416 4 5 2 3 + Store 1417 1419 + 1420: 6(int) Load 8(invocation) + 1421: 123(ptr) AccessChain 31(data) 33 115 + 1422: 27(fvec4) Load 1421 + 1423: 130(fvec3) VectorShuffle 1422 1422 0 1 2 + 1424: 17(ivec4) Load 19(ballot) + 1425: 130(fvec3) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1423 1424 + 1426: 123(ptr) AccessChain 31(data) 1420 115 + 1427: 27(fvec4) Load 1426 + 1428: 27(fvec4) VectorShuffle 1427 1425 4 5 6 3 + Store 1426 1428 + 1429: 6(int) Load 8(invocation) + 1430: 123(ptr) AccessChain 31(data) 115 115 + 1431: 27(fvec4) Load 1430 + 1432: 17(ivec4) Load 19(ballot) + 1433: 27(fvec4) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1431 1432 + 1434: 123(ptr) AccessChain 31(data) 1429 115 + Store 1434 1433 + 1435: 6(int) Load 8(invocation) + 1436: 64(ptr) AccessChain 31(data) 34 63 35 + 1437: 24(int) Load 1436 + 1438: 17(ivec4) Load 19(ballot) + 1439: 24(int) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1437 1438 + 1440: 64(ptr) AccessChain 31(data) 1435 63 35 + Store 1440 1439 + 1441: 6(int) Load 8(invocation) + 1442: 71(ptr) AccessChain 31(data) 63 63 + 1443: 25(ivec4) Load 1442 + 1444: 70(ivec2) VectorShuffle 1443 1443 0 1 + 1445: 17(ivec4) Load 19(ballot) + 1446: 70(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1444 1445 + 1447: 71(ptr) AccessChain 31(data) 1441 63 + 1448: 25(ivec4) Load 1447 + 1449: 25(ivec4) VectorShuffle 1448 1446 4 5 2 3 + Store 1447 1449 + 1450: 6(int) Load 8(invocation) + 1451: 71(ptr) AccessChain 31(data) 33 63 + 1452: 25(ivec4) Load 1451 + 1453: 78(ivec3) VectorShuffle 1452 1452 0 1 2 + 1454: 17(ivec4) Load 19(ballot) + 1455: 78(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1453 1454 + 1456: 71(ptr) AccessChain 31(data) 1450 63 + 1457: 25(ivec4) Load 1456 + 1458: 25(ivec4) VectorShuffle 1457 1455 4 5 6 3 + Store 1456 1458 + 1459: 6(int) Load 8(invocation) + 1460: 71(ptr) AccessChain 31(data) 115 63 + 1461: 25(ivec4) Load 1460 + 1462: 17(ivec4) Load 19(ballot) + 1463: 25(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1461 1462 + 1464: 71(ptr) AccessChain 31(data) 1459 63 + Store 1464 1463 + 1465: 6(int) Load 8(invocation) + 1466: 90(ptr) AccessChain 31(data) 34 33 35 + 1467: 6(int) Load 1466 + 1468: 17(ivec4) Load 19(ballot) + 1469: 6(int) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1467 1468 + 1470: 90(ptr) AccessChain 31(data) 1465 33 35 + Store 1470 1469 + 1471: 6(int) Load 8(invocation) + 1472: 40(ptr) AccessChain 31(data) 63 33 + 1473: 17(ivec4) Load 1472 + 1474: 96(ivec2) VectorShuffle 1473 1473 0 1 + 1475: 17(ivec4) Load 19(ballot) + 1476: 96(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1474 1475 + 1477: 40(ptr) AccessChain 31(data) 1471 33 + 1478: 17(ivec4) Load 1477 + 1479: 17(ivec4) VectorShuffle 1478 1476 4 5 2 3 + Store 1477 1479 + 1480: 6(int) Load 8(invocation) + 1481: 40(ptr) AccessChain 31(data) 33 33 + 1482: 17(ivec4) Load 1481 + 1483: 103(ivec3) VectorShuffle 1482 1482 0 1 2 + 1484: 17(ivec4) Load 19(ballot) + 1485: 103(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1483 1484 + 1486: 40(ptr) AccessChain 31(data) 1480 33 + 1487: 17(ivec4) Load 1486 + 1488: 17(ivec4) VectorShuffle 1487 1485 4 5 6 3 + Store 1486 1488 + 1489: 6(int) Load 8(invocation) + 1490: 40(ptr) AccessChain 31(data) 115 33 + 1491: 17(ivec4) Load 1490 + 1492: 17(ivec4) Load 19(ballot) + 1493: 17(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1491 1492 + 1494: 40(ptr) AccessChain 31(data) 1489 33 + Store 1494 1493 + 1495: 6(int) Load 8(invocation) + 1496: 64(ptr) AccessChain 31(data) 34 63 35 + 1497: 24(int) Load 1496 + 1498: 144(bool) SLessThan 1497 34 + 1499: 17(ivec4) Load 19(ballot) + 1500: 144(bool) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1498 1499 + 1501: 24(int) Select 1500 63 34 + 1502: 64(ptr) AccessChain 31(data) 1495 63 35 + Store 1502 1501 + 1503: 6(int) Load 8(invocation) + 1504: 71(ptr) AccessChain 31(data) 63 63 + 1505: 25(ivec4) Load 1504 + 1506: 70(ivec2) VectorShuffle 1505 1505 0 1 + 1507: 152(bvec2) SLessThan 1506 727 + 1508: 17(ivec4) Load 19(ballot) + 1509: 152(bvec2) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1507 1508 + 1510: 70(ivec2) Select 1509 731 727 + 1511: 71(ptr) AccessChain 31(data) 1503 63 + 1512: 25(ivec4) Load 1511 + 1513: 25(ivec4) VectorShuffle 1512 1510 4 5 2 3 + Store 1511 1513 + 1514: 6(int) Load 8(invocation) + 1515: 71(ptr) AccessChain 31(data) 63 63 + 1516: 25(ivec4) Load 1515 + 1517: 78(ivec3) VectorShuffle 1516 1516 0 1 2 + 1518: 161(bvec3) SLessThan 1517 740 + 1519: 17(ivec4) Load 19(ballot) + 1520: 161(bvec3) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1518 1519 + 1521: 78(ivec3) Select 1520 744 740 + 1522: 71(ptr) AccessChain 31(data) 1514 63 + 1523: 25(ivec4) Load 1522 + 1524: 25(ivec4) VectorShuffle 1523 1521 4 5 6 3 + Store 1522 1524 + 1525: 6(int) Load 8(invocation) + 1526: 71(ptr) AccessChain 31(data) 63 63 + 1527: 25(ivec4) Load 1526 + 1528: 169(bvec4) SLessThan 1527 752 + 1529: 17(ivec4) Load 19(ballot) + 1530: 169(bvec4) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1528 1529 + 1531: 25(ivec4) Select 1530 756 752 + 1532: 71(ptr) AccessChain 31(data) 1525 63 + Store 1532 1531 + 1533: 6(int) Load 8(invocation) + 1534: 64(ptr) AccessChain 31(data) 34 63 35 + 1535: 24(int) Load 1534 + 1536: 17(ivec4) Load 19(ballot) + 1537: 24(int) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1535 1536 + 1538: 64(ptr) AccessChain 31(data) 1533 63 35 + Store 1538 1537 + 1539: 6(int) Load 8(invocation) + 1540: 71(ptr) AccessChain 31(data) 63 63 + 1541: 25(ivec4) Load 1540 + 1542: 70(ivec2) VectorShuffle 1541 1541 0 1 + 1543: 17(ivec4) Load 19(ballot) + 1544: 70(ivec2) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1542 1543 + 1545: 71(ptr) AccessChain 31(data) 1539 63 + 1546: 25(ivec4) Load 1545 + 1547: 25(ivec4) VectorShuffle 1546 1544 4 5 2 3 + Store 1545 1547 + 1548: 6(int) Load 8(invocation) + 1549: 71(ptr) AccessChain 31(data) 33 63 + 1550: 25(ivec4) Load 1549 + 1551: 78(ivec3) VectorShuffle 1550 1550 0 1 2 + 1552: 17(ivec4) Load 19(ballot) + 1553: 78(ivec3) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1551 1552 + 1554: 71(ptr) AccessChain 31(data) 1548 63 + 1555: 25(ivec4) Load 1554 + 1556: 25(ivec4) VectorShuffle 1555 1553 4 5 6 3 + Store 1554 1556 + 1557: 6(int) Load 8(invocation) + 1558: 71(ptr) AccessChain 31(data) 115 63 + 1559: 25(ivec4) Load 1558 + 1560: 17(ivec4) Load 19(ballot) + 1561: 25(ivec4) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1559 1560 + 1562: 71(ptr) AccessChain 31(data) 1557 63 + Store 1562 1561 + 1563: 6(int) Load 8(invocation) + 1564: 90(ptr) AccessChain 31(data) 34 33 35 + 1565: 6(int) Load 1564 + 1566: 17(ivec4) Load 19(ballot) + 1567: 6(int) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1565 1566 + 1568: 90(ptr) AccessChain 31(data) 1563 33 35 + Store 1568 1567 + 1569: 6(int) Load 8(invocation) + 1570: 40(ptr) AccessChain 31(data) 63 33 + 1571: 17(ivec4) Load 1570 + 1572: 96(ivec2) VectorShuffle 1571 1571 0 1 + 1573: 17(ivec4) Load 19(ballot) + 1574: 96(ivec2) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1572 1573 + 1575: 40(ptr) AccessChain 31(data) 1569 33 + 1576: 17(ivec4) Load 1575 + 1577: 17(ivec4) VectorShuffle 1576 1574 4 5 2 3 + Store 1575 1577 + 1578: 6(int) Load 8(invocation) + 1579: 40(ptr) AccessChain 31(data) 33 33 + 1580: 17(ivec4) Load 1579 + 1581: 103(ivec3) VectorShuffle 1580 1580 0 1 2 + 1582: 17(ivec4) Load 19(ballot) + 1583: 103(ivec3) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1581 1582 + 1584: 40(ptr) AccessChain 31(data) 1578 33 + 1585: 17(ivec4) Load 1584 + 1586: 17(ivec4) VectorShuffle 1585 1583 4 5 6 3 + Store 1584 1586 + 1587: 6(int) Load 8(invocation) + 1588: 40(ptr) AccessChain 31(data) 115 33 + 1589: 17(ivec4) Load 1588 + 1590: 17(ivec4) Load 19(ballot) + 1591: 17(ivec4) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1589 1590 + 1592: 40(ptr) AccessChain 31(data) 1587 33 + Store 1592 1591 + 1593: 6(int) Load 8(invocation) + 1594: 64(ptr) AccessChain 31(data) 34 63 35 + 1595: 24(int) Load 1594 + 1596: 144(bool) SLessThan 1595 34 + 1597: 17(ivec4) Load 19(ballot) + 1598: 144(bool) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1596 1597 + 1599: 24(int) Select 1598 63 34 + 1600: 64(ptr) AccessChain 31(data) 1593 63 35 + Store 1600 1599 + 1601: 6(int) Load 8(invocation) + 1602: 71(ptr) AccessChain 31(data) 63 63 + 1603: 25(ivec4) Load 1602 + 1604: 70(ivec2) VectorShuffle 1603 1603 0 1 + 1605: 152(bvec2) SLessThan 1604 727 + 1606: 17(ivec4) Load 19(ballot) + 1607: 152(bvec2) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1605 1606 + 1608: 70(ivec2) Select 1607 731 727 + 1609: 71(ptr) AccessChain 31(data) 1601 63 + 1610: 25(ivec4) Load 1609 + 1611: 25(ivec4) VectorShuffle 1610 1608 4 5 2 3 + Store 1609 1611 + 1612: 6(int) Load 8(invocation) + 1613: 71(ptr) AccessChain 31(data) 63 63 + 1614: 25(ivec4) Load 1613 + 1615: 78(ivec3) VectorShuffle 1614 1614 0 1 2 + 1616: 161(bvec3) SLessThan 1615 740 + 1617: 17(ivec4) Load 19(ballot) + 1618: 161(bvec3) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1616 1617 + 1619: 78(ivec3) Select 1618 744 740 + 1620: 71(ptr) AccessChain 31(data) 1612 63 + 1621: 25(ivec4) Load 1620 + 1622: 25(ivec4) VectorShuffle 1621 1619 4 5 6 3 + Store 1620 1622 + 1623: 6(int) Load 8(invocation) + 1624: 71(ptr) AccessChain 31(data) 63 63 + 1625: 25(ivec4) Load 1624 + 1626: 169(bvec4) SLessThan 1625 752 + 1627: 17(ivec4) Load 19(ballot) + 1628: 169(bvec4) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1626 1627 + 1629: 25(ivec4) Select 1628 756 752 + 1630: 71(ptr) AccessChain 31(data) 1623 63 + Store 1630 1629 + 1631: 6(int) Load 8(invocation) + 1632: 64(ptr) AccessChain 31(data) 34 63 35 + 1633: 24(int) Load 1632 + 1634: 17(ivec4) Load 19(ballot) + 1635: 24(int) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1633 1634 + 1636: 64(ptr) AccessChain 31(data) 1631 63 35 + Store 1636 1635 + 1637: 6(int) Load 8(invocation) + 1638: 71(ptr) AccessChain 31(data) 63 63 + 1639: 25(ivec4) Load 1638 + 1640: 70(ivec2) VectorShuffle 1639 1639 0 1 + 1641: 17(ivec4) Load 19(ballot) + 1642: 70(ivec2) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1640 1641 + 1643: 71(ptr) AccessChain 31(data) 1637 63 + 1644: 25(ivec4) Load 1643 + 1645: 25(ivec4) VectorShuffle 1644 1642 4 5 2 3 + Store 1643 1645 + 1646: 6(int) Load 8(invocation) + 1647: 71(ptr) AccessChain 31(data) 33 63 + 1648: 25(ivec4) Load 1647 + 1649: 78(ivec3) VectorShuffle 1648 1648 0 1 2 + 1650: 17(ivec4) Load 19(ballot) + 1651: 78(ivec3) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1649 1650 + 1652: 71(ptr) AccessChain 31(data) 1646 63 + 1653: 25(ivec4) Load 1652 + 1654: 25(ivec4) VectorShuffle 1653 1651 4 5 6 3 + Store 1652 1654 + 1655: 6(int) Load 8(invocation) + 1656: 71(ptr) AccessChain 31(data) 115 63 + 1657: 25(ivec4) Load 1656 + 1658: 17(ivec4) Load 19(ballot) + 1659: 25(ivec4) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1657 1658 + 1660: 71(ptr) AccessChain 31(data) 1655 63 + Store 1660 1659 + 1661: 6(int) Load 8(invocation) + 1662: 90(ptr) AccessChain 31(data) 34 33 35 + 1663: 6(int) Load 1662 + 1664: 17(ivec4) Load 19(ballot) + 1665: 6(int) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1663 1664 + 1666: 90(ptr) AccessChain 31(data) 1661 33 35 + Store 1666 1665 + 1667: 6(int) Load 8(invocation) + 1668: 40(ptr) AccessChain 31(data) 63 33 + 1669: 17(ivec4) Load 1668 + 1670: 96(ivec2) VectorShuffle 1669 1669 0 1 + 1671: 17(ivec4) Load 19(ballot) + 1672: 96(ivec2) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1670 1671 + 1673: 40(ptr) AccessChain 31(data) 1667 33 + 1674: 17(ivec4) Load 1673 + 1675: 17(ivec4) VectorShuffle 1674 1672 4 5 2 3 + Store 1673 1675 + 1676: 6(int) Load 8(invocation) + 1677: 40(ptr) AccessChain 31(data) 33 33 + 1678: 17(ivec4) Load 1677 + 1679: 103(ivec3) VectorShuffle 1678 1678 0 1 2 + 1680: 17(ivec4) Load 19(ballot) + 1681: 103(ivec3) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1679 1680 + 1682: 40(ptr) AccessChain 31(data) 1676 33 + 1683: 17(ivec4) Load 1682 + 1684: 17(ivec4) VectorShuffle 1683 1681 4 5 6 3 + Store 1682 1684 + 1685: 6(int) Load 8(invocation) + 1686: 40(ptr) AccessChain 31(data) 115 33 + 1687: 17(ivec4) Load 1686 + 1688: 17(ivec4) Load 19(ballot) + 1689: 17(ivec4) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1687 1688 + 1690: 40(ptr) AccessChain 31(data) 1685 33 + Store 1690 1689 + 1691: 6(int) Load 8(invocation) + 1692: 64(ptr) AccessChain 31(data) 34 63 35 + 1693: 24(int) Load 1692 + 1694: 144(bool) SLessThan 1693 34 + 1695: 17(ivec4) Load 19(ballot) + 1696: 144(bool) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1694 1695 + 1697: 24(int) Select 1696 63 34 + 1698: 64(ptr) AccessChain 31(data) 1691 63 35 + Store 1698 1697 + 1699: 6(int) Load 8(invocation) + 1700: 71(ptr) AccessChain 31(data) 63 63 + 1701: 25(ivec4) Load 1700 + 1702: 70(ivec2) VectorShuffle 1701 1701 0 1 + 1703: 152(bvec2) SLessThan 1702 727 + 1704: 17(ivec4) Load 19(ballot) + 1705: 152(bvec2) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1703 1704 + 1706: 70(ivec2) Select 1705 731 727 + 1707: 71(ptr) AccessChain 31(data) 1699 63 + 1708: 25(ivec4) Load 1707 + 1709: 25(ivec4) VectorShuffle 1708 1706 4 5 2 3 + Store 1707 1709 + 1710: 6(int) Load 8(invocation) + 1711: 71(ptr) AccessChain 31(data) 63 63 + 1712: 25(ivec4) Load 1711 + 1713: 78(ivec3) VectorShuffle 1712 1712 0 1 2 + 1714: 161(bvec3) SLessThan 1713 740 + 1715: 17(ivec4) Load 19(ballot) + 1716: 161(bvec3) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1714 1715 + 1717: 78(ivec3) Select 1716 744 740 + 1718: 71(ptr) AccessChain 31(data) 1710 63 + 1719: 25(ivec4) Load 1718 + 1720: 25(ivec4) VectorShuffle 1719 1717 4 5 6 3 + Store 1718 1720 + 1721: 6(int) Load 8(invocation) + 1722: 71(ptr) AccessChain 31(data) 63 63 + 1723: 25(ivec4) Load 1722 + 1724: 169(bvec4) SLessThan 1723 752 + 1725: 17(ivec4) Load 19(ballot) + 1726: 169(bvec4) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1724 1725 + 1727: 25(ivec4) Select 1726 756 752 + 1728: 71(ptr) AccessChain 31(data) 1721 63 + Store 1728 1727 + 1729: 6(int) Load 8(invocation) + 1730: 36(ptr) AccessChain 31(data) 34 34 35 + 1731: 22(float) Load 1730 + 1732: 17(ivec4) Load 19(ballot) + 1733: 22(float) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1731 1732 + 1734: 36(ptr) AccessChain 31(data) 1729 34 35 + Store 1734 1733 + 1735: 6(int) Load 8(invocation) + 1736: 44(ptr) AccessChain 31(data) 63 34 + 1737: 23(fvec4) Load 1736 + 1738: 43(fvec2) VectorShuffle 1737 1737 0 1 + 1739: 17(ivec4) Load 19(ballot) + 1740: 43(fvec2) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1738 1739 + 1741: 44(ptr) AccessChain 31(data) 1735 34 + 1742: 23(fvec4) Load 1741 + 1743: 23(fvec4) VectorShuffle 1742 1740 4 5 2 3 + Store 1741 1743 + 1744: 6(int) Load 8(invocation) + 1745: 44(ptr) AccessChain 31(data) 33 34 + 1746: 23(fvec4) Load 1745 + 1747: 51(fvec3) VectorShuffle 1746 1746 0 1 2 + 1748: 17(ivec4) Load 19(ballot) + 1749: 51(fvec3) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1747 1748 + 1750: 44(ptr) AccessChain 31(data) 1744 34 + 1751: 23(fvec4) Load 1750 + 1752: 23(fvec4) VectorShuffle 1751 1749 4 5 6 3 + Store 1750 1752 + 1753: 6(int) Load 8(invocation) + 1754: 44(ptr) AccessChain 31(data) 115 34 + 1755: 23(fvec4) Load 1754 + 1756: 17(ivec4) Load 19(ballot) + 1757: 23(fvec4) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1755 1756 + 1758: 44(ptr) AccessChain 31(data) 1753 34 + Store 1758 1757 + 1759: 6(int) Load 8(invocation) + 1760: 64(ptr) AccessChain 31(data) 34 63 35 + 1761: 24(int) Load 1760 + 1762: 17(ivec4) Load 19(ballot) + 1763: 24(int) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1761 1762 + 1764: 64(ptr) AccessChain 31(data) 1759 63 35 + Store 1764 1763 + 1765: 6(int) Load 8(invocation) + 1766: 71(ptr) AccessChain 31(data) 63 63 + 1767: 25(ivec4) Load 1766 + 1768: 70(ivec2) VectorShuffle 1767 1767 0 1 + 1769: 17(ivec4) Load 19(ballot) + 1770: 70(ivec2) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1768 1769 + 1771: 71(ptr) AccessChain 31(data) 1765 63 + 1772: 25(ivec4) Load 1771 + 1773: 25(ivec4) VectorShuffle 1772 1770 4 5 2 3 + Store 1771 1773 + 1774: 6(int) Load 8(invocation) + 1775: 71(ptr) AccessChain 31(data) 33 63 + 1776: 25(ivec4) Load 1775 + 1777: 78(ivec3) VectorShuffle 1776 1776 0 1 2 + 1778: 17(ivec4) Load 19(ballot) + 1779: 78(ivec3) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1777 1778 + 1780: 71(ptr) AccessChain 31(data) 1774 63 + 1781: 25(ivec4) Load 1780 + 1782: 25(ivec4) VectorShuffle 1781 1779 4 5 6 3 + Store 1780 1782 + 1783: 6(int) Load 8(invocation) + 1784: 71(ptr) AccessChain 31(data) 115 63 + 1785: 25(ivec4) Load 1784 + 1786: 17(ivec4) Load 19(ballot) + 1787: 25(ivec4) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1785 1786 + 1788: 71(ptr) AccessChain 31(data) 1783 63 + Store 1788 1787 + 1789: 6(int) Load 8(invocation) + 1790: 90(ptr) AccessChain 31(data) 34 33 35 + 1791: 6(int) Load 1790 + 1792: 17(ivec4) Load 19(ballot) + 1793: 6(int) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1791 1792 + 1794: 90(ptr) AccessChain 31(data) 1789 33 35 + Store 1794 1793 + 1795: 6(int) Load 8(invocation) + 1796: 40(ptr) AccessChain 31(data) 63 33 + 1797: 17(ivec4) Load 1796 + 1798: 96(ivec2) VectorShuffle 1797 1797 0 1 + 1799: 17(ivec4) Load 19(ballot) + 1800: 96(ivec2) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1798 1799 + 1801: 40(ptr) AccessChain 31(data) 1795 33 + 1802: 17(ivec4) Load 1801 + 1803: 17(ivec4) VectorShuffle 1802 1800 4 5 2 3 + Store 1801 1803 + 1804: 6(int) Load 8(invocation) + 1805: 40(ptr) AccessChain 31(data) 33 33 + 1806: 17(ivec4) Load 1805 + 1807: 103(ivec3) VectorShuffle 1806 1806 0 1 2 + 1808: 17(ivec4) Load 19(ballot) + 1809: 103(ivec3) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1807 1808 + 1810: 40(ptr) AccessChain 31(data) 1804 33 + 1811: 17(ivec4) Load 1810 + 1812: 17(ivec4) VectorShuffle 1811 1809 4 5 6 3 + Store 1810 1812 + 1813: 6(int) Load 8(invocation) + 1814: 40(ptr) AccessChain 31(data) 115 33 + 1815: 17(ivec4) Load 1814 + 1816: 17(ivec4) Load 19(ballot) + 1817: 17(ivec4) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1815 1816 + 1818: 40(ptr) AccessChain 31(data) 1813 33 + Store 1818 1817 + 1819: 6(int) Load 8(invocation) + 1820: 116(ptr) AccessChain 31(data) 34 115 35 + 1821: 26(float) Load 1820 + 1822: 17(ivec4) Load 19(ballot) + 1823: 26(float) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1821 1822 + 1824: 116(ptr) AccessChain 31(data) 1819 115 35 + Store 1824 1823 + 1825: 6(int) Load 8(invocation) + 1826: 123(ptr) AccessChain 31(data) 63 115 + 1827: 27(fvec4) Load 1826 + 1828: 122(fvec2) VectorShuffle 1827 1827 0 1 + 1829: 17(ivec4) Load 19(ballot) + 1830: 122(fvec2) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1828 1829 + 1831: 123(ptr) AccessChain 31(data) 1825 115 + 1832: 27(fvec4) Load 1831 + 1833: 27(fvec4) VectorShuffle 1832 1830 4 5 2 3 + Store 1831 1833 + 1834: 6(int) Load 8(invocation) + 1835: 123(ptr) AccessChain 31(data) 33 115 + 1836: 27(fvec4) Load 1835 + 1837: 130(fvec3) VectorShuffle 1836 1836 0 1 2 + 1838: 17(ivec4) Load 19(ballot) + 1839: 130(fvec3) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1837 1838 + 1840: 123(ptr) AccessChain 31(data) 1834 115 + 1841: 27(fvec4) Load 1840 + 1842: 27(fvec4) VectorShuffle 1841 1839 4 5 6 3 + Store 1840 1842 + 1843: 6(int) Load 8(invocation) + 1844: 123(ptr) AccessChain 31(data) 115 115 + 1845: 27(fvec4) Load 1844 + 1846: 17(ivec4) Load 19(ballot) + 1847: 27(fvec4) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1845 1846 + 1848: 123(ptr) AccessChain 31(data) 1843 115 + Store 1848 1847 + 1849: 6(int) Load 8(invocation) + 1850: 36(ptr) AccessChain 31(data) 34 34 35 + 1851: 22(float) Load 1850 + 1852: 17(ivec4) Load 19(ballot) + 1853: 22(float) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1851 1852 + 1854: 36(ptr) AccessChain 31(data) 1849 34 35 + Store 1854 1853 + 1855: 6(int) Load 8(invocation) + 1856: 44(ptr) AccessChain 31(data) 63 34 + 1857: 23(fvec4) Load 1856 + 1858: 43(fvec2) VectorShuffle 1857 1857 0 1 + 1859: 17(ivec4) Load 19(ballot) + 1860: 43(fvec2) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1858 1859 + 1861: 44(ptr) AccessChain 31(data) 1855 34 + 1862: 23(fvec4) Load 1861 + 1863: 23(fvec4) VectorShuffle 1862 1860 4 5 2 3 + Store 1861 1863 + 1864: 6(int) Load 8(invocation) + 1865: 44(ptr) AccessChain 31(data) 33 34 + 1866: 23(fvec4) Load 1865 + 1867: 51(fvec3) VectorShuffle 1866 1866 0 1 2 + 1868: 17(ivec4) Load 19(ballot) + 1869: 51(fvec3) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1867 1868 + 1870: 44(ptr) AccessChain 31(data) 1864 34 + 1871: 23(fvec4) Load 1870 + 1872: 23(fvec4) VectorShuffle 1871 1869 4 5 6 3 + Store 1870 1872 + 1873: 6(int) Load 8(invocation) + 1874: 44(ptr) AccessChain 31(data) 115 34 + 1875: 23(fvec4) Load 1874 + 1876: 17(ivec4) Load 19(ballot) + 1877: 23(fvec4) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1875 1876 + 1878: 44(ptr) AccessChain 31(data) 1873 34 + Store 1878 1877 + 1879: 6(int) Load 8(invocation) + 1880: 64(ptr) AccessChain 31(data) 34 63 35 + 1881: 24(int) Load 1880 + 1882: 17(ivec4) Load 19(ballot) + 1883: 24(int) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1881 1882 + 1884: 64(ptr) AccessChain 31(data) 1879 63 35 + Store 1884 1883 + 1885: 6(int) Load 8(invocation) + 1886: 71(ptr) AccessChain 31(data) 63 63 + 1887: 25(ivec4) Load 1886 + 1888: 70(ivec2) VectorShuffle 1887 1887 0 1 + 1889: 17(ivec4) Load 19(ballot) + 1890: 70(ivec2) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1888 1889 + 1891: 71(ptr) AccessChain 31(data) 1885 63 + 1892: 25(ivec4) Load 1891 + 1893: 25(ivec4) VectorShuffle 1892 1890 4 5 2 3 + Store 1891 1893 + 1894: 6(int) Load 8(invocation) + 1895: 71(ptr) AccessChain 31(data) 33 63 + 1896: 25(ivec4) Load 1895 + 1897: 78(ivec3) VectorShuffle 1896 1896 0 1 2 + 1898: 17(ivec4) Load 19(ballot) + 1899: 78(ivec3) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1897 1898 + 1900: 71(ptr) AccessChain 31(data) 1894 63 + 1901: 25(ivec4) Load 1900 + 1902: 25(ivec4) VectorShuffle 1901 1899 4 5 6 3 + Store 1900 1902 + 1903: 6(int) Load 8(invocation) + 1904: 71(ptr) AccessChain 31(data) 115 63 + 1905: 25(ivec4) Load 1904 + 1906: 17(ivec4) Load 19(ballot) + 1907: 25(ivec4) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1905 1906 + 1908: 71(ptr) AccessChain 31(data) 1903 63 + Store 1908 1907 + 1909: 6(int) Load 8(invocation) + 1910: 90(ptr) AccessChain 31(data) 34 33 35 + 1911: 6(int) Load 1910 + 1912: 17(ivec4) Load 19(ballot) + 1913: 6(int) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1911 1912 + 1914: 90(ptr) AccessChain 31(data) 1909 33 35 + Store 1914 1913 + 1915: 6(int) Load 8(invocation) + 1916: 40(ptr) AccessChain 31(data) 63 33 + 1917: 17(ivec4) Load 1916 + 1918: 96(ivec2) VectorShuffle 1917 1917 0 1 + 1919: 17(ivec4) Load 19(ballot) + 1920: 96(ivec2) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1918 1919 + 1921: 40(ptr) AccessChain 31(data) 1915 33 + 1922: 17(ivec4) Load 1921 + 1923: 17(ivec4) VectorShuffle 1922 1920 4 5 2 3 + Store 1921 1923 + 1924: 6(int) Load 8(invocation) + 1925: 40(ptr) AccessChain 31(data) 33 33 + 1926: 17(ivec4) Load 1925 + 1927: 103(ivec3) VectorShuffle 1926 1926 0 1 2 + 1928: 17(ivec4) Load 19(ballot) + 1929: 103(ivec3) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1927 1928 + 1930: 40(ptr) AccessChain 31(data) 1924 33 + 1931: 17(ivec4) Load 1930 + 1932: 17(ivec4) VectorShuffle 1931 1929 4 5 6 3 + Store 1930 1932 + 1933: 6(int) Load 8(invocation) + 1934: 40(ptr) AccessChain 31(data) 115 33 + 1935: 17(ivec4) Load 1934 + 1936: 17(ivec4) Load 19(ballot) + 1937: 17(ivec4) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1935 1936 + 1938: 40(ptr) AccessChain 31(data) 1933 33 + Store 1938 1937 + 1939: 6(int) Load 8(invocation) + 1940: 116(ptr) AccessChain 31(data) 34 115 35 + 1941: 26(float) Load 1940 + 1942: 17(ivec4) Load 19(ballot) + 1943: 26(float) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1941 1942 + 1944: 116(ptr) AccessChain 31(data) 1939 115 35 + Store 1944 1943 + 1945: 6(int) Load 8(invocation) + 1946: 123(ptr) AccessChain 31(data) 63 115 + 1947: 27(fvec4) Load 1946 + 1948: 122(fvec2) VectorShuffle 1947 1947 0 1 + 1949: 17(ivec4) Load 19(ballot) + 1950: 122(fvec2) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1948 1949 + 1951: 123(ptr) AccessChain 31(data) 1945 115 + 1952: 27(fvec4) Load 1951 + 1953: 27(fvec4) VectorShuffle 1952 1950 4 5 2 3 + Store 1951 1953 + 1954: 6(int) Load 8(invocation) + 1955: 123(ptr) AccessChain 31(data) 33 115 + 1956: 27(fvec4) Load 1955 + 1957: 130(fvec3) VectorShuffle 1956 1956 0 1 2 + 1958: 17(ivec4) Load 19(ballot) + 1959: 130(fvec3) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1957 1958 + 1960: 123(ptr) AccessChain 31(data) 1954 115 + 1961: 27(fvec4) Load 1960 + 1962: 27(fvec4) VectorShuffle 1961 1959 4 5 6 3 + Store 1960 1962 + 1963: 6(int) Load 8(invocation) + 1964: 123(ptr) AccessChain 31(data) 115 115 + 1965: 27(fvec4) Load 1964 + 1966: 17(ivec4) Load 19(ballot) + 1967: 27(fvec4) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1965 1966 + 1968: 123(ptr) AccessChain 31(data) 1963 115 + Store 1968 1967 + 1969: 6(int) Load 8(invocation) + 1970: 36(ptr) AccessChain 31(data) 34 34 35 + 1971: 22(float) Load 1970 + 1972: 17(ivec4) Load 19(ballot) + 1973: 22(float) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 1971 1972 + 1974: 36(ptr) AccessChain 31(data) 1969 34 35 + Store 1974 1973 + 1975: 6(int) Load 8(invocation) + 1976: 44(ptr) AccessChain 31(data) 63 34 + 1977: 23(fvec4) Load 1976 + 1978: 43(fvec2) VectorShuffle 1977 1977 0 1 + 1979: 17(ivec4) Load 19(ballot) + 1980: 43(fvec2) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 1978 1979 + 1981: 44(ptr) AccessChain 31(data) 1975 34 + 1982: 23(fvec4) Load 1981 + 1983: 23(fvec4) VectorShuffle 1982 1980 4 5 2 3 + Store 1981 1983 + 1984: 6(int) Load 8(invocation) + 1985: 44(ptr) AccessChain 31(data) 33 34 + 1986: 23(fvec4) Load 1985 + 1987: 51(fvec3) VectorShuffle 1986 1986 0 1 2 + 1988: 17(ivec4) Load 19(ballot) + 1989: 51(fvec3) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 1987 1988 + 1990: 44(ptr) AccessChain 31(data) 1984 34 + 1991: 23(fvec4) Load 1990 + 1992: 23(fvec4) VectorShuffle 1991 1989 4 5 6 3 + Store 1990 1992 + 1993: 6(int) Load 8(invocation) + 1994: 44(ptr) AccessChain 31(data) 115 34 + 1995: 23(fvec4) Load 1994 + 1996: 17(ivec4) Load 19(ballot) + 1997: 23(fvec4) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 1995 1996 + 1998: 44(ptr) AccessChain 31(data) 1993 34 + Store 1998 1997 + 1999: 6(int) Load 8(invocation) + 2000: 64(ptr) AccessChain 31(data) 34 63 35 + 2001: 24(int) Load 2000 + 2002: 17(ivec4) Load 19(ballot) + 2003: 24(int) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2001 2002 + 2004: 64(ptr) AccessChain 31(data) 1999 63 35 + Store 2004 2003 + 2005: 6(int) Load 8(invocation) + 2006: 71(ptr) AccessChain 31(data) 63 63 + 2007: 25(ivec4) Load 2006 + 2008: 70(ivec2) VectorShuffle 2007 2007 0 1 + 2009: 17(ivec4) Load 19(ballot) + 2010: 70(ivec2) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2008 2009 + 2011: 71(ptr) AccessChain 31(data) 2005 63 + 2012: 25(ivec4) Load 2011 + 2013: 25(ivec4) VectorShuffle 2012 2010 4 5 2 3 + Store 2011 2013 + 2014: 6(int) Load 8(invocation) + 2015: 71(ptr) AccessChain 31(data) 33 63 + 2016: 25(ivec4) Load 2015 + 2017: 78(ivec3) VectorShuffle 2016 2016 0 1 2 + 2018: 17(ivec4) Load 19(ballot) + 2019: 78(ivec3) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2017 2018 + 2020: 71(ptr) AccessChain 31(data) 2014 63 + 2021: 25(ivec4) Load 2020 + 2022: 25(ivec4) VectorShuffle 2021 2019 4 5 6 3 + Store 2020 2022 + 2023: 6(int) Load 8(invocation) + 2024: 71(ptr) AccessChain 31(data) 115 63 + 2025: 25(ivec4) Load 2024 + 2026: 17(ivec4) Load 19(ballot) + 2027: 25(ivec4) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2025 2026 + 2028: 71(ptr) AccessChain 31(data) 2023 63 + Store 2028 2027 + 2029: 6(int) Load 8(invocation) + 2030: 90(ptr) AccessChain 31(data) 34 33 35 + 2031: 6(int) Load 2030 + 2032: 17(ivec4) Load 19(ballot) + 2033: 6(int) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2031 2032 + 2034: 90(ptr) AccessChain 31(data) 2029 33 35 + Store 2034 2033 + 2035: 6(int) Load 8(invocation) + 2036: 40(ptr) AccessChain 31(data) 63 33 + 2037: 17(ivec4) Load 2036 + 2038: 96(ivec2) VectorShuffle 2037 2037 0 1 + 2039: 17(ivec4) Load 19(ballot) + 2040: 96(ivec2) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2038 2039 + 2041: 40(ptr) AccessChain 31(data) 2035 33 + 2042: 17(ivec4) Load 2041 + 2043: 17(ivec4) VectorShuffle 2042 2040 4 5 2 3 + Store 2041 2043 + 2044: 6(int) Load 8(invocation) + 2045: 40(ptr) AccessChain 31(data) 33 33 + 2046: 17(ivec4) Load 2045 + 2047: 103(ivec3) VectorShuffle 2046 2046 0 1 2 + 2048: 17(ivec4) Load 19(ballot) + 2049: 103(ivec3) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2047 2048 + 2050: 40(ptr) AccessChain 31(data) 2044 33 + 2051: 17(ivec4) Load 2050 + 2052: 17(ivec4) VectorShuffle 2051 2049 4 5 6 3 + Store 2050 2052 + 2053: 6(int) Load 8(invocation) + 2054: 40(ptr) AccessChain 31(data) 115 33 + 2055: 17(ivec4) Load 2054 + 2056: 17(ivec4) Load 19(ballot) + 2057: 17(ivec4) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2055 2056 + 2058: 40(ptr) AccessChain 31(data) 2053 33 + Store 2058 2057 + 2059: 6(int) Load 8(invocation) + 2060: 116(ptr) AccessChain 31(data) 34 115 35 + 2061: 26(float) Load 2060 + 2062: 17(ivec4) Load 19(ballot) + 2063: 26(float) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2061 2062 + 2064: 116(ptr) AccessChain 31(data) 2059 115 35 + Store 2064 2063 + 2065: 6(int) Load 8(invocation) + 2066: 123(ptr) AccessChain 31(data) 63 115 + 2067: 27(fvec4) Load 2066 + 2068: 122(fvec2) VectorShuffle 2067 2067 0 1 + 2069: 17(ivec4) Load 19(ballot) + 2070: 122(fvec2) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2068 2069 + 2071: 123(ptr) AccessChain 31(data) 2065 115 + 2072: 27(fvec4) Load 2071 + 2073: 27(fvec4) VectorShuffle 2072 2070 4 5 2 3 + Store 2071 2073 + 2074: 6(int) Load 8(invocation) + 2075: 123(ptr) AccessChain 31(data) 33 115 + 2076: 27(fvec4) Load 2075 + 2077: 130(fvec3) VectorShuffle 2076 2076 0 1 2 + 2078: 17(ivec4) Load 19(ballot) + 2079: 130(fvec3) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2077 2078 + 2080: 123(ptr) AccessChain 31(data) 2074 115 + 2081: 27(fvec4) Load 2080 + 2082: 27(fvec4) VectorShuffle 2081 2079 4 5 6 3 + Store 2080 2082 + 2083: 6(int) Load 8(invocation) + 2084: 123(ptr) AccessChain 31(data) 115 115 + 2085: 27(fvec4) Load 2084 + 2086: 17(ivec4) Load 19(ballot) + 2087: 27(fvec4) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2085 2086 + 2088: 123(ptr) AccessChain 31(data) 2083 115 + Store 2088 2087 + 2089: 6(int) Load 8(invocation) + 2090: 36(ptr) AccessChain 31(data) 34 34 35 + 2091: 22(float) Load 2090 + 2092: 17(ivec4) Load 19(ballot) + 2093: 22(float) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2091 2092 + 2094: 36(ptr) AccessChain 31(data) 2089 34 35 + Store 2094 2093 + 2095: 6(int) Load 8(invocation) + 2096: 44(ptr) AccessChain 31(data) 63 34 + 2097: 23(fvec4) Load 2096 + 2098: 43(fvec2) VectorShuffle 2097 2097 0 1 + 2099: 17(ivec4) Load 19(ballot) + 2100: 43(fvec2) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2098 2099 + 2101: 44(ptr) AccessChain 31(data) 2095 34 + 2102: 23(fvec4) Load 2101 + 2103: 23(fvec4) VectorShuffle 2102 2100 4 5 2 3 + Store 2101 2103 + 2104: 6(int) Load 8(invocation) + 2105: 44(ptr) AccessChain 31(data) 33 34 + 2106: 23(fvec4) Load 2105 + 2107: 51(fvec3) VectorShuffle 2106 2106 0 1 2 + 2108: 17(ivec4) Load 19(ballot) + 2109: 51(fvec3) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2107 2108 + 2110: 44(ptr) AccessChain 31(data) 2104 34 + 2111: 23(fvec4) Load 2110 + 2112: 23(fvec4) VectorShuffle 2111 2109 4 5 6 3 + Store 2110 2112 + 2113: 6(int) Load 8(invocation) + 2114: 44(ptr) AccessChain 31(data) 115 34 + 2115: 23(fvec4) Load 2114 + 2116: 17(ivec4) Load 19(ballot) + 2117: 23(fvec4) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2115 2116 + 2118: 44(ptr) AccessChain 31(data) 2113 34 + Store 2118 2117 + 2119: 6(int) Load 8(invocation) + 2120: 64(ptr) AccessChain 31(data) 34 63 35 + 2121: 24(int) Load 2120 + 2122: 17(ivec4) Load 19(ballot) + 2123: 24(int) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2121 2122 + 2124: 64(ptr) AccessChain 31(data) 2119 63 35 + Store 2124 2123 + 2125: 6(int) Load 8(invocation) + 2126: 71(ptr) AccessChain 31(data) 63 63 + 2127: 25(ivec4) Load 2126 + 2128: 70(ivec2) VectorShuffle 2127 2127 0 1 + 2129: 17(ivec4) Load 19(ballot) + 2130: 70(ivec2) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2128 2129 + 2131: 71(ptr) AccessChain 31(data) 2125 63 + 2132: 25(ivec4) Load 2131 + 2133: 25(ivec4) VectorShuffle 2132 2130 4 5 2 3 + Store 2131 2133 + 2134: 6(int) Load 8(invocation) + 2135: 71(ptr) AccessChain 31(data) 33 63 + 2136: 25(ivec4) Load 2135 + 2137: 78(ivec3) VectorShuffle 2136 2136 0 1 2 + 2138: 17(ivec4) Load 19(ballot) + 2139: 78(ivec3) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2137 2138 + 2140: 71(ptr) AccessChain 31(data) 2134 63 + 2141: 25(ivec4) Load 2140 + 2142: 25(ivec4) VectorShuffle 2141 2139 4 5 6 3 + Store 2140 2142 + 2143: 6(int) Load 8(invocation) + 2144: 71(ptr) AccessChain 31(data) 115 63 + 2145: 25(ivec4) Load 2144 + 2146: 17(ivec4) Load 19(ballot) + 2147: 25(ivec4) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2145 2146 + 2148: 71(ptr) AccessChain 31(data) 2143 63 + Store 2148 2147 + 2149: 6(int) Load 8(invocation) + 2150: 90(ptr) AccessChain 31(data) 34 33 35 + 2151: 6(int) Load 2150 + 2152: 17(ivec4) Load 19(ballot) + 2153: 6(int) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2151 2152 + 2154: 90(ptr) AccessChain 31(data) 2149 33 35 + Store 2154 2153 + 2155: 6(int) Load 8(invocation) + 2156: 40(ptr) AccessChain 31(data) 63 33 + 2157: 17(ivec4) Load 2156 + 2158: 96(ivec2) VectorShuffle 2157 2157 0 1 + 2159: 17(ivec4) Load 19(ballot) + 2160: 96(ivec2) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2158 2159 + 2161: 40(ptr) AccessChain 31(data) 2155 33 + 2162: 17(ivec4) Load 2161 + 2163: 17(ivec4) VectorShuffle 2162 2160 4 5 2 3 + Store 2161 2163 + 2164: 6(int) Load 8(invocation) + 2165: 40(ptr) AccessChain 31(data) 33 33 + 2166: 17(ivec4) Load 2165 + 2167: 103(ivec3) VectorShuffle 2166 2166 0 1 2 + 2168: 17(ivec4) Load 19(ballot) + 2169: 103(ivec3) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2167 2168 + 2170: 40(ptr) AccessChain 31(data) 2164 33 + 2171: 17(ivec4) Load 2170 + 2172: 17(ivec4) VectorShuffle 2171 2169 4 5 6 3 + Store 2170 2172 + 2173: 6(int) Load 8(invocation) + 2174: 40(ptr) AccessChain 31(data) 115 33 + 2175: 17(ivec4) Load 2174 + 2176: 17(ivec4) Load 19(ballot) + 2177: 17(ivec4) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2175 2176 + 2178: 40(ptr) AccessChain 31(data) 2173 33 + Store 2178 2177 + 2179: 6(int) Load 8(invocation) + 2180: 116(ptr) AccessChain 31(data) 34 115 35 + 2181: 26(float) Load 2180 + 2182: 17(ivec4) Load 19(ballot) + 2183: 26(float) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2181 2182 + 2184: 116(ptr) AccessChain 31(data) 2179 115 35 + Store 2184 2183 + 2185: 6(int) Load 8(invocation) + 2186: 123(ptr) AccessChain 31(data) 63 115 + 2187: 27(fvec4) Load 2186 + 2188: 122(fvec2) VectorShuffle 2187 2187 0 1 + 2189: 17(ivec4) Load 19(ballot) + 2190: 122(fvec2) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2188 2189 + 2191: 123(ptr) AccessChain 31(data) 2185 115 + 2192: 27(fvec4) Load 2191 + 2193: 27(fvec4) VectorShuffle 2192 2190 4 5 2 3 + Store 2191 2193 + 2194: 6(int) Load 8(invocation) + 2195: 123(ptr) AccessChain 31(data) 33 115 + 2196: 27(fvec4) Load 2195 + 2197: 130(fvec3) VectorShuffle 2196 2196 0 1 2 + 2198: 17(ivec4) Load 19(ballot) + 2199: 130(fvec3) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2197 2198 + 2200: 123(ptr) AccessChain 31(data) 2194 115 + 2201: 27(fvec4) Load 2200 + 2202: 27(fvec4) VectorShuffle 2201 2199 4 5 6 3 + Store 2200 2202 + 2203: 6(int) Load 8(invocation) + 2204: 123(ptr) AccessChain 31(data) 115 115 + 2205: 27(fvec4) Load 2204 + 2206: 17(ivec4) Load 19(ballot) + 2207: 27(fvec4) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2205 2206 + 2208: 123(ptr) AccessChain 31(data) 2203 115 + Store 2208 2207 + 2209: 6(int) Load 8(invocation) + 2210: 64(ptr) AccessChain 31(data) 34 63 35 + 2211: 24(int) Load 2210 + 2212: 17(ivec4) Load 19(ballot) + 2213: 24(int) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2211 2212 + 2214: 64(ptr) AccessChain 31(data) 2209 63 35 + Store 2214 2213 + 2215: 6(int) Load 8(invocation) + 2216: 71(ptr) AccessChain 31(data) 63 63 + 2217: 25(ivec4) Load 2216 + 2218: 70(ivec2) VectorShuffle 2217 2217 0 1 + 2219: 17(ivec4) Load 19(ballot) + 2220: 70(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2218 2219 + 2221: 71(ptr) AccessChain 31(data) 2215 63 + 2222: 25(ivec4) Load 2221 + 2223: 25(ivec4) VectorShuffle 2222 2220 4 5 2 3 + Store 2221 2223 + 2224: 6(int) Load 8(invocation) + 2225: 71(ptr) AccessChain 31(data) 33 63 + 2226: 25(ivec4) Load 2225 + 2227: 78(ivec3) VectorShuffle 2226 2226 0 1 2 + 2228: 17(ivec4) Load 19(ballot) + 2229: 78(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2227 2228 + 2230: 71(ptr) AccessChain 31(data) 2224 63 + 2231: 25(ivec4) Load 2230 + 2232: 25(ivec4) VectorShuffle 2231 2229 4 5 6 3 + Store 2230 2232 + 2233: 6(int) Load 8(invocation) + 2234: 71(ptr) AccessChain 31(data) 115 63 + 2235: 25(ivec4) Load 2234 + 2236: 17(ivec4) Load 19(ballot) + 2237: 25(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2235 2236 + 2238: 71(ptr) AccessChain 31(data) 2233 63 + Store 2238 2237 + 2239: 6(int) Load 8(invocation) + 2240: 90(ptr) AccessChain 31(data) 34 33 35 + 2241: 6(int) Load 2240 + 2242: 17(ivec4) Load 19(ballot) + 2243: 6(int) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2241 2242 + 2244: 90(ptr) AccessChain 31(data) 2239 33 35 + Store 2244 2243 + 2245: 6(int) Load 8(invocation) + 2246: 40(ptr) AccessChain 31(data) 63 33 + 2247: 17(ivec4) Load 2246 + 2248: 96(ivec2) VectorShuffle 2247 2247 0 1 + 2249: 17(ivec4) Load 19(ballot) + 2250: 96(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2248 2249 + 2251: 40(ptr) AccessChain 31(data) 2245 33 + 2252: 17(ivec4) Load 2251 + 2253: 17(ivec4) VectorShuffle 2252 2250 4 5 2 3 + Store 2251 2253 + 2254: 6(int) Load 8(invocation) + 2255: 40(ptr) AccessChain 31(data) 33 33 + 2256: 17(ivec4) Load 2255 + 2257: 103(ivec3) VectorShuffle 2256 2256 0 1 2 + 2258: 17(ivec4) Load 19(ballot) + 2259: 103(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2257 2258 + 2260: 40(ptr) AccessChain 31(data) 2254 33 + 2261: 17(ivec4) Load 2260 + 2262: 17(ivec4) VectorShuffle 2261 2259 4 5 6 3 + Store 2260 2262 + 2263: 6(int) Load 8(invocation) + 2264: 40(ptr) AccessChain 31(data) 115 33 + 2265: 17(ivec4) Load 2264 + 2266: 17(ivec4) Load 19(ballot) + 2267: 17(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2265 2266 + 2268: 40(ptr) AccessChain 31(data) 2263 33 + Store 2268 2267 + 2269: 6(int) Load 8(invocation) + 2270: 64(ptr) AccessChain 31(data) 34 63 35 + 2271: 24(int) Load 2270 + 2272: 144(bool) SLessThan 2271 34 + 2273: 17(ivec4) Load 19(ballot) + 2274: 144(bool) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2272 2273 + 2275: 24(int) Select 2274 63 34 + 2276: 64(ptr) AccessChain 31(data) 2269 63 35 + Store 2276 2275 + 2277: 6(int) Load 8(invocation) + 2278: 71(ptr) AccessChain 31(data) 63 63 + 2279: 25(ivec4) Load 2278 + 2280: 70(ivec2) VectorShuffle 2279 2279 0 1 + 2281: 152(bvec2) SLessThan 2280 727 + 2282: 17(ivec4) Load 19(ballot) + 2283: 152(bvec2) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2281 2282 + 2284: 70(ivec2) Select 2283 731 727 + 2285: 71(ptr) AccessChain 31(data) 2277 63 + 2286: 25(ivec4) Load 2285 + 2287: 25(ivec4) VectorShuffle 2286 2284 4 5 2 3 + Store 2285 2287 + 2288: 6(int) Load 8(invocation) + 2289: 71(ptr) AccessChain 31(data) 63 63 + 2290: 25(ivec4) Load 2289 + 2291: 78(ivec3) VectorShuffle 2290 2290 0 1 2 + 2292: 161(bvec3) SLessThan 2291 740 + 2293: 17(ivec4) Load 19(ballot) + 2294: 161(bvec3) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2292 2293 + 2295: 78(ivec3) Select 2294 744 740 + 2296: 71(ptr) AccessChain 31(data) 2288 63 + 2297: 25(ivec4) Load 2296 + 2298: 25(ivec4) VectorShuffle 2297 2295 4 5 6 3 + Store 2296 2298 + 2299: 6(int) Load 8(invocation) + 2300: 71(ptr) AccessChain 31(data) 63 63 + 2301: 25(ivec4) Load 2300 + 2302: 169(bvec4) SLessThan 2301 752 + 2303: 17(ivec4) Load 19(ballot) + 2304: 169(bvec4) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2302 2303 + 2305: 25(ivec4) Select 2304 756 752 + 2306: 71(ptr) AccessChain 31(data) 2299 63 + Store 2306 2305 + 2307: 6(int) Load 8(invocation) + 2308: 64(ptr) AccessChain 31(data) 34 63 35 + 2309: 24(int) Load 2308 + 2310: 17(ivec4) Load 19(ballot) + 2311: 24(int) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2309 2310 + 2312: 64(ptr) AccessChain 31(data) 2307 63 35 + Store 2312 2311 + 2313: 6(int) Load 8(invocation) + 2314: 71(ptr) AccessChain 31(data) 63 63 + 2315: 25(ivec4) Load 2314 + 2316: 70(ivec2) VectorShuffle 2315 2315 0 1 + 2317: 17(ivec4) Load 19(ballot) + 2318: 70(ivec2) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2316 2317 + 2319: 71(ptr) AccessChain 31(data) 2313 63 + 2320: 25(ivec4) Load 2319 + 2321: 25(ivec4) VectorShuffle 2320 2318 4 5 2 3 + Store 2319 2321 + 2322: 6(int) Load 8(invocation) + 2323: 71(ptr) AccessChain 31(data) 33 63 + 2324: 25(ivec4) Load 2323 + 2325: 78(ivec3) VectorShuffle 2324 2324 0 1 2 + 2326: 17(ivec4) Load 19(ballot) + 2327: 78(ivec3) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2325 2326 + 2328: 71(ptr) AccessChain 31(data) 2322 63 + 2329: 25(ivec4) Load 2328 + 2330: 25(ivec4) VectorShuffle 2329 2327 4 5 6 3 + Store 2328 2330 + 2331: 6(int) Load 8(invocation) + 2332: 71(ptr) AccessChain 31(data) 115 63 + 2333: 25(ivec4) Load 2332 + 2334: 17(ivec4) Load 19(ballot) + 2335: 25(ivec4) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2333 2334 + 2336: 71(ptr) AccessChain 31(data) 2331 63 + Store 2336 2335 + 2337: 6(int) Load 8(invocation) + 2338: 90(ptr) AccessChain 31(data) 34 33 35 + 2339: 6(int) Load 2338 + 2340: 17(ivec4) Load 19(ballot) + 2341: 6(int) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2339 2340 + 2342: 90(ptr) AccessChain 31(data) 2337 33 35 + Store 2342 2341 + 2343: 6(int) Load 8(invocation) + 2344: 40(ptr) AccessChain 31(data) 63 33 + 2345: 17(ivec4) Load 2344 + 2346: 96(ivec2) VectorShuffle 2345 2345 0 1 + 2347: 17(ivec4) Load 19(ballot) + 2348: 96(ivec2) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2346 2347 + 2349: 40(ptr) AccessChain 31(data) 2343 33 + 2350: 17(ivec4) Load 2349 + 2351: 17(ivec4) VectorShuffle 2350 2348 4 5 2 3 + Store 2349 2351 + 2352: 6(int) Load 8(invocation) + 2353: 40(ptr) AccessChain 31(data) 33 33 + 2354: 17(ivec4) Load 2353 + 2355: 103(ivec3) VectorShuffle 2354 2354 0 1 2 + 2356: 17(ivec4) Load 19(ballot) + 2357: 103(ivec3) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2355 2356 + 2358: 40(ptr) AccessChain 31(data) 2352 33 + 2359: 17(ivec4) Load 2358 + 2360: 17(ivec4) VectorShuffle 2359 2357 4 5 6 3 + Store 2358 2360 + 2361: 6(int) Load 8(invocation) + 2362: 40(ptr) AccessChain 31(data) 115 33 + 2363: 17(ivec4) Load 2362 + 2364: 17(ivec4) Load 19(ballot) + 2365: 17(ivec4) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2363 2364 + 2366: 40(ptr) AccessChain 31(data) 2361 33 + Store 2366 2365 + 2367: 6(int) Load 8(invocation) + 2368: 64(ptr) AccessChain 31(data) 34 63 35 + 2369: 24(int) Load 2368 + 2370: 144(bool) SLessThan 2369 34 + 2371: 17(ivec4) Load 19(ballot) + 2372: 144(bool) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2370 2371 + 2373: 24(int) Select 2372 63 34 + 2374: 64(ptr) AccessChain 31(data) 2367 63 35 + Store 2374 2373 + 2375: 6(int) Load 8(invocation) + 2376: 71(ptr) AccessChain 31(data) 63 63 + 2377: 25(ivec4) Load 2376 + 2378: 70(ivec2) VectorShuffle 2377 2377 0 1 + 2379: 152(bvec2) SLessThan 2378 727 + 2380: 17(ivec4) Load 19(ballot) + 2381: 152(bvec2) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2379 2380 + 2382: 70(ivec2) Select 2381 731 727 + 2383: 71(ptr) AccessChain 31(data) 2375 63 + 2384: 25(ivec4) Load 2383 + 2385: 25(ivec4) VectorShuffle 2384 2382 4 5 2 3 + Store 2383 2385 + 2386: 6(int) Load 8(invocation) + 2387: 71(ptr) AccessChain 31(data) 63 63 + 2388: 25(ivec4) Load 2387 + 2389: 78(ivec3) VectorShuffle 2388 2388 0 1 2 + 2390: 161(bvec3) SLessThan 2389 740 + 2391: 17(ivec4) Load 19(ballot) + 2392: 161(bvec3) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2390 2391 + 2393: 78(ivec3) Select 2392 744 740 + 2394: 71(ptr) AccessChain 31(data) 2386 63 + 2395: 25(ivec4) Load 2394 + 2396: 25(ivec4) VectorShuffle 2395 2393 4 5 6 3 + Store 2394 2396 + 2397: 6(int) Load 8(invocation) + 2398: 71(ptr) AccessChain 31(data) 63 63 + 2399: 25(ivec4) Load 2398 + 2400: 169(bvec4) SLessThan 2399 752 + 2401: 17(ivec4) Load 19(ballot) + 2402: 169(bvec4) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2400 2401 + 2403: 25(ivec4) Select 2402 756 752 + 2404: 71(ptr) AccessChain 31(data) 2397 63 + Store 2404 2403 + 2405: 6(int) Load 8(invocation) + 2406: 64(ptr) AccessChain 31(data) 34 63 35 + 2407: 24(int) Load 2406 + 2408: 17(ivec4) Load 19(ballot) + 2409: 24(int) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2407 2408 + 2410: 64(ptr) AccessChain 31(data) 2405 63 35 + Store 2410 2409 + 2411: 6(int) Load 8(invocation) + 2412: 71(ptr) AccessChain 31(data) 63 63 + 2413: 25(ivec4) Load 2412 + 2414: 70(ivec2) VectorShuffle 2413 2413 0 1 + 2415: 17(ivec4) Load 19(ballot) + 2416: 70(ivec2) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2414 2415 + 2417: 71(ptr) AccessChain 31(data) 2411 63 + 2418: 25(ivec4) Load 2417 + 2419: 25(ivec4) VectorShuffle 2418 2416 4 5 2 3 + Store 2417 2419 + 2420: 6(int) Load 8(invocation) + 2421: 71(ptr) AccessChain 31(data) 33 63 + 2422: 25(ivec4) Load 2421 + 2423: 78(ivec3) VectorShuffle 2422 2422 0 1 2 + 2424: 17(ivec4) Load 19(ballot) + 2425: 78(ivec3) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2423 2424 + 2426: 71(ptr) AccessChain 31(data) 2420 63 + 2427: 25(ivec4) Load 2426 + 2428: 25(ivec4) VectorShuffle 2427 2425 4 5 6 3 + Store 2426 2428 + 2429: 6(int) Load 8(invocation) + 2430: 71(ptr) AccessChain 31(data) 115 63 + 2431: 25(ivec4) Load 2430 + 2432: 17(ivec4) Load 19(ballot) + 2433: 25(ivec4) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2431 2432 + 2434: 71(ptr) AccessChain 31(data) 2429 63 + Store 2434 2433 + 2435: 6(int) Load 8(invocation) + 2436: 90(ptr) AccessChain 31(data) 34 33 35 + 2437: 6(int) Load 2436 + 2438: 17(ivec4) Load 19(ballot) + 2439: 6(int) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2437 2438 + 2440: 90(ptr) AccessChain 31(data) 2435 33 35 + Store 2440 2439 + 2441: 6(int) Load 8(invocation) + 2442: 40(ptr) AccessChain 31(data) 63 33 + 2443: 17(ivec4) Load 2442 + 2444: 96(ivec2) VectorShuffle 2443 2443 0 1 + 2445: 17(ivec4) Load 19(ballot) + 2446: 96(ivec2) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2444 2445 + 2447: 40(ptr) AccessChain 31(data) 2441 33 + 2448: 17(ivec4) Load 2447 + 2449: 17(ivec4) VectorShuffle 2448 2446 4 5 2 3 + Store 2447 2449 + 2450: 6(int) Load 8(invocation) + 2451: 40(ptr) AccessChain 31(data) 33 33 + 2452: 17(ivec4) Load 2451 + 2453: 103(ivec3) VectorShuffle 2452 2452 0 1 2 + 2454: 17(ivec4) Load 19(ballot) + 2455: 103(ivec3) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2453 2454 + 2456: 40(ptr) AccessChain 31(data) 2450 33 + 2457: 17(ivec4) Load 2456 + 2458: 17(ivec4) VectorShuffle 2457 2455 4 5 6 3 + Store 2456 2458 + 2459: 6(int) Load 8(invocation) + 2460: 40(ptr) AccessChain 31(data) 115 33 + 2461: 17(ivec4) Load 2460 + 2462: 17(ivec4) Load 19(ballot) + 2463: 17(ivec4) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2461 2462 + 2464: 40(ptr) AccessChain 31(data) 2459 33 + Store 2464 2463 + 2465: 6(int) Load 8(invocation) + 2466: 64(ptr) AccessChain 31(data) 34 63 35 + 2467: 24(int) Load 2466 + 2468: 144(bool) SLessThan 2467 34 + 2469: 17(ivec4) Load 19(ballot) + 2470: 144(bool) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2468 2469 + 2471: 24(int) Select 2470 63 34 + 2472: 64(ptr) AccessChain 31(data) 2465 63 35 + Store 2472 2471 + 2473: 6(int) Load 8(invocation) + 2474: 71(ptr) AccessChain 31(data) 63 63 + 2475: 25(ivec4) Load 2474 + 2476: 70(ivec2) VectorShuffle 2475 2475 0 1 + 2477: 152(bvec2) SLessThan 2476 727 + 2478: 17(ivec4) Load 19(ballot) + 2479: 152(bvec2) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2477 2478 + 2480: 70(ivec2) Select 2479 731 727 + 2481: 71(ptr) AccessChain 31(data) 2473 63 + 2482: 25(ivec4) Load 2481 + 2483: 25(ivec4) VectorShuffle 2482 2480 4 5 2 3 + Store 2481 2483 + 2484: 6(int) Load 8(invocation) + 2485: 71(ptr) AccessChain 31(data) 63 63 + 2486: 25(ivec4) Load 2485 + 2487: 78(ivec3) VectorShuffle 2486 2486 0 1 2 + 2488: 161(bvec3) SLessThan 2487 740 + 2489: 17(ivec4) Load 19(ballot) + 2490: 161(bvec3) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2488 2489 + 2491: 78(ivec3) Select 2490 744 740 + 2492: 71(ptr) AccessChain 31(data) 2484 63 + 2493: 25(ivec4) Load 2492 + 2494: 25(ivec4) VectorShuffle 2493 2491 4 5 6 3 + Store 2492 2494 + 2495: 6(int) Load 8(invocation) + 2496: 71(ptr) AccessChain 31(data) 63 63 + 2497: 25(ivec4) Load 2496 + 2498: 169(bvec4) SLessThan 2497 752 + 2499: 17(ivec4) Load 19(ballot) + 2500: 169(bvec4) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2498 2499 + 2501: 25(ivec4) Select 2500 756 752 + 2502: 71(ptr) AccessChain 31(data) 2495 63 + Store 2502 2501 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupQuad.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupQuad.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupQuad.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupQuad.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,739 @@ +spv.subgroupQuad.comp +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 616 + + Capability Shader + Capability Float64 + Capability GroupNonUniform + Capability GroupNonUniformQuad + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" 10 12 + ExecutionMode 4 LocalSize 8 1 1 + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_basic" + SourceExtension "GL_KHR_shader_subgroup_quad" + Name 4 "main" + Name 8 "invocation" + Name 10 "gl_SubgroupInvocationID" + Name 12 "gl_SubgroupSize" + Name 24 "Buffers" + MemberName 24(Buffers) 0 "f4" + MemberName 24(Buffers) 1 "i4" + MemberName 24(Buffers) 2 "u4" + MemberName 24(Buffers) 3 "d4" + Name 27 "data" + Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 11 RelaxedPrecision + Decorate 12(gl_SubgroupSize) RelaxedPrecision + Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 13 RelaxedPrecision + Decorate 14 RelaxedPrecision + Decorate 16 RelaxedPrecision + MemberDecorate 24(Buffers) 0 Offset 0 + MemberDecorate 24(Buffers) 1 Offset 16 + MemberDecorate 24(Buffers) 2 Offset 32 + MemberDecorate 24(Buffers) 3 Offset 64 + Decorate 24(Buffers) BufferBlock + Decorate 27(data) DescriptorSet 0 + Decorate 27(data) Binding 0 + Decorate 615 BuiltIn WorkgroupSize + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypePointer Function 6(int) + 9: TypePointer Input 6(int) +10(gl_SubgroupInvocationID): 9(ptr) Variable Input +12(gl_SubgroupSize): 9(ptr) Variable Input + 15: 6(int) Constant 4 + 17: TypeFloat 32 + 18: TypeVector 17(float) 4 + 19: TypeInt 32 1 + 20: TypeVector 19(int) 4 + 21: TypeVector 6(int) 4 + 22: TypeFloat 64 + 23: TypeVector 22(float) 4 + 24(Buffers): TypeStruct 18(fvec4) 20(ivec4) 21(ivec4) 23(fvec4) + 25: TypeArray 24(Buffers) 15 + 26: TypePointer Uniform 25 + 27(data): 26(ptr) Variable Uniform + 29: 19(int) Constant 0 + 30: 6(int) Constant 0 + 31: TypePointer Uniform 17(float) + 34: 6(int) Constant 1 + 35: 6(int) Constant 3 + 39: 19(int) Constant 1 + 40: TypeVector 17(float) 2 + 41: TypePointer Uniform 18(fvec4) + 50: 19(int) Constant 2 + 51: TypeVector 17(float) 3 + 60: 19(int) Constant 3 + 66: TypePointer Uniform 19(int) + 72: TypeVector 19(int) 2 + 73: TypePointer Uniform 20(ivec4) + 82: TypeVector 19(int) 3 + 96: TypePointer Uniform 6(int) + 102: TypeVector 6(int) 2 + 103: TypePointer Uniform 21(ivec4) + 112: TypeVector 6(int) 3 + 126: TypePointer Uniform 22(float) + 132: TypeVector 22(float) 2 + 133: TypePointer Uniform 23(fvec4) + 142: TypeVector 22(float) 3 + 158: TypeBool + 167: 72(ivec2) ConstantComposite 29 29 + 168: TypeVector 158(bool) 2 + 171: 72(ivec2) ConstantComposite 39 39 + 180: 82(ivec3) ConstantComposite 29 29 29 + 181: TypeVector 158(bool) 3 + 184: 82(ivec3) ConstantComposite 39 39 39 + 192: 20(ivec4) ConstantComposite 29 29 29 29 + 193: TypeVector 158(bool) 4 + 196: 20(ivec4) ConstantComposite 39 39 39 39 + 478: 6(int) Constant 2 + 614: 6(int) Constant 8 + 615: 112(ivec3) ConstantComposite 614 34 34 + 4(main): 2 Function None 3 + 5: Label + 8(invocation): 7(ptr) Variable Function + 11: 6(int) Load 10(gl_SubgroupInvocationID) + 13: 6(int) Load 12(gl_SubgroupSize) + 14: 6(int) IAdd 11 13 + 16: 6(int) UMod 14 15 + Store 8(invocation) 16 + 28: 6(int) Load 8(invocation) + 32: 31(ptr) AccessChain 27(data) 29 29 30 + 33: 17(float) Load 32 + 36: 17(float) GroupNonUniformQuadBroadcast 35 33 34 + 37: 31(ptr) AccessChain 27(data) 28 29 30 + Store 37 36 + 38: 6(int) Load 8(invocation) + 42: 41(ptr) AccessChain 27(data) 39 29 + 43: 18(fvec4) Load 42 + 44: 40(fvec2) VectorShuffle 43 43 0 1 + 45: 40(fvec2) GroupNonUniformQuadBroadcast 35 44 34 + 46: 41(ptr) AccessChain 27(data) 38 29 + 47: 18(fvec4) Load 46 + 48: 18(fvec4) VectorShuffle 47 45 4 5 2 3 + Store 46 48 + 49: 6(int) Load 8(invocation) + 52: 41(ptr) AccessChain 27(data) 50 29 + 53: 18(fvec4) Load 52 + 54: 51(fvec3) VectorShuffle 53 53 0 1 2 + 55: 51(fvec3) GroupNonUniformQuadBroadcast 35 54 34 + 56: 41(ptr) AccessChain 27(data) 49 29 + 57: 18(fvec4) Load 56 + 58: 18(fvec4) VectorShuffle 57 55 4 5 6 3 + Store 56 58 + 59: 6(int) Load 8(invocation) + 61: 41(ptr) AccessChain 27(data) 60 29 + 62: 18(fvec4) Load 61 + 63: 18(fvec4) GroupNonUniformQuadBroadcast 35 62 34 + 64: 41(ptr) AccessChain 27(data) 59 29 + Store 64 63 + 65: 6(int) Load 8(invocation) + 67: 66(ptr) AccessChain 27(data) 29 39 30 + 68: 19(int) Load 67 + 69: 19(int) GroupNonUniformQuadBroadcast 35 68 34 + 70: 66(ptr) AccessChain 27(data) 65 39 30 + Store 70 69 + 71: 6(int) Load 8(invocation) + 74: 73(ptr) AccessChain 27(data) 39 39 + 75: 20(ivec4) Load 74 + 76: 72(ivec2) VectorShuffle 75 75 0 1 + 77: 72(ivec2) GroupNonUniformQuadBroadcast 35 76 34 + 78: 73(ptr) AccessChain 27(data) 71 39 + 79: 20(ivec4) Load 78 + 80: 20(ivec4) VectorShuffle 79 77 4 5 2 3 + Store 78 80 + 81: 6(int) Load 8(invocation) + 83: 73(ptr) AccessChain 27(data) 50 39 + 84: 20(ivec4) Load 83 + 85: 82(ivec3) VectorShuffle 84 84 0 1 2 + 86: 82(ivec3) GroupNonUniformQuadBroadcast 35 85 34 + 87: 73(ptr) AccessChain 27(data) 81 39 + 88: 20(ivec4) Load 87 + 89: 20(ivec4) VectorShuffle 88 86 4 5 6 3 + Store 87 89 + 90: 6(int) Load 8(invocation) + 91: 73(ptr) AccessChain 27(data) 60 39 + 92: 20(ivec4) Load 91 + 93: 20(ivec4) GroupNonUniformQuadBroadcast 35 92 34 + 94: 73(ptr) AccessChain 27(data) 90 39 + Store 94 93 + 95: 6(int) Load 8(invocation) + 97: 96(ptr) AccessChain 27(data) 29 50 30 + 98: 6(int) Load 97 + 99: 6(int) GroupNonUniformQuadBroadcast 35 98 34 + 100: 96(ptr) AccessChain 27(data) 95 50 30 + Store 100 99 + 101: 6(int) Load 8(invocation) + 104: 103(ptr) AccessChain 27(data) 39 50 + 105: 21(ivec4) Load 104 + 106: 102(ivec2) VectorShuffle 105 105 0 1 + 107: 102(ivec2) GroupNonUniformQuadBroadcast 35 106 34 + 108: 103(ptr) AccessChain 27(data) 101 50 + 109: 21(ivec4) Load 108 + 110: 21(ivec4) VectorShuffle 109 107 4 5 2 3 + Store 108 110 + 111: 6(int) Load 8(invocation) + 113: 103(ptr) AccessChain 27(data) 50 50 + 114: 21(ivec4) Load 113 + 115: 112(ivec3) VectorShuffle 114 114 0 1 2 + 116: 112(ivec3) GroupNonUniformQuadBroadcast 35 115 34 + 117: 103(ptr) AccessChain 27(data) 111 50 + 118: 21(ivec4) Load 117 + 119: 21(ivec4) VectorShuffle 118 116 4 5 6 3 + Store 117 119 + 120: 6(int) Load 8(invocation) + 121: 103(ptr) AccessChain 27(data) 60 50 + 122: 21(ivec4) Load 121 + 123: 21(ivec4) GroupNonUniformQuadBroadcast 35 122 34 + 124: 103(ptr) AccessChain 27(data) 120 50 + Store 124 123 + 125: 6(int) Load 8(invocation) + 127: 126(ptr) AccessChain 27(data) 29 60 30 + 128: 22(float) Load 127 + 129: 22(float) GroupNonUniformQuadBroadcast 35 128 34 + 130: 126(ptr) AccessChain 27(data) 125 60 30 + Store 130 129 + 131: 6(int) Load 8(invocation) + 134: 133(ptr) AccessChain 27(data) 39 60 + 135: 23(fvec4) Load 134 + 136: 132(fvec2) VectorShuffle 135 135 0 1 + 137: 132(fvec2) GroupNonUniformQuadBroadcast 35 136 34 + 138: 133(ptr) AccessChain 27(data) 131 60 + 139: 23(fvec4) Load 138 + 140: 23(fvec4) VectorShuffle 139 137 4 5 2 3 + Store 138 140 + 141: 6(int) Load 8(invocation) + 143: 133(ptr) AccessChain 27(data) 50 60 + 144: 23(fvec4) Load 143 + 145: 142(fvec3) VectorShuffle 144 144 0 1 2 + 146: 142(fvec3) GroupNonUniformQuadBroadcast 35 145 34 + 147: 133(ptr) AccessChain 27(data) 141 60 + 148: 23(fvec4) Load 147 + 149: 23(fvec4) VectorShuffle 148 146 4 5 6 3 + Store 147 149 + 150: 6(int) Load 8(invocation) + 151: 133(ptr) AccessChain 27(data) 60 60 + 152: 23(fvec4) Load 151 + 153: 23(fvec4) GroupNonUniformQuadBroadcast 35 152 34 + 154: 133(ptr) AccessChain 27(data) 150 60 + Store 154 153 + 155: 6(int) Load 8(invocation) + 156: 66(ptr) AccessChain 27(data) 29 39 30 + 157: 19(int) Load 156 + 159: 158(bool) SLessThan 157 29 + 160: 158(bool) GroupNonUniformQuadBroadcast 35 159 34 + 161: 19(int) Select 160 39 29 + 162: 66(ptr) AccessChain 27(data) 155 39 30 + Store 162 161 + 163: 6(int) Load 8(invocation) + 164: 73(ptr) AccessChain 27(data) 39 39 + 165: 20(ivec4) Load 164 + 166: 72(ivec2) VectorShuffle 165 165 0 1 + 169: 168(bvec2) SLessThan 166 167 + 170: 168(bvec2) GroupNonUniformQuadBroadcast 35 169 34 + 172: 72(ivec2) Select 170 171 167 + 173: 73(ptr) AccessChain 27(data) 163 39 + 174: 20(ivec4) Load 173 + 175: 20(ivec4) VectorShuffle 174 172 4 5 2 3 + Store 173 175 + 176: 6(int) Load 8(invocation) + 177: 73(ptr) AccessChain 27(data) 39 39 + 178: 20(ivec4) Load 177 + 179: 82(ivec3) VectorShuffle 178 178 0 1 2 + 182: 181(bvec3) SLessThan 179 180 + 183: 181(bvec3) GroupNonUniformQuadBroadcast 35 182 34 + 185: 82(ivec3) Select 183 184 180 + 186: 73(ptr) AccessChain 27(data) 176 39 + 187: 20(ivec4) Load 186 + 188: 20(ivec4) VectorShuffle 187 185 4 5 6 3 + Store 186 188 + 189: 6(int) Load 8(invocation) + 190: 73(ptr) AccessChain 27(data) 39 39 + 191: 20(ivec4) Load 190 + 194: 193(bvec4) SLessThan 191 192 + 195: 193(bvec4) GroupNonUniformQuadBroadcast 35 194 34 + 197: 20(ivec4) Select 195 196 192 + 198: 73(ptr) AccessChain 27(data) 189 39 + Store 198 197 + 199: 6(int) Load 8(invocation) + 200: 31(ptr) AccessChain 27(data) 29 29 30 + 201: 17(float) Load 200 + 202: 17(float) GroupNonUniformQuadSwap 35 201 30 + 203: 31(ptr) AccessChain 27(data) 199 29 30 + Store 203 202 + 204: 6(int) Load 8(invocation) + 205: 41(ptr) AccessChain 27(data) 39 29 + 206: 18(fvec4) Load 205 + 207: 40(fvec2) VectorShuffle 206 206 0 1 + 208: 40(fvec2) GroupNonUniformQuadSwap 35 207 30 + 209: 41(ptr) AccessChain 27(data) 204 29 + 210: 18(fvec4) Load 209 + 211: 18(fvec4) VectorShuffle 210 208 4 5 2 3 + Store 209 211 + 212: 6(int) Load 8(invocation) + 213: 41(ptr) AccessChain 27(data) 50 29 + 214: 18(fvec4) Load 213 + 215: 51(fvec3) VectorShuffle 214 214 0 1 2 + 216: 51(fvec3) GroupNonUniformQuadSwap 35 215 30 + 217: 41(ptr) AccessChain 27(data) 212 29 + 218: 18(fvec4) Load 217 + 219: 18(fvec4) VectorShuffle 218 216 4 5 6 3 + Store 217 219 + 220: 6(int) Load 8(invocation) + 221: 41(ptr) AccessChain 27(data) 60 29 + 222: 18(fvec4) Load 221 + 223: 18(fvec4) GroupNonUniformQuadSwap 35 222 30 + 224: 41(ptr) AccessChain 27(data) 220 29 + Store 224 223 + 225: 6(int) Load 8(invocation) + 226: 66(ptr) AccessChain 27(data) 29 39 30 + 227: 19(int) Load 226 + 228: 19(int) GroupNonUniformQuadSwap 35 227 30 + 229: 66(ptr) AccessChain 27(data) 225 39 30 + Store 229 228 + 230: 6(int) Load 8(invocation) + 231: 73(ptr) AccessChain 27(data) 39 39 + 232: 20(ivec4) Load 231 + 233: 72(ivec2) VectorShuffle 232 232 0 1 + 234: 72(ivec2) GroupNonUniformQuadSwap 35 233 30 + 235: 73(ptr) AccessChain 27(data) 230 39 + 236: 20(ivec4) Load 235 + 237: 20(ivec4) VectorShuffle 236 234 4 5 2 3 + Store 235 237 + 238: 6(int) Load 8(invocation) + 239: 73(ptr) AccessChain 27(data) 50 39 + 240: 20(ivec4) Load 239 + 241: 82(ivec3) VectorShuffle 240 240 0 1 2 + 242: 82(ivec3) GroupNonUniformQuadSwap 35 241 30 + 243: 73(ptr) AccessChain 27(data) 238 39 + 244: 20(ivec4) Load 243 + 245: 20(ivec4) VectorShuffle 244 242 4 5 6 3 + Store 243 245 + 246: 6(int) Load 8(invocation) + 247: 73(ptr) AccessChain 27(data) 60 39 + 248: 20(ivec4) Load 247 + 249: 20(ivec4) GroupNonUniformQuadSwap 35 248 30 + 250: 73(ptr) AccessChain 27(data) 246 39 + Store 250 249 + 251: 6(int) Load 8(invocation) + 252: 96(ptr) AccessChain 27(data) 29 50 30 + 253: 6(int) Load 252 + 254: 6(int) GroupNonUniformQuadSwap 35 253 30 + 255: 96(ptr) AccessChain 27(data) 251 50 30 + Store 255 254 + 256: 6(int) Load 8(invocation) + 257: 103(ptr) AccessChain 27(data) 39 50 + 258: 21(ivec4) Load 257 + 259: 102(ivec2) VectorShuffle 258 258 0 1 + 260: 102(ivec2) GroupNonUniformQuadSwap 35 259 30 + 261: 103(ptr) AccessChain 27(data) 256 50 + 262: 21(ivec4) Load 261 + 263: 21(ivec4) VectorShuffle 262 260 4 5 2 3 + Store 261 263 + 264: 6(int) Load 8(invocation) + 265: 103(ptr) AccessChain 27(data) 50 50 + 266: 21(ivec4) Load 265 + 267: 112(ivec3) VectorShuffle 266 266 0 1 2 + 268: 112(ivec3) GroupNonUniformQuadSwap 35 267 30 + 269: 103(ptr) AccessChain 27(data) 264 50 + 270: 21(ivec4) Load 269 + 271: 21(ivec4) VectorShuffle 270 268 4 5 6 3 + Store 269 271 + 272: 6(int) Load 8(invocation) + 273: 103(ptr) AccessChain 27(data) 60 50 + 274: 21(ivec4) Load 273 + 275: 21(ivec4) GroupNonUniformQuadSwap 35 274 30 + 276: 103(ptr) AccessChain 27(data) 272 50 + Store 276 275 + 277: 6(int) Load 8(invocation) + 278: 126(ptr) AccessChain 27(data) 29 60 30 + 279: 22(float) Load 278 + 280: 22(float) GroupNonUniformQuadSwap 35 279 30 + 281: 126(ptr) AccessChain 27(data) 277 60 30 + Store 281 280 + 282: 6(int) Load 8(invocation) + 283: 133(ptr) AccessChain 27(data) 39 60 + 284: 23(fvec4) Load 283 + 285: 132(fvec2) VectorShuffle 284 284 0 1 + 286: 132(fvec2) GroupNonUniformQuadSwap 35 285 30 + 287: 133(ptr) AccessChain 27(data) 282 60 + 288: 23(fvec4) Load 287 + 289: 23(fvec4) VectorShuffle 288 286 4 5 2 3 + Store 287 289 + 290: 6(int) Load 8(invocation) + 291: 133(ptr) AccessChain 27(data) 50 60 + 292: 23(fvec4) Load 291 + 293: 142(fvec3) VectorShuffle 292 292 0 1 2 + 294: 142(fvec3) GroupNonUniformQuadSwap 35 293 30 + 295: 133(ptr) AccessChain 27(data) 290 60 + 296: 23(fvec4) Load 295 + 297: 23(fvec4) VectorShuffle 296 294 4 5 6 3 + Store 295 297 + 298: 6(int) Load 8(invocation) + 299: 133(ptr) AccessChain 27(data) 60 60 + 300: 23(fvec4) Load 299 + 301: 23(fvec4) GroupNonUniformQuadSwap 35 300 30 + 302: 133(ptr) AccessChain 27(data) 298 60 + Store 302 301 + 303: 6(int) Load 8(invocation) + 304: 66(ptr) AccessChain 27(data) 29 39 30 + 305: 19(int) Load 304 + 306: 158(bool) SLessThan 305 29 + 307: 158(bool) GroupNonUniformQuadSwap 35 306 30 + 308: 19(int) Select 307 39 29 + 309: 66(ptr) AccessChain 27(data) 303 39 30 + Store 309 308 + 310: 6(int) Load 8(invocation) + 311: 73(ptr) AccessChain 27(data) 39 39 + 312: 20(ivec4) Load 311 + 313: 72(ivec2) VectorShuffle 312 312 0 1 + 314: 168(bvec2) SLessThan 313 167 + 315: 168(bvec2) GroupNonUniformQuadSwap 35 314 30 + 316: 72(ivec2) Select 315 171 167 + 317: 73(ptr) AccessChain 27(data) 310 39 + 318: 20(ivec4) Load 317 + 319: 20(ivec4) VectorShuffle 318 316 4 5 2 3 + Store 317 319 + 320: 6(int) Load 8(invocation) + 321: 73(ptr) AccessChain 27(data) 39 39 + 322: 20(ivec4) Load 321 + 323: 82(ivec3) VectorShuffle 322 322 0 1 2 + 324: 181(bvec3) SLessThan 323 180 + 325: 181(bvec3) GroupNonUniformQuadSwap 35 324 30 + 326: 82(ivec3) Select 325 184 180 + 327: 73(ptr) AccessChain 27(data) 320 39 + 328: 20(ivec4) Load 327 + 329: 20(ivec4) VectorShuffle 328 326 4 5 6 3 + Store 327 329 + 330: 6(int) Load 8(invocation) + 331: 73(ptr) AccessChain 27(data) 39 39 + 332: 20(ivec4) Load 331 + 333: 193(bvec4) SLessThan 332 192 + 334: 193(bvec4) GroupNonUniformQuadSwap 35 333 30 + 335: 20(ivec4) Select 334 196 192 + 336: 73(ptr) AccessChain 27(data) 330 39 + Store 336 335 + 337: 6(int) Load 8(invocation) + 338: 31(ptr) AccessChain 27(data) 29 29 30 + 339: 17(float) Load 338 + 340: 17(float) GroupNonUniformQuadSwap 35 339 34 + 341: 31(ptr) AccessChain 27(data) 337 29 30 + Store 341 340 + 342: 6(int) Load 8(invocation) + 343: 41(ptr) AccessChain 27(data) 39 29 + 344: 18(fvec4) Load 343 + 345: 40(fvec2) VectorShuffle 344 344 0 1 + 346: 40(fvec2) GroupNonUniformQuadSwap 35 345 34 + 347: 41(ptr) AccessChain 27(data) 342 29 + 348: 18(fvec4) Load 347 + 349: 18(fvec4) VectorShuffle 348 346 4 5 2 3 + Store 347 349 + 350: 6(int) Load 8(invocation) + 351: 41(ptr) AccessChain 27(data) 50 29 + 352: 18(fvec4) Load 351 + 353: 51(fvec3) VectorShuffle 352 352 0 1 2 + 354: 51(fvec3) GroupNonUniformQuadSwap 35 353 34 + 355: 41(ptr) AccessChain 27(data) 350 29 + 356: 18(fvec4) Load 355 + 357: 18(fvec4) VectorShuffle 356 354 4 5 6 3 + Store 355 357 + 358: 6(int) Load 8(invocation) + 359: 41(ptr) AccessChain 27(data) 60 29 + 360: 18(fvec4) Load 359 + 361: 18(fvec4) GroupNonUniformQuadSwap 35 360 34 + 362: 41(ptr) AccessChain 27(data) 358 29 + Store 362 361 + 363: 6(int) Load 8(invocation) + 364: 66(ptr) AccessChain 27(data) 29 39 30 + 365: 19(int) Load 364 + 366: 19(int) GroupNonUniformQuadSwap 35 365 34 + 367: 66(ptr) AccessChain 27(data) 363 39 30 + Store 367 366 + 368: 6(int) Load 8(invocation) + 369: 73(ptr) AccessChain 27(data) 39 39 + 370: 20(ivec4) Load 369 + 371: 72(ivec2) VectorShuffle 370 370 0 1 + 372: 72(ivec2) GroupNonUniformQuadSwap 35 371 34 + 373: 73(ptr) AccessChain 27(data) 368 39 + 374: 20(ivec4) Load 373 + 375: 20(ivec4) VectorShuffle 374 372 4 5 2 3 + Store 373 375 + 376: 6(int) Load 8(invocation) + 377: 73(ptr) AccessChain 27(data) 50 39 + 378: 20(ivec4) Load 377 + 379: 82(ivec3) VectorShuffle 378 378 0 1 2 + 380: 82(ivec3) GroupNonUniformQuadSwap 35 379 34 + 381: 73(ptr) AccessChain 27(data) 376 39 + 382: 20(ivec4) Load 381 + 383: 20(ivec4) VectorShuffle 382 380 4 5 6 3 + Store 381 383 + 384: 6(int) Load 8(invocation) + 385: 73(ptr) AccessChain 27(data) 60 39 + 386: 20(ivec4) Load 385 + 387: 20(ivec4) GroupNonUniformQuadSwap 35 386 34 + 388: 73(ptr) AccessChain 27(data) 384 39 + Store 388 387 + 389: 6(int) Load 8(invocation) + 390: 96(ptr) AccessChain 27(data) 29 50 30 + 391: 6(int) Load 390 + 392: 6(int) GroupNonUniformQuadSwap 35 391 34 + 393: 96(ptr) AccessChain 27(data) 389 50 30 + Store 393 392 + 394: 6(int) Load 8(invocation) + 395: 103(ptr) AccessChain 27(data) 39 50 + 396: 21(ivec4) Load 395 + 397: 102(ivec2) VectorShuffle 396 396 0 1 + 398: 102(ivec2) GroupNonUniformQuadSwap 35 397 34 + 399: 103(ptr) AccessChain 27(data) 394 50 + 400: 21(ivec4) Load 399 + 401: 21(ivec4) VectorShuffle 400 398 4 5 2 3 + Store 399 401 + 402: 6(int) Load 8(invocation) + 403: 103(ptr) AccessChain 27(data) 50 50 + 404: 21(ivec4) Load 403 + 405: 112(ivec3) VectorShuffle 404 404 0 1 2 + 406: 112(ivec3) GroupNonUniformQuadSwap 35 405 34 + 407: 103(ptr) AccessChain 27(data) 402 50 + 408: 21(ivec4) Load 407 + 409: 21(ivec4) VectorShuffle 408 406 4 5 6 3 + Store 407 409 + 410: 6(int) Load 8(invocation) + 411: 103(ptr) AccessChain 27(data) 60 50 + 412: 21(ivec4) Load 411 + 413: 21(ivec4) GroupNonUniformQuadSwap 35 412 34 + 414: 103(ptr) AccessChain 27(data) 410 50 + Store 414 413 + 415: 6(int) Load 8(invocation) + 416: 126(ptr) AccessChain 27(data) 29 60 30 + 417: 22(float) Load 416 + 418: 22(float) GroupNonUniformQuadSwap 35 417 34 + 419: 126(ptr) AccessChain 27(data) 415 60 30 + Store 419 418 + 420: 6(int) Load 8(invocation) + 421: 133(ptr) AccessChain 27(data) 39 60 + 422: 23(fvec4) Load 421 + 423: 132(fvec2) VectorShuffle 422 422 0 1 + 424: 132(fvec2) GroupNonUniformQuadSwap 35 423 34 + 425: 133(ptr) AccessChain 27(data) 420 60 + 426: 23(fvec4) Load 425 + 427: 23(fvec4) VectorShuffle 426 424 4 5 2 3 + Store 425 427 + 428: 6(int) Load 8(invocation) + 429: 133(ptr) AccessChain 27(data) 50 60 + 430: 23(fvec4) Load 429 + 431: 142(fvec3) VectorShuffle 430 430 0 1 2 + 432: 142(fvec3) GroupNonUniformQuadSwap 35 431 34 + 433: 133(ptr) AccessChain 27(data) 428 60 + 434: 23(fvec4) Load 433 + 435: 23(fvec4) VectorShuffle 434 432 4 5 6 3 + Store 433 435 + 436: 6(int) Load 8(invocation) + 437: 133(ptr) AccessChain 27(data) 60 60 + 438: 23(fvec4) Load 437 + 439: 23(fvec4) GroupNonUniformQuadSwap 35 438 34 + 440: 133(ptr) AccessChain 27(data) 436 60 + Store 440 439 + 441: 6(int) Load 8(invocation) + 442: 66(ptr) AccessChain 27(data) 29 39 30 + 443: 19(int) Load 442 + 444: 158(bool) SLessThan 443 29 + 445: 158(bool) GroupNonUniformQuadSwap 35 444 34 + 446: 19(int) Select 445 39 29 + 447: 66(ptr) AccessChain 27(data) 441 39 30 + Store 447 446 + 448: 6(int) Load 8(invocation) + 449: 73(ptr) AccessChain 27(data) 39 39 + 450: 20(ivec4) Load 449 + 451: 72(ivec2) VectorShuffle 450 450 0 1 + 452: 168(bvec2) SLessThan 451 167 + 453: 168(bvec2) GroupNonUniformQuadSwap 35 452 34 + 454: 72(ivec2) Select 453 171 167 + 455: 73(ptr) AccessChain 27(data) 448 39 + 456: 20(ivec4) Load 455 + 457: 20(ivec4) VectorShuffle 456 454 4 5 2 3 + Store 455 457 + 458: 6(int) Load 8(invocation) + 459: 73(ptr) AccessChain 27(data) 39 39 + 460: 20(ivec4) Load 459 + 461: 82(ivec3) VectorShuffle 460 460 0 1 2 + 462: 181(bvec3) SLessThan 461 180 + 463: 181(bvec3) GroupNonUniformQuadSwap 35 462 34 + 464: 82(ivec3) Select 463 184 180 + 465: 73(ptr) AccessChain 27(data) 458 39 + 466: 20(ivec4) Load 465 + 467: 20(ivec4) VectorShuffle 466 464 4 5 6 3 + Store 465 467 + 468: 6(int) Load 8(invocation) + 469: 73(ptr) AccessChain 27(data) 39 39 + 470: 20(ivec4) Load 469 + 471: 193(bvec4) SLessThan 470 192 + 472: 193(bvec4) GroupNonUniformQuadSwap 35 471 34 + 473: 20(ivec4) Select 472 196 192 + 474: 73(ptr) AccessChain 27(data) 468 39 + Store 474 473 + 475: 6(int) Load 8(invocation) + 476: 31(ptr) AccessChain 27(data) 29 29 30 + 477: 17(float) Load 476 + 479: 17(float) GroupNonUniformQuadSwap 35 477 478 + 480: 31(ptr) AccessChain 27(data) 475 29 30 + Store 480 479 + 481: 6(int) Load 8(invocation) + 482: 41(ptr) AccessChain 27(data) 39 29 + 483: 18(fvec4) Load 482 + 484: 40(fvec2) VectorShuffle 483 483 0 1 + 485: 40(fvec2) GroupNonUniformQuadSwap 35 484 478 + 486: 41(ptr) AccessChain 27(data) 481 29 + 487: 18(fvec4) Load 486 + 488: 18(fvec4) VectorShuffle 487 485 4 5 2 3 + Store 486 488 + 489: 6(int) Load 8(invocation) + 490: 41(ptr) AccessChain 27(data) 50 29 + 491: 18(fvec4) Load 490 + 492: 51(fvec3) VectorShuffle 491 491 0 1 2 + 493: 51(fvec3) GroupNonUniformQuadSwap 35 492 478 + 494: 41(ptr) AccessChain 27(data) 489 29 + 495: 18(fvec4) Load 494 + 496: 18(fvec4) VectorShuffle 495 493 4 5 6 3 + Store 494 496 + 497: 6(int) Load 8(invocation) + 498: 41(ptr) AccessChain 27(data) 60 29 + 499: 18(fvec4) Load 498 + 500: 18(fvec4) GroupNonUniformQuadSwap 35 499 478 + 501: 41(ptr) AccessChain 27(data) 497 29 + Store 501 500 + 502: 6(int) Load 8(invocation) + 503: 66(ptr) AccessChain 27(data) 29 39 30 + 504: 19(int) Load 503 + 505: 19(int) GroupNonUniformQuadSwap 35 504 478 + 506: 66(ptr) AccessChain 27(data) 502 39 30 + Store 506 505 + 507: 6(int) Load 8(invocation) + 508: 73(ptr) AccessChain 27(data) 39 39 + 509: 20(ivec4) Load 508 + 510: 72(ivec2) VectorShuffle 509 509 0 1 + 511: 72(ivec2) GroupNonUniformQuadSwap 35 510 478 + 512: 73(ptr) AccessChain 27(data) 507 39 + 513: 20(ivec4) Load 512 + 514: 20(ivec4) VectorShuffle 513 511 4 5 2 3 + Store 512 514 + 515: 6(int) Load 8(invocation) + 516: 73(ptr) AccessChain 27(data) 50 39 + 517: 20(ivec4) Load 516 + 518: 82(ivec3) VectorShuffle 517 517 0 1 2 + 519: 82(ivec3) GroupNonUniformQuadSwap 35 518 478 + 520: 73(ptr) AccessChain 27(data) 515 39 + 521: 20(ivec4) Load 520 + 522: 20(ivec4) VectorShuffle 521 519 4 5 6 3 + Store 520 522 + 523: 6(int) Load 8(invocation) + 524: 73(ptr) AccessChain 27(data) 60 39 + 525: 20(ivec4) Load 524 + 526: 20(ivec4) GroupNonUniformQuadSwap 35 525 478 + 527: 73(ptr) AccessChain 27(data) 523 39 + Store 527 526 + 528: 6(int) Load 8(invocation) + 529: 96(ptr) AccessChain 27(data) 29 50 30 + 530: 6(int) Load 529 + 531: 6(int) GroupNonUniformQuadSwap 35 530 478 + 532: 96(ptr) AccessChain 27(data) 528 50 30 + Store 532 531 + 533: 6(int) Load 8(invocation) + 534: 103(ptr) AccessChain 27(data) 39 50 + 535: 21(ivec4) Load 534 + 536: 102(ivec2) VectorShuffle 535 535 0 1 + 537: 102(ivec2) GroupNonUniformQuadSwap 35 536 478 + 538: 103(ptr) AccessChain 27(data) 533 50 + 539: 21(ivec4) Load 538 + 540: 21(ivec4) VectorShuffle 539 537 4 5 2 3 + Store 538 540 + 541: 6(int) Load 8(invocation) + 542: 103(ptr) AccessChain 27(data) 50 50 + 543: 21(ivec4) Load 542 + 544: 112(ivec3) VectorShuffle 543 543 0 1 2 + 545: 112(ivec3) GroupNonUniformQuadSwap 35 544 478 + 546: 103(ptr) AccessChain 27(data) 541 50 + 547: 21(ivec4) Load 546 + 548: 21(ivec4) VectorShuffle 547 545 4 5 6 3 + Store 546 548 + 549: 6(int) Load 8(invocation) + 550: 103(ptr) AccessChain 27(data) 60 50 + 551: 21(ivec4) Load 550 + 552: 21(ivec4) GroupNonUniformQuadSwap 35 551 478 + 553: 103(ptr) AccessChain 27(data) 549 50 + Store 553 552 + 554: 6(int) Load 8(invocation) + 555: 126(ptr) AccessChain 27(data) 29 60 30 + 556: 22(float) Load 555 + 557: 22(float) GroupNonUniformQuadSwap 35 556 478 + 558: 126(ptr) AccessChain 27(data) 554 60 30 + Store 558 557 + 559: 6(int) Load 8(invocation) + 560: 133(ptr) AccessChain 27(data) 39 60 + 561: 23(fvec4) Load 560 + 562: 132(fvec2) VectorShuffle 561 561 0 1 + 563: 132(fvec2) GroupNonUniformQuadSwap 35 562 478 + 564: 133(ptr) AccessChain 27(data) 559 60 + 565: 23(fvec4) Load 564 + 566: 23(fvec4) VectorShuffle 565 563 4 5 2 3 + Store 564 566 + 567: 6(int) Load 8(invocation) + 568: 133(ptr) AccessChain 27(data) 50 60 + 569: 23(fvec4) Load 568 + 570: 142(fvec3) VectorShuffle 569 569 0 1 2 + 571: 142(fvec3) GroupNonUniformQuadSwap 35 570 478 + 572: 133(ptr) AccessChain 27(data) 567 60 + 573: 23(fvec4) Load 572 + 574: 23(fvec4) VectorShuffle 573 571 4 5 6 3 + Store 572 574 + 575: 6(int) Load 8(invocation) + 576: 133(ptr) AccessChain 27(data) 60 60 + 577: 23(fvec4) Load 576 + 578: 23(fvec4) GroupNonUniformQuadSwap 35 577 478 + 579: 133(ptr) AccessChain 27(data) 575 60 + Store 579 578 + 580: 6(int) Load 8(invocation) + 581: 66(ptr) AccessChain 27(data) 29 39 30 + 582: 19(int) Load 581 + 583: 158(bool) SLessThan 582 29 + 584: 158(bool) GroupNonUniformQuadSwap 35 583 478 + 585: 19(int) Select 584 39 29 + 586: 66(ptr) AccessChain 27(data) 580 39 30 + Store 586 585 + 587: 6(int) Load 8(invocation) + 588: 73(ptr) AccessChain 27(data) 39 39 + 589: 20(ivec4) Load 588 + 590: 72(ivec2) VectorShuffle 589 589 0 1 + 591: 168(bvec2) SLessThan 590 167 + 592: 168(bvec2) GroupNonUniformQuadSwap 35 591 478 + 593: 72(ivec2) Select 592 171 167 + 594: 73(ptr) AccessChain 27(data) 587 39 + 595: 20(ivec4) Load 594 + 596: 20(ivec4) VectorShuffle 595 593 4 5 2 3 + Store 594 596 + 597: 6(int) Load 8(invocation) + 598: 73(ptr) AccessChain 27(data) 39 39 + 599: 20(ivec4) Load 598 + 600: 82(ivec3) VectorShuffle 599 599 0 1 2 + 601: 181(bvec3) SLessThan 600 180 + 602: 181(bvec3) GroupNonUniformQuadSwap 35 601 478 + 603: 82(ivec3) Select 602 184 180 + 604: 73(ptr) AccessChain 27(data) 597 39 + 605: 20(ivec4) Load 604 + 606: 20(ivec4) VectorShuffle 605 603 4 5 6 3 + Store 604 606 + 607: 6(int) Load 8(invocation) + 608: 73(ptr) AccessChain 27(data) 39 39 + 609: 20(ivec4) Load 608 + 610: 193(bvec4) SLessThan 609 192 + 611: 193(bvec4) GroupNonUniformQuadSwap 35 610 478 + 612: 20(ivec4) Select 611 196 192 + 613: 73(ptr) AccessChain 27(data) 607 39 + Store 613 612 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupShuffle.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupShuffle.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupShuffle.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupShuffle.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,462 @@ +spv.subgroupShuffle.comp +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 379 + + Capability Shader + Capability Float64 + Capability GroupNonUniform + Capability GroupNonUniformShuffle + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" 10 12 + ExecutionMode 4 LocalSize 8 8 1 + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_basic" + SourceExtension "GL_KHR_shader_subgroup_shuffle" + Name 4 "main" + Name 8 "invocation" + Name 10 "gl_SubgroupInvocationID" + Name 12 "gl_SubgroupSize" + Name 24 "Buffers" + MemberName 24(Buffers) 0 "f4" + MemberName 24(Buffers) 1 "i4" + MemberName 24(Buffers) 2 "u4" + MemberName 24(Buffers) 3 "d4" + Name 27 "data" + Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 11 RelaxedPrecision + Decorate 12(gl_SubgroupSize) RelaxedPrecision + Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 13 RelaxedPrecision + Decorate 14 RelaxedPrecision + Decorate 16 RelaxedPrecision + MemberDecorate 24(Buffers) 0 Offset 0 + MemberDecorate 24(Buffers) 1 Offset 16 + MemberDecorate 24(Buffers) 2 Offset 32 + MemberDecorate 24(Buffers) 3 Offset 64 + Decorate 24(Buffers) BufferBlock + Decorate 27(data) DescriptorSet 0 + Decorate 27(data) Binding 0 + Decorate 378 BuiltIn WorkgroupSize + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypePointer Function 6(int) + 9: TypePointer Input 6(int) +10(gl_SubgroupInvocationID): 9(ptr) Variable Input +12(gl_SubgroupSize): 9(ptr) Variable Input + 15: 6(int) Constant 4 + 17: TypeFloat 32 + 18: TypeVector 17(float) 4 + 19: TypeInt 32 1 + 20: TypeVector 19(int) 4 + 21: TypeVector 6(int) 4 + 22: TypeFloat 64 + 23: TypeVector 22(float) 4 + 24(Buffers): TypeStruct 18(fvec4) 20(ivec4) 21(ivec4) 23(fvec4) + 25: TypeArray 24(Buffers) 15 + 26: TypePointer Uniform 25 + 27(data): 26(ptr) Variable Uniform + 29: 19(int) Constant 0 + 30: 6(int) Constant 0 + 31: TypePointer Uniform 17(float) + 35: 6(int) Constant 3 + 39: 19(int) Constant 1 + 40: TypeVector 17(float) 2 + 41: TypePointer Uniform 18(fvec4) + 51: 19(int) Constant 2 + 52: TypeVector 17(float) 3 + 62: 19(int) Constant 3 + 69: TypePointer Uniform 19(int) + 76: TypeVector 19(int) 2 + 77: TypePointer Uniform 20(ivec4) + 87: TypeVector 19(int) 3 + 103: TypePointer Uniform 6(int) + 110: TypeVector 6(int) 2 + 111: TypePointer Uniform 21(ivec4) + 121: TypeVector 6(int) 3 + 137: TypePointer Uniform 22(float) + 144: TypeVector 22(float) 2 + 145: TypePointer Uniform 23(fvec4) + 155: TypeVector 22(float) 3 + 173: TypeBool + 183: 76(ivec2) ConstantComposite 29 29 + 184: TypeVector 173(bool) 2 + 188: 76(ivec2) ConstantComposite 39 39 + 197: 87(ivec3) ConstantComposite 29 29 29 + 198: TypeVector 173(bool) 3 + 202: 87(ivec3) ConstantComposite 39 39 39 + 210: 20(ivec4) ConstantComposite 29 29 29 29 + 211: TypeVector 173(bool) 4 + 215: 20(ivec4) ConstantComposite 39 39 39 39 + 376: 6(int) Constant 8 + 377: 6(int) Constant 1 + 378: 121(ivec3) ConstantComposite 376 376 377 + 4(main): 2 Function None 3 + 5: Label + 8(invocation): 7(ptr) Variable Function + 11: 6(int) Load 10(gl_SubgroupInvocationID) + 13: 6(int) Load 12(gl_SubgroupSize) + 14: 6(int) IAdd 11 13 + 16: 6(int) UMod 14 15 + Store 8(invocation) 16 + 28: 6(int) Load 8(invocation) + 32: 31(ptr) AccessChain 27(data) 29 29 30 + 33: 17(float) Load 32 + 34: 6(int) Load 8(invocation) + 36: 17(float) GroupNonUniformShuffle 35 33 34 + 37: 31(ptr) AccessChain 27(data) 28 29 30 + Store 37 36 + 38: 6(int) Load 8(invocation) + 42: 41(ptr) AccessChain 27(data) 39 29 + 43: 18(fvec4) Load 42 + 44: 40(fvec2) VectorShuffle 43 43 0 1 + 45: 6(int) Load 8(invocation) + 46: 40(fvec2) GroupNonUniformShuffle 35 44 45 + 47: 41(ptr) AccessChain 27(data) 38 29 + 48: 18(fvec4) Load 47 + 49: 18(fvec4) VectorShuffle 48 46 4 5 2 3 + Store 47 49 + 50: 6(int) Load 8(invocation) + 53: 41(ptr) AccessChain 27(data) 51 29 + 54: 18(fvec4) Load 53 + 55: 52(fvec3) VectorShuffle 54 54 0 1 2 + 56: 6(int) Load 8(invocation) + 57: 52(fvec3) GroupNonUniformShuffle 35 55 56 + 58: 41(ptr) AccessChain 27(data) 50 29 + 59: 18(fvec4) Load 58 + 60: 18(fvec4) VectorShuffle 59 57 4 5 6 3 + Store 58 60 + 61: 6(int) Load 8(invocation) + 63: 41(ptr) AccessChain 27(data) 62 29 + 64: 18(fvec4) Load 63 + 65: 6(int) Load 8(invocation) + 66: 18(fvec4) GroupNonUniformShuffle 35 64 65 + 67: 41(ptr) AccessChain 27(data) 61 29 + Store 67 66 + 68: 6(int) Load 8(invocation) + 70: 69(ptr) AccessChain 27(data) 29 39 30 + 71: 19(int) Load 70 + 72: 6(int) Load 8(invocation) + 73: 19(int) GroupNonUniformShuffle 35 71 72 + 74: 69(ptr) AccessChain 27(data) 68 39 30 + Store 74 73 + 75: 6(int) Load 8(invocation) + 78: 77(ptr) AccessChain 27(data) 39 39 + 79: 20(ivec4) Load 78 + 80: 76(ivec2) VectorShuffle 79 79 0 1 + 81: 6(int) Load 8(invocation) + 82: 76(ivec2) GroupNonUniformShuffle 35 80 81 + 83: 77(ptr) AccessChain 27(data) 75 39 + 84: 20(ivec4) Load 83 + 85: 20(ivec4) VectorShuffle 84 82 4 5 2 3 + Store 83 85 + 86: 6(int) Load 8(invocation) + 88: 77(ptr) AccessChain 27(data) 51 39 + 89: 20(ivec4) Load 88 + 90: 87(ivec3) VectorShuffle 89 89 0 1 2 + 91: 6(int) Load 8(invocation) + 92: 87(ivec3) GroupNonUniformShuffle 35 90 91 + 93: 77(ptr) AccessChain 27(data) 86 39 + 94: 20(ivec4) Load 93 + 95: 20(ivec4) VectorShuffle 94 92 4 5 6 3 + Store 93 95 + 96: 6(int) Load 8(invocation) + 97: 77(ptr) AccessChain 27(data) 62 39 + 98: 20(ivec4) Load 97 + 99: 6(int) Load 8(invocation) + 100: 20(ivec4) GroupNonUniformShuffle 35 98 99 + 101: 77(ptr) AccessChain 27(data) 96 39 + Store 101 100 + 102: 6(int) Load 8(invocation) + 104: 103(ptr) AccessChain 27(data) 29 51 30 + 105: 6(int) Load 104 + 106: 6(int) Load 8(invocation) + 107: 6(int) GroupNonUniformShuffle 35 105 106 + 108: 103(ptr) AccessChain 27(data) 102 51 30 + Store 108 107 + 109: 6(int) Load 8(invocation) + 112: 111(ptr) AccessChain 27(data) 39 51 + 113: 21(ivec4) Load 112 + 114: 110(ivec2) VectorShuffle 113 113 0 1 + 115: 6(int) Load 8(invocation) + 116: 110(ivec2) GroupNonUniformShuffle 35 114 115 + 117: 111(ptr) AccessChain 27(data) 109 51 + 118: 21(ivec4) Load 117 + 119: 21(ivec4) VectorShuffle 118 116 4 5 2 3 + Store 117 119 + 120: 6(int) Load 8(invocation) + 122: 111(ptr) AccessChain 27(data) 51 51 + 123: 21(ivec4) Load 122 + 124: 121(ivec3) VectorShuffle 123 123 0 1 2 + 125: 6(int) Load 8(invocation) + 126: 121(ivec3) GroupNonUniformShuffle 35 124 125 + 127: 111(ptr) AccessChain 27(data) 120 51 + 128: 21(ivec4) Load 127 + 129: 21(ivec4) VectorShuffle 128 126 4 5 6 3 + Store 127 129 + 130: 6(int) Load 8(invocation) + 131: 111(ptr) AccessChain 27(data) 62 51 + 132: 21(ivec4) Load 131 + 133: 6(int) Load 8(invocation) + 134: 21(ivec4) GroupNonUniformShuffle 35 132 133 + 135: 111(ptr) AccessChain 27(data) 130 51 + Store 135 134 + 136: 6(int) Load 8(invocation) + 138: 137(ptr) AccessChain 27(data) 29 62 30 + 139: 22(float) Load 138 + 140: 6(int) Load 8(invocation) + 141: 22(float) GroupNonUniformShuffle 35 139 140 + 142: 137(ptr) AccessChain 27(data) 136 62 30 + Store 142 141 + 143: 6(int) Load 8(invocation) + 146: 145(ptr) AccessChain 27(data) 39 62 + 147: 23(fvec4) Load 146 + 148: 144(fvec2) VectorShuffle 147 147 0 1 + 149: 6(int) Load 8(invocation) + 150: 144(fvec2) GroupNonUniformShuffle 35 148 149 + 151: 145(ptr) AccessChain 27(data) 143 62 + 152: 23(fvec4) Load 151 + 153: 23(fvec4) VectorShuffle 152 150 4 5 2 3 + Store 151 153 + 154: 6(int) Load 8(invocation) + 156: 145(ptr) AccessChain 27(data) 51 62 + 157: 23(fvec4) Load 156 + 158: 155(fvec3) VectorShuffle 157 157 0 1 2 + 159: 6(int) Load 8(invocation) + 160: 155(fvec3) GroupNonUniformShuffle 35 158 159 + 161: 145(ptr) AccessChain 27(data) 154 62 + 162: 23(fvec4) Load 161 + 163: 23(fvec4) VectorShuffle 162 160 4 5 6 3 + Store 161 163 + 164: 6(int) Load 8(invocation) + 165: 145(ptr) AccessChain 27(data) 62 62 + 166: 23(fvec4) Load 165 + 167: 6(int) Load 8(invocation) + 168: 23(fvec4) GroupNonUniformShuffle 35 166 167 + 169: 145(ptr) AccessChain 27(data) 164 62 + Store 169 168 + 170: 6(int) Load 8(invocation) + 171: 69(ptr) AccessChain 27(data) 29 39 30 + 172: 19(int) Load 171 + 174: 173(bool) SLessThan 172 29 + 175: 6(int) Load 8(invocation) + 176: 173(bool) GroupNonUniformShuffle 35 174 175 + 177: 19(int) Select 176 39 29 + 178: 69(ptr) AccessChain 27(data) 170 39 30 + Store 178 177 + 179: 6(int) Load 8(invocation) + 180: 77(ptr) AccessChain 27(data) 39 39 + 181: 20(ivec4) Load 180 + 182: 76(ivec2) VectorShuffle 181 181 0 1 + 185: 184(bvec2) SLessThan 182 183 + 186: 6(int) Load 8(invocation) + 187: 184(bvec2) GroupNonUniformShuffle 35 185 186 + 189: 76(ivec2) Select 187 188 183 + 190: 77(ptr) AccessChain 27(data) 179 39 + 191: 20(ivec4) Load 190 + 192: 20(ivec4) VectorShuffle 191 189 4 5 2 3 + Store 190 192 + 193: 6(int) Load 8(invocation) + 194: 77(ptr) AccessChain 27(data) 39 39 + 195: 20(ivec4) Load 194 + 196: 87(ivec3) VectorShuffle 195 195 0 1 2 + 199: 198(bvec3) SLessThan 196 197 + 200: 6(int) Load 8(invocation) + 201: 198(bvec3) GroupNonUniformShuffle 35 199 200 + 203: 87(ivec3) Select 201 202 197 + 204: 77(ptr) AccessChain 27(data) 193 39 + 205: 20(ivec4) Load 204 + 206: 20(ivec4) VectorShuffle 205 203 4 5 6 3 + Store 204 206 + 207: 6(int) Load 8(invocation) + 208: 77(ptr) AccessChain 27(data) 39 39 + 209: 20(ivec4) Load 208 + 212: 211(bvec4) SLessThan 209 210 + 213: 6(int) Load 8(invocation) + 214: 211(bvec4) GroupNonUniformShuffle 35 212 213 + 216: 20(ivec4) Select 214 215 210 + 217: 77(ptr) AccessChain 27(data) 207 39 + Store 217 216 + 218: 6(int) Load 8(invocation) + 219: 31(ptr) AccessChain 27(data) 29 29 30 + 220: 17(float) Load 219 + 221: 6(int) Load 8(invocation) + 222: 17(float) GroupNonUniformShuffleXor 35 220 221 + 223: 31(ptr) AccessChain 27(data) 218 29 30 + Store 223 222 + 224: 6(int) Load 8(invocation) + 225: 41(ptr) AccessChain 27(data) 39 29 + 226: 18(fvec4) Load 225 + 227: 40(fvec2) VectorShuffle 226 226 0 1 + 228: 6(int) Load 8(invocation) + 229: 40(fvec2) GroupNonUniformShuffleXor 35 227 228 + 230: 41(ptr) AccessChain 27(data) 224 29 + 231: 18(fvec4) Load 230 + 232: 18(fvec4) VectorShuffle 231 229 4 5 2 3 + Store 230 232 + 233: 6(int) Load 8(invocation) + 234: 41(ptr) AccessChain 27(data) 51 29 + 235: 18(fvec4) Load 234 + 236: 52(fvec3) VectorShuffle 235 235 0 1 2 + 237: 6(int) Load 8(invocation) + 238: 52(fvec3) GroupNonUniformShuffleXor 35 236 237 + 239: 41(ptr) AccessChain 27(data) 233 29 + 240: 18(fvec4) Load 239 + 241: 18(fvec4) VectorShuffle 240 238 4 5 6 3 + Store 239 241 + 242: 6(int) Load 8(invocation) + 243: 41(ptr) AccessChain 27(data) 62 29 + 244: 18(fvec4) Load 243 + 245: 6(int) Load 8(invocation) + 246: 18(fvec4) GroupNonUniformShuffleXor 35 244 245 + 247: 41(ptr) AccessChain 27(data) 242 29 + Store 247 246 + 248: 6(int) Load 8(invocation) + 249: 69(ptr) AccessChain 27(data) 29 39 30 + 250: 19(int) Load 249 + 251: 6(int) Load 8(invocation) + 252: 19(int) GroupNonUniformShuffleXor 35 250 251 + 253: 69(ptr) AccessChain 27(data) 248 39 30 + Store 253 252 + 254: 6(int) Load 8(invocation) + 255: 77(ptr) AccessChain 27(data) 39 39 + 256: 20(ivec4) Load 255 + 257: 76(ivec2) VectorShuffle 256 256 0 1 + 258: 6(int) Load 8(invocation) + 259: 76(ivec2) GroupNonUniformShuffleXor 35 257 258 + 260: 77(ptr) AccessChain 27(data) 254 39 + 261: 20(ivec4) Load 260 + 262: 20(ivec4) VectorShuffle 261 259 4 5 2 3 + Store 260 262 + 263: 6(int) Load 8(invocation) + 264: 77(ptr) AccessChain 27(data) 51 39 + 265: 20(ivec4) Load 264 + 266: 87(ivec3) VectorShuffle 265 265 0 1 2 + 267: 6(int) Load 8(invocation) + 268: 87(ivec3) GroupNonUniformShuffleXor 35 266 267 + 269: 77(ptr) AccessChain 27(data) 263 39 + 270: 20(ivec4) Load 269 + 271: 20(ivec4) VectorShuffle 270 268 4 5 6 3 + Store 269 271 + 272: 6(int) Load 8(invocation) + 273: 77(ptr) AccessChain 27(data) 62 39 + 274: 20(ivec4) Load 273 + 275: 6(int) Load 8(invocation) + 276: 20(ivec4) GroupNonUniformShuffleXor 35 274 275 + 277: 77(ptr) AccessChain 27(data) 272 39 + Store 277 276 + 278: 6(int) Load 8(invocation) + 279: 103(ptr) AccessChain 27(data) 29 51 30 + 280: 6(int) Load 279 + 281: 6(int) Load 8(invocation) + 282: 6(int) GroupNonUniformShuffleXor 35 280 281 + 283: 103(ptr) AccessChain 27(data) 278 51 30 + Store 283 282 + 284: 6(int) Load 8(invocation) + 285: 111(ptr) AccessChain 27(data) 39 51 + 286: 21(ivec4) Load 285 + 287: 110(ivec2) VectorShuffle 286 286 0 1 + 288: 6(int) Load 8(invocation) + 289: 110(ivec2) GroupNonUniformShuffleXor 35 287 288 + 290: 111(ptr) AccessChain 27(data) 284 51 + 291: 21(ivec4) Load 290 + 292: 21(ivec4) VectorShuffle 291 289 4 5 2 3 + Store 290 292 + 293: 6(int) Load 8(invocation) + 294: 111(ptr) AccessChain 27(data) 51 51 + 295: 21(ivec4) Load 294 + 296: 121(ivec3) VectorShuffle 295 295 0 1 2 + 297: 6(int) Load 8(invocation) + 298: 121(ivec3) GroupNonUniformShuffleXor 35 296 297 + 299: 111(ptr) AccessChain 27(data) 293 51 + 300: 21(ivec4) Load 299 + 301: 21(ivec4) VectorShuffle 300 298 4 5 6 3 + Store 299 301 + 302: 6(int) Load 8(invocation) + 303: 111(ptr) AccessChain 27(data) 62 51 + 304: 21(ivec4) Load 303 + 305: 6(int) Load 8(invocation) + 306: 21(ivec4) GroupNonUniformShuffleXor 35 304 305 + 307: 111(ptr) AccessChain 27(data) 302 51 + Store 307 306 + 308: 6(int) Load 8(invocation) + 309: 137(ptr) AccessChain 27(data) 29 62 30 + 310: 22(float) Load 309 + 311: 6(int) Load 8(invocation) + 312: 22(float) GroupNonUniformShuffleXor 35 310 311 + 313: 137(ptr) AccessChain 27(data) 308 62 30 + Store 313 312 + 314: 6(int) Load 8(invocation) + 315: 145(ptr) AccessChain 27(data) 39 62 + 316: 23(fvec4) Load 315 + 317: 144(fvec2) VectorShuffle 316 316 0 1 + 318: 6(int) Load 8(invocation) + 319: 144(fvec2) GroupNonUniformShuffleXor 35 317 318 + 320: 145(ptr) AccessChain 27(data) 314 62 + 321: 23(fvec4) Load 320 + 322: 23(fvec4) VectorShuffle 321 319 4 5 2 3 + Store 320 322 + 323: 6(int) Load 8(invocation) + 324: 145(ptr) AccessChain 27(data) 51 62 + 325: 23(fvec4) Load 324 + 326: 155(fvec3) VectorShuffle 325 325 0 1 2 + 327: 6(int) Load 8(invocation) + 328: 155(fvec3) GroupNonUniformShuffleXor 35 326 327 + 329: 145(ptr) AccessChain 27(data) 323 62 + 330: 23(fvec4) Load 329 + 331: 23(fvec4) VectorShuffle 330 328 4 5 6 3 + Store 329 331 + 332: 6(int) Load 8(invocation) + 333: 145(ptr) AccessChain 27(data) 62 62 + 334: 23(fvec4) Load 333 + 335: 6(int) Load 8(invocation) + 336: 23(fvec4) GroupNonUniformShuffleXor 35 334 335 + 337: 145(ptr) AccessChain 27(data) 332 62 + Store 337 336 + 338: 6(int) Load 8(invocation) + 339: 69(ptr) AccessChain 27(data) 29 39 30 + 340: 19(int) Load 339 + 341: 173(bool) SLessThan 340 29 + 342: 6(int) Load 8(invocation) + 343: 173(bool) GroupNonUniformShuffleXor 35 341 342 + 344: 19(int) Select 343 39 29 + 345: 69(ptr) AccessChain 27(data) 338 39 30 + Store 345 344 + 346: 6(int) Load 8(invocation) + 347: 77(ptr) AccessChain 27(data) 39 39 + 348: 20(ivec4) Load 347 + 349: 76(ivec2) VectorShuffle 348 348 0 1 + 350: 184(bvec2) SLessThan 349 183 + 351: 6(int) Load 8(invocation) + 352: 184(bvec2) GroupNonUniformShuffleXor 35 350 351 + 353: 76(ivec2) Select 352 188 183 + 354: 77(ptr) AccessChain 27(data) 346 39 + 355: 20(ivec4) Load 354 + 356: 20(ivec4) VectorShuffle 355 353 4 5 2 3 + Store 354 356 + 357: 6(int) Load 8(invocation) + 358: 77(ptr) AccessChain 27(data) 39 39 + 359: 20(ivec4) Load 358 + 360: 87(ivec3) VectorShuffle 359 359 0 1 2 + 361: 198(bvec3) SLessThan 360 197 + 362: 6(int) Load 8(invocation) + 363: 198(bvec3) GroupNonUniformShuffleXor 35 361 362 + 364: 87(ivec3) Select 363 202 197 + 365: 77(ptr) AccessChain 27(data) 357 39 + 366: 20(ivec4) Load 365 + 367: 20(ivec4) VectorShuffle 366 364 4 5 6 3 + Store 365 367 + 368: 6(int) Load 8(invocation) + 369: 77(ptr) AccessChain 27(data) 39 39 + 370: 20(ivec4) Load 369 + 371: 211(bvec4) SLessThan 370 210 + 372: 6(int) Load 8(invocation) + 373: 211(bvec4) GroupNonUniformShuffleXor 35 371 372 + 374: 20(ivec4) Select 373 215 210 + 375: 77(ptr) AccessChain 27(data) 368 39 + Store 375 374 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupShuffleRelative.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupShuffleRelative.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupShuffleRelative.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupShuffleRelative.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,462 @@ +spv.subgroupShuffleRelative.comp +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 379 + + Capability Shader + Capability Float64 + Capability GroupNonUniform + Capability GroupNonUniformShuffleRelative + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" 10 12 + ExecutionMode 4 LocalSize 8 8 1 + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_basic" + SourceExtension "GL_KHR_shader_subgroup_shuffle_relative" + Name 4 "main" + Name 8 "invocation" + Name 10 "gl_SubgroupInvocationID" + Name 12 "gl_SubgroupSize" + Name 24 "Buffers" + MemberName 24(Buffers) 0 "f4" + MemberName 24(Buffers) 1 "i4" + MemberName 24(Buffers) 2 "u4" + MemberName 24(Buffers) 3 "d4" + Name 27 "data" + Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 11 RelaxedPrecision + Decorate 12(gl_SubgroupSize) RelaxedPrecision + Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 13 RelaxedPrecision + Decorate 14 RelaxedPrecision + Decorate 16 RelaxedPrecision + MemberDecorate 24(Buffers) 0 Offset 0 + MemberDecorate 24(Buffers) 1 Offset 16 + MemberDecorate 24(Buffers) 2 Offset 32 + MemberDecorate 24(Buffers) 3 Offset 64 + Decorate 24(Buffers) BufferBlock + Decorate 27(data) DescriptorSet 0 + Decorate 27(data) Binding 0 + Decorate 378 BuiltIn WorkgroupSize + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypePointer Function 6(int) + 9: TypePointer Input 6(int) +10(gl_SubgroupInvocationID): 9(ptr) Variable Input +12(gl_SubgroupSize): 9(ptr) Variable Input + 15: 6(int) Constant 4 + 17: TypeFloat 32 + 18: TypeVector 17(float) 4 + 19: TypeInt 32 1 + 20: TypeVector 19(int) 4 + 21: TypeVector 6(int) 4 + 22: TypeFloat 64 + 23: TypeVector 22(float) 4 + 24(Buffers): TypeStruct 18(fvec4) 20(ivec4) 21(ivec4) 23(fvec4) + 25: TypeArray 24(Buffers) 15 + 26: TypePointer Uniform 25 + 27(data): 26(ptr) Variable Uniform + 29: 19(int) Constant 0 + 30: 6(int) Constant 0 + 31: TypePointer Uniform 17(float) + 35: 6(int) Constant 3 + 39: 19(int) Constant 1 + 40: TypeVector 17(float) 2 + 41: TypePointer Uniform 18(fvec4) + 51: 19(int) Constant 2 + 52: TypeVector 17(float) 3 + 62: 19(int) Constant 3 + 69: TypePointer Uniform 19(int) + 76: TypeVector 19(int) 2 + 77: TypePointer Uniform 20(ivec4) + 87: TypeVector 19(int) 3 + 103: TypePointer Uniform 6(int) + 110: TypeVector 6(int) 2 + 111: TypePointer Uniform 21(ivec4) + 121: TypeVector 6(int) 3 + 137: TypePointer Uniform 22(float) + 144: TypeVector 22(float) 2 + 145: TypePointer Uniform 23(fvec4) + 155: TypeVector 22(float) 3 + 173: TypeBool + 183: 76(ivec2) ConstantComposite 29 29 + 184: TypeVector 173(bool) 2 + 188: 76(ivec2) ConstantComposite 39 39 + 197: 87(ivec3) ConstantComposite 29 29 29 + 198: TypeVector 173(bool) 3 + 202: 87(ivec3) ConstantComposite 39 39 39 + 210: 20(ivec4) ConstantComposite 29 29 29 29 + 211: TypeVector 173(bool) 4 + 215: 20(ivec4) ConstantComposite 39 39 39 39 + 376: 6(int) Constant 8 + 377: 6(int) Constant 1 + 378: 121(ivec3) ConstantComposite 376 376 377 + 4(main): 2 Function None 3 + 5: Label + 8(invocation): 7(ptr) Variable Function + 11: 6(int) Load 10(gl_SubgroupInvocationID) + 13: 6(int) Load 12(gl_SubgroupSize) + 14: 6(int) IAdd 11 13 + 16: 6(int) UMod 14 15 + Store 8(invocation) 16 + 28: 6(int) Load 8(invocation) + 32: 31(ptr) AccessChain 27(data) 29 29 30 + 33: 17(float) Load 32 + 34: 6(int) Load 8(invocation) + 36: 17(float) GroupNonUniformShuffleUp 35 33 34 + 37: 31(ptr) AccessChain 27(data) 28 29 30 + Store 37 36 + 38: 6(int) Load 8(invocation) + 42: 41(ptr) AccessChain 27(data) 39 29 + 43: 18(fvec4) Load 42 + 44: 40(fvec2) VectorShuffle 43 43 0 1 + 45: 6(int) Load 8(invocation) + 46: 40(fvec2) GroupNonUniformShuffleUp 35 44 45 + 47: 41(ptr) AccessChain 27(data) 38 29 + 48: 18(fvec4) Load 47 + 49: 18(fvec4) VectorShuffle 48 46 4 5 2 3 + Store 47 49 + 50: 6(int) Load 8(invocation) + 53: 41(ptr) AccessChain 27(data) 51 29 + 54: 18(fvec4) Load 53 + 55: 52(fvec3) VectorShuffle 54 54 0 1 2 + 56: 6(int) Load 8(invocation) + 57: 52(fvec3) GroupNonUniformShuffleUp 35 55 56 + 58: 41(ptr) AccessChain 27(data) 50 29 + 59: 18(fvec4) Load 58 + 60: 18(fvec4) VectorShuffle 59 57 4 5 6 3 + Store 58 60 + 61: 6(int) Load 8(invocation) + 63: 41(ptr) AccessChain 27(data) 62 29 + 64: 18(fvec4) Load 63 + 65: 6(int) Load 8(invocation) + 66: 18(fvec4) GroupNonUniformShuffleUp 35 64 65 + 67: 41(ptr) AccessChain 27(data) 61 29 + Store 67 66 + 68: 6(int) Load 8(invocation) + 70: 69(ptr) AccessChain 27(data) 29 39 30 + 71: 19(int) Load 70 + 72: 6(int) Load 8(invocation) + 73: 19(int) GroupNonUniformShuffleUp 35 71 72 + 74: 69(ptr) AccessChain 27(data) 68 39 30 + Store 74 73 + 75: 6(int) Load 8(invocation) + 78: 77(ptr) AccessChain 27(data) 39 39 + 79: 20(ivec4) Load 78 + 80: 76(ivec2) VectorShuffle 79 79 0 1 + 81: 6(int) Load 8(invocation) + 82: 76(ivec2) GroupNonUniformShuffleUp 35 80 81 + 83: 77(ptr) AccessChain 27(data) 75 39 + 84: 20(ivec4) Load 83 + 85: 20(ivec4) VectorShuffle 84 82 4 5 2 3 + Store 83 85 + 86: 6(int) Load 8(invocation) + 88: 77(ptr) AccessChain 27(data) 51 39 + 89: 20(ivec4) Load 88 + 90: 87(ivec3) VectorShuffle 89 89 0 1 2 + 91: 6(int) Load 8(invocation) + 92: 87(ivec3) GroupNonUniformShuffleUp 35 90 91 + 93: 77(ptr) AccessChain 27(data) 86 39 + 94: 20(ivec4) Load 93 + 95: 20(ivec4) VectorShuffle 94 92 4 5 6 3 + Store 93 95 + 96: 6(int) Load 8(invocation) + 97: 77(ptr) AccessChain 27(data) 62 39 + 98: 20(ivec4) Load 97 + 99: 6(int) Load 8(invocation) + 100: 20(ivec4) GroupNonUniformShuffleUp 35 98 99 + 101: 77(ptr) AccessChain 27(data) 96 39 + Store 101 100 + 102: 6(int) Load 8(invocation) + 104: 103(ptr) AccessChain 27(data) 29 51 30 + 105: 6(int) Load 104 + 106: 6(int) Load 8(invocation) + 107: 6(int) GroupNonUniformShuffleUp 35 105 106 + 108: 103(ptr) AccessChain 27(data) 102 51 30 + Store 108 107 + 109: 6(int) Load 8(invocation) + 112: 111(ptr) AccessChain 27(data) 39 51 + 113: 21(ivec4) Load 112 + 114: 110(ivec2) VectorShuffle 113 113 0 1 + 115: 6(int) Load 8(invocation) + 116: 110(ivec2) GroupNonUniformShuffleUp 35 114 115 + 117: 111(ptr) AccessChain 27(data) 109 51 + 118: 21(ivec4) Load 117 + 119: 21(ivec4) VectorShuffle 118 116 4 5 2 3 + Store 117 119 + 120: 6(int) Load 8(invocation) + 122: 111(ptr) AccessChain 27(data) 51 51 + 123: 21(ivec4) Load 122 + 124: 121(ivec3) VectorShuffle 123 123 0 1 2 + 125: 6(int) Load 8(invocation) + 126: 121(ivec3) GroupNonUniformShuffleUp 35 124 125 + 127: 111(ptr) AccessChain 27(data) 120 51 + 128: 21(ivec4) Load 127 + 129: 21(ivec4) VectorShuffle 128 126 4 5 6 3 + Store 127 129 + 130: 6(int) Load 8(invocation) + 131: 111(ptr) AccessChain 27(data) 62 51 + 132: 21(ivec4) Load 131 + 133: 6(int) Load 8(invocation) + 134: 21(ivec4) GroupNonUniformShuffleUp 35 132 133 + 135: 111(ptr) AccessChain 27(data) 130 51 + Store 135 134 + 136: 6(int) Load 8(invocation) + 138: 137(ptr) AccessChain 27(data) 29 62 30 + 139: 22(float) Load 138 + 140: 6(int) Load 8(invocation) + 141: 22(float) GroupNonUniformShuffleUp 35 139 140 + 142: 137(ptr) AccessChain 27(data) 136 62 30 + Store 142 141 + 143: 6(int) Load 8(invocation) + 146: 145(ptr) AccessChain 27(data) 39 62 + 147: 23(fvec4) Load 146 + 148: 144(fvec2) VectorShuffle 147 147 0 1 + 149: 6(int) Load 8(invocation) + 150: 144(fvec2) GroupNonUniformShuffleUp 35 148 149 + 151: 145(ptr) AccessChain 27(data) 143 62 + 152: 23(fvec4) Load 151 + 153: 23(fvec4) VectorShuffle 152 150 4 5 2 3 + Store 151 153 + 154: 6(int) Load 8(invocation) + 156: 145(ptr) AccessChain 27(data) 51 62 + 157: 23(fvec4) Load 156 + 158: 155(fvec3) VectorShuffle 157 157 0 1 2 + 159: 6(int) Load 8(invocation) + 160: 155(fvec3) GroupNonUniformShuffleUp 35 158 159 + 161: 145(ptr) AccessChain 27(data) 154 62 + 162: 23(fvec4) Load 161 + 163: 23(fvec4) VectorShuffle 162 160 4 5 6 3 + Store 161 163 + 164: 6(int) Load 8(invocation) + 165: 145(ptr) AccessChain 27(data) 62 62 + 166: 23(fvec4) Load 165 + 167: 6(int) Load 8(invocation) + 168: 23(fvec4) GroupNonUniformShuffleUp 35 166 167 + 169: 145(ptr) AccessChain 27(data) 164 62 + Store 169 168 + 170: 6(int) Load 8(invocation) + 171: 69(ptr) AccessChain 27(data) 29 39 30 + 172: 19(int) Load 171 + 174: 173(bool) SLessThan 172 29 + 175: 6(int) Load 8(invocation) + 176: 173(bool) GroupNonUniformShuffleUp 35 174 175 + 177: 19(int) Select 176 39 29 + 178: 69(ptr) AccessChain 27(data) 170 39 30 + Store 178 177 + 179: 6(int) Load 8(invocation) + 180: 77(ptr) AccessChain 27(data) 39 39 + 181: 20(ivec4) Load 180 + 182: 76(ivec2) VectorShuffle 181 181 0 1 + 185: 184(bvec2) SLessThan 182 183 + 186: 6(int) Load 8(invocation) + 187: 184(bvec2) GroupNonUniformShuffleUp 35 185 186 + 189: 76(ivec2) Select 187 188 183 + 190: 77(ptr) AccessChain 27(data) 179 39 + 191: 20(ivec4) Load 190 + 192: 20(ivec4) VectorShuffle 191 189 4 5 2 3 + Store 190 192 + 193: 6(int) Load 8(invocation) + 194: 77(ptr) AccessChain 27(data) 39 39 + 195: 20(ivec4) Load 194 + 196: 87(ivec3) VectorShuffle 195 195 0 1 2 + 199: 198(bvec3) SLessThan 196 197 + 200: 6(int) Load 8(invocation) + 201: 198(bvec3) GroupNonUniformShuffleUp 35 199 200 + 203: 87(ivec3) Select 201 202 197 + 204: 77(ptr) AccessChain 27(data) 193 39 + 205: 20(ivec4) Load 204 + 206: 20(ivec4) VectorShuffle 205 203 4 5 6 3 + Store 204 206 + 207: 6(int) Load 8(invocation) + 208: 77(ptr) AccessChain 27(data) 39 39 + 209: 20(ivec4) Load 208 + 212: 211(bvec4) SLessThan 209 210 + 213: 6(int) Load 8(invocation) + 214: 211(bvec4) GroupNonUniformShuffleUp 35 212 213 + 216: 20(ivec4) Select 214 215 210 + 217: 77(ptr) AccessChain 27(data) 207 39 + Store 217 216 + 218: 6(int) Load 8(invocation) + 219: 31(ptr) AccessChain 27(data) 29 29 30 + 220: 17(float) Load 219 + 221: 6(int) Load 8(invocation) + 222: 17(float) GroupNonUniformShuffleDown 35 220 221 + 223: 31(ptr) AccessChain 27(data) 218 29 30 + Store 223 222 + 224: 6(int) Load 8(invocation) + 225: 41(ptr) AccessChain 27(data) 39 29 + 226: 18(fvec4) Load 225 + 227: 40(fvec2) VectorShuffle 226 226 0 1 + 228: 6(int) Load 8(invocation) + 229: 40(fvec2) GroupNonUniformShuffleDown 35 227 228 + 230: 41(ptr) AccessChain 27(data) 224 29 + 231: 18(fvec4) Load 230 + 232: 18(fvec4) VectorShuffle 231 229 4 5 2 3 + Store 230 232 + 233: 6(int) Load 8(invocation) + 234: 41(ptr) AccessChain 27(data) 51 29 + 235: 18(fvec4) Load 234 + 236: 52(fvec3) VectorShuffle 235 235 0 1 2 + 237: 6(int) Load 8(invocation) + 238: 52(fvec3) GroupNonUniformShuffleDown 35 236 237 + 239: 41(ptr) AccessChain 27(data) 233 29 + 240: 18(fvec4) Load 239 + 241: 18(fvec4) VectorShuffle 240 238 4 5 6 3 + Store 239 241 + 242: 6(int) Load 8(invocation) + 243: 41(ptr) AccessChain 27(data) 62 29 + 244: 18(fvec4) Load 243 + 245: 6(int) Load 8(invocation) + 246: 18(fvec4) GroupNonUniformShuffleDown 35 244 245 + 247: 41(ptr) AccessChain 27(data) 242 29 + Store 247 246 + 248: 6(int) Load 8(invocation) + 249: 69(ptr) AccessChain 27(data) 29 39 30 + 250: 19(int) Load 249 + 251: 6(int) Load 8(invocation) + 252: 19(int) GroupNonUniformShuffleDown 35 250 251 + 253: 69(ptr) AccessChain 27(data) 248 39 30 + Store 253 252 + 254: 6(int) Load 8(invocation) + 255: 77(ptr) AccessChain 27(data) 39 39 + 256: 20(ivec4) Load 255 + 257: 76(ivec2) VectorShuffle 256 256 0 1 + 258: 6(int) Load 8(invocation) + 259: 76(ivec2) GroupNonUniformShuffleDown 35 257 258 + 260: 77(ptr) AccessChain 27(data) 254 39 + 261: 20(ivec4) Load 260 + 262: 20(ivec4) VectorShuffle 261 259 4 5 2 3 + Store 260 262 + 263: 6(int) Load 8(invocation) + 264: 77(ptr) AccessChain 27(data) 51 39 + 265: 20(ivec4) Load 264 + 266: 87(ivec3) VectorShuffle 265 265 0 1 2 + 267: 6(int) Load 8(invocation) + 268: 87(ivec3) GroupNonUniformShuffleDown 35 266 267 + 269: 77(ptr) AccessChain 27(data) 263 39 + 270: 20(ivec4) Load 269 + 271: 20(ivec4) VectorShuffle 270 268 4 5 6 3 + Store 269 271 + 272: 6(int) Load 8(invocation) + 273: 77(ptr) AccessChain 27(data) 62 39 + 274: 20(ivec4) Load 273 + 275: 6(int) Load 8(invocation) + 276: 20(ivec4) GroupNonUniformShuffleDown 35 274 275 + 277: 77(ptr) AccessChain 27(data) 272 39 + Store 277 276 + 278: 6(int) Load 8(invocation) + 279: 103(ptr) AccessChain 27(data) 29 51 30 + 280: 6(int) Load 279 + 281: 6(int) Load 8(invocation) + 282: 6(int) GroupNonUniformShuffleDown 35 280 281 + 283: 103(ptr) AccessChain 27(data) 278 51 30 + Store 283 282 + 284: 6(int) Load 8(invocation) + 285: 111(ptr) AccessChain 27(data) 39 51 + 286: 21(ivec4) Load 285 + 287: 110(ivec2) VectorShuffle 286 286 0 1 + 288: 6(int) Load 8(invocation) + 289: 110(ivec2) GroupNonUniformShuffleDown 35 287 288 + 290: 111(ptr) AccessChain 27(data) 284 51 + 291: 21(ivec4) Load 290 + 292: 21(ivec4) VectorShuffle 291 289 4 5 2 3 + Store 290 292 + 293: 6(int) Load 8(invocation) + 294: 111(ptr) AccessChain 27(data) 51 51 + 295: 21(ivec4) Load 294 + 296: 121(ivec3) VectorShuffle 295 295 0 1 2 + 297: 6(int) Load 8(invocation) + 298: 121(ivec3) GroupNonUniformShuffleDown 35 296 297 + 299: 111(ptr) AccessChain 27(data) 293 51 + 300: 21(ivec4) Load 299 + 301: 21(ivec4) VectorShuffle 300 298 4 5 6 3 + Store 299 301 + 302: 6(int) Load 8(invocation) + 303: 111(ptr) AccessChain 27(data) 62 51 + 304: 21(ivec4) Load 303 + 305: 6(int) Load 8(invocation) + 306: 21(ivec4) GroupNonUniformShuffleDown 35 304 305 + 307: 111(ptr) AccessChain 27(data) 302 51 + Store 307 306 + 308: 6(int) Load 8(invocation) + 309: 137(ptr) AccessChain 27(data) 29 62 30 + 310: 22(float) Load 309 + 311: 6(int) Load 8(invocation) + 312: 22(float) GroupNonUniformShuffleDown 35 310 311 + 313: 137(ptr) AccessChain 27(data) 308 62 30 + Store 313 312 + 314: 6(int) Load 8(invocation) + 315: 145(ptr) AccessChain 27(data) 39 62 + 316: 23(fvec4) Load 315 + 317: 144(fvec2) VectorShuffle 316 316 0 1 + 318: 6(int) Load 8(invocation) + 319: 144(fvec2) GroupNonUniformShuffleDown 35 317 318 + 320: 145(ptr) AccessChain 27(data) 314 62 + 321: 23(fvec4) Load 320 + 322: 23(fvec4) VectorShuffle 321 319 4 5 2 3 + Store 320 322 + 323: 6(int) Load 8(invocation) + 324: 145(ptr) AccessChain 27(data) 51 62 + 325: 23(fvec4) Load 324 + 326: 155(fvec3) VectorShuffle 325 325 0 1 2 + 327: 6(int) Load 8(invocation) + 328: 155(fvec3) GroupNonUniformShuffleDown 35 326 327 + 329: 145(ptr) AccessChain 27(data) 323 62 + 330: 23(fvec4) Load 329 + 331: 23(fvec4) VectorShuffle 330 328 4 5 6 3 + Store 329 331 + 332: 6(int) Load 8(invocation) + 333: 145(ptr) AccessChain 27(data) 62 62 + 334: 23(fvec4) Load 333 + 335: 6(int) Load 8(invocation) + 336: 23(fvec4) GroupNonUniformShuffleDown 35 334 335 + 337: 145(ptr) AccessChain 27(data) 332 62 + Store 337 336 + 338: 6(int) Load 8(invocation) + 339: 69(ptr) AccessChain 27(data) 29 39 30 + 340: 19(int) Load 339 + 341: 173(bool) SLessThan 340 29 + 342: 6(int) Load 8(invocation) + 343: 173(bool) GroupNonUniformShuffleDown 35 341 342 + 344: 19(int) Select 343 39 29 + 345: 69(ptr) AccessChain 27(data) 338 39 30 + Store 345 344 + 346: 6(int) Load 8(invocation) + 347: 77(ptr) AccessChain 27(data) 39 39 + 348: 20(ivec4) Load 347 + 349: 76(ivec2) VectorShuffle 348 348 0 1 + 350: 184(bvec2) SLessThan 349 183 + 351: 6(int) Load 8(invocation) + 352: 184(bvec2) GroupNonUniformShuffleDown 35 350 351 + 353: 76(ivec2) Select 352 188 183 + 354: 77(ptr) AccessChain 27(data) 346 39 + 355: 20(ivec4) Load 354 + 356: 20(ivec4) VectorShuffle 355 353 4 5 2 3 + Store 354 356 + 357: 6(int) Load 8(invocation) + 358: 77(ptr) AccessChain 27(data) 39 39 + 359: 20(ivec4) Load 358 + 360: 87(ivec3) VectorShuffle 359 359 0 1 2 + 361: 198(bvec3) SLessThan 360 197 + 362: 6(int) Load 8(invocation) + 363: 198(bvec3) GroupNonUniformShuffleDown 35 361 362 + 364: 87(ivec3) Select 363 202 197 + 365: 77(ptr) AccessChain 27(data) 357 39 + 366: 20(ivec4) Load 365 + 367: 20(ivec4) VectorShuffle 366 364 4 5 6 3 + Store 365 367 + 368: 6(int) Load 8(invocation) + 369: 77(ptr) AccessChain 27(data) 39 39 + 370: 20(ivec4) Load 369 + 371: 211(bvec4) SLessThan 370 210 + 372: 6(int) Load 8(invocation) + 373: 211(bvec4) GroupNonUniformShuffleDown 35 371 372 + 374: 20(ivec4) Select 373 215 210 + 375: 77(ptr) AccessChain 27(data) 368 39 + Store 375 374 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroup.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroup.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroup.tesc.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroup.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,59 @@ +spv.subgroup.tesc +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 26 + + Capability Tessellation + Capability GroupNonUniform + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint TessellationControl 4 "main" 15 18 20 + ExecutionMode 4 OutputVertices 1 + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_basic" + Name 4 "main" + Name 9 "Output" + MemberName 9(Output) 0 "result" + Name 11 "" + Name 15 "gl_PrimitiveID" + Name 18 "gl_SubgroupSize" + Name 20 "gl_SubgroupInvocationID" + Decorate 8 ArrayStride 16 + MemberDecorate 9(Output) 0 Offset 0 + Decorate 9(Output) BufferBlock + Decorate 11 DescriptorSet 0 + Decorate 11 Binding 0 + Decorate 15(gl_PrimitiveID) BuiltIn PrimitiveId + Decorate 18(gl_SubgroupSize) RelaxedPrecision + Decorate 18(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 19 RelaxedPrecision + Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 21 RelaxedPrecision + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypeVector 6(int) 4 + 8: TypeRuntimeArray 7(ivec4) + 9(Output): TypeStruct 8 + 10: TypePointer Uniform 9(Output) + 11: 10(ptr) Variable Uniform + 12: TypeInt 32 1 + 13: 12(int) Constant 0 + 14: TypePointer Input 12(int) +15(gl_PrimitiveID): 14(ptr) Variable Input + 17: TypePointer Input 6(int) +18(gl_SubgroupSize): 17(ptr) Variable Input +20(gl_SubgroupInvocationID): 17(ptr) Variable Input + 22: 6(int) Constant 0 + 24: TypePointer Uniform 7(ivec4) + 4(main): 2 Function None 3 + 5: Label + 16: 12(int) Load 15(gl_PrimitiveID) + 19: 6(int) Load 18(gl_SubgroupSize) + 21: 6(int) Load 20(gl_SubgroupInvocationID) + 23: 7(ivec4) CompositeConstruct 19 21 22 22 + 25: 24(ptr) AccessChain 11 13 16 + Store 25 23 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroup.tese.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroup.tese.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroup.tese.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroup.tese.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,61 @@ +spv.subgroup.tese +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 26 + + Capability Tessellation + Capability GroupNonUniform + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint TessellationEvaluation 4 "main" 15 18 20 + ExecutionMode 4 Isolines + ExecutionMode 4 SpacingEqual + ExecutionMode 4 VertexOrderCcw + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_basic" + Name 4 "main" + Name 9 "Output" + MemberName 9(Output) 0 "result" + Name 11 "" + Name 15 "gl_PrimitiveID" + Name 18 "gl_SubgroupSize" + Name 20 "gl_SubgroupInvocationID" + Decorate 8 ArrayStride 16 + MemberDecorate 9(Output) 0 Offset 0 + Decorate 9(Output) BufferBlock + Decorate 11 DescriptorSet 0 + Decorate 11 Binding 0 + Decorate 15(gl_PrimitiveID) BuiltIn PrimitiveId + Decorate 18(gl_SubgroupSize) RelaxedPrecision + Decorate 18(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 19 RelaxedPrecision + Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 21 RelaxedPrecision + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypeVector 6(int) 4 + 8: TypeRuntimeArray 7(ivec4) + 9(Output): TypeStruct 8 + 10: TypePointer Uniform 9(Output) + 11: 10(ptr) Variable Uniform + 12: TypeInt 32 1 + 13: 12(int) Constant 0 + 14: TypePointer Input 12(int) +15(gl_PrimitiveID): 14(ptr) Variable Input + 17: TypePointer Input 6(int) +18(gl_SubgroupSize): 17(ptr) Variable Input +20(gl_SubgroupInvocationID): 17(ptr) Variable Input + 22: 6(int) Constant 0 + 24: TypePointer Uniform 7(ivec4) + 4(main): 2 Function None 3 + 5: Label + 16: 12(int) Load 15(gl_PrimitiveID) + 19: 6(int) Load 18(gl_SubgroupSize) + 21: 6(int) Load 20(gl_SubgroupInvocationID) + 23: 7(ivec4) CompositeConstruct 19 21 22 22 + 25: 24(ptr) AccessChain 11 13 16 + Store 25 23 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroup.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroup.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroup.vert.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroup.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,58 @@ +spv.subgroup.vert +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 26 + + Capability Shader + Capability GroupNonUniform + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Vertex 4 "main" 15 18 20 + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_basic" + Name 4 "main" + Name 9 "Output" + MemberName 9(Output) 0 "result" + Name 11 "" + Name 15 "gl_VertexIndex" + Name 18 "gl_SubgroupSize" + Name 20 "gl_SubgroupInvocationID" + Decorate 8 ArrayStride 16 + MemberDecorate 9(Output) 0 Offset 0 + Decorate 9(Output) BufferBlock + Decorate 11 DescriptorSet 0 + Decorate 11 Binding 0 + Decorate 15(gl_VertexIndex) BuiltIn VertexIndex + Decorate 18(gl_SubgroupSize) RelaxedPrecision + Decorate 18(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 19 RelaxedPrecision + Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 21 RelaxedPrecision + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypeVector 6(int) 4 + 8: TypeRuntimeArray 7(ivec4) + 9(Output): TypeStruct 8 + 10: TypePointer Uniform 9(Output) + 11: 10(ptr) Variable Uniform + 12: TypeInt 32 1 + 13: 12(int) Constant 0 + 14: TypePointer Input 12(int) +15(gl_VertexIndex): 14(ptr) Variable Input + 17: TypePointer Input 6(int) +18(gl_SubgroupSize): 17(ptr) Variable Input +20(gl_SubgroupInvocationID): 17(ptr) Variable Input + 22: 6(int) Constant 0 + 24: TypePointer Uniform 7(ivec4) + 4(main): 2 Function None 3 + 5: Label + 16: 12(int) Load 15(gl_VertexIndex) + 19: 6(int) Load 18(gl_SubgroupSize) + 21: 6(int) Load 20(gl_SubgroupInvocationID) + 23: 7(ivec4) CompositeConstruct 19 21 22 22 + 25: 24(ptr) AccessChain 11 13 16 + Store 25 23 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupVote.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupVote.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subgroupVote.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subgroupVote.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,288 @@ +spv.subgroupVote.comp +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 216 + + Capability Shader + Capability Float64 + Capability GroupNonUniform + Capability GroupNonUniformVote + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" 10 12 + ExecutionMode 4 LocalSize 8 8 1 + Source GLSL 450 + SourceExtension "GL_KHR_shader_subgroup_basic" + SourceExtension "GL_KHR_shader_subgroup_vote" + Name 4 "main" + Name 8 "invocation" + Name 10 "gl_SubgroupInvocationID" + Name 12 "gl_SubgroupSize" + Name 24 "Buffers" + MemberName 24(Buffers) 0 "f4" + MemberName 24(Buffers) 1 "i4" + MemberName 24(Buffers) 2 "u4" + MemberName 24(Buffers) 3 "d4" + MemberName 24(Buffers) 4 "r" + Name 27 "data" + Decorate 10(gl_SubgroupInvocationID) RelaxedPrecision + Decorate 10(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId + Decorate 11 RelaxedPrecision + Decorate 12(gl_SubgroupSize) RelaxedPrecision + Decorate 12(gl_SubgroupSize) BuiltIn SubgroupSize + Decorate 13 RelaxedPrecision + Decorate 14 RelaxedPrecision + Decorate 16 RelaxedPrecision + MemberDecorate 24(Buffers) 0 Offset 0 + MemberDecorate 24(Buffers) 1 Offset 16 + MemberDecorate 24(Buffers) 2 Offset 32 + MemberDecorate 24(Buffers) 3 Offset 64 + MemberDecorate 24(Buffers) 4 Offset 96 + Decorate 24(Buffers) BufferBlock + Decorate 27(data) DescriptorSet 0 + Decorate 27(data) Binding 0 + Decorate 215 BuiltIn WorkgroupSize + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypePointer Function 6(int) + 9: TypePointer Input 6(int) +10(gl_SubgroupInvocationID): 9(ptr) Variable Input +12(gl_SubgroupSize): 9(ptr) Variable Input + 15: 6(int) Constant 4 + 17: TypeFloat 32 + 18: TypeVector 17(float) 4 + 19: TypeInt 32 1 + 20: TypeVector 19(int) 4 + 21: TypeVector 6(int) 4 + 22: TypeFloat 64 + 23: TypeVector 22(float) 4 + 24(Buffers): TypeStruct 18(fvec4) 20(ivec4) 21(ivec4) 23(fvec4) 19(int) + 25: TypeArray 24(Buffers) 15 + 26: TypePointer Uniform 25 + 27(data): 26(ptr) Variable Uniform + 29: 19(int) Constant 4 + 30: TypePointer Uniform 19(int) + 33: 19(int) Constant 0 + 34: TypeBool + 36: 6(int) Constant 3 + 41: 6(int) Constant 0 + 42: TypePointer Uniform 17(float) + 46: 19(int) Constant 1 + 50: TypeVector 17(float) 2 + 51: TypePointer Uniform 18(fvec4) + 59: 19(int) Constant 2 + 60: TypeVector 17(float) 3 + 68: 19(int) Constant 3 + 81: TypeVector 19(int) 2 + 82: TypePointer Uniform 20(ivec4) + 90: TypeVector 19(int) 3 + 104: TypePointer Uniform 6(int) + 111: TypeVector 6(int) 2 + 112: TypePointer Uniform 21(ivec4) + 120: TypeVector 6(int) 3 + 142: TypePointer Uniform 22(float) + 149: TypeVector 22(float) 2 + 150: TypePointer Uniform 23(fvec4) + 158: TypeVector 22(float) 3 + 182: 81(ivec2) ConstantComposite 33 33 + 183: TypeVector 34(bool) 2 + 194: 90(ivec3) ConstantComposite 33 33 33 + 195: TypeVector 34(bool) 3 + 205: 20(ivec4) ConstantComposite 33 33 33 33 + 206: TypeVector 34(bool) 4 + 213: 6(int) Constant 8 + 214: 6(int) Constant 1 + 215: 120(ivec3) ConstantComposite 213 213 214 + 4(main): 2 Function None 3 + 5: Label + 8(invocation): 7(ptr) Variable Function + 11: 6(int) Load 10(gl_SubgroupInvocationID) + 13: 6(int) Load 12(gl_SubgroupSize) + 14: 6(int) IAdd 11 13 + 16: 6(int) UMod 14 15 + Store 8(invocation) 16 + 28: 6(int) Load 8(invocation) + 31: 30(ptr) AccessChain 27(data) 28 29 + 32: 19(int) Load 31 + 35: 34(bool) SLessThan 32 33 + 37: 34(bool) GroupNonUniformAll 36 35 + SelectionMerge 39 None + BranchConditional 37 38 133 + 38: Label + 40: 6(int) Load 8(invocation) + 43: 42(ptr) AccessChain 27(data) 33 33 41 + 44: 17(float) Load 43 + 45: 34(bool) GroupNonUniformAllEqual 36 44 + 47: 19(int) Select 45 46 33 + 48: 30(ptr) AccessChain 27(data) 40 29 + Store 48 47 + 49: 6(int) Load 8(invocation) + 52: 51(ptr) AccessChain 27(data) 46 33 + 53: 18(fvec4) Load 52 + 54: 50(fvec2) VectorShuffle 53 53 0 1 + 55: 34(bool) GroupNonUniformAllEqual 36 54 + 56: 19(int) Select 55 46 33 + 57: 30(ptr) AccessChain 27(data) 49 29 + Store 57 56 + 58: 6(int) Load 8(invocation) + 61: 51(ptr) AccessChain 27(data) 59 33 + 62: 18(fvec4) Load 61 + 63: 60(fvec3) VectorShuffle 62 62 0 1 2 + 64: 34(bool) GroupNonUniformAllEqual 36 63 + 65: 19(int) Select 64 46 33 + 66: 30(ptr) AccessChain 27(data) 58 29 + Store 66 65 + 67: 6(int) Load 8(invocation) + 69: 51(ptr) AccessChain 27(data) 68 33 + 70: 18(fvec4) Load 69 + 71: 34(bool) GroupNonUniformAllEqual 36 70 + 72: 19(int) Select 71 46 33 + 73: 30(ptr) AccessChain 27(data) 67 29 + Store 73 72 + 74: 6(int) Load 8(invocation) + 75: 30(ptr) AccessChain 27(data) 33 46 41 + 76: 19(int) Load 75 + 77: 34(bool) GroupNonUniformAllEqual 36 76 + 78: 19(int) Select 77 46 33 + 79: 30(ptr) AccessChain 27(data) 74 29 + Store 79 78 + 80: 6(int) Load 8(invocation) + 83: 82(ptr) AccessChain 27(data) 46 46 + 84: 20(ivec4) Load 83 + 85: 81(ivec2) VectorShuffle 84 84 0 1 + 86: 34(bool) GroupNonUniformAllEqual 36 85 + 87: 19(int) Select 86 46 33 + 88: 30(ptr) AccessChain 27(data) 80 29 + Store 88 87 + 89: 6(int) Load 8(invocation) + 91: 82(ptr) AccessChain 27(data) 59 46 + 92: 20(ivec4) Load 91 + 93: 90(ivec3) VectorShuffle 92 92 0 1 2 + 94: 34(bool) GroupNonUniformAllEqual 36 93 + 95: 19(int) Select 94 46 33 + 96: 30(ptr) AccessChain 27(data) 89 29 + Store 96 95 + 97: 6(int) Load 8(invocation) + 98: 82(ptr) AccessChain 27(data) 68 46 + 99: 20(ivec4) Load 98 + 100: 34(bool) GroupNonUniformAllEqual 36 99 + 101: 19(int) Select 100 46 33 + 102: 30(ptr) AccessChain 27(data) 97 29 + Store 102 101 + 103: 6(int) Load 8(invocation) + 105: 104(ptr) AccessChain 27(data) 33 59 41 + 106: 6(int) Load 105 + 107: 34(bool) GroupNonUniformAllEqual 36 106 + 108: 19(int) Select 107 46 33 + 109: 30(ptr) AccessChain 27(data) 103 29 + Store 109 108 + 110: 6(int) Load 8(invocation) + 113: 112(ptr) AccessChain 27(data) 46 59 + 114: 21(ivec4) Load 113 + 115: 111(ivec2) VectorShuffle 114 114 0 1 + 116: 34(bool) GroupNonUniformAllEqual 36 115 + 117: 19(int) Select 116 46 33 + 118: 30(ptr) AccessChain 27(data) 110 29 + Store 118 117 + 119: 6(int) Load 8(invocation) + 121: 112(ptr) AccessChain 27(data) 59 59 + 122: 21(ivec4) Load 121 + 123: 120(ivec3) VectorShuffle 122 122 0 1 2 + 124: 34(bool) GroupNonUniformAllEqual 36 123 + 125: 19(int) Select 124 46 33 + 126: 30(ptr) AccessChain 27(data) 119 29 + Store 126 125 + 127: 6(int) Load 8(invocation) + 128: 112(ptr) AccessChain 27(data) 68 59 + 129: 21(ivec4) Load 128 + 130: 34(bool) GroupNonUniformAllEqual 36 129 + 131: 19(int) Select 130 46 33 + 132: 30(ptr) AccessChain 27(data) 127 29 + Store 132 131 + Branch 39 + 133: Label + 134: 6(int) Load 8(invocation) + 135: 30(ptr) AccessChain 27(data) 134 29 + 136: 19(int) Load 135 + 137: 34(bool) SLessThan 136 33 + 138: 34(bool) GroupNonUniformAny 36 137 + SelectionMerge 140 None + BranchConditional 138 139 140 + 139: Label + 141: 6(int) Load 8(invocation) + 143: 142(ptr) AccessChain 27(data) 33 68 41 + 144: 22(float) Load 143 + 145: 34(bool) GroupNonUniformAllEqual 36 144 + 146: 19(int) Select 145 46 33 + 147: 30(ptr) AccessChain 27(data) 141 29 + Store 147 146 + 148: 6(int) Load 8(invocation) + 151: 150(ptr) AccessChain 27(data) 46 68 + 152: 23(fvec4) Load 151 + 153: 149(fvec2) VectorShuffle 152 152 0 1 + 154: 34(bool) GroupNonUniformAllEqual 36 153 + 155: 19(int) Select 154 46 33 + 156: 30(ptr) AccessChain 27(data) 148 29 + Store 156 155 + 157: 6(int) Load 8(invocation) + 159: 150(ptr) AccessChain 27(data) 59 68 + 160: 23(fvec4) Load 159 + 161: 158(fvec3) VectorShuffle 160 160 0 1 2 + 162: 34(bool) GroupNonUniformAllEqual 36 161 + 163: 19(int) Select 162 46 33 + 164: 30(ptr) AccessChain 27(data) 157 29 + Store 164 163 + 165: 6(int) Load 8(invocation) + 166: 150(ptr) AccessChain 27(data) 68 68 + 167: 23(fvec4) Load 166 + 168: 34(bool) GroupNonUniformAllEqual 36 167 + 169: 19(int) Select 168 46 33 + 170: 30(ptr) AccessChain 27(data) 165 29 + Store 170 169 + 171: 6(int) Load 8(invocation) + 172: 30(ptr) AccessChain 27(data) 33 46 41 + 173: 19(int) Load 172 + 174: 34(bool) SLessThan 173 33 + 175: 34(bool) GroupNonUniformAllEqual 36 174 + 176: 19(int) Select 175 46 33 + 177: 30(ptr) AccessChain 27(data) 171 29 + Store 177 176 + 178: 6(int) Load 8(invocation) + 179: 82(ptr) AccessChain 27(data) 46 46 + 180: 20(ivec4) Load 179 + 181: 81(ivec2) VectorShuffle 180 180 0 1 + 184: 183(bvec2) SLessThan 181 182 + 185: 34(bool) GroupNonUniformAllEqual 36 184 + 186: 19(int) Select 185 46 33 + 187: 81(ivec2) CompositeConstruct 186 186 + 188: 19(int) CompositeExtract 187 0 + 189: 30(ptr) AccessChain 27(data) 178 29 + Store 189 188 + 190: 6(int) Load 8(invocation) + 191: 82(ptr) AccessChain 27(data) 46 46 + 192: 20(ivec4) Load 191 + 193: 90(ivec3) VectorShuffle 192 192 0 1 2 + 196: 195(bvec3) SLessThan 193 194 + 197: 34(bool) GroupNonUniformAllEqual 36 196 + 198: 19(int) Select 197 46 33 + 199: 90(ivec3) CompositeConstruct 198 198 198 + 200: 19(int) CompositeExtract 199 0 + 201: 30(ptr) AccessChain 27(data) 190 29 + Store 201 200 + 202: 6(int) Load 8(invocation) + 203: 82(ptr) AccessChain 27(data) 46 46 + 204: 20(ivec4) Load 203 + 207: 206(bvec4) SLessThan 204 205 + 208: 34(bool) GroupNonUniformAllEqual 36 207 + 209: 19(int) Select 208 46 33 + 210: 20(ivec4) CompositeConstruct 209 209 209 209 + 211: 19(int) CompositeExtract 210 0 + 212: 30(ptr) AccessChain 27(data) 202 29 + Store 212 211 + Branch 140 + 140: Label + Branch 39 + 39: Label + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subpass.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subpass.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.subpass.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.subpass.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.subpass.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 67 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.switch.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.switch.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.switch.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.switch.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -4,7 +4,7 @@ WARNING: 0:139: 'switch' : last case/default label not followed by statements // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 269 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.swizzle.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.swizzle.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.swizzle.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.swizzle.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.swizzle.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 108 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.swizzleInversion.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.swizzleInversion.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.swizzleInversion.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.swizzleInversion.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.swizzleInversion.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 46 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.test.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.test.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.test.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.test.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.test.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 55 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.test.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.test.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.test.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.test.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -2,7 +2,7 @@ WARNING: 0:5: attribute deprecated in version 130; may be removed in future release // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 24 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.textureBuffer.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.textureBuffer.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.textureBuffer.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.textureBuffer.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.textureBuffer.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 42 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.texture.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.texture.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.texture.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.texture.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -4,7 +4,7 @@ WARNING: 0:12: varying deprecated in version 130; may be removed in future release // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 305 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.textureGatherBiasLod.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.textureGatherBiasLod.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.textureGatherBiasLod.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.textureGatherBiasLod.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.textureGatherBiasLod.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 298 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.texture.sampler.transform.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.texture.sampler.transform.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.texture.sampler.transform.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.texture.sampler.transform.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.texture.sampler.transform.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 20 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.texture.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.texture.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.texture.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.texture.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.texture.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 150 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.types.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.types.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.types.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.types.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,12 @@ spv.types.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 260 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 91 93 100 102 109 111 118 120 127 129 136 138 145 147 154 156 160 + EntryPoint Fragment 4 "main" 96 98 105 107 114 116 123 125 132 134 141 143 150 152 159 161 165 ExecutionMode 4 OriginUpperLeft Source GLSL 140 Name 4 "main" @@ -15,47 +15,47 @@ Name 12 "i_b" Name 17 "b2" Name 19 "u_b2" - Name 22 "i_b2" - Name 35 "b3" - Name 37 "u_b3" - Name 40 "i_b3" - Name 59 "b4" - Name 61 "u_b4" - Name 64 "i_b4" - Name 89 "i" - Name 91 "u_i" - Name 93 "i_i" - Name 98 "i2" - Name 100 "u_i2" - Name 102 "i_i2" - Name 107 "i3" - Name 109 "u_i3" - Name 111 "i_i3" - Name 116 "i4" - Name 118 "u_i4" - Name 120 "i_i4" - Name 125 "f" - Name 127 "u_f" - Name 129 "i_f" - Name 134 "f2" - Name 136 "u_f2" - Name 138 "i_f2" - Name 143 "f3" - Name 145 "u_f3" - Name 147 "i_f3" - Name 152 "f4" - Name 154 "u_f4" - Name 156 "i_f4" - Name 160 "gl_FragColor" - Decorate 91(u_i) Flat - Decorate 93(i_i) Flat - Decorate 100(u_i2) Flat - Decorate 102(i_i2) Flat - Decorate 109(u_i3) Flat - Decorate 111(i_i3) Flat - Decorate 118(u_i4) Flat - Decorate 120(i_i4) Flat - Decorate 160(gl_FragColor) Location 0 + Name 24 "i_b2" + Name 38 "b3" + Name 40 "u_b3" + Name 43 "i_b3" + Name 63 "b4" + Name 65 "u_b4" + Name 68 "i_b4" + Name 94 "i" + Name 96 "u_i" + Name 98 "i_i" + Name 103 "i2" + Name 105 "u_i2" + Name 107 "i_i2" + Name 112 "i3" + Name 114 "u_i3" + Name 116 "i_i3" + Name 121 "i4" + Name 123 "u_i4" + Name 125 "i_i4" + Name 130 "f" + Name 132 "u_f" + Name 134 "i_f" + Name 139 "f2" + Name 141 "u_f2" + Name 143 "i_f2" + Name 148 "f3" + Name 150 "u_f3" + Name 152 "i_f3" + Name 157 "f4" + Name 159 "u_f4" + Name 161 "i_f4" + Name 165 "gl_FragColor" + Decorate 96(u_i) Flat + Decorate 98(i_i) Flat + Decorate 105(u_i2) Flat + Decorate 107(i_i2) Flat + Decorate 114(u_i3) Flat + Decorate 116(i_i3) Flat + Decorate 123(u_i4) Flat + Decorate 125(i_i4) Flat + Decorate 165(gl_FragColor) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeBool @@ -67,271 +67,271 @@ 16: TypePointer Function 15(bvec2) 18: TypePointer Private 15(bvec2) 19(u_b2): 18(ptr) Variable Private - 22(i_b2): 18(ptr) Variable Private - 33: TypeVector 6(bool) 3 - 34: TypePointer Function 33(bvec3) - 36: TypePointer Private 33(bvec3) - 37(u_b3): 36(ptr) Variable Private - 40(i_b3): 36(ptr) Variable Private - 57: TypeVector 6(bool) 4 - 58: TypePointer Function 57(bvec4) - 60: TypePointer Private 57(bvec4) - 61(u_b4): 60(ptr) Variable Private - 64(i_b4): 60(ptr) Variable Private - 87: TypeInt 32 1 - 88: TypePointer Function 87(int) - 90: TypePointer Input 87(int) - 91(u_i): 90(ptr) Variable Input - 93(i_i): 90(ptr) Variable Input - 96: TypeVector 87(int) 2 - 97: TypePointer Function 96(ivec2) - 99: TypePointer Input 96(ivec2) - 100(u_i2): 99(ptr) Variable Input - 102(i_i2): 99(ptr) Variable Input - 105: TypeVector 87(int) 3 - 106: TypePointer Function 105(ivec3) - 108: TypePointer Input 105(ivec3) - 109(u_i3): 108(ptr) Variable Input - 111(i_i3): 108(ptr) Variable Input - 114: TypeVector 87(int) 4 - 115: TypePointer Function 114(ivec4) - 117: TypePointer Input 114(ivec4) - 118(u_i4): 117(ptr) Variable Input - 120(i_i4): 117(ptr) Variable Input - 123: TypeFloat 32 - 124: TypePointer Function 123(float) - 126: TypePointer Input 123(float) - 127(u_f): 126(ptr) Variable Input - 129(i_f): 126(ptr) Variable Input - 132: TypeVector 123(float) 2 - 133: TypePointer Function 132(fvec2) - 135: TypePointer Input 132(fvec2) - 136(u_f2): 135(ptr) Variable Input - 138(i_f2): 135(ptr) Variable Input - 141: TypeVector 123(float) 3 - 142: TypePointer Function 141(fvec3) - 144: TypePointer Input 141(fvec3) - 145(u_f3): 144(ptr) Variable Input - 147(i_f3): 144(ptr) Variable Input - 150: TypeVector 123(float) 4 - 151: TypePointer Function 150(fvec4) - 153: TypePointer Input 150(fvec4) - 154(u_f4): 153(ptr) Variable Input - 156(i_f4): 153(ptr) Variable Input - 159: TypePointer Output 150(fvec4) -160(gl_FragColor): 159(ptr) Variable Output - 193: TypeInt 32 0 - 194: 193(int) Constant 0 - 198: 193(int) Constant 1 - 208: 193(int) Constant 2 - 221: 193(int) Constant 3 - 257: 123(float) Constant 1065353216 - 258: 150(fvec4) ConstantComposite 257 257 257 257 + 20: TypeInt 32 0 + 21: 20(int) Constant 0 + 24(i_b2): 18(ptr) Variable Private + 28: 20(int) Constant 1 + 36: TypeVector 6(bool) 3 + 37: TypePointer Function 36(bvec3) + 39: TypePointer Private 36(bvec3) + 40(u_b3): 39(ptr) Variable Private + 43(i_b3): 39(ptr) Variable Private + 53: 20(int) Constant 2 + 61: TypeVector 6(bool) 4 + 62: TypePointer Function 61(bvec4) + 64: TypePointer Private 61(bvec4) + 65(u_b4): 64(ptr) Variable Private + 68(i_b4): 64(ptr) Variable Private + 84: 20(int) Constant 3 + 92: TypeInt 32 1 + 93: TypePointer Function 92(int) + 95: TypePointer Input 92(int) + 96(u_i): 95(ptr) Variable Input + 98(i_i): 95(ptr) Variable Input + 101: TypeVector 92(int) 2 + 102: TypePointer Function 101(ivec2) + 104: TypePointer Input 101(ivec2) + 105(u_i2): 104(ptr) Variable Input + 107(i_i2): 104(ptr) Variable Input + 110: TypeVector 92(int) 3 + 111: TypePointer Function 110(ivec3) + 113: TypePointer Input 110(ivec3) + 114(u_i3): 113(ptr) Variable Input + 116(i_i3): 113(ptr) Variable Input + 119: TypeVector 92(int) 4 + 120: TypePointer Function 119(ivec4) + 122: TypePointer Input 119(ivec4) + 123(u_i4): 122(ptr) Variable Input + 125(i_i4): 122(ptr) Variable Input + 128: TypeFloat 32 + 129: TypePointer Function 128(float) + 131: TypePointer Input 128(float) + 132(u_f): 131(ptr) Variable Input + 134(i_f): 131(ptr) Variable Input + 137: TypeVector 128(float) 2 + 138: TypePointer Function 137(fvec2) + 140: TypePointer Input 137(fvec2) + 141(u_f2): 140(ptr) Variable Input + 143(i_f2): 140(ptr) Variable Input + 146: TypeVector 128(float) 3 + 147: TypePointer Function 146(fvec3) + 149: TypePointer Input 146(fvec3) + 150(u_f3): 149(ptr) Variable Input + 152(i_f3): 149(ptr) Variable Input + 155: TypeVector 128(float) 4 + 156: TypePointer Function 155(fvec4) + 158: TypePointer Input 155(fvec4) + 159(u_f4): 158(ptr) Variable Input + 161(i_f4): 158(ptr) Variable Input + 164: TypePointer Output 155(fvec4) +165(gl_FragColor): 164(ptr) Variable Output + 257: 128(float) Constant 1065353216 + 258: 155(fvec4) ConstantComposite 257 257 257 257 4(main): 2 Function None 3 5: Label 8(b): 7(ptr) Variable Function 17(b2): 16(ptr) Variable Function - 35(b3): 34(ptr) Variable Function - 59(b4): 58(ptr) Variable Function - 89(i): 88(ptr) Variable Function - 98(i2): 97(ptr) Variable Function - 107(i3): 106(ptr) Variable Function - 116(i4): 115(ptr) Variable Function - 125(f): 124(ptr) Variable Function - 134(f2): 133(ptr) Variable Function - 143(f3): 142(ptr) Variable Function - 152(f4): 151(ptr) Variable Function - 161: 151(ptr) Variable Function + 38(b3): 37(ptr) Variable Function + 63(b4): 62(ptr) Variable Function + 94(i): 93(ptr) Variable Function + 103(i2): 102(ptr) Variable Function + 112(i3): 111(ptr) Variable Function + 121(i4): 120(ptr) Variable Function + 130(f): 129(ptr) Variable Function + 139(f2): 138(ptr) Variable Function + 148(f3): 147(ptr) Variable Function + 157(f4): 156(ptr) Variable Function + 194: 156(ptr) Variable Function 11: 6(bool) Load 10(u_b) 13: 6(bool) Load 12(i_b) 14: 6(bool) LogicalAnd 11 13 Store 8(b) 14 - 20: 15(bvec2) Load 19(u_b2) - 21: 6(bool) CompositeExtract 20 0 - 23: 15(bvec2) Load 22(i_b2) - 24: 6(bool) CompositeExtract 23 0 - 25: 6(bool) LogicalAnd 21 24 - 26: 15(bvec2) Load 19(u_b2) - 27: 6(bool) CompositeExtract 26 1 - 28: 6(bool) LogicalAnd 25 27 - 29: 15(bvec2) Load 22(i_b2) - 30: 6(bool) CompositeExtract 29 1 - 31: 6(bool) LogicalAnd 28 30 - 32: 15(bvec2) CompositeConstruct 31 31 - Store 17(b2) 32 - 38: 33(bvec3) Load 37(u_b3) - 39: 6(bool) CompositeExtract 38 0 - 41: 33(bvec3) Load 40(i_b3) - 42: 6(bool) CompositeExtract 41 0 - 43: 6(bool) LogicalAnd 39 42 - 44: 33(bvec3) Load 37(u_b3) - 45: 6(bool) CompositeExtract 44 1 - 46: 6(bool) LogicalAnd 43 45 - 47: 33(bvec3) Load 40(i_b3) - 48: 6(bool) CompositeExtract 47 1 + 22: 9(ptr) AccessChain 19(u_b2) 21 + 23: 6(bool) Load 22 + 25: 9(ptr) AccessChain 24(i_b2) 21 + 26: 6(bool) Load 25 + 27: 6(bool) LogicalAnd 23 26 + 29: 9(ptr) AccessChain 19(u_b2) 28 + 30: 6(bool) Load 29 + 31: 6(bool) LogicalAnd 27 30 + 32: 9(ptr) AccessChain 24(i_b2) 28 + 33: 6(bool) Load 32 + 34: 6(bool) LogicalAnd 31 33 + 35: 15(bvec2) CompositeConstruct 34 34 + Store 17(b2) 35 + 41: 9(ptr) AccessChain 40(u_b3) 21 + 42: 6(bool) Load 41 + 44: 9(ptr) AccessChain 43(i_b3) 21 + 45: 6(bool) Load 44 + 46: 6(bool) LogicalAnd 42 45 + 47: 9(ptr) AccessChain 40(u_b3) 28 + 48: 6(bool) Load 47 49: 6(bool) LogicalAnd 46 48 - 50: 33(bvec3) Load 37(u_b3) - 51: 6(bool) CompositeExtract 50 2 + 50: 9(ptr) AccessChain 43(i_b3) 28 + 51: 6(bool) Load 50 52: 6(bool) LogicalAnd 49 51 - 53: 33(bvec3) Load 40(i_b3) - 54: 6(bool) CompositeExtract 53 2 - 55: 6(bool) LogicalAnd 52 54 - 56: 33(bvec3) CompositeConstruct 55 55 55 - Store 35(b3) 56 - 62: 57(bvec4) Load 61(u_b4) - 63: 6(bool) CompositeExtract 62 0 - 65: 57(bvec4) Load 64(i_b4) - 66: 6(bool) CompositeExtract 65 0 - 67: 6(bool) LogicalAnd 63 66 - 68: 57(bvec4) Load 61(u_b4) - 69: 6(bool) CompositeExtract 68 1 - 70: 6(bool) LogicalAnd 67 69 - 71: 57(bvec4) Load 64(i_b4) - 72: 6(bool) CompositeExtract 71 1 - 73: 6(bool) LogicalAnd 70 72 - 74: 57(bvec4) Load 61(u_b4) - 75: 6(bool) CompositeExtract 74 2 - 76: 6(bool) LogicalAnd 73 75 - 77: 57(bvec4) Load 64(i_b4) - 78: 6(bool) CompositeExtract 77 2 - 79: 6(bool) LogicalAnd 76 78 - 80: 57(bvec4) Load 61(u_b4) - 81: 6(bool) CompositeExtract 80 3 - 82: 6(bool) LogicalAnd 79 81 - 83: 57(bvec4) Load 64(i_b4) - 84: 6(bool) CompositeExtract 83 3 - 85: 6(bool) LogicalAnd 82 84 - 86: 57(bvec4) CompositeConstruct 85 85 85 85 - Store 59(b4) 86 - 92: 87(int) Load 91(u_i) - 94: 87(int) Load 93(i_i) - 95: 87(int) IAdd 92 94 - Store 89(i) 95 - 101: 96(ivec2) Load 100(u_i2) - 103: 96(ivec2) Load 102(i_i2) - 104: 96(ivec2) IAdd 101 103 - Store 98(i2) 104 - 110: 105(ivec3) Load 109(u_i3) - 112: 105(ivec3) Load 111(i_i3) - 113: 105(ivec3) IAdd 110 112 - Store 107(i3) 113 - 119: 114(ivec4) Load 118(u_i4) - 121: 114(ivec4) Load 120(i_i4) - 122: 114(ivec4) IAdd 119 121 - Store 116(i4) 122 - 128: 123(float) Load 127(u_f) - 130: 123(float) Load 129(i_f) - 131: 123(float) FAdd 128 130 - Store 125(f) 131 - 137: 132(fvec2) Load 136(u_f2) - 139: 132(fvec2) Load 138(i_f2) - 140: 132(fvec2) FAdd 137 139 - Store 134(f2) 140 - 146: 141(fvec3) Load 145(u_f3) - 148: 141(fvec3) Load 147(i_f3) - 149: 141(fvec3) FAdd 146 148 - Store 143(f3) 149 - 155: 150(fvec4) Load 154(u_f4) - 157: 150(fvec4) Load 156(i_f4) - 158: 150(fvec4) FAdd 155 157 - Store 152(f4) 158 - 162: 6(bool) Load 8(b) - 163: 15(bvec2) Load 17(b2) - 164: 6(bool) CompositeExtract 163 0 - 165: 6(bool) LogicalOr 162 164 - 166: 15(bvec2) Load 17(b2) - 167: 6(bool) CompositeExtract 166 1 - 168: 6(bool) LogicalOr 165 167 - 169: 33(bvec3) Load 35(b3) - 170: 6(bool) CompositeExtract 169 0 - 171: 6(bool) LogicalOr 168 170 - 172: 33(bvec3) Load 35(b3) - 173: 6(bool) CompositeExtract 172 1 - 174: 6(bool) LogicalOr 171 173 - 175: 33(bvec3) Load 35(b3) - 176: 6(bool) CompositeExtract 175 2 - 177: 6(bool) LogicalOr 174 176 - 178: 57(bvec4) Load 59(b4) - 179: 6(bool) CompositeExtract 178 0 - 180: 6(bool) LogicalOr 177 179 - 181: 57(bvec4) Load 59(b4) - 182: 6(bool) CompositeExtract 181 1 - 183: 6(bool) LogicalOr 180 182 - 184: 57(bvec4) Load 59(b4) - 185: 6(bool) CompositeExtract 184 2 - 186: 6(bool) LogicalOr 183 185 - 187: 57(bvec4) Load 59(b4) - 188: 6(bool) CompositeExtract 187 3 - 189: 6(bool) LogicalOr 186 188 - SelectionMerge 191 None - BranchConditional 189 190 256 - 190: Label - 192: 87(int) Load 89(i) - 195: 88(ptr) AccessChain 98(i2) 194 - 196: 87(int) Load 195 - 197: 87(int) IAdd 192 196 - 199: 88(ptr) AccessChain 98(i2) 198 - 200: 87(int) Load 199 - 201: 87(int) IAdd 197 200 - 202: 88(ptr) AccessChain 107(i3) 194 - 203: 87(int) Load 202 - 204: 87(int) IAdd 201 203 - 205: 88(ptr) AccessChain 107(i3) 198 - 206: 87(int) Load 205 - 207: 87(int) IAdd 204 206 - 209: 88(ptr) AccessChain 107(i3) 208 - 210: 87(int) Load 209 - 211: 87(int) IAdd 207 210 - 212: 88(ptr) AccessChain 116(i4) 194 - 213: 87(int) Load 212 - 214: 87(int) IAdd 211 213 - 215: 88(ptr) AccessChain 116(i4) 198 - 216: 87(int) Load 215 - 217: 87(int) IAdd 214 216 - 218: 88(ptr) AccessChain 116(i4) 208 - 219: 87(int) Load 218 - 220: 87(int) IAdd 217 219 - 222: 88(ptr) AccessChain 116(i4) 221 - 223: 87(int) Load 222 - 224: 87(int) IAdd 220 223 - 225: 123(float) ConvertSToF 224 - 226: 123(float) Load 125(f) - 227: 123(float) FAdd 225 226 - 228: 124(ptr) AccessChain 134(f2) 194 - 229: 123(float) Load 228 - 230: 123(float) FAdd 227 229 - 231: 124(ptr) AccessChain 134(f2) 198 - 232: 123(float) Load 231 - 233: 123(float) FAdd 230 232 - 234: 124(ptr) AccessChain 143(f3) 194 - 235: 123(float) Load 234 - 236: 123(float) FAdd 233 235 - 237: 124(ptr) AccessChain 143(f3) 198 - 238: 123(float) Load 237 - 239: 123(float) FAdd 236 238 - 240: 124(ptr) AccessChain 143(f3) 208 - 241: 123(float) Load 240 - 242: 123(float) FAdd 239 241 - 243: 124(ptr) AccessChain 152(f4) 194 - 244: 123(float) Load 243 - 245: 123(float) FAdd 242 244 - 246: 124(ptr) AccessChain 152(f4) 198 - 247: 123(float) Load 246 - 248: 123(float) FAdd 245 247 - 249: 124(ptr) AccessChain 152(f4) 208 - 250: 123(float) Load 249 - 251: 123(float) FAdd 248 250 - 252: 124(ptr) AccessChain 152(f4) 221 - 253: 123(float) Load 252 - 254: 123(float) FAdd 251 253 - 255: 150(fvec4) CompositeConstruct 254 254 254 254 - Store 161 255 - Branch 191 + 54: 9(ptr) AccessChain 40(u_b3) 53 + 55: 6(bool) Load 54 + 56: 6(bool) LogicalAnd 52 55 + 57: 9(ptr) AccessChain 43(i_b3) 53 + 58: 6(bool) Load 57 + 59: 6(bool) LogicalAnd 56 58 + 60: 36(bvec3) CompositeConstruct 59 59 59 + Store 38(b3) 60 + 66: 9(ptr) AccessChain 65(u_b4) 21 + 67: 6(bool) Load 66 + 69: 9(ptr) AccessChain 68(i_b4) 21 + 70: 6(bool) Load 69 + 71: 6(bool) LogicalAnd 67 70 + 72: 9(ptr) AccessChain 65(u_b4) 28 + 73: 6(bool) Load 72 + 74: 6(bool) LogicalAnd 71 73 + 75: 9(ptr) AccessChain 68(i_b4) 28 + 76: 6(bool) Load 75 + 77: 6(bool) LogicalAnd 74 76 + 78: 9(ptr) AccessChain 65(u_b4) 53 + 79: 6(bool) Load 78 + 80: 6(bool) LogicalAnd 77 79 + 81: 9(ptr) AccessChain 68(i_b4) 53 + 82: 6(bool) Load 81 + 83: 6(bool) LogicalAnd 80 82 + 85: 9(ptr) AccessChain 65(u_b4) 84 + 86: 6(bool) Load 85 + 87: 6(bool) LogicalAnd 83 86 + 88: 9(ptr) AccessChain 68(i_b4) 84 + 89: 6(bool) Load 88 + 90: 6(bool) LogicalAnd 87 89 + 91: 61(bvec4) CompositeConstruct 90 90 90 90 + Store 63(b4) 91 + 97: 92(int) Load 96(u_i) + 99: 92(int) Load 98(i_i) + 100: 92(int) IAdd 97 99 + Store 94(i) 100 + 106: 101(ivec2) Load 105(u_i2) + 108: 101(ivec2) Load 107(i_i2) + 109: 101(ivec2) IAdd 106 108 + Store 103(i2) 109 + 115: 110(ivec3) Load 114(u_i3) + 117: 110(ivec3) Load 116(i_i3) + 118: 110(ivec3) IAdd 115 117 + Store 112(i3) 118 + 124: 119(ivec4) Load 123(u_i4) + 126: 119(ivec4) Load 125(i_i4) + 127: 119(ivec4) IAdd 124 126 + Store 121(i4) 127 + 133: 128(float) Load 132(u_f) + 135: 128(float) Load 134(i_f) + 136: 128(float) FAdd 133 135 + Store 130(f) 136 + 142: 137(fvec2) Load 141(u_f2) + 144: 137(fvec2) Load 143(i_f2) + 145: 137(fvec2) FAdd 142 144 + Store 139(f2) 145 + 151: 146(fvec3) Load 150(u_f3) + 153: 146(fvec3) Load 152(i_f3) + 154: 146(fvec3) FAdd 151 153 + Store 148(f3) 154 + 160: 155(fvec4) Load 159(u_f4) + 162: 155(fvec4) Load 161(i_f4) + 163: 155(fvec4) FAdd 160 162 + Store 157(f4) 163 + 166: 6(bool) Load 8(b) + 167: 7(ptr) AccessChain 17(b2) 21 + 168: 6(bool) Load 167 + 169: 6(bool) LogicalOr 166 168 + 170: 7(ptr) AccessChain 17(b2) 28 + 171: 6(bool) Load 170 + 172: 6(bool) LogicalOr 169 171 + 173: 7(ptr) AccessChain 38(b3) 21 + 174: 6(bool) Load 173 + 175: 6(bool) LogicalOr 172 174 + 176: 7(ptr) AccessChain 38(b3) 28 + 177: 6(bool) Load 176 + 178: 6(bool) LogicalOr 175 177 + 179: 7(ptr) AccessChain 38(b3) 53 + 180: 6(bool) Load 179 + 181: 6(bool) LogicalOr 178 180 + 182: 7(ptr) AccessChain 63(b4) 21 + 183: 6(bool) Load 182 + 184: 6(bool) LogicalOr 181 183 + 185: 7(ptr) AccessChain 63(b4) 28 + 186: 6(bool) Load 185 + 187: 6(bool) LogicalOr 184 186 + 188: 7(ptr) AccessChain 63(b4) 53 + 189: 6(bool) Load 188 + 190: 6(bool) LogicalOr 187 189 + 191: 7(ptr) AccessChain 63(b4) 84 + 192: 6(bool) Load 191 + 193: 6(bool) LogicalOr 190 192 + SelectionMerge 196 None + BranchConditional 193 195 256 + 195: Label + 197: 92(int) Load 94(i) + 198: 93(ptr) AccessChain 103(i2) 21 + 199: 92(int) Load 198 + 200: 92(int) IAdd 197 199 + 201: 93(ptr) AccessChain 103(i2) 28 + 202: 92(int) Load 201 + 203: 92(int) IAdd 200 202 + 204: 93(ptr) AccessChain 112(i3) 21 + 205: 92(int) Load 204 + 206: 92(int) IAdd 203 205 + 207: 93(ptr) AccessChain 112(i3) 28 + 208: 92(int) Load 207 + 209: 92(int) IAdd 206 208 + 210: 93(ptr) AccessChain 112(i3) 53 + 211: 92(int) Load 210 + 212: 92(int) IAdd 209 211 + 213: 93(ptr) AccessChain 121(i4) 21 + 214: 92(int) Load 213 + 215: 92(int) IAdd 212 214 + 216: 93(ptr) AccessChain 121(i4) 28 + 217: 92(int) Load 216 + 218: 92(int) IAdd 215 217 + 219: 93(ptr) AccessChain 121(i4) 53 + 220: 92(int) Load 219 + 221: 92(int) IAdd 218 220 + 222: 93(ptr) AccessChain 121(i4) 84 + 223: 92(int) Load 222 + 224: 92(int) IAdd 221 223 + 225: 128(float) ConvertSToF 224 + 226: 128(float) Load 130(f) + 227: 128(float) FAdd 225 226 + 228: 129(ptr) AccessChain 139(f2) 21 + 229: 128(float) Load 228 + 230: 128(float) FAdd 227 229 + 231: 129(ptr) AccessChain 139(f2) 28 + 232: 128(float) Load 231 + 233: 128(float) FAdd 230 232 + 234: 129(ptr) AccessChain 148(f3) 21 + 235: 128(float) Load 234 + 236: 128(float) FAdd 233 235 + 237: 129(ptr) AccessChain 148(f3) 28 + 238: 128(float) Load 237 + 239: 128(float) FAdd 236 238 + 240: 129(ptr) AccessChain 148(f3) 53 + 241: 128(float) Load 240 + 242: 128(float) FAdd 239 241 + 243: 129(ptr) AccessChain 157(f4) 21 + 244: 128(float) Load 243 + 245: 128(float) FAdd 242 244 + 246: 129(ptr) AccessChain 157(f4) 28 + 247: 128(float) Load 246 + 248: 128(float) FAdd 245 247 + 249: 129(ptr) AccessChain 157(f4) 53 + 250: 128(float) Load 249 + 251: 128(float) FAdd 248 250 + 252: 129(ptr) AccessChain 157(f4) 84 + 253: 128(float) Load 252 + 254: 128(float) FAdd 251 253 + 255: 155(fvec4) CompositeConstruct 254 254 254 254 + Store 194 255 + Branch 196 256: Label - Store 161 258 - Branch 191 - 191: Label - 259: 150(fvec4) Load 161 - Store 160(gl_FragColor) 259 + Store 194 258 + Branch 196 + 196: Label + 259: 155(fvec4) Load 194 + Store 165(gl_FragColor) 259 Return FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.uint.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.uint.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.uint.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.uint.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.uint.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 213 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.uniformArray.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.uniformArray.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.uniformArray.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.uniformArray.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.uniformArray.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 53 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.variableArrayIndex.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.variableArrayIndex.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.variableArrayIndex.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.variableArrayIndex.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.variableArrayIndex.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 93 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.varyingArray.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.varyingArray.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.varyingArray.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.varyingArray.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.varyingArray.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 61 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.varyingArrayIndirect.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.varyingArrayIndirect.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.varyingArrayIndirect.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.varyingArrayIndirect.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.varyingArrayIndirect.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 70 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.vecMatConstruct.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.vecMatConstruct.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.vecMatConstruct.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.vecMatConstruct.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,87 @@ +spv.vecMatConstruct.frag +// Module Version 10000 +// Generated by (magic number): 80006 +// Id's are bound by 62 + + Capability Shader + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + Name 4 "main" + Name 9 "v2" + Name 13 "m" + Name 19 "v3" + Name 27 "v4" + Name 37 "iv2" + Name 45 "iv3" + Name 54 "iv4" + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeVector 6(float) 2 + 8: TypePointer Function 7(fvec2) + 10: TypeVector 6(float) 3 + 11: TypeMatrix 10(fvec3) 4 + 12: TypePointer Function 11 + 18: TypePointer Function 10(fvec3) + 25: TypeVector 6(float) 4 + 26: TypePointer Function 25(fvec4) + 34: TypeInt 32 1 + 35: TypeVector 34(int) 2 + 36: TypePointer Function 35(ivec2) + 43: TypeVector 34(int) 3 + 44: TypePointer Function 43(ivec3) + 52: TypeVector 34(int) 4 + 53: TypePointer Function 52(ivec4) + 4(main): 2 Function None 3 + 5: Label + 9(v2): 8(ptr) Variable Function + 13(m): 12(ptr) Variable Function + 19(v3): 18(ptr) Variable Function + 27(v4): 26(ptr) Variable Function + 37(iv2): 36(ptr) Variable Function + 45(iv3): 44(ptr) Variable Function + 54(iv4): 53(ptr) Variable Function + 14: 11 Load 13(m) + 15: 6(float) CompositeExtract 14 0 0 + 16: 6(float) CompositeExtract 14 0 1 + 17: 7(fvec2) CompositeConstruct 15 16 + Store 9(v2) 17 + 20: 11 Load 13(m) + 21: 6(float) CompositeExtract 20 0 0 + 22: 6(float) CompositeExtract 20 0 1 + 23: 6(float) CompositeExtract 20 0 2 + 24: 10(fvec3) CompositeConstruct 21 22 23 + Store 19(v3) 24 + 28: 11 Load 13(m) + 29: 6(float) CompositeExtract 28 0 0 + 30: 6(float) CompositeExtract 28 0 1 + 31: 6(float) CompositeExtract 28 0 2 + 32: 6(float) CompositeExtract 28 1 0 + 33: 25(fvec4) CompositeConstruct 29 30 31 32 + Store 27(v4) 33 + 38: 11 Load 13(m) + 39: 6(float) CompositeExtract 38 0 0 + 40: 6(float) CompositeExtract 38 0 1 + 41: 7(fvec2) CompositeConstruct 39 40 + 42: 35(ivec2) ConvertFToS 41 + Store 37(iv2) 42 + 46: 11 Load 13(m) + 47: 6(float) CompositeExtract 46 0 0 + 48: 6(float) CompositeExtract 46 0 1 + 49: 6(float) CompositeExtract 46 0 2 + 50: 10(fvec3) CompositeConstruct 47 48 49 + 51: 43(ivec3) ConvertFToS 50 + Store 45(iv3) 51 + 55: 11 Load 13(m) + 56: 6(float) CompositeExtract 55 0 0 + 57: 6(float) CompositeExtract 55 0 1 + 58: 6(float) CompositeExtract 55 0 2 + 59: 6(float) CompositeExtract 55 1 0 + 60: 25(fvec4) CompositeConstruct 56 57 58 59 + 61: 52(ivec4) ConvertFToS 60 + Store 54(iv4) 61 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.viewportArray2.tesc.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.viewportArray2.tesc.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.viewportArray2.tesc.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.viewportArray2.tesc.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.viewportArray2.tesc // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 25 Capability Geometry diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.viewportArray2.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.viewportArray2.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.viewportArray2.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.viewportArray2.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.viewportArray2.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 19 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.voidFunction.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.voidFunction.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.voidFunction.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.voidFunction.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.voidFunction.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 43 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.vulkan100.subgroupArithmetic.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.vulkan100.subgroupArithmetic.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.vulkan100.subgroupArithmetic.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.vulkan100.subgroupArithmetic.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,305 @@ +spv.vulkan100.subgroupArithmetic.comp +ERROR: 0:19: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:20: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:21: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:22: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:24: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:25: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:26: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:27: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:29: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:30: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:31: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:32: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:34: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:35: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:36: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:37: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:39: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:40: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:41: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:42: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:44: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:45: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:46: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:47: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:49: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:50: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:51: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:52: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:54: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:55: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:56: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:57: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:59: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:60: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:61: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:62: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:64: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:65: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:66: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:67: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:69: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:70: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:71: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:72: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:74: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:75: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:76: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:77: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:79: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:80: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:81: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:82: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:84: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:85: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:86: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:87: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:89: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:90: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:91: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:92: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:94: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:95: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:96: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:97: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:99: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:100: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:101: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:102: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:104: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:105: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:106: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:107: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:109: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:110: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:111: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:112: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:114: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:115: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:116: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:117: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:119: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:120: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:121: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:122: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:124: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:125: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:126: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:127: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:129: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:130: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:131: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:132: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:134: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:135: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:136: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:137: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:139: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:140: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:141: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:142: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:144: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:145: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:146: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:147: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:149: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:150: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:151: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:152: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:154: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:155: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:156: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:157: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:159: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:160: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:161: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:162: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:164: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:165: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:166: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:167: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:169: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:170: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:171: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:172: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:174: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:175: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:176: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:177: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:179: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:180: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:181: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:182: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:184: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:185: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:186: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:187: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:189: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:190: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:191: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:192: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:194: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:195: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:196: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:197: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:199: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:200: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:201: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:202: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:204: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:205: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:206: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:207: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:209: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:210: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:211: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:212: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:214: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:215: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:216: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:217: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:219: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:220: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:221: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:222: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:224: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:225: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:226: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:227: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:229: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:230: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:231: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:232: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:234: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:235: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:236: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:237: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:239: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:240: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:241: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:242: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:244: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:245: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:246: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:247: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:249: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:250: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:251: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:252: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:254: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:255: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:256: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:257: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:259: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:260: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:261: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:262: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:264: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:265: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:266: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:267: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:269: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:270: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:271: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:272: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:274: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:275: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:276: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:277: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:279: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:280: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:281: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:282: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:284: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:285: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:286: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:287: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:289: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:290: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:291: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:292: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:294: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:295: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:296: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:297: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:299: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:300: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:301: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:302: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:304: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:305: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:306: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:307: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:309: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:310: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:311: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:312: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:314: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:315: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:316: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:317: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:319: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:320: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:321: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:322: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:324: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:325: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:326: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:327: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:329: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:330: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:331: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:332: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:334: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:335: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:336: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:337: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:339: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:340: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:341: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:342: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:344: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:345: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:346: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:347: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:349: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:350: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:351: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:352: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:354: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:355: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:356: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:357: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:359: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:360: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:361: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:362: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:364: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:365: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:366: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:367: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:369: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:370: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:371: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:372: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:374: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:375: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:376: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:377: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:379: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:380: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:381: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:382: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:384: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:385: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:386: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:387: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:389: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:390: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:391: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:392: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 300 compilation errors. No code generated. + + +SPIR-V is not generated for failed compile or link diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.vulkan100.subgroupPartitioned.comp.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.vulkan100.subgroupPartitioned.comp.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.vulkan100.subgroupPartitioned.comp.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.vulkan100.subgroupPartitioned.comp.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,326 @@ +spv.vulkan100.subgroupPartitioned.comp +ERROR: 0:19: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:21: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:22: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:23: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:24: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:26: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:27: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:28: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:29: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:31: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:32: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:33: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:34: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:36: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:37: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:38: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:39: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:41: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:42: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:43: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:44: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:46: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:47: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:48: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:49: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:51: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:52: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:53: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:54: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:56: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:57: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:58: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:59: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:61: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:62: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:63: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:64: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:66: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:67: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:68: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:69: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:71: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:72: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:73: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:74: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:76: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:77: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:78: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:79: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:81: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:82: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:83: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:84: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:86: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:87: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:88: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:89: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:91: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:92: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:93: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:94: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:96: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:97: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:98: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:99: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:101: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:102: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:103: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:104: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:106: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:107: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:108: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:109: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:111: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:112: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:113: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:114: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:116: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:117: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:118: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:119: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:121: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:122: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:123: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:124: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:126: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:127: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:128: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:129: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:131: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:132: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:133: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:134: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:136: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:137: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:138: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:139: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:141: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:142: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:143: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:144: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:146: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:147: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:148: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:149: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:151: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:152: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:153: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:154: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:156: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:157: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:158: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:159: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:161: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:162: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:163: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:164: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:166: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:167: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:168: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:169: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:171: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:172: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:173: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:174: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:176: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:177: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:178: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:179: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:181: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:182: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:183: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:184: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:186: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:187: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:188: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:189: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:191: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:192: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:193: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:194: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:196: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:197: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:198: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:199: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:201: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:202: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:203: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:204: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:206: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:207: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:208: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:209: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:211: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:212: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:213: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:214: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:216: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:217: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:218: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:219: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:221: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:222: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:223: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:224: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:226: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:227: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:228: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:229: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:231: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:232: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:233: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:234: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:236: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:237: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:238: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:239: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:241: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:242: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:243: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:244: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:246: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:247: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:248: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:249: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:251: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:252: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:253: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:254: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:256: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:257: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:258: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:259: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:261: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:262: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:263: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:264: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:266: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:267: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:268: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:269: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:271: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:272: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:273: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:274: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:276: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:277: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:278: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:279: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:281: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:282: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:283: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:284: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:286: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:287: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:288: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:289: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:291: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:292: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:293: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:294: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:296: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:297: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:298: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:299: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:301: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:302: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:303: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:304: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:306: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:307: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:308: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:309: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:311: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:312: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:313: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:314: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:316: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:317: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:318: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:319: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:321: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:322: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:323: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:324: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:326: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:327: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:328: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:329: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:331: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:332: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:333: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:334: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:336: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:337: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:338: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:339: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:341: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:342: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:343: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:344: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:346: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:347: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:348: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:349: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:351: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:352: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:353: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:354: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:356: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:357: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:358: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:359: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:361: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:362: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:363: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:364: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:366: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:367: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:368: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:369: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:371: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:372: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:373: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:374: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:376: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:377: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:378: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:379: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:381: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:382: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:383: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:384: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:386: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:387: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:388: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:389: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:391: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:392: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:393: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:394: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:396: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:397: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:398: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:399: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:401: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:402: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:403: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:404: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:406: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:407: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:408: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:409: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:411: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:412: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:413: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:414: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:416: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:417: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:418: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 0:419: 'subgroup op' : requires SPIR-V 1.3 +ERROR: 321 compilation errors. No code generated. + + +SPIR-V is not generated for failed compile or link diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.vulkan110.int16.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.vulkan110.int16.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.vulkan110.int16.frag.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.vulkan110.int16.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,741 @@ +spv.vulkan110.int16.frag +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 523 + + Capability Shader + Capability Float16 + Capability Float64 + Capability Int64 + Capability Int16 + Capability Int8 + Capability StorageUniform16 + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + SourceExtension "GL_KHX_shader_explicit_arithmetic_types" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_float64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int16" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int32" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int64" + SourceExtension "GL_KHX_shader_explicit_arithmetic_types_int8" + Name 4 "main" + Name 6 "literal(" + Name 8 "typeCast16(" + Name 10 "operators(" + Name 12 "builtinFuncs(" + Name 16 "i16" + Name 24 "Uniforms" + MemberName 24(Uniforms) 0 "index" + Name 26 "" + Name 33 "indexable" + Name 38 "u16" + Name 46 "indexable" + Name 51 "i32v" + Name 54 "i16v" + Name 59 "u16v" + Name 67 "u32v" + Name 74 "i64v" + Name 80 "u64v" + Name 94 "f16v" + Name 100 "f32v" + Name 106 "f64v" + Name 154 "i8v" + Name 163 "u8v" + Name 176 "bv" + Name 195 "u16v" + Name 200 "i16" + Name 220 "i" + Name 227 "uv" + Name 243 "i64" + Name 281 "b" + Name 343 "i16v" + Name 346 "i16" + Name 356 "u16v" + Name 358 "u16" + Name 428 "i32" + Name 431 "i64" + Name 434 "i16v4" + Name 437 "u32" + Name 438 "u16v2" + Name 442 "u64" + Name 445 "u16v4" + Name 457 "bv" + Name 518 "Block" + MemberName 518(Block) 0 "i16" + MemberName 518(Block) 1 "i16v2" + MemberName 518(Block) 2 "i16v3" + MemberName 518(Block) 3 "i16v4" + MemberName 518(Block) 4 "u16" + MemberName 518(Block) 5 "u16v2" + MemberName 518(Block) 6 "u16v3" + MemberName 518(Block) 7 "u16v4" + Name 520 "block" + Name 521 "si16" + Name 522 "su16" + MemberDecorate 24(Uniforms) 0 Offset 0 + Decorate 24(Uniforms) Block + Decorate 26 DescriptorSet 0 + Decorate 26 Binding 0 + MemberDecorate 518(Block) 0 Offset 0 + MemberDecorate 518(Block) 1 Offset 4 + MemberDecorate 518(Block) 2 Offset 8 + MemberDecorate 518(Block) 3 Offset 16 + MemberDecorate 518(Block) 4 Offset 24 + MemberDecorate 518(Block) 5 Offset 28 + MemberDecorate 518(Block) 6 Offset 32 + MemberDecorate 518(Block) 7 Offset 40 + Decorate 518(Block) Block + Decorate 520(block) DescriptorSet 0 + Decorate 520(block) Binding 1 + Decorate 521(si16) SpecId 100 + Decorate 522(su16) SpecId 101 + 2: TypeVoid + 3: TypeFunction 2 + 14: TypeInt 16 1 + 15: TypePointer Function 14(int) + 17: TypeInt 32 0 + 18: 17(int) Constant 3 + 19: TypeArray 14(int) 18 + 20: 14(int) Constant 4294962927 + 21: 14(int) Constant 4294967295 + 22: 14(int) Constant 16384 + 23: 19 ConstantComposite 20 21 22 + 24(Uniforms): TypeStruct 17(int) + 25: TypePointer Uniform 24(Uniforms) + 26: 25(ptr) Variable Uniform + 27: TypeInt 32 1 + 28: 27(int) Constant 0 + 29: TypePointer Uniform 17(int) + 32: TypePointer Function 19 + 36: TypeInt 16 0 + 37: TypePointer Function 36(int) + 39: TypeArray 36(int) 18 + 40: 36(int) Constant 65535 + 41: 36(int) Constant 32767 + 42: 39 ConstantComposite 40 40 41 + 45: TypePointer Function 39 + 49: TypeVector 27(int) 2 + 50: TypePointer Function 49(ivec2) + 52: TypeVector 14(int) 2 + 53: TypePointer Function 52(ivec2) + 57: TypeVector 36(int) 2 + 58: TypePointer Function 57(ivec2) + 65: TypeVector 17(int) 2 + 66: TypePointer Function 65(ivec2) + 71: TypeInt 64 1 + 72: TypeVector 71(int) 2 + 73: TypePointer Function 72(ivec2) + 77: TypeInt 64 0 + 78: TypeVector 77(int) 2 + 79: TypePointer Function 78(ivec2) + 91: TypeFloat 16 + 92: TypeVector 91(float) 2 + 93: TypePointer Function 92(fvec2) + 97: TypeFloat 32 + 98: TypeVector 97(float) 2 + 99: TypePointer Function 98(fvec2) + 103: TypeFloat 64 + 104: TypeVector 103(float) 2 + 105: TypePointer Function 104(fvec2) + 151: TypeInt 8 1 + 152: TypeVector 151(int) 2 + 153: TypePointer Function 152(ivec2) + 160: TypeInt 8 0 + 161: TypeVector 160(int) 2 + 162: TypePointer Function 161(ivec2) + 173: TypeBool + 174: TypeVector 173(bool) 2 + 175: TypePointer Function 174(bvec2) + 178: 14(int) Constant 0 + 179: 14(int) Constant 1 + 180: 52(ivec2) ConstantComposite 178 178 + 181: 52(ivec2) ConstantComposite 179 179 + 184: 36(int) Constant 0 + 185: 36(int) Constant 1 + 186: 57(ivec2) ConstantComposite 184 184 + 187: 57(ivec2) ConstantComposite 185 185 + 193: TypeVector 36(int) 3 + 194: TypePointer Function 193(ivec3) + 197: TypeVector 14(int) 3 + 219: TypePointer Function 27(int) + 225: TypeVector 17(int) 3 + 226: TypePointer Function 225(ivec3) + 242: TypePointer Function 71(int) + 264: 17(int) Constant 1 + 270: 17(int) Constant 2 + 276: TypeVector 27(int) 3 + 280: TypePointer Function 173(bool) + 282: 17(int) Constant 0 + 296: TypePointer Function 17(int) + 354: 52(ivec2) ConstantComposite 21 21 + 363: 193(ivec3) ConstantComposite 184 184 184 + 405: 173(bool) ConstantTrue + 412: 173(bool) ConstantFalse + 413: 174(bvec2) ConstantComposite 412 412 + 425: TypeVector 173(bool) 3 + 426: 425(bvec3) ConstantComposite 412 412 412 + 432: TypeVector 14(int) 4 + 433: TypePointer Function 432(ivec4) + 441: TypePointer Function 77(int) + 443: TypeVector 36(int) 4 + 444: TypePointer Function 443(ivec4) + 456: TypePointer Function 425(bvec3) + 518(Block): TypeStruct 14(int) 52(ivec2) 197(ivec3) 432(ivec4) 36(int) 57(ivec2) 193(ivec3) 443(ivec4) + 519: TypePointer Uniform 518(Block) + 520(block): 519(ptr) Variable Uniform + 521(si16): 14(int) SpecConstant 4294967286 + 522(su16): 36(int) SpecConstant 20 + 4(main): 2 Function None 3 + 5: Label + Return + FunctionEnd + 6(literal(): 2 Function None 3 + 7: Label + 16(i16): 15(ptr) Variable Function + 33(indexable): 32(ptr) Variable Function + 38(u16): 37(ptr) Variable Function + 46(indexable): 45(ptr) Variable Function + 30: 29(ptr) AccessChain 26 28 + 31: 17(int) Load 30 + Store 33(indexable) 23 + 34: 15(ptr) AccessChain 33(indexable) 31 + 35: 14(int) Load 34 + Store 16(i16) 35 + 43: 29(ptr) AccessChain 26 28 + 44: 17(int) Load 43 + Store 46(indexable) 42 + 47: 37(ptr) AccessChain 46(indexable) 44 + 48: 36(int) Load 47 + Store 38(u16) 48 + Return + FunctionEnd + 8(typeCast16(): 2 Function None 3 + 9: Label + 51(i32v): 50(ptr) Variable Function + 54(i16v): 53(ptr) Variable Function + 59(u16v): 58(ptr) Variable Function + 67(u32v): 66(ptr) Variable Function + 74(i64v): 73(ptr) Variable Function + 80(u64v): 79(ptr) Variable Function + 94(f16v): 93(ptr) Variable Function + 100(f32v): 99(ptr) Variable Function + 106(f64v): 105(ptr) Variable Function + 154(i8v): 153(ptr) Variable Function + 163(u8v): 162(ptr) Variable Function + 176(bv): 175(ptr) Variable Function + 55: 52(ivec2) Load 54(i16v) + 56: 49(ivec2) SConvert 55 + Store 51(i32v) 56 + 60: 57(ivec2) Load 59(u16v) + 61: 49(ivec2) UConvert 60 + 62: 49(ivec2) Bitcast 61 + Store 51(i32v) 62 + 63: 52(ivec2) Load 54(i16v) + 64: 57(ivec2) Bitcast 63 + Store 59(u16v) 64 + 68: 52(ivec2) Load 54(i16v) + 69: 49(ivec2) SConvert 68 + 70: 65(ivec2) Bitcast 69 + Store 67(u32v) 70 + 75: 52(ivec2) Load 54(i16v) + 76: 72(ivec2) SConvert 75 + Store 74(i64v) 76 + 81: 52(ivec2) Load 54(i16v) + 82: 72(ivec2) SConvert 81 + 83: 78(ivec2) Bitcast 82 + Store 80(u64v) 83 + 84: 57(ivec2) Load 59(u16v) + 85: 65(ivec2) UConvert 84 + Store 67(u32v) 85 + 86: 57(ivec2) Load 59(u16v) + 87: 72(ivec2) UConvert 86 + 88: 72(ivec2) Bitcast 87 + Store 74(i64v) 88 + 89: 57(ivec2) Load 59(u16v) + 90: 78(ivec2) UConvert 89 + Store 80(u64v) 90 + 95: 52(ivec2) Load 54(i16v) + 96: 92(fvec2) ConvertSToF 95 + Store 94(f16v) 96 + 101: 52(ivec2) Load 54(i16v) + 102: 98(fvec2) ConvertSToF 101 + Store 100(f32v) 102 + 107: 52(ivec2) Load 54(i16v) + 108: 104(fvec2) ConvertSToF 107 + Store 106(f64v) 108 + 109: 57(ivec2) Load 59(u16v) + 110: 92(fvec2) ConvertUToF 109 + Store 94(f16v) 110 + 111: 57(ivec2) Load 59(u16v) + 112: 98(fvec2) ConvertUToF 111 + Store 100(f32v) 112 + 113: 57(ivec2) Load 59(u16v) + 114: 104(fvec2) ConvertUToF 113 + Store 106(f64v) 114 + 115: 52(ivec2) Load 54(i16v) + 116: 49(ivec2) SConvert 115 + Store 51(i32v) 116 + 117: 57(ivec2) Load 59(u16v) + 118: 49(ivec2) UConvert 117 + 119: 49(ivec2) Bitcast 118 + Store 51(i32v) 119 + 120: 52(ivec2) Load 54(i16v) + 121: 57(ivec2) Bitcast 120 + Store 59(u16v) 121 + 122: 52(ivec2) Load 54(i16v) + 123: 49(ivec2) SConvert 122 + 124: 65(ivec2) Bitcast 123 + Store 67(u32v) 124 + 125: 52(ivec2) Load 54(i16v) + 126: 72(ivec2) SConvert 125 + Store 74(i64v) 126 + 127: 52(ivec2) Load 54(i16v) + 128: 72(ivec2) SConvert 127 + 129: 78(ivec2) Bitcast 128 + Store 80(u64v) 129 + 130: 57(ivec2) Load 59(u16v) + 131: 65(ivec2) UConvert 130 + Store 67(u32v) 131 + 132: 57(ivec2) Load 59(u16v) + 133: 72(ivec2) UConvert 132 + 134: 72(ivec2) Bitcast 133 + Store 74(i64v) 134 + 135: 57(ivec2) Load 59(u16v) + 136: 72(ivec2) UConvert 135 + 137: 72(ivec2) Bitcast 136 + 138: 78(ivec2) Bitcast 137 + Store 80(u64v) 138 + 139: 52(ivec2) Load 54(i16v) + 140: 92(fvec2) ConvertSToF 139 + Store 94(f16v) 140 + 141: 52(ivec2) Load 54(i16v) + 142: 98(fvec2) ConvertSToF 141 + Store 100(f32v) 142 + 143: 52(ivec2) Load 54(i16v) + 144: 104(fvec2) ConvertSToF 143 + Store 106(f64v) 144 + 145: 57(ivec2) Load 59(u16v) + 146: 92(fvec2) ConvertUToF 145 + Store 94(f16v) 146 + 147: 57(ivec2) Load 59(u16v) + 148: 98(fvec2) ConvertUToF 147 + Store 100(f32v) 148 + 149: 57(ivec2) Load 59(u16v) + 150: 104(fvec2) ConvertUToF 149 + Store 106(f64v) 150 + 155: 52(ivec2) Load 54(i16v) + 156: 152(ivec2) SConvert 155 + Store 154(i8v) 156 + 157: 57(ivec2) Load 59(u16v) + 158: 152(ivec2) UConvert 157 + 159: 152(ivec2) Bitcast 158 + Store 154(i8v) 159 + 164: 52(ivec2) Load 54(i16v) + 165: 152(ivec2) SConvert 164 + 166: 161(ivec2) Bitcast 165 + Store 163(u8v) 166 + 167: 57(ivec2) Load 59(u16v) + 168: 161(ivec2) UConvert 167 + Store 163(u8v) 168 + 169: 57(ivec2) Load 59(u16v) + 170: 161(ivec2) UConvert 169 + 171: 52(ivec2) UConvert 170 + 172: 52(ivec2) Bitcast 171 + Store 54(i16v) 172 + 177: 174(bvec2) Load 176(bv) + 182: 52(ivec2) Select 177 181 180 + Store 54(i16v) 182 + 183: 174(bvec2) Load 176(bv) + 188: 57(ivec2) Select 183 187 186 + Store 59(u16v) 188 + 189: 52(ivec2) Load 54(i16v) + 190: 174(bvec2) INotEqual 189 186 + Store 176(bv) 190 + 191: 57(ivec2) Load 59(u16v) + 192: 174(bvec2) INotEqual 191 186 + Store 176(bv) 192 + Return + FunctionEnd + 10(operators(): 2 Function None 3 + 11: Label + 195(u16v): 194(ptr) Variable Function + 200(i16): 15(ptr) Variable Function + 220(i): 219(ptr) Variable Function + 227(uv): 226(ptr) Variable Function + 243(i64): 242(ptr) Variable Function + 281(b): 280(ptr) Variable Function + 196: 193(ivec3) Load 195(u16v) + 198: 197(ivec3) CompositeConstruct 179 179 179 + 199: 193(ivec3) IAdd 196 198 + Store 195(u16v) 199 + 201: 14(int) Load 200(i16) + 202: 14(int) ISub 201 179 + Store 200(i16) 202 + 203: 14(int) Load 200(i16) + 204: 14(int) IAdd 203 179 + Store 200(i16) 204 + 205: 193(ivec3) Load 195(u16v) + 206: 197(ivec3) CompositeConstruct 179 179 179 + 207: 193(ivec3) ISub 205 206 + Store 195(u16v) 207 + 208: 193(ivec3) Load 195(u16v) + 209: 193(ivec3) Not 208 + Store 195(u16v) 209 + 210: 14(int) Load 200(i16) + Store 200(i16) 210 + 211: 193(ivec3) Load 195(u16v) + 212: 193(ivec3) SNegate 211 + Store 195(u16v) 212 + 213: 14(int) Load 200(i16) + 214: 14(int) Load 200(i16) + 215: 14(int) IAdd 214 213 + Store 200(i16) 215 + 216: 193(ivec3) Load 195(u16v) + 217: 193(ivec3) Load 195(u16v) + 218: 193(ivec3) ISub 217 216 + Store 195(u16v) 218 + 221: 14(int) Load 200(i16) + 222: 27(int) SConvert 221 + 223: 27(int) Load 220(i) + 224: 27(int) IMul 223 222 + Store 220(i) 224 + 228: 193(ivec3) Load 195(u16v) + 229: 225(ivec3) UConvert 228 + 230: 225(ivec3) Load 227(uv) + 231: 225(ivec3) UDiv 230 229 + Store 227(uv) 231 + 232: 14(int) Load 200(i16) + 233: 27(int) SConvert 232 + 234: 17(int) Bitcast 233 + 235: 225(ivec3) Load 227(uv) + 236: 225(ivec3) CompositeConstruct 234 234 234 + 237: 225(ivec3) UMod 235 236 + Store 227(uv) 237 + 238: 193(ivec3) Load 195(u16v) + 239: 225(ivec3) UConvert 238 + 240: 225(ivec3) Load 227(uv) + 241: 225(ivec3) IAdd 239 240 + Store 227(uv) 241 + 244: 14(int) Load 200(i16) + 245: 71(int) SConvert 244 + 246: 71(int) Load 243(i64) + 247: 71(int) ISub 245 246 + Store 243(i64) 247 + 248: 193(ivec3) Load 195(u16v) + 249: 225(ivec3) UConvert 248 + 250: 225(ivec3) Load 227(uv) + 251: 225(ivec3) IMul 249 250 + Store 227(uv) 251 + 252: 14(int) Load 200(i16) + 253: 71(int) SConvert 252 + 254: 71(int) Load 243(i64) + 255: 71(int) IMul 253 254 + Store 243(i64) 255 + 256: 14(int) Load 200(i16) + 257: 27(int) SConvert 256 + 258: 27(int) Load 220(i) + 259: 27(int) SMod 257 258 + Store 220(i) 259 + 260: 14(int) Load 200(i16) + 261: 193(ivec3) Load 195(u16v) + 262: 197(ivec3) CompositeConstruct 260 260 260 + 263: 193(ivec3) ShiftLeftLogical 261 262 + Store 195(u16v) 263 + 265: 37(ptr) AccessChain 195(u16v) 264 + 266: 36(int) Load 265 + 267: 14(int) Load 200(i16) + 268: 14(int) ShiftRightArithmetic 267 266 + Store 200(i16) 268 + 269: 14(int) Load 200(i16) + 271: 37(ptr) AccessChain 195(u16v) 270 + 272: 36(int) Load 271 + 273: 14(int) ShiftLeftLogical 269 272 + Store 200(i16) 273 + 274: 193(ivec3) Load 195(u16v) + 275: 27(int) Load 220(i) + 277: 276(ivec3) CompositeConstruct 275 275 275 + 278: 193(ivec3) ShiftLeftLogical 274 277 + 279: 225(ivec3) UConvert 278 + Store 227(uv) 279 + 283: 37(ptr) AccessChain 195(u16v) 282 + 284: 36(int) Load 283 + 285: 14(int) Load 200(i16) + 286: 36(int) Bitcast 285 + 287: 173(bool) INotEqual 284 286 + Store 281(b) 287 + 288: 14(int) Load 200(i16) + 289: 36(int) Bitcast 288 + 290: 37(ptr) AccessChain 195(u16v) 282 + 291: 36(int) Load 290 + 292: 173(bool) IEqual 289 291 + Store 281(b) 292 + 293: 37(ptr) AccessChain 195(u16v) 282 + 294: 36(int) Load 293 + 295: 17(int) UConvert 294 + 297: 296(ptr) AccessChain 227(uv) 264 + 298: 17(int) Load 297 + 299: 173(bool) UGreaterThan 295 298 + Store 281(b) 299 + 300: 14(int) Load 200(i16) + 301: 27(int) SConvert 300 + 302: 27(int) Load 220(i) + 303: 173(bool) SLessThan 301 302 + Store 281(b) 303 + 304: 37(ptr) AccessChain 195(u16v) 264 + 305: 36(int) Load 304 + 306: 17(int) UConvert 305 + 307: 296(ptr) AccessChain 227(uv) 282 + 308: 17(int) Load 307 + 309: 173(bool) UGreaterThanEqual 306 308 + Store 281(b) 309 + 310: 14(int) Load 200(i16) + 311: 27(int) SConvert 310 + 312: 27(int) Load 220(i) + 313: 173(bool) SLessThanEqual 311 312 + Store 281(b) 313 + 314: 14(int) Load 200(i16) + 315: 27(int) SConvert 314 + 316: 17(int) Bitcast 315 + 317: 225(ivec3) Load 227(uv) + 318: 225(ivec3) CompositeConstruct 316 316 316 + 319: 225(ivec3) BitwiseOr 317 318 + Store 227(uv) 319 + 320: 14(int) Load 200(i16) + 321: 27(int) SConvert 320 + 322: 27(int) Load 220(i) + 323: 27(int) BitwiseOr 321 322 + Store 220(i) 323 + 324: 14(int) Load 200(i16) + 325: 71(int) SConvert 324 + 326: 71(int) Load 243(i64) + 327: 71(int) BitwiseAnd 326 325 + Store 243(i64) 327 + 328: 193(ivec3) Load 195(u16v) + 329: 225(ivec3) UConvert 328 + 330: 225(ivec3) Load 227(uv) + 331: 225(ivec3) BitwiseAnd 329 330 + Store 227(uv) 331 + 332: 14(int) Load 200(i16) + 333: 27(int) SConvert 332 + 334: 17(int) Bitcast 333 + 335: 225(ivec3) Load 227(uv) + 336: 225(ivec3) CompositeConstruct 334 334 334 + 337: 225(ivec3) BitwiseXor 335 336 + Store 227(uv) 337 + 338: 193(ivec3) Load 195(u16v) + 339: 14(int) Load 200(i16) + 340: 36(int) Bitcast 339 + 341: 193(ivec3) CompositeConstruct 340 340 340 + 342: 193(ivec3) BitwiseXor 338 341 + Store 195(u16v) 342 + Return + FunctionEnd +12(builtinFuncs(): 2 Function None 3 + 13: Label + 343(i16v): 53(ptr) Variable Function + 346(i16): 15(ptr) Variable Function + 356(u16v): 194(ptr) Variable Function + 358(u16): 37(ptr) Variable Function + 428(i32): 219(ptr) Variable Function + 431(i64): 242(ptr) Variable Function + 434(i16v4): 433(ptr) Variable Function + 437(u32): 296(ptr) Variable Function + 438(u16v2): 58(ptr) Variable Function + 442(u64): 441(ptr) Variable Function + 445(u16v4): 444(ptr) Variable Function + 457(bv): 456(ptr) Variable Function + 344: 52(ivec2) Load 343(i16v) + 345: 52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 344 + Store 343(i16v) 345 + 347: 14(int) Load 346(i16) + 348: 14(int) ExtInst 1(GLSL.std.450) 7(SSign) 347 + Store 346(i16) 348 + 349: 52(ivec2) Load 343(i16v) + 350: 14(int) Load 346(i16) + 351: 52(ivec2) CompositeConstruct 350 350 + 352: 52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 349 351 + Store 343(i16v) 352 + 353: 52(ivec2) Load 343(i16v) + 355: 52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 353 354 + Store 343(i16v) 355 + 357: 193(ivec3) Load 356(u16v) + 359: 36(int) Load 358(u16) + 360: 193(ivec3) CompositeConstruct 359 359 359 + 361: 193(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 357 360 + Store 356(u16v) 361 + 362: 193(ivec3) Load 356(u16v) + 364: 193(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 362 363 + Store 356(u16v) 364 + 365: 52(ivec2) Load 343(i16v) + 366: 14(int) Load 346(i16) + 367: 52(ivec2) CompositeConstruct 366 366 + 368: 52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 365 367 + Store 343(i16v) 368 + 369: 52(ivec2) Load 343(i16v) + 370: 52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 369 354 + Store 343(i16v) 370 + 371: 193(ivec3) Load 356(u16v) + 372: 36(int) Load 358(u16) + 373: 193(ivec3) CompositeConstruct 372 372 372 + 374: 193(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 371 373 + Store 356(u16v) 374 + 375: 193(ivec3) Load 356(u16v) + 376: 193(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 375 363 + Store 356(u16v) 376 + 377: 52(ivec2) Load 343(i16v) + 378: 14(int) Load 346(i16) + 379: 14(int) SNegate 378 + 380: 14(int) Load 346(i16) + 381: 52(ivec2) CompositeConstruct 379 379 + 382: 52(ivec2) CompositeConstruct 380 380 + 383: 52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 377 381 382 + Store 343(i16v) 383 + 384: 52(ivec2) Load 343(i16v) + 385: 52(ivec2) Load 343(i16v) + 386: 52(ivec2) SNegate 385 + 387: 52(ivec2) Load 343(i16v) + 388: 52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 384 386 387 + Store 343(i16v) 388 + 389: 193(ivec3) Load 356(u16v) + 390: 36(int) Load 358(u16) + 391: 36(int) SNegate 390 + 392: 36(int) Load 358(u16) + 393: 193(ivec3) CompositeConstruct 391 391 391 + 394: 193(ivec3) CompositeConstruct 392 392 392 + 395: 193(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 389 393 394 + Store 356(u16v) 395 + 396: 193(ivec3) Load 356(u16v) + 397: 193(ivec3) Load 356(u16v) + 398: 193(ivec3) SNegate 397 + 399: 193(ivec3) Load 356(u16v) + 400: 193(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 396 398 399 + Store 356(u16v) 400 + 401: 15(ptr) AccessChain 343(i16v) 282 + 402: 14(int) Load 401 + 403: 15(ptr) AccessChain 343(i16v) 264 + 404: 14(int) Load 403 + 406: 14(int) Select 405 404 402 + Store 346(i16) 406 + 407: 14(int) Load 346(i16) + 408: 52(ivec2) CompositeConstruct 407 407 + 409: 14(int) Load 346(i16) + 410: 14(int) SNegate 409 + 411: 52(ivec2) CompositeConstruct 410 410 + 414: 52(ivec2) Select 413 411 408 + Store 343(i16v) 414 + 415: 37(ptr) AccessChain 356(u16v) 282 + 416: 36(int) Load 415 + 417: 37(ptr) AccessChain 356(u16v) 264 + 418: 36(int) Load 417 + 419: 36(int) Select 405 418 416 + Store 358(u16) 419 + 420: 36(int) Load 358(u16) + 421: 193(ivec3) CompositeConstruct 420 420 420 + 422: 36(int) Load 358(u16) + 423: 36(int) SNegate 422 + 424: 193(ivec3) CompositeConstruct 423 423 423 + 427: 193(ivec3) Select 426 424 421 + Store 356(u16v) 427 + 429: 52(ivec2) Load 343(i16v) + 430: 27(int) Bitcast 429 + Store 428(i32) 430 + 435: 432(ivec4) Load 434(i16v4) + 436: 71(int) Bitcast 435 + Store 431(i64) 436 + 439: 57(ivec2) Load 438(u16v2) + 440: 17(int) Bitcast 439 + Store 437(u32) 440 + 446: 443(ivec4) Load 445(u16v4) + 447: 77(int) Bitcast 446 + Store 442(u64) 447 + 448: 27(int) Load 428(i32) + 449: 52(ivec2) Bitcast 448 + Store 343(i16v) 449 + 450: 71(int) Load 431(i64) + 451: 432(ivec4) Bitcast 450 + Store 434(i16v4) 451 + 452: 17(int) Load 437(u32) + 453: 57(ivec2) Bitcast 452 + Store 438(u16v2) 453 + 454: 77(int) Load 442(u64) + 455: 443(ivec4) Bitcast 454 + Store 445(u16v4) 455 + 458: 193(ivec3) Load 356(u16v) + 459: 36(int) Load 358(u16) + 460: 193(ivec3) CompositeConstruct 459 459 459 + 461: 425(bvec3) ULessThan 458 460 + Store 457(bv) 461 + 462: 52(ivec2) Load 343(i16v) + 463: 14(int) Load 346(i16) + 464: 52(ivec2) CompositeConstruct 463 463 + 465: 174(bvec2) SLessThan 462 464 + 466: 425(bvec3) Load 457(bv) + 467: 425(bvec3) VectorShuffle 466 465 3 4 2 + Store 457(bv) 467 + 468: 193(ivec3) Load 356(u16v) + 469: 36(int) Load 358(u16) + 470: 193(ivec3) CompositeConstruct 469 469 469 + 471: 425(bvec3) ULessThanEqual 468 470 + Store 457(bv) 471 + 472: 52(ivec2) Load 343(i16v) + 473: 14(int) Load 346(i16) + 474: 52(ivec2) CompositeConstruct 473 473 + 475: 174(bvec2) SLessThanEqual 472 474 + 476: 425(bvec3) Load 457(bv) + 477: 425(bvec3) VectorShuffle 476 475 3 4 2 + Store 457(bv) 477 + 478: 193(ivec3) Load 356(u16v) + 479: 36(int) Load 358(u16) + 480: 193(ivec3) CompositeConstruct 479 479 479 + 481: 425(bvec3) UGreaterThan 478 480 + Store 457(bv) 481 + 482: 52(ivec2) Load 343(i16v) + 483: 14(int) Load 346(i16) + 484: 52(ivec2) CompositeConstruct 483 483 + 485: 174(bvec2) SGreaterThan 482 484 + 486: 425(bvec3) Load 457(bv) + 487: 425(bvec3) VectorShuffle 486 485 3 4 2 + Store 457(bv) 487 + 488: 193(ivec3) Load 356(u16v) + 489: 36(int) Load 358(u16) + 490: 193(ivec3) CompositeConstruct 489 489 489 + 491: 425(bvec3) UGreaterThanEqual 488 490 + Store 457(bv) 491 + 492: 52(ivec2) Load 343(i16v) + 493: 14(int) Load 346(i16) + 494: 52(ivec2) CompositeConstruct 493 493 + 495: 174(bvec2) SGreaterThanEqual 492 494 + 496: 425(bvec3) Load 457(bv) + 497: 425(bvec3) VectorShuffle 496 495 3 4 2 + Store 457(bv) 497 + 498: 193(ivec3) Load 356(u16v) + 499: 36(int) Load 358(u16) + 500: 193(ivec3) CompositeConstruct 499 499 499 + 501: 425(bvec3) IEqual 498 500 + Store 457(bv) 501 + 502: 52(ivec2) Load 343(i16v) + 503: 14(int) Load 346(i16) + 504: 52(ivec2) CompositeConstruct 503 503 + 505: 174(bvec2) IEqual 502 504 + 506: 425(bvec3) Load 457(bv) + 507: 425(bvec3) VectorShuffle 506 505 3 4 2 + Store 457(bv) 507 + 508: 193(ivec3) Load 356(u16v) + 509: 36(int) Load 358(u16) + 510: 193(ivec3) CompositeConstruct 509 509 509 + 511: 425(bvec3) INotEqual 508 510 + Store 457(bv) 511 + 512: 52(ivec2) Load 343(i16v) + 513: 14(int) Load 346(i16) + 514: 52(ivec2) CompositeConstruct 513 513 + 515: 174(bvec2) INotEqual 512 514 + 516: 425(bvec3) Load 457(bv) + 517: 425(bvec3) VectorShuffle 516 515 3 4 2 + Store 457(bv) 517 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.vulkan110.storageBuffer.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.vulkan110.storageBuffer.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.vulkan110.storageBuffer.vert.out 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.vulkan110.storageBuffer.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,66 @@ +spv.vulkan110.storageBuffer.vert +// Module Version 10300 +// Generated by (magic number): 80006 +// Id's are bound by 31 + + Capability Shader + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Vertex 4 "main" 13 + Source GLSL 450 + Name 4 "main" + Name 11 "gl_PerVertex" + MemberName 11(gl_PerVertex) 0 "gl_Position" + MemberName 11(gl_PerVertex) 1 "gl_PointSize" + MemberName 11(gl_PerVertex) 2 "gl_ClipDistance" + MemberName 11(gl_PerVertex) 3 "gl_CullDistance" + Name 13 "" + Name 16 "ub" + MemberName 16(ub) 0 "a" + Name 18 "ubi" + Name 22 "bb" + MemberName 22(bb) 0 "b" + Name 24 "bbi" + MemberDecorate 11(gl_PerVertex) 0 BuiltIn Position + MemberDecorate 11(gl_PerVertex) 1 BuiltIn PointSize + MemberDecorate 11(gl_PerVertex) 2 BuiltIn ClipDistance + MemberDecorate 11(gl_PerVertex) 3 BuiltIn CullDistance + Decorate 11(gl_PerVertex) Block + MemberDecorate 16(ub) 0 Offset 0 + Decorate 16(ub) Block + Decorate 18(ubi) DescriptorSet 0 + MemberDecorate 22(bb) 0 Offset 0 + Decorate 22(bb) Block + Decorate 24(bbi) DescriptorSet 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeVector 6(float) 4 + 8: TypeInt 32 0 + 9: 8(int) Constant 1 + 10: TypeArray 6(float) 9 +11(gl_PerVertex): TypeStruct 7(fvec4) 6(float) 10 10 + 12: TypePointer Output 11(gl_PerVertex) + 13: 12(ptr) Variable Output + 14: TypeInt 32 1 + 15: 14(int) Constant 0 + 16(ub): TypeStruct 7(fvec4) + 17: TypePointer Uniform 16(ub) + 18(ubi): 17(ptr) Variable Uniform + 19: TypePointer Uniform 7(fvec4) + 22(bb): TypeStruct 7(fvec4) + 23: TypePointer StorageBuffer 22(bb) + 24(bbi): 23(ptr) Variable StorageBuffer + 25: TypePointer StorageBuffer 7(fvec4) + 29: TypePointer Output 7(fvec4) + 4(main): 2 Function None 3 + 5: Label + 20: 19(ptr) AccessChain 18(ubi) 15 + 21: 7(fvec4) Load 20 + 26: 25(ptr) AccessChain 24(bbi) 15 + 27: 7(fvec4) Load 26 + 28: 7(fvec4) FAdd 21 27 + 30: 29(ptr) AccessChain 13 15 + Store 30 28 + Return + FunctionEnd diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.while-continue-break.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.while-continue-break.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.while-continue-break.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.while-continue-break.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.while-continue-break.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 41 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.whileLoop.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.whileLoop.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.whileLoop.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.whileLoop.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.whileLoop.frag // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 35 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.while-simple.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.while-simple.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.while-simple.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.while-simple.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.while-simple.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 22 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.xfb2.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.xfb2.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.xfb2.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.xfb2.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.xfb2.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 35 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.xfb3.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.xfb3.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.xfb3.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.xfb3.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.xfb3.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 35 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.xfb.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.xfb.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/spv.xfb.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/spv.xfb.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ spv.xfb.vert // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 16 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/versionsClean.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/versionsClean.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/versionsClean.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/versionsClean.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -6,7 +6,7 @@ 0:42 Sequence 0:42 move second child to first child ( temp 4-component vector of float) 0:42 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position) -0:42 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:42 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 0:42 Constant: 0:42 0 (const uint) 0:42 Construct vec4 ( temp 4-component vector of float) @@ -16,7 +16,7 @@ 0:? Linker Objects 0:? 'color' ( in 3-component vector of float) 0:? 'foo' ( uniform sampler2DRect) -0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 0:? 'gl_VertexID' ( gl_VertexId int VertexId) 0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/versionsErrors.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/versionsErrors.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/versionsErrors.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/versionsErrors.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -13,7 +13,7 @@ 0:44 Sequence 0:44 move second child to first child ( temp 4-component vector of float) 0:44 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position) -0:44 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:44 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 0:44 Constant: 0:44 0 (const uint) 0:44 Construct vec4 ( temp 4-component vector of float) @@ -24,7 +24,7 @@ 0:? Linker Objects 0:? 'color' ( in 3-component vector of float) 0:? 'foo' ( uniform sampler2DRect) -0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out implicitly-sized array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) +0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance, gl_ClipVertex 4-component vector of float ClipVertex gl_ClipVertex, out 4-component vector of float FrontColor gl_FrontColor, out 4-component vector of float BackColor gl_BackColor, out 4-component vector of float FrontSecondaryColor gl_FrontSecondaryColor, out 4-component vector of float BackSecondaryColor gl_BackSecondaryColor, out unsized 1-element array of 4-component vector of float TexCoord gl_TexCoord, out float FogFragCoord gl_FogFragCoord}) 0:? 'gl_VertexID' ( gl_VertexId int VertexId) 0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId) diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/vulkan.ast.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/vulkan.ast.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/vulkan.ast.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/vulkan.ast.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -258,7 +258,7 @@ 0:? 2 (const int) // Module Version 10000 -// Generated by (magic number): 80003 +// Generated by (magic number): 80006 // Id's are bound by 50 Capability Shader diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/vulkan.frag.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/vulkan.frag.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/vulkan.frag.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/vulkan.frag.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,4 +1,11 @@ vulkan.frag +ERROR: 0:3: 'binding' : sampler/texture/image requires layout(binding=X) +ERROR: 0:4: 'binding' : sampler/texture/image requires layout(binding=X) +ERROR: 0:5: 'binding' : sampler/texture/image requires layout(binding=X) +ERROR: 0:6: 'binding' : sampler/texture/image requires layout(binding=X) +ERROR: 0:8: 'binding' : sampler/texture/image requires layout(binding=X) +ERROR: 0:9: 'binding' : sampler/texture/image requires layout(binding=X) +ERROR: 0:10: 'binding' : sampler/texture/image requires layout(binding=X) ERROR: 0:14: 'sampler2D' : sampler-constructor requires two arguments ERROR: 0:15: 'sampler2D' : sampler-constructor first argument must be a scalar textureXXX type ERROR: 0:16: 'sampler2D' : sampler-constructor first argument must be a scalar textureXXX type @@ -14,13 +21,19 @@ ERROR: 0:29: 'sampler3D' : sampler-constructor cannot make an array of samplers ERROR: 0:29: 'sampler3D' : sampler/image types can only be used in uniform variables or function parameters: s3d ERROR: 0:29: '=' : cannot convert from ' const float' to ' global 4-element array of highp sampler3D' +ERROR: 0:31: 'location' : SPIR-V requires location for user input/output ERROR: 0:39: 'push_constant' : can only be used with a uniform ERROR: 0:43: 'non-opaque uniforms outside a block' : not allowed when using GLSL for Vulkan ERROR: 0:43: 'push_constant' : can only be used with a block ERROR: 0:45: 'push_constant' : cannot declare a default, can only be used on a block +ERROR: 0:51: 'binding' : sampler/texture/image requires layout(binding=X) +ERROR: 0:52: 'binding' : sampler/texture/image requires layout(binding=X) ERROR: 0:52: 'input_attachment_index' : can only be used with a subpass +ERROR: 0:53: 'binding' : sampler/texture/image requires layout(binding=X) ERROR: 0:53: 'input_attachment_index' : can only be used with a subpass +ERROR: 0:54: 'binding' : sampler/texture/image requires layout(binding=X) ERROR: 0:54: 'subpass' : requires an input_attachment_index layout qualifier +ERROR: 0:55: 'binding' : sampler/texture/image requires layout(binding=X) ERROR: 0:60: 'subpassLoadMS' : no matching overloaded function found ERROR: 0:61: 'subpassLoad' : no matching overloaded function found ERROR: 0:63: 'subpassLoadMS' : no matching overloaded function found @@ -43,7 +56,7 @@ ERROR: 0:102: 'noise2' : no matching overloaded function found ERROR: 0:103: 'noise3' : no matching overloaded function found ERROR: 0:104: 'noise4' : no matching overloaded function found -ERROR: 42 compilation errors. No code generated. +ERROR: 55 compilation errors. No code generated. ERROR: Linking fragment stage: Only one push_constant block is allowed per stage diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/vulkan.vert.out vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/vulkan.vert.out --- vulkan-1.1.70+dfsg1/external/glslang/Test/baseResults/vulkan.vert.out 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/baseResults/vulkan.vert.out 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,20 @@ vulkan.vert ERROR: 0:3: 'subpass input' : not supported in this stage: vertex +ERROR: 0:3: 'binding' : sampler/texture/image requires layout(binding=X) ERROR: 0:4: 'subpass input' : not supported in this stage: vertex +ERROR: 0:4: 'binding' : sampler/texture/image requires layout(binding=X) ERROR: 0:5: 'subpass input' : not supported in this stage: vertex +ERROR: 0:5: 'binding' : sampler/texture/image requires layout(binding=X) ERROR: 0:6: 'subpass input' : not supported in this stage: vertex +ERROR: 0:6: 'binding' : sampler/texture/image requires layout(binding=X) ERROR: 0:7: 'subpass input' : not supported in this stage: vertex +ERROR: 0:7: 'binding' : sampler/texture/image requires layout(binding=X) ERROR: 0:8: 'subpass input' : not supported in this stage: vertex +ERROR: 0:8: 'binding' : sampler/texture/image requires layout(binding=X) +ERROR: 0:10: 'location' : SPIR-V requires location for user input/output ERROR: 0:12: 'constant_id' : can only be applied to a scalar ERROR: 0:13: 'constant_id' : specialization-constant id already used +ERROR: 0:13: 'binding' : sampler/texture/image requires layout(binding=X) ERROR: 0:13: 'constant_id' : can only be applied to 'const'-qualified scalar ERROR: 0:13: 'constant_id' : cannot be applied to this type ERROR: 0:14: 'constant_id' : specialization-constant id is too large @@ -26,7 +34,10 @@ ERROR: 0:50: '[]' : only outermost dimension of an array of arrays can be a specialization constant ERROR: 0:51: '[]' : only outermost dimension of an array of arrays can be a specialization constant ERROR: 0:54: '[]' : only outermost dimension of an array of arrays can be a specialization constant -ERROR: 27 compilation errors. No code generated. +ERROR: 0:54: 'location' : SPIR-V requires location for user input/output +ERROR: 0:58: 'location' : SPIR-V requires location for user input/output +ERROR: 0:65: 'location' : overlapping use of location 10 +ERROR: 38 compilation errors. No code generated. SPIR-V is not generated for failed compile or link diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/conditionalDiscard.frag vulkan-1.1.73+dfsg/external/glslang/Test/conditionalDiscard.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/conditionalDiscard.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/conditionalDiscard.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,14 +1,14 @@ -#version 110 - -uniform sampler2D tex; -varying vec2 coord; - -void main (void) -{ - vec4 v = texture2D(tex, coord); - - if (v == vec4(0.1,0.2,0.3,0.4)) - discard; - - gl_FragColor = v; -} +#version 110 + +uniform sampler2D tex; +varying vec2 coord; + +void main (void) +{ + vec4 v = texture2D(tex, coord); + + if (v == vec4(0.1,0.2,0.3,0.4)) + discard; + + gl_FragColor = v; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/constFold.frag vulkan-1.1.73+dfsg/external/glslang/Test/constFold.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/constFold.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/constFold.frag 2018-04-27 11:46:26.000000000 +0000 @@ -120,29 +120,29 @@ f = vec4(inv.x < 2.4 ? -1.0 : 1.0).a; // not folded, ensuring no propagation } -const mat2 mm2 = mat2(1.0, 2.0, 3.0, 4.0); -const mat3x2 mm32 = mat3x2(10.0, 11.0, 12.0, 13.0, 14.0, 15.0); - -void foo3() -{ - mat3x2 r32 = mm2 * mm32; -} - -struct cag { - int i; - float f; - bool b; -}; -const cag a0[3] = cag[3](cag(3, 2.0, true), cag(1, 5.0, true), cag(1, 9.0, false)); - -void foo4() -{ - int a = int(a0[2].f); -} - -const bool cval1 = all(bvec4(true, true, true, true)); -const bool cval2 = all(bvec4(false, false, false, false)); -const bool cval3 = all(bvec4(true, true, false, true)); -const bool cval4 = any(bvec4(true, true, true, true)); -const bool cval5 = any(bvec4(false, false, false, false)); -const bool cval6 = any(bvec4(false, true, false, false)); +const mat2 mm2 = mat2(1.0, 2.0, 3.0, 4.0); +const mat3x2 mm32 = mat3x2(10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + +void foo3() +{ + mat3x2 r32 = mm2 * mm32; +} + +struct cag { + int i; + float f; + bool b; +}; +const cag a0[3] = cag[3](cag(3, 2.0, true), cag(1, 5.0, true), cag(1, 9.0, false)); + +void foo4() +{ + int a = int(a0[2].f); +} + +const bool cval1 = all(bvec4(true, true, true, true)); +const bool cval2 = all(bvec4(false, false, false, false)); +const bool cval3 = all(bvec4(true, true, false, true)); +const bool cval4 = any(bvec4(true, true, true, true)); +const bool cval5 = any(bvec4(false, false, false, false)); +const bool cval6 = any(bvec4(false, true, false, false)); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/conversion.frag vulkan-1.1.73+dfsg/external/glslang/Test/conversion.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/conversion.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/conversion.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,112 +1,112 @@ -#version 130 - -uniform bool u_b; -uniform bvec2 u_b2; -uniform bvec3 u_b3; -uniform bvec4 u_b4; - -uniform int u_i; -uniform ivec2 u_i2; -uniform ivec3 u_i3; -uniform ivec4 u_i4; - -uniform float u_f; -uniform vec2 u_f2; -uniform vec3 u_f3; -uniform vec4 u_f4; - -uniform bool i_b; -uniform bvec2 i_b2; -uniform bvec3 i_b3; -uniform bvec4 i_b4; - -flat in int i_i; -flat in ivec2 i_i2; -flat in ivec3 i_i3; -flat in ivec4 i_i4; - -in float i_f; -in vec2 i_f2; -in vec3 i_f3; -in vec4 i_f4; - -void main() -{ - bool b = bool(u_i) ^^ bool(u_f); - bvec2 b2 = bvec2(u_i, u_f); - bvec3 b3 = bvec3(u_i, u_f, i_i); - bvec4 b4 = bvec4(u_i, u_f, i_i, i_f); - - int i = int(u_f) + int(b); - ivec2 i2 = ivec2(u_f2) + ivec2(b2); - ivec3 i3 = ivec3(u_f3) + ivec3(b3); - ivec4 i4 = ivec4(u_f4) + ivec4(b4); - - float f = i; - vec2 f2 = i2; - vec3 f3 = i3; - vec4 f4 = i4; - - f += (float(i) + float(b)); - f2 -= vec2(i2) + vec2(b2); - f3 /= vec3(i3) + vec3(b3); - f4 += vec4(i4) + vec4(b4); - - f4 += vec4(bvec4(i_i4)); - f4 += vec4(bvec4(u_f4)); - - f += f - i; - f2 += vec2(f, i) + i2; - f3 += i3 + vec3(f, i, f); - f4 += vec4(b, i, f, i) + i4; - - f2 += vec2(f, i) * i; - f3 += vec3(f, i, f) + i; - f4 += i - vec4(b, i, f, i); - - i2 += ivec2(f, i); - i3 += ivec3(f, i, f); - i4 += ivec4(b, i, f, i); - - if (f < i || i < f || - f2 == i2 || - i3 != f3) - f = (b ? i : f2.x) + (b2.x ? f3.x : i2.y); - - gl_FragColor = - b || - b2.x || - b2.y || - b3.x || - b3.y || - b3.z || - b4.x || - b4.y || - b4.z || - b4.w ? vec4( - i + - i2.x + - i2.y + - i3.x + - i3.y + - i3.z + - i4.x + - i4.y + - i4.z + - i4.w + - f + - f2.x + - f2.y + - f3.x + - f3.y + - f3.z + - f4.x + - f4.y + - f4.z + - f4.w) : vec4(1.0); - - // with constants... - ivec4 cv2 = ivec4(1.0); - bvec4 cv5 = bvec4(cv2); - gl_FragColor += float(cv5); -} +#version 130 + +uniform bool u_b; +uniform bvec2 u_b2; +uniform bvec3 u_b3; +uniform bvec4 u_b4; + +uniform int u_i; +uniform ivec2 u_i2; +uniform ivec3 u_i3; +uniform ivec4 u_i4; + +uniform float u_f; +uniform vec2 u_f2; +uniform vec3 u_f3; +uniform vec4 u_f4; + +uniform bool i_b; +uniform bvec2 i_b2; +uniform bvec3 i_b3; +uniform bvec4 i_b4; + +flat in int i_i; +flat in ivec2 i_i2; +flat in ivec3 i_i3; +flat in ivec4 i_i4; + +in float i_f; +in vec2 i_f2; +in vec3 i_f3; +in vec4 i_f4; + +void main() +{ + bool b = bool(u_i) ^^ bool(u_f); + bvec2 b2 = bvec2(u_i, u_f); + bvec3 b3 = bvec3(u_i, u_f, i_i); + bvec4 b4 = bvec4(u_i, u_f, i_i, i_f); + + int i = int(u_f) + int(b); + ivec2 i2 = ivec2(u_f2) + ivec2(b2); + ivec3 i3 = ivec3(u_f3) + ivec3(b3); + ivec4 i4 = ivec4(u_f4) + ivec4(b4); + + float f = i; + vec2 f2 = i2; + vec3 f3 = i3; + vec4 f4 = i4; + + f += (float(i) + float(b)); + f2 -= vec2(i2) + vec2(b2); + f3 /= vec3(i3) + vec3(b3); + f4 += vec4(i4) + vec4(b4); + + f4 += vec4(bvec4(i_i4)); + f4 += vec4(bvec4(u_f4)); + + f += f - i; + f2 += vec2(f, i) + i2; + f3 += i3 + vec3(f, i, f); + f4 += vec4(b, i, f, i) + i4; + + f2 += vec2(f, i) * i; + f3 += vec3(f, i, f) + i; + f4 += i - vec4(b, i, f, i); + + i2 += ivec2(f, i); + i3 += ivec3(f, i, f); + i4 += ivec4(b, i, f, i); + + if (f < i || i < f || + f2 == i2 || + i3 != f3) + f = (b ? i : f2.x) + (b2.x ? f3.x : i2.y); + + gl_FragColor = + b || + b2.x || + b2.y || + b3.x || + b3.y || + b3.z || + b4.x || + b4.y || + b4.z || + b4.w ? vec4( + i + + i2.x + + i2.y + + i3.x + + i3.y + + i3.z + + i4.x + + i4.y + + i4.z + + i4.w + + f + + f2.x + + f2.y + + f3.x + + f3.y + + f3.z + + f4.x + + f4.y + + f4.z + + f4.w) : vec4(1.0); + + // with constants... + ivec4 cv2 = ivec4(1.0); + bvec4 cv5 = bvec4(cv2); + gl_FragColor += float(cv5); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/cppBad2.vert vulkan-1.1.73+dfsg/external/glslang/Test/cppBad2.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/cppBad2.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/cppBad2.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,3 +1,3 @@ -#define a b( -#define b(x) +#define a b( +#define b(x) b(a) \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/cppBad.vert vulkan-1.1.73+dfsg/external/glslang/Test/cppBad.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/cppBad.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/cppBad.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,5 +1,5 @@ -#define m#0# -#if m - -#define n() +#define m#0# +#if m +#endif +#define n() int n" \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/cppDeepNest.frag vulkan-1.1.73+dfsg/external/glslang/Test/cppDeepNest.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/cppDeepNest.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/cppDeepNest.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,117 +1,117 @@ -#ifdef O -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#if -#endif +#ifdef O +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#if +#endif diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/cppRelaxSkipTokensErrors.vert vulkan-1.1.73+dfsg/external/glslang/Test/cppRelaxSkipTokensErrors.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/cppRelaxSkipTokensErrors.vert 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/cppRelaxSkipTokensErrors.vert 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,14 @@ +#version 110 + +#if 0 +3.5L +3.5h +2034h +1.#INF +0x1234567812345L +12323394203923879234L +0123s; +123s; +0123456712345671234L +"string" +#endif diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/dataOut.frag vulkan-1.1.73+dfsg/external/glslang/Test/dataOut.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/dataOut.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/dataOut.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,8 @@ -#version 130 - -varying vec4 Color; - -void main() -{ - gl_FragData[1] = Color; -} +#version 130 + +varying vec4 Color; + +void main() +{ + gl_FragData[1] = Color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/dataOutIndirect.frag vulkan-1.1.73+dfsg/external/glslang/Test/dataOutIndirect.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/dataOutIndirect.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/dataOutIndirect.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,10 +1,10 @@ -#version 130 - -varying vec4 Color; - -uniform int i; - -void main() -{ - gl_FragData[i] = Color; -} +#version 130 + +varying vec4 Color; + +uniform int i; + +void main() +{ + gl_FragData[i] = Color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/dce.frag vulkan-1.1.73+dfsg/external/glslang/Test/dce.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/dce.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/dce.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,56 +1,56 @@ -#version 400 - -const bool flag = false; - -int c = 0; - -void bar() -{ - if (flag) - ++c; // should still show up in AST - else - ++c; - - flag ? ++c : ++c; // both should still show up in AST - - switch (c) { - case 1: - ++c; - break; - ++c; // should still show up in AST - case 2: - break; - ++c; // should still show up in AST - default: - break; - } - - for (int i = 0; i < 0; ++i) - ++c; // should still show up in AST - - for (int i = 0; i < 10; ++i) { - if (c < 3) { - break; - ++c; // should still show up in AST - } else { - continue; - ++c; // should still show up in AST - } - } - - return; - - ++c; // should still show up in AST -} - -int foo() // not called, but should still show up in AST -{ - if (c > 4) { - return 4; - ++c; // should still show up in AST - } - - return 5; - - ++c; // should still show up in AST -} +#version 400 + +const bool flag = false; + +int c = 0; + +void bar() +{ + if (flag) + ++c; // should still show up in AST + else + ++c; + + flag ? ++c : ++c; // both should still show up in AST + + switch (c) { + case 1: + ++c; + break; + ++c; // should still show up in AST + case 2: + break; + ++c; // should still show up in AST + default: + break; + } + + for (int i = 0; i < 0; ++i) + ++c; // should still show up in AST + + for (int i = 0; i < 10; ++i) { + if (c < 3) { + break; + ++c; // should still show up in AST + } else { + continue; + ++c; // should still show up in AST + } + } + + return; + + ++c; // should still show up in AST +} + +int foo() // not called, but should still show up in AST +{ + if (c > 4) { + return 4; + ++c; // should still show up in AST + } + + return 5; + + ++c; // should still show up in AST +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/decls.frag vulkan-1.1.73+dfsg/external/glslang/Test/decls.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/decls.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/decls.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,49 +1,49 @@ -#version 120 - -int a; -int b, c; -int d1 = 1; -int e2 = 2, f; -int g, h3 = 3; - -int i4[4]; -int j, k5[5]; -int m6[6], m7[7]; -int n8[8], p; - -int ii4[4] = int[](1, 2, 3, 4); -int ij, ik5[5] = int[](5, 6, 7, 8, 9); -int im2[2] = int[](10, 11), im3[3] = int[](12, 13, 14); -int in8[4] = int[](21, 22, 23, 24), ip; - -void vi4[4] = int[](1, 2, 3, 4); -void vj, vk5[5] = int[](5, 6, 7, 8, 9); -void vm2[2] = int[](10, 11), vm3[3] = int[](12, 13, 14); -void vn8[4] = int[](21, 22, 23, 24), vp; - -const int cii4[4] = int[](1, 2, 3, 4); -const int cij, cik5[5] = int[](5, 6, 7, 8, 9); -const int cim2[2] = int[](10, 11), cim3[3] = int[](12, 13, 14); -const int cin8[4] = int[](21, 22, 23, 24), cip; - -uniform int uii4[4] = int[](1, 2, 3, 4); -uniform int uij, uik5[5] = int[](5, 6, 7, 8, 9); -uniform int uim2[2] = int[](10, 11), uim3[3] = int[](12, 13, 14); -uniform int uin8[4] = int[](21, 22, 23, 24), uip; - -int gl_vi4[4] = int[](1, 2, 3, 4); -int gl_vj, gl_vk5[5] = int[](5, 6, 7, 8, 9); -int gl_vm2[2] = int[](10, 11), gl_vm3[3] = int[](12, 13, 14); -int gl_vn8[4] = int[](21, 22, 23, 24), gl_vp; - -void main() -{ - while (bool cond = b < c); - while (int icond = b); - while (bool gl_cond = b < c); -} - -int foob__vi4[4] = int[](1, 2, 3, 4); -int foob__vj, foob__vk5[5] = int[](5, 6, 7, 8, 9); -int __foobvm2[2] = int[](10, 11), __foobvm3[3] = int[](12, 13, 14); -int foob__vn8[4] = int[](21, 22, 23, 24), foob__vp; +#version 120 + +int a; +int b, c; +int d1 = 1; +int e2 = 2, f; +int g, h3 = 3; + +int i4[4]; +int j, k5[5]; +int m6[6], m7[7]; +int n8[8], p; + +int ii4[4] = int[](1, 2, 3, 4); +int ij, ik5[5] = int[](5, 6, 7, 8, 9); +int im2[2] = int[](10, 11), im3[3] = int[](12, 13, 14); +int in8[4] = int[](21, 22, 23, 24), ip; + +void vi4[4] = int[](1, 2, 3, 4); +void vj, vk5[5] = int[](5, 6, 7, 8, 9); +void vm2[2] = int[](10, 11), vm3[3] = int[](12, 13, 14); +void vn8[4] = int[](21, 22, 23, 24), vp; + +const int cii4[4] = int[](1, 2, 3, 4); +const int cij, cik5[5] = int[](5, 6, 7, 8, 9); +const int cim2[2] = int[](10, 11), cim3[3] = int[](12, 13, 14); +const int cin8[4] = int[](21, 22, 23, 24), cip; + +uniform int uii4[4] = int[](1, 2, 3, 4); +uniform int uij, uik5[5] = int[](5, 6, 7, 8, 9); +uniform int uim2[2] = int[](10, 11), uim3[3] = int[](12, 13, 14); +uniform int uin8[4] = int[](21, 22, 23, 24), uip; + +int gl_vi4[4] = int[](1, 2, 3, 4); +int gl_vj, gl_vk5[5] = int[](5, 6, 7, 8, 9); +int gl_vm2[2] = int[](10, 11), gl_vm3[3] = int[](12, 13, 14); +int gl_vn8[4] = int[](21, 22, 23, 24), gl_vp; + +void main() +{ + while (bool cond = b < c); + while (int icond = b); + while (bool gl_cond = b < c); +} + +int foob__vi4[4] = int[](1, 2, 3, 4); +int foob__vj, foob__vk5[5] = int[](5, 6, 7, 8, 9); +int __foobvm2[2] = int[](10, 11), __foobvm3[3] = int[](12, 13, 14); +int foob__vn8[4] = int[](21, 22, 23, 24), foob__vp; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/deepRvalue.frag vulkan-1.1.73+dfsg/external/glslang/Test/deepRvalue.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/deepRvalue.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/deepRvalue.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,36 +1,36 @@ -#version 120 - -uniform sampler2D sampler; - -vec4 v1 = vec4(2.0, 3.0, 5.0, 7.0); -vec4 v2 = vec4(11.0, 13.0, 17.0, 19.0); -vec4 v3 = vec4(23.0, 29.0, 31.0, 37.0); -vec4 v4 = vec4(41.0, 43.0, 47.0, 53.0); - -struct str { - int a; - vec2 b[3]; - bool c; -}; - -void main() -{ - mat4 m = mat4(v1, v2, v3, v4); - - mat4 mm = matrixCompMult(m, m); - float f = mm[1].w; // should be 19 * 19 = 361 - - // do a deep access to a spontaneous r-value - float g = matrixCompMult(m, m)[2].y; // should be 29 * 29 = 841 - - float h = str(1, vec2[3](vec2(2.0, 3.0), vec2(4.0, 5.0), vec2(6.0, 7.0)), true).b[1][1]; // should be 5.0 - - float i = texture2D(sampler, vec2(0.5,0.5)).y; - - i += (i > 0.1 ? v1 : v2)[3]; - - str t; - i += (t = str(1, vec2[3](vec2(2.0, 3.0), vec2(4.0, 5.0), vec2(6.0, 7.0)), true)).b[2].y; // should be 7.0 - - gl_FragColor = vec4(f, g, h, i); -} +#version 120 + +uniform sampler2D sampler; + +vec4 v1 = vec4(2.0, 3.0, 5.0, 7.0); +vec4 v2 = vec4(11.0, 13.0, 17.0, 19.0); +vec4 v3 = vec4(23.0, 29.0, 31.0, 37.0); +vec4 v4 = vec4(41.0, 43.0, 47.0, 53.0); + +struct str { + int a; + vec2 b[3]; + bool c; +}; + +void main() +{ + mat4 m = mat4(v1, v2, v3, v4); + + mat4 mm = matrixCompMult(m, m); + float f = mm[1].w; // should be 19 * 19 = 361 + + // do a deep access to a spontaneous r-value + float g = matrixCompMult(m, m)[2].y; // should be 29 * 29 = 841 + + float h = str(1, vec2[3](vec2(2.0, 3.0), vec2(4.0, 5.0), vec2(6.0, 7.0)), true).b[1][1]; // should be 5.0 + + float i = texture2D(sampler, vec2(0.5,0.5)).y; + + i += (i > 0.1 ? v1 : v2)[3]; + + str t; + i += (t = str(1, vec2[3](vec2(2.0, 3.0), vec2(4.0, 5.0), vec2(6.0, 7.0)), true)).b[2].y; // should be 7.0 + + gl_FragColor = vec4(f, g, h, i); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/depthOut.frag vulkan-1.1.73+dfsg/external/glslang/Test/depthOut.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/depthOut.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/depthOut.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,10 +1,10 @@ -#version 130 - -varying vec4 Color; -varying float Depth; - -void main() -{ - gl_FragDepth = Depth; - gl_FragColor = Color; -} +#version 130 + +varying vec4 Color; +varying float Depth; + +void main() +{ + gl_FragDepth = Depth; + gl_FragColor = Color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/discard-dce.frag vulkan-1.1.73+dfsg/external/glslang/Test/discard-dce.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/discard-dce.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/discard-dce.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,35 +1,35 @@ -#version 110 -varying vec2 tex_coord; - -void main (void) -{ - vec4 white = vec4(1.0); - vec4 black = vec4(0.2); - vec4 color = white; - - // First, cut out our circle - float x = tex_coord.x*2.0 - 1.0; - float y = tex_coord.y*2.0 - 1.0; - - float radius = sqrt(x*x + y*y); - if (radius > 1.0) { - if (radius > 1.1) { - ++color; - } - - gl_FragColor = color; - - if (radius > 1.2) { - ++color; - } - - discard; - } - - // If we're near an edge, darken us a tiny bit - if (radius >= 0.75) - color -= abs(pow(radius, 16.0)/2.0); - - gl_FragColor = color; - -} +#version 110 +varying vec2 tex_coord; + +void main (void) +{ + vec4 white = vec4(1.0); + vec4 black = vec4(0.2); + vec4 color = white; + + // First, cut out our circle + float x = tex_coord.x*2.0 - 1.0; + float y = tex_coord.y*2.0 - 1.0; + + float radius = sqrt(x*x + y*y); + if (radius > 1.0) { + if (radius > 1.1) { + ++color; + } + + gl_FragColor = color; + + if (radius > 1.2) { + ++color; + } + + discard; + } + + // If we're near an edge, darken us a tiny bit + if (radius >= 0.75) + color -= abs(pow(radius, 16.0)/2.0); + + gl_FragColor = color; + +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/doWhileLoop.frag vulkan-1.1.73+dfsg/external/glslang/Test/doWhileLoop.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/doWhileLoop.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/doWhileLoop.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,16 @@ -#version 110 - -uniform vec4 bigColor; -varying vec4 BaseColor; -uniform float d; - -void main() -{ - vec4 color = BaseColor; - - do { - color += bigColor; - } while (color.x < d); - - gl_FragColor = color; -} +#version 110 + +uniform vec4 bigColor; +varying vec4 BaseColor; +uniform float d; + +void main() +{ + vec4 color = BaseColor; + + do { + color += bigColor; + } while (color.x < d); + + gl_FragColor = color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/earlyReturnDiscard.frag vulkan-1.1.73+dfsg/external/glslang/Test/earlyReturnDiscard.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/earlyReturnDiscard.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/earlyReturnDiscard.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,102 +1,102 @@ -#version 110 - -uniform float d; -uniform vec4 bigColor, smallColor; -uniform vec4 otherColor; - -varying float c; - -uniform float threshhold; -uniform float threshhold2; -uniform float threshhold3; - -uniform float minimum; - -varying vec4 BaseColor; - -uniform bool b; - -void main() -{ - vec4 color = BaseColor; - vec4 color2; - - color2 = otherColor; - - if (c > d) - color += bigColor; - else - color += smallColor; - - if (color.z < minimum) - return; - - color.z++; - - if (color.z > threshhold) - discard; - - color++; - - // Two path, different rest - if (color.w > threshhold2) { - if (color.z > threshhold2) - return; - else if (b) - color.z++; - else { - if (color.x < minimum) { - discard; - } else { - color++; - } - } - } else { - if (b) - discard; - else - return; - } - - - // // Two path, shared rest - // if (color.w > threshhold2) { - // if (color.z > threshhold2) - // return; - // else if (b) - // color++; - // else { - // if (color.x < minimum) { - // discard; - // } else { - // color++; - // } - // } - // } else { - // if (b) - // discard; - // else - // return; - // } - - - // // One path - // if (color.w > threshhold2) { - // if (color.z > threshhold2) - // return; - // else { - // if (color.x < minimum) { - // discard; - // } else { - // color++; - // } - // } - // } else { - // if (b) - // discard; - // else - // return; - // } - - gl_FragColor = color * color2; -} +#version 110 + +uniform float d; +uniform vec4 bigColor, smallColor; +uniform vec4 otherColor; + +varying float c; + +uniform float threshhold; +uniform float threshhold2; +uniform float threshhold3; + +uniform float minimum; + +varying vec4 BaseColor; + +uniform bool b; + +void main() +{ + vec4 color = BaseColor; + vec4 color2; + + color2 = otherColor; + + if (c > d) + color += bigColor; + else + color += smallColor; + + if (color.z < minimum) + return; + + color.z++; + + if (color.z > threshhold) + discard; + + color++; + + // Two path, different rest + if (color.w > threshhold2) { + if (color.z > threshhold2) + return; + else if (b) + color.z++; + else { + if (color.x < minimum) { + discard; + } else { + color++; + } + } + } else { + if (b) + discard; + else + return; + } + + + // // Two path, shared rest + // if (color.w > threshhold2) { + // if (color.z > threshhold2) + // return; + // else if (b) + // color++; + // else { + // if (color.x < minimum) { + // discard; + // } else { + // color++; + // } + // } + // } else { + // if (b) + // discard; + // else + // return; + // } + + + // // One path + // if (color.w > threshhold2) { + // if (color.z > threshhold2) + // return; + // else { + // if (color.x < minimum) { + // discard; + // } else { + // color++; + // } + // } + // } else { + // if (b) + // discard; + // else + // return; + // } + + gl_FragColor = color * color2; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/findFunction.frag vulkan-1.1.73+dfsg/external/glslang/Test/findFunction.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/findFunction.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/findFunction.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,46 @@ +#version 450 + +#extension GL_KHX_shader_explicit_arithmetic_types: enable + +int64_t func(int8_t a, int16_t b, int16_t c) +{ + return int64_t(a | b + c); +} + +int64_t func(int8_t a, int16_t b, int32_t c) +{ + return int64_t(a | b - c); +} + +int64_t func(int32_t a, int32_t b, int32_t c) +{ + return int64_t(a / b + c); +} + +int64_t func(float16_t a, float16_t b, float32_t c) +{ + return int64_t(a - b * c); +} + +int64_t func(float16_t a, int16_t b, float32_t c) +{ + return int64_t(a - b * c); +} + +void main() +{ + int8_t x; + int16_t y; + int32_t z; + int64_t w; + float16_t f16; + float64_t f64; + int64_t b1 = func(x, y, z); + int64_t b2 = func(y, y, z); // tie + int64_t b3 = func(y, y, w); // No match + int64_t b4 = func(y, z, f16); // No match + int64_t b5 = func(y, y, f16); + int64_t b7 = func(f16, f16, y); + int64_t b8 = func(f16, f16, f64); // No match + int64_t b9 = func(f16, x, f16); // tie +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/flowControl.frag vulkan-1.1.73+dfsg/external/glslang/Test/flowControl.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/flowControl.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/flowControl.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,23 +1,23 @@ -#version 120 - -uniform float d; -uniform vec4 bigColor, smallColor; -uniform vec4 otherColor; - -varying float c; -varying vec4 BaseColor; - -void main() -{ - vec4 color = BaseColor; - vec4 color2; - - color2 = otherColor; - - if (c > d) - color += bigColor; - else - color += smallColor; - - gl_FragColor = color * color2; -} +#version 120 + +uniform float d; +uniform vec4 bigColor, smallColor; +uniform vec4 otherColor; + +varying float c; +varying vec4 BaseColor; + +void main() +{ + vec4 color = BaseColor; + vec4 color2; + + color2 = otherColor; + + if (c > d) + color += bigColor; + else + color += smallColor; + + gl_FragColor = color * color2; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/forLoop.frag vulkan-1.1.73+dfsg/external/glslang/Test/forLoop.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/forLoop.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/forLoop.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,41 +1,41 @@ -#version 130 - -uniform vec4 bigColor; -in vec4 BaseColor; -in float f; - -uniform int Count; -uniform uvec4 v4; - -void main() -{ - vec4 color = BaseColor; - - for (int i = 0; i < Count; ++i) { - color += bigColor; - } - - gl_FragColor = color; - - float sum = 0.0; - for (int i = 0; i < 4; ++i) - sum += v4[i]; - - vec4 tv4; - - for (int i = 0; i < 4; ++i) - tv4[i] = v4[i] * 4u; - - gl_FragColor += vec4(sum) + tv4; - - vec4 r; - r.xyz = BaseColor.xyz; - - for (int i = 0; i < Count; ++i) - r.w = f; - - gl_FragColor.xyz += r.xyz; - - for (int i = 0; i < 16; i += 4) - gl_FragColor *= f; -} +#version 130 + +uniform vec4 bigColor; +in vec4 BaseColor; +in float f; + +uniform int Count; +uniform uvec4 v4; + +void main() +{ + vec4 color = BaseColor; + + for (int i = 0; i < Count; ++i) { + color += bigColor; + } + + gl_FragColor = color; + + float sum = 0.0; + for (int i = 0; i < 4; ++i) + sum += v4[i]; + + vec4 tv4; + + for (int i = 0; i < 4; ++i) + tv4[i] = v4[i] * 4u; + + gl_FragColor += vec4(sum) + tv4; + + vec4 r; + r.xyz = BaseColor.xyz; + + for (int i = 0; i < Count; ++i) + r.w = f; + + gl_FragColor.xyz += r.xyz; + + for (int i = 0; i < 16; i += 4) + gl_FragColor *= f; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/functionCall.frag vulkan-1.1.73+dfsg/external/glslang/Test/functionCall.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/functionCall.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/functionCall.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,44 +1,44 @@ -#version 130 - -uniform vec4 bigColor; -varying vec4 BaseColor; -uniform float d; - -float h = 0.0; - -float foo(vec4 bar) -{ - return bar.x + bar.y; -} - -void bar() -{ -} - -float unreachableReturn() -{ - if (d < 4.2) - return 1.2; - else - return 4.5; - // might be another return inserted here by builders, has to be correct type -} - -float missingReturn() -{ - if (d < 4.5) { - h = d; - return 3.9; - } -} - -void main() -{ - vec4 color = vec4(foo(BaseColor)); - - bar(); - float f = unreachableReturn(); - float g = missingReturn(); - - gl_FragColor = color * f * h; -} +#version 130 + +uniform vec4 bigColor; +varying vec4 BaseColor; +uniform float d; + +float h = 0.0; + +float foo(vec4 bar) +{ + return bar.x + bar.y; +} + +void bar() +{ +} + +float unreachableReturn() +{ + if (d < 4.2) + return 1.2; + else + return 4.5; + // might be another return inserted here by builders, has to be correct type +} + +float missingReturn() +{ + if (d < 4.5) { + h = d; + return 3.9; + } +} + +void main() +{ + vec4 color = vec4(foo(BaseColor)); + + bar(); + float f = unreachableReturn(); + float g = missingReturn(); + + gl_FragColor = color * f * h; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/functionSemantics.frag vulkan-1.1.73+dfsg/external/glslang/Test/functionSemantics.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/functionSemantics.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/functionSemantics.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,75 +1,75 @@ -#version 400 - -uniform float u; - -int foo(int a, const int b, in int c, const in int d, out int e, inout int f) -{ - int sum = a + b + c + d + f; // no e, it is out only - // sum should be 47 now - - a *= 64; - // no b, it is read only - c *= 64; - // no d, it is read only - e = 64 * 16; // e starts undefined - f *= 64; - - sum += a + 64 * b + c + 64 * d + e + f; // everything has a value now, totaling of 64(1+2+4+8+16+32) = 64*63 = 4032 - // sum should be 4032 + 47 = 4079 - - return sum; -} - -int foo2(float a, vec3 b, out int r) -{ - r = int(3.0 * a); - return int(5.0 * b.y); -} - -int foo3() -{ - if (u > 3.2) { - discard; - return 1000000; - } - - return 2000000; -} - -void main() -{ - int e; - int t = 2; - struct s { - ivec4 t; - } f; - f.t.y = 32; - - // test the different qualifers - int color = foo(1, 2, t+t, 8, e, f.t.y); - - color += 128 * (e + f.t.y); // right side should be 128(64(16 + 32)) = 393216 - // sum should be 4079 + 393216 = 397295 - - // test conversions - float arg; - float ret; - ret = foo2(4, ivec3(1,2,3), arg); // ret = 10, param = 12.0 - color += int(ret + arg); // adds 22, for total of 397317 - - color += foo3(); // theoretically, add 2000000, for total of 2397317 - - gl_FragColor = vec4(color); -} - -vec3 m(vec2); -void aggCall() -{ - float F; - m(ivec2(F)); // test input conversion of single argument that's an aggregate; other function tests in 120.vert -} - -vec4 badConv() -{ - return u; // ERROR, can change scalar to vector +#version 400 + +uniform float u; + +int foo(int a, const int b, in int c, const in int d, out int e, inout int f) +{ + int sum = a + b + c + d + f; // no e, it is out only + // sum should be 47 now + + a *= 64; + // no b, it is read only + c *= 64; + // no d, it is read only + e = 64 * 16; // e starts undefined + f *= 64; + + sum += a + 64 * b + c + 64 * d + e + f; // everything has a value now, totaling of 64(1+2+4+8+16+32) = 64*63 = 4032 + // sum should be 4032 + 47 = 4079 + + return sum; +} + +int foo2(float a, vec3 b, out int r) +{ + r = int(3.0 * a); + return int(5.0 * b.y); +} + +int foo3() +{ + if (u > 3.2) { + discard; + return 1000000; + } + + return 2000000; +} + +void main() +{ + int e; + int t = 2; + struct s { + ivec4 t; + } f; + f.t.y = 32; + + // test the different qualifers + int color = foo(1, 2, t+t, 8, e, f.t.y); + + color += 128 * (e + f.t.y); // right side should be 128(64(16 + 32)) = 393216 + // sum should be 4079 + 393216 = 397295 + + // test conversions + float arg; + float ret; + ret = foo2(4, ivec3(1,2,3), arg); // ret = 10, param = 12.0 + color += int(ret + arg); // adds 22, for total of 397317 + + color += foo3(); // theoretically, add 2000000, for total of 2397317 + + gl_FragColor = vec4(color); +} + +vec3 m(vec2); +void aggCall() +{ + float F; + m(ivec2(F)); // test input conversion of single argument that's an aggregate; other function tests in 120.vert +} + +vec4 badConv() +{ + return u; // ERROR, can change scalar to vector } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/glsl.entryPointRename2.vert vulkan-1.1.73+dfsg/external/glslang/Test/glsl.entryPointRename2.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/glsl.entryPointRename2.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/glsl.entryPointRename2.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ -#version 460 - -void bar() -{ - gl_Position = vec4(1); -} +#version 460 + +void bar() +{ + gl_Position = vec4(1); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/glsl.entryPointRename.vert vulkan-1.1.73+dfsg/external/glslang/Test/glsl.entryPointRename.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/glsl.entryPointRename.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/glsl.entryPointRename.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,11 +1,11 @@ -#version 460 - -void bar() -{ - gl_Position = vec4(1); -} - -void main() -{ - gl_Position = vec4(1); -} +#version 460 + +void bar() +{ + gl_Position = vec4(1); +} + +void main() +{ + gl_Position = vec4(1); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/glspv.esversion.vert vulkan-1.1.73+dfsg/external/glslang/Test/glspv.esversion.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/glspv.esversion.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/glspv.esversion.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,5 +1,5 @@ -#version 310 es - -void main() -{ -} +#version 310 es + +void main() +{ +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/glspv.frag vulkan-1.1.73+dfsg/external/glslang/Test/glspv.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/glspv.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/glspv.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,27 +1,28 @@ -#version 450 - -#ifdef GL_SPIRV -#error GL_SPIRV is set ( correct, not an error ) -#if GL_SPIRV == 100 -#error GL_SPIR is 100 -#endif -#endif - -void main() -{ -} - -uniform float f; // ERROR, no location -layout(location = 2) uniform float g; -uniform sampler2D s1; -layout(location = 3) uniform sampler2D s2; - -void noise() -{ - noise1(vec4(1)); - noise2(4.0); - noise3(vec2(3)); - noise4(1); -} - -layout(input_attachment_index = 1) uniform subpassInput sub; // ERROR, no inputs +#version 450 + +#ifdef GL_SPIRV +#error GL_SPIRV is set ( correct, not an error ) +#if GL_SPIRV == 100 +#error GL_SPIR is 100 +#endif +#endif + +void main() +{ +} + +uniform float f; // ERROR, no location +layout(location = 2) uniform float g; +uniform sampler2D s1; // ERROR, no binding +layout(location = 3) uniform sampler2D s2; // ERROR, no binding + +void noise() +{ + noise1(vec4(1)); + noise2(4.0); + noise3(vec2(3)); + noise4(1); +} + +uniform atomic_uint atomic; // ERROR, no binding +layout(input_attachment_index = 1) uniform subpassInput sub; // ERROR, no inputs diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/glspv.version.frag vulkan-1.1.73+dfsg/external/glslang/Test/glspv.version.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/glspv.version.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/glspv.version.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,5 +1,5 @@ -#version 330 compatibility - -void main() -{ -} +#version 330 compatibility + +void main() +{ +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/glspv.version.vert vulkan-1.1.73+dfsg/external/glslang/Test/glspv.version.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/glspv.version.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/glspv.version.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,5 +1,5 @@ -#version 150 - -void main() -{ -} +#version 150 + +void main() +{ +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/glspv.vert vulkan-1.1.73+dfsg/external/glslang/Test/glspv.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/glspv.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/glspv.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,20 +1,20 @@ -#version 450 - -layout(push_constant) uniform Material { int a; } mat; // ERROR, can't use push_constant - -layout(set = 0, binding = 0, std140) uniform Bt1 { int a; } bt1; -layout(set = 1, binding = 0, std140) uniform Bt2 { int a; } bt2; // ERROR, set has to be 0 - -layout(shared) uniform Bt3 { int a; } bt3; // ERROR, no shared -layout(packed) uniform Bt4 { int a; } bt4; // ERROR, no shared - -void main() -{ - gl_VertexIndex; // ERROR, not preset - gl_InstanceIndex; // ERROR, not present - gl_VertexID; - gl_InstanceID; - gl_DepthRangeParameters; // ERROR, not present -} - -uniform sampler s; // ERROR, no sampler +#version 450 + +layout(push_constant) uniform Material { int a; } mat; // ERROR, can't use push_constant + +layout(set = 0, binding = 0, std140) uniform Bt1 { int a; } bt1; +layout(set = 1, binding = 0, std140) uniform Bt2 { int a; } bt2; // ERROR, set has to be 0 + +layout(shared) uniform Bt3 { int a; } bt3; // ERROR, no shared, no binding +layout(packed) uniform Bt4 { int a; } bt4; // ERROR, no shared, no binding + +void main() +{ + gl_VertexIndex; // ERROR, not preset + gl_InstanceIndex; // ERROR, not present + gl_VertexID; + gl_InstanceID; + gl_DepthRangeParameters; // ERROR, not present +} + +uniform sampler s; // ERROR, no sampler diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.aliasOpaque.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.aliasOpaque.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.aliasOpaque.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.aliasOpaque.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,29 +1,29 @@ -struct OS { - SamplerState ss; - float a; - Texture2D tex; -}; - -SamplerState gss; -SamplerState gss2; -Texture2D gtex; - -float4 osCall(OS s) -{ - return s.a * s.tex.Sample(s.ss, float2(0.2, 0.3)); -} - -float4 main() : SV_TARGET0 -{ - OS os; - os.ss = gss2; - os.ss = gss; - os.tex = gtex; - os.a = 3.0; - - // this should give an error - //SamplerState localss; - //localss = gss2; - - return osCall(os); -} +struct OS { + SamplerState ss; + float a; + Texture2D tex; +}; + +SamplerState gss; +SamplerState gss2; +Texture2D gtex; + +float4 osCall(OS s) +{ + return s.a * s.tex.Sample(s.ss, float2(0.2, 0.3)); +} + +float4 main() : SV_TARGET0 +{ + OS os; + os.ss = gss2; + os.ss = gss; + os.tex = gtex; + os.a = 3.0; + + // this should give an error + //SamplerState localss; + //localss = gss2; + + return osCall(os); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.attributeC11.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.attributeC11.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.attributeC11.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.attributeC11.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,22 +1,22 @@ -struct S { - float2 f; -}; - -[[vk::binding(1)]] -StructuredBuffer buffer1; - -[[vk::binding(3, 2)]] -StructuredBuffer buffer3; - -[[vk::input_attachment_index(4)]] -Texture2D attach; - -[[vk::constant_id(13)]] const int ci = 11; - -[[vk::push_constant]] cbuffer pcBuf { int a; }; - -[[vk::location(7)]] float4 -main([[vk::location(8)]] float4 input: A) : B -{ - return input + attach.Load(float2(0.5));// * a; -} +struct S { + float2 f; +}; + +[[vk::binding(1)]] +StructuredBuffer buffer1; + +[[vk::binding(3, 2)]] +StructuredBuffer buffer3; + +[[vk::input_attachment_index(4)]] +Texture2D attach; + +[[vk::constant_id(13)]] const int ci = 11; + +[[vk::push_constant]] cbuffer pcBuf { int a; }; + +[[vk::location(7)]] float4 +main([[vk::location(8)]] float4 input: A) : B +{ + return input + attach.Load(float2(0.5));// * a; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.attributeGlobalBuffer.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.attributeGlobalBuffer.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.attributeGlobalBuffer.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.attributeGlobalBuffer.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,8 @@ -[[vk::global_cbuffer_binding(5, 2)]] -float4 u1; -float4 u2; - -float4 main() : SV_Target0 -{ - return u1 + u2; +[[vk::global_cbuffer_binding(5, 2)]] +float4 u1; +float4 u2; + +float4 main() : SV_Target0 +{ + return u1 + u2; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.basic.comp vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.basic.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.basic.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.basic.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ -groupshared float4 a[100]; - -void main(int dti : SV_DispatchThreadID, int gti : SV_GroupThreadID) -{ - dti - gti; -} +groupshared float4 a[100]; + +void main(int dti : SV_DispatchThreadID, int gti : SV_GroupThreadID) +{ + dti - gti; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.boolConv.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.boolConv.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.boolConv.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.boolConv.vert 2018-04-27 11:46:26.000000000 +0000 @@ -17,4 +17,4 @@ r += a >> b; return r; -} \ No newline at end of file +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.charLit.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.charLit.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.charLit.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.charLit.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,17 +1,17 @@ -float4 main() : SV_Position -{ - uint a1 = 'A'; - int a2 = '0'; - - int a3 = '\a'; - a3 += '\b'; - a3 += '\t'; - a3 += '\n'; - a3 += '\v'; - a3 += '\f'; - a3 += '\r'; - - int a10 = '\c'; - - return a1 + a2 + a3 + a10; -} +float4 main() : SV_Position +{ + uint a1 = 'A'; + int a2 = '0'; + + int a3 = '\a'; + a3 += '\b'; + a3 += '\t'; + a3 += '\n'; + a3 += '\v'; + a3 += '\f'; + a3 += '\r'; + + int a10 = '\c'; + + return a1 + a2 + a3 + a10; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.conditional.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.conditional.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.conditional.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.conditional.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,8 @@ -float4 c4; -float4 t4; -float4 f4; -float t; -float f; +float4 c4; +float4 t4; +float4 f4; +float t; +float f; float4 vectorCond() { @@ -18,9 +18,9 @@ return ret; } -float2 fbSelect(bool2 cnd, float2 src0, float2 src1) -{ - return cnd ? src0 : src1; +float2 fbSelect(bool2 cnd, float2 src0, float2 src1) +{ + return cnd ? src0 : src1; } float4 PixelShaderFunction(float4 input) : COLOR0 diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.deadFunctionMissingBody.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.deadFunctionMissingBody.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.deadFunctionMissingBody.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.deadFunctionMissingBody.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,8 @@ -float4 main(): SV_Target0 { return 0; } -struct Surface { float3 albedo; }; -Surface surfaceShader(float fade); -Surface surfaceShaderExec() -{ - float fade = 0; - return surfaceShader(0); -} +float4 main(): SV_Target0 { return 0; } +struct Surface { float3 albedo; }; +Surface surfaceShader(float fade); +Surface surfaceShaderExec() +{ + float fade = 0; + return surfaceShader(0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.emptystructreturn.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.emptystructreturn.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.emptystructreturn.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.emptystructreturn.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,13 +1,13 @@ -struct ps_in -{ -}; - -struct ps_out -{ -}; - -ps_out main (ps_in i) -{ - ps_out o; - return o; -} +struct ps_in +{ +}; + +struct ps_out +{ +}; + +ps_out main (ps_in i) +{ + ps_out o; + return o; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.flattenOpaque.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.flattenOpaque.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.flattenOpaque.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.flattenOpaque.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,40 +1,40 @@ -struct os { - sampler2D s2D; -}; - -struct os2 { - sampler2D s2D; - Texture2D tex; -}; - -Texture2D tex; -os s; -os2 s2; - -float4 osCall1(os s) -{ - return tex.Sample(s.s2D, float2(0.2, 0.3)); -} - -float4 osCall2(os s, float2 f2) -{ - return tex.Sample(s.s2D, f2); -} - -float4 os2Call1(os2 s) -{ - return s.tex.Sample(s.s2D, float2(0.2, 0.3)); -} - -float4 os2Call2(os2 s, float2 f2) -{ - return s.tex.Sample(s.s2D, f2); -} - -float4 main() : SV_TARGET0 -{ - return osCall1(s) + - osCall2(s, float2(0.2, 0.3)) + - os2Call1(s2) + - os2Call2(s2, float2(0.2, 0.3)); -} +struct os { + sampler2D s2D; +}; + +struct os2 { + sampler2D s2D; + Texture2D tex; +}; + +Texture2D tex; +os s; +os2 s2; + +float4 osCall1(os s) +{ + return tex.Sample(s.s2D, float2(0.2, 0.3)); +} + +float4 osCall2(os s, float2 f2) +{ + return tex.Sample(s.s2D, f2); +} + +float4 os2Call1(os2 s) +{ + return s.tex.Sample(s.s2D, float2(0.2, 0.3)); +} + +float4 os2Call2(os2 s, float2 f2) +{ + return s.tex.Sample(s.s2D, f2); +} + +float4 main() : SV_TARGET0 +{ + return osCall1(s) + + osCall2(s, float2(0.2, 0.3)) + + os2Call1(s2) + + os2Call2(s2, float2(0.2, 0.3)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.flattenOpaqueInitMix.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.flattenOpaqueInitMix.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.flattenOpaqueInitMix.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.flattenOpaqueInitMix.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,13 +1,13 @@ -struct FxaaTex { SamplerState smpl; Texture2D tex; float f; }; -SamplerState g_tInputTexture_sampler; Texture2D g_tInputTexture; - -float4 lookUp(FxaaTex tex) -{ - return tex.tex.Sample(tex.smpl, float2(tex.f, tex.f)); -} - -float4 main() : SV_TARGET0 -{ - FxaaTex tex = { g_tInputTexture_sampler, g_tInputTexture, 0.5 }; - return lookUp(tex); +struct FxaaTex { SamplerState smpl; Texture2D tex; float f; }; +SamplerState g_tInputTexture_sampler; Texture2D g_tInputTexture; + +float4 lookUp(FxaaTex tex) +{ + return tex.tex.Sample(tex.smpl, float2(tex.f, tex.f)); +} + +float4 main() : SV_TARGET0 +{ + FxaaTex tex = { g_tInputTexture_sampler, g_tInputTexture, 0.5 }; + return lookUp(tex); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.flattenOpaqueInit.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.flattenOpaqueInit.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.flattenOpaqueInit.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.flattenOpaqueInit.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,27 +1,27 @@ -struct FxaaTex { SamplerState smpl; Texture2D tex; }; -SamplerState g_tInputTexture_sampler; Texture2D g_tInputTexture; - -float4 lookUp(FxaaTex tex) -{ - return tex.tex.Sample(tex.smpl, float2(0.3, 0.4)); -} - -FxaaTex fillOpaque() -{ - FxaaTex t; - t.smpl = g_tInputTexture_sampler; - t.tex = g_tInputTexture; - return t; -} - -float4 main() : SV_TARGET0 -{ - FxaaTex tex1 = { g_tInputTexture_sampler, g_tInputTexture }; - float4 res = lookUp(tex1); - FxaaTex tex2 = fillOpaque(); - res += lookUp(tex2); +struct FxaaTex { SamplerState smpl; Texture2D tex; }; +SamplerState g_tInputTexture_sampler; Texture2D g_tInputTexture; + +float4 lookUp(FxaaTex tex) +{ + return tex.tex.Sample(tex.smpl, float2(0.3, 0.4)); +} + +FxaaTex fillOpaque() +{ + FxaaTex t; + t.smpl = g_tInputTexture_sampler; + t.tex = g_tInputTexture; + return t; +} + +float4 main() : SV_TARGET0 +{ + FxaaTex tex1 = { g_tInputTexture_sampler, g_tInputTexture }; + float4 res = lookUp(tex1); + FxaaTex tex2 = fillOpaque(); + res += lookUp(tex2); FxaaTex tex3 = tex1; res += lookUp(tex3); - - return res; + + return res; } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.flattenSubset2.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.flattenSubset2.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.flattenSubset2.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.flattenSubset2.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,24 +1,24 @@ -struct Nested { float y; Texture2D texNested; }; -struct A { Nested n; float x; }; -struct B { Nested n; Texture2D tex; }; - -Texture2D someTex; - -float4 main(float4 vpos : VPOS) : COLOR0 -{ - A a1, a2; - B b; - - // Assignment of nested structs to nested structs - a1.n = a2.n; - b .n = a1.n; - - // Assignment of nested struct to standalone - Nested n = b.n; - - // Assignment to nestested struct members - a2.n.texNested = someTex; - a1.n.y = 1.0; - - return float4(0,0,0,0); -} +struct Nested { float y; Texture2D texNested; }; +struct A { Nested n; float x; }; +struct B { Nested n; Texture2D tex; }; + +Texture2D someTex; + +float4 main(float4 vpos : VPOS) : COLOR0 +{ + A a1, a2; + B b; + + // Assignment of nested structs to nested structs + a1.n = a2.n; + b .n = a1.n; + + // Assignment of nested struct to standalone + Nested n = b.n; + + // Assignment to nestested struct members + a2.n.texNested = someTex; + a1.n.y = 1.0; + + return float4(0,0,0,0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.flattenSubset.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.flattenSubset.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.flattenSubset.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.flattenSubset.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,36 +1,36 @@ -struct S0 -{ - int x; - int y; - SamplerState ss; -}; - -struct S1 -{ - float b; - SamplerState samplerState; - S0 s0; - int a; -}; - -struct S2 -{ - int a1; - int a2; - int a3; - int a4; - int a5; - S1 resources; -}; - -SamplerState samp; -Texture2D tex; - -float4 main(float4 vpos : VPOS) : COLOR0 -{ - S1 s1; - S2 s2; - s1.s0.ss = samp; - s2.resources = s1; - return tex.Sample(s2.resources.s0.ss, float2(0.5)); -} +struct S0 +{ + int x; + int y; + SamplerState ss; +}; + +struct S1 +{ + float b; + SamplerState samplerState; + S0 s0; + int a; +}; + +struct S2 +{ + int a1; + int a2; + int a3; + int a4; + int a5; + S1 resources; +}; + +SamplerState samp; +Texture2D tex; + +float4 main(float4 vpos : VPOS) : COLOR0 +{ + S1 s1; + S2 s2; + s1.s0.ss = samp; + s2.resources = s1; + return tex.Sample(s2.resources.s0.ss, float2(0.5)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.function.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.function.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.function.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.function.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,25 +1,25 @@ -float4 fun0() -{ - return 1.0f; -} - -uint fun2(float4 col) -{ - return 7; -} - -float4 fun4(uint id1, uniform uint id2) -{ - return id1 * id2; -} - -float4 fun1(int index) -{ - uint entityId = fun2(fun0()); - return fun4(entityId, entityId); -} - -int main() : SV_TARGET -{ - return fun1; +float4 fun0() +{ + return 1.0f; +} + +uint fun2(float4 col) +{ + return 7; +} + +float4 fun4(uint id1, uniform uint id2) +{ + return id1 * id2; +} + +float4 fun1(int index) +{ + uint entityId = fun2(fun0()); + return fun4(entityId, entityId); +} + +int main() : SV_TARGET +{ + return fun1; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.gs-hs-mix.tesc vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.gs-hs-mix.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.gs-hs-mix.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.gs-hs-mix.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,119 +1,119 @@ -cbuffer UniformBlock0 : register(b0) -{ - float4x4 model_view_matrix; - float4x4 proj_matrix; - float4x4 model_view_proj_matrix; - float3x3 normal_matrix; - float3 color; - float3 view_dir; - float3 tess_factor; -}; - -// ============================================================================= -// Hull Shader -// ============================================================================= -struct HSInput { - float3 PositionWS : POSITION; - float3 NormalWS : NORMAL; -}; - -struct HSOutput { - float3 PositionWS : POSITION; -}; - -struct HSTrianglePatchConstant { - float EdgeTessFactor[3] : SV_TessFactor; - float InsideTessFactor : SV_InsideTessFactor; - float3 NormalWS[3] : NORMAL; -}; - -HSTrianglePatchConstant HSPatchConstant(InputPatch patch) -{ - float3 roundedEdgeTessFactor = tess_factor; - float roundedInsideTessFactor = 3; - float insideTessFactor = 1; - - HSTrianglePatchConstant result; - - // Edge and inside tessellation factors - result.EdgeTessFactor[0] = roundedEdgeTessFactor.x; - result.EdgeTessFactor[1] = roundedEdgeTessFactor.y; - result.EdgeTessFactor[2] = roundedEdgeTessFactor.z; - result.InsideTessFactor = roundedInsideTessFactor; - - // Constant data - result.NormalWS[0] = patch[0].NormalWS; - result.NormalWS[1] = patch[1].NormalWS; - result.NormalWS[2] = patch[2].NormalWS; - - return result; -} - -[domain("tri")] -[partitioning("fractional_odd")] -[outputtopology("triangle_ccw")] -[outputcontrolpoints(3)] -[patchconstantfunc("HSPatchConstant")] -HSOutput HSMain( - InputPatch patch, - uint id : SV_OutputControlPointID -) -{ - HSOutput output; - output.PositionWS = patch[id].PositionWS; - return output; -} - -// ============================================================================= -// Geometry Shader -// ============================================================================= -struct GSVertexInput { - float3 PositionWS : POSITION; - float3 NormalWS : NORMAL; -}; - -struct GSVertexOutput { - float4 PositionCS : SV_POSITION; -}; - -[maxvertexcount(6)] -void GSMain( - triangle GSVertexInput input[3], - inout LineStream output -) -{ - - float3 P0 = input[0].PositionWS.xyz; - float3 P1 = input[1].PositionWS.xyz; - float3 P2 = input[2].PositionWS.xyz; - - GSVertexOutput vertex; - // Totally hacky... - P0.z += 0.001; - P1.z += 0.001; - P2.z += 0.001; - float4 Q0 = mul(proj_matrix, float4(P0, 1.0)); - float4 Q1 = mul(proj_matrix, float4(P1, 1.0)); - float4 Q2 = mul(proj_matrix, float4(P2, 1.0)); - - // Edge 0 - vertex.PositionCS = Q0; - output.Append(vertex); - vertex.PositionCS = Q1; - output.Append(vertex); - output.RestartStrip(); - - // Edge 1 - vertex.PositionCS = Q1; - output.Append(vertex); - vertex.PositionCS = Q2; - output.Append(vertex); - output.RestartStrip(); - - // Edge 2 - vertex.PositionCS = Q2; - output.Append(vertex); - vertex.PositionCS = Q0; - output.Append(vertex); - output.RestartStrip(); -} +cbuffer UniformBlock0 : register(b0) +{ + float4x4 model_view_matrix; + float4x4 proj_matrix; + float4x4 model_view_proj_matrix; + float3x3 normal_matrix; + float3 color; + float3 view_dir; + float3 tess_factor; +}; + +// ============================================================================= +// Hull Shader +// ============================================================================= +struct HSInput { + float3 PositionWS : POSITION; + float3 NormalWS : NORMAL; +}; + +struct HSOutput { + float3 PositionWS : POSITION; +}; + +struct HSTrianglePatchConstant { + float EdgeTessFactor[3] : SV_TessFactor; + float InsideTessFactor : SV_InsideTessFactor; + float3 NormalWS[3] : NORMAL; +}; + +HSTrianglePatchConstant HSPatchConstant(InputPatch patch) +{ + float3 roundedEdgeTessFactor = tess_factor; + float roundedInsideTessFactor = 3; + float insideTessFactor = 1; + + HSTrianglePatchConstant result; + + // Edge and inside tessellation factors + result.EdgeTessFactor[0] = roundedEdgeTessFactor.x; + result.EdgeTessFactor[1] = roundedEdgeTessFactor.y; + result.EdgeTessFactor[2] = roundedEdgeTessFactor.z; + result.InsideTessFactor = roundedInsideTessFactor; + + // Constant data + result.NormalWS[0] = patch[0].NormalWS; + result.NormalWS[1] = patch[1].NormalWS; + result.NormalWS[2] = patch[2].NormalWS; + + return result; +} + +[domain("tri")] +[partitioning("fractional_odd")] +[outputtopology("triangle_ccw")] +[outputcontrolpoints(3)] +[patchconstantfunc("HSPatchConstant")] +HSOutput HSMain( + InputPatch patch, + uint id : SV_OutputControlPointID +) +{ + HSOutput output; + output.PositionWS = patch[id].PositionWS; + return output; +} + +// ============================================================================= +// Geometry Shader +// ============================================================================= +struct GSVertexInput { + float3 PositionWS : POSITION; + float3 NormalWS : NORMAL; +}; + +struct GSVertexOutput { + float4 PositionCS : SV_POSITION; +}; + +[maxvertexcount(6)] +void GSMain( + triangle GSVertexInput input[3], + inout LineStream output +) +{ + + float3 P0 = input[0].PositionWS.xyz; + float3 P1 = input[1].PositionWS.xyz; + float3 P2 = input[2].PositionWS.xyz; + + GSVertexOutput vertex; + // Totally hacky... + P0.z += 0.001; + P1.z += 0.001; + P2.z += 0.001; + float4 Q0 = mul(proj_matrix, float4(P0, 1.0)); + float4 Q1 = mul(proj_matrix, float4(P1, 1.0)); + float4 Q2 = mul(proj_matrix, float4(P2, 1.0)); + + // Edge 0 + vertex.PositionCS = Q0; + output.Append(vertex); + vertex.PositionCS = Q1; + output.Append(vertex); + output.RestartStrip(); + + // Edge 1 + vertex.PositionCS = Q1; + output.Append(vertex); + vertex.PositionCS = Q2; + output.Append(vertex); + output.RestartStrip(); + + // Edge 2 + vertex.PositionCS = Q2; + output.Append(vertex); + vertex.PositionCS = Q0; + output.Append(vertex); + output.RestartStrip(); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.hlslOffset.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.hlslOffset.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.hlslOffset.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.hlslOffset.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,20 +1,20 @@ -cbuffer b { - float m0; - float3 m4; - ////// - float m16; - float3 m20 : packoffset(c1.y); - ///// - float3 m36 : packoffset(c2.y); - ///// - float2 m56 : packoffset(c3.z); - ///// - float m64; - float2 m68; - float m76; - ////// - float m80; - float2 m96[1]; -}; - -void main() {} +cbuffer b { + float m0; + float3 m4; + ////// + float m16; + float3 m20 : packoffset(c1.y); + ///// + float3 m36 : packoffset(c2.y); + ///// + float2 m56 : packoffset(c3.z); + ///// + float m64; + float2 m68; + float m76; + ////// + float m80; + float2 m96[1]; +}; + +void main() {} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.imagefetch-subvec4.comp vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.imagefetch-subvec4.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.imagefetch-subvec4.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.imagefetch-subvec4.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,8 @@ +Texture3D IN: register(t0); +RWTexture3D OUT: register(u1); + +[numthreads(8,8,8)] +void main(uint3 tid: SV_DispatchThreadID) +{ + OUT[tid] = IN[tid]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.implicitBool.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.implicitBool.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.implicitBool.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.implicitBool.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,32 +1,32 @@ -float condf; -int condi; -float1 condf1; -int1 condi1; - -float4 main() : SV_Target0 -{ - float4 a = float4(2.0, 2.0, 2.0, 2.0); - if (condi) - return a + 1.0; - if (condf) - return a + 2.0; - if (condf1) - return a + 3.0; - if (condi1) - return a + 4.0; - if (condi && condf || condf1) - return a + 5.0; - - float f = condf; - while (f) { --f; } - - int i = condi; - do { --i; } while (i); - - for (; i; ) { --i; } - - float g = condf ? 7.0 : 8.0; - a += g; - - return a - 1.0; +float condf; +int condi; +float1 condf1; +int1 condi1; + +float4 main() : SV_Target0 +{ + float4 a = float4(2.0, 2.0, 2.0, 2.0); + if (condi) + return a + 1.0; + if (condf) + return a + 2.0; + if (condf1) + return a + 3.0; + if (condi1) + return a + 4.0; + if (condi && condf || condf1) + return a + 5.0; + + float f = condf; + while (f) { --f; } + + int i = condi; + do { --i; } while (i); + + for (; i; ) { --i; } + + float g = condf ? 7.0 : 8.0; + a += g; + + return a - 1.0; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.inf.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.inf.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.inf.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.inf.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,11 +1,11 @@ -float4 main() : SV_Position -{ - float f1 = -1.#INF; - float f2 = 1.#INF; - float f3 = +1.#INF; - float f4 = f2 * 1.#INF + 1.#INF; - const float f5 = -1.#INF; - const float f6 = f5 * 0.0f; - - return (float4)(f1 + f2 + f3 + f4 + f5 + f6); +float4 main() : SV_Position +{ + float f1 = -1.#INF; + float f2 = 1.#INF; + float f3 = +1.#INF; + float f4 = f2 * 1.#INF + 1.#INF; + const float f5 = -1.#INF; + const float f6 = f5 * 0.0f; + + return (float4)(f1 + f2 + f3 + f4 + f5 + f6); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.init2.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.init2.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.init2.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.init2.frag 2018-04-27 11:46:26.000000000 +0000 @@ -21,16 +21,16 @@ const mystruct2 constTest5 = { {8,}, {9,}, {10}, }; constTest5.c; - const float step = 1.f; - float n = 0; - const float3 a[8] = { - normalize(float3(1, 1, 1)) * (n += step), - normalize(float3(-1, -1, -1)) * (n += step), - normalize(float3(-1, -1, 1)) * (n += step), - normalize(float3(-1, 1, -1)) * (n += step), - normalize(float3(-1, 1, 1)) * (n += step), - normalize(float3(1, -1, -1)) * (n += step), - normalize(float3(1, -1, 1)) * (n += step), + const float step = 1.f; + float n = 0; + const float3 a[8] = { + normalize(float3(1, 1, 1)) * (n += step), + normalize(float3(-1, -1, -1)) * (n += step), + normalize(float3(-1, -1, 1)) * (n += step), + normalize(float3(-1, 1, -1)) * (n += step), + normalize(float3(-1, 1, 1)) * (n += step), + normalize(float3(1, -1, -1)) * (n += step), + normalize(float3(1, -1, 1)) * (n += step), normalize(float3(1, 1, -1)) * (n += step) }; const struct one { float3 a; } oneNonConst = { normalize(float3(-1, 1, 1)) * (n += step) }; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.init.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.init.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.init.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.init.frag 2018-04-27 11:46:26.000000000 +0000 @@ -4,18 +4,18 @@ static float a3, b3 = 0.3; static float a4, b4 = 0.4, c4; static float a5 = 0.5, b5, c5 = 1.5; - -struct Single1 { int f; }; -static Single1 single1 = { 10 }; - -struct Single2 { uint2 v; }; -static Single2 single2 = { { 1, 2 } }; - -struct Single3 { Single1 s1; }; -static Single3 single3 = { { 3 } }; - -struct Single4 { Single2 s1; }; -static Single4 single4 = { { { 4u, 5u } } }; + +struct Single1 { int f; }; +static Single1 single1 = { 10 }; + +struct Single2 { uint2 v; }; +static Single2 single2 = { { 1, 2 } }; + +struct Single3 { Single1 s1; }; +static Single3 single3 = { { 3 } }; + +struct Single4 { Single2 s1; }; +static Single4 single4 = { { { 4u, 5u } } }; float4 ShaderFunction(float4 input) : COLOR0 { @@ -35,7 +35,7 @@ return input * a1; } -cbuffer Constants -{ - float a = 1.0f, b, c = 2.0f; -}; +cbuffer Constants +{ + float a = 1.0f, b, c = 2.0f; +}; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.layoutOverride.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.layoutOverride.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.layoutOverride.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.layoutOverride.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,7 @@ -layout(set=2,binding=0) Texture2D tex : register(t16); -SamplerState samp; - -float4 main() : SV_Position -{ - return tex.Sample(samp, float2(0.2, 0.3)); +layout(set=2,binding=0) Texture2D tex : register(t16); +SamplerState samp; + +float4 main() : SV_Position +{ + return tex.Sample(samp, float2(0.2, 0.3)); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.localStructuredBuffer.comp vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.localStructuredBuffer.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.localStructuredBuffer.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.localStructuredBuffer.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,4 +1,4 @@ -RWStructuredBuffer srt0; -void main() { - RWStructuredBuffer srt0Local = srt0; +RWStructuredBuffer srt0; +void main() { + RWStructuredBuffer srt0Local = srt0; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.logicalConvert.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.logicalConvert.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.logicalConvert.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.logicalConvert.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,23 +1,23 @@ -float4 main() : SV_TARGET -{ - if (!(0) && (0) || (!1)) - return 0.0.xxxx; - if (0) - return 0.0.xxxx; - if (!(bool)0) - return 0.0.xxxx; - if (!0) - return 0.0.xxxx; - if (!(bool)1) - return 0.0.xxxx; - if (!1) - return 0.0.xxxx; - if (0 || 1) - return 0.0.xxxx; - if (1 && 0) - return 0.0.xxxx; - if (1 || false) - return 0.0.xxxx; - if (true && 1) - return 0.0.xxxx; +float4 main() : SV_TARGET +{ + if (!(0) && (0) || (!1)) + return 0.0.xxxx; + if (0) + return 0.0.xxxx; + if (!(bool)0) + return 0.0.xxxx; + if (!0) + return 0.0.xxxx; + if (!(bool)1) + return 0.0.xxxx; + if (!1) + return 0.0.xxxx; + if (0 || 1) + return 0.0.xxxx; + if (1 && 0) + return 0.0.xxxx; + if (1 || false) + return 0.0.xxxx; + if (true && 1) + return 0.0.xxxx; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.matrixSwizzle.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.matrixSwizzle.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.matrixSwizzle.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.matrixSwizzle.vert 2018-04-27 11:46:26.000000000 +0000 @@ -23,11 +23,11 @@ f3 = m._21_12_31; } -float3x3 createMat3x3(float3 a, float3 b, float3 c) -{ - float3x3 m; - m._11_21_31 = a; - m._12_22_32 = b; - m._13_23_33 = c; - return m; +float3x3 createMat3x3(float3 a, float3 b, float3 c) +{ + float3x3 m; + m._11_21_31 = a; + m._12_22_32 = b; + m._13_23_33 = c; + return m; } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.memberFunCall.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.memberFunCall.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.memberFunCall.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.memberFunCall.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,16 @@ -float method3(float a) { return 1.0; } - -struct myContext { - float method1() { return method2(); } - float method2() { return method3(1.0); } - float method3(float a) { return method4(a, a); } - float method4(float a, float b) { return a + b + f; } - float f; -}; - -float4 main() : SV_TARGET0 -{ - myContext context; - context.f = 3.0; - return (float4)context.method1(); -} +float method3(float a) { return 1.0; } + +struct myContext { + float method1() { return method2(); } + float method2() { return method3(1.0); } + float method3(float a) { return method4(a, a); } + float method4(float a, float b) { return a + b + f; } + float f; +}; + +float4 main() : SV_TARGET0 +{ + myContext context; + context.f = 3.0; + return (float4)context.method1(); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.multiDescriptorSet.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.multiDescriptorSet.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.multiDescriptorSet.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.multiDescriptorSet.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,45 +1,45 @@ -Texture2D txDiffuseA : register( t0 ); -Texture2D txDiffuseB : register( t1 ); - -SamplerState samLinearA : register( s0 ); -SamplerState samLinearB : register( s1 ); - -cbuffer cbNeverChanges : register( b0 ) -{ - matrix View; -}; - -cbuffer cbChangeOnResize : register( b1 ) -{ - matrix Projection; -}; - -cbuffer cbChangesEveryFrame : register( b2 ) -{ - matrix World; - float4 vMeshColor; -}; - - -struct VS_INPUT -{ - float4 Pos : POSITION; - float2 Tex : TEXCOORD0; -}; - -struct PS_INPUT -{ - float4 Pos : SV_POSITION; - float2 Tex : TEXCOORD0; -}; - - -float4 main( PS_INPUT input) : SV_Target -{ - PS_INPUT output = (PS_INPUT)0; - output.Pos = mul( input.Pos, World ); - output.Pos = mul( output.Pos, View ); - output.Pos = mul( output.Pos, Projection ); - output.Tex = input.Tex; - return txDiffuseA.Sample( samLinearA, output.Tex ) * vMeshColor; -} +Texture2D txDiffuseA : register( t0 ); +Texture2D txDiffuseB : register( t1 ); + +SamplerState samLinearA : register( s0 ); +SamplerState samLinearB : register( s1 ); + +cbuffer cbNeverChanges : register( b0 ) +{ + matrix View; +}; + +cbuffer cbChangeOnResize : register( b1 ) +{ + matrix Projection; +}; + +cbuffer cbChangesEveryFrame : register( b2 ) +{ + matrix World; + float4 vMeshColor; +}; + + +struct VS_INPUT +{ + float4 Pos : POSITION; + float2 Tex : TEXCOORD0; +}; + +struct PS_INPUT +{ + float4 Pos : SV_POSITION; + float2 Tex : TEXCOORD0; +}; + + +float4 main( PS_INPUT input) : SV_Target +{ + PS_INPUT output = (PS_INPUT)0; + output.Pos = mul( input.Pos, World ); + output.Pos = mul( output.Pos, View ); + output.Pos = mul( output.Pos, Projection ); + output.Tex = input.Tex; + return txDiffuseA.Sample( samLinearA, output.Tex ) * vMeshColor; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.multiEntry.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.multiEntry.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.multiEntry.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.multiEntry.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,11 +1,11 @@ -Buffer Position; - -float4 FakeEntrypoint(uint Index : SV_VERTEXID) : SV_POSITION -{ - return Position.Load(Index); -} - -float4 RealEntrypoint(uint Index : SV_VERTEXID) : SV_POSITION -{ - return FakeEntrypoint(Index); +Buffer Position; + +float4 FakeEntrypoint(uint Index : SV_VERTEXID) : SV_POSITION +{ + return Position.Load(Index); +} + +float4 RealEntrypoint(uint Index : SV_VERTEXID) : SV_POSITION +{ + return FakeEntrypoint(Index); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.multiReturn.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.multiReturn.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.multiReturn.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.multiReturn.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,19 +1,19 @@ -struct S { - float f; - float3 v; - float3x3 m; -}; - -cbuffer bufName { - S s; -}; - -S foo() -{ - return s; -} - -void main() -{ - foo(); -} +struct S { + float f; + float3 v; + float3x3 m; +}; + +cbuffer bufName { + S s; +}; + +S foo() +{ + return s; +} + +void main() +{ + foo(); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.namespace.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.namespace.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.namespace.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.namespace.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,23 +1,23 @@ -static float4 v1; -static float4 v2; - -namespace N1 { - float4 getVec() { return v1; } -} - -namespace N2 { - static float gf; - float4 getVec() { return v2; } - namespace N3 { - float4 getVec() { return v2; } - - class C1 { - float4 getVec() { return v2; } - }; - } -} - -float4 main() : SV_Target0 -{ - return N1::getVec() + N2::getVec() + N2::N3::getVec() + N2::N3::C1::getVec() * N2::gf; -} +static float4 v1; +static float4 v2; + +namespace N1 { + float4 getVec() { return v1; } +} + +namespace N2 { + static float gf; + float4 getVec() { return v2; } + namespace N3 { + float4 getVec() { return v2; } + + class C1 { + float4 getVec() { return v2; } + }; + } +} + +float4 main() : SV_Target0 +{ + return N1::getVec() + N2::getVec() + N2::N3::getVec() + N2::N3::C1::getVec() * N2::gf; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.nonstaticMemberFunction.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.nonstaticMemberFunction.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.nonstaticMemberFunction.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.nonstaticMemberFunction.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,35 +1,35 @@ -static float2 i = float2(1.0, 2.0); - -struct type1 -{ - void setmem(float4 m) { memVar = m; } - void seti(int si) { i = si; } - float4 memVar; - float4 memFun(float4 a) : SV_Position - { - return i * a + memVar; - } - int memFun(int a) : SV_Position - { - return i + a - memVar.z; - } - int i; -}; - -static float2 j = i; - -struct type2 -{ - float2 memFun() { return i; } -}; - -float4 main() : SV_Target0 -{ - type1 test; - test.setmem(float4(2.0,2.0,2.0,2.0)); - test.seti(17); - float4 f4 = float4(1.0,1.0,1.0,1.0); - f4 += test.memFun(float4(5.0f,5.0f,5.0f,5.0f)); - f4 += test.memFun(7); - return f4; -} +static float2 i = float2(1.0, 2.0); + +struct type1 +{ + void setmem(float4 m) { memVar = m; } + void seti(int si) { i = si; } + float4 memVar; + float4 memFun(float4 a) : SV_Position + { + return i * a + memVar; + } + int memFun(int a) : SV_Position + { + return i + a - memVar.z; + } + int i; +}; + +static float2 j = i; + +struct type2 +{ + float2 memFun() { return i; } +}; + +float4 main() : SV_Target0 +{ + type1 test; + test.setmem(float4(2.0,2.0,2.0,2.0)); + test.seti(17); + float4 f4 = float4(1.0,1.0,1.0,1.0); + f4 += test.memFun(float4(5.0f,5.0f,5.0f,5.0f)); + f4 += test.memFun(7); + return f4; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.noSemantic.functionality1.comp vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.noSemantic.functionality1.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.noSemantic.functionality1.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.noSemantic.functionality1.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,7 @@ +AppendStructuredBuffer Buf : register(u0); + +[numthreads(1, 1, 1)] +void main() +{ + Buf.Append(1.0f.xxxx); +} \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.partialFlattenLocal.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.partialFlattenLocal.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.partialFlattenLocal.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.partialFlattenLocal.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,27 +1,27 @@ -Texture2D tex; - -struct Packed { - Texture2D tex; - float3 pos[3]; - float2 uv[2]; - float x; - int n; -}; - -float4 main(float4 pos : POSITION) : SV_POSITION -{ - Packed packed; - packed.tex = tex; - packed.pos[0] = float3(0, 0, 0); - packed.uv[0] = float2(0, 1); - packed.x = 1.0; - packed.n = 3; - - for (int i = 0; i < 1; ++i) { - packed.pos[i].xy += packed.uv[i]; - } - - Packed packed2 = packed; - - return pos + float4(packed2.pos[0], 0); +Texture2D tex; + +struct Packed { + Texture2D tex; + float3 pos[3]; + float2 uv[2]; + float x; + int n; +}; + +float4 main(float4 pos : POSITION) : SV_POSITION +{ + Packed packed; + packed.tex = tex; + packed.pos[0] = float3(0, 0, 0); + packed.uv[0] = float2(0, 1); + packed.x = 1.0; + packed.n = 3; + + for (int i = 0; i < 1; ++i) { + packed.pos[i].xy += packed.uv[i]; + } + + Packed packed2 = packed; + + return pos + float4(packed2.pos[0], 0); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.partialFlattenMixed.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.partialFlattenMixed.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.partialFlattenMixed.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.partialFlattenMixed.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,16 @@ -Texture2D tex[2]; - -struct Packed { - int a; - Texture2D membTex[2]; - int b; -}; - -float4 main(float4 pos : POSITION) : SV_POSITION -{ - Packed packed; - - packed.membTex = tex; - - return pos; +Texture2D tex[2]; + +struct Packed { + int a; + Texture2D membTex[2]; + int b; +}; + +float4 main(float4 pos : POSITION) : SV_POSITION +{ + Packed packed; + + packed.membTex = tex; + + return pos; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.partialInit.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.partialInit.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.partialInit.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.partialInit.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,36 +1,36 @@ -struct outs { - int a; - float b; - bool c; - float4 v; -}; - -static float4 gv = {0,0,1}; -static float gfa[3] = {0,0}; - -struct Nest { - float4x3 m; - outs os; - bool b; -}; - -outs PixelShaderFunction(float4 input) : COLOR0 -{ - outs o2 = { 3 }; - outs o4; - o4.v = gv * gfa[2]; - outs o1 = { }; - outs o3 = (outs)0; - o4 = (outs)0; - o4.c = o1.c; - Nest nest = (Nest)0; - - float2 gf2a[4] = { }; - int cgi = { }; - o4.b = gf2a[2].y * cgi; - - return o4; -} - -static const float2 cgf2a[3]; -static const int ci; +struct outs { + int a; + float b; + bool c; + float4 v; +}; + +static float4 gv = {0,0,1}; +static float gfa[3] = {0,0}; + +struct Nest { + float4x3 m; + outs os; + bool b; +}; + +outs PixelShaderFunction(float4 input) : COLOR0 +{ + outs o2 = { 3 }; + outs o4; + o4.v = gv * gfa[2]; + outs o1 = { }; + outs o3 = (outs)0; + o4 = (outs)0; + o4.c = o1.c; + Nest nest = (Nest)0; + + float2 gf2a[4] = { }; + int cgi = { }; + o4.b = gf2a[2].y * cgi; + + return o4; +} + +static const float2 cgf2a[3]; +static const int ci; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.PointSize.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.PointSize.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.PointSize.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.PointSize.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,4 +1,4 @@ -[[vk::builtin("PointSize")]] float main() -{ - return 2.3; +[[vk::builtin("PointSize")]] float main() +{ + return 2.3; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.reflection.binding.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.reflection.binding.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.reflection.binding.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.reflection.binding.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,34 +1,34 @@ - -uniform float u1 : register(b2); - -uniform SamplerState s1 : register(s5); -uniform SamplerState s1a[3] : register(s6); - -uniform Texture1D t1 : register(t15); -uniform Texture1D t1a[3] : register(t16); - -cbuffer cbuff1 : register(b2) { - float4 c1_a; - int c1_b; - float c1_c; -}; - -cbuffer cbuff2 : register(b3) { - float4 c2_a; - int c2_b; - float c2_c; -}; - -struct PS_OUTPUT -{ - float4 Color : Sv_Target0; -}; - -void main(out PS_OUTPUT psout) -{ - psout.Color = - t1.Sample(s1, 0.3) + - t1a[0].Sample(s1a[0], 0.3) + - c1_a + c1_b + c1_c + - c2_a + c2_b + c2_c; -} + +uniform float u1 : register(b2); + +uniform SamplerState s1 : register(s5); +uniform SamplerState s1a[3] : register(s6); + +uniform Texture1D t1 : register(t15); +uniform Texture1D t1a[3] : register(t16); + +cbuffer cbuff1 : register(b2) { + float4 c1_a; + int c1_b; + float c1_c; +}; + +cbuffer cbuff2 : register(b3) { + float4 c2_a; + int c2_b; + float c2_c; +}; + +struct PS_OUTPUT +{ + float4 Color : Sv_Target0; +}; + +void main(out PS_OUTPUT psout) +{ + psout.Color = + t1.Sample(s1, 0.3) + + t1a[0].Sample(s1a[0], 0.3) + + c1_a + c1_b + c1_c + + c2_a + c2_b + c2_c; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.reflection.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.reflection.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.reflection.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.reflection.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,138 +1,138 @@ - -cbuffer nameless { - float3 anonMember1; - float3x2 m23; - int scalarAfterm23; - float4 anonDeadMember2; - float4 anonMember3; - int scalarBeforeArray; - float floatArray[5]; - int scalarAfterArray; - float2x2 m22[9]; -}; - -cbuffer c_nameless { - float3 c_anonMember1; - float3x2 c_m23; - int c_scalarAfterm23; - float4 c_anonDeadMember2; - float4 c_anonMember3; -}; - -cbuffer namelessdead { - int a; -}; - -struct N1 { - float a; -}; - -struct N2 { - float b; - float c; - float d; -}; - -struct N3 { - N1 n1; - N2 n2; -}; - -cbuffer nested { - N3 foo; -} - -struct TS { - int a; - int dead; -}; - -uniform TS s; - -uniform float uf1; -uniform float uf2; -uniform float ufDead3; -uniform float ufDead4; - -uniform float2x2 dm22[10]; - -struct deep1 { - float2 va[3]; - bool b; -}; - -struct deep2 { - int i; - deep1 d1[4]; -}; - -struct deep3 { - float4 iv4; - deep2 d2; - int3 v3; -}; - -uniform deep3 deepA[2], deepB[2], deepC[3], deepD[2]; - -const bool control = true; - -void deadFunction() -{ - float4 v = anonDeadMember2; - float f = ufDead4; -} - -void liveFunction2() -{ - float3 v = anonMember1; - float f = uf1; -} - -tbuffer abl { - float foo1; -} - -tbuffer abl2 { - float foo2; -} - -void flizv(in float attributeFloat, in float2 attributeFloat2, in float3 attributeFloat3, in float4 attributeFloat4, in float4x4 attributeMat4) -{ - liveFunction2(); - - if (! control) - deadFunction(); - - float f; - int i; - if (control) { - liveFunction2(); - f = anonMember3.z; - f = s.a; - f = m23[1].y + scalarAfterm23; - f = c_m23[1].y + c_scalarAfterm23; - f += scalarBeforeArray; - f += floatArray[2]; - f += floatArray[4]; - f += scalarAfterArray; - f += m22[i][1][0]; - f += dm22[3][0][1]; - f += m22[2][1].y; - f += foo.n1.a + foo.n2.b + foo.n2.c + foo.n2.d; - f += deepA[i].d2.d1[2].va[1].x; - f += deepB[1].d2.d1[i].va[1].x; - f += deepB[i].d2.d1[i].va[1].x; - deep3 d = deepC[1]; - deep3 da[2] = deepD; - } else - f = ufDead3; - - f += foo1 + foo2; - f += foo2; - - f += attributeFloat; - f += attributeFloat2.x; - f += attributeFloat3.x; - f += attributeFloat4.x; - f += attributeMat4[0][1]; -} + +cbuffer nameless { + float3 anonMember1; + float3x2 m23; + int scalarAfterm23; + float4 anonDeadMember2; + float4 anonMember3; + int scalarBeforeArray; + float floatArray[5]; + int scalarAfterArray; + float2x2 m22[9]; +}; + +cbuffer c_nameless { + float3 c_anonMember1; + float3x2 c_m23; + int c_scalarAfterm23; + float4 c_anonDeadMember2; + float4 c_anonMember3; +}; + +cbuffer namelessdead { + int a; +}; + +struct N1 { + float a; +}; + +struct N2 { + float b; + float c; + float d; +}; + +struct N3 { + N1 n1; + N2 n2; +}; + +cbuffer nested { + N3 foo; +} + +struct TS { + int a; + int dead; +}; + +uniform TS s; + +uniform float uf1; +uniform float uf2; +uniform float ufDead3; +uniform float ufDead4; + +uniform float2x2 dm22[10]; + +struct deep1 { + float2 va[3]; + bool b; +}; + +struct deep2 { + int i; + deep1 d1[4]; +}; + +struct deep3 { + float4 iv4; + deep2 d2; + int3 v3; +}; + +uniform deep3 deepA[2], deepB[2], deepC[3], deepD[2]; + +const bool control = true; + +void deadFunction() +{ + float4 v = anonDeadMember2; + float f = ufDead4; +} + +void liveFunction2() +{ + float3 v = anonMember1; + float f = uf1; +} + +tbuffer abl { + float foo1; +} + +tbuffer abl2 { + float foo2; +} + +void flizv(in float attributeFloat, in float2 attributeFloat2, in float3 attributeFloat3, in float4 attributeFloat4, in float4x4 attributeMat4) +{ + liveFunction2(); + + if (! control) + deadFunction(); + + float f; + int i; + if (control) { + liveFunction2(); + f = anonMember3.z; + f = s.a; + f = m23[1].y + scalarAfterm23; + f = c_m23[1].y + c_scalarAfterm23; + f += scalarBeforeArray; + f += floatArray[2]; + f += floatArray[4]; + f += scalarAfterArray; + f += m22[i][1][0]; + f += dm22[3][0][1]; + f += m22[2][1].y; + f += foo.n1.a + foo.n2.b + foo.n2.c + foo.n2.d; + f += deepA[i].d2.d1[2].va[1].x; + f += deepB[1].d2.d1[i].va[1].x; + f += deepB[i].d2.d1[i].va[1].x; + deep3 d = deepC[1]; + deep3 da[2] = deepD; + } else + f = ufDead3; + + f += foo1 + foo2; + f += foo2; + + f += attributeFloat; + f += attributeFloat2.x; + f += attributeFloat3.x; + f += attributeFloat4.x; + f += attributeMat4[0][1]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.scalarCast.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.scalarCast.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.scalarCast.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.scalarCast.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,37 +1,37 @@ -struct VertexOut { - float4 position : SV_Position; - float2 texCoord : TEXCOORD; -}; -VertexOut r0() { - const float f = 2.0; - return (VertexOut)f; -} -VertexOut r1() { - const float f = 2.0; - return (VertexOut)(f + 1.0); -} -VertexOut r2() { - const float f = 2.0; - return (VertexOut)(sin(f)); -} -VertexOut r3() { - float f = 2.0; - return (VertexOut)f; -} -VertexOut r4() { - float f = 2.0; - return (VertexOut)(f + 1.0); -} -VertexOut r5() { - float f = 2.0; - return (VertexOut)(sin(f)); -} -VertexOut main() { - VertexOut v0 = r0(); - VertexOut v1 = r1(); - VertexOut v2 = r2(); - VertexOut v3 = r3(); - VertexOut v4 = r4(); - VertexOut v5 = r5(); - return (VertexOut)1; -} +struct VertexOut { + float4 position : SV_Position; + float2 texCoord : TEXCOORD; +}; +VertexOut r0() { + const float f = 2.0; + return (VertexOut)f; +} +VertexOut r1() { + const float f = 2.0; + return (VertexOut)(f + 1.0); +} +VertexOut r2() { + const float f = 2.0; + return (VertexOut)(sin(f)); +} +VertexOut r3() { + float f = 2.0; + return (VertexOut)f; +} +VertexOut r4() { + float f = 2.0; + return (VertexOut)(f + 1.0); +} +VertexOut r5() { + float f = 2.0; + return (VertexOut)(sin(f)); +} +VertexOut main() { + VertexOut v0 = r0(); + VertexOut v1 = r1(); + VertexOut v2 = r2(); + VertexOut v3 = r3(); + VertexOut v4 = r4(); + VertexOut v5 = r5(); + return (VertexOut)1; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.shapeConvRet.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.shapeConvRet.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.shapeConvRet.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.shapeConvRet.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,9 +1,9 @@ -int3 foo() -{ - return 13; -} - -float4 main(float f) -{ - return f; -} +int3 foo() +{ + return 13; +} + +float4 main(float f) +{ + return f; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.staticMemberFunction.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.staticMemberFunction.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.staticMemberFunction.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.staticMemberFunction.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,22 +1,22 @@ -struct Test -{ - float4 memVar; - static float4 staticMemFun(float4 a) : SV_Position - { - return 2 * a; - } - static int staticMemFun(int a) : SV_Position - { - return 2 + a; - } - int i; -}; - -float4 main() : SV_Target0 -{ - Test test; - float4 f4 = float4(1.0,1.0,1.0,1.0); - f4 += Test::staticMemFun(float4(5.0f,5.0f,5.0f,5.0f)); - f4 += Test::staticMemFun(7); - return f4; -} +struct Test +{ + float4 memVar; + static float4 staticMemFun(float4 a) : SV_Position + { + return 2 * a; + } + static int staticMemFun(int a) : SV_Position + { + return 2 + a; + } + int i; +}; + +float4 main() : SV_Target0 +{ + Test test; + float4 f4 = float4(1.0,1.0,1.0,1.0); + f4 += Test::staticMemFun(float4(5.0f,5.0f,5.0f,5.0f)); + f4 += Test::staticMemFun(7); + return f4; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.struct.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.struct.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.struct.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.struct.frag 2018-04-27 11:46:26.000000000 +0000 @@ -30,11 +30,11 @@ float ff5 : packoffset(c101.y) : register(ps_5_0, s[5]); float ff6 : packoffset(c102.y) : register(s3[5]); -struct empty {}; - -struct containEmpty { - empty e; -}; +struct empty {}; + +struct containEmpty { + empty e; +}; float4 PixelShaderFunction(float4 input, IN_S s) : COLOR0 { diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.structIoFourWay.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.structIoFourWay.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.structIoFourWay.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.structIoFourWay.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,18 +1,18 @@ -struct T { - float f : packoffset(c4.y); // artificial, but validates all different treatments: uniform offset - centroid float g; // interpolant input - float d: SV_DepthGreaterEqual; // fragment output - float4 normal; // non-IO -}; - -T s; // loose uniform - -cbuffer buff { - T t : packoffset(c5.z); -}; - -T main(T t : myInput) : SV_Target0 -{ - T local; - return local; -} +struct T { + float f : packoffset(c4.y); // artificial, but validates all different treatments: uniform offset + centroid float g; // interpolant input + float d: SV_DepthGreaterEqual; // fragment output + float4 normal; // non-IO +}; + +T s; // loose uniform + +cbuffer buff { + T t : packoffset(c5.z); +}; + +T main(T t : myInput) : SV_Target0 +{ + T local; + return local; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.structStructName.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.structStructName.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.structStructName.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.structStructName.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,7 @@ -struct S { int s; }; - -int main() -{ - struct S t; - return t.s; -} +struct S { int s; }; + +int main() +{ + struct S t; + return t.s; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.synthesizeInput.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.synthesizeInput.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.synthesizeInput.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.synthesizeInput.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,9 +1,9 @@ -struct PSInput { - float interp; - uint no_interp; -}; - -float4 main(PSInput input : INPUT) : SV_TARGET -{ - return float4(float(input.no_interp), input.interp, 0, 1); +struct PSInput { + float interp; + uint no_interp; +}; + +float4 main(PSInput input : INPUT) : SV_TARGET +{ + return float4(float(input.no_interp), input.interp, 0, 1); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.target.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.target.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.target.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.target.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,10 +1,10 @@ -struct PSInput { - float interp; - uint no_interp; -}; - -void main(PSInput input : INPUT, out float4 out1 : SV_TARGET1, out float4 out2 : SV_TARGET3) -{ - out1 = 1; - out2 = 0; +struct PSInput { + float interp; + uint no_interp; +}; + +void main(PSInput input : INPUT, out float4 out1 : SV_TARGET1, out float4 out2 : SV_TARGET3) +{ + out1 = 1; + out2 = 0; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.targetStruct1.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.targetStruct1.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.targetStruct1.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.targetStruct1.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,19 +1,19 @@ -struct PSInput { - float interp; - uint no_interp; -}; - -struct PSOutput { - float4 o1 : SV_TARGET2; - float4 o2 : SV_TARGET1; -}; - -PSOutput main(PSInput input : INPUT, out float4 po : SV_TARGET0) -{ - PSOutput pso; - pso.o1 = float4(float(input.no_interp), input.interp, 0, 1); - pso.o2 = 1; - po = 0; - - return pso; +struct PSInput { + float interp; + uint no_interp; +}; + +struct PSOutput { + float4 o1 : SV_TARGET2; + float4 o2 : SV_TARGET1; +}; + +PSOutput main(PSInput input : INPUT, out float4 po : SV_TARGET0) +{ + PSOutput pso; + pso.o1 = float4(float(input.no_interp), input.interp, 0, 1); + pso.o2 = 1; + po = 0; + + return pso; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.targetStruct2.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.targetStruct2.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.targetStruct2.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.targetStruct2.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,19 +1,19 @@ -struct PSInput { - float interp; - uint no_interp; -}; - -struct PSOutput { - float4 o1 : SV_TARGET1; - float4 o2 : SV_TARGET0; -}; - -PSOutput main(PSInput input : INPUT, out float4 po : SV_TARGET0) : SV_TARGET2 -{ - PSOutput pso; - pso.o1 = float4(float(input.no_interp), input.interp, 0, 1); - pso.o2 = 1; - po = 0; - - return pso; +struct PSInput { + float interp; + uint no_interp; +}; + +struct PSOutput { + float4 o1 : SV_TARGET1; + float4 o2 : SV_TARGET0; +}; + +PSOutput main(PSInput input : INPUT, out float4 po : SV_TARGET0) : SV_TARGET2 +{ + PSOutput pso; + pso.o1 = float4(float(input.no_interp), input.interp, 0, 1); + pso.o2 = 1; + po = 0; + + return pso; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.this.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.this.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.this.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.this.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,29 +1,29 @@ -static float2 var = float2(1.0, 2.0); - -struct type1 -{ - int memFun1(int3 var) - { - return var.z + this.var + var2; - } - int memFun2(int a) - { - int3 var = int3(1,2,3); - return var.z + (int)bar.y + this.var2; - } - float2 bar; - int var; - int var2; -}; - -float4 main() : SV_Target0 -{ - type1 T; - T.bar = var; - T.var = 7; - T.var2 = 9; - int i = T.memFun1(int3(10,11,12)); - i += T.memFun2(17); - - return float4(i,i,i,i); -} +static float2 var = float2(1.0, 2.0); + +struct type1 +{ + int memFun1(int3 var) + { + return var.z + this.var + var2; + } + int memFun2(int a) + { + int3 var = int3(1,2,3); + return var.z + (int)bar.y + this.var2; + } + float2 bar; + int var; + int var2; +}; + +float4 main() : SV_Target0 +{ + type1 T; + T.bar = var; + T.var = 7; + T.var2 = 9; + int i = T.memFun1(int3(10,11,12)); + i += T.memFun2(17); + + return float4(i,i,i,i); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.typeGraphCopy.vert vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.typeGraphCopy.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.typeGraphCopy.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.typeGraphCopy.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,24 +1,24 @@ -struct N1 { - int a; - float b; -}; - -struct N2 { - N1 s1; - N1 s2; -}; - -struct N3 { - N2 t1; - N1 t2; - N2 t3; -}; - -typedef N3 T3; - -T3 foo; - -float main() -{ - return foo.t3.s2.b; -} +struct N1 { + int a; + float b; +}; + +struct N2 { + N1 s1; + N1 s2; +}; + +struct N3 { + N2 t1; + N1 t2; + N2 t3; +}; + +typedef N3 T3; + +T3 foo; + +float main() +{ + return foo.t3.s2.b; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.type.half.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.type.half.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.type.half.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.type.half.frag 2018-04-27 11:46:26.000000000 +0000 @@ -7,21 +7,21 @@ half3 h3 = 3; half4 h4 = 4; - half1x1 h11; - half1x2 h12; - half1x3 h13; - half1x4 h14; - half2x1 h21; - half2x2 h22 = half2x2(1,2,3,4); - half2x3 h23 = (half2x3)4.9; - half2x4 h24; - half3x1 h31; - half3x2 h32; - half3x3 h33; - half3x4 h34; - half4x1 h41; - half4x2 h42; - half4x3 h43; + half1x1 h11; + half1x2 h12; + half1x3 h13; + half1x4 h14; + half2x1 h21; + half2x2 h22 = half2x2(1,2,3,4); + half2x3 h23 = (half2x3)4.9; + half2x4 h24; + half3x1 h31; + half3x2 h32; + half3x3 h33; + half3x4 h34; + half4x1 h41; + half4x2 h42; + half4x3 h43; half4x4 h44; return h23._11 + h4.y + h0; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.wavebroadcast.comp vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.wavebroadcast.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.wavebroadcast.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.wavebroadcast.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,53 @@ +struct Types +{ + uint4 u; + int4 i; + float4 f; + double4 d; +}; + +RWStructuredBuffer data; + +[numthreads(32, 16, 1)] +void CSMain(uint3 dti : SV_DispatchThreadID) +{ + data[dti.x].u = WaveReadLaneAt(data[dti.x].u, 13); + data[dti.x].u.x = WaveReadLaneAt(data[dti.x].u.x, 13); + data[dti.x].u.xy = WaveReadLaneAt(data[dti.x].u.xy, 13); + data[dti.x].u.xyz = WaveReadLaneAt(data[dti.x].u.xyz, 13); + + data[dti.x].i = WaveReadLaneAt(data[dti.x].i, 13); + data[dti.x].i.x = WaveReadLaneAt(data[dti.x].i.x, 13); + data[dti.x].i.xy = WaveReadLaneAt(data[dti.x].i.xy, 13); + data[dti.x].i.xyz = WaveReadLaneAt(data[dti.x].i.xyz, 13); + + data[dti.x].f = WaveReadLaneAt(data[dti.x].f, 13); + data[dti.x].f.x = WaveReadLaneAt(data[dti.x].f.x, 13); + data[dti.x].f.xy = WaveReadLaneAt(data[dti.x].f.xy, 13); + data[dti.x].f.xyz = WaveReadLaneAt(data[dti.x].f.xyz, 13); + + data[dti.x].d = WaveReadLaneFirst(data[dti.x].d); + data[dti.x].d.x = WaveReadLaneFirst(data[dti.x].d.x); + data[dti.x].d.xy = WaveReadLaneFirst(data[dti.x].d.xy); + data[dti.x].d.xyz = WaveReadLaneFirst(data[dti.x].d.xyz); + + data[dti.x].u = WaveReadLaneFirst(data[dti.x].u); + data[dti.x].u.x = WaveReadLaneFirst(data[dti.x].u.x); + data[dti.x].u.xy = WaveReadLaneFirst(data[dti.x].u.xy); + data[dti.x].u.xyz = WaveReadLaneFirst(data[dti.x].u.xyz); + + data[dti.x].i = WaveReadLaneFirst(data[dti.x].i); + data[dti.x].i.x = WaveReadLaneFirst(data[dti.x].i.x); + data[dti.x].i.xy = WaveReadLaneFirst(data[dti.x].i.xy); + data[dti.x].i.xyz = WaveReadLaneFirst(data[dti.x].i.xyz); + + data[dti.x].f = WaveReadLaneFirst(data[dti.x].f); + data[dti.x].f.x = WaveReadLaneFirst(data[dti.x].f.x); + data[dti.x].f.xy = WaveReadLaneFirst(data[dti.x].f.xy); + data[dti.x].f.xyz = WaveReadLaneFirst(data[dti.x].f.xyz); + + data[dti.x].d = WaveReadLaneFirst(data[dti.x].d); + data[dti.x].d.x = WaveReadLaneFirst(data[dti.x].d.x); + data[dti.x].d.xy = WaveReadLaneFirst(data[dti.x].d.xy); + data[dti.x].d.xyz = WaveReadLaneFirst(data[dti.x].d.xyz); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.waveprefix.comp vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.waveprefix.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.waveprefix.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.waveprefix.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,55 @@ +struct Types +{ + uint4 u; + int4 i; + float4 f; + double4 d; +}; + +RWStructuredBuffer data; + +[numthreads(32, 16, 1)] +void CSMain(uint3 dti : SV_DispatchThreadID) +{ + data[dti.x].u = WavePrefixSum(data[dti.x].u); + data[dti.x].u.x = WavePrefixSum(data[dti.x].u.x); + data[dti.x].u.xy = WavePrefixSum(data[dti.x].u.xy); + data[dti.x].u.xyz = WavePrefixSum(data[dti.x].u.xyz); + + data[dti.x].i = WavePrefixSum(data[dti.x].i); + data[dti.x].i.x = WavePrefixSum(data[dti.x].i.x); + data[dti.x].i.xy = WavePrefixSum(data[dti.x].i.xy); + data[dti.x].i.xyz = WavePrefixSum(data[dti.x].i.xyz); + + data[dti.x].f = WavePrefixSum(data[dti.x].f); + data[dti.x].f.x = WavePrefixSum(data[dti.x].f.x); + data[dti.x].f.xy = WavePrefixSum(data[dti.x].f.xy); + data[dti.x].f.xyz = WavePrefixSum(data[dti.x].f.xyz); + + data[dti.x].d = WavePrefixSum(data[dti.x].d); + data[dti.x].d.x = WavePrefixSum(data[dti.x].d.x); + data[dti.x].d.xy = WavePrefixSum(data[dti.x].d.xy); + data[dti.x].d.xyz = WavePrefixSum(data[dti.x].d.xyz); + + data[dti.x].u = WavePrefixProduct(data[dti.x].u); + data[dti.x].u.x = WavePrefixProduct(data[dti.x].u.x); + data[dti.x].u.xy = WavePrefixProduct(data[dti.x].u.xy); + data[dti.x].u.xyz = WavePrefixProduct(data[dti.x].u.xyz); + + data[dti.x].i = WavePrefixProduct(data[dti.x].i); + data[dti.x].i.x = WavePrefixProduct(data[dti.x].i.x); + data[dti.x].i.xy = WavePrefixProduct(data[dti.x].i.xy); + data[dti.x].i.xyz = WavePrefixProduct(data[dti.x].i.xyz); + + data[dti.x].f = WavePrefixProduct(data[dti.x].f); + data[dti.x].f.x = WavePrefixProduct(data[dti.x].f.x); + data[dti.x].f.xy = WavePrefixProduct(data[dti.x].f.xy); + data[dti.x].f.xyz = WavePrefixProduct(data[dti.x].f.xyz); + + data[dti.x].d = WavePrefixProduct(data[dti.x].d); + data[dti.x].d.x = WavePrefixProduct(data[dti.x].d.x); + data[dti.x].d.xy = WavePrefixProduct(data[dti.x].d.xy); + data[dti.x].d.xyz = WavePrefixProduct(data[dti.x].d.xyz); + + data[dti.x].u.x = WavePrefixCountBits(data[dti.x].u.x == 0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.wavequad.comp vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.wavequad.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.wavequad.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.wavequad.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,153 @@ +struct Types +{ + uint4 u; + int4 i; + float4 f; + double4 d; +}; + +RWStructuredBuffer data; + +[numthreads(32, 16, 1)] +void CSMain(uint3 dti : SV_DispatchThreadID) +{ + data[dti.x].u = QuadReadLaneAt(data[dti.x].u, 0); + data[dti.x].u.x = QuadReadLaneAt(data[dti.x].u.x, 0); + data[dti.x].u.xy = QuadReadLaneAt(data[dti.x].u.xy, 0); + data[dti.x].u.xyz = QuadReadLaneAt(data[dti.x].u.xyz, 0); + + data[dti.x].i = QuadReadLaneAt(data[dti.x].i, 0); + data[dti.x].i.x = QuadReadLaneAt(data[dti.x].i.x, 0); + data[dti.x].i.xy = QuadReadLaneAt(data[dti.x].i.xy, 0); + data[dti.x].i.xyz = QuadReadLaneAt(data[dti.x].i.xyz, 0); + + data[dti.x].f = QuadReadLaneAt(data[dti.x].f, 0); + data[dti.x].f.x = QuadReadLaneAt(data[dti.x].f.x, 0); + data[dti.x].f.xy = QuadReadLaneAt(data[dti.x].f.xy, 0); + data[dti.x].f.xyz = QuadReadLaneAt(data[dti.x].f.xyz, 0); + + data[dti.x].d = QuadReadLaneAt(data[dti.x].d, 0); + data[dti.x].d.x = QuadReadLaneAt(data[dti.x].d.x, 0); + data[dti.x].d.xy = QuadReadLaneAt(data[dti.x].d.xy, 0); + data[dti.x].d.xyz = QuadReadLaneAt(data[dti.x].d.xyz, 0); + + data[dti.x].u = QuadReadLaneAt(data[dti.x].u, 1); + data[dti.x].u.x = QuadReadLaneAt(data[dti.x].u.x, 1); + data[dti.x].u.xy = QuadReadLaneAt(data[dti.x].u.xy, 1); + data[dti.x].u.xyz = QuadReadLaneAt(data[dti.x].u.xyz, 1); + + data[dti.x].i = QuadReadLaneAt(data[dti.x].i, 1); + data[dti.x].i.x = QuadReadLaneAt(data[dti.x].i.x, 1); + data[dti.x].i.xy = QuadReadLaneAt(data[dti.x].i.xy, 1); + data[dti.x].i.xyz = QuadReadLaneAt(data[dti.x].i.xyz, 1); + + data[dti.x].f = QuadReadLaneAt(data[dti.x].f, 1); + data[dti.x].f.x = QuadReadLaneAt(data[dti.x].f.x, 1); + data[dti.x].f.xy = QuadReadLaneAt(data[dti.x].f.xy, 1); + data[dti.x].f.xyz = QuadReadLaneAt(data[dti.x].f.xyz, 1); + + data[dti.x].d = QuadReadLaneAt(data[dti.x].d, 1); + data[dti.x].d.x = QuadReadLaneAt(data[dti.x].d.x, 1); + data[dti.x].d.xy = QuadReadLaneAt(data[dti.x].d.xy, 1); + data[dti.x].d.xyz = QuadReadLaneAt(data[dti.x].d.xyz, 1); + + data[dti.x].u = QuadReadLaneAt(data[dti.x].u, 2); + data[dti.x].u.x = QuadReadLaneAt(data[dti.x].u.x, 2); + data[dti.x].u.xy = QuadReadLaneAt(data[dti.x].u.xy, 2); + data[dti.x].u.xyz = QuadReadLaneAt(data[dti.x].u.xyz, 2); + + data[dti.x].i = QuadReadLaneAt(data[dti.x].i, 2); + data[dti.x].i.x = QuadReadLaneAt(data[dti.x].i.x, 2); + data[dti.x].i.xy = QuadReadLaneAt(data[dti.x].i.xy, 2); + data[dti.x].i.xyz = QuadReadLaneAt(data[dti.x].i.xyz, 2); + + data[dti.x].f = QuadReadLaneAt(data[dti.x].f, 2); + data[dti.x].f.x = QuadReadLaneAt(data[dti.x].f.x, 2); + data[dti.x].f.xy = QuadReadLaneAt(data[dti.x].f.xy, 2); + data[dti.x].f.xyz = QuadReadLaneAt(data[dti.x].f.xyz, 2); + + data[dti.x].d = QuadReadLaneAt(data[dti.x].d, 2); + data[dti.x].d.x = QuadReadLaneAt(data[dti.x].d.x, 2); + data[dti.x].d.xy = QuadReadLaneAt(data[dti.x].d.xy, 2); + data[dti.x].d.xyz = QuadReadLaneAt(data[dti.x].d.xyz, 2); + + data[dti.x].u = QuadReadLaneAt(data[dti.x].u, 3); + data[dti.x].u.x = QuadReadLaneAt(data[dti.x].u.x, 3); + data[dti.x].u.xy = QuadReadLaneAt(data[dti.x].u.xy, 3); + data[dti.x].u.xyz = QuadReadLaneAt(data[dti.x].u.xyz, 3); + + data[dti.x].i = QuadReadLaneAt(data[dti.x].i, 3); + data[dti.x].i.x = QuadReadLaneAt(data[dti.x].i.x, 3); + data[dti.x].i.xy = QuadReadLaneAt(data[dti.x].i.xy, 3); + data[dti.x].i.xyz = QuadReadLaneAt(data[dti.x].i.xyz, 3); + + data[dti.x].f = QuadReadLaneAt(data[dti.x].f, 3); + data[dti.x].f.x = QuadReadLaneAt(data[dti.x].f.x, 3); + data[dti.x].f.xy = QuadReadLaneAt(data[dti.x].f.xy, 3); + data[dti.x].f.xyz = QuadReadLaneAt(data[dti.x].f.xyz, 3); + + data[dti.x].d = QuadReadLaneAt(data[dti.x].d, 3); + data[dti.x].d.x = QuadReadLaneAt(data[dti.x].d.x, 3); + data[dti.x].d.xy = QuadReadLaneAt(data[dti.x].d.xy, 3); + data[dti.x].d.xyz = QuadReadLaneAt(data[dti.x].d.xyz, 3); + + data[dti.x].u = QuadReadAcrossX(data[dti.x].u); + data[dti.x].u.x = QuadReadAcrossX(data[dti.x].u.x); + data[dti.x].u.xy = QuadReadAcrossX(data[dti.x].u.xy); + data[dti.x].u.xyz = QuadReadAcrossX(data[dti.x].u.xyz); + + data[dti.x].i = QuadReadAcrossX(data[dti.x].i); + data[dti.x].i.x = QuadReadAcrossX(data[dti.x].i.x); + data[dti.x].i.xy = QuadReadAcrossX(data[dti.x].i.xy); + data[dti.x].i.xyz = QuadReadAcrossX(data[dti.x].i.xyz); + + data[dti.x].f = QuadReadAcrossX(data[dti.x].f); + data[dti.x].f.x = QuadReadAcrossX(data[dti.x].f.x); + data[dti.x].f.xy = QuadReadAcrossX(data[dti.x].f.xy); + data[dti.x].f.xyz = QuadReadAcrossX(data[dti.x].f.xyz); + + data[dti.x].d = QuadReadAcrossX(data[dti.x].d); + data[dti.x].d.x = QuadReadAcrossX(data[dti.x].d.x); + data[dti.x].d.xy = QuadReadAcrossX(data[dti.x].d.xy); + data[dti.x].d.xyz = QuadReadAcrossX(data[dti.x].d.xyz); + + data[dti.x].u = QuadReadAcrossY(data[dti.x].u); + data[dti.x].u.x = QuadReadAcrossY(data[dti.x].u.x); + data[dti.x].u.xy = QuadReadAcrossY(data[dti.x].u.xy); + data[dti.x].u.xyz = QuadReadAcrossY(data[dti.x].u.xyz); + + data[dti.x].i = QuadReadAcrossY(data[dti.x].i); + data[dti.x].i.x = QuadReadAcrossY(data[dti.x].i.x); + data[dti.x].i.xy = QuadReadAcrossY(data[dti.x].i.xy); + data[dti.x].i.xyz = QuadReadAcrossY(data[dti.x].i.xyz); + + data[dti.x].f = QuadReadAcrossY(data[dti.x].f); + data[dti.x].f.x = QuadReadAcrossY(data[dti.x].f.x); + data[dti.x].f.xy = QuadReadAcrossY(data[dti.x].f.xy); + data[dti.x].f.xyz = QuadReadAcrossY(data[dti.x].f.xyz); + + data[dti.x].d = QuadReadAcrossY(data[dti.x].d); + data[dti.x].d.x = QuadReadAcrossY(data[dti.x].d.x); + data[dti.x].d.xy = QuadReadAcrossY(data[dti.x].d.xy); + data[dti.x].d.xyz = QuadReadAcrossY(data[dti.x].d.xyz); + + data[dti.x].u = QuadReadAcrossDiagonal(data[dti.x].u); + data[dti.x].u.x = QuadReadAcrossDiagonal(data[dti.x].u.x); + data[dti.x].u.xy = QuadReadAcrossDiagonal(data[dti.x].u.xy); + data[dti.x].u.xyz = QuadReadAcrossDiagonal(data[dti.x].u.xyz); + + data[dti.x].i = QuadReadAcrossDiagonal(data[dti.x].i); + data[dti.x].i.x = QuadReadAcrossDiagonal(data[dti.x].i.x); + data[dti.x].i.xy = QuadReadAcrossDiagonal(data[dti.x].i.xy); + data[dti.x].i.xyz = QuadReadAcrossDiagonal(data[dti.x].i.xyz); + + data[dti.x].f = QuadReadAcrossDiagonal(data[dti.x].f); + data[dti.x].f.x = QuadReadAcrossDiagonal(data[dti.x].f.x); + data[dti.x].f.xy = QuadReadAcrossDiagonal(data[dti.x].f.xy); + data[dti.x].f.xyz = QuadReadAcrossDiagonal(data[dti.x].f.xyz); + + data[dti.x].d = QuadReadAcrossDiagonal(data[dti.x].d); + data[dti.x].d.x = QuadReadAcrossDiagonal(data[dti.x].d.x); + data[dti.x].d.xy = QuadReadAcrossDiagonal(data[dti.x].d.xy); + data[dti.x].d.xyz = QuadReadAcrossDiagonal(data[dti.x].d.xyz); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.wavequery.comp vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.wavequery.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.wavequery.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.wavequery.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,7 @@ +RWStructuredBuffer data; + +[numthreads(32, 16, 1)] +void CSMain() +{ + data[WaveGetLaneIndex()] = (WaveIsFirstLane()) ? WaveGetLaneCount() : 0; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.wavequery.frag vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.wavequery.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.wavequery.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.wavequery.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,11 @@ +float4 PixelShaderFunction() : COLOR0 +{ + if (WaveIsFirstLane()) + { + return float4(1, 2, 3, 4); + } + else + { + return float4(4, 3, 2, 1); + } +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.wavereduction.comp vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.wavereduction.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.wavereduction.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.wavereduction.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,125 @@ +struct Types +{ + uint4 u; + int4 i; + float4 f; + double4 d; +}; + +RWStructuredBuffer data; + +[numthreads(32, 16, 1)] +void CSMain(uint3 dti : SV_DispatchThreadID) +{ + data[dti.x].u = WaveActiveSum(data[dti.x].u); + data[dti.x].u.x = WaveActiveSum(data[dti.x].u.x); + data[dti.x].u.xy = WaveActiveSum(data[dti.x].u.xy); + data[dti.x].u.xyz = WaveActiveSum(data[dti.x].u.xyz); + + data[dti.x].i = WaveActiveSum(data[dti.x].i); + data[dti.x].i.x = WaveActiveSum(data[dti.x].i.x); + data[dti.x].i.xy = WaveActiveSum(data[dti.x].i.xy); + data[dti.x].i.xyz = WaveActiveSum(data[dti.x].i.xyz); + + data[dti.x].f = WaveActiveSum(data[dti.x].f); + data[dti.x].f.x = WaveActiveSum(data[dti.x].f.x); + data[dti.x].f.xy = WaveActiveSum(data[dti.x].f.xy); + data[dti.x].f.xyz = WaveActiveSum(data[dti.x].f.xyz); + + data[dti.x].d = WaveActiveSum(data[dti.x].d); + data[dti.x].d.x = WaveActiveSum(data[dti.x].d.x); + data[dti.x].d.xy = WaveActiveSum(data[dti.x].d.xy); + data[dti.x].d.xyz = WaveActiveSum(data[dti.x].d.xyz); + + data[dti.x].u = WaveActiveProduct(data[dti.x].u); + data[dti.x].u.x = WaveActiveProduct(data[dti.x].u.x); + data[dti.x].u.xy = WaveActiveProduct(data[dti.x].u.xy); + data[dti.x].u.xyz = WaveActiveProduct(data[dti.x].u.xyz); + + data[dti.x].i = WaveActiveProduct(data[dti.x].i); + data[dti.x].i.x = WaveActiveProduct(data[dti.x].i.x); + data[dti.x].i.xy = WaveActiveProduct(data[dti.x].i.xy); + data[dti.x].i.xyz = WaveActiveProduct(data[dti.x].i.xyz); + + data[dti.x].f = WaveActiveProduct(data[dti.x].f); + data[dti.x].f.x = WaveActiveProduct(data[dti.x].f.x); + data[dti.x].f.xy = WaveActiveProduct(data[dti.x].f.xy); + data[dti.x].f.xyz = WaveActiveProduct(data[dti.x].f.xyz); + + data[dti.x].d = WaveActiveProduct(data[dti.x].d); + data[dti.x].d.x = WaveActiveProduct(data[dti.x].d.x); + data[dti.x].d.xy = WaveActiveProduct(data[dti.x].d.xy); + data[dti.x].d.xyz = WaveActiveProduct(data[dti.x].d.xyz); + + data[dti.x].u = WaveActiveMin(data[dti.x].u); + data[dti.x].u.x = WaveActiveMin(data[dti.x].u.x); + data[dti.x].u.xy = WaveActiveMin(data[dti.x].u.xy); + data[dti.x].u.xyz = WaveActiveMin(data[dti.x].u.xyz); + + data[dti.x].i = WaveActiveMin(data[dti.x].i); + data[dti.x].i.x = WaveActiveMin(data[dti.x].i.x); + data[dti.x].i.xy = WaveActiveMin(data[dti.x].i.xy); + data[dti.x].i.xyz = WaveActiveMin(data[dti.x].i.xyz); + + data[dti.x].f = WaveActiveMin(data[dti.x].f); + data[dti.x].f.x = WaveActiveMin(data[dti.x].f.x); + data[dti.x].f.xy = WaveActiveMin(data[dti.x].f.xy); + data[dti.x].f.xyz = WaveActiveMin(data[dti.x].f.xyz); + + data[dti.x].d = WaveActiveMin(data[dti.x].d); + data[dti.x].d.x = WaveActiveMin(data[dti.x].d.x); + data[dti.x].d.xy = WaveActiveMin(data[dti.x].d.xy); + data[dti.x].d.xyz = WaveActiveMin(data[dti.x].d.xyz); + + data[dti.x].u = WaveActiveMax(data[dti.x].u); + data[dti.x].u.x = WaveActiveMax(data[dti.x].u.x); + data[dti.x].u.xy = WaveActiveMax(data[dti.x].u.xy); + data[dti.x].u.xyz = WaveActiveMax(data[dti.x].u.xyz); + + data[dti.x].i = WaveActiveMax(data[dti.x].i); + data[dti.x].i.x = WaveActiveMax(data[dti.x].i.x); + data[dti.x].i.xy = WaveActiveMax(data[dti.x].i.xy); + data[dti.x].i.xyz = WaveActiveMax(data[dti.x].i.xyz); + + data[dti.x].f = WaveActiveMax(data[dti.x].f); + data[dti.x].f.x = WaveActiveMax(data[dti.x].f.x); + data[dti.x].f.xy = WaveActiveMax(data[dti.x].f.xy); + data[dti.x].f.xyz = WaveActiveMax(data[dti.x].f.xyz); + + data[dti.x].d = WaveActiveMax(data[dti.x].d); + data[dti.x].d.x = WaveActiveMax(data[dti.x].d.x); + data[dti.x].d.xy = WaveActiveMax(data[dti.x].d.xy); + data[dti.x].d.xyz = WaveActiveMax(data[dti.x].d.xyz); + + data[dti.x].u = WaveActiveBitAnd(data[dti.x].u); + data[dti.x].u.x = WaveActiveBitAnd(data[dti.x].u.x); + data[dti.x].u.xy = WaveActiveBitAnd(data[dti.x].u.xy); + data[dti.x].u.xyz = WaveActiveBitAnd(data[dti.x].u.xyz); + + data[dti.x].i = WaveActiveBitAnd(data[dti.x].i); + data[dti.x].i.x = WaveActiveBitAnd(data[dti.x].i.x); + data[dti.x].i.xy = WaveActiveBitAnd(data[dti.x].i.xy); + data[dti.x].i.xyz = WaveActiveBitAnd(data[dti.x].i.xyz); + + data[dti.x].u = WaveActiveBitOr(data[dti.x].u); + data[dti.x].u.x = WaveActiveBitOr(data[dti.x].u.x); + data[dti.x].u.xy = WaveActiveBitOr(data[dti.x].u.xy); + data[dti.x].u.xyz = WaveActiveBitOr(data[dti.x].u.xyz); + + data[dti.x].i = WaveActiveBitOr(data[dti.x].i); + data[dti.x].i.x = WaveActiveBitOr(data[dti.x].i.x); + data[dti.x].i.xy = WaveActiveBitOr(data[dti.x].i.xy); + data[dti.x].i.xyz = WaveActiveBitOr(data[dti.x].i.xyz); + + data[dti.x].u = WaveActiveBitXor(data[dti.x].u); + data[dti.x].u.x = WaveActiveBitXor(data[dti.x].u.x); + data[dti.x].u.xy = WaveActiveBitXor(data[dti.x].u.xy); + data[dti.x].u.xyz = WaveActiveBitXor(data[dti.x].u.xyz); + + data[dti.x].i = WaveActiveBitXor(data[dti.x].i); + data[dti.x].i.x = WaveActiveBitXor(data[dti.x].i.x); + data[dti.x].i.xy = WaveActiveBitXor(data[dti.x].i.xy); + data[dti.x].i.xyz = WaveActiveBitXor(data[dti.x].i.xyz); + + data[dti.x].u.x = WaveActiveCountBits(data[dti.x].u.x == 0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.wavevote.comp vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.wavevote.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/hlsl.wavevote.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/hlsl.wavevote.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,10 @@ +RWStructuredBuffer data; + +[numthreads(32, 16, 1)] +void CSMain(uint3 dti : SV_DispatchThreadID) +{ + data[dti.x] = WaveActiveBallot(WaveActiveAnyTrue(dti.x == 0)); + data[dti.y] = WaveActiveBallot(WaveActiveAllTrue(dti.y == 0)); + data[dti.z] = WaveActiveBallot(WaveActiveAllEqualBool(dti.z == 0)); + data[dti.z] = WaveActiveBallot(WaveActiveAllEqual(dti.z)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/length.frag vulkan-1.1.73+dfsg/external/glslang/Test/length.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/length.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/length.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,18 +1,18 @@ -#version 120 - -uniform vec4 u[3]; - -#ifdef TEST_POST_110 -varying vec2 v[]; -#else -varying vec2 v[2]; -#endif - -void main() -{ - int a[5]; - - vec2 t = v[0] + v[1]; - - gl_FragColor = vec4(u.length() * v.length() * a.length()); -} +#version 120 + +uniform vec4 u[3]; + +#ifdef TEST_POST_110 +varying vec2 v[]; +#else +varying vec2 v[2]; +#endif + +void main() +{ + int a[5]; + + vec2 t = v[0] + v[1]; + + gl_FragColor = vec4(u.length() * v.length() * a.length()); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/lineContinuation100.vert vulkan-1.1.73+dfsg/external/glslang/Test/lineContinuation100.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/lineContinuation100.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/lineContinuation100.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,56 +1,56 @@ -#version 100 - -// non-line continuation comment \ -#error good error - - - -float f\ -oo; // same as 'float foo;' - -#error e2 - -#define MAIN void main() \ - { \ -gl_Position = vec4(foo); \ -} - -#error e3 - -MAIN - -vec4 foo2(vec4 a) -{ - vec4 b = a; \ - return b; -} - -// aoeuntheo unatehutna \ antaehnathe -// anteonuth $ natohe " ' -// anteonuth natohe -/*@*/ -/* *@/*/ -//@ - -#define A int q1 = \ 1 -#define B int q2 = \1 -#define C int q3 = $ 1 -#define D int q4 = @ 1 - -const highp int a1 = \ 4; // ERROR -const highp int a2 = @ 3; // ERROR -const highp int a3 = $4; // ERROR -const highp int a4 = a2\; // ERROR - -A; -B; -C; -D; - -# \ - -# \ - error bad continuation - -#define QUOTE "ab\ -cd" +#version 100 + +// non-line continuation comment \ +#error good error + + + +float f\ +oo; // same as 'float foo;' + +#error e2 + +#define MAIN void main() \ + { \ +gl_Position = vec4(foo); \ +} + +#error e3 + +MAIN + +vec4 foo2(vec4 a) +{ + vec4 b = a; \ + return b; +} + +// aoeuntheo unatehutna \ antaehnathe +// anteonuth $ natohe " ' +// anteonuth natohe +/*@*/ +/* *@/*/ +//@ + +#define A int q1 = \ 1 +#define B int q2 = \1 +#define C int q3 = $ 1 +#define D int q4 = @ 1 + +const highp int a1 = \ 4; // ERROR +const highp int a2 = @ 3; // ERROR +const highp int a3 = $4; // ERROR +const highp int a4 = a2\; // ERROR + +A; +B; +C; +D; + +# \ + +# \ + error bad continuation + +#define QUOTE "ab\ +cd" diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/link1.frag vulkan-1.1.73+dfsg/external/glslang/Test/link1.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/link1.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/link1.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,38 +1,38 @@ -#version 130 - -uniform vec4 uv4; -uniform vec3 glass; - -const int ci = 8; - -vec4 a = ci * uv4; - -in vec3 iv3; -in vec4 cup; - -void main() -{ -} - -vec4 b = ci * a; - -ivec2 foo(mat2 m) -{ - return ivec2(m[0]); -} - -vec4 c = b * b; - -const vec3 cv3 = vec3(43.0, 0.34, 9.9); -const vec3 cv3n = vec3(43.0, 0.34, 9.9); -const vec3 cv3e = vec3(43.0, 0.34, 9.9); -uniform mat2 um2 = mat2(4.0); -uniform mat2 um2n = mat2(4.0); -uniform mat2 um2e = mat2(4.0); -struct S { - int a; - float b; -}; -uniform S s = S(82, 3.9); -uniform S sn; -uniform S se = S(82, 3.9); +#version 130 + +uniform vec4 uv4; +uniform vec3 glass; + +const int ci = 8; + +vec4 a = ci * uv4; + +in vec3 iv3; +in vec4 cup; + +void main() +{ +} + +vec4 b = ci * a; + +ivec2 foo(mat2 m) +{ + return ivec2(m[0]); +} + +vec4 c = b * b; + +const vec3 cv3 = vec3(43.0, 0.34, 9.9); +const vec3 cv3n = vec3(43.0, 0.34, 9.9); +const vec3 cv3e = vec3(43.0, 0.34, 9.9); +uniform mat2 um2 = mat2(4.0); +uniform mat2 um2n = mat2(4.0); +uniform mat2 um2e = mat2(4.0); +struct S { + int a; + float b; +}; +uniform S s = S(82, 3.9); +uniform S sn; +uniform S se = S(82, 3.9); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/link1.vk.frag vulkan-1.1.73+dfsg/external/glslang/Test/link1.vk.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/link1.vk.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/link1.vk.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,10 +1,24 @@ -#version 450 - -vec4 getColor(); - -out vec4 color; - -void main() -{ - color = getColor(); -} +#version 450 + +vec4 getColor(); + +layout(location=0) out vec4 color; + +int a1[]; // max size from link1 +int a2[]; // max size from link2 +int b[5]; +int c[]; +int i; + +buffer bnameRuntime { float r[]; }; +buffer bnameImplicit { float m[]; }; + +void main() +{ + color = getColor(); + + a1[8] = 1; + a2[1] = 1; + b[i] = 1; + c[3] = 1; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/link2.frag vulkan-1.1.73+dfsg/external/glslang/Test/link2.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/link2.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/link2.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,36 +1,36 @@ -#version 130 - -uniform vec4 uv4; -uniform vec2 glass; - -const int ci = 8; - -vec4 d = ci * uv4; - -in vec3 iv3; -flat in vec4 cup; - -vec4 e = ci * d; - -ivec2 foo() -{ - return ivec2(2); -} - -vec4 f = e * e; - -const vec3 cv3 = vec3(43.0, 0.34, 9.9); -const vec3 cv3e = vec3(43.0, 0.34, 2.9); -uniform mat2 um2 = mat2(4.0); -uniform mat2 um2n; -uniform mat2 um2e = mat2(3.0); -struct S { - int a; - float b; -}; -uniform S s = S(82, 3.9); -uniform S sn = S(82, 3.9); -uniform S se = S(81, 3.9); - -#extension GL_OES_texture_3D : enable -#extension GL_OES_standard_derivatives : enable +#version 130 + +uniform vec4 uv4; +uniform vec2 glass; + +const int ci = 8; + +vec4 d = ci * uv4; + +in vec3 iv3; +flat in vec4 cup; + +vec4 e = ci * d; + +ivec2 foo() +{ + return ivec2(2); +} + +vec4 f = e * e; + +const vec3 cv3 = vec3(43.0, 0.34, 9.9); +const vec3 cv3e = vec3(43.0, 0.34, 2.9); +uniform mat2 um2 = mat2(4.0); +uniform mat2 um2n; +uniform mat2 um2e = mat2(3.0); +struct S { + int a; + float b; +}; +uniform S s = S(82, 3.9); +uniform S sn = S(82, 3.9); +uniform S se = S(81, 3.9); + +#extension GL_OES_texture_3D : enable +#extension GL_OES_standard_derivatives : enable diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/link2.vk.frag vulkan-1.1.73+dfsg/external/glslang/Test/link2.vk.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/link2.vk.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/link2.vk.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,23 @@ -#version 450 - -uniform sampler2D s2D; - -vec4 getColor() -{ - return texture(s2D, vec2(0.5)); -} +#version 450 + +layout(binding=1) uniform sampler2D s2D; + +int a1[]; // max size from link1 +int a2[]; // max size from link2 +int b[]; +int c[7]; +int i; + +buffer bnameRuntime { float r[]; }; +buffer bnameImplicit { float m[4]; }; + +vec4 getColor() +{ + a1[2] = 1; + a2[9] = 1; + b[2] = 1; + c[3] = 1; + c[i] = 1; + + return texture(s2D, vec2(0.5)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/link3.frag vulkan-1.1.73+dfsg/external/glslang/Test/link3.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/link3.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/link3.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,9 +1,9 @@ -#version 300 es - -precision highp float; - -in vec2 iv3; - -#extension GL_OES_standard_derivatives : enable -#extension GL_OES_EGL_image_external : require -#extension GL_OES_texture_3D : enable +#version 300 es + +precision highp float; + +in vec2 iv3; + +#extension GL_OES_standard_derivatives : enable +#extension GL_OES_EGL_image_external : require +#extension GL_OES_texture_3D : enable diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/localAggregates.frag vulkan-1.1.73+dfsg/external/glslang/Test/localAggregates.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/localAggregates.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/localAggregates.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,72 +1,72 @@ -#version 130 - -uniform sampler2D sampler; -varying vec2 coord; -varying vec4 color; - -struct s1 { - int i; - float f; -}; - -struct s2 { - int i; - float f; - s1 s1_1; - vec4 bleh; -}; - -struct s3 { - s2 s2_1; - int i; - float f; - s1 s1_1; -}; - - -uniform s1 foo; -uniform s2 foo2; -uniform s3 foo3; - -uniform float[16] uFloatArray; -uniform int condition; - -void main() -{ - s2 locals2; - s3 locals3; - float localFArray[16]; - int localIArray[8]; - - locals2 = foo3.s2_1; - - if (foo3.s2_1.i > 0) { - locals2.s1_1.f = 1.0; - localFArray[4] = coord.x; - localIArray[2] = foo3.s2_1.i; - } else { - locals2.s1_1.f = coord.x; - localFArray[4] = 1.0; - localIArray[2] = 0; - } - - if (localIArray[2] == 0) - ++localFArray[4]; - - float localArray[16]; - int x = 5; - localArray[x] = coord.x; - - float[16] a; - - for (int i = 0; i < 16; i++) - a[i] = 0.0; - - if (condition == 1) - a = localArray; - - locals2.bleh = color; - locals2.bleh.z = coord.y; - - gl_FragColor = locals2.bleh * (localFArray[4] + locals2.s1_1.f + localArray[x] + a[x]) * texture2D(sampler, coord); -} +#version 130 + +uniform sampler2D sampler; +varying vec2 coord; +varying vec4 color; + +struct s1 { + int i; + float f; +}; + +struct s2 { + int i; + float f; + s1 s1_1; + vec4 bleh; +}; + +struct s3 { + s2 s2_1; + int i; + float f; + s1 s1_1; +}; + + +uniform s1 foo; +uniform s2 foo2; +uniform s3 foo3; + +uniform float[16] uFloatArray; +uniform int condition; + +void main() +{ + s2 locals2; + s3 locals3; + float localFArray[16]; + int localIArray[8]; + + locals2 = foo3.s2_1; + + if (foo3.s2_1.i > 0) { + locals2.s1_1.f = 1.0; + localFArray[4] = coord.x; + localIArray[2] = foo3.s2_1.i; + } else { + locals2.s1_1.f = coord.x; + localFArray[4] = 1.0; + localIArray[2] = 0; + } + + if (localIArray[2] == 0) + ++localFArray[4]; + + float localArray[16]; + int x = 5; + localArray[x] = coord.x; + + float[16] a; + + for (int i = 0; i < 16; i++) + a[i] = 0.0; + + if (condition == 1) + a = localArray; + + locals2.bleh = color; + locals2.bleh.z = coord.y; + + gl_FragColor = locals2.bleh * (localFArray[4] + locals2.s1_1.f + localArray[x] + a[x]) * texture2D(sampler, coord); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/loopsArtificial.frag vulkan-1.1.73+dfsg/external/glslang/Test/loopsArtificial.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/loopsArtificial.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/loopsArtificial.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,96 +1,96 @@ -#version 130 -uniform vec4 bigColor; -uniform vec4 bigColor1_1; -uniform vec4 bigColor1_2; -uniform vec4 bigColor1_3; -uniform vec4 bigColor2; -uniform vec4 bigColor3; -uniform vec4 bigColor4; -uniform vec4 bigColor5; -uniform vec4 bigColor6; -uniform vec4 bigColor7; -uniform vec4 bigColor8; - -varying vec4 BaseColor; - -uniform float d; -uniform float d2; -uniform float d3; -uniform float d4; -uniform float d5; -uniform float d6; -uniform float d7; -uniform float d8; -uniform float d9; -uniform float d10; -uniform float d11; -uniform float d12; -uniform float d13; -uniform float d14; -uniform float d15; -uniform float d16; -uniform float d17; -uniform float d18; -uniform float d19; -uniform float d20; -uniform float d21; -uniform float d22; -uniform float d23; -uniform float d24; -uniform float d25; -uniform float d26; -uniform float d27; -uniform float d28; -uniform float d29; -uniform float d30; -uniform float d31; -uniform float d32; -uniform float d33; -uniform float d34; - -uniform int Count; - -void main() -{ - vec4 color = BaseColor; - - // Latchy2 - do { - color += bigColor4; - if (color.x < d4) { - color.z += 2.0; - if (color.z < d4) { - color.x++; - continue; - } - } - if (color.y < d4) - color.y += d4; - else - color.x += d4; - } while (color.z < d4); - - // Immediate dominator - while (color.w < d13) { - if (color.z < d13) - color++; - else - color--; - // code from Latchy 2 - color += bigColor4; - if (color.x < d4) { - color.z += 2.0; - if (color.z < d4) { - color.x++; - continue; - } - } - if (color.y < d4) - color.y += d4; - else - color.x += d4; - } - - color++; - gl_FragColor = color; -} +#version 130 +uniform vec4 bigColor; +uniform vec4 bigColor1_1; +uniform vec4 bigColor1_2; +uniform vec4 bigColor1_3; +uniform vec4 bigColor2; +uniform vec4 bigColor3; +uniform vec4 bigColor4; +uniform vec4 bigColor5; +uniform vec4 bigColor6; +uniform vec4 bigColor7; +uniform vec4 bigColor8; + +varying vec4 BaseColor; + +uniform float d; +uniform float d2; +uniform float d3; +uniform float d4; +uniform float d5; +uniform float d6; +uniform float d7; +uniform float d8; +uniform float d9; +uniform float d10; +uniform float d11; +uniform float d12; +uniform float d13; +uniform float d14; +uniform float d15; +uniform float d16; +uniform float d17; +uniform float d18; +uniform float d19; +uniform float d20; +uniform float d21; +uniform float d22; +uniform float d23; +uniform float d24; +uniform float d25; +uniform float d26; +uniform float d27; +uniform float d28; +uniform float d29; +uniform float d30; +uniform float d31; +uniform float d32; +uniform float d33; +uniform float d34; + +uniform int Count; + +void main() +{ + vec4 color = BaseColor; + + // Latchy2 + do { + color += bigColor4; + if (color.x < d4) { + color.z += 2.0; + if (color.z < d4) { + color.x++; + continue; + } + } + if (color.y < d4) + color.y += d4; + else + color.x += d4; + } while (color.z < d4); + + // Immediate dominator + while (color.w < d13) { + if (color.z < d13) + color++; + else + color--; + // code from Latchy 2 + color += bigColor4; + if (color.x < d4) { + color.z += 2.0; + if (color.z < d4) { + color.x++; + continue; + } + } + if (color.y < d4) + color.y += d4; + else + color.x += d4; + } + + color++; + gl_FragColor = color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/loops.frag vulkan-1.1.73+dfsg/external/glslang/Test/loops.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/loops.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/loops.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,320 +1,320 @@ -#version 130 -uniform vec4 bigColor; -uniform vec4 bigColor1_1; -uniform vec4 bigColor1_2; -uniform vec4 bigColor1_3; -uniform vec4 bigColor2; -uniform vec4 bigColor3; -uniform vec4 bigColor4; -uniform vec4 bigColor5; -uniform vec4 bigColor6; -uniform vec4 bigColor7; -uniform vec4 bigColor8; - -varying vec4 BaseColor; - -uniform float d; -uniform float d2; -uniform float d3; -uniform float d4; -uniform float d5; -uniform float d6; -uniform float d7; -uniform float d8; -uniform float d9; -uniform float d10; -uniform float d11; -uniform float d12; -uniform float d13; -uniform float d14; -uniform float d15; -uniform float d16; -uniform float d17; -uniform float d18; -uniform float d19; -uniform float d20; -uniform float d21; -uniform float d22; -uniform float d23; -uniform float d24; -uniform float d25; -uniform float d26; -uniform float d27; -uniform float d28; -uniform float d29; -uniform float d30; -uniform float d31; -uniform float d32; -uniform float d33; -uniform float d34; - -uniform int Count; - -void main() -{ - vec4 color = BaseColor; - - // Not a real loop - while (true) { - if (color.x < 0.33) { - color += vec4(0.33); - break; - } - if (color.x < 0.66) { - color += vec4(0.66); - break; - } - - color += vec4(0.33); - break; - } - - // While - while (color.x < d) { - color += bigColor; - } - - // While (latchy) - while (color.z < d) { - color += bigColor1_1; - if (color.w < d) - continue; - - color += bigColor1_1; - } - - // While (constant) - while (color.x < 42.0) { - ++color; - } - - // While (complicated-conditional) - while (color.w < d2 && color.y < d3) { - color += bigColor1_2; - } - - // While (multi-exit) - while (color.z < d3) { - color += bigColor1_3; - if (color.y < d4) - break; - color += bigColor1_3; - } - - // For (dynamic) - for (int i = 0; i < Count; ++i) { - color += bigColor2; - } - - // Do while - do { - color += bigColor3; - } while (color.x < d2); - - // For (static) - for (int i = 0; i < 42; ++i) { - color.z += d3; - } - - // For (static) flow-control - for (int i = 0; i < 100; ++i) { - if (color.z < 20.0) - color.x++; - else - color.y++; - if (color.w < 20.0) - if (color.z > color.y) - 0; // do nothing - } - - // For (static) flow-control with latch merge - for (int i = 0; i < 120; ++i) { - if (color.z < 20.0) - color.x++; - else - color.y++; - } - - // For (static) latchy - for (int i = 0; i < 42; ++i) { - color.z += d3; - if (color.x < d4) - continue; - ++color.w; - } - - // For (static) multi-exit - for (int i = 0; i < 42; ++i) { - color.z += d3; - if (color.x < d4) - break; - ++color.w; - } - - // Latchy - do { - color += bigColor4; - if (color.x < d4) - continue; - if (color.y < d4) - color.y += d4; - else - color.x += d4; - } while (color.z < d4); - - // Do while flow control - do { - color += bigColor5; - if (color.y < d5) - color.y += d5; - } while (color.x < d5); - - // If then loop - if (color.x < d6) { - while (color.y < d6) - color += bigColor6; - } else { - while (color.z < d6) - color.z += bigColor6.z; - } - - // If then multi-exit - if (color.x < d6) { - while (color.y < d6) { - color += bigColor6; - if (d7 < 1.0) - break; - } - - } else { - while (color.z < d6) - color.z += bigColor6.z; - } - - - // Multi-exit - do { - if (d7 < 0.0) - break; - - color += bigColor7; - - if (d7 < 1.0) { - color.z++; - break; - } - - color += BaseColor; - - } while (true); - - - // Multi-exit2 - do { - // invariant conditional break at the top of the loop. This could be a - // situation where unswitching the loop has no real increases in code - // size. - if (d8 < 0.0) - break; - - color += bigColor7; - - if (d8 < 1.0) { - color.z++; - if (d8 < 2.0) { - color.y++; - } else { - color.x++; - } - break; - } - - color += BaseColor; - - } while (color.z < d8); - - // Deep exit - while (color.w < d9) { - if (d9 > d8) { - if (color.x <= d7) { - if (color.z == 5.0) - color.w++; - else - break; - } - } - - } - - // No end loop-back. - while (color.z < d10) { - color.y++; - if (color.y < d11) { - color.z++; - if (color.w < d12) - color.w++; - else - color.x++; - continue; - } - - color++; - break; - } - - // Multi-continue - while (color.x < 10.0) { - color += bigColor8; - - if (color.z < d8) - if (color.w < d6) - continue; - - color.y += bigColor8.x; - } - - color++; - gl_FragColor = color; - - // Early Return - while (color.x < d14) { - if (color.y < d15) { - return; - } - else - color++; - } - - color++; - - while (color.w < d16) { - color.w++; - } - - - // While (complicated-conditional) - while (color.w < d2 && color.y < d3) { - color += bigColor1_2; - if (color.z < d3) - return; - } - - - do { - if (color.y < d18) - return; - color++; - } while (color.x < d17); - - // Early Discard - while (color.y < d16) { - if (color.w < d16) { - discard; - } else - color++; - } - - color++; - - gl_FragColor = color; -} +#version 130 +uniform vec4 bigColor; +uniform vec4 bigColor1_1; +uniform vec4 bigColor1_2; +uniform vec4 bigColor1_3; +uniform vec4 bigColor2; +uniform vec4 bigColor3; +uniform vec4 bigColor4; +uniform vec4 bigColor5; +uniform vec4 bigColor6; +uniform vec4 bigColor7; +uniform vec4 bigColor8; + +varying vec4 BaseColor; + +uniform float d; +uniform float d2; +uniform float d3; +uniform float d4; +uniform float d5; +uniform float d6; +uniform float d7; +uniform float d8; +uniform float d9; +uniform float d10; +uniform float d11; +uniform float d12; +uniform float d13; +uniform float d14; +uniform float d15; +uniform float d16; +uniform float d17; +uniform float d18; +uniform float d19; +uniform float d20; +uniform float d21; +uniform float d22; +uniform float d23; +uniform float d24; +uniform float d25; +uniform float d26; +uniform float d27; +uniform float d28; +uniform float d29; +uniform float d30; +uniform float d31; +uniform float d32; +uniform float d33; +uniform float d34; + +uniform int Count; + +void main() +{ + vec4 color = BaseColor; + + // Not a real loop + while (true) { + if (color.x < 0.33) { + color += vec4(0.33); + break; + } + if (color.x < 0.66) { + color += vec4(0.66); + break; + } + + color += vec4(0.33); + break; + } + + // While + while (color.x < d) { + color += bigColor; + } + + // While (latchy) + while (color.z < d) { + color += bigColor1_1; + if (color.w < d) + continue; + + color += bigColor1_1; + } + + // While (constant) + while (color.x < 42.0) { + ++color; + } + + // While (complicated-conditional) + while (color.w < d2 && color.y < d3) { + color += bigColor1_2; + } + + // While (multi-exit) + while (color.z < d3) { + color += bigColor1_3; + if (color.y < d4) + break; + color += bigColor1_3; + } + + // For (dynamic) + for (int i = 0; i < Count; ++i) { + color += bigColor2; + } + + // Do while + do { + color += bigColor3; + } while (color.x < d2); + + // For (static) + for (int i = 0; i < 42; ++i) { + color.z += d3; + } + + // For (static) flow-control + for (int i = 0; i < 100; ++i) { + if (color.z < 20.0) + color.x++; + else + color.y++; + if (color.w < 20.0) + if (color.z > color.y) + 0; // do nothing + } + + // For (static) flow-control with latch merge + for (int i = 0; i < 120; ++i) { + if (color.z < 20.0) + color.x++; + else + color.y++; + } + + // For (static) latchy + for (int i = 0; i < 42; ++i) { + color.z += d3; + if (color.x < d4) + continue; + ++color.w; + } + + // For (static) multi-exit + for (int i = 0; i < 42; ++i) { + color.z += d3; + if (color.x < d4) + break; + ++color.w; + } + + // Latchy + do { + color += bigColor4; + if (color.x < d4) + continue; + if (color.y < d4) + color.y += d4; + else + color.x += d4; + } while (color.z < d4); + + // Do while flow control + do { + color += bigColor5; + if (color.y < d5) + color.y += d5; + } while (color.x < d5); + + // If then loop + if (color.x < d6) { + while (color.y < d6) + color += bigColor6; + } else { + while (color.z < d6) + color.z += bigColor6.z; + } + + // If then multi-exit + if (color.x < d6) { + while (color.y < d6) { + color += bigColor6; + if (d7 < 1.0) + break; + } + + } else { + while (color.z < d6) + color.z += bigColor6.z; + } + + + // Multi-exit + do { + if (d7 < 0.0) + break; + + color += bigColor7; + + if (d7 < 1.0) { + color.z++; + break; + } + + color += BaseColor; + + } while (true); + + + // Multi-exit2 + do { + // invariant conditional break at the top of the loop. This could be a + // situation where unswitching the loop has no real increases in code + // size. + if (d8 < 0.0) + break; + + color += bigColor7; + + if (d8 < 1.0) { + color.z++; + if (d8 < 2.0) { + color.y++; + } else { + color.x++; + } + break; + } + + color += BaseColor; + + } while (color.z < d8); + + // Deep exit + while (color.w < d9) { + if (d9 > d8) { + if (color.x <= d7) { + if (color.z == 5.0) + color.w++; + else + break; + } + } + + } + + // No end loop-back. + while (color.z < d10) { + color.y++; + if (color.y < d11) { + color.z++; + if (color.w < d12) + color.w++; + else + color.x++; + continue; + } + + color++; + break; + } + + // Multi-continue + while (color.x < 10.0) { + color += bigColor8; + + if (color.z < d8) + if (color.w < d6) + continue; + + color.y += bigColor8.x; + } + + color++; + gl_FragColor = color; + + // Early Return + while (color.x < d14) { + if (color.y < d15) { + return; + } + else + color++; + } + + color++; + + while (color.w < d16) { + color.w++; + } + + + // While (complicated-conditional) + while (color.w < d2 && color.y < d3) { + color += bigColor1_2; + if (color.z < d3) + return; + } + + + do { + if (color.y < d18) + return; + color++; + } while (color.x < d17); + + // Early Discard + while (color.y < d16) { + if (color.w < d16) { + discard; + } else + color++; + } + + color++; + + gl_FragColor = color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/mains1.frag vulkan-1.1.73+dfsg/external/glslang/Test/mains1.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/mains1.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/mains1.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,5 +1,5 @@ -#version 110 - -void main() -{ -} +#version 110 + +void main() +{ +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/mains2.frag vulkan-1.1.73+dfsg/external/glslang/Test/mains2.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/mains2.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/mains2.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,5 +1,5 @@ -#version 110 - -void main() -{ -} +#version 110 + +void main() +{ +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/mains.frag vulkan-1.1.73+dfsg/external/glslang/Test/mains.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/mains.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/mains.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,9 +1,9 @@ -#version 300 es - -void main() -{ -} - -void main() -{ -} +#version 300 es + +void main() +{ +} + +void main() +{ +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/matrix2.frag vulkan-1.1.73+dfsg/external/glslang/Test/matrix2.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/matrix2.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/matrix2.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,50 +1,51 @@ -#version 150 - -uniform mat3 colorTransform; -varying vec3 Color; -uniform mat4 m, n; - -uniform mat4x3 um43; -uniform mat3x4 un34; -uniform mat2 um2; -uniform mat3 um3; -uniform mat4 um4; - -varying vec4 v; - -varying vec3 u; - -out vec4 FragColor; - -void main() -{ - mat3x4 m34 = outerProduct(v, u); - - m34 += mat3x4(4.3); - - FragColor = vec4(Color, 1.0); - FragColor *= vec4(FragColor * m34, 1.0); - - m34 *= v.x; - - mat4 m44 = mat4(un34); - - m44 += m34 * um43; - - FragColor += (-m44) * v; - - FragColor *= matrixCompMult(m44, m44); - - m34 = transpose(um43); - FragColor *= vec4(FragColor * m34, 1.0); - FragColor *= vec4(determinant(um4)); - mat2 inv = inverse(um2); - FragColor *= vec4(inv[0][0], inv[1][0], inv[0][1], inv[1][1]); - mat3 inv3 = inverse(um3); - FragColor *= vec4(inv3[2][1]); - - mat4 inv4 = inverse(um4); - FragColor *= inv4; - - FragColor = vec4(FragColor * matrixCompMult(un34, un34), FragColor.w); -} +#version 150 + +uniform mat3 colorTransform; +varying vec3 Color; +uniform mat4 m, n; + +uniform mat4x3 um43; +uniform mat3x4 un34; +uniform mat2 um2; +uniform mat3 um3; +uniform mat4 um4; + +varying vec4 v; + +varying vec3 u; + +out vec4 FragColor; + +void main() +{ + mat3x4 m34 = outerProduct(v, u); + + m34 += mat3x4(4.3); + + FragColor = vec4(Color, 1.0); + FragColor *= vec4(FragColor * m34, 1.0); + + m34 *= v.x; + + mat4 m44 = mat4(un34); + + m44 += m34 * um43; + + FragColor += (-m44) * v; + + FragColor *= matrixCompMult(m44, m44); + + m34 = transpose(um43); + FragColor *= vec4(FragColor * m34, 1.0); + FragColor *= vec4(determinant(um4)); + mat2 inv = inverse(um2); + FragColor *= vec4(inv[0][0], inv[1][0], inv[0][1], inv[1][1]); + mat3 inv3 = inverse(um3); + FragColor *= vec4(inv3[2][1]); + + mat4 inv4 = inverse(um4); + FragColor *= inv4; + + FragColor = vec4(FragColor * matrixCompMult(un34, un34), FragColor.w); + m34 *= colorTransform; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/matrixError.vert vulkan-1.1.73+dfsg/external/glslang/Test/matrixError.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/matrixError.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/matrixError.vert 2018-04-27 11:46:26.000000000 +0000 @@ -19,4 +19,6 @@ m23.xy; // ERROR, can't use . gl_Position = vec4(m23 * m32 * v3, m24[2][4]); // ERROR, 2 and 4 are out of range + m23 *= m23; // ERROR, right side needs to be square + m23 *= m32; // ERROR, left columns must match right rows } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/matrix.frag vulkan-1.1.73+dfsg/external/glslang/Test/matrix.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/matrix.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/matrix.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,55 +1,55 @@ -#version 130 - -//#define TEST_POST_110 - -uniform mat3 colorTransform; -varying vec3 Color; -uniform mat4 m, n; - -#ifdef TEST_POST_110 -uniform mat4x3 um43; -uniform mat3x4 un34; -#else -uniform mat4 um43; -uniform mat4 un34; -#endif - -varying vec4 v; - -#ifdef TEST_POST_110 -varying vec3 u; -#else -varying vec4 u; -#endif - -void main() -{ - gl_FragColor = vec4(un34[1]); - gl_FragColor += vec4(Color * colorTransform, 1.0); - - if (m != n) - gl_FragColor += v; - else { - gl_FragColor += m * v; - gl_FragColor += v * (m - n); - } - -#ifdef TEST_POST_110 - mat3x4 m34 = outerProduct(v, u); - m34 += mat4(v.x); - m34 += mat4(u, u.x, u, u.x, u, u.x, u.x); -#else - mat4 m34 = mat4(v.x*u.x, v.x*u.y, v.x*u.z, v.x*u.w, - v.y*u.x, v.y*u.y, v.y*u.z, v.y*u.w, - v.z*u.x, v.z*u.y, v.z*u.z, v.z*u.w, - v.w*u.x, v.w*u.y, v.w*u.z, v.w*u.w); - m34 += mat4(v.x); - m34 += mat4(u, u.x, u, u.x, u, u.x, u.x); - -#endif - - if (m34 == un34) - gl_FragColor += m34 * u; - else - gl_FragColor += (un34 * um43) * v; -} +#version 130 + +//#define TEST_POST_110 + +uniform mat3 colorTransform; +varying vec3 Color; +uniform mat4 m, n; + +#ifdef TEST_POST_110 +uniform mat4x3 um43; +uniform mat3x4 un34; +#else +uniform mat4 um43; +uniform mat4 un34; +#endif + +varying vec4 v; + +#ifdef TEST_POST_110 +varying vec3 u; +#else +varying vec4 u; +#endif + +void main() +{ + gl_FragColor = vec4(un34[1]); + gl_FragColor += vec4(Color * colorTransform, 1.0); + + if (m != n) + gl_FragColor += v; + else { + gl_FragColor += m * v; + gl_FragColor += v * (m - n); + } + +#ifdef TEST_POST_110 + mat3x4 m34 = outerProduct(v, u); + m34 += mat4(v.x); + m34 += mat4(u, u.x, u, u.x, u, u.x, u.x); +#else + mat4 m34 = mat4(v.x*u.x, v.x*u.y, v.x*u.z, v.x*u.w, + v.y*u.x, v.y*u.y, v.y*u.z, v.y*u.w, + v.z*u.x, v.z*u.y, v.z*u.z, v.z*u.w, + v.w*u.x, v.w*u.y, v.w*u.z, v.w*u.w); + m34 += mat4(v.x); + m34 += mat4(u, u.x, u, u.x, u, u.x, u.x); + +#endif + + if (m34 == un34) + gl_FragColor += m34 * u; + else + gl_FragColor += (un34 * um43) * v; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/max_vertices_0.geom vulkan-1.1.73+dfsg/external/glslang/Test/max_vertices_0.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/max_vertices_0.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/max_vertices_0.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,12 @@ -#version 330 - -layout(points) in; -layout(triangle_strip, max_vertices = 0) out; -in highp vec4 v_geom_FragColor[]; -out highp vec4 v_frag_FragColor; - -void main (void) -{ - EndPrimitive(); - EndPrimitive(); -} +#version 330 + +layout(points) in; +layout(triangle_strip, max_vertices = 0) out; +in highp vec4 v_geom_FragColor[]; +out highp vec4 v_frag_FragColor; + +void main (void) +{ + EndPrimitive(); + EndPrimitive(); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/missingBodies.vert vulkan-1.1.73+dfsg/external/glslang/Test/missingBodies.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/missingBodies.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/missingBodies.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,24 +1,24 @@ -#version 450 - -void bar(); -void foo() { bar(); } - -void B(); -void C(int); -void C(int, int) { } -void C(bool); -void A() { B(); C(1); C(true); C(1, 2); } - -void main() -{ - foo(); - C(true); -} - -int ret1(); - -int f1 = ret1(); - -int ret2() { return 3; } - -int f2 = ret2(); +#version 450 + +void bar(); +void foo() { bar(); } + +void B(); +void C(int); +void C(int, int) { } +void C(bool); +void A() { B(); C(1); C(true); C(1, 2); } + +void main() +{ + foo(); + C(true); +} + +int ret1(); + +int f1 = ret1(); + +int ret2() { return 3; } + +int f2 = ret2(); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/mixedArrayDecls.frag vulkan-1.1.73+dfsg/external/glslang/Test/mixedArrayDecls.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/mixedArrayDecls.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/mixedArrayDecls.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,30 @@ +#version 450 + +struct S { + int[3] a[2], b[5]; +}; + +S s; + +int[5] c[4], d[8]; +int[9] e[], f[]; +int e[11][9]; +int f[13][9]; + +int[14] g[], h[]; + +int [14][15][6] foo(int[6] p[14][15]) { return p; } + +void main() +{ + g[3]; + h[2]; +} + +float[4][3][2] bar() { float[3][2] a[4]; return a; } + +in inbname { + float[7] f[8][9]; +} inbinst[4][5][6]; + +float[3][2] barm[4]() { float[3][2] a[4]; return a; } // ERROR diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/newTexture.frag vulkan-1.1.73+dfsg/external/glslang/Test/newTexture.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/newTexture.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/newTexture.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,75 +1,75 @@ -#version 430 - -uniform samplerBuffer sb; -uniform sampler2DRect sr; -uniform sampler2D s2D; -uniform sampler3D s3D; -uniform samplerCube sCube; -uniform samplerCubeShadow sCubeShadow; -uniform sampler2DShadow s2DShadow; -uniform sampler2DArray s2DArray; -uniform sampler2DArrayShadow s2DArrayShadow; - -uniform isampler2D is2D; -uniform isampler3D is3D; -uniform isamplerCube isCube; -uniform isampler2DArray is2DArray; -uniform isampler2DMS is2Dms; - -uniform usampler2D us2D; -uniform usampler3D us3D; -uniform usamplerCube usCube; -uniform usampler2DArray us2DArray; - -in float c1D; -in vec2 c2D; -in vec3 c3D; -in vec4 c4D; - -flat in int ic1D; -flat in ivec2 ic2D; -flat in ivec3 ic3D; -flat in ivec4 ic4D; - -out vec4 FragData; - -void main() -{ - vec4 v = texture(s2D, c2D); - v += textureProj(s3D, c4D); - v += textureLod(s2DArray, c3D, 1.2); - v.y += textureOffset(s2DShadow, c3D, ivec2(3), c1D); - v += texelFetch(s3D, ic3D, ic1D); - v += texelFetchOffset(s2D, ic2D, 4, ivec2(3)); - v += texelFetchOffset(sr, ic2D, ivec2(4)); - v.y += textureLodOffset(s2DShadow, c3D, c1D, ivec2(3)); - v += textureProjLodOffset(s2D, c3D, c1D, ivec2(3)); - v += textureGrad(sCube, c3D, c3D, c3D); - v.x += textureGradOffset(s2DArrayShadow, c4D, c2D, c2D, ivec2(3)); - v += textureProjGrad(s3D, c4D, c3D, c3D); - v += textureProjGradOffset(s2D, c3D, c2D, c2D, ivec2(3)); - - ivec4 iv = texture(is2D, c2D); - v += vec4(iv); - iv = textureProjOffset(is2D, c4D, ivec2(3)); - v += vec4(iv); - iv = textureProjLod(is2D, c3D, c1D); - v += vec4(iv); - iv = textureProjGrad(is2D, c3D, c2D, c2D); - v += vec4(iv); - iv = texture(is3D, c3D, 4.2); - v += vec4(iv); - iv = textureLod(isCube, c3D, c1D); - v += vec4(iv); - iv = texelFetch(is2DArray, ic3D, ic1D); - v += vec4(iv); - iv += texelFetch(is2Dms, ic2D, ic1D); - v += vec4(iv); - v += texelFetch(sb, ic1D); - v += texelFetch(sr, ic2D); - - ivec2 iv2 = textureSize(sCubeShadow, 2); - // iv2 += textureSize(is2Dms); - - FragData = v + vec4(iv2, 0.0, 0.0); -} +#version 430 + +uniform samplerBuffer sb; +uniform sampler2DRect sr; +uniform sampler2D s2D; +uniform sampler3D s3D; +uniform samplerCube sCube; +uniform samplerCubeShadow sCubeShadow; +uniform sampler2DShadow s2DShadow; +uniform sampler2DArray s2DArray; +uniform sampler2DArrayShadow s2DArrayShadow; + +uniform isampler2D is2D; +uniform isampler3D is3D; +uniform isamplerCube isCube; +uniform isampler2DArray is2DArray; +uniform isampler2DMS is2Dms; + +uniform usampler2D us2D; +uniform usampler3D us3D; +uniform usamplerCube usCube; +uniform usampler2DArray us2DArray; + +in float c1D; +in vec2 c2D; +in vec3 c3D; +in vec4 c4D; + +flat in int ic1D; +flat in ivec2 ic2D; +flat in ivec3 ic3D; +flat in ivec4 ic4D; + +out vec4 FragData; + +void main() +{ + vec4 v = texture(s2D, c2D); + v += textureProj(s3D, c4D); + v += textureLod(s2DArray, c3D, 1.2); + v.y += textureOffset(s2DShadow, c3D, ivec2(3), c1D); + v += texelFetch(s3D, ic3D, ic1D); + v += texelFetchOffset(s2D, ic2D, 4, ivec2(3)); + v += texelFetchOffset(sr, ic2D, ivec2(4)); + v.y += textureLodOffset(s2DShadow, c3D, c1D, ivec2(3)); + v += textureProjLodOffset(s2D, c3D, c1D, ivec2(3)); + v += textureGrad(sCube, c3D, c3D, c3D); + v.x += textureGradOffset(s2DArrayShadow, c4D, c2D, c2D, ivec2(3)); + v += textureProjGrad(s3D, c4D, c3D, c3D); + v += textureProjGradOffset(s2D, c3D, c2D, c2D, ivec2(3)); + + ivec4 iv = texture(is2D, c2D); + v += vec4(iv); + iv = textureProjOffset(is2D, c4D, ivec2(3)); + v += vec4(iv); + iv = textureProjLod(is2D, c3D, c1D); + v += vec4(iv); + iv = textureProjGrad(is2D, c3D, c2D, c2D); + v += vec4(iv); + iv = texture(is3D, c3D, 4.2); + v += vec4(iv); + iv = textureLod(isCube, c3D, c1D); + v += vec4(iv); + iv = texelFetch(is2DArray, ic3D, ic1D); + v += vec4(iv); + iv += texelFetch(is2Dms, ic2D, ic1D); + v += vec4(iv); + v += texelFetch(sb, ic1D); + v += texelFetch(sr, ic2D); + + ivec2 iv2 = textureSize(sCubeShadow, 2); + // iv2 += textureSize(is2Dms); + + FragData = v + vec4(iv2, 0.0, 0.0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/noMain1.geom vulkan-1.1.73+dfsg/external/glslang/Test/noMain1.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/noMain1.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/noMain1.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,7 @@ -#version 110 - -void foo() -{ -} - +#version 110 + +void foo() +{ +} + layout(points) out; \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/noMain2.geom vulkan-1.1.73+dfsg/external/glslang/Test/noMain2.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/noMain2.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/noMain2.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,7 @@ -#version 150 - -void bar() -{ -} - -layout(line_strip) out; +#version 150 + +void bar() +{ +} + +layout(line_strip) out; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/noMain.vert vulkan-1.1.73+dfsg/external/glslang/Test/noMain.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/noMain.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/noMain.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,5 +1,5 @@ -#version 300 es - -void foo() -{ -} +#version 300 es + +void foo() +{ +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/nonuniform.frag vulkan-1.1.73+dfsg/external/glslang/Test/nonuniform.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/nonuniform.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/nonuniform.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,33 @@ +#version 450 + +int nonuniformEXT; + +#extension GL_EXT_nonuniform_qualifier : enable + +nonuniformEXT in vec4 nu_inv4; +nonuniformEXT float nu_gf; + +nonuniformEXT out vec4 nu_outv4; // ERROR, out +nonuniformEXT uniform vec4 nu_uv4; // ERROR, uniform +nonuniformEXT const float nu_constf = 1.0; // ERROR, const + +nonuniformEXT int foo(nonuniformEXT int nupi, nonuniformEXT out int f) +{ + return nupi; +} + +void main() +{ + nonuniformEXT int nu_li; + nonuniformEXT const int nu_ci = 2; // ERROR, const + + foo(nu_li, nu_li); + + int a; + nu_li = nonuniformEXT(a) + nonuniformEXT(a * 2); + nu_li = nonuniformEXT(a, a); // ERROR, too many arguments + nu_li = nonuniformEXT(); // ERROR, no arguments +} + +layout(location=1) in struct S { float a; nonuniformEXT float b; } ins; // ERROR, not on member +layout(location=3) in inbName { float a; nonuniformEXT float b; } inb; // ERROR, not on member diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/nonVulkan.frag vulkan-1.1.73+dfsg/external/glslang/Test/nonVulkan.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/nonVulkan.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/nonVulkan.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,9 +1,9 @@ -#version 450 - -layout(constant_id = 17) const int arraySize = 12; // ERROR -layout(input_attachment_index = 1) int foo; // ERROR -layout(push_constant) uniform ubn { int a; } ubi; // ERROR - -#ifdef VULKAN -#error VULKAN should not be defined -#endif +#version 450 + +layout(constant_id = 17) const int arraySize = 12; // ERROR +layout(input_attachment_index = 1) int foo; // ERROR +layout(push_constant) uniform ubn { int a; } ubi; // ERROR + +#ifdef VULKAN +#error VULKAN should not be defined +#endif diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/nosuffix vulkan-1.1.73+dfsg/external/glslang/Test/nosuffix --- vulkan-1.1.70+dfsg1/external/glslang/Test/nosuffix 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/nosuffix 2018-04-27 11:46:26.000000000 +0000 @@ -1,4 +1,4 @@ -void main() -{ - gl_Position = vec4(1.0); +void main() +{ + gl_Position = vec4(1.0); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/numeral.frag vulkan-1.1.73+dfsg/external/glslang/Test/numeral.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/numeral.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/numeral.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,106 +1,106 @@ -#version 400 - -void main() -{ - int o00 = 00; - int o000 = 000; - int o0000 = 0000; - int o5 = 05; - int o05 = 005; - int o006 = 0006; - int o7 = 07; - int o58 = 072; - int omax = 037777777777; - int o8 = 08; // ERROR - int o08 = 008; // ERROR - int o009 = 0009; // ERROR - int obig = 07324327323472347234; // ERROR - int omax1 = 040000000000; // ERROR - - uint uo5 = 05u; - uint uo6 = 06u; - uint uo7 = 07u; - uint uo8 = 08u; // ERROR - uint uo9 = 09u; // ERROR - - int h0 = 0x0; - int h00 = 0x00; - int h000 = 0x000; - int h1 = 0x1; - int h2 = 0x00000002; - int h300 = 0x000300; - int hABCDEF = 0xAbCdEF; - int hFFFFFFFF = 0xFFFFFFFF; - int h12345678 = 0xBC614E; - int hToBeOrNotToBe = 0x2b | ~0x2B; - - uint uh0 = 0x0u; - uint uhg = (0xcu); - uint uh000 = 0x000u; - uint uh1 = 0x1u; - uint uh2 = 0x00000002u; - uint uh300 = 0x000300u; - uint uhABCDEF = 0xAbCdEFu; - uint uhFFFFFFFF = 0xFFFFFFFFu; - uint uh12345678 = 0xBC614Eu; - uint uhToBeOrNotToBe = 0x2bu | ~0x2BU; - - //int he1 = 0xG; // ERROR - int he2 = 0x; // ERROR - int hbig = 0xFFFFFFFF1; // ERROR - - float f1 = 1.0; - float f2 = 2.; - float f3 = 3e0; - float f4 = 40e-1; - float f5 = 05.; - float f6 = 006.; - float f7 = .7e1; - float f8 = 08e0; - float f9 = .9e+1; - float f10 = 10.0; - float f11 = .011e+3; - float f12 = .0012e4; - float f543 = 000000543.; - float f6789 = 00006789.; - float f88 = 0000088.; - - float g1 = 5.3876e4; - float g2 = 4000000000e-11; - float g3 = 1e+5; - float g4 = 7.321E-3; - float g5 = 3.2E+4; - float g6 = 0.5e-5; - float g7 = 0.45; - float g8 = 6.e10; - - double gf1 = 1.0lf; - double gf2 = 2.Lf; - double gf3 = .3e1lF; - double gf4 = .4e1LF; - float gf5 = 5.f; - float gf6 = 6.F; - - //float e1 = 1..; // ERROR - //float e2 = 2.l; // ERROR - //float e3 = ..3; // ERROR - //float e4 = 4ee1; // ERROR - float e5 = 5f; // ERROR -} - -layout (location = 2) out vec4 c2; -layout (location = 3u) out vec4 c3; -layout (location = 04) out vec4 c4; -layout (location = 005u) out vec4 c5; -layout (location = 0x6) out vec4 c6; -layout (location = 0x7u) out vec4 c7; - -uint g1 = 4294967296u; // ERROR, too big -uint g2 = 4294967295u; -uint g3 = 4294967294u; -int g4 = 4294967296; // ERROR, too big -int g5 = 4294967295; -int g6 = 4294967294; -float inf1 = -1.#INF; -float inf2 = 1.#INF; -float inf3 = +1.#INF; +#version 400 + +void main() +{ + int o00 = 00; + int o000 = 000; + int o0000 = 0000; + int o5 = 05; + int o05 = 005; + int o006 = 0006; + int o7 = 07; + int o58 = 072; + int omax = 037777777777; + int o8 = 08; // ERROR + int o08 = 008; // ERROR + int o009 = 0009; // ERROR + int obig = 07324327323472347234; // ERROR + int omax1 = 040000000000; // ERROR + + uint uo5 = 05u; + uint uo6 = 06u; + uint uo7 = 07u; + uint uo8 = 08u; // ERROR + uint uo9 = 09u; // ERROR + + int h0 = 0x0; + int h00 = 0x00; + int h000 = 0x000; + int h1 = 0x1; + int h2 = 0x00000002; + int h300 = 0x000300; + int hABCDEF = 0xAbCdEF; + int hFFFFFFFF = 0xFFFFFFFF; + int h12345678 = 0xBC614E; + int hToBeOrNotToBe = 0x2b | ~0x2B; + + uint uh0 = 0x0u; + uint uhg = (0xcu); + uint uh000 = 0x000u; + uint uh1 = 0x1u; + uint uh2 = 0x00000002u; + uint uh300 = 0x000300u; + uint uhABCDEF = 0xAbCdEFu; + uint uhFFFFFFFF = 0xFFFFFFFFu; + uint uh12345678 = 0xBC614Eu; + uint uhToBeOrNotToBe = 0x2bu | ~0x2BU; + + //int he1 = 0xG; // ERROR + int he2 = 0x; // ERROR + int hbig = 0xFFFFFFFF1; // ERROR + + float f1 = 1.0; + float f2 = 2.; + float f3 = 3e0; + float f4 = 40e-1; + float f5 = 05.; + float f6 = 006.; + float f7 = .7e1; + float f8 = 08e0; + float f9 = .9e+1; + float f10 = 10.0; + float f11 = .011e+3; + float f12 = .0012e4; + float f543 = 000000543.; + float f6789 = 00006789.; + float f88 = 0000088.; + + float g1 = 5.3876e4; + float g2 = 4000000000e-11; + float g3 = 1e+5; + float g4 = 7.321E-3; + float g5 = 3.2E+4; + float g6 = 0.5e-5; + float g7 = 0.45; + float g8 = 6.e10; + + double gf1 = 1.0lf; + double gf2 = 2.Lf; + double gf3 = .3e1lF; + double gf4 = .4e1LF; + float gf5 = 5.f; + float gf6 = 6.F; + + //float e1 = 1..; // ERROR + //float e2 = 2.l; // ERROR + //float e3 = ..3; // ERROR + //float e4 = 4ee1; // ERROR + float e5 = 5f; // ERROR +} + +layout (location = 2) out vec4 c2; +layout (location = 3u) out vec4 c3; +layout (location = 04) out vec4 c4; +layout (location = 005u) out vec4 c5; +layout (location = 0x6) out vec4 c6; +layout (location = 0x7u) out vec4 c7; + +uint g1 = 4294967296u; // ERROR, too big +uint g2 = 4294967295u; +uint g3 = 4294967294u; +int g4 = 4294967296; // ERROR, too big +int g5 = 4294967295; +int g6 = 4294967294; +float inf1 = -1.#INF; +float inf2 = 1.#INF; +float inf3 = +1.#INF; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/nvShaderNoperspectiveInterpolation.frag vulkan-1.1.73+dfsg/external/glslang/Test/nvShaderNoperspectiveInterpolation.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/nvShaderNoperspectiveInterpolation.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/nvShaderNoperspectiveInterpolation.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,15 @@ +#version 300 es + +precision mediump float; + +noperspective in vec4 bad; // ERROR + +#extension GL_NV_shader_noperspective_interpolation : enable + +noperspective in vec4 color; + +out vec4 fragColor; + +void main() { + fragColor = color; +} \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/Operations.frag vulkan-1.1.73+dfsg/external/glslang/Test/Operations.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/Operations.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/Operations.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,166 +1,166 @@ -#version 130 - -uniform ivec4 uiv4; -uniform vec4 uv4; -uniform bool ub; -uniform bvec4 ub41, ub42; -uniform float uf; -uniform int ui; - - -uniform uvec4 uuv4; -uniform uint uui; - - -void main() -{ - vec4 v; - float f; - bool b; - bvec4 bv4; - int i; - - uint u; - - - // floating point - v = radians(uv4); - v += degrees(v); - v += (i = ui*ui, sin(v)); - v += cos(v); - v += tan(v); - v += asin(v); - v += acos(v); - - v += atan(v); - v += sinh(v); - v += cosh(v); - v += tanh(v); - v += asinh(v); - v += acosh(v); - v += atanh(v); - - v += pow(v, v); - v += exp(v); - v += log(v); - v += exp2(v); - v += log2(v); - v += sqrt(v); - v += inversesqrt(v); - v += abs(v); - v += sign(v); - v += floor(v); - - - v += trunc(v); - v += round(v); - v += roundEven(v); - - - v += ceil(v); - v += fract(v); - v += mod(v, v); - v += mod(v, v.x); - - - v += modf(v, v); - - - v += min(v, uv4); - v += max(v, uv4); - v += clamp(v, uv4, uv4); - v += mix(v,v,v); - - - v += mix(v,v,bv4); - v += intBitsToFloat(ivec4(i)); - v += uintBitsToFloat(uv4); - v += fma(v,v,v); - v += frexp(v); - v += ldexp(v); - v += unpackUnorm2x16(v); - v += unpackUnorm4x8(v); - v += unpackSnorm4x8(v); - - - v += step(v,v); - v += smoothstep(v,v,v); - v += step(uf,v); - v += smoothstep(uf,uf,v); - v += normalize(v); - v += faceforward(v, v, v); - v += reflect(v, v); - v += refract(v, v, uf); - v += dFdx(v); - v += dFdy(v); - v += fwidth(v); - //noise*(v); - - - // signed integer - i += abs(ui); - i += sign(i); - i += min(i, ui); - i += max(i, ui); - i += clamp(i, ui, ui); - - floatsBitsToInt(v); - packUnorm2x16(v); - packUnorm4x8(v); - packSnorm4x8(v); - - // unsigned integer - u = abs(uui); - u += sign(u); - u += min(u, uui); - u += max(u, uui); - u += clamp(u, uui, uui); - u += floatsBitToInt(v); - u += packUnorm2x16(v); - u += packUnorm4x8(v); - i += uui & i; // ERRORs, no int/uint conversions before 400 - i += uui ^ i; - i += i | uui; - - // bool - - b = isnan(uf); - b = isinf(v.y); - - b = any(lessThan(v, uv4)); - b = (b && any(lessThanEqual(v, uv4))); - b = (b && any(greaterThan(v, uv4))); - b = (b && any(greaterThanEqual(v, uv4))); - b = (b && any(equal(ub41, ub42))); - b = (b && any(notEqual(ub41, ub42))); - b = (b && any(ub41)); - b = (b && all(ub41)); - b = (b && any(not(ub41))); - - i = ((i + ui) * i - ui) / i; - i = i % ui; - if (i == ui || i != ui && i == ui ^^ i != 2) - ++i; - - f = ((uf + uf) * uf - uf) / uf; - - f += length(v); - f += distance(v, v); - f += dot(v, v); - f += dot(f, uf); - f += cross(v.xyz, v.xyz).x; - - if (f == uf || f != uf && f != 2.0) - ++f; - - i &= ui; - i |= 0x42; - i ^= ui; - i %= 17; - i >>= 2; - i <<= ui; - i = ~i; - b = !b; - - gl_FragColor = b ? vec4(i) + vec4(f) + v : v; -} +#version 130 + +uniform ivec4 uiv4; +uniform vec4 uv4; +uniform bool ub; +uniform bvec4 ub41, ub42; +uniform float uf; +uniform int ui; + + +uniform uvec4 uuv4; +uniform uint uui; + + +void main() +{ + vec4 v; + float f; + bool b; + bvec4 bv4; + int i; + + uint u; + + + // floating point + v = radians(uv4); + v += degrees(v); + v += (i = ui*ui, sin(v)); + v += cos(v); + v += tan(v); + v += asin(v); + v += acos(v); + + v += atan(v); + v += sinh(v); + v += cosh(v); + v += tanh(v); + v += asinh(v); + v += acosh(v); + v += atanh(v); + + v += pow(v, v); + v += exp(v); + v += log(v); + v += exp2(v); + v += log2(v); + v += sqrt(v); + v += inversesqrt(v); + v += abs(v); + v += sign(v); + v += floor(v); + + + v += trunc(v); + v += round(v); + v += roundEven(v); + + + v += ceil(v); + v += fract(v); + v += mod(v, v); + v += mod(v, v.x); + + + v += modf(v, v); + + + v += min(v, uv4); + v += max(v, uv4); + v += clamp(v, uv4, uv4); + v += mix(v,v,v); + + + v += mix(v,v,bv4); + v += intBitsToFloat(ivec4(i)); + v += uintBitsToFloat(uv4); + v += fma(v,v,v); + v += frexp(v); + v += ldexp(v); + v += unpackUnorm2x16(v); + v += unpackUnorm4x8(v); + v += unpackSnorm4x8(v); + + + v += step(v,v); + v += smoothstep(v,v,v); + v += step(uf,v); + v += smoothstep(uf,uf,v); + v += normalize(v); + v += faceforward(v, v, v); + v += reflect(v, v); + v += refract(v, v, uf); + v += dFdx(v); + v += dFdy(v); + v += fwidth(v); + //noise*(v); + + + // signed integer + i += abs(ui); + i += sign(i); + i += min(i, ui); + i += max(i, ui); + i += clamp(i, ui, ui); + + floatsBitsToInt(v); + packUnorm2x16(v); + packUnorm4x8(v); + packSnorm4x8(v); + + // unsigned integer + u = abs(uui); + u += sign(u); + u += min(u, uui); + u += max(u, uui); + u += clamp(u, uui, uui); + u += floatsBitToInt(v); + u += packUnorm2x16(v); + u += packUnorm4x8(v); + i += uui & i; // ERRORs, no int/uint conversions before 400 + i += uui ^ i; + i += i | uui; + + // bool + + b = isnan(uf); + b = isinf(v.y); + + b = any(lessThan(v, uv4)); + b = (b && any(lessThanEqual(v, uv4))); + b = (b && any(greaterThan(v, uv4))); + b = (b && any(greaterThanEqual(v, uv4))); + b = (b && any(equal(ub41, ub42))); + b = (b && any(notEqual(ub41, ub42))); + b = (b && any(ub41)); + b = (b && all(ub41)); + b = (b && any(not(ub41))); + + i = ((i + ui) * i - ui) / i; + i = i % ui; + if (i == ui || i != ui && i == ui ^^ i != 2) + ++i; + + f = ((uf + uf) * uf - uf) / uf; + + f += length(v); + f += distance(v, v); + f += dot(v, v); + f += dot(f, uf); + f += cross(v.xyz, v.xyz).x; + + if (f == uf || f != uf && f != 2.0) + ++f; + + i &= ui; + i |= 0x42; + i ^= ui; + i %= 17; + i >>= 2; + i <<= ui; + i = ~i; + b = !b; + + gl_FragColor = b ? vec4(i) + vec4(f) + v : v; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/parentBad vulkan-1.1.73+dfsg/external/glslang/Test/parentBad --- vulkan-1.1.70+dfsg1/external/glslang/Test/parentBad 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/parentBad 2018-04-27 11:46:26.000000000 +0000 @@ -1,3 +1,3 @@ -int a; - -#error bad parent +int a; + +#error bad parent diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/precision.frag vulkan-1.1.73+dfsg/external/glslang/Test/precision.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/precision.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/precision.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,76 +1,76 @@ -#version 100 - -varying vec3 color; // ERRROR, there is no default qualifier for float - -lowp vec2 foo(mediump vec3 mv3) -{ - highp vec4 hv4; - return hv4.xy; -} - -int global_medium; - -uniform lowp sampler2D samplerLow; -uniform mediump sampler2D samplerMed; -uniform highp sampler2D samplerHigh; - -precision highp int; -precision highp ivec2; // ERROR -precision mediump int[2]; // ERROR -vec4 uint; // okay -precision mediump vec4; // ERROR - -int global_high; - -void main() -{ - lowp int sum = global_medium + global_high; - - gl_FragColor = vec4(color, 1.0); - - int level1_high; - sum += level1_high; - - precision lowp int; - int level1_low; - sum += level1_low; - - // test maxing precisions of args to get precision of builtin - lowp float arg1; - mediump float arg2; - lowp float d = distance(arg1, arg2); - - { - int level2_low; - sum += level2_low; - - precision highp int; - int level2_high; - sum += level2_high; - do { - if (true) { - precision mediump int; - int level4_medium; - sum += level4_medium; - } - int level3_high; - sum += level3_high; - } while (true); - int level2_high2; - sum += level2_high2; - } - int level1_low3; - sum += level1_low3; - - sum += 4 + ((ivec2(level1_low3) * ivec2(level1_high) + ivec2((/* comma operator */level1_low3, level1_high)))).x; - - texture2D(samplerLow, vec2(0.1, 0.2)); - texture2D(samplerMed, vec2(0.1, 0.2)); - texture2D(samplerHigh, vec2(0.1, 0.2)); -} - -precision mediump bool; // ERROR -//precision mediump struct { int a; } s; // ERROR -struct s {int a;}; -precision mediump s; // ERROR -mediump bvec2 b2; // ERROR +#version 100 + +varying vec3 color; // ERRROR, there is no default qualifier for float + +lowp vec2 foo(mediump vec3 mv3) +{ + highp vec4 hv4; + return hv4.xy; +} + +int global_medium; + +uniform lowp sampler2D samplerLow; +uniform mediump sampler2D samplerMed; +uniform highp sampler2D samplerHigh; + +precision highp int; +precision highp ivec2; // ERROR +precision mediump int[2]; // ERROR +vec4 uint; // okay +precision mediump vec4; // ERROR + +int global_high; + +void main() +{ + lowp int sum = global_medium + global_high; + + gl_FragColor = vec4(color, 1.0); + + int level1_high; + sum += level1_high; + + precision lowp int; + int level1_low; + sum += level1_low; + + // test maxing precisions of args to get precision of builtin + lowp float arg1; + mediump float arg2; + lowp float d = distance(arg1, arg2); + + { + int level2_low; + sum += level2_low; + + precision highp int; + int level2_high; + sum += level2_high; + do { + if (true) { + precision mediump int; + int level4_medium; + sum += level4_medium; + } + int level3_high; + sum += level3_high; + } while (true); + int level2_high2; + sum += level2_high2; + } + int level1_low3; + sum += level1_low3; + + sum += 4 + ((ivec2(level1_low3) * ivec2(level1_high) + ivec2((/* comma operator */level1_low3, level1_high)))).x; + + texture2D(samplerLow, vec2(0.1, 0.2)); + texture2D(samplerMed, vec2(0.1, 0.2)); + texture2D(samplerHigh, vec2(0.1, 0.2)); +} + +precision mediump bool; // ERROR +//precision mediump struct { int a; } s; // ERROR +struct s {int a;}; +precision mediump s; // ERROR +mediump bvec2 b2; // ERROR diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/prepost.frag vulkan-1.1.73+dfsg/external/glslang/Test/prepost.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/prepost.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/prepost.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,38 +1,38 @@ -#version 140 - -void main() -{ - struct s { - float y[5]; - } str; - - float t; - int index = 5; // all indexing is 4 - - str.y[4] = 2.0; // 2.0 - t = ++str.y[--index]; // 3.0 - str.y[4] += t; // 6.0 - t = str.y[4]--; // 5.0 (t = 6.0) - str.y[index++] += t; // 11.0 - --str.y[--index]; // 10.0 - - float x = str.y[4]; - ++x; - --x; - x++; - x--; - - // x is 10.0 - - float y = x * ++x; // 10 * 11 - float z = y * x--; // 110 * 11 - - // x is 10.0 - // z is 1210.0 - - vec4 v = vec4(1.0, 2.0, 3.0, 4.0); - v.y = v.z--; // (1,3,2,4) - v.x = --v.w; // (3,3,2,3) - - gl_FragColor = z * v;// (3630.0, 3630.0, 2420.0, 3630.0) -} +#version 140 + +void main() +{ + struct s { + float y[5]; + } str; + + float t; + int index = 5; // all indexing is 4 + + str.y[4] = 2.0; // 2.0 + t = ++str.y[--index]; // 3.0 + str.y[4] += t; // 6.0 + t = str.y[4]--; // 5.0 (t = 6.0) + str.y[index++] += t; // 11.0 + --str.y[--index]; // 10.0 + + float x = str.y[4]; + ++x; + --x; + x++; + x--; + + // x is 10.0 + + float y = x * ++x; // 10 * 11 + float z = y * x--; // 110 * 11 + + // x is 10.0 + // z is 1210.0 + + vec4 v = vec4(1.0, 2.0, 3.0, 4.0); + v.y = v.z--; // (1,3,2,4) + v.x = --v.w; // (3,3,2,3) + + gl_FragColor = z * v;// (3630.0, 3630.0, 2420.0, 3630.0) +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.edge_cases.vert vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.edge_cases.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.edge_cases.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.edge_cases.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,15 +1,15 @@ -#version 310 es -#define X(Y) /* - */ Y + 2 - -#define Y(Z) 2 * Z// asdf - -#define Z(Y) /* - */ \ - 2 /* - */ + 3 \ - * Y - -void main() { - gl_Position = vec4(X(3) + Y(4) + Z(2)); -} +#version 310 es +#define X(Y) /* + */ Y + 2 + +#define Y(Z) 2 * Z// asdf + +#define Z(Y) /* + */ \ + 2 /* + */ + 3 \ + * Y + +void main() { + gl_Position = vec4(X(3) + Y(4) + Z(2)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.errors.vert vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.errors.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.errors.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.errors.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,20 +1,20 @@ -#version 310 es - -#define X 1 - -#if X - #ifdef Y - #error This should not show up in pp output. - #endif - #error This should show up in pp output. -#else - #error This should not show up in pp output. -#endif - -#def X -#if Y - -#extension a - -int main() { -} +#version 310 es + +#define X 1 + +#if X + #ifdef Y + #error This should not show up in pp output. + #endif + #error This should show up in pp output. +#else + #error This should not show up in pp output. +#endif + +#def X +#if Y + +#extension a + +int main() { +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.extensions.vert vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.extensions.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.extensions.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.extensions.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,12 @@ -#version 310 es - -#extension GL_EXT_geometry_shader: enable -#extension GL_EXT_frag_depth: disable -#extension GL_EXT_gpu_shader5: require -#extension GL_EXT_shader_texture_image_samples: warn - -#extension unknown_extension: require - -int main() { -} - +#version 310 es + +#extension GL_EXT_geometry_shader: enable +#extension GL_EXT_frag_depth: disable +#extension GL_EXT_gpu_shader5: require +#extension GL_EXT_shader_texture_image_samples: warn + +#extension unknown_extension: require + +int main() { +} + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.function_macro.vert vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.function_macro.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.function_macro.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.function_macro.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,20 +1,20 @@ -#version 310 es - - -#define X(n) n + 1 -#define Y(n, z) n + z -#define Z(f) X(f) - -#define REALLY_LONG_MACRO_NAME_WITH_MANY_PARAMETERS(X1, X2, X3, X4, X5, X6, X7,\ - X8, X9, X10, X11, X12) X1+X2+X3+X4+X5+X6+X7+X8+X9+X10+X11+X12 - -#define A(\ - Y\ - )\ -4 + 3 + Y - -int main() { - gl_Position = vec4(X(3), Y(3, 4), Z(3)); - gl_Position = vec4(REALLY_LONG_MACRO_NAME_WITH_MANY_PARAMETERS(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)); - gl_Position = vec4(A(3)); -} +#version 310 es + + +#define X(n) n + 1 +#define Y(n, z) n + z +#define Z(f) X(f) + +#define REALLY_LONG_MACRO_NAME_WITH_MANY_PARAMETERS(X1, X2, X3, X4, X5, X6, X7,\ + X8, X9, X10, X11, X12) X1+X2+X3+X4+X5+X6+X7+X8+X9+X10+X11+X12 + +#define A(\ + Y\ + )\ +4 + 3 + Y + +int main() { + gl_Position = vec4(X(3), Y(3, 4), Z(3)); + gl_Position = vec4(REALLY_LONG_MACRO_NAME_WITH_MANY_PARAMETERS(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)); + gl_Position = vec4(A(3)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.include.enabled.vert vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.include.enabled.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.include.enabled.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.include.enabled.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,20 +1,20 @@ -#extension GL_GOOGLE_include_directive : enable -#line 8000 -#include -#include 123 -#include "foo.oeu" -#include "foo.oeu/ao eu/ao.h" -#include "foo" -#include -#include -#include -#include "foo.oe>" -#include -#include "foo2.h" garbage -#include garbage -// max length -#include -// too long -#include +#extension GL_GOOGLE_include_directive : enable +#line 8000 +#include +#include 123 +#include "foo.oeu" +#include "foo.oeu/ao eu/ao.h" +#include "foo" +#include +#include +#include +#include "foo.oe>" +#include +#include "foo2.h" garbage +#include garbage +// max length +#include +// too long +#include #include "no-eol" \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.line.vert vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.line.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.line.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.line.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,39 +1,39 @@ -#line 300 - -#line 2 - - - - - -#line __LINE__ + 3 - - -#line __FILE__ + 2 - -#line __FILE__ * __LINE__ - - -#define X 4 - -#line X - -#undef X - -#define X(y) y + 3 + 2 - -#line X(3) - -void main() { - gl_Position = vec4(__LINE__); -} - -#line X(3) 4 - -#define Z(y, q) \ - y*q*2 q - -#line Z(2, 3) - -#line 1 - +#line 300 + +#line 2 + + + + + +#line __LINE__ + 3 + + +#line __FILE__ + 2 + +#line __FILE__ * __LINE__ + + +#define X 4 + +#line X + +#undef X + +#define X(y) y + 3 + 2 + +#line X(3) + +void main() { + gl_Position = vec4(__LINE__); +} + +#line X(3) 4 + +#define Z(y, q) \ + y*q*2 q + +#line Z(2, 3) + +#line 1 + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.pragma.vert vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.pragma.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.pragma.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.pragma.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,11 +1,13 @@ -#version 310 es - -#pragma optimize(on) -#pragma optimize(off) -#pragma debug(on) -#pragma debug(off) - -#pragma undefined_pragma(x, 4) - -int main() { -} +#version 310 es + +#pragma optimize(on) +#pragma optimize(off) +#pragma debug(on) +#pragma debug(off) + +#pragma undefined_pragma(x, 4) + +#pragma once + +int main() { +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.simple.vert vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.simple.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/preprocessor.simple.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/preprocessor.simple.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,29 +1,29 @@ -#version 310 es -#define X 1 -#define Y clamp -#define Z X - -#define F 1, 2 - -#define make_function \ - float fn ( float x ) \ - {\ - return x + 4.0; \ - } - -make_function - -int main() { - gl_Position = vec4(X); - gl_Position = Y(1, 2, 3); - gl_Position = vec4(Z); - gl_Position = vec4(F); - gl_Position = vec4(fn(3)); - [] . ++ -- - + - * % / - ! ~ - << >> < > <= >= - == != - & ^ | && ^^ || ? : - += -= *= /= %= <<= >>= &= |= ^= - 1.2 2E10 5u -5lf -} +#version 310 es +#define X 1 +#define Y clamp +#define Z X + +#define F 1, 2 + +#define make_function \ + float fn ( float x ) \ + {\ + return x + 4.0; \ + } + +make_function + +int main() { + gl_Position = vec4(X); + gl_Position = Y(1, 2, 3); + gl_Position = vec4(Z); + gl_Position = vec4(F); + gl_Position = vec4(fn(3)); + [] . ++ -- + + - * % / - ! ~ + << >> < > <= >= + == != + & ^ | && ^^ || ? : + += -= *= /= %= <<= >>= &= |= ^= + 1.2 2E10 5u -5lf +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/recurse1.frag vulkan-1.1.73+dfsg/external/glslang/Test/recurse1.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/recurse1.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/recurse1.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,48 +1,48 @@ -#version 330 core - -// cross-unit recursion - -void main() {} - -// two-level recursion - -float cbar(int); - -void cfoo(float) -{ - cbar(2); -} - -// four-level, out of order - -void CB(); -void CD(); -void CA() { CB(); } -void CC() { CD(); } - -// high degree - -void CBT(); -void CDT(); -void CAT() { CBT(); CBT(); CBT(); } -void CCT() { CDT(); CDT(); CBT(); } - -// not recursive - -void norA() {} -void norB() { norA(); } -void norC() { norA(); } -void norD() { norA(); } -void norE() { norB(); } -void norF() { norB(); } -void norG() { norE(); } -void norH() { norE(); } -void norI() { norE(); } - -// not recursive, but with a call leading into a cycle if ignoring direction - -void norcA() { } -void norcB() { norcA(); } -void norcC() { norcB(); } -void norcD() { norcC(); norcB(); } // head of cycle -void norcE() { norcD(); } // lead into cycle +#version 330 core + +// cross-unit recursion + +void main() {} + +// two-level recursion + +float cbar(int); + +void cfoo(float) +{ + cbar(2); +} + +// four-level, out of order + +void CB(); +void CD(); +void CA() { CB(); } +void CC() { CD(); } + +// high degree + +void CBT(); +void CDT(); +void CAT() { CBT(); CBT(); CBT(); } +void CCT() { CDT(); CDT(); CBT(); } + +// not recursive + +void norA() {} +void norB() { norA(); } +void norC() { norA(); } +void norD() { norA(); } +void norE() { norB(); } +void norF() { norB(); } +void norG() { norE(); } +void norH() { norE(); } +void norI() { norE(); } + +// not recursive, but with a call leading into a cycle if ignoring direction + +void norcA() { } +void norcB() { norcA(); } +void norcC() { norcB(); } +void norcD() { norcC(); norcB(); } // head of cycle +void norcE() { norcD(); } // lead into cycle diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/recurse1.vert vulkan-1.1.73+dfsg/external/glslang/Test/recurse1.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/recurse1.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/recurse1.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,44 +1,44 @@ -#version 330 core - -void main() {} - -float bar(int); - -// direct recursion - -void self() -{ - self(); -} - -// two-level recursion - -void foo(float) -{ - bar(2); -} - -float bar(int) -{ - foo(4.2); - - return 3.2; -} - -// four-level, out of order - -void B(); -void D(); -void A() { B(); } -void C() { D(); } -void B() { C(); } -void D() { A(); } - -// high degree - -void BT(); -void DT(); -void AT() { BT(); BT(); BT(); } -void CT() { DT(); AT(); DT(); BT(); } -void BT() { CT(); CT(); CT(); } -void DT() { AT(); } +#version 330 core + +void main() {} + +float bar(int); + +// direct recursion + +void self() +{ + self(); +} + +// two-level recursion + +void foo(float) +{ + bar(2); +} + +float bar(int) +{ + foo(4.2); + + return 3.2; +} + +// four-level, out of order + +void B(); +void D(); +void A() { B(); } +void C() { D(); } +void B() { C(); } +void D() { A(); } + +// high degree + +void BT(); +void DT(); +void AT() { BT(); BT(); BT(); } +void CT() { DT(); AT(); DT(); BT(); } +void BT() { CT(); CT(); CT(); } +void DT() { AT(); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/recurse2.frag vulkan-1.1.73+dfsg/external/glslang/Test/recurse2.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/recurse2.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/recurse2.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,28 +1,28 @@ -#version 330 core - -// cross-unit recursion - -// two-level recursion - -void cfoo(float); - -float cbar(int) -{ - cfoo(4.2); - - return 3.2; -} - -// four-level, out of order - -void CA(); -void CC(); -void CB() { CC(); } -void CD() { CA(); } - -// high degree - -void CAT(); -void CCT(); -void CBT() { CCT(); CCT(); CCT(); } -void CDT() { CAT(); } +#version 330 core + +// cross-unit recursion + +// two-level recursion + +void cfoo(float); + +float cbar(int) +{ + cfoo(4.2); + + return 3.2; +} + +// four-level, out of order + +void CA(); +void CC(); +void CB() { CC(); } +void CD() { CA(); } + +// high degree + +void CAT(); +void CCT(); +void CBT() { CCT(); CCT(); CCT(); } +void CDT() { CAT(); } diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/reflection.vert vulkan-1.1.73+dfsg/external/glslang/Test/reflection.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/reflection.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/reflection.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,206 +1,206 @@ -#version 440 core - -layout(std140, row_major) uniform nameless { - vec3 anonMember1; - mat3x2 m23; - int scalarAfterm23; - vec4 anonDeadMember2; - vec4 anonMember3; - int scalarBeforeArray; - float floatArray[5]; - int scalarAfterArray; - mat2x2 m22[9]; -}; - -layout(std140, column_major) uniform c_nameless { - vec3 c_anonMember1; - mat3x2 c_m23; - int c_scalarAfterm23; - vec4 c_anonDeadMember2; - vec4 c_anonMember3; -}; - -layout(std140) uniform named { - vec3 deadMember1; - int scalar; - vec4 member2; - vec4 member3; - vec2 memvec2; - float memf1; - bool memf2; - int memf3; - vec2 memvec2a; - mat2x2 m22[7]; -} ablock; - -layout(std140) uniform namelessdead { - int a; -}; - -layout(std140) uniform namedDead { - int b; -} bblock; - -struct N1 { - float a; -}; - -struct N2 { - float b; - float c; - float d; -}; - -struct N3 { - N1 n1; - N2 n2; -}; - -layout(std140) uniform nested { - N3 foo; -} nest; - -struct TS { - int a; - int dead; -}; - -uniform TS s; - -uniform float uf1; -uniform float uf2; -uniform float ufDead3; -uniform float ufDead4; - -uniform writeonly uimage2D image_ui2D; -uniform sampler2D sampler_2D; -uniform sampler2DMSArray sampler_2DMSArray; - -uniform mat2 dm22[10]; - -struct deep1 { - vec2 va[3]; - bool b; -}; - -struct deep2 { - int i; - deep1 d1[4]; -}; - -struct deep3 { - vec4 iv4; - deep2 d2; - ivec3 v3; -}; - -in float attributeFloat; -layout(location = 2) in vec2 attributeFloat2; -in vec3 attributeFloat3; -in vec4 attributeFloat4; -in mat4 attributeMat4; - -uniform deep3 deepA[2], deepB[2], deepC[3], deepD[2]; - -const bool control = true; - -void deadFunction() -{ - vec3 v3 = ablock.deadMember1; - vec4 v = anonDeadMember2; - float f = ufDead4; -} - -void liveFunction2() -{ - vec3 v = anonMember1; - float f = uf1; -} - -void liveFunction1(writeonly uimage2D p_ui2D, sampler2D p_2D, sampler2DMSArray p_2DMSArray) - -{ - liveFunction2(); - float f = uf2; - vec4 v = ablock.member3; -} - -uniform abl { - float foo; -} arrBl[4]; - -uniform abl2 { - float foo; -} arrBl2[4]; - -buffer buf1 { - float scalar; - float runtimeArray[]; -} buf1i; - -buffer buf2 { - float scalar; - N2 runtimeArray[]; -} buf2i; - -buffer buf3 { - float scalar; - float runtimeArray[]; -} buf3i; - -buffer buf4 { - float scalar; - N2 runtimeArray[]; -} buf4i; - -void main() -{ - liveFunction1(image_ui2D, sampler_2D, sampler_2DMSArray); - liveFunction2(); - - if (! control) - deadFunction(); - - float f; - int i; - if (control) { - liveFunction2(); - f = anonMember3.z; - f = s.a; - f = ablock.scalar; - f = m23[1].y + scalarAfterm23; - f = c_m23[1].y + c_scalarAfterm23; - f += scalarBeforeArray; - f += floatArray[2]; - f += floatArray[4]; - f += scalarAfterArray; - f += ablock.memvec2.x; - f += ablock.memf1; - f += float(ablock.memf2); - f += ablock.memf3; - f += ablock.memvec2a.y; - f += ablock.m22[i][1][0]; - f += dm22[3][0][1]; - f += m22[2][1].y; - f += nest.foo.n1.a + nest.foo.n2.b + nest.foo.n2.c + nest.foo.n2.d; - f += deepA[i].d2.d1[2].va[1].x; - f += deepB[1].d2.d1[i].va[1].x; - f += deepB[i].d2.d1[i].va[1].x; - deep3 d = deepC[1]; - deep3 da[2] = deepD; - } else - f = ufDead3; - - f += arrBl[2].foo + arrBl[0].foo; - f += arrBl2[i].foo; - - f += attributeFloat; - f += attributeFloat2.x; - f += attributeFloat3.x; - f += attributeFloat4.x; - f += attributeMat4[0][1]; - f += buf1i.runtimeArray[3]; - f += buf2i.runtimeArray[3].c; - f += buf3i.runtimeArray[gl_InstanceID]; - f += buf4i.runtimeArray[gl_InstanceID].c; -} +#version 440 core + +layout(std140, row_major) uniform nameless { + vec3 anonMember1; + mat3x2 m23; + int scalarAfterm23; + vec4 anonDeadMember2; + vec4 anonMember3; + int scalarBeforeArray; + float floatArray[5]; + int scalarAfterArray; + mat2x2 m22[9]; +}; + +layout(std140, column_major) uniform c_nameless { + vec3 c_anonMember1; + mat3x2 c_m23; + int c_scalarAfterm23; + vec4 c_anonDeadMember2; + vec4 c_anonMember3; +}; + +layout(std140) uniform named { + vec3 deadMember1; + int scalar; + vec4 member2; + vec4 member3; + vec2 memvec2; + float memf1; + bool memf2; + int memf3; + vec2 memvec2a; + mat2x2 m22[7]; +} ablock; + +layout(std140) uniform namelessdead { + int a; +}; + +layout(std140) uniform namedDead { + int b; +} bblock; + +struct N1 { + float a; +}; + +struct N2 { + float b; + float c; + float d; +}; + +struct N3 { + N1 n1; + N2 n2; +}; + +layout(std140) uniform nested { + N3 foo; +} nest; + +struct TS { + int a; + int dead; +}; + +uniform TS s; + +uniform float uf1; +uniform float uf2; +uniform float ufDead3; +uniform float ufDead4; + +uniform writeonly uimage2D image_ui2D; +uniform sampler2D sampler_2D; +uniform sampler2DMSArray sampler_2DMSArray; + +uniform mat2 dm22[10]; + +struct deep1 { + vec2 va[3]; + bool b; +}; + +struct deep2 { + int i; + deep1 d1[4]; +}; + +struct deep3 { + vec4 iv4; + deep2 d2; + ivec3 v3; +}; + +in float attributeFloat; +layout(location = 2) in vec2 attributeFloat2; +in vec3 attributeFloat3; +in vec4 attributeFloat4; +in mat4 attributeMat4; + +uniform deep3 deepA[2], deepB[2], deepC[3], deepD[2]; + +const bool control = true; + +void deadFunction() +{ + vec3 v3 = ablock.deadMember1; + vec4 v = anonDeadMember2; + float f = ufDead4; +} + +void liveFunction2() +{ + vec3 v = anonMember1; + float f = uf1; +} + +void liveFunction1(writeonly uimage2D p_ui2D, sampler2D p_2D, sampler2DMSArray p_2DMSArray) + +{ + liveFunction2(); + float f = uf2; + vec4 v = ablock.member3; +} + +uniform abl { + float foo; +} arrBl[4]; + +uniform abl2 { + float foo; +} arrBl2[4]; + +buffer buf1 { + float scalar; + float runtimeArray[]; +} buf1i; + +buffer buf2 { + float scalar; + N2 runtimeArray[]; +} buf2i; + +buffer buf3 { + float scalar; + float runtimeArray[]; +} buf3i; + +buffer buf4 { + float scalar; + N2 runtimeArray[]; +} buf4i; + +void main() +{ + liveFunction1(image_ui2D, sampler_2D, sampler_2DMSArray); + liveFunction2(); + + if (! control) + deadFunction(); + + float f; + int i; + if (control) { + liveFunction2(); + f = anonMember3.z; + f = s.a; + f = ablock.scalar; + f = m23[1].y + scalarAfterm23; + f = c_m23[1].y + c_scalarAfterm23; + f += scalarBeforeArray; + f += floatArray[2]; + f += floatArray[4]; + f += scalarAfterArray; + f += ablock.memvec2.x; + f += ablock.memf1; + f += float(ablock.memf2); + f += ablock.memf3; + f += ablock.memvec2a.y; + f += ablock.m22[i][1][0]; + f += dm22[3][0][1]; + f += m22[2][1].y; + f += nest.foo.n1.a + nest.foo.n2.b + nest.foo.n2.c + nest.foo.n2.d; + f += deepA[i].d2.d1[2].va[1].x; + f += deepB[1].d2.d1[i].va[1].x; + f += deepB[i].d2.d1[i].va[1].x; + deep3 d = deepC[1]; + deep3 da[2] = deepD; + } else + f = ufDead3; + + f += arrBl[2].foo + arrBl[0].foo; + f += arrBl2[i].foo; + + f += attributeFloat; + f += attributeFloat2.x; + f += attributeFloat3.x; + f += attributeFloat4.x; + f += attributeMat4[0][1]; + f += buf1i.runtimeArray[3]; + f += buf2i.runtimeArray[3].c; + f += buf3i.runtimeArray[gl_InstanceID]; + f += buf4i.runtimeArray[gl_InstanceID].c; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/runtests vulkan-1.1.73+dfsg/external/glslang/Test/runtests --- vulkan-1.1.70+dfsg1/external/glslang/Test/runtests 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/runtests 2018-04-27 11:46:26.000000000 +0000 @@ -126,9 +126,12 @@ # Testing debug information # echo Testing SPV Debug Information -$EXE -g --relaxed-errors --suppress-warnings --aml --hlsl-offsets --nsf \ +$EXE -g --relaxed-errors --suppress-warnings --aml --amb --hlsl-offsets --nsf \ -G -H spv.debugInfo.frag --rsb frag 3 > $TARGETDIR/spv.debugInfo.frag.out diff -b $BASEDIR/spv.debugInfo.frag.out $TARGETDIR/spv.debugInfo.frag.out || HASERROR=1 +$EXE -g -Od --target-env vulkan1.1 --relaxed-errors --suppress-warnings --aml --hlsl-offsets --nsf \ + -G -H spv.debugInfo.frag --rsb frag 3 > $TARGETDIR/spv.debugInfo.1.1.frag.out +diff -b $BASEDIR/spv.debugInfo.1.1.frag.out $TARGETDIR/spv.debugInfo.1.1.frag.out || HASERROR=1 $EXE -g -D -Od -e newMain -g --amb --aml --fua --hlsl-iomap --nsf --sib 1 --ssb 2 --sbb 3 --stb 4 --suavb 5 --sub 6 \ --sep origMain -H -Od spv.hlslDebugInfo.vert --rsb vert t0 0 0 > $TARGETDIR/spv.hlslDebugInfo.frag.out diff -b $BASEDIR/spv.hlslDebugInfo.frag.out $TARGETDIR/spv.hlslDebugInfo.frag.out || HASERROR=1 @@ -162,6 +165,7 @@ $EXE --client vulkan100 spv.targetVulkan.vert || HASERROR=1 $EXE --client opengl100 spv.targetOpenGL.vert || HASERROR=1 $EXE --target-env vulkan1.0 spv.targetVulkan.vert || HASERROR=1 +$EXE --target-env vulkan1.1 spv.targetVulkan.vert || HASERROR=1 $EXE --target-env opengl spv.targetOpenGL.vert || HASERROR=1 $EXE -V100 spv.targetVulkan.vert || HASERROR=1 $EXE -G100 spv.targetOpenGL.vert || HASERROR=1 @@ -198,6 +202,16 @@ diff -b $BASEDIR/hlsl.y-negate-3.vert.out $TARGETDIR/hlsl.y-negate-3.vert.out || HASERROR=1 # +# Testing hlsl_functionality1 +# +$EXE -H -e main -D -Od -fhlsl_functionality1 hlsl.structbuffer.incdec.frag > \ + $TARGETDIR/hlsl.structbuffer.incdec.frag.hlslfun1.out +diff -b $BASEDIR/hlsl.structbuffer.incdec.frag.hlslfun1.out $TARGETDIR/hlsl.structbuffer.incdec.frag.hlslfun1.out || HASERROR=1 +$EXE -H -e main -D -Od -fhlsl_functionality1 hlsl.noSemantic.functionality1.comp > \ + $TARGETDIR/hlsl.noSemantic.functionality1.comp.out +diff -b $BASEDIR/hlsl.noSemantic.functionality1.comp.out $TARGETDIR/hlsl.noSemantic.functionality1.comp.out || HASERROR=1 + +# # Final checking # if [ $HASERROR -eq 0 ] diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/runtimeArray.vert vulkan-1.1.73+dfsg/external/glslang/Test/runtimeArray.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/runtimeArray.vert 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/runtimeArray.vert 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,108 @@ +#version 450 core + +buffer bn { + int a[]; + float b[]; +} buf; + +uniform un { + int a[]; + float b[]; +} ubuf; + +buffer bna { + int a[]; + float b[]; +} bufa[4]; + +uniform una { + int a[]; + float b[]; +} ubufa[4]; + +buffer abn { + int aba[]; + float abb[]; +}; + +uniform aun { + int aua[]; + float aub[]; +}; + +layout(binding=1) uniform samplerBuffer uniformTexelBufferDyn[]; +layout(binding=2, r32f) uniform imageBuffer storageTexelBufferDyn[]; +layout(binding=3) uniform uname { float a; } uniformBuffer[]; +layout(binding=4) buffer bname { float b; } storageBuffer[]; +layout(binding=5) uniform sampler2D sampledImage[]; +layout(binding=6, r32f) uniform image2D storageImage[]; +layout(binding=8) uniform samplerBuffer uniformTexelBuffer[]; +layout(binding=9, r32f) uniform imageBuffer storageTexelBuffer[]; + +int i; + +void main() +{ + ubuf.a[3]; + ubuf.b[3]; + buf.a[3]; + buf.b[3]; + + ubufa[3].a[3]; + ubufa[3].b[3]; + bufa[3].a[3]; + bufa[3].b[3]; + + aua[3]; + aub[3]; + aba[3]; + abb[3]; + + ubuf.a[i]; // ERROR + ubuf.b[i]; // ERROR + buf.a[i]; // ERROR + buf.b[i]; + + ubuf.a.length(); // ERROR + ubuf.b.length(); // ERROR + buf.a.length(); // ERROR + buf.b.length(); + + ubufa[1].a[i]; // ERROR + ubufa[1].b[i]; // ERROR + bufa[1].a[i]; // ERROR + bufa[1].b[i]; + + ubufa[1].a.length(); // ERROR + ubufa[1].b.length(); // ERROR + bufa[1].a.length(); // ERROR + bufa[1].b.length(); + + aua[i]; // ERROR + aub[i]; // ERROR + aba[i]; // ERROR + abb[i]; + + aua.length(); // ERROR + aub.length(); // ERROR + aba.length(); // ERROR + abb.length(); + + uniformTexelBufferDyn[1]; + storageTexelBufferDyn[1]; + uniformBuffer[1]; + storageBuffer[1]; + sampledImage[1]; + storageImage[1]; + uniformTexelBuffer[1]; + storageTexelBuffer[1]; + + uniformTexelBufferDyn[i]; // ERROR, need extension + storageTexelBufferDyn[i]; // ERROR, need extension + uniformBuffer[i]; // ERROR, need extension + storageBuffer[i]; // ERROR, need extension + sampledImage[i]; // ERROR, need extension + storageImage[i]; // ERROR, need extension + uniformTexelBuffer[i]; // ERROR, need extension + storageTexelBuffer[i]; // ERROR, need extension +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/sample.frag vulkan-1.1.73+dfsg/external/glslang/Test/sample.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/sample.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/sample.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,41 +1,41 @@ -// -//Copyright (C) 2002-2004 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -#version 110 - -varying vec3 color; - -void main() -{ - gl_FragColor = vec4(color, 1.0); -} +// +//Copyright (C) 2002-2004 3Dlabs Inc. Ltd. +//All rights reserved. +// +//Redistribution and use in source and binary forms, with or without +//modification, are permitted provided that the following conditions +//are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of 3Dlabs Inc. Ltd. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +//POSSIBILITY OF SUCH DAMAGE. +// +#version 110 + +varying vec3 color; + +void main() +{ + gl_FragColor = vec4(color, 1.0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/sample.vert vulkan-1.1.73+dfsg/external/glslang/Test/sample.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/sample.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/sample.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,43 +1,43 @@ -// -//Copyright (C) 2002-2004 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -#version 110 - -varying vec3 color; - -void main() -{ - color = vec3(1.0, 1.0, 1.0); - - gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; -} +// +//Copyright (C) 2002-2004 3Dlabs Inc. Ltd. +//All rights reserved. +// +//Redistribution and use in source and binary forms, with or without +//modification, are permitted provided that the following conditions +//are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of 3Dlabs Inc. Ltd. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +//POSSIBILITY OF SUCH DAMAGE. +// +#version 110 + +varying vec3 color; + +void main() +{ + color = vec3(1.0, 1.0, 1.0); + + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/simpleFunctionCall.frag vulkan-1.1.73+dfsg/external/glslang/Test/simpleFunctionCall.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/simpleFunctionCall.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/simpleFunctionCall.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,15 +1,15 @@ -#version 150 - -uniform vec4 bigColor; -varying vec4 BaseColor; -uniform float d; - -vec4 foo() -{ - return BaseColor; -} - -void main() -{ - gl_FragColor = foo(); -} +#version 150 + +uniform vec4 bigColor; +varying vec4 BaseColor; +uniform float d; + +vec4 foo() +{ + return BaseColor; +} + +void main() +{ + gl_FragColor = foo(); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/specExamples.frag vulkan-1.1.73+dfsg/external/glslang/Test/specExamples.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/specExamples.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/specExamples.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,237 +1,237 @@ -#version 430 - -#extension GL_3DL_array_objects : enable - -int a = 0xffffffff; // 32 bits, a gets the value -1 -int b = 0xffffffffU; // ERROR: can't convert uint to int -uint c = 0xffffffff; // 32 bits, c gets the value 0xFFFFFFFF -uint d = 0xffffffffU; // 32 bits, d gets the value 0xFFFFFFFF -int e = -1; // the literal is "1", then negation is performed, - // and the resulting non-literal 32-bit signed - // bit pattern of 0xFFFFFFFF is assigned, giving e - // the value of -1. -uint f = -1u; // the literal is "1u", then negation is performed, - // and the resulting non-literal 32-bit unsigned - // bit pattern of 0xFFFFFFFF is assigned, giving f - // the value of 0xFFFFFFFF. -int g = 3000000000; // a signed decimal literal taking 32 bits, - // setting the sign bit, g gets -1294967296 -int h = 0xA0000000; // okay, 32-bit signed hexadecimal -int i = 5000000000; // ERROR: needs more than 32 bits -int j = 0xFFFFFFFFF; // ERROR: needs more that 32 bits -int k = 0x80000000; // k gets -2147483648 == 0x80000000 -int l = 2147483648; // l gets -2147483648 (the literal set the sign bit) - -float fa, fb = 1.5; // single-precision floating-point -double fc, fd = 2.0LF; // double-precision floating-point - -vec2 texcoord1, texcoord2; -vec3 position; -vec4 myRGBA; -ivec2 textureLookup; -bvec3 less; - -mat2 mat2D; -mat3 optMatrix; -mat4 view, projection; -mat4x4 view; // an alternate way of declaring a mat4 -mat3x2 m; // a matrix with 3 columns and 2 rows -dmat4 highPrecisionMVP; -dmat2x4 dm; - -struct light { - float intensity; - vec3 position; -} lightVar; - -struct S { float f; }; - -struct T { - //S; // Error: anonymous structures disallowed - //struct { ... }; // Error: embedded structures disallowed - S s; // Okay: nested structures with name are allowed -}; - -float frequencies[3]; -uniform vec4 lightPosition[4]; -light lights[]; -const int numLights = 2; -light lights[numLights]; - -in vec3 normal; -centroid in vec2 TexCoord; -invariant centroid in vec4 Color; -noperspective in float temperature; -flat in vec3 myColor; -noperspective centroid in vec2 myTexCoord; - -uniform vec4 lightPosition; -uniform vec3 color = vec3(0.7, 0.7, 0.2); // value assigned at link time - -in Material { - smooth in vec4 Color1; // legal, input inside in block - smooth vec4 Color2; // legal, 'in' inherited from 'in Material' - vec2 TexCoordA; // legal, TexCoord is an input - uniform float Atten; // illegal, mismatched storage qualifier - -}; - -in Light { - vec4 LightPos; - vec3 LightColor; -}; -in ColoredTexture { - vec4 Color; - vec2 TexCoord; -} Materiala; // instance name -vec3 Color; // different Color than Material.Color - -in vec4 gl_FragCoord; // redeclaration that changes nothing is allowed - -// All the following are allowed redeclaration that change behavior -layout(origin_upper_left) in vec4 gl_FragCoord; -layout(pixel_center_integer) in vec4 gl_FragCoord; -layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; - -layout(early_fragment_tests) in; - -// compute shader: -layout (local_size_x = 32, local_size_y = 32) in; -layout (local_size_x = 8) in; - -layout(location = 3) out vec4 color; -layout(location = 3, index = 1) out vec4 factor; -layout(location = 2) out vec4 colors[3]; - -layout (depth_greater) out float gl_FragDepth; - -// redeclaration that changes nothing is allowed -out float gl_FragDepth; - -// assume it may be modified in any way -layout (depth_any) out float gl_FragDepth; - -// assume it may be modified such that its value will only increase -layout (depth_greater) out float gl_FragDepth; - -// assume it may be modified such that its value will only decrease -layout (depth_less) out float gl_FragDepth; - -// assume it will not be modified -layout (depth_unchanged) out float gl_FragDepth; - -in vec4 gl_Color; // predeclared by the fragment language -flat in vec4 gl_Color; // redeclared by user to be flat - - -float[5] foo(float[5]) -{ - return float[5](3.4, 4.2, 5.0, 5.2, 1.1); -} - -precision highp float; -precision highp int; -precision mediump int; -precision highp float; - -void main() -{ - { - float a[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1); - } - { - float a[5] = float[](3.4, 4.2, 5.0, 5.2, 1.1); // same thing - } - { - vec4 a[3][2]; // size-3 array of size-2 array of vec4 - vec4[2] a1[3]; // size-3 array of size-2 array of vec4 - vec4[3][2] a2; // size-3 array of size-2 array of vec4 - vec4 b[2] = vec4[2](vec4(0.0), vec4(0.1)); - vec4[3][2] a3 = vec4[3][2](b, b, b); // constructor - void foo(vec4[3][2]); // prototype with unnamed parameter - vec4 a4[3][2] = {vec4[2](vec4(0.0), vec4(1.0)), - vec4[2](vec4(0.0), vec4(1.0)), - vec4[2](vec4(0.0), vec4(1.0)) }; - } - { - float a[5]; - { - float b[] = a; // b is explicitly size 5 - } - { - float b[5] = a; // means the same thing - } - { - float b[] = float[](1,2,3,4,5); // also explicitly sizes to 5 - } - a.length(); // returns 5 - } - { - vec4 a[3][2]; - a.length(); // this is 3 - a[x].length(); // this is 2 - } - // for an array b containing a member array a: - b[++x].a.length(); // b is never dereferenced, but “++x” is evaluated - - // for an array s of a shader storage object containing a member array a: - s[x].a.length(); // s is dereferenced; x needs to be a valid index - // - //All of the following declarations result in a compile-time error. - //float a[2] = { 3.4, 4.2, 5.0 }; // illegal - //vec2 b = { 1.0, 2.0, 3.0 }; // illegal - //mat3x3 c = { vec3(0.0), vec3(1.0), vec3(2.0), vec3(3.0) }; // illegal - //mat2x2 d = { 1.0, 0.0, 0.0, 1.0 }; // illegal, can't flatten nesting - //struct { - // float a; - // int b; - //} e = { 1.2, 2, 3 }; // illegal - - struct { - float a; - int b; - } e = { 1.2, 2 }; // legal, all types match - - struct { - float a; - int b; - } e = { 1, 3 }; // legal, first initializer is converted - - //All of the following declarations result in a compile-time error. - //int a = true; // illegal - //vec4 b[2] = { vec4(0.0), 1.0 }; // illegal - //mat4x2 c = { vec3(0.0), vec3(1.0) }; // illegal - - //struct S1 { - // vec4 a; - // vec4 b; - //}; - - //struct { - // float s; - // float t; - //} d[] = { S1(vec4(0.0), vec4(1.1)) }; // illegal - - { - float a[] = float[](3.4, 4.2, 5.0, 5.2, 1.1); - float b[] = { 3.4, 4.2, 5.0, 5.2, 1.1 }; - float c[] = a; // c is explicitly size 5 - float d[5] = b; // means the same thing - } - { - const vec3 zAxis = vec3 (0.0, 0.0, 1.0); - const float ceiling = a + b; // a and b not necessarily constants - } - { - in vec4 position; - in vec3 normal; - in vec2 texCoord[4]; - } - { - lowp float color; - out mediump vec2 P; - lowp ivec2 foo(lowp mat3); - highp mat4 m; - } - -} +#version 430 + +#extension GL_3DL_array_objects : enable + +int a = 0xffffffff; // 32 bits, a gets the value -1 +int b = 0xffffffffU; // ERROR: can't convert uint to int +uint c = 0xffffffff; // 32 bits, c gets the value 0xFFFFFFFF +uint d = 0xffffffffU; // 32 bits, d gets the value 0xFFFFFFFF +int e = -1; // the literal is "1", then negation is performed, + // and the resulting non-literal 32-bit signed + // bit pattern of 0xFFFFFFFF is assigned, giving e + // the value of -1. +uint f = -1u; // the literal is "1u", then negation is performed, + // and the resulting non-literal 32-bit unsigned + // bit pattern of 0xFFFFFFFF is assigned, giving f + // the value of 0xFFFFFFFF. +int g = 3000000000; // a signed decimal literal taking 32 bits, + // setting the sign bit, g gets -1294967296 +int h = 0xA0000000; // okay, 32-bit signed hexadecimal +int i = 5000000000; // ERROR: needs more than 32 bits +int j = 0xFFFFFFFFF; // ERROR: needs more that 32 bits +int k = 0x80000000; // k gets -2147483648 == 0x80000000 +int l = 2147483648; // l gets -2147483648 (the literal set the sign bit) + +float fa, fb = 1.5; // single-precision floating-point +double fc, fd = 2.0LF; // double-precision floating-point + +vec2 texcoord1, texcoord2; +vec3 position; +vec4 myRGBA; +ivec2 textureLookup; +bvec3 less; + +mat2 mat2D; +mat3 optMatrix; +mat4 view, projection; +mat4x4 view; // an alternate way of declaring a mat4 +mat3x2 m; // a matrix with 3 columns and 2 rows +dmat4 highPrecisionMVP; +dmat2x4 dm; + +struct light { + float intensity; + vec3 position; +} lightVar; + +struct S { float f; }; + +struct T { + //S; // Error: anonymous structures disallowed + //struct { ... }; // Error: embedded structures disallowed + S s; // Okay: nested structures with name are allowed +}; + +float frequencies[3]; +uniform vec4 lightPosition[4]; +light lights[]; +const int numLights = 2; +light lights[numLights]; + +in vec3 normal; +centroid in vec2 TexCoord; +invariant centroid in vec4 Color; +noperspective in float temperature; +flat in vec3 myColor; +noperspective centroid in vec2 myTexCoord; + +uniform vec4 lightPosition; +uniform vec3 color = vec3(0.7, 0.7, 0.2); // value assigned at link time + +in Material { + smooth in vec4 Color1; // legal, input inside in block + smooth vec4 Color2; // legal, 'in' inherited from 'in Material' + vec2 TexCoordA; // legal, TexCoord is an input + uniform float Atten; // illegal, mismatched storage qualifier + +}; + +in Light { + vec4 LightPos; + vec3 LightColor; +}; +in ColoredTexture { + vec4 Color; + vec2 TexCoord; +} Materiala; // instance name +vec3 Color; // different Color than Material.Color + +in vec4 gl_FragCoord; // redeclaration that changes nothing is allowed + +// All the following are allowed redeclaration that change behavior +layout(origin_upper_left) in vec4 gl_FragCoord; +layout(pixel_center_integer) in vec4 gl_FragCoord; +layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; + +layout(early_fragment_tests) in; + +// compute shader: +layout (local_size_x = 32, local_size_y = 32) in; +layout (local_size_x = 8) in; + +layout(location = 3) out vec4 color; +layout(location = 3, index = 1) out vec4 factor; +layout(location = 2) out vec4 colors[3]; + +layout (depth_greater) out float gl_FragDepth; + +// redeclaration that changes nothing is allowed +out float gl_FragDepth; + +// assume it may be modified in any way +layout (depth_any) out float gl_FragDepth; + +// assume it may be modified such that its value will only increase +layout (depth_greater) out float gl_FragDepth; + +// assume it may be modified such that its value will only decrease +layout (depth_less) out float gl_FragDepth; + +// assume it will not be modified +layout (depth_unchanged) out float gl_FragDepth; + +in vec4 gl_Color; // predeclared by the fragment language +flat in vec4 gl_Color; // redeclared by user to be flat + + +float[5] foo(float[5]) +{ + return float[5](3.4, 4.2, 5.0, 5.2, 1.1); +} + +precision highp float; +precision highp int; +precision mediump int; +precision highp float; + +void main() +{ + { + float a[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1); + } + { + float a[5] = float[](3.4, 4.2, 5.0, 5.2, 1.1); // same thing + } + { + vec4 a[3][2]; // size-3 array of size-2 array of vec4 + vec4[2] a1[3]; // size-3 array of size-2 array of vec4 + vec4[3][2] a2; // size-3 array of size-2 array of vec4 + vec4 b[2] = vec4[2](vec4(0.0), vec4(0.1)); + vec4[3][2] a3 = vec4[3][2](b, b, b); // constructor + void foo(vec4[3][2]); // prototype with unnamed parameter + vec4 a4[3][2] = {vec4[2](vec4(0.0), vec4(1.0)), + vec4[2](vec4(0.0), vec4(1.0)), + vec4[2](vec4(0.0), vec4(1.0)) }; + } + { + float a[5]; + { + float b[] = a; // b is explicitly size 5 + } + { + float b[5] = a; // means the same thing + } + { + float b[] = float[](1,2,3,4,5); // also explicitly sizes to 5 + } + a.length(); // returns 5 + } + { + vec4 a[3][2]; + a.length(); // this is 3 + a[x].length(); // this is 2 + } + // for an array b containing a member array a: + b[++x].a.length(); // b is never dereferenced, but “++x” is evaluated + + // for an array s of a shader storage object containing a member array a: + s[x].a.length(); // s is dereferenced; x needs to be a valid index + // + //All of the following declarations result in a compile-time error. + //float a[2] = { 3.4, 4.2, 5.0 }; // illegal + //vec2 b = { 1.0, 2.0, 3.0 }; // illegal + //mat3x3 c = { vec3(0.0), vec3(1.0), vec3(2.0), vec3(3.0) }; // illegal + //mat2x2 d = { 1.0, 0.0, 0.0, 1.0 }; // illegal, can't flatten nesting + //struct { + // float a; + // int b; + //} e = { 1.2, 2, 3 }; // illegal + + struct { + float a; + int b; + } e = { 1.2, 2 }; // legal, all types match + + struct { + float a; + int b; + } e = { 1, 3 }; // legal, first initializer is converted + + //All of the following declarations result in a compile-time error. + //int a = true; // illegal + //vec4 b[2] = { vec4(0.0), 1.0 }; // illegal + //mat4x2 c = { vec3(0.0), vec3(1.0) }; // illegal + + //struct S1 { + // vec4 a; + // vec4 b; + //}; + + //struct { + // float s; + // float t; + //} d[] = { S1(vec4(0.0), vec4(1.1)) }; // illegal + + { + float a[] = float[](3.4, 4.2, 5.0, 5.2, 1.1); + float b[] = { 3.4, 4.2, 5.0, 5.2, 1.1 }; + float c[] = a; // c is explicitly size 5 + float d[5] = b; // means the same thing + } + { + const vec3 zAxis = vec3 (0.0, 0.0, 1.0); + const float ceiling = a + b; // a and b not necessarily constants + } + { + in vec4 position; + in vec3 normal; + in vec2 texCoord[4]; + } + { + lowp float color; + out mediump vec2 P; + lowp ivec2 foo(lowp mat3); + highp mat4 m; + } + +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/specExamples.vert vulkan-1.1.73+dfsg/external/glslang/Test/specExamples.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/specExamples.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/specExamples.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,196 +1,196 @@ -#version 430 - -#extension GL_3DL_array_objects : enable - -out Vertex { - vec4 Position; // API transform/feedback will use “Vertex.Position” - vec2 Texture; -} Coords; // shader will use “Coords.Position” - -out Vertex2 { - vec4 Color; // API will use “Color” -}; - -uniform Transform { // API uses “Transform[2]” to refer to instance 2 - mat4 ModelViewMatrix; - mat4 ModelViewProjectionMatrix; - vec4 a[]; // array will get implicitly sized - float Deformation; -} transforms[4]; - -layout(location = 3) in vec4 normal; -layout(location = 6) in vec4 colors[3]; -layout(location = 9) in mat4 transforms2[2]; - -layout(location = 3) struct S { - vec3 a1; - mat2 b; - vec4 c[2]; -} s; - -layout(triangles, invocations = 6) in; - -layout(lines) in; // legal for Color2, input size is 2, matching Color2 - -layout(triangle_strip, max_vertices = 60) out; // order does not matter -layout(max_vertices = 60) out; // redeclaration okay -layout(triangle_strip) out; // redeclaration okay -//layout(points) out; // error, contradicts triangle_strip -//layout(max_vertices = 30) out; // error, contradicts 60 - -layout(stream = 1) out; - -layout(stream=1) out; // default is now stream 1 -out vec4 var1; // var1 gets default stream (1) -layout(stream=2) out Block1 { // "Block1" belongs to stream 2 - layout(stream=2) vec4 var2; // redundant block member stream decl - layout(stream=3) vec2 var3; // ILLEGAL (must match block stream) - vec3 var4; // belongs to stream 2 -}; -layout(stream=0) out; // default is now stream 0 -out vec4 var5; // var5 gets default stream (0) -out Block2 { // "Block2" gets default stream (0) - vec4 var6; -}; -layout(stream=3) out vec4 var7; // var7 belongs to stream 3 - -layout(shared, column_major) uniform; -layout(shared, column_major) buffer; - -layout(row_major, column_major) - -layout(shared, row_major) uniform; // default is now shared and row_major - -layout(std140) uniform Transform2 { // layout of this block is std140 - mat4 M1; // row_major - layout(column_major) mat4 M2; // column major - mat3 N1; // row_major -}; - -layout(column_major) uniform T3 { // shared and column_major - mat4 M13; // column_major - layout(row_major) mat4 m14; // row major - mat3 N12; // column_major -}; - -// in one compilation unit... -layout(binding=3) uniform sampler2D s17; // s bound to unit 3 - -// in another compilation unit... -uniform sampler2D s17; // okay, s still bound at 3 - -// in another compilation unit... -//layout(binding=4) uniform sampler2D s; // ERROR: contradictory bindings - -layout (binding = 2, offset = 4) uniform atomic_uint a2; - -layout (binding = 2) uniform atomic_uint bar; - -layout (binding = 2, offset = 4) uniform atomic_uint; - -layout (binding = 2) uniform atomic_uint bar; // offset is 4 -layout (offset = 8) uniform atomic_uint bar23; // error, no default binding - -layout (binding=3, offset=4) uniform atomic_uint a2; // offset = 4 -layout (binding=2) uniform atomic_uint b2; // offset = 0 -layout (binding=3) uniform atomic_uint c2; // offset = 8 -layout (binding=2) uniform atomic_uint d2; // offset = 4 - -//layout (offset=4) // error, must include binding -//layout (binding=1, offset=0) a; // okay -//layout (binding=2, offset=0) b; // okay -//layout (binding=1, offset=0) c; // error, offsets must not be shared -// // between a and c -//layout (binding=1, offset=2) d; // error, overlaps offset 0 of a - -flat in vec4 gl_FrontColor; // input to geometry shader, no “gl_in[]” -flat out vec4 gl_FrontColor; // output from geometry shader - -invariant gl_Position; // make existing gl_Position be invariant - -out vec3 ColorInv; -invariant ColorIvn; // make existing Color be invariant - -invariant centroid out vec3 Color4; -precise out vec4 position; - -out vec3 Color5; -precise Color5; // make existing Color be precise -in vec4 a, b, c, d; -precise out vec4 v; - -coherent buffer Block { - readonly vec4 member1; - vec4 member2; -}; - -buffer Block2a { - coherent readonly vec4 member1A; - coherent vec4 member2A; -}; - -shared vec4 shv; - -vec4 funcA(restrict image2D a) { } - -vec4 funcB(image2D a) { } -layout(rgba32f) uniform image2D img1; -layout(rgba32f) coherent uniform image2D img2; - -float func(float e, float f, float g, float h) -{ - return (e*f) + (g*h); // no constraint on order or - // operator consistency -} - -float func2(float e, float f, float g, float h) -{ - precise float result = (e*f) + (g*h); // ensures same precision for - // the two multiplies - return result; -} - -float func3(float i, float j, precise out float k) -{ - k = i * i + j; // precise, due to declaration -} - -void main() -{ - vec3 r = vec3(a * b); // precise, used to compute v.xyz - vec3 s = vec3(c * d); // precise, used to compute v.xyz - v.xyz = r + s; // precise - v.w = (a.w * b.w) + (c.w * d.w); // precise - v.x = func(a.x, b.x, c.x, d.x); // values computed in func() - // are NOT precise - v.x = func2(a.x, b.x, c.x, d.x); // precise! - func3(a.x * b.x, c.x * d.x, v.x); // precise! - - funcA(img1); // OK, adding "restrict" is allowed - funcB(img2); // illegal, stripping "coherent" is not - - { - struct light { - float intensity; - vec3 position; - }; - - light lightVar = light(3.0, vec3(1.0, 2.0, 3.0)); - } - { - const float c[3] = float[3](5.0, 7.2, 1.1); - const float d[3] = float[](5.0, 7.2, 1.1); - - float g; - float a[5] = float[5](g, 1, g, 2.3, g); - float b[3]; - - b = float[3](g, g + 1.0, g + 2.0); - } - { - vec4 b[2] = { vec4(1.0), vec4(1.0) }; - vec4[3][2](b, b, b); // constructor - vec4[][2](b, b, b); // constructor, valid, size deduced - vec4[3][](b, b, b); // compile-time error, invalid type constructed - } -} +#version 430 + +#extension GL_3DL_array_objects : enable + +out Vertex { + vec4 Position; // API transform/feedback will use “Vertex.Position” + vec2 Texture; +} Coords; // shader will use “Coords.Position” + +out Vertex2 { + vec4 Color; // API will use “Color” +}; + +uniform Transform { // API uses “Transform[2]” to refer to instance 2 + mat4 ModelViewMatrix; + mat4 ModelViewProjectionMatrix; + vec4 a[]; // array will get implicitly sized + float Deformation; +} transforms[4]; + +layout(location = 3) in vec4 normal; +layout(location = 6) in vec4 colors[3]; +layout(location = 9) in mat4 transforms2[2]; + +layout(location = 3) struct S { + vec3 a1; + mat2 b; + vec4 c[2]; +} s; + +layout(triangles, invocations = 6) in; + +layout(lines) in; // legal for Color2, input size is 2, matching Color2 + +layout(triangle_strip, max_vertices = 60) out; // order does not matter +layout(max_vertices = 60) out; // redeclaration okay +layout(triangle_strip) out; // redeclaration okay +//layout(points) out; // error, contradicts triangle_strip +//layout(max_vertices = 30) out; // error, contradicts 60 + +layout(stream = 1) out; + +layout(stream=1) out; // default is now stream 1 +out vec4 var1; // var1 gets default stream (1) +layout(stream=2) out Block1 { // "Block1" belongs to stream 2 + layout(stream=2) vec4 var2; // redundant block member stream decl + layout(stream=3) vec2 var3; // ILLEGAL (must match block stream) + vec3 var4; // belongs to stream 2 +}; +layout(stream=0) out; // default is now stream 0 +out vec4 var5; // var5 gets default stream (0) +out Block2 { // "Block2" gets default stream (0) + vec4 var6; +}; +layout(stream=3) out vec4 var7; // var7 belongs to stream 3 + +layout(shared, column_major) uniform; +layout(shared, column_major) buffer; + +layout(row_major, column_major) + +layout(shared, row_major) uniform; // default is now shared and row_major + +layout(std140) uniform Transform2 { // layout of this block is std140 + mat4 M1; // row_major + layout(column_major) mat4 M2; // column major + mat3 N1; // row_major +}; + +layout(column_major) uniform T3 { // shared and column_major + mat4 M13; // column_major + layout(row_major) mat4 m14; // row major + mat3 N12; // column_major +}; + +// in one compilation unit... +layout(binding=3) uniform sampler2D s17; // s bound to unit 3 + +// in another compilation unit... +uniform sampler2D s17; // okay, s still bound at 3 + +// in another compilation unit... +//layout(binding=4) uniform sampler2D s; // ERROR: contradictory bindings + +layout (binding = 2, offset = 4) uniform atomic_uint a2; + +layout (binding = 2) uniform atomic_uint bar; + +layout (binding = 2, offset = 4) uniform atomic_uint; + +layout (binding = 2) uniform atomic_uint bar; // offset is 4 +layout (offset = 8) uniform atomic_uint bar23; // error, no default binding + +layout (binding=3, offset=4) uniform atomic_uint a2; // offset = 4 +layout (binding=2) uniform atomic_uint b2; // offset = 0 +layout (binding=3) uniform atomic_uint c2; // offset = 8 +layout (binding=2) uniform atomic_uint d2; // offset = 4 + +//layout (offset=4) // error, must include binding +//layout (binding=1, offset=0) a; // okay +//layout (binding=2, offset=0) b; // okay +//layout (binding=1, offset=0) c; // error, offsets must not be shared +// // between a and c +//layout (binding=1, offset=2) d; // error, overlaps offset 0 of a + +flat in vec4 gl_FrontColor; // input to geometry shader, no “gl_in[]” +flat out vec4 gl_FrontColor; // output from geometry shader + +invariant gl_Position; // make existing gl_Position be invariant + +out vec3 ColorInv; +invariant ColorIvn; // make existing Color be invariant + +invariant centroid out vec3 Color4; +precise out vec4 position; + +out vec3 Color5; +precise Color5; // make existing Color be precise +in vec4 a, b, c, d; +precise out vec4 v; + +coherent buffer Block { + readonly vec4 member1; + vec4 member2; +}; + +buffer Block2a { + coherent readonly vec4 member1A; + coherent vec4 member2A; +}; + +shared vec4 shv; + +vec4 funcA(restrict image2D a) { } + +vec4 funcB(image2D a) { } +layout(rgba32f) uniform image2D img1; +layout(rgba32f) coherent uniform image2D img2; + +float func(float e, float f, float g, float h) +{ + return (e*f) + (g*h); // no constraint on order or + // operator consistency +} + +float func2(float e, float f, float g, float h) +{ + precise float result = (e*f) + (g*h); // ensures same precision for + // the two multiplies + return result; +} + +float func3(float i, float j, precise out float k) +{ + k = i * i + j; // precise, due to declaration +} + +void main() +{ + vec3 r = vec3(a * b); // precise, used to compute v.xyz + vec3 s = vec3(c * d); // precise, used to compute v.xyz + v.xyz = r + s; // precise + v.w = (a.w * b.w) + (c.w * d.w); // precise + v.x = func(a.x, b.x, c.x, d.x); // values computed in func() + // are NOT precise + v.x = func2(a.x, b.x, c.x, d.x); // precise! + func3(a.x * b.x, c.x * d.x, v.x); // precise! + + funcA(img1); // OK, adding "restrict" is allowed + funcB(img2); // illegal, stripping "coherent" is not + + { + struct light { + float intensity; + vec3 position; + }; + + light lightVar = light(3.0, vec3(1.0, 2.0, 3.0)); + } + { + const float c[3] = float[3](5.0, 7.2, 1.1); + const float d[3] = float[](5.0, 7.2, 1.1); + + float g; + float a[5] = float[5](g, 1, g, 2.3, g); + float b[3]; + + b = float[3](g, g + 1.0, g + 2.0); + } + { + vec4 b[2] = { vec4(1.0), vec4(1.0) }; + vec4[3][2](b, b, b); // constructor + vec4[][2](b, b, b); // constructor, valid, size deduced + vec4[3][](b, b, b); // compile-time error, invalid type constructed + } +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.100ops.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.100ops.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.100ops.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.100ops.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,27 +1,27 @@ -#version 310 es - -lowp float foo(); - -in lowp float low, high; - -lowp float face1 = 11.0; - -out lowp vec4 Color; - -void main() -{ - int z = 3; - - if (2.0 * low + 1.0 < high) - ++z; - - Color = face1 * vec4(z) + foo(); -} - -lowp float face2 = -2.0; - -lowp float foo() -{ - // testing if face2 initializer insert logic is correct in main - return face2; -} +#version 310 es + +lowp float foo(); + +in lowp float low, high; + +lowp float face1 = 11.0; + +out lowp vec4 Color; + +void main() +{ + int z = 3; + + if (2.0 * low + 1.0 < high) + ++z; + + Color = face1 * vec4(z) + foo(); +} + +lowp float face2 = -2.0; + +lowp float foo() +{ + // testing if face2 initializer insert logic is correct in main + return face2; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.130.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.130.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.130.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.130.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,93 +1,93 @@ -#version 140 -#extension GL_ARB_texture_gather : enable - -vec3 a; -float b; - -in vec4 i; -out vec4 o; -out ivec3 io; -out uvec4 uo; - -flat in float fflat; -smooth in float fsmooth; -noperspective in float fnop; - -uniform samplerCube sampC; - -#extension GL_ARB_texture_rectangle : enable - -uniform sampler2D samp2D; -uniform sampler2DShadow samp2DS; -uniform sampler2DRect samp2DR; -uniform sampler2DArray samp2DA; - -void bar3() -{ - o += textureGatherOffset(samp2D, vec2(0.3), ivec2(1)); - o += textureGatherOffset(samp2DA, vec3(0.3), ivec2(1)); -} - -#extension GL_ARB_gpu_shader5 : enable - -void bar4() -{ - o += textureGatherOffset(samp2DR, vec2(0.3), ivec2(1)); - o += textureGatherOffset(samp2DS, vec2(0.3), 1.3, ivec2(1)); - o += textureGatherOffset(samp2D, vec2(0.3), ivec2(1), 2); -} - -#extension GL_ARB_texture_cube_map_array : enable - -uniform samplerCubeArray Sca; -uniform isamplerCubeArray Isca; -uniform usamplerCubeArray Usca; -uniform samplerCubeArrayShadow Scas; - -void bar5() -{ - io = textureSize(Sca, 3); - o += texture(Sca, i); - io += texture(Isca, i, 0.7).xyz; - uo = texture(Usca, i); - - o += textureLod(Sca, i, 1.7); - a = textureSize(Scas, 3); - float f = texture(Scas, i, i.y); - ivec4 c = textureGrad(Isca, i, vec3(0.1), vec3(0.2)); - o += vec4(a, f + c); -} - -#extension GL_ARB_shading_language_420pack : enable - -const int ai[3] = { 10, 23, 32 }; -uniform layout(binding=0) sampler2D bounds; - -void bar6() -{ - mat4x3 m43; - float a1 = m43[3].y; - //int a2 = m43.length(); // ERROR until shading_language_420pack is fully implemented - const float b = 2 * a1; - //a.x = gl_MinProgramTexelOffset + gl_MaxProgramTexelOffset; // ERROR until shading_language_420pack is fully implemented -} - - -#extension GL_ARB_texture_rectangle : enable -#extension GL_ARB_shader_texture_lod : require - -uniform sampler2D s2D; -uniform sampler2DRect s2DR; -uniform sampler2DRectShadow s2DRS; -uniform sampler1D s1D; -uniform sampler2DShadow s2DS; - -void main() -{ - o = textureGather(sampC, vec3(0.2)); - o.y = gl_ClipDistance[3]; - bar3(); - bar4(); - bar5(); - bar6(); +#version 140 +#extension GL_ARB_texture_gather : enable + +vec3 a; +float b; + +in vec4 i; +out vec4 o; +out ivec3 io; +out uvec4 uo; + +flat in float fflat; +smooth in float fsmooth; +noperspective in float fnop; + +uniform samplerCube sampC; + +#extension GL_ARB_texture_rectangle : enable + +uniform sampler2D samp2D; +uniform sampler2DShadow samp2DS; +uniform sampler2DRect samp2DR; +uniform sampler2DArray samp2DA; + +void bar3() +{ + o += textureGatherOffset(samp2D, vec2(0.3), ivec2(1)); + o += textureGatherOffset(samp2DA, vec3(0.3), ivec2(1)); +} + +#extension GL_ARB_gpu_shader5 : enable + +void bar4() +{ + o += textureGatherOffset(samp2DR, vec2(0.3), ivec2(1)); + o += textureGatherOffset(samp2DS, vec2(0.3), 1.3, ivec2(1)); + o += textureGatherOffset(samp2D, vec2(0.3), ivec2(1), 2); +} + +#extension GL_ARB_texture_cube_map_array : enable + +uniform samplerCubeArray Sca; +uniform isamplerCubeArray Isca; +uniform usamplerCubeArray Usca; +uniform samplerCubeArrayShadow Scas; + +void bar5() +{ + io = textureSize(Sca, 3); + o += texture(Sca, i); + io += texture(Isca, i, 0.7).xyz; + uo = texture(Usca, i); + + o += textureLod(Sca, i, 1.7); + a = textureSize(Scas, 3); + float f = texture(Scas, i, i.y); + ivec4 c = textureGrad(Isca, i, vec3(0.1), vec3(0.2)); + o += vec4(a, f + c); +} + +#extension GL_ARB_shading_language_420pack : enable + +const int ai[3] = { 10, 23, 32 }; +uniform layout(binding=0) sampler2D bounds; + +void bar6() +{ + mat4x3 m43; + float a1 = m43[3].y; + //int a2 = m43.length(); // ERROR until shading_language_420pack is fully implemented + const float b = 2 * a1; + //a.x = gl_MinProgramTexelOffset + gl_MaxProgramTexelOffset; // ERROR until shading_language_420pack is fully implemented +} + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_shader_texture_lod : require + +uniform sampler2D s2D; +uniform sampler2DRect s2DR; +uniform sampler2DRectShadow s2DRS; +uniform sampler1D s1D; +uniform sampler2DShadow s2DS; + +void main() +{ + o = textureGather(sampC, vec3(0.2)); + o.y = gl_ClipDistance[3]; + bar3(); + bar4(); + bar5(); + bar6(); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.140.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.140.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.140.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.140.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,46 +1,46 @@ -#version 140 - -in vec4 k; -out vec4 o; - -in float gl_ClipDistance[5]; - -layout(row_major) uniform; - -uniform sampler2D samp2Da[3]; - -layout(std140) uniform bn { - layout(row_major) mat4 matra[4]; - layout(column_major) mat4 matca[4]; - layout(row_major) mat4 matr; - layout(column_major) mat4 matc; - layout(align=512, offset=1024) mat4 matrdef; -}; - -uniform sampler2DRect sampR; -uniform isamplerBuffer sampB; - -float foo(); - -void main() -{ - o.y = gl_ClipDistance[2]; - o.z = gl_ClipDistance[int(k)]; - o.w = float(textureSize(sampR) + textureSize(sampB)) / 100.0; - o.z = foo(); -} - -// Test extra-function initializers - -float i1 = gl_FrontFacing ? -2.0 : 2.0; -float i2 = 102; - -float foo() -{ - return i1 + i2; -} - -// test arrayed block -layout(std140) uniform bi { - vec3 v[2]; -} bname[4]; +#version 140 + +in vec4 k; +out vec4 o; + +in float gl_ClipDistance[5]; + +layout(row_major) uniform; + +uniform sampler2D samp2Da[3]; + +layout(std140) uniform bn { + layout(row_major) mat4 matra[4]; + layout(column_major) mat4 matca[4]; + layout(row_major) mat4 matr; + layout(column_major) mat4 matc; + layout(align=512, offset=1024) mat4 matrdef; +}; + +uniform sampler2DRect sampR; +uniform isamplerBuffer sampB; + +float foo(); + +void main() +{ + o.y = gl_ClipDistance[2]; + o.z = gl_ClipDistance[int(k)]; + o.w = float(textureSize(sampR) + textureSize(sampB)) / 100.0; + o.z = foo(); +} + +// Test extra-function initializers + +float i1 = gl_FrontFacing ? -2.0 : 2.0; +float i2 = 102; + +float foo() +{ + return i1 + i2; +} + +// test arrayed block +layout(std140) uniform bi { + vec3 v[2]; +} bname[4]; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.150.geom vulkan-1.1.73+dfsg/external/glslang/Test/spv.150.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.150.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.150.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,39 +1,39 @@ -#version 150 core - -layout(triangles_adjacency) in; -layout(max_vertices = 30) out; -layout(stream = 3, triangle_strip) out; - -in fromVertex { - in vec3 color; -} fromV[]; - -out toFragment { - out vec3 color; -} toF; - -out fromVertex { - vec3 color; -}; - -void main() -{ - color = fromV[0].color; - //?? gl_ClipDistance[3] = gl_in[1].gl_ClipDistance[2]; - gl_Position = gl_in[0].gl_Position; - gl_PointSize = gl_in[3].gl_PointSize; - gl_PrimitiveID = gl_PrimitiveIDIn; - gl_Layer = 2; - - EmitVertex(); - - color = 2 * fromV[0].color; - gl_Position = 2.0 * gl_in[0].gl_Position; - gl_PointSize = 2.0 * gl_in[3].gl_PointSize; - gl_PrimitiveID = gl_PrimitiveIDIn + 1; - gl_Layer = 3; - - EmitVertex(); - - EndPrimitive(); -} +#version 150 core + +layout(triangles_adjacency) in; +layout(max_vertices = 30) out; +layout(stream = 3, triangle_strip) out; + +in fromVertex { + in vec3 color; +} fromV[]; + +out toFragment { + out vec3 color; +} toF; + +out fromVertex { + vec3 color; +}; + +void main() +{ + color = fromV[0].color; + //?? gl_ClipDistance[3] = gl_in[1].gl_ClipDistance[2]; + gl_Position = gl_in[0].gl_Position; + gl_PointSize = gl_in[3].gl_PointSize; + gl_PrimitiveID = gl_PrimitiveIDIn; + gl_Layer = 2; + + EmitVertex(); + + color = 2 * fromV[0].color; + gl_Position = 2.0 * gl_in[0].gl_Position; + gl_PointSize = 2.0 * gl_in[3].gl_PointSize; + gl_PrimitiveID = gl_PrimitiveIDIn + 1; + gl_Layer = 3; + + EmitVertex(); + + EndPrimitive(); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.150.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.150.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.150.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.150.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,38 +1,38 @@ -#version 150 core - -in vec4 iv4; - -in float ps; -in int ui; -uniform sampler2D s2D; - -invariant gl_Position; - -struct s1 { - int a; - int a2; - vec4 b[3]; -}; - -struct s2 { - int c; - s1 d[4]; -}; - -out s2 s2out; - -void main() -{ - gl_Position = iv4; - gl_PointSize = ps; - gl_ClipDistance[2] = iv4.x; - int i; - s2out.d[i].b[2].w = ps; - - // test non-implicit lod - texture(s2D, vec2(0.5)); - textureProj(s2D, vec3(0.5)); - textureLod(s2D, vec2(0.5), 3.2); -} - -out float gl_ClipDistance[4]; +#version 150 core + +in vec4 iv4; + +in float ps; +in int ui; +uniform sampler2D s2D; + +invariant gl_Position; + +struct s1 { + int a; + int a2; + vec4 b[3]; +}; + +struct s2 { + int c; + s1 d[4]; +}; + +out s2 s2out; + +void main() +{ + gl_Position = iv4; + gl_PointSize = ps; + gl_ClipDistance[2] = iv4.x; + int i; + s2out.d[i].b[2].w = ps; + + // test non-implicit lod + texture(s2D, vec2(0.5)); + textureProj(s2D, vec3(0.5)); + textureLod(s2D, vec2(0.5), 3.2); +} + +out float gl_ClipDistance[4]; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.300BuiltIns.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.300BuiltIns.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.300BuiltIns.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.300BuiltIns.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,14 +1,14 @@ -#version 310 es - -in mediump float ps; - -invariant gl_Position; - -void main() -{ - gl_Position = vec4(ps); - gl_Position *= float(4 - gl_VertexIndex); - - gl_PointSize = ps; - gl_PointSize *= float(5 - gl_InstanceIndex); -} +#version 310 es + +in mediump float ps; + +invariant gl_Position; + +void main() +{ + gl_Position = vec4(ps); + gl_Position *= float(4 - gl_VertexIndex); + + gl_PointSize = ps; + gl_PointSize *= float(5 - gl_InstanceIndex); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.300layout.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.300layout.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.300layout.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.300layout.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,22 +1,22 @@ -#version 310 es - -precision mediump float; - -in vec4 pos; -in vec3 color; - -layout(location = 7) out vec3 c; -layout(LocatioN = 3) out vec4 p[2]; - -struct S { - vec3 c; - float f; -}; - -in S s; - -void main() -{ - c = color + s.c; - p[1] = pos * s.f; -} +#version 310 es + +precision mediump float; + +in vec4 pos; +in vec3 color; + +layout(location = 7) out vec3 c; +layout(LocatioN = 3) out vec4 p[2]; + +struct S { + vec3 c; + float f; +}; + +in S s; + +void main() +{ + c = color + s.c; + p[1] = pos * s.f; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.300layoutp.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.300layoutp.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.300layoutp.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.300layoutp.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,49 +1,49 @@ -#version 310 es - -layout(location = 7) in vec3 c; -layout(LocatioN = 3) in vec4 p; -layout(location = 9) in ivec2 aiv2; -out vec4 pos; -out vec3 color; -flat out int iout; - -layout(row_major) uniform; // default is now row_major - -layout(std140) uniform Transform { // layout of this block is std140 - mat4 M1; // row_major - layout(column_major) mat4 M2; // column major - mat3 N1; // row_major - int iuin; -} tblock; - -uniform T2 { // layout of this block is shared - bool b; - mat4 t2m; -}; - -layout(column_major) uniform T3 { // shared and column_major - mat4 M3; // column_major - layout(row_major) mat4 M4; // row major - mat2x3 N2; // column_major - uvec3 uv3a[4]; -}; - -uint uiuin; - -struct S { - vec3 c; - float f; -}; - -out S s; - -void main() -{ - pos = p * (tblock.M1 * tblock.M2 * M4 * M3 * t2m); - color = c * tblock.N1; - iout = tblock.iuin + int(uiuin) + aiv2.y; - s.c = c; - s.f = p.x; - if (N2[1] != vec3(1.0) || uv3a[2] != uvec3(5)) - ++s.c; -} +#version 310 es + +layout(location = 7) in vec3 c; +layout(LocatioN = 3) in vec4 p; +layout(location = 9) in ivec2 aiv2; +out vec4 pos; +out vec3 color; +flat out int iout; + +layout(row_major) uniform; // default is now row_major + +layout(std140) uniform Transform { // layout of this block is std140 + mat4 M1; // row_major + layout(column_major) mat4 M2; // column major + mat3 N1; // row_major + int iuin; +} tblock; + +uniform T2 { // layout of this block is shared + bool b; + mat4 t2m; +}; + +layout(column_major) uniform T3 { // shared and column_major + mat4 M3; // column_major + layout(row_major) mat4 M4; // row major + mat2x3 N2; // column_major + uvec3 uv3a[4]; +}; + +uint uiuin; + +struct S { + vec3 c; + float f; +}; + +out S s; + +void main() +{ + pos = p * (tblock.M1 * tblock.M2 * M4 * M3 * t2m); + color = c * tblock.N1; + iout = tblock.iuin + int(uiuin) + aiv2.y; + s.c = c; + s.f = p.x; + if (N2[1] != vec3(1.0) || uv3a[2] != uvec3(5)) + ++s.c; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.300layout.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.300layout.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.300layout.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.300layout.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,49 +1,49 @@ -#version 310 es - -layout(location = 7) in vec3 c; -layout(LocatioN = 3) in vec4 p; -layout(location = 9) in ivec2 aiv2; -out vec4 pos; -out vec3 color; -flat out int iout; - -layout(row_major) uniform; // default is now row_major - -layout(std140) uniform Transform { // layout of this block is std140 - mat4 M1; // row_major - layout(column_major) mat4 M2; // column major - mat3 N1; // row_major - int iuin; -} tblock; - -uniform T2 { // layout of this block is shared - bool b; - mat4 t2m; -}; - -layout(column_major) uniform T3 { // shared and column_major - mat4 M3; // column_major - layout(row_major) mat4 M4; // row major - mat2x3 N2; // column_major - layout(align=16, offset=2048) uvec3 uv3a[4]; -}; - -in uint uiuin; - -struct S { - vec3 c; - float f; -}; - -out S s; - -void main() -{ - pos = p * (tblock.M1 + tblock.M2 + M4 + M3 + t2m); - color = c * tblock.N1; - iout = tblock.iuin + int(uiuin) + aiv2.y; - s.c = c; - s.f = p.x; - if (N2[1] != vec3(1.0) || uv3a[2] != uvec3(5)) - ++s.c; -} +#version 310 es + +layout(location = 7) in vec3 c; +layout(LocatioN = 3) in vec4 p; +layout(location = 9) in ivec2 aiv2; +out vec4 pos; +out vec3 color; +flat out int iout; + +layout(row_major) uniform; // default is now row_major + +layout(std140) uniform Transform { // layout of this block is std140 + mat4 M1; // row_major + layout(column_major) mat4 M2; // column major + mat3 N1; // row_major + int iuin; +} tblock; + +uniform T2 { // layout of this block is shared + bool b; + mat4 t2m; +}; + +layout(column_major) uniform T3 { // shared and column_major + mat4 M3; // column_major + layout(row_major) mat4 M4; // row major + mat2x3 N2; // column_major + layout(align=16, offset=2048) uvec3 uv3a[4]; +}; + +in uint uiuin; + +struct S { + vec3 c; + float f; +}; + +out S s; + +void main() +{ + pos = p * (tblock.M1 + tblock.M2 + M4 + M3 + t2m); + color = c * tblock.N1; + iout = tblock.iuin + int(uiuin) + aiv2.y; + s.c = c; + s.f = p.x; + if (N2[1] != vec3(1.0) || uv3a[2] != uvec3(5)) + ++s.c; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.310.bitcast.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.310.bitcast.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.310.bitcast.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.310.bitcast.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,41 +1,41 @@ -#version 310 es - -flat in mediump int i1; -flat in lowp ivec2 i2; -flat in mediump ivec3 i3; -flat in highp ivec4 i4; - -flat in mediump uint u1; -flat in lowp uvec2 u2; -flat in mediump uvec3 u3; -flat in highp uvec4 u4; - -mediump in float f1; -lowp in vec2 f2; -mediump in vec3 f3; -highp in vec4 f4; - -void main() -{ - highp ivec4 idata = ivec4(0); - idata.x += floatBitsToInt(f1); - idata.xy += floatBitsToInt(f2); - idata.xyz += floatBitsToInt(f3); - idata += floatBitsToInt(f4); - - highp uvec4 udata = uvec4(0); - udata.x += floatBitsToUint(f1); - udata.xy += floatBitsToUint(f2); - udata.xyz += floatBitsToUint(f3); - udata += floatBitsToUint(f4); - - highp vec4 fdata = vec4(0.0); - fdata.x += intBitsToFloat(i1); - fdata.xy += intBitsToFloat(i2); - fdata.xyz += intBitsToFloat(i3); - fdata += intBitsToFloat(i4); - fdata.x += uintBitsToFloat(u1); - fdata.xy += uintBitsToFloat(u2); - fdata.xyz += uintBitsToFloat(u3); - fdata += uintBitsToFloat(u4); +#version 310 es + +flat in mediump int i1; +flat in lowp ivec2 i2; +flat in mediump ivec3 i3; +flat in highp ivec4 i4; + +flat in mediump uint u1; +flat in lowp uvec2 u2; +flat in mediump uvec3 u3; +flat in highp uvec4 u4; + +mediump in float f1; +lowp in vec2 f2; +mediump in vec3 f3; +highp in vec4 f4; + +void main() +{ + highp ivec4 idata = ivec4(0); + idata.x += floatBitsToInt(f1); + idata.xy += floatBitsToInt(f2); + idata.xyz += floatBitsToInt(f3); + idata += floatBitsToInt(f4); + + highp uvec4 udata = uvec4(0); + udata.x += floatBitsToUint(f1); + udata.xy += floatBitsToUint(f2); + udata.xyz += floatBitsToUint(f3); + udata += floatBitsToUint(f4); + + highp vec4 fdata = vec4(0.0); + fdata.x += intBitsToFloat(i1); + fdata.xy += intBitsToFloat(i2); + fdata.xyz += intBitsToFloat(i3); + fdata += intBitsToFloat(i4); + fdata.x += uintBitsToFloat(u1); + fdata.xy += uintBitsToFloat(u2); + fdata.xyz += uintBitsToFloat(u3); + fdata += uintBitsToFloat(u4); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.330.geom vulkan-1.1.73+dfsg/external/glslang/Test/spv.330.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.330.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.330.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,26 +1,26 @@ -#version 330 core -#extension GL_ARB_separate_shader_objects : enable - -in gl_PerVertex -{ - float gl_ClipDistance[1]; - vec4 gl_Position; -} gl_in[]; - -out gl_PerVertex -{ - vec4 gl_Position; - float gl_ClipDistance[1]; -}; - -layout( triangles ) in; -layout( triangle_strip, max_vertices = 3 ) out; - -void main() -{ - vec4 v; - gl_Position = gl_in[1].gl_Position; - gl_ClipDistance[0] = gl_in[1].gl_ClipDistance[0]; - EmitVertex(); - EndPrimitive(); -} +#version 330 core +#extension GL_ARB_separate_shader_objects : enable + +in gl_PerVertex +{ + float gl_ClipDistance[1]; + vec4 gl_Position; +} gl_in[]; + +out gl_PerVertex +{ + vec4 gl_Position; + float gl_ClipDistance[1]; +}; + +layout( triangles ) in; +layout( triangle_strip, max_vertices = 3 ) out; + +void main() +{ + vec4 v; + gl_Position = gl_in[1].gl_Position; + gl_ClipDistance[0] = gl_in[1].gl_ClipDistance[0]; + EmitVertex(); + EndPrimitive(); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.400.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.400.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.400.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.400.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,265 +1,265 @@ -#version 400 core - -in vec2 c2D; -flat in int i; -flat in uint u; -out uint uo; -out vec4 outp; -out ivec4 ioutp; -out uvec4 uoutp; -uniform sampler2D arrayedSampler[5]; -uniform usampler2DRect samp2dr; -uniform isampler2DArray isamp2DA; -uniform sampler2DRectShadow u2drs; - -#extension GL_ARB_separate_shader_objects : enable - -layout(location = 6) in vec4 vl2; - -void foo23() -{ - const ivec2[3] offsets = ivec2[3](ivec2(1,2), ivec2(3,4), ivec2(15,16)); - - outp.x += textureProjGradOffset(u2drs, outp, vec2(0.0), vec2(0.0), offsets[1]); -} - -void doubles() -{ - double doublev; - dvec2 dvec2v; - dvec3 dvec3v; - dvec4 dvec4v; - - bool boolv; - bvec2 bvec2v; - bvec3 bvec3v; - bvec4 bvec4v; - - doublev = sqrt(2.9); - dvec2v = sqrt(dvec2(2.7)); - dvec3v = sqrt(dvec3(2.0)); - dvec4v = sqrt(dvec4(doublev)); - - doublev += inversesqrt(doublev); - dvec2v += inversesqrt(dvec2v); - dvec3v += inversesqrt(dvec3v); - dvec4v += inversesqrt(dvec4v); - - doublev += abs(doublev); - dvec2v += abs(dvec2v); - dvec3v += abs(dvec3v); - dvec4v += abs(dvec4v); - - doublev += sign(doublev); - dvec2v += sign(dvec2v); - dvec3v += sign(dvec3v); - dvec4v += sign(dvec4v); - - doublev += floor(doublev); - dvec2v += floor(dvec2v); - dvec3v += floor(dvec3v); - dvec4v += floor(dvec4v); - - doublev += trunc(doublev); - dvec2v += trunc(dvec2v); - dvec3v += trunc(dvec3v); - dvec4v += trunc(dvec4v); - - doublev += round(doublev); - dvec2v += round(dvec2v); - dvec3v += round(dvec3v); - dvec4v += round(dvec4v); - - doublev += roundEven(doublev); - dvec2v += roundEven(dvec2v); - dvec3v += roundEven(dvec3v); - dvec4v += roundEven(dvec4v); - - doublev += ceil(doublev); - dvec2v += ceil(dvec2v); - dvec3v += ceil(dvec3v); - dvec4v += ceil(dvec4v); - - doublev += fract(doublev); - dvec2v += fract(dvec2v); - dvec3v += fract(dvec3v); - dvec4v += fract(dvec4v); - - doublev += mod(doublev, doublev); - dvec2v += mod(dvec2v, doublev); - dvec3v += mod(dvec3v, doublev); - dvec4v += mod(dvec4v, doublev); - dvec2v += mod(dvec2v, dvec2v); - dvec3v += mod(dvec3v, dvec3v); - dvec4v += mod(dvec4v, dvec4v); - - doublev += modf(doublev, doublev); - dvec2v += modf(dvec2v, dvec2v); - dvec3v += modf(dvec3v, dvec3v); - dvec4v += modf(dvec4v, dvec4v); - - doublev += min(doublev, doublev); - dvec2v += min(dvec2v, doublev); - dvec3v += min(dvec3v, doublev); - dvec4v += min(dvec4v, doublev); - dvec2v += min(dvec2v, dvec2v); - dvec3v += min(dvec3v, dvec3v); - dvec4v += min(dvec4v, dvec4v); - - doublev += max(doublev, doublev); - dvec2v += max(dvec2v, doublev); - dvec3v += max(dvec3v, doublev); - dvec4v += max(dvec4v, doublev); - dvec2v += max(dvec2v, dvec2v); - dvec3v += max(dvec3v, dvec3v); - dvec4v += max(dvec4v, dvec4v); - - doublev += clamp(doublev, doublev, doublev); - dvec2v += clamp(dvec2v, doublev, doublev); - dvec3v += clamp(dvec3v, doublev, doublev); - dvec4v += clamp(dvec4v, doublev, doublev); - dvec2v += clamp(dvec2v, dvec2v, dvec2v); - dvec3v += clamp(dvec3v, dvec3v, dvec3v); - dvec4v += clamp(dvec4v, dvec4v, dvec4v); - - doublev += mix(doublev, doublev, doublev); - dvec2v += mix(dvec2v, dvec2v, doublev); - dvec3v += mix(dvec3v, dvec3v, doublev); - dvec4v += mix(dvec4v, dvec4v, doublev); - dvec2v += mix(dvec2v, dvec2v, dvec2v); - dvec3v += mix(dvec3v, dvec3v, dvec3v); - dvec4v += mix(dvec4v, dvec4v, dvec4v); - doublev += mix(doublev, doublev, boolv); - dvec2v += mix(dvec2v, dvec2v, bvec2v); - dvec3v += mix(dvec3v, dvec3v, bvec3v); - dvec4v += mix(dvec4v, dvec4v, bvec4v); - - doublev += step(doublev, doublev); - dvec2v += step(dvec2v, dvec2v); - dvec3v += step(dvec3v, dvec3v); - dvec4v += step(dvec4v, dvec4v); - dvec2v += step(doublev, dvec2v); - dvec3v += step(doublev, dvec3v); - dvec4v += step(doublev, dvec4v); - - doublev += smoothstep(doublev, doublev, doublev); - dvec2v += smoothstep(dvec2v, dvec2v, dvec2v); - dvec3v += smoothstep(dvec3v, dvec3v, dvec3v); - dvec4v += smoothstep(dvec4v, dvec4v, dvec4v); - dvec2v += smoothstep(doublev, doublev, dvec2v); - dvec3v += smoothstep(doublev, doublev, dvec3v); - dvec4v += smoothstep(doublev, doublev, dvec4v); - - boolv = isnan(doublev); - bvec2v = isnan(dvec2v); - bvec3v = isnan(dvec3v); - bvec4v = isnan(dvec4v); - - boolv = boolv ? isinf(doublev) : false; - bvec2v = boolv ? isinf(dvec2v) : bvec2(false); - bvec3v = boolv ? isinf(dvec3v) : bvec3(false); - bvec4v = boolv ? isinf(dvec4v) : bvec4(false); - - doublev += length(doublev); - doublev += length(dvec2v); - doublev += length(dvec3v); - doublev += length(dvec4v); - - doublev += distance(doublev, doublev); - doublev += distance(dvec2v, dvec2v); - doublev += distance(dvec3v, dvec3v); - doublev += distance(dvec4v, dvec4v); - - doublev += dot(doublev, doublev); - doublev += dot(dvec2v, dvec2v); - doublev += dot(dvec3v, dvec3v); - doublev += dot(dvec4v, dvec4v); - - dvec3v += cross(dvec3v, dvec3v); - - doublev += normalize(doublev); - dvec2v += normalize(dvec2v); - dvec3v += normalize(dvec3v); - dvec4v += normalize(dvec4v); - - doublev += faceforward(doublev, doublev, doublev); - dvec2v += faceforward(dvec2v, dvec2v, dvec2v); - dvec3v += faceforward(dvec3v, dvec3v, dvec3v); - dvec4v += faceforward(dvec4v, dvec4v, dvec4v); - - doublev += reflect(doublev, doublev); - dvec2v += reflect(dvec2v, dvec2v); - dvec3v += reflect(dvec3v, dvec3v); - dvec4v += reflect(dvec4v, dvec4v); - - doublev += refract(doublev, doublev, doublev); - dvec2v += refract(dvec2v, dvec2v, doublev); - dvec3v += refract(dvec3v, dvec3v, doublev); - dvec4v += refract(dvec4v, dvec4v, doublev); - - dmat2 dmat2v = outerProduct(dvec2v, dvec2v); - dmat3 dmat3v = outerProduct(dvec3v, dvec3v); - dmat4 dmat4v = outerProduct(dvec4v, dvec4v); - dmat2x3 dmat2x3v = outerProduct(dvec3v, dvec2v); - dmat3x2 dmat3x2v = outerProduct(dvec2v, dvec3v); - dmat2x4 dmat2x4v = outerProduct(dvec4v, dvec2v); - dmat4x2 dmat4x2v = outerProduct(dvec2v, dvec4v); - dmat3x4 dmat3x4v = outerProduct(dvec4v, dvec3v); - dmat4x3 dmat4x3v = outerProduct(dvec3v, dvec4v); - +#version 400 core + +in vec2 c2D; +flat in int i; +flat in uint u; +out uint uo; +out vec4 outp; +out ivec4 ioutp; +out uvec4 uoutp; +uniform sampler2D arrayedSampler[5]; +uniform usampler2DRect samp2dr; +uniform isampler2DArray isamp2DA; +uniform sampler2DRectShadow u2drs; + +#extension GL_ARB_separate_shader_objects : enable + +layout(location = 6) in vec4 vl2; + +void foo23() +{ + const ivec2[3] offsets = ivec2[3](ivec2(1,2), ivec2(3,4), ivec2(15,16)); + + outp.x += textureProjGradOffset(u2drs, outp, vec2(0.0), vec2(0.0), offsets[1]); +} + +void doubles() +{ + double doublev; + dvec2 dvec2v; + dvec3 dvec3v; + dvec4 dvec4v; + + bool boolv; + bvec2 bvec2v; + bvec3 bvec3v; + bvec4 bvec4v; + + doublev = sqrt(2.9); + dvec2v = sqrt(dvec2(2.7)); + dvec3v = sqrt(dvec3(2.0)); + dvec4v = sqrt(dvec4(doublev)); + + doublev += inversesqrt(doublev); + dvec2v += inversesqrt(dvec2v); + dvec3v += inversesqrt(dvec3v); + dvec4v += inversesqrt(dvec4v); + + doublev += abs(doublev); + dvec2v += abs(dvec2v); + dvec3v += abs(dvec3v); + dvec4v += abs(dvec4v); + + doublev += sign(doublev); + dvec2v += sign(dvec2v); + dvec3v += sign(dvec3v); + dvec4v += sign(dvec4v); + + doublev += floor(doublev); + dvec2v += floor(dvec2v); + dvec3v += floor(dvec3v); + dvec4v += floor(dvec4v); + + doublev += trunc(doublev); + dvec2v += trunc(dvec2v); + dvec3v += trunc(dvec3v); + dvec4v += trunc(dvec4v); + + doublev += round(doublev); + dvec2v += round(dvec2v); + dvec3v += round(dvec3v); + dvec4v += round(dvec4v); + + doublev += roundEven(doublev); + dvec2v += roundEven(dvec2v); + dvec3v += roundEven(dvec3v); + dvec4v += roundEven(dvec4v); + + doublev += ceil(doublev); + dvec2v += ceil(dvec2v); + dvec3v += ceil(dvec3v); + dvec4v += ceil(dvec4v); + + doublev += fract(doublev); + dvec2v += fract(dvec2v); + dvec3v += fract(dvec3v); + dvec4v += fract(dvec4v); + + doublev += mod(doublev, doublev); + dvec2v += mod(dvec2v, doublev); + dvec3v += mod(dvec3v, doublev); + dvec4v += mod(dvec4v, doublev); + dvec2v += mod(dvec2v, dvec2v); + dvec3v += mod(dvec3v, dvec3v); + dvec4v += mod(dvec4v, dvec4v); + + doublev += modf(doublev, doublev); + dvec2v += modf(dvec2v, dvec2v); + dvec3v += modf(dvec3v, dvec3v); + dvec4v += modf(dvec4v, dvec4v); + + doublev += min(doublev, doublev); + dvec2v += min(dvec2v, doublev); + dvec3v += min(dvec3v, doublev); + dvec4v += min(dvec4v, doublev); + dvec2v += min(dvec2v, dvec2v); + dvec3v += min(dvec3v, dvec3v); + dvec4v += min(dvec4v, dvec4v); + + doublev += max(doublev, doublev); + dvec2v += max(dvec2v, doublev); + dvec3v += max(dvec3v, doublev); + dvec4v += max(dvec4v, doublev); + dvec2v += max(dvec2v, dvec2v); + dvec3v += max(dvec3v, dvec3v); + dvec4v += max(dvec4v, dvec4v); + + doublev += clamp(doublev, doublev, doublev); + dvec2v += clamp(dvec2v, doublev, doublev); + dvec3v += clamp(dvec3v, doublev, doublev); + dvec4v += clamp(dvec4v, doublev, doublev); + dvec2v += clamp(dvec2v, dvec2v, dvec2v); + dvec3v += clamp(dvec3v, dvec3v, dvec3v); + dvec4v += clamp(dvec4v, dvec4v, dvec4v); + + doublev += mix(doublev, doublev, doublev); + dvec2v += mix(dvec2v, dvec2v, doublev); + dvec3v += mix(dvec3v, dvec3v, doublev); + dvec4v += mix(dvec4v, dvec4v, doublev); + dvec2v += mix(dvec2v, dvec2v, dvec2v); + dvec3v += mix(dvec3v, dvec3v, dvec3v); + dvec4v += mix(dvec4v, dvec4v, dvec4v); + doublev += mix(doublev, doublev, boolv); + dvec2v += mix(dvec2v, dvec2v, bvec2v); + dvec3v += mix(dvec3v, dvec3v, bvec3v); + dvec4v += mix(dvec4v, dvec4v, bvec4v); + + doublev += step(doublev, doublev); + dvec2v += step(dvec2v, dvec2v); + dvec3v += step(dvec3v, dvec3v); + dvec4v += step(dvec4v, dvec4v); + dvec2v += step(doublev, dvec2v); + dvec3v += step(doublev, dvec3v); + dvec4v += step(doublev, dvec4v); + + doublev += smoothstep(doublev, doublev, doublev); + dvec2v += smoothstep(dvec2v, dvec2v, dvec2v); + dvec3v += smoothstep(dvec3v, dvec3v, dvec3v); + dvec4v += smoothstep(dvec4v, dvec4v, dvec4v); + dvec2v += smoothstep(doublev, doublev, dvec2v); + dvec3v += smoothstep(doublev, doublev, dvec3v); + dvec4v += smoothstep(doublev, doublev, dvec4v); + + boolv = isnan(doublev); + bvec2v = isnan(dvec2v); + bvec3v = isnan(dvec3v); + bvec4v = isnan(dvec4v); + + boolv = boolv ? isinf(doublev) : false; + bvec2v = boolv ? isinf(dvec2v) : bvec2(false); + bvec3v = boolv ? isinf(dvec3v) : bvec3(false); + bvec4v = boolv ? isinf(dvec4v) : bvec4(false); + + doublev += length(doublev); + doublev += length(dvec2v); + doublev += length(dvec3v); + doublev += length(dvec4v); + + doublev += distance(doublev, doublev); + doublev += distance(dvec2v, dvec2v); + doublev += distance(dvec3v, dvec3v); + doublev += distance(dvec4v, dvec4v); + + doublev += dot(doublev, doublev); + doublev += dot(dvec2v, dvec2v); + doublev += dot(dvec3v, dvec3v); + doublev += dot(dvec4v, dvec4v); + + dvec3v += cross(dvec3v, dvec3v); + + doublev += normalize(doublev); + dvec2v += normalize(dvec2v); + dvec3v += normalize(dvec3v); + dvec4v += normalize(dvec4v); + + doublev += faceforward(doublev, doublev, doublev); + dvec2v += faceforward(dvec2v, dvec2v, dvec2v); + dvec3v += faceforward(dvec3v, dvec3v, dvec3v); + dvec4v += faceforward(dvec4v, dvec4v, dvec4v); + + doublev += reflect(doublev, doublev); + dvec2v += reflect(dvec2v, dvec2v); + dvec3v += reflect(dvec3v, dvec3v); + dvec4v += reflect(dvec4v, dvec4v); + + doublev += refract(doublev, doublev, doublev); + dvec2v += refract(dvec2v, dvec2v, doublev); + dvec3v += refract(dvec3v, dvec3v, doublev); + dvec4v += refract(dvec4v, dvec4v, doublev); + + dmat2 dmat2v = outerProduct(dvec2v, dvec2v); + dmat3 dmat3v = outerProduct(dvec3v, dvec3v); + dmat4 dmat4v = outerProduct(dvec4v, dvec4v); + dmat2x3 dmat2x3v = outerProduct(dvec3v, dvec2v); + dmat3x2 dmat3x2v = outerProduct(dvec2v, dvec3v); + dmat2x4 dmat2x4v = outerProduct(dvec4v, dvec2v); + dmat4x2 dmat4x2v = outerProduct(dvec2v, dvec4v); + dmat3x4 dmat3x4v = outerProduct(dvec4v, dvec3v); + dmat4x3 dmat4x3v = outerProduct(dvec3v, dvec4v); + dmat2v *= matrixCompMult(dmat2v, dmat2v); dmat3v *= matrixCompMult(dmat3v, dmat3v); dmat4v *= matrixCompMult(dmat4v, dmat4v); - dmat2x3v = matrixCompMult(dmat2x3v, dmat2x3v); // For now, relying on no dead-code elimination - dmat2x4v = matrixCompMult(dmat2x4v, dmat2x4v); - dmat3x2v = matrixCompMult(dmat3x2v, dmat3x2v); - dmat3x4v = matrixCompMult(dmat3x4v, dmat3x4v); - dmat4x2v = matrixCompMult(dmat4x2v, dmat4x2v); - dmat4x3v = matrixCompMult(dmat4x3v, dmat4x3v); - - dmat2v *= transpose(dmat2v); - dmat3v *= transpose(dmat3v); - dmat4v *= transpose(dmat4v); - dmat2x3v = transpose(dmat3x2v); // For now, relying on no dead-code elimination - dmat3x2v = transpose(dmat2x3v); - dmat2x4v = transpose(dmat4x2v); - dmat4x2v = transpose(dmat2x4v); - dmat3x4v = transpose(dmat4x3v); - dmat4x3v = transpose(dmat3x4v); - - doublev += determinant(dmat2v); - doublev += determinant(dmat3v); - doublev += determinant(dmat4v); - - dmat2v *= inverse(dmat2v); - dmat3v *= inverse(dmat3v); - dmat4v *= inverse(dmat4v); - - outp *= float(doublev + dvec2v.y + dvec3v.z + dvec4v.w + - dmat2v[1][1] + dmat3v[2][2] + dmat4v[3][3] + dmat2x3v[1][1] + dmat3x2v[1][1] + dmat3x4v[2][2] + dmat4x3v[2][2] + dmat2x4v[1][1] + dmat4x2v[1][1] + - float(boolv) + float(bvec2v.x) + float(bvec3v.x) + float(bvec4v.x)); -} - -void main() -{ - vec4 v; - v = texture(arrayedSampler[i], c2D); - outp.x = gl_ClipDistance[1]; - outp.yzw = v.yzw; - - ivec2 offsets[4]; - const ivec2 constOffsets[4] = ivec2[4](ivec2(1,2), ivec2(3,4), ivec2(15,16), ivec2(-2,0)); - uoutp = textureGatherOffsets(samp2dr, c2D, constOffsets, 2); - outp += textureGather(arrayedSampler[0], c2D); - ioutp = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 3); - ioutp += textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 1+2); - ioutp += textureGatherOffset(isamp2DA, vec3(0.1), ivec2(i)); - - outp += gl_FragCoord + vl2; - uo = u % i; - foo23(); - doubles(); - - int id = gl_PrimitiveID; -} - + dmat2x3v = matrixCompMult(dmat2x3v, dmat2x3v); // For now, relying on no dead-code elimination + dmat2x4v = matrixCompMult(dmat2x4v, dmat2x4v); + dmat3x2v = matrixCompMult(dmat3x2v, dmat3x2v); + dmat3x4v = matrixCompMult(dmat3x4v, dmat3x4v); + dmat4x2v = matrixCompMult(dmat4x2v, dmat4x2v); + dmat4x3v = matrixCompMult(dmat4x3v, dmat4x3v); + + dmat2v *= transpose(dmat2v); + dmat3v *= transpose(dmat3v); + dmat4v *= transpose(dmat4v); + dmat2x3v = transpose(dmat3x2v); // For now, relying on no dead-code elimination + dmat3x2v = transpose(dmat2x3v); + dmat2x4v = transpose(dmat4x2v); + dmat4x2v = transpose(dmat2x4v); + dmat3x4v = transpose(dmat4x3v); + dmat4x3v = transpose(dmat3x4v); + + doublev += determinant(dmat2v); + doublev += determinant(dmat3v); + doublev += determinant(dmat4v); + + dmat2v *= inverse(dmat2v); + dmat3v *= inverse(dmat3v); + dmat4v *= inverse(dmat4v); + + outp *= float(doublev + dvec2v.y + dvec3v.z + dvec4v.w + + dmat2v[1][1] + dmat3v[2][2] + dmat4v[3][3] + dmat2x3v[1][1] + dmat3x2v[1][1] + dmat3x4v[2][2] + dmat4x3v[2][2] + dmat2x4v[1][1] + dmat4x2v[1][1] + + float(boolv) + float(bvec2v.x) + float(bvec3v.x) + float(bvec4v.x)); +} + +void main() +{ + vec4 v; + v = texture(arrayedSampler[i], c2D); + outp.x = gl_ClipDistance[1]; + outp.yzw = v.yzw; + + ivec2 offsets[4]; + const ivec2 constOffsets[4] = ivec2[4](ivec2(1,2), ivec2(3,4), ivec2(15,16), ivec2(-2,0)); + uoutp = textureGatherOffsets(samp2dr, c2D, constOffsets, 2); + outp += textureGather(arrayedSampler[0], c2D); + ioutp = textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 3); + ioutp += textureGatherOffset(isamp2DA, vec3(0.1), ivec2(1), 1+2); + ioutp += textureGatherOffset(isamp2DA, vec3(0.1), ivec2(i)); + + outp += gl_FragCoord + vl2; + uo = u % i; + foo23(); + doubles(); + + int id = gl_PrimitiveID; +} + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.400.tesc vulkan-1.1.73+dfsg/external/glslang/Test/spv.400.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.400.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.400.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,43 +1,43 @@ -#version 400 core - -layout(vertices = 4) out; -int outa[gl_out.length()]; - -patch out vec4 patchOut; - -void main() -{ - barrier(); - - int a = gl_MaxTessControlInputComponents + - gl_MaxTessControlOutputComponents + - gl_MaxTessControlTextureImageUnits + - gl_MaxTessControlUniformComponents + - gl_MaxTessControlTotalOutputComponents; - - vec4 p = gl_in[1].gl_Position; - float ps = gl_in[1].gl_PointSize; - float cd = gl_in[1].gl_ClipDistance[2]; - - int pvi = gl_PatchVerticesIn; - int pid = gl_PrimitiveID; - int iid = gl_InvocationID; - - gl_out[gl_InvocationID].gl_Position = p; - gl_out[gl_InvocationID].gl_PointSize = ps; - gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; - - gl_TessLevelOuter[3] = 3.2; - gl_TessLevelInner[1] = 1.3; -} - -in vec2 inb[]; -in vec2 ind[gl_MaxPatchVertices]; - -#extension GL_ARB_separate_shader_objects : enable - -layout(location = 3) in vec4 ivla[]; -layout(location = 4) in vec4 ivlb[]; - -layout(location = 3) out vec4 ovla[]; -layout(location = 4) out vec4 ovlb[]; +#version 400 core + +layout(vertices = 4) out; +int outa[gl_out.length()]; + +patch out vec4 patchOut; + +void main() +{ + barrier(); + + int a = gl_MaxTessControlInputComponents + + gl_MaxTessControlOutputComponents + + gl_MaxTessControlTextureImageUnits + + gl_MaxTessControlUniformComponents + + gl_MaxTessControlTotalOutputComponents; + + vec4 p = gl_in[1].gl_Position; + float ps = gl_in[1].gl_PointSize; + float cd = gl_in[1].gl_ClipDistance[2]; + + int pvi = gl_PatchVerticesIn; + int pid = gl_PrimitiveID; + int iid = gl_InvocationID; + + gl_out[gl_InvocationID].gl_Position = p; + gl_out[gl_InvocationID].gl_PointSize = ps; + gl_out[gl_InvocationID].gl_ClipDistance[1] = cd; + + gl_TessLevelOuter[3] = 3.2; + gl_TessLevelInner[1] = 1.3; +} + +in vec2 inb[]; +in vec2 ind[gl_MaxPatchVertices]; + +#extension GL_ARB_separate_shader_objects : enable + +layout(location = 3) in vec4 ivla[]; +layout(location = 4) in vec4 ivlb[]; + +layout(location = 3) out vec4 ovla[]; +layout(location = 4) out vec4 ovlb[]; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.400.tese vulkan-1.1.73+dfsg/external/glslang/Test/spv.400.tese --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.400.tese 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.400.tese 2018-04-27 11:46:26.000000000 +0000 @@ -1,52 +1,52 @@ -#version 400 core - -layout(triangles, ccw) in; - -layout(fractional_odd_spacing) in; - -layout(point_mode) in; - -patch in vec4 patchIn; - -void main() -{ - int a = gl_MaxTessEvaluationInputComponents + - gl_MaxTessEvaluationOutputComponents + - gl_MaxTessEvaluationTextureImageUnits + - gl_MaxTessEvaluationUniformComponents + - gl_MaxTessPatchComponents + - gl_MaxPatchVertices + - gl_MaxTessGenLevel; - - vec4 p = gl_in[1].gl_Position; - float ps = gl_in[1].gl_PointSize; - float cd = gl_in[1].gl_ClipDistance[2]; - - int pvi = gl_PatchVerticesIn; - int pid = gl_PrimitiveID; - vec3 tc = gl_TessCoord; - float tlo = gl_TessLevelOuter[3]; - float tli = gl_TessLevelInner[1]; - - gl_Position = p; - gl_PointSize = ps; - gl_ClipDistance[2] = cd; -} - -#extension GL_ARB_separate_shader_objects : enable - -in vec2 inb[]; -in vec2 ind[gl_MaxPatchVertices]; - -in testblb { - int f; -} blb[]; - -in testbld { - int f; -} bld[gl_MaxPatchVertices]; - -layout(location = 23) in vec4 ivla[]; -layout(location = 24) in vec4 ivlb[]; - -layout(location = 23) out vec4 ovla[2]; +#version 400 core + +layout(triangles, ccw) in; + +layout(fractional_odd_spacing) in; + +layout(point_mode) in; + +patch in vec4 patchIn; + +void main() +{ + int a = gl_MaxTessEvaluationInputComponents + + gl_MaxTessEvaluationOutputComponents + + gl_MaxTessEvaluationTextureImageUnits + + gl_MaxTessEvaluationUniformComponents + + gl_MaxTessPatchComponents + + gl_MaxPatchVertices + + gl_MaxTessGenLevel; + + vec4 p = gl_in[1].gl_Position; + float ps = gl_in[1].gl_PointSize; + float cd = gl_in[1].gl_ClipDistance[2]; + + int pvi = gl_PatchVerticesIn; + int pid = gl_PrimitiveID; + vec3 tc = gl_TessCoord; + float tlo = gl_TessLevelOuter[3]; + float tli = gl_TessLevelInner[1]; + + gl_Position = p; + gl_PointSize = ps; + gl_ClipDistance[2] = cd; +} + +#extension GL_ARB_separate_shader_objects : enable + +in vec2 inb[]; +in vec2 ind[gl_MaxPatchVertices]; + +in testblb { + int f; +} blb[]; + +in testbld { + int f; +} bld[gl_MaxPatchVertices]; + +layout(location = 23) in vec4 ivla[]; +layout(location = 24) in vec4 ivlb[]; + +layout(location = 23) out vec4 ovla[2]; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.420.geom vulkan-1.1.73+dfsg/external/glslang/Test/spv.420.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.420.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.420.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,43 +1,43 @@ -#version 420 core - -layout(triangles) in; - -in gl_PerVertex { - float gl_PointSize; -} gl_in[]; - -out gl_PerVertex { - float gl_PointSize; -}; - -layout(line_strip) out; -layout(max_vertices = 127) out; -layout(invocations = 4) in; - -uniform sampler2D s2D; -in vec2 coord[]; - -int i; - -void main() -{ - float p = gl_in[1].gl_PointSize; - gl_PointSize = p; - gl_ViewportIndex = 7; - - EmitStreamVertex(1); - EndStreamPrimitive(0); - EmitVertex(); - EndPrimitive(); - int id = gl_InvocationID; - - const ivec2 offsets[5] = - { - ivec2(0,1), - ivec2(1,-2), - ivec2(0,3), - ivec2(-3,0), - ivec2(2,1) - }; - vec4 v = textureGatherOffset(s2D, coord[0], offsets[i].xy); -} +#version 420 core + +layout(triangles) in; + +in gl_PerVertex { + float gl_PointSize; +} gl_in[]; + +out gl_PerVertex { + float gl_PointSize; +}; + +layout(line_strip) out; +layout(max_vertices = 127) out; +layout(invocations = 4) in; + +uniform sampler2D s2D; +in vec2 coord[]; + +int i; + +void main() +{ + float p = gl_in[1].gl_PointSize; + gl_PointSize = p; + gl_ViewportIndex = 7; + + EmitStreamVertex(1); + EndStreamPrimitive(0); + EmitVertex(); + EndPrimitive(); + int id = gl_InvocationID; + + const ivec2 offsets[5] = + { + ivec2(0,1), + ivec2(1,-2), + ivec2(0,3), + ivec2(-3,0), + ivec2(2,1) + }; + vec4 v = textureGatherOffset(s2D, coord[0], offsets[i].xy); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.430.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.430.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.430.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.430.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,10 +1,10 @@ -#version 430 core - -out vec4 color; - -void main() -{ - color = vec4(1.0); - color *= gl_Layer; - color *= gl_ViewportIndex; -} +#version 430 core + +out vec4 color; + +void main() +{ + color = vec4(1.0); + color *= gl_Layer; + color *= gl_ViewportIndex; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.430.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.430.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.430.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.430.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,37 +1,37 @@ -#version 450 core - - - -out gl_PerVertex { - float gl_ClipDistance[]; -}; - -const float cx = 4.20; -const float dx = 4.20; -in vec4 bad[10]; -highp in vec4 badorder; -out invariant vec4 badorder2; -out flat vec4 badorder3; - -in float f; - -void main() -{ - gl_ClipDistance[2] = 3.7; - - if (bad[0].x == cx.x) - badorder3 = bad[0]; - - gl_ClipDistance[0] = f.x; -} - -layout(binding = 3) uniform boundblock { int aoeu; } boundInst; -layout(binding = 7) uniform anonblock { int aoeu; } ; -layout(binding = 4) uniform sampler2D sampb1; -layout(binding = 5) uniform sampler2D sampb2[10]; -layout(binding = 31) uniform sampler2D sampb4; - -struct S { mediump float a; highp uvec2 b; highp vec3 c; }; -struct SS { vec4 b; S s; vec4 c; }; -layout(location = 0) flat out SS var; -out MS { layout(location = 17) float f; } outMS; +#version 450 core + + + +out gl_PerVertex { + float gl_ClipDistance[]; +}; + +const float cx = 4.20; +const float dx = 4.20; +in vec4 bad[10]; +highp in vec4 badorder; +out invariant vec4 badorder2; +out flat vec4 badorder3; + +in float f; + +void main() +{ + gl_ClipDistance[2] = 3.7; + + if (bad[0].x == cx.x) + badorder3 = bad[0]; + + gl_ClipDistance[0] = f.x; +} + +layout(binding = 3) uniform boundblock { int aoeu; } boundInst; +layout(binding = 7) uniform anonblock { int aoeu; } ; +layout(binding = 4) uniform sampler2D sampb1; +layout(binding = 5) uniform sampler2D sampb2[10]; +layout(binding = 31) uniform sampler2D sampb4; + +struct S { mediump float a; highp uvec2 b; highp vec3 c; }; +struct SS { vec4 b; S s; vec4 c; }; +layout(location = 0) flat out SS var; +out MS { layout(location = 17) float f; } outMS; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.450.geom vulkan-1.1.73+dfsg/external/glslang/Test/spv.450.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.450.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.450.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,14 +1,14 @@ -#version 450 core - -layout(triangles) in; - -layout(line_strip) out; -layout(max_vertices = 127) out; -layout(invocations = 4) in; - -void main() -{ - gl_PointSize = gl_in[1].gl_PointSize; - gl_Layer = 2; - gl_ViewportIndex = 3; -} +#version 450 core + +layout(triangles) in; + +layout(line_strip) out; +layout(max_vertices = 127) out; +layout(invocations = 4) in; + +void main() +{ + gl_PointSize = gl_in[1].gl_PointSize; + gl_Layer = 2; + gl_ViewportIndex = 3; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.450.noRedecl.tesc vulkan-1.1.73+dfsg/external/glslang/Test/spv.450.noRedecl.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.450.noRedecl.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.450.noRedecl.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,10 +1,10 @@ -#version 450 core - -layout(vertices = 4) out; - -patch out vec4 patchOut; - -void main() -{ - gl_in[0].gl_PointSize; -} +#version 450 core + +layout(vertices = 4) out; + +patch out vec4 patchOut; + +void main() +{ + gl_in[0].gl_PointSize; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.450.tesc vulkan-1.1.73+dfsg/external/glslang/Test/spv.450.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.450.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.450.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,33 +1,33 @@ -#version 450 core - -layout(vertices = 4) out; - -layout(location=1) patch out vec4 patchOut; - -struct S { - float sMem1; // should not see a patch decoration - float sMem2; // should not see a patch decoration -}; - -layout(location = 12) patch out TheBlock { - highp float bMem1; // should not see a location decoration - highp float bMem2; - S s; // should see a patch decoration -} tcBlock[2]; - -void main() -{ +#version 450 core + +layout(vertices = 4) out; + +layout(location=1) patch out vec4 patchOut; + +struct S { + float sMem1; // should not see a patch decoration + float sMem2; // should not see a patch decoration +}; + +layout(location = 12) patch out TheBlock { + highp float bMem1; // should not see a location decoration + highp float bMem2; + S s; // should see a patch decoration +} tcBlock[2]; + +void main() +{ gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; -} - -layout(location = 2) patch out SingleBlock { - highp float bMem1; // should not see a location decoration - highp float bMem2; - S s; // should see a patch decoration -} singleBlock; - -layout(location = 20) patch out bn { - vec4 v1; // location 20 - layout(location = 24) vec4 v2; // location 24 - vec4 v3; // location 25 +} + +layout(location = 2) patch out SingleBlock { + highp float bMem1; // should not see a location decoration + highp float bMem2; + S s; // should see a patch decoration +} singleBlock; + +layout(location = 20) patch out bn { + vec4 v1; // location 20 + layout(location = 24) vec4 v2; // location 24 + vec4 v3; // location 25 }; \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.460.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.460.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.460.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.460.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,9 +1,9 @@ -#version 460 - -void main() -{ - bool b1; - b1 = anyInvocation(b1); - b1 = allInvocations(b1); - b1 = allInvocationsEqual(b1); -} +#version 460 + +void main() +{ + bool b1; + b1 = anyInvocation(b1); + b1 = allInvocations(b1); + b1 = allInvocationsEqual(b1); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.460.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.460.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.460.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.460.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,17 +1,17 @@ -#version 460 core - -layout(binding = 0) uniform atomic_uint aui; -uint ui; - -void main() -{ - atomicCounterAdd(aui, ui); - atomicCounterSubtract(aui, ui); - atomicCounterMin(aui, ui); - atomicCounterMax(aui, ui); - atomicCounterAnd(aui, ui); - atomicCounterOr(aui, ui); - atomicCounterXor(aui, ui); - atomicCounterExchange(aui, ui); - atomicCounterCompSwap(aui, ui, ui); -} +#version 460 core + +layout(binding = 0) uniform atomic_uint aui; +uint ui; + +void main() +{ + atomicCounterAdd(aui, ui); + atomicCounterSubtract(aui, ui); + atomicCounterMin(aui, ui); + atomicCounterMax(aui, ui); + atomicCounterAnd(aui, ui); + atomicCounterOr(aui, ui); + atomicCounterXor(aui, ui); + atomicCounterExchange(aui, ui); + atomicCounterCompSwap(aui, ui, ui); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.460.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.460.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.460.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.460.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ -#version 460 - -void main() -{ - int a = gl_BaseVertex + gl_BaseInstance + gl_DrawID; -} +#version 460 + +void main() +{ + int a = gl_BaseVertex + gl_BaseInstance + gl_DrawID; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.accessChain.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.accessChain.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.accessChain.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.accessChain.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,94 +1,100 @@ -#version 420 - -struct S -{ - vec3 color; -}; - -layout(location = 0) out vec3 OutColor; - -flat in int u; - -void GetColor1(const S i) -{ - OutColor += i.color.x; -} - -void GetColor2(const S i, int comp) -{ - OutColor += i.color[comp]; -} - -void GetColor3(const S i, int comp) -{ - OutColor += i.color[comp].x; -} - -void GetColor4(const S i, int comp) -{ - OutColor += i.color[comp].x; -} - -void GetColor5(const S i, int comp) -{ - OutColor += i.color; -} - -void GetColor6(const S i, int comp) -{ - OutColor += i.color.yx[comp]; -} - -void GetColor7(const S i, int comp) -{ - OutColor.xy += i.color.yxz.yx; -} - -void GetColor8(const S i, int comp) -{ - OutColor += i.color.yzx.yx.x.x; -} - -void GetColor9(const S i, int comp) -{ - OutColor.zxy += i.color; -} - -void GetColor10(const S i, int comp) -{ - OutColor.zy += i.color.xy; -} - -void GetColor11(const S i, int comp) -{ - OutColor.zxy.yx += i.color.xy; -} - -void GetColor12(const S i, int comp) -{ - OutColor[comp] += i.color.x; -} - -void GetColor13(const S i, int comp) -{ - OutColor.zy[comp] += i.color.x; -} - -void main() -{ - S s; - OutColor = vec3(0.0); - GetColor1(s); - GetColor2(s, u); - GetColor3(s, u); - GetColor4(s, u); - GetColor5(s, u); - GetColor6(s, u); - GetColor7(s, u); - GetColor8(s, u); - GetColor9(s, u); - GetColor10(s, u); - GetColor11(s, u); - GetColor12(s, u); - GetColor13(s, u); -} +#version 420 + +struct S +{ + vec3 color; +}; + +layout(location = 0) out vec3 OutColor; + +flat in int u; + +void GetColor1(const S i) +{ + OutColor += i.color.x; +} + +void GetColor2(const S i, int comp) +{ + OutColor += i.color[comp]; +} + +void GetColor3(const S i, int comp) +{ + OutColor += i.color[comp].x; +} + +void GetColor4(const S i, int comp) +{ + OutColor += i.color[comp].x; +} + +void GetColor5(const S i, int comp) +{ + OutColor += i.color; +} + +void GetColor6(const S i, int comp) +{ + OutColor += i.color.yx[comp]; +} + +void GetColor7(const S i, int comp) +{ + OutColor.xy += i.color.yxz.yx; +} + +void GetColor8(const S i, int comp) +{ + OutColor += i.color.yzx.yx.x.x; +} + +void GetColor9(const S i, int comp) +{ + OutColor.zxy += i.color; +} + +void GetColor10(const S i, int comp) +{ + OutColor.zy += i.color.xy; +} + +void GetColor11(const S i, int comp) +{ + OutColor.zxy.yx += i.color.xy; +} + +void GetColor12(const S i, int comp) +{ + OutColor[comp] += i.color.x; +} + +void GetColor13(const S i, int comp) +{ + OutColor.zy[comp] += i.color.x; +} + +void GetColor14(const S i, int comp) +{ + OutColor.zyx[comp] = i.color.x; +} + +void main() +{ + S s; + OutColor = vec3(0.0); + GetColor1(s); + GetColor2(s, u); + GetColor3(s, u); + GetColor4(s, u); + GetColor5(s, u); + GetColor6(s, u); + GetColor7(s, u); + GetColor8(s, u); + GetColor9(s, u); + GetColor10(s, u); + GetColor11(s, u); + GetColor12(s, u); + GetColor13(s, u); + GetColor14(s, u); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.aggOps.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.aggOps.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.aggOps.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.aggOps.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,51 +1,51 @@ -#version 450 - -uniform sampler2D samp2D; -in mediump vec2 coord; - -in vec4 u, w; -out vec4 color; - -struct s1 { - int i; - float f; -}; - -struct s2 { - int i; - float f; - s1 s1_1; -}; - -layout(std140) uniform ub1 { s2 foo2a; } uName1; -layout(std430) buffer ub2 { s2 foo2b; } uName2; - -void main() -{ - vec4 v; - s1 a[3], b[3]; - a = s1[3](s1(int(u.x), u.y), s1(int(u.z), u.w), s1(14, 14.0)); - b = s1[3](s1(17, 17.0), s1(int(w.x), w.y), s1(int(w.z), w.w)); - - if (uName1.foo2a == uName2.foo2b) - v = texture(samp2D, coord); - else - v = texture(samp2D, 2.0*coord); - - if (u == v) - v *= 3.0; - - if (u != v) - v *= 4.0; - - if (coord == v.yw) - v *= 5.0; - - if (a == b) - v *= 6.0; - - if (a != b) - v *= 7.0; - - color = v; -} +#version 450 + +uniform sampler2D samp2D; +in mediump vec2 coord; + +in vec4 u, w; +out vec4 color; + +struct s1 { + int i; + float f; +}; + +struct s2 { + int i; + float f; + s1 s1_1; +}; + +layout(std140) uniform ub1 { s2 foo2a; } uName1; +layout(std430) buffer ub2 { s2 foo2b; } uName2; + +void main() +{ + vec4 v; + s1 a[3], b[3]; + a = s1[3](s1(int(u.x), u.y), s1(int(u.z), u.w), s1(14, 14.0)); + b = s1[3](s1(17, 17.0), s1(int(w.x), w.y), s1(int(w.z), w.w)); + + if (uName1.foo2a == uName2.foo2b) + v = texture(samp2D, coord); + else + v = texture(samp2D, 2.0*coord); + + if (u == v) + v *= 3.0; + + if (u != v) + v *= 4.0; + + if (coord == v.yw) + v *= 5.0; + + if (a == b) + v *= 6.0; + + if (a != b) + v *= 7.0; + + color = v; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.always-discard2.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.always-discard2.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.always-discard2.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.always-discard2.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,19 +1,19 @@ -#version 140 -in vec2 tex_coord; - -void main (void) -{ - vec4 white = vec4(1.0); - vec4 black = vec4(0.2); - vec4 color = white; - - // First, cut out our circle - float x = tex_coord.x*2.0 - 1.0; - float y = tex_coord.y*2.0 - 1.0; - - discard; - - - gl_FragColor = color; - -} +#version 140 +in vec2 tex_coord; + +void main (void) +{ + vec4 white = vec4(1.0); + vec4 black = vec4(0.2); + vec4 color = white; + + // First, cut out our circle + float x = tex_coord.x*2.0 - 1.0; + float y = tex_coord.y*2.0 - 1.0; + + discard; + + + gl_FragColor = color; + +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.always-discard.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.always-discard.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.always-discard.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.always-discard.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,36 +1,36 @@ -#version 140 -in vec2 tex_coord; - -void main (void) -{ - vec4 white = vec4(1.0); - vec4 black = vec4(0.2); - vec4 color = white; - - // First, cut out our circle - float x = tex_coord.x*2.0 - 1.0; - float y = tex_coord.y*2.0 - 1.0; - - float radius = sqrt(x*x + y*y); - if (radius > 1.0) { - if (radius > 1.1) { - ++color; - } - - gl_FragColor = color; - - if (radius > 1.2) { - ++color; - } - - } - - discard; - - // If we're near an edge, darken us a tiny bit - if (radius >= 0.75) - color -= abs(pow(radius, 16.0)/2.0); - - gl_FragColor = color; - -} +#version 140 +in vec2 tex_coord; + +void main (void) +{ + vec4 white = vec4(1.0); + vec4 black = vec4(0.2); + vec4 color = white; + + // First, cut out our circle + float x = tex_coord.x*2.0 - 1.0; + float y = tex_coord.y*2.0 - 1.0; + + float radius = sqrt(x*x + y*y); + if (radius > 1.0) { + if (radius > 1.1) { + ++color; + } + + gl_FragColor = color; + + if (radius > 1.2) { + ++color; + } + + } + + discard; + + // If we're near an edge, darken us a tiny bit + if (radius >= 0.75) + color -= abs(pow(radius, 16.0)/2.0); + + gl_FragColor = color; + +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.AofA.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.AofA.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.AofA.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.AofA.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,43 +1,43 @@ -#version 430 - -in float infloat; -out float outfloat; - -uniform uAofA { - float f[2][4]; -} nameAofA[3][5]; - -float[4][5][6] many[1][2][3]; - -float g4[4][7]; -in float g5[5][7]; - -flat in int i, j, k; - -float[4][7] foo(float a[5][7]) -{ - float r[7]; - r = a[2]; - - return float[4][7](a[0], a[1], r, a[3]); -} - -void main() -{ - outfloat = 0.0; - - g4 = foo(g5); - -// if (foo(g5) == g4) -// ++outfloat; - - float u[][7]; - u[2][2] = 3.0; - float u[5][7]; - - foo(u); - - many[i][j][k][i][j][k] = infloat; - outfloat += many[j][j][j][j][j][j]; - outfloat += nameAofA[1][2].f[0][3]; -} +#version 430 + +in float infloat; +out float outfloat; + +uniform uAofA { + float f[2][4]; +} nameAofA[3][5]; + +float[4][5][6] many[1][2][3]; + +float g4[4][7]; +in float g5[5][7]; + +flat in int i, j, k; + +float[4][7] foo(float a[5][7]) +{ + float r[7]; + r = a[2]; + + return float[4][7](a[0], a[1], r, a[3]); +} + +void main() +{ + outfloat = 0.0; + + g4 = foo(g5); + +// if (foo(g5) == g4) +// ++outfloat; + + float u[][7]; + u[2][2] = 3.0; + float u[5][7]; + + foo(u); + + many[i][j][k][i][j][k] = infloat; + outfloat += many[j][j][j][j][j][j]; + outfloat += nameAofA[1][2].f[0][3]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.arbPostDepthCoverage_Error.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.arbPostDepthCoverage_Error.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.arbPostDepthCoverage_Error.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.arbPostDepthCoverage_Error.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,12 @@ -#version 310 es - -#extension GL_ARB_post_depth_coverage : enable - -precision highp float; - -layout(post_depth_coverage, location = 0) in float a; // should fail since post_depth_coverage may only - // be declared on in only (not with variable declarations) - -void main () { - -} +#version 310 es + +#extension GL_ARB_post_depth_coverage : enable + +precision highp float; + +layout(post_depth_coverage, location = 0) in float a; // should fail since post_depth_coverage may only + // be declared on in only (not with variable declarations) + +void main () { + +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.arbPostDepthCoverage.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.arbPostDepthCoverage.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.arbPostDepthCoverage.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.arbPostDepthCoverage.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,13 +1,13 @@ -#version 450 - -#extension GL_ARB_post_depth_coverage : enable -#extension GL_EXT_post_depth_coverage : enable //according to ARB_post_depth_coverage, - //if both enabled, this one should be ignored -precision highp int; -layout(post_depth_coverage) in; - -layout (location = 0) out int readSampleMaskIn; - -void main () { - readSampleMaskIn = gl_SampleMaskIn[0]; -} +#version 450 + +#extension GL_ARB_post_depth_coverage : enable +#extension GL_EXT_post_depth_coverage : enable //according to ARB_post_depth_coverage, + //if both enabled, this one should be ignored +precision highp int; +layout(post_depth_coverage) in; + +layout (location = 0) out int readSampleMaskIn; + +void main () { + readSampleMaskIn = gl_SampleMaskIn[0]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.atomic.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.atomic.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.atomic.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.atomic.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,48 +1,48 @@ -#version 450 - - - -layout(binding = 0) uniform atomic_uint counter; - -layout(binding = 0, offset = 4) uniform atomic_uint countArr[4]; -shared uint value; - -int arrX[gl_WorkGroupSize.x]; -int arrY[gl_WorkGroupSize.y]; -int arrZ[gl_WorkGroupSize.z]; - -uint func(atomic_uint c) -{ - return atomicCounterIncrement(c); -} - -void main() -{ - memoryBarrierAtomicCounter(); - func(counter); - uint val = atomicCounter(countArr[2]); - atomicCounterDecrement(counter); - atomicCounterIncrement(counter); -} - -shared int atomi; -shared uint atomu; - -layout (std140, binding = 0) restrict buffer dataSSB -{ - float f; - ivec4 n_frames_rendered; -} result; - -void atoms() -{ - int origi = atomicAdd(atomi, 3); - uint origu = atomicAnd(atomu, value); - origu = atomicOr(atomu, 7u); - origu = atomicXor(atomu, 7u); - origu = atomicMin(atomu, value); - origi = atomicMax(atomi, 7); - origi = atomicExchange(atomi, origi); - origu = atomicCompSwap(atomu, 10u, value); - atomicAdd(result.n_frames_rendered.z, 1); -} +#version 450 + + + +layout(binding = 0) uniform atomic_uint counter; + +layout(binding = 0, offset = 4) uniform atomic_uint countArr[4]; +shared uint value; + +int arrX[gl_WorkGroupSize.x]; +int arrY[gl_WorkGroupSize.y]; +int arrZ[gl_WorkGroupSize.z]; + +uint func(atomic_uint c) +{ + return atomicCounterIncrement(c); +} + +void main() +{ + memoryBarrierAtomicCounter(); + func(counter); + uint val = atomicCounter(countArr[2]); + atomicCounterDecrement(counter); + atomicCounterIncrement(counter); +} + +shared int atomi; +shared uint atomu; + +layout (std140, binding = 0) restrict buffer dataSSB +{ + float f; + ivec4 n_frames_rendered; +} result; + +void atoms() +{ + int origi = atomicAdd(atomi, 3); + uint origu = atomicAnd(atomu, value); + origu = atomicOr(atomu, 7u); + origu = atomicXor(atomu, 7u); + origu = atomicMin(atomu, value); + origi = atomicMax(atomi, 7); + origi = atomicExchange(atomi, origi); + origu = atomicCompSwap(atomu, 10u, value); + atomicAdd(result.n_frames_rendered.z, 1); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.atomicInt64.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.atomicInt64.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.atomicInt64.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.atomicInt64.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,79 +1,79 @@ -#version 450 core - -#extension GL_ARB_gpu_shader_int64: enable -#extension GL_NV_shader_atomic_int64: enable - -layout(local_size_x = 16, local_size_y = 16) in; - -layout(binding = 0) buffer Buffer -{ - int64_t i64; - uint64_t u64; -} buf; - -struct Struct -{ - int64_t i64; - uint64_t u64; -}; - -shared Struct s; - -void main() -{ - const int64_t i64c = -24; - const uint64_t u64c = 0xF00000000Ful; - - // Test shader storage block - int64_t i64 = 0; - uint64_t u64 = 0; - - i64 += atomicMin(buf.i64, i64c); - u64 += atomicMin(buf.u64, u64c); - - i64 += atomicMax(buf.i64, i64c); - u64 += atomicMax(buf.u64, u64c); - - i64 += atomicAnd(buf.i64, i64c); - u64 += atomicAnd(buf.u64, u64c); - - i64 += atomicOr(buf.i64, i64c); - u64 += atomicOr(buf.u64, u64c); - - i64 += atomicXor(buf.i64, i64c); - u64 += atomicXor(buf.u64, u64c); - - i64 += atomicAdd(buf.i64, i64c); - i64 += atomicExchange(buf.i64, i64c); - i64 += atomicCompSwap(buf.i64, i64c, i64); - - buf.i64 = i64; - buf.u64 = u64; - - // Test shared variable - i64 = 0; - u64 = 0; - - i64 += atomicMin(s.i64, i64c); - u64 += atomicMin(s.u64, u64c); - - i64 += atomicMax(s.i64, i64c); - u64 += atomicMax(s.u64, u64c); - - i64 += atomicAnd(s.i64, i64c); - u64 += atomicAnd(s.u64, u64c); - - i64 += atomicOr(s.i64, i64c); - u64 += atomicOr(s.u64, u64c); - - i64 += atomicXor(s.i64, i64c); - u64 += atomicXor(s.u64, u64c); - - i64 += atomicAdd(s.i64, i64c); - i64 += atomicExchange(s.i64, i64c); - i64 += atomicCompSwap(s.i64, i64c, i64); - - s.i64 = i64; - s.u64 = u64; -} - +#version 450 core + +#extension GL_ARB_gpu_shader_int64: enable +#extension GL_NV_shader_atomic_int64: enable + +layout(local_size_x = 16, local_size_y = 16) in; + +layout(binding = 0) buffer Buffer +{ + int64_t i64; + uint64_t u64; +} buf; + +struct Struct +{ + int64_t i64; + uint64_t u64; +}; + +shared Struct s; + +void main() +{ + const int64_t i64c = -24; + const uint64_t u64c = 0xF00000000Ful; + + // Test shader storage block + int64_t i64 = 0; + uint64_t u64 = 0; + + i64 += atomicMin(buf.i64, i64c); + u64 += atomicMin(buf.u64, u64c); + + i64 += atomicMax(buf.i64, i64c); + u64 += atomicMax(buf.u64, u64c); + + i64 += atomicAnd(buf.i64, i64c); + u64 += atomicAnd(buf.u64, u64c); + + i64 += atomicOr(buf.i64, i64c); + u64 += atomicOr(buf.u64, u64c); + + i64 += atomicXor(buf.i64, i64c); + u64 += atomicXor(buf.u64, u64c); + + i64 += atomicAdd(buf.i64, i64c); + i64 += atomicExchange(buf.i64, i64c); + i64 += atomicCompSwap(buf.i64, i64c, i64); + + buf.i64 = i64; + buf.u64 = u64; + + // Test shared variable + i64 = 0; + u64 = 0; + + i64 += atomicMin(s.i64, i64c); + u64 += atomicMin(s.u64, u64c); + + i64 += atomicMax(s.i64, i64c); + u64 += atomicMax(s.u64, u64c); + + i64 += atomicAnd(s.i64, i64c); + u64 += atomicAnd(s.u64, u64c); + + i64 += atomicOr(s.i64, i64c); + u64 += atomicOr(s.u64, u64c); + + i64 += atomicXor(s.i64, i64c); + u64 += atomicXor(s.u64, u64c); + + i64 += atomicAdd(s.i64, i64c); + i64 += atomicExchange(s.i64, i64c); + i64 += atomicCompSwap(s.i64, i64c, i64); + + s.i64 = i64; + s.u64 = u64; +} + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.barrier.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.barrier.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.barrier.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.barrier.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,15 +1,15 @@ -#version 450 - -layout(location=0) out vec4 c0; -layout(location=1) out vec4 c1; - -void main() -{ - c0 = vec4(1.0); - memoryBarrier(); - c1 = vec4(1.0); - memoryBarrierBuffer(); - ++c0; - memoryBarrierImage(); - ++c0; +#version 450 + +layout(location=0) out vec4 c0; +layout(location=1) out vec4 c1; + +void main() +{ + c0 = vec4(1.0); + memoryBarrier(); + c1 = vec4(1.0); + memoryBarrierBuffer(); + ++c0; + memoryBarrierImage(); + ++c0; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.bitCast.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.bitCast.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.bitCast.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.bitCast.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,45 +1,45 @@ -#version 450 - -flat in int i1; -flat in ivec2 i2; -flat in ivec3 i3; -flat in ivec4 i4; - -flat in uint u1; -flat in uvec2 u2; -flat in uvec3 u3; -flat in uvec4 u4; - -in float f1; -in vec2 f2; -in vec3 f3; -in vec4 f4; - -out vec4 fragColor; - -void main() -{ - ivec4 idata = ivec4(0); - idata.x += floatBitsToInt(f1); - idata.xy += floatBitsToInt(f2); - idata.xyz += floatBitsToInt(f3); - idata += floatBitsToInt(f4); - - uvec4 udata = uvec4(0); - udata.x += floatBitsToUint(f1); - udata.xy += floatBitsToUint(f2); - udata.xyz += floatBitsToUint(f3); - udata += floatBitsToUint(f4); - - vec4 fdata = vec4(0.0); - fdata.x += intBitsToFloat(i1); - fdata.xy += intBitsToFloat(i2); - fdata.xyz += intBitsToFloat(i3); - fdata += intBitsToFloat(i4); - fdata.x += uintBitsToFloat(u1); - fdata.xy += uintBitsToFloat(u2); - fdata.xyz += uintBitsToFloat(u3); - fdata += uintBitsToFloat(u4); - - fragColor = (idata == udata) ? fdata : fdata + vec4(0.2); +#version 450 + +flat in int i1; +flat in ivec2 i2; +flat in ivec3 i3; +flat in ivec4 i4; + +flat in uint u1; +flat in uvec2 u2; +flat in uvec3 u3; +flat in uvec4 u4; + +in float f1; +in vec2 f2; +in vec3 f3; +in vec4 f4; + +out vec4 fragColor; + +void main() +{ + ivec4 idata = ivec4(0); + idata.x += floatBitsToInt(f1); + idata.xy += floatBitsToInt(f2); + idata.xyz += floatBitsToInt(f3); + idata += floatBitsToInt(f4); + + uvec4 udata = uvec4(0); + udata.x += floatBitsToUint(f1); + udata.xy += floatBitsToUint(f2); + udata.xyz += floatBitsToUint(f3); + udata += floatBitsToUint(f4); + + vec4 fdata = vec4(0.0); + fdata.x += intBitsToFloat(i1); + fdata.xy += intBitsToFloat(i2); + fdata.xyz += intBitsToFloat(i3); + fdata += intBitsToFloat(i4); + fdata.x += uintBitsToFloat(u1); + fdata.xy += uintBitsToFloat(u2); + fdata.xyz += uintBitsToFloat(u3); + fdata += uintBitsToFloat(u4); + + fragColor = (idata == udata) ? fdata : fdata + vec4(0.2); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.boolInBlock.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.boolInBlock.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.boolInBlock.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.boolInBlock.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,31 +1,31 @@ -#version 450 - -layout(binding = 0, std140) uniform Uniform -{ - bvec4 b4; -}; - -layout(binding = 1, std430) buffer Buffer -{ - bvec2 b2; -}; - -void foo(bvec4 paramb4, out bvec2 paramb2) -{ - bool b1 = paramb4.z; - paramb2 = bvec2(b1); -} - -layout(location = 0) out vec4 fragColor; - -void main() -{ - b2 = bvec2(0.0); - if (b4.z) - b2 = bvec2(b4.x); - if (b2.x) - foo(b4, b2); - - fragColor = vec4(b4.x && b4.y); - fragColor -= vec4(b4.x || b4.y); +#version 450 + +layout(binding = 0, std140) uniform Uniform +{ + bvec4 b4; +}; + +layout(binding = 1, std430) buffer Buffer +{ + bvec2 b2; +}; + +void foo(bvec4 paramb4, out bvec2 paramb2) +{ + bool b1 = paramb4.z; + paramb2 = bvec2(b1); +} + +layout(location = 0) out vec4 fragColor; + +void main() +{ + b2 = bvec2(0.0); + if (b4.z) + b2 = bvec2(b4.x); + if (b2.x) + foo(b4, b2); + + fragColor = vec4(b4.x && b4.y); + fragColor -= vec4(b4.x || b4.y); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.bool.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.bool.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.bool.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.bool.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,17 +1,17 @@ -#version 450 - -const bool condition = false; - -uniform ubname { - bool b; -} ubinst; - -bool foo(bool b) -{ - return b != condition; -} - -void main() -{ - gl_Position = foo(ubinst.b) ? vec4(0.0) : vec4(1.0); -} +#version 450 + +const bool condition = false; + +uniform ubname { + bool b; +} ubinst; + +bool foo(bool b) +{ + return b != condition; +} + +void main() +{ + gl_Position = foo(ubinst.b) ? vec4(0.0) : vec4(1.0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.builtInXFB.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.builtInXFB.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.builtInXFB.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.builtInXFB.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,15 +1,15 @@ -#version 450 - -layout(xfb_buffer = 1, xfb_stride = 64) out; - -layout (xfb_buffer = 1, xfb_offset = 16) out gl_PerVertex -{ - float gl_PointSize; - vec4 gl_Position; -}; - -void main() -{ - gl_Position = vec4(1.0); - gl_PointSize = 2.0; +#version 450 + +layout(xfb_buffer = 1, xfb_stride = 64) out; + +layout (xfb_buffer = 1, xfb_offset = 16) out gl_PerVertex +{ + float gl_PointSize; + vec4 gl_Position; +}; + +void main() +{ + gl_Position = vec4(1.0); + gl_PointSize = 2.0; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.conditionalDiscard.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.conditionalDiscard.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.conditionalDiscard.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.conditionalDiscard.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,14 +1,14 @@ -#version 400 - -uniform sampler2D tex; -in vec2 coord; - -void main (void) -{ - vec4 v = texture(tex, coord); - - if (v == vec4(0.1,0.2,0.3,0.4)) - discard; - - gl_FragColor = v; -} +#version 400 + +uniform sampler2D tex; +in vec2 coord; + +void main (void) +{ + vec4 v = texture(tex, coord); + + if (v == vec4(0.1,0.2,0.3,0.4)) + discard; + + gl_FragColor = v; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.constStruct.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.constStruct.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.constStruct.vert 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.constStruct.vert 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,22 @@ +#version 450 + +precision highp float; + +struct U { + mat2 m; +}; + +struct T { + mat2 m; +}; + +struct S { + T t; + U u; +}; + +void main() +{ + S s1 = S(T(mat2(1.0)), U(mat2(1.0))); + S s2 = S(T(mat2(1.0)), U(mat2(1.0))); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.conversion.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.conversion.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.conversion.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.conversion.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,112 +1,112 @@ -#version 140 - -bool u_b; -bvec2 u_b2; -bvec3 u_b3; -bvec4 u_b4; - -int u_i; -ivec2 u_i2; -ivec3 u_i3; -ivec4 u_i4; - -float u_f; -vec2 u_f2; -vec3 u_f3; -vec4 u_f4; - -bool i_b; -bvec2 i_b2; -bvec3 i_b3; -bvec4 i_b4; - -flat in int i_i; -flat in ivec2 i_i2; -flat in ivec3 i_i3; -flat in ivec4 i_i4; - -in float i_f; -in vec2 i_f2; -in vec3 i_f3; -in vec4 i_f4; - -void main() -{ - bool b = bool(u_i) ^^ bool(u_f); - bvec2 b2 = bvec2(u_i, u_f); - bvec3 b3 = bvec3(u_i, u_f, i_i); - bvec4 b4 = bvec4(u_i, u_f, i_i, i_f); - - int i = int(u_f) + int(b); - ivec2 i2 = ivec2(u_f2) + ivec2(b2); - ivec3 i3 = ivec3(u_f3) + ivec3(b3); - ivec4 i4 = ivec4(u_f4) + ivec4(b4); - - float f = i; - vec2 f2 = i2; - vec3 f3 = i3; - vec4 f4 = i4; - - f += (float(i) + float(b)); - f2 -= vec2(i2) + vec2(b2); - f3 /= vec3(i3) + vec3(b3); - f4 += vec4(i4) + vec4(b4); - - f4 += vec4(bvec4(i_i4)); - f4 += vec4(bvec4(u_f4)); - - f += f - i; - f2 += vec2(f, i) + i2; - f3 += i3 + vec3(f, i, f); - f4 += vec4(b, i, f, i) + i4; - - f2 += vec2(f, i) * i; - f3 += vec3(f, i, f) + i; - f4 += i - vec4(b, i, f, i); - - i2 += ivec2(f, i); - i3 += ivec3(f, i, f); - i4 += ivec4(b, i, f, i); - - if (f < i || i < f || - f2 == i2 || - i3 != f3) - f = (b ? i : f2.x) + (b2.x ? f3.x : i2.y); - - gl_FragColor = - b || - b2.x || - b2.y || - b3.x || - b3.y || - b3.z || - b4.x || - b4.y || - b4.z || - b4.w ? vec4( - i + - i2.x + - i2.y + - i3.x + - i3.y + - i3.z + - i4.x + - i4.y + - i4.z + - i4.w + - f + - f2.x + - f2.y + - f3.x + - f3.y + - f3.z + - f4.x + - f4.y + - f4.z + - f4.w) : vec4(1.0); - - // with constants... - ivec4 cv2 = ivec4(1.0); - bvec4 cv5 = bvec4(cv2); - gl_FragColor += float(cv5); -} +#version 140 + +bool u_b; +bvec2 u_b2; +bvec3 u_b3; +bvec4 u_b4; + +int u_i; +ivec2 u_i2; +ivec3 u_i3; +ivec4 u_i4; + +float u_f; +vec2 u_f2; +vec3 u_f3; +vec4 u_f4; + +bool i_b; +bvec2 i_b2; +bvec3 i_b3; +bvec4 i_b4; + +flat in int i_i; +flat in ivec2 i_i2; +flat in ivec3 i_i3; +flat in ivec4 i_i4; + +in float i_f; +in vec2 i_f2; +in vec3 i_f3; +in vec4 i_f4; + +void main() +{ + bool b = bool(u_i) ^^ bool(u_f); + bvec2 b2 = bvec2(u_i, u_f); + bvec3 b3 = bvec3(u_i, u_f, i_i); + bvec4 b4 = bvec4(u_i, u_f, i_i, i_f); + + int i = int(u_f) + int(b); + ivec2 i2 = ivec2(u_f2) + ivec2(b2); + ivec3 i3 = ivec3(u_f3) + ivec3(b3); + ivec4 i4 = ivec4(u_f4) + ivec4(b4); + + float f = i; + vec2 f2 = i2; + vec3 f3 = i3; + vec4 f4 = i4; + + f += (float(i) + float(b)); + f2 -= vec2(i2) + vec2(b2); + f3 /= vec3(i3) + vec3(b3); + f4 += vec4(i4) + vec4(b4); + + f4 += vec4(bvec4(i_i4)); + f4 += vec4(bvec4(u_f4)); + + f += f - i; + f2 += vec2(f, i) + i2; + f3 += i3 + vec3(f, i, f); + f4 += vec4(b, i, f, i) + i4; + + f2 += vec2(f, i) * i; + f3 += vec3(f, i, f) + i; + f4 += i - vec4(b, i, f, i); + + i2 += ivec2(f, i); + i3 += ivec3(f, i, f); + i4 += ivec4(b, i, f, i); + + if (f < i || i < f || + f2 == i2 || + i3 != f3) + f = (b ? i : f2.x) + (b2.x ? f3.x : i2.y); + + gl_FragColor = + b || + b2.x || + b2.y || + b3.x || + b3.y || + b3.z || + b4.x || + b4.y || + b4.z || + b4.w ? vec4( + i + + i2.x + + i2.y + + i3.x + + i3.y + + i3.z + + i4.x + + i4.y + + i4.z + + i4.w + + f + + f2.x + + f2.y + + f3.x + + f3.y + + f3.z + + f4.x + + f4.y + + f4.z + + f4.w) : vec4(1.0); + + // with constants... + ivec4 cv2 = ivec4(1.0); + bvec4 cv5 = bvec4(cv2); + gl_FragColor += float(cv5); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.dataOut.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.dataOut.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.dataOut.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.dataOut.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,8 @@ -#version 140 - -in vec4 Color; - -void main() -{ - gl_FragData[1] = Color; -} +#version 140 + +in vec4 Color; + +void main() +{ + gl_FragData[1] = Color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.dataOutIndirect.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.dataOutIndirect.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.dataOutIndirect.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.dataOutIndirect.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,12 @@ -#version 140 - -in vec4 Color; - -out vec4 fcolor[4]; - -uniform b { int i; } bName; - -void main() -{ - fcolor[bName.i] = Color; -} +#version 140 + +in vec4 Color; + +out vec4 fcolor[4]; + +uniform b { int i; } bName; + +void main() +{ + fcolor[bName.i] = Color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.dataOutIndirect.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.dataOutIndirect.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.dataOutIndirect.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.dataOutIndirect.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,12 @@ -#version 140 - -attribute vec4 color; -out vec4 colorOut[6]; - -void main() -{ - for (int i = 1; i < 5; ++i) - colorOut[i] = color; - - gl_Position = colorOut[2]; -} +#version 140 + +attribute vec4 color; +out vec4 colorOut[6]; + +void main() +{ + for (int i = 1; i < 5; ++i) + colorOut[i] = color; + + gl_Position = colorOut[2]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.debugInfo.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.debugInfo.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.debugInfo.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.debugInfo.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,52 +1,52 @@ -#version 450 - -struct S { - int a; -}; - -uniform ubuf { - S s; -}; - -uniform sampler2D s2d; - -layout(location = 0) in vec4 inv; -layout(location = 0) out vec4 outv; - -vec4 foo(S s) -{ - vec4 r = s.a * inv; - ++r; - if (r.x > 3.0) - --r; - else - r *= 2; - - return r; -} - -void main() -{ - outv = foo(s); - outv += texture(s2d, vec2(0.5)); - - switch (s.a) { - case 10: - ++outv; - break; - case 20: - outv = 2 * outv; - ++outv; - break; - default: - --outv; - break; - } - - for (int i = 0; i < 10; ++i) - outv *= 3.0; - - outv.x < 10.0 ? - outv = sin(outv) : - outv = cos(outv); +#version 450 + +struct S { + int a; +}; + +uniform ubuf { + S s; +}; + +uniform sampler2D s2d; + +layout(location = 0) in vec4 inv; +layout(location = 0) out vec4 outv; + +vec4 foo(S s) +{ + vec4 r = s.a * inv; + ++r; + if (r.x > 3.0) + --r; + else + r *= 2; + + return r; +} + +void main() +{ + outv = foo(s); + outv += texture(s2d, vec2(0.5)); + + switch (s.a) { + case 10: + ++outv; + break; + case 20: + outv = 2 * outv; + ++outv; + break; + default: + --outv; + break; + } + + for (int i = 0; i < 10; ++i) + outv *= 3.0; + + outv.x < 10.0 ? + outv = sin(outv) : + outv = cos(outv); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.deepRvalue.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.deepRvalue.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.deepRvalue.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.deepRvalue.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,36 +1,36 @@ -#version 330 - -uniform sampler2D samp2D; - -vec4 v1 = vec4(2.0, 3.0, 5.0, 7.0); -vec4 v2 = vec4(11.0, 13.0, 17.0, 19.0); -vec4 v3 = vec4(23.0, 29.0, 31.0, 37.0); -vec4 v4 = vec4(41.0, 43.0, 47.0, 53.0); - -struct str { - int a; - vec2 b[3]; - bool c; -}; - -void main() -{ - mat4 m = mat4(v1, v2, v3, v4); - - mat4 mm = matrixCompMult(m, m); - float f = mm[1].w; // should be 19 * 19 = 361 - - // do a deep access to a spontaneous r-value - float g = matrixCompMult(m, m)[2].y; // should be 29 * 29 = 841 - - float h = str(1, vec2[3](vec2(2.0, 3.0), vec2(4.0, 5.0), vec2(6.0, 7.0)), true).b[1][1]; // should be 5.0 - - float i = texture(samp2D, vec2(0.5,0.5)).y; - - i += (i > 0.1 ? v1 : v2)[3]; - - str t; - i += (t = str(1, vec2[3](vec2(2.0, 3.0), vec2(4.0, 5.0), vec2(6.0, 7.0)), true)).b[2].y; // should be 7.0 - - gl_FragColor = vec4(f, g, h, i); -} +#version 330 + +uniform sampler2D samp2D; + +vec4 v1 = vec4(2.0, 3.0, 5.0, 7.0); +vec4 v2 = vec4(11.0, 13.0, 17.0, 19.0); +vec4 v3 = vec4(23.0, 29.0, 31.0, 37.0); +vec4 v4 = vec4(41.0, 43.0, 47.0, 53.0); + +struct str { + int a; + vec2 b[3]; + bool c; +}; + +void main() +{ + mat4 m = mat4(v1, v2, v3, v4); + + mat4 mm = matrixCompMult(m, m); + float f = mm[1].w; // should be 19 * 19 = 361 + + // do a deep access to a spontaneous r-value + float g = matrixCompMult(m, m)[2].y; // should be 29 * 29 = 841 + + float h = str(1, vec2[3](vec2(2.0, 3.0), vec2(4.0, 5.0), vec2(6.0, 7.0)), true).b[1][1]; // should be 5.0 + + float i = texture(samp2D, vec2(0.5,0.5)).y; + + i += (i > 0.1 ? v1 : v2)[3]; + + str t; + i += (t = str(1, vec2[3](vec2(2.0, 3.0), vec2(4.0, 5.0), vec2(6.0, 7.0)), true)).b[2].y; // should be 7.0 + + gl_FragColor = vec4(f, g, h, i); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.depthOut.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.depthOut.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.depthOut.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.depthOut.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,11 +1,11 @@ -#version 450 - -in vec4 Color; -in float Depth; - -layout(depth_greater) out float gl_FragDepth; - -void main() -{ - gl_FragDepth = Depth; -} +#version 450 + +in vec4 Color; +in float Depth; + +layout(depth_greater) out float gl_FragDepth; + +void main() +{ + gl_FragDepth = Depth; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.discard-dce.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.discard-dce.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.discard-dce.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.discard-dce.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,35 +1,35 @@ -#version 140 -in vec2 tex_coord; - -void main (void) -{ - vec4 white = vec4(1.0); - vec4 black = vec4(0.2); - vec4 color = white; - - // First, cut out our circle - float x = tex_coord.x*2.0 - 1.0; - float y = tex_coord.y*2.0 - 1.0; - - float radius = sqrt(x*x + y*y); - if (radius > 1.0) { - if (radius > 1.1) { - ++color; - } - - gl_FragColor = color; - - if (radius > 1.2) { - ++color; - } - - discard; - } - - // If we're near an edge, darken us a tiny bit - if (radius >= 0.75) - color -= abs(pow(radius, 16.0)/2.0); - - gl_FragColor = color; - -} +#version 140 +in vec2 tex_coord; + +void main (void) +{ + vec4 white = vec4(1.0); + vec4 black = vec4(0.2); + vec4 color = white; + + // First, cut out our circle + float x = tex_coord.x*2.0 - 1.0; + float y = tex_coord.y*2.0 - 1.0; + + float radius = sqrt(x*x + y*y); + if (radius > 1.0) { + if (radius > 1.1) { + ++color; + } + + gl_FragColor = color; + + if (radius > 1.2) { + ++color; + } + + discard; + } + + // If we're near an edge, darken us a tiny bit + if (radius >= 0.75) + color -= abs(pow(radius, 16.0)/2.0); + + gl_FragColor = color; + +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.double.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.double.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.double.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.double.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,25 +1,25 @@ -#version 430 - -const double d1 = 3.1415926535897932384626433832795LF; -const double d2 = 3.1415; -const double d3 = 3.1415926535897932384626433832795LF; -const double d4 = 3.1415926535897932384626433832795; - -buffer bufName { - float f; - double d; -} bufInst; - - -uniform writeonly image2D destTex; - -void main() -{ - bufInst.d = float(d1); - bufInst.f = float(d1 + d2 + d3 + d4); - - ivec2 storePos = ivec2(gl_GlobalInvocationID.xy); - double localCoef = length(vec2(ivec2(gl_LocalInvocationID.xy)-8)/8.0); - dvec4 aa = dvec4(0.4, 0.2, 0.3, 0.4); - double globalCoef = 1.0; -} +#version 430 + +const double d1 = 3.1415926535897932384626433832795LF; +const double d2 = 3.1415; +const double d3 = 3.1415926535897932384626433832795LF; +const double d4 = 3.1415926535897932384626433832795; + +buffer bufName { + float f; + double d; +} bufInst; + + +uniform writeonly image2D destTex; + +void main() +{ + bufInst.d = float(d1); + bufInst.f = float(d1 + d2 + d3 + d4); + + ivec2 storePos = ivec2(gl_GlobalInvocationID.xy); + double localCoef = length(vec2(ivec2(gl_LocalInvocationID.xy)-8)/8.0); + dvec4 aa = dvec4(0.4, 0.2, 0.3, 0.4); + double globalCoef = 1.0; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.doWhileLoop.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.doWhileLoop.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.doWhileLoop.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.doWhileLoop.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,16 @@ -#version 140 - -in vec4 bigColor; -in vec4 BaseColor; -in float d; - -void main() -{ - vec4 color = BaseColor; - - do { - color += bigColor; - } while (color.x < d); - - gl_FragColor = color; -} +#version 140 + +in vec4 bigColor; +in vec4 BaseColor; +in float d; + +void main() +{ + vec4 color = BaseColor; + + do { + color += bigColor; + } while (color.x < d); + + gl_FragColor = color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.earlyReturnDiscard.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.earlyReturnDiscard.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.earlyReturnDiscard.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.earlyReturnDiscard.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,102 +1,102 @@ -#version 140 - -in float d; -in vec4 bigColor, smallColor; -in vec4 otherColor; - -in float c; - -in float threshhold; -in float threshhold2; -in float threshhold3; - -in float minimum; - -in vec4 BaseColor; - -bool b; - -void main() -{ - vec4 color = BaseColor; - vec4 color2; - - color2 = otherColor; - - if (c > d) - color += bigColor; - else - color += smallColor; - - if (color.z < minimum) - return; - - color.z++; - - if (color.z > threshhold) - discard; - - color++; - - // Two path, different rest - if (color.w > threshhold2) { - if (color.z > threshhold2) - return; - else if (b) - color.z++; - else { - if (color.x < minimum) { - discard; - } else { - color++; - } - } - } else { - if (b) - discard; - else - return; - } - - - // // Two path, shared rest - // if (color.w > threshhold2) { - // if (color.z > threshhold2) - // return; - // else if (b) - // color++; - // else { - // if (color.x < minimum) { - // discard; - // } else { - // color++; - // } - // } - // } else { - // if (b) - // discard; - // else - // return; - // } - - - // // One path - // if (color.w > threshhold2) { - // if (color.z > threshhold2) - // return; - // else { - // if (color.x < minimum) { - // discard; - // } else { - // color++; - // } - // } - // } else { - // if (b) - // discard; - // else - // return; - // } - - gl_FragColor = color * color2; -} +#version 140 + +in float d; +in vec4 bigColor, smallColor; +in vec4 otherColor; + +in float c; + +in float threshhold; +in float threshhold2; +in float threshhold3; + +in float minimum; + +in vec4 BaseColor; + +bool b; + +void main() +{ + vec4 color = BaseColor; + vec4 color2; + + color2 = otherColor; + + if (c > d) + color += bigColor; + else + color += smallColor; + + if (color.z < minimum) + return; + + color.z++; + + if (color.z > threshhold) + discard; + + color++; + + // Two path, different rest + if (color.w > threshhold2) { + if (color.z > threshhold2) + return; + else if (b) + color.z++; + else { + if (color.x < minimum) { + discard; + } else { + color++; + } + } + } else { + if (b) + discard; + else + return; + } + + + // // Two path, shared rest + // if (color.w > threshhold2) { + // if (color.z > threshhold2) + // return; + // else if (b) + // color++; + // else { + // if (color.x < minimum) { + // discard; + // } else { + // color++; + // } + // } + // } else { + // if (b) + // discard; + // else + // return; + // } + + + // // One path + // if (color.w > threshhold2) { + // if (color.z > threshhold2) + // return; + // else { + // if (color.x < minimum) { + // discard; + // } else { + // color++; + // } + // } + // } else { + // if (b) + // discard; + // else + // return; + // } + + gl_FragColor = color * color2; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.explicittypes.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.explicittypes.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.explicittypes.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.explicittypes.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,334 @@ +#version 450 + +#extension GL_KHX_shader_explicit_arithmetic_types: enable +#extension GL_KHX_shader_explicit_arithmetic_types_int8: require +#extension GL_KHX_shader_explicit_arithmetic_types_int16: require +#extension GL_KHX_shader_explicit_arithmetic_types_int32: require +#extension GL_KHX_shader_explicit_arithmetic_types_int64: require +#extension GL_KHX_shader_explicit_arithmetic_types_float16: require +#extension GL_KHX_shader_explicit_arithmetic_types_float32: require +#extension GL_KHX_shader_explicit_arithmetic_types_float64: require + +layout(binding = 0) uniform Uniforms +{ + uint index; +}; + +layout(std140, binding = 1) uniform Block +{ + int16_t i16; + i16vec2 i16v2; + i16vec3 i16v3; + i16vec4 i16v4; + uint16_t u16; + u16vec2 u16v2; + u16vec3 u16v3; + u16vec4 u16v4; + + int32_t i32; + i32vec2 i32v2; + i32vec3 i32v3; + i32vec4 i32v4; + uint32_t u32; + u32vec2 u32v2; + u32vec3 u32v3; + u32vec4 u32v4; +} block; + +void main() +{ +} + +void literal() +{ + const int64_t i64Const[3] = + { + -0x1111111111111111l, // Hex + -1l, // Dec + 040000000000l, // Oct + }; + + int64_t i64 = i64Const[index]; + + const uint64_t u64Const[] = + { + 0xFFFFFFFFFFFFFFFFul, // Hex + 4294967296UL, // Dec + 077777777777ul, // Oct + }; + + uint64_t u64 = u64Const[index]; + + const int32_t i32Const[3] = + { + -0x11111111, // Hex + -1, // Dec + 04000000000, // Oct + }; + + int32_t i32 = i32Const[index]; + + const uint32_t u32Const[] = + { + 0xFFFFFFFF, // Hex + 4294967295, // Dec + 017777777777, // Oct + }; + + uint32_t u32 = u32Const[index]; + + const int16_t i16Const[3] = + { + int16_t(-0x1111), // Hex + int16_t(-1), // Dec + int16_t(040000), // Oct + }; + + int16_t i16 = i16Const[index]; + + const uint16_t u16Const[] = + { + uint16_t(0xFFFF), // Hex + uint16_t(65535), // Dec + uint16_t(077777), // Oct + }; + + uint16_t u16 = u16Const[index]; + + const int8_t i8Const[3] = + { + int8_t(-0x11), // Hex + int8_t(-1), // Dec + int8_t(0400), // Oct + }; + + int8_t i8 = i8Const[index]; + + const uint8_t u8Const[] = + { + uint8_t(0xFF), // Hex + uint8_t(255), // Dec + uint8_t(0177), // Oct + }; + + uint8_t u8 = u8Const[index]; +} + +void typeCast8() +{ + i8vec2 i8v; + u8vec2 u8v; + i16vec2 i16v; + u16vec2 u16v; + i32vec2 i32v; + u32vec2 u32v; + i64vec2 i64v; + u64vec2 u64v; + f16vec2 f16v; + f32vec2 f32v; + f64vec2 f64v; + bvec2 bv; + + u8v = i8v; // int8_t -> uint8_t + i16v = i8v; // int8_t -> int16_t + i16v = u8v; // uint8_t -> int16_t + i32v = i8v; // int8_t -> int32_t + i32v = u8v; // uint8_t -> int32_t + u32v = i8v; // int8_t -> uint32_t + i64v = i8v; // int8_t -> int64_t + u64v = i8v; // int8_t -> uint64_t + u32v = u8v; // uint8_t -> uint32_t + i64v = u8v; // uint8_t -> int64_t + u64v = u8v; // uint8_t -> uint64_t + f16v = i8v; // int8_t -> float16_t + f32v = i8v; // int8_t -> float32_t + f64v = i8v; // int8_t -> float64_t + f16v = u8v; // uint8_t -> float16_t + f32v = u8v; // uint8_t -> float32_t + f64v = u8v; // uint8_t -> float64_t + + i8v = i8vec2(u8v); // uint8_t -> int8_t + i16v = i16vec2(i8v); // int8_t -> int16_t + i16v = i16vec2(u8v); // uint8_t -> int16_t + i32v = i32vec2(i8v); // int8_t -> int32_t + i32v = i32vec2(u8v); // uint8_t -> int32_t + i64v = i64vec2(i8v); // int8_t -> int64_t + u64v = i64vec2(i8v); // int8_t -> uint64_t + u16v = u16vec2(i8v); // int8_t -> uint16_t + u16v = u16vec2(u8v); // uint8_t -> uint16_t + u32v = u32vec2(u8v); // uint8_t -> uint32_t + i64v = i64vec2(u8v); // uint8_t -> int64_t + u64v = i64vec2(u8v); // uint8_t -> uint64_t + f16v = f16vec2(i8v); // int8_t -> float16_t + f32v = f32vec2(i8v); // int8_t -> float32_t + f64v = f64vec2(i8v); // int8_t -> float64_t + f16v = f16vec2(u8v); // uint8_t -> float16_t + f32v = f32vec2(u8v); // uint8_t -> float32_t + f64v = f64vec2(u8v); // uint8_t -> float64_t + + i8v = i8vec2(bv); // bool -> int8 + u8v = u8vec2(bv); // bool -> uint8 + bv = bvec2(i8v); // int8 -> bool + bv = bvec2(u8v); // uint8 -> bool +} + +void typeCast16() +{ + i8vec2 i8v; + u8vec2 u8v; + i16vec2 i16v; + u16vec2 u16v; + i32vec2 i32v; + u32vec2 u32v; + i64vec2 i64v; + u64vec2 u64v; + f16vec2 f16v; + f32vec2 f32v; + f64vec2 f64v; + bvec2 bv; + + i32v = i16v; // int16_t -> int32_t + i32v = u16v; // uint16_t -> int32_t + u16v = i16v; // int16_t -> uint16_t + u32v = i16v; // int16_t -> uint32_t + i64v = i16v; // int16_t -> int64_t + u64v = i16v; // int16_t -> uint64_t + u32v = u16v; // uint16_t -> uint32_t + i64v = u16v; // uint16_t -> int64_t + u64v = u16v; // uint16_t -> uint64_t + f16v = i16v; // int16_t -> float16_t + f32v = i16v; // int16_t -> float32_t + f64v = i16v; // int16_t -> float64_t + f16v = u16v; // uint16_t -> float16_t + f32v = u16v; // uint16_t -> float32_t + f64v = u16v; // uint16_t -> float64_t + + i32v = i32vec2(i16v); // int16_t -> int32_t + i32v = i32vec2(u16v); // uint16_t -> int32_t + u16v = u16vec2(i16v); // int16_t -> uint16_t + u32v = u32vec2(i16v); // int16_t -> uint32_t + i64v = i64vec2(i16v); // int16_t -> int64_t + u64v = i64vec2(i16v); // int16_t -> uint64_t + u32v = u32vec2(u16v); // uint16_t -> uint32_t + i64v = i64vec2(u16v); // uint16_t -> int64_t + u64v = i64vec2(u16v); // uint16_t -> uint64_t + f16v = f16vec2(i16v); // int16_t -> float16_t + f32v = f32vec2(i16v); // int16_t -> float32_t + f64v = f64vec2(i16v); // int16_t -> float64_t + f16v = f16vec2(u16v); // uint16_t -> float16_t + f32v = f32vec2(u16v); // uint16_t -> float32_t + f64v = f64vec2(u16v); // uint16_t -> float64_t + + i8v = i8vec2(i16v); // int16_t -> int8_t + i8v = i8vec2(u16v); // uint16_t -> int8_t + u8v = u8vec2(i16v); // int16_t -> uint8_t + u8v = u8vec2(u16v); // uint16_t -> uint8_t + i16v = u8vec2(u16v); // uint16_t -> int16_t + i16v = i16vec2(bv); // bool -> int16 + u16v = u16vec2(bv); // bool -> uint16 + bv = bvec2(i16v); // int16 -> bool + bv = bvec2(u16v); // uint16 -> bool +} + +void typeCast32() +{ + i8vec2 i8v; + u8vec2 u8v; + i16vec2 i16v; + u16vec2 u16v; + i32vec2 i32v; + u32vec2 u32v; + i64vec2 i64v; + u64vec2 u64v; + f16vec2 f16v; + f32vec2 f32v; + f64vec2 f64v; + bvec2 bv; + + u32v = i32v; // int32_t -> uint32_t + i64v = i32v; // int32_t -> int64_t + u64v = i32v; // int32_t -> uint64_t + i64v = u32v; // uint32_t -> int64_t + u64v = u32v; // uint32_t -> uint64_t + f32v = i32v; // int32_t -> float32_t + f64v = i32v; // int32_t -> float64_t + f32v = u32v; // uint32_t -> float32_t + f64v = u32v; // uint32_t -> float64_t + + i8v = i8vec2(i32v); // int32_t -> int8_t + i8v = i8vec2(u32v); // uint32_t -> int8_t + i16v = i16vec2(i32v); // int32_t -> int16_t + i16v = i16vec2(u32v); // uint32_t -> int16_t + i32v = i32vec2(i32v); // int32_t -> int32_t + i32v = i32vec2(u32v); // uint32_t -> int32_t + i64v = i64vec2(i32v); // int32_t -> int64_t + i64v = i64vec2(u32v); // uint32_t -> int64_t + u8v = u8vec2(i32v); // int32_t -> uint8_t + u8v = u8vec2(u32v); // uint32_t -> uint8_t + u16v = u16vec2(i32v); // int32_t -> uint16_t + u16v = u16vec2(u32v); // uint32_t -> uint16_t + u32v = u32vec2(i32v); // int32_t -> uint32_t + u32v = u32vec2(u32v); // uint32_t -> uint32_t + u64v = u64vec2(i32v); // int32_t -> uint64_t + u64v = u64vec2(u32v); // uint32_t -> uint64_t + + f16v = f16vec2(i32v); // int32_t -> float16_t + f32v = f32vec2(i32v); // int32_t -> float32_t + f64v = f64vec2(i32v); // int32_t -> float64_t + f16v = f16vec2(u32v); // uint32_t -> float16_t + f32v = f32vec2(u32v); // uint32_t -> float32_t + f64v = f64vec2(u32v); // uint32_t -> float64_t + + i32v = i32vec2(bv); // bool -> int32 + u32v = u32vec2(bv); // bool -> uint32 + bv = bvec2(i32v); // int32 -> bool + bv = bvec2(u32v); // uint32 -> bool +} + +void typeCast64() +{ + i8vec2 i8v; + u8vec2 u8v; + i16vec2 i16v; + u16vec2 u16v; + i32vec2 i32v; + u32vec2 u32v; + i64vec2 i64v; + u64vec2 u64v; + f16vec2 f16v; + f32vec2 f32v; + f64vec2 f64v; + bvec2 bv; + + u64v = i64v; // int64_t -> uint64_t + f64v = i64v; // int64_t -> float64_t + f64v = u64v; // uint64_t -> float64_t + + i8v = i8vec2(i64v); // int64_t -> int8_t + i8v = i8vec2(u64v); // uint64_t -> int8_t + i16v = i16vec2(i64v); // int64_t -> int16_t + i16v = i16vec2(u64v); // uint64_t -> int16_t + i32v = i32vec2(i64v); // int64_t -> int32_t + i32v = i32vec2(u64v); // uint64_t -> int32_t + i64v = i64vec2(u64v); // uint64_t -> int64_t + u8v = u8vec2(i64v); // int64_t -> uint8_t + u8v = u8vec2(u64v); // uint64_t -> uint8_t + u16v = u16vec2(i64v); // int64_t -> uint16_t + u16v = u16vec2(u64v); // uint64_t -> uint16_t + u32v = u32vec2(i64v); // int64_t -> uint32_t + u32v = u32vec2(u64v); // uint64_t -> uint32_t + u64v = u64vec2(i64v); // int64_t -> uint64_t + u64v = u64vec2(u64v); // uint64_t -> uint64_t + + f16v = f16vec2(i64v); // int64_t -> float16_t + f32v = f32vec2(i64v); // int64_t -> float32_t + f64v = f64vec2(i64v); // int64_t -> float64_t + f16v = f16vec2(u64v); // uint64_t -> float16_t + f32v = f32vec2(u64v); // uint64_t -> float32_t + f64v = f64vec2(u64v); // uint64_t -> float64_t + + i64v = i64vec2(bv); // bool -> int64 + u64v = u64vec2(bv); // bool -> uint64 + bv = bvec2(i64v); // int64 -> bool + bv = bvec2(u64v); // uint64 -> bool +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.extPostDepthCoverage_Error.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.extPostDepthCoverage_Error.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.extPostDepthCoverage_Error.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.extPostDepthCoverage_Error.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,9 +1,9 @@ -#version 450 - -#extension GL_EXT_post_depth_coverage : enable - -layout(post_depth_coverage) in; // should fail since for GL_EXT_post_depth_coverage - // explicit declaration of early_fragment_tests is required - -void main () { -} +#version 450 + +#extension GL_EXT_post_depth_coverage : enable + +layout(post_depth_coverage) in; // should fail since for GL_EXT_post_depth_coverage + // explicit declaration of early_fragment_tests is required + +void main () { +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.extPostDepthCoverage.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.extPostDepthCoverage.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.extPostDepthCoverage.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.extPostDepthCoverage.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,9 +1,9 @@ -#version 310 es - -#extension GL_EXT_post_depth_coverage : enable - -layout(post_depth_coverage) in; -layout(early_fragment_tests) in; - -void main () { -} +#version 310 es + +#extension GL_EXT_post_depth_coverage : enable + +layout(post_depth_coverage) in; +layout(early_fragment_tests) in; + +void main () { +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.float16Fetch.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.float16Fetch.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.float16Fetch.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.float16Fetch.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,1273 @@ +#version 450 core + +#extension GL_ARB_sparse_texture2: enable +#extension GL_ARB_sparse_texture_clamp: enable +#extension GL_AMD_gpu_shader_half_float: enable +#extension GL_AMD_gpu_shader_half_float_fetch: enable +#extension GL_AMD_texture_gather_bias_lod: enable + +layout(set = 0, binding = 0) uniform f16sampler1D s1D; +layout(set = 0, binding = 1) uniform f16sampler2D s2D; +layout(set = 0, binding = 2) uniform f16sampler3D s3D; +layout(set = 0, binding = 3) uniform f16sampler2DRect s2DRect; +layout(set = 0, binding = 4) uniform f16samplerCube sCube; +layout(set = 0, binding = 5) uniform f16samplerBuffer sBuffer; +layout(set = 0, binding = 6) uniform f16sampler2DMS s2DMS; +layout(set = 0, binding = 7) uniform f16sampler1DArray s1DArray; +layout(set = 0, binding = 8) uniform f16sampler2DArray s2DArray; +layout(set = 0, binding = 9) uniform f16samplerCubeArray sCubeArray; +layout(set = 0, binding = 10) uniform f16sampler2DMSArray s2DMSArray; + +layout(set = 0, binding = 11) uniform f16sampler1DShadow s1DShadow; +layout(set = 0, binding = 12) uniform f16sampler2DShadow s2DShadow; +layout(set = 0, binding = 13) uniform f16sampler2DRectShadow s2DRectShadow; +layout(set = 0, binding = 14) uniform f16samplerCubeShadow sCubeShadow; +layout(set = 0, binding = 15) uniform f16sampler1DArrayShadow s1DArrayShadow; +layout(set = 0, binding = 16) uniform f16sampler2DArrayShadow s2DArrayShadow; +layout(set = 0, binding = 17) uniform f16samplerCubeArrayShadow sCubeArrayShadow; + +layout(set = 1, binding = 0) layout(rgba16f) uniform f16image1D i1D; +layout(set = 1, binding = 1) layout(rgba16f) uniform f16image2D i2D; +layout(set = 1, binding = 2) layout(rgba16f) uniform f16image3D i3D; +layout(set = 1, binding = 3) layout(rgba16f) uniform f16image2DRect i2DRect; +layout(set = 1, binding = 4) layout(rgba16f) uniform f16imageCube iCube; +layout(set = 1, binding = 5) layout(rgba16f) uniform f16image1DArray i1DArray; +layout(set = 1, binding = 6) layout(rgba16f) uniform f16image2DArray i2DArray; +layout(set = 1, binding = 7) layout(rgba16f) uniform f16imageCubeArray iCubeArray; +layout(set = 1, binding = 8) layout(rgba16f) uniform f16imageBuffer iBuffer; +layout(set = 1, binding = 9) layout(rgba16f) uniform f16image2DMS i2DMS; +layout(set = 1, binding = 10) layout(rgba16f) uniform f16image2DMSArray i2DMSArray; + +layout(set = 2, binding = 0) uniform f16texture1D t1D; +layout(set = 2, binding = 1) uniform f16texture2D t2D; +layout(set = 2, binding = 2) uniform f16texture3D t3D; +layout(set = 2, binding = 3) uniform f16texture2DRect t2DRect; +layout(set = 2, binding = 4) uniform f16textureCube tCube; +layout(set = 2, binding = 5) uniform f16texture1DArray t1DArray; +layout(set = 2, binding = 6) uniform f16texture2DArray t2DArray; +layout(set = 2, binding = 7) uniform f16textureCubeArray tCubeArray; +layout(set = 2, binding = 8) uniform f16textureBuffer tBuffer; +layout(set = 2, binding = 9) uniform f16texture2DMS t2DMS; +layout(set = 2, binding = 10) uniform f16texture2DMSArray t2DMSArray; + +layout(set = 2, binding = 11) uniform sampler s; +layout(set = 2, binding = 12) uniform samplerShadow sShadow; + +layout(set = 3, binding = 0, input_attachment_index = 0) uniform f16subpassInput subpass; +layout(set = 3, binding = 1, input_attachment_index = 0) uniform f16subpassInputMS subpassMS; + +layout(location = 0) in float c1; +layout(location = 1) in vec2 c2; +layout(location = 2) in vec3 c3; +layout(location = 3) in vec4 c4; + +layout(location = 4) in float compare; +layout(location = 5) in float lod; +layout(location = 6) in float bias; +layout(location = 7) in float lodClamp; + +layout(location = 8) in float dPdxy1; +layout(location = 9) in vec2 dPdxy2; +layout(location = 10) in vec3 dPdxy3; + +layout(location = 11) in float16_t f16c1; +layout(location = 12) in f16vec2 f16c2; +layout(location = 13) in f16vec3 f16c3; +layout(location = 14) in f16vec4 f16c4; + +layout(location = 15) in float16_t f16lod; +layout(location = 16) in float16_t f16bias; +layout(location = 17) in float16_t f16lodClamp; + +layout(location = 18) in float16_t f16dPdxy1; +layout(location = 19) in f16vec2 f16dPdxy2; +layout(location = 20) in f16vec3 f16dPdxy3; + +const int offset1 = 1; +const ivec2 offset2 = ivec2(1); +const ivec3 offset3 = ivec3(1); +const ivec2 offsets[4] = { offset2, offset2, offset2, offset2 }; + +layout(location = 0) out vec4 fragColor; + +f16vec4 testTexture() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += texture(s1D, c1); + texel += texture(s1D, f16c1, f16bias); + texel += texture(s2D, c2); + texel += texture(s2D, f16c2, f16bias); + texel += texture(s3D, c3); + texel += texture(s3D, f16c3, f16bias); + texel += texture(sCube, c3); + texel += texture(sCube, f16c3, f16bias); + texel.x += texture(s1DShadow, c3); + texel.x += texture(s1DShadow, f16c2, compare, f16bias); + texel.x += texture(s2DShadow, c3); + texel.x += texture(s2DShadow, f16c2, compare, f16bias); + texel.x += texture(sCubeShadow, c4); + texel.x += texture(sCubeShadow, f16c3, compare, f16bias); + texel += texture(s1DArray, c2); + texel += texture(s1DArray, f16c2, f16bias); + texel += texture(s2DArray, c3); + texel += texture(s2DArray, f16c3, f16bias); + texel += texture(sCubeArray, c4); + texel += texture(sCubeArray, f16c4, f16bias); + texel.x += texture(s1DArrayShadow, c3); + texel.x += texture(s1DArrayShadow, f16c2, compare, f16bias); + texel.x += texture(s2DArrayShadow, c4); + texel.x += texture(s2DArrayShadow, f16c3, compare); + texel += texture(s2DRect, c2); + texel += texture(s2DRect, f16c2); + texel.x += texture(s2DRectShadow, c3); + texel.x += texture(s2DRectShadow, f16c2, compare); + texel.x += texture(sCubeArrayShadow, c4, compare); + texel.x += texture(sCubeArrayShadow, f16c4, compare); + + return texel; +} + +f16vec4 testTextureProj() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureProj(s1D, c2); + texel += textureProj(s1D, f16c2, f16bias); + texel += textureProj(s1D, c4); + texel += textureProj(s1D, f16c4, f16bias); + texel += textureProj(s2D, c3); + texel += textureProj(s2D, f16c3, f16bias); + texel += textureProj(s2D, c4); + texel += textureProj(s2D, f16c4, f16bias); + texel += textureProj(s3D, c4); + texel += textureProj(s3D, f16c4, f16bias); + texel.x += textureProj(s1DShadow, c4); + texel.x += textureProj(s1DShadow, f16c3, compare, f16bias); + texel.x += textureProj(s2DShadow, c4); + texel.x += textureProj(s2DShadow, f16c3, compare, f16bias); + texel += textureProj(s2DRect, c3); + texel += textureProj(s2DRect, f16c3); + texel += textureProj(s2DRect, c4); + texel += textureProj(s2DRect, f16c4); + texel.x += textureProj(s2DRectShadow, c4); + texel.x += textureProj(s2DRectShadow, f16c3, compare); + + return texel; +} + +f16vec4 testTextureLod() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureLod(s1D, c1, lod); + texel += textureLod(s1D, f16c1, f16lod); + texel += textureLod(s2D, c2, lod); + texel += textureLod(s2D, f16c2, f16lod); + texel += textureLod(s3D, c3, lod); + texel += textureLod(s3D, f16c3, f16lod); + texel += textureLod(sCube, c3, lod); + texel += textureLod(sCube, f16c3, f16lod); + texel.x += textureLod(s1DShadow, c3, lod); + texel.x += textureLod(s1DShadow, f16c2, compare, f16lod); + texel.x += textureLod(s2DShadow, c3, lod); + texel.x += textureLod(s2DShadow, f16c2, compare, f16lod); + texel += textureLod(s1DArray, c2, lod); + texel += textureLod(s1DArray, f16c2, f16lod); + texel += textureLod(s2DArray, c3, lod); + texel += textureLod(s2DArray, f16c3, f16lod); + texel.x += textureLod(s1DArrayShadow, c3, lod); + texel.x += textureLod(s1DArrayShadow, f16c2, compare, f16lod); + texel += textureLod(sCubeArray, c4, lod); + texel += textureLod(sCubeArray, f16c4, f16lod); + + return texel; +} + +f16vec4 testTextureOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureOffset(s1D, c1, offset1); + texel += textureOffset(s1D, f16c1, offset1, f16bias); + texel += textureOffset(s2D, c2, offset2); + texel += textureOffset(s2D, f16c2, offset2, f16bias); + texel += textureOffset(s3D, c3, offset3); + texel += textureOffset(s3D, f16c3, offset3, f16bias); + texel += textureOffset(s2DRect, c2, offset2); + texel += textureOffset(s2DRect, f16c2, offset2); + texel.x += textureOffset(s2DRectShadow, c3, offset2); + texel.x += textureOffset(s2DRectShadow, f16c2, compare, offset2); + texel.x += textureOffset(s1DShadow, c3, offset1); + texel.x += textureOffset(s1DShadow, f16c2, compare, offset1, f16bias); + texel.x += textureOffset(s2DShadow, c3, offset2); + texel.x += textureOffset(s2DShadow, f16c2, compare, offset2, f16bias); + texel += textureOffset(s1DArray, c2, offset1); + texel += textureOffset(s1DArray, f16c2, offset1, f16bias); + texel += textureOffset(s2DArray, c3, offset2); + texel += textureOffset(s2DArray, f16c3, offset2, f16bias); + texel.x += textureOffset(s1DArrayShadow, c3, offset1); + texel.x += textureOffset(s1DArrayShadow, f16c2, compare, offset1, f16bias); + texel.x += textureOffset(s2DArrayShadow, c4, offset2); + texel.x += textureOffset(s2DArrayShadow, f16c3, compare, offset2); + + return texel; +} + +f16vec4 testTextureProjOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureProjOffset(s1D, c2, offset1); + texel += textureProjOffset(s1D, f16c2, offset1, f16bias); + texel += textureProjOffset(s1D, c4, offset1); + texel += textureProjOffset(s1D, f16c4, offset1, f16bias); + texel += textureProjOffset(s2D, c3, offset2); + texel += textureProjOffset(s2D, f16c3, offset2, f16bias); + texel += textureProjOffset(s2D, c4, offset2); + texel += textureProjOffset(s2D, f16c4, offset2, f16bias); + texel += textureProjOffset(s3D, c4, offset3); + texel += textureProjOffset(s3D, f16c4, offset3, f16bias); + texel += textureProjOffset(s2DRect, c3, offset2); + texel += textureProjOffset(s2DRect, f16c3, offset2); + texel += textureProjOffset(s2DRect, c4, offset2); + texel += textureProjOffset(s2DRect, f16c4, offset2); + texel.x += textureProjOffset(s2DRectShadow, c4, offset2); + texel.x += textureProjOffset(s2DRectShadow, f16c3, compare, offset2); + texel.x += textureProjOffset(s1DShadow, c4, offset1); + texel.x += textureProjOffset(s1DShadow, f16c3, compare, offset1, f16bias); + texel.x += textureProjOffset(s2DShadow, c4, offset2); + texel.x += textureProjOffset(s2DShadow, f16c3, compare, offset2, f16bias); + + return texel; +} + +f16vec4 testTextureLodOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureLodOffset(s1D, c1, lod, offset1); + texel += textureLodOffset(s1D, f16c1, f16lod, offset1); + texel += textureLodOffset(s2D, c2, lod, offset2); + texel += textureLodOffset(s2D, f16c2, f16lod, offset2); + texel += textureLodOffset(s3D, c3, lod, offset3); + texel += textureLodOffset(s3D, f16c3, f16lod, offset3); + texel.x += textureLodOffset(s1DShadow, c3, lod, offset1); + texel.x += textureLodOffset(s1DShadow, f16c2, compare, f16lod, offset1); + texel.x += textureLodOffset(s2DShadow, c3, lod, offset2); + texel.x += textureLodOffset(s2DShadow, f16c2, compare, f16lod, offset2); + texel += textureLodOffset(s1DArray, c2, lod, offset1); + texel += textureLodOffset(s1DArray, f16c2, f16lod, offset1); + texel += textureLodOffset(s2DArray, c3, lod, offset2); + texel += textureLodOffset(s2DArray, f16c3, f16lod, offset2); + texel.x += textureLodOffset(s1DArrayShadow, c3, lod, offset1); + texel.x += textureLodOffset(s1DArrayShadow, f16c2, compare, f16lod, offset1); + + return texel; +} + +f16vec4 testTextureProjLodOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureProjLodOffset(s1D, c2, lod, offset1); + texel += textureProjLodOffset(s1D, f16c2, f16lod, offset1); + texel += textureProjLodOffset(s1D, c4, lod, offset1); + texel += textureProjLodOffset(s1D, f16c4, f16lod, offset1); + texel += textureProjLodOffset(s2D, c3, lod, offset2); + texel += textureProjLodOffset(s2D, f16c3, f16lod, offset2); + texel += textureProjLodOffset(s2D, c4, lod, offset2); + texel += textureProjLodOffset(s2D, f16c4, f16lod, offset2); + texel += textureProjLodOffset(s3D, c4, lod, offset3); + texel += textureProjLodOffset(s3D, f16c4, f16lod, offset3); + texel.x += textureProjLodOffset(s1DShadow, c4, lod, offset1); + texel.x += textureProjLodOffset(s1DShadow, f16c3, compare, f16lod, offset1); + texel.x += textureProjLodOffset(s2DShadow, c4, lod, offset2); + texel.x += textureProjLodOffset(s2DShadow, f16c3, compare, f16lod, offset2); + + return texel; +} + +f16vec4 testTexelFetch() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += texelFetch(s1D, int(c1), int(lod)); + texel += texelFetch(s2D, ivec2(c2), int(lod)); + texel += texelFetch(s3D, ivec3(c3), int(lod)); + texel += texelFetch(s2DRect, ivec2(c2)); + texel += texelFetch(s1DArray, ivec2(c2), int(lod)); + texel += texelFetch(s2DArray, ivec3(c3), int(lod)); + texel += texelFetch(sBuffer, int(c1)); + texel += texelFetch(s2DMS, ivec2(c2), 1); + texel += texelFetch(s2DMSArray, ivec3(c3), 2); + + return texel; +} + +f16vec4 testTexelFetchOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += texelFetchOffset(s1D, int(c1), int(lod), offset1); + texel += texelFetchOffset(s2D, ivec2(c2), int(lod), offset2); + texel += texelFetchOffset(s3D, ivec3(c3), int(lod), offset3); + texel += texelFetchOffset(s2DRect, ivec2(c2), offset2); + texel += texelFetchOffset(s1DArray, ivec2(c2), int(lod), offset1); + texel += texelFetchOffset(s2DArray, ivec3(c3), int(lod), offset2); + + return texel; +} + +f16vec4 testTextureGrad() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureGrad(s1D, c1, dPdxy1, dPdxy1); + texel += textureGrad(s1D, f16c1, f16dPdxy1, f16dPdxy1); + texel += textureGrad(s2D, c2, dPdxy2, dPdxy2); + texel += textureGrad(s2D, f16c2, f16dPdxy2, f16dPdxy2); + texel += textureGrad(s3D, c3, dPdxy3, dPdxy3); + texel += textureGrad(s3D, f16c3, f16dPdxy3, f16dPdxy3); + texel += textureGrad(sCube, c3, dPdxy3, dPdxy3); + texel += textureGrad(sCube, f16c3, f16dPdxy3, f16dPdxy3); + texel += textureGrad(s2DRect, c2, dPdxy2, dPdxy2); + texel += textureGrad(s2DRect, f16c2, f16dPdxy2, f16dPdxy2); + texel.x += textureGrad(s2DRectShadow, c3, dPdxy2, dPdxy2); + texel.x += textureGrad(s2DRectShadow, f16c2, compare, f16dPdxy2, f16dPdxy2); + texel.x += textureGrad(s1DShadow, c3, dPdxy1, dPdxy1); + texel.x += textureGrad(s1DShadow, f16c2, compare, f16dPdxy1, f16dPdxy1); + texel.x += textureGrad(s2DShadow, c3, dPdxy2, dPdxy2); + texel.x += textureGrad(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2); + texel.x += textureGrad(sCubeShadow, c4, dPdxy3, dPdxy3); + texel.x += textureGrad(sCubeShadow, f16c3, compare, f16dPdxy3, f16dPdxy3); + texel += textureGrad(s1DArray, c2, dPdxy1, dPdxy1); + texel += textureGrad(s1DArray, f16c2, f16dPdxy1, f16dPdxy1); + texel += textureGrad(s2DArray, c3, dPdxy2, dPdxy2); + texel += textureGrad(s2DArray, f16c3, f16dPdxy2, f16dPdxy2); + texel.x += textureGrad(s1DArrayShadow, c3, dPdxy1, dPdxy1); + texel.x += textureGrad(s1DArrayShadow, f16c2, compare, f16dPdxy1, f16dPdxy1); + texel.x += textureGrad(s2DArrayShadow, c4, dPdxy2, dPdxy2); + texel.x += textureGrad(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2); + texel += textureGrad(sCubeArray, c4, dPdxy3, dPdxy3); + texel += textureGrad(sCubeArray, f16c4, f16dPdxy3, f16dPdxy3); + + return texel; +} + +f16vec4 testTextureGradOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureGradOffset(s1D, c1, dPdxy1, dPdxy1, offset1); + texel += textureGradOffset(s1D, f16c1, f16dPdxy1, f16dPdxy1, offset1); + texel += textureGradOffset(s2D, c2, dPdxy2, dPdxy2, offset2); + texel += textureGradOffset(s2D, f16c2, f16dPdxy2, f16dPdxy2, offset2); + texel += textureGradOffset(s3D, c3, dPdxy3, dPdxy3, offset3); + texel += textureGradOffset(s3D, f16c3, f16dPdxy3, f16dPdxy3, offset3); + texel += textureGradOffset(s2DRect, c2, dPdxy2, dPdxy2, offset2); + texel += textureGradOffset(s2DRect, f16c2, f16dPdxy2, f16dPdxy2, offset2); + texel.x += textureGradOffset(s2DRectShadow, c3, dPdxy2, dPdxy2, offset2); + texel.x += textureGradOffset(s2DRectShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2); + texel.x += textureGradOffset(s1DShadow, c3, dPdxy1, dPdxy1, offset1); + texel.x += textureGradOffset(s1DShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, offset1); + texel.x += textureGradOffset(s2DShadow, c3, dPdxy2, dPdxy2, offset2); + texel.x += textureGradOffset(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2); + texel += textureGradOffset(s1DArray, c2, dPdxy1, dPdxy1, offset1); + texel += textureGradOffset(s1DArray, f16c2, f16dPdxy1, f16dPdxy1, offset1); + texel += textureGradOffset(s2DArray, c3, dPdxy2, dPdxy2, offset2); + texel += textureGradOffset(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, offset2); + texel.x += textureGradOffset(s1DArrayShadow, c3, dPdxy1, dPdxy1, offset1); + texel.x += textureGradOffset(s1DArrayShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, offset1); + texel.x += textureGradOffset(s2DArrayShadow, c4, dPdxy2, dPdxy2, offset2); + texel.x += textureGradOffset(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2); + + return texel; +} + +f16vec4 testTextureProjGrad() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureProjGrad(s1D, c2, dPdxy1, dPdxy1); + texel += textureProjGrad(s1D, f16c2, f16dPdxy1, f16dPdxy1); + texel += textureProjGrad(s1D, c4, dPdxy1, dPdxy1); + texel += textureProjGrad(s1D, f16c4, f16dPdxy1, f16dPdxy1); + texel += textureProjGrad(s2D, c3, dPdxy2, dPdxy2); + texel += textureProjGrad(s2D, f16c3, f16dPdxy2, f16dPdxy2); + texel += textureProjGrad(s2D, c4, dPdxy2, dPdxy2); + texel += textureProjGrad(s2D, f16c4, f16dPdxy2, f16dPdxy2); + texel += textureProjGrad(s3D, c4, dPdxy3, dPdxy3); + texel += textureProjGrad(s3D, f16c4, f16dPdxy3, f16dPdxy3); + texel += textureProjGrad(s2DRect, c3, dPdxy2, dPdxy2); + texel += textureProjGrad(s2DRect, f16c3, f16dPdxy2, f16dPdxy2); + texel += textureProjGrad(s2DRect, c4, dPdxy2, dPdxy2); + texel += textureProjGrad(s2DRect, f16c4, f16dPdxy2, f16dPdxy2); + texel.x += textureProjGrad(s2DRectShadow, c4, dPdxy2, dPdxy2); + texel.x += textureProjGrad(s2DRectShadow, f16c3, compare, f16dPdxy2, f16dPdxy2); + texel.x += textureProjGrad(s1DShadow, c4, dPdxy1, dPdxy1); + texel.x += textureProjGrad(s1DShadow, f16c3, compare, f16dPdxy1, f16dPdxy1); + texel.x += textureProjGrad(s2DShadow, c4, dPdxy2, dPdxy2); + texel.x += textureProjGrad(s2DShadow, f16c3, compare, f16dPdxy2, f16dPdxy2); + + return texel; +} + +f16vec4 testTextureProjGradoffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureProjGradOffset(s1D, c2, dPdxy1, dPdxy1, offset1); + texel += textureProjGradOffset(s1D, f16c2, f16dPdxy1, f16dPdxy1, offset1); + texel += textureProjGradOffset(s1D, c4, dPdxy1, dPdxy1, offset1); + texel += textureProjGradOffset(s1D, f16c4, f16dPdxy1, f16dPdxy1, offset1); + texel += textureProjGradOffset(s2D, c3, dPdxy2, dPdxy2, offset2); + texel += textureProjGradOffset(s2D, f16c3, f16dPdxy2, f16dPdxy2, offset2); + texel += textureProjGradOffset(s2D, c4, dPdxy2, dPdxy2, offset2); + texel += textureProjGradOffset(s2D, f16c4, f16dPdxy2, f16dPdxy2, offset2); + texel += textureProjGradOffset(s2DRect, c3, dPdxy2, dPdxy2, offset2); + texel += textureProjGradOffset(s2DRect, f16c3, f16dPdxy2, f16dPdxy2, offset2); + texel += textureProjGradOffset(s2DRect, c4, dPdxy2, dPdxy2, offset2); + texel += textureProjGradOffset(s2DRect, f16c4, f16dPdxy2, f16dPdxy2, offset2); + texel.x += textureProjGradOffset(s2DRectShadow, c4, dPdxy2, dPdxy2, offset2); + texel.x += textureProjGradOffset(s2DRectShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2); + texel += textureProjGradOffset(s3D, c4, dPdxy3, dPdxy3, offset3); + texel += textureProjGradOffset(s3D, f16c4, f16dPdxy3, f16dPdxy3, offset3); + texel.x += textureProjGradOffset(s1DShadow, c4, dPdxy1, dPdxy1, offset1); + texel.x += textureProjGradOffset(s1DShadow, f16c3, compare, f16dPdxy1, f16dPdxy1, offset1); + texel.x += textureProjGradOffset(s2DShadow, c4, dPdxy2, dPdxy2, offset2); + texel.x += textureProjGradOffset(s2DShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2); + + return texel; +} + +f16vec4 testTextureGather() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureGather(s2D, c2, 0); + texel += textureGather(s2D, f16c2, 0, f16bias); + texel += textureGather(s2DArray, c3, 0); + texel += textureGather(s2DArray, f16c3, 0, f16bias); + texel += textureGather(sCube, c3, 0); + texel += textureGather(sCube, f16c3, 0, f16bias); + texel += textureGather(sCubeArray, c4, 0); + texel += textureGather(sCubeArray, f16c4, 0, f16bias); + texel += textureGather(s2DRect, c2, 0); + texel += textureGather(s2DRect, f16c2, 0); + texel += textureGather(s2DShadow, c2, compare); + texel += textureGather(s2DShadow, f16c2, compare); + texel += textureGather(s2DArrayShadow, c3, compare); + texel += textureGather(s2DArrayShadow, f16c3, compare); + texel += textureGather(sCubeShadow, c3, compare); + texel += textureGather(sCubeShadow, f16c3, compare); + texel += textureGather(sCubeArrayShadow, c4, compare); + texel += textureGather(sCubeArrayShadow, f16c4, compare); + texel += textureGather(s2DRectShadow, c2, compare); + texel += textureGather(s2DRectShadow, f16c2, compare); + + return texel; +} + +f16vec4 testTextureGatherOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureGatherOffset(s2D, c2, offset2, 0); + texel += textureGatherOffset(s2D, f16c2, offset2, 0, f16bias); + texel += textureGatherOffset(s2DArray, c3, offset2, 0); + texel += textureGatherOffset(s2DArray, f16c3, offset2, 0, f16bias); + texel += textureGatherOffset(s2DRect, c2, offset2, 0); + texel += textureGatherOffset(s2DRect, f16c2, offset2, 0); + texel += textureGatherOffset(s2DShadow, c2, compare, offset2); + texel += textureGatherOffset(s2DShadow, f16c2, compare, offset2); + texel += textureGatherOffset(s2DArrayShadow, c3, compare, offset2); + texel += textureGatherOffset(s2DArrayShadow, f16c3, compare, offset2); + texel += textureGatherOffset(s2DRectShadow, c2, compare, offset2); + texel += textureGatherOffset(s2DRectShadow, f16c2, compare, offset2); + + return texel; +} + +f16vec4 testTextureGatherOffsets() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureGatherOffsets(s2D, c2, offsets, 0); + texel += textureGatherOffsets(s2D, f16c2, offsets, 0, f16bias); + texel += textureGatherOffsets(s2DArray, c3, offsets, 0); + texel += textureGatherOffsets(s2DArray, f16c3, offsets, 0, f16bias); + texel += textureGatherOffsets(s2DRect, c2, offsets, 0); + texel += textureGatherOffsets(s2DRect, f16c2, offsets, 0); + texel += textureGatherOffsets(s2DShadow, c2, compare, offsets); + texel += textureGatherOffsets(s2DShadow, f16c2, compare, offsets); + texel += textureGatherOffsets(s2DArrayShadow, c3, compare, offsets); + texel += textureGatherOffsets(s2DArrayShadow, f16c3, compare, offsets); + texel += textureGatherOffsets(s2DRectShadow, c2, compare, offsets); + texel += textureGatherOffsets(s2DRectShadow, f16c2, compare, offsets); + + return texel; +} + +f16vec4 testTextureGatherLod() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureGatherLodAMD(s2D, c2, lod, 0); + texel += textureGatherLodAMD(s2D, f16c2, f16lod, 0); + texel += textureGatherLodAMD(s2DArray, c3, lod, 0); + texel += textureGatherLodAMD(s2DArray, f16c3, f16lod, 0); + texel += textureGatherLodAMD(sCube, c3, lod, 0); + texel += textureGatherLodAMD(sCube, f16c3, f16lod, 0); + texel += textureGatherLodAMD(sCubeArray, c4, lod, 0); + texel += textureGatherLodAMD(sCubeArray, f16c4, f16lod, 0); + + return texel; +} + +f16vec4 testTextureGatherLodOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureGatherLodOffsetAMD(s2D, c2, lod, offset2, 0); + texel += textureGatherLodOffsetAMD(s2D, f16c2, f16lod, offset2, 0); + texel += textureGatherLodOffsetAMD(s2DArray, c3, lod, offset2, 0); + texel += textureGatherLodOffsetAMD(s2DArray, f16c3, f16lod, offset2, 0); + + return texel; +} + +f16vec4 testTextureGatherLodOffsets() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureGatherLodOffsetsAMD(s2D, c2, lod, offsets, 0); + texel += textureGatherLodOffsetsAMD(s2D, f16c2, f16lod, offsets, 0); + texel += textureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, 0); + texel += textureGatherLodOffsetsAMD(s2DArray, f16c3, f16lod, offsets, 0); + + return texel; +} + +ivec4 testTextureSize() +{ + ivec4 size = ivec4(0); + + size.x += textureSize(s1D, int(lod)); + size.xy += textureSize(s2D, int(lod)); + size.xyz += textureSize(s3D, int(lod)); + size.xy += textureSize(sCube, int(lod)); + size.x += textureSize(s1DShadow, int(lod)); + size.xy += textureSize(s2DShadow, int(lod)); + size.xy += textureSize(sCubeShadow, int(lod)); + size.xyz += textureSize(sCubeArray, int(lod)); + size.xyz += textureSize(sCubeArrayShadow, int(lod)); + size.xy += textureSize(s2DRect); + size.xy += textureSize(s2DRectShadow); + size.xy += textureSize(s1DArray, int(lod)); + size.xyz += textureSize(s2DArray, int(lod)); + size.xy += textureSize(s1DArrayShadow, int(lod)); + size.xyz += textureSize(s2DArrayShadow, int(lod)); + size.x += textureSize(sBuffer); + size.xy += textureSize(s2DMS); + size.xyz += textureSize(s2DMSArray); + + return size; +} + +vec2 testTextureQueryLod() +{ + vec2 lod = vec2(0.0); + + lod += textureQueryLod(s1D, c1); + lod += textureQueryLod(s1D, f16c1); + lod += textureQueryLod(s2D, c2); + lod += textureQueryLod(s2D, f16c2); + lod += textureQueryLod(s3D, c3); + lod += textureQueryLod(s3D, f16c3); + lod += textureQueryLod(sCube, c3); + lod += textureQueryLod(sCube, f16c3); + lod += textureQueryLod(s1DArray, c1); + lod += textureQueryLod(s1DArray, f16c1); + lod += textureQueryLod(s2DArray, c2); + lod += textureQueryLod(s2DArray, f16c2); + lod += textureQueryLod(sCubeArray, c3); + lod += textureQueryLod(sCubeArray, f16c3); + lod += textureQueryLod(s1DShadow, c1); + lod += textureQueryLod(s1DShadow, f16c1); + lod += textureQueryLod(s2DShadow, c2); + lod += textureQueryLod(s2DShadow, f16c2); + lod += textureQueryLod(sCubeArrayShadow, c3); + lod += textureQueryLod(sCubeArrayShadow, f16c3); + lod += textureQueryLod(s1DArrayShadow, c1); + lod += textureQueryLod(s1DArrayShadow, f16c1); + lod += textureQueryLod(s2DArrayShadow, c2); + lod += textureQueryLod(s2DArrayShadow, f16c2); + lod += textureQueryLod(sCubeArrayShadow, c3); + lod += textureQueryLod(sCubeArrayShadow, f16c3); + + return lod; +} + +int testTextureQueryLevels() +{ + int levels = 0; + + levels += textureQueryLevels(s1D); + levels += textureQueryLevels(s2D); + levels += textureQueryLevels(s3D); + levels += textureQueryLevels(sCube); + levels += textureQueryLevels(s1DShadow); + levels += textureQueryLevels(s2DShadow); + levels += textureQueryLevels(sCubeShadow); + levels += textureQueryLevels(sCubeArray); + levels += textureQueryLevels(sCubeArrayShadow); + levels += textureQueryLevels(s1DArray); + levels += textureQueryLevels(s2DArray); + levels += textureQueryLevels(s1DArrayShadow); + levels += textureQueryLevels(s2DArrayShadow); + + return levels; +} + +int testTextureSamples() +{ + int samples = 0; + + samples += textureSamples(s2DMS); + samples += textureSamples(s2DMSArray); + + return samples; +} + +f16vec4 testImageLoad() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += imageLoad(i1D, int(c1)); + texel += imageLoad(i2D, ivec2(c2)); + texel += imageLoad(i3D, ivec3(c3)); + texel += imageLoad(i2DRect, ivec2(c2)); + texel += imageLoad(iCube, ivec3(c3)); + texel += imageLoad(iBuffer, int(c1)); + texel += imageLoad(i1DArray, ivec2(c2)); + texel += imageLoad(i2DArray, ivec3(c3)); + texel += imageLoad(iCubeArray, ivec3(c3)); + texel += imageLoad(i2DMS, ivec2(c2), 1); + texel += imageLoad(i2DMSArray, ivec3(c3), 1); + + return texel; +} + +void testImageStore(f16vec4 data) +{ + imageStore(i1D, int(c1), data); + imageStore(i2D, ivec2(c2), data); + imageStore(i3D, ivec3(c3), data); + imageStore(i2DRect, ivec2(c2), data); + imageStore(iCube, ivec3(c3), data); + imageStore(iBuffer, int(c1), data); + imageStore(i1DArray, ivec2(c2), data); + imageStore(i2DArray, ivec3(c3), data); + imageStore(iCubeArray, ivec3(c3), data); + imageStore(i2DMS, ivec2(c2), 1, data); + imageStore(i2DMSArray, ivec3(c3), 1, data); +} + +f16vec4 testSparseTexture() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureARB(s2D, c2, texel); + sparseTextureARB(s2D, f16c2, texel, f16bias); + sparseTextureARB(s3D, c3, texel); + sparseTextureARB(s3D, f16c3, texel, f16bias); + sparseTextureARB(sCube, c3, texel); + sparseTextureARB(sCube, f16c3, texel, f16bias); + sparseTextureARB(s2DShadow, c3, texel.x); + sparseTextureARB(s2DShadow, f16c2, compare, texel.x, f16bias); + sparseTextureARB(sCubeShadow, c4, texel.x); + sparseTextureARB(sCubeShadow, f16c3, compare, texel.x, f16bias); + sparseTextureARB(s2DArray, c3, texel); + sparseTextureARB(s2DArray, f16c3, texel, f16bias); + sparseTextureARB(sCubeArray, c4, texel); + sparseTextureARB(sCubeArray, f16c4, texel, f16bias); + sparseTextureARB(s2DArrayShadow, c4, texel.x); + sparseTextureARB(s2DArrayShadow, f16c3, compare, texel.x); + sparseTextureARB(s2DRect, c2, texel); + sparseTextureARB(s2DRect, f16c2, texel); + sparseTextureARB(s2DRectShadow, c3, texel.x); + sparseTextureARB(s2DRectShadow, f16c2, compare, texel.x); + sparseTextureARB(sCubeArrayShadow, c4, compare, texel.x); + sparseTextureARB(sCubeArrayShadow, f16c4, compare, texel.x); + + return texel; +} + +f16vec4 testSparseTextureLod() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureLodARB(s2D, c2, lod, texel); + sparseTextureLodARB(s2D, f16c2, f16lod, texel); + sparseTextureLodARB(s3D, c3, lod, texel); + sparseTextureLodARB(s3D, f16c3, f16lod, texel); + sparseTextureLodARB(sCube, c3, lod, texel); + sparseTextureLodARB(sCube, f16c3, f16lod, texel); + sparseTextureLodARB(s2DShadow, c3, lod, texel.x); + sparseTextureLodARB(s2DShadow, f16c2, compare, f16lod, texel.x); + sparseTextureLodARB(s2DArray, c3, lod, texel); + sparseTextureLodARB(s2DArray, f16c3, f16lod, texel); + sparseTextureLodARB(sCubeArray, c4, lod, texel); + sparseTextureLodARB(sCubeArray, f16c4, f16lod, texel); + + return texel; +} + +f16vec4 testSparseTextureOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureOffsetARB(s2D, c2, offset2, texel); + sparseTextureOffsetARB(s2D, f16c2, offset2, texel, f16bias); + sparseTextureOffsetARB(s3D, c3, offset3, texel); + sparseTextureOffsetARB(s3D, f16c3, offset3, texel, f16bias); + sparseTextureOffsetARB(s2DRect, c2, offset2, texel); + sparseTextureOffsetARB(s2DRect, f16c2, offset2, texel); + sparseTextureOffsetARB(s2DRectShadow, c3, offset2, texel.x); + sparseTextureOffsetARB(s2DRectShadow, f16c2, compare, offset2, texel.x); + sparseTextureOffsetARB(s2DShadow, c3, offset2, texel.x); + sparseTextureOffsetARB(s2DShadow, f16c2, compare, offset2, texel.x, f16bias); + sparseTextureOffsetARB(s2DArray, c3, offset2, texel); + sparseTextureOffsetARB(s2DArray, f16c3, offset2, texel, f16bias); + sparseTextureOffsetARB(s2DArrayShadow, c4, offset2, texel.x); + sparseTextureOffsetARB(s2DArrayShadow, f16c3, compare, offset2, texel.x); + + return texel; +} + +f16vec4 testSparseTextureLodOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureLodOffsetARB(s2D, c2, lod, offset2, texel); + sparseTextureLodOffsetARB(s2D, f16c2, f16lod, offset2, texel); + sparseTextureLodOffsetARB(s3D, c3, lod, offset3, texel); + sparseTextureLodOffsetARB(s3D, f16c3, f16lod, offset3, texel); + sparseTextureLodOffsetARB(s2DShadow, c3, lod, offset2, texel.x); + sparseTextureLodOffsetARB(s2DShadow, f16c2, compare, f16lod, offset2, texel.x); + sparseTextureLodOffsetARB(s2DArray, c3, lod, offset2, texel); + sparseTextureLodOffsetARB(s2DArray, f16c3, f16lod, offset2, texel); + + return texel; +} + +f16vec4 testSparseTextureGrad() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureGradARB(s2D, c2, dPdxy2, dPdxy2, texel); + sparseTextureGradARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, texel); + sparseTextureGradARB(s3D, c3, dPdxy3, dPdxy3, texel); + sparseTextureGradARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, texel); + sparseTextureGradARB(sCube, c3, dPdxy3, dPdxy3, texel); + sparseTextureGradARB(sCube, f16c3, f16dPdxy3, f16dPdxy3, texel); + sparseTextureGradARB(s2DRect, c2, dPdxy2, dPdxy2, texel); + sparseTextureGradARB(s2DRect, f16c2, f16dPdxy2, f16dPdxy2, texel); + sparseTextureGradARB(s2DRectShadow, c3, dPdxy2, dPdxy2, texel.x); + sparseTextureGradARB(s2DRectShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, texel.x); + sparseTextureGradARB(s2DShadow, c3, dPdxy2, dPdxy2, texel.x); + sparseTextureGradARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, texel.x); + sparseTextureGradARB(sCubeShadow, c4, dPdxy3, dPdxy3, texel.x); + sparseTextureGradARB(sCubeShadow, f16c3, compare, f16dPdxy3, f16dPdxy3, texel.x); + sparseTextureGradARB(s2DArray, c3, dPdxy2, dPdxy2, texel); + sparseTextureGradARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, texel); + sparseTextureGradARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, texel.x); + sparseTextureGradARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, texel.x); + sparseTextureGradARB(sCubeArray, c4, dPdxy3, dPdxy3, texel); + sparseTextureGradARB(sCubeArray, f16c4, f16dPdxy3, f16dPdxy3, texel); + + return texel; +} + +f16vec4 testSparseTextureGradOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureGradOffsetARB(s2D, c2, dPdxy2, dPdxy2, offset2, texel); + sparseTextureGradOffsetARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, offset2, texel); + sparseTextureGradOffsetARB(s3D, c3, dPdxy3, dPdxy3, offset3, texel); + sparseTextureGradOffsetARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, offset3, texel); + sparseTextureGradOffsetARB(s2DRect, c2, dPdxy2, dPdxy2, offset2, texel); + sparseTextureGradOffsetARB(s2DRect, f16c2, f16dPdxy2, f16dPdxy2, offset2, texel); + sparseTextureGradOffsetARB(s2DRectShadow, c3, dPdxy2, dPdxy2, offset2, texel.x); + sparseTextureGradOffsetARB(s2DRectShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2, texel.x); + sparseTextureGradOffsetARB(s2DShadow, c3, dPdxy2, dPdxy2, offset2, texel.x); + sparseTextureGradOffsetARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2, texel.x); + sparseTextureGradOffsetARB(s2DArray, c3, dPdxy2, dPdxy2, offset2, texel); + sparseTextureGradOffsetARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, offset2, texel); + sparseTextureGradOffsetARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, offset2, texel.x); + sparseTextureGradOffsetARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2, texel.x); + + return texel; +} + +f16vec4 testSparseTexelFetch() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTexelFetchARB(s2D, ivec2(c2), int(lod), texel); + sparseTexelFetchARB(s3D, ivec3(c3), int(lod), texel); + sparseTexelFetchARB(s2DRect, ivec2(c2), texel); + sparseTexelFetchARB(s2DArray, ivec3(c3), int(lod), texel); + sparseTexelFetchARB(s2DMS, ivec2(c2), 1, texel); + sparseTexelFetchARB(s2DMSArray, ivec3(c3), 2, texel); + + return texel; +} + +f16vec4 testSparseTexelFetchOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTexelFetchOffsetARB(s2D, ivec2(c2), int(lod), offset2, texel); + sparseTexelFetchOffsetARB(s3D, ivec3(c3), int(lod), offset3, texel); + sparseTexelFetchOffsetARB(s2DRect, ivec2(c2), offset2, texel); + sparseTexelFetchOffsetARB(s2DArray, ivec3(c3), int(lod), offset2, texel); + + return texel; +} + +f16vec4 testSparseTextureGather() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureGatherARB(s2D, c2, texel, 0); + sparseTextureGatherARB(s2D, f16c2, texel, 0, f16bias); + sparseTextureGatherARB(s2DArray, c3, texel, 0); + sparseTextureGatherARB(s2DArray, f16c3, texel, 0, f16bias); + sparseTextureGatherARB(sCube, c3, texel, 0); + sparseTextureGatherARB(sCube, f16c3, texel, 0, f16bias); + sparseTextureGatherARB(sCubeArray, c4, texel, 0); + sparseTextureGatherARB(sCubeArray, f16c4, texel, 0, f16bias); + sparseTextureGatherARB(s2DRect, c2, texel, 0); + sparseTextureGatherARB(s2DRect, f16c2, texel, 0); + sparseTextureGatherARB(s2DShadow, c2, compare, texel); + sparseTextureGatherARB(s2DShadow, f16c2, compare, texel); + sparseTextureGatherARB(s2DArrayShadow, c3, compare, texel); + sparseTextureGatherARB(s2DArrayShadow, f16c3, compare, texel); + sparseTextureGatherARB(sCubeShadow, c3, compare, texel); + sparseTextureGatherARB(sCubeShadow, f16c3, compare, texel); + sparseTextureGatherARB(sCubeArrayShadow, c4, compare, texel); + sparseTextureGatherARB(sCubeArrayShadow, f16c4, compare, texel); + sparseTextureGatherARB(s2DRectShadow, c2, compare, texel); + sparseTextureGatherARB(s2DRectShadow, f16c2, compare, texel); + + return texel; +} + +f16vec4 testSparseTextureGatherOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureGatherOffsetARB(s2D, c2, offset2, texel, 0); + sparseTextureGatherOffsetARB(s2D, f16c2, offset2, texel, 0, f16bias); + sparseTextureGatherOffsetARB(s2DArray, c3, offset2, texel, 0); + sparseTextureGatherOffsetARB(s2DArray, f16c3, offset2, texel, 0, f16bias); + sparseTextureGatherOffsetARB(s2DRect, c2, offset2, texel, 0); + sparseTextureGatherOffsetARB(s2DRect, f16c2, offset2, texel, 0); + sparseTextureGatherOffsetARB(s2DShadow, c2, compare, offset2, texel); + sparseTextureGatherOffsetARB(s2DShadow, f16c2, compare, offset2, texel); + sparseTextureGatherOffsetARB(s2DArrayShadow, c3, compare, offset2, texel); + sparseTextureGatherOffsetARB(s2DArrayShadow, f16c3, compare, offset2, texel); + sparseTextureGatherOffsetARB(s2DRectShadow, c2, compare, offset2, texel); + sparseTextureGatherOffsetARB(s2DRectShadow, f16c2, compare, offset2, texel); + + return texel; +} + +f16vec4 testSparseTextureGatherOffsets() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureGatherOffsetsARB(s2D, c2, offsets, texel, 0); + sparseTextureGatherOffsetsARB(s2D, f16c2, offsets, texel, 0, f16bias); + sparseTextureGatherOffsetsARB(s2DArray, c3, offsets, texel, 0); + sparseTextureGatherOffsetsARB(s2DArray, f16c3, offsets, texel, 0, f16bias); + sparseTextureGatherOffsetsARB(s2DRect, c2, offsets, texel, 0); + sparseTextureGatherOffsetsARB(s2DRect, f16c2, offsets, texel, 0); + sparseTextureGatherOffsetsARB(s2DShadow, c2, compare, offsets, texel); + sparseTextureGatherOffsetsARB(s2DShadow, f16c2, compare, offsets, texel); + sparseTextureGatherOffsetsARB(s2DArrayShadow, c3, compare, offsets, texel); + sparseTextureGatherOffsetsARB(s2DArrayShadow, f16c3, compare, offsets, texel); + sparseTextureGatherOffsetsARB(s2DRectShadow, c2, compare, offsets, texel); + sparseTextureGatherOffsetsARB(s2DRectShadow, f16c2, compare, offsets, texel); + + return texel; +} + +f16vec4 testSparseTextureGatherLod() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureGatherLodAMD(s2D, c2, lod, texel, 0); + sparseTextureGatherLodAMD(s2D, f16c2, f16lod, texel, 0); + sparseTextureGatherLodAMD(s2DArray, c3, lod, texel, 0); + sparseTextureGatherLodAMD(s2DArray, f16c3, f16lod, texel, 0); + sparseTextureGatherLodAMD(sCube, c3, lod, texel, 0); + sparseTextureGatherLodAMD(sCube, f16c3, f16lod, texel, 0); + sparseTextureGatherLodAMD(sCubeArray, c4, lod, texel, 0); + sparseTextureGatherLodAMD(sCubeArray, f16c4, f16lod, texel, 0); + + return texel; +} + +f16vec4 testSparseTextureGatherLodOffset() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureGatherLodOffsetAMD(s2D, c2, lod, offset2, texel, 0); + sparseTextureGatherLodOffsetAMD(s2D, f16c2, f16lod, offset2, texel, 0); + sparseTextureGatherLodOffsetAMD(s2DArray, c3, lod, offset2, texel, 0); + sparseTextureGatherLodOffsetAMD(s2DArray, f16c3, f16lod, offset2, texel, 0); + + return texel; +} + +f16vec4 testSparseTextureGatherLodOffsets() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureGatherLodOffsetsAMD(s2D, c2, lod, offsets, texel, 0); + sparseTextureGatherLodOffsetsAMD(s2D, f16c2, f16lod, offsets, texel, 0); + sparseTextureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, texel, 0); + sparseTextureGatherLodOffsetsAMD(s2DArray, f16c3, f16lod, offsets, texel, 0); + + return texel; +} + +f16vec4 testSparseImageLoad() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseImageLoadARB(i2D, ivec2(c2), texel); + sparseImageLoadARB(i3D, ivec3(c3), texel); + sparseImageLoadARB(i2DRect, ivec2(c2), texel); + sparseImageLoadARB(iCube, ivec3(c3), texel); + sparseImageLoadARB(i2DArray, ivec3(c3), texel); + sparseImageLoadARB(iCubeArray, ivec3(c3), texel); + sparseImageLoadARB(i2DMS, ivec2(c2), 1, texel); + sparseImageLoadARB(i2DMSArray, ivec3(c3), 2, texel); + + return texel; +} + +f16vec4 testSparseTextureClamp() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureClampARB(s2D, c2, lodClamp, texel); + sparseTextureClampARB(s2D, f16c2, f16lodClamp, texel, f16bias); + sparseTextureClampARB(s3D, c3, lodClamp, texel); + sparseTextureClampARB(s3D, f16c3, f16lodClamp, texel, f16bias); + sparseTextureClampARB(sCube, c3, lodClamp, texel); + sparseTextureClampARB(sCube, f16c3, f16lodClamp, texel, f16bias); + sparseTextureClampARB(s2DShadow, c3, lodClamp, texel.x); + sparseTextureClampARB(s2DShadow, f16c2, compare, f16lodClamp, texel.x, f16bias); + sparseTextureClampARB(sCubeShadow, c4, lodClamp, texel.x); + sparseTextureClampARB(sCubeShadow, f16c3, compare, f16lodClamp, texel.x, f16bias); + sparseTextureClampARB(s2DArray, c3, lodClamp, texel); + sparseTextureClampARB(s2DArray, f16c3, f16lodClamp, texel, f16bias); + sparseTextureClampARB(sCubeArray, c4, lodClamp, texel); + sparseTextureClampARB(sCubeArray, f16c4, f16lodClamp, texel, f16bias); + sparseTextureClampARB(s2DArrayShadow, c4, lodClamp, texel.x); + sparseTextureClampARB(s2DArrayShadow, f16c3, compare, f16lodClamp, texel.x); + sparseTextureClampARB(sCubeArrayShadow, c4, compare, lodClamp, texel.x); + sparseTextureClampARB(sCubeArrayShadow, f16c4, compare, f16lodClamp, texel.x); + + return texel; +} + +f16vec4 testTextureClamp() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureClampARB(s1D, c1, lodClamp); + texel += textureClampARB(s1D, f16c1, f16lodClamp, f16bias); + texel += textureClampARB(s2D, c2, lodClamp); + texel += textureClampARB(s2D, f16c2, f16lodClamp, f16bias); + texel += textureClampARB(s3D, c3, lodClamp); + texel += textureClampARB(s3D, f16c3, f16lodClamp, f16bias); + texel += textureClampARB(sCube, c3, lodClamp); + texel += textureClampARB(sCube, f16c3, f16lodClamp, f16bias); + texel.x += textureClampARB(s1DShadow, c3, lodClamp); + texel.x += textureClampARB(s1DShadow, f16c2, compare, f16lodClamp, f16bias); + texel.x += textureClampARB(s2DShadow, c3, lodClamp); + texel.x += textureClampARB(s2DShadow, f16c2, compare, f16lodClamp, f16bias); + texel.x += textureClampARB(sCubeShadow, c4, lodClamp); + texel.x += textureClampARB(sCubeShadow, f16c3, compare, f16lodClamp, f16bias); + texel += textureClampARB(s1DArray, c2, lodClamp); + texel += textureClampARB(s1DArray, f16c2, f16lodClamp, f16bias); + texel += textureClampARB(s2DArray, c3, lodClamp); + texel += textureClampARB(s2DArray, f16c3, f16lodClamp, f16bias); + texel += textureClampARB(sCubeArray, c4, lodClamp); + texel += textureClampARB(sCubeArray, f16c4, f16lodClamp, f16bias); + texel.x += textureClampARB(s1DArrayShadow, c3, lodClamp); + texel.x += textureClampARB(s1DArrayShadow, f16c2, compare, f16lodClamp, f16bias); + texel.x += textureClampARB(s2DArrayShadow, c4, lodClamp); + texel.x += textureClampARB(s2DArrayShadow, f16c3, compare, f16lodClamp); + texel.x += textureClampARB(sCubeArrayShadow, c4, compare, lodClamp); + texel.x += textureClampARB(sCubeArrayShadow, f16c4, compare, f16lodClamp); + + return texel; +} + +f16vec4 testSparseTextureOffsetClamp() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureOffsetClampARB(s2D, c2, offset2, lodClamp, texel); + sparseTextureOffsetClampARB(s2D, f16c2, offset2, f16lodClamp, texel, f16bias); + sparseTextureOffsetClampARB(s3D, c3, offset3, lodClamp, texel); + sparseTextureOffsetClampARB(s3D, f16c3, offset3, f16lodClamp, texel, f16bias); + sparseTextureOffsetClampARB(s2DShadow, c3, offset2, lodClamp, texel.x); + sparseTextureOffsetClampARB(s2DShadow, f16c2, compare, offset2, f16lodClamp, texel.x, f16bias); + sparseTextureOffsetClampARB(s2DArray, c3, offset2, lodClamp, texel); + sparseTextureOffsetClampARB(s2DArray, f16c3, offset2, f16lodClamp, texel, f16bias); + sparseTextureOffsetClampARB(s2DArrayShadow, c4, offset2, lodClamp, texel.x); + sparseTextureOffsetClampARB(s2DArrayShadow, f16c3, compare, offset2, f16lodClamp, texel.x); + + return texel; +} + +f16vec4 testTextureOffsetClamp() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureOffsetClampARB(s1D, c1, offset1, lodClamp); + texel += textureOffsetClampARB(s1D, f16c1, offset1, f16lodClamp, f16bias); + texel += textureOffsetClampARB(s2D, c2, offset2, lodClamp); + texel += textureOffsetClampARB(s2D, f16c2, offset2, f16lodClamp, f16bias); + texel += textureOffsetClampARB(s3D, c3, offset3, lodClamp); + texel += textureOffsetClampARB(s3D, f16c3, offset3, f16lodClamp, f16bias); + texel.x += textureOffsetClampARB(s1DShadow, c3, offset1, lodClamp); + texel.x += textureOffsetClampARB(s1DShadow, f16c2, compare, offset1, f16lodClamp, f16bias); + texel.x += textureOffsetClampARB(s2DShadow, c3, offset2, lodClamp); + texel.x += textureOffsetClampARB(s2DShadow, f16c2, compare, offset2, f16lodClamp, f16bias); + texel += textureOffsetClampARB(s1DArray, c2, offset1, lodClamp); + texel += textureOffsetClampARB(s1DArray, f16c2, offset1, f16lodClamp, f16bias); + texel += textureOffsetClampARB(s2DArray, c3, offset2, lodClamp); + texel += textureOffsetClampARB(s2DArray, f16c3, offset2, f16lodClamp, f16bias); + texel.x += textureOffsetClampARB(s1DArrayShadow, c3, offset1, lodClamp); + texel.x += textureOffsetClampARB(s1DArrayShadow, f16c2, compare, offset1, f16lodClamp, f16bias); + texel.x += textureOffsetClampARB(s2DArrayShadow, c4, offset2, lodClamp); + texel.x += textureOffsetClampARB(s2DArrayShadow, f16c3, compare, offset2, f16lodClamp); + + return texel; +} + +f16vec4 testSparseTextureGradClamp() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureGradClampARB(s2D, c2, dPdxy2, dPdxy2, lodClamp, texel); + sparseTextureGradClampARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, f16lodClamp, texel); + sparseTextureGradClampARB(s3D, c3, dPdxy3, dPdxy3, lodClamp, texel); + sparseTextureGradClampARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, f16lodClamp, texel); + sparseTextureGradClampARB(sCube, c3, dPdxy3, dPdxy3, lodClamp, texel); + sparseTextureGradClampARB(sCube, f16c3, f16dPdxy3, f16dPdxy3, f16lodClamp, texel); + sparseTextureGradClampARB(s2DShadow, c3, dPdxy2, dPdxy2, lodClamp, texel.x); + sparseTextureGradClampARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, f16lodClamp, texel.x); + sparseTextureGradClampARB(sCubeShadow, c4, dPdxy3, dPdxy3, lodClamp, texel.x); + sparseTextureGradClampARB(sCubeShadow, f16c3, compare, f16dPdxy3, f16dPdxy3, f16lodClamp, texel.x); + sparseTextureGradClampARB(s2DArray, c3, dPdxy2, dPdxy2, lodClamp, texel); + sparseTextureGradClampARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, f16lodClamp, texel); + sparseTextureGradClampARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, lodClamp, texel.x); + sparseTextureGradClampARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, f16lodClamp, texel.x); + sparseTextureGradClampARB(sCubeArray, c4, dPdxy3, dPdxy3, lodClamp, texel); + sparseTextureGradClampARB(sCubeArray, f16c4, f16dPdxy3, f16dPdxy3, f16lodClamp, texel); + + return texel; +} + +f16vec4 testTextureGradClamp() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureGradClampARB(s1D, c1, dPdxy1, dPdxy1, lodClamp); + texel += textureGradClampARB(s1D, f16c1, f16dPdxy1, f16dPdxy1, f16lodClamp); + texel += textureGradClampARB(s2D, c2, dPdxy2, dPdxy2, lodClamp); + texel += textureGradClampARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, f16lodClamp); + texel += textureGradClampARB(s3D, c3, dPdxy3, dPdxy3, lodClamp); + texel += textureGradClampARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, f16lodClamp); + texel += textureGradClampARB(sCube, c3, dPdxy3, dPdxy3, lodClamp); + texel += textureGradClampARB(sCube, f16c3, f16dPdxy3, f16dPdxy3, f16lodClamp); + texel.x += textureGradClampARB(s1DShadow, c3, dPdxy1, dPdxy1, lodClamp); + texel.x += textureGradClampARB(s1DShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, f16lodClamp); + texel.x += textureGradClampARB(s2DShadow, c3, dPdxy2, dPdxy2, lodClamp); + texel.x += textureGradClampARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, f16lodClamp); + texel.x += textureGradClampARB(sCubeShadow, c4, dPdxy3, dPdxy3, lodClamp); + texel.x += textureGradClampARB(sCubeShadow, f16c3, compare, f16dPdxy3, f16dPdxy3, f16lodClamp); + texel += textureGradClampARB(s1DArray, c2, dPdxy1, dPdxy1, lodClamp); + texel += textureGradClampARB(s1DArray, f16c2, f16dPdxy1, f16dPdxy1, f16lodClamp); + texel += textureGradClampARB(s2DArray, c3, dPdxy2, dPdxy2, lodClamp); + texel += textureGradClampARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, f16lodClamp); + texel.x += textureGradClampARB(s1DArrayShadow, c3, dPdxy1, dPdxy1, lodClamp); + texel.x += textureGradClampARB(s1DArrayShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, f16lodClamp); + texel.x += textureGradClampARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, lodClamp); + texel.x += textureGradClampARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, f16lodClamp); + texel += textureGradClampARB(sCubeArray, c4, dPdxy3, dPdxy3, lodClamp); + texel += textureGradClampARB(sCubeArray, f16c4, f16dPdxy3, f16dPdxy3, f16lodClamp); + + return texel; +} + +f16vec4 testSparseTextureGradOffsetClamp() +{ + f16vec4 texel = f16vec4(0.0hf); + + sparseTextureGradOffsetClampARB(s2D, c2, dPdxy2, dPdxy2, offset2, lodClamp, texel); + sparseTextureGradOffsetClampARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp, texel); + sparseTextureGradOffsetClampARB(s3D, c3, dPdxy3, dPdxy3, offset3, lodClamp, texel); + sparseTextureGradOffsetClampARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, offset3, f16lodClamp, texel); + sparseTextureGradOffsetClampARB(s2DShadow, c3, dPdxy2, dPdxy2, offset2, lodClamp, texel.x); + sparseTextureGradOffsetClampARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp, texel.x); + sparseTextureGradOffsetClampARB(s2DArray, c3, dPdxy2, dPdxy2, offset2, lodClamp, texel); + sparseTextureGradOffsetClampARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp, texel); + sparseTextureGradOffsetClampARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, offset2, lodClamp, texel.x); + sparseTextureGradOffsetClampARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp, texel.x); + + return texel; +} + +f16vec4 testTextureGradOffsetClamp() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += textureGradOffsetClampARB(s1D, c1, dPdxy1, dPdxy1, offset1, lodClamp); + texel += textureGradOffsetClampARB(s1D, f16c1, f16dPdxy1, f16dPdxy1, offset1, f16lodClamp); + texel += textureGradOffsetClampARB(s2D, c2, dPdxy2, dPdxy2, offset2, lodClamp); + texel += textureGradOffsetClampARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp); + texel += textureGradOffsetClampARB(s3D, c3, dPdxy3, dPdxy3, offset3, lodClamp); + texel += textureGradOffsetClampARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, offset3, f16lodClamp); + texel.x += textureGradOffsetClampARB(s1DShadow, c3, dPdxy1, dPdxy1, offset1, lodClamp); + texel.x += textureGradOffsetClampARB(s1DShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, offset1, f16lodClamp); + texel.x += textureGradOffsetClampARB(s2DShadow, c3, dPdxy2, dPdxy2, offset2, lodClamp); + texel.x += textureGradOffsetClampARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp); + texel += textureGradOffsetClampARB(s1DArray, c2, dPdxy1, dPdxy1, offset1, lodClamp); + texel += textureGradOffsetClampARB(s1DArray, f16c2, f16dPdxy1, f16dPdxy1, offset1, f16lodClamp); + texel += textureGradOffsetClampARB(s2DArray, c3, dPdxy2, dPdxy2, offset2, lodClamp); + texel += textureGradOffsetClampARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp); + texel.x += textureGradOffsetClampARB(s1DArrayShadow, c3, dPdxy1, dPdxy1, offset1, lodClamp); + texel.x += textureGradOffsetClampARB(s1DArrayShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, offset1, f16lodClamp); + texel.x += textureGradOffsetClampARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, offset2, lodClamp); + texel.x += textureGradOffsetClampARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp); + + return texel; +} + +f16vec4 testCombinedTextureSampler() +{ + f16vec4 texel = f16vec4(0.0hf); + + texel += texture(f16sampler1D(t1D, s), c1); + texel += texture(f16sampler1D(t1D, s), f16c1, f16bias); + texel += texture(f16sampler2D(t2D, s), c2); + texel += texture(f16sampler2D(t2D, s), f16c2, f16bias); + texel += texture(f16sampler3D(t3D, s), c3); + texel += texture(f16sampler3D(t3D, s), f16c3, f16bias); + texel += texture(f16samplerCube(tCube, s), c3); + texel += texture(f16samplerCube(tCube, s), f16c3, f16bias); + texel.x += texture(f16sampler1DShadow(t1D, sShadow), c3); + texel.x += texture(f16sampler1DShadow(t1D, sShadow), f16c2, compare, f16bias); + texel.x += texture(f16sampler2DShadow(t2D, sShadow), c3); + texel.x += texture(f16sampler2DShadow(t2D, sShadow), f16c2, compare, f16bias); + texel.x += texture(f16samplerCubeShadow(tCube, sShadow), c4); + texel.x += texture(f16samplerCubeShadow(tCube, sShadow), f16c3, compare, f16bias); + texel += texture(f16sampler1DArray(t1DArray, s), c2); + texel += texture(f16sampler1DArray(t1DArray, s), f16c2, f16bias); + texel += texture(f16sampler2DArray(t2DArray, s), c3); + texel += texture(f16sampler2DArray(t2DArray, s), f16c3, f16bias); + texel += texture(f16samplerCubeArray(tCubeArray, s), c4); + texel += texture(f16samplerCubeArray(tCubeArray, s), f16c4, f16bias); + texel.x += texture(f16sampler1DArrayShadow(t1DArray, sShadow), c3); + texel.x += texture(f16sampler1DArrayShadow(t1DArray, sShadow), f16c2, compare, f16bias); + texel.x += texture(f16sampler2DArrayShadow(t2DArray, sShadow), c4); + texel.x += texture(f16sampler2DArrayShadow(t2DArray, sShadow), f16c3, compare); + texel += texture(f16sampler2DRect(t2DRect, s), c2); + texel += texture(f16sampler2DRect(t2DRect, s), f16c2); + texel.x += texture(f16sampler2DRectShadow(t2DRect, sShadow), c3); + texel.x += texture(f16sampler2DRectShadow(t2DRect, sShadow), f16c2, compare); + texel.x += texture(f16samplerCubeArrayShadow(tCubeArray, sShadow), c4, compare); + texel.x += texture(f16samplerCubeArrayShadow(tCubeArray, sShadow), f16c4, compare); + + return texel; +} + +f16vec4 testSubpassLoad() +{ + return subpassLoad(subpass) + subpassLoad(subpassMS, 2); +} + +void main() +{ + f16vec4 result = f16vec4(0.0hf); + + result += testTexture(); + result += testTextureProj(); + result += testTextureLod(); + result += testTextureOffset(); + result += testTextureLodOffset(); + result += testTextureProjLodOffset(); + result += testTexelFetch(); + result += testTexelFetchOffset(); + result += testTextureGrad(); + result += testTextureGradOffset(); + result += testTextureProjGrad(); + result += testTextureProjGradoffset(); + result += testTextureGather(); + result += testTextureGatherOffset(); + result += testTextureGatherOffsets(); + result += testTextureGatherLod(); + result += testTextureGatherLodOffset(); + result += testTextureGatherLodOffsets(); + + result += f16vec4(testTextureSize()); + result.xy += f16vec2(testTextureQueryLod()); + result.x += float16_t(testTextureQueryLevels()); + result.x += float16_t(testTextureSamples()); + + result += testImageLoad(); + testImageStore(result); + + result += testSparseTexture(); + result += testSparseTextureLod(); + result += testSparseTextureOffset(); + result += testSparseTextureLodOffset(); + result += testSparseTextureGrad(); + result += testSparseTextureGradOffset(); + result += testSparseTexelFetch(); + result += testSparseTexelFetchOffset(); + result += testSparseTextureGather(); + result += testSparseTextureGatherOffset(); + result += testSparseTextureGatherOffsets(); + result += testSparseTextureGatherLod(); + result += testSparseTextureGatherLodOffset(); + result += testSparseTextureGatherLodOffsets(); + + result += testSparseImageLoad(); + + result += testSparseTextureClamp(); + result += testTextureClamp(); + result += testSparseTextureOffsetClamp(); + result += testTextureOffsetClamp(); + result += testSparseTextureGrad(); + result += testTextureGrad(); + result += testSparseTextureGradOffsetClamp(); + result += testTextureGradOffsetClamp(); + + result += testCombinedTextureSampler(); + result += testSubpassLoad(); + + fragColor = result; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.float16.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.float16.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.float16.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.float16.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,306 +1,306 @@ -#version 450 core - -#extension GL_AMD_gpu_shader_half_float: enable -#extension GL_ARB_gpu_shader_int64: enable - -void main() -{ -} - -// Half float literals -void literal() -{ - const float16_t f16c = 0.000001hf; - const f16vec2 f16cv = f16vec2(-0.25HF, 0.03HF); - - f16vec2 f16v; - f16v.x = f16c; - f16v += f16cv; -} - -// Block memory layout -struct S -{ - float16_t x; // rule 1: align = 2, takes offsets 0-1 - f16vec2 y; // rule 2: align = 4, takes offsets 4-7 - f16vec3 z; // rule 3: align = 8, takes offsets 8-13 -}; - -layout(column_major, std140) uniform B1 -{ - float16_t a; // rule 1: align = 2, takes offsets 0-1 - f16vec2 b; // rule 2: align = 4, takes offsets 4-7 - f16vec3 c; // rule 3: align = 8, takes offsets 8-15 - float16_t d[2]; // rule 4: align = 16, array stride = 16, - // takes offsets 16-47 - f16mat2x3 e; // rule 5: align = 16, matrix stride = 16, - // takes offsets 48-79 - f16mat2x3 f[2]; // rule 6: align = 16, matrix stride = 16, - // array stride = 32, f[0] takes - // offsets 80-111, f[1] takes offsets - // 112-143 - S g; // rule 9: align = 16, g.x takes offsets - // 144-145, g.y takes offsets 148-151, - // g.z takes offsets 152-159 - S h[2]; // rule 10: align = 16, array stride = 16, h[0] - // takes offsets 160-175, h[1] takes - // offsets 176-191 -}; - -layout(row_major, std430) buffer B2 -{ - float16_t o; // rule 1: align = 2, takes offsets 0-1 - f16vec2 p; // rule 2: align = 4, takes offsets 4-7 - f16vec3 q; // rule 3: align = 8, takes offsets 8-13 - float16_t r[2]; // rule 4: align = 2, array stride = 2, takes - // offsets 14-17 - f16mat2x3 s; // rule 7: align = 4, matrix stride = 4, takes - // offsets 20-31 - f16mat2x3 t[2]; // rule 8: align = 4, matrix stride = 4, array - // stride = 12, t[0] takes offsets - // 32-43, t[1] takes offsets 44-55 - S u; // rule 9: align = 8, u.x takes offsets - // 56-57, u.y takes offsets 60-63, u.z - // takes offsets 64-69 - S v[2]; // rule 10: align = 8, array stride = 16, v[0] - // takes offsets 72-87, v[1] takes - // offsets 88-103 -}; - -// Specialization constant -layout(constant_id = 100) const float16_t sf16 = 0.125hf; -layout(constant_id = 101) const float sf = 0.25; -layout(constant_id = 102) const double sd = 0.5lf; - -const float f16_to_f = float(sf16); -const double f16_to_d = float(sf16); - -const float16_t f_to_f16 = float16_t(sf); -const float16_t d_to_f16 = float16_t(sd); - -void operators() -{ - float16_t f16; - f16vec2 f16v; - f16mat2x2 f16m; - bool b; - - // Arithmetic - f16v += f16v; - f16v -= f16v; - f16v *= f16v; - f16v /= f16v; - f16v++; - f16v--; - ++f16m; - --f16m; - f16v = -f16v; - f16m = -f16m; - - f16 = f16v.x + f16v.y; - f16 = f16v.x - f16v.y; - f16 = f16v.x * f16v.y; - f16 = f16v.x / f16v.y; - - // Relational - b = (f16v.x != f16); - b = (f16v.y == f16); - b = (f16v.x > f16); - b = (f16v.y < f16); - b = (f16v.x >= f16); - b = (f16v.y <= f16); - - // Vector/matrix operations - f16v = f16v * f16; - f16m = f16m * f16; - f16v = f16m * f16v; - f16v = f16v * f16m; - f16m = f16m * f16m; -} - -void typeCast() -{ - bvec3 bv; - vec3 fv; - dvec3 dv; - ivec3 iv; - uvec3 uv; - i64vec3 i64v; - u64vec3 u64v; - - f16vec3 f16v; - - f16v = f16vec3(bv); // bool -> float16 - bv = bvec3(f16v); // float16 -> bool - - f16v = f16vec3(fv); // float -> float16 - fv = vec3(f16v); // float16 -> float - - f16v = f16vec3(dv); // double -> float16 - dv = dvec3(dv); // float16 -> double - - f16v = f16vec3(iv); // int -> float16 - iv = ivec3(f16v); // float16 -> int - - f16v = f16vec3(uv); // uint -> float16 - uv = uvec3(f16v); // float16 -> uint - - f16v = f16vec3(i64v); // int64 -> float16 - i64v = i64vec3(f16v); // float16 -> int64 - - f16v = f16vec3(u64v); // uint64 -> float16 - u64v = u64vec3(f16v); // float16 -> uint64 -} - -void builtinAngleTrigFuncs() -{ - f16vec4 f16v1, f16v2; - - f16v2 = radians(f16v1); - f16v2 = degrees(f16v1); - f16v2 = sin(f16v1); - f16v2 = cos(f16v1); - f16v2 = tan(f16v1); - f16v2 = asin(f16v1); - f16v2 = acos(f16v1); - f16v2 = atan(f16v1, f16v2); - f16v2 = atan(f16v1); - f16v2 = sinh(f16v1); - f16v2 = cosh(f16v1); - f16v2 = tanh(f16v1); - f16v2 = asinh(f16v1); - f16v2 = acosh(f16v1); - f16v2 = atanh(f16v1); -} - -void builtinExpFuncs() -{ - f16vec2 f16v1, f16v2; - - f16v2 = pow(f16v1, f16v2); - f16v2 = exp(f16v1); - f16v2 = log(f16v1); - f16v2 = exp2(f16v1); - f16v2 = log2(f16v1); - f16v2 = sqrt(f16v1); - f16v2 = inversesqrt(f16v1); -} - -void builtinCommonFuncs() -{ - f16vec3 f16v1, f16v2, f16v3; - float16_t f16; - bool b; - bvec3 bv; - ivec3 iv; - - f16v2 = abs(f16v1); - f16v2 = sign(f16v1); - f16v2 = floor(f16v1); - f16v2 = trunc(f16v1); - f16v2 = round(f16v1); - f16v2 = roundEven(f16v1); - f16v2 = ceil(f16v1); - f16v2 = fract(f16v1); - f16v2 = mod(f16v1, f16v2); - f16v2 = mod(f16v1, f16); - f16v3 = modf(f16v1, f16v2); - f16v3 = min(f16v1, f16v2); - f16v3 = min(f16v1, f16); - f16v3 = max(f16v1, f16v2); - f16v3 = max(f16v1, f16); - f16v3 = clamp(f16v1, f16, f16v2.x); - f16v3 = clamp(f16v1, f16v2, f16vec3(f16)); - f16v3 = mix(f16v1, f16v2, f16); - f16v3 = mix(f16v1, f16v2, f16v3); - f16v3 = mix(f16v1, f16v2, bv); - f16v3 = step(f16v1, f16v2); - f16v3 = step(f16, f16v3); - f16v3 = smoothstep(f16v1, f16v2, f16v3); - f16v3 = smoothstep(f16, f16v1.x, f16v2); - b = isnan(f16); - bv = isinf(f16v1); - f16v3 = fma(f16v1, f16v2, f16v3); - f16v2 = frexp(f16v1, iv); - f16v2 = ldexp(f16v1, iv); -} - -void builtinPackUnpackFuncs() -{ - uint u; - f16vec2 f16v; - - u = packFloat2x16(f16v); - f16v = unpackFloat2x16(u); -} - -void builtinGeometryFuncs() -{ - float16_t f16; - f16vec3 f16v1, f16v2, f16v3; - - f16 = length(f16v1); - f16 = distance(f16v1, f16v2); - f16 = dot(f16v1, f16v2); - f16v3 = cross(f16v1, f16v2); - f16v2 = normalize(f16v1); - f16v3 = faceforward(f16v1, f16v2, f16v3); - f16v3 = reflect(f16v1, f16v2); - f16v3 = refract(f16v1, f16v2, f16); -} - -void builtinMatrixFuncs() -{ - f16mat2x3 f16m1, f16m2, f16m3; - f16mat3x2 f16m4; - f16mat3 f16m5; - f16mat4 f16m6, f16m7; - - f16vec3 f16v1; - f16vec2 f16v2; - - float16_t f16; - - f16m3 = matrixCompMult(f16m1, f16m2); - f16m1 = outerProduct(f16v1, f16v2); - f16m4 = transpose(f16m1); - f16 = determinant(f16m5); - f16m6 = inverse(f16m7); -} - -void builtinVecRelFuncs() -{ - f16vec3 f16v1, f16v2; - bvec3 bv; - - bv = lessThan(f16v1, f16v2); - bv = lessThanEqual(f16v1, f16v2); - bv = greaterThan(f16v1, f16v2); - bv = greaterThanEqual(f16v1, f16v2); - bv = equal(f16v1, f16v2); - bv = notEqual(f16v1, f16v2); -} - -in f16vec3 if16v; - -void builtinFragProcFuncs() -{ - f16vec3 f16v; - - // Derivative - f16v.x = dFdx(if16v.x); - f16v.y = dFdy(if16v.y); - f16v.xy = dFdxFine(if16v.xy); - f16v.xy = dFdyFine(if16v.xy); - f16v = dFdxCoarse(if16v); - f16v = dFdxCoarse(if16v); - - f16v.x = fwidth(if16v.x); - f16v.xy = fwidthFine(if16v.xy); - f16v = fwidthCoarse(if16v); - - // Interpolation - f16v.x = interpolateAtCentroid(if16v.x); - f16v.xy = interpolateAtSample(if16v.xy, 1); - f16v = interpolateAtOffset(if16v, f16vec2(0.5hf)); -} +#version 450 core + +#extension GL_AMD_gpu_shader_half_float: enable +#extension GL_ARB_gpu_shader_int64: enable + +void main() +{ +} + +// Half float literals +void literal() +{ + const float16_t f16c = 0.000001hf; + const f16vec2 f16cv = f16vec2(-0.25HF, 0.03HF); + + f16vec2 f16v; + f16v.x = f16c; + f16v += f16cv; +} + +// Block memory layout +struct S +{ + float16_t x; // rule 1: align = 2, takes offsets 0-1 + f16vec2 y; // rule 2: align = 4, takes offsets 4-7 + f16vec3 z; // rule 3: align = 8, takes offsets 8-13 +}; + +layout(column_major, std140) uniform B1 +{ + float16_t a; // rule 1: align = 2, takes offsets 0-1 + f16vec2 b; // rule 2: align = 4, takes offsets 4-7 + f16vec3 c; // rule 3: align = 8, takes offsets 8-15 + float16_t d[2]; // rule 4: align = 16, array stride = 16, + // takes offsets 16-47 + f16mat2x3 e; // rule 5: align = 16, matrix stride = 16, + // takes offsets 48-79 + f16mat2x3 f[2]; // rule 6: align = 16, matrix stride = 16, + // array stride = 32, f[0] takes + // offsets 80-111, f[1] takes offsets + // 112-143 + S g; // rule 9: align = 16, g.x takes offsets + // 144-145, g.y takes offsets 148-151, + // g.z takes offsets 152-159 + S h[2]; // rule 10: align = 16, array stride = 16, h[0] + // takes offsets 160-175, h[1] takes + // offsets 176-191 +}; + +layout(row_major, std430) buffer B2 +{ + float16_t o; // rule 1: align = 2, takes offsets 0-1 + f16vec2 p; // rule 2: align = 4, takes offsets 4-7 + f16vec3 q; // rule 3: align = 8, takes offsets 8-13 + float16_t r[2]; // rule 4: align = 2, array stride = 2, takes + // offsets 14-17 + f16mat2x3 s; // rule 7: align = 4, matrix stride = 4, takes + // offsets 20-31 + f16mat2x3 t[2]; // rule 8: align = 4, matrix stride = 4, array + // stride = 12, t[0] takes offsets + // 32-43, t[1] takes offsets 44-55 + S u; // rule 9: align = 8, u.x takes offsets + // 56-57, u.y takes offsets 60-63, u.z + // takes offsets 64-69 + S v[2]; // rule 10: align = 8, array stride = 16, v[0] + // takes offsets 72-87, v[1] takes + // offsets 88-103 +}; + +// Specialization constant +layout(constant_id = 100) const float16_t sf16 = 0.125hf; +layout(constant_id = 101) const float sf = 0.25; +layout(constant_id = 102) const double sd = 0.5lf; + +const float f16_to_f = float(sf16); +const double f16_to_d = float(sf16); + +const float16_t f_to_f16 = float16_t(sf); +const float16_t d_to_f16 = float16_t(sd); + +void operators() +{ + float16_t f16; + f16vec2 f16v; + f16mat2x2 f16m; + bool b; + + // Arithmetic + f16v += f16v; + f16v -= f16v; + f16v *= f16v; + f16v /= f16v; + f16v++; + f16v--; + ++f16m; + --f16m; + f16v = -f16v; + f16m = -f16m; + + f16 = f16v.x + f16v.y; + f16 = f16v.x - f16v.y; + f16 = f16v.x * f16v.y; + f16 = f16v.x / f16v.y; + + // Relational + b = (f16v.x != f16); + b = (f16v.y == f16); + b = (f16v.x > f16); + b = (f16v.y < f16); + b = (f16v.x >= f16); + b = (f16v.y <= f16); + + // Vector/matrix operations + f16v = f16v * f16; + f16m = f16m * f16; + f16v = f16m * f16v; + f16v = f16v * f16m; + f16m = f16m * f16m; +} + +void typeCast() +{ + bvec3 bv; + vec3 fv; + dvec3 dv; + ivec3 iv; + uvec3 uv; + i64vec3 i64v; + u64vec3 u64v; + + f16vec3 f16v; + + f16v = f16vec3(bv); // bool -> float16 + bv = bvec3(f16v); // float16 -> bool + + f16v = f16vec3(fv); // float -> float16 + fv = vec3(f16v); // float16 -> float + + f16v = f16vec3(dv); // double -> float16 + dv = dvec3(dv); // float16 -> double + + f16v = f16vec3(iv); // int -> float16 + iv = ivec3(f16v); // float16 -> int + + f16v = f16vec3(uv); // uint -> float16 + uv = uvec3(f16v); // float16 -> uint + + f16v = f16vec3(i64v); // int64 -> float16 + i64v = i64vec3(f16v); // float16 -> int64 + + f16v = f16vec3(u64v); // uint64 -> float16 + u64v = u64vec3(f16v); // float16 -> uint64 +} + +void builtinAngleTrigFuncs() +{ + f16vec4 f16v1, f16v2; + + f16v2 = radians(f16v1); + f16v2 = degrees(f16v1); + f16v2 = sin(f16v1); + f16v2 = cos(f16v1); + f16v2 = tan(f16v1); + f16v2 = asin(f16v1); + f16v2 = acos(f16v1); + f16v2 = atan(f16v1, f16v2); + f16v2 = atan(f16v1); + f16v2 = sinh(f16v1); + f16v2 = cosh(f16v1); + f16v2 = tanh(f16v1); + f16v2 = asinh(f16v1); + f16v2 = acosh(f16v1); + f16v2 = atanh(f16v1); +} + +void builtinExpFuncs() +{ + f16vec2 f16v1, f16v2; + + f16v2 = pow(f16v1, f16v2); + f16v2 = exp(f16v1); + f16v2 = log(f16v1); + f16v2 = exp2(f16v1); + f16v2 = log2(f16v1); + f16v2 = sqrt(f16v1); + f16v2 = inversesqrt(f16v1); +} + +void builtinCommonFuncs() +{ + f16vec3 f16v1, f16v2, f16v3; + float16_t f16; + bool b; + bvec3 bv; + ivec3 iv; + + f16v2 = abs(f16v1); + f16v2 = sign(f16v1); + f16v2 = floor(f16v1); + f16v2 = trunc(f16v1); + f16v2 = round(f16v1); + f16v2 = roundEven(f16v1); + f16v2 = ceil(f16v1); + f16v2 = fract(f16v1); + f16v2 = mod(f16v1, f16v2); + f16v2 = mod(f16v1, f16); + f16v3 = modf(f16v1, f16v2); + f16v3 = min(f16v1, f16v2); + f16v3 = min(f16v1, f16); + f16v3 = max(f16v1, f16v2); + f16v3 = max(f16v1, f16); + f16v3 = clamp(f16v1, f16, f16v2.x); + f16v3 = clamp(f16v1, f16v2, f16vec3(f16)); + f16v3 = mix(f16v1, f16v2, f16); + f16v3 = mix(f16v1, f16v2, f16v3); + f16v3 = mix(f16v1, f16v2, bv); + f16v3 = step(f16v1, f16v2); + f16v3 = step(f16, f16v3); + f16v3 = smoothstep(f16v1, f16v2, f16v3); + f16v3 = smoothstep(f16, f16v1.x, f16v2); + b = isnan(f16); + bv = isinf(f16v1); + f16v3 = fma(f16v1, f16v2, f16v3); + f16v2 = frexp(f16v1, iv); + f16v2 = ldexp(f16v1, iv); +} + +void builtinPackUnpackFuncs() +{ + uint u; + f16vec2 f16v; + + u = packFloat2x16(f16v); + f16v = unpackFloat2x16(u); +} + +void builtinGeometryFuncs() +{ + float16_t f16; + f16vec3 f16v1, f16v2, f16v3; + + f16 = length(f16v1); + f16 = distance(f16v1, f16v2); + f16 = dot(f16v1, f16v2); + f16v3 = cross(f16v1, f16v2); + f16v2 = normalize(f16v1); + f16v3 = faceforward(f16v1, f16v2, f16v3); + f16v3 = reflect(f16v1, f16v2); + f16v3 = refract(f16v1, f16v2, f16); +} + +void builtinMatrixFuncs() +{ + f16mat2x3 f16m1, f16m2, f16m3; + f16mat3x2 f16m4; + f16mat3 f16m5; + f16mat4 f16m6, f16m7; + + f16vec3 f16v1; + f16vec2 f16v2; + + float16_t f16; + + f16m3 = matrixCompMult(f16m1, f16m2); + f16m1 = outerProduct(f16v1, f16v2); + f16m4 = transpose(f16m1); + f16 = determinant(f16m5); + f16m6 = inverse(f16m7); +} + +void builtinVecRelFuncs() +{ + f16vec3 f16v1, f16v2; + bvec3 bv; + + bv = lessThan(f16v1, f16v2); + bv = lessThanEqual(f16v1, f16v2); + bv = greaterThan(f16v1, f16v2); + bv = greaterThanEqual(f16v1, f16v2); + bv = equal(f16v1, f16v2); + bv = notEqual(f16v1, f16v2); +} + +in f16vec3 if16v; + +void builtinFragProcFuncs() +{ + f16vec3 f16v; + + // Derivative + f16v.x = dFdx(if16v.x); + f16v.y = dFdy(if16v.y); + f16v.xy = dFdxFine(if16v.xy); + f16v.xy = dFdyFine(if16v.xy); + f16v = dFdxCoarse(if16v); + f16v = dFdxCoarse(if16v); + + f16v.x = fwidth(if16v.x); + f16v.xy = fwidthFine(if16v.xy); + f16v = fwidthCoarse(if16v); + + // Interpolation + f16v.x = interpolateAtCentroid(if16v.x); + f16v.xy = interpolateAtSample(if16v.xy, 1); + f16v = interpolateAtOffset(if16v, f16vec2(0.5hf)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.float32.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.float32.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.float32.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.float32.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,277 @@ +#version 450 + +#extension GL_KHX_shader_explicit_arithmetic_types: enable +#extension GL_KHX_shader_explicit_arithmetic_types_int8: require +#extension GL_KHX_shader_explicit_arithmetic_types_int16: require +#extension GL_KHX_shader_explicit_arithmetic_types_int32: require +#extension GL_KHX_shader_explicit_arithmetic_types_int64: require +#extension GL_KHX_shader_explicit_arithmetic_types_float16: require +#extension GL_KHX_shader_explicit_arithmetic_types_float32: require +#extension GL_KHX_shader_explicit_arithmetic_types_float64: require + +void main() +{ +} + +// Single float literals +void literal() +{ + const float32_t f32c = 0.000001f; + const f32vec2 f32cv = f32vec2(-0.25F, 0.03f); + + f32vec2 f32v; + f32v.x = f32c; + f32v += f32cv; +} + +// Block memory layout +struct S +{ + float32_t x; + f32vec2 y; + f32vec3 z; +}; + +layout(column_major, std140) uniform B1 +{ + float32_t a; + f32vec2 b; + f32vec3 c; + float32_t d[2]; + f32mat2x3 e; + f32mat2x3 f[2]; + S g; + S h[2]; +}; + +// Specialization constant +layout(constant_id = 100) const float16_t sf16 = 0.125hf; +layout(constant_id = 101) const float32_t sf = 0.25; +layout(constant_id = 102) const float64_t sd = 0.5lf; + +const float f16_to_f = float(sf16); +const double f16_to_d = float(sf16); + +const float16_t f_to_f16 = float16_t(sf); +const float16_t d_to_f16 = float16_t(sd); + +void operators() +{ + float32_t f32; + f32vec2 f32v; + f32mat2x2 f32m; + bool b; + + // Arithmetic + f32v += f32v; + f32v -= f32v; + f32v *= f32v; + f32v /= f32v; + f32v++; + f32v--; + ++f32m; + --f32m; + f32v = -f32v; + f32m = -f32m; + + f32 = f32v.x + f32v.y; + f32 = f32v.x - f32v.y; + f32 = f32v.x * f32v.y; + f32 = f32v.x / f32v.y; + + // Relational + b = (f32v.x != f32); + b = (f32v.y == f32); + b = (f32v.x > f32); + b = (f32v.y < f32); + b = (f32v.x >= f32); + b = (f32v.y <= f32); + + // Vector/matrix operations + f32v = f32v * f32; + f32m = f32m * f32; + f32v = f32m * f32v; + f32v = f32v * f32m; + f32m = f32m * f32m; +} + +void typeCast() +{ + bvec3 bv; + f32vec3 f32v; + f64vec3 f64v; + i8vec3 i8v; + u8vec3 u8v; + i16vec3 i16v; + u16vec3 u16v; + i32vec3 i32v; + u32vec3 u32v; + i64vec3 i64v; + u64vec3 u64v; + f16vec3 f16v; + + f64v = f32v; // float32_t -> float64_t + + f32v = f32vec3(bv); // bool -> float32 + bv = bvec3(f32v); // float32 -> bool + + f32v = f32vec3(f64v); // double -> float32 + f64v = f64vec3(f32v); // float32 -> double + + f32v = f32vec3(f16v); // float16 -> float32 + f16v = f16vec3(f32v); // float32 -> float16 + + i8v = i8vec3(f32v); // float32 -> int8 + i16v = i16vec3(f32v); // float32 -> int16 + i32v = i32vec3(f32v); // float32 -> int32 + i64v = i64vec3(f32v); // float32 -> int64 + + u8v = u8vec3(f32v); // float32 -> uint8 + u16v = u16vec3(f32v); // float32 -> uint16 + u32v = u32vec3(f32v); // float32 -> uint32 + u64v = u64vec3(f32v); // float32 -> uint64 +} + +void builtinAngleTrigFuncs() +{ + f32vec4 f32v1, f32v2; + + f32v2 = radians(f32v1); + f32v2 = degrees(f32v1); + f32v2 = sin(f32v1); + f32v2 = cos(f32v1); + f32v2 = tan(f32v1); + f32v2 = asin(f32v1); + f32v2 = acos(f32v1); + f32v2 = atan(f32v1, f32v2); + f32v2 = atan(f32v1); + f32v2 = sinh(f32v1); + f32v2 = cosh(f32v1); + f32v2 = tanh(f32v1); + f32v2 = asinh(f32v1); + f32v2 = acosh(f32v1); + f32v2 = atanh(f32v1); +} + +void builtinExpFuncs() +{ + f32vec2 f32v1, f32v2; + + f32v2 = pow(f32v1, f32v2); + f32v2 = exp(f32v1); + f32v2 = log(f32v1); + f32v2 = exp2(f32v1); + f32v2 = log2(f32v1); + f32v2 = sqrt(f32v1); + f32v2 = inversesqrt(f32v1); +} + +void builtinCommonFuncs() +{ + f32vec3 f32v1, f32v2, f32v3; + float32_t f32; + bool b; + bvec3 bv; + ivec3 iv; + + f32v2 = abs(f32v1); + f32v2 = sign(f32v1); + f32v2 = floor(f32v1); + f32v2 = trunc(f32v1); + f32v2 = round(f32v1); + f32v2 = roundEven(f32v1); + f32v2 = ceil(f32v1); + f32v2 = fract(f32v1); + f32v2 = mod(f32v1, f32v2); + f32v2 = mod(f32v1, f32); + f32v3 = modf(f32v1, f32v2); + f32v3 = min(f32v1, f32v2); + f32v3 = min(f32v1, f32); + f32v3 = max(f32v1, f32v2); + f32v3 = max(f32v1, f32); + f32v3 = clamp(f32v1, f32, f32v2.x); + f32v3 = clamp(f32v1, f32v2, f32vec3(f32)); + f32v3 = mix(f32v1, f32v2, f32); + f32v3 = mix(f32v1, f32v2, f32v3); + f32v3 = mix(f32v1, f32v2, bv); + f32v3 = step(f32v1, f32v2); + f32v3 = step(f32, f32v3); + f32v3 = smoothstep(f32v1, f32v2, f32v3); + f32v3 = smoothstep(f32, f32v1.x, f32v2); + b = isnan(f32); + bv = isinf(f32v1); + f32v3 = fma(f32v1, f32v2, f32v3); + f32v2 = frexp(f32v1, iv); + f32v2 = ldexp(f32v1, iv); +} + +void builtinGeometryFuncs() +{ + float32_t f32; + f32vec3 f32v1, f32v2, f32v3; + + f32 = length(f32v1); + f32 = distance(f32v1, f32v2); + f32 = dot(f32v1, f32v2); + f32v3 = cross(f32v1, f32v2); + f32v2 = normalize(f32v1); + f32v3 = faceforward(f32v1, f32v2, f32v3); + f32v3 = reflect(f32v1, f32v2); + f32v3 = refract(f32v1, f32v2, f32); +} + +void builtinMatrixFuncs() +{ + f32mat2x3 f32m1, f32m2, f32m3; + f32mat3x2 f32m4; + f32mat3 f32m5; + f32mat4 f32m6, f32m7; + + f32vec3 f32v1; + f32vec2 f32v2; + + float32_t f32; + + f32m3 = matrixCompMult(f32m1, f32m2); + f32m1 = outerProduct(f32v1, f32v2); + f32m4 = transpose(f32m1); + f32 = determinant(f32m5); + f32m6 = inverse(f32m7); +} + +void builtinVecRelFuncs() +{ + f32vec3 f32v1, f32v2; + bvec3 bv; + + bv = lessThan(f32v1, f32v2); + bv = lessThanEqual(f32v1, f32v2); + bv = greaterThan(f32v1, f32v2); + bv = greaterThanEqual(f32v1, f32v2); + bv = equal(f32v1, f32v2); + bv = notEqual(f32v1, f32v2); +} + +in f32vec3 if32v; + +void builtinFragProcFuncs() +{ + f32vec3 f32v; + + // Derivative + f32v.x = dFdx(if32v.x); + f32v.y = dFdy(if32v.y); + f32v.xy = dFdxFine(if32v.xy); + f32v.xy = dFdyFine(if32v.xy); + f32v = dFdxCoarse(if32v); + f32v = dFdxCoarse(if32v); + + f32v.x = fwidth(if32v.x); + f32v.xy = fwidthFine(if32v.xy); + f32v = fwidthCoarse(if32v); + + // Interpolation + f32v.x = interpolateAtCentroid(if32v.x); + f32v.xy = interpolateAtSample(if32v.xy, 1); + f32v = interpolateAtOffset(if32v, f32vec2(0.5f)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.float64.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.float64.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.float64.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.float64.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,272 @@ +#version 450 + +#extension GL_KHX_shader_explicit_arithmetic_types: enable +#extension GL_KHX_shader_explicit_arithmetic_types_int8: require +#extension GL_KHX_shader_explicit_arithmetic_types_int16: require +#extension GL_KHX_shader_explicit_arithmetic_types_int32: require +#extension GL_KHX_shader_explicit_arithmetic_types_int64: require +#extension GL_KHX_shader_explicit_arithmetic_types_float16: require +#extension GL_KHX_shader_explicit_arithmetic_types_float32: require +#extension GL_KHX_shader_explicit_arithmetic_types_float64: require + +void main() +{ +} + +// Single float literals +void literal() +{ + const float64_t f64c = 0.000001LF; + const f64vec2 f64cv = f64vec2(-0.25lF, 0.03Lf); + + f64vec2 f64v; + f64v.x = f64c; + f64v += f64cv; +} + +// Block memory layout +struct S +{ + float64_t x; + f64vec2 y; + f64vec3 z; +}; + +layout(column_major, std140) uniform B1 +{ + float64_t a; + f64vec2 b; + f64vec3 c; + float64_t d[2]; + f64mat2x3 e; + f64mat2x3 f[2]; + S g; + S h[2]; +}; + +// Specialization constant +layout(constant_id = 100) const float16_t sf16 = 0.125hf; +layout(constant_id = 101) const float32_t sf = 0.25; +layout(constant_id = 102) const float64_t sd = 0.5lf; + +const float f16_to_f = float(sf16); +const double f16_to_d = float(sf16); + +const float16_t f_to_f16 = float16_t(sf); +const float16_t d_to_f16 = float16_t(sd); + +void operators() +{ + float64_t f64; + f64vec2 f64v; + f64mat2x2 f64m; + bool b; + + // Arithmetic + f64v += f64v; + f64v -= f64v; + f64v *= f64v; + f64v /= f64v; + f64v++; + f64v--; + ++f64m; + --f64m; + f64v = -f64v; + f64m = -f64m; + + f64 = f64v.x + f64v.y; + f64 = f64v.x - f64v.y; + f64 = f64v.x * f64v.y; + f64 = f64v.x / f64v.y; + + // Relational + b = (f64v.x != f64); + b = (f64v.y == f64); + b = (f64v.x > f64); + b = (f64v.y < f64); + b = (f64v.x >= f64); + b = (f64v.y <= f64); + + // Vector/matrix operations + f64v = f64v * f64; + f64m = f64m * f64; + f64v = f64m * f64v; + f64v = f64v * f64m; + f64m = f64m * f64m; +} + +void typeCast() +{ + bvec3 bv; + f32vec3 f32v; + f64vec3 f64v; + i8vec3 i8v; + u8vec3 u8v; + i16vec3 i16v; + u16vec3 u16v; + i32vec3 i32v; + u32vec3 u32v; + i64vec3 i64v; + u64vec3 u64v; + f16vec3 f16v; + + f64v = f64vec3(bv); // bool -> float64 + bv = bvec3(f64v); // float64 -> bool + + f64v = f64vec3(f16v); // float16 -> float64 + f16v = f16vec3(f64v); // float64 -> float16 + + i8v = i8vec3(f64v); // float64 -> int8 + i16v = i16vec3(f64v); // float64 -> int16 + i32v = i32vec3(f64v); // float64 -> int32 + i64v = i64vec3(f64v); // float64 -> int64 + + u8v = u8vec3(f64v); // float64 -> uint8 + u16v = u16vec3(f64v); // float64 -> uint16 + u32v = u32vec3(f64v); // float64 -> uint32 + u64v = u64vec3(f64v); // float64 -> uint64 +} + +void builtinAngleTrigFuncs() +{ + f64vec4 f64v1, f64v2; + + f64v2 = radians(f64v1); + f64v2 = degrees(f64v1); + f64v2 = sin(f64v1); + f64v2 = cos(f64v1); + f64v2 = tan(f64v1); + f64v2 = asin(f64v1); + f64v2 = acos(f64v1); + f64v2 = atan(f64v1, f64v2); + f64v2 = atan(f64v1); + f64v2 = sinh(f64v1); + f64v2 = cosh(f64v1); + f64v2 = tanh(f64v1); + f64v2 = asinh(f64v1); + f64v2 = acosh(f64v1); + f64v2 = atanh(f64v1); +} + +void builtinExpFuncs() +{ + f64vec2 f64v1, f64v2; + + f64v2 = pow(f64v1, f64v2); + f64v2 = exp(f64v1); + f64v2 = log(f64v1); + f64v2 = exp2(f64v1); + f64v2 = log2(f64v1); + f64v2 = sqrt(f64v1); + f64v2 = inversesqrt(f64v1); +} + +void builtinCommonFuncs() +{ + f64vec3 f64v1, f64v2, f64v3; + float64_t f64; + bool b; + bvec3 bv; + ivec3 iv; + + f64v2 = abs(f64v1); + f64v2 = sign(f64v1); + f64v2 = floor(f64v1); + f64v2 = trunc(f64v1); + f64v2 = round(f64v1); + f64v2 = roundEven(f64v1); + f64v2 = ceil(f64v1); + f64v2 = fract(f64v1); + f64v2 = mod(f64v1, f64v2); + f64v2 = mod(f64v1, f64); + f64v3 = modf(f64v1, f64v2); + f64v3 = min(f64v1, f64v2); + f64v3 = min(f64v1, f64); + f64v3 = max(f64v1, f64v2); + f64v3 = max(f64v1, f64); + f64v3 = clamp(f64v1, f64, f64v2.x); + f64v3 = clamp(f64v1, f64v2, f64vec3(f64)); + f64v3 = mix(f64v1, f64v2, f64); + f64v3 = mix(f64v1, f64v2, f64v3); + f64v3 = mix(f64v1, f64v2, bv); + f64v3 = step(f64v1, f64v2); + f64v3 = step(f64, f64v3); + f64v3 = smoothstep(f64v1, f64v2, f64v3); + f64v3 = smoothstep(f64, f64v1.x, f64v2); + b = isnan(f64); + bv = isinf(f64v1); + f64v3 = fma(f64v1, f64v2, f64v3); + f64v2 = frexp(f64v1, iv); + f64v2 = ldexp(f64v1, iv); +} + +void builtinGeometryFuncs() +{ + float64_t f64; + f64vec3 f64v1, f64v2, f64v3; + + f64 = length(f64v1); + f64 = distance(f64v1, f64v2); + f64 = dot(f64v1, f64v2); + f64v3 = cross(f64v1, f64v2); + f64v2 = normalize(f64v1); + f64v3 = faceforward(f64v1, f64v2, f64v3); + f64v3 = reflect(f64v1, f64v2); + f64v3 = refract(f64v1, f64v2, f64); +} + +void builtinMatrixFuncs() +{ + f64mat2x3 f64m1, f64m2, f64m3; + f64mat3x2 f64m4; + f64mat3 f64m5; + f64mat4 f64m6, f64m7; + + f64vec3 f64v1; + f64vec2 f64v2; + + float64_t f64; + + f64m3 = matrixCompMult(f64m1, f64m2); + f64m1 = outerProduct(f64v1, f64v2); + f64m4 = transpose(f64m1); + f64 = determinant(f64m5); + f64m6 = inverse(f64m7); +} + +void builtinVecRelFuncs() +{ + f64vec3 f64v1, f64v2; + bvec3 bv; + + bv = lessThan(f64v1, f64v2); + bv = lessThanEqual(f64v1, f64v2); + bv = greaterThan(f64v1, f64v2); + bv = greaterThanEqual(f64v1, f64v2); + bv = equal(f64v1, f64v2); + bv = notEqual(f64v1, f64v2); +} + +in flat f64vec3 if64v; + +void builtinFragProcFuncs() +{ + f64vec3 f64v; + + // Derivative + f64v.x = dFdx(if64v.x); + f64v.y = dFdy(if64v.y); + f64v.xy = dFdxFine(if64v.xy); + f64v.xy = dFdyFine(if64v.xy); + f64v = dFdxCoarse(if64v); + f64v = dFdxCoarse(if64v); + + f64v.x = fwidth(if64v.x); + f64v.xy = fwidthFine(if64v.xy); + f64v = fwidthCoarse(if64v); + + // Interpolation + f64v.x = interpolateAtCentroid(if64v.x); + f64v.xy = interpolateAtSample(if64v.xy, 1); + f64v = interpolateAtOffset(if64v, f64vec2(0.5f)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.flowControl.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.flowControl.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.flowControl.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.flowControl.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,23 +1,23 @@ -#version 140 - -in float d; -in vec4 bigColor, smallColor; -in vec4 otherColor; - -in float c; -in vec4 BaseColor; - -void main() -{ - vec4 color = BaseColor; - vec4 color2; - - color2 = otherColor; - - if (c > d) - color += bigColor; - else - color += smallColor; - - gl_FragColor = color * color2; -} +#version 140 + +in float d; +in vec4 bigColor, smallColor; +in vec4 otherColor; + +in float c; +in vec4 BaseColor; + +void main() +{ + vec4 color = BaseColor; + vec4 color2; + + color2 = otherColor; + + if (c > d) + color += bigColor; + else + color += smallColor; + + gl_FragColor = color * color2; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.forLoop.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.forLoop.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.forLoop.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.forLoop.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,41 +1,41 @@ -#version 140 - -in vec4 bigColor; -in vec4 BaseColor; -in float f; - -flat in int Count; -flat in uvec4 v4; - -void main() -{ - vec4 color = BaseColor; - - for (int i = 0; i < Count; ++i) { - color += bigColor; - } - - gl_FragColor = color; - - float sum = 0.0; - for (int i = 0; i < 4; ++i) - sum += v4[i]; - - vec4 tv4; - - for (int i = 0; i < 4; ++i) - tv4[i] = v4[i] * 4u; - - gl_FragColor += vec4(sum) + tv4; - - vec4 r; - r.xyz = BaseColor.xyz; - - for (int i = 0; i < Count; ++i) - r.w = f; - - gl_FragColor.xyz += r.xyz; - - for (int i = 0; i < 16; i += 4) - gl_FragColor *= f; -} +#version 140 + +in vec4 bigColor; +in vec4 BaseColor; +in float f; + +flat in int Count; +flat in uvec4 v4; + +void main() +{ + vec4 color = BaseColor; + + for (int i = 0; i < Count; ++i) { + color += bigColor; + } + + gl_FragColor = color; + + float sum = 0.0; + for (int i = 0; i < 4; ++i) + sum += v4[i]; + + vec4 tv4; + + for (int i = 0; i < 4; ++i) + tv4[i] = v4[i] * 4u; + + gl_FragColor += vec4(sum) + tv4; + + vec4 r; + r.xyz = BaseColor.xyz; + + for (int i = 0; i < Count; ++i) + r.w = f; + + gl_FragColor.xyz += r.xyz; + + for (int i = 0; i < 16; i += 4) + gl_FragColor *= f; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.forwardFun.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.forwardFun.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.forwardFun.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.forwardFun.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,39 +1,39 @@ -#version 140 - -precision mediump float; - -in vec4 bigColor; -in vec4 BaseColor; -in float d; - -void bar(); -float foo(vec4); -float unreachableReturn(); - -void main() -{ - vec4 color = vec4(foo(BaseColor)); - - bar(); - float f = unreachableReturn(); - - gl_FragColor = color * f; -} - -void bar() -{ -} - -float unreachableReturn() -{ - bar(); - if (d < 4.2) - return 1.2; - else - return 4.5; -} - -float foo(vec4 bar) -{ - return bar.x + bar.y; -} +#version 140 + +precision mediump float; + +in vec4 bigColor; +in vec4 BaseColor; +in float d; + +void bar(); +float foo(vec4); +float unreachableReturn(); + +void main() +{ + vec4 color = vec4(foo(BaseColor)); + + bar(); + float f = unreachableReturn(); + + gl_FragColor = color * f; +} + +void bar() +{ +} + +float unreachableReturn() +{ + bar(); + if (d < 4.2) + return 1.2; + else + return 4.5; +} + +float foo(vec4 bar) +{ + return bar.x + bar.y; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.functionCall.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.functionCall.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.functionCall.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.functionCall.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,44 +1,44 @@ -#version 140 - -varying vec4 bigColor; -varying vec4 BaseColor; -varying float d; - -float h = 0.0; - -float foo(vec4 bar) -{ - return bar.x + bar.y; -} - -void bar() -{ -} - -float unreachableReturn() -{ - if (d < 4.2) - return 1.2; - else - return 4.5; - // might be another return inserted here by builders, has to be correct type -} - -float missingReturn() -{ - if (d < 4.5) { - h = d; - return 3.9; - } -} - -void main() -{ - vec4 color = vec4(foo(BaseColor)); - - bar(); - float f = unreachableReturn(); - float g = missingReturn(); - - gl_FragColor = color * f * h; -} +#version 140 + +varying vec4 bigColor; +varying vec4 BaseColor; +varying float d; + +float h = 0.0; + +float foo(vec4 bar) +{ + return bar.x + bar.y; +} + +void bar() +{ +} + +float unreachableReturn() +{ + if (d < 4.2) + return 1.2; + else + return 4.5; + // might be another return inserted here by builders, has to be correct type +} + +float missingReturn() +{ + if (d < 4.5) { + h = d; + return 3.9; + } +} + +void main() +{ + vec4 color = vec4(foo(BaseColor)); + + bar(); + float f = unreachableReturn(); + float g = missingReturn(); + + gl_FragColor = color * f * h; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.functionNestedOpaque.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.functionNestedOpaque.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.functionNestedOpaque.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.functionNestedOpaque.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,26 +1,26 @@ -#version 450 - -uniform struct S { - sampler2D s; -} si; - -void foo(sampler2D t) -{ - texture(t, vec2(0.5)); -} - -void barc(const S p) -{ - foo(p.s); -} - -void bar(S p) -{ - foo(p.s); -} - -void main() -{ - barc(si); - bar(si); -} +#version 450 + +uniform struct S { + sampler2D s; +} si; + +void foo(sampler2D t) +{ + texture(t, vec2(0.5)); +} + +void barc(const S p) +{ + foo(p.s); +} + +void bar(S p) +{ + foo(p.s); +} + +void main() +{ + barc(si); + bar(si); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.functionSemantics.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.functionSemantics.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.functionSemantics.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.functionSemantics.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,63 +1,63 @@ -#version 400 - -in float u; - -int foo(int a, const int b, in int c, const in int d, out int e, inout int f) -{ - int sum = a + b + c + d + f; // no e, it is out only - // sum should be 47 now - - a *= 64; - // no b, it is read only - c *= 64; - // no d, it is read only - e = 64 * 16; // e starts undefined - f *= 64; - - sum += a + 64 * b + c + 64 * d + e + f; // everything has a value now, totaling of 64(1+2+4+8+16+32) = 64*63 = 4032 - // sum should be 4032 + 47 = 4079 - - return sum; -} - -int foo2(float a, vec3 b, out int r) -{ - r = int(3.0 * a); - return int(5.0 * b.y); -} - -int foo3() -{ - if (u > 3.2) { - discard; - return 1000000; - } - - return 2000000; -} - -void main() -{ - int e; - int t = 2; - struct s { - ivec4 t; - } f; - f.t.y = 32; - - // test the different qualifers - int color = foo(1, 2, t+t, 8, e, f.t.y); - - color += 128 * (e + f.t.y); // right side should be 128(64(16 + 32)) = 393216 - // sum should be 4079 + 393216 = 397295 - - // test conversions - float arg; - float ret; - ret = foo2(4, ivec3(1,2,3), arg); // ret = 10, param = 12.0 - color += int(ret + arg); // adds 22, for total of 397317 - - color += foo3(); // theoretically, add 2000000, for total of 2397317 - - gl_FragColor = vec4(color); -} +#version 400 + +in float u; + +int foo(int a, const int b, in int c, const in int d, out int e, inout int f) +{ + int sum = a + b + c + d + f; // no e, it is out only + // sum should be 47 now + + a *= 64; + // no b, it is read only + c *= 64; + // no d, it is read only + e = 64 * 16; // e starts undefined + f *= 64; + + sum += a + 64 * b + c + 64 * d + e + f; // everything has a value now, totaling of 64(1+2+4+8+16+32) = 64*63 = 4032 + // sum should be 4032 + 47 = 4079 + + return sum; +} + +int foo2(float a, vec3 b, out int r) +{ + r = int(3.0 * a); + return int(5.0 * b.y); +} + +int foo3() +{ + if (u > 3.2) { + discard; + return 1000000; + } + + return 2000000; +} + +void main() +{ + int e; + int t = 2; + struct s { + ivec4 t; + } f; + f.t.y = 32; + + // test the different qualifers + int color = foo(1, 2, t+t, 8, e, f.t.y); + + color += 128 * (e + f.t.y); // right side should be 128(64(16 + 32)) = 393216 + // sum should be 4079 + 393216 = 397295 + + // test conversions + float arg; + float ret; + ret = foo2(4, ivec3(1,2,3), arg); // ret = 10, param = 12.0 + color += int(ret + arg); // adds 22, for total of 397317 + + color += foo3(); // theoretically, add 2000000, for total of 2397317 + + gl_FragColor = vec4(color); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.GeometryShaderPassthrough.geom vulkan-1.1.73+dfsg/external/glslang/Test/spv.GeometryShaderPassthrough.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.GeometryShaderPassthrough.geom 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.GeometryShaderPassthrough.geom 2018-04-27 11:46:26.000000000 +0000 @@ -1,17 +1,17 @@ -#version 450 -#extension GL_NV_geometry_shader_passthrough : require - -layout(triangles) in; - -layout(passthrough) in gl_PerVertex { - vec4 gl_Position; -}; - -layout(passthrough) in Inputs { -vec2 texcoord; -vec4 baseColor; -}; - -void main() -{ +#version 450 +#extension GL_NV_geometry_shader_passthrough : require + +layout(triangles) in; + +layout(passthrough) in gl_PerVertex { + vec4 gl_Position; +}; + +layout(passthrough) in Inputs { +vec2 texcoord; +vec4 baseColor; +}; + +void main() +{ } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.glFragColor.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.glFragColor.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.glFragColor.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.glFragColor.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,6 +1,6 @@ -#version 330 - -void main() -{ - gl_FragColor = vec4(1.0); -} +#version 330 + +void main() +{ + gl_FragColor = vec4(1.0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.glsl.register.noautoassign.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.glsl.register.noautoassign.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.glsl.register.noautoassign.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.glsl.register.noautoassign.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,23 +1,23 @@ #version 450 uniform layout(binding=0) sampler g_sSamp1; -uniform sampler g_sSamp2; +uniform layout(binding=1) sampler g_sSamp2; uniform layout(binding=2) sampler g_sSamp3[2]; -uniform sampler g_sSamp4[3]; -uniform sampler g_sSamp5; +uniform layout(binding=3) sampler g_sSamp4[3]; +uniform layout(binding=4) sampler g_sSamp5; -uniform sampler g_sSamp_unused1; -uniform sampler g_sSamp_unused2; +uniform layout(binding=5) sampler g_sSamp_unused1; +uniform layout(binding=6) sampler g_sSamp_unused2; -uniform layout(binding=1) texture1D g_tTex1; -uniform texture1D g_tTex2; -uniform layout(binding=3) texture1D g_tTex3[2]; -uniform texture1D g_tTex4[3]; -uniform texture1D g_tTex5; +uniform layout(binding=7) texture1D g_tTex1; +uniform layout(binding=8) texture1D g_tTex2; +uniform layout(binding=9) texture1D g_tTex3[2]; +uniform layout(binding=10) texture1D g_tTex4[3]; +uniform layout(binding=11) texture1D g_tTex5; -uniform layout(binding=0) texture1D g_tTex_unused1; -uniform layout(binding=2) texture1D g_tTex_unused2; -uniform texture1D g_tTex_unused3; +uniform layout(binding=12) texture1D g_tTex_unused1; +uniform layout(binding=13) texture1D g_tTex_unused2; +uniform layout(binding=14) texture1D g_tTex_unused3; struct MyStruct_t { int a; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.hlslDebugInfo.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.hlslDebugInfo.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.hlslDebugInfo.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.hlslDebugInfo.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,4 +1,4 @@ -float4 origMain() : SV_Position -{ - return (float4)0; -} +float4 origMain() : SV_Position +{ + return (float4)0; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.hlslOffsets.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.hlslOffsets.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.hlslOffsets.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.hlslOffsets.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,27 +1,27 @@ -#version 450 - -buffer block { - float m0; - vec3 m4; - ////// - float m16; - layout(offset=20) vec3 m20; - ///// - vec3 m32; - ///// - vec2 m48; - vec2 m56; - //// - float m64; - vec2 m68; - float m76; - ////// - float m80; - layout(offset=88) vec2 m88; - ////// - vec2 m96; - /////// - dvec2 m112; -}; - +#version 450 + +buffer block { + float m0; + vec3 m4; + ////// + float m16; + layout(offset=20) vec3 m20; + ///// + vec3 m32; + ///// + vec2 m48; + vec2 m56; + //// + float m64; + vec2 m68; + float m76; + ////// + float m80; + layout(offset=88) vec2 m88; + ////// + vec2 m96; + /////// + dvec2 m112; +}; + void main() {} \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.image.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.image.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.image.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.image.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,93 +1,93 @@ -#version 450 - -layout(rgba32f, binding = 0) uniform image1D i1D; -layout(rgba32f, binding = 1) uniform image2D i2D; -layout(rgba32f, binding = 2) uniform image3D i3D; -layout(rgba32f, binding = 3) uniform imageCube iCube; -layout(rgba32f, binding = 4) uniform imageCubeArray iCubeArray; -layout(rgba32f, binding = 5) uniform image2DRect i2DRect; -layout(rgba32f, binding = 6) uniform image1DArray i1DArray; -layout(rg16, binding = 7) uniform image2DArray i2DArray; -layout(rgba32f, binding = 8) uniform imageBuffer iBuffer; -layout(rgba32f, binding = 9) uniform image2DMS i2DMS; -layout(rgba32f, binding = 10) uniform image2DMSArray i2DMSArray; - -layout(r32i, binding = 11) uniform iimage1D ii1D; -layout(r32ui, binding = 12) uniform uimage2D ui2D; - -flat in int ic1D; -flat in ivec2 ic2D; -flat in ivec3 ic3D; -flat in ivec4 ic4D; - -writeonly layout(binding = 1) uniform image2D wo2D; - -flat in uint value; - -out vec4 fragData; - -void main() -{ - ivec3 iv = ivec3(0); - iv.x += imageSize(i1D); - iv.xy += imageSize(i2D); - iv.xyz += imageSize(i3D); - iv.xy += imageSize(iCube); - iv.xyz += imageSize(iCubeArray); - iv.xy += imageSize(i2DRect); - iv.xy += imageSize(i1DArray); - iv.xyz += imageSize(i2DArray); - iv.x += imageSize(iBuffer); - iv.xy += imageSize(i2DMS); - iv.xyz += imageSize(i2DMSArray); - - iv.x += imageSamples(i2DMS); - iv.x += imageSamples(i2DMSArray); - - vec4 v = vec4(0.0); - v += imageLoad(i1D, ic1D); - imageStore(i1D, ic1D, v); - v += imageLoad(i2D, ic2D); - imageStore(i2D, ic2D, v); - v += imageLoad(i3D, ic3D); - imageStore(i3D, ic3D, v); - v += imageLoad(iCube, ic3D); - imageStore(iCube, ic3D, v); - v += imageLoad(iCubeArray, ic3D); - imageStore(iCubeArray, ic3D, v); - v += imageLoad(i2DRect, ic2D); - imageStore(i2DRect, ic2D, v); - v += imageLoad(i1DArray, ic2D); - imageStore(i1DArray, ic2D, v); - v += imageLoad(i2DArray, ic3D); - imageStore(i2DArray, ic3D, v); - v += imageLoad(iBuffer, ic1D); - imageStore(iBuffer, ic1D, v); - v += imageLoad(i2DMS, ic2D, 1); - imageStore(i2DMS, ic2D, 2, v); - v += imageLoad(i2DMSArray, ic3D, 3); - imageStore(i2DMSArray, ic3D, 4, v); - - uint ui = 0; - iv.x += imageAtomicAdd(ii1D, ic1D, 10); - ui += imageAtomicAdd(ui2D, ic2D, value); - iv.x += imageAtomicMin(ii1D, ic1D, 11); - ui += imageAtomicMin(ui2D, ic2D, value); - iv.x += imageAtomicMax(ii1D, ic1D, 12); - ui += imageAtomicMax(ui2D, ic2D, value); - iv.x += imageAtomicAnd(ii1D, ic1D, 13); - ui += imageAtomicAnd(ui2D, ic2D, value); - iv.x += imageAtomicOr(ii1D, ic1D, 14); - ui += imageAtomicOr(ui2D, ic2D, value); - iv.x += imageAtomicXor(ii1D, ic1D, 15); - ui += imageAtomicXor(ui2D, ic2D, value); - iv.x += imageAtomicExchange(ii1D, ic1D, 16); - ui += imageAtomicExchange(ui2D, ic2D, value); - iv.x += imageAtomicCompSwap(ii1D, ic1D, 18, 17); - ui += imageAtomicCompSwap(ui2D, ic2D, 19u, value); - - imageStore(wo2D, ic2D, v); - - fragData = ui != iv.y ? v : vec4(0.0); -} - +#version 450 + +layout(rgba32f, binding = 0) uniform image1D i1D; +layout(rgba32f, binding = 1) uniform image2D i2D; +layout(rgba32f, binding = 2) uniform image3D i3D; +layout(rgba32f, binding = 3) uniform imageCube iCube; +layout(rgba32f, binding = 4) uniform imageCubeArray iCubeArray; +layout(rgba32f, binding = 5) uniform image2DRect i2DRect; +layout(rgba32f, binding = 6) uniform image1DArray i1DArray; +layout(rg16, binding = 7) uniform image2DArray i2DArray; +layout(rgba32f, binding = 8) uniform imageBuffer iBuffer; +layout(rgba32f, binding = 9) uniform image2DMS i2DMS; +layout(rgba32f, binding = 10) uniform image2DMSArray i2DMSArray; + +layout(r32i, binding = 11) uniform iimage1D ii1D; +layout(r32ui, binding = 12) uniform uimage2D ui2D; + +flat in int ic1D; +flat in ivec2 ic2D; +flat in ivec3 ic3D; +flat in ivec4 ic4D; + +writeonly layout(binding = 1) uniform image2D wo2D; + +flat in uint value; + +out vec4 fragData; + +void main() +{ + ivec3 iv = ivec3(0); + iv.x += imageSize(i1D); + iv.xy += imageSize(i2D); + iv.xyz += imageSize(i3D); + iv.xy += imageSize(iCube); + iv.xyz += imageSize(iCubeArray); + iv.xy += imageSize(i2DRect); + iv.xy += imageSize(i1DArray); + iv.xyz += imageSize(i2DArray); + iv.x += imageSize(iBuffer); + iv.xy += imageSize(i2DMS); + iv.xyz += imageSize(i2DMSArray); + + iv.x += imageSamples(i2DMS); + iv.x += imageSamples(i2DMSArray); + + vec4 v = vec4(0.0); + v += imageLoad(i1D, ic1D); + imageStore(i1D, ic1D, v); + v += imageLoad(i2D, ic2D); + imageStore(i2D, ic2D, v); + v += imageLoad(i3D, ic3D); + imageStore(i3D, ic3D, v); + v += imageLoad(iCube, ic3D); + imageStore(iCube, ic3D, v); + v += imageLoad(iCubeArray, ic3D); + imageStore(iCubeArray, ic3D, v); + v += imageLoad(i2DRect, ic2D); + imageStore(i2DRect, ic2D, v); + v += imageLoad(i1DArray, ic2D); + imageStore(i1DArray, ic2D, v); + v += imageLoad(i2DArray, ic3D); + imageStore(i2DArray, ic3D, v); + v += imageLoad(iBuffer, ic1D); + imageStore(iBuffer, ic1D, v); + v += imageLoad(i2DMS, ic2D, 1); + imageStore(i2DMS, ic2D, 2, v); + v += imageLoad(i2DMSArray, ic3D, 3); + imageStore(i2DMSArray, ic3D, 4, v); + + uint ui = 0; + iv.x += imageAtomicAdd(ii1D, ic1D, 10); + ui += imageAtomicAdd(ui2D, ic2D, value); + iv.x += imageAtomicMin(ii1D, ic1D, 11); + ui += imageAtomicMin(ui2D, ic2D, value); + iv.x += imageAtomicMax(ii1D, ic1D, 12); + ui += imageAtomicMax(ui2D, ic2D, value); + iv.x += imageAtomicAnd(ii1D, ic1D, 13); + ui += imageAtomicAnd(ui2D, ic2D, value); + iv.x += imageAtomicOr(ii1D, ic1D, 14); + ui += imageAtomicOr(ui2D, ic2D, value); + iv.x += imageAtomicXor(ii1D, ic1D, 15); + ui += imageAtomicXor(ui2D, ic2D, value); + iv.x += imageAtomicExchange(ii1D, ic1D, 16); + ui += imageAtomicExchange(ui2D, ic2D, value); + iv.x += imageAtomicCompSwap(ii1D, ic1D, 18, 17); + ui += imageAtomicCompSwap(ui2D, ic2D, 19u, value); + + imageStore(wo2D, ic2D, v); + + fragData = ui != iv.y ? v : vec4(0.0); +} + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.image.load-formatted.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.image.load-formatted.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.image.load-formatted.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.image.load-formatted.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,74 +1,74 @@ -#version 450 - -#extension GL_EXT_shader_image_load_formatted : require - -layout(binding = 0) uniform image1D i1D; -layout(binding = 1) uniform image2D i2D; -layout(binding = 2) uniform image3D i3D; -layout(binding = 3) uniform imageCube iCube; -layout(binding = 4) uniform imageCubeArray iCubeArray; -layout(binding = 5) uniform image2DRect i2DRect; -layout(binding = 6) uniform image1DArray i1DArray; -layout(binding = 7) uniform image2DArray i2DArray; -layout(binding = 8) uniform imageBuffer iBuffer; -layout(binding = 9) uniform image2DMS i2DMS; -layout(binding = 10) uniform image2DMSArray i2DMSArray; - -flat in int ic1D; -flat in ivec2 ic2D; -flat in ivec3 ic3D; -flat in ivec4 ic4D; - -writeonly layout(binding = 1) uniform image2D wo2D; - -flat in uint value; - -out vec4 fragData; - -void main() -{ - ivec3 iv = ivec3(0); - iv.x += imageSize(i1D); - iv.xy += imageSize(i2D); - iv.xyz += imageSize(i3D); - iv.xy += imageSize(iCube); - iv.xyz += imageSize(iCubeArray); - iv.xy += imageSize(i2DRect); - iv.xy += imageSize(i1DArray); - iv.xyz += imageSize(i2DArray); - iv.x += imageSize(iBuffer); - iv.xy += imageSize(i2DMS); - iv.xyz += imageSize(i2DMSArray); - - iv.x += imageSamples(i2DMS); - iv.x += imageSamples(i2DMSArray); - - vec4 v = vec4(0.0); - v += imageLoad(i1D, ic1D); - imageStore(i1D, ic1D, v); - v += imageLoad(i2D, ic2D); - imageStore(i2D, ic2D, v); - v += imageLoad(i3D, ic3D); - imageStore(i3D, ic3D, v); - v += imageLoad(iCube, ic3D); - imageStore(iCube, ic3D, v); - v += imageLoad(iCubeArray, ic3D); - imageStore(iCubeArray, ic3D, v); - v += imageLoad(i2DRect, ic2D); - imageStore(i2DRect, ic2D, v); - v += imageLoad(i1DArray, ic2D); - imageStore(i1DArray, ic2D, v); - v += imageLoad(i2DArray, ic3D); - imageStore(i2DArray, ic3D, v); - v += imageLoad(iBuffer, ic1D); - imageStore(iBuffer, ic1D, v); - v += imageLoad(i2DMS, ic2D, 1); - imageStore(i2DMS, ic2D, 2, v); - v += imageLoad(i2DMSArray, ic3D, 3); - imageStore(i2DMSArray, ic3D, 4, v); - - imageStore(wo2D, ic2D, v); - - fragData = v; -} - +#version 450 + +#extension GL_EXT_shader_image_load_formatted : require + +layout(binding = 0) uniform image1D i1D; +layout(binding = 1) uniform image2D i2D; +layout(binding = 2) uniform image3D i3D; +layout(binding = 3) uniform imageCube iCube; +layout(binding = 4) uniform imageCubeArray iCubeArray; +layout(binding = 5) uniform image2DRect i2DRect; +layout(binding = 6) uniform image1DArray i1DArray; +layout(binding = 7) uniform image2DArray i2DArray; +layout(binding = 8) uniform imageBuffer iBuffer; +layout(binding = 9) uniform image2DMS i2DMS; +layout(binding = 10) uniform image2DMSArray i2DMSArray; + +flat in int ic1D; +flat in ivec2 ic2D; +flat in ivec3 ic3D; +flat in ivec4 ic4D; + +writeonly layout(binding = 1) uniform image2D wo2D; + +flat in uint value; + +out vec4 fragData; + +void main() +{ + ivec3 iv = ivec3(0); + iv.x += imageSize(i1D); + iv.xy += imageSize(i2D); + iv.xyz += imageSize(i3D); + iv.xy += imageSize(iCube); + iv.xyz += imageSize(iCubeArray); + iv.xy += imageSize(i2DRect); + iv.xy += imageSize(i1DArray); + iv.xyz += imageSize(i2DArray); + iv.x += imageSize(iBuffer); + iv.xy += imageSize(i2DMS); + iv.xyz += imageSize(i2DMSArray); + + iv.x += imageSamples(i2DMS); + iv.x += imageSamples(i2DMSArray); + + vec4 v = vec4(0.0); + v += imageLoad(i1D, ic1D); + imageStore(i1D, ic1D, v); + v += imageLoad(i2D, ic2D); + imageStore(i2D, ic2D, v); + v += imageLoad(i3D, ic3D); + imageStore(i3D, ic3D, v); + v += imageLoad(iCube, ic3D); + imageStore(iCube, ic3D, v); + v += imageLoad(iCubeArray, ic3D); + imageStore(iCubeArray, ic3D, v); + v += imageLoad(i2DRect, ic2D); + imageStore(i2DRect, ic2D, v); + v += imageLoad(i1DArray, ic2D); + imageStore(i1DArray, ic2D, v); + v += imageLoad(i2DArray, ic3D); + imageStore(i2DArray, ic3D, v); + v += imageLoad(iBuffer, ic1D); + imageStore(iBuffer, ic1D, v); + v += imageLoad(i2DMS, ic2D, 1); + imageStore(i2DMS, ic2D, 2, v); + v += imageLoad(i2DMSArray, ic3D, 3); + imageStore(i2DMSArray, ic3D, 4, v); + + imageStore(wo2D, ic2D, v); + + fragData = v; +} + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.imageLoadStoreLod.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.imageLoadStoreLod.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.imageLoadStoreLod.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.imageLoadStoreLod.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,36 +1,36 @@ -#version 450 core - -#extension GL_AMD_shader_image_load_store_lod: enable - -layout(rgba32f, binding = 0) uniform image1D i1D; -layout(rgba32f, binding = 1) uniform image2D i2D; -layout(rgba32f, binding = 2) uniform image3D i3D; -layout(rgba32i, binding = 3) uniform iimageCube iiCube; -layout(rgba32i, binding = 4) uniform iimage1DArray ii1DArray; -layout(rgba32ui, binding = 5) uniform uimage2DArray ui2DArray; -layout(rgba32ui, binding = 6) uniform uimageCubeArray uiCubeArray; - -layout(location = 0) out vec4 fragColor; - -void main() -{ - const int c1 = 1; - const ivec2 c2 = ivec2(2, 3); - const ivec3 c3 = ivec3(4, 5, 6); - - const int lod = 3; - - vec4 f4 = vec4(0.0); - f4 += imageLoadLodAMD(i1D, c1, lod); - f4 += imageLoadLodAMD(i2D, c2, lod); - f4 += imageLoadLodAMD(i3D, c3, lod); - - imageStoreLodAMD(iiCube, c3, lod, ivec4(f4)); - imageStoreLodAMD(ii1DArray, c2, lod, ivec4(f4)); - - uvec4 u4; - sparseImageLoadLodAMD(ui2DArray, c3, lod, u4); - sparseImageLoadLodAMD(uiCubeArray, c3, lod, u4); - - fragColor = f4 + vec4(u4); +#version 450 core + +#extension GL_AMD_shader_image_load_store_lod: enable + +layout(rgba32f, binding = 0) uniform image1D i1D; +layout(rgba32f, binding = 1) uniform image2D i2D; +layout(rgba32f, binding = 2) uniform image3D i3D; +layout(rgba32i, binding = 3) uniform iimageCube iiCube; +layout(rgba32i, binding = 4) uniform iimage1DArray ii1DArray; +layout(rgba32ui, binding = 5) uniform uimage2DArray ui2DArray; +layout(rgba32ui, binding = 6) uniform uimageCubeArray uiCubeArray; + +layout(location = 0) out vec4 fragColor; + +void main() +{ + const int c1 = 1; + const ivec2 c2 = ivec2(2, 3); + const ivec3 c3 = ivec3(4, 5, 6); + + const int lod = 3; + + vec4 f4 = vec4(0.0); + f4 += imageLoadLodAMD(i1D, c1, lod); + f4 += imageLoadLodAMD(i2D, c2, lod); + f4 += imageLoadLodAMD(i3D, c3, lod); + + imageStoreLodAMD(iiCube, c3, lod, ivec4(f4)); + imageStoreLodAMD(ii1DArray, c2, lod, ivec4(f4)); + + uvec4 u4; + sparseImageLoadLodAMD(ui2DArray, c3, lod, u4); + sparseImageLoadLodAMD(uiCubeArray, c3, lod, u4); + + fragColor = f4 + vec4(u4); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.int16.amd.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.int16.amd.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.int16.amd.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.int16.amd.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,314 @@ +#version 450 core + +#extension GL_ARB_gpu_shader_int64: enable +#extension GL_AMD_gpu_shader_half_float: enable +#extension GL_AMD_gpu_shader_int16: enable + +layout(binding = 0) uniform Uniforms +{ + uint i; +}; + +// int16/uint16 in block +layout(std140, binding = 1) uniform Block +{ + i16vec3 i16v; + uint16_t u16; +} block; + +// int16/uint16 for input +layout(location = 0) in flat u16vec3 iu16v; +layout(location = 1) in flat int16_t ii16; + +void literal() +{ + const int16_t i16c[3] = + { + 0x111S, // Hex + -2s, // Dec + 0400s, // Oct + }; + + const uint16_t u16c[] = + { + 0xFFFFus, // Hex + 65535US, // Dec + 0177777us, // Oct + }; + + uint16_t u16 = i16c[i] + u16c[i]; +} + +void operators() +{ + u16vec3 u16v; + int16_t i16; + uint16_t u16; + int i; + uint u; + bool b; + + // Unary + u16v++; + i16--; + ++i16; + --u16v; + + u16v = ~u16v; + + i16 = +i16; + u16v = -u16v; + + // Arithmetic + u16 += i16; + u16v -= u16v; + i16 *= i16; + u16v /= u16v; + u16v %= i16; + + u16v = u16v + u16v; + u16 = i16 - u16; + u16v = u16v * i16; + i16 = i16 * i16; + i16 = i16 % i16; + + // Shift + u16v <<= i16; + i16 >>= u16v.y; + + i16 = i16 << u16v.z; + u16v = u16v << i16; + + // Relational + b = (u16v.x != i16); + b = (i16 == u16v.x); + b = (u16v.x > u16v.y); + b = (i16 < u); + b = (u16v.y >= u16v.x); + b = (i16 <= i); + + // Bitwise + u16v |= i16; + u16 = i16 | u16; + i16 &= i16; + u16v = u16v & u16v; + u16v ^= i16; + u16v = u16v ^ i16; +} + +void typeCast() +{ + bvec2 bv; + ivec2 iv; + uvec2 uv; + vec2 fv; + dvec2 dv; + + f16vec2 f16v; + i64vec2 i64v; + u64vec2 u64v; + i16vec2 i16v; + u16vec2 u16v; + + i16v = i16vec2(bv); // bool -> int16 + u16v = u16vec2(bv); // bool -> uint16 + bv = bvec2(i16v); // int16 -> bool + bv = bvec2(u16v); // uint16 -> bool + + i16v = i16vec2(iv); // int -> int16 + u16v = u16vec2(iv); // int -> uint16 + iv = i16v; // int16 -> int + iv = ivec2(u16v); // uint16 -> int + + i16v = i16vec2(uv); // uint -> int16 + u16v = u16vec2(uv); // uint -> uint16 + uv = i16v; // int16 -> uint + uv = u16v; // uint16 -> uint + + i16v = i16vec2(fv); // float -> int16 + u16v = u16vec2(fv); // float -> uint16 + fv = i16v; // int16 -> float + fv = u16v; // uint16 -> float + + i16v = i16vec2(dv); // double -> int16 + u16v = u16vec2(dv); // double -> uint16 + dv = i16v; // int16 -> double + dv = u16v; // uint16 -> double + + i16v = i16vec2(f16v); // float16 -> int16 + u16v = u16vec2(f16v); // float16 -> uint16 + f16v = i16v; // int16 -> float16 + f16v = u16v; // uint16 -> float16 + + i16v = i16vec2(i64v); // int64 -> int16 + u16v = u16vec2(i64v); // int64 -> uint16 + i64v = i16v; // int16 -> int64 + i64v = i64vec2(u16v); // uint16 -> int64 + + i16v = i16vec2(u64v); // uint64 -> int16 + u16v = u16vec2(u64v); // uint64 -> uint16 + u64v = i16v; // int16 -> uint64 + u64v = u16v; // uint16 -> uint64 + + i16v = i16vec2(u16v); // uint16 -> int16 + u16v = i16v; // int16 -> uint16 +} + +void builtinFuncs() +{ + i16vec2 i16v; + u16vec3 u16v; + f16vec3 f16v; + bvec3 bv; + + int16_t i16; + uint16_t u16; + + // abs() + i16v = abs(i16v); + + // sign() + i16v = sign(i16v); + + // min() + i16v = min(i16v, i16); + i16v = min(i16v, i16vec2(-1s)); + u16v = min(u16v, u16); + u16v = min(u16v, u16vec3(0us)); + + // max() + i16v = max(i16v, i16); + i16v = max(i16v, i16vec2(-1s)); + u16v = max(u16v, u16); + u16v = max(u16v, u16vec3(0us)); + + // clamp() + i16v = clamp(i16v, -i16, i16); + i16v = clamp(i16v, -i16v, i16v); + u16v = clamp(u16v, -u16, u16); + u16v = clamp(u16v, -u16v, u16v); + + // mix() + i16 = mix(i16v.x, i16v.y, true); + i16v = mix(i16vec2(i16), i16vec2(-i16), bvec2(false)); + u16 = mix(u16v.x, u16v.y, true); + u16v = mix(u16vec3(u16), u16vec3(-u16), bvec3(false)); + + // frexp() + i16vec3 exp; + f16v = frexp(f16v, exp); + + // ldexp() + f16v = ldexp(f16v, exp); + + // float16BitsToInt16() + i16v = float16BitsToInt16(f16v.xy); + + // float16BitsToUint16() + u16v.x = float16BitsToUint16(f16v.z); + + // int16BitsToFloat16() + f16v.xy = int16BitsToFloat16(i16v); + + // uint16BitsToFloat16() + f16v = uint16BitsToFloat16(u16v); + + // packInt2x16() + int packi = packInt2x16(i16v); + + // unpackInt2x16() + i16v = unpackInt2x16(packi); + + // packUint2x16() + uint packu = packUint2x16(u16v.xy); + + // unpackUint2x16() + u16v.xy = unpackUint2x16(packu); + + // packInt4x16() + int64_t packi64 = packInt4x16(i16vec4(i16)); + + // unpackInt4x16() + i16v = unpackInt4x16(packi64).xy; + + // packUint4x16() + uint64_t packu64 = packUint4x16(u16vec4(u16)); + + // unpackUint4x16() + u16v = unpackUint4x16(packu64).xyz; + + // lessThan() + bv = lessThan(u16v, u16vec3(u16)); + bv.xy = lessThan(i16v, i16vec2(i16)); + + // lessThanEqual() + bv = lessThanEqual(u16v, u16vec3(u16)); + bv.xy = lessThanEqual(i16v, i16vec2(i16)); + + // greaterThan() + bv = greaterThan(u16v, u16vec3(u16)); + bv.xy = greaterThan(i16v, i16vec2(i16)); + + // greaterThanEqual() + bv = greaterThanEqual(u16v, u16vec3(u16)); + bv.xy = greaterThanEqual(i16v, i16vec2(i16)); + + // equal() + bv = equal(u16v, u16vec3(u16)); + bv.xy = equal(i16v, i16vec2(i16)); + + // notEqual() + bv = notEqual(u16v, u16vec3(u16)); + bv.xy = notEqual(i16v, i16vec2(i16)); +} + +// Type conversion for specialization constant +layout(constant_id = 100) const int64_t si64 = -10L; +layout(constant_id = 101) const uint64_t su64 = 20UL; +layout(constant_id = 102) const int si = -5; +layout(constant_id = 103) const uint su = 4; +layout(constant_id = 104) const bool sb = true; +layout(constant_id = 105) const int16_t si16 = -5S; +layout(constant_id = 106) const uint16_t su16 = 4US; + +// bool <-> int16/uint16 +const bool i16_to_b = bool(si16); +const bool u16_to_b = bool(su16); +const int16_t b_to_i16 = int16_t(sb); +const uint16_t b_to_u16 = uint16_t(sb); + +// int <-> int16/uint16 +const int i16_to_i = int(si16); +const int u16_to_i = int(su16); +const int16_t i_to_i16 = int16_t(si); +const uint16_t i_to_u16 = uint16_t(si); + +// uint <-> int16/uint16 +const uint i16_to_u = uint(si16); +const uint u16_to_u = uint(su16); +const int16_t u_to_i16 = int16_t(su); +const uint16_t u_to_u16 = uint16_t(su); + +// int64 <-> int16/uint16 +const int64_t i16_to_i64 = int64_t(si16); +const int64_t u16_to_i64 = int64_t(su16); +const int16_t i64_to_i16 = int16_t(si64); +const uint16_t i64_to_u16 = uint16_t(si64); + +// uint64 <-> int16/uint16 +const uint64_t i16_to_u64 = uint64_t(si16); +const uint64_t u16_to_u64 = uint64_t(su16); +const int16_t u64_to_i16 = int16_t(su64); +const uint16_t u64_to_u16 = uint16_t(su64); + +// int16 <-> uint16 +const uint16_t i16_to_u16 = uint16_t(si16); +const int16_t u16_to_i16 = int16_t(su16); + +void main() +{ + literal(); + operators(); + typeCast(); + builtinFuncs(); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.int16.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.int16.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.int16.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.int16.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,52 +1,121 @@ -#version 450 core +#version 450 -#extension GL_ARB_gpu_shader_int64: enable -#extension GL_AMD_gpu_shader_half_float: enable -#extension GL_AMD_gpu_shader_int16: enable +#extension GL_KHX_shader_explicit_arithmetic_types: enable +#extension GL_KHX_shader_explicit_arithmetic_types_int8: require +#extension GL_KHX_shader_explicit_arithmetic_types_int16: require +#extension GL_KHX_shader_explicit_arithmetic_types_int32: require +#extension GL_KHX_shader_explicit_arithmetic_types_int64: require +#extension GL_KHX_shader_explicit_arithmetic_types_float16: require +#extension GL_KHX_shader_explicit_arithmetic_types_float32: require +#extension GL_KHX_shader_explicit_arithmetic_types_float64: require layout(binding = 0) uniform Uniforms { - uint i; + uint index; }; -// int16/uint16 in block layout(std140, binding = 1) uniform Block { - i16vec3 i16v; - uint16_t u16; + int16_t i16; + i16vec2 i16v2; + i16vec3 i16v3; + i16vec4 i16v4; + uint16_t u16; + u16vec2 u16v2; + u16vec3 u16v3; + u16vec4 u16v4; } block; -// int16/uint16 for input -layout(location = 0) in flat u16vec3 iu16v; -layout(location = 1) in flat int16_t ii16; +void main() +{ +} void literal() { - const int16_t i16c[3] = + const int16_t i16Const[3] = { - 0x111S, // Hex - -2s, // Dec - 0400s, // Oct + int16_t(-0x1111), // Hex + int16_t(-1), // Dec + int16_t(040000), // Oct }; - const uint16_t u16c[] = + int16_t i16 = i16Const[index]; + + const uint16_t u16Const[] = { - 0xFFFFus, // Hex - 65535US, // Dec - 0177777us, // Oct + uint16_t(0xFFFF), // Hex + uint16_t(65535), // Dec + uint16_t(077777), // Oct }; - uint16_t u16 = i16c[i] + u16c[i]; + uint16_t u16 = u16Const[index]; } +void typeCast16() +{ + i8vec2 i8v; + u8vec2 u8v; + i16vec2 i16v; + u16vec2 u16v; + i32vec2 i32v; + u32vec2 u32v; + i64vec2 i64v; + u64vec2 u64v; + f16vec2 f16v; + f32vec2 f32v; + f64vec2 f64v; + bvec2 bv; + + i32v = i16v; // int16_t -> int32_t + i32v = u16v; // uint16_t -> int32_t + u16v = i16v; // int16_t -> uint16_t + u32v = i16v; // int16_t -> uint32_t + i64v = i16v; // int16_t -> int64_t + u64v = i16v; // int16_t -> uint64_t + u32v = u16v; // uint16_t -> uint32_t + i64v = u16v; // uint16_t -> int64_t + u64v = u16v; // uint16_t -> uint64_t + f16v = i16v; // int16_t -> float16_t + f32v = i16v; // int16_t -> float32_t + f64v = i16v; // int16_t -> float64_t + f16v = u16v; // uint16_t -> float16_t + f32v = u16v; // uint16_t -> float32_t + f64v = u16v; // uint16_t -> float64_t + + i32v = i32vec2(i16v); // int16_t -> int32_t + i32v = i32vec2(u16v); // uint16_t -> int32_t + u16v = u16vec2(i16v); // int16_t -> uint16_t + u32v = u32vec2(i16v); // int16_t -> uint32_t + i64v = i64vec2(i16v); // int16_t -> int64_t + u64v = i64vec2(i16v); // int16_t -> uint64_t + u32v = u32vec2(u16v); // uint16_t -> uint32_t + i64v = i64vec2(u16v); // uint16_t -> int64_t + u64v = i64vec2(u16v); // uint16_t -> uint64_t + f16v = f16vec2(i16v); // int16_t -> float16_t + f32v = f32vec2(i16v); // int16_t -> float32_t + f64v = f64vec2(i16v); // int16_t -> float64_t + f16v = f16vec2(u16v); // uint16_t -> float16_t + f32v = f32vec2(u16v); // uint16_t -> float32_t + f64v = f64vec2(u16v); // uint16_t -> float64_t + + i8v = i8vec2(i16v); // int16_t -> int8_t + i8v = i8vec2(u16v); // uint16_t -> int8_t + u8v = u8vec2(i16v); // int16_t -> uint8_t + u8v = u8vec2(u16v); // uint16_t -> uint8_t + i16v = u8vec2(u16v); // uint16_t -> int16_t + i16v = i16vec2(bv); // bool -> int16 + u16v = u16vec2(bv); // bool -> uint16 + bv = bvec2(i16v); // int16 -> bool + bv = bvec2(u16v); // uint16 -> bool +} void operators() { - u16vec3 u16v; - int16_t i16; - uint16_t u16; - int i; - uint u; - bool b; + u16vec3 u16v; + int16_t i16; + uvec3 uv; + int32_t i; + int64_t i64; + bool b; // Unary u16v++; @@ -60,127 +129,74 @@ u16v = -u16v; // Arithmetic - u16 += i16; + i16 += i16; u16v -= u16v; - i16 *= i16; - u16v /= u16v; - u16v %= i16; - - u16v = u16v + u16v; - u16 = i16 - u16; - u16v = u16v * i16; - i16 = i16 * i16; - i16 = i16 % i16; + i *= i16; + uv /= u16v; + uv %= i16; + + uv = u16v + uv; + i64 = i16 - i64; + uv = u16v * uv; + i64 = i16 * i64; + i = i16 % i; // Shift - u16v <<= i; + u16v <<= i16; i16 >>= u16v.y; i16 = i16 << u16v.z; - u16v = u16v << i16; + uv = u16v << i; // Relational b = (u16v.x != i16); b = (i16 == u16v.x); - b = (u16v.x > u16v.y); - b = (i16 < u); - b = (u16v.y >= u16v.x); + b = (u16v.x > uv.y); + b = (i16 < i); + b = (u16v.y >= uv.x); b = (i16 <= i); // Bitwise - u16v |= i16; - u16 = i16 | u16; - i16 &= i16; - u16v = u16v & u16v; - u16v ^= i16; + uv |= i16; + i = i16 | i; + i64 &= i16; + uv = u16v & uv; + uv ^= i16; u16v = u16v ^ i16; } -void typeCast() -{ - bvec2 bv; - ivec2 iv; - uvec2 uv; - vec2 fv; - dvec2 dv; - - f16vec2 f16v; - i64vec2 i64v; - u64vec2 u64v; - i16vec2 i16v; - u16vec2 u16v; - - i16v = i16vec2(bv); // bool -> int16 - u16v = u16vec2(bv); // bool -> uint16 - bv = bvec2(i16v); // int16 -> bool - bv = bvec2(u16v); // uint16 -> bool - - i16v = i16vec2(iv); // int -> int16 - u16v = u16vec2(iv); // int -> uint16 - iv = i16v; // int16 -> int - iv = ivec2(u16v); // uint16 -> int - - i16v = i16vec2(uv); // uint -> int16 - u16v = u16vec2(uv); // uint -> uint16 - uv = i16v; // int16 -> uint - uv = u16v; // uint16 -> uint - - i16v = i16vec2(fv); // float -> int16 - u16v = u16vec2(fv); // float -> uint16 - fv = i16v; // int16 -> float - fv = u16v; // uint16 -> float - - i16v = i16vec2(dv); // double -> int16 - u16v = u16vec2(dv); // double -> uint16 - dv = i16v; // int16 -> double - dv = u16v; // uint16 -> double - - i16v = i16vec2(f16v); // float16 -> int16 - u16v = u16vec2(f16v); // float16 -> uint16 - f16v = i16v; // int16 -> float16 - f16v = u16v; // uint16 -> float16 - - i16v = i16vec2(i64v); // int64 -> int16 - u16v = u16vec2(i64v); // int64 -> uint16 - i64v = i16v; // int16 -> int64 - i64v = i64vec2(u16v); // uint16 -> int64 - - i16v = i16vec2(u64v); // uint64 -> int16 - u16v = u16vec2(u64v); // uint64 -> uint16 - u64v = i16v; // int16 -> uint64 - u64v = u16v; // uint16 -> uint64 - - i16v = i16vec2(u16v); // uint16 -> int16 - u16v = i16v; // int16 -> uint16 -} - void builtinFuncs() { i16vec2 i16v; + i16vec4 i16v4; u16vec3 u16v; - f16vec3 f16v; - bvec3 bv; - - int16_t i16; + u16vec2 u16v2; + u16vec4 u16v4; + bvec3 bv; + int16_t i16; uint16_t u16; + int32_t i32; + uint32_t u32; + int64_t i64; + uint64_t u64; // abs() i16v = abs(i16v); // sign() - i16v = sign(i16v); + i16 = sign(i16); // min() i16v = min(i16v, i16); - i16v = min(i16v, i16vec2(-1s)); + i16v = min(i16v, i16vec2(-1)); u16v = min(u16v, u16); - u16v = min(u16v, u16vec3(0us)); + u16v = min(u16v, u16vec3(0)); // max() i16v = max(i16v, i16); - i16v = max(i16v, i16vec2(-1s)); + i16v = max(i16v, i16vec2(-1)); u16v = max(u16v, u16); - u16v = max(u16v, u16vec3(0us)); + u16v = max(u16v, u16vec3(0)); // clamp() i16v = clamp(i16v, -i16, i16); @@ -194,48 +210,16 @@ u16 = mix(u16v.x, u16v.y, true); u16v = mix(u16vec3(u16), u16vec3(-u16), bvec3(false)); - // frexp() - i16vec3 exp; - f16v = frexp(f16v, exp); - - // ldexp() - f16v = ldexp(f16v, exp); - - // float16BitsToInt16() - i16v = float16BitsToInt16(f16v.xy); - - // float16BitsToUint16() - u16v.x = float16BitsToUint16(f16v.z); - - // int16BitsToFloat16() - f16v.xy = int16BitsToFloat16(i16v); - - // uint16BitsToFloat16() - f16v = uint16BitsToFloat16(u16v); - - // packInt2x16() - int packi = packInt2x16(i16v); - - // unpackInt2x16() - i16v = unpackInt2x16(packi); - - // packUint2x16() - uint packu = packUint2x16(u16v.xy); - - // unpackUint2x16() - u16v.xy = unpackUint2x16(packu); - - // packInt4x16() - int64_t packi64 = packInt4x16(i16vec4(i16)); - - // unpackInt4x16() - i16v = unpackInt4x16(packi64).xy; - - // packUint4x16() - uint64_t packu64 = packUint4x16(u16vec4(u16)); - - // unpackUint4x16() - u16v = unpackUint4x16(packu64).xyz; + //pack + i32 = pack32(i16v); + i64 = pack64(i16v4); + u32 = pack32(u16v2); + u64 = pack64(u16v4); + + i16v = unpack16(i32); + i16v4 = unpack16(i64); + u16v2 = unpack16(u32); + u16v4 = unpack16(u64); // lessThan() bv = lessThan(u16v, u16vec3(u16)); @@ -263,52 +247,5 @@ } // Type conversion for specialization constant -layout(constant_id = 100) const int64_t si64 = -10L; -layout(constant_id = 101) const uint64_t su64 = 20UL; -layout(constant_id = 102) const int si = -5; -layout(constant_id = 103) const uint su = 4; -layout(constant_id = 104) const bool sb = true; -layout(constant_id = 105) const int16_t si16 = -5S; -layout(constant_id = 106) const uint16_t su16 = 4US; - -// bool <-> int16/uint16 -const bool i16_to_b = bool(si16); -const bool u16_to_b = bool(su16); -const int16_t b_to_i16 = int16_t(sb); -const uint16_t b_to_u16 = uint16_t(sb); - -// int <-> int16/uint16 -const int i16_to_i = int(si16); -const int u16_to_i = int(su16); -const int16_t i_to_i16 = int16_t(si); -const uint16_t i_to_u16 = uint16_t(si); - -// uint <-> int16/uint16 -const uint i16_to_u = uint(si16); -const uint u16_to_u = uint(su16); -const int16_t u_to_i16 = int16_t(su); -const uint16_t u_to_u16 = uint16_t(su); - -// int64 <-> int16/uint16 -const int64_t i16_to_i64 = int64_t(si16); -const int64_t u16_to_i64 = int64_t(su16); -const int16_t i64_to_i16 = int16_t(si64); -const uint16_t i64_to_u16 = uint16_t(si64); - -// uint64 <-> int16/uint16 -const uint64_t i16_to_u64 = uint64_t(si16); -const uint64_t u16_to_u64 = uint64_t(su16); -const int16_t u64_to_i16 = int16_t(su64); -const uint16_t u64_to_u16 = uint16_t(su64); - -// int16 <-> uint16 -const uint16_t i16_to_u16 = uint16_t(si16); -const int16_t u16_to_i16 = int16_t(su16); - -void main() -{ - literal(); - operators(); - typeCast(); - builtinFuncs(); -} +layout(constant_id = 100) const int16_t si16 = int16_t(-10); +layout(constant_id = 101) const uint16_t su16 = uint16_t(20); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.int32.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.int32.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.int32.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.int32.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,256 @@ +#version 450 + +#extension GL_KHX_shader_explicit_arithmetic_types: enable +#extension GL_KHX_shader_explicit_arithmetic_types_int8: require +#extension GL_KHX_shader_explicit_arithmetic_types_int16: require +#extension GL_KHX_shader_explicit_arithmetic_types_int32: require +#extension GL_KHX_shader_explicit_arithmetic_types_int64: require +#extension GL_KHX_shader_explicit_arithmetic_types_float16: require +#extension GL_KHX_shader_explicit_arithmetic_types_float32: require +#extension GL_KHX_shader_explicit_arithmetic_types_float64: require + +layout(binding = 0) uniform Uniforms +{ + uint index; +}; + +layout(std140, binding = 1) uniform Block +{ + int32_t i32; + i32vec2 i32v2; + i32vec3 i32v3; + i32vec4 i32v4; + uint32_t u32; + u32vec2 u32v2; + u32vec3 u32v3; + u32vec4 u32v4; +} block; + +void main() +{ +} + +void literal() +{ + + const int32_t i32Const[3] = + { + -0x11111111, // Hex + -1, // Dec + 04000000000, // Oct + }; + + int32_t i32 = i32Const[index]; + + const uint32_t u32Const[] = + { + 0xFFFFFFFF, // Hex + 4294967295, // Dec + 017777777777, // Oct + }; + + uint32_t u32 = u32Const[index]; +} + +void typeCast32() +{ + i8vec2 i8v; + u8vec2 u8v; + i16vec2 i16v; + u16vec2 u16v; + i32vec2 i32v; + u32vec2 u32v; + i64vec2 i64v; + u64vec2 u64v; + f16vec2 f16v; + f32vec2 f32v; + f64vec2 f64v; + bvec2 bv; + + u32v = i32v; // int32_t -> uint32_t + i64v = i32v; // int32_t -> int64_t + u64v = i32v; // int32_t -> uint64_t + i64v = u32v; // uint32_t -> int64_t + u64v = u32v; // uint32_t -> uint64_t + f32v = i32v; // int32_t -> float32_t + f64v = i32v; // int32_t -> float64_t + f32v = u32v; // uint32_t -> float32_t + f64v = u32v; // uint32_t -> float64_t + + i8v = i8vec2(i32v); // int32_t -> int8_t + i8v = i8vec2(u32v); // uint32_t -> int8_t + i16v = i16vec2(i32v); // int32_t -> int16_t + i16v = i16vec2(u32v); // uint32_t -> int16_t + i32v = i32vec2(i32v); // int32_t -> int32_t + i32v = i32vec2(u32v); // uint32_t -> int32_t + i64v = i64vec2(i32v); // int32_t -> int64_t + i64v = i64vec2(u32v); // uint32_t -> int64_t + u8v = u8vec2(i32v); // int32_t -> uint8_t + u8v = u8vec2(u32v); // uint32_t -> uint8_t + u16v = u16vec2(i32v); // int32_t -> uint16_t + u16v = u16vec2(u32v); // uint32_t -> uint16_t + u32v = u32vec2(i32v); // int32_t -> uint32_t + u32v = u32vec2(u32v); // uint32_t -> uint32_t + u64v = u64vec2(i32v); // int32_t -> uint64_t + u64v = u64vec2(u32v); // uint32_t -> uint64_t + + f16v = f16vec2(i32v); // int32_t -> float16_t + f32v = f32vec2(i32v); // int32_t -> float32_t + f64v = f64vec2(i32v); // int32_t -> float64_t + f16v = f16vec2(u32v); // uint32_t -> float16_t + f32v = f32vec2(u32v); // uint32_t -> float32_t + f64v = f64vec2(u32v); // uint32_t -> float64_t + + i32v = i32vec2(bv); // bool -> int32 + u32v = u32vec2(bv); // bool -> uint32 + bv = bvec2(i32v); // int32 -> bool + bv = bvec2(u32v); // uint32 -> bool +} + +void operators() +{ + u32vec3 u32v; + int32_t i32; + uvec3 uv; + int32_t i; + int64_t i64; + bool b; + + // Unary + u32v++; + i32--; + ++i32; + --u32v; + + u32v = ~u32v; + + i32 = +i32; + u32v = -u32v; + + // Arithmetic + i32 += i32; + u32v -= u32v; + i *= i32; + uv /= u32v; + uv %= i32; + + uv = u32v + uv; + i64 = i32 - i64; + uv = u32v * uv; + i64 = i32 * i64; + i = i32 % i; + + // Shift + u32v <<= i32; + i32 >>= u32v.y; + + i64 = i64 << u32v.z; + uv = u32v << i; + + // Relational + b = (u32v.x != i32); + b = (i32 == u32v.x); + b = (u32v.x > uv.y); + b = (i32 < i); + b = (u32v.y >= uv.x); + b = (i32 <= i); + + // Bitwise + uv |= i32; + i = i32 | i; + i64 &= i32; + uv = u32v & uv; + uv ^= i32; + u32v = u32v ^ i32; +} + +void builtinFuncs() +{ + i32vec2 i32v; + i32vec4 i32v4; + u32vec3 u32v; + u32vec2 u32v2; + u32vec4 u32v4; + bvec3 bv; + int32_t i32; + uint32_t u32; + int64_t i64; + uint64_t u64; + i8vec4 i8v4; + u8vec4 u8v4; + i16vec2 i16v2; + u16vec2 u16v2; + + // abs() + i32v = abs(i32v); + + // sign() + i32 = sign(i32); + + // min() + i32v = min(i32v, i32); + i32v = min(i32v, i32vec2(-1)); + u32v = min(u32v, u32); + u32v = min(u32v, u32vec3(0)); + + // max() + i32v = max(i32v, i32); + i32v = max(i32v, i32vec2(-1)); + u32v = max(u32v, u32); + u32v = max(u32v, u32vec3(0)); + + // clamp() + i32v = clamp(i32v, -i32, i32); + i32v = clamp(i32v, -i32v, i32v); + u32v = clamp(u32v, -u32, u32); + u32v = clamp(u32v, -u32v, u32v); + + // mix() + i32 = mix(i32v.x, i32v.y, true); + i32v = mix(i32vec2(i32), i32vec2(-i32), bvec2(false)); + u32 = mix(u32v.x, u32v.y, true); + u32v = mix(u32vec3(u32), u32vec3(-u32), bvec3(false)); + + //pack + i32 = pack32(i8v4); + i32 = pack32(i16v2); + u32 = pack32(u8v4); + u32 = pack32(u16v2); + + i32v = unpack32(i64); + u32v2 = unpack32(u64); + + // lessThan() + bv = lessThan(u32v, u32vec3(u32)); + bv.xy = lessThan(i32v, i32vec2(i32)); + + // lessThanEqual() + bv = lessThanEqual(u32v, u32vec3(u32)); + bv.xy = lessThanEqual(i32v, i32vec2(i32)); + + // greaterThan() + bv = greaterThan(u32v, u32vec3(u32)); + bv.xy = greaterThan(i32v, i32vec2(i32)); + + // greaterThanEqual() + bv = greaterThanEqual(u32v, u32vec3(u32)); + bv.xy = greaterThanEqual(i32v, i32vec2(i32)); + + // equal() + bv = equal(u32v, u32vec3(u32)); + bv.xy = equal(i32v, i32vec2(i32)); + + // notEqual() + bv = notEqual(u32v, u32vec3(u32)); + bv.xy = notEqual(i32v, i32vec2(i32)); +} + +// Type conversion for specialization constant +layout(constant_id = 100) const int32_t si32 = -10; +layout(constant_id = 101) const uint32_t su32 = 20U; +layout(constant_id = 102) const int si = -5; +layout(constant_id = 103) const uint su = 4; +layout(constant_id = 104) const bool sb = true; + +#define UINT32_MAX 4294967295u +uint32_t u32Max = UINT32_MAX; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.int64.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.int64.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.int64.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.int64.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,264 +1,267 @@ -#version 450 - -#extension GL_ARB_gpu_shader_int64: enable - -layout(binding = 0) uniform Uniforms -{ - uint index; -}; - -layout(std140, binding = 1) uniform Block -{ - i64vec3 i64v; - uint64_t u64; -} block; - -void main() -{ -} - -void literal() -{ - const int64_t i64Const[3] = - { - -0x1111111111111111l, // Hex - -1l, // Dec - 040000000000l, // Oct - }; - - int64_t i64 = i64Const[index]; - - const uint64_t u64Const[] = - { - 0xFFFFFFFFFFFFFFFFul, // Hex - 4294967296UL, // Dec - 077777777777ul, // Oct - }; - - uint64_t u64 = u64Const[index]; -} - -void typeCast() -{ - bvec2 bv; - ivec2 iv; - uvec2 uv; - vec2 fv; - dvec2 dv; - - i64vec2 i64v; - u64vec2 u64v; - - i64v = i64vec2(bv); // bool -> int64 - u64v = u64vec2(bv); // bool -> uint64 - - i64v = iv; // int -> int64 - iv = ivec2(i64v); // int64 -> int - - u64v = uv; // uint -> uint64 - uv = uvec2(u64v); // uint64 -> uint - - fv = vec2(i64v); // int64 -> float - dv = i64v; // int64 -> double - - fv = vec2(u64v); // uint64 -> float - dv = u64v; // uint64 -> double - - i64v = i64vec2(fv); // float -> int64 - i64v = i64vec2(dv); // double -> int64 - - u64v = u64vec2(fv); // float -> uint64 - u64v = u64vec2(dv); // double -> uint64 - - bv = bvec2(i64v); // int64 -> bool - bv = bvec2(u64v); // uint64 -> bool - - u64v = i64v; // int64 -> uint64 - i64v = i64vec2(u64v); // uint64 -> int64 - - uv = uvec2(i64v); // int64 -> uint - i64v = i64vec2(uv); // uint -> int64 - iv = ivec2(u64v); // uint64 -> int - u64v = iv; // int -> uint64 -} - -void operators() -{ - u64vec3 u64v; - int64_t i64; - uvec3 uv; - int i; - bool b; - - // Unary - u64v++; - i64--; - ++i64; - --u64v; - - u64v = ~u64v; - - i64 = +i64; - u64v = -u64v; - - // Arithmetic - i64 += i64; - u64v -= u64v; - i64 *= i; - u64v /= uv; - u64v %= i; - - u64v = u64v + uv; - i64 = i64 - i; - u64v = u64v * uv; - i64 = i64 * i; - i64 = i64 % i; - - // Shift - u64v <<= i; - i64 >>= uv.y; - - i64 = i64 << u64v.z; - u64v = u64v << i64; - - // Relational - b = (u64v.x != i64); - b = (i64 == u64v.x); - b = (u64v.x > uv.y); - b = (i64 < i); - b = (u64v.y >= uv.x); - b = (i64 <= i); - - // Bitwise - u64v |= i; - i64 = i64 | i; - i64 &= i; - u64v = u64v & uv; - u64v ^= i64; - u64v = u64v ^ i64; -} - -void builtinFuncs() -{ - i64vec2 i64v; - u64vec3 u64v; - dvec3 dv; - bvec3 bv; - - int64_t i64; - uint64_t u64; - - // abs() - i64v = abs(i64v); - - // sign() - i64 = sign(i64); - - // min() - i64v = min(i64v, i64); - i64v = min(i64v, i64vec2(-1)); - u64v = min(u64v, u64); - u64v = min(u64v, u64vec3(0)); - - // max() - i64v = max(i64v, i64); - i64v = max(i64v, i64vec2(-1)); - u64v = max(u64v, u64); - u64v = max(u64v, u64vec3(0)); - - // clamp() - i64v = clamp(i64v, -i64, i64); - i64v = clamp(i64v, -i64v, i64v); - u64v = clamp(u64v, -u64, u64); - u64v = clamp(u64v, -u64v, u64v); - - // mix() - i64 = mix(i64v.x, i64v.y, true); - i64v = mix(i64vec2(i64), i64vec2(-i64), bvec2(false)); - u64 = mix(u64v.x, u64v.y, true); - u64v = mix(u64vec3(u64), u64vec3(-u64), bvec3(false)); - - // doubleBitsToInt64() - i64v = doubleBitsToInt64(dv.xy); - - // doubleBitsToUint64() - u64v.x = doubleBitsToUint64(dv.z); - - // int64BitsToDouble() - dv.xy = int64BitsToDouble(i64v); - - // uint64BitsToDouble() - dv = uint64BitsToDouble(u64v); - - // packInt2x32() - i64 = packInt2x32(ivec2(1, 2)); - - // unpackInt2x32() - ivec2 iv = unpackInt2x32(i64); - - // packUint2x32() - u64 = packUint2x32(uvec2(2, 3)); - - // unpackUint2x32() - uvec2 uv = unpackUint2x32(u64); - - // lessThan() - bv = lessThan(u64v, u64vec3(u64)); - bv.xy = lessThan(i64v, i64vec2(i64)); - - // lessThanEqual() - bv = lessThanEqual(u64v, u64vec3(u64)); - bv.xy = lessThanEqual(i64v, i64vec2(i64)); - - // greaterThan() - bv = greaterThan(u64v, u64vec3(u64)); - bv.xy = greaterThan(i64v, i64vec2(i64)); - - // greaterThanEqual() - bv = greaterThanEqual(u64v, u64vec3(u64)); - bv.xy = greaterThanEqual(i64v, i64vec2(i64)); - - // equal() - bv = equal(u64v, u64vec3(u64)); - bv.xy = equal(i64v, i64vec2(i64)); - - // notEqual() - bv = notEqual(u64v, u64vec3(u64)); - bv.xy = notEqual(i64v, i64vec2(i64)); -} - -// Type conversion for specialization constant -layout(constant_id = 100) const int64_t si64 = -10L; -layout(constant_id = 101) const uint64_t su64 = 20UL; -layout(constant_id = 102) const int si = -5; -layout(constant_id = 103) const uint su = 4; -layout(constant_id = 104) const bool sb = true; - -// bool <-> int64/uint64 -const bool i64_to_b = bool(si64); -const bool u64_to_b = bool(su64); -const int64_t b_to_i64 = int64_t(sb); -const uint64_t b_to_u64 = uint64_t(sb); - -// int <-> int64 -const int i64_to_i = int(si64); -const int64_t i_to_i64 = int64_t(si); - -// uint <-> uint64 -const uint u64_to_u = uint(su64); -const uint64_t u_to_u64 = uint64_t(su); - -// int64 <-> uint64 -const int64_t u64_to_i64 = int64_t(su64); -const uint64_t i64_to_u64 = uint64_t(si64); - -// int <-> uint64 -const int u64_to_i = int(su64); -const uint64_t i_to_u64 = uint64_t(si); - -// uint <-> int64 -const uint i64_to_u = uint(si64); -const int64_t u_to_i64 = int64_t(su); - -#define UINT64_MAX 18446744073709551615ul -uint64_t u64Max = UINT64_MAX; +#version 450 + +#extension GL_ARB_gpu_shader_int64: enable +#extension GL_KHX_shader_explicit_arithmetic_types_int64: require + +layout(binding = 0) uniform Uniforms +{ + uint index; +}; + +layout(std140, binding = 1) uniform Block +{ + i64vec3 i64v; + uint64_t u64; +} block; + +void main() +{ +} + +void literal() +{ + const int64_t i64Const[3] = + { + -0x1111111111111111l, // Hex + -1l, // Dec + 040000000000l, // Oct + }; + + int64_t i64 = i64Const[index]; + + const uint64_t u64Const[] = + { + 0xFFFFFFFFFFFFFFFFul, // Hex + 4294967296UL, // Dec + 077777777777ul, // Oct + }; + + uint64_t u64 = u64Const[index]; +} + +void typeCast() +{ + bvec2 bv; + ivec2 iv; + uvec2 uv; + vec2 fv; + dvec2 dv; + + i64vec2 i64v; + u64vec2 u64v; + + i64v = i64vec2(bv); // bool -> int64 + u64v = u64vec2(bv); // bool -> uint64 + + i64v = iv; // int -> int64 + iv = ivec2(i64v); // int64 -> int + + u64v = uv; // uint -> uint64 + uv = uvec2(u64v); // uint64 -> uint + + fv = vec2(i64v); // int64 -> float + dv = i64v; // int64 -> double + + fv = vec2(u64v); // uint64 -> float + dv = u64v; // uint64 -> double + + i64v = i64vec2(fv); // float -> int64 + i64v = i64vec2(dv); // double -> int64 + + u64v = u64vec2(fv); // float -> uint64 + u64v = u64vec2(dv); // double -> uint64 + + bv = bvec2(i64v); // int64 -> bool + bv = bvec2(u64v); // uint64 -> bool + + u64v = i64v; // int64 -> uint64 + i64v = i64vec2(u64v); // uint64 -> int64 + + uv = uvec2(i64v); // int64 -> uint + i64v = i64vec2(uv); // uint -> int64 + iv = ivec2(u64v); // uint64 -> int + u64v = iv; // int -> uint64 +} + +void operators() +{ + u64vec3 u64v; + int64_t i64; + uvec3 uv; + int i; + bool b; + + // Unary + u64v++; + i64--; + ++i64; + --u64v; + + u64v = ~u64v; + + i64 = +i64; + u64v = -u64v; + + // Arithmetic + i64 += i64; + u64v -= u64v; + i64 *= i; + u64v /= uv; + u64v %= i; + + u64v = u64v + uv; + i64 = i64 - i; + u64v = u64v * uv; + i64 = i64 * i; + i64 = i64 % i; + + // Shift + u64v = u64v << i; + i64 = i64 >> uv.y; + u64v <<= i; + i64 >>= uv.y; + + i64 = i64 << u64v.z; + u64v = u64v << i64; + + // Relational + b = (u64v.x != i64); + b = (i64 == u64v.x); + b = (u64v.x > uv.y); + b = (i64 < i); + b = (u64v.y >= uv.x); + b = (i64 <= i); + + // Bitwise + u64v |= i; + i64 = i64 | i; + i64 &= i; + u64v = u64v & uv; + u64v ^= i64; + u64v = u64v ^ i64; +} + +void builtinFuncs() +{ + i64vec2 i64v; + u64vec3 u64v; + dvec3 dv; + bvec3 bv; + + int64_t i64; + uint64_t u64; + + // abs() + i64v = abs(i64v); + + // sign() + i64 = sign(i64); + + // min() + i64v = min(i64v, i64); + i64v = min(i64v, i64vec2(-1)); + u64v = min(u64v, u64); + u64v = min(u64v, u64vec3(0)); + + // max() + i64v = max(i64v, i64); + i64v = max(i64v, i64vec2(-1)); + u64v = max(u64v, u64); + u64v = max(u64v, u64vec3(0)); + + // clamp() + i64v = clamp(i64v, -i64, i64); + i64v = clamp(i64v, -i64v, i64v); + u64v = clamp(u64v, -u64, u64); + u64v = clamp(u64v, -u64v, u64v); + + // mix() + i64 = mix(i64v.x, i64v.y, true); + i64v = mix(i64vec2(i64), i64vec2(-i64), bvec2(false)); + u64 = mix(u64v.x, u64v.y, true); + u64v = mix(u64vec3(u64), u64vec3(-u64), bvec3(false)); + + // doubleBitsToInt64() + i64v = doubleBitsToInt64(dv.xy); + + // doubleBitsToUint64() + u64v.x = doubleBitsToUint64(dv.z); + + // int64BitsToDouble() + dv.xy = int64BitsToDouble(i64v); + + // uint64BitsToDouble() + dv = uint64BitsToDouble(u64v); + + // packInt2x32() + i64 = packInt2x32(ivec2(1, 2)); + + // unpackInt2x32() + ivec2 iv = unpackInt2x32(i64); + + // packUint2x32() + u64 = packUint2x32(uvec2(2, 3)); + + // unpackUint2x32() + uvec2 uv = unpackUint2x32(u64); + + // lessThan() + bv = lessThan(u64v, u64vec3(u64)); + bv.xy = lessThan(i64v, i64vec2(i64)); + + // lessThanEqual() + bv = lessThanEqual(u64v, u64vec3(u64)); + bv.xy = lessThanEqual(i64v, i64vec2(i64)); + + // greaterThan() + bv = greaterThan(u64v, u64vec3(u64)); + bv.xy = greaterThan(i64v, i64vec2(i64)); + + // greaterThanEqual() + bv = greaterThanEqual(u64v, u64vec3(u64)); + bv.xy = greaterThanEqual(i64v, i64vec2(i64)); + + // equal() + bv = equal(u64v, u64vec3(u64)); + bv.xy = equal(i64v, i64vec2(i64)); + + // notEqual() + bv = notEqual(u64v, u64vec3(u64)); + bv.xy = notEqual(i64v, i64vec2(i64)); +} + +// Type conversion for specialization constant +layout(constant_id = 100) const int64_t si64 = -10L; +layout(constant_id = 101) const uint64_t su64 = 20UL; +layout(constant_id = 102) const int si = -5; +layout(constant_id = 103) const uint su = 4; +layout(constant_id = 104) const bool sb = true; + +// bool <-> int64/uint64 +const bool i64_to_b = bool(si64); +const bool u64_to_b = bool(su64); +const int64_t b_to_i64 = int64_t(sb); +const uint64_t b_to_u64 = uint64_t(sb); + +// int <-> int64 +const int i64_to_i = int(si64); +const int64_t i_to_i64 = int64_t(si); + +// uint <-> uint64 +const uint u64_to_u = uint(su64); +const uint64_t u_to_u64 = uint64_t(su); + +// int64 <-> uint64 +const int64_t u64_to_i64 = int64_t(su64); +const uint64_t i64_to_u64 = uint64_t(si64); + +// int <-> uint64 +const int u64_to_i = int(su64); +const uint64_t i_to_u64 = uint64_t(si); + +// uint <-> int64 +const uint i64_to_u = uint(si64); +const int64_t u_to_i64 = int64_t(su); + +#define UINT64_MAX 18446744073709551615ul +uint64_t u64Max = UINT64_MAX; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.int8.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.int8.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.int8.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.int8.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,253 @@ +#version 450 + +#extension GL_KHX_shader_explicit_arithmetic_types: enable +#extension GL_KHX_shader_explicit_arithmetic_types_int8: require +#extension GL_KHX_shader_explicit_arithmetic_types_int16: require +#extension GL_KHX_shader_explicit_arithmetic_types_int32: require +#extension GL_KHX_shader_explicit_arithmetic_types_int64: require +#extension GL_KHX_shader_explicit_arithmetic_types_float16: require +#extension GL_KHX_shader_explicit_arithmetic_types_float32: require +#extension GL_KHX_shader_explicit_arithmetic_types_float64: require + +layout(binding = 0) uniform Uniforms +{ + uint index; +}; + +layout(std140, binding = 1) uniform Block +{ + int8_t i8; + i8vec2 i8v2; + i8vec3 i8v3; + i8vec4 i8v4; + uint8_t u8; + u8vec2 u8v2; + u8vec3 u8v3; + u8vec4 u8v4; +} block; + +void main() +{ +} + +void literal() +{ + const int8_t i8Const[3] = + { + int8_t(-0x11), // Hex + int8_t(-1), // Dec + int8_t(0400), // Oct + }; + + int8_t i8 = i8Const[index]; + + const uint8_t u8Const[] = + { + uint8_t(0xFF), // Hex + uint8_t(255), // Dec + uint8_t(0177), // Oct + }; + + uint8_t u8 = u8Const[index]; +} + +void typeCast8() +{ + i8vec2 i8v; + u8vec2 u8v; + i16vec2 i16v; + u16vec2 u16v; + i32vec2 i32v; + u32vec2 u32v; + i64vec2 i64v; + u64vec2 u64v; + f16vec2 f16v; + f32vec2 f32v; + f64vec2 f64v; + bvec2 bv; + + u8v = i8v; // int8_t -> uint8_t + i16v = i8v; // int8_t -> int16_t + i16v = u8v; // uint8_t -> int16_t + i32v = i8v; // int8_t -> int32_t + i32v = u8v; // uint8_t -> int32_t + u32v = i8v; // int8_t -> uint32_t + i64v = i8v; // int8_t -> int64_t + u64v = i8v; // int8_t -> uint64_t + u32v = u8v; // uint8_t -> uint32_t + i64v = u8v; // uint8_t -> int64_t + u64v = u8v; // uint8_t -> uint64_t + f16v = i8v; // int8_t -> float16_t + f32v = i8v; // int8_t -> float32_t + f64v = i8v; // int8_t -> float64_t + f16v = u8v; // uint8_t -> float16_t + f32v = u8v; // uint8_t -> float32_t + f64v = u8v; // uint8_t -> float64_t + + i8v = i8vec2(u8v); // uint8_t -> int8_t + i16v = i16vec2(i8v); // int8_t -> int16_t + i16v = i16vec2(u8v); // uint8_t -> int16_t + i32v = i32vec2(i8v); // int8_t -> int32_t + i32v = i32vec2(u8v); // uint8_t -> int32_t + i64v = i64vec2(i8v); // int8_t -> int64_t + u64v = i64vec2(i8v); // int8_t -> uint64_t + u16v = u16vec2(i8v); // int8_t -> uint16_t + u16v = u16vec2(u8v); // uint8_t -> uint16_t + u32v = u32vec2(u8v); // uint8_t -> uint32_t + i64v = i64vec2(u8v); // uint8_t -> int64_t + u64v = i64vec2(u8v); // uint8_t -> uint64_t + f16v = f16vec2(i8v); // int8_t -> float16_t + f32v = f32vec2(i8v); // int8_t -> float32_t + f64v = f64vec2(i8v); // int8_t -> float64_t + f16v = f16vec2(u8v); // uint8_t -> float16_t + f32v = f32vec2(u8v); // uint8_t -> float32_t + f64v = f64vec2(u8v); // uint8_t -> float64_t + + i8v = i8vec2(bv); // bool -> int8 + u8v = u8vec2(bv); // bool -> uint8 + bv = bvec2(i8v); // int8 -> bool + bv = bvec2(u8v); // uint8 -> bool +} + +void operators() +{ + u8vec3 u8v; + int8_t i8; + uvec3 uv; + int32_t i; + int16_t i16; + bool b; + + // Unary + u8v++; + i8--; + ++i8; + --u8v; + + u8v = ~u8v; + + i8 = +i8; + u8v = -u8v; + + // Arithmetic + i8 += i8; + u8v -= u8v; + i *= i8; + uv /= u8v; + uv %= i8; + + uv = u8v + uv; + i16 = i8 - i16; + uv = u8v * uv; + i16 = i8 * i16; + i = i8 % i; + + // Shift + u8v <<= i8; + i8 >>= u8v.y; + + i8 = i8 << u8v.z; + u8v = u8v << i8; + + // Relational + b = (u8v.x != i8); + b = (i8 == u8v.x); + b = (u8v.x > uv.y); + b = (i8 < i); + b = (u8v.y >= uv.x); + b = (i8 <= i); + + // Bitwise + uv |= i8; + i = i8 | i; + i16 &= i8; + uv = u8v & uv; + uv ^= i8; + u8v = u8v ^ i8; +} + +void builtinFuncs() +{ + i8vec2 i8v; + i8vec4 i8v4; + u8vec3 u8v; + u8vec2 u8v2; + u8vec4 u8v4; + bvec3 bv; + int16_t i16; + int32_t i32; + uint16_t u16; + uint32_t u32; + + int8_t i8; + uint8_t u8; + + // abs() + i8v = abs(i8v); + + // sign() + i8 = sign(i8); + + // min() + i8v = min(i8v, i8); + i8v = min(i8v, i8vec2(-1)); + u8v = min(u8v, u8); + u8v = min(u8v, u8vec3(0)); + + // max() + i8v = max(i8v, i8); + i8v = max(i8v, i8vec2(-1)); + u8v = max(u8v, u8); + u8v = max(u8v, u8vec3(0)); + + // clamp() + i8v = clamp(i8v, -i8, i8); + i8v = clamp(i8v, -i8v, i8v); + u8v = clamp(u8v, -u8, u8); + u8v = clamp(u8v, -u8v, u8v); + + // mix() + i8 = mix(i8v.x, i8v.y, true); + i8v = mix(i8vec2(i8), i8vec2(-i8), bvec2(false)); + u8 = mix(u8v.x, u8v.y, true); + u8v = mix(u8vec3(u8), u8vec3(-u8), bvec3(false)); + + //pack + i16 = pack16(i8v); + i32 = pack32(i8v4); + u16 = pack16(u8v2); + u32 = pack32(u8v4); + + i8v = unpack8(i16); + i8v4 = unpack8(i32); + u8v2 = unpack8(u16); + u8v4 = unpack8(u32); + + // lessThan() + bv = lessThan(u8v, u8vec3(u8)); + bv.xy = lessThan(i8v, i8vec2(i8)); + + // lessThanEqual() + bv = lessThanEqual(u8v, u8vec3(u8)); + bv.xy = lessThanEqual(i8v, i8vec2(i8)); + + // greaterThan() + bv = greaterThan(u8v, u8vec3(u8)); + bv.xy = greaterThan(i8v, i8vec2(i8)); + + // greaterThanEqual() + bv = greaterThanEqual(u8v, u8vec3(u8)); + bv.xy = greaterThanEqual(i8v, i8vec2(i8)); + + // equal() + bv = equal(u8v, u8vec3(u8)); + bv.xy = equal(i8v, i8vec2(i8)); + + // notEqual() + bv = notEqual(u8v, u8vec3(u8)); + bv.xy = notEqual(i8v, i8vec2(i8)); +} + +// Type conversion for specialization constant +layout(constant_id = 100) const int8_t si8 = int8_t(-10); +layout(constant_id = 101) const uint8_t su8 = uint8_t(20); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.interpOps.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.interpOps.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.interpOps.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.interpOps.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,32 +1,32 @@ -#version 450 - -in float if1; -in vec2 if2; -in vec3 if3; -in vec4 if4; - -flat in int samp; -flat in vec2 offset; - -out vec4 fragColor; - -void main() -{ - vec4 f4 = vec4(0.0); - f4.x += interpolateAtCentroid(if1); - f4.xy += interpolateAtCentroid(if2); - f4.xyz += interpolateAtCentroid(if3); - f4 += interpolateAtCentroid(if4); - - f4.x += interpolateAtSample(if1, samp); - f4.xy += interpolateAtSample(if2, samp); - f4.xyz += interpolateAtSample(if3, samp); - f4 += interpolateAtSample(if4, samp); - - f4.x += interpolateAtOffset(if1, offset); - f4.xy += interpolateAtOffset(if2, offset); - f4.xyz += interpolateAtOffset(if3, offset); - f4 += interpolateAtOffset(if4, offset); - - fragColor = f4; -} +#version 450 + +in float if1; +in vec2 if2; +in vec3 if3; +in vec4 if4; + +flat in int samp; +flat in vec2 offset; + +out vec4 fragColor; + +void main() +{ + vec4 f4 = vec4(0.0); + f4.x += interpolateAtCentroid(if1); + f4.xy += interpolateAtCentroid(if2); + f4.xyz += interpolateAtCentroid(if3); + f4 += interpolateAtCentroid(if4); + + f4.x += interpolateAtSample(if1, samp); + f4.xy += interpolateAtSample(if2, samp); + f4.xyz += interpolateAtSample(if3, samp); + f4 += interpolateAtSample(if4, samp); + + f4.x += interpolateAtOffset(if1, offset); + f4.xy += interpolateAtOffset(if2, offset); + f4.xyz += interpolateAtOffset(if3, offset); + f4 += interpolateAtOffset(if4, offset); + + fragColor = f4; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.intOps.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.intOps.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.intOps.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.intOps.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,72 +1,72 @@ -#version 310 es - -in uint u1; -in uvec2 u2; -in uvec3 u3; -in uvec4 u4; - -in float v1; -in vec2 v2; -in vec3 v3; -in vec4 v4; - -in int i1; -in ivec2 i2; -in ivec3 i3; -in ivec4 i4; - -out uvec4 uout; -out ivec4 iout; -out vec4 fout; - -void main() -{ - iout = ivec4(0); - uout = uvec4(0); - fout = vec4(0.0); - - uvec2 u2out; - uout.xy += uaddCarry(u2, u2, u2out); - uout.xy += u2out; - - uint u1out; - uout.x += usubBorrow(u1, u1, u1out); - uout.x += u1out; - - uvec4 u4outHi, u4outLow; - umulExtended(u4, u4, u4outHi, u4outLow); - uout += u4outHi + u4outLow; - - ivec4 i4outHi, i4outLow; - imulExtended(i4, i4, i4outHi, i4outLow); - iout += i4outLow + i4outHi; - - ivec3 i3out; - fout.xyz += frexp(v3, i3out); - iout.xyz += i3out; - int i1out; - fout.x += frexp(v1, i1out); - iout.x += i1out; - - fout.xy += ldexp(v2, i2); - fout.x += ldexp(v1, i1); - - iout.x += bitfieldExtract(i1, 4, 5); - uout.xyz += bitfieldExtract(u3, 4, 5); - iout.xyz += bitfieldInsert(i3, i3, 4, 5); - uout.x += bitfieldInsert(u1, u1, 4, 5); - iout.xy += bitfieldReverse(i2); - uout += bitfieldReverse(u4); - iout.x += bitCount(i1); - iout.xyz += bitCount(u3); - - iout.xy += findLSB(i2); - iout += findLSB(u4); - iout.x += findMSB(i1); - iout.xy += findMSB(u2); - - uout.x += packUnorm4x8(v4); - uout.x += packSnorm4x8(v4); - fout += unpackUnorm4x8(u1); - fout += unpackSnorm4x8(u1); -} +#version 310 es + +in uint u1; +in uvec2 u2; +in uvec3 u3; +in uvec4 u4; + +in float v1; +in vec2 v2; +in vec3 v3; +in vec4 v4; + +in int i1; +in ivec2 i2; +in ivec3 i3; +in ivec4 i4; + +out uvec4 uout; +out ivec4 iout; +out vec4 fout; + +void main() +{ + iout = ivec4(0); + uout = uvec4(0); + fout = vec4(0.0); + + uvec2 u2out; + uout.xy += uaddCarry(u2, u2, u2out); + uout.xy += u2out; + + uint u1out; + uout.x += usubBorrow(u1, u1, u1out); + uout.x += u1out; + + uvec4 u4outHi, u4outLow; + umulExtended(u4, u4, u4outHi, u4outLow); + uout += u4outHi + u4outLow; + + ivec4 i4outHi, i4outLow; + imulExtended(i4, i4, i4outHi, i4outLow); + iout += i4outLow + i4outHi; + + ivec3 i3out; + fout.xyz += frexp(v3, i3out); + iout.xyz += i3out; + int i1out; + fout.x += frexp(v1, i1out); + iout.x += i1out; + + fout.xy += ldexp(v2, i2); + fout.x += ldexp(v1, i1); + + iout.x += bitfieldExtract(i1, 4, 5); + uout.xyz += bitfieldExtract(u3, 4, 5); + iout.xyz += bitfieldInsert(i3, i3, 4, 5); + uout.x += bitfieldInsert(u1, u1, 4, 5); + iout.xy += bitfieldReverse(i2); + uout += bitfieldReverse(u4); + iout.x += bitCount(i1); + iout.xyz += bitCount(u3); + + iout.xy += findLSB(i2); + iout += findLSB(u4); + iout.x += findMSB(i1); + iout.xy += findMSB(u2); + + uout.x += packUnorm4x8(v4); + uout.x += packSnorm4x8(v4); + fout += unpackUnorm4x8(u1); + fout += unpackSnorm4x8(u1); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.layoutNested.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.layoutNested.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.layoutNested.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.layoutNested.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,76 +1,76 @@ -#version 450 - -// should get 3 SPV types for S: no layout, 140, and 430, plus extras for interpolation or invariant differences -struct S -{ - highp uvec3 a; - mediump mat2 b[4]; - lowp uint c; -}; - -layout(set = 0, binding = 0, std140) uniform Block140 -{ - mediump int u; - S s[2][3]; - mediump vec2 v; -} inst140; - -layout(set = 0, binding = 1, std430) buffer Block430 -{ - mediump int u; - S s[2][3]; - mediump vec2 v; -} inst430; - -S s; - -// should get 5 SPV types for T: no layout, 140/row, 140/col, 430/row, and 430/col -struct T { - mat2 m; - int a; -}; - -T t; - -struct Nestor { - T nestorT; -}; - -layout(set = 1, binding = 0, std140) uniform Bt1 -{ - layout(row_major) Nestor nt; -} Btn1; - -layout(set = 1, binding = 0, std140) uniform Bt2 -{ - layout(column_major) Nestor nt; -} Btn2; - -layout(row_major, set = 1, binding = 0, std140) uniform Bt3 -{ - layout(column_major) Nestor ntcol; - Nestor ntrow; // should be row major decoration version of Nestor -} Btn3; - -layout(set = 1, binding = 0, std430) buffer bBt1 -{ - layout(row_major) Nestor nt; -} bBtn1; - -layout(set = 1, binding = 0, std430) buffer bBt2 -{ - layout(column_major) Nestor nt; -} bBtn2; - -layout(set = 1, binding = 0, std430) buffer bBt3 -{ - layout(row_major) Nestor ntcol; - Nestor ntrow; // should be col major decoration version of Nestor -} bBtn3; - -void main() -{ -} - -flat out S sout; -invariant out S soutinv; +#version 450 + +// should get 3 SPV types for S: no layout, 140, and 430, plus extras for interpolation or invariant differences +struct S +{ + highp uvec3 a; + mediump mat2 b[4]; + lowp uint c; +}; + +layout(set = 0, binding = 0, std140) uniform Block140 +{ + mediump int u; + S s[2][3]; + mediump vec2 v; +} inst140; + +layout(set = 0, binding = 1, std430) buffer Block430 +{ + mediump int u; + S s[2][3]; + mediump vec2 v; +} inst430; + +S s; + +// should get 5 SPV types for T: no layout, 140/row, 140/col, 430/row, and 430/col +struct T { + mat2 m; + int a; +}; + +T t; + +struct Nestor { + T nestorT; +}; + +layout(set = 1, binding = 0, std140) uniform Bt1 +{ + layout(row_major) Nestor nt; +} Btn1; + +layout(set = 1, binding = 0, std140) uniform Bt2 +{ + layout(column_major) Nestor nt; +} Btn2; + +layout(row_major, set = 1, binding = 0, std140) uniform Bt3 +{ + layout(column_major) Nestor ntcol; + Nestor ntrow; // should be row major decoration version of Nestor +} Btn3; + +layout(set = 1, binding = 0, std430) buffer bBt1 +{ + layout(row_major) Nestor nt; +} bBtn1; + +layout(set = 1, binding = 0, std430) buffer bBt2 +{ + layout(column_major) Nestor nt; +} bBtn2; + +layout(set = 1, binding = 0, std430) buffer bBt3 +{ + layout(row_major) Nestor ntcol; + Nestor ntrow; // should be col major decoration version of Nestor +} bBtn3; + +void main() +{ +} + +flat out S sout; +invariant out S soutinv; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.length.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.length.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.length.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.length.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,14 +1,14 @@ -#version 140 - -vec4 u[3]; - -in vec2 v[2]; - -void main() -{ - int a[5]; - - vec2 t = v[0] + v[1]; - - gl_FragColor = vec4(u.length() * v.length() * a.length()); -} +#version 140 + +vec4 u[3]; + +in vec2 v[2]; + +void main() +{ + int a[5]; + + vec2 t = v[0] + v[1]; + + gl_FragColor = vec4(u.length() * v.length() * a.length()); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.localAggregates.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.localAggregates.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.localAggregates.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.localAggregates.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,72 +1,72 @@ -#version 400 - -uniform sampler2D samp2D; -in vec2 coord; -in vec4 color; - -struct s1 { - int i; - float f; -}; - -struct s2 { - int i; - float f; - s1 s1_1; - vec4 bleh; -}; - -struct s3 { - s2 s2_1; - int i; - float f; - s1 s1_1; -}; - - -flat in s1 foo; -flat in s2 foo2; -flat in s3 foo3; - - -flat in int condition; - -void main() -{ - s2 locals2; - s3 locals3; - float localFArray[16]; - int localIArray[8]; - - locals2 = foo3.s2_1; - - if (foo3.s2_1.i > 0) { - locals2.s1_1.f = 1.0; - localFArray[4] = coord.x; - localIArray[2] = foo3.s2_1.i; - } else { - locals2.s1_1.f = coord.x; - localFArray[4] = 1.0; - localIArray[2] = 0; - } - - if (localIArray[2] == 0) - ++localFArray[4]; - - float localArray[16]; - int x = 5; - localArray[x] = coord.x; - - float[16] a; - - for (int i = 0; i < 16; i++) - a[i] = 0.0; - - if (condition == 1) - a = localArray; - - locals2.bleh = color; - locals2.bleh.z = coord.y; - - gl_FragColor = locals2.bleh * (localFArray[4] + locals2.s1_1.f + localArray[x] + a[x]) * texture(samp2D, coord); -} +#version 400 + +uniform sampler2D samp2D; +in vec2 coord; +in vec4 color; + +struct s1 { + int i; + float f; +}; + +struct s2 { + int i; + float f; + s1 s1_1; + vec4 bleh; +}; + +struct s3 { + s2 s2_1; + int i; + float f; + s1 s1_1; +}; + + +flat in s1 foo; +flat in s2 foo2; +flat in s3 foo3; + + +flat in int condition; + +void main() +{ + s2 locals2; + s3 locals3; + float localFArray[16]; + int localIArray[8]; + + locals2 = foo3.s2_1; + + if (foo3.s2_1.i > 0) { + locals2.s1_1.f = 1.0; + localFArray[4] = coord.x; + localIArray[2] = foo3.s2_1.i; + } else { + locals2.s1_1.f = coord.x; + localFArray[4] = 1.0; + localIArray[2] = 0; + } + + if (localIArray[2] == 0) + ++localFArray[4]; + + float localArray[16]; + int x = 5; + localArray[x] = coord.x; + + float[16] a; + + for (int i = 0; i < 16; i++) + a[i] = 0.0; + + if (condition == 1) + a = localArray; + + locals2.bleh = color; + locals2.bleh.z = coord.y; + + gl_FragColor = locals2.bleh * (localFArray[4] + locals2.s1_1.f + localArray[x] + a[x]) * texture(samp2D, coord); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.loopsArtificial.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.loopsArtificial.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.loopsArtificial.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.loopsArtificial.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,67 +1,67 @@ -#version 140 -in vec4 bigColor; -in vec4 bigColor1_1; -in vec4 bigColor1_2; -in vec4 bigColor1_3; -in vec4 bigColor2; -in vec4 bigColor3; -in vec4 bigColor4; -in vec4 bigColor5; -in vec4 bigColor6; -in vec4 bigColor7; -in vec4 bigColor8; - -in vec4 BaseColor; - -in float d; -in float d2; -in float d3; -in float d4; -in float d13; - -flat in int Count; - -void main() -{ - vec4 color = BaseColor; - - // Latchy2 - do { - color += bigColor4; - if (color.x < d4) { - color.z += 2.0; - if (color.z < d4) { - color.x++; - continue; - } - } - if (color.y < d4) - color.y += d4; - else - color.x += d4; - } while (color.z < d4); - - // Immediate dominator - while (color.w < d13) { - if (color.z < d13) - color++; - else - color--; - // code from Latchy 2 - color += bigColor4; - if (color.x < d4) { - color.z += 2.0; - if (color.z < d4) { - color.x++; - continue; - } - } - if (color.y < d4) - color.y += d4; - else - color.x += d4; - } - - color++; - gl_FragColor = color; -} +#version 140 +in vec4 bigColor; +in vec4 bigColor1_1; +in vec4 bigColor1_2; +in vec4 bigColor1_3; +in vec4 bigColor2; +in vec4 bigColor3; +in vec4 bigColor4; +in vec4 bigColor5; +in vec4 bigColor6; +in vec4 bigColor7; +in vec4 bigColor8; + +in vec4 BaseColor; + +in float d; +in float d2; +in float d3; +in float d4; +in float d13; + +flat in int Count; + +void main() +{ + vec4 color = BaseColor; + + // Latchy2 + do { + color += bigColor4; + if (color.x < d4) { + color.z += 2.0; + if (color.z < d4) { + color.x++; + continue; + } + } + if (color.y < d4) + color.y += d4; + else + color.x += d4; + } while (color.z < d4); + + // Immediate dominator + while (color.w < d13) { + if (color.z < d13) + color++; + else + color--; + // code from Latchy 2 + color += bigColor4; + if (color.x < d4) { + color.z += 2.0; + if (color.z < d4) { + color.x++; + continue; + } + } + if (color.y < d4) + color.y += d4; + else + color.x += d4; + } + + color++; + gl_FragColor = color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.loops.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.loops.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.loops.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.loops.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,302 +1,302 @@ -#version 140 -in vec4 bigColor; -in vec4 bigColor1_1; -in vec4 bigColor1_2; -in vec4 bigColor1_3; -in vec4 bigColor2; -in vec4 bigColor3; -in vec4 bigColor4; -in vec4 bigColor5; -in vec4 bigColor6; -in vec4 bigColor7; -in vec4 bigColor8; - -in vec4 BaseColor; - -in float d; -in float d2; -in float d3; -in float d4; -in float d5; -in float d6; -in float d7; -in float d8; -in float d9; -in float d10; -in float d11; -in float d12; -in float d14; -in float d15; -in float d16; -in float d17; -in float d18; -flat in int Count; - -void main() -{ - vec4 color = BaseColor; - - // Not a real loop - while (true) { - if (color.x < 0.33) { - color += vec4(0.33); - break; - } - if (color.x < 0.66) { - color += vec4(0.66); - break; - } - - color += vec4(0.33); - break; - } - - // While - while (color.x < d) { - color += bigColor; - } - - // While (latchy) - while (color.z < d) { - color += bigColor1_1; - if (color.w < d) - continue; - - color += bigColor1_1; - } - - // While (constant) - while (color.x < 42.0) { - ++color; - } - - // While (complicated-conditional) - while (color.w < d2 && color.y < d3) { - color += bigColor1_2; - } - - // While (multi-exit) - while (color.z < d3) { - color += bigColor1_3; - if (color.y < d4) - break; - color += bigColor1_3; - } - - // For (dynamic) - for (int i = 0; i < Count; ++i) { - color += bigColor2; - } - - // Do while - do { - color += bigColor3; - } while (color.x < d2); - - // For (static) - for (int i = 0; i < 42; ++i) { - color.z += d3; - } - - // For (static) flow-control - for (int i = 0; i < 100; ++i) { - if (color.z < 20.0) - color.x++; - else - color.y++; - if (color.w < 20.0) - if (color.z > color.y) - 0; // do nothing - } - - // For (static) flow-control with latch merge - for (int i = 0; i < 120; ++i) { - if (color.z < 20.0) - color.x++; - else - color.y++; - } - - // For (static) latchy - for (int i = 0; i < 42; ++i) { - color.z += d3; - if (color.x < d4) - continue; - ++color.w; - } - - // For (static) multi-exit - for (int i = 0; i < 42; ++i) { - color.z += d3; - if (color.x < d4) - break; - ++color.w; - } - - // Latchy - do { - color += bigColor4; - if (color.x < d4) - continue; - if (color.y < d4) - color.y += d4; - else - color.x += d4; - } while (color.z < d4); - - // Do while flow control - do { - color += bigColor5; - if (color.y < d5) - color.y += d5; - } while (color.x < d5); - - // If then loop - if (color.x < d6) { - while (color.y < d6) - color += bigColor6; - } else { - while (color.z < d6) - color.z += bigColor6.z; - } - - // If then multi-exit - if (color.x < d6) { - while (color.y < d6) { - color += bigColor6; - if (d7 < 1.0) - break; - } - - } else { - while (color.z < d6) - color.z += bigColor6.z; - } - - - // Multi-exit - do { - if (d7 < 0.0) - break; - - color += bigColor7; - - if (d7 < 1.0) { - color.z++; - break; - } - - color += BaseColor; - - } while (true); - - - // Multi-exit2 - do { - // invariant conditional break at the top of the loop. This could be a - // situation where unswitching the loop has no real increases in code - // size. - if (d8 < 0.0) - break; - - color += bigColor7; - - if (d8 < 1.0) { - color.z++; - if (d8 < 2.0) { - color.y++; - } else { - color.x++; - } - break; - } - - color += BaseColor; - - } while (color.z < d8); - - // Deep exit - while (color.w < d9) { - if (d9 > d8) { - if (color.x <= d7) { - if (color.z == 5.0) - color.w++; - else - break; - } - } - - } - - // No end loop-back. - while (color.z < d10) { - color.y++; - if (color.y < d11) { - color.z++; - if (color.w < d12) - color.w++; - else - color.x++; - continue; - } - - color++; - break; - } - - // Multi-continue - while (color.x < 10.0) { - color += bigColor8; - - if (color.z < d8) - if (color.w < d6) - continue; - - color.y += bigColor8.x; - } - - color++; - gl_FragColor = color; - - // Early Return - while (color.x < d14) { - if (color.y < d15) { - return; - } - else - color++; - } - - color++; - - while (color.w < d16) { - color.w++; - } - - - // While (complicated-conditional) - while (color.w < d2 && color.y < d3) { - color += bigColor1_2; - if (color.z < d3) - return; - } - - - do { - if (color.y < d18) - return; - color++; - } while (color.x < d17); - - // Early Discard - while (color.y < d16) { - if (color.w < d16) { - discard; - } else - color++; - } - - color++; - - gl_FragColor = color; -} +#version 140 +in vec4 bigColor; +in vec4 bigColor1_1; +in vec4 bigColor1_2; +in vec4 bigColor1_3; +in vec4 bigColor2; +in vec4 bigColor3; +in vec4 bigColor4; +in vec4 bigColor5; +in vec4 bigColor6; +in vec4 bigColor7; +in vec4 bigColor8; + +in vec4 BaseColor; + +in float d; +in float d2; +in float d3; +in float d4; +in float d5; +in float d6; +in float d7; +in float d8; +in float d9; +in float d10; +in float d11; +in float d12; +in float d14; +in float d15; +in float d16; +in float d17; +in float d18; +flat in int Count; + +void main() +{ + vec4 color = BaseColor; + + // Not a real loop + while (true) { + if (color.x < 0.33) { + color += vec4(0.33); + break; + } + if (color.x < 0.66) { + color += vec4(0.66); + break; + } + + color += vec4(0.33); + break; + } + + // While + while (color.x < d) { + color += bigColor; + } + + // While (latchy) + while (color.z < d) { + color += bigColor1_1; + if (color.w < d) + continue; + + color += bigColor1_1; + } + + // While (constant) + while (color.x < 42.0) { + ++color; + } + + // While (complicated-conditional) + while (color.w < d2 && color.y < d3) { + color += bigColor1_2; + } + + // While (multi-exit) + while (color.z < d3) { + color += bigColor1_3; + if (color.y < d4) + break; + color += bigColor1_3; + } + + // For (dynamic) + for (int i = 0; i < Count; ++i) { + color += bigColor2; + } + + // Do while + do { + color += bigColor3; + } while (color.x < d2); + + // For (static) + for (int i = 0; i < 42; ++i) { + color.z += d3; + } + + // For (static) flow-control + for (int i = 0; i < 100; ++i) { + if (color.z < 20.0) + color.x++; + else + color.y++; + if (color.w < 20.0) + if (color.z > color.y) + 0; // do nothing + } + + // For (static) flow-control with latch merge + for (int i = 0; i < 120; ++i) { + if (color.z < 20.0) + color.x++; + else + color.y++; + } + + // For (static) latchy + for (int i = 0; i < 42; ++i) { + color.z += d3; + if (color.x < d4) + continue; + ++color.w; + } + + // For (static) multi-exit + for (int i = 0; i < 42; ++i) { + color.z += d3; + if (color.x < d4) + break; + ++color.w; + } + + // Latchy + do { + color += bigColor4; + if (color.x < d4) + continue; + if (color.y < d4) + color.y += d4; + else + color.x += d4; + } while (color.z < d4); + + // Do while flow control + do { + color += bigColor5; + if (color.y < d5) + color.y += d5; + } while (color.x < d5); + + // If then loop + if (color.x < d6) { + while (color.y < d6) + color += bigColor6; + } else { + while (color.z < d6) + color.z += bigColor6.z; + } + + // If then multi-exit + if (color.x < d6) { + while (color.y < d6) { + color += bigColor6; + if (d7 < 1.0) + break; + } + + } else { + while (color.z < d6) + color.z += bigColor6.z; + } + + + // Multi-exit + do { + if (d7 < 0.0) + break; + + color += bigColor7; + + if (d7 < 1.0) { + color.z++; + break; + } + + color += BaseColor; + + } while (true); + + + // Multi-exit2 + do { + // invariant conditional break at the top of the loop. This could be a + // situation where unswitching the loop has no real increases in code + // size. + if (d8 < 0.0) + break; + + color += bigColor7; + + if (d8 < 1.0) { + color.z++; + if (d8 < 2.0) { + color.y++; + } else { + color.x++; + } + break; + } + + color += BaseColor; + + } while (color.z < d8); + + // Deep exit + while (color.w < d9) { + if (d9 > d8) { + if (color.x <= d7) { + if (color.z == 5.0) + color.w++; + else + break; + } + } + + } + + // No end loop-back. + while (color.z < d10) { + color.y++; + if (color.y < d11) { + color.z++; + if (color.w < d12) + color.w++; + else + color.x++; + continue; + } + + color++; + break; + } + + // Multi-continue + while (color.x < 10.0) { + color += bigColor8; + + if (color.z < d8) + if (color.w < d6) + continue; + + color.y += bigColor8.x; + } + + color++; + gl_FragColor = color; + + // Early Return + while (color.x < d14) { + if (color.y < d15) { + return; + } + else + color++; + } + + color++; + + while (color.w < d16) { + color.w++; + } + + + // While (complicated-conditional) + while (color.w < d2 && color.y < d3) { + color += bigColor1_2; + if (color.z < d3) + return; + } + + + do { + if (color.y < d18) + return; + color++; + } while (color.x < d17); + + // Early Discard + while (color.y < d16) { + if (color.w < d16) { + discard; + } else + color++; + } + + color++; + + gl_FragColor = color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.looseUniformNoLoc.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.looseUniformNoLoc.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.looseUniformNoLoc.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.looseUniformNoLoc.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,15 +1,15 @@ -#version 450 core - -layout(location = 0) -in vec4 foo; - -layout(location = 0) -out vec4 bar; - -uniform vec4 uv; - -void main() -{ - bar = foo; - gl_Position = foo; +#version 450 core + +layout(location = 0) +in vec4 foo; + +layout(location = 0) +out vec4 bar; + +uniform vec4 uv; + +void main() +{ + bar = foo; + gl_Position = foo; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.matFun.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.matFun.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.matFun.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.matFun.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,28 +1,28 @@ -#version 400 - -uniform bl { - uniform mat4 m4; - uniform mat3 m3; -} bName; - -in vec3 v3; - -vec3 xf(mat3 m, vec3 v) -{ - return v * m; -} - -mat3 Mat3(mat4 m) -{ - return mat3(m[0].xyz, m[1].xyz, m[2].xyz); -} - -vec3 mxv(mat4 m4, vec3 v) -{ - return v * Mat3(m4); -} - -void main() -{ - gl_Position = vec4(mxv(bName.m4, v3) + xf(bName.m3, v3), 1.0); -} +#version 400 + +uniform bl { + uniform mat4 m4; + uniform mat3 m3; +} bName; + +in vec3 v3; + +vec3 xf(mat3 m, vec3 v) +{ + return v * m; +} + +mat3 Mat3(mat4 m) +{ + return mat3(m[0].xyz, m[1].xyz, m[2].xyz); +} + +vec3 mxv(mat4 m4, vec3 v) +{ + return v * Mat3(m4); +} + +void main() +{ + gl_Position = vec4(mxv(bName.m4, v3) + xf(bName.m3, v3), 1.0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.matrix2.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.matrix2.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.matrix2.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.matrix2.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,50 +1,50 @@ -#version 150 - -in mat3 colorTransform; -in vec3 Color; -in mat4 m, n; - -in mat4x3 um43; -in mat3x4 un34; -in mat2 um2; -in mat3 um3; -in mat4 um4; - -in vec4 v; - -in vec3 u; - -out vec4 FragColor; - -void main() -{ - mat3x4 m34 = outerProduct(v, u); - - m34 += mat3x4(4.3); - - FragColor = vec4(Color, 1.0); - FragColor *= vec4(FragColor * m34, 1.0); - - m34 *= v.x; - - mat4 m44 = mat4(un34); - - m44 += m34 * um43; - - FragColor += (-m44) * v; - - FragColor *= matrixCompMult(m44, m44); - - m34 = transpose(um43); - FragColor *= vec4(FragColor * m34, 1.0); - FragColor *= vec4(determinant(um4)); - mat2 inv = inverse(um2); - FragColor *= vec4(inv[0][0], inv[1][0], inv[0][1], inv[1][1]); - mat3 inv3 = inverse(um3); - FragColor *= vec4(inv3[2][1]); - - mat4 inv4 = inverse(um4); - FragColor *= inv4; - - FragColor = vec4(FragColor * matrixCompMult(un34, un34), FragColor.w); -} +#version 150 + +in mat3 colorTransform; +in vec3 Color; +in mat4 m, n; + +in mat4x3 um43; +in mat3x4 un34; +in mat2 um2; +in mat3 um3; +in mat4 um4; + +in vec4 v; + +in vec3 u; + +out vec4 FragColor; + +void main() +{ + mat3x4 m34 = outerProduct(v, u); + + m34 += mat3x4(4.3); + + FragColor = vec4(Color, 1.0); + FragColor *= vec4(FragColor * m34, 1.0); + + m34 *= v.x; + + mat4 m44 = mat4(un34); + + m44 += m34 * um43; + + FragColor += (-m44) * v; + + FragColor *= matrixCompMult(m44, m44); + + m34 = transpose(um43); + FragColor *= vec4(FragColor * m34, 1.0); + FragColor *= vec4(determinant(um4)); + mat2 inv = inverse(um2); + FragColor *= vec4(inv[0][0], inv[1][0], inv[0][1], inv[1][1]); + mat3 inv3 = inverse(um3); + FragColor *= vec4(inv3[2][1]); + + mat4 inv4 = inverse(um4); + FragColor *= inv4; + + FragColor = vec4(FragColor * matrixCompMult(un34, un34), FragColor.w); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.matrix.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.matrix.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.matrix.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.matrix.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,49 +1,49 @@ -#version 420 - -in mat3x4 m1; -in mat3x4 m2; -in float f; -in vec3 v3; -in vec4 v4; - -out vec4 color; - -void main() -{ - mat3x4 sum34; - dmat3x4 dm; - vec3 sum3; - vec4 sum4; - - sum34 = m1 - m2; - sum34 += m1 * f; - sum34 += f * m1; - sum34 /= matrixCompMult(m1, m2); - sum34 += m1 / f; - sum34 += f / m1; - sum34 += f; - sum34 -= f; - dm = dmat3x4(sum34); - sum34 = mat3x4(dm); - - sum3 = v4 * m2; - sum4 = m2 * v3; - - mat4x3 m43 = transpose(sum34); - mat4 m4 = m1 * m43; - - sum4 = v4 * m4; - - color = sum4; - - ++sum34; - --sum34; - - sum34 += mat3x4(f); - sum34 += mat3x4(v3, f, v3, f, v3, f); - - color += sum3 * m43 + sum4; - - color += vec4(m43); - color += vec4(vec3(mat2(f)), 7.2); -} +#version 420 + +in mat3x4 m1; +in mat3x4 m2; +in float f; +in vec3 v3; +in vec4 v4; + +out vec4 color; + +void main() +{ + mat3x4 sum34; + dmat3x4 dm; + vec3 sum3; + vec4 sum4; + + sum34 = m1 - m2; + sum34 += m1 * f; + sum34 += f * m1; + sum34 /= matrixCompMult(m1, m2); + sum34 += m1 / f; + sum34 += f / m1; + sum34 += f; + sum34 -= f; + dm = dmat3x4(sum34); + sum34 = mat3x4(dm); + + sum3 = v4 * m2; + sum4 = m2 * v3; + + mat4x3 m43 = transpose(sum34); + mat4 m4 = m1 * m43; + + sum4 = v4 * m4; + + color = sum4; + + ++sum34; + --sum34; + + sum34 += mat3x4(f); + sum34 += mat3x4(v3, f, v3, f, v3, f); + + color += sum3 * m43 + sum4; + + color += vec4(m43); + color += vec4(vec3(mat2(f)), 7.2); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.memoryQualifier.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.memoryQualifier.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.memoryQualifier.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.memoryQualifier.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,38 +1,38 @@ -#version 450 - -layout(binding = 0, r32f) uniform coherent image1D i1D; -layout(binding = 1, r32f) uniform volatile image2D i2D; -layout(binding = 2, r32f) uniform restrict image2DRect i2DRect; -layout(binding = 3, r32f) uniform readonly image3D i3D; -layout(binding = 3, r32f) uniform writeonly imageCube iCube; - -struct Data -{ - float f1; - vec2 f2; -}; - -coherent buffer Buffer -{ - volatile float f1; - restrict vec2 f2; - readonly vec3 f3; - writeonly vec4 f4; - int i1; - Data data; -}; - -void main() -{ - vec4 texel = imageLoad(i1D, 1); - texel += imageLoad(i2D, ivec2(1)); - texel += imageLoad(i2DRect, ivec2(1)); - texel += imageLoad(i3D, ivec3(1)); - imageStore(iCube, ivec3(1), texel); - - texel[i1] = f1; - texel.xy += f2; - texel.xyz -= f3; - texel.w += data.f1 + data.f2[1]; - f4 = texel; +#version 450 + +layout(binding = 0, r32f) uniform coherent image1D i1D; +layout(binding = 1, r32f) uniform volatile image2D i2D; +layout(binding = 2, r32f) uniform restrict image2DRect i2DRect; +layout(binding = 3, r32f) uniform readonly image3D i3D; +layout(binding = 3, r32f) uniform writeonly imageCube iCube; + +struct Data +{ + float f1; + vec2 f2; +}; + +coherent buffer Buffer +{ + volatile float f1; + restrict vec2 f2; + readonly vec3 f3; + writeonly vec4 f4; + int i1; + Data data; +}; + +void main() +{ + vec4 texel = imageLoad(i1D, 1); + texel += imageLoad(i2D, ivec2(1)); + texel += imageLoad(i2DRect, ivec2(1)); + texel += imageLoad(i3D, ivec3(1)); + imageStore(iCube, ivec3(1), texel); + + texel[i1] = f1; + texel.xy += f2; + texel.xyz -= f3; + texel.w += data.f1 + data.f2[1]; + f4 = texel; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.merge-unreachable.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.merge-unreachable.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.merge-unreachable.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.merge-unreachable.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,8 @@ -#version 450 -precision mediump int; precision highp float; -layout(location=1) in highp vec4 v; -void main (void) -{ - if (v == vec4(0.1,0.2,0.3,0.4)) discard; - else return; -} +#version 450 +precision mediump int; precision highp float; +layout(location=1) in highp vec4 v; +void main (void) +{ + if (v == vec4(0.1,0.2,0.3,0.4)) discard; + else return; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.multiStruct.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.multiStruct.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.multiStruct.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.multiStruct.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,48 +1,48 @@ -#version 450 core - -struct MyStruct -{ - vec2 foo[2]; - bool sb; -}; - -layout(binding = 0, std430) buffer SSBO0 -{ - MyStruct a; -} inBuf; - -layout(binding = 1, std430) buffer SSBO1 -{ - MyStruct b; -} outBuf; - -layout(binding = 2, std140) uniform UBO -{ - MyStruct c; -} uBuf; - -struct Nested { - float f; - MyStruct S[2]; -}; - -layout(binding = 2, std140) uniform UBON -{ - Nested N1; -} uBufN; - -layout(binding = 1, std430) buffer SSBO1N -{ - Nested N2; -} outBufN; - -void main() -{ - MyStruct t = inBuf.a; - outBuf.b = t; - t = uBuf.c; - outBuf.b = t; - - Nested n = uBufN.N1; - outBufN.N2 = n; -} +#version 450 core + +struct MyStruct +{ + vec2 foo[2]; + bool sb; +}; + +layout(binding = 0, std430) buffer SSBO0 +{ + MyStruct a; +} inBuf; + +layout(binding = 1, std430) buffer SSBO1 +{ + MyStruct b; +} outBuf; + +layout(binding = 2, std140) uniform UBO +{ + MyStruct c; +} uBuf; + +struct Nested { + float f; + MyStruct S[2]; +}; + +layout(binding = 2, std140) uniform UBON +{ + Nested N1; +} uBufN; + +layout(binding = 1, std430) buffer SSBO1N +{ + Nested N2; +} outBufN; + +void main() +{ + MyStruct t = inBuf.a; + outBuf.b = t; + t = uBuf.c; + outBuf.b = t; + + Nested n = uBufN.N1; + outBufN.N2 = n; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.multiStructFuncall.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.multiStructFuncall.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.multiStructFuncall.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.multiStructFuncall.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,21 +1,21 @@ -#version 450 - -struct S { mat4 m; }; -buffer blockName { S s1; }; // need an S with decoration -S s2; // no decorations on S - -void fooConst(const in S s) { } -void foo(in S s) { } -void fooOut(inout S s) { } - -void main() -{ - fooConst(s1); - fooConst(s2); - - foo(s1); - foo(s2); - - fooOut(s1); - fooOut(s2); +#version 450 + +struct S { mat4 m; }; +buffer blockName { S s1; }; // need an S with decoration +S s2; // no decorations on S + +void fooConst(const in S s) { } +void foo(in S s) { } +void fooOut(inout S s) { } + +void main() +{ + fooConst(s1); + fooConst(s2); + + foo(s1); + foo(s2); + + fooOut(s1); + fooOut(s2); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.multiviewPerViewAttributes.tesc vulkan-1.1.73+dfsg/external/glslang/Test/spv.multiviewPerViewAttributes.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.multiviewPerViewAttributes.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.multiviewPerViewAttributes.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,14 +1,14 @@ -#version 450 - -#extension GL_NVX_multiview_per_view_attributes :require - -layout(vertices = 4) out; -out gl_PerVertex { - int gl_ViewportMaskPerViewNV[]; - vec4 gl_PositionPerViewNV[]; - } gl_out[]; -void main() -{ - gl_out[gl_InvocationID].gl_ViewportMaskPerViewNV[0] = 1; - gl_out[gl_InvocationID].gl_PositionPerViewNV[0] = gl_in[1].gl_Position; -} +#version 450 + +#extension GL_NVX_multiview_per_view_attributes :require + +layout(vertices = 4) out; +out gl_PerVertex { + int gl_ViewportMaskPerViewNV[]; + vec4 gl_PositionPerViewNV[]; + } gl_out[]; +void main() +{ + gl_out[gl_InvocationID].gl_ViewportMaskPerViewNV[0] = 1; + gl_out[gl_InvocationID].gl_PositionPerViewNV[0] = gl_in[1].gl_Position; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.multiviewPerViewAttributes.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.multiviewPerViewAttributes.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.multiviewPerViewAttributes.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.multiviewPerViewAttributes.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,10 +1,10 @@ -#version 450 - -#extension GL_NVX_multiview_per_view_attributes :require - -void main() -{ - gl_ViewportMaskPerViewNV[0] = 1; - gl_PositionPerViewNV[0] = gl_Position; -} - +#version 450 + +#extension GL_NVX_multiview_per_view_attributes :require + +void main() +{ + gl_ViewportMaskPerViewNV[0] = 1; + gl_PositionPerViewNV[0] = gl_Position; +} + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.newTexture.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.newTexture.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.newTexture.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.newTexture.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,72 +1,72 @@ -#version 430 - -uniform sampler2D s2D; -uniform sampler2DRect sr; -uniform sampler3D s3D; -uniform samplerCube sCube; -uniform samplerCubeShadow sCubeShadow; -uniform samplerCubeArrayShadow sCubeArrayShadow; -uniform sampler2DShadow s2DShadow; -uniform sampler2DArray s2DArray; -uniform sampler2DArrayShadow s2DArrayShadow; - -uniform isampler2D is2D; -uniform isampler3D is3D; -uniform isamplerCube isCube; -uniform isampler2DArray is2DArray; -uniform isampler2DMS is2Dms; - -uniform usampler2D us2D; -uniform usampler3D us3D; -uniform usamplerCube usCube; -uniform usampler2DArray us2DArray; - -in float c1D; -in vec2 c2D; -in vec3 c3D; -in vec4 c4D; - -flat in int ic1D; -flat in ivec2 ic2D; -flat in ivec3 ic3D; -flat in ivec4 ic4D; - -out vec4 FragData; - -void main() -{ - vec4 v = texture(s2D, c2D); - v.y += texture(sCubeArrayShadow, c4D, c1D); - v += textureProj(s3D, c4D); - v += textureLod(s2DArray, c3D, 1.2); - v.y += textureOffset(s2DShadow, c3D, ivec2(3), c1D); - v += texelFetch(s3D, ic3D, ic1D); - v += texelFetchOffset(s2D, ic2D, 4, ivec2(3)); - v += texelFetchOffset(sr, ic2D, ivec2(4)); - v.y += textureLodOffset(s2DShadow, c3D, c1D, ivec2(3)); - v += textureProjLodOffset(s2D, c3D, c1D, ivec2(3)); - v += textureGrad(sCube, c3D, c3D, c3D); - v.x += textureGradOffset(s2DArrayShadow, c4D, c2D, c2D, ivec2(3)); - v += textureProjGrad(s3D, c4D, c3D, c3D); - v += textureProjGradOffset(s2D, c3D, c2D, c2D, ivec2(3)); - - ivec4 iv = texture(is2D, c2D); - v += vec4(iv); - iv = textureProjOffset(is2D, c4D, ivec2(3)); - v += vec4(iv); - iv = textureProjLod(is2D, c3D, c1D); - v += vec4(iv); - iv = textureProjGrad(is2D, c3D, c2D, c2D); - v += vec4(iv); - iv = texture(is3D, c3D, 4.2); - v += vec4(iv); - iv = textureLod(isCube, c3D, c1D); - v += vec4(iv); - iv = texelFetch(is2DArray, ic3D, ic1D); - v += vec4(iv); - - ivec2 iv2 = textureSize(sCubeShadow, 2); - // iv2 += textureSize(is2Dms); - - FragData = v + vec4(iv2, 0.0, 0.0); -} +#version 430 + +uniform sampler2D s2D; +uniform sampler2DRect sr; +uniform sampler3D s3D; +uniform samplerCube sCube; +uniform samplerCubeShadow sCubeShadow; +uniform samplerCubeArrayShadow sCubeArrayShadow; +uniform sampler2DShadow s2DShadow; +uniform sampler2DArray s2DArray; +uniform sampler2DArrayShadow s2DArrayShadow; + +uniform isampler2D is2D; +uniform isampler3D is3D; +uniform isamplerCube isCube; +uniform isampler2DArray is2DArray; +uniform isampler2DMS is2Dms; + +uniform usampler2D us2D; +uniform usampler3D us3D; +uniform usamplerCube usCube; +uniform usampler2DArray us2DArray; + +in float c1D; +in vec2 c2D; +in vec3 c3D; +in vec4 c4D; + +flat in int ic1D; +flat in ivec2 ic2D; +flat in ivec3 ic3D; +flat in ivec4 ic4D; + +out vec4 FragData; + +void main() +{ + vec4 v = texture(s2D, c2D); + v.y += texture(sCubeArrayShadow, c4D, c1D); + v += textureProj(s3D, c4D); + v += textureLod(s2DArray, c3D, 1.2); + v.y += textureOffset(s2DShadow, c3D, ivec2(3), c1D); + v += texelFetch(s3D, ic3D, ic1D); + v += texelFetchOffset(s2D, ic2D, 4, ivec2(3)); + v += texelFetchOffset(sr, ic2D, ivec2(4)); + v.y += textureLodOffset(s2DShadow, c3D, c1D, ivec2(3)); + v += textureProjLodOffset(s2D, c3D, c1D, ivec2(3)); + v += textureGrad(sCube, c3D, c3D, c3D); + v.x += textureGradOffset(s2DArrayShadow, c4D, c2D, c2D, ivec2(3)); + v += textureProjGrad(s3D, c4D, c3D, c3D); + v += textureProjGradOffset(s2D, c3D, c2D, c2D, ivec2(3)); + + ivec4 iv = texture(is2D, c2D); + v += vec4(iv); + iv = textureProjOffset(is2D, c4D, ivec2(3)); + v += vec4(iv); + iv = textureProjLod(is2D, c3D, c1D); + v += vec4(iv); + iv = textureProjGrad(is2D, c3D, c2D, c2D); + v += vec4(iv); + iv = texture(is3D, c3D, 4.2); + v += vec4(iv); + iv = textureLod(isCube, c3D, c1D); + v += vec4(iv); + iv = texelFetch(is2DArray, ic3D, ic1D); + v += vec4(iv); + + ivec2 iv2 = textureSize(sCubeShadow, 2); + // iv2 += textureSize(is2Dms); + + FragData = v + vec4(iv2, 0.0, 0.0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.noBuiltInLoc.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.noBuiltInLoc.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.noBuiltInLoc.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.noBuiltInLoc.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,17 +1,19 @@ -#version 450 core - -layout(location = 0) -in vec4 foo; - -layout(location = 0) -out vec4 bar; - -uniform vec4 uv1; -uniform float uv2; -uniform vec3 uv3; - -void main() -{ - bar = foo; - gl_Position = foo; +#version 450 core + +layout(location = 0) +in vec4 foo; + +layout(location = 0) +out vec4 bar; + +uniform vec4 uv1; +uniform float uv2; +uniform vec3 uv3; + +layout(binding = 0) uniform atomic_uint a_uint; + +void main() +{ + bar = foo; + gl_Position = foo; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.noLocation.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.noLocation.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.noLocation.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.noLocation.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,39 +1,39 @@ -#version 450 - -layout(location = 1) in vec4 in1; -in vec4 in2; // ERROR -layout(location = 3) in vec4 in3; - -layout(location = 1) out vec4 out1; -out vec4 out2; // ERROR -layout(location = 3) out vec4 out3; - -layout(location = 10) out inb1 { - vec4 a; - vec4 b; -} inbi1; -out inb2 { - layout(location = 12) vec4 a; - layout(location = 13) vec4 b; -} inbi2; -out inb3 { // ERROR - vec4 a; - vec4 b; -} inbi3; - -layout(location = 14) out struct S1 { vec4 a; } s1; -out struct S2 { vec4 a; } s2; // ERROR - -struct SS { int a; }; -out layout(location = 15) SS ss1; -out SS ss2; // ERROR - -out gl_PerVertex { - vec4 gl_Position; - float gl_ClipDistance[2]; -}; - -void main() -{ - gl_ClipDistance[0] = 1.0; -} +#version 450 + +layout(location = 1) in vec4 in1; +in vec4 in2; // ERROR +layout(location = 3) in vec4 in3; + +layout(location = 1) out vec4 out1; +out vec4 out2; // ERROR +layout(location = 3) out vec4 out3; + +layout(location = 10) out inb1 { + vec4 a; + vec4 b; +} inbi1; +out inb2 { + layout(location = 12) vec4 a; + layout(location = 13) vec4 b; +} inbi2; +out inb3 { // ERROR + vec4 a; + vec4 b; +} inbi3; + +layout(location = 14) out struct S1 { vec4 a; } s1; +out struct S2 { vec4 a; } s2; // ERROR + +struct SS { int a; }; +out layout(location = 15) SS ss1; +out SS ss2; // ERROR + +out gl_PerVertex { + vec4 gl_Position; + float gl_ClipDistance[2]; +}; + +void main() +{ + gl_ClipDistance[0] = 1.0; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.nonSquare.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.nonSquare.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.nonSquare.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.nonSquare.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,25 +1,25 @@ -#version 140 - -in vec3 v3; -in vec4 v4; - -out mat3x2 m32; - -const vec2 cv2 = vec2(10.0, 20.0); -const mat2x4 m24 = mat2x4(3.0); -const mat4x2 m42 = mat4x2(1.0, 2.0, - 3.0, 4.0, - 5.0, 6.0, - 7.0, 8.0); - -void main() -{ - mat2x3 m23; - vec2 a, b; - - a = v3 * m23; - b = m32 * v3; - - gl_Position = vec4(m23 * m32 * v3, m24[1][3]) + - (m24 * m42) * v4 + cv2 * m42 + m24 * cv2 + vec4(cv2[1], cv2.x, m42[2][1], m42[2][0]); -} +#version 140 + +in vec3 v3; +in vec4 v4; + +out mat3x2 m32; + +const vec2 cv2 = vec2(10.0, 20.0); +const mat2x4 m24 = mat2x4(3.0); +const mat4x2 m42 = mat4x2(1.0, 2.0, + 3.0, 4.0, + 5.0, 6.0, + 7.0, 8.0); + +void main() +{ + mat2x3 m23; + vec2 a, b; + + a = v3 * m23; + b = m32 * v3; + + gl_Position = vec4(m23 * m32 * v3, m24[1][3]) + + (m24 * m42) * v4 + cv2 * m42 + m24 * cv2 + vec4(cv2[1], cv2.x, m42[2][1], m42[2][0]); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.nonuniform.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.nonuniform.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.nonuniform.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.nonuniform.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,55 @@ +#version 450 + +#extension GL_EXT_nonuniform_qualifier : enable + +layout(location=0) nonuniformEXT in vec4 nu_inv4; +nonuniformEXT float nu_gf; +layout(location=1) in nonuniformEXT flat int nu_ii; + +layout(binding=0, input_attachment_index = 0) uniform subpassInput inputAttachmentDyn[]; +layout(binding=1) uniform samplerBuffer uniformTexelBufferDyn[]; +layout(binding=2, r32f) uniform imageBuffer storageTexelBufferDyn[]; +layout(binding=3) uniform uname { float a; } uniformBuffer[]; +layout(binding=4) buffer bname { float b; } storageBuffer[]; +layout(binding=5) uniform sampler2D sampledImage[]; +layout(binding=6, r32f) uniform image2D storageImage[]; +layout(binding=7, input_attachment_index = 1) uniform subpassInput inputAttachment[]; +layout(binding=8) uniform samplerBuffer uniformTexelBuffer[]; +layout(binding=9, r32f) uniform imageBuffer storageTexelBuffer[]; + +nonuniformEXT int foo(nonuniformEXT int nupi, nonuniformEXT out int f) +{ + return nupi; +} + +void main() +{ + nonuniformEXT int nu_li; + int dyn_i; + + int a = foo(nu_li, nu_li); + nu_li = nonuniformEXT(a) + nonuniformEXT(a * 2); + + float b; + b = nu_inv4.x * nu_gf; + b += subpassLoad(inputAttachmentDyn[dyn_i]).x; + b += texelFetch(uniformTexelBufferDyn[dyn_i], 1).x; + b += imageLoad(storageTexelBufferDyn[dyn_i], 1).x; + b += uniformBuffer[nu_ii].a; + b += storageBuffer[nu_ii].b; + b += texture(sampledImage[nu_ii], vec2(0.5)).x; + b += imageLoad(storageImage[nu_ii], ivec2(1)).x; + b += subpassLoad(inputAttachment[nu_ii]).x; + b += texelFetch(uniformTexelBuffer[nu_ii], 1).x; + b += imageLoad(storageTexelBuffer[nu_ii], 1).x; + + nonuniformEXT ivec4 v; + nonuniformEXT mat4 m; + nonuniformEXT struct S { int a; } s; + ivec4 uv; + b += uniformBuffer[v.y].a; + b += uniformBuffer[v[2]].a; + b += uniformBuffer[uv[nu_ii]].a; + b += uniformBuffer[int(m[2].z)].a; + b += uniformBuffer[s.a].a; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.noWorkgroup.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.noWorkgroup.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.noWorkgroup.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.noWorkgroup.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,7 +1,7 @@ -#version 450 - -layout(local_size_x_id = 18, local_size_y_id=10,local_size_z_id = 19) in; - -void main() -{ -} +#version 450 + +layout(local_size_x_id = 18, local_size_y_id=10,local_size_z_id = 19) in; + +void main() +{ +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.offsets.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.offsets.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.offsets.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.offsets.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,17 +1,17 @@ -#version 450 - -layout(set = 0, binding = 0, std140) uniform n1 { - layout(offset = 8) int a; - layout(offset = 4) int b; - layout(offset = 0) int c; - layout(offset = 12) int d; -} i1; - -layout(set = 0, binding = 1, std430) buffer n2 { - layout(offset = 32) vec3 e; - vec3 f; - layout(offset = 16) vec3 g; - layout(offset = 0) vec3 h; -} i2; - +#version 450 + +layout(set = 0, binding = 0, std140) uniform n1 { + layout(offset = 8) int a; + layout(offset = 4) int b; + layout(offset = 0) int c; + layout(offset = 12) int d; +} i1; + +layout(set = 0, binding = 1, std430) buffer n2 { + layout(offset = 32) vec3 e; + vec3 f; + layout(offset = 16) vec3 g; + layout(offset = 0) vec3 h; +} i2; + void main() {} \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.Operations.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.Operations.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.Operations.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.Operations.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,141 +1,141 @@ -#version 450 - -flat in ivec4 uiv4; -in vec4 uv4; -bool ub; -bvec4 ub41, ub42; -in float uf; -flat in int ui; -flat in uvec4 uuv4; -flat in uint uui; - -out vec4 FragColor; - -void main() -{ - vec4 v; - float f; - bool b; - bvec4 bv4; - int i; - uint u; - - // floating point - v = radians(uv4); - v += degrees(v); - v += (i = ui*ui, sin(v)); - v += cos(v); - v += tan(v); - v += asin(v); - v += acos(v); - - v += atan(v); - v += sinh(v); - v += cosh(v); - v += tanh(v); - v += asinh(v); - v += acosh(v); - v += atanh(v); - - v += pow(v, v); - v += exp(v); - v += log(v); - v += exp2(v); - v += log2(v); - v += sqrt(v); - v += inversesqrt(v); - v += abs(v); - v += sign(v); - v += floor(v); - - v += trunc(v); - v += round(v); - v += roundEven(v); - - v += ceil(v); - v += fract(v); - v += mod(v, v); - v += mod(v, v.x); - - v += modf(v, v); - - v += min(v, uv4); - v += max(v, uv4); - v += clamp(v, uv4, uv4); - v += mix(v,v,v); - - v += mix(v,v,ub41); - v += mix(v,v,f); -//spv v += intBitsToFloat(ui); -// v += uintBitsToFloat(uui); -// i += floatBitsToInt(f); -// u += floatBitsToUint(f); - v += fma(v, uv4, v); - - v += step(v,v); - v += smoothstep(v,v,v); - v += step(uf,v); - v += smoothstep(uf,uf,v); - v += normalize(v); - v += faceforward(v, v, v); - v += reflect(v, v); - v += refract(v, v, uf); - v += dFdx(v); - v += dFdy(v); - v += fwidth(v); - - // signed integer - i += abs(ui); - i += sign(i); - i += min(i, ui); - i += max(i, ui); - i += clamp(i, ui, ui); - - // unsigned integer - u += min(u, uui); - u += max(u, uui); - u += clamp(u, uui, uui); - - //// bool - b = isnan(uf); - b = isinf(f); - b = any(lessThan(v, uv4)); - b = (b && any(lessThanEqual(v, uv4))); - b = (b && any(greaterThan(v, uv4))); - b = (b && any(greaterThanEqual(v, uv4))); - b = (b && any(equal(ub41, ub42))); - b = (b && any(notEqual(ub41, ub42))); - b = (b && any(ub41)); - b = (b && all(ub41)); - b = (b && any(not(ub41))); - - i = ((i + ui) * i - ui) / i; - i = i % ui; - if (i == ui || i != ui && i == ui ^^ i != 2) - ++i; - - f = ((uf + uf) * uf - uf) / uf; - - f += length(v); - f += distance(v, v); - f += dot(v, v); - f += dot(f, uf); - f += cross(v.xyz, v.xyz).x; - - if (f == uf || f != uf && f != 2.0) - ++f; - - i &= ui; - i |= 0x42; - i ^= ui; - i %= 17; - i >>= 2; - i <<= ui; - i = ~i; - b = !b; - - FragColor = b ? vec4(i) + vec4(f) + v : v; - - mat4 m1 = mat4(1.0), m2 = mat4(0.0); - FragColor += (b ? m1 : m2)[1]; -} +#version 450 + +flat in ivec4 uiv4; +in vec4 uv4; +bool ub; +bvec4 ub41, ub42; +in float uf; +flat in int ui; +flat in uvec4 uuv4; +flat in uint uui; + +out vec4 FragColor; + +void main() +{ + vec4 v; + float f; + bool b; + bvec4 bv4; + int i; + uint u; + + // floating point + v = radians(uv4); + v += degrees(v); + v += (i = ui*ui, sin(v)); + v += cos(v); + v += tan(v); + v += asin(v); + v += acos(v); + + v += atan(v); + v += sinh(v); + v += cosh(v); + v += tanh(v); + v += asinh(v); + v += acosh(v); + v += atanh(v); + + v += pow(v, v); + v += exp(v); + v += log(v); + v += exp2(v); + v += log2(v); + v += sqrt(v); + v += inversesqrt(v); + v += abs(v); + v += sign(v); + v += floor(v); + + v += trunc(v); + v += round(v); + v += roundEven(v); + + v += ceil(v); + v += fract(v); + v += mod(v, v); + v += mod(v, v.x); + + v += modf(v, v); + + v += min(v, uv4); + v += max(v, uv4); + v += clamp(v, uv4, uv4); + v += mix(v,v,v); + + v += mix(v,v,ub41); + v += mix(v,v,f); +//spv v += intBitsToFloat(ui); +// v += uintBitsToFloat(uui); +// i += floatBitsToInt(f); +// u += floatBitsToUint(f); + v += fma(v, uv4, v); + + v += step(v,v); + v += smoothstep(v,v,v); + v += step(uf,v); + v += smoothstep(uf,uf,v); + v += normalize(v); + v += faceforward(v, v, v); + v += reflect(v, v); + v += refract(v, v, uf); + v += dFdx(v); + v += dFdy(v); + v += fwidth(v); + + // signed integer + i += abs(ui); + i += sign(i); + i += min(i, ui); + i += max(i, ui); + i += clamp(i, ui, ui); + + // unsigned integer + u += min(u, uui); + u += max(u, uui); + u += clamp(u, uui, uui); + + //// bool + b = isnan(uf); + b = isinf(f); + b = any(lessThan(v, uv4)); + b = (b && any(lessThanEqual(v, uv4))); + b = (b && any(greaterThan(v, uv4))); + b = (b && any(greaterThanEqual(v, uv4))); + b = (b && any(equal(ub41, ub42))); + b = (b && any(notEqual(ub41, ub42))); + b = (b && any(ub41)); + b = (b && all(ub41)); + b = (b && any(not(ub41))); + + i = ((i + ui) * i - ui) / i; + i = i % ui; + if (i == ui || i != ui && i == ui ^^ i != 2) + ++i; + + f = ((uf + uf) * uf - uf) / uf; + + f += length(v); + f += distance(v, v); + f += dot(v, v); + f += dot(f, uf); + f += cross(v.xyz, v.xyz).x; + + if (f == uf || f != uf && f != 2.0) + ++f; + + i &= ui; + i |= 0x42; + i ^= ui; + i %= 17; + i >>= 2; + i <<= ui; + i = ~i; + b = !b; + + FragColor = b ? vec4(i) + vec4(f) + v : v; + + mat4 m1 = mat4(1.0), m2 = mat4(0.0); + FragColor += (b ? m1 : m2)[1]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.precision.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.precision.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.precision.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.precision.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,60 +1,60 @@ -#version 310 es -precision mediump float; -in lowp float lowfin; -in mediump float mediumfin; -in highp vec4 highfin; - -highp int uniform_high; -mediump int uniform_medium; -lowp int uniform_low; -bvec2 ub2; - -out mediump vec4 mediumfout; - -highp float global_highp; - -lowp vec2 foo(mediump vec3 mv3) -{ - return highfin.xy; -} - -bool boolfun(bvec2 bv2) -{ - return bv2 == bvec2(false, true); -} - -struct S { - highp float a; - lowp float b; -}; - -in S s; - -void main() -{ - lowp int sum = uniform_medium + uniform_high; - - sum += uniform_high; - sum += uniform_low; - - // test maxing precisions of args to get precision of builtin - lowp float arg1 = 3.2; - mediump float arg2 = 1023908.2; - lowp float d = distance(lowfin, mediumfin); - - global_highp = length(highfin); - - highp vec4 local_highp = vec4(global_highp); - - mediumfout = vec4(sin(d)) + arg2 + local_highp; - - sum += 4 + ((ivec2(uniform_low) * ivec2(uniform_high) + ivec2((/* comma operator */uniform_low, uniform_high)))).x; - - mediumfout += vec4(sum); - - if (boolfun(ub2)) - ++mediumfout; - - mediumfout *= s.a; - mediumfout *= s.b; -} +#version 310 es +precision mediump float; +in lowp float lowfin; +in mediump float mediumfin; +in highp vec4 highfin; + +highp int uniform_high; +mediump int uniform_medium; +lowp int uniform_low; +bvec2 ub2; + +out mediump vec4 mediumfout; + +highp float global_highp; + +lowp vec2 foo(mediump vec3 mv3) +{ + return highfin.xy; +} + +bool boolfun(bvec2 bv2) +{ + return bv2 == bvec2(false, true); +} + +struct S { + highp float a; + lowp float b; +}; + +in S s; + +void main() +{ + lowp int sum = uniform_medium + uniform_high; + + sum += uniform_high; + sum += uniform_low; + + // test maxing precisions of args to get precision of builtin + lowp float arg1 = 3.2; + mediump float arg2 = 1023908.2; + lowp float d = distance(lowfin, mediumfin); + + global_highp = length(highfin); + + highp vec4 local_highp = vec4(global_highp); + + mediumfout = vec4(sin(d)) + arg2 + local_highp; + + sum += 4 + ((ivec2(uniform_low) * ivec2(uniform_high) + ivec2((/* comma operator */uniform_low, uniform_high)))).x; + + mediumfout += vec4(sum); + + if (boolfun(ub2)) + ++mediumfout; + + mediumfout *= s.a; + mediumfout *= s.b; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.precisionNonESSamp.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.precisionNonESSamp.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.precisionNonESSamp.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.precisionNonESSamp.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,24 +1,24 @@ -#version 450 - -precision lowp sampler2D; -precision lowp int; -precision lowp float; - -uniform lowp sampler2D s; -uniform highp sampler3D t; -layout(rgba32f) uniform lowp image2D i1; -layout(rgba32f) uniform highp image2D i2; - -layout(location = 0) in lowp vec2 v2; -layout(location = 1) in lowp vec3 v3; -layout(location = 3) flat in lowp ivec2 iv2; - -layout(location = 0) out lowp vec4 color; - -void main() -{ - color = texture(s, v2); - color = texture(t, v3); - lowp vec4 vi1 = imageLoad(i1, iv2); - lowp vec4 vi2 = imageLoad(i2, iv2); -} +#version 450 + +precision lowp sampler2D; +precision lowp int; +precision lowp float; + +uniform lowp sampler2D s; +uniform highp sampler3D t; +layout(rgba32f) uniform lowp image2D i1; +layout(rgba32f) uniform highp image2D i2; + +layout(location = 0) in lowp vec2 v2; +layout(location = 1) in lowp vec3 v3; +layout(location = 3) flat in lowp ivec2 iv2; + +layout(location = 0) out lowp vec4 color; + +void main() +{ + color = texture(s, v2); + color = texture(t, v3); + lowp vec4 vi1 = imageLoad(i1, iv2); + lowp vec4 vi2 = imageLoad(i2, iv2); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.prepost.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.prepost.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.prepost.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.prepost.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,38 +1,38 @@ -#version 140 - -void main() -{ - struct s { - float y[5]; - } str; - - float t; - int index = 5; // all indexing is 4 - - str.y[4] = 2.0; // 2.0 - t = ++str.y[--index]; // 3.0 - str.y[4] += t; // 6.0 - t = str.y[4]--; // 5.0 (t = 6.0) - str.y[index++] += t; // 11.0 - --str.y[--index]; // 10.0 - - float x = str.y[4]; - ++x; - --x; - x++; - x--; - - // x is 10.0 - - float y = x * ++x; // 10 * 11 - float z = y * x--; // 110 * 11 - - // x is 10.0 - // z is 1210.0 - - vec4 v = vec4(1.0, 2.0, 3.0, 4.0); - v.y = v.z--; // (1,3,2,4) - v.x = --v.w; // (3,3,2,3) - - gl_FragColor = z * v;// (3630.0, 3630.0, 2420.0, 3630.0) -} +#version 140 + +void main() +{ + struct s { + float y[5]; + } str; + + float t; + int index = 5; // all indexing is 4 + + str.y[4] = 2.0; // 2.0 + t = ++str.y[--index]; // 3.0 + str.y[4] += t; // 6.0 + t = str.y[4]--; // 5.0 (t = 6.0) + str.y[index++] += t; // 11.0 + --str.y[--index]; // 10.0 + + float x = str.y[4]; + ++x; + --x; + x++; + x--; + + // x is 10.0 + + float y = x * ++x; // 10 * 11 + float z = y * x--; // 110 * 11 + + // x is 10.0 + // z is 1210.0 + + vec4 v = vec4(1.0, 2.0, 3.0, 4.0); + v.y = v.z--; // (1,3,2,4) + v.x = --v.w; // (3,3,2,3) + + gl_FragColor = z * v;// (3630.0, 3630.0, 2420.0, 3630.0) +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.pushConstantAnon.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.pushConstantAnon.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.pushConstantAnon.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.pushConstantAnon.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,17 +1,17 @@ -#version 400 - -layout(push_constant) uniform Material { - int kind; - float fa[3]; -}; - -out vec4 color; - -void main() -{ - switch (kind) { - case 1: color = vec4(0.2); break; - case 2: color = vec4(0.5); break; - default: color = vec4(fa[1]); break; - } -} +#version 400 + +layout(push_constant) uniform Material { + int kind; + float fa[3]; +}; + +out vec4 color; + +void main() +{ + switch (kind) { + case 1: color = vec4(0.2); break; + case 2: color = vec4(0.5); break; + default: color = vec4(fa[1]); break; + } +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.pushConstant.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.pushConstant.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.pushConstant.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.pushConstant.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,17 +1,17 @@ -#version 400 - -layout(push_constant) uniform Material { - int kind; - float fa[3]; -} matInst; - -out vec4 color; - -void main() -{ - switch (matInst.kind) { - case 1: color = vec4(0.2); break; - case 2: color = vec4(0.5); break; - default: color = vec4(0.0); break; - } -} +#version 400 + +layout(push_constant) uniform Material { + int kind; + float fa[3]; +} matInst; + +out vec4 color; + +void main() +{ + switch (matInst.kind) { + case 1: color = vec4(0.2); break; + case 2: color = vec4(0.5); break; + default: color = vec4(0.0); break; + } +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.qualifiers.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.qualifiers.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.qualifiers.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.qualifiers.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,19 +1,19 @@ -#version 430 core - -in vec4 inV; - -centroid out vec4 outVc; -smooth out vec4 outVs; -flat out vec4 outVf; -noperspective out vec4 outVn; - -centroid noperspective out vec4 outVcn; - -void main() -{ - outVc = inV; - outVs = inV; - outVf = inV; - outVn = inV; - outVcn = inV; -} +#version 430 core + +in vec4 inV; + +centroid out vec4 outVc; +smooth out vec4 outVs; +flat out vec4 outVf; +noperspective out vec4 outVn; + +centroid noperspective out vec4 outVcn; + +void main() +{ + outVc = inV; + outVs = inV; + outVf = inV; + outVn = inV; + outVcn = inV; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.queryL.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.queryL.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.queryL.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.queryL.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,64 +1,64 @@ #version 430 core -uniform sampler1D samp1D; -uniform isampler2D isamp2D; -uniform usampler2D usamp2D; -uniform isampler3D isamp3D; -uniform usampler3D usamp3D; -uniform samplerCube sampCube; -uniform isamplerCube isampCube; -uniform isampler1DArray isamp1DA; -uniform sampler2DArray samp2DA; -uniform usampler2DArray usamp2DA; -uniform isamplerCubeArray isampCubeA; -uniform usamplerCubeArray usampCubeA; - -uniform sampler1DShadow samp1Ds; -uniform sampler2DShadow samp2Ds; -uniform samplerCubeShadow sampCubes; -uniform sampler1DArrayShadow samp1DAs; -uniform sampler2DArrayShadow samp2DAs; -uniform samplerCubeArrayShadow sampCubeAs; - -uniform samplerBuffer sampBuf; -uniform sampler2DRect sampRect; - -void main() -{ - vec2 lod; - float pf; - vec2 pf2; - vec3 pf3; - - lod = textureQueryLod(samp1D, pf); - lod += textureQueryLod(isamp2D, pf2); - lod += textureQueryLod(usamp3D, pf3); - lod += textureQueryLod(sampCube, pf3); - lod += textureQueryLod(isamp1DA, pf); - lod += textureQueryLod(usamp2DA, pf2); - lod += textureQueryLod(isampCubeA, pf3); - - lod += textureQueryLod(samp1Ds, pf); - lod += textureQueryLod(samp2Ds, pf2); - lod += textureQueryLod(sampCubes, pf3); - lod += textureQueryLod(samp1DAs, pf); - lod += textureQueryLod(samp2DAs, pf2); - lod += textureQueryLod(sampCubeAs, pf3); - - int levels; - - levels = textureQueryLevels(samp1D); - levels += textureQueryLevels(usamp2D); - levels += textureQueryLevels(isamp3D); - levels += textureQueryLevels(isampCube); - levels += textureQueryLevels(isamp1DA); - levels += textureQueryLevels(samp2DA); - levels += textureQueryLevels(usampCubeA); - - levels = textureQueryLevels(samp1Ds); - levels += textureQueryLevels(samp2Ds); - levels += textureQueryLevels(sampCubes); - levels += textureQueryLevels(samp1DAs); - levels += textureQueryLevels(samp2DAs); - levels += textureQueryLevels(sampCubeAs); -} +uniform sampler1D samp1D; +uniform isampler2D isamp2D; +uniform usampler2D usamp2D; +uniform isampler3D isamp3D; +uniform usampler3D usamp3D; +uniform samplerCube sampCube; +uniform isamplerCube isampCube; +uniform isampler1DArray isamp1DA; +uniform sampler2DArray samp2DA; +uniform usampler2DArray usamp2DA; +uniform isamplerCubeArray isampCubeA; +uniform usamplerCubeArray usampCubeA; + +uniform sampler1DShadow samp1Ds; +uniform sampler2DShadow samp2Ds; +uniform samplerCubeShadow sampCubes; +uniform sampler1DArrayShadow samp1DAs; +uniform sampler2DArrayShadow samp2DAs; +uniform samplerCubeArrayShadow sampCubeAs; + +uniform samplerBuffer sampBuf; +uniform sampler2DRect sampRect; + +void main() +{ + vec2 lod; + float pf; + vec2 pf2; + vec3 pf3; + + lod = textureQueryLod(samp1D, pf); + lod += textureQueryLod(isamp2D, pf2); + lod += textureQueryLod(usamp3D, pf3); + lod += textureQueryLod(sampCube, pf3); + lod += textureQueryLod(isamp1DA, pf); + lod += textureQueryLod(usamp2DA, pf2); + lod += textureQueryLod(isampCubeA, pf3); + + lod += textureQueryLod(samp1Ds, pf); + lod += textureQueryLod(samp2Ds, pf2); + lod += textureQueryLod(sampCubes, pf3); + lod += textureQueryLod(samp1DAs, pf); + lod += textureQueryLod(samp2DAs, pf2); + lod += textureQueryLod(sampCubeAs, pf3); + + int levels; + + levels = textureQueryLevels(samp1D); + levels += textureQueryLevels(usamp2D); + levels += textureQueryLevels(isamp3D); + levels += textureQueryLevels(isampCube); + levels += textureQueryLevels(isamp1DA); + levels += textureQueryLevels(samp2DA); + levels += textureQueryLevels(usampCubeA); + + levels = textureQueryLevels(samp1Ds); + levels += textureQueryLevels(samp2Ds); + levels += textureQueryLevels(sampCubes); + levels += textureQueryLevels(samp1DAs); + levels += textureQueryLevels(samp2DAs); + levels += textureQueryLevels(sampCubeAs); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.rankShift.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.rankShift.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.rankShift.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.rankShift.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,15 @@ +#version 450 +#extension GL_ARB_gpu_shader_int64 : require + +layout(local_size_x = 54) in; + +layout(location=4) uniform int64_t arg0; +layout(location=5) uniform uint arg1; + +void main() +{ + uint64_t result = arg0 << arg1; + result = arg0 >> arg1; + result <<= arg1; + result >>= arg1; +} \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.separate.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.separate.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.separate.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.separate.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,21 +1,21 @@ -#version 400 - -uniform sampler s; -uniform samplerShadow sShadow; -uniform sampler sA[4]; -uniform texture2D t2d; -uniform texture3D t3d[4]; -flat in int i; - -out vec4 color; - -void main() -{ - color = texture(sampler2D(t2d, s), vec2(0.5)); - color += texture(sampler3D(t3d[i], sA[2]), vec3(0.5)); - color += texture(sampler2D(t2d, s), vec2(0.5)); -} - +#version 400 + +uniform sampler s; +uniform samplerShadow sShadow; +uniform sampler sA[4]; +uniform texture2D t2d; +uniform texture3D t3d[4]; +flat in int i; + +out vec4 color; + +void main() +{ + color = texture(sampler2D(t2d, s), vec2(0.5)); + color += texture(sampler3D(t3d[i], sA[2]), vec3(0.5)); + color += texture(sampler2D(t2d, s), vec2(0.5)); +} + uniform texture2D tex2D; uniform textureCube texCube; uniform textureCubeArray texCubeArray; diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.set.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.set.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.set.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.set.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,14 +1,14 @@ -#version 450 - -layout(set = 4, binding = 7) uniform sampler2D samp2D; - -layout(set = 0, binding = 8) buffer setBuf { - vec4 color; -} setBufInst; - -out vec4 color; - -void main() -{ - color = setBufInst.color; -} +#version 450 + +layout(set = 4, binding = 7) uniform sampler2D samp2D; + +layout(set = 0, binding = 8) buffer setBuf { + vec4 color; +} setBufInst; + +out vec4 color; + +void main() +{ + color = setBufInst.color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shaderBallotAMD.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.shaderBallotAMD.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shaderBallotAMD.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.shaderBallotAMD.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,165 +1,204 @@ -#version 450 - -#extension GL_ARB_gpu_shader_int64: enable -#extension GL_AMD_gpu_shader_half_float: enable -#extension GL_AMD_shader_ballot: enable - -layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in; - -layout(binding = 0) buffer Buffers -{ - int i; - uvec2 uv; - vec3 fv; - dvec4 dv; - int64_t i64; - u64vec2 u64v; - f16vec3 f16v; -}; - -void main() -{ - i = minInvocationsAMD(i); - uv = minInvocationsAMD(uv); - fv = minInvocationsAMD(fv); - dv = minInvocationsAMD(dv); - i64 = minInvocationsAMD(i64); - u64v = minInvocationsAMD(u64v); - f16v = minInvocationsAMD(f16v); - - i = maxInvocationsAMD(i); - uv = maxInvocationsAMD(uv); - fv = maxInvocationsAMD(fv); - dv = maxInvocationsAMD(dv); - i64 = maxInvocationsAMD(i64); - u64v = maxInvocationsAMD(u64v); - f16v = maxInvocationsAMD(f16v); - - i = addInvocationsAMD(i); - uv = addInvocationsAMD(uv); - fv = addInvocationsAMD(fv); - dv = addInvocationsAMD(dv); - i64 = addInvocationsAMD(i64); - u64v = addInvocationsAMD(u64v); - f16v = addInvocationsAMD(f16v); - - i = minInvocationsNonUniformAMD(i); - uv = minInvocationsNonUniformAMD(uv); - fv = minInvocationsNonUniformAMD(fv); - dv = minInvocationsNonUniformAMD(dv); - i64 = minInvocationsNonUniformAMD(i64); - u64v = minInvocationsNonUniformAMD(u64v); - f16v = minInvocationsNonUniformAMD(f16v); - - i = maxInvocationsNonUniformAMD(i); - uv = maxInvocationsNonUniformAMD(uv); - fv = maxInvocationsNonUniformAMD(fv); - dv = maxInvocationsNonUniformAMD(dv); - i64 = maxInvocationsNonUniformAMD(i64); - u64v = maxInvocationsNonUniformAMD(u64v); - f16v = maxInvocationsNonUniformAMD(f16v); - - i = addInvocationsNonUniformAMD(i); - uv = addInvocationsNonUniformAMD(uv); - fv = addInvocationsNonUniformAMD(fv); - dv = addInvocationsNonUniformAMD(dv); - i64 = addInvocationsNonUniformAMD(i64); - u64v = addInvocationsNonUniformAMD(u64v); - f16v = addInvocationsNonUniformAMD(f16v); - - i = minInvocationsInclusiveScanAMD(i); - uv = minInvocationsInclusiveScanAMD(uv); - fv = minInvocationsInclusiveScanAMD(fv); - dv = minInvocationsInclusiveScanAMD(dv); - i64 = minInvocationsInclusiveScanAMD(i64); - u64v = minInvocationsInclusiveScanAMD(u64v); - f16v = minInvocationsInclusiveScanAMD(f16v); - - i = maxInvocationsInclusiveScanAMD(i); - uv = maxInvocationsInclusiveScanAMD(uv); - fv = maxInvocationsInclusiveScanAMD(fv); - dv = maxInvocationsInclusiveScanAMD(dv); - i64 = maxInvocationsInclusiveScanAMD(i64); - u64v = maxInvocationsInclusiveScanAMD(u64v); - f16v = maxInvocationsInclusiveScanAMD(f16v); - - i = addInvocationsInclusiveScanAMD(i); - uv = addInvocationsInclusiveScanAMD(uv); - fv = addInvocationsInclusiveScanAMD(fv); - dv = addInvocationsInclusiveScanAMD(dv); - i64 = addInvocationsInclusiveScanAMD(i64); - u64v = addInvocationsInclusiveScanAMD(u64v); - f16v = addInvocationsInclusiveScanAMD(f16v); - - i = minInvocationsExclusiveScanAMD(i); - uv = minInvocationsExclusiveScanAMD(uv); - fv = minInvocationsExclusiveScanAMD(fv); - dv = minInvocationsExclusiveScanAMD(dv); - i64 = minInvocationsExclusiveScanAMD(i64); - u64v = minInvocationsExclusiveScanAMD(u64v); - f16v = minInvocationsExclusiveScanAMD(f16v); - - i = maxInvocationsExclusiveScanAMD(i); - uv = maxInvocationsExclusiveScanAMD(uv); - fv = maxInvocationsExclusiveScanAMD(fv); - dv = maxInvocationsExclusiveScanAMD(dv); - i64 = maxInvocationsExclusiveScanAMD(i64); - u64v = maxInvocationsExclusiveScanAMD(u64v); - f16v = maxInvocationsExclusiveScanAMD(f16v); - - i = addInvocationsExclusiveScanAMD(i); - uv = addInvocationsExclusiveScanAMD(uv); - fv = addInvocationsExclusiveScanAMD(fv); - dv = addInvocationsExclusiveScanAMD(dv); - i64 = addInvocationsExclusiveScanAMD(i64); - u64v = addInvocationsExclusiveScanAMD(u64v); - f16v = addInvocationsExclusiveScanAMD(f16v); - - i = minInvocationsInclusiveScanNonUniformAMD(i); - uv = minInvocationsInclusiveScanNonUniformAMD(uv); - fv = minInvocationsInclusiveScanNonUniformAMD(fv); - dv = minInvocationsInclusiveScanNonUniformAMD(dv); - i64 = minInvocationsInclusiveScanNonUniformAMD(i64); - u64v = minInvocationsInclusiveScanNonUniformAMD(u64v); - f16v = minInvocationsInclusiveScanNonUniformAMD(f16v); - - i = maxInvocationsInclusiveScanNonUniformAMD(i); - uv = maxInvocationsInclusiveScanNonUniformAMD(uv); - fv = maxInvocationsInclusiveScanNonUniformAMD(fv); - dv = maxInvocationsInclusiveScanNonUniformAMD(dv); - i64 = maxInvocationsInclusiveScanNonUniformAMD(i64); - u64v = maxInvocationsInclusiveScanNonUniformAMD(u64v); - f16v = maxInvocationsInclusiveScanNonUniformAMD(f16v); - - i = addInvocationsInclusiveScanNonUniformAMD(i); - uv = addInvocationsInclusiveScanNonUniformAMD(uv); - fv = addInvocationsInclusiveScanNonUniformAMD(fv); - dv = addInvocationsInclusiveScanNonUniformAMD(dv); - i64 = addInvocationsInclusiveScanNonUniformAMD(i64); - u64v = addInvocationsInclusiveScanNonUniformAMD(u64v); - f16v = addInvocationsInclusiveScanNonUniformAMD(f16v); - - i = minInvocationsExclusiveScanNonUniformAMD(i); - uv = minInvocationsExclusiveScanNonUniformAMD(uv); - fv = minInvocationsExclusiveScanNonUniformAMD(fv); - dv = minInvocationsExclusiveScanNonUniformAMD(dv); - i64 = minInvocationsExclusiveScanNonUniformAMD(i64); - u64v = minInvocationsExclusiveScanNonUniformAMD(u64v); - f16v = minInvocationsExclusiveScanNonUniformAMD(f16v); - - i = maxInvocationsExclusiveScanNonUniformAMD(i); - uv = maxInvocationsExclusiveScanNonUniformAMD(uv); - fv = maxInvocationsExclusiveScanNonUniformAMD(fv); - dv = maxInvocationsExclusiveScanNonUniformAMD(dv); - i64 = maxInvocationsExclusiveScanNonUniformAMD(i64); - u64v = maxInvocationsExclusiveScanNonUniformAMD(u64v); - f16v = maxInvocationsExclusiveScanNonUniformAMD(f16v); - - i = addInvocationsExclusiveScanNonUniformAMD(i); - uv = addInvocationsExclusiveScanNonUniformAMD(uv); - fv = addInvocationsExclusiveScanNonUniformAMD(fv); - dv = addInvocationsExclusiveScanNonUniformAMD(dv); - i64 = addInvocationsExclusiveScanNonUniformAMD(i64); - u64v = addInvocationsExclusiveScanNonUniformAMD(u64v); - f16v = addInvocationsExclusiveScanNonUniformAMD(f16v); -} +#version 450 + +#extension GL_ARB_gpu_shader_int64: enable +#extension GL_AMD_gpu_shader_half_float: enable +#extension GL_AMD_gpu_shader_int16: enable +#extension GL_AMD_shader_ballot: enable + +layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in; + +layout(binding = 0) buffer Buffers +{ + int i; + uvec2 uv; + vec3 fv; + dvec4 dv; + int64_t i64; + u64vec2 u64v; + f16vec3 f16v; + i16vec4 i16v; + uint16_t u16; +}; + +void main() +{ + i = minInvocationsAMD(i); + uv = minInvocationsAMD(uv); + fv = minInvocationsAMD(fv); + dv = minInvocationsAMD(dv); + i64 = minInvocationsAMD(i64); + u64v = minInvocationsAMD(u64v); + f16v = minInvocationsAMD(f16v); + i16v = minInvocationsAMD(i16v); + u16 = minInvocationsAMD(u16); + + i = maxInvocationsAMD(i); + uv = maxInvocationsAMD(uv); + fv = maxInvocationsAMD(fv); + dv = maxInvocationsAMD(dv); + i64 = maxInvocationsAMD(i64); + u64v = maxInvocationsAMD(u64v); + f16v = maxInvocationsAMD(f16v); + i16v = maxInvocationsAMD(i16v); + u16 = maxInvocationsAMD(u16); + + i = addInvocationsAMD(i); + uv = addInvocationsAMD(uv); + fv = addInvocationsAMD(fv); + dv = addInvocationsAMD(dv); + i64 = addInvocationsAMD(i64); + u64v = addInvocationsAMD(u64v); + f16v = addInvocationsAMD(f16v); + i16v = addInvocationsAMD(i16v); + u16 = addInvocationsAMD(u16); + + i = minInvocationsNonUniformAMD(i); + uv = minInvocationsNonUniformAMD(uv); + fv = minInvocationsNonUniformAMD(fv); + dv = minInvocationsNonUniformAMD(dv); + i64 = minInvocationsNonUniformAMD(i64); + u64v = minInvocationsNonUniformAMD(u64v); + f16v = minInvocationsNonUniformAMD(f16v); + i16v = minInvocationsNonUniformAMD(i16v); + u16 = minInvocationsNonUniformAMD(u16); + + i = maxInvocationsNonUniformAMD(i); + uv = maxInvocationsNonUniformAMD(uv); + fv = maxInvocationsNonUniformAMD(fv); + dv = maxInvocationsNonUniformAMD(dv); + i64 = maxInvocationsNonUniformAMD(i64); + u64v = maxInvocationsNonUniformAMD(u64v); + f16v = maxInvocationsNonUniformAMD(f16v); + i16v = maxInvocationsNonUniformAMD(i16v); + u16 = maxInvocationsNonUniformAMD(u16); + + i = addInvocationsNonUniformAMD(i); + uv = addInvocationsNonUniformAMD(uv); + fv = addInvocationsNonUniformAMD(fv); + dv = addInvocationsNonUniformAMD(dv); + i64 = addInvocationsNonUniformAMD(i64); + u64v = addInvocationsNonUniformAMD(u64v); + f16v = addInvocationsNonUniformAMD(f16v); + i16v = addInvocationsNonUniformAMD(i16v); + u16 = addInvocationsNonUniformAMD(u16); + + i = minInvocationsInclusiveScanAMD(i); + uv = minInvocationsInclusiveScanAMD(uv); + fv = minInvocationsInclusiveScanAMD(fv); + dv = minInvocationsInclusiveScanAMD(dv); + i64 = minInvocationsInclusiveScanAMD(i64); + u64v = minInvocationsInclusiveScanAMD(u64v); + f16v = minInvocationsInclusiveScanAMD(f16v); + i16v = minInvocationsInclusiveScanAMD(i16v); + u16 = minInvocationsInclusiveScanAMD(u16); + + i = maxInvocationsInclusiveScanAMD(i); + uv = maxInvocationsInclusiveScanAMD(uv); + fv = maxInvocationsInclusiveScanAMD(fv); + dv = maxInvocationsInclusiveScanAMD(dv); + i64 = maxInvocationsInclusiveScanAMD(i64); + u64v = maxInvocationsInclusiveScanAMD(u64v); + f16v = maxInvocationsInclusiveScanAMD(f16v); + i16v = maxInvocationsInclusiveScanAMD(i16v); + u16 = maxInvocationsInclusiveScanAMD(u16); + + i = addInvocationsInclusiveScanAMD(i); + uv = addInvocationsInclusiveScanAMD(uv); + fv = addInvocationsInclusiveScanAMD(fv); + dv = addInvocationsInclusiveScanAMD(dv); + i64 = addInvocationsInclusiveScanAMD(i64); + u64v = addInvocationsInclusiveScanAMD(u64v); + f16v = addInvocationsInclusiveScanAMD(f16v); + i16v = addInvocationsInclusiveScanAMD(i16v); + u16 = addInvocationsInclusiveScanAMD(u16); + + i = minInvocationsExclusiveScanAMD(i); + uv = minInvocationsExclusiveScanAMD(uv); + fv = minInvocationsExclusiveScanAMD(fv); + dv = minInvocationsExclusiveScanAMD(dv); + i64 = minInvocationsExclusiveScanAMD(i64); + u64v = minInvocationsExclusiveScanAMD(u64v); + f16v = minInvocationsExclusiveScanAMD(f16v); + i16v = minInvocationsExclusiveScanAMD(i16v); + u16 = minInvocationsExclusiveScanAMD(u16); + + i = maxInvocationsExclusiveScanAMD(i); + uv = maxInvocationsExclusiveScanAMD(uv); + fv = maxInvocationsExclusiveScanAMD(fv); + dv = maxInvocationsExclusiveScanAMD(dv); + i64 = maxInvocationsExclusiveScanAMD(i64); + u64v = maxInvocationsExclusiveScanAMD(u64v); + f16v = maxInvocationsExclusiveScanAMD(f16v); + i16v = maxInvocationsExclusiveScanAMD(i16v); + u16 = maxInvocationsExclusiveScanAMD(u16); + + i = addInvocationsExclusiveScanAMD(i); + uv = addInvocationsExclusiveScanAMD(uv); + fv = addInvocationsExclusiveScanAMD(fv); + dv = addInvocationsExclusiveScanAMD(dv); + i64 = addInvocationsExclusiveScanAMD(i64); + u64v = addInvocationsExclusiveScanAMD(u64v); + f16v = addInvocationsExclusiveScanAMD(f16v); + i16v = addInvocationsExclusiveScanAMD(i16v); + u16 = addInvocationsExclusiveScanAMD(u16); + + i = minInvocationsInclusiveScanNonUniformAMD(i); + uv = minInvocationsInclusiveScanNonUniformAMD(uv); + fv = minInvocationsInclusiveScanNonUniformAMD(fv); + dv = minInvocationsInclusiveScanNonUniformAMD(dv); + i64 = minInvocationsInclusiveScanNonUniformAMD(i64); + u64v = minInvocationsInclusiveScanNonUniformAMD(u64v); + f16v = minInvocationsInclusiveScanNonUniformAMD(f16v); + i16v = minInvocationsInclusiveScanNonUniformAMD(i16v); + u16 = minInvocationsInclusiveScanNonUniformAMD(u16); + + i = maxInvocationsInclusiveScanNonUniformAMD(i); + uv = maxInvocationsInclusiveScanNonUniformAMD(uv); + fv = maxInvocationsInclusiveScanNonUniformAMD(fv); + dv = maxInvocationsInclusiveScanNonUniformAMD(dv); + i64 = maxInvocationsInclusiveScanNonUniformAMD(i64); + u64v = maxInvocationsInclusiveScanNonUniformAMD(u64v); + f16v = maxInvocationsInclusiveScanNonUniformAMD(f16v); + i16v = maxInvocationsInclusiveScanNonUniformAMD(i16v); + u16 = maxInvocationsInclusiveScanNonUniformAMD(u16); + + i = addInvocationsInclusiveScanNonUniformAMD(i); + uv = addInvocationsInclusiveScanNonUniformAMD(uv); + fv = addInvocationsInclusiveScanNonUniformAMD(fv); + dv = addInvocationsInclusiveScanNonUniformAMD(dv); + i64 = addInvocationsInclusiveScanNonUniformAMD(i64); + u64v = addInvocationsInclusiveScanNonUniformAMD(u64v); + f16v = addInvocationsInclusiveScanNonUniformAMD(f16v); + i16v = addInvocationsInclusiveScanNonUniformAMD(i16v); + u16 = addInvocationsInclusiveScanNonUniformAMD(u16); + + i = minInvocationsExclusiveScanNonUniformAMD(i); + uv = minInvocationsExclusiveScanNonUniformAMD(uv); + fv = minInvocationsExclusiveScanNonUniformAMD(fv); + dv = minInvocationsExclusiveScanNonUniformAMD(dv); + i64 = minInvocationsExclusiveScanNonUniformAMD(i64); + u64v = minInvocationsExclusiveScanNonUniformAMD(u64v); + f16v = minInvocationsExclusiveScanNonUniformAMD(f16v); + i16v = minInvocationsExclusiveScanNonUniformAMD(i16v); + u16 = minInvocationsExclusiveScanNonUniformAMD(u16); + + i = maxInvocationsExclusiveScanNonUniformAMD(i); + uv = maxInvocationsExclusiveScanNonUniformAMD(uv); + fv = maxInvocationsExclusiveScanNonUniformAMD(fv); + dv = maxInvocationsExclusiveScanNonUniformAMD(dv); + i64 = maxInvocationsExclusiveScanNonUniformAMD(i64); + u64v = maxInvocationsExclusiveScanNonUniformAMD(u64v); + f16v = maxInvocationsExclusiveScanNonUniformAMD(f16v); + i16v = maxInvocationsExclusiveScanNonUniformAMD(i16v); + u16 = maxInvocationsExclusiveScanNonUniformAMD(u16); + + i = addInvocationsExclusiveScanNonUniformAMD(i); + uv = addInvocationsExclusiveScanNonUniformAMD(uv); + fv = addInvocationsExclusiveScanNonUniformAMD(fv); + dv = addInvocationsExclusiveScanNonUniformAMD(dv); + i64 = addInvocationsExclusiveScanNonUniformAMD(i64); + u64v = addInvocationsExclusiveScanNonUniformAMD(u64v); + f16v = addInvocationsExclusiveScanNonUniformAMD(f16v); + i16v = addInvocationsExclusiveScanNonUniformAMD(i16v); + u16 = addInvocationsExclusiveScanNonUniformAMD(u16); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shaderBallot.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.shaderBallot.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shaderBallot.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.shaderBallot.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,59 +1,59 @@ -#version 450 - -#extension GL_ARB_gpu_shader_int64: enable -#extension GL_ARB_shader_ballot: enable - -layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in; - -layout(binding = 0) buffer Buffers -{ - vec4 f4; - ivec4 i4; - uvec4 u4; -} data[4]; - -void main() -{ - uint invocation = (gl_SubGroupInvocationARB + gl_SubGroupSizeARB) % 4; - - uint64_t relMask = gl_SubGroupEqMaskARB + - gl_SubGroupGeMaskARB + - gl_SubGroupGtMaskARB + - gl_SubGroupLeMaskARB + - gl_SubGroupLtMaskARB; - - if (relMask == ballotARB(true)) - { - data[invocation].f4.x = readInvocationARB(data[0].f4.x, invocation); - data[invocation].f4.xy = readInvocationARB(data[1].f4.xy, invocation); - data[invocation].f4.xyz = readInvocationARB(data[2].f4.xyz, invocation); - data[invocation].f4 = readInvocationARB(data[3].f4, invocation); - - data[invocation].i4.x = readInvocationARB(data[0].i4.x, invocation); - data[invocation].i4.xy = readInvocationARB(data[1].i4.xy, invocation); - data[invocation].i4.xyz = readInvocationARB(data[2].i4.xyz, invocation); - data[invocation].i4 = readInvocationARB(data[3].i4, invocation); - - data[invocation].u4.x = readInvocationARB(data[0].u4.x, invocation); - data[invocation].u4.xy = readInvocationARB(data[1].u4.xy, invocation); - data[invocation].u4.xyz = readInvocationARB(data[2].u4.xyz, invocation); - data[invocation].u4 = readInvocationARB(data[3].u4, invocation); - } - else - { - data[invocation].f4.x = readFirstInvocationARB(data[0].f4.x); - data[invocation].f4.xy = readFirstInvocationARB(data[1].f4.xy); - data[invocation].f4.xyz = readFirstInvocationARB(data[2].f4.xyz); - data[invocation].f4 = readFirstInvocationARB(data[3].f4); - - data[invocation].i4.x = readFirstInvocationARB(data[0].i4.x); - data[invocation].i4.xy = readFirstInvocationARB(data[1].i4.xy); - data[invocation].i4.xyz = readFirstInvocationARB(data[2].i4.xyz); - data[invocation].i4 = readFirstInvocationARB(data[3].i4); - - data[invocation].u4.x = readFirstInvocationARB(data[0].u4.x); - data[invocation].u4.xy = readFirstInvocationARB(data[1].u4.xy); - data[invocation].u4.xyz = readFirstInvocationARB(data[2].u4.xyz); - data[invocation].u4 = readFirstInvocationARB(data[3].u4); - } +#version 450 + +#extension GL_ARB_gpu_shader_int64: enable +#extension GL_ARB_shader_ballot: enable + +layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in; + +layout(binding = 0) buffer Buffers +{ + vec4 f4; + ivec4 i4; + uvec4 u4; +} data[4]; + +void main() +{ + uint invocation = (gl_SubGroupInvocationARB + gl_SubGroupSizeARB) % 4; + + uint64_t relMask = gl_SubGroupEqMaskARB + + gl_SubGroupGeMaskARB + + gl_SubGroupGtMaskARB + + gl_SubGroupLeMaskARB + + gl_SubGroupLtMaskARB; + + if (relMask == ballotARB(true)) + { + data[invocation].f4.x = readInvocationARB(data[0].f4.x, invocation); + data[invocation].f4.xy = readInvocationARB(data[1].f4.xy, invocation); + data[invocation].f4.xyz = readInvocationARB(data[2].f4.xyz, invocation); + data[invocation].f4 = readInvocationARB(data[3].f4, invocation); + + data[invocation].i4.x = readInvocationARB(data[0].i4.x, invocation); + data[invocation].i4.xy = readInvocationARB(data[1].i4.xy, invocation); + data[invocation].i4.xyz = readInvocationARB(data[2].i4.xyz, invocation); + data[invocation].i4 = readInvocationARB(data[3].i4, invocation); + + data[invocation].u4.x = readInvocationARB(data[0].u4.x, invocation); + data[invocation].u4.xy = readInvocationARB(data[1].u4.xy, invocation); + data[invocation].u4.xyz = readInvocationARB(data[2].u4.xyz, invocation); + data[invocation].u4 = readInvocationARB(data[3].u4, invocation); + } + else + { + data[invocation].f4.x = readFirstInvocationARB(data[0].f4.x); + data[invocation].f4.xy = readFirstInvocationARB(data[1].f4.xy); + data[invocation].f4.xyz = readFirstInvocationARB(data[2].f4.xyz); + data[invocation].f4 = readFirstInvocationARB(data[3].f4); + + data[invocation].i4.x = readFirstInvocationARB(data[0].i4.x); + data[invocation].i4.xy = readFirstInvocationARB(data[1].i4.xy); + data[invocation].i4.xyz = readFirstInvocationARB(data[2].i4.xyz); + data[invocation].i4 = readFirstInvocationARB(data[3].i4); + + data[invocation].u4.x = readFirstInvocationARB(data[0].u4.x); + data[invocation].u4.xy = readFirstInvocationARB(data[1].u4.xy); + data[invocation].u4.xyz = readFirstInvocationARB(data[2].u4.xyz); + data[invocation].u4 = readFirstInvocationARB(data[3].u4); + } } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shaderDrawParams.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.shaderDrawParams.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shaderDrawParams.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.shaderDrawParams.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,16 @@ -#version 450 core - -#extension GL_ARB_shader_draw_parameters: enable - -layout(binding = 0) uniform Block -{ - vec4 pos[2][4]; -} block; - -void main() -{ - if ((gl_BaseVertexARB > 0) || (gl_BaseInstanceARB > 0)) - gl_Position = block.pos[0][gl_DrawIDARB % 4]; - else - gl_Position = block.pos[1][gl_DrawIDARB % 4]; -} +#version 450 core + +#extension GL_ARB_shader_draw_parameters: enable + +layout(binding = 0) uniform Block +{ + vec4 pos[2][4]; +} block; + +void main() +{ + if ((gl_BaseVertexARB > 0) || (gl_BaseInstanceARB > 0)) + gl_Position = block.pos[0][gl_DrawIDARB % 4]; + else + gl_Position = block.pos[1][gl_DrawIDARB % 4]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shaderFragMaskAMD.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.shaderFragMaskAMD.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shaderFragMaskAMD.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.shaderFragMaskAMD.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,29 +1,29 @@ -#version 450 core - -#extension GL_AMD_shader_fragment_mask: enable - -layout(binding = 0) uniform sampler2DMS s2DMS; -layout(binding = 1) uniform isampler2DMSArray is2DMSArray; - -layout(binding = 2, input_attachment_index = 0) uniform usubpassInputMS usubpassMS; - -layout(location = 0) out vec4 fragColor; - -void main() -{ - vec4 f4 = vec4(0.0); - - uint fragMask = fragmentMaskFetchAMD(s2DMS, ivec2(2, 3)); - uint fragIndex = (fragMask & 0xF0) >> 4; - f4 += fragmentFetchAMD(s2DMS, ivec2(2, 3), 1); - - fragMask = fragmentMaskFetchAMD(is2DMSArray, ivec3(2, 3, 1)); - fragIndex = (fragMask & 0xF0) >> 4; - f4 += fragmentFetchAMD(is2DMSArray, ivec3(2, 3, 1), fragIndex); - - fragMask = fragmentMaskFetchAMD(usubpassMS); - fragIndex = (fragMask & 0xF0) >> 4; - f4 += fragmentFetchAMD(usubpassMS, fragIndex); - - fragColor = f4; +#version 450 core + +#extension GL_AMD_shader_fragment_mask: enable + +layout(binding = 0) uniform sampler2DMS s2DMS; +layout(binding = 1) uniform isampler2DMSArray is2DMSArray; + +layout(binding = 2, input_attachment_index = 0) uniform usubpassInputMS usubpassMS; + +layout(location = 0) out vec4 fragColor; + +void main() +{ + vec4 f4 = vec4(0.0); + + uint fragMask = fragmentMaskFetchAMD(s2DMS, ivec2(2, 3)); + uint fragIndex = (fragMask & 0xF0) >> 4; + f4 += fragmentFetchAMD(s2DMS, ivec2(2, 3), 1); + + fragMask = fragmentMaskFetchAMD(is2DMSArray, ivec3(2, 3, 1)); + fragIndex = (fragMask & 0xF0) >> 4; + f4 += fragmentFetchAMD(is2DMSArray, ivec3(2, 3, 1), fragIndex); + + fragMask = fragmentMaskFetchAMD(usubpassMS); + fragIndex = (fragMask & 0xF0) >> 4; + f4 += fragmentFetchAMD(usubpassMS, fragIndex); + + fragColor = f4; } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shaderGroupVote.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.shaderGroupVote.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shaderGroupVote.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.shaderGroupVote.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,21 +1,21 @@ -#version 450 - -#extension GL_ARB_shader_group_vote : enable - -layout(local_size_x = 4, local_size_y = 4) in; - -layout(std430, binding = 0) buffer Buffers -{ - bool b; -}; - -void main() -{ - bool b1 = b; - - b1 = anyInvocationARB(b1); - b1 = allInvocationsARB(b1); - b1 = allInvocationsEqualARB(b1); - - b = b1; -} +#version 450 + +#extension GL_ARB_shader_group_vote : enable + +layout(local_size_x = 4, local_size_y = 4) in; + +layout(std430, binding = 0) buffer Buffers +{ + bool b; +}; + +void main() +{ + bool b1 = b; + + b1 = anyInvocationARB(b1); + b1 = allInvocationsARB(b1); + b1 = allInvocationsEqualARB(b1); + + b = b1; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shaderStencilExport.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.shaderStencilExport.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shaderStencilExport.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.shaderStencilExport.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,8 @@ -#version 450 core - -#extension GL_ARB_shader_stencil_export: enable - -void main() -{ - gl_FragStencilRefARB = 100; -} +#version 450 core + +#extension GL_ARB_shader_stencil_export: enable + +void main() +{ + gl_FragStencilRefARB = 100; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shiftOps.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.shiftOps.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shiftOps.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.shiftOps.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,18 +1,18 @@ -#version 450 - -flat in int i1; -flat in uint u1; -flat in ivec3 i3; -flat in uvec3 u3; - -out ivec3 icolor; -out uvec3 ucolor; - -void main() -{ - icolor = i3 << u1; - icolor <<= 4u; - - ucolor = u3 >> i1; - ucolor >>= 5; -} +#version 450 + +flat in int i1; +flat in uint u1; +flat in ivec3 i3; +flat in uvec3 u3; + +out ivec3 icolor; +out uvec3 ucolor; + +void main() +{ + icolor = i3 << u1; + icolor <<= 4u; + + ucolor = u3 >> i1; + ucolor >>= 5; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shortCircuit.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.shortCircuit.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.shortCircuit.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.shortCircuit.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,50 +1,50 @@ -#version 400 - -flat in ivec4 uiv4; -in vec4 uv4; -bool ub; -bool uba; -bvec4 ub41, ub42; -in float uf; -flat in int ui; - -out float of1; -out vec4 of4; - -bool foo() { ++of1; return of1 > 10.0; } - -void main() -{ - of1 = 0.0; - of4 = vec4(0.0); - - if (ub || ui > 2) // not worth short circuiting - ++of1; - - if (ub && !uba) // not worth short circuiting - ++of1; - - if (ub || foo()) // must short circuit - ++of1; - - if (ub && foo()) // must short circuit - ++of1; - - if (foo() || ub) // not worth short circuiting - ++of1; - - if (foo() && ub) // not worth short circuiting - ++of1; - - if (ub || ++of1 > 1.0) // must short circuit - ++of4; - - if (++of1 > 1.0 || ub) // not worth short circuiting - ++of4; - - if (ub || sin(uf) * 4.0 > of1) // worth short circuiting - ++of1; - - if (ub && sin(uf) * 4.0 > of1) // worth short circuiting - ++of1; -} +#version 400 + +flat in ivec4 uiv4; +in vec4 uv4; +bool ub; +bool uba; +bvec4 ub41, ub42; +in float uf; +flat in int ui; + +out float of1; +out vec4 of4; + +bool foo() { ++of1; return of1 > 10.0; } + +void main() +{ + of1 = 0.0; + of4 = vec4(0.0); + + if (ub || ui > 2) // not worth short circuiting + ++of1; + + if (ub && !uba) // not worth short circuiting + ++of1; + + if (ub || foo()) // must short circuit + ++of1; + + if (ub && foo()) // must short circuit + ++of1; + + if (foo() || ub) // not worth short circuiting + ++of1; + + if (foo() && ub) // not worth short circuiting + ++of1; + + if (ub || ++of1 > 1.0) // must short circuit + ++of4; + + if (++of1 > 1.0 || ub) // not worth short circuiting + ++of4; + + if (ub || sin(uf) * 4.0 > of1) // worth short circuiting + ++of1; + + if (ub && sin(uf) * 4.0 > of1) // worth short circuiting + ++of1; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.simpleFunctionCall.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.simpleFunctionCall.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.simpleFunctionCall.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.simpleFunctionCall.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,13 +1,13 @@ -#version 150 - -in vec4 BaseColor; - -vec4 foo() -{ - return BaseColor; -} - -void main() -{ - gl_FragColor = foo(); -} +#version 150 + +in vec4 BaseColor; + +vec4 foo() +{ + return BaseColor; +} + +void main() +{ + gl_FragColor = foo(); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.simpleMat.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.simpleMat.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.simpleMat.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.simpleMat.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,19 +1,19 @@ -#version 330 - -varying mat4 mvp; - -in vec4 v; -in mat3 am3; -in mat4 arraym[3]; - -out float f; -out vec4 glPos; -//out mat4 mout[2]; - -void main() -{ - //needs complex output blocks to work: gl_Position = mvp * v; - glPos = mvp * v; - f = am3[2][1] + arraym[1][2][3]; - //mout[1] = arraym[2]; -} +#version 330 + +varying mat4 mvp; + +in vec4 v; +in mat3 am3; +in mat4 arraym[3]; + +out float f; +out vec4 glPos; +//out mat4 mout[2]; + +void main() +{ + //needs complex output blocks to work: gl_Position = mvp * v; + glPos = mvp * v; + f = am3[2][1] + arraym[1][2][3]; + //mout[1] = arraym[2]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.sparseTextureClamp.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.sparseTextureClamp.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.sparseTextureClamp.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.sparseTextureClamp.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,70 +1,70 @@ -#version 450 -#extension GL_ARB_sparse_texture_clamp: enable - -uniform sampler2D s2D; -uniform sampler3D s3D; -uniform sampler2DShadow s2DShadow; -uniform samplerCubeShadow sCubeShadow; -uniform sampler2DArrayShadow s2DArrayShadow; -uniform sampler2DRectShadow s2DRectShadow; -uniform samplerCubeArrayShadow sCubeArrayShadow; - -uniform isamplerCube isCube; -uniform isampler2DArray is2DArray; - -uniform usamplerCubeArray usCubeArray; -uniform usampler2DRect us2DRect; - -in vec2 c2; -in vec3 c3; -in vec4 c4; - -in float lodClamp; - -out vec4 outColor; - -void main() -{ - int resident = 0; - vec4 texel = vec4(0.0); - ivec4 itexel = ivec4(0); - uvec4 utexel = uvec4(0); - - resident |= sparseTextureClampARB(s2D, c2, lodClamp, texel); - resident |= sparseTextureClampARB(s3D, c3, lodClamp, texel, 2.0); - resident |= sparseTextureClampARB(isCube, c3, lodClamp, itexel); - resident |= sparseTextureClampARB(s2DShadow, c3, lodClamp, texel.x); - resident |= sparseTextureClampARB(sCubeArrayShadow, c4, 1.0, lodClamp, texel.x); - - texel += textureClampARB(s2D, c2, lodClamp); - texel += textureClampARB(s3D, c3, lodClamp, 2.0); - itexel += textureClampARB(isCube, c3, lodClamp); - texel.x += textureClampARB(s2DShadow, c3, lodClamp); - texel.x += textureClampARB(sCubeArrayShadow, c4, 1.0, lodClamp); - - resident |= sparseTextureOffsetClampARB(s3D, c3, ivec3(2), lodClamp, texel, 2.0); - resident |= sparseTextureOffsetClampARB(us2DRect, c2, ivec2(3), lodClamp, utexel); - resident |= sparseTextureOffsetClampARB(s2DArrayShadow, c4, ivec2(5), lodClamp, texel.z); - - texel += textureOffsetClampARB(s3D, c3, ivec3(2), lodClamp, 2.0); - utexel += textureOffsetClampARB(us2DRect, c2, ivec2(3), lodClamp); - texel.z += textureOffsetClampARB(s2DArrayShadow, c4, ivec2(5), lodClamp); - - resident |= sparseTextureGradClampARB(s3D, c3, c3, c3, lodClamp, texel); - resident |= sparseTextureGradClampARB(sCubeShadow, c4, c3, c3, lodClamp, texel.y); - resident |= sparseTextureGradClampARB(usCubeArray, c4, c3, c3, lodClamp, utexel); - - texel += textureGradClampARB(s3D, c3, c3, c3, lodClamp); - texel.y += textureGradClampARB(sCubeShadow, c4, c3, c3, lodClamp); - utexel += textureGradClampARB(usCubeArray, c4, c3, c3, lodClamp); - - resident |= sparseTextureGradOffsetClampARB(s2D, c2, c2, c2, ivec2(5), lodClamp, texel); - resident |= sparseTextureGradOffsetClampARB(s2DRectShadow, c3, c2, c2, ivec2(6), lodClamp, texel.w); - resident |= sparseTextureGradOffsetClampARB(is2DArray, c3, c2, c2, ivec2(2), lodClamp, itexel); - - texel += textureGradOffsetClampARB(s2D, c2, c2, c2, ivec2(5), lodClamp); - texel.w += textureGradOffsetClampARB(s2DRectShadow, c3, c2, c2, ivec2(6), lodClamp); - itexel += textureGradOffsetClampARB(is2DArray, c3, c2, c2, ivec2(2), lodClamp); - - outColor = sparseTexelsResidentARB(resident) ? texel : vec4(itexel) + vec4(utexel); +#version 450 +#extension GL_ARB_sparse_texture_clamp: enable + +uniform sampler2D s2D; +uniform sampler3D s3D; +uniform sampler2DShadow s2DShadow; +uniform samplerCubeShadow sCubeShadow; +uniform sampler2DArrayShadow s2DArrayShadow; +uniform sampler2DRectShadow s2DRectShadow; +uniform samplerCubeArrayShadow sCubeArrayShadow; + +uniform isamplerCube isCube; +uniform isampler2DArray is2DArray; + +uniform usamplerCubeArray usCubeArray; +uniform usampler2DRect us2DRect; + +in vec2 c2; +in vec3 c3; +in vec4 c4; + +in float lodClamp; + +out vec4 outColor; + +void main() +{ + int resident = 0; + vec4 texel = vec4(0.0); + ivec4 itexel = ivec4(0); + uvec4 utexel = uvec4(0); + + resident |= sparseTextureClampARB(s2D, c2, lodClamp, texel); + resident |= sparseTextureClampARB(s3D, c3, lodClamp, texel, 2.0); + resident |= sparseTextureClampARB(isCube, c3, lodClamp, itexel); + resident |= sparseTextureClampARB(s2DShadow, c3, lodClamp, texel.x); + resident |= sparseTextureClampARB(sCubeArrayShadow, c4, 1.0, lodClamp, texel.x); + + texel += textureClampARB(s2D, c2, lodClamp); + texel += textureClampARB(s3D, c3, lodClamp, 2.0); + itexel += textureClampARB(isCube, c3, lodClamp); + texel.x += textureClampARB(s2DShadow, c3, lodClamp); + texel.x += textureClampARB(sCubeArrayShadow, c4, 1.0, lodClamp); + + resident |= sparseTextureOffsetClampARB(s3D, c3, ivec3(2), lodClamp, texel, 2.0); + resident |= sparseTextureOffsetClampARB(us2DRect, c2, ivec2(3), lodClamp, utexel); + resident |= sparseTextureOffsetClampARB(s2DArrayShadow, c4, ivec2(5), lodClamp, texel.z); + + texel += textureOffsetClampARB(s3D, c3, ivec3(2), lodClamp, 2.0); + utexel += textureOffsetClampARB(us2DRect, c2, ivec2(3), lodClamp); + texel.z += textureOffsetClampARB(s2DArrayShadow, c4, ivec2(5), lodClamp); + + resident |= sparseTextureGradClampARB(s3D, c3, c3, c3, lodClamp, texel); + resident |= sparseTextureGradClampARB(sCubeShadow, c4, c3, c3, lodClamp, texel.y); + resident |= sparseTextureGradClampARB(usCubeArray, c4, c3, c3, lodClamp, utexel); + + texel += textureGradClampARB(s3D, c3, c3, c3, lodClamp); + texel.y += textureGradClampARB(sCubeShadow, c4, c3, c3, lodClamp); + utexel += textureGradClampARB(usCubeArray, c4, c3, c3, lodClamp); + + resident |= sparseTextureGradOffsetClampARB(s2D, c2, c2, c2, ivec2(5), lodClamp, texel); + resident |= sparseTextureGradOffsetClampARB(s2DRectShadow, c3, c2, c2, ivec2(6), lodClamp, texel.w); + resident |= sparseTextureGradOffsetClampARB(is2DArray, c3, c2, c2, ivec2(2), lodClamp, itexel); + + texel += textureGradOffsetClampARB(s2D, c2, c2, c2, ivec2(5), lodClamp); + texel.w += textureGradOffsetClampARB(s2DRectShadow, c3, c2, c2, ivec2(6), lodClamp); + itexel += textureGradOffsetClampARB(is2DArray, c3, c2, c2, ivec2(2), lodClamp); + + outColor = sparseTexelsResidentARB(resident) ? texel : vec4(itexel) + vec4(utexel); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.sparseTexture.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.sparseTexture.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.sparseTexture.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.sparseTexture.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,91 +1,91 @@ -#version 450 -#extension GL_ARB_sparse_texture2: enable - -uniform sampler2D s2D; -uniform sampler3D s3D; -uniform sampler2DShadow s2DShadow; -uniform samplerCubeShadow sCubeShadow; -uniform sampler2DArrayShadow s2DArrayShadow; -uniform sampler2DRectShadow s2DRectShadow; -uniform samplerCubeArrayShadow sCubeArrayShadow; -uniform sampler2DMS s2DMS; - -uniform isamplerCube isCube; -uniform isampler2DArray is2DArray; - -uniform usamplerCubeArray usCubeArray; -uniform usampler2DRect us2DRect; - -layout(rgba32f) uniform image2D i2D; -layout(rgba32i) uniform iimage3D ii3D; -layout(rgba32f) uniform image2DMS i2DMS; - -in vec2 c2; -in vec3 c3; -in vec4 c4; - -in flat ivec2 ic2; -in flat ivec3 ic3; - -in flat ivec2 offsets[4]; - -out vec4 outColor; - -void main() -{ - int resident = 0; - vec4 texel = vec4(0.0); - ivec4 itexel = ivec4(0); - uvec4 utexel = uvec4(0); - - resident |= sparseTextureARB(s2D, c2, texel); - resident |= sparseTextureARB(s3D, c3, texel, 2.0); - resident |= sparseTextureARB(isCube, c3, itexel); - resident |= sparseTextureARB(s2DShadow, c3, texel.x); - resident |= sparseTextureARB(sCubeArrayShadow, c4, 1.0, texel.x); - - resident |= sparseTextureLodARB(s2D, c2, 2.0, texel); - resident |= sparseTextureLodARB(usCubeArray, c4, 1.0, utexel); - resident |= sparseTextureLodARB(s2DShadow, c3, 2.0, texel.y); - - resident |= sparseTextureOffsetARB(s3D, c3, ivec3(2), texel, 2.0); - resident |= sparseTextureOffsetARB(us2DRect, c2, ivec2(3), utexel); - resident |= sparseTextureOffsetARB(s2DArrayShadow, c4, ivec2(5), texel.z); - - resident |= sparseTexelFetchARB(s2D, ivec2(c2), 2, texel); - resident |= sparseTexelFetchARB(us2DRect, ivec2(c2), utexel); - resident |= sparseTexelFetchARB(s2DMS, ivec2(c2), 4, texel); - - resident |= sparseTexelFetchOffsetARB(s3D, ivec3(c3), 2, ivec3(4), texel); - resident |= sparseTexelFetchOffsetARB(us2DRect, ivec2(c2), ivec2(3), utexel); - - resident |= sparseTextureLodOffsetARB(s2D, c2, 2.0, ivec2(5), texel); - resident |= sparseTextureLodOffsetARB(is2DArray, c3, 2.0, ivec2(6), itexel); - resident |= sparseTextureLodOffsetARB(s2DShadow, c3, 2.0, ivec2(7), texel.z); - - resident |= sparseTextureGradARB(s3D, c3, c3, c3, texel); - resident |= sparseTextureGradARB(sCubeShadow, c4, c3, c3, texel.y); - resident |= sparseTextureGradARB(usCubeArray, c4, c3, c3, utexel); - - resident |= sparseTextureGradOffsetARB(s2D, c2, c2, c2, ivec2(5), texel); - resident |= sparseTextureGradOffsetARB(s2DRectShadow, c3, c2, c2, ivec2(6), texel.w); - resident |= sparseTextureGradOffsetARB(is2DArray, c3, c2, c2, ivec2(2), itexel); - - resident |= sparseTextureGatherARB(s2D, c2, texel); - resident |= sparseTextureGatherARB(is2DArray, c3, itexel, 2); - resident |= sparseTextureGatherARB(s2DArrayShadow, c3, 2.0, texel); - - resident |= sparseTextureGatherOffsetARB(s2D, c2, ivec2(4), texel); - resident |= sparseTextureGatherOffsetARB(is2DArray, c3, ivec2(5), itexel, 2); - resident |= sparseTextureGatherOffsetARB(s2DRectShadow, c2, 2.0, ivec2(7), texel); - - resident |= sparseTextureGatherOffsetsARB(s2D, c2, offsets, texel); - resident |= sparseTextureGatherOffsetsARB(is2DArray, c3, offsets, itexel, 2); - resident |= sparseTextureGatherOffsetsARB(s2DRectShadow, c2, 2.0, offsets, texel); - - resident |= sparseImageLoadARB(i2D, ic2, texel); - resident |= sparseImageLoadARB(ii3D, ic3, itexel); - resident |= sparseImageLoadARB(i2DMS, ic2, 3, texel); - - outColor = sparseTexelsResidentARB(resident) ? texel : vec4(itexel) + vec4(utexel); +#version 450 +#extension GL_ARB_sparse_texture2: enable + +uniform sampler2D s2D; +uniform sampler3D s3D; +uniform sampler2DShadow s2DShadow; +uniform samplerCubeShadow sCubeShadow; +uniform sampler2DArrayShadow s2DArrayShadow; +uniform sampler2DRectShadow s2DRectShadow; +uniform samplerCubeArrayShadow sCubeArrayShadow; +uniform sampler2DMS s2DMS; + +uniform isamplerCube isCube; +uniform isampler2DArray is2DArray; + +uniform usamplerCubeArray usCubeArray; +uniform usampler2DRect us2DRect; + +layout(rgba32f) uniform image2D i2D; +layout(rgba32i) uniform iimage3D ii3D; +layout(rgba32f) uniform image2DMS i2DMS; + +in vec2 c2; +in vec3 c3; +in vec4 c4; + +in flat ivec2 ic2; +in flat ivec3 ic3; + +in flat ivec2 offsets[4]; + +out vec4 outColor; + +void main() +{ + int resident = 0; + vec4 texel = vec4(0.0); + ivec4 itexel = ivec4(0); + uvec4 utexel = uvec4(0); + + resident |= sparseTextureARB(s2D, c2, texel); + resident |= sparseTextureARB(s3D, c3, texel, 2.0); + resident |= sparseTextureARB(isCube, c3, itexel); + resident |= sparseTextureARB(s2DShadow, c3, texel.x); + resident |= sparseTextureARB(sCubeArrayShadow, c4, 1.0, texel.x); + + resident |= sparseTextureLodARB(s2D, c2, 2.0, texel); + resident |= sparseTextureLodARB(usCubeArray, c4, 1.0, utexel); + resident |= sparseTextureLodARB(s2DShadow, c3, 2.0, texel.y); + + resident |= sparseTextureOffsetARB(s3D, c3, ivec3(2), texel, 2.0); + resident |= sparseTextureOffsetARB(us2DRect, c2, ivec2(3), utexel); + resident |= sparseTextureOffsetARB(s2DArrayShadow, c4, ivec2(5), texel.z); + + resident |= sparseTexelFetchARB(s2D, ivec2(c2), 2, texel); + resident |= sparseTexelFetchARB(us2DRect, ivec2(c2), utexel); + resident |= sparseTexelFetchARB(s2DMS, ivec2(c2), 4, texel); + + resident |= sparseTexelFetchOffsetARB(s3D, ivec3(c3), 2, ivec3(4), texel); + resident |= sparseTexelFetchOffsetARB(us2DRect, ivec2(c2), ivec2(3), utexel); + + resident |= sparseTextureLodOffsetARB(s2D, c2, 2.0, ivec2(5), texel); + resident |= sparseTextureLodOffsetARB(is2DArray, c3, 2.0, ivec2(6), itexel); + resident |= sparseTextureLodOffsetARB(s2DShadow, c3, 2.0, ivec2(7), texel.z); + + resident |= sparseTextureGradARB(s3D, c3, c3, c3, texel); + resident |= sparseTextureGradARB(sCubeShadow, c4, c3, c3, texel.y); + resident |= sparseTextureGradARB(usCubeArray, c4, c3, c3, utexel); + + resident |= sparseTextureGradOffsetARB(s2D, c2, c2, c2, ivec2(5), texel); + resident |= sparseTextureGradOffsetARB(s2DRectShadow, c3, c2, c2, ivec2(6), texel.w); + resident |= sparseTextureGradOffsetARB(is2DArray, c3, c2, c2, ivec2(2), itexel); + + resident |= sparseTextureGatherARB(s2D, c2, texel); + resident |= sparseTextureGatherARB(is2DArray, c3, itexel, 2); + resident |= sparseTextureGatherARB(s2DArrayShadow, c3, 2.0, texel); + + resident |= sparseTextureGatherOffsetARB(s2D, c2, ivec2(4), texel); + resident |= sparseTextureGatherOffsetARB(is2DArray, c3, ivec2(5), itexel, 2); + resident |= sparseTextureGatherOffsetARB(s2DRectShadow, c2, 2.0, ivec2(7), texel); + + resident |= sparseTextureGatherOffsetsARB(s2D, c2, offsets, texel); + resident |= sparseTextureGatherOffsetsARB(is2DArray, c3, offsets, itexel, 2); + resident |= sparseTextureGatherOffsetsARB(s2DRectShadow, c2, 2.0, offsets, texel); + + resident |= sparseImageLoadARB(i2D, ic2, texel); + resident |= sparseImageLoadARB(ii3D, ic3, itexel); + resident |= sparseImageLoadARB(i2DMS, ic2, 3, texel); + + outColor = sparseTexelsResidentARB(resident) ? texel : vec4(itexel) + vec4(utexel); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.specConstant.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.specConstant.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.specConstant.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.specConstant.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,13 +1,13 @@ -#version 450 - -layout(local_size_x_id = 18, local_size_z_id = 19) in; -layout(local_size_x = 32, local_size_y = 32) in; - -buffer bn { - uint a; -} bi; - -void main() -{ - bi.a = gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z; -} +#version 450 + +layout(local_size_x_id = 18, local_size_z_id = 19) in; +layout(local_size_x = 32, local_size_y = 32) in; + +buffer bn { + uint a; +} bi; + +void main() +{ + bi.a = gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.specConstantOperations.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.specConstantOperations.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.specConstantOperations.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.specConstantOperations.vert 2018-04-27 11:46:26.000000000 +0000 @@ -111,13 +111,13 @@ } // ternary -layout(constant_id = 210) const int a = 4; -layout(constant_id = 211) const int b = 6; -layout(constant_id = 212) const bool c = true; -int ternayArray1[a > b ? a : b]; -const int t1 = c ? 13 : 17; -const int t2 = c ? a : 17; -const int t3 = true ? a : 17; +layout(constant_id = 210) const int a = 4; +layout(constant_id = 211) const int b = 6; +layout(constant_id = 212) const bool c = true; +int ternayArray1[a > b ? a : b]; +const int t1 = c ? 13 : 17; +const int t2 = c ? a : 17; +const int t3 = true ? a : 17; const int t4 = a > b ? 13 + a : 17 * b; const vec2 v2 = !c ? vec2(1.0) : vec2(2.0); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.specConstant.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.specConstant.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.specConstant.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.specConstant.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,51 +1,51 @@ -#version 400 - -layout(constant_id = 16) const int arraySize = 5; -in vec4 ucol[arraySize]; - -layout(constant_id = 17) const bool spBool = true; -layout(constant_id = 18) const float spFloat = 3.14; -layout(constant_id = 19) const double spDouble = 3.1415926535897932384626433832795; -layout(constant_id = 22) const uint scale = 2; - -layout(constant_id = 24) gl_MaxImageUnits; - -out vec4 color; -out int size; - -// parameter should be considered same type as ucol -void foo(vec4 p[arraySize]); - -void main() -{ - color = ucol[2]; - size = arraySize; - if (spBool) - color *= scale; - color += float(spDouble / spFloat); - - foo(ucol); -} - -layout(constant_id = 116) const int dupArraySize = 12; -in vec4 dupUcol[dupArraySize]; - -layout(constant_id = 117) const bool spDupBool = true; -layout(constant_id = 118) const float spDupFloat = 3.14; -layout(constant_id = 119) const double spDupDouble = 3.1415926535897932384626433832795; -layout(constant_id = 122) const uint dupScale = 2; - -void foo(vec4 p[arraySize]) -{ - color += dupUcol[2]; - size += dupArraySize; - if (spDupBool) - color *= dupScale; - color += float(spDupDouble / spDupFloat); -} - -int builtin_spec_constant() -{ - int result = gl_MaxImageUnits; - return result; -} +#version 400 + +layout(constant_id = 16) const int arraySize = 5; +in vec4 ucol[arraySize]; + +layout(constant_id = 17) const bool spBool = true; +layout(constant_id = 18) const float spFloat = 3.14; +layout(constant_id = 19) const double spDouble = 3.1415926535897932384626433832795; +layout(constant_id = 22) const uint scale = 2; + +layout(constant_id = 24) gl_MaxImageUnits; + +out vec4 color; +out int size; + +// parameter should be considered same type as ucol +void foo(vec4 p[arraySize]); + +void main() +{ + color = ucol[2]; + size = arraySize; + if (spBool) + color *= scale; + color += float(spDouble / spFloat); + + foo(ucol); +} + +layout(constant_id = 116) const int dupArraySize = 12; +in vec4 dupUcol[dupArraySize]; + +layout(constant_id = 117) const bool spDupBool = true; +layout(constant_id = 118) const float spDupFloat = 3.14; +layout(constant_id = 119) const double spDupDouble = 3.1415926535897932384626433832795; +layout(constant_id = 122) const uint dupScale = 2; + +void foo(vec4 p[arraySize]) +{ + color += dupUcol[2]; + size += dupArraySize; + if (spDupBool) + color *= dupScale; + color += float(spDupDouble / spDupFloat); +} + +int builtin_spec_constant() +{ + int result = gl_MaxImageUnits; + return result; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.specConst.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.specConst.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.specConst.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.specConst.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,8 +1,8 @@ -#version 450 - -layout(constant_id = 11) const int a = 8; - -void main() -{ - gl_Position = vec4(1.0) / a; -} +#version 450 + +layout(constant_id = 11) const int a = 8; + +void main() +{ + gl_Position = vec4(1.0) / a; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.stereoViewRendering.tesc vulkan-1.1.73+dfsg/external/glslang/Test/spv.stereoViewRendering.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.stereoViewRendering.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.stereoViewRendering.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,19 +1,19 @@ -#version 450 - -#extension GL_NV_viewport_array2 :require -#extension GL_NV_stereo_view_rendering : require - -layout(vertices = 4) out; - -out gl_PerVertex { - int gl_SecondaryViewportMaskNV[2]; - vec4 gl_SecondaryPositionNV; -} gl_out[4]; - -layout (viewport_relative, secondary_view_offset = 1) out highp int gl_Layer; - -void main() -{ - gl_out[gl_InvocationID].gl_SecondaryViewportMaskNV[0] = 1; - gl_out[gl_InvocationID].gl_SecondaryPositionNV = gl_in[1].gl_Position; -} +#version 450 + +#extension GL_NV_viewport_array2 :require +#extension GL_NV_stereo_view_rendering : require + +layout(vertices = 4) out; + +out gl_PerVertex { + int gl_SecondaryViewportMaskNV[2]; + vec4 gl_SecondaryPositionNV; +} gl_out[4]; + +layout (viewport_relative, secondary_view_offset = 1) out highp int gl_Layer; + +void main() +{ + gl_out[gl_InvocationID].gl_SecondaryViewportMaskNV[0] = 1; + gl_out[gl_InvocationID].gl_SecondaryPositionNV = gl_in[1].gl_Position; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.stereoViewRendering.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.stereoViewRendering.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.stereoViewRendering.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.stereoViewRendering.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,12 @@ -#version 450 - -#extension GL_NV_viewport_array2 :require -#extension GL_NV_stereo_view_rendering : require - -layout (viewport_relative, secondary_view_offset = 2) out highp int gl_Layer; -void main() -{ - gl_SecondaryViewportMaskNV[0] = 1; - gl_SecondaryPositionNV = gl_Position; -} - +#version 450 + +#extension GL_NV_viewport_array2 :require +#extension GL_NV_stereo_view_rendering : require + +layout (viewport_relative, secondary_view_offset = 2) out highp int gl_Layer; +void main() +{ + gl_SecondaryViewportMaskNV[0] = 1; + gl_SecondaryPositionNV = gl_Position; +} + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.storageBuffer.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.storageBuffer.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.storageBuffer.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.storageBuffer.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,16 @@ -#version 450 - -#pragma use_storage_buffer - -uniform ub { - vec4 a; -} ubi; - -buffer bb { - vec4 b; -} bbi; - -void main() -{ - gl_Position = ubi.a + bbi.b; -} +#version 450 + +#pragma use_storage_buffer + +uniform ub { + vec4 a; +} ubi; + +buffer bb { + vec4 b; +} bbi; + +void main() +{ + gl_Position = ubi.a + bbi.b; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.structAssignment.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.structAssignment.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.structAssignment.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.structAssignment.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,41 +1,41 @@ -#version 140 - -precision mediump int; - -uniform sampler2D samp2D; -in mediump vec2 coord; - -struct lunarStruct1 { - int i; - float f; -}; - -struct lunarStruct2 { - int i; - float f; - lunarStruct1 s1_1; -}; - -struct lunarStruct3 { - lunarStruct2 s2_1; - int i; - float f; - lunarStruct1 s1_1; -}; - - -lunarStruct1 foo; -lunarStruct2 foo2; -lunarStruct3 foo3; - -void main() -{ - lunarStruct2 locals2; - - if (foo3.s2_1.i > 0) - locals2 = foo3.s2_1; - else - locals2 = foo2; - - gl_FragColor = locals2.s1_1.f * texture(samp2D, coord); -} +#version 140 + +precision mediump int; + +uniform sampler2D samp2D; +in mediump vec2 coord; + +struct lunarStruct1 { + int i; + float f; +}; + +struct lunarStruct2 { + int i; + float f; + lunarStruct1 s1_1; +}; + +struct lunarStruct3 { + lunarStruct2 s2_1; + int i; + float f; + lunarStruct1 s1_1; +}; + + +lunarStruct1 foo; +lunarStruct2 foo2; +lunarStruct3 foo3; + +void main() +{ + lunarStruct2 locals2; + + if (foo3.s2_1.i > 0) + locals2 = foo3.s2_1; + else + locals2 = foo2; + + gl_FragColor = locals2.s1_1.f * texture(samp2D, coord); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.structDeref.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.structDeref.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.structDeref.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.structDeref.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,71 +1,71 @@ -#version 140 - -uniform sampler2D samp2D; -in vec2 coord; - -struct s0 { - int i; -}; - -struct s00 { - s0 s0_0; -}; - -struct s1 { - int i; - float f; - s0 s0_1; -}; - -struct s2 { - int i; - float f; - s1 s1_1; -}; - -struct s3 { - s2[12] s2_1; - int i; - float f; - s1 s1_1; -}; - - -s0 foo0; -s1 foo1; -s2 foo2; -s3 foo3; - -s00 foo00; - -void main() -{ - s0 locals0; - s2 locals2; - s00 locals00; - - float[6] fArray; - - s1[10] locals1Array; - - if (foo3.s2_1[9].i > 0) { - locals2.f = 1.0; - locals2.s1_1 = s1(0, 1.0, s0(0)); - fArray = float[6]( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); - locals1Array[6] = foo1; - locals0 = s0(0); - locals00 = s00(s0(0)); - } else { - locals2.f = coord.x; - locals2.s1_1 = s1(1, coord.y, foo0); - fArray = float[6]( 0.0, 1.0, 2.0, 3.0, 4.0, 5.0); - locals1Array[6] = locals2.s1_1; - locals0 = foo1.s0_1; - locals00 = foo00; - } - - if (locals0.i > 5) - locals0 = locals00.s0_0; - - gl_FragColor = (float(locals0.i) + locals1Array[6].f + fArray[3] + locals2.s1_1.f) * texture(samp2D, coord); -} +#version 140 + +uniform sampler2D samp2D; +in vec2 coord; + +struct s0 { + int i; +}; + +struct s00 { + s0 s0_0; +}; + +struct s1 { + int i; + float f; + s0 s0_1; +}; + +struct s2 { + int i; + float f; + s1 s1_1; +}; + +struct s3 { + s2[12] s2_1; + int i; + float f; + s1 s1_1; +}; + + +s0 foo0; +s1 foo1; +s2 foo2; +s3 foo3; + +s00 foo00; + +void main() +{ + s0 locals0; + s2 locals2; + s00 locals00; + + float[6] fArray; + + s1[10] locals1Array; + + if (foo3.s2_1[9].i > 0) { + locals2.f = 1.0; + locals2.s1_1 = s1(0, 1.0, s0(0)); + fArray = float[6]( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); + locals1Array[6] = foo1; + locals0 = s0(0); + locals00 = s00(s0(0)); + } else { + locals2.f = coord.x; + locals2.s1_1 = s1(1, coord.y, foo0); + fArray = float[6]( 0.0, 1.0, 2.0, 3.0, 4.0, 5.0); + locals1Array[6] = locals2.s1_1; + locals0 = foo1.s0_1; + locals00 = foo00; + } + + if (locals0.i > 5) + locals0 = locals00.s0_0; + + gl_FragColor = (float(locals0.i) + locals1Array[6].f + fArray[3] + locals2.s1_1.f) * texture(samp2D, coord); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.structure.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.structure.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.structure.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.structure.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,31 +1,31 @@ -#version 140 -uniform sampler2D samp2D; -in vec2 coord; - -struct lunarStruct1 { - int i; - float f[4]; - vec4 color[5]; -}; - -struct lunarStruct2 { - int i[5]; - float f; - lunarStruct1 s1_1[7]; -}; - -lunarStruct1 foo; -lunarStruct2 foo2[5]; - -void main() -{ - float scale = 0.0; - - if (foo2[3].i[4] > 0) - scale = foo2[3].s1_1[2].color[3].x; - else - scale = foo2[3].s1_1[2].f[3]; - - gl_FragColor = scale * texture(samp2D, coord); -} - +#version 140 +uniform sampler2D samp2D; +in vec2 coord; + +struct lunarStruct1 { + int i; + float f[4]; + vec4 color[5]; +}; + +struct lunarStruct2 { + int i[5]; + float f; + lunarStruct1 s1_1[7]; +}; + +lunarStruct1 foo; +lunarStruct2 foo2[5]; + +void main() +{ + float scale = 0.0; + + if (foo2[3].i[4] > 0) + scale = foo2[3].s1_1[2].color[3].x; + else + scale = foo2[3].s1_1[2].f[3]; + + gl_FragColor = scale * texture(samp2D, coord); +} + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupArithmetic.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupArithmetic.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupArithmetic.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupArithmetic.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,393 @@ +#version 450 + +#extension GL_KHR_shader_subgroup_arithmetic: enable + +layout (local_size_x = 8) in; + +layout(binding = 0) buffer Buffers +{ + vec4 f4; + ivec4 i4; + uvec4 u4; + dvec4 d4; +} data[4]; + +void main() +{ + uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4; + + data[invocation].f4.x = subgroupAdd(data[0].f4.x); + data[invocation].f4.xy = subgroupAdd(data[1].f4.xy); + data[invocation].f4.xyz = subgroupAdd(data[2].f4.xyz); + data[invocation].f4 = subgroupAdd(data[3].f4); + + data[invocation].i4.x = subgroupAdd(data[0].i4.x); + data[invocation].i4.xy = subgroupAdd(data[1].i4.xy); + data[invocation].i4.xyz = subgroupAdd(data[2].i4.xyz); + data[invocation].i4 = subgroupAdd(data[3].i4); + + data[invocation].u4.x = subgroupAdd(data[0].u4.x); + data[invocation].u4.xy = subgroupAdd(data[1].u4.xy); + data[invocation].u4.xyz = subgroupAdd(data[2].u4.xyz); + data[invocation].u4 = subgroupAdd(data[3].u4); + + data[invocation].d4.x = subgroupAdd(data[0].d4.x); + data[invocation].d4.xy = subgroupAdd(data[1].d4.xy); + data[invocation].d4.xyz = subgroupAdd(data[2].d4.xyz); + data[invocation].d4 = subgroupAdd(data[3].d4); + + data[invocation].f4.x = subgroupMul(data[0].f4.x); + data[invocation].f4.xy = subgroupMul(data[1].f4.xy); + data[invocation].f4.xyz = subgroupMul(data[2].f4.xyz); + data[invocation].f4 = subgroupMul(data[3].f4); + + data[invocation].i4.x = subgroupMul(data[0].i4.x); + data[invocation].i4.xy = subgroupMul(data[1].i4.xy); + data[invocation].i4.xyz = subgroupMul(data[2].i4.xyz); + data[invocation].i4 = subgroupMul(data[3].i4); + + data[invocation].u4.x = subgroupMul(data[0].u4.x); + data[invocation].u4.xy = subgroupMul(data[1].u4.xy); + data[invocation].u4.xyz = subgroupMul(data[2].u4.xyz); + data[invocation].u4 = subgroupMul(data[3].u4); + + data[invocation].d4.x = subgroupMul(data[0].d4.x); + data[invocation].d4.xy = subgroupMul(data[1].d4.xy); + data[invocation].d4.xyz = subgroupMul(data[2].d4.xyz); + data[invocation].d4 = subgroupMul(data[3].d4); + + data[invocation].f4.x = subgroupMin(data[0].f4.x); + data[invocation].f4.xy = subgroupMin(data[1].f4.xy); + data[invocation].f4.xyz = subgroupMin(data[2].f4.xyz); + data[invocation].f4 = subgroupMin(data[3].f4); + + data[invocation].i4.x = subgroupMin(data[0].i4.x); + data[invocation].i4.xy = subgroupMin(data[1].i4.xy); + data[invocation].i4.xyz = subgroupMin(data[2].i4.xyz); + data[invocation].i4 = subgroupMin(data[3].i4); + + data[invocation].u4.x = subgroupMin(data[0].u4.x); + data[invocation].u4.xy = subgroupMin(data[1].u4.xy); + data[invocation].u4.xyz = subgroupMin(data[2].u4.xyz); + data[invocation].u4 = subgroupMin(data[3].u4); + + data[invocation].d4.x = subgroupMin(data[0].d4.x); + data[invocation].d4.xy = subgroupMin(data[1].d4.xy); + data[invocation].d4.xyz = subgroupMin(data[2].d4.xyz); + data[invocation].d4 = subgroupMin(data[3].d4); + + data[invocation].f4.x = subgroupMax(data[0].f4.x); + data[invocation].f4.xy = subgroupMax(data[1].f4.xy); + data[invocation].f4.xyz = subgroupMax(data[2].f4.xyz); + data[invocation].f4 = subgroupMax(data[3].f4); + + data[invocation].i4.x = subgroupMax(data[0].i4.x); + data[invocation].i4.xy = subgroupMax(data[1].i4.xy); + data[invocation].i4.xyz = subgroupMax(data[2].i4.xyz); + data[invocation].i4 = subgroupMax(data[3].i4); + + data[invocation].u4.x = subgroupMax(data[0].u4.x); + data[invocation].u4.xy = subgroupMax(data[1].u4.xy); + data[invocation].u4.xyz = subgroupMax(data[2].u4.xyz); + data[invocation].u4 = subgroupMax(data[3].u4); + + data[invocation].d4.x = subgroupMax(data[0].d4.x); + data[invocation].d4.xy = subgroupMax(data[1].d4.xy); + data[invocation].d4.xyz = subgroupMax(data[2].d4.xyz); + data[invocation].d4 = subgroupMax(data[3].d4); + + data[invocation].i4.x = subgroupAnd(data[0].i4.x); + data[invocation].i4.xy = subgroupAnd(data[1].i4.xy); + data[invocation].i4.xyz = subgroupAnd(data[2].i4.xyz); + data[invocation].i4 = subgroupAnd(data[3].i4); + + data[invocation].u4.x = subgroupAnd(data[0].u4.x); + data[invocation].u4.xy = subgroupAnd(data[1].u4.xy); + data[invocation].u4.xyz = subgroupAnd(data[2].u4.xyz); + data[invocation].u4 = subgroupAnd(data[3].u4); + + data[invocation].i4.x = int(subgroupAnd(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupAnd(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupAnd(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupAnd(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].i4.x = subgroupOr(data[0].i4.x); + data[invocation].i4.xy = subgroupOr(data[1].i4.xy); + data[invocation].i4.xyz = subgroupOr(data[2].i4.xyz); + data[invocation].i4 = subgroupOr(data[3].i4); + + data[invocation].u4.x = subgroupOr(data[0].u4.x); + data[invocation].u4.xy = subgroupOr(data[1].u4.xy); + data[invocation].u4.xyz = subgroupOr(data[2].u4.xyz); + data[invocation].u4 = subgroupOr(data[3].u4); + + data[invocation].i4.x = int(subgroupOr(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupOr(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupOr(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupOr(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].i4.x = subgroupXor(data[0].i4.x); + data[invocation].i4.xy = subgroupXor(data[1].i4.xy); + data[invocation].i4.xyz = subgroupXor(data[2].i4.xyz); + data[invocation].i4 = subgroupXor(data[3].i4); + + data[invocation].u4.x = subgroupXor(data[0].u4.x); + data[invocation].u4.xy = subgroupXor(data[1].u4.xy); + data[invocation].u4.xyz = subgroupXor(data[2].u4.xyz); + data[invocation].u4 = subgroupXor(data[3].u4); + + data[invocation].i4.x = int(subgroupXor(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupXor(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupXor(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupXor(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].f4.x = subgroupInclusiveAdd(data[0].f4.x); + data[invocation].f4.xy = subgroupInclusiveAdd(data[1].f4.xy); + data[invocation].f4.xyz = subgroupInclusiveAdd(data[2].f4.xyz); + data[invocation].f4 = subgroupInclusiveAdd(data[3].f4); + + data[invocation].i4.x = subgroupInclusiveAdd(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveAdd(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveAdd(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveAdd(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveAdd(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveAdd(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveAdd(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveAdd(data[3].u4); + + data[invocation].d4.x = subgroupInclusiveAdd(data[0].d4.x); + data[invocation].d4.xy = subgroupInclusiveAdd(data[1].d4.xy); + data[invocation].d4.xyz = subgroupInclusiveAdd(data[2].d4.xyz); + data[invocation].d4 = subgroupInclusiveAdd(data[3].d4); + + data[invocation].f4.x = subgroupInclusiveMul(data[0].f4.x); + data[invocation].f4.xy = subgroupInclusiveMul(data[1].f4.xy); + data[invocation].f4.xyz = subgroupInclusiveMul(data[2].f4.xyz); + data[invocation].f4 = subgroupInclusiveMul(data[3].f4); + + data[invocation].i4.x = subgroupInclusiveMul(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveMul(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveMul(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveMul(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveMul(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveMul(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveMul(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveMul(data[3].u4); + + data[invocation].d4.x = subgroupInclusiveMul(data[0].d4.x); + data[invocation].d4.xy = subgroupInclusiveMul(data[1].d4.xy); + data[invocation].d4.xyz = subgroupInclusiveMul(data[2].d4.xyz); + data[invocation].d4 = subgroupInclusiveMul(data[3].d4); + + data[invocation].f4.x = subgroupInclusiveMin(data[0].f4.x); + data[invocation].f4.xy = subgroupInclusiveMin(data[1].f4.xy); + data[invocation].f4.xyz = subgroupInclusiveMin(data[2].f4.xyz); + data[invocation].f4 = subgroupInclusiveMin(data[3].f4); + + data[invocation].i4.x = subgroupInclusiveMin(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveMin(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveMin(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveMin(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveMin(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveMin(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveMin(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveMin(data[3].u4); + + data[invocation].d4.x = subgroupInclusiveMin(data[0].d4.x); + data[invocation].d4.xy = subgroupInclusiveMin(data[1].d4.xy); + data[invocation].d4.xyz = subgroupInclusiveMin(data[2].d4.xyz); + data[invocation].d4 = subgroupInclusiveMin(data[3].d4); + + data[invocation].f4.x = subgroupInclusiveMax(data[0].f4.x); + data[invocation].f4.xy = subgroupInclusiveMax(data[1].f4.xy); + data[invocation].f4.xyz = subgroupInclusiveMax(data[2].f4.xyz); + data[invocation].f4 = subgroupInclusiveMax(data[3].f4); + + data[invocation].i4.x = subgroupInclusiveMax(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveMax(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveMax(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveMax(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveMax(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveMax(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveMax(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveMax(data[3].u4); + + data[invocation].d4.x = subgroupInclusiveMax(data[0].d4.x); + data[invocation].d4.xy = subgroupInclusiveMax(data[1].d4.xy); + data[invocation].d4.xyz = subgroupInclusiveMax(data[2].d4.xyz); + data[invocation].d4 = subgroupInclusiveMax(data[3].d4); + + data[invocation].i4.x = subgroupInclusiveAnd(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveAnd(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveAnd(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveAnd(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveAnd(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveAnd(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveAnd(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveAnd(data[3].u4); + + data[invocation].i4.x = int(subgroupInclusiveAnd(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupInclusiveAnd(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupInclusiveAnd(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupInclusiveAnd(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].i4.x = subgroupInclusiveOr(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveOr(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveOr(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveOr(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveOr(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveOr(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveOr(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveOr(data[3].u4); + + data[invocation].i4.x = int(subgroupInclusiveOr(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupInclusiveOr(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupInclusiveOr(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupInclusiveOr(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].i4.x = subgroupInclusiveXor(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveXor(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveXor(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveXor(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveXor(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveXor(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveXor(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveXor(data[3].u4); + + data[invocation].i4.x = int(subgroupInclusiveXor(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupInclusiveXor(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupInclusiveXor(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupInclusiveXor(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].f4.x = subgroupExclusiveAdd(data[0].f4.x); + data[invocation].f4.xy = subgroupExclusiveAdd(data[1].f4.xy); + data[invocation].f4.xyz = subgroupExclusiveAdd(data[2].f4.xyz); + data[invocation].f4 = subgroupExclusiveAdd(data[3].f4); + + data[invocation].i4.x = subgroupExclusiveAdd(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveAdd(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveAdd(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveAdd(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveAdd(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveAdd(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveAdd(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveAdd(data[3].u4); + + data[invocation].d4.x = subgroupExclusiveAdd(data[0].d4.x); + data[invocation].d4.xy = subgroupExclusiveAdd(data[1].d4.xy); + data[invocation].d4.xyz = subgroupExclusiveAdd(data[2].d4.xyz); + data[invocation].d4 = subgroupExclusiveAdd(data[3].d4); + + data[invocation].f4.x = subgroupExclusiveMul(data[0].f4.x); + data[invocation].f4.xy = subgroupExclusiveMul(data[1].f4.xy); + data[invocation].f4.xyz = subgroupExclusiveMul(data[2].f4.xyz); + data[invocation].f4 = subgroupExclusiveMul(data[3].f4); + + data[invocation].i4.x = subgroupExclusiveMul(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveMul(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveMul(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveMul(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveMul(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveMul(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveMul(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveMul(data[3].u4); + + data[invocation].d4.x = subgroupExclusiveMul(data[0].d4.x); + data[invocation].d4.xy = subgroupExclusiveMul(data[1].d4.xy); + data[invocation].d4.xyz = subgroupExclusiveMul(data[2].d4.xyz); + data[invocation].d4 = subgroupExclusiveMul(data[3].d4); + + data[invocation].f4.x = subgroupExclusiveMin(data[0].f4.x); + data[invocation].f4.xy = subgroupExclusiveMin(data[1].f4.xy); + data[invocation].f4.xyz = subgroupExclusiveMin(data[2].f4.xyz); + data[invocation].f4 = subgroupExclusiveMin(data[3].f4); + + data[invocation].i4.x = subgroupExclusiveMin(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveMin(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveMin(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveMin(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveMin(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveMin(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveMin(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveMin(data[3].u4); + + data[invocation].d4.x = subgroupExclusiveMin(data[0].d4.x); + data[invocation].d4.xy = subgroupExclusiveMin(data[1].d4.xy); + data[invocation].d4.xyz = subgroupExclusiveMin(data[2].d4.xyz); + data[invocation].d4 = subgroupExclusiveMin(data[3].d4); + + data[invocation].f4.x = subgroupExclusiveMax(data[0].f4.x); + data[invocation].f4.xy = subgroupExclusiveMax(data[1].f4.xy); + data[invocation].f4.xyz = subgroupExclusiveMax(data[2].f4.xyz); + data[invocation].f4 = subgroupExclusiveMax(data[3].f4); + + data[invocation].i4.x = subgroupExclusiveMax(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveMax(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveMax(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveMax(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveMax(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveMax(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveMax(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveMax(data[3].u4); + + data[invocation].d4.x = subgroupExclusiveMax(data[0].d4.x); + data[invocation].d4.xy = subgroupExclusiveMax(data[1].d4.xy); + data[invocation].d4.xyz = subgroupExclusiveMax(data[2].d4.xyz); + data[invocation].d4 = subgroupExclusiveMax(data[3].d4); + + data[invocation].i4.x = subgroupExclusiveAnd(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveAnd(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveAnd(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveAnd(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveAnd(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveAnd(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveAnd(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveAnd(data[3].u4); + + data[invocation].i4.x = int(subgroupExclusiveAnd(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupExclusiveAnd(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupExclusiveAnd(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupExclusiveAnd(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].i4.x = subgroupExclusiveOr(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveOr(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveOr(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveOr(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveOr(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveOr(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveOr(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveOr(data[3].u4); + + data[invocation].i4.x = int(subgroupExclusiveOr(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupExclusiveOr(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupExclusiveOr(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupExclusiveOr(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].i4.x = subgroupExclusiveXor(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveXor(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveXor(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveXor(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveXor(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveXor(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveXor(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveXor(data[3].u4); + + data[invocation].i4.x = int(subgroupExclusiveXor(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupExclusiveXor(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupExclusiveXor(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupExclusiveXor(lessThan(data[1].i4, ivec4(0)))); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupBallot.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupBallot.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupBallot.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupBallot.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,86 @@ +#version 450 + +#extension GL_KHR_shader_subgroup_ballot: enable + +layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in; + +layout(binding = 0) buffer Buffers +{ + vec4 f4; + ivec4 i4; + uvec4 u4; + dvec4 d4; +} data[4]; + +void main() +{ + uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4; + + uvec4 relMask = gl_SubgroupEqMask + + gl_SubgroupGeMask + + gl_SubgroupGtMask + + gl_SubgroupLeMask + + gl_SubgroupLtMask; + + uvec4 result = subgroupBallot(true); + + data[invocation].u4.x = subgroupBallotBitCount(result); + data[invocation].u4.y = subgroupBallotBitExtract(result, 0) ? 1 : 0; + data[invocation].u4.z = subgroupBallotInclusiveBitCount(result) + subgroupBallotExclusiveBitCount(result); + data[invocation].u4.w = subgroupBallotFindLSB(result) + subgroupBallotFindMSB(result); + + if ((relMask == result) && subgroupInverseBallot(data[0].u4)) + { + data[invocation].f4.x = subgroupBroadcast(data[0].f4.x, invocation); + data[invocation].f4.xy = subgroupBroadcast(data[1].f4.xy, invocation); + data[invocation].f4.xyz = subgroupBroadcast(data[2].f4.xyz, invocation); + data[invocation].f4 = subgroupBroadcast(data[3].f4, invocation); + + data[invocation].i4.x = subgroupBroadcast(data[0].i4.x, invocation); + data[invocation].i4.xy = subgroupBroadcast(data[1].i4.xy, invocation); + data[invocation].i4.xyz = subgroupBroadcast(data[2].i4.xyz, invocation); + data[invocation].i4 = subgroupBroadcast(data[3].i4, invocation); + + data[invocation].u4.x = subgroupBroadcast(data[0].u4.x, invocation); + data[invocation].u4.xy = subgroupBroadcast(data[1].u4.xy, invocation); + data[invocation].u4.xyz = subgroupBroadcast(data[2].u4.xyz, invocation); + data[invocation].u4 = subgroupBroadcast(data[3].u4, invocation); + + data[invocation].d4.x = subgroupBroadcast(data[0].d4.x, invocation); + data[invocation].d4.xy = subgroupBroadcast(data[1].d4.xy, invocation); + data[invocation].d4.xyz = subgroupBroadcast(data[2].d4.xyz, invocation); + data[invocation].d4 = subgroupBroadcast(data[3].d4, invocation); + + data[invocation].i4.x = int(subgroupBroadcast(data[0].i4.x < 0, invocation)); + data[invocation].i4.xy = ivec2(subgroupBroadcast(lessThan(data[1].i4.xy, ivec2(0)), invocation)); + data[invocation].i4.xyz = ivec3(subgroupBroadcast(lessThan(data[1].i4.xyz, ivec3(0)), invocation)); + data[invocation].i4 = ivec4(subgroupBroadcast(lessThan(data[1].i4, ivec4(0)), invocation)); + } + else + { + data[invocation].f4.x = subgroupBroadcastFirst(data[0].f4.x); + data[invocation].f4.xy = subgroupBroadcastFirst(data[1].f4.xy); + data[invocation].f4.xyz = subgroupBroadcastFirst(data[2].f4.xyz); + data[invocation].f4 = subgroupBroadcastFirst(data[3].f4); + + data[invocation].i4.x = subgroupBroadcastFirst(data[0].i4.x); + data[invocation].i4.xy = subgroupBroadcastFirst(data[1].i4.xy); + data[invocation].i4.xyz = subgroupBroadcastFirst(data[2].i4.xyz); + data[invocation].i4 = subgroupBroadcastFirst(data[3].i4); + + data[invocation].u4.x = subgroupBroadcastFirst(data[0].u4.x); + data[invocation].u4.xy = subgroupBroadcastFirst(data[1].u4.xy); + data[invocation].u4.xyz = subgroupBroadcastFirst(data[2].u4.xyz); + data[invocation].u4 = subgroupBroadcastFirst(data[3].u4); + + data[invocation].d4.x = subgroupBroadcastFirst(data[0].d4.x); + data[invocation].d4.xy = subgroupBroadcastFirst(data[1].d4.xy); + data[invocation].d4.xyz = subgroupBroadcastFirst(data[2].d4.xyz); + data[invocation].d4 = subgroupBroadcastFirst(data[3].d4); + + data[invocation].i4.x = int(subgroupBroadcastFirst(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupBroadcastFirst(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupBroadcastFirst(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupBroadcastFirst(lessThan(data[1].i4, ivec4(0)))); + } +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupBasic.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupBasic.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupBasic.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupBasic.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,23 @@ +#version 450 + +#extension GL_KHR_shader_subgroup_basic: enable + +layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in; + +layout(binding = 0) buffer Buffer +{ + int a[]; +} data; + +void main() +{ + data.a[gl_SubgroupSize] = 1; + data.a[gl_SubgroupInvocationID] = 1; + data.a[gl_NumSubgroups] = 1; + data.a[gl_SubgroupID] = (subgroupElect()) ? 1 : 0; + subgroupBarrier(); + subgroupMemoryBarrier(); + subgroupMemoryBarrierBuffer(); + subgroupMemoryBarrierShared(); + subgroupMemoryBarrierImage(); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupClustered.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupClustered.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupClustered.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupClustered.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,143 @@ +#version 450 + +#extension GL_KHR_shader_subgroup_clustered: enable + +layout (local_size_x = 8) in; + +layout(binding = 0) buffer Buffers +{ + vec4 f4; + ivec4 i4; + uvec4 u4; + dvec4 d4; +} data[4]; + +void main() +{ + uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4; + + data[invocation].f4.x = subgroupClusteredAdd(data[0].f4.x, 1); + data[invocation].f4.xy = subgroupClusteredAdd(data[1].f4.xy, 1); + data[invocation].f4.xyz = subgroupClusteredAdd(data[2].f4.xyz, 1); + data[invocation].f4 = subgroupClusteredAdd(data[3].f4, 1); + + data[invocation].i4.x = subgroupClusteredAdd(data[0].i4.x, 1); + data[invocation].i4.xy = subgroupClusteredAdd(data[1].i4.xy, 1); + data[invocation].i4.xyz = subgroupClusteredAdd(data[2].i4.xyz, 1); + data[invocation].i4 = subgroupClusteredAdd(data[3].i4, 1); + + data[invocation].u4.x = subgroupClusteredAdd(data[0].u4.x, 1); + data[invocation].u4.xy = subgroupClusteredAdd(data[1].u4.xy, 1); + data[invocation].u4.xyz = subgroupClusteredAdd(data[2].u4.xyz, 1); + data[invocation].u4 = subgroupClusteredAdd(data[3].u4, 1); + + data[invocation].d4.x = subgroupClusteredAdd(data[0].d4.x, 1); + data[invocation].d4.xy = subgroupClusteredAdd(data[1].d4.xy, 1); + data[invocation].d4.xyz = subgroupClusteredAdd(data[2].d4.xyz, 1); + data[invocation].d4 = subgroupClusteredAdd(data[3].d4, 1); + + data[invocation].f4.x = subgroupClusteredMul(data[0].f4.x, 1); + data[invocation].f4.xy = subgroupClusteredMul(data[1].f4.xy, 1); + data[invocation].f4.xyz = subgroupClusteredMul(data[2].f4.xyz, 1); + data[invocation].f4 = subgroupClusteredMul(data[3].f4, 1); + + data[invocation].i4.x = subgroupClusteredMul(data[0].i4.x, 1); + data[invocation].i4.xy = subgroupClusteredMul(data[1].i4.xy, 1); + data[invocation].i4.xyz = subgroupClusteredMul(data[2].i4.xyz, 1); + data[invocation].i4 = subgroupClusteredMul(data[3].i4, 1); + + data[invocation].u4.x = subgroupClusteredMul(data[0].u4.x, 1); + data[invocation].u4.xy = subgroupClusteredMul(data[1].u4.xy, 1); + data[invocation].u4.xyz = subgroupClusteredMul(data[2].u4.xyz, 1); + data[invocation].u4 = subgroupClusteredMul(data[3].u4, 1); + + data[invocation].d4.x = subgroupClusteredMul(data[0].d4.x, 1); + data[invocation].d4.xy = subgroupClusteredMul(data[1].d4.xy, 1); + data[invocation].d4.xyz = subgroupClusteredMul(data[2].d4.xyz, 1); + data[invocation].d4 = subgroupClusteredMul(data[3].d4, 1); + + data[invocation].f4.x = subgroupClusteredMin(data[0].f4.x, 1); + data[invocation].f4.xy = subgroupClusteredMin(data[1].f4.xy, 1); + data[invocation].f4.xyz = subgroupClusteredMin(data[2].f4.xyz, 1); + data[invocation].f4 = subgroupClusteredMin(data[3].f4, 1); + + data[invocation].i4.x = subgroupClusteredMin(data[0].i4.x, 1); + data[invocation].i4.xy = subgroupClusteredMin(data[1].i4.xy, 1); + data[invocation].i4.xyz = subgroupClusteredMin(data[2].i4.xyz, 1); + data[invocation].i4 = subgroupClusteredMin(data[3].i4, 1); + + data[invocation].u4.x = subgroupClusteredMin(data[0].u4.x, 1); + data[invocation].u4.xy = subgroupClusteredMin(data[1].u4.xy, 1); + data[invocation].u4.xyz = subgroupClusteredMin(data[2].u4.xyz, 1); + data[invocation].u4 = subgroupClusteredMin(data[3].u4, 1); + + data[invocation].d4.x = subgroupClusteredMin(data[0].d4.x, 1); + data[invocation].d4.xy = subgroupClusteredMin(data[1].d4.xy, 1); + data[invocation].d4.xyz = subgroupClusteredMin(data[2].d4.xyz, 1); + data[invocation].d4 = subgroupClusteredMin(data[3].d4, 1); + + data[invocation].f4.x = subgroupClusteredMax(data[0].f4.x, 1); + data[invocation].f4.xy = subgroupClusteredMax(data[1].f4.xy, 1); + data[invocation].f4.xyz = subgroupClusteredMax(data[2].f4.xyz, 1); + data[invocation].f4 = subgroupClusteredMax(data[3].f4, 1); + + data[invocation].i4.x = subgroupClusteredMax(data[0].i4.x, 1); + data[invocation].i4.xy = subgroupClusteredMax(data[1].i4.xy, 1); + data[invocation].i4.xyz = subgroupClusteredMax(data[2].i4.xyz, 1); + data[invocation].i4 = subgroupClusteredMax(data[3].i4, 1); + + data[invocation].u4.x = subgroupClusteredMax(data[0].u4.x, 1); + data[invocation].u4.xy = subgroupClusteredMax(data[1].u4.xy, 1); + data[invocation].u4.xyz = subgroupClusteredMax(data[2].u4.xyz, 1); + data[invocation].u4 = subgroupClusteredMax(data[3].u4, 1); + + data[invocation].d4.x = subgroupClusteredMax(data[0].d4.x, 1); + data[invocation].d4.xy = subgroupClusteredMax(data[1].d4.xy, 1); + data[invocation].d4.xyz = subgroupClusteredMax(data[2].d4.xyz, 1); + data[invocation].d4 = subgroupClusteredMax(data[3].d4, 1); + + data[invocation].i4.x = subgroupClusteredAnd(data[0].i4.x, 1); + data[invocation].i4.xy = subgroupClusteredAnd(data[1].i4.xy, 1); + data[invocation].i4.xyz = subgroupClusteredAnd(data[2].i4.xyz, 1); + data[invocation].i4 = subgroupClusteredAnd(data[3].i4, 1); + + data[invocation].u4.x = subgroupClusteredAnd(data[0].u4.x, 1); + data[invocation].u4.xy = subgroupClusteredAnd(data[1].u4.xy, 1); + data[invocation].u4.xyz = subgroupClusteredAnd(data[2].u4.xyz, 1); + data[invocation].u4 = subgroupClusteredAnd(data[3].u4, 1); + + data[invocation].i4.x = int(subgroupClusteredAnd(data[0].i4.x < 0, 1)); + data[invocation].i4.xy = ivec2(subgroupClusteredAnd(lessThan(data[1].i4.xy, ivec2(0)), 1)); + data[invocation].i4.xyz = ivec3(subgroupClusteredAnd(lessThan(data[1].i4.xyz, ivec3(0)), 1)); + data[invocation].i4 = ivec4(subgroupClusteredAnd(lessThan(data[1].i4, ivec4(0)), 1)); + + data[invocation].i4.x = subgroupClusteredOr(data[0].i4.x, 1); + data[invocation].i4.xy = subgroupClusteredOr(data[1].i4.xy, 1); + data[invocation].i4.xyz = subgroupClusteredOr(data[2].i4.xyz, 1); + data[invocation].i4 = subgroupClusteredOr(data[3].i4, 1); + + data[invocation].u4.x = subgroupClusteredOr(data[0].u4.x, 1); + data[invocation].u4.xy = subgroupClusteredOr(data[1].u4.xy, 1); + data[invocation].u4.xyz = subgroupClusteredOr(data[2].u4.xyz, 1); + data[invocation].u4 = subgroupClusteredOr(data[3].u4, 1); + + data[invocation].i4.x = int(subgroupClusteredOr(data[0].i4.x < 0, 1)); + data[invocation].i4.xy = ivec2(subgroupClusteredOr(lessThan(data[1].i4.xy, ivec2(0)), 1)); + data[invocation].i4.xyz = ivec3(subgroupClusteredOr(lessThan(data[1].i4.xyz, ivec3(0)), 1)); + data[invocation].i4 = ivec4(subgroupClusteredOr(lessThan(data[1].i4, ivec4(0)), 1)); + + data[invocation].i4.x = subgroupClusteredXor(data[0].i4.x, 1); + data[invocation].i4.xy = subgroupClusteredXor(data[1].i4.xy, 1); + data[invocation].i4.xyz = subgroupClusteredXor(data[2].i4.xyz, 1); + data[invocation].i4 = subgroupClusteredXor(data[3].i4, 1); + + data[invocation].u4.x = subgroupClusteredXor(data[0].u4.x, 1); + data[invocation].u4.xy = subgroupClusteredXor(data[1].u4.xy, 1); + data[invocation].u4.xyz = subgroupClusteredXor(data[2].u4.xyz, 1); + data[invocation].u4 = subgroupClusteredXor(data[3].u4, 1); + + data[invocation].i4.x = int(subgroupClusteredXor(data[0].i4.x < 0, 1)); + data[invocation].i4.xy = ivec2(subgroupClusteredXor(lessThan(data[1].i4.xy, ivec2(0)), 1)); + data[invocation].i4.xyz = ivec3(subgroupClusteredXor(lessThan(data[1].i4.xyz, ivec3(0)), 1)); + data[invocation].i4 = ivec4(subgroupClusteredXor(lessThan(data[1].i4, ivec4(0)), 1)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupClusteredNeg.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupClusteredNeg.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupClusteredNeg.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupClusteredNeg.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,39 @@ +#version 450 + +#extension GL_KHR_shader_subgroup_clustered: enable + +layout (local_size_x = 8) in; + +layout(binding = 0) buffer Buffers +{ + vec4 f4; + ivec4 i4; + uvec4 u4; + dvec4 d4; +} data[4]; + +void main() +{ + int a = 1; + const int aConst = 1; + + uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4; + + data[invocation].f4.xy = subgroupClusteredAdd(data[1].f4.xy, 0); // ERROR, less than 1 + + data[invocation].f4.x = subgroupClusteredMul(data[0].f4.x, 3); // ERROR, not a power of 2 + + data[invocation].i4.xy = subgroupClusteredMin(data[1].i4.xy, 8); + data[invocation].i4.xyz = subgroupClusteredMin(data[2].i4.xyz, 6); // ERROR, not a power of 2 + + data[invocation].f4.x = subgroupClusteredMax(data[0].f4.x, -1); // ERROR, less than 1 + + data[invocation].i4 = subgroupClusteredAnd(data[3].i4, -3); // ERROR, less than 1 + + data[invocation].i4.x = subgroupClusteredOr(data[0].i4.x, a); // ERROR, not constant + data[invocation].i4.xy = subgroupClusteredOr(data[1].i4.xy, aConst); + + data[invocation].i4.x = subgroupClusteredXor(data[0].i4.x, 1 + a); // ERROR, not constant + data[invocation].i4.xy = subgroupClusteredXor(data[1].i4.xy, aConst + a); // ERROR, not constant + data[invocation].i4.xyz = subgroupClusteredXor(data[2].i4.xyz, 1 + aConst); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroup.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroup.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroup.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroup.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,7 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic: enable +layout(location = 0) out uvec4 data; +void main (void) +{ + data = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroup.geom vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroup.geom --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroup.geom 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroup.geom 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,13 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic: enable +layout(points) in; +layout(points, max_vertices = 1) out; +layout(set = 0, binding = 0, std430) buffer Output +{ + uvec4 result[]; +}; + +void main (void) +{ + result[gl_PrimitiveIDIn] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupPartitioned.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupPartitioned.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupPartitioned.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupPartitioned.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,420 @@ +#version 450 + +#extension GL_NV_shader_subgroup_partitioned: enable + +layout (local_size_x = 8) in; + +layout(binding = 0) buffer Buffers +{ + vec4 f4; + ivec4 i4; + uvec4 u4; + dvec4 d4; +} data[4]; + +void main() +{ + uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4; + + uvec4 ballot = subgroupPartitionNV(invocation); + + data[invocation].u4 = subgroupPartitionNV(data[0].f4.x); + data[invocation].u4 = subgroupPartitionNV(data[0].f4.xy); + data[invocation].u4 = subgroupPartitionNV(data[0].f4.xyz); + data[invocation].u4 = subgroupPartitionNV(data[0].f4); + + data[invocation].u4 = subgroupPartitionNV(data[0].i4.x); + data[invocation].u4 = subgroupPartitionNV(data[0].i4.xy); + data[invocation].u4 = subgroupPartitionNV(data[0].i4.xyz); + data[invocation].u4 = subgroupPartitionNV(data[0].i4); + + data[invocation].u4 = subgroupPartitionNV(data[0].u4.x); + data[invocation].u4 = subgroupPartitionNV(data[0].u4.xy); + data[invocation].u4 = subgroupPartitionNV(data[0].u4.xyz); + data[invocation].u4 = subgroupPartitionNV(data[0].u4); + + data[invocation].u4 = subgroupPartitionNV(data[0].d4.x); + data[invocation].u4 = subgroupPartitionNV(data[0].d4.xy); + data[invocation].u4 = subgroupPartitionNV(data[0].d4.xyz); + data[invocation].u4 = subgroupPartitionNV(data[0].d4); + + data[invocation].u4 = subgroupPartitionNV(bool(data[0].i4.x)); + data[invocation].u4 = subgroupPartitionNV(bvec2(data[0].i4.xy)); + data[invocation].u4 = subgroupPartitionNV(bvec3(data[0].i4.xyz)); + data[invocation].u4 = subgroupPartitionNV(bvec4(data[0].i4)); + + data[invocation].f4.x = subgroupPartitionedAddNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedAddNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedAddNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedAddNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedAddNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedAddNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedAddNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedAddNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedAddNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedAddNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedAddNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedAddNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedAddNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedAddNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedAddNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedAddNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedMulNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedMulNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedMulNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedMulNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedMulNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedMulNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedMulNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedMulNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedMulNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedMulNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedMulNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedMulNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedMulNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedMulNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedMulNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedMulNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedMinNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedMinNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedMinNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedMinNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedMinNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedMinNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedMinNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedMinNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedMinNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedMinNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedMinNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedMinNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedMinNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedMinNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedMinNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedMinNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedMaxNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedMaxNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedMaxNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedMaxNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedMaxNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedMaxNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedMaxNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedMaxNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedMaxNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedMaxNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedMaxNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedMaxNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedMaxNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedMaxNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedMaxNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedMaxNV(data[3].d4, ballot); + + data[invocation].i4.x = subgroupPartitionedAndNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedAndNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedAndNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedAndNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedAndNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedAndNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedAndNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedAndNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedAndNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedAndNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedAndNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedAndNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].i4.x = subgroupPartitionedOrNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedOrNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedOrNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedOrNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedOrNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedOrNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedOrNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedOrNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedOrNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedOrNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedOrNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedOrNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].i4.x = subgroupPartitionedXorNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedXorNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedXorNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedXorNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedXorNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedXorNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedXorNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedXorNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedXorNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedXorNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedXorNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedXorNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].f4.x = subgroupPartitionedInclusiveAddNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedInclusiveAddNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedInclusiveAddNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedInclusiveAddNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedInclusiveAddNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveAddNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveAddNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveAddNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveAddNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveAddNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveAddNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveAddNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedInclusiveAddNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedInclusiveAddNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedInclusiveAddNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedInclusiveAddNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedInclusiveMulNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedInclusiveMulNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedInclusiveMulNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedInclusiveMulNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedInclusiveMulNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveMulNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveMulNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveMulNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveMulNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveMulNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveMulNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveMulNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedInclusiveMulNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedInclusiveMulNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedInclusiveMulNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedInclusiveMulNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedInclusiveMinNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedInclusiveMinNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedInclusiveMinNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedInclusiveMinNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedInclusiveMinNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveMinNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveMinNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveMinNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveMinNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveMinNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveMinNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveMinNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedInclusiveMinNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedInclusiveMinNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedInclusiveMinNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedInclusiveMinNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedInclusiveMaxNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedInclusiveMaxNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedInclusiveMaxNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedInclusiveMaxNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveMaxNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveMaxNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveMaxNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveMaxNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveMaxNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedInclusiveMaxNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedInclusiveMaxNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedInclusiveMaxNV(data[3].d4, ballot); + + data[invocation].i4.x = subgroupPartitionedInclusiveAndNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveAndNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveAndNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveAndNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveAndNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveAndNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveAndNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveAndNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedInclusiveAndNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedInclusiveAndNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedInclusiveAndNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedInclusiveAndNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].i4.x = subgroupPartitionedInclusiveOrNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveOrNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveOrNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveOrNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveOrNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveOrNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveOrNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveOrNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedInclusiveOrNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedInclusiveOrNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedInclusiveOrNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedInclusiveOrNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].i4.x = subgroupPartitionedInclusiveXorNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveXorNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveXorNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveXorNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveXorNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveXorNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveXorNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveXorNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedInclusiveXorNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedInclusiveXorNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedInclusiveXorNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedInclusiveXorNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].f4.x = subgroupPartitionedExclusiveAddNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedExclusiveAddNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedExclusiveAddNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedExclusiveAddNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedExclusiveAddNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveAddNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveAddNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveAddNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveAddNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveAddNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveAddNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveAddNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedExclusiveAddNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedExclusiveAddNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedExclusiveAddNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedExclusiveAddNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedExclusiveMulNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedExclusiveMulNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedExclusiveMulNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedExclusiveMulNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedExclusiveMulNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveMulNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveMulNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveMulNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveMulNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveMulNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveMulNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveMulNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedExclusiveMulNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedExclusiveMulNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedExclusiveMulNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedExclusiveMulNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedExclusiveMinNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedExclusiveMinNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedExclusiveMinNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedExclusiveMinNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedExclusiveMinNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveMinNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveMinNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveMinNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveMinNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveMinNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveMinNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveMinNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedExclusiveMinNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedExclusiveMinNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedExclusiveMinNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedExclusiveMinNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedExclusiveMaxNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedExclusiveMaxNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedExclusiveMaxNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedExclusiveMaxNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveMaxNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveMaxNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveMaxNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveMaxNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveMaxNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedExclusiveMaxNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedExclusiveMaxNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedExclusiveMaxNV(data[3].d4, ballot); + + data[invocation].i4.x = subgroupPartitionedExclusiveAndNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveAndNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveAndNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveAndNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveAndNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveAndNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveAndNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveAndNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedExclusiveAndNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedExclusiveAndNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedExclusiveAndNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedExclusiveAndNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].i4.x = subgroupPartitionedExclusiveOrNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveOrNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveOrNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveOrNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveOrNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveOrNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveOrNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveOrNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedExclusiveOrNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedExclusiveOrNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedExclusiveOrNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedExclusiveOrNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].i4.x = subgroupPartitionedExclusiveXorNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveXorNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveXorNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveXorNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveXorNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveXorNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveXorNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveXorNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedExclusiveXorNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedExclusiveXorNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedExclusiveXorNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedExclusiveXorNV(lessThan(data[1].i4, ivec4(0)), ballot)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupQuad.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupQuad.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupQuad.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupQuad.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,118 @@ +#version 450 + +#extension GL_KHR_shader_subgroup_quad: enable + +layout (local_size_x = 8) in; + +layout(binding = 0) buffer Buffers +{ + vec4 f4; + ivec4 i4; + uvec4 u4; + dvec4 d4; +} data[4]; + +void main() +{ + uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4; + + data[invocation].f4.x = subgroupQuadBroadcast(data[0].f4.x, 1); + data[invocation].f4.xy = subgroupQuadBroadcast(data[1].f4.xy, 1); + data[invocation].f4.xyz = subgroupQuadBroadcast(data[2].f4.xyz, 1); + data[invocation].f4 = subgroupQuadBroadcast(data[3].f4, 1); + + data[invocation].i4.x = subgroupQuadBroadcast(data[0].i4.x, 1); + data[invocation].i4.xy = subgroupQuadBroadcast(data[1].i4.xy, 1); + data[invocation].i4.xyz = subgroupQuadBroadcast(data[2].i4.xyz, 1); + data[invocation].i4 = subgroupQuadBroadcast(data[3].i4, 1); + + data[invocation].u4.x = subgroupQuadBroadcast(data[0].u4.x, 1); + data[invocation].u4.xy = subgroupQuadBroadcast(data[1].u4.xy, 1); + data[invocation].u4.xyz = subgroupQuadBroadcast(data[2].u4.xyz, 1); + data[invocation].u4 = subgroupQuadBroadcast(data[3].u4, 1); + + data[invocation].d4.x = subgroupQuadBroadcast(data[0].d4.x, 1); + data[invocation].d4.xy = subgroupQuadBroadcast(data[1].d4.xy, 1); + data[invocation].d4.xyz = subgroupQuadBroadcast(data[2].d4.xyz, 1); + data[invocation].d4 = subgroupQuadBroadcast(data[3].d4, 1); + + data[invocation].i4.x = int(subgroupQuadBroadcast(data[0].i4.x < 0, 1)); + data[invocation].i4.xy = ivec2(subgroupQuadBroadcast(lessThan(data[1].i4.xy, ivec2(0)), 1)); + data[invocation].i4.xyz = ivec3(subgroupQuadBroadcast(lessThan(data[1].i4.xyz, ivec3(0)), 1)); + data[invocation].i4 = ivec4(subgroupQuadBroadcast(lessThan(data[1].i4, ivec4(0)), 1)); + + data[invocation].f4.x = subgroupQuadSwapHorizontal(data[0].f4.x); + data[invocation].f4.xy = subgroupQuadSwapHorizontal(data[1].f4.xy); + data[invocation].f4.xyz = subgroupQuadSwapHorizontal(data[2].f4.xyz); + data[invocation].f4 = subgroupQuadSwapHorizontal(data[3].f4); + + data[invocation].i4.x = subgroupQuadSwapHorizontal(data[0].i4.x); + data[invocation].i4.xy = subgroupQuadSwapHorizontal(data[1].i4.xy); + data[invocation].i4.xyz = subgroupQuadSwapHorizontal(data[2].i4.xyz); + data[invocation].i4 = subgroupQuadSwapHorizontal(data[3].i4); + + data[invocation].u4.x = subgroupQuadSwapHorizontal(data[0].u4.x); + data[invocation].u4.xy = subgroupQuadSwapHorizontal(data[1].u4.xy); + data[invocation].u4.xyz = subgroupQuadSwapHorizontal(data[2].u4.xyz); + data[invocation].u4 = subgroupQuadSwapHorizontal(data[3].u4); + + data[invocation].d4.x = subgroupQuadSwapHorizontal(data[0].d4.x); + data[invocation].d4.xy = subgroupQuadSwapHorizontal(data[1].d4.xy); + data[invocation].d4.xyz = subgroupQuadSwapHorizontal(data[2].d4.xyz); + data[invocation].d4 = subgroupQuadSwapHorizontal(data[3].d4); + + data[invocation].i4.x = int(subgroupQuadSwapHorizontal(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupQuadSwapHorizontal(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupQuadSwapHorizontal(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupQuadSwapHorizontal(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].f4.x = subgroupQuadSwapVertical(data[0].f4.x); + data[invocation].f4.xy = subgroupQuadSwapVertical(data[1].f4.xy); + data[invocation].f4.xyz = subgroupQuadSwapVertical(data[2].f4.xyz); + data[invocation].f4 = subgroupQuadSwapVertical(data[3].f4); + + data[invocation].i4.x = subgroupQuadSwapVertical(data[0].i4.x); + data[invocation].i4.xy = subgroupQuadSwapVertical(data[1].i4.xy); + data[invocation].i4.xyz = subgroupQuadSwapVertical(data[2].i4.xyz); + data[invocation].i4 = subgroupQuadSwapVertical(data[3].i4); + + data[invocation].u4.x = subgroupQuadSwapVertical(data[0].u4.x); + data[invocation].u4.xy = subgroupQuadSwapVertical(data[1].u4.xy); + data[invocation].u4.xyz = subgroupQuadSwapVertical(data[2].u4.xyz); + data[invocation].u4 = subgroupQuadSwapVertical(data[3].u4); + + data[invocation].d4.x = subgroupQuadSwapVertical(data[0].d4.x); + data[invocation].d4.xy = subgroupQuadSwapVertical(data[1].d4.xy); + data[invocation].d4.xyz = subgroupQuadSwapVertical(data[2].d4.xyz); + data[invocation].d4 = subgroupQuadSwapVertical(data[3].d4); + + data[invocation].i4.x = int(subgroupQuadSwapVertical(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupQuadSwapVertical(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupQuadSwapVertical(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupQuadSwapVertical(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].f4.x = subgroupQuadSwapDiagonal(data[0].f4.x); + data[invocation].f4.xy = subgroupQuadSwapDiagonal(data[1].f4.xy); + data[invocation].f4.xyz = subgroupQuadSwapDiagonal(data[2].f4.xyz); + data[invocation].f4 = subgroupQuadSwapDiagonal(data[3].f4); + + data[invocation].i4.x = subgroupQuadSwapDiagonal(data[0].i4.x); + data[invocation].i4.xy = subgroupQuadSwapDiagonal(data[1].i4.xy); + data[invocation].i4.xyz = subgroupQuadSwapDiagonal(data[2].i4.xyz); + data[invocation].i4 = subgroupQuadSwapDiagonal(data[3].i4); + + data[invocation].u4.x = subgroupQuadSwapDiagonal(data[0].u4.x); + data[invocation].u4.xy = subgroupQuadSwapDiagonal(data[1].u4.xy); + data[invocation].u4.xyz = subgroupQuadSwapDiagonal(data[2].u4.xyz); + data[invocation].u4 = subgroupQuadSwapDiagonal(data[3].u4); + + data[invocation].d4.x = subgroupQuadSwapDiagonal(data[0].d4.x); + data[invocation].d4.xy = subgroupQuadSwapDiagonal(data[1].d4.xy); + data[invocation].d4.xyz = subgroupQuadSwapDiagonal(data[2].d4.xyz); + data[invocation].d4 = subgroupQuadSwapDiagonal(data[3].d4); + + data[invocation].i4.x = int(subgroupQuadSwapDiagonal(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupQuadSwapDiagonal(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupQuadSwapDiagonal(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupQuadSwapDiagonal(lessThan(data[1].i4, ivec4(0)))); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupShuffle.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupShuffle.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupShuffle.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupShuffle.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,68 @@ +#version 450 + +#extension GL_KHR_shader_subgroup_shuffle: enable + +layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in; + +layout(binding = 0) buffer Buffers +{ + vec4 f4; + ivec4 i4; + uvec4 u4; + dvec4 d4; +} data[4]; + +void main() +{ + uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4; + + data[invocation].f4.x = subgroupShuffle(data[0].f4.x, invocation); + data[invocation].f4.xy = subgroupShuffle(data[1].f4.xy, invocation); + data[invocation].f4.xyz = subgroupShuffle(data[2].f4.xyz, invocation); + data[invocation].f4 = subgroupShuffle(data[3].f4, invocation); + + data[invocation].i4.x = subgroupShuffle(data[0].i4.x, invocation); + data[invocation].i4.xy = subgroupShuffle(data[1].i4.xy, invocation); + data[invocation].i4.xyz = subgroupShuffle(data[2].i4.xyz, invocation); + data[invocation].i4 = subgroupShuffle(data[3].i4, invocation); + + data[invocation].u4.x = subgroupShuffle(data[0].u4.x, invocation); + data[invocation].u4.xy = subgroupShuffle(data[1].u4.xy, invocation); + data[invocation].u4.xyz = subgroupShuffle(data[2].u4.xyz, invocation); + data[invocation].u4 = subgroupShuffle(data[3].u4, invocation); + + data[invocation].d4.x = subgroupShuffle(data[0].d4.x, invocation); + data[invocation].d4.xy = subgroupShuffle(data[1].d4.xy, invocation); + data[invocation].d4.xyz = subgroupShuffle(data[2].d4.xyz, invocation); + data[invocation].d4 = subgroupShuffle(data[3].d4, invocation); + + data[invocation].i4.x = int(subgroupShuffle(data[0].i4.x < 0, invocation)); + data[invocation].i4.xy = ivec2(subgroupShuffle(lessThan(data[1].i4.xy, ivec2(0)), invocation)); + data[invocation].i4.xyz = ivec3(subgroupShuffle(lessThan(data[1].i4.xyz, ivec3(0)), invocation)); + data[invocation].i4 = ivec4(subgroupShuffle(lessThan(data[1].i4, ivec4(0)), invocation)); + + data[invocation].f4.x = subgroupShuffleXor(data[0].f4.x, invocation); + data[invocation].f4.xy = subgroupShuffleXor(data[1].f4.xy, invocation); + data[invocation].f4.xyz = subgroupShuffleXor(data[2].f4.xyz, invocation); + data[invocation].f4 = subgroupShuffleXor(data[3].f4, invocation); + + data[invocation].i4.x = subgroupShuffleXor(data[0].i4.x, invocation); + data[invocation].i4.xy = subgroupShuffleXor(data[1].i4.xy, invocation); + data[invocation].i4.xyz = subgroupShuffleXor(data[2].i4.xyz, invocation); + data[invocation].i4 = subgroupShuffleXor(data[3].i4, invocation); + + data[invocation].u4.x = subgroupShuffleXor(data[0].u4.x, invocation); + data[invocation].u4.xy = subgroupShuffleXor(data[1].u4.xy, invocation); + data[invocation].u4.xyz = subgroupShuffleXor(data[2].u4.xyz, invocation); + data[invocation].u4 = subgroupShuffleXor(data[3].u4, invocation); + + data[invocation].d4.x = subgroupShuffleXor(data[0].d4.x, invocation); + data[invocation].d4.xy = subgroupShuffleXor(data[1].d4.xy, invocation); + data[invocation].d4.xyz = subgroupShuffleXor(data[2].d4.xyz, invocation); + data[invocation].d4 = subgroupShuffleXor(data[3].d4, invocation); + + data[invocation].i4.x = int(subgroupShuffleXor(data[0].i4.x < 0, invocation)); + data[invocation].i4.xy = ivec2(subgroupShuffleXor(lessThan(data[1].i4.xy, ivec2(0)), invocation)); + data[invocation].i4.xyz = ivec3(subgroupShuffleXor(lessThan(data[1].i4.xyz, ivec3(0)), invocation)); + data[invocation].i4 = ivec4(subgroupShuffleXor(lessThan(data[1].i4, ivec4(0)), invocation)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupShuffleRelative.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupShuffleRelative.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupShuffleRelative.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupShuffleRelative.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,68 @@ +#version 450 + +#extension GL_KHR_shader_subgroup_shuffle_relative: enable + +layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in; + +layout(binding = 0) buffer Buffers +{ + vec4 f4; + ivec4 i4; + uvec4 u4; + dvec4 d4; +} data[4]; + +void main() +{ + uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4; + + data[invocation].f4.x = subgroupShuffleUp(data[0].f4.x, invocation); + data[invocation].f4.xy = subgroupShuffleUp(data[1].f4.xy, invocation); + data[invocation].f4.xyz = subgroupShuffleUp(data[2].f4.xyz, invocation); + data[invocation].f4 = subgroupShuffleUp(data[3].f4, invocation); + + data[invocation].i4.x = subgroupShuffleUp(data[0].i4.x, invocation); + data[invocation].i4.xy = subgroupShuffleUp(data[1].i4.xy, invocation); + data[invocation].i4.xyz = subgroupShuffleUp(data[2].i4.xyz, invocation); + data[invocation].i4 = subgroupShuffleUp(data[3].i4, invocation); + + data[invocation].u4.x = subgroupShuffleUp(data[0].u4.x, invocation); + data[invocation].u4.xy = subgroupShuffleUp(data[1].u4.xy, invocation); + data[invocation].u4.xyz = subgroupShuffleUp(data[2].u4.xyz, invocation); + data[invocation].u4 = subgroupShuffleUp(data[3].u4, invocation); + + data[invocation].d4.x = subgroupShuffleUp(data[0].d4.x, invocation); + data[invocation].d4.xy = subgroupShuffleUp(data[1].d4.xy, invocation); + data[invocation].d4.xyz = subgroupShuffleUp(data[2].d4.xyz, invocation); + data[invocation].d4 = subgroupShuffleUp(data[3].d4, invocation); + + data[invocation].i4.x = int(subgroupShuffleUp(data[0].i4.x < 0, invocation)); + data[invocation].i4.xy = ivec2(subgroupShuffleUp(lessThan(data[1].i4.xy, ivec2(0)), invocation)); + data[invocation].i4.xyz = ivec3(subgroupShuffleUp(lessThan(data[1].i4.xyz, ivec3(0)), invocation)); + data[invocation].i4 = ivec4(subgroupShuffleUp(lessThan(data[1].i4, ivec4(0)), invocation)); + + data[invocation].f4.x = subgroupShuffleDown(data[0].f4.x, invocation); + data[invocation].f4.xy = subgroupShuffleDown(data[1].f4.xy, invocation); + data[invocation].f4.xyz = subgroupShuffleDown(data[2].f4.xyz, invocation); + data[invocation].f4 = subgroupShuffleDown(data[3].f4, invocation); + + data[invocation].i4.x = subgroupShuffleDown(data[0].i4.x, invocation); + data[invocation].i4.xy = subgroupShuffleDown(data[1].i4.xy, invocation); + data[invocation].i4.xyz = subgroupShuffleDown(data[2].i4.xyz, invocation); + data[invocation].i4 = subgroupShuffleDown(data[3].i4, invocation); + + data[invocation].u4.x = subgroupShuffleDown(data[0].u4.x, invocation); + data[invocation].u4.xy = subgroupShuffleDown(data[1].u4.xy, invocation); + data[invocation].u4.xyz = subgroupShuffleDown(data[2].u4.xyz, invocation); + data[invocation].u4 = subgroupShuffleDown(data[3].u4, invocation); + + data[invocation].d4.x = subgroupShuffleDown(data[0].d4.x, invocation); + data[invocation].d4.xy = subgroupShuffleDown(data[1].d4.xy, invocation); + data[invocation].d4.xyz = subgroupShuffleDown(data[2].d4.xyz, invocation); + data[invocation].d4 = subgroupShuffleDown(data[3].d4, invocation); + + data[invocation].i4.x = int(subgroupShuffleDown(data[0].i4.x < 0, invocation)); + data[invocation].i4.xy = ivec2(subgroupShuffleDown(lessThan(data[1].i4.xy, ivec2(0)), invocation)); + data[invocation].i4.xyz = ivec3(subgroupShuffleDown(lessThan(data[1].i4.xyz, ivec3(0)), invocation)); + data[invocation].i4 = ivec4(subgroupShuffleDown(lessThan(data[1].i4, ivec4(0)), invocation)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroup.tesc vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroup.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroup.tesc 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroup.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,12 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic: enable +layout(vertices=1) out; +layout(set = 0, binding = 0, std430) buffer Output +{ + uvec4 result[]; +}; + +void main (void) +{ + result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroup.tese vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroup.tese --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroup.tese 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroup.tese 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,12 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic: enable +layout(isolines) in; +layout(set = 0, binding = 0, std430) buffer Output +{ + uvec4 result[]; +}; + +void main (void) +{ + result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroup.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroup.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroup.vert 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroup.vert 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,11 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic: enable +layout(set = 0, binding = 0, std430) buffer Output +{ + uvec4 result[]; +}; + +void main (void) +{ + result[gl_VertexIndex] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupVote.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupVote.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subgroupVote.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subgroupVote.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,49 @@ +#version 450 + +#extension GL_KHR_shader_subgroup_vote: enable + +layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in; + +layout(binding = 0) buffer Buffers +{ + vec4 f4; + ivec4 i4; + uvec4 u4; + dvec4 d4; + int r; +} data[4]; + +void main() +{ + uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4; + + if (subgroupAll(data[invocation].r < 0)) + { + data[invocation].r = int(subgroupAllEqual(data[0].f4.x)); + data[invocation].r = int(subgroupAllEqual(data[1].f4.xy)); + data[invocation].r = int(subgroupAllEqual(data[2].f4.xyz)); + data[invocation].r = int(subgroupAllEqual(data[3].f4)); + + data[invocation].r = int(subgroupAllEqual(data[0].i4.x)); + data[invocation].r = int(subgroupAllEqual(data[1].i4.xy)); + data[invocation].r = int(subgroupAllEqual(data[2].i4.xyz)); + data[invocation].r = int(subgroupAllEqual(data[3].i4)); + + data[invocation].r = int(subgroupAllEqual(data[0].u4.x)); + data[invocation].r = int(subgroupAllEqual(data[1].u4.xy)); + data[invocation].r = int(subgroupAllEqual(data[2].u4.xyz)); + data[invocation].r = int(subgroupAllEqual(data[3].u4)); + } + else if (subgroupAny(data[invocation].r < 0)) + { + data[invocation].r = int(subgroupAllEqual(data[0].d4.x)); + data[invocation].r = int(subgroupAllEqual(data[1].d4.xy)); + data[invocation].r = int(subgroupAllEqual(data[2].d4.xyz)); + data[invocation].r = int(subgroupAllEqual(data[3].d4)); + + data[invocation].r = int(int(subgroupAllEqual(data[0].i4.x < 0))); + data[invocation].r = int(ivec2(subgroupAllEqual(lessThan(data[1].i4.xy, ivec2(0))))); + data[invocation].r = int(ivec3(subgroupAllEqual(lessThan(data[1].i4.xyz, ivec3(0))))); + data[invocation].r = int(ivec4(subgroupAllEqual(lessThan(data[1].i4, ivec4(0))))); + } +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subpass.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.subpass.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.subpass.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.subpass.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,29 +1,29 @@ -#version 400 - -layout(input_attachment_index = 1) uniform subpassInput sub; -layout(input_attachment_index = 2) uniform subpassInputMS subMS; -layout(input_attachment_index = 3) uniform isubpassInput isub; -layout(input_attachment_index = 4) uniform isubpassInputMS isubMS; -layout(input_attachment_index = 5) uniform usubpassInput usub; -layout(input_attachment_index = 6) uniform usubpassInputMS usubMS; - -out vec4 color; -out ivec4 icolor; -out uvec4 ucolor; - -void foo(isubpassInputMS sb) -{ - icolor += subpassLoad(sb, 3); -} - -void main() -{ - color = subpassLoad(sub); - color += subpassLoad(subMS, 3); - icolor = subpassLoad(isub); - icolor += subpassLoad(isubMS, 3); - ucolor = subpassLoad(usub); - ucolor += subpassLoad(usubMS, 3); - - foo(isubMS); -} +#version 400 + +layout(input_attachment_index = 1) uniform subpassInput sub; +layout(input_attachment_index = 2) uniform subpassInputMS subMS; +layout(input_attachment_index = 3) uniform isubpassInput isub; +layout(input_attachment_index = 4) uniform isubpassInputMS isubMS; +layout(input_attachment_index = 5) uniform usubpassInput usub; +layout(input_attachment_index = 6) uniform usubpassInputMS usubMS; + +out vec4 color; +out ivec4 icolor; +out uvec4 ucolor; + +void foo(isubpassInputMS sb) +{ + icolor += subpassLoad(sb, 3); +} + +void main() +{ + color = subpassLoad(sub); + color += subpassLoad(subMS, 3); + icolor = subpassLoad(isub); + icolor += subpassLoad(isubMS, 3); + ucolor = subpassLoad(usub); + ucolor += subpassLoad(usubMS, 3); + + foo(isubMS); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.switch.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.switch.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.switch.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.switch.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,142 +1,142 @@ -#version 310 es -precision mediump float; -flat in int c, d; -in float x; -out float color; -in vec4 v; - -vec4 foo1(vec4 v1, vec4 v2, int i1) -{ - switch (i1) - { - case 0: - return v1; - case 2: - case 1: - return v2; - case 3: - return v1 * v2; - } - - return vec4(0.0); -} - -vec4 foo2(vec4 v1, vec4 v2, int i1) -{ - switch (i1) - { - case 0: - return v1; - case 2: - return vec4(1.0); - case 1: - return v2; - case 3: - return v1 * v2; - } - - return vec4(0.0); -} - -void main() -{ - float f; - int a[2]; - int local = c; - - switch(++local) - { - } - - switch (c) { - case 1: - f = sin(x); - break; - case 2: - f = cos(x); - break; - default: - f = tan(x); - } - - switch (c) { - case 1: - f += sin(x); - case 2: - f += cos(x); - break; - default: - f += tan(x); - } - - switch (c) { - case 1: - f += sin(x); - break; - case 2: - f += cos(x); - break; - } - - switch (c) { - case 1: - f += sin(x); - break; - case 2: - switch (d) { - case 1: - f += x * x * x; - break; - case 2: - f += x * x; - break; - } - break; - default: - f += tan(x); - } - - for (int i = 0; i < 10; ++i) { - switch (c) { - case 1: - f += sin(x); - for (int j = 20; j < 30; ++j) { - ++f; - if (f < 100.2) - break; - } - break; - case 2: - f += cos(x); - break; - break; - default: - f += tan(x); - } - - if (f < 3.43) - break; - } - - switch (c) { - case 1: - f += sin(x); - break; - case 2: - // test no statements at end - } - - color = f + float(local); - - color += foo1(v,v,c).y; - color += foo2(v,v,c).z; - - switch (c) { - case 0: break; - default: - } - - switch (c) { - default: - } -} +#version 310 es +precision mediump float; +flat in int c, d; +in float x; +out float color; +in vec4 v; + +vec4 foo1(vec4 v1, vec4 v2, int i1) +{ + switch (i1) + { + case 0: + return v1; + case 2: + case 1: + return v2; + case 3: + return v1 * v2; + } + + return vec4(0.0); +} + +vec4 foo2(vec4 v1, vec4 v2, int i1) +{ + switch (i1) + { + case 0: + return v1; + case 2: + return vec4(1.0); + case 1: + return v2; + case 3: + return v1 * v2; + } + + return vec4(0.0); +} + +void main() +{ + float f; + int a[2]; + int local = c; + + switch(++local) + { + } + + switch (c) { + case 1: + f = sin(x); + break; + case 2: + f = cos(x); + break; + default: + f = tan(x); + } + + switch (c) { + case 1: + f += sin(x); + case 2: + f += cos(x); + break; + default: + f += tan(x); + } + + switch (c) { + case 1: + f += sin(x); + break; + case 2: + f += cos(x); + break; + } + + switch (c) { + case 1: + f += sin(x); + break; + case 2: + switch (d) { + case 1: + f += x * x * x; + break; + case 2: + f += x * x; + break; + } + break; + default: + f += tan(x); + } + + for (int i = 0; i < 10; ++i) { + switch (c) { + case 1: + f += sin(x); + for (int j = 20; j < 30; ++j) { + ++f; + if (f < 100.2) + break; + } + break; + case 2: + f += cos(x); + break; + break; + default: + f += tan(x); + } + + if (f < 3.43) + break; + } + + switch (c) { + case 1: + f += sin(x); + break; + case 2: + // test no statements at end + } + + color = f + float(local); + + color += foo1(v,v,c).y; + color += foo2(v,v,c).z; + + switch (c) { + case 0: break; + default: + } + + switch (c) { + default: + } +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.swizzle.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.swizzle.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.swizzle.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.swizzle.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,52 +1,52 @@ -#version 140 - -in float blend; -in vec4 u; -bool p; - -in vec2 t; - -void main() -{ - float blendscale = 1.789; - - vec4 w = u; - vec4 w_undef; // test undef - vec4 w_dep = u; // test dependent swizzles - vec4 w_reorder = u; // test reordering - vec4 w2 = u; - vec4 w_flow = u; // test flowControl - - w_reorder.z = blendscale; - - w.wy = t; - - w_reorder.x = blendscale; - - w2.xyzw = u.zwxy; - - w_reorder.y = blendscale; - - w_dep.xy = w2.xz; - w_dep.zw = t; - - w_undef.xy = u.zw; - - if (p) - w_flow.x = t.x; - else - w_flow.x = t.y; - - gl_FragColor = mix(w_reorder, w_undef, w * w2 * w_dep * w_flow); - - vec2 c = t; - vec4 rep = vec4(0.0, 0.0, 0.0, 1.0); - - if (c.x < 0.0) - c.x *= -1.0; - - if (c.x <= 1.0) - rep.x = 3.4; - - gl_FragColor += rep; -} +#version 140 + +in float blend; +in vec4 u; +bool p; + +in vec2 t; + +void main() +{ + float blendscale = 1.789; + + vec4 w = u; + vec4 w_undef; // test undef + vec4 w_dep = u; // test dependent swizzles + vec4 w_reorder = u; // test reordering + vec4 w2 = u; + vec4 w_flow = u; // test flowControl + + w_reorder.z = blendscale; + + w.wy = t; + + w_reorder.x = blendscale; + + w2.xyzw = u.zwxy; + + w_reorder.y = blendscale; + + w_dep.xy = w2.xz; + w_dep.zw = t; + + w_undef.xy = u.zw; + + if (p) + w_flow.x = t.x; + else + w_flow.x = t.y; + + gl_FragColor = mix(w_reorder, w_undef, w * w2 * w_dep * w_flow); + + vec2 c = t; + vec4 rep = vec4(0.0, 0.0, 0.0, 1.0); + + if (c.x < 0.0) + c.x *= -1.0; + + if (c.x <= 1.0) + rep.x = 3.4; + + gl_FragColor += rep; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.swizzleInversion.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.swizzleInversion.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.swizzleInversion.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.swizzleInversion.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,16 @@ -#version 450 - -in vec4 in4; -in vec3 in3; - -void main() -{ - vec3 v43 = interpolateAtCentroid(in4.wzx); - vec2 v42 = interpolateAtSample(in4.zx, 1); - vec4 v44 = interpolateAtOffset(in4.zyxw, vec2(2.0)); - float v41 = interpolateAtOffset(in4.y, vec2(2.0)); - - vec3 v33 = interpolateAtCentroid(in3.yzx); - vec2 v32 = interpolateAtSample(in3.zx, 1); - float v31 = interpolateAtOffset(in4.y, vec2(2.0)); -} +#version 450 + +in vec4 in4; +in vec3 in3; + +void main() +{ + vec3 v43 = interpolateAtCentroid(in4.wzx); + vec2 v42 = interpolateAtSample(in4.zx, 1); + vec4 v44 = interpolateAtOffset(in4.zyxw, vec2(2.0)); + float v41 = interpolateAtOffset(in4.y, vec2(2.0)); + + vec3 v33 = interpolateAtCentroid(in3.yzx); + vec2 v32 = interpolateAtSample(in3.zx, 1); + float v31 = interpolateAtOffset(in4.y, vec2(2.0)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.targetOpenGL.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.targetOpenGL.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.targetOpenGL.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.targetOpenGL.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,10 +1,10 @@ -#version 450 - -layout(constant_id = 3) const int a = 2; -layout(location = 2) uniform float f; -layout(location = 4) uniform sampler2D s1; -uniform sampler2D s2; - -void main() -{ -} +#version 450 + +layout(constant_id = 3) const int a = 2; +layout(location = 2) uniform float f; +layout(location = 4, binding = 1) uniform sampler2D s1; +layout(binding = 2) uniform sampler2D s2; + +void main() +{ +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.targetVulkan.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.targetVulkan.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.targetVulkan.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.targetVulkan.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,9 +1,9 @@ -#version 450 - -layout(constant_id = 3) const int a = 2; - -layout(push_constant) uniform pc { float f; }; - -void main() -{ -} +#version 450 + +layout(constant_id = 3) const int a = 2; + +layout(push_constant) uniform pc { float f; }; + +void main() +{ +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.test.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.test.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.test.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.test.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,22 +1,22 @@ -#version 400 - -uniform sampler2D texSampler2D; -uniform sampler3D texSampler3D; - -in float blend; -in vec2 scale; -in vec4 u; - -in vec2 t; -in vec3 coords; - -void main() -{ - float blendscale = 1.789; - - vec4 v = texture(texSampler2D, (t + scale) / scale ).wzyx; - - vec4 w = texture(texSampler3D, coords) + v; - - gl_FragColor = mix(w, u, blend * blendscale); -} +#version 400 + +uniform sampler2D texSampler2D; +uniform sampler3D texSampler3D; + +in float blend; +in vec2 scale; +in vec4 u; + +in vec2 t; +in vec3 coords; + +void main() +{ + float blendscale = 1.789; + + vec4 v = texture(texSampler2D, (t + scale) / scale ).wzyx; + + vec4 w = texture(texSampler3D, coords) + v; + + gl_FragColor = mix(w, u, blend * blendscale); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.test.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.test.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.test.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.test.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,14 +1,14 @@ -#version 140 - -in mat4 transform; - -attribute vec4 position; -in vec2 uv_in; - -out vec2 uv; - -void main() -{ - uv = uv_in; - gl_Position = transform * position; -} +#version 140 + +in mat4 transform; + +attribute vec4 position; +in vec2 uv_in; + +out vec2 uv; + +void main() +{ + uv = uv_in; + gl_Position = transform * position; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.textureBuffer.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.textureBuffer.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.textureBuffer.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.textureBuffer.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,17 +1,17 @@ -#version 450 - -uniform textureBuffer tBuf; -uniform sampler s; -uniform samplerBuffer sBuf; - -uniform utextureBuffer utBuf; -uniform itextureBuffer itBuf; - -void main() -{ - texelFetch(samplerBuffer(tBuf, s), 13); - texelFetch(sBuf, 13); - texelFetch(tBuf, 13); - texelFetch(utBuf, 13); - texelFetch(itBuf, 13); -} +#version 450 + +uniform textureBuffer tBuf; +uniform sampler s; +uniform samplerBuffer sBuf; + +uniform utextureBuffer utBuf; +uniform itextureBuffer itBuf; + +void main() +{ + texelFetch(samplerBuffer(tBuf, s), 13); + texelFetch(sBuf, 13); + texelFetch(tBuf, 13); + texelFetch(utBuf, 13); + texelFetch(itBuf, 13); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.texture.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.texture.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.texture.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.texture.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,73 +1,73 @@ -#version 140 - -uniform sampler1D texSampler1D; -uniform sampler2D texSampler2D; -uniform sampler3D texSampler3D; -uniform samplerCube texSamplerCube; -uniform sampler1DShadow shadowSampler1D; -uniform sampler2DShadow shadowSampler2D; - -varying float blend; -varying vec2 scale; -varying vec4 u; - -in vec2 t; -in vec2 coords2D; - -void main() -{ - float blendscale = 1.789; - float bias = 2.0; - float lod = 3.0; - float proj = 2.0; - float coords1D = 1.789; - vec3 coords3D = vec3(1.789, 2.718, 3.453); - vec4 coords4D = vec4(1.789, 2.718, 3.453, 2.0); - vec4 color = vec4(0.0, 0.0, 0.0, 0.0); - - color += texture (texSampler1D, coords1D); - color += texture (texSampler1D, coords1D, bias); - color += textureProj(texSampler1D, coords2D); - color += textureProj(texSampler1D, coords4D); - color += textureProj(texSampler1D, coords2D, bias); - color += textureProj(texSampler1D, coords4D, bias); - - color += texture (texSampler2D, coords2D); - color += texture (texSampler2D, coords2D, bias); - color += textureProj (texSampler2D, coords3D); - color += textureProj (texSampler2D, coords4D, bias); - - color += texture (texSampler3D, coords3D); - color += texture (texSampler3D, coords3D, bias); - color += textureProj (texSampler3D, coords4D); - color += textureProj (texSampler3D, coords4D, bias); - - color += texture (texSamplerCube, coords3D); - color += texture (texSamplerCube, coords3D, bias); - - color += texture (shadowSampler1D, coords3D); - color += texture (shadowSampler1D, coords3D, bias); - color += texture (shadowSampler2D, coords3D); - color += texture (shadowSampler2D, coords3D, bias); - color += textureProj (shadowSampler1D, coords4D); - color += textureProj (shadowSampler1D, coords4D, bias); - color += textureProj (shadowSampler2D, coords4D); - color += textureProj (shadowSampler2D, coords4D, bias); - - ivec2 iCoords2D = ivec2(0, 5); - int iLod = 1; - - color += texelFetch(texSampler2D, iCoords2D, iLod); - - vec2 gradX = dFdx(coords2D); - vec2 gradY = dFdy(coords2D); - const ivec2 offset = ivec2(3, -7); - - color += textureGrad(texSampler2D, coords2D, gradX, gradY); - color += textureProjGrad(texSampler2D, vec3(coords2D, proj), gradX, gradY); - color += textureGradOffset(texSampler2D, coords2D, gradX, gradY, offset); - color += textureProjGradOffset(texSampler2D, coords3D, gradX, gradY, offset); - color += textureGrad(shadowSampler2D, vec3(coords2D, lod), gradX, gradY); - - gl_FragColor = mix(color, u, blend * blendscale); +#version 140 + +uniform sampler1D texSampler1D; +uniform sampler2D texSampler2D; +uniform sampler3D texSampler3D; +uniform samplerCube texSamplerCube; +uniform sampler1DShadow shadowSampler1D; +uniform sampler2DShadow shadowSampler2D; + +varying float blend; +varying vec2 scale; +varying vec4 u; + +in vec2 t; +in vec2 coords2D; + +void main() +{ + float blendscale = 1.789; + float bias = 2.0; + float lod = 3.0; + float proj = 2.0; + float coords1D = 1.789; + vec3 coords3D = vec3(1.789, 2.718, 3.453); + vec4 coords4D = vec4(1.789, 2.718, 3.453, 2.0); + vec4 color = vec4(0.0, 0.0, 0.0, 0.0); + + color += texture (texSampler1D, coords1D); + color += texture (texSampler1D, coords1D, bias); + color += textureProj(texSampler1D, coords2D); + color += textureProj(texSampler1D, coords4D); + color += textureProj(texSampler1D, coords2D, bias); + color += textureProj(texSampler1D, coords4D, bias); + + color += texture (texSampler2D, coords2D); + color += texture (texSampler2D, coords2D, bias); + color += textureProj (texSampler2D, coords3D); + color += textureProj (texSampler2D, coords4D, bias); + + color += texture (texSampler3D, coords3D); + color += texture (texSampler3D, coords3D, bias); + color += textureProj (texSampler3D, coords4D); + color += textureProj (texSampler3D, coords4D, bias); + + color += texture (texSamplerCube, coords3D); + color += texture (texSamplerCube, coords3D, bias); + + color += texture (shadowSampler1D, coords3D); + color += texture (shadowSampler1D, coords3D, bias); + color += texture (shadowSampler2D, coords3D); + color += texture (shadowSampler2D, coords3D, bias); + color += textureProj (shadowSampler1D, coords4D); + color += textureProj (shadowSampler1D, coords4D, bias); + color += textureProj (shadowSampler2D, coords4D); + color += textureProj (shadowSampler2D, coords4D, bias); + + ivec2 iCoords2D = ivec2(0, 5); + int iLod = 1; + + color += texelFetch(texSampler2D, iCoords2D, iLod); + + vec2 gradX = dFdx(coords2D); + vec2 gradY = dFdy(coords2D); + const ivec2 offset = ivec2(3, -7); + + color += textureGrad(texSampler2D, coords2D, gradX, gradY); + color += textureProjGrad(texSampler2D, vec3(coords2D, proj), gradX, gradY); + color += textureGradOffset(texSampler2D, coords2D, gradX, gradY, offset); + color += textureProjGradOffset(texSampler2D, coords3D, gradX, gradY, offset); + color += textureGrad(shadowSampler2D, vec3(coords2D, lod), gradX, gradY); + + gl_FragColor = mix(color, u, blend * blendscale); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.textureGatherBiasLod.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.textureGatherBiasLod.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.textureGatherBiasLod.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.textureGatherBiasLod.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,88 +1,88 @@ -#version 450 core - -#extension GL_ARB_sparse_texture2: enable -#extension GL_AMD_texture_gather_bias_lod: enable - -uniform sampler2D s2D; -uniform sampler2DArray s2DArray; -uniform samplerCube sCube; -uniform samplerCubeArray sCubeArray; - -in vec2 c2; -in vec3 c3; -in vec4 c4; - -in float lod; -in float bias; - -out vec4 fragColor; - -void main() -{ - vec4 texel = vec4(0.0); - vec4 result = vec4(0.0); - - const ivec2 offsets[4] = { ivec2(0, 0), ivec2(0, 1), ivec2(1, 0), ivec2(1, 1) }; - - texel += textureGather(s2D, c2, 0, bias); - texel += textureGather(s2DArray, c3, 1, bias); - texel += textureGather(sCube, c3, 2, bias); - texel += textureGather(sCubeArray, c4, 3, bias); - - texel += textureGatherOffset(s2D, c2, offsets[0], 0, bias); - texel += textureGatherOffset(s2DArray, c3, offsets[1], 1, bias); - - texel += textureGatherOffsets(s2D, c2, offsets, 0, bias); - texel += textureGatherOffsets(s2DArray, c3, offsets, 1, bias); - - sparseTextureGatherARB(s2D, c2, result, 0, bias); - texel += result; - sparseTextureGatherARB(s2DArray, c3, result, 1, bias); - texel += result; - sparseTextureGatherARB(sCube, c3, result, 2, bias); - texel += result; - sparseTextureGatherARB(sCubeArray, c4, result, 2, bias); - texel += result; - - sparseTextureGatherOffsetARB(s2D, c2, offsets[0], result, 0, bias); - texel += result; - sparseTextureGatherOffsetARB(s2DArray, c3, offsets[1], result, 1, bias); - texel += result; - - sparseTextureGatherOffsetsARB(s2D, c2, offsets, result, 0, bias); - texel += result; - sparseTextureGatherOffsetsARB(s2DArray, c3, offsets, result, 1, bias); - texel += result; - - texel += textureGatherLodAMD(s2D, c2, lod); - texel += textureGatherLodAMD(s2DArray, c3, lod, 1); - texel += textureGatherLodAMD(sCube, c3, lod, 2); - texel += textureGatherLodAMD(sCubeArray, c4, lod, 3); - - texel += textureGatherLodOffsetAMD(s2D, c2, lod, offsets[0]); - texel += textureGatherLodOffsetAMD(s2DArray, c3, lod, offsets[1], 1); - - texel += textureGatherLodOffsetsAMD(s2D, c2, lod, offsets); - texel += textureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, 1); - - sparseTextureGatherLodAMD(s2D, c2, lod, result); - texel += result; - sparseTextureGatherLodAMD(s2DArray, c3, lod, result, 1); - texel += result; - sparseTextureGatherLodAMD(sCube, c3, lod, result, 2); - texel += result; - sparseTextureGatherLodAMD(sCubeArray, c4, lod, result, 2); - texel += result; - - sparseTextureGatherLodOffsetAMD(s2D, c2, lod, offsets[0], result); - texel += result; - sparseTextureGatherLodOffsetAMD(s2DArray, c3, lod, offsets[1], result, 1); - texel += result; - - sparseTextureGatherLodOffsetsAMD(s2D, c2, lod, offsets, result); - texel += result; - sparseTextureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, result, 1); - texel += result; - - fragColor = texel; -} +#version 450 core + +#extension GL_ARB_sparse_texture2: enable +#extension GL_AMD_texture_gather_bias_lod: enable + +uniform sampler2D s2D; +uniform sampler2DArray s2DArray; +uniform samplerCube sCube; +uniform samplerCubeArray sCubeArray; + +in vec2 c2; +in vec3 c3; +in vec4 c4; + +in float lod; +in float bias; + +out vec4 fragColor; + +void main() +{ + vec4 texel = vec4(0.0); + vec4 result = vec4(0.0); + + const ivec2 offsets[4] = { ivec2(0, 0), ivec2(0, 1), ivec2(1, 0), ivec2(1, 1) }; + + texel += textureGather(s2D, c2, 0, bias); + texel += textureGather(s2DArray, c3, 1, bias); + texel += textureGather(sCube, c3, 2, bias); + texel += textureGather(sCubeArray, c4, 3, bias); + + texel += textureGatherOffset(s2D, c2, offsets[0], 0, bias); + texel += textureGatherOffset(s2DArray, c3, offsets[1], 1, bias); + + texel += textureGatherOffsets(s2D, c2, offsets, 0, bias); + texel += textureGatherOffsets(s2DArray, c3, offsets, 1, bias); + + sparseTextureGatherARB(s2D, c2, result, 0, bias); + texel += result; + sparseTextureGatherARB(s2DArray, c3, result, 1, bias); + texel += result; + sparseTextureGatherARB(sCube, c3, result, 2, bias); + texel += result; + sparseTextureGatherARB(sCubeArray, c4, result, 2, bias); + texel += result; + + sparseTextureGatherOffsetARB(s2D, c2, offsets[0], result, 0, bias); + texel += result; + sparseTextureGatherOffsetARB(s2DArray, c3, offsets[1], result, 1, bias); + texel += result; + + sparseTextureGatherOffsetsARB(s2D, c2, offsets, result, 0, bias); + texel += result; + sparseTextureGatherOffsetsARB(s2DArray, c3, offsets, result, 1, bias); + texel += result; + + texel += textureGatherLodAMD(s2D, c2, lod); + texel += textureGatherLodAMD(s2DArray, c3, lod, 1); + texel += textureGatherLodAMD(sCube, c3, lod, 2); + texel += textureGatherLodAMD(sCubeArray, c4, lod, 3); + + texel += textureGatherLodOffsetAMD(s2D, c2, lod, offsets[0]); + texel += textureGatherLodOffsetAMD(s2DArray, c3, lod, offsets[1], 1); + + texel += textureGatherLodOffsetsAMD(s2D, c2, lod, offsets); + texel += textureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, 1); + + sparseTextureGatherLodAMD(s2D, c2, lod, result); + texel += result; + sparseTextureGatherLodAMD(s2DArray, c3, lod, result, 1); + texel += result; + sparseTextureGatherLodAMD(sCube, c3, lod, result, 2); + texel += result; + sparseTextureGatherLodAMD(sCubeArray, c4, lod, result, 2); + texel += result; + + sparseTextureGatherLodOffsetAMD(s2D, c2, lod, offsets[0], result); + texel += result; + sparseTextureGatherLodOffsetAMD(s2DArray, c3, lod, offsets[1], result, 1); + texel += result; + + sparseTextureGatherLodOffsetsAMD(s2D, c2, lod, offsets, result); + texel += result; + sparseTextureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, result, 1); + texel += result; + + fragColor = texel; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.texture.sampler.transform.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.texture.sampler.transform.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.texture.sampler.transform.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.texture.sampler.transform.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,13 +1,13 @@ -#version 440 - -uniform sampler smp; -uniform texture2D tex; - -in vec2 coord; - -out vec4 color; - -void main() -{ - color = texture(sampler2D(tex, smp), coord); -} +#version 440 + +uniform sampler smp; +uniform texture2D tex; + +in vec2 coord; + +out vec4 color; + +void main() +{ + color = texture(sampler2D(tex, smp), coord); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.texture.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.texture.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.texture.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.texture.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,39 +1,39 @@ -#version 140 - -uniform sampler1D texSampler1D; -uniform sampler2D texSampler2D; -uniform sampler3D texSampler3D; -uniform samplerCube texSamplerCube; -uniform sampler1DShadow shadowSampler1D; -uniform sampler2DShadow shadowSampler2D; - -in vec2 coords2D; - -void main() -{ - float lod = 3.0; - float coords1D = 1.789; - vec3 coords3D = vec3(1.789, 2.718, 3.453); - vec4 coords4D = vec4(1.789, 2.718, 3.453, 2.0); - vec4 color = vec4(0.0, 0.0, 0.0, 0.0); - - color += textureLod(texSampler1D, coords1D, lod); - color += textureProjLod(texSampler1D, coords2D, lod); - color += textureProjLod(texSampler1D, coords4D, lod); - - color += textureLod (texSampler2D, coords2D, lod); - color += textureProjLod (texSampler2D, coords3D, lod); - color += textureProjLod (texSampler2D, coords4D, lod); - - color += textureLod (texSampler3D, coords3D, lod); - color += textureProjLod (texSampler3D, coords4D, lod); - - color += textureLod (texSamplerCube, coords3D, lod); - - color += textureLod (shadowSampler1D, coords3D, lod); - color += textureLod (shadowSampler2D, coords3D, lod); - color += textureProjLod(shadowSampler1D, coords4D, lod); - color += textureProjLod(shadowSampler2D, coords4D, lod); - - gl_Position = color; -} +#version 140 + +uniform sampler1D texSampler1D; +uniform sampler2D texSampler2D; +uniform sampler3D texSampler3D; +uniform samplerCube texSamplerCube; +uniform sampler1DShadow shadowSampler1D; +uniform sampler2DShadow shadowSampler2D; + +in vec2 coords2D; + +void main() +{ + float lod = 3.0; + float coords1D = 1.789; + vec3 coords3D = vec3(1.789, 2.718, 3.453); + vec4 coords4D = vec4(1.789, 2.718, 3.453, 2.0); + vec4 color = vec4(0.0, 0.0, 0.0, 0.0); + + color += textureLod(texSampler1D, coords1D, lod); + color += textureProjLod(texSampler1D, coords2D, lod); + color += textureProjLod(texSampler1D, coords4D, lod); + + color += textureLod (texSampler2D, coords2D, lod); + color += textureProjLod (texSampler2D, coords3D, lod); + color += textureProjLod (texSampler2D, coords4D, lod); + + color += textureLod (texSampler3D, coords3D, lod); + color += textureProjLod (texSampler3D, coords4D, lod); + + color += textureLod (texSamplerCube, coords3D, lod); + + color += textureLod (shadowSampler1D, coords3D, lod); + color += textureLod (shadowSampler2D, coords3D, lod); + color += textureProjLod(shadowSampler1D, coords4D, lod); + color += textureProjLod(shadowSampler2D, coords4D, lod); + + gl_Position = color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.types.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.types.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.types.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.types.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,78 +1,78 @@ -#version 140 - -bool u_b; -bvec2 u_b2; -bvec3 u_b3; -bvec4 u_b4; -flat in int u_i; -flat in ivec2 u_i2; -flat in ivec3 u_i3; -flat in ivec4 u_i4; - in float u_f; - in vec2 u_f2; - in vec3 u_f3; - in vec4 u_f4; -bool i_b; -bvec2 i_b2; -bvec3 i_b3; -bvec4 i_b4; - -flat in int i_i; -flat in ivec2 i_i2; -flat in ivec3 i_i3; -flat in ivec4 i_i4; - -in float i_f; -in vec2 i_f2; -in vec3 i_f3; -in vec4 i_f4; - -void main() -{ - bool b = u_b && i_b; - bvec2 b2 = bvec2(u_b2.x && i_b2.x && u_b2.y && i_b2.y); - bvec3 b3 = bvec3(u_b3.x && i_b3.x && u_b3.y && i_b3.y && u_b3.z && i_b3.z); - bvec4 b4 = bvec4(u_b4.x && i_b4.x && u_b4.y && i_b4.y && u_b4.z && i_b4.z && u_b4.w && i_b4.w); - - int i = u_i + i_i; - ivec2 i2 = u_i2 + i_i2; - ivec3 i3 = u_i3 + i_i3; - ivec4 i4 = u_i4 + i_i4; - - float f = u_f + i_f; - vec2 f2 = u_f2 + i_f2; - vec3 f3 = u_f3 + i_f3; - vec4 f4 = u_f4 + i_f4; - - gl_FragColor = - b || - b2.x || - b2.y || - b3.x || - b3.y || - b3.z || - b4.x || - b4.y || - b4.z || - b4.w ? vec4( - i + - i2.x + - i2.y + - i3.x + - i3.y + - i3.z + - i4.x + - i4.y + - i4.z + - i4.w + - f + - f2.x + - f2.y + - f3.x + - f3.y + - f3.z + - f4.x + - f4.y + - f4.z + - f4.w) : vec4(1.0); -} +#version 140 + +bool u_b; +bvec2 u_b2; +bvec3 u_b3; +bvec4 u_b4; +flat in int u_i; +flat in ivec2 u_i2; +flat in ivec3 u_i3; +flat in ivec4 u_i4; + in float u_f; + in vec2 u_f2; + in vec3 u_f3; + in vec4 u_f4; +bool i_b; +bvec2 i_b2; +bvec3 i_b3; +bvec4 i_b4; + +flat in int i_i; +flat in ivec2 i_i2; +flat in ivec3 i_i3; +flat in ivec4 i_i4; + +in float i_f; +in vec2 i_f2; +in vec3 i_f3; +in vec4 i_f4; + +void main() +{ + bool b = u_b && i_b; + bvec2 b2 = bvec2(u_b2.x && i_b2.x && u_b2.y && i_b2.y); + bvec3 b3 = bvec3(u_b3.x && i_b3.x && u_b3.y && i_b3.y && u_b3.z && i_b3.z); + bvec4 b4 = bvec4(u_b4.x && i_b4.x && u_b4.y && i_b4.y && u_b4.z && i_b4.z && u_b4.w && i_b4.w); + + int i = u_i + i_i; + ivec2 i2 = u_i2 + i_i2; + ivec3 i3 = u_i3 + i_i3; + ivec4 i4 = u_i4 + i_i4; + + float f = u_f + i_f; + vec2 f2 = u_f2 + i_f2; + vec3 f3 = u_f3 + i_f3; + vec4 f4 = u_f4 + i_f4; + + gl_FragColor = + b || + b2.x || + b2.y || + b3.x || + b3.y || + b3.z || + b4.x || + b4.y || + b4.z || + b4.w ? vec4( + i + + i2.x + + i2.y + + i3.x + + i3.y + + i3.z + + i4.x + + i4.y + + i4.z + + i4.w + + f + + f2.x + + f2.y + + f3.x + + f3.y + + f3.z + + f4.x + + f4.y + + f4.z + + f4.w) : vec4(1.0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.uint.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.uint.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.uint.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.uint.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,102 +1,102 @@ -#version 310 es -precision mediump float; -flat in uvec2 t; -in float f; -in vec2 tc; - -flat in uvec4 v; -flat in int i; -bool b; - -out uvec4 c; - -uniform mediump usampler2D usampler; - -void main() -{ - int count = 1; - - uint u = t.y + 3u; - const uint cu1 = 0xFFFFFFFFU; - const uint cu2 = -1u; // 0xFFFFFFFF - const uint cu3 = 1U; - const uint cu4 = 1u; - - if (cu1 == cu2) - count *= 2; // 2 - if (cu3 == cu4) - count *= 3; // 6 - if (cu2 == cu3) - count *= 5; // not done - - const int cshiftedii = 0xFFFFFFFF >> 10; - const uint cushiftedui = 0xFFFFFFFFu >> 10; - const int cshiftediu = 0xFFFFFFFF >> 10u; - const uint cushifteduu = 0xFFFFFFFFu >> 10u; - - if (cshiftedii == cshiftediu) - count *= 7; // 42 - if (cushiftedui == cushifteduu) - count *= 11; // 462 - if (cshiftedii == int(cushiftedui)) - count *= 13; // not done - - int shiftedii = 0xFFFFFFFF >> 10; - uint shiftedui = 0xFFFFFFFFu >> 10; - int shiftediu = 0xFFFFFFFF >> 10u; - uint shifteduu = 0xFFFFFFFFu >> 10u; - - if (shiftedii == shiftediu) - c = texture(usampler, tc); - if (shiftedui == shifteduu) - c = texture(usampler, tc + float(1u)); - if (shiftedii == int(shiftedui)) - c = texture(usampler, tc - vec2(2u)); - - if (t.x > 4u) { - float af = float(u); - bool ab = bool(u); - int ai = int(u); - - c += uvec4(uint(af), uint(ab), uint(ai), count); - } - - const uint cmask1 = 0x0A1u; - const uint cmask2 = 0xA10u; - const uint cmask3 = cmask1 << 4; - const uint cmask4 = 0xAB1u; - - if (cmask3 == cmask2) - count *= 17; // 7854 - - if ((cmask3 & cmask1) != 0u) - count *= 19; // not done - - if ((cmask1 | cmask3) == cmask4) - count *= 23; // 180642 - - if ((cmask1 ^ cmask4) == 0xA10u) - count *= 27; // 4877334 - - uint mask1 = 0x0A1u; - uint mask2 = 0xA10u; - uint mask3 = mask1 << 4; - uint mask4 = 0xAB1u; - - if (mask3 == mask2) - count *= 2; // 9754668 - - if ((mask3 & mask1) != 0u) - count *= 3; // not done - - if ((mask1 | mask3) == mask4) - count *= 5; // 48773340 - - if ((mask1 ^ mask4) == 0xA10u) - count *= 7; // 341413380 - - c += uvec4(count); - - #define UINT_MAX 4294967295u - c.x += UINT_MAX; -} +#version 310 es +precision mediump float; +flat in uvec2 t; +in float f; +in vec2 tc; + +flat in uvec4 v; +flat in int i; +bool b; + +out uvec4 c; + +uniform mediump usampler2D usampler; + +void main() +{ + int count = 1; + + uint u = t.y + 3u; + const uint cu1 = 0xFFFFFFFFU; + const uint cu2 = -1u; // 0xFFFFFFFF + const uint cu3 = 1U; + const uint cu4 = 1u; + + if (cu1 == cu2) + count *= 2; // 2 + if (cu3 == cu4) + count *= 3; // 6 + if (cu2 == cu3) + count *= 5; // not done + + const int cshiftedii = 0xFFFFFFFF >> 10; + const uint cushiftedui = 0xFFFFFFFFu >> 10; + const int cshiftediu = 0xFFFFFFFF >> 10u; + const uint cushifteduu = 0xFFFFFFFFu >> 10u; + + if (cshiftedii == cshiftediu) + count *= 7; // 42 + if (cushiftedui == cushifteduu) + count *= 11; // 462 + if (cshiftedii == int(cushiftedui)) + count *= 13; // not done + + int shiftedii = 0xFFFFFFFF >> 10; + uint shiftedui = 0xFFFFFFFFu >> 10; + int shiftediu = 0xFFFFFFFF >> 10u; + uint shifteduu = 0xFFFFFFFFu >> 10u; + + if (shiftedii == shiftediu) + c = texture(usampler, tc); + if (shiftedui == shifteduu) + c = texture(usampler, tc + float(1u)); + if (shiftedii == int(shiftedui)) + c = texture(usampler, tc - vec2(2u)); + + if (t.x > 4u) { + float af = float(u); + bool ab = bool(u); + int ai = int(u); + + c += uvec4(uint(af), uint(ab), uint(ai), count); + } + + const uint cmask1 = 0x0A1u; + const uint cmask2 = 0xA10u; + const uint cmask3 = cmask1 << 4; + const uint cmask4 = 0xAB1u; + + if (cmask3 == cmask2) + count *= 17; // 7854 + + if ((cmask3 & cmask1) != 0u) + count *= 19; // not done + + if ((cmask1 | cmask3) == cmask4) + count *= 23; // 180642 + + if ((cmask1 ^ cmask4) == 0xA10u) + count *= 27; // 4877334 + + uint mask1 = 0x0A1u; + uint mask2 = 0xA10u; + uint mask3 = mask1 << 4; + uint mask4 = 0xAB1u; + + if (mask3 == mask2) + count *= 2; // 9754668 + + if ((mask3 & mask1) != 0u) + count *= 3; // not done + + if ((mask1 | mask3) == mask4) + count *= 5; // 48773340 + + if ((mask1 ^ mask4) == 0xA10u) + count *= 7; // 341413380 + + c += uvec4(count); + + #define UINT_MAX 4294967295u + c.x += UINT_MAX; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.uniformArray.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.uniformArray.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.uniformArray.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.uniformArray.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,17 +1,17 @@ -#version 140 - -uniform sampler2D texSampler2D; -in vec3 inColor; -in vec4 color[6]; -in float alpha[16]; - -void main() -{ - vec4 texColor = color[1] + color[1]; - - texColor.xyz += inColor; - - texColor.a += alpha[12]; - - gl_FragColor = texColor; -} +#version 140 + +uniform sampler2D texSampler2D; +in vec3 inColor; +in vec4 color[6]; +in float alpha[16]; + +void main() +{ + vec4 texColor = color[1] + color[1]; + + texColor.xyz += inColor; + + texColor.a += alpha[12]; + + gl_FragColor = texColor; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.variableArrayIndex.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.variableArrayIndex.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.variableArrayIndex.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.variableArrayIndex.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,49 +1,49 @@ -#version 400 - -uniform sampler2D samp2D; -in vec2 coord; - -struct lunarStruct1 { - int i; - float f; -}; - -struct lunarStruct2 { - int i; - float f; - lunarStruct1 s1_1; -}; - -struct lunarStruct3 { - lunarStruct2 s2_1[3]; - int i; - float f; - lunarStruct1 s1_1; -}; - - -flat in lunarStruct1 foo; -flat in lunarStruct2 foo2[5]; -flat in lunarStruct3 foo3; -flat in int Count; - -void main() -{ - float scale; - int iLocal = Count; - - if (foo3.s2_1[1].i > 0) - scale = foo2[foo3.s2_1[foo.i].i + 2 + ++iLocal].s1_1.f; - else - scale = foo3.s2_1[0].s1_1.f; - - //for (int i = 0; i < iLocal; ++i) { - // scale += foo2[i].f; - //} - - gl_FragColor = scale * texture(samp2D, coord); - - vec2[3] constructed = vec2[3](coord, vec2(scale), vec2(1.0, 2.0)); - gl_FragColor += vec4(constructed[foo.i], constructed[foo.i]); -} - +#version 400 + +uniform sampler2D samp2D; +in vec2 coord; + +struct lunarStruct1 { + int i; + float f; +}; + +struct lunarStruct2 { + int i; + float f; + lunarStruct1 s1_1; +}; + +struct lunarStruct3 { + lunarStruct2 s2_1[3]; + int i; + float f; + lunarStruct1 s1_1; +}; + + +flat in lunarStruct1 foo; +flat in lunarStruct2 foo2[5]; +flat in lunarStruct3 foo3; +flat in int Count; + +void main() +{ + float scale; + int iLocal = Count; + + if (foo3.s2_1[1].i > 0) + scale = foo2[foo3.s2_1[foo.i].i + 2 + ++iLocal].s1_1.f; + else + scale = foo3.s2_1[0].s1_1.f; + + //for (int i = 0; i < iLocal; ++i) { + // scale += foo2[i].f; + //} + + gl_FragColor = scale * texture(samp2D, coord); + + vec2[3] constructed = vec2[3](coord, vec2(scale), vec2(1.0, 2.0)); + gl_FragColor += vec4(constructed[foo.i], constructed[foo.i]); +} + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.varyingArray.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.varyingArray.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.varyingArray.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.varyingArray.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,19 +1,19 @@ -#version 140 -uniform sampler2D texSampler2D; -in vec4 color; -in float alpha; - -in vec4 TexCoord[6]; - -in vec4 foo[3]; - -void main() -{ - vec4 texColor = texture(texSampler2D, vec2(TexCoord[4] + TexCoord[5])); - - texColor += color; - - texColor.a = alpha; - - gl_FragColor = foo[1] + TexCoord[0] + TexCoord[4] + texColor; -} +#version 140 +uniform sampler2D texSampler2D; +in vec4 color; +in float alpha; + +in vec4 TexCoord[6]; + +in vec4 foo[3]; + +void main() +{ + vec4 texColor = texture(texSampler2D, vec2(TexCoord[4] + TexCoord[5])); + + texColor += color; + + texColor.a = alpha; + + gl_FragColor = foo[1] + TexCoord[0] + TexCoord[4] + texColor; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.varyingArrayIndirect.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.varyingArrayIndirect.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.varyingArrayIndirect.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.varyingArrayIndirect.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,21 +1,21 @@ -#version 140 -uniform sampler2D texSampler2D; -in vec4 color; -in float alpha; - -in vec4 TexCoord[6]; - -in vec4 userIn[2]; - -flat in int a, b; - -void main() -{ - vec4 texColor = texture(texSampler2D, vec2(userIn[b] + TexCoord[a] + TexCoord[5])); - - texColor += color; - - texColor.a = alpha; - - gl_FragColor = TexCoord[0] + TexCoord[b] + texColor + userIn[a]; -} +#version 140 +uniform sampler2D texSampler2D; +in vec4 color; +in float alpha; + +in vec4 TexCoord[6]; + +in vec4 userIn[2]; + +flat in int a, b; + +void main() +{ + vec4 texColor = texture(texSampler2D, vec2(userIn[b] + TexCoord[a] + TexCoord[5])); + + texColor += color; + + texColor.a = alpha; + + gl_FragColor = TexCoord[0] + TexCoord[b] + texColor + userIn[a]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.vecMatConstruct.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.vecMatConstruct.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.vecMatConstruct.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.vecMatConstruct.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,14 @@ +#version 450 + +void main() +{ + mat4x3 m; + + vec2 v2 = vec2(m); + vec3 v3 = vec3(m); + vec4 v4 = vec4(m); + + ivec2 iv2 = ivec2(m); + ivec3 iv3 = ivec3(m); + ivec4 iv4 = ivec4(m); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.viewportArray2.tesc vulkan-1.1.73+dfsg/external/glslang/Test/spv.viewportArray2.tesc --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.viewportArray2.tesc 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.viewportArray2.tesc 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,16 @@ -#version 450 -#extension GL_NV_viewport_array2 :require - -layout(vertices = 4) out; - -out gl_PerVertex { - int gl_ViewportMask[2]; -} gl_out[4]; - -layout (viewport_relative) out highp int gl_Layer; - -void main() -{ - gl_out[gl_InvocationID].gl_ViewportMask[0] = 1; - gl_ViewportIndex = 2; -} +#version 450 +#extension GL_NV_viewport_array2 :require + +layout(vertices = 4) out; + +out gl_PerVertex { + int gl_ViewportMask[2]; +} gl_out[4]; + +layout (viewport_relative) out highp int gl_Layer; + +void main() +{ + gl_out[gl_InvocationID].gl_ViewportMask[0] = 1; + gl_ViewportIndex = 2; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.voidFunction.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.voidFunction.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.voidFunction.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.voidFunction.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,34 +1,34 @@ -#version 400 - -in vec4 bigColor; -in vec4 BaseColor; -in float d; - -float bar = 2.0; - -void foo() -{ - bar++; - - return; -} - -void foo2() -{ - bar++; -} - -void main() -{ - vec4 outColor = bigColor; - - foo(); - - foo2(); - - outColor.x += bar; - - gl_FragColor = outColor; - - return; -} +#version 400 + +in vec4 bigColor; +in vec4 BaseColor; +in float d; + +float bar = 2.0; + +void foo() +{ + bar++; + + return; +} + +void foo2() +{ + bar++; +} + +void main() +{ + vec4 outColor = bigColor; + + foo(); + + foo2(); + + outColor.x += bar; + + gl_FragColor = outColor; + + return; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.vulkan100.subgroupArithmetic.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.vulkan100.subgroupArithmetic.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.vulkan100.subgroupArithmetic.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.vulkan100.subgroupArithmetic.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,393 @@ +#version 450 + +#extension GL_KHR_shader_subgroup_arithmetic: enable + +layout (local_size_x = 8) in; + +layout(binding = 0) buffer Buffers +{ + vec4 f4; + ivec4 i4; + uvec4 u4; + dvec4 d4; +} data[4]; + +void main() +{ + uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4; + + data[invocation].f4.x = subgroupAdd(data[0].f4.x); + data[invocation].f4.xy = subgroupAdd(data[1].f4.xy); + data[invocation].f4.xyz = subgroupAdd(data[2].f4.xyz); + data[invocation].f4 = subgroupAdd(data[3].f4); + + data[invocation].i4.x = subgroupAdd(data[0].i4.x); + data[invocation].i4.xy = subgroupAdd(data[1].i4.xy); + data[invocation].i4.xyz = subgroupAdd(data[2].i4.xyz); + data[invocation].i4 = subgroupAdd(data[3].i4); + + data[invocation].u4.x = subgroupAdd(data[0].u4.x); + data[invocation].u4.xy = subgroupAdd(data[1].u4.xy); + data[invocation].u4.xyz = subgroupAdd(data[2].u4.xyz); + data[invocation].u4 = subgroupAdd(data[3].u4); + + data[invocation].d4.x = subgroupAdd(data[0].d4.x); + data[invocation].d4.xy = subgroupAdd(data[1].d4.xy); + data[invocation].d4.xyz = subgroupAdd(data[2].d4.xyz); + data[invocation].d4 = subgroupAdd(data[3].d4); + + data[invocation].f4.x = subgroupMul(data[0].f4.x); + data[invocation].f4.xy = subgroupMul(data[1].f4.xy); + data[invocation].f4.xyz = subgroupMul(data[2].f4.xyz); + data[invocation].f4 = subgroupMul(data[3].f4); + + data[invocation].i4.x = subgroupMul(data[0].i4.x); + data[invocation].i4.xy = subgroupMul(data[1].i4.xy); + data[invocation].i4.xyz = subgroupMul(data[2].i4.xyz); + data[invocation].i4 = subgroupMul(data[3].i4); + + data[invocation].u4.x = subgroupMul(data[0].u4.x); + data[invocation].u4.xy = subgroupMul(data[1].u4.xy); + data[invocation].u4.xyz = subgroupMul(data[2].u4.xyz); + data[invocation].u4 = subgroupMul(data[3].u4); + + data[invocation].d4.x = subgroupMul(data[0].d4.x); + data[invocation].d4.xy = subgroupMul(data[1].d4.xy); + data[invocation].d4.xyz = subgroupMul(data[2].d4.xyz); + data[invocation].d4 = subgroupMul(data[3].d4); + + data[invocation].f4.x = subgroupMin(data[0].f4.x); + data[invocation].f4.xy = subgroupMin(data[1].f4.xy); + data[invocation].f4.xyz = subgroupMin(data[2].f4.xyz); + data[invocation].f4 = subgroupMin(data[3].f4); + + data[invocation].i4.x = subgroupMin(data[0].i4.x); + data[invocation].i4.xy = subgroupMin(data[1].i4.xy); + data[invocation].i4.xyz = subgroupMin(data[2].i4.xyz); + data[invocation].i4 = subgroupMin(data[3].i4); + + data[invocation].u4.x = subgroupMin(data[0].u4.x); + data[invocation].u4.xy = subgroupMin(data[1].u4.xy); + data[invocation].u4.xyz = subgroupMin(data[2].u4.xyz); + data[invocation].u4 = subgroupMin(data[3].u4); + + data[invocation].d4.x = subgroupMin(data[0].d4.x); + data[invocation].d4.xy = subgroupMin(data[1].d4.xy); + data[invocation].d4.xyz = subgroupMin(data[2].d4.xyz); + data[invocation].d4 = subgroupMin(data[3].d4); + + data[invocation].f4.x = subgroupMax(data[0].f4.x); + data[invocation].f4.xy = subgroupMax(data[1].f4.xy); + data[invocation].f4.xyz = subgroupMax(data[2].f4.xyz); + data[invocation].f4 = subgroupMax(data[3].f4); + + data[invocation].i4.x = subgroupMax(data[0].i4.x); + data[invocation].i4.xy = subgroupMax(data[1].i4.xy); + data[invocation].i4.xyz = subgroupMax(data[2].i4.xyz); + data[invocation].i4 = subgroupMax(data[3].i4); + + data[invocation].u4.x = subgroupMax(data[0].u4.x); + data[invocation].u4.xy = subgroupMax(data[1].u4.xy); + data[invocation].u4.xyz = subgroupMax(data[2].u4.xyz); + data[invocation].u4 = subgroupMax(data[3].u4); + + data[invocation].d4.x = subgroupMax(data[0].d4.x); + data[invocation].d4.xy = subgroupMax(data[1].d4.xy); + data[invocation].d4.xyz = subgroupMax(data[2].d4.xyz); + data[invocation].d4 = subgroupMax(data[3].d4); + + data[invocation].i4.x = subgroupAnd(data[0].i4.x); + data[invocation].i4.xy = subgroupAnd(data[1].i4.xy); + data[invocation].i4.xyz = subgroupAnd(data[2].i4.xyz); + data[invocation].i4 = subgroupAnd(data[3].i4); + + data[invocation].u4.x = subgroupAnd(data[0].u4.x); + data[invocation].u4.xy = subgroupAnd(data[1].u4.xy); + data[invocation].u4.xyz = subgroupAnd(data[2].u4.xyz); + data[invocation].u4 = subgroupAnd(data[3].u4); + + data[invocation].i4.x = int(subgroupAnd(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupAnd(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupAnd(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupAnd(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].i4.x = subgroupOr(data[0].i4.x); + data[invocation].i4.xy = subgroupOr(data[1].i4.xy); + data[invocation].i4.xyz = subgroupOr(data[2].i4.xyz); + data[invocation].i4 = subgroupOr(data[3].i4); + + data[invocation].u4.x = subgroupOr(data[0].u4.x); + data[invocation].u4.xy = subgroupOr(data[1].u4.xy); + data[invocation].u4.xyz = subgroupOr(data[2].u4.xyz); + data[invocation].u4 = subgroupOr(data[3].u4); + + data[invocation].i4.x = int(subgroupOr(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupOr(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupOr(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupOr(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].i4.x = subgroupXor(data[0].i4.x); + data[invocation].i4.xy = subgroupXor(data[1].i4.xy); + data[invocation].i4.xyz = subgroupXor(data[2].i4.xyz); + data[invocation].i4 = subgroupXor(data[3].i4); + + data[invocation].u4.x = subgroupXor(data[0].u4.x); + data[invocation].u4.xy = subgroupXor(data[1].u4.xy); + data[invocation].u4.xyz = subgroupXor(data[2].u4.xyz); + data[invocation].u4 = subgroupXor(data[3].u4); + + data[invocation].i4.x = int(subgroupXor(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupXor(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupXor(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupXor(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].f4.x = subgroupInclusiveAdd(data[0].f4.x); + data[invocation].f4.xy = subgroupInclusiveAdd(data[1].f4.xy); + data[invocation].f4.xyz = subgroupInclusiveAdd(data[2].f4.xyz); + data[invocation].f4 = subgroupInclusiveAdd(data[3].f4); + + data[invocation].i4.x = subgroupInclusiveAdd(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveAdd(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveAdd(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveAdd(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveAdd(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveAdd(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveAdd(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveAdd(data[3].u4); + + data[invocation].d4.x = subgroupInclusiveAdd(data[0].d4.x); + data[invocation].d4.xy = subgroupInclusiveAdd(data[1].d4.xy); + data[invocation].d4.xyz = subgroupInclusiveAdd(data[2].d4.xyz); + data[invocation].d4 = subgroupInclusiveAdd(data[3].d4); + + data[invocation].f4.x = subgroupInclusiveMul(data[0].f4.x); + data[invocation].f4.xy = subgroupInclusiveMul(data[1].f4.xy); + data[invocation].f4.xyz = subgroupInclusiveMul(data[2].f4.xyz); + data[invocation].f4 = subgroupInclusiveMul(data[3].f4); + + data[invocation].i4.x = subgroupInclusiveMul(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveMul(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveMul(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveMul(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveMul(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveMul(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveMul(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveMul(data[3].u4); + + data[invocation].d4.x = subgroupInclusiveMul(data[0].d4.x); + data[invocation].d4.xy = subgroupInclusiveMul(data[1].d4.xy); + data[invocation].d4.xyz = subgroupInclusiveMul(data[2].d4.xyz); + data[invocation].d4 = subgroupInclusiveMul(data[3].d4); + + data[invocation].f4.x = subgroupInclusiveMin(data[0].f4.x); + data[invocation].f4.xy = subgroupInclusiveMin(data[1].f4.xy); + data[invocation].f4.xyz = subgroupInclusiveMin(data[2].f4.xyz); + data[invocation].f4 = subgroupInclusiveMin(data[3].f4); + + data[invocation].i4.x = subgroupInclusiveMin(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveMin(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveMin(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveMin(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveMin(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveMin(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveMin(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveMin(data[3].u4); + + data[invocation].d4.x = subgroupInclusiveMin(data[0].d4.x); + data[invocation].d4.xy = subgroupInclusiveMin(data[1].d4.xy); + data[invocation].d4.xyz = subgroupInclusiveMin(data[2].d4.xyz); + data[invocation].d4 = subgroupInclusiveMin(data[3].d4); + + data[invocation].f4.x = subgroupInclusiveMax(data[0].f4.x); + data[invocation].f4.xy = subgroupInclusiveMax(data[1].f4.xy); + data[invocation].f4.xyz = subgroupInclusiveMax(data[2].f4.xyz); + data[invocation].f4 = subgroupInclusiveMax(data[3].f4); + + data[invocation].i4.x = subgroupInclusiveMax(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveMax(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveMax(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveMax(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveMax(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveMax(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveMax(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveMax(data[3].u4); + + data[invocation].d4.x = subgroupInclusiveMax(data[0].d4.x); + data[invocation].d4.xy = subgroupInclusiveMax(data[1].d4.xy); + data[invocation].d4.xyz = subgroupInclusiveMax(data[2].d4.xyz); + data[invocation].d4 = subgroupInclusiveMax(data[3].d4); + + data[invocation].i4.x = subgroupInclusiveAnd(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveAnd(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveAnd(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveAnd(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveAnd(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveAnd(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveAnd(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveAnd(data[3].u4); + + data[invocation].i4.x = int(subgroupInclusiveAnd(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupInclusiveAnd(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupInclusiveAnd(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupInclusiveAnd(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].i4.x = subgroupInclusiveOr(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveOr(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveOr(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveOr(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveOr(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveOr(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveOr(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveOr(data[3].u4); + + data[invocation].i4.x = int(subgroupInclusiveOr(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupInclusiveOr(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupInclusiveOr(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupInclusiveOr(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].i4.x = subgroupInclusiveXor(data[0].i4.x); + data[invocation].i4.xy = subgroupInclusiveXor(data[1].i4.xy); + data[invocation].i4.xyz = subgroupInclusiveXor(data[2].i4.xyz); + data[invocation].i4 = subgroupInclusiveXor(data[3].i4); + + data[invocation].u4.x = subgroupInclusiveXor(data[0].u4.x); + data[invocation].u4.xy = subgroupInclusiveXor(data[1].u4.xy); + data[invocation].u4.xyz = subgroupInclusiveXor(data[2].u4.xyz); + data[invocation].u4 = subgroupInclusiveXor(data[3].u4); + + data[invocation].i4.x = int(subgroupInclusiveXor(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupInclusiveXor(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupInclusiveXor(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupInclusiveXor(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].f4.x = subgroupExclusiveAdd(data[0].f4.x); + data[invocation].f4.xy = subgroupExclusiveAdd(data[1].f4.xy); + data[invocation].f4.xyz = subgroupExclusiveAdd(data[2].f4.xyz); + data[invocation].f4 = subgroupExclusiveAdd(data[3].f4); + + data[invocation].i4.x = subgroupExclusiveAdd(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveAdd(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveAdd(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveAdd(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveAdd(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveAdd(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveAdd(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveAdd(data[3].u4); + + data[invocation].d4.x = subgroupExclusiveAdd(data[0].d4.x); + data[invocation].d4.xy = subgroupExclusiveAdd(data[1].d4.xy); + data[invocation].d4.xyz = subgroupExclusiveAdd(data[2].d4.xyz); + data[invocation].d4 = subgroupExclusiveAdd(data[3].d4); + + data[invocation].f4.x = subgroupExclusiveMul(data[0].f4.x); + data[invocation].f4.xy = subgroupExclusiveMul(data[1].f4.xy); + data[invocation].f4.xyz = subgroupExclusiveMul(data[2].f4.xyz); + data[invocation].f4 = subgroupExclusiveMul(data[3].f4); + + data[invocation].i4.x = subgroupExclusiveMul(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveMul(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveMul(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveMul(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveMul(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveMul(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveMul(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveMul(data[3].u4); + + data[invocation].d4.x = subgroupExclusiveMul(data[0].d4.x); + data[invocation].d4.xy = subgroupExclusiveMul(data[1].d4.xy); + data[invocation].d4.xyz = subgroupExclusiveMul(data[2].d4.xyz); + data[invocation].d4 = subgroupExclusiveMul(data[3].d4); + + data[invocation].f4.x = subgroupExclusiveMin(data[0].f4.x); + data[invocation].f4.xy = subgroupExclusiveMin(data[1].f4.xy); + data[invocation].f4.xyz = subgroupExclusiveMin(data[2].f4.xyz); + data[invocation].f4 = subgroupExclusiveMin(data[3].f4); + + data[invocation].i4.x = subgroupExclusiveMin(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveMin(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveMin(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveMin(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveMin(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveMin(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveMin(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveMin(data[3].u4); + + data[invocation].d4.x = subgroupExclusiveMin(data[0].d4.x); + data[invocation].d4.xy = subgroupExclusiveMin(data[1].d4.xy); + data[invocation].d4.xyz = subgroupExclusiveMin(data[2].d4.xyz); + data[invocation].d4 = subgroupExclusiveMin(data[3].d4); + + data[invocation].f4.x = subgroupExclusiveMax(data[0].f4.x); + data[invocation].f4.xy = subgroupExclusiveMax(data[1].f4.xy); + data[invocation].f4.xyz = subgroupExclusiveMax(data[2].f4.xyz); + data[invocation].f4 = subgroupExclusiveMax(data[3].f4); + + data[invocation].i4.x = subgroupExclusiveMax(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveMax(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveMax(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveMax(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveMax(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveMax(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveMax(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveMax(data[3].u4); + + data[invocation].d4.x = subgroupExclusiveMax(data[0].d4.x); + data[invocation].d4.xy = subgroupExclusiveMax(data[1].d4.xy); + data[invocation].d4.xyz = subgroupExclusiveMax(data[2].d4.xyz); + data[invocation].d4 = subgroupExclusiveMax(data[3].d4); + + data[invocation].i4.x = subgroupExclusiveAnd(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveAnd(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveAnd(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveAnd(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveAnd(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveAnd(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveAnd(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveAnd(data[3].u4); + + data[invocation].i4.x = int(subgroupExclusiveAnd(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupExclusiveAnd(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupExclusiveAnd(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupExclusiveAnd(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].i4.x = subgroupExclusiveOr(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveOr(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveOr(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveOr(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveOr(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveOr(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveOr(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveOr(data[3].u4); + + data[invocation].i4.x = int(subgroupExclusiveOr(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupExclusiveOr(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupExclusiveOr(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupExclusiveOr(lessThan(data[1].i4, ivec4(0)))); + + data[invocation].i4.x = subgroupExclusiveXor(data[0].i4.x); + data[invocation].i4.xy = subgroupExclusiveXor(data[1].i4.xy); + data[invocation].i4.xyz = subgroupExclusiveXor(data[2].i4.xyz); + data[invocation].i4 = subgroupExclusiveXor(data[3].i4); + + data[invocation].u4.x = subgroupExclusiveXor(data[0].u4.x); + data[invocation].u4.xy = subgroupExclusiveXor(data[1].u4.xy); + data[invocation].u4.xyz = subgroupExclusiveXor(data[2].u4.xyz); + data[invocation].u4 = subgroupExclusiveXor(data[3].u4); + + data[invocation].i4.x = int(subgroupExclusiveXor(data[0].i4.x < 0)); + data[invocation].i4.xy = ivec2(subgroupExclusiveXor(lessThan(data[1].i4.xy, ivec2(0)))); + data[invocation].i4.xyz = ivec3(subgroupExclusiveXor(lessThan(data[1].i4.xyz, ivec3(0)))); + data[invocation].i4 = ivec4(subgroupExclusiveXor(lessThan(data[1].i4, ivec4(0)))); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.vulkan100.subgroupPartitioned.comp vulkan-1.1.73+dfsg/external/glslang/Test/spv.vulkan100.subgroupPartitioned.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.vulkan100.subgroupPartitioned.comp 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.vulkan100.subgroupPartitioned.comp 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,420 @@ +#version 450 + +#extension GL_NV_shader_subgroup_partitioned: enable + +layout (local_size_x = 8) in; + +layout(binding = 0) buffer Buffers +{ + vec4 f4; + ivec4 i4; + uvec4 u4; + dvec4 d4; +} data[4]; + +void main() +{ + uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4; + + uvec4 ballot = subgroupPartitionNV(invocation); + + data[invocation].u4 = subgroupPartitionNV(data[0].f4.x); + data[invocation].u4 = subgroupPartitionNV(data[0].f4.xy); + data[invocation].u4 = subgroupPartitionNV(data[0].f4.xyz); + data[invocation].u4 = subgroupPartitionNV(data[0].f4); + + data[invocation].u4 = subgroupPartitionNV(data[0].i4.x); + data[invocation].u4 = subgroupPartitionNV(data[0].i4.xy); + data[invocation].u4 = subgroupPartitionNV(data[0].i4.xyz); + data[invocation].u4 = subgroupPartitionNV(data[0].i4); + + data[invocation].u4 = subgroupPartitionNV(data[0].u4.x); + data[invocation].u4 = subgroupPartitionNV(data[0].u4.xy); + data[invocation].u4 = subgroupPartitionNV(data[0].u4.xyz); + data[invocation].u4 = subgroupPartitionNV(data[0].u4); + + data[invocation].u4 = subgroupPartitionNV(data[0].d4.x); + data[invocation].u4 = subgroupPartitionNV(data[0].d4.xy); + data[invocation].u4 = subgroupPartitionNV(data[0].d4.xyz); + data[invocation].u4 = subgroupPartitionNV(data[0].d4); + + data[invocation].u4 = subgroupPartitionNV(bool(data[0].i4.x)); + data[invocation].u4 = subgroupPartitionNV(bvec2(data[0].i4.xy)); + data[invocation].u4 = subgroupPartitionNV(bvec3(data[0].i4.xyz)); + data[invocation].u4 = subgroupPartitionNV(bvec4(data[0].i4)); + + data[invocation].f4.x = subgroupPartitionedAddNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedAddNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedAddNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedAddNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedAddNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedAddNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedAddNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedAddNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedAddNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedAddNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedAddNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedAddNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedAddNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedAddNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedAddNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedAddNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedMulNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedMulNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedMulNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedMulNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedMulNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedMulNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedMulNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedMulNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedMulNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedMulNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedMulNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedMulNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedMulNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedMulNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedMulNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedMulNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedMinNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedMinNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedMinNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedMinNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedMinNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedMinNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedMinNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedMinNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedMinNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedMinNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedMinNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedMinNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedMinNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedMinNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedMinNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedMinNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedMaxNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedMaxNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedMaxNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedMaxNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedMaxNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedMaxNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedMaxNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedMaxNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedMaxNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedMaxNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedMaxNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedMaxNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedMaxNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedMaxNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedMaxNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedMaxNV(data[3].d4, ballot); + + data[invocation].i4.x = subgroupPartitionedAndNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedAndNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedAndNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedAndNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedAndNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedAndNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedAndNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedAndNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedAndNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedAndNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedAndNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedAndNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].i4.x = subgroupPartitionedOrNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedOrNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedOrNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedOrNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedOrNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedOrNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedOrNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedOrNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedOrNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedOrNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedOrNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedOrNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].i4.x = subgroupPartitionedXorNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedXorNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedXorNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedXorNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedXorNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedXorNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedXorNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedXorNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedXorNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedXorNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedXorNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedXorNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].f4.x = subgroupPartitionedInclusiveAddNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedInclusiveAddNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedInclusiveAddNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedInclusiveAddNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedInclusiveAddNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveAddNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveAddNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveAddNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveAddNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveAddNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveAddNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveAddNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedInclusiveAddNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedInclusiveAddNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedInclusiveAddNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedInclusiveAddNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedInclusiveMulNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedInclusiveMulNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedInclusiveMulNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedInclusiveMulNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedInclusiveMulNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveMulNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveMulNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveMulNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveMulNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveMulNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveMulNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveMulNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedInclusiveMulNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedInclusiveMulNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedInclusiveMulNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedInclusiveMulNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedInclusiveMinNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedInclusiveMinNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedInclusiveMinNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedInclusiveMinNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedInclusiveMinNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveMinNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveMinNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveMinNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveMinNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveMinNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveMinNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveMinNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedInclusiveMinNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedInclusiveMinNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedInclusiveMinNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedInclusiveMinNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedInclusiveMaxNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedInclusiveMaxNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedInclusiveMaxNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedInclusiveMaxNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveMaxNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveMaxNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveMaxNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveMaxNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveMaxNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedInclusiveMaxNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedInclusiveMaxNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedInclusiveMaxNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedInclusiveMaxNV(data[3].d4, ballot); + + data[invocation].i4.x = subgroupPartitionedInclusiveAndNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveAndNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveAndNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveAndNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveAndNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveAndNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveAndNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveAndNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedInclusiveAndNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedInclusiveAndNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedInclusiveAndNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedInclusiveAndNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].i4.x = subgroupPartitionedInclusiveOrNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveOrNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveOrNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveOrNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveOrNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveOrNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveOrNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveOrNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedInclusiveOrNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedInclusiveOrNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedInclusiveOrNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedInclusiveOrNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].i4.x = subgroupPartitionedInclusiveXorNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedInclusiveXorNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedInclusiveXorNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedInclusiveXorNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedInclusiveXorNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedInclusiveXorNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedInclusiveXorNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedInclusiveXorNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedInclusiveXorNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedInclusiveXorNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedInclusiveXorNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedInclusiveXorNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].f4.x = subgroupPartitionedExclusiveAddNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedExclusiveAddNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedExclusiveAddNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedExclusiveAddNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedExclusiveAddNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveAddNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveAddNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveAddNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveAddNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveAddNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveAddNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveAddNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedExclusiveAddNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedExclusiveAddNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedExclusiveAddNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedExclusiveAddNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedExclusiveMulNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedExclusiveMulNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedExclusiveMulNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedExclusiveMulNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedExclusiveMulNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveMulNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveMulNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveMulNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveMulNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveMulNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveMulNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveMulNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedExclusiveMulNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedExclusiveMulNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedExclusiveMulNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedExclusiveMulNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedExclusiveMinNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedExclusiveMinNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedExclusiveMinNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedExclusiveMinNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedExclusiveMinNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveMinNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveMinNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveMinNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveMinNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveMinNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveMinNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveMinNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedExclusiveMinNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedExclusiveMinNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedExclusiveMinNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedExclusiveMinNV(data[3].d4, ballot); + + data[invocation].f4.x = subgroupPartitionedExclusiveMaxNV(data[0].f4.x, ballot); + data[invocation].f4.xy = subgroupPartitionedExclusiveMaxNV(data[1].f4.xy, ballot); + data[invocation].f4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].f4.xyz, ballot); + data[invocation].f4 = subgroupPartitionedExclusiveMaxNV(data[3].f4, ballot); + + data[invocation].i4.x = subgroupPartitionedExclusiveMaxNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveMaxNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveMaxNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveMaxNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveMaxNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveMaxNV(data[3].u4, ballot); + + data[invocation].d4.x = subgroupPartitionedExclusiveMaxNV(data[0].d4.x, ballot); + data[invocation].d4.xy = subgroupPartitionedExclusiveMaxNV(data[1].d4.xy, ballot); + data[invocation].d4.xyz = subgroupPartitionedExclusiveMaxNV(data[2].d4.xyz, ballot); + data[invocation].d4 = subgroupPartitionedExclusiveMaxNV(data[3].d4, ballot); + + data[invocation].i4.x = subgroupPartitionedExclusiveAndNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveAndNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveAndNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveAndNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveAndNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveAndNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveAndNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveAndNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedExclusiveAndNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedExclusiveAndNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedExclusiveAndNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedExclusiveAndNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].i4.x = subgroupPartitionedExclusiveOrNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveOrNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveOrNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveOrNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveOrNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveOrNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveOrNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveOrNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedExclusiveOrNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedExclusiveOrNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedExclusiveOrNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedExclusiveOrNV(lessThan(data[1].i4, ivec4(0)), ballot)); + + data[invocation].i4.x = subgroupPartitionedExclusiveXorNV(data[0].i4.x, ballot); + data[invocation].i4.xy = subgroupPartitionedExclusiveXorNV(data[1].i4.xy, ballot); + data[invocation].i4.xyz = subgroupPartitionedExclusiveXorNV(data[2].i4.xyz, ballot); + data[invocation].i4 = subgroupPartitionedExclusiveXorNV(data[3].i4, ballot); + + data[invocation].u4.x = subgroupPartitionedExclusiveXorNV(data[0].u4.x, ballot); + data[invocation].u4.xy = subgroupPartitionedExclusiveXorNV(data[1].u4.xy, ballot); + data[invocation].u4.xyz = subgroupPartitionedExclusiveXorNV(data[2].u4.xyz, ballot); + data[invocation].u4 = subgroupPartitionedExclusiveXorNV(data[3].u4, ballot); + + data[invocation].i4.x = int(subgroupPartitionedExclusiveXorNV(data[0].i4.x < 0, ballot)); + data[invocation].i4.xy = ivec2(subgroupPartitionedExclusiveXorNV(lessThan(data[1].i4.xy, ivec2(0)), ballot)); + data[invocation].i4.xyz = ivec3(subgroupPartitionedExclusiveXorNV(lessThan(data[1].i4.xyz, ivec3(0)), ballot)); + data[invocation].i4 = ivec4(subgroupPartitionedExclusiveXorNV(lessThan(data[1].i4, ivec4(0)), ballot)); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.vulkan110.int16.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.vulkan110.int16.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.vulkan110.int16.frag 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.vulkan110.int16.frag 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,251 @@ +#version 450 + +#extension GL_KHX_shader_explicit_arithmetic_types: enable +#extension GL_KHX_shader_explicit_arithmetic_types_int8: require +#extension GL_KHX_shader_explicit_arithmetic_types_int16: require +#extension GL_KHX_shader_explicit_arithmetic_types_int32: require +#extension GL_KHX_shader_explicit_arithmetic_types_int64: require +#extension GL_KHX_shader_explicit_arithmetic_types_float16: require +#extension GL_KHX_shader_explicit_arithmetic_types_float32: require +#extension GL_KHX_shader_explicit_arithmetic_types_float64: require + +layout(binding = 0) uniform Uniforms +{ + uint index; +}; + +layout(std140, binding = 1) uniform Block +{ + int16_t i16; + i16vec2 i16v2; + i16vec3 i16v3; + i16vec4 i16v4; + uint16_t u16; + u16vec2 u16v2; + u16vec3 u16v3; + u16vec4 u16v4; +} block; + +void main() +{ +} + +void literal() +{ + const int16_t i16Const[3] = + { + int16_t(-0x1111), // Hex + int16_t(-1), // Dec + int16_t(040000), // Oct + }; + + int16_t i16 = i16Const[index]; + + const uint16_t u16Const[] = + { + uint16_t(0xFFFF), // Hex + uint16_t(65535), // Dec + uint16_t(077777), // Oct + }; + + uint16_t u16 = u16Const[index]; +} + +void typeCast16() +{ + i8vec2 i8v; + u8vec2 u8v; + i16vec2 i16v; + u16vec2 u16v; + i32vec2 i32v; + u32vec2 u32v; + i64vec2 i64v; + u64vec2 u64v; + f16vec2 f16v; + f32vec2 f32v; + f64vec2 f64v; + bvec2 bv; + + i32v = i16v; // int16_t -> int32_t + i32v = u16v; // uint16_t -> int32_t + u16v = i16v; // int16_t -> uint16_t + u32v = i16v; // int16_t -> uint32_t + i64v = i16v; // int16_t -> int64_t + u64v = i16v; // int16_t -> uint64_t + u32v = u16v; // uint16_t -> uint32_t + i64v = u16v; // uint16_t -> int64_t + u64v = u16v; // uint16_t -> uint64_t + f16v = i16v; // int16_t -> float16_t + f32v = i16v; // int16_t -> float32_t + f64v = i16v; // int16_t -> float64_t + f16v = u16v; // uint16_t -> float16_t + f32v = u16v; // uint16_t -> float32_t + f64v = u16v; // uint16_t -> float64_t + + i32v = i32vec2(i16v); // int16_t -> int32_t + i32v = i32vec2(u16v); // uint16_t -> int32_t + u16v = u16vec2(i16v); // int16_t -> uint16_t + u32v = u32vec2(i16v); // int16_t -> uint32_t + i64v = i64vec2(i16v); // int16_t -> int64_t + u64v = i64vec2(i16v); // int16_t -> uint64_t + u32v = u32vec2(u16v); // uint16_t -> uint32_t + i64v = i64vec2(u16v); // uint16_t -> int64_t + u64v = i64vec2(u16v); // uint16_t -> uint64_t + f16v = f16vec2(i16v); // int16_t -> float16_t + f32v = f32vec2(i16v); // int16_t -> float32_t + f64v = f64vec2(i16v); // int16_t -> float64_t + f16v = f16vec2(u16v); // uint16_t -> float16_t + f32v = f32vec2(u16v); // uint16_t -> float32_t + f64v = f64vec2(u16v); // uint16_t -> float64_t + + i8v = i8vec2(i16v); // int16_t -> int8_t + i8v = i8vec2(u16v); // uint16_t -> int8_t + u8v = u8vec2(i16v); // int16_t -> uint8_t + u8v = u8vec2(u16v); // uint16_t -> uint8_t + i16v = u8vec2(u16v); // uint16_t -> int16_t + i16v = i16vec2(bv); // bool -> int16 + u16v = u16vec2(bv); // bool -> uint16 + bv = bvec2(i16v); // int16 -> bool + bv = bvec2(u16v); // uint16 -> bool +} +void operators() +{ + u16vec3 u16v; + int16_t i16; + uvec3 uv; + int32_t i; + int64_t i64; + bool b; + + // Unary + u16v++; + i16--; + ++i16; + --u16v; + + u16v = ~u16v; + + i16 = +i16; + u16v = -u16v; + + // Arithmetic + i16 += i16; + u16v -= u16v; + i *= i16; + uv /= u16v; + uv %= i16; + + uv = u16v + uv; + i64 = i16 - i64; + uv = u16v * uv; + i64 = i16 * i64; + i = i16 % i; + + // Shift + u16v <<= i16; + i16 >>= u16v.y; + + i16 = i16 << u16v.z; + uv = u16v << i; + + // Relational + b = (u16v.x != i16); + b = (i16 == u16v.x); + b = (u16v.x > uv.y); + b = (i16 < i); + b = (u16v.y >= uv.x); + b = (i16 <= i); + + // Bitwise + uv |= i16; + i = i16 | i; + i64 &= i16; + uv = u16v & uv; + uv ^= i16; + u16v = u16v ^ i16; +} + +void builtinFuncs() +{ + i16vec2 i16v; + i16vec4 i16v4; + u16vec3 u16v; + u16vec2 u16v2; + u16vec4 u16v4; + bvec3 bv; + int16_t i16; + uint16_t u16; + int32_t i32; + uint32_t u32; + int64_t i64; + uint64_t u64; + + // abs() + i16v = abs(i16v); + + // sign() + i16 = sign(i16); + + // min() + i16v = min(i16v, i16); + i16v = min(i16v, i16vec2(-1)); + u16v = min(u16v, u16); + u16v = min(u16v, u16vec3(0)); + + // max() + i16v = max(i16v, i16); + i16v = max(i16v, i16vec2(-1)); + u16v = max(u16v, u16); + u16v = max(u16v, u16vec3(0)); + + // clamp() + i16v = clamp(i16v, -i16, i16); + i16v = clamp(i16v, -i16v, i16v); + u16v = clamp(u16v, -u16, u16); + u16v = clamp(u16v, -u16v, u16v); + + // mix() + i16 = mix(i16v.x, i16v.y, true); + i16v = mix(i16vec2(i16), i16vec2(-i16), bvec2(false)); + u16 = mix(u16v.x, u16v.y, true); + u16v = mix(u16vec3(u16), u16vec3(-u16), bvec3(false)); + + //pack + i32 = pack32(i16v); + i64 = pack64(i16v4); + u32 = pack32(u16v2); + u64 = pack64(u16v4); + + i16v = unpack16(i32); + i16v4 = unpack16(i64); + u16v2 = unpack16(u32); + u16v4 = unpack16(u64); + + // lessThan() + bv = lessThan(u16v, u16vec3(u16)); + bv.xy = lessThan(i16v, i16vec2(i16)); + + // lessThanEqual() + bv = lessThanEqual(u16v, u16vec3(u16)); + bv.xy = lessThanEqual(i16v, i16vec2(i16)); + + // greaterThan() + bv = greaterThan(u16v, u16vec3(u16)); + bv.xy = greaterThan(i16v, i16vec2(i16)); + + // greaterThanEqual() + bv = greaterThanEqual(u16v, u16vec3(u16)); + bv.xy = greaterThanEqual(i16v, i16vec2(i16)); + + // equal() + bv = equal(u16v, u16vec3(u16)); + bv.xy = equal(i16v, i16vec2(i16)); + + // notEqual() + bv = notEqual(u16v, u16vec3(u16)); + bv.xy = notEqual(i16v, i16vec2(i16)); +} + +// Type conversion for specialization constant +layout(constant_id = 100) const int16_t si16 = int16_t(-10); +layout(constant_id = 101) const uint16_t su16 = uint16_t(20); diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.vulkan110.storageBuffer.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.vulkan110.storageBuffer.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.vulkan110.storageBuffer.vert 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.vulkan110.storageBuffer.vert 2018-04-27 11:46:26.000000000 +0000 @@ -0,0 +1,16 @@ +#version 450 + +#pragma use_storage_buffer + +uniform ub { + vec4 a; +} ubi; + +buffer bb { + vec4 b; +} bbi; + +void main() +{ + gl_Position = ubi.a + bbi.b; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.whileLoop.frag vulkan-1.1.73+dfsg/external/glslang/Test/spv.whileLoop.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.whileLoop.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.whileLoop.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,16 @@ -#version 140 - -in vec4 bigColor; -in vec4 BaseColor; -in float d; - -void main() -{ - vec4 color = BaseColor; - - while (color.x < d) { - color += bigColor; - } - - gl_FragColor = color; -} +#version 140 + +in vec4 bigColor; +in vec4 BaseColor; +in float d; + +void main() +{ + vec4 color = BaseColor; + + while (color.x < d) { + color += bigColor; + } + + gl_FragColor = color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.xfb2.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.xfb2.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.xfb2.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.xfb2.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,18 +1,18 @@ -#version 450 - -layout (location = 0) in vec4 position; -layout (binding = 5) uniform ComponentsBlock -{ - vec4 c1; - vec2 c2; -} components; - -layout (xfb_buffer = 3, xfb_offset = 16) out gl_PerVertex -{ - vec4 gl_Position; -}; - -void main() -{ - gl_Position = position + components.c1 + vec4(components.c2, 0.0, 0.0); +#version 450 + +layout (location = 0) in vec4 position; +layout (binding = 5) uniform ComponentsBlock +{ + vec4 c1; + vec2 c2; +} components; + +layout (xfb_buffer = 3, xfb_offset = 16) out gl_PerVertex +{ + vec4 gl_Position; +}; + +void main() +{ + gl_Position = position + components.c1 + vec4(components.c2, 0.0, 0.0); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.xfb3.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.xfb3.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.xfb3.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.xfb3.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,18 +1,18 @@ -#version 450 - -layout (location = 0) in vec4 position; -layout (binding = 5) uniform ComponentsBlock -{ - vec4 c1; - vec2 c2; -} components; - -layout (xfb_buffer = 3, xfb_offset = 16) out gl_PerVertex -{ - layout(xfb_stride = 80) vec4 gl_Position; -}; - -void main() -{ - gl_Position = position + components.c1 + vec4(components.c2, 0.0, 0.0); +#version 450 + +layout (location = 0) in vec4 position; +layout (binding = 5) uniform ComponentsBlock +{ + vec4 c1; + vec2 c2; +} components; + +layout (xfb_buffer = 3, xfb_offset = 16) out gl_PerVertex +{ + layout(xfb_stride = 80) vec4 gl_Position; +}; + +void main() +{ + gl_Position = position + components.c1 + vec4(components.c2, 0.0, 0.0); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/spv.xfb.vert vulkan-1.1.73+dfsg/external/glslang/Test/spv.xfb.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/spv.xfb.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/spv.xfb.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,20 +1,20 @@ -#version 450 - -layout(xfb_buffer = 3) out; -layout(xfb_stride = 48) out; -layout(xfb_offset = 12, location = 0) out float out1; - -layout(xfb_buffer = 2) out; -layout(location=1) out outXfb { - layout(xfb_buffer = 2, xfb_stride = 32, xfb_offset = 8) float out2; -}; - -layout(xfb_buffer = 1, location=3) out outXfb2 { - layout(xfb_stride = 64, xfb_offset = 60) float out3; -}; - -layout(location = 4, xfb_buffer = 0, xfb_offset = 4) out float out4; - -void main() -{ +#version 450 + +layout(xfb_buffer = 3) out; +layout(xfb_stride = 48) out; +layout(xfb_offset = 12, location = 0) out float out1; + +layout(xfb_buffer = 2) out; +layout(location=1) out outXfb { + layout(xfb_buffer = 2, xfb_stride = 32, xfb_offset = 8) float out2; +}; + +layout(xfb_buffer = 1, location=3) out outXfb2 { + layout(xfb_stride = 64, xfb_offset = 60) float out3; +}; + +layout(location = 4, xfb_buffer = 0, xfb_offset = 4) out float out4; + +void main() +{ } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/structAssignment.frag vulkan-1.1.73+dfsg/external/glslang/Test/structAssignment.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/structAssignment.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/structAssignment.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,39 +1,39 @@ -#version 130 - -uniform sampler2D sampler; -varying mediump vec2 coord; - -struct lunarStruct1 { - int i; - float f; -}; - -struct lunarStruct2 { - int i; - float f; - lunarStruct1 s1_1; -}; - -struct lunarStruct3 { - lunarStruct2 s2_1; - int i; - float f; - lunarStruct1 s1_1; -}; - - -uniform lunarStruct1 foo; -uniform lunarStruct2 foo2; -uniform lunarStruct3 foo3; - -void main() -{ - lunarStruct2 locals2; - - if (foo3.s2_1.i > 0) - locals2 = foo3.s2_1; - else - locals2 = foo2; - - gl_FragColor = locals2.s1_1.f * texture2D(sampler, coord); -} +#version 130 + +uniform sampler2D sampler; +varying mediump vec2 coord; + +struct lunarStruct1 { + int i; + float f; +}; + +struct lunarStruct2 { + int i; + float f; + lunarStruct1 s1_1; +}; + +struct lunarStruct3 { + lunarStruct2 s2_1; + int i; + float f; + lunarStruct1 s1_1; +}; + + +uniform lunarStruct1 foo; +uniform lunarStruct2 foo2; +uniform lunarStruct3 foo3; + +void main() +{ + lunarStruct2 locals2; + + if (foo3.s2_1.i > 0) + locals2 = foo3.s2_1; + else + locals2 = foo2; + + gl_FragColor = locals2.s1_1.f * texture2D(sampler, coord); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/structDeref.frag vulkan-1.1.73+dfsg/external/glslang/Test/structDeref.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/structDeref.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/structDeref.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,71 +1,71 @@ -#version 130 - -uniform sampler2D sampler; -varying vec2 coord; - -struct s0 { - int i; -}; - -struct s00 { - s0 s0_0; -}; - -struct s1 { - int i; - float f; - s0 s0_1; -}; - -struct s2 { - int i; - float f; - s1 s1_1; -}; - -struct s3 { - s2[12] s2_1; - int i; - float f; - s1 s1_1; -}; - - -uniform s0 foo0; -uniform s1 foo1; -uniform s2 foo2; -uniform s3 foo3; - -uniform s00 foo00; - -void main() -{ - s0 locals0; - s2 locals2; - s00 locals00; - - float[6] fArray; - - s1[10] locals1Array; - - if (foo3.s2_1[9].i > 0) { - locals2.f = 1.0; - locals2.s1_1 = s1(0, 1.0, s0(0)); - fArray = float[6]( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); - locals1Array[6] = foo1; - locals0 = s0(0); - locals00 = s00(s0(0)); - } else { - locals2.f = coord.x; - locals2.s1_1 = s1(1, coord.y, foo0); - fArray = float[6]( 0.0, 1.0, 2.0, 3.0, 4.0, 5.0); - locals1Array[6] = locals2.s1_1; - locals0 = foo1.s0_1; - locals00 = foo00; - } - - if (locals0.i > 5) - locals0 = locals00.s0_0; - - gl_FragColor = (float(locals0.i) + locals1Array[6].f + fArray[3] + locals2.s1_1.f) * texture2D(sampler, coord); -} +#version 130 + +uniform sampler2D sampler; +varying vec2 coord; + +struct s0 { + int i; +}; + +struct s00 { + s0 s0_0; +}; + +struct s1 { + int i; + float f; + s0 s0_1; +}; + +struct s2 { + int i; + float f; + s1 s1_1; +}; + +struct s3 { + s2[12] s2_1; + int i; + float f; + s1 s1_1; +}; + + +uniform s0 foo0; +uniform s1 foo1; +uniform s2 foo2; +uniform s3 foo3; + +uniform s00 foo00; + +void main() +{ + s0 locals0; + s2 locals2; + s00 locals00; + + float[6] fArray; + + s1[10] locals1Array; + + if (foo3.s2_1[9].i > 0) { + locals2.f = 1.0; + locals2.s1_1 = s1(0, 1.0, s0(0)); + fArray = float[6]( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); + locals1Array[6] = foo1; + locals0 = s0(0); + locals00 = s00(s0(0)); + } else { + locals2.f = coord.x; + locals2.s1_1 = s1(1, coord.y, foo0); + fArray = float[6]( 0.0, 1.0, 2.0, 3.0, 4.0, 5.0); + locals1Array[6] = locals2.s1_1; + locals0 = foo1.s0_1; + locals00 = foo00; + } + + if (locals0.i > 5) + locals0 = locals00.s0_0; + + gl_FragColor = (float(locals0.i) + locals1Array[6].f + fArray[3] + locals2.s1_1.f) * texture2D(sampler, coord); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/structure.frag vulkan-1.1.73+dfsg/external/glslang/Test/structure.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/structure.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/structure.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,31 +1,31 @@ -#version 130 -uniform sampler2D sampler; -varying vec2 coord; - -struct lunarStruct1 { - int i; - float f[4]; - vec4 color[5]; -}; - -struct lunarStruct2 { - int i[5]; - float f; - lunarStruct1 s1_1[7]; -}; - -uniform lunarStruct1 foo; -uniform lunarStruct2 foo2[5]; - -void main() -{ - float scale = 0.0; - - if (foo2[3].i[4] > 0) - scale = foo2[3].s1_1[2].color[3].x; - else - scale = foo2[3].s1_1[2].f[3]; - - gl_FragColor = scale * texture2D(sampler, coord); -} - +#version 130 +uniform sampler2D sampler; +varying vec2 coord; + +struct lunarStruct1 { + int i; + float f[4]; + vec4 color[5]; +}; + +struct lunarStruct2 { + int i[5]; + float f; + lunarStruct1 s1_1[7]; +}; + +uniform lunarStruct1 foo; +uniform lunarStruct2 foo2[5]; + +void main() +{ + float scale = 0.0; + + if (foo2[3].i[4] > 0) + scale = foo2[3].s1_1[2].color[3].x; + else + scale = foo2[3].s1_1[2].f[3]; + + gl_FragColor = scale * texture2D(sampler, coord); +} + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/swizzle.frag vulkan-1.1.73+dfsg/external/glslang/Test/swizzle.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/swizzle.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/swizzle.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,52 +1,52 @@ -#version 110 - -uniform float blend; -uniform vec4 u; -uniform bool p; - -varying vec2 t; - -void main() -{ - float blendscale = 1.789; - - vec4 w = u; - vec4 w_undef; // test undef - vec4 w_dep = u; // test dependent swizzles - vec4 w_reorder = u; // test reordering - vec4 w2 = u; - vec4 w_flow = u; // test flowControl - - w_reorder.z = blendscale; - - w.wy = t; - - w_reorder.x = blendscale; - - w2.xyzw = u.zwxy; - - w_reorder.y = blendscale; - - w_dep.xy = w2.xz; - w_dep.zw = t; - - w_undef.xy = u.zw; - - if (p) - w_flow.x = t.x; - else - w_flow.x = t.y; - - gl_FragColor = mix(w_reorder, w_undef, w * w2 * w_dep * w_flow); - - vec2 c = t; - vec4 rep = vec4(0.0, 0.0, 0.0, 1.0); - - if (c.x < 0.0) - c.x *= -1.0; - - if (c.x <= 1.0) - rep.x = 3.4; - - gl_FragColor += rep; -} +#version 110 + +uniform float blend; +uniform vec4 u; +uniform bool p; + +varying vec2 t; + +void main() +{ + float blendscale = 1.789; + + vec4 w = u; + vec4 w_undef; // test undef + vec4 w_dep = u; // test dependent swizzles + vec4 w_reorder = u; // test reordering + vec4 w2 = u; + vec4 w_flow = u; // test flowControl + + w_reorder.z = blendscale; + + w.wy = t; + + w_reorder.x = blendscale; + + w2.xyzw = u.zwxy; + + w_reorder.y = blendscale; + + w_dep.xy = w2.xz; + w_dep.zw = t; + + w_undef.xy = u.zw; + + if (p) + w_flow.x = t.x; + else + w_flow.x = t.y; + + gl_FragColor = mix(w_reorder, w_undef, w * w2 * w_dep * w_flow); + + vec2 c = t; + vec4 rep = vec4(0.0, 0.0, 0.0, 1.0); + + if (c.x < 0.0) + c.x *= -1.0; + + if (c.x <= 1.0) + rep.x = 3.4; + + gl_FragColor += rep; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/syntaxError.frag vulkan-1.1.73+dfsg/external/glslang/Test/syntaxError.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/syntaxError.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/syntaxError.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,16 @@ -#version 120 - -uniform vec4 bigColor; -varying vec4 BaseColor; -uniform float d; - -void main() -{ - vec5 color = BaseColor; - - do { - color += bigColor; - } while (color.x < d); - - gl_FragColor = color; -} +#version 120 + +uniform vec4 bigColor; +varying vec4 BaseColor; +uniform float d; + +void main() +{ + vec5 color = BaseColor; + + do { + color += bigColor; + } while (color.x < d); + + gl_FragColor = color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/test.frag vulkan-1.1.73+dfsg/external/glslang/Test/test.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/test.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/test.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,22 +1,22 @@ -#version 110 - -uniform sampler2D texSampler2D; -uniform sampler3D texSampler3D; - -uniform float blend; -uniform vec2 scale; -uniform vec4 u; - -varying vec2 t; -varying vec3 coords; - -void main() -{ - float blendscale = 1.789; - - vec4 v = texture2D(texSampler2D, (t + scale) / scale ).wzyx; - - vec4 w = texture3D(texSampler3D, coords) + v; - - gl_FragColor = mix(w, u, blend * blendscale); -} +#version 110 + +uniform sampler2D texSampler2D; +uniform sampler3D texSampler3D; + +uniform float blend; +uniform vec2 scale; +uniform vec4 u; + +varying vec2 t; +varying vec3 coords; + +void main() +{ + float blendscale = 1.789; + + vec4 v = texture2D(texSampler2D, (t + scale) / scale ).wzyx; + + vec4 w = texture3D(texSampler3D, coords) + v; + + gl_FragColor = mix(w, u, blend * blendscale); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/texture.frag vulkan-1.1.73+dfsg/external/glslang/Test/texture.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/texture.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/texture.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,73 +1,73 @@ -#version 130 - -uniform sampler1D texSampler1D; -uniform sampler2D texSampler2D; -uniform sampler3D texSampler3D; -uniform samplerCube texSamplerCube; -uniform sampler1DShadow shadowSampler1D; -uniform sampler2DShadow shadowSampler2D; - -uniform float blend; -uniform vec2 scale; -uniform vec4 u; - -varying vec2 t; -varying vec2 coords2D; - -void main() -{ - float blendscale = 1.789; - float bias = 2.0; - float lod = 3.0; - float proj = 2.0; - float coords1D = 1.789; - vec3 coords3D = vec3(1.789, 2.718, 3.453); - vec4 coords4D = vec4(1.789, 2.718, 3.453, 2.0); - vec4 color = vec4(0.0, 0.0, 0.0, 0.0); - - color += texture1D (texSampler1D, coords1D); - color += texture1D (texSampler1D, coords1D, bias); - color += texture1DProj(texSampler1D, coords2D); - color += texture1DProj(texSampler1D, coords4D); - color += texture1DProj(texSampler1D, coords2D, bias); - color += texture1DProj(texSampler1D, coords4D, bias); - - color += texture2D (texSampler2D, coords2D); - color += texture2D (texSampler2D, coords2D, bias); - color += texture2DProj (texSampler2D, coords3D); - color += texture2DProj (texSampler2D, coords4D, bias); - - color += texture3D (texSampler3D, coords3D); - color += texture3D (texSampler3D, coords3D, bias); - color += texture3DProj (texSampler3D, coords4D); - color += texture3DProj (texSampler3D, coords4D, bias); - - color += textureCube (texSamplerCube, coords3D); - color += textureCube (texSamplerCube, coords3D, bias); - - color += shadow1D (shadowSampler1D, coords3D); - color += shadow1D (shadowSampler1D, coords3D, bias); - color += shadow2D (shadowSampler2D, coords3D); - color += shadow2D (shadowSampler2D, coords3D, bias); - color += shadow1DProj (shadowSampler1D, coords4D); - color += shadow1DProj (shadowSampler1D, coords4D, bias); - color += shadow2DProj (shadowSampler2D, coords4D); - color += shadow2DProj (shadowSampler2D, coords4D, bias); - - ivec2 iCoords2D = ivec2(0, 5); - int iLod = 1; - - color += texelFetch(texSampler2D, iCoords2D, iLod); - - vec2 gradX = dFdx(coords2D); - vec2 gradY = dFdy(coords2D); - const ivec2 offset = ivec2(3, -7); - - color += textureGrad(texSampler2D, coords2D, gradX, gradY); - color += textureProjGrad(texSampler2D, vec3(coords2D, proj), gradX, gradY); - color += textureGradOffset(texSampler2D, coords2D, gradX, gradY, offset); - color += textureProjGradOffset(texSampler2D, coords3D, gradX, gradY, offset); - color += textureGrad(shadowSampler2D, vec3(coords2D, lod), gradX, gradY); - - gl_FragColor = mix(color, u, blend * blendscale); +#version 130 + +uniform sampler1D texSampler1D; +uniform sampler2D texSampler2D; +uniform sampler3D texSampler3D; +uniform samplerCube texSamplerCube; +uniform sampler1DShadow shadowSampler1D; +uniform sampler2DShadow shadowSampler2D; + +uniform float blend; +uniform vec2 scale; +uniform vec4 u; + +varying vec2 t; +varying vec2 coords2D; + +void main() +{ + float blendscale = 1.789; + float bias = 2.0; + float lod = 3.0; + float proj = 2.0; + float coords1D = 1.789; + vec3 coords3D = vec3(1.789, 2.718, 3.453); + vec4 coords4D = vec4(1.789, 2.718, 3.453, 2.0); + vec4 color = vec4(0.0, 0.0, 0.0, 0.0); + + color += texture1D (texSampler1D, coords1D); + color += texture1D (texSampler1D, coords1D, bias); + color += texture1DProj(texSampler1D, coords2D); + color += texture1DProj(texSampler1D, coords4D); + color += texture1DProj(texSampler1D, coords2D, bias); + color += texture1DProj(texSampler1D, coords4D, bias); + + color += texture2D (texSampler2D, coords2D); + color += texture2D (texSampler2D, coords2D, bias); + color += texture2DProj (texSampler2D, coords3D); + color += texture2DProj (texSampler2D, coords4D, bias); + + color += texture3D (texSampler3D, coords3D); + color += texture3D (texSampler3D, coords3D, bias); + color += texture3DProj (texSampler3D, coords4D); + color += texture3DProj (texSampler3D, coords4D, bias); + + color += textureCube (texSamplerCube, coords3D); + color += textureCube (texSamplerCube, coords3D, bias); + + color += shadow1D (shadowSampler1D, coords3D); + color += shadow1D (shadowSampler1D, coords3D, bias); + color += shadow2D (shadowSampler2D, coords3D); + color += shadow2D (shadowSampler2D, coords3D, bias); + color += shadow1DProj (shadowSampler1D, coords4D); + color += shadow1DProj (shadowSampler1D, coords4D, bias); + color += shadow2DProj (shadowSampler2D, coords4D); + color += shadow2DProj (shadowSampler2D, coords4D, bias); + + ivec2 iCoords2D = ivec2(0, 5); + int iLod = 1; + + color += texelFetch(texSampler2D, iCoords2D, iLod); + + vec2 gradX = dFdx(coords2D); + vec2 gradY = dFdy(coords2D); + const ivec2 offset = ivec2(3, -7); + + color += textureGrad(texSampler2D, coords2D, gradX, gradY); + color += textureProjGrad(texSampler2D, vec3(coords2D, proj), gradX, gradY); + color += textureGradOffset(texSampler2D, coords2D, gradX, gradY, offset); + color += textureProjGradOffset(texSampler2D, coords3D, gradX, gradY, offset); + color += textureGrad(shadowSampler2D, vec3(coords2D, lod), gradX, gradY); + + gl_FragColor = mix(color, u, blend * blendscale); } \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/tokenPaste.vert vulkan-1.1.73+dfsg/external/glslang/Test/tokenPaste.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/tokenPaste.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/tokenPaste.vert 2018-04-27 11:46:26.000000000 +0000 @@ -52,35 +52,35 @@ int a = simplePaste(11,12); // operators -#define MAKE_OP(L, R) L ## R -const int aop = 10; -const int bop = 4; -int cop = aop MAKE_OP(<, <) bop; -bool dop = aop MAKE_OP(!,=) bop; - -#define MAKE_OP3(L, M, R) L ## M ## R - -void foo() -{ - int e = 16; - e MAKE_OP3(>,>,=) 2; - - // recovery from bad op - bool f = e MAKE_OP(>,!) 5; +#define MAKE_OP(L, R) L ## R +const int aop = 10; +const int bop = 4; +int cop = aop MAKE_OP(<, <) bop; +bool dop = aop MAKE_OP(!,=) bop; + +#define MAKE_OP3(L, M, R) L ## M ## R + +void foo() +{ + int e = 16; + e MAKE_OP3(>,>,=) 2; + + // recovery from bad op + bool f = e MAKE_OP(>,!) 5; } // arguments: should make 'uniform int argPaste2;' -#define M_NEST(q) int q -#define M_OUTER(p) M_NEST(p##2) -uniform M_OUTER(argPaste); -// should make 'uniform int argPaste20suff;' -#define M_NEST2(q) int q ## suff -#define M_OUTER2(p) M_NEST2(p ## 20) -uniform M_OUTER2(argPaste); - -#define rec(x)## -rec(rec()) - -#define bax(bay) -#define baz bax(/##) -baz +#define M_NEST(q) int q +#define M_OUTER(p) M_NEST(p##2) +uniform M_OUTER(argPaste); +// should make 'uniform int argPaste20suff;' +#define M_NEST2(q) int q ## suff +#define M_OUTER2(p) M_NEST2(p ## 20) +uniform M_OUTER2(argPaste); + +#define rec(x)## +rec(rec()) + +#define bax(bay) +#define baz bax(/##) +baz diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/types.frag vulkan-1.1.73+dfsg/external/glslang/Test/types.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/types.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/types.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,81 +1,81 @@ -#version 130 - -uniform bool u_b; -uniform bvec2 u_b2; -uniform bvec3 u_b3; -uniform bvec4 u_b4; - -uniform int u_i; -uniform ivec2 u_i2; -uniform ivec3 u_i3; -uniform ivec4 u_i4; - -uniform float u_f; -uniform vec2 u_f2; -uniform vec3 u_f3; -uniform vec4 u_f4; - -uniform bool i_b; -uniform bvec2 i_b2; -uniform bvec3 i_b3; -uniform bvec4 i_b4; - -flat in int i_i; -flat in ivec2 i_i2; -flat in ivec3 i_i3; -flat in ivec4 i_i4; - -in float i_f; -in vec2 i_f2; -in vec3 i_f3; -in vec4 i_f4; - -void main() -{ - bool b = u_b && i_b; - bvec2 b2 = bvec2(u_b2.x && i_b2.x && u_b2.y && i_b2.y); - bvec3 b3 = bvec3(u_b3.x && i_b3.x && u_b3.y && i_b3.y && u_b3.z && i_b3.z); - bvec4 b4 = bvec4(u_b4.x && i_b4.x && u_b4.y && i_b4.y && u_b4.z && i_b4.z && u_b4.w && i_b4.w); - - int i = u_i + i_i; - ivec2 i2 = u_i2 + i_i2; - ivec3 i3 = u_i3 + i_i3; - ivec4 i4 = u_i4 + i_i4; - - float f = u_f + i_f; - vec2 f2 = u_f2 + i_f2; - vec3 f3 = u_f3 + i_f3; - vec4 f4 = u_f4 + i_f4; - - gl_FragColor = - b || - b2.x || - b2.y || - b3.x || - b3.y || - b3.z || - b4.x || - b4.y || - b4.z || - b4.w ? vec4( - i + - i2.x + - i2.y + - i3.x + - i3.y + - i3.z + - i4.x + - i4.y + - i4.z + - i4.w + - f + - f2.x + - f2.y + - f3.x + - f3.y + - f3.z + - f4.x + - f4.y + - f4.z + - f4.w) : vec4(1.0); -} +#version 130 + +uniform bool u_b; +uniform bvec2 u_b2; +uniform bvec3 u_b3; +uniform bvec4 u_b4; + +uniform int u_i; +uniform ivec2 u_i2; +uniform ivec3 u_i3; +uniform ivec4 u_i4; + +uniform float u_f; +uniform vec2 u_f2; +uniform vec3 u_f3; +uniform vec4 u_f4; + +uniform bool i_b; +uniform bvec2 i_b2; +uniform bvec3 i_b3; +uniform bvec4 i_b4; + +flat in int i_i; +flat in ivec2 i_i2; +flat in ivec3 i_i3; +flat in ivec4 i_i4; + +in float i_f; +in vec2 i_f2; +in vec3 i_f3; +in vec4 i_f4; + +void main() +{ + bool b = u_b && i_b; + bvec2 b2 = bvec2(u_b2.x && i_b2.x && u_b2.y && i_b2.y); + bvec3 b3 = bvec3(u_b3.x && i_b3.x && u_b3.y && i_b3.y && u_b3.z && i_b3.z); + bvec4 b4 = bvec4(u_b4.x && i_b4.x && u_b4.y && i_b4.y && u_b4.z && i_b4.z && u_b4.w && i_b4.w); + + int i = u_i + i_i; + ivec2 i2 = u_i2 + i_i2; + ivec3 i3 = u_i3 + i_i3; + ivec4 i4 = u_i4 + i_i4; + + float f = u_f + i_f; + vec2 f2 = u_f2 + i_f2; + vec3 f3 = u_f3 + i_f3; + vec4 f4 = u_f4 + i_f4; + + gl_FragColor = + b || + b2.x || + b2.y || + b3.x || + b3.y || + b3.z || + b4.x || + b4.y || + b4.z || + b4.w ? vec4( + i + + i2.x + + i2.y + + i3.x + + i3.y + + i3.z + + i4.x + + i4.y + + i4.z + + i4.w + + f + + f2.x + + f2.y + + f3.x + + f3.y + + f3.z + + f4.x + + f4.y + + f4.z + + f4.w) : vec4(1.0); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/uniformArray.frag vulkan-1.1.73+dfsg/external/glslang/Test/uniformArray.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/uniformArray.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/uniformArray.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,16 @@ -#version 130 -uniform sampler2D texSampler2D; -uniform vec3 inColor; -uniform vec4 color[6]; -uniform float alpha[16]; - -void main() -{ - vec4 texColor = color[1] + color[1]; - - texColor.xyz += inColor; - - texColor.a += alpha[12]; - - gl_FragColor = texColor; -} +#version 130 +uniform sampler2D texSampler2D; +uniform vec3 inColor; +uniform vec4 color[6]; +uniform float alpha[16]; + +void main() +{ + vec4 texColor = color[1] + color[1]; + + texColor.xyz += inColor; + + texColor.a += alpha[12]; + + gl_FragColor = texColor; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/variableArrayIndex.frag vulkan-1.1.73+dfsg/external/glslang/Test/variableArrayIndex.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/variableArrayIndex.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/variableArrayIndex.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,48 +1,48 @@ -#version 130 -uniform sampler2D sampler; -varying vec2 coord; - -struct lunarStruct1 { - int i; - float f; -}; - -struct lunarStruct2 { - int i; - float f; - lunarStruct1 s1_1; -}; - -struct lunarStruct3 { - lunarStruct2 s2_1[3]; - int i; - float f; - lunarStruct1 s1_1; -}; - - -uniform lunarStruct1 foo; -uniform lunarStruct2 foo2[5]; -uniform lunarStruct3 foo3; -uniform int Count; - -void main() -{ - float scale; - int iLocal = Count; - - if (foo3.s2_1[1].i > 0) - scale = foo2[foo3.s2_1[foo.i].i + 2 + ++iLocal].s1_1.f; - else - scale = foo3.s2_1[0].s1_1.f; - - //for (int i = 0; i < iLocal; ++i) { - // scale += foo2[i].f; - //} - - gl_FragColor = scale * texture2D(sampler, coord); - - vec2[3] constructed = vec2[3](coord, vec2(scale), vec2(1.0, 2.0)); - gl_FragColor += vec4(constructed[foo.i], constructed[foo.i]); -} - +#version 130 +uniform sampler2D sampler; +varying vec2 coord; + +struct lunarStruct1 { + int i; + float f; +}; + +struct lunarStruct2 { + int i; + float f; + lunarStruct1 s1_1; +}; + +struct lunarStruct3 { + lunarStruct2 s2_1[3]; + int i; + float f; + lunarStruct1 s1_1; +}; + + +uniform lunarStruct1 foo; +uniform lunarStruct2 foo2[5]; +uniform lunarStruct3 foo3; +uniform int Count; + +void main() +{ + float scale; + int iLocal = Count; + + if (foo3.s2_1[1].i > 0) + scale = foo2[foo3.s2_1[foo.i].i + 2 + ++iLocal].s1_1.f; + else + scale = foo3.s2_1[0].s1_1.f; + + //for (int i = 0; i < iLocal; ++i) { + // scale += foo2[i].f; + //} + + gl_FragColor = scale * texture2D(sampler, coord); + + vec2[3] constructed = vec2[3](coord, vec2(scale), vec2(1.0, 2.0)); + gl_FragColor += vec4(constructed[foo.i], constructed[foo.i]); +} + diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/varyingArray.frag vulkan-1.1.73+dfsg/external/glslang/Test/varyingArray.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/varyingArray.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/varyingArray.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,19 +1,19 @@ -#version 130 -uniform sampler2D texSampler2D; -varying vec4 color; -varying float alpha; - -varying vec4 gl_TexCoord[6]; - -varying vec4 foo[3]; - -void main() -{ - vec4 texColor = texture2D(texSampler2D, vec2(gl_TexCoord[4] + gl_TexCoord[5])); - - texColor += color; - - texColor.a = alpha; - - gl_FragColor = foo[1] + gl_TexCoord[0] + gl_TexCoord[4] + texColor; -} +#version 130 +uniform sampler2D texSampler2D; +varying vec4 color; +varying float alpha; + +varying vec4 gl_TexCoord[6]; + +varying vec4 foo[3]; + +void main() +{ + vec4 texColor = texture2D(texSampler2D, vec2(gl_TexCoord[4] + gl_TexCoord[5])); + + texColor += color; + + texColor.a = alpha; + + gl_FragColor = foo[1] + gl_TexCoord[0] + gl_TexCoord[4] + texColor; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/varyingArrayIndirect.frag vulkan-1.1.73+dfsg/external/glslang/Test/varyingArrayIndirect.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/varyingArrayIndirect.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/varyingArrayIndirect.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,21 +1,21 @@ -#version 130 -uniform sampler2D texSampler2D; -varying vec4 color; -varying float alpha; - -varying vec4 gl_TexCoord[6]; - -varying vec4 userIn[2]; - -uniform int a, b; - -void main() -{ - vec4 texColor = texture2D(texSampler2D, vec2(userIn[b] + gl_TexCoord[a] + gl_TexCoord[5])); - - texColor += color; - - texColor.a = alpha; - - gl_FragColor = gl_TexCoord[0] + gl_TexCoord[b] + texColor + userIn[a]; -} +#version 130 +uniform sampler2D texSampler2D; +varying vec4 color; +varying float alpha; + +varying vec4 gl_TexCoord[6]; + +varying vec4 userIn[2]; + +uniform int a, b; + +void main() +{ + vec4 texColor = texture2D(texSampler2D, vec2(userIn[b] + gl_TexCoord[a] + gl_TexCoord[5])); + + texColor += color; + + texColor.a = alpha; + + gl_FragColor = gl_TexCoord[0] + gl_TexCoord[b] + texColor + userIn[a]; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/versionsClean.frag vulkan-1.1.73+dfsg/external/glslang/Test/versionsClean.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/versionsClean.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/versionsClean.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,45 +1,45 @@ -// -//Copyright (C) 2012 LunarG, Inc. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of LunarG Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -#version 300 es - -in highp vec3 color; -out highp vec4 foo; - -uniform highp sampler2DArrayShadow bar; - -void main() -{ - foo = vec4(color, 142.0f); - discard; -} +// +//Copyright (C) 2012 LunarG, Inc. +//All rights reserved. +// +//Redistribution and use in source and binary forms, with or without +//modification, are permitted provided that the following conditions +//are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of LunarG Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +//POSSIBILITY OF SUCH DAMAGE. +// +#version 300 es + +in highp vec3 color; +out highp vec4 foo; + +uniform highp sampler2DArrayShadow bar; + +void main() +{ + foo = vec4(color, 142.0f); + discard; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/versionsClean.vert vulkan-1.1.73+dfsg/external/glslang/Test/versionsClean.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/versionsClean.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/versionsClean.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,43 +1,43 @@ -// -//Copyright (C) 2012 LunarG, Inc. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of LunarG Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -#version 420 compatibility - -attribute vec3 color; - -uniform sampler2DRect foo; - -void main() -{ - gl_Position = vec4(color, 142.0f); -} +// +//Copyright (C) 2012 LunarG, Inc. +//All rights reserved. +// +//Redistribution and use in source and binary forms, with or without +//modification, are permitted provided that the following conditions +//are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of LunarG Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +//POSSIBILITY OF SUCH DAMAGE. +// +#version 420 compatibility + +attribute vec3 color; + +uniform sampler2DRect foo; + +void main() +{ + gl_Position = vec4(color, 142.0f); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/versionsErrors.frag vulkan-1.1.73+dfsg/external/glslang/Test/versionsErrors.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/versionsErrors.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/versionsErrors.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,46 +1,46 @@ -// -//Copyright (C) 2012 LunarG, Inc. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of LunarG Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -#version 110 es - -#extension GL_ARB_texture_rectangle : disable - -attribute vec3 color; - -uniform sampler2DRect foo; - -void main() -{ - gl_FragColor = vec4(color, 142.0f); - discard; -} +// +//Copyright (C) 2012 LunarG, Inc. +//All rights reserved. +// +//Redistribution and use in source and binary forms, with or without +//modification, are permitted provided that the following conditions +//are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of LunarG Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +//POSSIBILITY OF SUCH DAMAGE. +// +#version 110 es + +#extension GL_ARB_texture_rectangle : disable + +attribute vec3 color; + +uniform sampler2DRect foo; + +void main() +{ + gl_FragColor = vec4(color, 142.0f); + discard; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/versionsErrors.vert vulkan-1.1.73+dfsg/external/glslang/Test/versionsErrors.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/versionsErrors.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/versionsErrors.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,46 +1,46 @@ -// -//Copyright (C) 2012 LunarG, Inc. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of LunarG Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -#version 420 core - -#extension GL_ARB_texture_rectangle : enable - -attribute vec3 color; - -uniform sampler2DRect foo; - -void main() -{ - gl_Position = vec4(color, 142.0f); - discard; -} +// +//Copyright (C) 2012 LunarG, Inc. +//All rights reserved. +// +//Redistribution and use in source and binary forms, with or without +//modification, are permitted provided that the following conditions +//are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of LunarG Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +//POSSIBILITY OF SUCH DAMAGE. +// +#version 420 core + +#extension GL_ARB_texture_rectangle : enable + +attribute vec3 color; + +uniform sampler2DRect foo; + +void main() +{ + gl_Position = vec4(color, 142.0f); + discard; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/voidFunction.frag vulkan-1.1.73+dfsg/external/glslang/Test/voidFunction.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/voidFunction.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/voidFunction.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,34 +1,34 @@ -#version 120 - -uniform vec4 bigColor; -varying vec4 BaseColor; -uniform float d; - -float bar = 2.0; - -void foo() -{ - bar++; - - return; -} - -void foo2() -{ - bar++; -} - -void main() -{ - vec4 outColor = bigColor; - - foo(); - - foo2(); - - outColor.x += bar; - - gl_FragColor = outColor; - - return; -} +#version 120 + +uniform vec4 bigColor; +varying vec4 BaseColor; +uniform float d; + +float bar = 2.0; + +void foo() +{ + bar++; + + return; +} + +void foo2() +{ + bar++; +} + +void main() +{ + vec4 outColor = bigColor; + + foo(); + + foo2(); + + outColor.x += bar; + + gl_FragColor = outColor; + + return; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/vulkan.comp vulkan-1.1.73+dfsg/external/glslang/Test/vulkan.comp --- vulkan-1.1.70+dfsg1/external/glslang/Test/vulkan.comp 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/vulkan.comp 2018-04-27 11:46:26.000000000 +0000 @@ -1,12 +1,12 @@ -#version 450 - -layout(local_size_x_id = 18, local_size_z_id = 19) in; -layout(local_size_x = 32, local_size_y = 32) in; -layout(local_size_z_id = 14) in; // ERROR, can't change this - -void main() -{ - gl_WorkGroupSize; -} - -layout(local_size_y_id = 19) in; // ERROR, already used: TODO not yet reported +#version 450 + +layout(local_size_x_id = 18, local_size_z_id = 19) in; +layout(local_size_x = 32, local_size_y = 32) in; +layout(local_size_z_id = 14) in; // ERROR, can't change this + +void main() +{ + gl_WorkGroupSize; +} + +layout(local_size_y_id = 19) in; // ERROR, already used: TODO not yet reported diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/vulkan.frag vulkan-1.1.73+dfsg/external/glslang/Test/vulkan.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/vulkan.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/vulkan.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,105 +1,105 @@ -#version 450 - -uniform sampler s; -uniform sampler sA[4]; -uniform texture2D t2d; -uniform texture3D t3d[4]; -int i; -uniform samplerShadow sShadow; -uniform texture3D t3d5[5]; -writeonly uniform image2D i2d; - -void badConst() -{ - sampler2D(t2d); // ERROR, need 2 args - sampler2D(s, s); // ERROR, wrong type - sampler2D(i, i); // ERROR, wrong type - sampler2D(t2d, i); // ERROR, wrong type - sampler2D(t2d, t2d); // ERROR, wrong type - sampler2D(t2d, sA); // ERROR, wrong type - - sampler3D[4](t3d5, sA[2]); // ERROR, can't make array - sampler2D(i2d, s); // ERROR, image instead of texture - sampler2D(t3d[1], s); // ERROR, 3D not 2D - sampler2D(t2d, sShadow); // ERROR, shadow mismatch - sampler2DShadow(t2d, s); // ERROR, shadow mismatch -} - -sampler2D s2D = sampler2D(t2d, s); // ERROR, no sampler constructor -sampler3D s3d[4] = sampler3D[4](t3d, sA[2]); // ERROR, no sampler constructor - -out vec4 color; - -void main() -{ - color = texture(s2D, vec2(0.5)); - color += texture(s3d[i], vec3(0.5)); -} - -layout(push_constant) buffer pcb { // ERROR, not on a buffer - int a; -} pcbInst; - -layout(push_constant) uniform float pcfloat; // ERROR 2X: not on a non-block, and non-opaque outside block - -layout(push_constant) uniform; // ERROR, needs an object -layout(std430, push_constant) uniform pcb1 { int a; } pcb1inst; -layout(push_constant) uniform pcb2 { - int a; -}; // Okay now to have no instance name - -layout(input_attachment_index = 2) uniform subpassInput subD; -layout(input_attachment_index = 3) uniform texture2D subDbad1; // ERROR, not a texture -layout(input_attachment_index = 4) writeonly uniform image2D subDbad2; // ERROR, not an image -uniform subpassInput subDbad3; // ERROR, need attachment number -layout(input_attachment_index = 2) uniform subpassInputMS subDMS; - -void foo() -{ - vec4 v = subpassLoad(subD); - v += subpassLoadMS(subD); // ERROR, no such function - v += subpassLoad(subD, 2); // ERROR, no such sig. - v += subpassLoad(subDMS, 2); - v += subpassLoadMS(subDMS, 2); // ERROR, no such function -} - -subroutine int fooS; // ERROR, not in SPV -subroutine int fooSub(); // ERROR, not in SPV - -uniform vec4 dv4; // ERROR, no default uniforms - -void fooTex() -{ - texture(t2d, vec2(1.0)); // ERROR, need a sampler, not a pure texture - imageStore(t2d, ivec2(4, 5), vec4(1.2)); // ERROR, need an image, not a pure texture -} - -precision highp float; - -layout(location=0) in vec2 vTexCoord; -layout(location=0) out vec4 FragColor; - -vec4 userTexture(mediump sampler2D samp, vec2 coord) -{ - return texture(samp, coord); -} - -bool cond; - -void callUserTexture() -{ - userTexture(sampler2D(t2d,s), vTexCoord); // ERROR, not point of use - userTexture((sampler2D(t2d,s)), vTexCoord); // ERROR, not point of use - userTexture((sampler2D(t2d,s), sampler2D(t2d,s)), vTexCoord); // ERROR, not point of use - userTexture(cond ? sampler2D(t2d,s) : sampler2D(t2d,s), vTexCoord); // ERROR, no ?:, not point of use - - gl_NumSamples; // ERROR, not for Vulkan -} - -void noise() -{ - noise1(dv4); - noise2(4.0); - noise3(vec2(3)); - noise4(dv4); -} +#version 450 + +uniform sampler s; // ERROR, no binding +uniform sampler sA[4]; // ERROR, no binding +uniform texture2D t2d; // ERROR, no binding +uniform texture3D t3d[4]; // ERROR, no binding +int i; +uniform samplerShadow sShadow; +uniform texture3D t3d5[5]; +writeonly uniform image2D i2d; + +void badConst() +{ + sampler2D(t2d); // ERROR, need 2 args + sampler2D(s, s); // ERROR, wrong type + sampler2D(i, i); // ERROR, wrong type + sampler2D(t2d, i); // ERROR, wrong type + sampler2D(t2d, t2d); // ERROR, wrong type + sampler2D(t2d, sA); // ERROR, wrong type + + sampler3D[4](t3d5, sA[2]); // ERROR, can't make array + sampler2D(i2d, s); // ERROR, image instead of texture + sampler2D(t3d[1], s); // ERROR, 3D not 2D + sampler2D(t2d, sShadow); // ERROR, shadow mismatch + sampler2DShadow(t2d, s); // ERROR, shadow mismatch +} + +sampler2D s2D = sampler2D(t2d, s); // ERROR, no sampler constructor +sampler3D s3d[4] = sampler3D[4](t3d, sA[2]); // ERROR, no sampler constructor + +out vec4 color; // ERROR, no location + +void main() +{ + color = texture(s2D, vec2(0.5)); + color += texture(s3d[i], vec3(0.5)); +} + +layout(push_constant) buffer pcb { // ERROR, not on a buffer + int a; +} pcbInst; + +layout(push_constant) uniform float pcfloat; // ERROR 2X: not on a non-block, and non-opaque outside block + +layout(push_constant) uniform; // ERROR, needs an object +layout(std430, push_constant) uniform pcb1 { int a; } pcb1inst; +layout(push_constant) uniform pcb2 { + int a; +}; // Okay now to have no instance name + +layout(input_attachment_index = 2) uniform subpassInput subD; +layout(input_attachment_index = 3) uniform texture2D subDbad1; // ERROR, not a texture +layout(input_attachment_index = 4) writeonly uniform image2D subDbad2; // ERROR, not an image +uniform subpassInput subDbad3; // ERROR, need attachment number +layout(input_attachment_index = 2) uniform subpassInputMS subDMS; + +void foo() +{ + vec4 v = subpassLoad(subD); + v += subpassLoadMS(subD); // ERROR, no such function + v += subpassLoad(subD, 2); // ERROR, no such sig. + v += subpassLoad(subDMS, 2); + v += subpassLoadMS(subDMS, 2); // ERROR, no such function +} + +subroutine int fooS; // ERROR, not in SPV +subroutine int fooSub(); // ERROR, not in SPV + +uniform vec4 dv4; // ERROR, no default uniforms + +void fooTex() +{ + texture(t2d, vec2(1.0)); // ERROR, need a sampler, not a pure texture + imageStore(t2d, ivec2(4, 5), vec4(1.2)); // ERROR, need an image, not a pure texture +} + +precision highp float; + +layout(location=0) in vec2 vTexCoord; +layout(location=0) out vec4 FragColor; + +vec4 userTexture(mediump sampler2D samp, vec2 coord) +{ + return texture(samp, coord); +} + +bool cond; + +void callUserTexture() +{ + userTexture(sampler2D(t2d,s), vTexCoord); // ERROR, not point of use + userTexture((sampler2D(t2d,s)), vTexCoord); // ERROR, not point of use + userTexture((sampler2D(t2d,s), sampler2D(t2d,s)), vTexCoord); // ERROR, not point of use + userTexture(cond ? sampler2D(t2d,s) : sampler2D(t2d,s), vTexCoord); // ERROR, no ?:, not point of use + + gl_NumSamples; // ERROR, not for Vulkan +} + +void noise() +{ + noise1(dv4); + noise2(4.0); + noise3(vec2(3)); + noise4(dv4); +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/vulkan.vert vulkan-1.1.73+dfsg/external/glslang/Test/vulkan.vert --- vulkan-1.1.70+dfsg1/external/glslang/Test/vulkan.vert 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/vulkan.vert 2018-04-27 11:46:26.000000000 +0000 @@ -1,63 +1,65 @@ -#version 450 - -layout(input_attachment_index = 2) uniform subpassInput subD1; // ERROR, not this stage -layout(input_attachment_index = 2) uniform isubpassInput subD2; // ERROR, not this stage -layout(input_attachment_index = 2) uniform usubpassInput subD3; // ERROR, not this stage -layout(input_attachment_index = 2) uniform subpassInputMS subD4; // ERROR, not this stage -layout(input_attachment_index = 2) uniform isubpassInputMS subD5; // ERROR, not this stage -layout(input_attachment_index = 2) uniform usubpassInputMS subD6; // ERROR, not this stage - -out vec4 color; - -layout(constant_id = 17) const ivec2 arraySizes = ivec2(12,13); // ERROR, not a scalar -layout(constant_id = 17) uniform sampler2D s2D; // ERROR, not the right type or qualifier -layout(constant_id = 4000) const int c1 = 12; // ERROR, too big -layout(constant_id = 4) const float c2[2] = float[2](1.0, 2.0); // ERROR, not a scalar -layout(constant_id = 4) in; - -void main() -{ - color = subpassLoad(subD1); // ERROR, no such function in this stage -} - -layout(binding = 0) uniform atomic_uint aui; // ERROR, no atomics in Vulkan -layout(shared) uniform ub1n { int a; } ub1i; // ERROR, no shared -layout(packed) uniform ub2n { int a; } ub2i; // ERROR, no packed - -layout(constant_id=222) const int arraySize = 4; - -void foo() -{ - int a1[arraySize]; - int a2[arraySize] = a1; // ERROR, can't use in initializer - - a1 = a2; // ERROR, can't assign, even though the same type - if (a1 == a2) // ERROR, can't compare either - ++color; -} - -layout(set = 1, push_constant) uniform badpc { int a; } badpcI; // ERROR, no descriptor set with push_constant - -#ifndef VULKAN -#error VULKAN should be defined -#endif - -#if VULKAN != 100 -#error VULKAN should be 100 -#endif - -float AofA0[2][arraySize]; // ERROR, only outer dimension -float AofA1[arraySize][arraySize]; // ERROR, only outer dimension -float AofA2[arraySize][2 + arraySize]; // ERROR, only outer dimension -float AofA3[arraySize][2]; - -out ban1 { // ERROR, only outer dimension - float f; -} bai1[2][arraySize]; - -out ban2 { - float f; -} bai2[arraySize][2]; - -layout(binding = 3000) uniform sampler2D s3000; -layout(binding = 3001) uniform b3001 { int a; }; +#version 450 + +layout(input_attachment_index = 2) uniform subpassInput subD1; // ERROR, not this stage +layout(input_attachment_index = 2) uniform isubpassInput subD2; // ERROR, not this stage +layout(input_attachment_index = 2) uniform usubpassInput subD3; // ERROR, not this stage +layout(input_attachment_index = 2) uniform subpassInputMS subD4; // ERROR, not this stage +layout(input_attachment_index = 2) uniform isubpassInputMS subD5; // ERROR, not this stage +layout(input_attachment_index = 2) uniform usubpassInputMS subD6; // ERROR, not this stage + +out vec4 color; + +layout(constant_id = 17) const ivec2 arraySizes = ivec2(12,13); // ERROR, not a scalar +layout(constant_id = 17) uniform sampler2D s2D; // ERROR, not the right type or qualifier +layout(constant_id = 4000) const int c1 = 12; // ERROR, too big +layout(constant_id = 4) const float c2[2] = float[2](1.0, 2.0); // ERROR, not a scalar +layout(constant_id = 4) in; + +void main() +{ + color = subpassLoad(subD1); // ERROR, no such function in this stage +} + +layout(binding = 0) uniform atomic_uint aui; // ERROR, no atomics in Vulkan +layout(shared) uniform ub1n { int a; } ub1i; // ERROR, no shared +layout(packed) uniform ub2n { int a; } ub2i; // ERROR, no packed + +layout(constant_id=222) const int arraySize = 4; + +void foo() +{ + int a1[arraySize]; + int a2[arraySize] = a1; // ERROR, can't use in initializer + + a1 = a2; // ERROR, can't assign, even though the same type + if (a1 == a2) // ERROR, can't compare either + ++color; +} + +layout(set = 1, push_constant) uniform badpc { int a; } badpcI; // ERROR, no descriptor set with push_constant + +#ifndef VULKAN +#error VULKAN should be defined +#endif + +#if VULKAN != 100 +#error VULKAN should be 100 +#endif + +float AofA0[2][arraySize]; // ERROR, only outer dimension +float AofA1[arraySize][arraySize]; // ERROR, only outer dimension +float AofA2[arraySize][2 + arraySize]; // ERROR, only outer dimension +float AofA3[arraySize][2]; + +out ban1 { // ERROR, only outer dimension + float f; +} bai1[2][arraySize]; + +out ban2 { + float f; +} bai2[arraySize][2]; + +layout(binding = 3000) uniform sampler2D s3000; +layout(binding = 3001) uniform b3001 { int a; }; +layout(location = 10) in vec4 in1; +layout(location = 10) in vec4 in2; // ERROR, no location aliasing diff -Nru vulkan-1.1.70+dfsg1/external/glslang/Test/whileLoop.frag vulkan-1.1.73+dfsg/external/glslang/Test/whileLoop.frag --- vulkan-1.1.70+dfsg1/external/glslang/Test/whileLoop.frag 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/Test/whileLoop.frag 2018-04-27 11:46:26.000000000 +0000 @@ -1,16 +1,16 @@ -#version 110 - -uniform vec4 bigColor; -varying vec4 BaseColor; -uniform float d; - -void main() -{ - vec4 color = BaseColor; - - while (color.x < d) { - color += bigColor; - } - - gl_FragColor = color; -} +#version 110 + +uniform vec4 bigColor; +varying vec4 BaseColor; +uniform float d; + +void main() +{ + vec4 color = BaseColor; + + while (color.x < d) { + color += bigColor; + } + + gl_FragColor = color; +} diff -Nru vulkan-1.1.70+dfsg1/external/glslang/update_glslang_sources.py vulkan-1.1.73+dfsg/external/glslang/update_glslang_sources.py --- vulkan-1.1.70+dfsg1/external/glslang/update_glslang_sources.py 2018-03-12 12:57:30.000000000 +0000 +++ vulkan-1.1.73+dfsg/external/glslang/update_glslang_sources.py 2018-04-27 11:46:26.000000000 +0000 @@ -28,8 +28,12 @@ KNOWN_GOOD_FILE = 'known_good.json' +SITE_TO_KNOWN_GOOD_FILE = { 'github' : 'known_good.json', + 'gitlab' : 'known_good_khr.json' } + # Maps a site name to its hostname. -SITE_TO_HOST = { 'github' : 'github.com' } +SITE_TO_HOST = { 'github' : 'https://github.com/', + 'gitlab' : 'git@gitlab.khronos.org:' } VERBOSE = True @@ -82,14 +86,11 @@ self.subdir = json['subdir'] if ('subdir' in json) else '.' self.commit = json['commit'] - def GetUrl(self, style='https'): + def GetUrl(self): """Returns the URL for the repository.""" host = SITE_TO_HOST[self.site] - sep = '/' if (style is 'https') else ':' - return '{style}://{host}{sep}{subrepo}'.format( - style=style, + return '{host}{subrepo}'.format( host=host, - sep=sep, subrepo=self.subrepo) def AddRemote(self): @@ -120,9 +121,10 @@ command_output(['git', 'checkout', self.commit], self.subdir) -def GetGoodCommits(): +def GetGoodCommits(site): """Returns the latest list of GoodCommit objects.""" - with open(KNOWN_GOOD_FILE) as known_good: + known_good_file = SITE_TO_KNOWN_GOOD_FILE[site] + with open(known_good_file) as known_good: return [GoodCommit(c) for c in json.loads(known_good.read())['commits']] @@ -130,10 +132,12 @@ parser = argparse.ArgumentParser(description='Get Glslang source dependencies at a known-good commit') parser.add_argument('--dir', dest='dir', default='.', help="Set target directory for Glslang source root. Default is \'.\'.") + parser.add_argument('--site', dest='site', default='github', + help="Set git server site. Default is github.") args = parser.parse_args() - commits = GetGoodCommits() + commits = GetGoodCommits(args.site) distutils.dir_util.mkpath(args.dir) print('Change directory to {d}'.format(d=args.dir)) diff -Nru vulkan-1.1.70+dfsg1/external_revisions/glslang_revision vulkan-1.1.73+dfsg/external_revisions/glslang_revision --- vulkan-1.1.70+dfsg1/external_revisions/glslang_revision 2018-03-08 15:06:23.000000000 +0000 +++ vulkan-1.1.73+dfsg/external_revisions/glslang_revision 2018-04-27 11:24:19.000000000 +0000 @@ -1 +1 @@ -2651ccaec8 +3bb4c48cd95892a5cfcd63df20fcc47fd51c97a0 diff -Nru vulkan-1.1.70+dfsg1/icd/CMakeLists.txt vulkan-1.1.73+dfsg/icd/CMakeLists.txt --- vulkan-1.1.70+dfsg1/icd/CMakeLists.txt 2018-03-08 15:06:23.000000000 +0000 +++ vulkan-1.1.73+dfsg/icd/CMakeLists.txt 2018-04-27 11:24:19.000000000 +0000 @@ -21,6 +21,8 @@ add_definitions(-DVK_USE_PLATFORM_MIR_KHR -DVK_USE_PLATFORM_MIR_KHX) include_directories(${MIR_INCLUDE_DIR}) endif() +elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + add_definitions(-DVK_USE_PLATFORM_MACOS_MVK) else() message(FATAL_ERROR "Unsupported Platform!") endif() @@ -50,6 +52,27 @@ endforeach(config_file) endif() endif() +elseif(APPLE) + # extra setup for out-of-tree builds + if (NOT (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)) + if (CMAKE_GENERATOR MATCHES "^Xcode.*") + add_custom_target(mk_icd_config_dir ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/$) + foreach (config_file ${ICD_JSON_FILES}) + add_custom_target(${config_file}-json ALL + DEPENDS mk_icd_config_dir + COMMAND ln -sf ${CMAKE_CURRENT_SOURCE_DIR}/macos/${config_file}.json $ + VERBATIM + ) + endforeach(config_file) + else() + foreach (config_file ${ICD_JSON_FILES}) + add_custom_target(${config_file}-json ALL + COMMAND ln -sf ${CMAKE_CURRENT_SOURCE_DIR}/macos/${config_file}.json + VERBATIM + ) + endforeach(config_file) + endif() + endif() else() # extra setup for out-of-tree builds if (NOT (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)) @@ -87,6 +110,14 @@ #target_link_Libraries(VkICD_${target} VkICD_utils) #add_dependencies(VkICD_${target} generate_helper_files VkICD_utils) endmacro() +elseif(APPLE) + macro(add_vk_icd target) + add_library(VkICD_${target} SHARED ${ARGN}) + #target_link_Libraries(VkICD_${target} VkICD_utils) + add_dependencies(VkICD_${target} generate_icd_files) + set_target_properties(VkICD_${target} PROPERTIES LINK_FLAGS "-Wl") + install(TARGETS VkICD_${target} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + endmacro() else() macro(add_vk_icd target) add_library(VkICD_${target} SHARED ${ARGN}) diff -Nru vulkan-1.1.70+dfsg1/icd/linux/VkICD_mock_icd.json vulkan-1.1.73+dfsg/icd/linux/VkICD_mock_icd.json --- vulkan-1.1.70+dfsg1/icd/linux/VkICD_mock_icd.json 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/icd/linux/VkICD_mock_icd.json 2018-04-27 11:24:19.000000000 +0000 @@ -2,7 +2,7 @@ "file_format_version" : "1.0.1", "ICD": { "library_path": "./libVkICD_mock_icd.so", - "api_version": "1.1.70" + "api_version": "1.1.73" } } diff -Nru vulkan-1.1.70+dfsg1/icd/macos/VkICD_mock_icd.json vulkan-1.1.73+dfsg/icd/macos/VkICD_mock_icd.json --- vulkan-1.1.70+dfsg1/icd/macos/VkICD_mock_icd.json 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/icd/macos/VkICD_mock_icd.json 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,8 @@ +{ + "file_format_version" : "1.0.1", + "ICD": { + "library_path": "./libVkICD_mock_icd.dylib", + "api_version": "1.1.71" + } +} + diff -Nru vulkan-1.1.70+dfsg1/icd/windows/VkICD_mock_icd.json vulkan-1.1.73+dfsg/icd/windows/VkICD_mock_icd.json --- vulkan-1.1.70+dfsg1/icd/windows/VkICD_mock_icd.json 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/icd/windows/VkICD_mock_icd.json 2018-04-27 11:24:19.000000000 +0000 @@ -2,7 +2,7 @@ "file_format_version" : "1.0.1", "ICD": { "library_path": ".\\VkICD_mock_icd.dll", - "api_version": "1.1.70" + "api_version": "1.1.73" } } diff -Nru vulkan-1.1.70+dfsg1/include/vulkan/vk_icd.h vulkan-1.1.73+dfsg/include/vulkan/vk_icd.h --- vulkan-1.1.70+dfsg1/include/vulkan/vk_icd.h 2018-03-08 07:03:43.000000000 +0000 +++ vulkan-1.1.73+dfsg/include/vulkan/vk_icd.h 2018-04-27 11:24:19.000000000 +0000 @@ -44,12 +44,12 @@ #define CURRENT_LOADER_ICD_INTERFACE_VERSION 5 #define MIN_SUPPORTED_LOADER_ICD_INTERFACE_VERSION 0 #define MIN_PHYS_DEV_EXTENSION_ICD_INTERFACE_VERSION 4 -typedef VkResult (VKAPI_PTR *PFN_vkNegotiateLoaderICDInterfaceVersion)(uint32_t *pVersion); +typedef VkResult(VKAPI_PTR *PFN_vkNegotiateLoaderICDInterfaceVersion)(uint32_t *pVersion); // This is defined in vk_layer.h which will be found by the loader, but if an ICD is building against this // file directly, it won't be found. #ifndef PFN_GetPhysicalDeviceProcAddr -typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName); +typedef PFN_vkVoidFunction(VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char *pName); #endif /* @@ -85,6 +85,9 @@ VK_ICD_WSI_PLATFORM_WIN32, VK_ICD_WSI_PLATFORM_XCB, VK_ICD_WSI_PLATFORM_XLIB, + VK_ICD_WSI_PLATFORM_ANDROID, + VK_ICD_WSI_PLATFORM_MACOS, + VK_ICD_WSI_PLATFORM_IOS, VK_ICD_WSI_PLATFORM_DISPLAY } VkIcdWsiPlatform; @@ -98,7 +101,7 @@ MirConnection *connection; MirSurface *mirSurface; } VkIcdSurfaceMir; -#endif // VK_USE_PLATFORM_MIR_KHR +#endif // VK_USE_PLATFORM_MIR_KHR #ifdef VK_USE_PLATFORM_WAYLAND_KHR typedef struct { @@ -106,7 +109,7 @@ struct wl_display *display; struct wl_surface *surface; } VkIcdSurfaceWayland; -#endif // VK_USE_PLATFORM_WAYLAND_KHR +#endif // VK_USE_PLATFORM_WAYLAND_KHR #ifdef VK_USE_PLATFORM_WIN32_KHR typedef struct { @@ -114,7 +117,7 @@ HINSTANCE hinstance; HWND hwnd; } VkIcdSurfaceWin32; -#endif // VK_USE_PLATFORM_WIN32_KHR +#endif // VK_USE_PLATFORM_WIN32_KHR #ifdef VK_USE_PLATFORM_XCB_KHR typedef struct { @@ -122,7 +125,7 @@ xcb_connection_t *connection; xcb_window_t window; } VkIcdSurfaceXcb; -#endif // VK_USE_PLATFORM_XCB_KHR +#endif // VK_USE_PLATFORM_XCB_KHR #ifdef VK_USE_PLATFORM_XLIB_KHR typedef struct { @@ -130,13 +133,28 @@ Display *dpy; Window window; } VkIcdSurfaceXlib; -#endif // VK_USE_PLATFORM_XLIB_KHR +#endif // VK_USE_PLATFORM_XLIB_KHR #ifdef VK_USE_PLATFORM_ANDROID_KHR typedef struct { - ANativeWindow* window; + VkIcdSurfaceBase base; + ANativeWindow *window; } VkIcdSurfaceAndroid; -#endif //VK_USE_PLATFORM_ANDROID_KHR +#endif // VK_USE_PLATFORM_ANDROID_KHR + +#ifdef VK_USE_PLATFORM_MACOS_MVK +typedef struct { + VkIcdSurfaceBase base; + const void *pView; +} VkIcdSurfaceMacOS; +#endif // VK_USE_PLATFORM_MACOS_MVK + +#ifdef VK_USE_PLATFORM_IOS_MVK +typedef struct { + VkIcdSurfaceBase base; + const void *pView; +} VkIcdSurfaceIOS; +#endif // VK_USE_PLATFORM_IOS_MVK typedef struct { VkIcdSurfaceBase base; @@ -149,4 +167,4 @@ VkExtent2D imageExtent; } VkIcdSurfaceDisplay; -#endif // VKICD_H +#endif // VKICD_H diff -Nru vulkan-1.1.70+dfsg1/include/vulkan/vulkan_android.h vulkan-1.1.73+dfsg/include/vulkan/vulkan_android.h --- vulkan-1.1.70+dfsg1/include/vulkan/vulkan_android.h 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/include/vulkan/vulkan_android.h 2018-04-27 11:24:19.000000000 +0000 @@ -53,6 +53,72 @@ VkSurfaceKHR* pSurface); #endif +#define VK_ANDROID_external_memory_android_hardware_buffer 1 +struct AHardwareBuffer; + +#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_SPEC_VERSION 3 +#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME "VK_ANDROID_external_memory_android_hardware_buffer" + +typedef struct VkAndroidHardwareBufferUsageANDROID { + VkStructureType sType; + void* pNext; + uint64_t androidHardwareBufferUsage; +} VkAndroidHardwareBufferUsageANDROID; + +typedef struct VkAndroidHardwareBufferPropertiesANDROID { + VkStructureType sType; + void* pNext; + VkDeviceSize allocationSize; + uint32_t memoryTypeBits; +} VkAndroidHardwareBufferPropertiesANDROID; + +typedef struct VkAndroidHardwareBufferFormatPropertiesANDROID { + VkStructureType sType; + void* pNext; + VkFormat format; + uint64_t externalFormat; + VkFormatFeatureFlags formatFeatures; + VkComponentMapping samplerYcbcrConversionComponents; + VkSamplerYcbcrModelConversion suggestedYcbcrModel; + VkSamplerYcbcrRange suggestedYcbcrRange; + VkChromaLocation suggestedXChromaOffset; + VkChromaLocation suggestedYChromaOffset; +} VkAndroidHardwareBufferFormatPropertiesANDROID; + +typedef struct VkImportAndroidHardwareBufferInfoANDROID { + VkStructureType sType; + const void* pNext; + struct AHardwareBuffer* buffer; +} VkImportAndroidHardwareBufferInfoANDROID; + +typedef struct VkMemoryGetAndroidHardwareBufferInfoANDROID { + VkStructureType sType; + const void* pNext; + VkDeviceMemory memory; +} VkMemoryGetAndroidHardwareBufferInfoANDROID; + +typedef struct VkExternalFormatANDROID { + VkStructureType sType; + void* pNext; + uint64_t externalFormat; +} VkExternalFormatANDROID; + + +typedef VkResult (VKAPI_PTR *PFN_vkGetAndroidHardwareBufferPropertiesANDROID)(VkDevice device, const struct AHardwareBuffer* buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryAndroidHardwareBufferANDROID)(VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct AHardwareBuffer** pBuffer); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetAndroidHardwareBufferPropertiesANDROID( + VkDevice device, + const struct AHardwareBuffer* buffer, + VkAndroidHardwareBufferPropertiesANDROID* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryAndroidHardwareBufferANDROID( + VkDevice device, + const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, + struct AHardwareBuffer** pBuffer); +#endif + #ifdef __cplusplus } #endif diff -Nru vulkan-1.1.70+dfsg1/include/vulkan/vulkan_core.h vulkan-1.1.73+dfsg/include/vulkan/vulkan_core.h --- vulkan-1.1.70+dfsg1/include/vulkan/vulkan_core.h 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/include/vulkan/vulkan_core.h 2018-04-27 11:24:19.000000000 +0000 @@ -43,7 +43,7 @@ #define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff) #define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff) // Version of this file -#define VK_HEADER_VERSION 70 +#define VK_HEADER_VERSION 73 #define VK_NULL_HANDLE 0 @@ -147,6 +147,7 @@ VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001, VK_ERROR_VALIDATION_FAILED_EXT = -1000011001, VK_ERROR_INVALID_SHADER_NV = -1000012000, + VK_ERROR_FRAGMENTATION_EXT = -1000161000, VK_ERROR_NOT_PERMITTED_EXT = -1000174001, VK_ERROR_OUT_OF_POOL_MEMORY_KHR = VK_ERROR_OUT_OF_POOL_MEMORY, VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = VK_ERROR_INVALID_EXTERNAL_HANDLE, @@ -356,6 +357,12 @@ VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT = 1000128002, VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT = 1000128003, VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000128004, + VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID = 1000129000, + VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID = 1000129001, + VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID = 1000129002, + VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129003, + VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004, + VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129005, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = 1000130000, VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = 1000130001, VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT = 1000143000, @@ -371,10 +378,16 @@ VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV = 1000152000, VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160000, VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160001, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = 1000161000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = 1000161001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = 1000161002, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT = 1000161003, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = 1000161004, VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = 1000174000, VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT = 1000178000, VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT = 1000178001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000, VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001, VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, @@ -1492,12 +1505,14 @@ typedef enum VkDescriptorSetLayoutCreateFlagBits { VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR = 0x00000001, + VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT = 0x00000002, VK_DESCRIPTOR_SET_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkDescriptorSetLayoutCreateFlagBits; typedef VkFlags VkDescriptorSetLayoutCreateFlags; typedef enum VkDescriptorPoolCreateFlagBits { VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = 0x00000001, + VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT = 0x00000002, VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkDescriptorPoolCreateFlagBits; typedef VkFlags VkDescriptorPoolCreateFlags; @@ -3732,6 +3747,7 @@ VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT = 0x00000020, VK_SUBGROUP_FEATURE_CLUSTERED_BIT = 0x00000040, VK_SUBGROUP_FEATURE_QUAD_BIT = 0x00000080, + VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV = 0x00000100, VK_SUBGROUP_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkSubgroupFeatureFlagBits; typedef VkFlags VkSubgroupFeatureFlags; @@ -3767,6 +3783,7 @@ VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT = 0x00000020, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT = 0x00000040, VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT = 0x00000200, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID = 0x00000400, VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT = 0x00000080, VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT = 0x00000100, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, @@ -5090,7 +5107,7 @@ #define VK_KHR_maintenance1 1 -#define VK_KHR_MAINTENANCE1_SPEC_VERSION 1 +#define VK_KHR_MAINTENANCE1_SPEC_VERSION 2 #define VK_KHR_MAINTENANCE1_EXTENSION_NAME "VK_KHR_maintenance1" typedef VkCommandPoolTrimFlags VkCommandPoolTrimFlagsKHR; @@ -7225,6 +7242,95 @@ void* pData); #endif +#define VK_EXT_descriptor_indexing 1 +#define VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION 2 +#define VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME "VK_EXT_descriptor_indexing" + + +typedef enum VkDescriptorBindingFlagBitsEXT { + VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT = 0x00000001, + VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT = 0x00000002, + VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT = 0x00000004, + VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT = 0x00000008, + VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDescriptorBindingFlagBitsEXT; +typedef VkFlags VkDescriptorBindingFlagsEXT; + +typedef struct VkDescriptorSetLayoutBindingFlagsCreateInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t bindingCount; + const VkDescriptorBindingFlagsEXT* pBindingFlags; +} VkDescriptorSetLayoutBindingFlagsCreateInfoEXT; + +typedef struct VkPhysicalDeviceDescriptorIndexingFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 shaderInputAttachmentArrayDynamicIndexing; + VkBool32 shaderUniformTexelBufferArrayDynamicIndexing; + VkBool32 shaderStorageTexelBufferArrayDynamicIndexing; + VkBool32 shaderUniformBufferArrayNonUniformIndexing; + VkBool32 shaderSampledImageArrayNonUniformIndexing; + VkBool32 shaderStorageBufferArrayNonUniformIndexing; + VkBool32 shaderStorageImageArrayNonUniformIndexing; + VkBool32 shaderInputAttachmentArrayNonUniformIndexing; + VkBool32 shaderUniformTexelBufferArrayNonUniformIndexing; + VkBool32 shaderStorageTexelBufferArrayNonUniformIndexing; + VkBool32 descriptorBindingUniformBufferUpdateAfterBind; + VkBool32 descriptorBindingSampledImageUpdateAfterBind; + VkBool32 descriptorBindingStorageImageUpdateAfterBind; + VkBool32 descriptorBindingStorageBufferUpdateAfterBind; + VkBool32 descriptorBindingUniformTexelBufferUpdateAfterBind; + VkBool32 descriptorBindingStorageTexelBufferUpdateAfterBind; + VkBool32 descriptorBindingUpdateUnusedWhilePending; + VkBool32 descriptorBindingPartiallyBound; + VkBool32 descriptorBindingVariableDescriptorCount; + VkBool32 runtimeDescriptorArray; +} VkPhysicalDeviceDescriptorIndexingFeaturesEXT; + +typedef struct VkPhysicalDeviceDescriptorIndexingPropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t maxUpdateAfterBindDescriptorsInAllPools; + VkBool32 shaderUniformBufferArrayNonUniformIndexingNative; + VkBool32 shaderSampledImageArrayNonUniformIndexingNative; + VkBool32 shaderStorageBufferArrayNonUniformIndexingNative; + VkBool32 shaderStorageImageArrayNonUniformIndexingNative; + VkBool32 shaderInputAttachmentArrayNonUniformIndexingNative; + VkBool32 robustBufferAccessUpdateAfterBind; + VkBool32 quadDivergentImplicitLod; + uint32_t maxPerStageDescriptorUpdateAfterBindSamplers; + uint32_t maxPerStageDescriptorUpdateAfterBindUniformBuffers; + uint32_t maxPerStageDescriptorUpdateAfterBindStorageBuffers; + uint32_t maxPerStageDescriptorUpdateAfterBindSampledImages; + uint32_t maxPerStageDescriptorUpdateAfterBindStorageImages; + uint32_t maxPerStageDescriptorUpdateAfterBindInputAttachments; + uint32_t maxPerStageUpdateAfterBindResources; + uint32_t maxDescriptorSetUpdateAfterBindSamplers; + uint32_t maxDescriptorSetUpdateAfterBindUniformBuffers; + uint32_t maxDescriptorSetUpdateAfterBindUniformBuffersDynamic; + uint32_t maxDescriptorSetUpdateAfterBindStorageBuffers; + uint32_t maxDescriptorSetUpdateAfterBindStorageBuffersDynamic; + uint32_t maxDescriptorSetUpdateAfterBindSampledImages; + uint32_t maxDescriptorSetUpdateAfterBindStorageImages; + uint32_t maxDescriptorSetUpdateAfterBindInputAttachments; +} VkPhysicalDeviceDescriptorIndexingPropertiesEXT; + +typedef struct VkDescriptorSetVariableDescriptorCountAllocateInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t descriptorSetCount; + const uint32_t* pDescriptorCounts; +} VkDescriptorSetVariableDescriptorCountAllocateInfoEXT; + +typedef struct VkDescriptorSetVariableDescriptorCountLayoutSupportEXT { + VkStructureType sType; + void* pNext; + uint32_t maxVariableDescriptorCount; +} VkDescriptorSetVariableDescriptorCountLayoutSupportEXT; + + + #define VK_EXT_shader_viewport_index_layer 1 #define VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_SPEC_VERSION 1 #define VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME "VK_EXT_shader_viewport_index_layer" @@ -7303,6 +7409,31 @@ uint32_t marker); #endif +#define VK_AMD_shader_core_properties 1 +#define VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION 1 +#define VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME "VK_AMD_shader_core_properties" + +typedef struct VkPhysicalDeviceShaderCorePropertiesAMD { + VkStructureType sType; + void* pNext; + uint32_t shaderEngineCount; + uint32_t shaderArraysPerEngineCount; + uint32_t computeUnitsPerShaderArray; + uint32_t simdPerComputeUnit; + uint32_t wavefrontsPerSimd; + uint32_t wavefrontSize; + uint32_t sgprsPerSimd; + uint32_t minSgprAllocation; + uint32_t maxSgprAllocation; + uint32_t sgprAllocationGranularity; + uint32_t vgprsPerSimd; + uint32_t minVgprAllocation; + uint32_t maxVgprAllocation; + uint32_t vgprAllocationGranularity; +} VkPhysicalDeviceShaderCorePropertiesAMD; + + + #define VK_EXT_vertex_attribute_divisor 1 #define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 1 #define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME "VK_EXT_vertex_attribute_divisor" @@ -7327,6 +7458,11 @@ +#define VK_NV_shader_subgroup_partitioned 1 +#define VK_NV_SHADER_SUBGROUP_PARTITIONED_SPEC_VERSION 1 +#define VK_NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME "VK_NV_shader_subgroup_partitioned" + + #ifdef __cplusplus } #endif diff -Nru vulkan-1.1.70+dfsg1/include/vulkan/vulkan.hpp vulkan-1.1.73+dfsg/include/vulkan/vulkan.hpp --- vulkan-1.1.70+dfsg1/include/vulkan/vulkan.hpp 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/include/vulkan/vulkan.hpp 2018-04-27 11:24:19.000000000 +0000 @@ -36,7 +36,7 @@ # include # define VULKAN_HPP_ASSERT assert #endif -static_assert( VK_HEADER_VERSION == 70 , "Wrong VK_HEADER_VERSION!" ); +static_assert( VK_HEADER_VERSION == 73 , "Wrong VK_HEADER_VERSION!" ); // 32-bit vulkan is not typesafe for handles, so don't allow copy constructors on this platform by default. // To enable this feature on 32-bit platforms please define VULKAN_HPP_TYPESAFE_CONVERSION @@ -85,6 +85,12 @@ # define VULKAN_HPP_TYPESAFE_EXPLICIT explicit #endif +#if defined(_MSC_VER) && (_MSC_VER <= 1800) +# define VULKAN_HPP_CONSTEXPR +#else +# define VULKAN_HPP_CONSTEXPR constexpr +#endif + #if !defined(VULKAN_HPP_NAMESPACE) #define VULKAN_HPP_NAMESPACE vk @@ -106,7 +112,7 @@ class Flags { public: - Flags() + VULKAN_HPP_CONSTEXPR Flags() : m_mask(0) { } @@ -247,7 +253,7 @@ class ArrayProxy { public: - ArrayProxy(std::nullptr_t) + VULKAN_HPP_CONSTEXPR ArrayProxy(std::nullptr_t) : m_count(0) , m_ptr(nullptr) {} @@ -538,6 +544,7 @@ eErrorIncompatibleDisplayKHR = VK_ERROR_INCOMPATIBLE_DISPLAY_KHR, eErrorValidationFailedEXT = VK_ERROR_VALIDATION_FAILED_EXT, eErrorInvalidShaderNV = VK_ERROR_INVALID_SHADER_NV, + eErrorFragmentationEXT = VK_ERROR_FRAGMENTATION_EXT, eErrorNotPermittedEXT = VK_ERROR_NOT_PERMITTED_EXT }; @@ -572,6 +579,7 @@ case Result::eErrorIncompatibleDisplayKHR: return "ErrorIncompatibleDisplayKHR"; case Result::eErrorValidationFailedEXT: return "ErrorValidationFailedEXT"; case Result::eErrorInvalidShaderNV: return "ErrorInvalidShaderNV"; + case Result::eErrorFragmentationEXT: return "ErrorFragmentationEXT"; case Result::eErrorNotPermittedEXT: return "ErrorNotPermittedEXT"; default: return "invalid"; } @@ -817,6 +825,14 @@ InvalidShaderNVError( char const * message ) : SystemError( make_error_code( Result::eErrorInvalidShaderNV ), message ) {} }; + class FragmentationEXTError : public SystemError + { + public: + FragmentationEXTError( std::string const& message ) + : SystemError( make_error_code( Result::eErrorFragmentationEXT ), message ) {} + FragmentationEXTError( char const * message ) + : SystemError( make_error_code( Result::eErrorFragmentationEXT ), message ) {} + }; class NotPermittedEXTError : public SystemError { public: @@ -850,6 +866,7 @@ case Result::eErrorIncompatibleDisplayKHR: throw IncompatibleDisplayKHRError ( message ); case Result::eErrorValidationFailedEXT: throw ValidationFailedEXTError ( message ); case Result::eErrorInvalidShaderNV: throw InvalidShaderNVError ( message ); + case Result::eErrorFragmentationEXT: throw FragmentationEXTError ( message ); case Result::eErrorNotPermittedEXT: throw NotPermittedEXTError ( message ); default: throw SystemError( make_error_code( result ) ); } @@ -1775,6 +1792,12 @@ { return ::vkFreeMemory( device, memory, pAllocator); } +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + VkResult vkGetAndroidHardwareBufferPropertiesANDROID( VkDevice device, const struct AHardwareBuffer* buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties ) const + { + return ::vkGetAndroidHardwareBufferPropertiesANDROID( device, buffer, pProperties); + } +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ void vkGetBufferMemoryRequirements( VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements ) const { return ::vkGetBufferMemoryRequirements( device, buffer, pMemoryRequirements); @@ -1889,6 +1912,12 @@ { return ::vkGetInstanceProcAddr( instance, pName); } +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + VkResult vkGetMemoryAndroidHardwareBufferANDROID( VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct AHardwareBuffer** pBuffer ) const + { + return ::vkGetMemoryAndroidHardwareBufferANDROID( device, pInfo, pBuffer); + } +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ VkResult vkGetMemoryFdKHR( VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd ) const { return ::vkGetMemoryFdKHR( device, pGetFdInfo, pFd); @@ -2643,11 +2672,11 @@ class DeviceMemory { public: - DeviceMemory() + VULKAN_HPP_CONSTEXPR DeviceMemory() : m_deviceMemory(VK_NULL_HANDLE) {} - DeviceMemory( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR DeviceMemory( std::nullptr_t ) : m_deviceMemory(VK_NULL_HANDLE) {} @@ -2710,11 +2739,11 @@ class CommandPool { public: - CommandPool() + VULKAN_HPP_CONSTEXPR CommandPool() : m_commandPool(VK_NULL_HANDLE) {} - CommandPool( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR CommandPool( std::nullptr_t ) : m_commandPool(VK_NULL_HANDLE) {} @@ -2777,11 +2806,11 @@ class Buffer { public: - Buffer() + VULKAN_HPP_CONSTEXPR Buffer() : m_buffer(VK_NULL_HANDLE) {} - Buffer( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR Buffer( std::nullptr_t ) : m_buffer(VK_NULL_HANDLE) {} @@ -2844,11 +2873,11 @@ class BufferView { public: - BufferView() + VULKAN_HPP_CONSTEXPR BufferView() : m_bufferView(VK_NULL_HANDLE) {} - BufferView( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR BufferView( std::nullptr_t ) : m_bufferView(VK_NULL_HANDLE) {} @@ -2911,11 +2940,11 @@ class Image { public: - Image() + VULKAN_HPP_CONSTEXPR Image() : m_image(VK_NULL_HANDLE) {} - Image( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR Image( std::nullptr_t ) : m_image(VK_NULL_HANDLE) {} @@ -2978,11 +3007,11 @@ class ImageView { public: - ImageView() + VULKAN_HPP_CONSTEXPR ImageView() : m_imageView(VK_NULL_HANDLE) {} - ImageView( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR ImageView( std::nullptr_t ) : m_imageView(VK_NULL_HANDLE) {} @@ -3045,11 +3074,11 @@ class ShaderModule { public: - ShaderModule() + VULKAN_HPP_CONSTEXPR ShaderModule() : m_shaderModule(VK_NULL_HANDLE) {} - ShaderModule( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR ShaderModule( std::nullptr_t ) : m_shaderModule(VK_NULL_HANDLE) {} @@ -3112,11 +3141,11 @@ class Pipeline { public: - Pipeline() + VULKAN_HPP_CONSTEXPR Pipeline() : m_pipeline(VK_NULL_HANDLE) {} - Pipeline( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR Pipeline( std::nullptr_t ) : m_pipeline(VK_NULL_HANDLE) {} @@ -3179,11 +3208,11 @@ class PipelineLayout { public: - PipelineLayout() + VULKAN_HPP_CONSTEXPR PipelineLayout() : m_pipelineLayout(VK_NULL_HANDLE) {} - PipelineLayout( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR PipelineLayout( std::nullptr_t ) : m_pipelineLayout(VK_NULL_HANDLE) {} @@ -3246,11 +3275,11 @@ class Sampler { public: - Sampler() + VULKAN_HPP_CONSTEXPR Sampler() : m_sampler(VK_NULL_HANDLE) {} - Sampler( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR Sampler( std::nullptr_t ) : m_sampler(VK_NULL_HANDLE) {} @@ -3313,11 +3342,11 @@ class DescriptorSet { public: - DescriptorSet() + VULKAN_HPP_CONSTEXPR DescriptorSet() : m_descriptorSet(VK_NULL_HANDLE) {} - DescriptorSet( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR DescriptorSet( std::nullptr_t ) : m_descriptorSet(VK_NULL_HANDLE) {} @@ -3380,11 +3409,11 @@ class DescriptorSetLayout { public: - DescriptorSetLayout() + VULKAN_HPP_CONSTEXPR DescriptorSetLayout() : m_descriptorSetLayout(VK_NULL_HANDLE) {} - DescriptorSetLayout( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR DescriptorSetLayout( std::nullptr_t ) : m_descriptorSetLayout(VK_NULL_HANDLE) {} @@ -3447,11 +3476,11 @@ class DescriptorPool { public: - DescriptorPool() + VULKAN_HPP_CONSTEXPR DescriptorPool() : m_descriptorPool(VK_NULL_HANDLE) {} - DescriptorPool( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR DescriptorPool( std::nullptr_t ) : m_descriptorPool(VK_NULL_HANDLE) {} @@ -3514,11 +3543,11 @@ class Fence { public: - Fence() + VULKAN_HPP_CONSTEXPR Fence() : m_fence(VK_NULL_HANDLE) {} - Fence( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR Fence( std::nullptr_t ) : m_fence(VK_NULL_HANDLE) {} @@ -3581,11 +3610,11 @@ class Semaphore { public: - Semaphore() + VULKAN_HPP_CONSTEXPR Semaphore() : m_semaphore(VK_NULL_HANDLE) {} - Semaphore( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR Semaphore( std::nullptr_t ) : m_semaphore(VK_NULL_HANDLE) {} @@ -3648,11 +3677,11 @@ class Event { public: - Event() + VULKAN_HPP_CONSTEXPR Event() : m_event(VK_NULL_HANDLE) {} - Event( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR Event( std::nullptr_t ) : m_event(VK_NULL_HANDLE) {} @@ -3715,11 +3744,11 @@ class QueryPool { public: - QueryPool() + VULKAN_HPP_CONSTEXPR QueryPool() : m_queryPool(VK_NULL_HANDLE) {} - QueryPool( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR QueryPool( std::nullptr_t ) : m_queryPool(VK_NULL_HANDLE) {} @@ -3782,11 +3811,11 @@ class Framebuffer { public: - Framebuffer() + VULKAN_HPP_CONSTEXPR Framebuffer() : m_framebuffer(VK_NULL_HANDLE) {} - Framebuffer( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR Framebuffer( std::nullptr_t ) : m_framebuffer(VK_NULL_HANDLE) {} @@ -3849,11 +3878,11 @@ class RenderPass { public: - RenderPass() + VULKAN_HPP_CONSTEXPR RenderPass() : m_renderPass(VK_NULL_HANDLE) {} - RenderPass( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR RenderPass( std::nullptr_t ) : m_renderPass(VK_NULL_HANDLE) {} @@ -3916,11 +3945,11 @@ class PipelineCache { public: - PipelineCache() + VULKAN_HPP_CONSTEXPR PipelineCache() : m_pipelineCache(VK_NULL_HANDLE) {} - PipelineCache( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR PipelineCache( std::nullptr_t ) : m_pipelineCache(VK_NULL_HANDLE) {} @@ -3983,11 +4012,11 @@ class ObjectTableNVX { public: - ObjectTableNVX() + VULKAN_HPP_CONSTEXPR ObjectTableNVX() : m_objectTableNVX(VK_NULL_HANDLE) {} - ObjectTableNVX( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR ObjectTableNVX( std::nullptr_t ) : m_objectTableNVX(VK_NULL_HANDLE) {} @@ -4050,11 +4079,11 @@ class IndirectCommandsLayoutNVX { public: - IndirectCommandsLayoutNVX() + VULKAN_HPP_CONSTEXPR IndirectCommandsLayoutNVX() : m_indirectCommandsLayoutNVX(VK_NULL_HANDLE) {} - IndirectCommandsLayoutNVX( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR IndirectCommandsLayoutNVX( std::nullptr_t ) : m_indirectCommandsLayoutNVX(VK_NULL_HANDLE) {} @@ -4117,11 +4146,11 @@ class DescriptorUpdateTemplate { public: - DescriptorUpdateTemplate() + VULKAN_HPP_CONSTEXPR DescriptorUpdateTemplate() : m_descriptorUpdateTemplate(VK_NULL_HANDLE) {} - DescriptorUpdateTemplate( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR DescriptorUpdateTemplate( std::nullptr_t ) : m_descriptorUpdateTemplate(VK_NULL_HANDLE) {} @@ -4186,11 +4215,11 @@ class SamplerYcbcrConversion { public: - SamplerYcbcrConversion() + VULKAN_HPP_CONSTEXPR SamplerYcbcrConversion() : m_samplerYcbcrConversion(VK_NULL_HANDLE) {} - SamplerYcbcrConversion( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR SamplerYcbcrConversion( std::nullptr_t ) : m_samplerYcbcrConversion(VK_NULL_HANDLE) {} @@ -4255,11 +4284,11 @@ class ValidationCacheEXT { public: - ValidationCacheEXT() + VULKAN_HPP_CONSTEXPR ValidationCacheEXT() : m_validationCacheEXT(VK_NULL_HANDLE) {} - ValidationCacheEXT( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR ValidationCacheEXT( std::nullptr_t ) : m_validationCacheEXT(VK_NULL_HANDLE) {} @@ -4322,11 +4351,11 @@ class DisplayKHR { public: - DisplayKHR() + VULKAN_HPP_CONSTEXPR DisplayKHR() : m_displayKHR(VK_NULL_HANDLE) {} - DisplayKHR( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR DisplayKHR( std::nullptr_t ) : m_displayKHR(VK_NULL_HANDLE) {} @@ -4389,11 +4418,11 @@ class DisplayModeKHR { public: - DisplayModeKHR() + VULKAN_HPP_CONSTEXPR DisplayModeKHR() : m_displayModeKHR(VK_NULL_HANDLE) {} - DisplayModeKHR( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR DisplayModeKHR( std::nullptr_t ) : m_displayModeKHR(VK_NULL_HANDLE) {} @@ -4456,11 +4485,11 @@ class SurfaceKHR { public: - SurfaceKHR() + VULKAN_HPP_CONSTEXPR SurfaceKHR() : m_surfaceKHR(VK_NULL_HANDLE) {} - SurfaceKHR( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR SurfaceKHR( std::nullptr_t ) : m_surfaceKHR(VK_NULL_HANDLE) {} @@ -4523,11 +4552,11 @@ class SwapchainKHR { public: - SwapchainKHR() + VULKAN_HPP_CONSTEXPR SwapchainKHR() : m_swapchainKHR(VK_NULL_HANDLE) {} - SwapchainKHR( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR SwapchainKHR( std::nullptr_t ) : m_swapchainKHR(VK_NULL_HANDLE) {} @@ -4590,11 +4619,11 @@ class DebugReportCallbackEXT { public: - DebugReportCallbackEXT() + VULKAN_HPP_CONSTEXPR DebugReportCallbackEXT() : m_debugReportCallbackEXT(VK_NULL_HANDLE) {} - DebugReportCallbackEXT( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR DebugReportCallbackEXT( std::nullptr_t ) : m_debugReportCallbackEXT(VK_NULL_HANDLE) {} @@ -4657,11 +4686,11 @@ class DebugUtilsMessengerEXT { public: - DebugUtilsMessengerEXT() + VULKAN_HPP_CONSTEXPR DebugUtilsMessengerEXT() : m_debugUtilsMessengerEXT(VK_NULL_HANDLE) {} - DebugUtilsMessengerEXT( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR DebugUtilsMessengerEXT( std::nullptr_t ) : m_debugUtilsMessengerEXT(VK_NULL_HANDLE) {} @@ -8519,6 +8548,12 @@ eDebugUtilsLabelEXT = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, eDebugUtilsMessengerCallbackDataEXT = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT, eDebugUtilsMessengerCreateInfoEXT = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, + eAndroidHardwareBufferUsageANDROID = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID, + eAndroidHardwareBufferPropertiesANDROID = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID, + eAndroidHardwareBufferFormatPropertiesANDROID = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID, + eImportAndroidHardwareBufferInfoANDROID = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, + eMemoryGetAndroidHardwareBufferInfoANDROID = VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, + eExternalFormatANDROID = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID, ePhysicalDeviceSamplerFilterMinmaxPropertiesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT, eSamplerReductionModeCreateInfoEXT = VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT, eSampleLocationsInfoEXT = VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT, @@ -8534,10 +8569,16 @@ ePipelineCoverageModulationStateCreateInfoNV = VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV, eValidationCacheCreateInfoEXT = VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT, eShaderModuleValidationCacheCreateInfoEXT = VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT, + eDescriptorSetLayoutBindingFlagsCreateInfoEXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT, + ePhysicalDeviceDescriptorIndexingFeaturesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, + ePhysicalDeviceDescriptorIndexingPropertiesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT, + eDescriptorSetVariableDescriptorCountAllocateInfoEXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT, + eDescriptorSetVariableDescriptorCountLayoutSupportEXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT, eDeviceQueueGlobalPriorityCreateInfoEXT = VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT, eImportMemoryHostPointerInfoEXT = VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT, eMemoryHostPointerPropertiesEXT = VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT, ePhysicalDeviceExternalMemoryHostPropertiesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, + ePhysicalDeviceShaderCorePropertiesAMD = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD, ePhysicalDeviceVertexAttributeDivisorPropertiesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, ePipelineVertexInputDivisorStateCreateInfoEXT = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT }; @@ -15714,6 +15755,450 @@ }; static_assert( sizeof( PhysicalDeviceConservativeRasterizationPropertiesEXT ) == sizeof( VkPhysicalDeviceConservativeRasterizationPropertiesEXT ), "struct and wrapper have different size!" ); + struct PhysicalDeviceShaderCorePropertiesAMD + { + operator const VkPhysicalDeviceShaderCorePropertiesAMD&() const + { + return *reinterpret_cast(this); + } + + bool operator==( PhysicalDeviceShaderCorePropertiesAMD const& rhs ) const + { + return ( sType == rhs.sType ) + && ( pNext == rhs.pNext ) + && ( shaderEngineCount == rhs.shaderEngineCount ) + && ( shaderArraysPerEngineCount == rhs.shaderArraysPerEngineCount ) + && ( computeUnitsPerShaderArray == rhs.computeUnitsPerShaderArray ) + && ( simdPerComputeUnit == rhs.simdPerComputeUnit ) + && ( wavefrontsPerSimd == rhs.wavefrontsPerSimd ) + && ( wavefrontSize == rhs.wavefrontSize ) + && ( sgprsPerSimd == rhs.sgprsPerSimd ) + && ( minSgprAllocation == rhs.minSgprAllocation ) + && ( maxSgprAllocation == rhs.maxSgprAllocation ) + && ( sgprAllocationGranularity == rhs.sgprAllocationGranularity ) + && ( vgprsPerSimd == rhs.vgprsPerSimd ) + && ( minVgprAllocation == rhs.minVgprAllocation ) + && ( maxVgprAllocation == rhs.maxVgprAllocation ) + && ( vgprAllocationGranularity == rhs.vgprAllocationGranularity ); + } + + bool operator!=( PhysicalDeviceShaderCorePropertiesAMD const& rhs ) const + { + return !operator==( rhs ); + } + + private: + StructureType sType = StructureType::ePhysicalDeviceShaderCorePropertiesAMD; + + public: + void* pNext = nullptr; + uint32_t shaderEngineCount; + uint32_t shaderArraysPerEngineCount; + uint32_t computeUnitsPerShaderArray; + uint32_t simdPerComputeUnit; + uint32_t wavefrontsPerSimd; + uint32_t wavefrontSize; + uint32_t sgprsPerSimd; + uint32_t minSgprAllocation; + uint32_t maxSgprAllocation; + uint32_t sgprAllocationGranularity; + uint32_t vgprsPerSimd; + uint32_t minVgprAllocation; + uint32_t maxVgprAllocation; + uint32_t vgprAllocationGranularity; + }; + static_assert( sizeof( PhysicalDeviceShaderCorePropertiesAMD ) == sizeof( VkPhysicalDeviceShaderCorePropertiesAMD ), "struct and wrapper have different size!" ); + + struct PhysicalDeviceDescriptorIndexingFeaturesEXT + { + PhysicalDeviceDescriptorIndexingFeaturesEXT( Bool32 shaderInputAttachmentArrayDynamicIndexing_ = 0, Bool32 shaderUniformTexelBufferArrayDynamicIndexing_ = 0, Bool32 shaderStorageTexelBufferArrayDynamicIndexing_ = 0, Bool32 shaderUniformBufferArrayNonUniformIndexing_ = 0, Bool32 shaderSampledImageArrayNonUniformIndexing_ = 0, Bool32 shaderStorageBufferArrayNonUniformIndexing_ = 0, Bool32 shaderStorageImageArrayNonUniformIndexing_ = 0, Bool32 shaderInputAttachmentArrayNonUniformIndexing_ = 0, Bool32 shaderUniformTexelBufferArrayNonUniformIndexing_ = 0, Bool32 shaderStorageTexelBufferArrayNonUniformIndexing_ = 0, Bool32 descriptorBindingUniformBufferUpdateAfterBind_ = 0, Bool32 descriptorBindingSampledImageUpdateAfterBind_ = 0, Bool32 descriptorBindingStorageImageUpdateAfterBind_ = 0, Bool32 descriptorBindingStorageBufferUpdateAfterBind_ = 0, Bool32 descriptorBindingUniformTexelBufferUpdateAfterBind_ = 0, Bool32 descriptorBindingStorageTexelBufferUpdateAfterBind_ = 0, Bool32 descriptorBindingUpdateUnusedWhilePending_ = 0, Bool32 descriptorBindingPartiallyBound_ = 0, Bool32 descriptorBindingVariableDescriptorCount_ = 0, Bool32 runtimeDescriptorArray_ = 0 ) + : shaderInputAttachmentArrayDynamicIndexing( shaderInputAttachmentArrayDynamicIndexing_ ) + , shaderUniformTexelBufferArrayDynamicIndexing( shaderUniformTexelBufferArrayDynamicIndexing_ ) + , shaderStorageTexelBufferArrayDynamicIndexing( shaderStorageTexelBufferArrayDynamicIndexing_ ) + , shaderUniformBufferArrayNonUniformIndexing( shaderUniformBufferArrayNonUniformIndexing_ ) + , shaderSampledImageArrayNonUniformIndexing( shaderSampledImageArrayNonUniformIndexing_ ) + , shaderStorageBufferArrayNonUniformIndexing( shaderStorageBufferArrayNonUniformIndexing_ ) + , shaderStorageImageArrayNonUniformIndexing( shaderStorageImageArrayNonUniformIndexing_ ) + , shaderInputAttachmentArrayNonUniformIndexing( shaderInputAttachmentArrayNonUniformIndexing_ ) + , shaderUniformTexelBufferArrayNonUniformIndexing( shaderUniformTexelBufferArrayNonUniformIndexing_ ) + , shaderStorageTexelBufferArrayNonUniformIndexing( shaderStorageTexelBufferArrayNonUniformIndexing_ ) + , descriptorBindingUniformBufferUpdateAfterBind( descriptorBindingUniformBufferUpdateAfterBind_ ) + , descriptorBindingSampledImageUpdateAfterBind( descriptorBindingSampledImageUpdateAfterBind_ ) + , descriptorBindingStorageImageUpdateAfterBind( descriptorBindingStorageImageUpdateAfterBind_ ) + , descriptorBindingStorageBufferUpdateAfterBind( descriptorBindingStorageBufferUpdateAfterBind_ ) + , descriptorBindingUniformTexelBufferUpdateAfterBind( descriptorBindingUniformTexelBufferUpdateAfterBind_ ) + , descriptorBindingStorageTexelBufferUpdateAfterBind( descriptorBindingStorageTexelBufferUpdateAfterBind_ ) + , descriptorBindingUpdateUnusedWhilePending( descriptorBindingUpdateUnusedWhilePending_ ) + , descriptorBindingPartiallyBound( descriptorBindingPartiallyBound_ ) + , descriptorBindingVariableDescriptorCount( descriptorBindingVariableDescriptorCount_ ) + , runtimeDescriptorArray( runtimeDescriptorArray_ ) + { + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT( VkPhysicalDeviceDescriptorIndexingFeaturesEXT const & rhs ) + { + memcpy( this, &rhs, sizeof( PhysicalDeviceDescriptorIndexingFeaturesEXT ) ); + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& operator=( VkPhysicalDeviceDescriptorIndexingFeaturesEXT const & rhs ) + { + memcpy( this, &rhs, sizeof( PhysicalDeviceDescriptorIndexingFeaturesEXT ) ); + return *this; + } + PhysicalDeviceDescriptorIndexingFeaturesEXT& setPNext( void* pNext_ ) + { + pNext = pNext_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setShaderInputAttachmentArrayDynamicIndexing( Bool32 shaderInputAttachmentArrayDynamicIndexing_ ) + { + shaderInputAttachmentArrayDynamicIndexing = shaderInputAttachmentArrayDynamicIndexing_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setShaderUniformTexelBufferArrayDynamicIndexing( Bool32 shaderUniformTexelBufferArrayDynamicIndexing_ ) + { + shaderUniformTexelBufferArrayDynamicIndexing = shaderUniformTexelBufferArrayDynamicIndexing_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setShaderStorageTexelBufferArrayDynamicIndexing( Bool32 shaderStorageTexelBufferArrayDynamicIndexing_ ) + { + shaderStorageTexelBufferArrayDynamicIndexing = shaderStorageTexelBufferArrayDynamicIndexing_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setShaderUniformBufferArrayNonUniformIndexing( Bool32 shaderUniformBufferArrayNonUniformIndexing_ ) + { + shaderUniformBufferArrayNonUniformIndexing = shaderUniformBufferArrayNonUniformIndexing_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setShaderSampledImageArrayNonUniformIndexing( Bool32 shaderSampledImageArrayNonUniformIndexing_ ) + { + shaderSampledImageArrayNonUniformIndexing = shaderSampledImageArrayNonUniformIndexing_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setShaderStorageBufferArrayNonUniformIndexing( Bool32 shaderStorageBufferArrayNonUniformIndexing_ ) + { + shaderStorageBufferArrayNonUniformIndexing = shaderStorageBufferArrayNonUniformIndexing_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setShaderStorageImageArrayNonUniformIndexing( Bool32 shaderStorageImageArrayNonUniformIndexing_ ) + { + shaderStorageImageArrayNonUniformIndexing = shaderStorageImageArrayNonUniformIndexing_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setShaderInputAttachmentArrayNonUniformIndexing( Bool32 shaderInputAttachmentArrayNonUniformIndexing_ ) + { + shaderInputAttachmentArrayNonUniformIndexing = shaderInputAttachmentArrayNonUniformIndexing_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setShaderUniformTexelBufferArrayNonUniformIndexing( Bool32 shaderUniformTexelBufferArrayNonUniformIndexing_ ) + { + shaderUniformTexelBufferArrayNonUniformIndexing = shaderUniformTexelBufferArrayNonUniformIndexing_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setShaderStorageTexelBufferArrayNonUniformIndexing( Bool32 shaderStorageTexelBufferArrayNonUniformIndexing_ ) + { + shaderStorageTexelBufferArrayNonUniformIndexing = shaderStorageTexelBufferArrayNonUniformIndexing_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setDescriptorBindingUniformBufferUpdateAfterBind( Bool32 descriptorBindingUniformBufferUpdateAfterBind_ ) + { + descriptorBindingUniformBufferUpdateAfterBind = descriptorBindingUniformBufferUpdateAfterBind_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setDescriptorBindingSampledImageUpdateAfterBind( Bool32 descriptorBindingSampledImageUpdateAfterBind_ ) + { + descriptorBindingSampledImageUpdateAfterBind = descriptorBindingSampledImageUpdateAfterBind_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setDescriptorBindingStorageImageUpdateAfterBind( Bool32 descriptorBindingStorageImageUpdateAfterBind_ ) + { + descriptorBindingStorageImageUpdateAfterBind = descriptorBindingStorageImageUpdateAfterBind_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setDescriptorBindingStorageBufferUpdateAfterBind( Bool32 descriptorBindingStorageBufferUpdateAfterBind_ ) + { + descriptorBindingStorageBufferUpdateAfterBind = descriptorBindingStorageBufferUpdateAfterBind_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setDescriptorBindingUniformTexelBufferUpdateAfterBind( Bool32 descriptorBindingUniformTexelBufferUpdateAfterBind_ ) + { + descriptorBindingUniformTexelBufferUpdateAfterBind = descriptorBindingUniformTexelBufferUpdateAfterBind_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setDescriptorBindingStorageTexelBufferUpdateAfterBind( Bool32 descriptorBindingStorageTexelBufferUpdateAfterBind_ ) + { + descriptorBindingStorageTexelBufferUpdateAfterBind = descriptorBindingStorageTexelBufferUpdateAfterBind_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setDescriptorBindingUpdateUnusedWhilePending( Bool32 descriptorBindingUpdateUnusedWhilePending_ ) + { + descriptorBindingUpdateUnusedWhilePending = descriptorBindingUpdateUnusedWhilePending_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setDescriptorBindingPartiallyBound( Bool32 descriptorBindingPartiallyBound_ ) + { + descriptorBindingPartiallyBound = descriptorBindingPartiallyBound_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setDescriptorBindingVariableDescriptorCount( Bool32 descriptorBindingVariableDescriptorCount_ ) + { + descriptorBindingVariableDescriptorCount = descriptorBindingVariableDescriptorCount_; + return *this; + } + + PhysicalDeviceDescriptorIndexingFeaturesEXT& setRuntimeDescriptorArray( Bool32 runtimeDescriptorArray_ ) + { + runtimeDescriptorArray = runtimeDescriptorArray_; + return *this; + } + + operator const VkPhysicalDeviceDescriptorIndexingFeaturesEXT&() const + { + return *reinterpret_cast(this); + } + + bool operator==( PhysicalDeviceDescriptorIndexingFeaturesEXT const& rhs ) const + { + return ( sType == rhs.sType ) + && ( pNext == rhs.pNext ) + && ( shaderInputAttachmentArrayDynamicIndexing == rhs.shaderInputAttachmentArrayDynamicIndexing ) + && ( shaderUniformTexelBufferArrayDynamicIndexing == rhs.shaderUniformTexelBufferArrayDynamicIndexing ) + && ( shaderStorageTexelBufferArrayDynamicIndexing == rhs.shaderStorageTexelBufferArrayDynamicIndexing ) + && ( shaderUniformBufferArrayNonUniformIndexing == rhs.shaderUniformBufferArrayNonUniformIndexing ) + && ( shaderSampledImageArrayNonUniformIndexing == rhs.shaderSampledImageArrayNonUniformIndexing ) + && ( shaderStorageBufferArrayNonUniformIndexing == rhs.shaderStorageBufferArrayNonUniformIndexing ) + && ( shaderStorageImageArrayNonUniformIndexing == rhs.shaderStorageImageArrayNonUniformIndexing ) + && ( shaderInputAttachmentArrayNonUniformIndexing == rhs.shaderInputAttachmentArrayNonUniformIndexing ) + && ( shaderUniformTexelBufferArrayNonUniformIndexing == rhs.shaderUniformTexelBufferArrayNonUniformIndexing ) + && ( shaderStorageTexelBufferArrayNonUniformIndexing == rhs.shaderStorageTexelBufferArrayNonUniformIndexing ) + && ( descriptorBindingUniformBufferUpdateAfterBind == rhs.descriptorBindingUniformBufferUpdateAfterBind ) + && ( descriptorBindingSampledImageUpdateAfterBind == rhs.descriptorBindingSampledImageUpdateAfterBind ) + && ( descriptorBindingStorageImageUpdateAfterBind == rhs.descriptorBindingStorageImageUpdateAfterBind ) + && ( descriptorBindingStorageBufferUpdateAfterBind == rhs.descriptorBindingStorageBufferUpdateAfterBind ) + && ( descriptorBindingUniformTexelBufferUpdateAfterBind == rhs.descriptorBindingUniformTexelBufferUpdateAfterBind ) + && ( descriptorBindingStorageTexelBufferUpdateAfterBind == rhs.descriptorBindingStorageTexelBufferUpdateAfterBind ) + && ( descriptorBindingUpdateUnusedWhilePending == rhs.descriptorBindingUpdateUnusedWhilePending ) + && ( descriptorBindingPartiallyBound == rhs.descriptorBindingPartiallyBound ) + && ( descriptorBindingVariableDescriptorCount == rhs.descriptorBindingVariableDescriptorCount ) + && ( runtimeDescriptorArray == rhs.runtimeDescriptorArray ); + } + + bool operator!=( PhysicalDeviceDescriptorIndexingFeaturesEXT const& rhs ) const + { + return !operator==( rhs ); + } + + private: + StructureType sType = StructureType::ePhysicalDeviceDescriptorIndexingFeaturesEXT; + + public: + void* pNext = nullptr; + Bool32 shaderInputAttachmentArrayDynamicIndexing; + Bool32 shaderUniformTexelBufferArrayDynamicIndexing; + Bool32 shaderStorageTexelBufferArrayDynamicIndexing; + Bool32 shaderUniformBufferArrayNonUniformIndexing; + Bool32 shaderSampledImageArrayNonUniformIndexing; + Bool32 shaderStorageBufferArrayNonUniformIndexing; + Bool32 shaderStorageImageArrayNonUniformIndexing; + Bool32 shaderInputAttachmentArrayNonUniformIndexing; + Bool32 shaderUniformTexelBufferArrayNonUniformIndexing; + Bool32 shaderStorageTexelBufferArrayNonUniformIndexing; + Bool32 descriptorBindingUniformBufferUpdateAfterBind; + Bool32 descriptorBindingSampledImageUpdateAfterBind; + Bool32 descriptorBindingStorageImageUpdateAfterBind; + Bool32 descriptorBindingStorageBufferUpdateAfterBind; + Bool32 descriptorBindingUniformTexelBufferUpdateAfterBind; + Bool32 descriptorBindingStorageTexelBufferUpdateAfterBind; + Bool32 descriptorBindingUpdateUnusedWhilePending; + Bool32 descriptorBindingPartiallyBound; + Bool32 descriptorBindingVariableDescriptorCount; + Bool32 runtimeDescriptorArray; + }; + static_assert( sizeof( PhysicalDeviceDescriptorIndexingFeaturesEXT ) == sizeof( VkPhysicalDeviceDescriptorIndexingFeaturesEXT ), "struct and wrapper have different size!" ); + + struct PhysicalDeviceDescriptorIndexingPropertiesEXT + { + operator const VkPhysicalDeviceDescriptorIndexingPropertiesEXT&() const + { + return *reinterpret_cast(this); + } + + bool operator==( PhysicalDeviceDescriptorIndexingPropertiesEXT const& rhs ) const + { + return ( sType == rhs.sType ) + && ( pNext == rhs.pNext ) + && ( maxUpdateAfterBindDescriptorsInAllPools == rhs.maxUpdateAfterBindDescriptorsInAllPools ) + && ( shaderUniformBufferArrayNonUniformIndexingNative == rhs.shaderUniformBufferArrayNonUniformIndexingNative ) + && ( shaderSampledImageArrayNonUniformIndexingNative == rhs.shaderSampledImageArrayNonUniformIndexingNative ) + && ( shaderStorageBufferArrayNonUniformIndexingNative == rhs.shaderStorageBufferArrayNonUniformIndexingNative ) + && ( shaderStorageImageArrayNonUniformIndexingNative == rhs.shaderStorageImageArrayNonUniformIndexingNative ) + && ( shaderInputAttachmentArrayNonUniformIndexingNative == rhs.shaderInputAttachmentArrayNonUniformIndexingNative ) + && ( robustBufferAccessUpdateAfterBind == rhs.robustBufferAccessUpdateAfterBind ) + && ( quadDivergentImplicitLod == rhs.quadDivergentImplicitLod ) + && ( maxPerStageDescriptorUpdateAfterBindSamplers == rhs.maxPerStageDescriptorUpdateAfterBindSamplers ) + && ( maxPerStageDescriptorUpdateAfterBindUniformBuffers == rhs.maxPerStageDescriptorUpdateAfterBindUniformBuffers ) + && ( maxPerStageDescriptorUpdateAfterBindStorageBuffers == rhs.maxPerStageDescriptorUpdateAfterBindStorageBuffers ) + && ( maxPerStageDescriptorUpdateAfterBindSampledImages == rhs.maxPerStageDescriptorUpdateAfterBindSampledImages ) + && ( maxPerStageDescriptorUpdateAfterBindStorageImages == rhs.maxPerStageDescriptorUpdateAfterBindStorageImages ) + && ( maxPerStageDescriptorUpdateAfterBindInputAttachments == rhs.maxPerStageDescriptorUpdateAfterBindInputAttachments ) + && ( maxPerStageUpdateAfterBindResources == rhs.maxPerStageUpdateAfterBindResources ) + && ( maxDescriptorSetUpdateAfterBindSamplers == rhs.maxDescriptorSetUpdateAfterBindSamplers ) + && ( maxDescriptorSetUpdateAfterBindUniformBuffers == rhs.maxDescriptorSetUpdateAfterBindUniformBuffers ) + && ( maxDescriptorSetUpdateAfterBindUniformBuffersDynamic == rhs.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic ) + && ( maxDescriptorSetUpdateAfterBindStorageBuffers == rhs.maxDescriptorSetUpdateAfterBindStorageBuffers ) + && ( maxDescriptorSetUpdateAfterBindStorageBuffersDynamic == rhs.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic ) + && ( maxDescriptorSetUpdateAfterBindSampledImages == rhs.maxDescriptorSetUpdateAfterBindSampledImages ) + && ( maxDescriptorSetUpdateAfterBindStorageImages == rhs.maxDescriptorSetUpdateAfterBindStorageImages ) + && ( maxDescriptorSetUpdateAfterBindInputAttachments == rhs.maxDescriptorSetUpdateAfterBindInputAttachments ); + } + + bool operator!=( PhysicalDeviceDescriptorIndexingPropertiesEXT const& rhs ) const + { + return !operator==( rhs ); + } + + private: + StructureType sType = StructureType::ePhysicalDeviceDescriptorIndexingPropertiesEXT; + + public: + void* pNext = nullptr; + uint32_t maxUpdateAfterBindDescriptorsInAllPools; + Bool32 shaderUniformBufferArrayNonUniformIndexingNative; + Bool32 shaderSampledImageArrayNonUniformIndexingNative; + Bool32 shaderStorageBufferArrayNonUniformIndexingNative; + Bool32 shaderStorageImageArrayNonUniformIndexingNative; + Bool32 shaderInputAttachmentArrayNonUniformIndexingNative; + Bool32 robustBufferAccessUpdateAfterBind; + Bool32 quadDivergentImplicitLod; + uint32_t maxPerStageDescriptorUpdateAfterBindSamplers; + uint32_t maxPerStageDescriptorUpdateAfterBindUniformBuffers; + uint32_t maxPerStageDescriptorUpdateAfterBindStorageBuffers; + uint32_t maxPerStageDescriptorUpdateAfterBindSampledImages; + uint32_t maxPerStageDescriptorUpdateAfterBindStorageImages; + uint32_t maxPerStageDescriptorUpdateAfterBindInputAttachments; + uint32_t maxPerStageUpdateAfterBindResources; + uint32_t maxDescriptorSetUpdateAfterBindSamplers; + uint32_t maxDescriptorSetUpdateAfterBindUniformBuffers; + uint32_t maxDescriptorSetUpdateAfterBindUniformBuffersDynamic; + uint32_t maxDescriptorSetUpdateAfterBindStorageBuffers; + uint32_t maxDescriptorSetUpdateAfterBindStorageBuffersDynamic; + uint32_t maxDescriptorSetUpdateAfterBindSampledImages; + uint32_t maxDescriptorSetUpdateAfterBindStorageImages; + uint32_t maxDescriptorSetUpdateAfterBindInputAttachments; + }; + static_assert( sizeof( PhysicalDeviceDescriptorIndexingPropertiesEXT ) == sizeof( VkPhysicalDeviceDescriptorIndexingPropertiesEXT ), "struct and wrapper have different size!" ); + + struct DescriptorSetVariableDescriptorCountAllocateInfoEXT + { + DescriptorSetVariableDescriptorCountAllocateInfoEXT( uint32_t descriptorSetCount_ = 0, const uint32_t* pDescriptorCounts_ = nullptr ) + : descriptorSetCount( descriptorSetCount_ ) + , pDescriptorCounts( pDescriptorCounts_ ) + { + } + + DescriptorSetVariableDescriptorCountAllocateInfoEXT( VkDescriptorSetVariableDescriptorCountAllocateInfoEXT const & rhs ) + { + memcpy( this, &rhs, sizeof( DescriptorSetVariableDescriptorCountAllocateInfoEXT ) ); + } + + DescriptorSetVariableDescriptorCountAllocateInfoEXT& operator=( VkDescriptorSetVariableDescriptorCountAllocateInfoEXT const & rhs ) + { + memcpy( this, &rhs, sizeof( DescriptorSetVariableDescriptorCountAllocateInfoEXT ) ); + return *this; + } + DescriptorSetVariableDescriptorCountAllocateInfoEXT& setPNext( const void* pNext_ ) + { + pNext = pNext_; + return *this; + } + + DescriptorSetVariableDescriptorCountAllocateInfoEXT& setDescriptorSetCount( uint32_t descriptorSetCount_ ) + { + descriptorSetCount = descriptorSetCount_; + return *this; + } + + DescriptorSetVariableDescriptorCountAllocateInfoEXT& setPDescriptorCounts( const uint32_t* pDescriptorCounts_ ) + { + pDescriptorCounts = pDescriptorCounts_; + return *this; + } + + operator const VkDescriptorSetVariableDescriptorCountAllocateInfoEXT&() const + { + return *reinterpret_cast(this); + } + + bool operator==( DescriptorSetVariableDescriptorCountAllocateInfoEXT const& rhs ) const + { + return ( sType == rhs.sType ) + && ( pNext == rhs.pNext ) + && ( descriptorSetCount == rhs.descriptorSetCount ) + && ( pDescriptorCounts == rhs.pDescriptorCounts ); + } + + bool operator!=( DescriptorSetVariableDescriptorCountAllocateInfoEXT const& rhs ) const + { + return !operator==( rhs ); + } + + private: + StructureType sType = StructureType::eDescriptorSetVariableDescriptorCountAllocateInfoEXT; + + public: + const void* pNext = nullptr; + uint32_t descriptorSetCount; + const uint32_t* pDescriptorCounts; + }; + static_assert( sizeof( DescriptorSetVariableDescriptorCountAllocateInfoEXT ) == sizeof( VkDescriptorSetVariableDescriptorCountAllocateInfoEXT ), "struct and wrapper have different size!" ); + + struct DescriptorSetVariableDescriptorCountLayoutSupportEXT + { + operator const VkDescriptorSetVariableDescriptorCountLayoutSupportEXT&() const + { + return *reinterpret_cast(this); + } + + bool operator==( DescriptorSetVariableDescriptorCountLayoutSupportEXT const& rhs ) const + { + return ( sType == rhs.sType ) + && ( pNext == rhs.pNext ) + && ( maxVariableDescriptorCount == rhs.maxVariableDescriptorCount ); + } + + bool operator!=( DescriptorSetVariableDescriptorCountLayoutSupportEXT const& rhs ) const + { + return !operator==( rhs ); + } + + private: + StructureType sType = StructureType::eDescriptorSetVariableDescriptorCountLayoutSupportEXT; + + public: + void* pNext = nullptr; + uint32_t maxVariableDescriptorCount; + }; + static_assert( sizeof( DescriptorSetVariableDescriptorCountLayoutSupportEXT ) == sizeof( VkDescriptorSetVariableDescriptorCountLayoutSupportEXT ), "struct and wrapper have different size!" ); + struct PipelineVertexInputDivisorStateCreateInfoEXT { PipelineVertexInputDivisorStateCreateInfoEXT( uint32_t vertexBindingDivisorCount_ = 0, const VertexInputBindingDivisorDescriptionEXT* pVertexBindingDivisors_ = nullptr ) @@ -15833,6 +16318,239 @@ }; static_assert( sizeof( PhysicalDeviceVertexAttributeDivisorPropertiesEXT ) == sizeof( VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT ), "struct and wrapper have different size!" ); +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + struct ImportAndroidHardwareBufferInfoANDROID + { + ImportAndroidHardwareBufferInfoANDROID( struct AHardwareBuffer* buffer_ = nullptr ) + : buffer( buffer_ ) + { + } + + ImportAndroidHardwareBufferInfoANDROID( VkImportAndroidHardwareBufferInfoANDROID const & rhs ) + { + memcpy( this, &rhs, sizeof( ImportAndroidHardwareBufferInfoANDROID ) ); + } + + ImportAndroidHardwareBufferInfoANDROID& operator=( VkImportAndroidHardwareBufferInfoANDROID const & rhs ) + { + memcpy( this, &rhs, sizeof( ImportAndroidHardwareBufferInfoANDROID ) ); + return *this; + } + ImportAndroidHardwareBufferInfoANDROID& setPNext( const void* pNext_ ) + { + pNext = pNext_; + return *this; + } + + ImportAndroidHardwareBufferInfoANDROID& setBuffer( struct AHardwareBuffer* buffer_ ) + { + buffer = buffer_; + return *this; + } + + operator const VkImportAndroidHardwareBufferInfoANDROID&() const + { + return *reinterpret_cast(this); + } + + bool operator==( ImportAndroidHardwareBufferInfoANDROID const& rhs ) const + { + return ( sType == rhs.sType ) + && ( pNext == rhs.pNext ) + && ( buffer == rhs.buffer ); + } + + bool operator!=( ImportAndroidHardwareBufferInfoANDROID const& rhs ) const + { + return !operator==( rhs ); + } + + private: + StructureType sType = StructureType::eImportAndroidHardwareBufferInfoANDROID; + + public: + const void* pNext = nullptr; + struct AHardwareBuffer* buffer; + }; + static_assert( sizeof( ImportAndroidHardwareBufferInfoANDROID ) == sizeof( VkImportAndroidHardwareBufferInfoANDROID ), "struct and wrapper have different size!" ); +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ + +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + struct AndroidHardwareBufferUsageANDROID + { + operator const VkAndroidHardwareBufferUsageANDROID&() const + { + return *reinterpret_cast(this); + } + + bool operator==( AndroidHardwareBufferUsageANDROID const& rhs ) const + { + return ( sType == rhs.sType ) + && ( pNext == rhs.pNext ) + && ( androidHardwareBufferUsage == rhs.androidHardwareBufferUsage ); + } + + bool operator!=( AndroidHardwareBufferUsageANDROID const& rhs ) const + { + return !operator==( rhs ); + } + + private: + StructureType sType = StructureType::eAndroidHardwareBufferUsageANDROID; + + public: + void* pNext = nullptr; + uint64_t androidHardwareBufferUsage; + }; + static_assert( sizeof( AndroidHardwareBufferUsageANDROID ) == sizeof( VkAndroidHardwareBufferUsageANDROID ), "struct and wrapper have different size!" ); +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ + +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + struct AndroidHardwareBufferPropertiesANDROID + { + operator const VkAndroidHardwareBufferPropertiesANDROID&() const + { + return *reinterpret_cast(this); + } + + bool operator==( AndroidHardwareBufferPropertiesANDROID const& rhs ) const + { + return ( sType == rhs.sType ) + && ( pNext == rhs.pNext ) + && ( allocationSize == rhs.allocationSize ) + && ( memoryTypeBits == rhs.memoryTypeBits ); + } + + bool operator!=( AndroidHardwareBufferPropertiesANDROID const& rhs ) const + { + return !operator==( rhs ); + } + + private: + StructureType sType = StructureType::eAndroidHardwareBufferPropertiesANDROID; + + public: + void* pNext = nullptr; + DeviceSize allocationSize; + uint32_t memoryTypeBits; + }; + static_assert( sizeof( AndroidHardwareBufferPropertiesANDROID ) == sizeof( VkAndroidHardwareBufferPropertiesANDROID ), "struct and wrapper have different size!" ); +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ + +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + struct MemoryGetAndroidHardwareBufferInfoANDROID + { + MemoryGetAndroidHardwareBufferInfoANDROID( DeviceMemory memory_ = DeviceMemory() ) + : memory( memory_ ) + { + } + + MemoryGetAndroidHardwareBufferInfoANDROID( VkMemoryGetAndroidHardwareBufferInfoANDROID const & rhs ) + { + memcpy( this, &rhs, sizeof( MemoryGetAndroidHardwareBufferInfoANDROID ) ); + } + + MemoryGetAndroidHardwareBufferInfoANDROID& operator=( VkMemoryGetAndroidHardwareBufferInfoANDROID const & rhs ) + { + memcpy( this, &rhs, sizeof( MemoryGetAndroidHardwareBufferInfoANDROID ) ); + return *this; + } + MemoryGetAndroidHardwareBufferInfoANDROID& setPNext( const void* pNext_ ) + { + pNext = pNext_; + return *this; + } + + MemoryGetAndroidHardwareBufferInfoANDROID& setMemory( DeviceMemory memory_ ) + { + memory = memory_; + return *this; + } + + operator const VkMemoryGetAndroidHardwareBufferInfoANDROID&() const + { + return *reinterpret_cast(this); + } + + bool operator==( MemoryGetAndroidHardwareBufferInfoANDROID const& rhs ) const + { + return ( sType == rhs.sType ) + && ( pNext == rhs.pNext ) + && ( memory == rhs.memory ); + } + + bool operator!=( MemoryGetAndroidHardwareBufferInfoANDROID const& rhs ) const + { + return !operator==( rhs ); + } + + private: + StructureType sType = StructureType::eMemoryGetAndroidHardwareBufferInfoANDROID; + + public: + const void* pNext = nullptr; + DeviceMemory memory; + }; + static_assert( sizeof( MemoryGetAndroidHardwareBufferInfoANDROID ) == sizeof( VkMemoryGetAndroidHardwareBufferInfoANDROID ), "struct and wrapper have different size!" ); +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ + +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + struct ExternalFormatANDROID + { + ExternalFormatANDROID( uint64_t externalFormat_ = 0 ) + : externalFormat( externalFormat_ ) + { + } + + ExternalFormatANDROID( VkExternalFormatANDROID const & rhs ) + { + memcpy( this, &rhs, sizeof( ExternalFormatANDROID ) ); + } + + ExternalFormatANDROID& operator=( VkExternalFormatANDROID const & rhs ) + { + memcpy( this, &rhs, sizeof( ExternalFormatANDROID ) ); + return *this; + } + ExternalFormatANDROID& setPNext( void* pNext_ ) + { + pNext = pNext_; + return *this; + } + + ExternalFormatANDROID& setExternalFormat( uint64_t externalFormat_ ) + { + externalFormat = externalFormat_; + return *this; + } + + operator const VkExternalFormatANDROID&() const + { + return *reinterpret_cast(this); + } + + bool operator==( ExternalFormatANDROID const& rhs ) const + { + return ( sType == rhs.sType ) + && ( pNext == rhs.pNext ) + && ( externalFormat == rhs.externalFormat ); + } + + bool operator!=( ExternalFormatANDROID const& rhs ) const + { + return !operator==( rhs ); + } + + private: + StructureType sType = StructureType::eExternalFormatANDROID; + + public: + void* pNext = nullptr; + uint64_t externalFormat; + }; + static_assert( sizeof( ExternalFormatANDROID ) == sizeof( VkExternalFormatANDROID ), "struct and wrapper have different size!" ); +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ + enum class SubpassContents { eInline = VK_SUBPASS_CONTENTS_INLINE, @@ -22343,7 +23061,8 @@ enum class DescriptorPoolCreateFlagBits { - eFreeDescriptorSet = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT + eFreeDescriptorSet = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, + eUpdateAfterBindEXT = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT }; using DescriptorPoolCreateFlags = Flags; @@ -22362,7 +23081,7 @@ { enum { - allFlags = VkFlags(DescriptorPoolCreateFlagBits::eFreeDescriptorSet) + allFlags = VkFlags(DescriptorPoolCreateFlagBits::eFreeDescriptorSet) | VkFlags(DescriptorPoolCreateFlagBits::eUpdateAfterBindEXT) }; }; @@ -23703,7 +24422,8 @@ eShuffle = VK_SUBGROUP_FEATURE_SHUFFLE_BIT, eShuffleRelative = VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT, eClustered = VK_SUBGROUP_FEATURE_CLUSTERED_BIT, - eQuad = VK_SUBGROUP_FEATURE_QUAD_BIT + eQuad = VK_SUBGROUP_FEATURE_QUAD_BIT, + ePartitionedNV = VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV }; using SubgroupFeatureFlags = Flags; @@ -23722,7 +24442,7 @@ { enum { - allFlags = VkFlags(SubgroupFeatureFlagBits::eBasic) | VkFlags(SubgroupFeatureFlagBits::eVote) | VkFlags(SubgroupFeatureFlagBits::eArithmetic) | VkFlags(SubgroupFeatureFlagBits::eBallot) | VkFlags(SubgroupFeatureFlagBits::eShuffle) | VkFlags(SubgroupFeatureFlagBits::eShuffleRelative) | VkFlags(SubgroupFeatureFlagBits::eClustered) | VkFlags(SubgroupFeatureFlagBits::eQuad) + allFlags = VkFlags(SubgroupFeatureFlagBits::eBasic) | VkFlags(SubgroupFeatureFlagBits::eVote) | VkFlags(SubgroupFeatureFlagBits::eArithmetic) | VkFlags(SubgroupFeatureFlagBits::eBallot) | VkFlags(SubgroupFeatureFlagBits::eShuffle) | VkFlags(SubgroupFeatureFlagBits::eShuffleRelative) | VkFlags(SubgroupFeatureFlagBits::eClustered) | VkFlags(SubgroupFeatureFlagBits::eQuad) | VkFlags(SubgroupFeatureFlagBits::ePartitionedNV) }; }; @@ -24553,7 +25273,8 @@ enum class DescriptorSetLayoutCreateFlagBits { - ePushDescriptorKHR = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR + ePushDescriptorKHR = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, + eUpdateAfterBindPoolEXT = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT }; using DescriptorSetLayoutCreateFlags = Flags; @@ -24572,7 +25293,7 @@ { enum { - allFlags = VkFlags(DescriptorSetLayoutCreateFlagBits::ePushDescriptorKHR) + allFlags = VkFlags(DescriptorSetLayoutCreateFlagBits::ePushDescriptorKHR) | VkFlags(DescriptorSetLayoutCreateFlagBits::eUpdateAfterBindPoolEXT) }; }; @@ -24666,6 +25387,7 @@ eD3D12Resource = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, eD3D12ResourceKHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, eDmaBufEXT = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, + eAndroidHardwareBufferANDROID = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, eHostAllocationEXT = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT, eHostMappedForeignMemoryEXT = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT }; @@ -24686,7 +25408,7 @@ { enum { - allFlags = VkFlags(ExternalMemoryHandleTypeFlagBits::eOpaqueFd) | VkFlags(ExternalMemoryHandleTypeFlagBits::eOpaqueWin32) | VkFlags(ExternalMemoryHandleTypeFlagBits::eOpaqueWin32Kmt) | VkFlags(ExternalMemoryHandleTypeFlagBits::eD3D11Texture) | VkFlags(ExternalMemoryHandleTypeFlagBits::eD3D11TextureKmt) | VkFlags(ExternalMemoryHandleTypeFlagBits::eD3D12Heap) | VkFlags(ExternalMemoryHandleTypeFlagBits::eD3D12Resource) | VkFlags(ExternalMemoryHandleTypeFlagBits::eDmaBufEXT) | VkFlags(ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT) | VkFlags(ExternalMemoryHandleTypeFlagBits::eHostMappedForeignMemoryEXT) + allFlags = VkFlags(ExternalMemoryHandleTypeFlagBits::eOpaqueFd) | VkFlags(ExternalMemoryHandleTypeFlagBits::eOpaqueWin32) | VkFlags(ExternalMemoryHandleTypeFlagBits::eOpaqueWin32Kmt) | VkFlags(ExternalMemoryHandleTypeFlagBits::eD3D11Texture) | VkFlags(ExternalMemoryHandleTypeFlagBits::eD3D11TextureKmt) | VkFlags(ExternalMemoryHandleTypeFlagBits::eD3D12Heap) | VkFlags(ExternalMemoryHandleTypeFlagBits::eD3D12Resource) | VkFlags(ExternalMemoryHandleTypeFlagBits::eDmaBufEXT) | VkFlags(ExternalMemoryHandleTypeFlagBits::eAndroidHardwareBufferANDROID) | VkFlags(ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT) | VkFlags(ExternalMemoryHandleTypeFlagBits::eHostMappedForeignMemoryEXT) }; }; @@ -28194,6 +28916,50 @@ using SamplerYcbcrConversionCreateInfoKHR = SamplerYcbcrConversionCreateInfo; +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + struct AndroidHardwareBufferFormatPropertiesANDROID + { + operator const VkAndroidHardwareBufferFormatPropertiesANDROID&() const + { + return *reinterpret_cast(this); + } + + bool operator==( AndroidHardwareBufferFormatPropertiesANDROID const& rhs ) const + { + return ( sType == rhs.sType ) + && ( pNext == rhs.pNext ) + && ( format == rhs.format ) + && ( externalFormat == rhs.externalFormat ) + && ( formatFeatures == rhs.formatFeatures ) + && ( samplerYcbcrConversionComponents == rhs.samplerYcbcrConversionComponents ) + && ( suggestedYcbcrModel == rhs.suggestedYcbcrModel ) + && ( suggestedYcbcrRange == rhs.suggestedYcbcrRange ) + && ( suggestedXChromaOffset == rhs.suggestedXChromaOffset ) + && ( suggestedYChromaOffset == rhs.suggestedYChromaOffset ); + } + + bool operator!=( AndroidHardwareBufferFormatPropertiesANDROID const& rhs ) const + { + return !operator==( rhs ); + } + + private: + StructureType sType = StructureType::eAndroidHardwareBufferFormatPropertiesANDROID; + + public: + void* pNext = nullptr; + Format format; + uint64_t externalFormat; + FormatFeatureFlags formatFeatures; + ComponentMapping samplerYcbcrConversionComponents; + SamplerYcbcrModelConversion suggestedYcbcrModel; + SamplerYcbcrRange suggestedYcbcrRange; + ChromaLocation suggestedXChromaOffset; + ChromaLocation suggestedYChromaOffset; + }; + static_assert( sizeof( AndroidHardwareBufferFormatPropertiesANDROID ) == sizeof( VkAndroidHardwareBufferFormatPropertiesANDROID ), "struct and wrapper have different size!" ); +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ + enum class BlendOverlapEXT { eUncorrelated = VK_BLEND_OVERLAP_UNCORRELATED_EXT, @@ -28674,6 +29440,98 @@ }; static_assert( sizeof( PipelineRasterizationConservativeStateCreateInfoEXT ) == sizeof( VkPipelineRasterizationConservativeStateCreateInfoEXT ), "struct and wrapper have different size!" ); + enum class DescriptorBindingFlagBitsEXT + { + eUpdateAfterBind = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT, + eUpdateUnusedWhilePending = VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT, + ePartiallyBound = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT, + eVariableDescriptorCount = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT + }; + + using DescriptorBindingFlagsEXT = Flags; + + VULKAN_HPP_INLINE DescriptorBindingFlagsEXT operator|( DescriptorBindingFlagBitsEXT bit0, DescriptorBindingFlagBitsEXT bit1 ) + { + return DescriptorBindingFlagsEXT( bit0 ) | bit1; + } + + VULKAN_HPP_INLINE DescriptorBindingFlagsEXT operator~( DescriptorBindingFlagBitsEXT bits ) + { + return ~( DescriptorBindingFlagsEXT( bits ) ); + } + + template <> struct FlagTraits + { + enum + { + allFlags = VkFlags(DescriptorBindingFlagBitsEXT::eUpdateAfterBind) | VkFlags(DescriptorBindingFlagBitsEXT::eUpdateUnusedWhilePending) | VkFlags(DescriptorBindingFlagBitsEXT::ePartiallyBound) | VkFlags(DescriptorBindingFlagBitsEXT::eVariableDescriptorCount) + }; + }; + + struct DescriptorSetLayoutBindingFlagsCreateInfoEXT + { + DescriptorSetLayoutBindingFlagsCreateInfoEXT( uint32_t bindingCount_ = 0, const DescriptorBindingFlagsEXT* pBindingFlags_ = nullptr ) + : bindingCount( bindingCount_ ) + , pBindingFlags( pBindingFlags_ ) + { + } + + DescriptorSetLayoutBindingFlagsCreateInfoEXT( VkDescriptorSetLayoutBindingFlagsCreateInfoEXT const & rhs ) + { + memcpy( this, &rhs, sizeof( DescriptorSetLayoutBindingFlagsCreateInfoEXT ) ); + } + + DescriptorSetLayoutBindingFlagsCreateInfoEXT& operator=( VkDescriptorSetLayoutBindingFlagsCreateInfoEXT const & rhs ) + { + memcpy( this, &rhs, sizeof( DescriptorSetLayoutBindingFlagsCreateInfoEXT ) ); + return *this; + } + DescriptorSetLayoutBindingFlagsCreateInfoEXT& setPNext( const void* pNext_ ) + { + pNext = pNext_; + return *this; + } + + DescriptorSetLayoutBindingFlagsCreateInfoEXT& setBindingCount( uint32_t bindingCount_ ) + { + bindingCount = bindingCount_; + return *this; + } + + DescriptorSetLayoutBindingFlagsCreateInfoEXT& setPBindingFlags( const DescriptorBindingFlagsEXT* pBindingFlags_ ) + { + pBindingFlags = pBindingFlags_; + return *this; + } + + operator const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT&() const + { + return *reinterpret_cast(this); + } + + bool operator==( DescriptorSetLayoutBindingFlagsCreateInfoEXT const& rhs ) const + { + return ( sType == rhs.sType ) + && ( pNext == rhs.pNext ) + && ( bindingCount == rhs.bindingCount ) + && ( pBindingFlags == rhs.pBindingFlags ); + } + + bool operator!=( DescriptorSetLayoutBindingFlagsCreateInfoEXT const& rhs ) const + { + return !operator==( rhs ); + } + + private: + StructureType sType = StructureType::eDescriptorSetLayoutBindingFlagsCreateInfoEXT; + + public: + const void* pNext = nullptr; + uint32_t bindingCount; + const DescriptorBindingFlagsEXT* pBindingFlags; + }; + static_assert( sizeof( DescriptorSetLayoutBindingFlagsCreateInfoEXT ) == sizeof( VkDescriptorSetLayoutBindingFlagsCreateInfoEXT ), "struct and wrapper have different size!" ); + template Result enumerateInstanceVersion( uint32_t* pApiVersion, Dispatch const &d = Dispatch() ); #ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE @@ -28773,11 +29631,11 @@ class CommandBuffer { public: - CommandBuffer() + VULKAN_HPP_CONSTEXPR CommandBuffer() : m_commandBuffer(VK_NULL_HANDLE) {} - CommandBuffer( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR CommandBuffer( std::nullptr_t ) : m_commandBuffer(VK_NULL_HANDLE) {} @@ -30199,11 +31057,11 @@ class Queue { public: - Queue() + VULKAN_HPP_CONSTEXPR Queue() : m_queue(VK_NULL_HANDLE) {} - Queue( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR Queue( std::nullptr_t ) : m_queue(VK_NULL_HANDLE) {} @@ -30468,11 +31326,11 @@ class Device { public: - Device() + VULKAN_HPP_CONSTEXPR Device() : m_device(VK_NULL_HANDLE) {} - Device( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR Device( std::nullptr_t ) : m_device(VK_NULL_HANDLE) {} @@ -31512,7 +32370,7 @@ Result getSwapchainCounterEXT( SwapchainKHR swapchain, SurfaceCounterFlagBitsEXT counter, uint64_t* pCounterValue, Dispatch const &d = Dispatch() ) const; #ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE template - ResultValue getSwapchainCounterEXT( SwapchainKHR swapchain, SurfaceCounterFlagBitsEXT counter, Dispatch const &d = Dispatch() ) const; + ResultValueType::type getSwapchainCounterEXT( SwapchainKHR swapchain, SurfaceCounterFlagBitsEXT counter, Dispatch const &d = Dispatch() ) const; #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/ template @@ -31795,6 +32653,8 @@ #ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE template DescriptorSetLayoutSupport getDescriptorSetLayoutSupport( const DescriptorSetLayoutCreateInfo & createInfo, Dispatch const &d = Dispatch() ) const; + template + StructureChain getDescriptorSetLayoutSupport( const DescriptorSetLayoutCreateInfo & createInfo, Dispatch const &d = Dispatch() ) const; #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/ template @@ -31802,6 +32662,8 @@ #ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE template DescriptorSetLayoutSupport getDescriptorSetLayoutSupportKHR( const DescriptorSetLayoutCreateInfo & createInfo, Dispatch const &d = Dispatch() ) const; + template + StructureChain getDescriptorSetLayoutSupportKHR( const DescriptorSetLayoutCreateInfo & createInfo, Dispatch const &d = Dispatch() ) const; #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/ template @@ -31832,6 +32694,26 @@ ResultValueType::type getMemoryHostPointerPropertiesEXT( ExternalMemoryHandleTypeFlagBits handleType, const void* pHostPointer, Dispatch const &d = Dispatch() ) const; #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/ +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + template + Result getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer* buffer, AndroidHardwareBufferPropertiesANDROID* pProperties, Dispatch const &d = Dispatch() ) const; +#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE + template + ResultValueType::type getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer, Dispatch const &d = Dispatch() ) const; + template + typename ResultValueType>::type getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer, Dispatch const &d = Dispatch() ) const; +#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/ +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ + +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + template + Result getMemoryAndroidHardwareBufferANDROID( const MemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct AHardwareBuffer** pBuffer, Dispatch const &d = Dispatch() ) const; +#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE + template + ResultValueType::type getMemoryAndroidHardwareBufferANDROID( const MemoryGetAndroidHardwareBufferInfoANDROID & info, Dispatch const &d = Dispatch() ) const; +#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/ +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ + VULKAN_HPP_TYPESAFE_EXPLICIT operator VkDevice() const @@ -34065,11 +34947,11 @@ } #ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE template - VULKAN_HPP_INLINE ResultValue Device::getSwapchainCounterEXT( SwapchainKHR swapchain, SurfaceCounterFlagBitsEXT counter, Dispatch const &d ) const + VULKAN_HPP_INLINE ResultValueType::type Device::getSwapchainCounterEXT( SwapchainKHR swapchain, SurfaceCounterFlagBitsEXT counter, Dispatch const &d ) const { uint64_t counterValue; Result result = static_cast( d.vkGetSwapchainCounterEXT( m_device, static_cast( swapchain ), static_cast( counter ), &counterValue ) ); - return createResultValue( result, counterValue, VULKAN_HPP_NAMESPACE_STRING"::Device::getSwapchainCounterEXT", { Result::eSuccess, Result::eErrorDeviceLost, Result::eErrorOutOfDateKHR } ); + return createResultValue( result, counterValue, VULKAN_HPP_NAMESPACE_STRING"::Device::getSwapchainCounterEXT" ); } #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/ @@ -34741,6 +35623,14 @@ d.vkGetDescriptorSetLayoutSupport( m_device, reinterpret_cast( &createInfo ), reinterpret_cast( &support ) ); return support; } + template + VULKAN_HPP_INLINE StructureChain Device::getDescriptorSetLayoutSupport( const DescriptorSetLayoutCreateInfo & createInfo, Dispatch const &d ) const + { + StructureChain structureChain; + DescriptorSetLayoutSupport& support = structureChain.template get(); + d.vkGetDescriptorSetLayoutSupport( m_device, reinterpret_cast( &createInfo ), reinterpret_cast( &support ) ); + return structureChain; + } #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/ template @@ -34756,6 +35646,14 @@ d.vkGetDescriptorSetLayoutSupportKHR( m_device, reinterpret_cast( &createInfo ), reinterpret_cast( &support ) ); return support; } + template + VULKAN_HPP_INLINE StructureChain Device::getDescriptorSetLayoutSupportKHR( const DescriptorSetLayoutCreateInfo & createInfo, Dispatch const &d ) const + { + StructureChain structureChain; + DescriptorSetLayoutSupport& support = structureChain.template get(); + d.vkGetDescriptorSetLayoutSupportKHR( m_device, reinterpret_cast( &createInfo ), reinterpret_cast( &support ) ); + return structureChain; + } #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/ template @@ -34828,6 +35726,48 @@ } #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/ +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + template + VULKAN_HPP_INLINE Result Device::getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer* buffer, AndroidHardwareBufferPropertiesANDROID* pProperties, Dispatch const &d) const + { + return static_cast( d.vkGetAndroidHardwareBufferPropertiesANDROID( m_device, buffer, reinterpret_cast( pProperties ) ) ); + } +#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE + template + VULKAN_HPP_INLINE ResultValueType::type Device::getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer, Dispatch const &d ) const + { + AndroidHardwareBufferPropertiesANDROID properties; + Result result = static_cast( d.vkGetAndroidHardwareBufferPropertiesANDROID( m_device, buffer, reinterpret_cast( &properties ) ) ); + return createResultValue( result, properties, VULKAN_HPP_NAMESPACE_STRING"::Device::getAndroidHardwareBufferPropertiesANDROID" ); + } + template + VULKAN_HPP_INLINE typename ResultValueType>::type Device::getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer, Dispatch const &d ) const + { + StructureChain structureChain; + AndroidHardwareBufferPropertiesANDROID& properties = structureChain.template get(); + Result result = static_cast( d.vkGetAndroidHardwareBufferPropertiesANDROID( m_device, buffer, reinterpret_cast( &properties ) ) ); + return createResultValue( result, structureChain, VULKAN_HPP_NAMESPACE_STRING"::Device::getAndroidHardwareBufferPropertiesANDROID" ); + } +#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/ +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ + +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + template + VULKAN_HPP_INLINE Result Device::getMemoryAndroidHardwareBufferANDROID( const MemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct AHardwareBuffer** pBuffer, Dispatch const &d) const + { + return static_cast( d.vkGetMemoryAndroidHardwareBufferANDROID( m_device, reinterpret_cast( pInfo ), pBuffer ) ); + } +#ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE + template + VULKAN_HPP_INLINE ResultValueType::type Device::getMemoryAndroidHardwareBufferANDROID( const MemoryGetAndroidHardwareBufferInfoANDROID & info, Dispatch const &d ) const + { + struct AHardwareBuffer* buffer; + Result result = static_cast( d.vkGetMemoryAndroidHardwareBufferANDROID( m_device, reinterpret_cast( &info ), &buffer ) ); + return createResultValue( result, buffer, VULKAN_HPP_NAMESPACE_STRING"::Device::getMemoryAndroidHardwareBufferANDROID" ); + } +#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/ +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ + #ifndef VULKAN_HPP_NO_SMART_HANDLE template <> class UniqueHandleTraits {public: using deleter = ObjectDestroy; }; @@ -34837,11 +35777,11 @@ class PhysicalDevice { public: - PhysicalDevice() + VULKAN_HPP_CONSTEXPR PhysicalDevice() : m_physicalDevice(VK_NULL_HANDLE) {} - PhysicalDevice( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR PhysicalDevice( std::nullptr_t ) : m_physicalDevice(VK_NULL_HANDLE) {} @@ -35428,7 +36368,7 @@ Device device; Result result = static_cast( d.vkCreateDevice( m_physicalDevice, reinterpret_cast( &createInfo ), reinterpret_cast( static_cast( allocator ) ), reinterpret_cast( &device ) ) ); - ObjectDestroy deleter( *this, allocator ); + ObjectDestroy deleter( allocator ); return createResultValue( result, device, VULKAN_HPP_NAMESPACE_STRING"::PhysicalDevice::createDeviceUnique", deleter ); } #endif /*VULKAN_HPP_NO_SMART_HANDLE*/ @@ -36534,11 +37474,11 @@ class Instance { public: - Instance() + VULKAN_HPP_CONSTEXPR Instance() : m_instance(VK_NULL_HANDLE) {} - Instance( std::nullptr_t ) + VULKAN_HPP_CONSTEXPR Instance( std::nullptr_t ) : m_instance(VK_NULL_HANDLE) {} @@ -37569,8 +38509,24 @@ template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; + template <> struct isStructureChainValid{ enum { value = true }; }; + template <> struct isStructureChainValid{ enum { value = true }; }; + template <> struct isStructureChainValid{ enum { value = true }; }; + template <> struct isStructureChainValid{ enum { value = true }; }; + template <> struct isStructureChainValid{ enum { value = true }; }; + template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + template <> struct isStructureChainValid{ enum { value = true }; }; +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + template <> struct isStructureChainValid{ enum { value = true }; }; +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + template <> struct isStructureChainValid{ enum { value = true }; }; + template <> struct isStructureChainValid{ enum { value = true }; }; +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; @@ -37610,11 +38566,17 @@ template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + template <> struct isStructureChainValid{ enum { value = true }; }; +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; + template <> struct isStructureChainValid{ enum { value = true }; }; template <> struct isStructureChainValid{ enum { value = true }; }; VULKAN_HPP_INLINE std::string to_string(FramebufferCreateFlagBits) { @@ -39021,6 +39983,12 @@ case StructureType::eDebugUtilsLabelEXT: return "DebugUtilsLabelEXT"; case StructureType::eDebugUtilsMessengerCallbackDataEXT: return "DebugUtilsMessengerCallbackDataEXT"; case StructureType::eDebugUtilsMessengerCreateInfoEXT: return "DebugUtilsMessengerCreateInfoEXT"; + case StructureType::eAndroidHardwareBufferUsageANDROID: return "AndroidHardwareBufferUsageANDROID"; + case StructureType::eAndroidHardwareBufferPropertiesANDROID: return "AndroidHardwareBufferPropertiesANDROID"; + case StructureType::eAndroidHardwareBufferFormatPropertiesANDROID: return "AndroidHardwareBufferFormatPropertiesANDROID"; + case StructureType::eImportAndroidHardwareBufferInfoANDROID: return "ImportAndroidHardwareBufferInfoANDROID"; + case StructureType::eMemoryGetAndroidHardwareBufferInfoANDROID: return "MemoryGetAndroidHardwareBufferInfoANDROID"; + case StructureType::eExternalFormatANDROID: return "ExternalFormatANDROID"; case StructureType::ePhysicalDeviceSamplerFilterMinmaxPropertiesEXT: return "PhysicalDeviceSamplerFilterMinmaxPropertiesEXT"; case StructureType::eSamplerReductionModeCreateInfoEXT: return "SamplerReductionModeCreateInfoEXT"; case StructureType::eSampleLocationsInfoEXT: return "SampleLocationsInfoEXT"; @@ -39036,10 +40004,16 @@ case StructureType::ePipelineCoverageModulationStateCreateInfoNV: return "PipelineCoverageModulationStateCreateInfoNV"; case StructureType::eValidationCacheCreateInfoEXT: return "ValidationCacheCreateInfoEXT"; case StructureType::eShaderModuleValidationCacheCreateInfoEXT: return "ShaderModuleValidationCacheCreateInfoEXT"; + case StructureType::eDescriptorSetLayoutBindingFlagsCreateInfoEXT: return "DescriptorSetLayoutBindingFlagsCreateInfoEXT"; + case StructureType::ePhysicalDeviceDescriptorIndexingFeaturesEXT: return "PhysicalDeviceDescriptorIndexingFeaturesEXT"; + case StructureType::ePhysicalDeviceDescriptorIndexingPropertiesEXT: return "PhysicalDeviceDescriptorIndexingPropertiesEXT"; + case StructureType::eDescriptorSetVariableDescriptorCountAllocateInfoEXT: return "DescriptorSetVariableDescriptorCountAllocateInfoEXT"; + case StructureType::eDescriptorSetVariableDescriptorCountLayoutSupportEXT: return "DescriptorSetVariableDescriptorCountLayoutSupportEXT"; case StructureType::eDeviceQueueGlobalPriorityCreateInfoEXT: return "DeviceQueueGlobalPriorityCreateInfoEXT"; case StructureType::eImportMemoryHostPointerInfoEXT: return "ImportMemoryHostPointerInfoEXT"; case StructureType::eMemoryHostPointerPropertiesEXT: return "MemoryHostPointerPropertiesEXT"; case StructureType::ePhysicalDeviceExternalMemoryHostPropertiesEXT: return "PhysicalDeviceExternalMemoryHostPropertiesEXT"; + case StructureType::ePhysicalDeviceShaderCorePropertiesAMD: return "PhysicalDeviceShaderCorePropertiesAMD"; case StructureType::ePhysicalDeviceVertexAttributeDivisorPropertiesEXT: return "PhysicalDeviceVertexAttributeDivisorPropertiesEXT"; case StructureType::ePipelineVertexInputDivisorStateCreateInfoEXT: return "PipelineVertexInputDivisorStateCreateInfoEXT"; default: return "invalid"; @@ -39904,6 +40878,7 @@ switch (value) { case DescriptorPoolCreateFlagBits::eFreeDescriptorSet: return "FreeDescriptorSet"; + case DescriptorPoolCreateFlagBits::eUpdateAfterBindEXT: return "UpdateAfterBindEXT"; default: return "invalid"; } } @@ -39913,6 +40888,7 @@ if (!value) return "{}"; std::string result; if (value & DescriptorPoolCreateFlagBits::eFreeDescriptorSet) result += "FreeDescriptorSet | "; + if (value & DescriptorPoolCreateFlagBits::eUpdateAfterBindEXT) result += "UpdateAfterBindEXT | "; return "{" + result.substr(0, result.size() - 3) + "}"; } @@ -40198,6 +41174,7 @@ case SubgroupFeatureFlagBits::eShuffleRelative: return "ShuffleRelative"; case SubgroupFeatureFlagBits::eClustered: return "Clustered"; case SubgroupFeatureFlagBits::eQuad: return "Quad"; + case SubgroupFeatureFlagBits::ePartitionedNV: return "PartitionedNV"; default: return "invalid"; } } @@ -40214,6 +41191,7 @@ if (value & SubgroupFeatureFlagBits::eShuffleRelative) result += "ShuffleRelative | "; if (value & SubgroupFeatureFlagBits::eClustered) result += "Clustered | "; if (value & SubgroupFeatureFlagBits::eQuad) result += "Quad | "; + if (value & SubgroupFeatureFlagBits::ePartitionedNV) result += "PartitionedNV | "; return "{" + result.substr(0, result.size() - 3) + "}"; } @@ -40293,6 +41271,7 @@ switch (value) { case DescriptorSetLayoutCreateFlagBits::ePushDescriptorKHR: return "PushDescriptorKHR"; + case DescriptorSetLayoutCreateFlagBits::eUpdateAfterBindPoolEXT: return "UpdateAfterBindPoolEXT"; default: return "invalid"; } } @@ -40302,6 +41281,7 @@ if (!value) return "{}"; std::string result; if (value & DescriptorSetLayoutCreateFlagBits::ePushDescriptorKHR) result += "PushDescriptorKHR | "; + if (value & DescriptorSetLayoutCreateFlagBits::eUpdateAfterBindPoolEXT) result += "UpdateAfterBindPoolEXT | "; return "{" + result.substr(0, result.size() - 3) + "}"; } @@ -40317,6 +41297,7 @@ case ExternalMemoryHandleTypeFlagBits::eD3D12Heap: return "D3D12Heap"; case ExternalMemoryHandleTypeFlagBits::eD3D12Resource: return "D3D12Resource"; case ExternalMemoryHandleTypeFlagBits::eDmaBufEXT: return "DmaBufEXT"; + case ExternalMemoryHandleTypeFlagBits::eAndroidHardwareBufferANDROID: return "AndroidHardwareBufferANDROID"; case ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT: return "HostAllocationEXT"; case ExternalMemoryHandleTypeFlagBits::eHostMappedForeignMemoryEXT: return "HostMappedForeignMemoryEXT"; default: return "invalid"; @@ -40335,6 +41316,7 @@ if (value & ExternalMemoryHandleTypeFlagBits::eD3D12Heap) result += "D3D12Heap | "; if (value & ExternalMemoryHandleTypeFlagBits::eD3D12Resource) result += "D3D12Resource | "; if (value & ExternalMemoryHandleTypeFlagBits::eDmaBufEXT) result += "DmaBufEXT | "; + if (value & ExternalMemoryHandleTypeFlagBits::eAndroidHardwareBufferANDROID) result += "AndroidHardwareBufferANDROID | "; if (value & ExternalMemoryHandleTypeFlagBits::eHostAllocationEXT) result += "HostAllocationEXT | "; if (value & ExternalMemoryHandleTypeFlagBits::eHostMappedForeignMemoryEXT) result += "HostMappedForeignMemoryEXT | "; return "{" + result.substr(0, result.size() - 3) + "}"; @@ -40828,6 +41810,29 @@ } } + VULKAN_HPP_INLINE std::string to_string(DescriptorBindingFlagBitsEXT value) + { + switch (value) + { + case DescriptorBindingFlagBitsEXT::eUpdateAfterBind: return "UpdateAfterBind"; + case DescriptorBindingFlagBitsEXT::eUpdateUnusedWhilePending: return "UpdateUnusedWhilePending"; + case DescriptorBindingFlagBitsEXT::ePartiallyBound: return "PartiallyBound"; + case DescriptorBindingFlagBitsEXT::eVariableDescriptorCount: return "VariableDescriptorCount"; + default: return "invalid"; + } + } + + VULKAN_HPP_INLINE std::string to_string(DescriptorBindingFlagsEXT value) + { + if (!value) return "{}"; + std::string result; + if (value & DescriptorBindingFlagBitsEXT::eUpdateAfterBind) result += "UpdateAfterBind | "; + if (value & DescriptorBindingFlagBitsEXT::eUpdateUnusedWhilePending) result += "UpdateUnusedWhilePending | "; + if (value & DescriptorBindingFlagBitsEXT::ePartiallyBound) result += "PartiallyBound | "; + if (value & DescriptorBindingFlagBitsEXT::eVariableDescriptorCount) result += "VariableDescriptorCount | "; + return "{" + result.substr(0, result.size() - 3) + "}"; + } + class DispatchLoaderDynamic { public: @@ -41020,6 +42025,9 @@ PFN_vkFreeCommandBuffers vkFreeCommandBuffers = 0; PFN_vkFreeDescriptorSets vkFreeDescriptorSets = 0; PFN_vkFreeMemory vkFreeMemory = 0; +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + PFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID = 0; +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements = 0; PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2 = 0; PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR = 0; @@ -41050,6 +42058,9 @@ PFN_vkGetImageSparseMemoryRequirements2KHR vkGetImageSparseMemoryRequirements2KHR = 0; PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout = 0; PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = 0; +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + PFN_vkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROID = 0; +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR = 0; PFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHR = 0; PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT = 0; @@ -41375,6 +42386,9 @@ vkFreeCommandBuffers = PFN_vkFreeCommandBuffers(device ? device.getProcAddr( "vkFreeCommandBuffers") : instance.getProcAddr( "vkFreeCommandBuffers")); vkFreeDescriptorSets = PFN_vkFreeDescriptorSets(device ? device.getProcAddr( "vkFreeDescriptorSets") : instance.getProcAddr( "vkFreeDescriptorSets")); vkFreeMemory = PFN_vkFreeMemory(device ? device.getProcAddr( "vkFreeMemory") : instance.getProcAddr( "vkFreeMemory")); +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + vkGetAndroidHardwareBufferPropertiesANDROID = PFN_vkGetAndroidHardwareBufferPropertiesANDROID(device ? device.getProcAddr( "vkGetAndroidHardwareBufferPropertiesANDROID") : instance.getProcAddr( "vkGetAndroidHardwareBufferPropertiesANDROID")); +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ vkGetBufferMemoryRequirements = PFN_vkGetBufferMemoryRequirements(device ? device.getProcAddr( "vkGetBufferMemoryRequirements") : instance.getProcAddr( "vkGetBufferMemoryRequirements")); vkGetBufferMemoryRequirements2 = PFN_vkGetBufferMemoryRequirements2(device ? device.getProcAddr( "vkGetBufferMemoryRequirements2") : instance.getProcAddr( "vkGetBufferMemoryRequirements2")); vkGetBufferMemoryRequirements2KHR = PFN_vkGetBufferMemoryRequirements2KHR(device ? device.getProcAddr( "vkGetBufferMemoryRequirements2KHR") : instance.getProcAddr( "vkGetBufferMemoryRequirements2KHR")); @@ -41405,6 +42419,9 @@ vkGetImageSparseMemoryRequirements2KHR = PFN_vkGetImageSparseMemoryRequirements2KHR(device ? device.getProcAddr( "vkGetImageSparseMemoryRequirements2KHR") : instance.getProcAddr( "vkGetImageSparseMemoryRequirements2KHR")); vkGetImageSubresourceLayout = PFN_vkGetImageSubresourceLayout(device ? device.getProcAddr( "vkGetImageSubresourceLayout") : instance.getProcAddr( "vkGetImageSubresourceLayout")); vkGetInstanceProcAddr = PFN_vkGetInstanceProcAddr(instance.getProcAddr( "vkGetInstanceProcAddr")); +#ifdef VK_USE_PLATFORM_ANDROID_ANDROID + vkGetMemoryAndroidHardwareBufferANDROID = PFN_vkGetMemoryAndroidHardwareBufferANDROID(device ? device.getProcAddr( "vkGetMemoryAndroidHardwareBufferANDROID") : instance.getProcAddr( "vkGetMemoryAndroidHardwareBufferANDROID")); +#endif /*VK_USE_PLATFORM_ANDROID_ANDROID*/ vkGetMemoryFdKHR = PFN_vkGetMemoryFdKHR(device ? device.getProcAddr( "vkGetMemoryFdKHR") : instance.getProcAddr( "vkGetMemoryFdKHR")); vkGetMemoryFdPropertiesKHR = PFN_vkGetMemoryFdPropertiesKHR(device ? device.getProcAddr( "vkGetMemoryFdPropertiesKHR") : instance.getProcAddr( "vkGetMemoryFdPropertiesKHR")); vkGetMemoryHostPointerPropertiesEXT = PFN_vkGetMemoryHostPointerPropertiesEXT(device ? device.getProcAddr( "vkGetMemoryHostPointerPropertiesEXT") : instance.getProcAddr( "vkGetMemoryHostPointerPropertiesEXT")); diff -Nru vulkan-1.1.70+dfsg1/layers/buffer_validation.cpp vulkan-1.1.73+dfsg/layers/buffer_validation.cpp --- vulkan-1.1.70+dfsg1/layers/buffer_validation.cpp 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/buffer_validation.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -22,7 +22,6 @@ // Allow use of STL min and max functions in Windows #define NOMINMAX -#include #include #include @@ -30,12 +29,14 @@ #include "vk_layer_data.h" #include "vk_layer_utils.h" #include "vk_layer_logging.h" +#include "vk_typemap_helper.h" #include "buffer_validation.h" void SetLayout(layer_data *device_data, GLOBAL_CB_NODE *pCB, ImageSubresourcePair imgpair, const VkImageLayout &layout) { - if (pCB->imageLayoutMap.find(imgpair) != pCB->imageLayoutMap.end()) { - pCB->imageLayoutMap[imgpair].layout = layout; + auto it = pCB->imageLayoutMap.find(imgpair); + if (it != pCB->imageLayoutMap.end()) { + it->second.layout = layout; } else { assert(imgpair.hasSubresource); IMAGE_CMD_BUF_LAYOUT_NODE node; @@ -52,6 +53,11 @@ SetLayout(device_data, pObject, imgpair, layout, VK_IMAGE_ASPECT_DEPTH_BIT); SetLayout(device_data, pObject, imgpair, layout, VK_IMAGE_ASPECT_STENCIL_BIT); SetLayout(device_data, pObject, imgpair, layout, VK_IMAGE_ASPECT_METADATA_BIT); + if (GetDeviceExtensions(device_data)->vk_khr_sampler_ycbcr_conversion) { + SetLayout(device_data, pObject, imgpair, layout, VK_IMAGE_ASPECT_PLANE_0_BIT_KHR); + SetLayout(device_data, pObject, imgpair, layout, VK_IMAGE_ASPECT_PLANE_1_BIT_KHR); + SetLayout(device_data, pObject, imgpair, layout, VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } } template @@ -66,7 +72,12 @@ // Set the layout in supplied map void SetLayout(std::unordered_map &imageLayoutMap, ImageSubresourcePair imgpair, VkImageLayout layout) { - imageLayoutMap[imgpair].layout = layout; + auto it = imageLayoutMap.find(imgpair); + if (it != imageLayoutMap.end()) { + it->second.layout = layout; // Update + } else { + imageLayoutMap[imgpair].layout = layout; // Insert + } } bool FindLayoutVerifyNode(layer_data const *device_data, GLOBAL_CB_NODE const *pCB, ImageSubresourcePair imgpair, @@ -84,14 +95,14 @@ } if (node.layout != VK_IMAGE_LAYOUT_MAX_ENUM && node.layout != imgsubIt->second.layout) { log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(imgpair.image), - __LINE__, DRAWSTATE_INVALID_LAYOUT, "DS", + DRAWSTATE_INVALID_LAYOUT, "Cannot query for VkImage 0x%" PRIx64 " layout when combined aspect mask %d has multiple layout types: %s and %s", HandleToUint64(imgpair.image), oldAspectMask, string_VkImageLayout(node.layout), string_VkImageLayout(imgsubIt->second.layout)); } if (node.initialLayout != VK_IMAGE_LAYOUT_MAX_ENUM && node.initialLayout != imgsubIt->second.initialLayout) { log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(imgpair.image), - __LINE__, DRAWSTATE_INVALID_LAYOUT, "DS", + DRAWSTATE_INVALID_LAYOUT, "Cannot query for VkImage 0x%" PRIx64 " layout when combined aspect mask %d has multiple initial layout types: %s and %s", HandleToUint64(imgpair.image), oldAspectMask, string_VkImageLayout(node.initialLayout), @@ -115,7 +126,7 @@ } if (layout != VK_IMAGE_LAYOUT_MAX_ENUM && layout != imgsubIt->second.layout) { log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(imgpair.image), - __LINE__, DRAWSTATE_INVALID_LAYOUT, "DS", + DRAWSTATE_INVALID_LAYOUT, "Cannot query for VkImage 0x%" PRIx64 " layout when combined aspect mask %d has multiple layout types: %s and %s", HandleToUint64(imgpair.image), oldAspectMask, string_VkImageLayout(layout), string_VkImageLayout(imgsubIt->second.layout)); @@ -133,6 +144,11 @@ FindLayoutVerifyNode(device_data, pCB, imgpair, node, VK_IMAGE_ASPECT_DEPTH_BIT); FindLayoutVerifyNode(device_data, pCB, imgpair, node, VK_IMAGE_ASPECT_STENCIL_BIT); FindLayoutVerifyNode(device_data, pCB, imgpair, node, VK_IMAGE_ASPECT_METADATA_BIT); + if (GetDeviceExtensions(device_data)->vk_khr_sampler_ycbcr_conversion) { + FindLayoutVerifyNode(device_data, pCB, imgpair, node, VK_IMAGE_ASPECT_PLANE_0_BIT_KHR); + FindLayoutVerifyNode(device_data, pCB, imgpair, node, VK_IMAGE_ASPECT_PLANE_1_BIT_KHR); + FindLayoutVerifyNode(device_data, pCB, imgpair, node, VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } if (node.layout == VK_IMAGE_LAYOUT_MAX_ENUM) { imgpair = {image, false, VkImageSubresource()}; auto imgsubIt = pCB->imageLayoutMap.find(imgpair); @@ -150,6 +166,11 @@ FindLayoutVerifyLayout(device_data, imgpair, layout, VK_IMAGE_ASPECT_DEPTH_BIT); FindLayoutVerifyLayout(device_data, imgpair, layout, VK_IMAGE_ASPECT_STENCIL_BIT); FindLayoutVerifyLayout(device_data, imgpair, layout, VK_IMAGE_ASPECT_METADATA_BIT); + if (GetDeviceExtensions(device_data)->vk_khr_sampler_ycbcr_conversion) { + FindLayoutVerifyLayout(device_data, imgpair, layout, VK_IMAGE_ASPECT_PLANE_0_BIT_KHR); + FindLayoutVerifyLayout(device_data, imgpair, layout, VK_IMAGE_ASPECT_PLANE_1_BIT_KHR); + FindLayoutVerifyLayout(device_data, imgpair, layout, VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } if (layout == VK_IMAGE_LAYOUT_MAX_ENUM) { imgpair = {imgpair.image, false, VkImageSubresource()}; auto imgsubIt = (*core_validation::GetImageLayoutMap(device_data)).find(imgpair); @@ -193,13 +214,19 @@ } // find layout in supplied map -bool FindLayout(const std::unordered_map &imageLayoutMap, ImageSubresourcePair imgpair, - VkImageLayout &layout) { +bool FindLayout(layer_data *device_data, const std::unordered_map &imageLayoutMap, + ImageSubresourcePair imgpair, VkImageLayout &layout) { layout = VK_IMAGE_LAYOUT_MAX_ENUM; FindLayout(imageLayoutMap, imgpair, layout, VK_IMAGE_ASPECT_COLOR_BIT); FindLayout(imageLayoutMap, imgpair, layout, VK_IMAGE_ASPECT_DEPTH_BIT); FindLayout(imageLayoutMap, imgpair, layout, VK_IMAGE_ASPECT_STENCIL_BIT); FindLayout(imageLayoutMap, imgpair, layout, VK_IMAGE_ASPECT_METADATA_BIT); + if (GetDeviceExtensions(device_data)->vk_khr_sampler_ycbcr_conversion) { + FindLayout(imageLayoutMap, imgpair, layout, VK_IMAGE_ASPECT_PLANE_0_BIT_KHR); + FindLayout(imageLayoutMap, imgpair, layout, VK_IMAGE_ASPECT_PLANE_1_BIT_KHR); + FindLayout(imageLayoutMap, imgpair, layout, VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } + // Image+subresource not found, look for image handle w/o subresource if (layout == VK_IMAGE_LAYOUT_MAX_ENUM) { imgpair = {imgpair.image, false, VkImageSubresource()}; auto imgsubIt = imageLayoutMap.find(imgpair); @@ -212,7 +239,13 @@ // Set the layout on the global level void SetGlobalLayout(layer_data *device_data, ImageSubresourcePair imgpair, const VkImageLayout &layout) { VkImage &image = imgpair.image; - (*core_validation::GetImageLayoutMap(device_data))[imgpair].layout = layout; + auto &lmap = (*core_validation::GetImageLayoutMap(device_data)); + auto data = lmap.find(imgpair); + if (data != lmap.end()) { + data->second.layout = layout; // Update + } else { + lmap[imgpair].layout = layout; // Insert + } auto &image_subresources = (*core_validation::GetImageSubresourceMap(device_data))[image]; auto subresource = std::find(image_subresources.begin(), image_subresources.end(), imgpair); if (subresource == image_subresources.end()) { @@ -222,7 +255,12 @@ // Set the layout on the cmdbuf level void SetLayout(layer_data *device_data, GLOBAL_CB_NODE *pCB, ImageSubresourcePair imgpair, const IMAGE_CMD_BUF_LAYOUT_NODE &node) { - pCB->imageLayoutMap[imgpair] = node; + auto it = pCB->imageLayoutMap.find(imgpair); + if (it != pCB->imageLayoutMap.end()) { + it->second = node; // Update + } else { + pCB->imageLayoutMap[imgpair] = node; // Insert + } } // Set image layout for given VkImageSubresourceRange struct void SetImageLayout(layer_data *device_data, GLOBAL_CB_NODE *cb_node, const IMAGE_STATE *image_state, @@ -275,7 +313,7 @@ const auto report_data = core_validation::GetReportData(device_data); if (pRenderPassInfo->attachmentCount != framebufferInfo.attachmentCount) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", + HandleToUint64(pCB->commandBuffer), DRAWSTATE_INVALID_RENDERPASS, "You cannot start a render pass using a framebuffer with a different number of attachments."); } for (uint32_t i = 0; i < pRenderPassInfo->attachmentCount; ++i) { @@ -298,7 +336,7 @@ } if (initial_layout != VK_IMAGE_LAYOUT_UNDEFINED && initial_layout != node.layout) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", + DRAWSTATE_INVALID_RENDERPASS, "You cannot start a render pass using attachment %u where the render pass initial layout is %s " "and the previous known layout of the attachment is %s. The layouts must match, or the render " "pass initial layout for the attachment must be VK_IMAGE_LAYOUT_UNDEFINED", @@ -350,12 +388,13 @@ if (mem_barrier->oldLayout == VK_IMAGE_LAYOUT_UNDEFINED) { // TODO: Set memory invalid which is in mem_tracker currently } else if (node.layout != mem_barrier->oldLayout) { - skip |= log_msg(core_validation::GetReportData(device_data), VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(pCB->commandBuffer), __LINE__, - DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", - "For image 0x%" PRIx64 " you cannot transition the layout of aspect %d from %s when current layout is %s.", - HandleToUint64(mem_barrier->image), aspect, string_VkImageLayout(mem_barrier->oldLayout), - string_VkImageLayout(node.layout)); + skip = + log_msg(core_validation::GetReportData(device_data), VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(pCB->commandBuffer), VALIDATION_ERROR_0a00095a, + "For image 0x%" PRIx64 + " you cannot transition the layout of aspect=%d level=%d layer=%d from %s when current layout is %s.", + HandleToUint64(mem_barrier->image), aspect, level, layer, string_VkImageLayout(mem_barrier->oldLayout), + string_VkImageLayout(node.layout)); } return skip; } @@ -396,7 +435,7 @@ bool VerifyAspectsPresent(VkImageAspectFlags aspect_mask, VkFormat format) { if ((aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != 0) { - if (!FormatIsColor(format)) return false; + if (!(FormatIsColor(format) || FormatIsMultiplane(format))) return false; } if ((aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) != 0) { if (!FormatHasDepth(format)) return false; @@ -404,6 +443,10 @@ if ((aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) != 0) { if (!FormatHasStencil(format)) return false; } + if (0 != + (aspect_mask & (VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | VK_IMAGE_ASPECT_PLANE_2_BIT_KHR))) { + if (FormatPlaneCount(format) == 1) return false; + } return true; } @@ -452,12 +495,11 @@ } if (msg_code != VALIDATION_ERROR_UNDEFINED) { - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(img_barrier->image), __LINE__, msg_code, "DS", - "%s: Image barrier 0x%p %sLayout=%s is not compatible with image 0x%" PRIx64 " usage flags 0x%" PRIx32 ". %s", - func_name, static_cast(img_barrier), ((new_not_old) ? "new" : "old"), - string_VkImageLayout(layout), HandleToUint64(img_barrier->image), usage_flags, validation_error_map[msg_code]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + HandleToUint64(img_barrier->image), msg_code, + "%s: Image barrier 0x%p %sLayout=%s is not compatible with image 0x%" PRIx64 " usage flags 0x%" PRIx32 ".", + func_name, static_cast(img_barrier), ((new_not_old) ? "new" : "old"), + string_VkImageLayout(layout), HandleToUint64(img_barrier->image), usage_flags); } return skip; } @@ -482,7 +524,7 @@ // TODO: Add unique id for error when available skip |= log_msg( core_validation::GetReportData(device_data), VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 0, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, 0, "Attempting to transition shared presentable image 0x%" PRIx64 " from layout %s to layout %s, but image has already been presented and cannot have its layout transitioned.", HandleToUint64(img_barrier->image), string_VkImageLayout(img_barrier->oldLayout), @@ -496,14 +538,13 @@ auto const aspect_mask = img_barrier->subresourceRange.aspectMask; auto const ds_mask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; if ((aspect_mask & ds_mask) != (ds_mask)) { - skip |= log_msg( - core_validation::GetReportData(device_data), VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(img_barrier->image), __LINE__, VALIDATION_ERROR_0a00096e, - "DS", - "%s: Image barrier 0x%p references image 0x%" PRIx64 - " of format %s that must have the depth and stencil aspects set, but its aspectMask is 0x%" PRIx32 ". %s", - func_name, static_cast(img_barrier), HandleToUint64(img_barrier->image), - string_VkFormat(image_create_info->format), aspect_mask, validation_error_map[VALIDATION_ERROR_0a00096e]); + skip |= + log_msg(core_validation::GetReportData(device_data), VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(img_barrier->image), VALIDATION_ERROR_0a00096e, + "%s: Image barrier 0x%p references image 0x%" PRIx64 + " of format %s that must have the depth and stencil aspects set, but its aspectMask is 0x%" PRIx32 ".", + func_name, static_cast(img_barrier), HandleToUint64(img_barrier->image), + string_VkFormat(image_create_info->format), aspect_mask); } } uint32_t level_count = ResolveRemainingLevels(&img_barrier->subresourceRange, image_create_info->mipLevels); @@ -517,32 +558,69 @@ skip |= ValidateImageAspectLayout(device_data, cb_state, img_barrier, level, layer, VK_IMAGE_ASPECT_DEPTH_BIT); skip |= ValidateImageAspectLayout(device_data, cb_state, img_barrier, level, layer, VK_IMAGE_ASPECT_STENCIL_BIT); skip |= ValidateImageAspectLayout(device_data, cb_state, img_barrier, level, layer, VK_IMAGE_ASPECT_METADATA_BIT); + if (GetDeviceExtensions(device_data)->vk_khr_sampler_ycbcr_conversion) { + skip |= ValidateImageAspectLayout(device_data, cb_state, img_barrier, level, layer, + VK_IMAGE_ASPECT_PLANE_0_BIT_KHR); + skip |= ValidateImageAspectLayout(device_data, cb_state, img_barrier, level, layer, + VK_IMAGE_ASPECT_PLANE_1_BIT_KHR); + skip |= ValidateImageAspectLayout(device_data, cb_state, img_barrier, level, layer, + VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } } } } return skip; } -void TransitionImageLayouts(layer_data *device_data, VkCommandBuffer cmdBuffer, uint32_t memBarrierCount, - const VkImageMemoryBarrier *pImgMemBarriers) { - GLOBAL_CB_NODE *pCB = GetCBNode(device_data, cmdBuffer); +static bool IsReleaseOp(layer_data *device_data, GLOBAL_CB_NODE *cb_state, VkImageMemoryBarrier const *barrier) { + if (!IsTransferOp(barrier)) return false; + + auto pool = GetCommandPoolNode(device_data, cb_state->createInfo.commandPool); + return pool && IsReleaseOp(pool, barrier); +} +void TransitionImageLayouts(layer_data *device_data, GLOBAL_CB_NODE *cb_state, uint32_t memBarrierCount, + const VkImageMemoryBarrier *pImgMemBarriers) { for (uint32_t i = 0; i < memBarrierCount; ++i) { auto mem_barrier = &pImgMemBarriers[i]; if (!mem_barrier) continue; + // For ownership transfers, the barrier is specified twice; as a release + // operation on the yielding queue family, and as an acquire operation + // on the acquiring queue family. This barrier may also include a layout + // transition, which occurs 'between' the two operations. For validation + // purposes it doesn't seem important which side performs the layout + // transition, but it must not be performed twice. We'll arbitrarily + // choose to perform it as part of the acquire operation. + if (IsReleaseOp(device_data, cb_state, mem_barrier)) { + continue; + } + VkImageCreateInfo *image_create_info = &(GetImageState(device_data, mem_barrier->image)->createInfo); uint32_t level_count = ResolveRemainingLevels(&mem_barrier->subresourceRange, image_create_info->mipLevels); uint32_t layer_count = ResolveRemainingLayers(&mem_barrier->subresourceRange, image_create_info->arrayLayers); + // Special case for 3D images with VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR flag bit, where and + // can potentially alias. When recording layout for the entire image, pre-emptively record layouts + // for all (potential) layer sub_resources. + if ((0 != (image_create_info->flags & VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR)) && + (mem_barrier->subresourceRange.baseArrayLayer == 0) && (layer_count == 1)) { + layer_count = image_create_info->extent.depth; // Treat each depth slice as a layer subresource + } + for (uint32_t j = 0; j < level_count; j++) { uint32_t level = mem_barrier->subresourceRange.baseMipLevel + j; for (uint32_t k = 0; k < layer_count; k++) { uint32_t layer = mem_barrier->subresourceRange.baseArrayLayer + k; - TransitionImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_COLOR_BIT); - TransitionImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_DEPTH_BIT); - TransitionImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_STENCIL_BIT); - TransitionImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_METADATA_BIT); + TransitionImageAspectLayout(device_data, cb_state, mem_barrier, level, layer, VK_IMAGE_ASPECT_COLOR_BIT); + TransitionImageAspectLayout(device_data, cb_state, mem_barrier, level, layer, VK_IMAGE_ASPECT_DEPTH_BIT); + TransitionImageAspectLayout(device_data, cb_state, mem_barrier, level, layer, VK_IMAGE_ASPECT_STENCIL_BIT); + TransitionImageAspectLayout(device_data, cb_state, mem_barrier, level, layer, VK_IMAGE_ASPECT_METADATA_BIT); + if (GetDeviceExtensions(device_data)->vk_khr_sampler_ycbcr_conversion) { + TransitionImageAspectLayout(device_data, cb_state, mem_barrier, level, layer, VK_IMAGE_ASPECT_PLANE_0_BIT_KHR); + TransitionImageAspectLayout(device_data, cb_state, mem_barrier, level, layer, VK_IMAGE_ASPECT_PLANE_1_BIT_KHR); + TransitionImageAspectLayout(device_data, cb_state, mem_barrier, level, layer, VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } } } } @@ -565,7 +643,7 @@ // TODO: Improve log message in the next pass skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_INVALID_IMAGE_LAYOUT, "%s: Cannot use image 0x%" PRIx64 " with specific layout %s that doesn't match the actual current layout %s.", caller, HandleToUint64(image), string_VkImageLayout(explicit_layout), string_VkImageLayout(node.layout)); } @@ -577,8 +655,8 @@ if (image_state->createInfo.tiling != VK_IMAGE_TILING_LINEAR) { // LAYOUT_GENERAL is allowed, but may not be performance optimal, flag as perf warning. skip |= log_msg(report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(cb_node->commandBuffer), __LINE__, - DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(cb_node->commandBuffer), + DRAWSTATE_INVALID_IMAGE_LAYOUT, "%s: For optimal performance image 0x%" PRIx64 " layout should be %s instead of GENERAL.", caller, HandleToUint64(image), string_VkImageLayout(optimal_layout)); } @@ -586,19 +664,18 @@ if (image_state->shared_presentable) { if (VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR != explicit_layout) { // TODO: Add unique error id when available. - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, msg_code, "DS", - "Layout for shared presentable image is %s but must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR.", - string_VkImageLayout(optimal_layout)); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, msg_code, + "Layout for shared presentable image is %s but must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR.", + string_VkImageLayout(optimal_layout)); } } } else { *error = true; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, msg_code, "DS", - "%s: Layout for image 0x%" PRIx64 " is %s but can only be %s or VK_IMAGE_LAYOUT_GENERAL. %s", caller, - HandleToUint64(image), string_VkImageLayout(explicit_layout), string_VkImageLayout(optimal_layout), - validation_error_map[msg_code]); + HandleToUint64(cb_node->commandBuffer), msg_code, + "%s: Layout for image 0x%" PRIx64 " is %s but can only be %s or VK_IMAGE_LAYOUT_GENERAL.", caller, + HandleToUint64(image), string_VkImageLayout(explicit_layout), string_VkImageLayout(optimal_layout)); } } return skip; @@ -624,78 +701,19 @@ const debug_report_data *report_data = core_validation::GetReportData(device_data); if (pCreateInfo->format == VK_FORMAT_UNDEFINED) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e0075e, "IMAGE", "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED. %s", - validation_error_map[VALIDATION_ERROR_09e0075e]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e0075e, "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED."); return skip; } - bool optimal_tiling = (VK_IMAGE_TILING_OPTIMAL == pCreateInfo->tiling); - const char *tiling_string = string_VkImageTiling(pCreateInfo->tiling); const char *format_string = string_VkFormat(pCreateInfo->format); - VkFormatProperties properties = GetFormatProperties(device_data, pCreateInfo->format); - VkFormatFeatureFlags features = (optimal_tiling ? properties.optimalTilingFeatures : properties.linearTilingFeatures); - - if (0 == features) { - std::stringstream ss; - UNIQUE_VALIDATION_ERROR_CODE vuid = (optimal_tiling ? VALIDATION_ERROR_09e007ac : VALIDATION_ERROR_09e007a2); - ss << "vkCreateImage format parameter " << format_string << " is an unsupported format"; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, vuid, - "IMAGE", "%s. %s", ss.str().c_str(), validation_error_map[vuid]); - return skip; - } - - if ((pCreateInfo->usage & VK_IMAGE_USAGE_SAMPLED_BIT) && !(features & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) { - std::stringstream ss; - UNIQUE_VALIDATION_ERROR_CODE vuid = (optimal_tiling ? VALIDATION_ERROR_09e007ae : VALIDATION_ERROR_09e007a4); - ss << "vkCreateImage: usage bit VK_IMAGE_USAGE_SAMPLED_BIT is not supported for format " << format_string << " with tiling " - << tiling_string; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, vuid, - "IMAGE", "%s. %s", ss.str().c_str(), validation_error_map[vuid]); - } - - if ((pCreateInfo->usage & VK_IMAGE_USAGE_STORAGE_BIT) && !(features & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)) { - std::stringstream ss; - UNIQUE_VALIDATION_ERROR_CODE vuid = (optimal_tiling ? VALIDATION_ERROR_09e007b0 : VALIDATION_ERROR_09e007a6); - ss << "vkCreateImage: usage bit VK_IMAGE_USAGE_STORAGE_BIT is not supported for format " << format_string << " with tiling " - << tiling_string; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, vuid, - "IMAGE", "%s. %s", ss.str().c_str(), validation_error_map[vuid]); - } - - // TODO: Add checks for EXTENDED_USAGE images to validate images are compatible - // For EXTENDED_USAGE images, format can match any image COMPATIBLE with original image - if (!GetDeviceExtensions(device_data)->vk_khr_maintenance2 || !(pCreateInfo->flags & VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR)) { - // Validate that format supports usage as color attachment - if ((pCreateInfo->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) && - (0 == (features & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT))) { - UNIQUE_VALIDATION_ERROR_CODE vuid = (optimal_tiling ? VALIDATION_ERROR_09e007b2 : VALIDATION_ERROR_09e007a8); - std::stringstream ss; - ss << "vkCreateImage: usage bit VK_IMAGE_USAGE_COLOR_ATTACHMENT is not supported for format " << format_string - << " with tiling " << tiling_string; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, vuid, - "IMAGE", "%s. %s", ss.str().c_str(), validation_error_map[vuid]); - } - - // Validate that format supports usage as depth/stencil attachment - if ((pCreateInfo->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) && - (0 == (features & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))) { - UNIQUE_VALIDATION_ERROR_CODE vuid = (optimal_tiling ? VALIDATION_ERROR_09e007b4 : VALIDATION_ERROR_09e007aa); - std::stringstream ss; - ss << "vkCreateImage: usage bit VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT is not supported for format " << format_string - << " with tiling " << tiling_string; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, vuid, - "IMAGE", "%s. %s", ss.str().c_str(), validation_error_map[vuid]); - } - } if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) && (VK_IMAGE_TYPE_2D != pCreateInfo->imageType)) { std::stringstream ss; ss << "vkCreateImage: Image type must be VK_IMAGE_TYPE_2D when VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT flag bit is set"; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e0076a, "IMAGE", "%s. %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_09e0076a]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e0076a, "%s.", ss.str().c_str()); } const VkPhysicalDeviceLimits *device_limits = &(GetPhysicalDeviceProperties(device_data)->limits); @@ -705,9 +723,8 @@ std::stringstream ss; ss << "vkCreateImage: The combination of format, type, tiling, usage and flags supplied in the VkImageCreateInfo struct is " "reported by vkGetPhysicalDeviceImageFormatProperties() as unsupported"; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00758, "IMAGE", "%s. %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_09e00758]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e00758, "%s.", ss.str().c_str()); return skip; } @@ -715,9 +732,8 @@ (pCreateInfo->extent.width > std::max(device_limits->maxImageDimension1D, format_limits.maxExtent.width))) { std::stringstream ss; ss << "vkCreateImage: 1D image width exceeds maximum supported width for format " << format_string; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e0076e, "IMAGE", "%s. %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_09e0076e]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e0076e, "%s.", ss.str().c_str()); } if (VK_IMAGE_TYPE_2D == pCreateInfo->imageType) { @@ -726,9 +742,8 @@ pCreateInfo->extent.height > std::max(device_limits->maxImageDimension2D, format_limits.maxExtent.height)) { std::stringstream ss; ss << "vkCreateImage: 2D image extent exceeds maximum supported width or height for format " << format_string; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00770, "IMAGE", "%s. %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_09e00770]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e00770, "%s.", ss.str().c_str()); } } else { if (pCreateInfo->extent.width > std::max(device_limits->maxImageDimensionCube, format_limits.maxExtent.width) || @@ -737,9 +752,8 @@ ss << "vkCreateImage: 2D image extent exceeds maximum supported width or height for cube-compatible images with " "format " << format_string; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00772, "IMAGE", "%s. %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_09e00772]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e00772, "%s.", ss.str().c_str()); } } } @@ -750,9 +764,8 @@ (pCreateInfo->extent.depth > std::max(device_limits->maxImageDimension3D, format_limits.maxExtent.depth))) { std::stringstream ss; ss << "vkCreateImage: 3D image extent exceeds maximum supported width, height, or depth for format " << format_string; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00776, "IMAGE", "%s. %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_09e00776]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e00776, "%s.", ss.str().c_str()); } } @@ -766,9 +779,8 @@ if (pCreateInfo->mipLevels > format_limits.maxMipLevels) { std::stringstream ss; ss << "vkCreateImage: Image mip levels exceed image format maxMipLevels for format " << format_string; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e0077e, "IMAGE", "%s. %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_09e0077e]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e0077e, "%s.", ss.str().c_str()); } VkImageUsageFlags attach_flags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | @@ -777,18 +789,16 @@ std::stringstream ss; ss << "vkCreateImage: Image usage flags include a frame buffer attachment bit and image width exceeds device " "maxFramebufferWidth"; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00788, "IMAGE", "%s. %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_09e00788]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e00788, "%s.", ss.str().c_str()); } if ((pCreateInfo->usage & attach_flags) && (pCreateInfo->extent.height > device_limits->maxFramebufferHeight)) { std::stringstream ss; ss << "vkCreateImage: Image usage flags include a frame buffer attachment bit and image height exceeds device " "maxFramebufferHeight"; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e0078a, "IMAGE", "%s. %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_09e0078a]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e0078a, "%s.", ss.str().c_str()); } uint64_t total_size = (uint64_t)pCreateInfo->extent.width * (uint64_t)pCreateInfo->extent.height * @@ -801,38 +811,29 @@ total_size = (total_size + ig_mask) & ~ig_mask; if (total_size > format_limits.maxResourceSize) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, 0, __LINE__, - IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", + skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, 0, + IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "CreateImage resource size exceeds allowable maximum Image resource size = 0x%" PRIxLEAST64 ", maximum resource size = 0x%" PRIxLEAST64 " ", total_size, format_limits.maxResourceSize); } if (pCreateInfo->arrayLayers > format_limits.maxArrayLayers) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00780, "Image", - "CreateImage arrayLayers=%d exceeds allowable maximum supported by format of %d. %s", - pCreateInfo->arrayLayers, format_limits.maxArrayLayers, validation_error_map[VALIDATION_ERROR_09e00780]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, 0, VALIDATION_ERROR_09e00780, + "CreateImage arrayLayers=%d exceeds allowable maximum supported by format of %d.", pCreateInfo->arrayLayers, + format_limits.maxArrayLayers); } if ((pCreateInfo->samples & format_limits.sampleCounts) == 0) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, 0, __LINE__, - VALIDATION_ERROR_09e0078e, "Image", "CreateImage samples %s is not supported by format 0x%.8X. %s", - string_VkSampleCountFlagBits(pCreateInfo->samples), format_limits.sampleCounts, - validation_error_map[VALIDATION_ERROR_09e0078e]); - } - - if ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) && (!GetEnabledFeatures(device_data)->sparseBinding)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00792, "DS", - "vkCreateImage(): the sparseBinding device feature is disabled: Images cannot be created with the " - "VK_IMAGE_CREATE_SPARSE_BINDING_BIT set. %s", - validation_error_map[VALIDATION_ERROR_09e00792]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, 0, + VALIDATION_ERROR_09e0078e, "CreateImage samples %s is not supported by format 0x%.8X.", + string_VkSampleCountFlagBits(pCreateInfo->samples), format_limits.sampleCounts); } if ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) && (!GetEnabledFeatures(device_data)->sparseResidencyAliased)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DRAWSTATE_INVALID_FEATURE, "DS", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + DRAWSTATE_INVALID_FEATURE, "vkCreateImage(): the sparseResidencyAliased device feature is disabled: Images cannot be created with the " "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT set."); } @@ -843,8 +844,8 @@ FormatIsCompressed_ETC2_EAC(pCreateInfo->format))) { // TODO: Add Maintenance2 VUID skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_UNDEFINED, "DS", + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_UNDEFINED, "vkCreateImage(): If pCreateInfo->flags contains VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR, " "format must be block, ETC or ASTC compressed, but is %s", string_VkFormat(pCreateInfo->format)); @@ -852,8 +853,8 @@ if (!(pCreateInfo->flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT)) { // TODO: Add Maintenance2 VUID skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_UNDEFINED, "DS", + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_UNDEFINED, "vkCreateImage(): If pCreateInfo->flags contains VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR, " "flags must also contain VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT."); } @@ -917,26 +918,23 @@ 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 |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, DRAWSTATE_INVALID_IMAGE_ASPECT, "IMAGE", str); + HandleToUint64(image_state->image), DRAWSTATE_INVALID_IMAGE_ASPECT, str); } if (FormatIsDepthOrStencil(image_state->createInfo.format)) { char const str[] = "vkCmdClearColorImage called with depth/stencil image."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_1880000e, "IMAGE", "%s. %s", str, - validation_error_map[VALIDATION_ERROR_1880000e]); + HandleToUint64(image_state->image), VALIDATION_ERROR_1880000e, "%s.", str); } else if (FormatIsCompressed(image_state->createInfo.format)) { char const str[] = "vkCmdClearColorImage called with compressed image."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_1880000e, "IMAGE", "%s. %s", str, - validation_error_map[VALIDATION_ERROR_1880000e]); + HandleToUint64(image_state->image), VALIDATION_ERROR_1880000e, "%s.", str); } 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 |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_18800004, "IMAGE", "%s. %s", str, - validation_error_map[VALIDATION_ERROR_18800004]); + HandleToUint64(image_state->image), VALIDATION_ERROR_18800004, "%s.", str); } return skip; } @@ -972,14 +970,14 @@ if (image_state->createInfo.tiling != VK_IMAGE_TILING_LINEAR) { // LAYOUT_GENERAL is allowed, but may not be performance optimal, flag as perf warning. skip |= log_msg(report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + HandleToUint64(image_state->image), DRAWSTATE_INVALID_IMAGE_LAYOUT, "%s: Layout for cleared image should be TRANSFER_DST_OPTIMAL instead of GENERAL.", func_name); } } else if (VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR == dest_image_layout) { if (!GetDeviceExtensions(device_data)->vk_khr_shared_presentable_image) { // TODO: Add unique error id when available. skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, 0, "DS", + HandleToUint64(image_state->image), 0, "Must enable VK_KHR_shared_presentable_image extension before creating images with a layout type " "of VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR."); @@ -987,7 +985,7 @@ if (image_state->shared_presentable) { skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, 0, "DS", + HandleToUint64(image_state->image), 0, "Layout for shared presentable cleared image is %s but can only be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR.", string_VkImageLayout(dest_image_layout)); } @@ -1000,9 +998,9 @@ assert(strcmp(func_name, "vkCmdClearColorImage()") == 0); } skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, error_code, "DS", - "%s: Layout for cleared image is %s but can only be TRANSFER_DST_OPTIMAL or GENERAL. %s", func_name, - string_VkImageLayout(dest_image_layout), validation_error_map[error_code]); + HandleToUint64(image_state->image), error_code, + "%s: Layout for cleared image is %s but can only be TRANSFER_DST_OPTIMAL or GENERAL.", func_name, + string_VkImageLayout(dest_image_layout)); } } @@ -1020,11 +1018,10 @@ } else { assert(strcmp(func_name, "vkCmdClearColorImage()") == 0); } - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, 0, - __LINE__, error_code, "DS", - "%s: Cannot clear an image whose layout is %s and doesn't match the current layout %s. %s", - func_name, string_VkImageLayout(dest_image_layout), string_VkImageLayout(node.layout), - validation_error_map[error_code]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, 0, + error_code, "%s: Cannot clear an image whose layout is %s and doesn't match the current layout %s.", + func_name, string_VkImageLayout(dest_image_layout), string_VkImageLayout(node.layout)); } } } @@ -1119,22 +1116,20 @@ "vkCmdClearDepthStencilImage aspectMasks for all subresource ranges must be set to VK_IMAGE_ASPECT_DEPTH_BIT " "and/or VK_IMAGE_ASPECT_STENCIL_BIT"; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, DRAWSTATE_INVALID_IMAGE_ASPECT, "IMAGE", str); + HandleToUint64(commandBuffer), DRAWSTATE_INVALID_IMAGE_ASPECT, str); } } if (image_state && !FormatIsDepthOrStencil(image_state->createInfo.format)) { char const str[] = "vkCmdClearDepthStencilImage called without a depth/stencil image."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, VALIDATION_ERROR_18a0001c, "IMAGE", "%s. %s", str, - validation_error_map[VALIDATION_ERROR_18a0001c]); + HandleToUint64(image), VALIDATION_ERROR_18a0001c, "%s.", str); } 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 |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, VALIDATION_ERROR_18a00012, "IMAGE", "%s. %s", str, - validation_error_map[VALIDATION_ERROR_18a00012]); + HandleToUint64(image), VALIDATION_ERROR_18a00012, "%s.", str); } VkFormatProperties props = GetFormatProperties(device_data, image_state->createInfo.format); VkImageTiling tiling = image_state->createInfo.tiling; @@ -1142,11 +1137,10 @@ if ((GetDeviceExtensions(device_data)->vk_khr_maintenance1) && (VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR != (flags & VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR))) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, VALIDATION_ERROR_18a00010, "IMAGE", + HandleToUint64(image), VALIDATION_ERROR_18a00010, "vkCmdClearDepthStencilImage() called with an image of format %s and tiling %s that does not support " - "VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR. %s", - string_VkFormat(image_state->createInfo.format), string_VkImageTiling(image_state->createInfo.tiling), - validation_error_map[VALIDATION_ERROR_18a00010]); + "VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR.", + string_VkFormat(image_state->createInfo.format), string_VkImageTiling(image_state->createInfo.tiling)); } } return skip; @@ -1164,22 +1158,29 @@ return result; } -// Returns true if two VkImageCopy structures overlap -static bool RegionIntersects(const VkImageCopy *src, const VkImageCopy *dst, VkImageType type) { +// Returns true if source area of first copy region intersects dest area of second region +// It is assumed that these are copy regions within a single image (otherwise no possibility of collision) +static bool RegionIntersects(const VkImageCopy *rgn0, const VkImageCopy *rgn1, VkImageType type, bool is_multiplane) { bool result = false; - if ((src->srcSubresource.mipLevel == dst->dstSubresource.mipLevel) && - (RangesIntersect(src->srcSubresource.baseArrayLayer, src->srcSubresource.layerCount, dst->dstSubresource.baseArrayLayer, - dst->dstSubresource.layerCount))) { + + // Separate planes within a multiplane image cannot intersect + if (is_multiplane && (rgn0->srcSubresource.aspectMask != rgn1->dstSubresource.aspectMask)) { + return result; + } + + if ((rgn0->srcSubresource.mipLevel == rgn1->dstSubresource.mipLevel) && + (RangesIntersect(rgn0->srcSubresource.baseArrayLayer, rgn0->srcSubresource.layerCount, rgn1->dstSubresource.baseArrayLayer, + rgn1->dstSubresource.layerCount))) { result = true; switch (type) { case VK_IMAGE_TYPE_3D: - result &= RangesIntersect(src->srcOffset.z, src->extent.depth, dst->dstOffset.z, dst->extent.depth); + result &= RangesIntersect(rgn0->srcOffset.z, rgn0->extent.depth, rgn1->dstOffset.z, rgn1->extent.depth); // Intentionally fall through to 2D case case VK_IMAGE_TYPE_2D: - result &= RangesIntersect(src->srcOffset.y, src->extent.height, dst->dstOffset.y, dst->extent.height); + result &= RangesIntersect(rgn0->srcOffset.y, rgn0->extent.height, rgn1->dstOffset.y, rgn1->extent.height); // Intentionally fall through to 1D case case VK_IMAGE_TYPE_1D: - result &= RangesIntersect(src->srcOffset.x, src->extent.width, dst->dstOffset.x, dst->extent.width); + result &= RangesIntersect(rgn0->srcOffset.x, rgn0->extent.width, rgn1->dstOffset.x, rgn1->extent.width); break; default: // Unrecognized or new IMAGE_TYPE enums will be caught in parameter_validation @@ -1312,7 +1313,7 @@ // If the queue family image transfer granularity is (0, 0, 0), then the offset must always be (0, 0, 0) if (IsExtentAllZeroes(&offset_extent) == false) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_IMAGE_TRANSFER_GRANULARITY, "DS", + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_IMAGE_TRANSFER_GRANULARITY, "%s: pRegion[%d].%s (x=%d, y=%d, z=%d) must be (x=0, y=0, z=0) when the command buffer's queue family " "image transfer granularity is (w=0, h=0, d=0).", function, i, member, offset->x, offset->y, offset->z); @@ -1322,7 +1323,7 @@ // integer multiples of the image transfer granularity. if (IsExtentAligned(&offset_extent, granularity) == false) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_IMAGE_TRANSFER_GRANULARITY, "DS", + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_IMAGE_TRANSFER_GRANULARITY, "%s: pRegion[%d].%s (x=%d, y=%d, z=%d) dimensions must be even integer multiples of this command " "buffer's queue family image transfer granularity (w=%d, h=%d, d=%d).", function, i, member, offset->x, offset->y, offset->z, granularity->width, granularity->height, @@ -1343,7 +1344,7 @@ // subresource extent. if (IsExtentEqual(extent, subresource_extent) == false) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_IMAGE_TRANSFER_GRANULARITY, "DS", + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_IMAGE_TRANSFER_GRANULARITY, "%s: pRegion[%d].%s (w=%d, h=%d, d=%d) must match the image subresource extents (w=%d, h=%d, d=%d) " "when the command buffer's queue family image transfer granularity is (w=0, h=0, d=0).", function, i, member, extent->width, extent->height, extent->depth, subresource_extent->width, @@ -1379,7 +1380,7 @@ } if (!(x_ok && y_ok && z_ok)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_IMAGE_TRANSFER_GRANULARITY, "DS", + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_IMAGE_TRANSFER_GRANULARITY, "%s: pRegion[%d].%s (w=%d, h=%d, d=%d) dimensions must be even integer multiples of this command " "buffer's queue family image transfer granularity (w=%d, h=%d, d=%d) or offset (x=%d, y=%d, z=%d) + " "extent (w=%d, h=%d, d=%d) must match the image subresource extents (w=%d, h=%d, d=%d).", @@ -1391,39 +1392,7 @@ return skip; } -// Check a uint32_t width or stride value against a queue family's Image Transfer Granularity width value -static inline bool CheckItgInt(layer_data *device_data, const GLOBAL_CB_NODE *cb_node, const uint32_t value, - const uint32_t granularity, const uint32_t i, const char *function, const char *member) { - const debug_report_data *report_data = core_validation::GetReportData(device_data); - - bool skip = false; - if (SafeModulo(value, granularity) != 0) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_IMAGE_TRANSFER_GRANULARITY, "DS", - "%s: pRegion[%d].%s (%d) must be an even integer multiple of this command buffer's queue family image " - "transfer granularity width (%d).", - function, i, member, value, granularity); - } - return skip; -} - -// Check a VkDeviceSize value against a queue family's Image Transfer Granularity width value -static inline bool CheckItgSize(layer_data *device_data, const GLOBAL_CB_NODE *cb_node, const VkDeviceSize value, - const uint32_t granularity, const uint32_t i, const char *function, const char *member) { - const debug_report_data *report_data = core_validation::GetReportData(device_data); - bool skip = false; - if (SafeModulo(value, granularity) != 0) { - skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_IMAGE_TRANSFER_GRANULARITY, "DS", - "%s: pRegion[%d].%s (%" PRIdLEAST64 - ") must be an even integer multiple of this command buffer's queue family image transfer granularity width (%d).", - function, i, member, value, granularity); - } - return skip; -} - -// Check valid usage Image Tranfer Granularity requirements for elements of a VkBufferImageCopy structure +// Check valid usage Image Transfer Granularity requirements for elements of a VkBufferImageCopy structure bool ValidateCopyBufferImageTransferGranularityRequirements(layer_data *device_data, const GLOBAL_CB_NODE *cb_node, const IMAGE_STATE *img, const VkBufferImageCopy *region, const uint32_t i, const char *function) { @@ -1443,9 +1412,6 @@ // must equal the image subresource depth } else { VkExtent3D granularity = GetScaledItg(device_data, cb_node, img); - skip |= CheckItgSize(device_data, cb_node, region->bufferOffset, granularity.width, i, function, "bufferOffset"); - skip |= CheckItgInt(device_data, cb_node, region->bufferRowLength, granularity.width, i, function, "bufferRowLength"); - skip |= CheckItgInt(device_data, cb_node, region->bufferImageHeight, granularity.width, i, function, "bufferImageHeight"); skip |= CheckItgOffset(device_data, cb_node, ®ion->imageOffset, &granularity, i, function, "imageOffset"); VkExtent3D subresource_extent = GetImageSubresourceExtent(img, ®ion->imageSubresource); skip |= CheckItgExtent(device_data, cb_node, ®ion->imageExtent, ®ion->imageOffset, &granularity, &subresource_extent, @@ -1454,7 +1420,7 @@ return skip; } -// Check valid usage Image Tranfer Granularity requirements for elements of a VkImageCopy structure +// Check valid usage Image Transfer Granularity requirements for elements of a VkImageCopy structure bool ValidateCopyImageTransferGranularityRequirements(layer_data *device_data, const GLOBAL_CB_NODE *cb_node, const IMAGE_STATE *src_img, const IMAGE_STATE *dst_img, const VkImageCopy *region, const uint32_t i, const char *function) { @@ -1510,100 +1476,105 @@ if (src_state->createInfo.imageType == VK_IMAGE_TYPE_1D) { if ((0 != region.srcOffset.y) || (1 != src_copy_extent.height)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(src_state->image), __LINE__, VALIDATION_ERROR_09c00124, "IMAGE", + HandleToUint64(src_state->image), VALIDATION_ERROR_09c00124, "vkCmdCopyImage(): pRegion[%d] srcOffset.y is %d and extent.height is %d. For 1D images these must " - "be 0 and 1, respectively. %s", - i, region.srcOffset.y, src_copy_extent.height, validation_error_map[VALIDATION_ERROR_09c00124]); + "be 0 and 1, respectively.", + i, region.srcOffset.y, src_copy_extent.height); } } - if ((src_state->createInfo.imageType == VK_IMAGE_TYPE_1D) || (src_state->createInfo.imageType == VK_IMAGE_TYPE_2D)) { - if ((0 != region.srcOffset.z) || (1 != src_copy_extent.depth)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(src_state->image), __LINE__, VALIDATION_ERROR_09c00df2, "IMAGE", - "vkCmdCopyImage(): pRegion[%d] srcOffset.z is %d and extent.depth is %d. For 1D and 2D images " - "these must be 0 and 1, respectively. %s", - i, region.srcOffset.z, src_copy_extent.depth, validation_error_map[VALIDATION_ERROR_09c00df2]); - } + // VUID-VkImageCopy-srcImage-01785 + if ((src_state->createInfo.imageType == VK_IMAGE_TYPE_1D) && ((0 != region.srcOffset.z) || (1 != src_copy_extent.depth))) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + HandleToUint64(src_state->image), VALIDATION_ERROR_09c00df2, + "vkCmdCopyImage(): pRegion[%d] srcOffset.z is %d and extent.depth is %d. For 1D images " + "these must be 0 and 1, respectively.", + 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 |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + HandleToUint64(src_state->image), VALIDATION_ERROR_09c00df6, + "vkCmdCopyImage(): pRegion[%d] srcOffset.z is %d. For 2D images the z-offset must be 0.", i, + region.srcOffset.z); } - // VU01199 changed with mnt1 if (GetDeviceExtensions(device_data)->vk_khr_maintenance1) { if (src_state->createInfo.imageType == VK_IMAGE_TYPE_3D) { if ((0 != region.srcSubresource.baseArrayLayer) || (1 != region.srcSubresource.layerCount)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(src_state->image), __LINE__, VALIDATION_ERROR_09c0011a, "IMAGE", + HandleToUint64(src_state->image), VALIDATION_ERROR_09c0011a, "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. %s", - i, region.srcSubresource.baseArrayLayer, region.srcSubresource.layerCount, - validation_error_map[VALIDATION_ERROR_09c0011a]); + "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 |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(src_state->image), __LINE__, VALIDATION_ERROR_09c0011a, "IMAGE", + HandleToUint64(src_state->image), VALIDATION_ERROR_09c0011a, "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. %s", - i, region.srcSubresource.baseArrayLayer, region.srcSubresource.layerCount, - validation_error_map[VALIDATION_ERROR_09c0011a]); + "VK_IMAGE_TYPE_3D, these must be 0 and 1, respectively.", + i, region.srcSubresource.baseArrayLayer, region.srcSubresource.layerCount); } } } - // Checks that apply only to compressed images - if (FormatIsCompressed(src_state->createInfo.format)) { + // Source checks that apply only to compressed images (or to _422 images if ycbcr enabled) + bool ext_ycbcr = GetDeviceExtensions(device_data)->vk_khr_sampler_ycbcr_conversion; + if (FormatIsCompressed(src_state->createInfo.format) || + (ext_ycbcr && FormatIsSinglePlane_422(src_state->createInfo.format))) { const VkExtent3D block_size = FormatCompressedTexelBlockExtent(src_state->createInfo.format); - // image offsets must be multiples of block dimensions if ((SafeModulo(region.srcOffset.x, block_size.width) != 0) || (SafeModulo(region.srcOffset.y, block_size.height) != 0) || (SafeModulo(region.srcOffset.z, block_size.depth) != 0)) { + UNIQUE_VALIDATION_ERROR_CODE vuid = ext_ycbcr ? VALIDATION_ERROR_09c00d7e : VALIDATION_ERROR_09c0013a; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(src_state->image), __LINE__, VALIDATION_ERROR_09c0013a, "IMAGE", + HandleToUint64(src_state->image), vuid, "vkCmdCopyImage(): pRegion[%d] srcOffset (%d, %d) must be multiples of the compressed image's " - "texel width & height (%d, %d). %s.", - i, region.srcOffset.x, region.srcOffset.y, block_size.width, block_size.height, - validation_error_map[VALIDATION_ERROR_09c0013a]); + "texel width & height (%d, %d).", + i, region.srcOffset.x, region.srcOffset.y, block_size.width, block_size.height); } const VkExtent3D mip_extent = GetImageSubresourceExtent(src_state, &(region.srcSubresource)); if ((SafeModulo(src_copy_extent.width, block_size.width) != 0) && (src_copy_extent.width + region.srcOffset.x != mip_extent.width)) { + UNIQUE_VALIDATION_ERROR_CODE vuid = ext_ycbcr ? VALIDATION_ERROR_09c00d80 : VALIDATION_ERROR_09c0013c; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(src_state->image), __LINE__, VALIDATION_ERROR_09c0013c, "IMAGE", + HandleToUint64(src_state->image), vuid, "vkCmdCopyImage(): pRegion[%d] extent width (%d) must be a multiple of the compressed texture block " - "width (%d), or when added to srcOffset.x (%d) must equal the image subresource width (%d). %s.", - i, src_copy_extent.width, block_size.width, region.srcOffset.x, mip_extent.width, - validation_error_map[VALIDATION_ERROR_09c0013c]); + "width (%d), or when added to srcOffset.x (%d) must equal the image subresource width (%d).", + i, src_copy_extent.width, block_size.width, region.srcOffset.x, mip_extent.width); } // Extent height must be a multiple of block height, or extent+offset height must equal subresource height if ((SafeModulo(src_copy_extent.height, block_size.height) != 0) && (src_copy_extent.height + region.srcOffset.y != mip_extent.height)) { + UNIQUE_VALIDATION_ERROR_CODE vuid = ext_ycbcr ? VALIDATION_ERROR_09c00d82 : VALIDATION_ERROR_09c0013e; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(src_state->image), __LINE__, VALIDATION_ERROR_09c0013e, "IMAGE", + HandleToUint64(src_state->image), vuid, "vkCmdCopyImage(): pRegion[%d] extent height (%d) must be a multiple of the compressed texture block " - "height (%d), or when added to srcOffset.y (%d) must equal the image subresource height (%d). %s.", - i, src_copy_extent.height, block_size.height, region.srcOffset.y, mip_extent.height, - validation_error_map[VALIDATION_ERROR_09c0013e]); + "height (%d), or when added to srcOffset.y (%d) must equal the image subresource height (%d).", + i, src_copy_extent.height, block_size.height, region.srcOffset.y, mip_extent.height); } // Extent depth must be a multiple of block depth, or extent+offset depth must equal subresource depth uint32_t copy_depth = (slice_override ? depth_slices : src_copy_extent.depth); if ((SafeModulo(copy_depth, block_size.depth) != 0) && (copy_depth + region.srcOffset.z != mip_extent.depth)) { + UNIQUE_VALIDATION_ERROR_CODE vuid = ext_ycbcr ? VALIDATION_ERROR_09c00d84 : VALIDATION_ERROR_09c00140; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(src_state->image), __LINE__, VALIDATION_ERROR_09c00140, "IMAGE", + HandleToUint64(src_state->image), vuid, "vkCmdCopyImage(): pRegion[%d] extent width (%d) must be a multiple of the compressed texture block " - "depth (%d), or when added to srcOffset.z (%d) must equal the image subresource depth (%d). %s.", - i, src_copy_extent.depth, block_size.depth, region.srcOffset.z, mip_extent.depth, - validation_error_map[VALIDATION_ERROR_09c00140]); + "depth (%d), or when added to srcOffset.z (%d) must equal the image subresource depth (%d).", + i, src_copy_extent.depth, block_size.depth, region.srcOffset.z, mip_extent.depth); } } // Compressed @@ -1612,31 +1583,37 @@ if (dst_state->createInfo.imageType == VK_IMAGE_TYPE_1D) { if ((0 != region.dstOffset.y) || (1 != dst_copy_extent.height)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(dst_state->image), __LINE__, VALIDATION_ERROR_09c00130, "IMAGE", + HandleToUint64(dst_state->image), VALIDATION_ERROR_09c00130, "vkCmdCopyImage(): pRegion[%d] dstOffset.y is %d and dst_copy_extent.height is %d. For 1D images " - "these must be 0 and 1, respectively. %s", - i, region.dstOffset.y, dst_copy_extent.height, validation_error_map[VALIDATION_ERROR_09c00130]); + "these must be 0 and 1, respectively.", + i, region.dstOffset.y, dst_copy_extent.height); } } - if ((dst_state->createInfo.imageType == VK_IMAGE_TYPE_1D) || (dst_state->createInfo.imageType == VK_IMAGE_TYPE_2D)) { - if ((0 != region.dstOffset.z) || (1 != dst_copy_extent.depth)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(dst_state->image), __LINE__, VALIDATION_ERROR_09c00df4, "IMAGE", - "vkCmdCopyImage(): pRegion[%d] dstOffset.z is %d and dst_copy_extent.depth is %d. For 1D and 2D " - "images these must be 0 and 1, respectively. %s", - i, region.dstOffset.z, dst_copy_extent.depth, validation_error_map[VALIDATION_ERROR_09c00df4]); - } + // VUID-VkImageCopy-dstImage-01786 + if ((dst_state->createInfo.imageType == VK_IMAGE_TYPE_1D) && ((0 != region.dstOffset.z) || (1 != dst_copy_extent.depth))) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + HandleToUint64(dst_state->image), VALIDATION_ERROR_09c00df4, + "vkCmdCopyImage(): pRegion[%d] dstOffset.z is %d and extent.depth is %d. For 1D images these must be 0 " + "and 1, respectively.", + 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 |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + HandleToUint64(dst_state->image), VALIDATION_ERROR_09c00df8, + "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 |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(dst_state->image), __LINE__, VALIDATION_ERROR_09c0011a, "IMAGE", + HandleToUint64(dst_state->image), VALIDATION_ERROR_09c0011a, "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. %s", - i, region.dstSubresource.baseArrayLayer, region.dstSubresource.layerCount, - validation_error_map[VALIDATION_ERROR_09c0011a]); + "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 @@ -1645,83 +1622,153 @@ if ((0 != region.dstSubresource.baseArrayLayer) || (1 != region.dstSubresource.layerCount)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(dst_state->image), __LINE__, VALIDATION_ERROR_09c0011a, "IMAGE", + HandleToUint64(dst_state->image), VALIDATION_ERROR_09c0011a, "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. %s", - i, region.dstSubresource.baseArrayLayer, region.dstSubresource.layerCount, - validation_error_map[VALIDATION_ERROR_09c0011a]); + "is %d. For VK_IMAGE_TYPE_3D images these must be 0 and 1, respectively.", + i, region.dstSubresource.baseArrayLayer, region.dstSubresource.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.dstSubresource.baseArrayLayer) || (1 != region.dstSubresource.layerCount)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(dst_state->image), __LINE__, VALIDATION_ERROR_09c0011a, "IMAGE", + HandleToUint64(dst_state->image), VALIDATION_ERROR_09c0011a, "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. %s", - i, region.dstSubresource.baseArrayLayer, region.dstSubresource.layerCount, - validation_error_map[VALIDATION_ERROR_09c0011a]); + "VK_IMAGE_TYPE_3D, these must be 0 and 1, respectively.", + i, region.dstSubresource.baseArrayLayer, region.dstSubresource.layerCount); } } } - // Checks that apply only to compressed images - if (FormatIsCompressed(dst_state->createInfo.format)) { + // Dest checks that apply only to compressed images (or to _422 images if ycbcr enabled) + if (FormatIsCompressed(dst_state->createInfo.format) || + (ext_ycbcr && FormatIsSinglePlane_422(dst_state->createInfo.format))) { const VkExtent3D block_size = FormatCompressedTexelBlockExtent(dst_state->createInfo.format); // image offsets must be multiples of block dimensions if ((SafeModulo(region.dstOffset.x, block_size.width) != 0) || (SafeModulo(region.dstOffset.y, block_size.height) != 0) || (SafeModulo(region.dstOffset.z, block_size.depth) != 0)) { + UNIQUE_VALIDATION_ERROR_CODE vuid = ext_ycbcr ? VALIDATION_ERROR_09c00d86 : VALIDATION_ERROR_09c00144; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(dst_state->image), __LINE__, VALIDATION_ERROR_09c00144, "IMAGE", + HandleToUint64(dst_state->image), vuid, "vkCmdCopyImage(): pRegion[%d] dstOffset (%d, %d) must be multiples of the compressed image's " - "texel width & height (%d, %d). %s.", - i, region.dstOffset.x, region.dstOffset.y, block_size.width, block_size.height, - validation_error_map[VALIDATION_ERROR_09c00144]); + "texel width & height (%d, %d).", + i, region.dstOffset.x, region.dstOffset.y, block_size.width, block_size.height); } const VkExtent3D mip_extent = GetImageSubresourceExtent(dst_state, &(region.dstSubresource)); if ((SafeModulo(dst_copy_extent.width, block_size.width) != 0) && (dst_copy_extent.width + region.dstOffset.x != mip_extent.width)) { + UNIQUE_VALIDATION_ERROR_CODE vuid = ext_ycbcr ? VALIDATION_ERROR_09c00d88 : VALIDATION_ERROR_09c00146; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(dst_state->image), __LINE__, VALIDATION_ERROR_09c00146, "IMAGE", + HandleToUint64(dst_state->image), vuid, "vkCmdCopyImage(): pRegion[%d] dst_copy_extent width (%d) must be a multiple of the compressed texture " - "block width (%d), or when added to dstOffset.x (%d) must equal the image subresource width (%d). %s.", - i, dst_copy_extent.width, block_size.width, region.dstOffset.x, mip_extent.width, - validation_error_map[VALIDATION_ERROR_09c00146]); + "block width (%d), or when added to dstOffset.x (%d) must equal the image subresource width (%d).", + i, dst_copy_extent.width, block_size.width, region.dstOffset.x, mip_extent.width); } // Extent height must be a multiple of block height, or dst_copy_extent+offset height must equal subresource height if ((SafeModulo(dst_copy_extent.height, block_size.height) != 0) && (dst_copy_extent.height + region.dstOffset.y != mip_extent.height)) { + UNIQUE_VALIDATION_ERROR_CODE vuid = ext_ycbcr ? VALIDATION_ERROR_09c00d8a : VALIDATION_ERROR_09c00148; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(dst_state->image), __LINE__, VALIDATION_ERROR_09c00148, "IMAGE", + HandleToUint64(dst_state->image), vuid, "vkCmdCopyImage(): pRegion[%d] dst_copy_extent height (%d) must be a multiple of the compressed " "texture block height (%d), or when added to dstOffset.y (%d) must equal the image subresource " - "height (%d). %s.", - i, dst_copy_extent.height, block_size.height, region.dstOffset.y, mip_extent.height, - validation_error_map[VALIDATION_ERROR_09c00148]); + "height (%d).", + i, dst_copy_extent.height, block_size.height, region.dstOffset.y, mip_extent.height); } // Extent depth must be a multiple of block depth, or dst_copy_extent+offset depth must equal subresource depth uint32_t copy_depth = (slice_override ? depth_slices : dst_copy_extent.depth); if ((SafeModulo(copy_depth, block_size.depth) != 0) && (copy_depth + region.dstOffset.z != mip_extent.depth)) { + UNIQUE_VALIDATION_ERROR_CODE vuid = ext_ycbcr ? VALIDATION_ERROR_09c00d8c : VALIDATION_ERROR_09c0014a; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(dst_state->image), __LINE__, VALIDATION_ERROR_09c0014a, "IMAGE", + HandleToUint64(dst_state->image), vuid, "vkCmdCopyImage(): pRegion[%d] dst_copy_extent width (%d) must be a multiple of the compressed texture " - "block depth (%d), or when added to dstOffset.z (%d) must equal the image subresource depth (%d). %s.", - i, dst_copy_extent.depth, block_size.depth, region.dstOffset.z, mip_extent.depth, - validation_error_map[VALIDATION_ERROR_09c0014a]); + "block depth (%d), or when added to dstOffset.z (%d) must equal the image subresource depth (%d).", + i, dst_copy_extent.depth, block_size.depth, region.dstOffset.z, mip_extent.depth); } } // Compressed } return skip; } +// vkCmdCopyImage checks that only apply if the multiplane extension is enabled +bool CopyImageMultiplaneValidation(const layer_data *dev_data, VkCommandBuffer command_buffer, const IMAGE_STATE *src_image_state, + const IMAGE_STATE *dst_image_state, const VkImageCopy region) { + bool skip = false; + const debug_report_data *report_data = core_validation::GetReportData(dev_data); + + // Neither image is multiplane + if ((!FormatIsMultiplane(src_image_state->createInfo.format)) && (!FormatIsMultiplane(dst_image_state->createInfo.format))) { + // If neither image is multi-plane the aspectMask member of src and dst must match + if (region.srcSubresource.aspectMask != region.dstSubresource.aspectMask) { + std::stringstream ss; + ss << "vkCmdCopyImage: Copy between non-multiplane images with differing aspectMasks ( 0x" << std::hex + << region.srcSubresource.aspectMask << " and 0x" << region.dstSubresource.aspectMask << " )"; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00c1e, "%s.", ss.str().c_str()); + } + } else { + // Source image multiplane checks + uint32_t planes = FormatPlaneCount(src_image_state->createInfo.format); + VkImageAspectFlags aspect = region.srcSubresource.aspectMask; + if ((2 == planes) && (aspect != VK_IMAGE_ASPECT_PLANE_0_BIT_KHR) && (aspect != VK_IMAGE_ASPECT_PLANE_1_BIT_KHR)) { + std::stringstream ss; + ss << "vkCmdCopyImage: Source image aspect mask (0x" << std::hex << aspect << ") is invalid for 2-plane format"; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00c20, "%s.", ss.str().c_str()); + } + if ((3 == planes) && (aspect != VK_IMAGE_ASPECT_PLANE_0_BIT_KHR) && (aspect != VK_IMAGE_ASPECT_PLANE_1_BIT_KHR) && + (aspect != VK_IMAGE_ASPECT_PLANE_2_BIT_KHR)) { + std::stringstream ss; + ss << "vkCmdCopyImage: Source image aspect mask (0x" << std::hex << aspect << ") is invalid for 3-plane format"; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00c22, "%s.", ss.str().c_str()); + } + // Single-plane to multi-plane + if ((!FormatIsMultiplane(src_image_state->createInfo.format)) && (FormatIsMultiplane(dst_image_state->createInfo.format)) && + (VK_IMAGE_ASPECT_COLOR_BIT != aspect)) { + std::stringstream ss; + ss << "vkCmdCopyImage: Source image aspect mask (0x" << std::hex << aspect << ") is not VK_IMAGE_ASPECT_COLOR_BIT"; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00c2a, "%s.", ss.str().c_str()); + } + + // Dest image multiplane checks + planes = FormatPlaneCount(dst_image_state->createInfo.format); + aspect = region.dstSubresource.aspectMask; + if ((2 == planes) && (aspect != VK_IMAGE_ASPECT_PLANE_0_BIT_KHR) && (aspect != VK_IMAGE_ASPECT_PLANE_1_BIT_KHR)) { + std::stringstream ss; + ss << "vkCmdCopyImage: Dest image aspect mask (0x" << std::hex << aspect << ") is invalid for 2-plane format"; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00c24, "%s.", ss.str().c_str()); + } + if ((3 == planes) && (aspect != VK_IMAGE_ASPECT_PLANE_0_BIT_KHR) && (aspect != VK_IMAGE_ASPECT_PLANE_1_BIT_KHR) && + (aspect != VK_IMAGE_ASPECT_PLANE_2_BIT_KHR)) { + std::stringstream ss; + ss << "vkCmdCopyImage: Dest image aspect mask (0x" << std::hex << aspect << ") is invalid for 3-plane format"; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00c26, "%s.", ss.str().c_str()); + } + // Multi-plane to single-plane + if ((FormatIsMultiplane(src_image_state->createInfo.format)) && (!FormatIsMultiplane(dst_image_state->createInfo.format)) && + (VK_IMAGE_ASPECT_COLOR_BIT != aspect)) { + std::stringstream ss; + ss << "vkCmdCopyImage: Dest image aspect mask (0x" << std::hex << aspect << ") is not VK_IMAGE_ASPECT_COLOR_BIT"; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00c28, "%s.", ss.str().c_str()); + } + } + + return skip; +} + bool PreCallValidateCmdCopyImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state, IMAGE_STATE *dst_image_state, uint32_t region_count, const VkImageCopy *regions, VkImageLayout src_image_layout, VkImageLayout dst_image_layout) { @@ -1757,17 +1804,15 @@ if (region.srcSubresource.layerCount == 0) { std::stringstream ss; ss << "vkCmdCopyImage: number of layers in pRegions[" << i << "] srcSubresource is zero"; - skip |= - log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, DRAWSTATE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str()); + skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(command_buffer), DRAWSTATE_INVALID_IMAGE_ASPECT, "%s", ss.str().c_str()); } if (region.dstSubresource.layerCount == 0) { std::stringstream ss; ss << "vkCmdCopyImage: number of layers in pRegions[" << i << "] dstSubresource is zero"; - skip |= - log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, DRAWSTATE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str()); + skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(command_buffer), DRAWSTATE_INVALID_IMAGE_ASPECT, "%s", ss.str().c_str()); } if (GetDeviceExtensions(device_data)->vk_khr_maintenance1) { @@ -1786,8 +1831,7 @@ ss << "vkCmdCopyImage: number of depth slices in source and destination subresources for pRegions[" << i << "] do not match"; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c00118, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_09c00118]); + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00118, "%s.", ss.str().c_str()); } } } else { @@ -1797,17 +1841,22 @@ ss << "vkCmdCopyImage: number of layers in source and destination subresources for pRegions[" << i << "] do not match"; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c00118, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_09c00118]); + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00118, "%s.", ss.str().c_str()); } } - // For each region, the aspectMask member of srcSubresource and dstSubresource must match - if (region.srcSubresource.aspectMask != region.dstSubresource.aspectMask) { - char const str[] = "vkCmdCopyImage: Src and dest aspectMasks for each region must match"; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c00112, "IMAGE", "%s. %s", str, - validation_error_map[VALIDATION_ERROR_09c00112]); + // Do multiplane-specific checks, if extension enabled + if (GetDeviceExtensions(device_data)->vk_khr_sampler_ycbcr_conversion) { + skip |= CopyImageMultiplaneValidation(device_data, command_buffer, src_image_state, dst_image_state, region); + } + + if (!GetDeviceExtensions(device_data)->vk_khr_sampler_ycbcr_conversion) { + // not multi-plane, the aspectMask member of srcSubresource and dstSubresource must match + if (region.srcSubresource.aspectMask != region.dstSubresource.aspectMask) { + char const str[] = "vkCmdCopyImage: Src and dest aspectMasks for each region must match"; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00112, "%s.", str); + } } // For each region, the aspectMask member of srcSubresource must be present in the source image @@ -1816,8 +1865,7 @@ ss << "vkCmdCopyImage: pRegion[" << i << "] srcSubresource.aspectMask cannot specify aspects not present in source image"; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c0011c, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_09c0011c]); + HandleToUint64(command_buffer), VALIDATION_ERROR_09c0011c, "%s.", ss.str().c_str()); } // For each region, the aspectMask member of dstSubresource must be present in the destination image @@ -1825,8 +1873,7 @@ std::stringstream ss; ss << "vkCmdCopyImage: pRegion[" << i << "] dstSubresource.aspectMask cannot specify aspects not present in dest image"; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c0011e, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_09c0011e]); + HandleToUint64(command_buffer), VALIDATION_ERROR_09c0011e, "%s.", ss.str().c_str()); } // AspectMask must not contain VK_IMAGE_ASPECT_METADATA_BIT @@ -1835,8 +1882,7 @@ std::stringstream ss; ss << "vkCmdCopyImage: pRegions[" << i << "] may not specify aspectMask containing VK_IMAGE_ASPECT_METADATA_BIT"; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_0a600150, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_0a600150]); + HandleToUint64(command_buffer), VALIDATION_ERROR_0a600150, "%s.", ss.str().c_str()); } // For each region, if aspectMask contains VK_IMAGE_ASPECT_COLOR_BIT, it must not contain either of @@ -1845,8 +1891,7 @@ (region.srcSubresource.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) { char const str[] = "vkCmdCopyImage aspectMask cannot specify both COLOR and DEPTH/STENCIL aspects"; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_0a60014e, "IMAGE", "%s. %s", str, - validation_error_map[VALIDATION_ERROR_0a60014e]); + HandleToUint64(command_buffer), VALIDATION_ERROR_0a60014e, "%s.", str); } // MipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created @@ -1855,16 +1900,14 @@ ss << "vkCmdCopyImage: pRegions[" << i << "] specifies a src mipLevel greater than the number specified when the srcImage was created."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_19000d40, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_19000d40]); + HandleToUint64(command_buffer), VALIDATION_ERROR_19000d40, "%s.", ss.str().c_str()); } if (region.dstSubresource.mipLevel >= dst_image_state->createInfo.mipLevels) { std::stringstream ss; ss << "vkCmdCopyImage: pRegions[" << i << "] specifies a dst mipLevel greater than the number specified when the dstImage was created."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_19000d42, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_19000d42]); + HandleToUint64(command_buffer), VALIDATION_ERROR_19000d42, "%s.", ss.str().c_str()); } // (baseArrayLayer + layerCount) must be less than or equal to the arrayLayers specified in VkImageCreateInfo when the @@ -1874,16 +1917,14 @@ ss << "vkCmdCopyImage: srcImage arrayLayers was " << src_image_state->createInfo.arrayLayers << " but subRegion[" << i << "] baseArrayLayer + layerCount is " << (region.srcSubresource.baseArrayLayer + region.srcSubresource.layerCount); skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_19000d44, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_19000d44]); + HandleToUint64(command_buffer), VALIDATION_ERROR_19000d44, "%s.", ss.str().c_str()); } if ((region.dstSubresource.baseArrayLayer + region.dstSubresource.layerCount) > dst_image_state->createInfo.arrayLayers) { std::stringstream ss; ss << "vkCmdCopyImage: dstImage arrayLayers was " << dst_image_state->createInfo.arrayLayers << " but subRegion[" << i << "] baseArrayLayer + layerCount is " << (region.dstSubresource.baseArrayLayer + region.dstSubresource.layerCount); skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_19000d46, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_19000d46]); + HandleToUint64(command_buffer), VALIDATION_ERROR_19000d46, "%s.", ss.str().c_str()); } // Check region extents for 1D-1D, 2D-2D, and 3D-3D copies @@ -1897,8 +1938,7 @@ << " ], extent [ " << src_copy_extent.width << ", " << src_copy_extent.height << ", " << src_copy_extent.depth << " ] exceeds the source image dimensions"; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_190000f4, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_190000f4]); + HandleToUint64(command_buffer), VALIDATION_ERROR_190000f4, "%s.", ss.str().c_str()); } // The destination region specified by a given element of regions must be a region that is contained within dst_image @@ -1910,8 +1950,7 @@ << " ], extent [ " << dst_copy_extent.width << ", " << dst_copy_extent.height << ", " << dst_copy_extent.depth << " ] exceeds the destination image dimensions"; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_190000f6, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_190000f6]); + HandleToUint64(command_buffer), VALIDATION_ERROR_190000f6, "%s.", ss.str().c_str()); } } @@ -1921,28 +1960,25 @@ uint32_t extent_check = ExceedsBounds(&(region.srcOffset), &src_copy_extent, &subresource_extent); if (extent_check & x_bit) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c00120, "IMAGE", + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00120, "vkCmdCopyImage: Source image pRegion %1d x-dimension offset [%1d] + extent [%1d] exceeds subResource " - "width [%1d]. %s", - i, region.srcOffset.x, src_copy_extent.width, subresource_extent.width, - validation_error_map[VALIDATION_ERROR_09c00120]); + "width [%1d].", + i, region.srcOffset.x, src_copy_extent.width, subresource_extent.width); } if (extent_check & y_bit) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c00122, "IMAGE", + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00122, "vkCmdCopyImage: Source image pRegion %1d y-dimension offset [%1d] + extent [%1d] exceeds subResource " - "height [%1d]. %s", - i, region.srcOffset.y, src_copy_extent.height, subresource_extent.height, - validation_error_map[VALIDATION_ERROR_09c00122]); + "height [%1d].", + i, region.srcOffset.y, src_copy_extent.height, subresource_extent.height); } if (extent_check & z_bit) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c00126, "IMAGE", + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00126, "vkCmdCopyImage: Source image pRegion %1d z-dimension offset [%1d] + extent [%1d] exceeds subResource " - "depth [%1d]. %s", - i, region.srcOffset.z, src_copy_extent.depth, subresource_extent.depth, - validation_error_map[VALIDATION_ERROR_09c00126]); + "depth [%1d].", + i, region.srcOffset.z, src_copy_extent.depth, subresource_extent.depth); } // Adjust dest extent if necessary @@ -1952,39 +1988,36 @@ extent_check = ExceedsBounds(&(region.dstOffset), &dst_copy_extent, &subresource_extent); if (extent_check & x_bit) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c0012c, "IMAGE", + HandleToUint64(command_buffer), VALIDATION_ERROR_09c0012c, "vkCmdCopyImage: Dest image pRegion %1d x-dimension offset [%1d] + extent [%1d] exceeds subResource " - "width [%1d]. %s", - i, region.dstOffset.x, dst_copy_extent.width, subresource_extent.width, - validation_error_map[VALIDATION_ERROR_09c0012c]); + "width [%1d].", + i, region.dstOffset.x, dst_copy_extent.width, subresource_extent.width); } if (extent_check & y_bit) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c0012e, "IMAGE", + HandleToUint64(command_buffer), VALIDATION_ERROR_09c0012e, "vkCmdCopyImage: Dest image pRegion %1d y-dimension offset [%1d] + extent [%1d] exceeds subResource " - "height [%1d]. %s", - i, region.dstOffset.y, dst_copy_extent.height, subresource_extent.height, - validation_error_map[VALIDATION_ERROR_09c0012e]); + "height [%1d].", + i, region.dstOffset.y, dst_copy_extent.height, subresource_extent.height); } if (extent_check & z_bit) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_09c00132, "IMAGE", + HandleToUint64(command_buffer), VALIDATION_ERROR_09c00132, "vkCmdCopyImage: Dest image pRegion %1d z-dimension offset [%1d] + extent [%1d] exceeds subResource " - "depth [%1d]. %s", - i, region.dstOffset.z, dst_copy_extent.depth, subresource_extent.depth, - validation_error_map[VALIDATION_ERROR_09c00132]); + "depth [%1d].", + i, region.dstOffset.z, dst_copy_extent.depth, subresource_extent.depth); } // The union of all source regions, and the union of all destination regions, specified by the elements of regions, // must not overlap in memory if (src_image_state->image == dst_image_state->image) { for (uint32_t j = 0; j < region_count; j++) { - if (RegionIntersects(®ion, ®ions[j], src_image_state->createInfo.imageType)) { + if (RegionIntersects(®ion, ®ions[j], src_image_state->createInfo.imageType, + FormatIsMultiplane(src_image_state->createInfo.format))) { std::stringstream ss; ss << "vkCmdCopyImage: pRegions[" << i << "] src overlaps with pRegions[" << j << "]."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_190000f8, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_190000f8]); + HandleToUint64(command_buffer), VALIDATION_ERROR_190000f8, "%s.", ss.str().c_str()); } } } @@ -1997,7 +2030,7 @@ if (src_image_state->createInfo.format != dst_image_state->createInfo.format) { char const str[] = "vkCmdCopyImage called with unmatched source and dest image depth/stencil formats."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, DRAWSTATE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str); + HandleToUint64(command_buffer), DRAWSTATE_MISMATCHED_IMAGE_FORMAT, str); } } else { size_t srcSize = FormatSize(src_image_state->createInfo.format); @@ -2005,8 +2038,7 @@ if (srcSize != destSize) { char const str[] = "vkCmdCopyImage called with unmatched source and dest image format sizes."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_1900010e, "IMAGE", "%s. %s", str, - validation_error_map[VALIDATION_ERROR_1900010e]); + HandleToUint64(command_buffer), VALIDATION_ERROR_1900010e, "%s.", str); } } @@ -2014,8 +2046,7 @@ if (src_image_state->createInfo.samples != dst_image_state->createInfo.samples) { char const str[] = "vkCmdCopyImage() called on image pair with non-identical sample counts."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, VALIDATION_ERROR_19000110, "IMAGE", "%s %s", str, - validation_error_map[VALIDATION_ERROR_19000110]); + HandleToUint64(command_buffer), VALIDATION_ERROR_19000110, "%s", str); } skip |= ValidateMemoryIsBoundToImage(device_data, src_image_state, "vkCmdCopyImage()", VALIDATION_ERROR_190000fe); @@ -2088,7 +2119,7 @@ // CmdClearAttachments. skip |= log_msg( report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), 0, DRAWSTATE_CLEAR_CMD_BEFORE_DRAW, "DS", + HandleToUint64(commandBuffer), DRAWSTATE_CLEAR_CMD_BEFORE_DRAW, "vkCmdClearAttachments() issued on command buffer object 0x%" PRIx64 " prior to any Draw Cmds. It is recommended you use RenderPass LOAD_OP_CLEAR on Attachments prior to any Draw.", HandleToUint64(commandBuffer)); @@ -2108,23 +2139,20 @@ if (0 == clear_desc->aspectMask) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_01c00c03, "IMAGE", "%s", - validation_error_map[VALIDATION_ERROR_01c00c03]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_01c00c03, " "); } else if (clear_desc->aspectMask & VK_IMAGE_ASPECT_METADATA_BIT) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_01c00028, "IMAGE", "%s", - validation_error_map[VALIDATION_ERROR_01c00028]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_01c00028, " "); } else if (clear_desc->aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) { if (clear_desc->colorAttachment >= subpass_desc->colorAttachmentCount) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1860001e, "DS", - "vkCmdClearAttachments() color attachment index %d out of range for active subpass %d. %s", - clear_desc->colorAttachment, cb_node->activeSubpass, - validation_error_map[VALIDATION_ERROR_1860001e]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_1860001e, + "vkCmdClearAttachments() color attachment index %d out of range for active subpass %d.", + clear_desc->colorAttachment, cb_node->activeSubpass); } else if (subpass_desc->pColorAttachments[clear_desc->colorAttachment].attachment == VK_ATTACHMENT_UNUSED) { skip |= log_msg(report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(commandBuffer), __LINE__, - DRAWSTATE_MISSING_ATTACHMENT_REFERENCE, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(commandBuffer), + DRAWSTATE_MISSING_ATTACHMENT_REFERENCE, "vkCmdClearAttachments() color attachment index %d is VK_ATTACHMENT_UNUSED; ignored.", clear_desc->colorAttachment); } else { @@ -2134,24 +2162,22 @@ if ((clear_desc->aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) || (clear_desc->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT)) { char const str[] = - "vkCmdClearAttachments aspectMask [%d] must set only VK_IMAGE_ASPECT_COLOR_BIT of a color attachment. %s"; + "vkCmdClearAttachments() aspectMask [%d] must set only VK_IMAGE_ASPECT_COLOR_BIT of a color attachment."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_01c00026, "IMAGE", str, i, - validation_error_map[VALIDATION_ERROR_01c00026]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_01c00026, str, i); } } else { // Must be depth and/or stencil if (((clear_desc->aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) && ((clear_desc->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT)) { - char const str[] = "vkCmdClearAttachments aspectMask [%d] is not a valid combination of bits. %s"; + char const str[] = "vkCmdClearAttachments() aspectMask [%d] is not a valid combination of bits."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_01c00c01, "IMAGE", str, i, - validation_error_map[VALIDATION_ERROR_01c00c01]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_01c00c01, str, i); } if (!subpass_desc->pDepthStencilAttachment || (subpass_desc->pDepthStencilAttachment->attachment == VK_ATTACHMENT_UNUSED)) { skip |= log_msg( report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, DRAWSTATE_MISSING_ATTACHMENT_REFERENCE, "DS", + HandleToUint64(commandBuffer), DRAWSTATE_MISSING_ATTACHMENT_REFERENCE, "vkCmdClearAttachments() depth/stencil clear with no depth/stencil attachment in subpass; ignored"); } else { image_view = framebuffer->createInfo.pAttachments[subpass_desc->pDepthStencilAttachment->attachment]; @@ -2162,14 +2188,27 @@ for (uint32_t j = 0; j < rectCount; j++) { // The rectangular region specified by a given element of pRects must be contained within the render area of // the current render pass instance - // TODO: This check should be moved to CmdExecuteCommands or QueueSubmit to cover secondary CB cases - if ((cb_node->createInfo.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) && - (false == ContainsRect(cb_node->activeRenderPassBeginInfo.renderArea, pRects[j].rect))) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_18600020, "DS", + if (cb_node->createInfo.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) { + if (false == ContainsRect(cb_node->activeRenderPassBeginInfo.renderArea, pRects[j].rect)) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_18600020, "vkCmdClearAttachments(): The area defined by pRects[%d] is not contained in the area of " - "the current render pass instance. %s", - j, validation_error_map[VALIDATION_ERROR_18600020]); + "the current render pass instance.", + j); + } + } else { + cb_node->cmd_execute_commands_functions.emplace_back([=](GLOBAL_CB_NODE *prim_cb, VkFramebuffer fb) { + if (false == ContainsRect(prim_cb->activeRenderPassBeginInfo.renderArea, pRects[j].rect)) { + return log_msg( + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_18600020, + "vkCmdClearAttachments(): The area defined by pRects[%d] is not contained in the area of " + "the current render pass instance.", + j); + } + return false; + }); } // The layers specified by a given element of pRects must be contained within every attachment that // pAttachments refers to @@ -2177,10 +2216,10 @@ if ((pRects[j].baseArrayLayer >= attachment_layer_count) || (pRects[j].baseArrayLayer + pRects[j].layerCount > attachment_layer_count)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_18600022, "DS", + HandleToUint64(commandBuffer), VALIDATION_ERROR_18600022, "vkCmdClearAttachments(): The layers defined in pRects[%d] are not contained in the layers " - "of pAttachment[%d]. %s", - j, i, validation_error_map[VALIDATION_ERROR_18600022]); + "of pAttachment[%d].", + j, i); } } } @@ -2207,51 +2246,47 @@ if (pRegions[i].srcSubresource.layerCount == 0) { char const str[] = "vkCmdResolveImage: number of layers in source subresource is zero"; skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str); + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_MISMATCHED_IMAGE_ASPECT, str); } if (pRegions[i].dstSubresource.layerCount == 0) { char const str[] = "vkCmdResolveImage: number of layers in destination subresource is zero"; skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str); + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_MISMATCHED_IMAGE_ASPECT, str); } if (pRegions[i].srcSubresource.layerCount != pRegions[i].dstSubresource.layerCount) { skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_0a200216, "IMAGE", - "vkCmdResolveImage: layerCount in source and destination subresource of pRegions[%d] does not match. %s", i, - validation_error_map[VALIDATION_ERROR_0a200216]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_0a200216, + "vkCmdResolveImage: layerCount in source and destination subresource of pRegions[%d] does not match.", i); } 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 |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_0a200214, "IMAGE", "%s. %s", str, - validation_error_map[VALIDATION_ERROR_0a200214]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_0a200214, "%s.", str); } } if (src_image_state->createInfo.format != dst_image_state->createInfo.format) { char const str[] = "vkCmdResolveImage called with unmatched source and dest formats."; skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str); + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_MISMATCHED_IMAGE_FORMAT, str); } if (src_image_state->createInfo.imageType != dst_image_state->createInfo.imageType) { char const str[] = "vkCmdResolveImage called with unmatched source and dest image types."; skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_MISMATCHED_IMAGE_TYPE, "IMAGE", str); + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_MISMATCHED_IMAGE_TYPE, str); } if (src_image_state->createInfo.samples == VK_SAMPLE_COUNT_1_BIT) { char const str[] = "vkCmdResolveImage called with source sample count less than 2."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_1c800202, "IMAGE", "%s. %s", str, - validation_error_map[VALIDATION_ERROR_1c800202]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_1c800202, "%s.", str); } if (dst_image_state->createInfo.samples != VK_SAMPLE_COUNT_1_BIT) { char const str[] = "vkCmdResolveImage called with dest sample count greater than 1."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_1c800206, "IMAGE", "%s. %s", str, - validation_error_map[VALIDATION_ERROR_1c800206]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_1c800206, "%s.", str); } // TODO: Need to validate image layouts, which will include layout validation for shared presentable images } else { @@ -2312,51 +2347,48 @@ VkFormatFeatureFlags flags = (tiling == VK_IMAGE_TILING_LINEAR ? props.linearTilingFeatures : props.optimalTilingFeatures); if (VK_FORMAT_FEATURE_BLIT_SRC_BIT != (flags & VK_FORMAT_FEATURE_BLIT_SRC_BIT)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001b4, "IMAGE", - "vkCmdBlitImage: source image format %s does not support VK_FORMAT_FEATURE_BLIT_SRC_BIT feature. %s", - string_VkFormat(src_format), validation_error_map[VALIDATION_ERROR_184001b4]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001b4, + "vkCmdBlitImage: source image format %s does not support VK_FORMAT_FEATURE_BLIT_SRC_BIT feature.", + string_VkFormat(src_format)); } if ((VK_FILTER_LINEAR == filter) && (VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT != (flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT))) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001d6, "IMAGE", - "vkCmdBlitImage: source image format %s does not support linear filtering. %s", - string_VkFormat(src_format), validation_error_map[VALIDATION_ERROR_184001d6]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001d6, + "vkCmdBlitImage: source image format %s does not support linear filtering.", string_VkFormat(src_format)); } if ((VK_FILTER_CUBIC_IMG == filter) && (VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG != (flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG))) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001d8, "IMAGE", - "vkCmdBlitImage: source image format %s does not support cubic filtering. %s", - string_VkFormat(src_format), validation_error_map[VALIDATION_ERROR_184001d8]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001d8, + "vkCmdBlitImage: source image format %s does not support cubic filtering.", string_VkFormat(src_format)); } if ((VK_FILTER_CUBIC_IMG == filter) && (VK_IMAGE_TYPE_3D != src_type)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001da, "IMAGE", - "vkCmdBlitImage: source image type must be VK_IMAGE_TYPE_3D when cubic filtering is specified. %s", - validation_error_map[VALIDATION_ERROR_184001da]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001da, + "vkCmdBlitImage: source image type must be VK_IMAGE_TYPE_3D when cubic filtering is specified."); } props = GetFormatProperties(device_data, dst_format); tiling = dst_image_state->createInfo.tiling; flags = (tiling == VK_IMAGE_TILING_LINEAR ? props.linearTilingFeatures : props.optimalTilingFeatures); if (VK_FORMAT_FEATURE_BLIT_DST_BIT != (flags & VK_FORMAT_FEATURE_BLIT_DST_BIT)) { - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001be, "IMAGE", - "vkCmdBlitImage: destination image format %s does not support VK_FORMAT_FEATURE_BLIT_DST_BIT feature. %s", - string_VkFormat(dst_format), validation_error_map[VALIDATION_ERROR_184001be]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001be, + "vkCmdBlitImage: destination image format %s does not support VK_FORMAT_FEATURE_BLIT_DST_BIT feature.", + string_VkFormat(dst_format)); } if ((VK_SAMPLE_COUNT_1_BIT != src_image_state->createInfo.samples) || (VK_SAMPLE_COUNT_1_BIT != dst_image_state->createInfo.samples)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001c8, "IMAGE", - "vkCmdBlitImage: source or dest image has sample count other than VK_SAMPLE_COUNT_1_BIT. %s", - validation_error_map[VALIDATION_ERROR_184001c8]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001c8, + "vkCmdBlitImage: source or dest image has sample count other than VK_SAMPLE_COUNT_1_BIT."); } // Validate consistency for unsigned formats @@ -2366,8 +2398,7 @@ << "the other one must also have unsigned integer format. " << "Source format is " << string_VkFormat(src_format) << " Destination format is " << string_VkFormat(dst_format); skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001cc, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_184001cc]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001cc, "%s.", ss.str().c_str()); } // Validate consistency for signed formats @@ -2377,8 +2408,7 @@ << "the other one must also have signed integer format. " << "Source format is " << string_VkFormat(src_format) << " Destination format is " << string_VkFormat(dst_format); skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001ca, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_184001ca]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001ca, "%s.", ss.str().c_str()); } // Validate filter for Depth/Stencil formats @@ -2387,8 +2417,7 @@ ss << "vkCmdBlitImage: If the format of srcImage is a depth, stencil, or depth stencil " << "then filter must be VK_FILTER_NEAREST."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001d0, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_184001d0]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001d0, "%s.", ss.str().c_str()); } // Validate aspect bits and formats for depth/stencil images @@ -2400,8 +2429,7 @@ << "Source format is " << string_VkFormat(src_format) << " Destination format is " << string_VkFormat(dst_format); skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001ce, "IMAGE", "%s. %s", - ss.str().c_str(), validation_error_map[VALIDATION_ERROR_184001ce]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001ce, "%s.", ss.str().c_str()); } #if 0 // TODO: Cannot find VU statements or spec language for these in CmdBlitImage. Verify or remove. @@ -2414,7 +2442,7 @@ ss << "vkCmdBlitImage: Combination depth/stencil image formats must have only one of VK_IMAGE_ASPECT_DEPTH_BIT " << "and VK_IMAGE_ASPECT_STENCIL_BIT set in srcImage and dstImage"; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_INVALID_IMAGE_ASPECT, "IMAGE", + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_INVALID_IMAGE_ASPECT, "%s", ss.str().c_str()); } } @@ -2424,7 +2452,7 @@ ss << "vkCmdBlitImage: Stencil-only image formats must have only the VK_IMAGE_ASPECT_STENCIL_BIT " << "set in both the srcImage and dstImage"; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_INVALID_IMAGE_ASPECT, "IMAGE", + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_INVALID_IMAGE_ASPECT, "%s", ss.str().c_str()); } } @@ -2434,7 +2462,7 @@ ss << "vkCmdBlitImage: Depth-only image formats must have only the VK_IMAGE_ASPECT_DEPTH " << "set in both the srcImage and dstImage"; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_INVALID_IMAGE_ASPECT, "IMAGE", + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_INVALID_IMAGE_ASPECT, "%s", ss.str().c_str()); } } @@ -2459,59 +2487,54 @@ std::stringstream ss; ss << "vkCmdBlitImage: pRegions[" << i << "].srcOffsets specify a zero-volume area."; skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_INVALID_EXTENTS, "IMAGE", "%s", - ss.str().c_str()); + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_INVALID_EXTENTS, "%s", ss.str().c_str()); } if ((rgn.dstOffsets[0].x == rgn.dstOffsets[1].x) || (rgn.dstOffsets[0].y == rgn.dstOffsets[1].y) || (rgn.dstOffsets[0].z == rgn.dstOffsets[1].z)) { std::stringstream ss; ss << "vkCmdBlitImage: pRegions[" << i << "].dstOffsets specify a zero-volume area."; skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_INVALID_EXTENTS, "IMAGE", "%s", - ss.str().c_str()); + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_INVALID_EXTENTS, "%s", ss.str().c_str()); } if (rgn.srcSubresource.layerCount == 0) { char const str[] = "vkCmdBlitImage: number of layers in source subresource is zero"; skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str); + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_MISMATCHED_IMAGE_ASPECT, str); } if (rgn.dstSubresource.layerCount == 0) { char const str[] = "vkCmdBlitImage: number of layers in destination subresource is zero"; skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str); + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_MISMATCHED_IMAGE_ASPECT, str); } // Check that src/dst layercounts match if (rgn.srcSubresource.layerCount != rgn.dstSubresource.layerCount) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001de, "IMAGE", - "vkCmdBlitImage: layerCount in source and destination subresource of pRegions[%d] does not match. %s", - i, validation_error_map[VALIDATION_ERROR_09a001de]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001de, + "vkCmdBlitImage: layerCount in source and destination subresource of pRegions[%d] does not match.", i); } if (rgn.srcSubresource.aspectMask != rgn.dstSubresource.aspectMask) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001dc, "IMAGE", - "vkCmdBlitImage: aspectMask members for pRegion[%d] do not match. %s", i, - validation_error_map[VALIDATION_ERROR_09a001dc]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001dc, + "vkCmdBlitImage: aspectMask members for pRegion[%d] do not match.", i); } if (!VerifyAspectsPresent(rgn.srcSubresource.aspectMask, src_format)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001e2, "IMAGE", + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001e2, "vkCmdBlitImage: region [%d] source aspectMask (0x%x) specifies aspects not present in source " - "image format %s. %s", - i, rgn.srcSubresource.aspectMask, string_VkFormat(src_format), - validation_error_map[VALIDATION_ERROR_09a001e2]); + "image format %s.", + i, rgn.srcSubresource.aspectMask, string_VkFormat(src_format)); } if (!VerifyAspectsPresent(rgn.dstSubresource.aspectMask, dst_format)) { skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001e4, "IMAGE", - "vkCmdBlitImage: region [%d] dest aspectMask (0x%x) specifies aspects not present in dest image format %s. %s", - i, rgn.dstSubresource.aspectMask, string_VkFormat(dst_format), validation_error_map[VALIDATION_ERROR_09a001e4]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001e4, + "vkCmdBlitImage: region [%d] dest aspectMask (0x%x) specifies aspects not present in dest image format %s.", i, + rgn.dstSubresource.aspectMask, string_VkFormat(dst_format)); } // Validate source image offsets @@ -2519,20 +2542,20 @@ if (VK_IMAGE_TYPE_1D == src_type) { if ((0 != rgn.srcOffsets[0].y) || (1 != rgn.srcOffsets[1].y)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001ea, "IMAGE", + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001ea, "vkCmdBlitImage: region [%d], source image of type VK_IMAGE_TYPE_1D with srcOffset[].y values " - "of (%1d, %1d). These must be (0, 1). %s", - i, rgn.srcOffsets[0].y, rgn.srcOffsets[1].y, validation_error_map[VALIDATION_ERROR_09a001ea]); + "of (%1d, %1d). These must be (0, 1).", + i, rgn.srcOffsets[0].y, rgn.srcOffsets[1].y); } } if ((VK_IMAGE_TYPE_1D == src_type) || (VK_IMAGE_TYPE_2D == src_type)) { if ((0 != rgn.srcOffsets[0].z) || (1 != rgn.srcOffsets[1].z)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001ee, "IMAGE", + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001ee, "vkCmdBlitImage: region [%d], source image of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D with " - "srcOffset[].z values of (%1d, %1d). These must be (0, 1). %s", - i, rgn.srcOffsets[0].z, rgn.srcOffsets[1].z, validation_error_map[VALIDATION_ERROR_09a001ee]); + "srcOffset[].z values of (%1d, %1d). These must be (0, 1).", + i, rgn.srcOffsets[0].z, rgn.srcOffsets[1].z); } } @@ -2540,40 +2563,39 @@ if ((rgn.srcOffsets[0].x < 0) || (rgn.srcOffsets[0].x > static_cast(src_extent.width)) || (rgn.srcOffsets[1].x < 0) || (rgn.srcOffsets[1].x > static_cast(src_extent.width))) { oob = true; - skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001e6, "IMAGE", - "vkCmdBlitImage: region [%d] srcOffset[].x values (%1d, %1d) exceed srcSubresource width extent (%1d). %s", i, - rgn.srcOffsets[0].x, rgn.srcOffsets[1].x, src_extent.width, validation_error_map[VALIDATION_ERROR_09a001e6]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001e6, + "vkCmdBlitImage: region [%d] srcOffset[].x values (%1d, %1d) exceed srcSubresource width extent (%1d).", + i, rgn.srcOffsets[0].x, rgn.srcOffsets[1].x, src_extent.width); } if ((rgn.srcOffsets[0].y < 0) || (rgn.srcOffsets[0].y > static_cast(src_extent.height)) || (rgn.srcOffsets[1].y < 0) || (rgn.srcOffsets[1].y > static_cast(src_extent.height))) { oob = true; skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001e8, "IMAGE", - "vkCmdBlitImage: region [%d] srcOffset[].y values (%1d, %1d) exceed srcSubresource height extent (%1d). %s", i, - rgn.srcOffsets[0].y, rgn.srcOffsets[1].y, src_extent.height, validation_error_map[VALIDATION_ERROR_09a001e8]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001e8, + "vkCmdBlitImage: region [%d] srcOffset[].y values (%1d, %1d) exceed srcSubresource height extent (%1d).", i, + rgn.srcOffsets[0].y, rgn.srcOffsets[1].y, src_extent.height); } if ((rgn.srcOffsets[0].z < 0) || (rgn.srcOffsets[0].z > static_cast(src_extent.depth)) || (rgn.srcOffsets[1].z < 0) || (rgn.srcOffsets[1].z > static_cast(src_extent.depth))) { oob = true; - skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001ec, "IMAGE", - "vkCmdBlitImage: region [%d] srcOffset[].z values (%1d, %1d) exceed srcSubresource depth extent (%1d). %s", i, - rgn.srcOffsets[0].z, rgn.srcOffsets[1].z, src_extent.depth, validation_error_map[VALIDATION_ERROR_09a001ec]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001ec, + "vkCmdBlitImage: region [%d] srcOffset[].z values (%1d, %1d) exceed srcSubresource depth extent (%1d).", + i, rgn.srcOffsets[0].z, rgn.srcOffsets[1].z, src_extent.depth); } if (rgn.srcSubresource.mipLevel >= src_image_state->createInfo.mipLevels) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001ae, "IMAGE", - "vkCmdBlitImage: region [%d] source image, attempt to access a non-existant mip level %1d. %s", i, - rgn.srcSubresource.mipLevel, validation_error_map[VALIDATION_ERROR_184001ae]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001ae, + "vkCmdBlitImage: region [%d] source image, attempt to access a non-existant mip level %1d.", i, + rgn.srcSubresource.mipLevel); } else if (oob) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001ae, "IMAGE", - "vkCmdBlitImage: region [%d] source image blit region exceeds image dimensions. %s", i, - validation_error_map[VALIDATION_ERROR_184001ae]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001ae, + "vkCmdBlitImage: region [%d] source image blit region exceeds image dimensions.", i); } // Validate dest image offsets @@ -2581,20 +2603,20 @@ if (VK_IMAGE_TYPE_1D == dst_type) { if ((0 != rgn.dstOffsets[0].y) || (1 != rgn.dstOffsets[1].y)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001f4, "IMAGE", + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001f4, "vkCmdBlitImage: region [%d], dest image of type VK_IMAGE_TYPE_1D with dstOffset[].y values of " - "(%1d, %1d). These must be (0, 1). %s", - i, rgn.dstOffsets[0].y, rgn.dstOffsets[1].y, validation_error_map[VALIDATION_ERROR_09a001f4]); + "(%1d, %1d). These must be (0, 1).", + i, rgn.dstOffsets[0].y, rgn.dstOffsets[1].y); } } if ((VK_IMAGE_TYPE_1D == dst_type) || (VK_IMAGE_TYPE_2D == dst_type)) { if ((0 != rgn.dstOffsets[0].z) || (1 != rgn.dstOffsets[1].z)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001f8, "IMAGE", + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001f8, "vkCmdBlitImage: region [%d], dest image of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D with " - "dstOffset[].z values of (%1d, %1d). These must be (0, 1). %s", - i, rgn.dstOffsets[0].z, rgn.dstOffsets[1].z, validation_error_map[VALIDATION_ERROR_09a001f8]); + "dstOffset[].z values of (%1d, %1d). These must be (0, 1).", + i, rgn.dstOffsets[0].z, rgn.dstOffsets[1].z); } } @@ -2602,50 +2624,49 @@ if ((rgn.dstOffsets[0].x < 0) || (rgn.dstOffsets[0].x > static_cast(dst_extent.width)) || (rgn.dstOffsets[1].x < 0) || (rgn.dstOffsets[1].x > static_cast(dst_extent.width))) { oob = true; - skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001f0, "IMAGE", - "vkCmdBlitImage: region [%d] dstOffset[].x values (%1d, %1d) exceed dstSubresource width extent (%1d). %s", i, - rgn.dstOffsets[0].x, rgn.dstOffsets[1].x, dst_extent.width, validation_error_map[VALIDATION_ERROR_09a001f0]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001f0, + "vkCmdBlitImage: region [%d] dstOffset[].x values (%1d, %1d) exceed dstSubresource width extent (%1d).", + i, rgn.dstOffsets[0].x, rgn.dstOffsets[1].x, dst_extent.width); } if ((rgn.dstOffsets[0].y < 0) || (rgn.dstOffsets[0].y > static_cast(dst_extent.height)) || (rgn.dstOffsets[1].y < 0) || (rgn.dstOffsets[1].y > static_cast(dst_extent.height))) { oob = true; skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001f2, "IMAGE", - "vkCmdBlitImage: region [%d] dstOffset[].y values (%1d, %1d) exceed dstSubresource height extent (%1d). %s", i, - rgn.dstOffsets[0].y, rgn.dstOffsets[1].y, dst_extent.height, validation_error_map[VALIDATION_ERROR_09a001f2]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001f2, + "vkCmdBlitImage: region [%d] dstOffset[].y values (%1d, %1d) exceed dstSubresource height extent (%1d).", i, + rgn.dstOffsets[0].y, rgn.dstOffsets[1].y, dst_extent.height); } if ((rgn.dstOffsets[0].z < 0) || (rgn.dstOffsets[0].z > static_cast(dst_extent.depth)) || (rgn.dstOffsets[1].z < 0) || (rgn.dstOffsets[1].z > static_cast(dst_extent.depth))) { oob = true; - skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001f6, "IMAGE", - "vkCmdBlitImage: region [%d] dstOffset[].z values (%1d, %1d) exceed dstSubresource depth extent (%1d). %s", i, - rgn.dstOffsets[0].z, rgn.dstOffsets[1].z, dst_extent.depth, validation_error_map[VALIDATION_ERROR_09a001f6]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001f6, + "vkCmdBlitImage: region [%d] dstOffset[].z values (%1d, %1d) exceed dstSubresource depth extent (%1d).", + i, rgn.dstOffsets[0].z, rgn.dstOffsets[1].z, dst_extent.depth); } if (rgn.dstSubresource.mipLevel >= dst_image_state->createInfo.mipLevels) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001b0, "IMAGE", - "vkCmdBlitImage: region [%d] destination image, attempt to access a non-existant mip level %1d. %s", - i, rgn.dstSubresource.mipLevel, validation_error_map[VALIDATION_ERROR_184001b0]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001b0, + "vkCmdBlitImage: region [%d] destination image, attempt to access a non-existant mip level %1d.", i, + rgn.dstSubresource.mipLevel); } else if (oob) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_184001b0, "IMAGE", - "vkCmdBlitImage: region [%d] destination image blit region exceeds image dimensions. %s", i, - validation_error_map[VALIDATION_ERROR_184001b0]); + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001b0, + "vkCmdBlitImage: region [%d] destination image blit region exceeds image dimensions.", i); } if ((VK_IMAGE_TYPE_3D == src_type) || (VK_IMAGE_TYPE_3D == dst_type)) { if ((0 != rgn.srcSubresource.baseArrayLayer) || (1 != rgn.srcSubresource.layerCount) || (0 != rgn.dstSubresource.baseArrayLayer) || (1 != rgn.dstSubresource.layerCount)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_09a001e0, "IMAGE", + HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_09a001e0, "vkCmdBlitImage: region [%d] blit to/from a 3D image type with a non-zero baseArrayLayer, or a " - "layerCount other than 1. %s", - i, validation_error_map[VALIDATION_ERROR_09a001e0]); + "layerCount other than 1.", + i); } } } // per-region checks @@ -2687,15 +2708,15 @@ for (auto cb_image_data : pCB->imageLayoutMap) { VkImageLayout imageLayout; - if (FindLayout(overlayLayoutMap, cb_image_data.first, imageLayout) || - FindLayout(globalImageLayoutMap, cb_image_data.first, imageLayout)) { + if (FindLayout(device_data, overlayLayoutMap, cb_image_data.first, imageLayout) || + FindLayout(device_data, globalImageLayoutMap, cb_image_data.first, imageLayout)) { if (cb_image_data.second.initialLayout == VK_IMAGE_LAYOUT_UNDEFINED) { // TODO: Set memory invalid which is in mem_tracker currently } else if (imageLayout != cb_image_data.second.initialLayout) { if (cb_image_data.first.hasSubresource) { skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + HandleToUint64(pCB->commandBuffer), DRAWSTATE_INVALID_IMAGE_LAYOUT, "Cannot submit cmd buffer using image (0x%" PRIx64 ") [sub-resource: aspectMask 0x%X array layer %u, mip level %u], with layout %s when first use is %s.", HandleToUint64(cb_image_data.first.image), cb_image_data.first.subresource.aspectMask, @@ -2703,7 +2724,7 @@ string_VkImageLayout(imageLayout), string_VkImageLayout(cb_image_data.second.initialLayout)); } else { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + HandleToUint64(pCB->commandBuffer), DRAWSTATE_INVALID_IMAGE_LAYOUT, "Cannot submit cmd buffer using image (0x%" PRIx64 ") with layout %s when first use is %s.", HandleToUint64(cb_image_data.first.image), string_VkImageLayout(imageLayout), string_VkImageLayout(cb_image_data.second.initialLayout)); @@ -2756,14 +2777,14 @@ if (accessMask & ~(required_bit | optional_bits)) { // TODO: Verify against Valid Use skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cmdBuffer), __LINE__, DRAWSTATE_INVALID_BARRIER, "DS", + HandleToUint64(cmdBuffer), DRAWSTATE_INVALID_BARRIER, "Additional bits in %s accessMask 0x%X %s are specified when layout is %s.", type, accessMask, string_VkAccessFlags(accessMask).c_str(), string_VkImageLayout(layout)); } } else { if (!required_bit) { skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cmdBuffer), __LINE__, DRAWSTATE_INVALID_BARRIER, "DS", + HandleToUint64(cmdBuffer), DRAWSTATE_INVALID_BARRIER, "%s AccessMask %d %s must contain at least one of access bits %d %s when layout is %s, unless the app " "has previously added a barrier for this transition.", type, accessMask, string_VkAccessFlags(accessMask).c_str(), optional_bits, @@ -2776,7 +2797,7 @@ opt_bits = "and may have optional bits " + ss.str() + ' ' + string_VkAccessFlags(optional_bits); } skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cmdBuffer), __LINE__, DRAWSTATE_INVALID_BARRIER, "DS", + HandleToUint64(cmdBuffer), DRAWSTATE_INVALID_BARRIER, "%s AccessMask %d %s must have required access bit %d %s %s when layout is %s, unless the app has " "previously added a barrier for this transition.", type, accessMask, string_VkAccessFlags(accessMask).c_str(), required_bit, @@ -2796,9 +2817,9 @@ if (attachment_description.loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) { if ((first_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL) || (first_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_12200688, "DS", "Cannot clear attachment %d with invalid first layout %s. %s", - attachment, string_VkImageLayout(first_layout), validation_error_map[VALIDATION_ERROR_12200688]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_12200688, "Cannot clear attachment %d with invalid first layout %s.", attachment, + string_VkImageLayout(first_layout)); } } return skip; @@ -2813,16 +2834,16 @@ if (pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_UNDEFINED) { if ((FormatIsColor(format) || FormatHasDepth(format)) && pCreateInfo->pAttachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_LOAD) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DRAWSTATE_INVALID_RENDERPASS, "DS", + skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + DRAWSTATE_INVALID_RENDERPASS, "Render pass has an attachment with 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."); } if (FormatHasStencil(format) && pCreateInfo->pAttachments[i].stencilLoadOp == VK_ATTACHMENT_LOAD_OP_LOAD) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DRAWSTATE_INVALID_RENDERPASS, "DS", + skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + DRAWSTATE_INVALID_RENDERPASS, "Render pass has an attachment with 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 " @@ -2850,14 +2871,14 @@ case VK_IMAGE_LAYOUT_GENERAL: // May not be optimal. TODO: reconsider this warning based on other constraints. skip |= log_msg(report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, DRAWSTATE_INVALID_IMAGE_LAYOUT, "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL."); break; default: // No other layouts are acceptable skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + DRAWSTATE_INVALID_IMAGE_LAYOUT, "Layout for input attachment is %s but can only be READ_ONLY_OPTIMAL or GENERAL.", string_VkImageLayout(subpass.pInputAttachments[j].layout)); } @@ -2871,11 +2892,11 @@ (subpass.pColorAttachments[c].attachment == attach_index && subpass.pColorAttachments[c].layout != layout); } if (found_layout_mismatch) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_140006ae, "DS", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_140006ae, "CreateRenderPass: Subpass %u pInputAttachments[%u] (%u) has layout %u, but is also used as a " - "depth/color attachment with a different layout. %s", - i, j, attach_index, layout, validation_error_map[VALIDATION_ERROR_140006ae]); + "depth/color attachment with a different layout.", + i, j, attach_index, layout); } if (attach_first_use[attach_index]) { @@ -2891,10 +2912,10 @@ if (!used_as_depth && !used_as_color && pCreateInfo->pAttachments[attach_index].loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) { skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_1400069c, "DS", - "CreateRenderPass: attachment %u is first used as an input attachment in subpass %u with loadOp=CLEAR. %s", - attach_index, attach_index, validation_error_map[VALIDATION_ERROR_1400069c]); + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_1400069c, + "CreateRenderPass: attachment %u is first used as an input attachment in subpass %u with loadOp=CLEAR.", + attach_index, attach_index); } } attach_first_use[attach_index] = false; @@ -2916,13 +2937,13 @@ case VK_IMAGE_LAYOUT_GENERAL: // May not be optimal; TODO: reconsider this warning based on other constraints? skip |= log_msg(report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, DRAWSTATE_INVALID_IMAGE_LAYOUT, "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL."); break; default: skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + DRAWSTATE_INVALID_IMAGE_LAYOUT, "Layout for color attachment is %s but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.", string_VkImageLayout(subpass.pColorAttachments[j].layout)); } @@ -2945,7 +2966,7 @@ // May not be optimal; TODO: reconsider this warning based on other constraints? GENERAL can be better than // doing a bunch of transitions. skip |= log_msg(report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, DRAWSTATE_INVALID_IMAGE_LAYOUT, "GENERAL layout for depth attachment may not give optimal performance."); break; @@ -2960,7 +2981,7 @@ default: // No other layouts are acceptable skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + DRAWSTATE_INVALID_IMAGE_LAYOUT, "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)); @@ -2995,7 +3016,7 @@ if (layout != VK_IMAGE_LAYOUT_PREINITIALIZED && layout != VK_IMAGE_LAYOUT_GENERAL) { skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem_info->mem), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + HandleToUint64(mem_info->mem), DRAWSTATE_INVALID_IMAGE_LAYOUT, "Mapping an image with layout %s can result in undefined behavior if this memory is used " "by the device. Only GENERAL or PREINITIALIZED should be used.", string_VkImageLayout(layout)); @@ -3026,16 +3047,15 @@ if (msgCode == -1) { // TODO: Fix callers with msgCode == -1 to use correct validation checks. skip = - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, get_debug_report_enum[obj_type], obj_handle, __LINE__, - MEMTRACK_INVALID_USAGE_FLAG, "MEM", + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, get_debug_report_enum[obj_type], obj_handle, + MEMTRACK_INVALID_USAGE_FLAG, "Invalid usage flag for %s 0x%" PRIx64 " used by %s. In this case, %s should have %s set during creation.", type_str, obj_handle, func_name, type_str, usage_str); } else { - const char *valid_usage = (msgCode == -1) ? "" : validation_error_map[msgCode]; - skip = log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, get_debug_report_enum[obj_type], obj_handle, __LINE__, msgCode, "MEM", - "Invalid usage flag for %s 0x%" PRIx64 " used by %s. In this case, %s should have %s set during creation. %s", - type_str, obj_handle, func_name, type_str, usage_str, valid_usage); + skip = + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, get_debug_report_enum[obj_type], obj_handle, msgCode, + "Invalid usage flag for %s 0x%" PRIx64 " used by %s. In this case, %s should have %s set during creation.", + type_str, obj_handle, func_name, type_str, usage_str); } } return skip; @@ -3064,27 +3084,24 @@ // TODO: Add check for VALIDATION_ERROR_1ec0071e (sparse address space accounting) if ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) && (!GetEnabledFeatures(device_data)->sparseBinding)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_01400726, "DS", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_01400726, "vkCreateBuffer(): the sparseBinding device feature is disabled: Buffers cannot be created with the " - "VK_BUFFER_CREATE_SPARSE_BINDING_BIT set. %s", - validation_error_map[VALIDATION_ERROR_01400726]); + "VK_BUFFER_CREATE_SPARSE_BINDING_BIT set."); } if ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) && (!GetEnabledFeatures(device_data)->sparseResidencyBuffer)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_01400728, "DS", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_01400728, "vkCreateBuffer(): the sparseResidencyBuffer device feature is disabled: Buffers cannot be created with " - "the VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT set. %s", - validation_error_map[VALIDATION_ERROR_01400728]); + "the VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT set."); } if ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) && (!GetEnabledFeatures(device_data)->sparseResidencyAliased)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0140072a, "DS", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0140072a, "vkCreateBuffer(): the sparseResidencyAliased device feature is disabled: Buffers cannot be created with " - "the VK_BUFFER_CREATE_SPARSE_ALIASED_BIT set. %s", - validation_error_map[VALIDATION_ERROR_0140072a]); + "the VK_BUFFER_CREATE_SPARSE_ALIASED_BIT set."); } return skip; } @@ -3122,52 +3139,58 @@ if (FormatIsColor(format)) { if ((aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != VK_IMAGE_ASPECT_COLOR_BIT) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, VALIDATION_ERROR_0a400c01, "IMAGE", - "%s: Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set. %s", func_name, - validation_error_map[VALIDATION_ERROR_0a400c01]); + HandleToUint64(image), VALIDATION_ERROR_0a400c01, + "%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) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, VALIDATION_ERROR_0a400c01, "IMAGE", - "%s: Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set. %s", func_name, - validation_error_map[VALIDATION_ERROR_0a400c01]); + HandleToUint64(image), VALIDATION_ERROR_0a400c01, + "%s: Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.", func_name); } } else if (FormatIsDepthAndStencil(format)) { if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) == 0) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, VALIDATION_ERROR_0a400c01, "IMAGE", + HandleToUint64(image), VALIDATION_ERROR_0a400c01, "%s: Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and " - "VK_IMAGE_ASPECT_STENCIL_BIT set. %s", - func_name, validation_error_map[VALIDATION_ERROR_0a400c01]); + "VK_IMAGE_ASPECT_STENCIL_BIT set.", + func_name); } else if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != aspect_mask) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, VALIDATION_ERROR_0a400c01, "IMAGE", + HandleToUint64(image), VALIDATION_ERROR_0a400c01, "%s: Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and " - "VK_IMAGE_ASPECT_STENCIL_BIT set. %s", - func_name, validation_error_map[VALIDATION_ERROR_0a400c01]); + "VK_IMAGE_ASPECT_STENCIL_BIT set.", + func_name); } } else if (FormatIsDepthOnly(format)) { if ((aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, VALIDATION_ERROR_0a400c01, "IMAGE", - "%s: Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set. %s", func_name, - validation_error_map[VALIDATION_ERROR_0a400c01]); + HandleToUint64(image), VALIDATION_ERROR_0a400c01, + "%s: Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.", func_name); } else if ((aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) != aspect_mask) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, VALIDATION_ERROR_0a400c01, "IMAGE", - "%s: Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set. %s", func_name, - validation_error_map[VALIDATION_ERROR_0a400c01]); + HandleToUint64(image), VALIDATION_ERROR_0a400c01, + "%s: Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.", func_name); } } else if (FormatIsStencilOnly(format)) { if ((aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, VALIDATION_ERROR_0a400c01, "IMAGE", - "%s: Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set. %s", func_name, - validation_error_map[VALIDATION_ERROR_0a400c01]); + HandleToUint64(image), VALIDATION_ERROR_0a400c01, + "%s: Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.", func_name); } else if ((aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) != aspect_mask) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, VALIDATION_ERROR_0a400c01, "IMAGE", - "%s: Stencil-only image formats can have only the VK_IMAGE_ASPECT_STENCIL_BIT set. %s", func_name, - validation_error_map[VALIDATION_ERROR_0a400c01]); + HandleToUint64(image), VALIDATION_ERROR_0a400c01, + "%s: Stencil-only image formats can have only the VK_IMAGE_ASPECT_STENCIL_BIT set.", func_name); + } + } else if (FormatIsMultiplane(format)) { + VkImageAspectFlags valid_flags = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT; + if (3 == FormatPlaneCount(format)) { + valid_flags = valid_flags | VK_IMAGE_ASPECT_PLANE_2_BIT; + } + if ((aspect_mask & valid_flags) != aspect_mask) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + HandleToUint64(image), VALIDATION_ERROR_0a400c01, + "%s: Multi-plane image formats may have only VK_IMAGE_ASPECT_COLOR_BIT or VK_IMAGE_ASPECT_PLANE_n_BITs " + "set, where n = [0, 1, 2].", + func_name); } } return skip; @@ -3186,61 +3209,55 @@ // Validate mip levels if (subresourceRange.baseMipLevel >= image_mip_count) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, image_handle, __LINE__, - errorCodes.base_mip_err, "IMAGE", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, image_handle, + errorCodes.base_mip_err, "%s: %s.baseMipLevel (= %" PRIu32 - ") is greater or equal to the mip level count of the image (i.e. greater or equal to %" PRIu32 "). %s", - cmd_name, param_name, subresourceRange.baseMipLevel, image_mip_count, - validation_error_map[errorCodes.base_mip_err]); + ") is greater or equal to the mip level count of the image (i.e. greater or equal to %" PRIu32 ").", + cmd_name, param_name, subresourceRange.baseMipLevel, image_mip_count); } if (subresourceRange.levelCount != VK_REMAINING_MIP_LEVELS) { if (subresourceRange.levelCount == 0) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, image_handle, - __LINE__, errorCodes.mip_count_err, "IMAGE", "%s: %s.levelCount is 0. %s", cmd_name, param_name, - validation_error_map[errorCodes.mip_count_err]); + errorCodes.mip_count_err, "%s: %s.levelCount is 0.", cmd_name, param_name); } else { const uint64_t necessary_mip_count = uint64_t{subresourceRange.baseMipLevel} + uint64_t{subresourceRange.levelCount}; if (necessary_mip_count > image_mip_count) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, image_handle, - __LINE__, errorCodes.mip_count_err, "IMAGE", + errorCodes.mip_count_err, "%s: %s.baseMipLevel + .levelCount (= %" PRIu32 " + %" PRIu32 " = %" PRIu64 - ") is greater than the mip level count of the image (i.e. greater than %" PRIu32 "). %s", + ") is greater than the mip level count of the image (i.e. greater than %" PRIu32 ").", cmd_name, param_name, subresourceRange.baseMipLevel, subresourceRange.levelCount, - necessary_mip_count, image_mip_count, validation_error_map[errorCodes.mip_count_err]); + necessary_mip_count, image_mip_count); } } } // Validate array layers if (subresourceRange.baseArrayLayer >= image_layer_count) { - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, image_handle, __LINE__, - errorCodes.base_layer_err, "IMAGE", - "%s: %s.baseArrayLayer (= %" PRIu32 - ") is greater or equal to the %s of the image when it was created (i.e. greater or equal to %" PRIu32 "). %s", - cmd_name, param_name, subresourceRange.baseArrayLayer, image_layer_count_var_name, image_layer_count, - validation_error_map[errorCodes.base_layer_err]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, image_handle, + errorCodes.base_layer_err, + "%s: %s.baseArrayLayer (= %" PRIu32 + ") is greater or equal to the %s of the image when it was created (i.e. greater or equal to %" PRIu32 ").", + cmd_name, param_name, subresourceRange.baseArrayLayer, image_layer_count_var_name, image_layer_count); } if (subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS) { if (subresourceRange.layerCount == 0) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, image_handle, - __LINE__, errorCodes.layer_count_err, "IMAGE", "%s: %s.layerCount is 0. %s", cmd_name, param_name, - validation_error_map[errorCodes.layer_count_err]); + errorCodes.layer_count_err, "%s: %s.layerCount is 0.", cmd_name, param_name); } else { const uint64_t necessary_layer_count = uint64_t{subresourceRange.baseArrayLayer} + uint64_t{subresourceRange.layerCount}; if (necessary_layer_count > image_layer_count) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, image_handle, - __LINE__, errorCodes.layer_count_err, "IMAGE", + errorCodes.layer_count_err, "%s: %s.baseArrayLayer + .layerCount (= %" PRIu32 " + %" PRIu32 " = %" PRIu64 - ") is greater than the %s of the image when it was created (i.e. greater than %" PRIu32 "). %s", + ") is greater than the %s of the image when it was created (i.e. greater than %" PRIu32 ").", cmd_name, param_name, subresourceRange.baseArrayLayer, subresourceRange.layerCount, - necessary_layer_count, image_layer_count_var_name, image_layer_count, - validation_error_map[errorCodes.layer_count_err]); + necessary_layer_count, image_layer_count_var_name, image_layer_count); } } } @@ -3339,6 +3356,21 @@ VkImageType image_type = image_state->createInfo.imageType; VkImageViewType view_type = create_info->viewType; + // If there's a chained VkImageViewUsageCreateInfo struct, modify image_usage to match + auto chained_ivuci_struct = lvl_find_in_chain(create_info->pNext); + if (chained_ivuci_struct) { + if (chained_ivuci_struct->usage & ~image_usage) { + std::stringstream ss; + ss << "vkCreateImageView(): Chained VkImageViewUsageCreateInfo usage field (0x" << std::hex + << chained_ivuci_struct->usage << ") must not include flags not present in underlying image's usage (0x" + << image_usage << ")."; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_3f200c66, "%s", ss.str().c_str()); + } + + image_usage = chained_ivuci_struct->usage; + } + // Validate VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT state if (image_flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) { if ((!GetDeviceExtensions(device_data)->vk_khr_maintenance2 || @@ -3352,8 +3384,7 @@ << ". Images created with the VK_IMAGE_CREATE_MUTABLE_FORMAT BIT " << "can support ImageViews with differing formats but they must be in the same compatibility class."; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_0ac007f4, "IMAGE", "%s %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_0ac007f4]); + VALIDATION_ERROR_0ac007f4, "%s", ss.str().c_str()); } } } else { @@ -3363,9 +3394,8 @@ ss << "vkCreateImageView() format " << string_VkFormat(view_format) << " differs from image " << HandleToUint64(create_info->image) << " format " << string_VkFormat(image_format) << ". Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation."; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0ac007f6, "IMAGE", "%s %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_0ac007f6]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0ac007f6, "%s", ss.str().c_str()); } } @@ -3376,10 +3406,9 @@ case VK_IMAGE_TYPE_1D: if (view_type != VK_IMAGE_VIEW_TYPE_1D && view_type != VK_IMAGE_VIEW_TYPE_1D_ARRAY) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_0ac007fa, "IMAGE", - "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s. %s", - string_VkImageViewType(view_type), string_VkImageType(image_type), - validation_error_map[VALIDATION_ERROR_0ac007fa]); + VALIDATION_ERROR_0ac007fa, + "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s.", + string_VkImageViewType(view_type), string_VkImageType(image_type)); } break; case VK_IMAGE_TYPE_2D: @@ -3387,16 +3416,14 @@ if ((view_type == VK_IMAGE_VIEW_TYPE_CUBE || view_type == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) && !(image_flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_0ac007d6, "IMAGE", - "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s. %s", - string_VkImageViewType(view_type), string_VkImageType(image_type), - validation_error_map[VALIDATION_ERROR_0ac007d6]); + VALIDATION_ERROR_0ac007d6, + "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s.", + string_VkImageViewType(view_type), string_VkImageType(image_type)); } else if (view_type != VK_IMAGE_VIEW_TYPE_CUBE && view_type != VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_0ac007fa, "IMAGE", - "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s. %s", - string_VkImageViewType(view_type), string_VkImageType(image_type), - validation_error_map[VALIDATION_ERROR_0ac007fa]); + VALIDATION_ERROR_0ac007fa, + "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s.", + string_VkImageViewType(view_type), string_VkImageType(image_type)); } } break; @@ -3405,39 +3432,34 @@ if (view_type != VK_IMAGE_VIEW_TYPE_3D) { if ((view_type == VK_IMAGE_VIEW_TYPE_2D || view_type == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) { if (!(image_flags & VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR)) { - skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_0ac007da, "IMAGE", - "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s. %s", - string_VkImageViewType(view_type), string_VkImageType(image_type), - validation_error_map[VALIDATION_ERROR_0ac007da]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0ac007da, + "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s.", + string_VkImageViewType(view_type), string_VkImageType(image_type)); } else if ((image_flags & (VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT))) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_0ac007fa, "IMAGE", + VALIDATION_ERROR_0ac007fa, "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s " "when the VK_IMAGE_CREATE_SPARSE_BINDING_BIT, VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or " - "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT flags are enabled. %s", - string_VkImageViewType(view_type), string_VkImageType(image_type), - validation_error_map[VALIDATION_ERROR_0ac007fa]); + "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT flags are enabled.", + string_VkImageViewType(view_type), string_VkImageType(image_type)); } } else { - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_0ac007fa, "IMAGE", - "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s. %s", - string_VkImageViewType(view_type), string_VkImageType(image_type), - validation_error_map[VALIDATION_ERROR_0ac007fa]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0ac007fa, + "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s.", + string_VkImageViewType(view_type), string_VkImageType(image_type)); } } } else { if (view_type != VK_IMAGE_VIEW_TYPE_3D) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_0ac007fa, "IMAGE", - "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s. %s", - string_VkImageViewType(view_type), string_VkImageType(image_type), - validation_error_map[VALIDATION_ERROR_0ac007fa]); + VALIDATION_ERROR_0ac007fa, + "vkCreateImageView(): pCreateInfo->viewType %s is not compatible with image type %s.", + string_VkImageViewType(view_type), string_VkImageType(image_type)); } } break; @@ -3470,40 +3492,35 @@ if (check_tiling_features) { if (tiling_features == 0) { skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - error_codes[0], "IMAGE", - "vkCreateImageView() pCreateInfo->format %s cannot be used with an image having the %s flag set. %s", - string_VkFormat(view_format), string_VkImageTiling(image_tiling), validation_error_map[error_codes[0]]); + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, error_codes[0], + "vkCreateImageView() pCreateInfo->format %s cannot be used with an image having the %s flag set.", + 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 |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - error_codes[1], "IMAGE", + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, error_codes[1], "vkCreateImageView() pCreateInfo->format %s cannot be used with an image having the %s and " - "VK_IMAGE_USAGE_SAMPLED_BIT flags set. %s", - string_VkFormat(view_format), string_VkImageTiling(image_tiling), validation_error_map[error_codes[1]]); + "VK_IMAGE_USAGE_SAMPLED_BIT flags set.", + 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 |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - error_codes[2], "IMAGE", + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, error_codes[2], "vkCreateImageView() pCreateInfo->format %s cannot be used with an image having the %s and " - "VK_IMAGE_USAGE_STORAGE_BIT flags set. %s", - string_VkFormat(view_format), string_VkImageTiling(image_tiling), validation_error_map[error_codes[2]]); + "VK_IMAGE_USAGE_STORAGE_BIT flags set.", + 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 |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - error_codes[3], "IMAGE", + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, error_codes[3], "vkCreateImageView() pCreateInfo->format %s cannot be used with an image having the %s and " - "VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT flags set. %s", - string_VkFormat(view_format), string_VkImageTiling(image_tiling), validation_error_map[error_codes[3]]); + "VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT flags set.", + 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 |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - error_codes[4], "IMAGE", + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, error_codes[4], "vkCreateImageView() pCreateInfo->format %s cannot be used with an image having the %s and " - "VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT flags set. %s", - string_VkFormat(view_format), string_VkImageTiling(image_tiling), validation_error_map[error_codes[4]]); + "VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT flags set.", + string_VkFormat(view_format), string_VkImageTiling(image_tiling)); } } } @@ -3560,14 +3577,13 @@ auto buffer_state = GetBufferState(device_data, buffer); if (!buffer_state) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, HandleToUint64(buffer), - __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", "Cannot free buffer 0x%" PRIx64 " that has not been allocated.", + DRAWSTATE_DOUBLE_DESTROY, "Cannot free buffer 0x%" PRIx64 " that has not been allocated.", HandleToUint64(buffer)); } else { if (buffer_state->in_use.load()) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, - HandleToUint64(buffer), __LINE__, VALIDATION_ERROR_23c00734, "DS", - "Cannot free buffer 0x%" PRIx64 " that is in use by a command buffer. %s", HandleToUint64(buffer), - validation_error_map[VALIDATION_ERROR_23c00734]); + HandleToUint64(buffer), VALIDATION_ERROR_23c00734, + "Cannot free buffer 0x%" PRIx64 " that is in use by a command buffer.", HandleToUint64(buffer)); } } return skip; @@ -3667,33 +3683,30 @@ if (image_state->createInfo.imageType == VK_IMAGE_TYPE_1D) { if ((pRegions[i].imageOffset.y != 0) || (pRegions[i].imageExtent.height != 1)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_0160018e, "IMAGE", + HandleToUint64(image_state->image), VALIDATION_ERROR_0160018e, "%s(): pRegion[%d] imageOffset.y is %d and imageExtent.height is %d. For 1D images these must be 0 " - "and 1, respectively. %s", - function, i, pRegions[i].imageOffset.y, pRegions[i].imageExtent.height, - validation_error_map[VALIDATION_ERROR_0160018e]); + "and 1, respectively.", + function, i, pRegions[i].imageOffset.y, pRegions[i].imageExtent.height); } } if ((image_state->createInfo.imageType == VK_IMAGE_TYPE_1D) || (image_state->createInfo.imageType == VK_IMAGE_TYPE_2D)) { if ((pRegions[i].imageOffset.z != 0) || (pRegions[i].imageExtent.depth != 1)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_01600192, "IMAGE", + HandleToUint64(image_state->image), VALIDATION_ERROR_01600192, "%s(): pRegion[%d] imageOffset.z is %d and imageExtent.depth is %d. For 1D and 2D images these " - "must be 0 and 1, respectively. %s", - function, i, pRegions[i].imageOffset.z, pRegions[i].imageExtent.depth, - validation_error_map[VALIDATION_ERROR_01600192]); + "must be 0 and 1, respectively.", + function, i, pRegions[i].imageOffset.z, pRegions[i].imageExtent.depth); } } if (image_state->createInfo.imageType == VK_IMAGE_TYPE_3D) { if ((0 != pRegions[i].imageSubresource.baseArrayLayer) || (1 != pRegions[i].imageSubresource.layerCount)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_016001aa, "IMAGE", + HandleToUint64(image_state->image), VALIDATION_ERROR_016001aa, "%s(): pRegion[%d] imageSubresource.baseArrayLayer is %d and imageSubresource.layerCount is %d. " - "For 3D images these must be 0 and 1, respectively. %s", - function, i, pRegions[i].imageSubresource.baseArrayLayer, pRegions[i].imageSubresource.layerCount, - validation_error_map[VALIDATION_ERROR_016001aa]); + "For 3D images these must be 0 and 1, respectively.", + function, i, pRegions[i].imageSubresource.baseArrayLayer, pRegions[i].imageSubresource.layerCount); } } @@ -3702,38 +3715,36 @@ auto texel_size = FormatSize(image_state->createInfo.format); if (!FormatIsDepthAndStencil(image_state->createInfo.format) && SafeModulo(pRegions[i].bufferOffset, texel_size) != 0) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_01600182, "IMAGE", + HandleToUint64(image_state->image), VALIDATION_ERROR_01600182, "%s(): pRegion[%d] bufferOffset 0x%" PRIxLEAST64 - " must be a multiple of this format's texel size (" PRINTF_SIZE_T_SPECIFIER "). %s", - function, i, pRegions[i].bufferOffset, texel_size, validation_error_map[VALIDATION_ERROR_01600182]); + " must be a multiple of this format's texel size (" PRINTF_SIZE_T_SPECIFIER ").", + function, i, pRegions[i].bufferOffset, texel_size); } // BufferOffset must be a multiple of 4 if (SafeModulo(pRegions[i].bufferOffset, 4) != 0) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_01600184, "IMAGE", - "%s(): pRegion[%d] bufferOffset 0x%" PRIxLEAST64 " must be a multiple of 4. %s", function, i, - pRegions[i].bufferOffset, validation_error_map[VALIDATION_ERROR_01600184]); + HandleToUint64(image_state->image), VALIDATION_ERROR_01600184, + "%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 |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_01600186, "IMAGE", - "%s(): pRegion[%d] bufferRowLength (%d) must be zero or greater-than-or-equal-to imageExtent.width (%d). %s", - function, i, pRegions[i].bufferRowLength, pRegions[i].imageExtent.width, - validation_error_map[VALIDATION_ERROR_01600186]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + HandleToUint64(image_state->image), VALIDATION_ERROR_01600186, + "%s(): pRegion[%d] bufferRowLength (%d) must be zero or greater-than-or-equal-to imageExtent.width (%d).", + function, i, pRegions[i].bufferRowLength, pRegions[i].imageExtent.width); } // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent if ((pRegions[i].bufferImageHeight != 0) && (pRegions[i].bufferImageHeight < pRegions[i].imageExtent.height)) { skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_01600188, "IMAGE", - "%s(): pRegion[%d] bufferImageHeight (%d) must be zero or greater-than-or-equal-to imageExtent.height (%d). %s", - function, i, pRegions[i].bufferImageHeight, pRegions[i].imageExtent.height, - validation_error_map[VALIDATION_ERROR_01600188]); + HandleToUint64(image_state->image), VALIDATION_ERROR_01600188, + "%s(): pRegion[%d] bufferImageHeight (%d) must be zero or greater-than-or-equal-to imageExtent.height (%d).", + function, i, pRegions[i].bufferImageHeight, pRegions[i].imageExtent.height); } // subresource aspectMask must have exactly 1 bit set @@ -3741,19 +3752,17 @@ std::bitset aspect_mask_bits(pRegions[i].imageSubresource.aspectMask); if (aspect_mask_bits.count() != 1) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_016001a8, "IMAGE", - "%s: aspectMasks for imageSubresource in each region must have only a single bit set. %s", function, - validation_error_map[VALIDATION_ERROR_016001a8]); + HandleToUint64(image_state->image), VALIDATION_ERROR_016001a8, + "%s: aspectMasks for imageSubresource in each region must have only a single bit set.", function); } // image subresource aspect bit must match format if (!VerifyAspectsPresent(pRegions[i].imageSubresource.aspectMask, image_state->createInfo.format)) { skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_016001a6, "IMAGE", - "%s(): pRegion[%d] subresource aspectMask 0x%x specifies aspects that are not present in image format 0x%x. %s", - function, i, pRegions[i].imageSubresource.aspectMask, image_state->createInfo.format, - validation_error_map[VALIDATION_ERROR_016001a6]); + HandleToUint64(image_state->image), VALIDATION_ERROR_016001a6, + "%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); } // Checks that apply only to compressed images @@ -3767,41 +3776,40 @@ if (SafeModulo(pRegions[i].bufferRowLength, block_size.width) != 0) { skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_01600196, "IMAGE", - "%s(): pRegion[%d] bufferRowLength (%d) must be a multiple of the compressed image's texel width (%d). %s.", - function, i, pRegions[i].bufferRowLength, block_size.width, validation_error_map[VALIDATION_ERROR_01600196]); + HandleToUint64(image_state->image), VALIDATION_ERROR_01600196, + "%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) { skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_01600198, "IMAGE", - "%s(): pRegion[%d] bufferImageHeight (%d) must be a multiple of the compressed image's texel height (%d). %s.", - function, i, pRegions[i].bufferImageHeight, block_size.height, validation_error_map[VALIDATION_ERROR_01600198]); + HandleToUint64(image_state->image), VALIDATION_ERROR_01600198, + "%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); } // image offsets must be multiples of block dimensions 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 |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_0160019a, "IMAGE", - "%s(): pRegion[%d] imageOffset(x,y) (%d, %d) must be multiples of the compressed image's texel " - "width & height (%d, %d). %s.", - function, i, pRegions[i].imageOffset.x, pRegions[i].imageOffset.y, block_size.width, - block_size.height, validation_error_map[VALIDATION_ERROR_0160019a]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + HandleToUint64(image_state->image), VALIDATION_ERROR_0160019a, + "%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, block_size.height); } // bufferOffset must be a multiple of block size (linear bytes) size_t block_size_in_bytes = FormatSize(image_state->createInfo.format); if (SafeModulo(pRegions[i].bufferOffset, block_size_in_bytes) != 0) { - skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_0160019c, "IMAGE", - "%s(): pRegion[%d] bufferOffset (0x%" PRIxLEAST64 - ") must be a multiple of the compressed image's texel block size (" PRINTF_SIZE_T_SPECIFIER "). %s.", - function, i, pRegions[i].bufferOffset, block_size_in_bytes, validation_error_map[VALIDATION_ERROR_0160019c]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + HandleToUint64(image_state->image), VALIDATION_ERROR_0160019c, + "%s(): pRegion[%d] bufferOffset (0x%" PRIxLEAST64 + ") must be a multiple of the compressed image's texel block size (" PRINTF_SIZE_T_SPECIFIER ")..", + function, i, pRegions[i].bufferOffset, block_size_in_bytes); } // imageExtent width must be a multiple of block width, or extent+offset width must equal subresource width @@ -3809,33 +3817,33 @@ if ((SafeModulo(pRegions[i].imageExtent.width, block_size.width) != 0) && (pRegions[i].imageExtent.width + pRegions[i].imageOffset.x != mip_extent.width)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_0160019e, "IMAGE", + HandleToUint64(image_state->image), VALIDATION_ERROR_0160019e, "%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). %s.", + "(%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, - mip_extent.width, validation_error_map[VALIDATION_ERROR_0160019e]); + mip_extent.width); } // 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 |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_016001a0, "IMAGE", + HandleToUint64(image_state->image), VALIDATION_ERROR_016001a0, "%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). %s.", + "(%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, - mip_extent.height, validation_error_map[VALIDATION_ERROR_016001a0]); + mip_extent.height); } // 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 |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, VALIDATION_ERROR_016001a2, "IMAGE", + HandleToUint64(image_state->image), VALIDATION_ERROR_016001a2, "%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). %s.", + "(%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, - mip_extent.depth, validation_error_map[VALIDATION_ERROR_016001a2]); + mip_extent.depth); } } } @@ -3855,9 +3863,8 @@ if (IsExtentSizeZero(&extent)) // Warn on zero area subresource { skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - (uint64_t)0, __LINE__, IMAGE_ZERO_AREA_SUBREGION, "IMAGE", - "%s: pRegion[%d] imageExtent of {%1d, %1d, %1d} has zero area", func_name, i, extent.width, - extent.height, extent.depth); + (uint64_t)0, IMAGE_ZERO_AREA_SUBREGION, "%s: pRegion[%d] imageExtent of {%1d, %1d, %1d} has zero area", + func_name, i, extent.width, extent.height, extent.depth); } VkExtent3D image_extent = GetImageSubresourceExtent(image_state, &(pRegions[i].imageSubresource)); @@ -3878,8 +3885,7 @@ if (0 != ExceedsBounds(&offset, &extent, &image_extent)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, (uint64_t)0, - __LINE__, msg_code, "IMAGE", "%s: pRegion[%d] exceeds image bounds. %s.", func_name, i, - validation_error_map[msg_code]); + msg_code, "%s: pRegion[%d] exceeds image bounds..", func_name, i); } } @@ -3945,8 +3951,7 @@ if (buffer_size < max_buffer_offset) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, (uint64_t)0, - __LINE__, msg_code, "IMAGE", "%s: pRegion[%d] exceeds buffer size of %" PRIu64 " bytes. %s.", func_name, - i, buffer_size, validation_error_map[msg_code]); + msg_code, "%s: pRegion[%d] exceeds buffer size of %" PRIu64 " bytes..", func_name, i, buffer_size); } } } @@ -3969,12 +3974,11 @@ VkQueueFlags queue_flags = GetPhysDevProperties(device_data)->queue_family_properties[pPool->queueFamilyIndex].queueFlags; if (0 == (queue_flags & (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT))) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->createInfo.commandPool), __LINE__, VALIDATION_ERROR_19202415, "DS", + HandleToUint64(cb_node->createInfo.commandPool), VALIDATION_ERROR_19202415, "Cannot call vkCmdCopyImageToBuffer() on a command buffer allocated from a pool without graphics, compute, " - "or transfer capabilities. %s.", - validation_error_map[VALIDATION_ERROR_19202415]); + "or transfer capabilities.."); } - skip |= ValidateImageBounds(report_data, src_image_state, regionCount, pRegions, "vkCmdCopyBufferToImage()", + skip |= ValidateImageBounds(report_data, src_image_state, regionCount, pRegions, "vkCmdCopyImageToBuffer()", VALIDATION_ERROR_1920016c); skip |= ValidateBufferBounds(report_data, src_image_state, dst_buffer_state, regionCount, pRegions, "vkCmdCopyImageToBuffer()", VALIDATION_ERROR_1920016e); @@ -4037,10 +4041,9 @@ VkQueueFlags queue_flags = GetPhysDevProperties(device_data)->queue_family_properties[pPool->queueFamilyIndex].queueFlags; if (0 == (queue_flags & (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT))) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->createInfo.commandPool), __LINE__, VALIDATION_ERROR_18e02415, "DS", + HandleToUint64(cb_node->createInfo.commandPool), VALIDATION_ERROR_18e02415, "Cannot call vkCmdCopyBufferToImage() on a command buffer allocated from a pool without graphics, compute, " - "or transfer capabilities. %s.", - validation_error_map[VALIDATION_ERROR_18e02415]); + "or transfer capabilities.."); } skip |= ValidateImageBounds(report_data, dst_image_state, regionCount, pRegions, "vkCmdCopyBufferToImage()", VALIDATION_ERROR_18e00158); @@ -4094,9 +4097,8 @@ std::bitset aspect_mask_bits(sub_aspect); if (aspect_mask_bits.count() != 1) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(image), - __LINE__, VALIDATION_ERROR_2a6007ca, "IMAGE", - "vkGetImageSubresourceLayout(): VkImageSubresource.aspectMask must have exactly 1 bit set. %s", - validation_error_map[VALIDATION_ERROR_2a6007ca]); + VALIDATION_ERROR_2a6007ca, + "vkGetImageSubresourceLayout(): VkImageSubresource.aspectMask must have exactly 1 bit set."); } IMAGE_STATE *image_entry = GetImageState(device_data, image); @@ -4106,27 +4108,25 @@ // image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR if (image_entry->createInfo.tiling != VK_IMAGE_TILING_LINEAR) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(image), - __LINE__, VALIDATION_ERROR_2a6007c8, "IMAGE", - "vkGetImageSubresourceLayout(): Image must have tiling of VK_IMAGE_TILING_LINEAR. %s", - validation_error_map[VALIDATION_ERROR_2a6007c8]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(image), + VALIDATION_ERROR_2a6007c8, "vkGetImageSubresourceLayout(): Image must have tiling of VK_IMAGE_TILING_LINEAR."); } // mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created if (pSubresource->mipLevel >= image_entry->createInfo.mipLevels) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(image), - __LINE__, VALIDATION_ERROR_2a600d68, "IMAGE", - "vkGetImageSubresourceLayout(): pSubresource.mipLevel (%d) must be less than %d. %s", - pSubresource->mipLevel, image_entry->createInfo.mipLevels, validation_error_map[VALIDATION_ERROR_2a600d68]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(image), + VALIDATION_ERROR_2a600d68, "vkGetImageSubresourceLayout(): pSubresource.mipLevel (%d) must be less than %d.", + pSubresource->mipLevel, image_entry->createInfo.mipLevels); } // arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created if (pSubresource->arrayLayer >= image_entry->createInfo.arrayLayers) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(image), - __LINE__, VALIDATION_ERROR_2a600d6a, "IMAGE", - "vkGetImageSubresourceLayout(): pSubresource.arrayLayer (%d) must be less than %d. %s", - pSubresource->arrayLayer, image_entry->createInfo.arrayLayers, validation_error_map[VALIDATION_ERROR_2a600d6a]); + VALIDATION_ERROR_2a600d6a, "vkGetImageSubresourceLayout(): pSubresource.arrayLayer (%d) must be less than %d.", + pSubresource->arrayLayer, image_entry->createInfo.arrayLayers); } // subresource's aspect must be compatible with image's format. @@ -4140,26 +4140,24 @@ } if (sub_aspect != (sub_aspect & allowed_flags)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, vuid, "IMAGE", + HandleToUint64(image), vuid, "vkGetImageSubresourceLayout(): For multi-planar images, VkImageSubresource.aspectMask (0x%" PRIx32 - ") must be a single-plane specifier flag. %s", - sub_aspect, validation_error_map[vuid]); + ") must be a single-plane specifier flag.", + sub_aspect); } } else if (FormatIsColor(img_format)) { if (sub_aspect != VK_IMAGE_ASPECT_COLOR_BIT) { skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(image), __LINE__, - VALIDATION_ERROR_0a400c01, "IMAGE", - "vkGetImageSubresourceLayout(): For color formats, VkImageSubresource.aspectMask must be VK_IMAGE_ASPECT_COLOR. %s", - validation_error_map[VALIDATION_ERROR_0a400c01]); + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, HandleToUint64(image), + VALIDATION_ERROR_0a400c01, + "vkGetImageSubresourceLayout(): For color formats, VkImageSubresource.aspectMask must be VK_IMAGE_ASPECT_COLOR."); } } else if (FormatIsDepthOrStencil(img_format)) { if ((sub_aspect != VK_IMAGE_ASPECT_DEPTH_BIT) && (sub_aspect != VK_IMAGE_ASPECT_STENCIL_BIT)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image), __LINE__, VALIDATION_ERROR_0a400c01, "IMAGE", + HandleToUint64(image), VALIDATION_ERROR_0a400c01, "vkGetImageSubresourceLayout(): For depth/stencil formats, VkImageSubresource.aspectMask must be " - "either VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT. %s", - validation_error_map[VALIDATION_ERROR_0a400c01]); + "either VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT."); } } return skip; diff -Nru vulkan-1.1.70+dfsg1/layers/buffer_validation.h vulkan-1.1.73+dfsg/layers/buffer_validation.h --- vulkan-1.1.70+dfsg1/layers/buffer_validation.h 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/buffer_validation.h 2018-04-27 11:24:19.000000000 +0000 @@ -85,8 +85,8 @@ bool FindLayout(const std::unordered_map &imageLayoutMap, ImageSubresourcePair imgpair, VkImageLayout &layout, const VkImageAspectFlags aspectMask); -bool FindLayout(const std::unordered_map &imageLayoutMap, ImageSubresourcePair imgpair, - VkImageLayout &layout); +bool FindLayout(layer_data *device_data, const std::unordered_map &imageLayoutMap, + ImageSubresourcePair imgpair, VkImageLayout &layout); void SetGlobalLayout(layer_data *device_data, ImageSubresourcePair imgpair, const VkImageLayout &layout); @@ -121,7 +121,7 @@ bool ValidateBarriersToImages(layer_data *device_data, GLOBAL_CB_NODE const *cb_state, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers, const char *func_name); -void TransitionImageLayouts(layer_data *device_data, VkCommandBuffer cmdBuffer, uint32_t memBarrierCount, +void TransitionImageLayouts(layer_data *device_data, GLOBAL_CB_NODE *cb_state, uint32_t memBarrierCount, const VkImageMemoryBarrier *pImgMemBarriers); bool VerifySourceImageLayout(layer_data *dev_data, GLOBAL_CB_NODE *cb_node, VkImage srcImage, VkImageSubresourceLayers subLayers, diff -Nru vulkan-1.1.70+dfsg1/layers/CMakeLists.txt vulkan-1.1.73+dfsg/layers/CMakeLists.txt --- vulkan-1.1.70+dfsg1/layers/CMakeLists.txt 2018-03-12 13:03:34.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/CMakeLists.txt 2018-05-04 08:50:24.000000000 +0000 @@ -21,6 +21,11 @@ add_definitions(-DVK_USE_PLATFORM_MIR_KHR -DVK_USE_PLATFORM_MIR_KHX) include_directories(${MIR_INCLUDE_DIR}) endif() +elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + add_definitions(-DVK_USE_PLATFORM_MACOS_MVK) + if(CMAKE_GENERATOR MATCHES "^Xcode.*") + add_custom_target(mk_layer_config_dir ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/$) + endif() else() message(FATAL_ERROR "Unsupported Platform!") endif() @@ -70,7 +75,7 @@ ) set_target_properties(vk_validation_error_messages PROPERTIES FOLDER ${LVL_TARGET_FOLDER}) endif() -else() +elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") # extra setup for out-of-tree builds if (NOT (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)) foreach (config_file ${LAYER_JSON_FILES}) @@ -85,6 +90,31 @@ VERBATIM ) endif() +elseif(APPLE) + # extra setup for out-of-tree builds + if (NOT (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)) + if (CMAKE_GENERATOR MATCHES "^Xcode.*") + foreach (config_file ${LAYER_JSON_FILES}) + add_custom_target(${config_file}-json ALL + DEPENDS mk_layer_config_dir + COMMAND ln -sf ${CMAKE_CURRENT_SOURCE_DIR}/macos/${config_file}.json $ + VERBATIM + ) + endforeach(config_file) + else() + foreach (config_file ${LAYER_JSON_FILES}) + add_custom_target(${config_file}-json ALL + COMMAND ln -sf ${CMAKE_CURRENT_SOURCE_DIR}/macos/${config_file}.json + VERBATIM + ) + endforeach(config_file) + endif() + # Add link to vk_validation_error_messages.h in build dir for scripts to pick up + add_custom_target(vk_validation_error_messages ALL + COMMAND ln -sf ${CMAKE_CURRENT_SOURCE_DIR}/vk_validation_error_messages.h + VERBATIM + ) + endif() endif() # If a layer has a direct dependency on a project with the same name, use it. if ((Win32) OR (NOT (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR))) @@ -127,6 +157,17 @@ target_link_Libraries(VkLayer_${target} VkLayer_utils) add_dependencies(VkLayer_${target} generate_helper_files VkLayer_utils) endmacro() +elseif(APPLE) + macro(add_vk_layer target) + add_library(VkLayer_${target} SHARED ${ARGN}) + target_link_Libraries(VkLayer_${target} VkLayer_utils) + add_dependencies(VkLayer_${target} generate_helper_files VkLayer_utils) + set_target_properties(VkLayer_${target} PROPERTIES + LINK_FLAGS "-Wl" + INSTALL_RPATH "@loader_path/" + ) + install(TARGETS VkLayer_${target} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + endmacro() else() macro(add_vk_layer target) add_library(VkLayer_${target} SHARED ${ARGN}) diff -Nru vulkan-1.1.70+dfsg1/layers/core_validation.cpp vulkan-1.1.73+dfsg/layers/core_validation.cpp --- vulkan-1.1.70+dfsg1/layers/core_validation.cpp 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/core_validation.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -51,7 +51,6 @@ #include #include #include -#include #include "vk_loader_platform.h" #include "vk_dispatch_table_helper.h" @@ -73,7 +72,7 @@ #if defined __ANDROID__ #include -#define LOGCONSOLE(...) ((void)__android_log_print(ANDROID_LOG_INFO, "DS", __VA_ARGS__)) +#define LOGCONSOLE(...) ((void)__android_log_print(ANDROID_LOG_INFO, "CORE_VALIDATION", __VA_ARGS__)) #else #define LOGCONSOLE(...) \ { \ @@ -89,6 +88,42 @@ using lock_guard_t = std::lock_guard; using unique_lock_t = std::unique_lock; +// These functions are defined *outside* the core_validation namespace as their type +// is also defined outside that namespace +size_t PipelineLayoutCompatDef::hash() const { + hash_util::HashCombiner hc; + // The set number is integral to the CompatDef's distinctiveness + hc << set << push_constant_ranges.get(); + const auto &descriptor_set_layouts = *set_layouts_id.get(); + for (uint32_t i = 0; i <= set; i++) { + hc << descriptor_set_layouts[i].get(); + } + return hc.Value(); +} + +bool PipelineLayoutCompatDef::operator==(const PipelineLayoutCompatDef &other) const { + if ((set != other.set) || (push_constant_ranges != other.push_constant_ranges)) { + return false; + } + + if (set_layouts_id == other.set_layouts_id) { + // if it's the same set_layouts_id, then *any* subset will match + return true; + } + + // They aren't exactly the same PipelineLayoutSetLayouts, so we need to check if the required subsets match + const auto &descriptor_set_layouts = *set_layouts_id.get(); + assert(set < descriptor_set_layouts.size()); + const auto &other_ds_layouts = *other.set_layouts_id.get(); + assert(set < other_ds_layouts.size()); + for (uint32_t i = 0; i <= set; i++) { + if (descriptor_set_layouts[i] != other_ds_layouts[i]) { + return false; + } + } + return true; +} + namespace core_validation { using std::max; @@ -172,6 +207,8 @@ // Device extension properties -- storing properties gathered from VkPhysicalDeviceProperties2KHR::pNext chain struct DeviceExtensionProperties { uint32_t max_push_descriptors; // from VkPhysicalDevicePushDescriptorPropertiesKHR::maxPushDescriptors + VkPhysicalDeviceDescriptorIndexingPropertiesEXT descriptor_indexing_props; + VkPhysicalDeviceDescriptorIndexingFeaturesEXT descriptor_indexing_features; }; DeviceExtensionProperties phys_dev_ext_props = {}; bool external_sync_warning = false; @@ -356,18 +393,20 @@ const VkMemoryAllocateInfo *pAllocateInfo) { assert(object != NULL); - dev_data->memObjMap[mem] = unique_ptr(new DEVICE_MEM_INFO(object, mem, pAllocateInfo)); + auto *mem_info = new DEVICE_MEM_INFO(object, mem, pAllocateInfo); + dev_data->memObjMap[mem] = unique_ptr(mem_info); - if (pAllocateInfo->pNext) { - auto struct_header = reinterpret_cast(pAllocateInfo->pNext); - while (struct_header) { - if (VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR == struct_header->sType || - VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR == struct_header->sType) { - dev_data->memObjMap[mem]->global_valid = true; - break; - } - struct_header = reinterpret_cast(struct_header->pNext); - } + // TODO: If the number of things we search for goes much higher, need a map... + mem_info->global_valid = nullptr != lvl_find_in_chain(pAllocateInfo->pNext); +#ifdef VK_USE_PLATFORM_WIN32_KHR + mem_info->global_valid |= nullptr != lvl_find_in_chain(pAllocateInfo->pNext); +#endif + + auto dedicated = lvl_find_in_chain(pAllocateInfo->pNext); + if (dedicated) { + mem_info->is_dedicated = true; + mem_info->dedicated_buffer = dedicated->buffer; + mem_info->dedicated_image = dedicated->image; } } @@ -378,7 +417,7 @@ if (mem_info) { if (!mem_info->bound_ranges[bound_object_handle].valid) { return log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem), __LINE__, MEMTRACK_INVALID_MEM_REGION, "MEM", + HandleToUint64(mem), MEMTRACK_INVALID_MEM_REGION, "%s: Cannot read invalid region of memory allocation 0x%" PRIx64 " for bound %s object 0x%" PRIx64 ", please fill the memory before using.", functionName, HandleToUint64(mem), object_string[type], bound_object_handle); @@ -393,7 +432,7 @@ if (image_state->binding.mem == MEMTRACKER_SWAP_CHAIN_IMAGE_KEY) { if (!image_state->valid) { return log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(image_state->binding.mem), __LINE__, MEMTRACK_INVALID_MEM_REGION, "MEM", + HandleToUint64(image_state->binding.mem), MEMTRACK_INVALID_MEM_REGION, "%s: Cannot read invalid swapchain image 0x%" PRIx64 ", please fill the memory before using.", functionName, HandleToUint64(image_state->image)); } @@ -543,18 +582,17 @@ const char *type_name, UNIQUE_VALIDATION_ERROR_CODE error_code) { bool result = false; if (VK_NULL_HANDLE == mem) { - result = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, handle, - __LINE__, error_code, "MEM", - "%s: Vk%s object 0x%" PRIx64 - " used with no memory bound. Memory should be bound by calling vkBind%sMemory(). %s", - api_name, type_name, handle, type_name, validation_error_map[error_code]); + result = + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, handle, error_code, + "%s: Vk%s object 0x%" PRIx64 " used with no memory bound. Memory should be bound by calling vkBind%sMemory().", + api_name, type_name, handle, type_name); } else if (MEMORY_UNBOUND == mem) { - result = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, handle, - __LINE__, error_code, "MEM", - "%s: Vk%s object 0x%" PRIx64 - " used with no memory bound and previously bound memory was freed. Memory must not be freed prior to this " - "operation. %s", - api_name, type_name, handle, validation_error_map[error_code]); + result = + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, handle, error_code, + "%s: Vk%s object 0x%" PRIx64 + " used with no memory bound and previously bound memory was freed. Memory must not be freed prior to this " + "operation.", + api_name, type_name, handle); } return result; } @@ -634,10 +672,10 @@ assert(type == kVulkanObjectTypeImage); } skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem), __LINE__, error_code, "MEM", + HandleToUint64(mem), error_code, "In %s, attempting to bind memory (0x%" PRIx64 ") to object (0x%" PRIx64 - ") which was created with sparse memory flags (VK_%s_CREATE_SPARSE_*_BIT). %s", - apiName, HandleToUint64(mem), handle, handle_type, validation_error_map[error_code]); + ") which was created with sparse memory flags (VK_%s_CREATE_SPARSE_*_BIT).", + apiName, HandleToUint64(mem), handle, handle_type); } DEVICE_MEM_INFO *mem_info = GetMemObjInfo(dev_data, mem); if (mem_info) { @@ -650,14 +688,13 @@ assert(type == kVulkanObjectTypeImage); } skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem), __LINE__, error_code, "MEM", + HandleToUint64(mem), error_code, "In %s, attempting to bind memory (0x%" PRIx64 ") to object (0x%" PRIx64 - ") which has already been bound to mem object 0x%" PRIx64 ". %s", - apiName, HandleToUint64(mem), handle, HandleToUint64(prev_binding->mem), - validation_error_map[error_code]); + ") which has already been bound to mem object 0x%" PRIx64 ".", + apiName, HandleToUint64(mem), handle, HandleToUint64(prev_binding->mem)); } else if (mem_binding->binding.mem == MEMORY_UNBOUND) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem), __LINE__, MEMTRACK_REBIND_OBJECT, "MEM", + HandleToUint64(mem), MEMTRACK_REBIND_OBJECT, "In %s, attempting to bind memory (0x%" PRIx64 ") to object (0x%" PRIx64 ") which was previous bound to memory that has since been freed. Memory bindings are immutable in " "Vulkan so this attempt to bind to new memory is not allowed.", @@ -698,10 +735,9 @@ static bool validate_status(layer_data *dev_data, GLOBAL_CB_NODE *pNode, CBStatusFlags status_mask, VkFlags msg_flags, const char *fail_msg, UNIQUE_VALIDATION_ERROR_CODE const msg_code) { if (!(pNode->status & status_mask)) { - char const *const message = validation_error_map[msg_code]; return log_msg(dev_data->report_data, msg_flags, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pNode->commandBuffer), __LINE__, msg_code, "DS", - "command buffer object 0x%" PRIx64 ": %s. %s.", HandleToUint64(pNode->commandBuffer), fail_msg, message); + HandleToUint64(pNode->commandBuffer), msg_code, "command buffer object 0x%" PRIx64 ": %s..", + HandleToUint64(pNode->commandBuffer), fail_msg); } return false; } @@ -778,9 +814,8 @@ static bool validate_draw_state_flags(layer_data *dev_data, GLOBAL_CB_NODE *pCB, const PIPELINE_STATE *pPipe, bool indexed, UNIQUE_VALIDATION_ERROR_CODE const msg_code) { bool result = false; - if (pPipe->graphicsPipelineCI.pInputAssemblyState && - ((pPipe->graphicsPipelineCI.pInputAssemblyState->topology == VK_PRIMITIVE_TOPOLOGY_LINE_LIST) || - (pPipe->graphicsPipelineCI.pInputAssemblyState->topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP))) { + if (pPipe->topology_at_rasterizer == VK_PRIMITIVE_TOPOLOGY_LINE_LIST || + pPipe->topology_at_rasterizer == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP) { result |= validate_status(dev_data, pCB, CBSTATUS_LINE_WIDTH_SET, VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer", msg_code); } @@ -820,11 +855,11 @@ uint32_t secondary_attach, const char *msg, const char *caller, UNIQUE_VALIDATION_ERROR_CODE error_code) { return log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - HandleToUint64(rp1_state->renderPass), __LINE__, error_code, "DS", + HandleToUint64(rp1_state->renderPass), error_code, "%s: RenderPasses incompatible between %s w/ renderPass 0x%" PRIx64 " and %s w/ renderPass 0x%" PRIx64 - " Attachment %u is not compatible with %u: %s. %s", + " Attachment %u is not compatible with %u: %s.", caller, type1_string, HandleToUint64(rp1_state->renderPass), type2_string, HandleToUint64(rp2_state->renderPass), - primary_attach, secondary_attach, msg, validation_error_map[error_code]); + primary_attach, secondary_attach, msg); } static bool validateAttachmentCompatibility(layer_data const *dev_data, const char *type1_string, @@ -930,13 +965,12 @@ bool skip = false; if (rp1_state->createInfo.subpassCount != rp2_state->createInfo.subpassCount) { - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - HandleToUint64(rp1_state->renderPass), __LINE__, error_code, "DS", - "%s: RenderPasses incompatible between %s w/ renderPass 0x%" PRIx64 - " with a subpassCount of %u and %s w/ renderPass 0x%" PRIx64 " with a subpassCount of %u. %s", - caller, type1_string, HandleToUint64(rp1_state->renderPass), rp1_state->createInfo.subpassCount, type2_string, - HandleToUint64(rp2_state->renderPass), rp2_state->createInfo.subpassCount, validation_error_map[error_code]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, + HandleToUint64(rp1_state->renderPass), error_code, + "%s: RenderPasses incompatible between %s w/ renderPass 0x%" PRIx64 + " with a subpassCount of %u and %s w/ renderPass 0x%" PRIx64 " with a subpassCount of %u.", + caller, type1_string, HandleToUint64(rp1_state->renderPass), rp1_state->createInfo.subpassCount, + type2_string, HandleToUint64(rp2_state->renderPass), rp2_state->createInfo.subpassCount); } else { for (uint32_t i = 0; i < rp1_state->createInfo.subpassCount; ++i) { skip |= validateSubpassCompatibility(dev_data, type1_string, rp1_state, type2_string, rp2_state, i, caller, error_code); @@ -988,7 +1022,7 @@ (pCB->currentDrawData.buffers[vertex_binding] == VK_NULL_HANDLE)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", + HandleToUint64(pCB->commandBuffer), DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "The Pipeline State Object (0x%" PRIx64 ") expects that this Command Buffer's vertex binding Index %u should be set via " "vkCmdBindVertexBuffers. This is because VkVertexInputBindingDescription struct at " @@ -999,8 +1033,8 @@ } else { if (!pCB->currentDrawData.buffers.empty() && !pCB->vertex_buffer_used) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(pCB->commandBuffer), __LINE__, - DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(pCB->commandBuffer), + DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "Vertex buffers are bound to command buffer (0x%" PRIx64 ") but no vertex buffers are attached to this Pipeline State Object (0x%" PRIx64 ").", HandleToUint64(pCB->commandBuffer), HandleToUint64(state.pipeline_state->pipeline)); @@ -1023,7 +1057,7 @@ list_bits(ss, missingViewportMask); ss << " are used by pipeline state object, but were not provided via calls to vkCmdSetViewport()."; skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_VIEWPORT_SCISSOR_MISMATCH, "DS", "%s", ss.str().c_str()); + DRAWSTATE_VIEWPORT_SCISSOR_MISMATCH, "%s", ss.str().c_str()); } } @@ -1036,7 +1070,7 @@ list_bits(ss, missingScissorMask); ss << " are used by pipeline state object, but were not provided via calls to vkCmdSetScissor()."; skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_VIEWPORT_SCISSOR_MISMATCH, "DS", "%s", ss.str().c_str()); + DRAWSTATE_VIEWPORT_SCISSOR_MISMATCH, "%s", ss.str().c_str()); } } } @@ -1067,7 +1101,7 @@ if (!dev_data->extensions.vk_amd_mixed_attachment_samples && ((subpass_num_samples & static_cast(pso_num_samples)) != subpass_num_samples)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, DRAWSTATE_NUM_SAMPLES_MISMATCH, "DS", + HandleToUint64(pPipeline->pipeline), DRAWSTATE_NUM_SAMPLES_MISMATCH, "Num samples mismatch! At draw-time in Pipeline (0x%" PRIx64 ") with %u samples while current RenderPass (0x%" PRIx64 ") w/ %u samples!", HandleToUint64(pPipeline->pipeline), pso_num_samples, @@ -1075,7 +1109,7 @@ } } else { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, DRAWSTATE_NUM_SAMPLES_MISMATCH, "DS", + HandleToUint64(pPipeline->pipeline), DRAWSTATE_NUM_SAMPLES_MISMATCH, "No active render pass found at draw-time in Pipeline (0x%" PRIx64 ")!", HandleToUint64(pPipeline->pipeline)); } @@ -1118,10 +1152,10 @@ pPipeline->rp_state.get(), caller, rp_error); } if (pPipeline->graphicsPipelineCI.subpass != pCB->activeSubpass) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, sp_error, "DS", - "Pipeline was built for subpass %u but used in subpass %u. %s", pPipeline->graphicsPipelineCI.subpass, - pCB->activeSubpass, validation_error_map[sp_error]); + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, + HandleToUint64(pPipeline->pipeline), sp_error, "Pipeline was built for subpass %u but used in subpass %u.", + pPipeline->graphicsPipelineCI.subpass, pCB->activeSubpass); } } @@ -1157,7 +1191,7 @@ if (nullptr == pPipe) { result |= log_msg( dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_INVALID_PIPELINE, "DS", + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_INVALID_PIPELINE, "At Draw/Dispatch time no valid VkPipeline is bound! This is illegal. Please bind one with vkCmdBindPipeline()."); // Early return as any further checks below will be busted w/o a pipeline if (result) return true; @@ -1167,51 +1201,47 @@ result = validate_draw_state_flags(dev_data, cb_node, pPipe, indexed, msg_code); // Now complete other state checks - if (VK_NULL_HANDLE != state.pipeline_layout.layout) { - string errorString; - auto pipeline_layout = pPipe->pipeline_layout; + string errorString; + auto const &pipeline_layout = pPipe->pipeline_layout; - for (const auto &set_binding_pair : pPipe->active_slots) { - uint32_t setIndex = set_binding_pair.first; - // If valid set is not bound throw an error - if ((state.boundDescriptorSets.size() <= setIndex) || (!state.boundDescriptorSets[setIndex])) { - result |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_DESCRIPTOR_SET_NOT_BOUND, "DS", - "VkPipeline 0x%" PRIx64 " uses set #%u but that set is not bound.", HandleToUint64(pPipe->pipeline), setIndex); - } else if (!verify_set_layout_compatibility(state.boundDescriptorSets[setIndex], &pipeline_layout, setIndex, - errorString)) { - // Set is bound but not compatible w/ overlapping pipeline_layout from PSO - VkDescriptorSet setHandle = state.boundDescriptorSets[setIndex]->GetSet(); - result |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - HandleToUint64(setHandle), __LINE__, DRAWSTATE_PIPELINE_LAYOUTS_INCOMPATIBLE, "DS", - "VkDescriptorSet (0x%" PRIx64 - ") bound as set #%u is not compatible with overlapping VkPipelineLayout 0x%" PRIx64 " due to: %s", - HandleToUint64(setHandle), setIndex, HandleToUint64(pipeline_layout.layout), errorString.c_str()); - } else { // Valid set is bound and layout compatible, validate that it's updated - // Pull the set node - cvdescriptorset::DescriptorSet *descriptor_set = state.boundDescriptorSets[setIndex]; - // 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. - const cvdescriptorset::PrefilterBindRequestMap reduced_map(*descriptor_set, set_binding_pair.second, cb_node, - pPipe); - const auto &binding_req_map = reduced_map.Map(); - - if (!descriptor_set->ValidateDrawState(binding_req_map, state.dynamicOffsets[setIndex], cb_node, function, - &err_str)) { - auto set = descriptor_set->GetSet(); - result |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, HandleToUint64(set), __LINE__, - DRAWSTATE_DESCRIPTOR_SET_NOT_UPDATED, "DS", - "Descriptor set 0x%" PRIx64 " encountered the following validation error at %s time: %s", - HandleToUint64(set), function, err_str.c_str()); - } + for (const auto &set_binding_pair : pPipe->active_slots) { + uint32_t setIndex = set_binding_pair.first; + // If valid set is not bound throw an error + if ((state.boundDescriptorSets.size() <= setIndex) || (!state.boundDescriptorSets[setIndex])) { + result |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_DESCRIPTOR_SET_NOT_BOUND, + "VkPipeline 0x%" PRIx64 " uses set #%u but that set is not bound.", HandleToUint64(pPipe->pipeline), + setIndex); + } else if (!verify_set_layout_compatibility(state.boundDescriptorSets[setIndex], &pipeline_layout, setIndex, errorString)) { + // Set is bound but not compatible w/ overlapping pipeline_layout from PSO + VkDescriptorSet setHandle = state.boundDescriptorSets[setIndex]->GetSet(); + result |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + HandleToUint64(setHandle), DRAWSTATE_PIPELINE_LAYOUTS_INCOMPATIBLE, + "VkDescriptorSet (0x%" PRIx64 + ") bound as set #%u is not compatible with overlapping VkPipelineLayout 0x%" PRIx64 " due to: %s", + HandleToUint64(setHandle), setIndex, HandleToUint64(pipeline_layout.layout), errorString.c_str()); + } else { // Valid set is bound and layout compatible, validate that it's updated + // Pull the set node + cvdescriptorset::DescriptorSet *descriptor_set = state.boundDescriptorSets[setIndex]; + // 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. + const cvdescriptorset::PrefilterBindRequestMap reduced_map(*descriptor_set, set_binding_pair.second, cb_node, + pPipe); + const auto &binding_req_map = reduced_map.Map(); + + if (!descriptor_set->ValidateDrawState(binding_req_map, state.dynamicOffsets[setIndex], cb_node, function, + &err_str)) { + auto set = descriptor_set->GetSet(); + result |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + HandleToUint64(set), DRAWSTATE_DESCRIPTOR_SET_NOT_UPDATED, + "Descriptor set 0x%" PRIx64 " bound as set #%u encountered the following validation error at %s time: %s", + HandleToUint64(set), setIndex, function, err_str.c_str()); } } } @@ -1227,7 +1257,7 @@ static void UpdateDrawState(layer_data *dev_data, GLOBAL_CB_NODE *cb_state, const VkPipelineBindPoint bind_point) { auto const &state = cb_state->lastBound[bind_point]; PIPELINE_STATE *pPipe = state.pipeline_state; - if (VK_NULL_HANDLE != state.pipeline_layout.layout) { + if (VK_NULL_HANDLE != state.pipeline_layout) { for (const auto &set_binding_pair : pPipe->active_slots) { uint32_t setIndex = set_binding_pair.first; // Pull the set node @@ -1264,15 +1294,13 @@ (pPipeline->graphicsPipelineCI.basePipelineIndex != -1))) { // This check is a superset of VALIDATION_ERROR_096005a8 and VALIDATION_ERROR_096005aa skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, DRAWSTATE_INVALID_PIPELINE_CREATE_STATE, "DS", + HandleToUint64(pPipeline->pipeline), DRAWSTATE_INVALID_PIPELINE_CREATE_STATE, "Invalid Pipeline CreateInfo: exactly one of base pipeline index and handle must be specified"); } else if (pPipeline->graphicsPipelineCI.basePipelineIndex != -1) { if (pPipeline->graphicsPipelineCI.basePipelineIndex >= pipelineIndex) { - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_208005a0, "DS", - "Invalid Pipeline CreateInfo: base pipeline must occur earlier in array than derivative pipeline. %s", - validation_error_map[VALIDATION_ERROR_208005a0]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_208005a0, + "Invalid Pipeline CreateInfo: base pipeline must occur earlier in array than derivative pipeline."); } else { pBasePipeline = pPipelines[pPipeline->graphicsPipelineCI.basePipelineIndex].get(); } @@ -1282,7 +1310,7 @@ if (pBasePipeline && !(pBasePipeline->graphicsPipelineCI.flags & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, DRAWSTATE_INVALID_PIPELINE_CREATE_STATE, "DS", + HandleToUint64(pPipeline->pipeline), DRAWSTATE_INVALID_PIPELINE_CREATE_STATE, "Invalid Pipeline CreateInfo: base pipeline does not allow derivatives."); } } @@ -1303,10 +1331,9 @@ auto subpass_desc = &pPipeline->rp_state->createInfo.pSubpasses[pPipeline->graphicsPipelineCI.subpass]; if (pPipeline->graphicsPipelineCI.subpass >= pPipeline->rp_state->createInfo.subpassCount) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_096005ee, "DS", - "Invalid Pipeline CreateInfo State: Subpass index %u is out of range for this renderpass (0..%u). %s", - pPipeline->graphicsPipelineCI.subpass, pPipeline->rp_state->createInfo.subpassCount - 1, - validation_error_map[VALIDATION_ERROR_096005ee]); + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_096005ee, + "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); subpass_desc = nullptr; } @@ -1315,12 +1342,11 @@ if (color_blend_state->attachmentCount != subpass_desc->colorAttachmentCount) { skip |= log_msg( dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_096005d4, "DS", + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_096005d4, "vkCreateGraphicsPipelines(): Render pass (0x%" PRIx64 - ") subpass %u has colorAttachmentCount of %u which doesn't match the pColorBlendState->attachmentCount of %u. %s", + ") subpass %u has colorAttachmentCount of %u which doesn't match the pColorBlendState->attachmentCount of %u.", HandleToUint64(pPipeline->rp_state->renderPass), pPipeline->graphicsPipelineCI.subpass, - subpass_desc->colorAttachmentCount, color_blend_state->attachmentCount, - validation_error_map[VALIDATION_ERROR_096005d4]); + subpass_desc->colorAttachmentCount, color_blend_state->attachmentCount); } if (!dev_data->enabled_features.independentBlend) { if (pPipeline->attachments.size() > 1) { @@ -1333,10 +1359,9 @@ sizeof(pAttachments[0]))) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_0f4004ba, "DS", + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_0f4004ba, "Invalid Pipeline CreateInfo: If independent blend feature not enabled, all elements of " - "pAttachments must be identical. %s", - validation_error_map[VALIDATION_ERROR_0f4004ba]); + "pAttachments must be identical."); break; } } @@ -1345,9 +1370,8 @@ if (!dev_data->enabled_features.logicOp && (pPipeline->graphicsPipelineCI.pColorBlendState->logicOpEnable != VK_FALSE)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_0f4004bc, "DS", - "Invalid Pipeline CreateInfo: If logic operations feature not enabled, logicOpEnable must be VK_FALSE. %s", - validation_error_map[VALIDATION_ERROR_0f4004bc]); + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_0f4004bc, + "Invalid Pipeline CreateInfo: If logic operations feature not enabled, logicOpEnable must be VK_FALSE."); } } @@ -1359,7 +1383,7 @@ for (uint32_t stage = VK_SHADER_STAGE_VERTEX_BIT; stage & VK_SHADER_STAGE_ALL_GRAPHICS; stage <<= 1) { if (pPipeline->duplicate_shaders & stage) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, DRAWSTATE_INVALID_PIPELINE_CREATE_STATE, "DS", + HandleToUint64(pPipeline->pipeline), DRAWSTATE_INVALID_PIPELINE_CREATE_STATE, "Invalid Pipeline CreateInfo State: Multiple shaders provided for stage %s", string_VkShaderStageFlagBits(VkShaderStageFlagBits(stage))); } @@ -1368,31 +1392,27 @@ // VS is required if (!(pPipeline->active_shaders & VK_SHADER_STAGE_VERTEX_BIT)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_096005ae, "DS", - "Invalid Pipeline CreateInfo State: Vertex Shader required. %s", - validation_error_map[VALIDATION_ERROR_096005ae]); + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_096005ae, + "Invalid Pipeline CreateInfo State: Vertex Shader required."); } // Either both or neither TC/TE shaders should be defined bool has_control = (pPipeline->active_shaders & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) != 0; bool has_eval = (pPipeline->active_shaders & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) != 0; if (has_control && !has_eval) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_096005b2, "DS", - "Invalid Pipeline CreateInfo State: TE and TC shaders must be included or excluded as a pair. %s", - validation_error_map[VALIDATION_ERROR_096005b2]); + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_096005b2, + "Invalid Pipeline CreateInfo State: TE and TC shaders must be included or excluded as a pair."); } if (!has_control && has_eval) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_096005b4, "DS", - "Invalid Pipeline CreateInfo State: TE and TC shaders must be included or excluded as a pair. %s", - validation_error_map[VALIDATION_ERROR_096005b4]); + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_096005b4, + "Invalid Pipeline CreateInfo State: TE and TC shaders must be included or excluded as a pair."); } // Compute shaders should be specified independent of Gfx shaders if (pPipeline->active_shaders & VK_SHADER_STAGE_COMPUTE_BIT) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_096005b0, "DS", - "Invalid Pipeline CreateInfo State: Do not specify Compute Shader for Gfx Pipeline. %s", - validation_error_map[VALIDATION_ERROR_096005b0]); + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_096005b0, + "Invalid Pipeline CreateInfo State: Do not specify Compute Shader for Gfx Pipeline."); } // VK_PRIMITIVE_TOPOLOGY_PATCH_LIST primitive topology is only valid for tessellation pipelines. // Mismatching primitive topology and tessellation fails graphics pipeline creation. @@ -1400,19 +1420,17 @@ (!pPipeline->graphicsPipelineCI.pInputAssemblyState || pPipeline->graphicsPipelineCI.pInputAssemblyState->topology != VK_PRIMITIVE_TOPOLOGY_PATCH_LIST)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_096005c0, "DS", + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_096005c0, "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH_LIST must be set as IA topology for " - "tessellation pipelines. %s", - validation_error_map[VALIDATION_ERROR_096005c0]); + "tessellation pipelines."); } if (pPipeline->graphicsPipelineCI.pInputAssemblyState && pPipeline->graphicsPipelineCI.pInputAssemblyState->topology == VK_PRIMITIVE_TOPOLOGY_PATCH_LIST) { if (!has_control || !has_eval) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_096005c2, "DS", + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_096005c2, "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH_LIST primitive topology is only valid " - "for tessellation pipelines. %s", - validation_error_map[VALIDATION_ERROR_096005c2]); + "for tessellation pipelines."); } } @@ -1421,17 +1439,16 @@ if ((pPipeline->graphicsPipelineCI.pRasterizationState->depthClampEnable == VK_TRUE) && (!dev_data->enabled_features.depthClamp)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_1020061c, "DS", + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_1020061c, "vkCreateGraphicsPipelines(): the depthClamp device feature is disabled: the depthClampEnable member " - "of the VkPipelineRasterizationStateCreateInfo structure must be set to VK_FALSE. %s", - validation_error_map[VALIDATION_ERROR_1020061c]); + "of the VkPipelineRasterizationStateCreateInfo structure must be set to VK_FALSE."); } if (!isDynamic(pPipeline, VK_DYNAMIC_STATE_DEPTH_BIAS) && (pPipeline->graphicsPipelineCI.pRasterizationState->depthBiasClamp != 0.0) && (!dev_data->enabled_features.depthBiasClamp)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, DRAWSTATE_INVALID_FEATURE, "DS", + HandleToUint64(pPipeline->pipeline), DRAWSTATE_INVALID_FEATURE, "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"); @@ -1442,10 +1459,9 @@ if ((pPipeline->graphicsPipelineCI.pMultisampleState->alphaToOneEnable == VK_TRUE) && (!dev_data->enabled_features.alphaToOne)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_10000622, "DS", + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_10000622, "vkCreateGraphicsPipelines(): the alphaToOne device feature is disabled: the alphaToOneEnable " - "member of the VkPipelineMultisampleStateCreateInfo structure must be set to VK_FALSE. %s", - validation_error_map[VALIDATION_ERROR_10000622]); + "member of the VkPipelineMultisampleStateCreateInfo structure must be set to VK_FALSE."); } // If subpass uses a depth/stencil attachment, pDepthStencilState must be a pointer to a valid structure @@ -1453,19 +1469,17 @@ subpass_desc->pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) { if (!pPipeline->graphicsPipelineCI.pDepthStencilState) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_096005e0, "DS", + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_096005e0, "Invalid Pipeline CreateInfo State: pDepthStencilState is NULL when rasterization is enabled " - "and subpass uses a depth/stencil attachment. %s", - validation_error_map[VALIDATION_ERROR_096005e0]); + "and subpass uses a depth/stencil attachment."); } else if ((pPipeline->graphicsPipelineCI.pDepthStencilState->depthBoundsTestEnable == VK_TRUE) && (!dev_data->enabled_features.depthBounds)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_0f6004ac, "DS", + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_0f6004ac, "vkCreateGraphicsPipelines(): the depthBounds device feature is disabled: the " "depthBoundsTestEnable member of the VkPipelineDepthStencilStateCreateInfo structure must be " - "set to VK_FALSE. %s", - validation_error_map[VALIDATION_ERROR_0f6004ac]); + "set to VK_FALSE."); } } @@ -1479,10 +1493,9 @@ } if (color_attachment_count > 0 && pPipeline->graphicsPipelineCI.pColorBlendState == nullptr) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_096005e2, "DS", + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_096005e2, "Invalid Pipeline CreateInfo State: pColorBlendState is NULL when rasterization is enabled and " - "subpass uses color attachments. %s", - validation_error_map[VALIDATION_ERROR_096005e2]); + "subpass uses color attachments."); } } } @@ -1499,10 +1512,10 @@ if ((properties.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) == 0) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_14a004de, "IMAGE", + VALIDATION_ERROR_14a004de, "vkCreateGraphicsPipelines: pCreateInfo[%d].pVertexInputState->vertexAttributeDescriptions[%d].format " - "(%s) is not a supported vertex buffer format. %s", - pipelineIndex, j, string_VkFormat(format), validation_error_map[VALIDATION_ERROR_14a004de]); + "(%s) is not a supported vertex buffer format.", + pipelineIndex, j, string_VkFormat(format)); } } } @@ -1523,13 +1536,12 @@ } if (pPipeline->graphicsPipelineCI.pMultisampleState->rasterizationSamples != max_sample_count) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_09600bc2, "DS", + HandleToUint64(pPipeline->pipeline), VALIDATION_ERROR_09600bc2, "vkCreateGraphicsPipelines: pCreateInfo[%d].pMultisampleState->rasterizationSamples (%s) != max " - "attachment samples (%s) used in subpass %u. %s", + "attachment samples (%s) used in subpass %u.", pipelineIndex, string_VkSampleCountFlagBits(pPipeline->graphicsPipelineCI.pMultisampleState->rasterizationSamples), - string_VkSampleCountFlagBits(max_sample_count), pPipeline->graphicsPipelineCI.subpass, - validation_error_map[VALIDATION_ERROR_09600bc2]); + string_VkSampleCountFlagBits(max_sample_count), pPipeline->graphicsPipelineCI.subpass); } } @@ -1557,16 +1569,16 @@ auto set_node = dev_data->setMap.find(set); if (set_node == dev_data->setMap.end()) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - HandleToUint64(set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", + HandleToUint64(set), DRAWSTATE_DOUBLE_DESTROY, "Cannot call %s() on descriptor set 0x%" PRIx64 " that has not been allocated.", func_str.c_str(), HandleToUint64(set)); } else { // TODO : This covers various error cases so should pass error enum into this function and use passed in enum here if (set_node->second->in_use.load()) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - HandleToUint64(set), __LINE__, VALIDATION_ERROR_2860026a, "DS", - "Cannot call %s() on descriptor set 0x%" PRIx64 " that is in use by a command buffer. %s", - func_str.c_str(), HandleToUint64(set), validation_error_map[VALIDATION_ERROR_2860026a]); + HandleToUint64(set), VALIDATION_ERROR_2860026a, + "Cannot call %s() on descriptor set 0x%" PRIx64 " that is in use by a command buffer.", + func_str.c_str(), HandleToUint64(set)); } } return skip; @@ -1623,11 +1635,11 @@ if (pCB->activeSubpassContents == VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS && (cmd_type != CMD_EXECUTECOMMANDS && cmd_type != CMD_NEXTSUBPASS && cmd_type != CMD_ENDRENDERPASS)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, DRAWSTATE_INVALID_COMMAND_BUFFER, "DS", + HandleToUint64(pCB->commandBuffer), DRAWSTATE_INVALID_COMMAND_BUFFER, "Commands cannot be called in a subpass using secondary command buffers."); } else if (pCB->activeSubpassContents == VK_SUBPASS_CONTENTS_INLINE && cmd_type == CMD_EXECUTECOMMANDS) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, DRAWSTATE_INVALID_COMMAND_BUFFER, "DS", + HandleToUint64(pCB->commandBuffer), DRAWSTATE_INVALID_COMMAND_BUFFER, "vkCmdExecuteCommands() cannot be called in a subpass using inline commands."); } return skip; @@ -1649,9 +1661,9 @@ } } return log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, error_code, "DS", - "Cannot call %s on a command buffer allocated from a pool without %s capabilities. %s.", caller_name, - required_flags_string.c_str(), validation_error_map[error_code]); + HandleToUint64(cb_node->commandBuffer), error_code, + "Cannot call %s on a command buffer allocated from a pool without %s capabilities..", caller_name, + required_flags_string.c_str()); } } return false; @@ -1669,7 +1681,7 @@ const char *type_str = object_string[obj.type]; const char *cause_str = GetCauseStr(obj); skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, DRAWSTATE_INVALID_COMMAND_BUFFER, "DS", + HandleToUint64(cb_state->commandBuffer), DRAWSTATE_INVALID_COMMAND_BUFFER, "You are adding %s to command buffer 0x%" PRIx64 " that is invalid because bound %s 0x%" PRIx64 " was %s.", call_source, HandleToUint64(cb_state->commandBuffer), type_str, obj.handle, cause_str); } @@ -1763,9 +1775,8 @@ } const auto error = error_it->second; return log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, error, "DS", - "You must call vkBeginCommandBuffer() before this call to %s. %s", caller_name, - validation_error_map[error]); + HandleToUint64(cb_state->commandBuffer), error, + "You must call vkBeginCommandBuffer() before this call to %s.", caller_name); } } @@ -1973,9 +1984,9 @@ bool inside = false; if (pCB->activeRenderPass) { inside = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, msgCode, "DS", - "%s: It is invalid to issue this call inside an active render pass (0x%" PRIx64 "). %s", apiName, - HandleToUint64(pCB->activeRenderPass->renderPass), validation_error_map[msgCode]); + HandleToUint64(pCB->commandBuffer), msgCode, + "%s: It is invalid to issue this call inside an active render pass (0x%" PRIx64 ").", apiName, + HandleToUint64(pCB->activeRenderPass->renderPass)); } return inside; } @@ -1988,8 +1999,8 @@ ((pCB->createInfo.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) && (!pCB->activeRenderPass) && !(pCB->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT))) { outside = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, msgCode, "DS", - "%s: This call must be issued inside an active render pass. %s", apiName, validation_error_map[msgCode]); + HandleToUint64(pCB->commandBuffer), msgCode, "%s: This call must be issued inside an active render pass.", + apiName); } return outside; } @@ -2080,11 +2091,9 @@ static bool ValidatePhysicalDeviceQueueFamily(instance_layer_data *instance_data, const PHYSICAL_DEVICE_STATE *pd_state, uint32_t requested_queue_family, int32_t err_code, const char *cmd_name, - const char *queue_family_var_name, const char *vu_note = nullptr) { + const char *queue_family_var_name) { bool skip = false; - if (!vu_note) vu_note = validation_error_map[err_code]; - const char *conditional_ext_cmd = instance_data->extensions.vk_khr_get_physical_device_properties_2 ? "or vkGetPhysicalDeviceQueueFamilyProperties2[KHR]" : ""; @@ -2095,11 +2104,11 @@ if (requested_queue_family >= pd_state->queue_family_count) { skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, - HandleToUint64(pd_state->phys_device), __LINE__, err_code, "DL", + HandleToUint64(pd_state->phys_device), err_code, "%s: %s (= %" PRIu32 ") is not less than any previously obtained pQueueFamilyPropertyCount from " - "vkGetPhysicalDeviceQueueFamilyProperties%s (%s). %s", - cmd_name, queue_family_var_name, requested_queue_family, conditional_ext_cmd, count_note.c_str(), vu_note); + "vkGetPhysicalDeviceQueueFamilyProperties%s (%s).", + cmd_name, queue_family_var_name, requested_queue_family, conditional_ext_cmd, count_note.c_str()); } return skip; } @@ -2135,13 +2144,11 @@ requested_queue_count > pd_state->queue_family_properties[requested_queue_family].queueCount) { skip |= log_msg( instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, - HandleToUint64(pd_state->phys_device), __LINE__, VALIDATION_ERROR_06c002fc, "DL", + HandleToUint64(pd_state->phys_device), VALIDATION_ERROR_06c002fc, "vkCreateDevice: pCreateInfo->pQueueCreateInfos[%" PRIu32 "].queueCount (=%" PRIu32 ") is not less than or equal to available queue count for this pCreateInfo->pQueueCreateInfos[%" PRIu32 - "].queueFamilyIndex} (=%" PRIu32 - ") obtained previously from vkGetPhysicalDeviceQueueFamilyProperties%s (%s). %s", - i, requested_queue_count, i, requested_queue_family, conditional_ext_cmd, count_note.c_str(), - validation_error_map[VALIDATION_ERROR_06c002fc]); + "].queueFamilyIndex} (=%" PRIu32 ") obtained previously from vkGetPhysicalDeviceQueueFamilyProperties%s (%s).", + i, requested_queue_count, i, requested_queue_family, conditional_ext_cmd, count_note.c_str()); } } } @@ -2164,7 +2171,7 @@ for (uint32_t i = 0; i < total_bools; i++) { if (requested[i] > actual[i]) { skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVLIMITS_INVALID_FEATURE_REQUESTED, "DL", + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, DEVLIMITS_INVALID_FEATURE_REQUESTED, "While calling vkCreateDevice(), requesting feature '%s' in VkPhysicalDeviceFeatures struct, which is " "not available on this device.", GetPhysDevFeatureString(i)); @@ -2175,7 +2182,7 @@ // If user didn't request features, notify them that they should // TODO: Verify this against the spec. I believe this is an invalid use of the API and should return an error skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, - 0, __LINE__, DEVLIMITS_INVALID_FEATURE_REQUESTED, "DL", + 0, DEVLIMITS_INVALID_FEATURE_REQUESTED, "You requested features that are unavailable on this device. You should first query feature availability " "by calling vkGetPhysicalDeviceFeatures()."); } @@ -2193,9 +2200,9 @@ // TODO: object_tracker should perhaps do this instead // and it does not seem to currently work anyway -- the loader just crashes before this point if (!GetPhysicalDeviceState(instance_data, gpu)) { - skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, - 0, __LINE__, DEVLIMITS_MUST_QUERY_COUNT, "DL", - "Invalid call to vkCreateDevice() w/o first calling vkEnumeratePhysicalDevices()."); + skip |= + log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, + DEVLIMITS_MUST_QUERY_COUNT, "Invalid call to vkCreateDevice() w/o first calling vkEnumeratePhysicalDevices()."); } // Check that any requested features are available @@ -2277,6 +2284,18 @@ instance_data->dispatch_table.GetPhysicalDeviceProperties2KHR(gpu, &prop2); device_data->phys_dev_ext_props.max_push_descriptors = push_descriptor_prop.maxPushDescriptors; } + if (device_data->extensions.vk_ext_descriptor_indexing) { + // Get the needed descriptor_indexing limits + auto descriptor_indexing_props = lvl_init_struct(); + auto prop2 = lvl_init_struct(&descriptor_indexing_props); + instance_data->dispatch_table.GetPhysicalDeviceProperties2KHR(gpu, &prop2); + device_data->phys_dev_ext_props.descriptor_indexing_props = descriptor_indexing_props; + } + + const auto *descriptor_indexing_features = lvl_find_in_chain(pCreateInfo->pNext); + if (descriptor_indexing_features) { + device_data->phys_dev_ext_props.descriptor_indexing_features = *descriptor_indexing_features; + } lock.unlock(); @@ -2331,20 +2350,20 @@ UNIQUE_VALIDATION_ERROR_CODE geo_error_id, UNIQUE_VALIDATION_ERROR_CODE tess_error_id) { bool skip = false; if (!dev_data->enabled_features.geometryShader && (stageMask & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT)) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - geo_error_id, "DL", - "%s call includes a stageMask with VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT bit set when device does not have " - "geometryShader feature enabled. %s", - caller, validation_error_map[geo_error_id]); + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, geo_error_id, + "%s call includes a stageMask with VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT bit set when device does not have " + "geometryShader feature enabled.", + caller); } if (!dev_data->enabled_features.tessellationShader && (stageMask & (VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT))) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - tess_error_id, "DL", - "%s call includes a stageMask with VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT and/or " - "VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT bit(s) set when device does not have " - "tessellationShader feature enabled. %s", - caller, validation_error_map[tess_error_id]); + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, tess_error_id, + "%s call includes a stageMask with VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT and/or " + "VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT bit(s) set when device does not have " + "tessellationShader feature enabled.", + caller); } return skip; } @@ -2428,7 +2447,7 @@ for (auto event : queryEventsPair.second) { if (dev_data->eventMap[event].needsSignaled) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, 0, 0, DRAWSTATE_INVALID_QUERY, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, 0, DRAWSTATE_INVALID_QUERY, "Cannot get query results on queryPool 0x%" PRIx64 " with index %d which was guarded by unsignaled event 0x%" PRIx64 ".", HandleToUint64(queryEventsPair.first.pool), queryEventsPair.first.index, @@ -2556,9 +2575,9 @@ if ((pCB->in_use.load() || current_submit_count > 1) && !(pCB->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, 0, - __LINE__, VALIDATION_ERROR_31a0008e, "DS", - "Command Buffer 0x%" PRIx64 " is already in use and is not marked for simultaneous use. %s", - HandleToUint64(pCB->commandBuffer), validation_error_map[VALIDATION_ERROR_31a0008e]); + VALIDATION_ERROR_31a0008e, + "Command Buffer 0x%" PRIx64 " is already in use and is not marked for simultaneous use.", + HandleToUint64(pCB->commandBuffer)); } return skip; } @@ -2571,7 +2590,7 @@ if ((cb_state->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) && (cb_state->submitCount + current_submit_count > 1)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, 0, - __LINE__, DRAWSTATE_COMMAND_BUFFER_SINGLE_SUBMIT_VIOLATION, "DS", + DRAWSTATE_COMMAND_BUFFER_SINGLE_SUBMIT_VIOLATION, "Commandbuffer 0x%" PRIx64 " was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted 0x%" PRIxLEAST64 " times.", @@ -2587,14 +2606,14 @@ case CB_NEW: skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - (uint64_t)(cb_state->commandBuffer), __LINE__, vu_id, "DS", - "Command buffer 0x%" PRIx64 " used in the call to %s is unrecorded and contains no commands. %s", - HandleToUint64(cb_state->commandBuffer), call_source, validation_error_map[vu_id]); + (uint64_t)(cb_state->commandBuffer), vu_id, + "Command buffer 0x%" PRIx64 " used in the call to %s is unrecorded and contains no commands.", + HandleToUint64(cb_state->commandBuffer), call_source); break; case CB_RECORDING: skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, DRAWSTATE_NO_END_COMMAND_BUFFER, "DS", + HandleToUint64(cb_state->commandBuffer), DRAWSTATE_NO_END_COMMAND_BUFFER, "You must call vkEndCommandBuffer() on command buffer 0x%" PRIx64 " before this call to %s!", HandleToUint64(cb_state->commandBuffer), call_source); break; @@ -2616,7 +2635,7 @@ auto buffer_state = GetBufferState(dev_data, buffer); if (buffer != VK_NULL_HANDLE && !buffer_state) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, - HandleToUint64(buffer), __LINE__, DRAWSTATE_INVALID_BUFFER, "DS", + HandleToUint64(buffer), DRAWSTATE_INVALID_BUFFER, "Cannot submit cmd buffer using deleted buffer 0x%" PRIx64 ".", HandleToUint64(buffer)); } } @@ -2640,7 +2659,7 @@ if (!found) { skip = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, get_debug_report_enum[object->type], - object->handle, __LINE__, DRAWSTATE_INVALID_QUEUE_FAMILY, "DS", + object->handle, DRAWSTATE_INVALID_QUEUE_FAMILY, "vkQueueSubmit: Command buffer 0x%" PRIx64 " contains %s 0x%" PRIx64 " which was not created allowing concurrent access to this queue family %d.", HandleToUint64(cb_node->commandBuffer), object_string[object->type], object->handle, @@ -2660,11 +2679,11 @@ if (pPool && queue_state) { if (pPool->queueFamilyIndex != queue_state->queueFamilyIndex) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, VALIDATION_ERROR_31a00094, "DS", + HandleToUint64(pCB->commandBuffer), VALIDATION_ERROR_31a00094, "vkQueueSubmit: Primary command buffer 0x%" PRIx64 - " created in queue family %d is being submitted on queue 0x%" PRIx64 " from queue family %d. %s", + " created in queue family %d is being submitted on queue 0x%" PRIx64 " from queue family %d.", HandleToUint64(pCB->commandBuffer), pPool->queueFamilyIndex, HandleToUint64(queue), - queue_state->queueFamilyIndex, validation_error_map[VALIDATION_ERROR_31a00094]); + queue_state->queueFamilyIndex); } // Ensure that any bound images or buffers created with SHARING_MODE_CONCURRENT have access to the current queue family @@ -2704,12 +2723,12 @@ if ((pSubCB->primaryCommandBuffer != pCB->commandBuffer) && !(pSubCB->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT)) { log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, 0, - __LINE__, VALIDATION_ERROR_31a00092, "DS", + VALIDATION_ERROR_31a00092, "Commandbuffer 0x%" PRIx64 " was submitted with secondary buffer 0x%" PRIx64 " but that buffer has subsequently been bound to primary cmd buffer 0x%" PRIx64 - " and it does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set. %s", + " and it does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set.", HandleToUint64(pCB->commandBuffer), HandleToUint64(pSubCB->commandBuffer), - HandleToUint64(pSubCB->primaryCommandBuffer), validation_error_map[VALIDATION_ERROR_31a00092]); + HandleToUint64(pSubCB->primaryCommandBuffer)); } } @@ -2725,14 +2744,14 @@ if (pFence->state == FENCE_INFLIGHT) { // TODO: opportunities for VALIDATION_ERROR_31a00080, VALIDATION_ERROR_316008b4, VALIDATION_ERROR_16400a0e skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - HandleToUint64(pFence->fence), __LINE__, DRAWSTATE_INVALID_FENCE, "DS", + HandleToUint64(pFence->fence), DRAWSTATE_INVALID_FENCE, "Fence 0x%" PRIx64 " is already in use by another submission.", HandleToUint64(pFence->fence)); } else if (pFence->state == FENCE_RETIRED) { // TODO: opportunities for VALIDATION_ERROR_31a0007e, VALIDATION_ERROR_316008b2, VALIDATION_ERROR_16400a0e skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - HandleToUint64(pFence->fence), __LINE__, MEMTRACK_INVALID_FENCE_STATE, "MEM", + HandleToUint64(pFence->fence), MEMTRACK_INVALID_FENCE_STATE, "Fence 0x%" PRIx64 " submitted in SIGNALED state. Fences must be reset before being submitted", HandleToUint64(pFence->fence)); } @@ -2764,7 +2783,7 @@ if (!dev_data->external_sync_warning) { dev_data->external_sync_warning = true; log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - HandleToUint64(fence), __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", + HandleToUint64(fence), DRAWSTATE_QUEUE_FORWARD_PROGRESS, "vkQueueSubmit(): Signaling external fence 0x%" PRIx64 " on queue 0x%" PRIx64 " will disable validation of preceding command buffer lifecycle states and the in-use status of associated " "objects.", @@ -2816,7 +2835,7 @@ if (!dev_data->external_sync_warning) { dev_data->external_sync_warning = true; log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, - HandleToUint64(semaphore), __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", + HandleToUint64(semaphore), DRAWSTATE_QUEUE_FORWARD_PROGRESS, "vkQueueSubmit(): Signaling external semaphore 0x%" PRIx64 " on queue 0x%" PRIx64 " will disable validation of preceding command buffer lifecycle states and the in-use status of " "associated objects.", @@ -2831,12 +2850,11 @@ cbs.push_back(submit->pCommandBuffers[i]); for (auto secondaryCmdBuffer : cb_node->linkedCommandBuffers) { cbs.push_back(secondaryCmdBuffer->commandBuffer); + UpdateCmdBufImageLayouts(dev_data, secondaryCmdBuffer); + incrementResources(dev_data, secondaryCmdBuffer); } UpdateCmdBufImageLayouts(dev_data, cb_node); incrementResources(dev_data, cb_node); - for (auto secondaryCmdBuffer : cb_node->linkedCommandBuffers) { - incrementResources(dev_data, secondaryCmdBuffer); - } } } pQueue->submissions.emplace_back(cbs, semaphore_waits, semaphore_signals, semaphore_externals, @@ -2873,7 +2891,7 @@ if (unsignaled_semaphores.count(semaphore) || (!(signaled_semaphores.count(semaphore)) && !(pSemaphore->signaled))) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, - HandleToUint64(semaphore), __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", + HandleToUint64(semaphore), DRAWSTATE_QUEUE_FORWARD_PROGRESS, "Queue 0x%" PRIx64 " is waiting on semaphore 0x%" PRIx64 " that has no way to be signaled.", HandleToUint64(queue), HandleToUint64(semaphore)); } else { @@ -2891,7 +2909,7 @@ if (pSemaphore && (pSemaphore->scope == kSyncScopeInternal || internal_semaphores.count(semaphore))) { if (signaled_semaphores.count(semaphore) || (!(unsignaled_semaphores.count(semaphore)) && pSemaphore->signaled)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, - HandleToUint64(semaphore), __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", + HandleToUint64(semaphore), DRAWSTATE_QUEUE_FORWARD_PROGRESS, "Queue 0x%" PRIx64 " is signaling semaphore 0x%" PRIx64 " that has already been signaled but not waited on by queue 0x%" PRIx64 ".", HandleToUint64(queue), HandleToUint64(semaphore), HandleToUint64(pSemaphore->signaler.first)); @@ -2952,7 +2970,7 @@ bool skip = false; if (dev_data->memObjMap.size() >= dev_data->phys_dev_properties.properties.limits.maxMemoryAllocationCount) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_UNDEFINED, "MEM", + HandleToUint64(dev_data->device), VALIDATION_ERROR_UNDEFINED, "Number of currently valid memory objects is not less than the maximum allowed (%u).", dev_data->phys_dev_properties.properties.limits.maxMemoryAllocationCount); } @@ -2987,10 +3005,10 @@ if (dev_data->instance_data->disabled.object_in_use) return false; bool skip = false; if (obj_node->in_use.load()) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, get_debug_report_enum[obj_struct.type], - obj_struct.handle, __LINE__, error_code, "DS", - "Cannot call %s on %s 0x%" PRIx64 " that is currently in use by a command buffer. %s", caller_name, - object_string[obj_struct.type], obj_struct.handle, validation_error_map[error_code]); + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, get_debug_report_enum[obj_struct.type], obj_struct.handle, + error_code, "Cannot call %s on %s 0x%" PRIx64 " that is currently in use by a command buffer.", caller_name, + object_string[obj_struct.type], obj_struct.handle); } return skip; } @@ -3009,8 +3027,8 @@ static void PostCallRecordFreeMemory(layer_data *dev_data, VkDeviceMemory mem, DEVICE_MEM_INFO *mem_info, VK_OBJECT obj_struct) { // Clear mem binding for any bound objects for (auto obj : mem_info->obj_bindings) { - log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, get_debug_report_enum[obj.type], obj.handle, __LINE__, - MEMTRACK_FREED_MEM_REF, "MEM", "VK Object 0x%" PRIx64 " still has a reference to mem obj 0x%" PRIx64, + log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, get_debug_report_enum[obj.type], obj.handle, + MEMTRACK_FREED_MEM_REF, "VK Object 0x%" PRIx64 " still has a reference to mem obj 0x%" PRIx64, HandleToUint64(obj.handle), HandleToUint64(mem_info->mem)); BINDABLE *bindable_state = nullptr; switch (obj.type) { @@ -3059,8 +3077,7 @@ if (size == 0) { skip = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem), __LINE__, MEMTRACK_INVALID_MAP, "MEM", - "VkMapMemory: Attempting to map memory range of size zero"); + HandleToUint64(mem), MEMTRACK_INVALID_MAP, "VkMapMemory: Attempting to map memory range of size zero"); } auto mem_element = dev_data->memObjMap.find(mem); @@ -3069,7 +3086,7 @@ // It is an application error to call VkMapMemory on an object that is already mapped if (mem_info->mem_range.size != 0) { skip = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem), __LINE__, MEMTRACK_INVALID_MAP, "MEM", + HandleToUint64(mem), MEMTRACK_INVALID_MAP, "VkMapMemory: Attempting to map memory on an already-mapped object 0x%" PRIx64, HandleToUint64(mem)); } @@ -3077,7 +3094,7 @@ if (size == VK_WHOLE_SIZE) { if (offset >= mem_info->alloc_info.allocationSize) { skip = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem), __LINE__, MEMTRACK_INVALID_MAP, "MEM", + HandleToUint64(mem), MEMTRACK_INVALID_MAP, "Mapping Memory from 0x%" PRIx64 " to 0x%" PRIx64 " with size of VK_WHOLE_SIZE oversteps total array size 0x%" PRIx64, offset, mem_info->alloc_info.allocationSize, mem_info->alloc_info.allocationSize); @@ -3085,10 +3102,9 @@ } else { if ((offset + size) > mem_info->alloc_info.allocationSize) { skip = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem), __LINE__, VALIDATION_ERROR_31200552, "MEM", - "Mapping Memory from 0x%" PRIx64 " to 0x%" PRIx64 " oversteps total array size 0x%" PRIx64 ". %s", - offset, size + offset, mem_info->alloc_info.allocationSize, - validation_error_map[VALIDATION_ERROR_31200552]); + HandleToUint64(mem), VALIDATION_ERROR_31200552, + "Mapping Memory from 0x%" PRIx64 " to 0x%" PRIx64 " oversteps total array size 0x%" PRIx64 ".", + offset, size + offset, mem_info->alloc_info.allocationSize); } } } @@ -3110,9 +3126,8 @@ if (!mem_info->mem_range.size) { // Valid Usage: memory must currently be mapped skip = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem), __LINE__, VALIDATION_ERROR_33600562, "MEM", - "Unmapping Memory without memory being mapped: mem obj 0x%" PRIx64 ". %s", HandleToUint64(mem), - validation_error_map[VALIDATION_ERROR_33600562]); + HandleToUint64(mem), VALIDATION_ERROR_33600562, + "Unmapping Memory without memory being mapped: mem obj 0x%" PRIx64 ".", HandleToUint64(mem)); } mem_info->mem_range.size = 0; if (mem_info->shadow_copy) { @@ -3175,7 +3190,7 @@ if (pFence->state == FENCE_UNSIGNALED) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - HandleToUint64(fence), __LINE__, MEMTRACK_INVALID_FENCE_STATE, "MEM", + HandleToUint64(fence), MEMTRACK_INVALID_FENCE_STATE, "%s called for fence 0x%" PRIx64 " which has not been submitted on a Queue or during acquire next image.", apiCall, HandleToUint64(fence)); } @@ -3353,9 +3368,9 @@ bool skip = false; if (*fence_node) { if ((*fence_node)->scope == kSyncScopeInternal && (*fence_node)->state == FENCE_INFLIGHT) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - HandleToUint64(fence), __LINE__, VALIDATION_ERROR_24e008c0, "DS", "Fence 0x%" PRIx64 " is in use. %s", - HandleToUint64(fence), validation_error_map[VALIDATION_ERROR_24e008c0]); + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, + HandleToUint64(fence), VALIDATION_ERROR_24e008c0, "Fence 0x%" PRIx64 " is in use.", HandleToUint64(fence)); } } return skip; @@ -3479,12 +3494,12 @@ auto query_pool_state = dev_data->queryPoolMap.find(query_pool); if (query_pool_state != dev_data->queryPoolMap.end()) { if ((query_pool_state->second.createInfo.queryType == VK_QUERY_TYPE_TIMESTAMP) && (flags & VK_QUERY_RESULT_PARTIAL_BIT)) { - skip |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, 0, __LINE__, - VALIDATION_ERROR_2fa00664, "DS", - "QueryPool 0x%" PRIx64 - " was created with a queryType of VK_QUERY_TYPE_TIMESTAMP but flags contains VK_QUERY_RESULT_PARTIAL_BIT. %s", - HandleToUint64(query_pool), validation_error_map[VALIDATION_ERROR_2fa00664]); + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, 0, + VALIDATION_ERROR_2fa00664, + "QueryPool 0x%" PRIx64 + " was created with a queryType of VK_QUERY_TYPE_TIMESTAMP but flags contains VK_QUERY_RESULT_PARTIAL_BIT.", + HandleToUint64(query_pool)); } } @@ -3511,7 +3526,7 @@ auto query_event_pair = cb->waitedEventsBeforeQueryReset.find(query); if (query_event_pair == cb->waitedEventsBeforeQueryReset.end()) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, 0, __LINE__, DRAWSTATE_INVALID_QUERY, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, 0, DRAWSTATE_INVALID_QUERY, "Cannot get query results on queryPool 0x%" PRIx64 " with index %d which is in flight.", HandleToUint64(query_pool), first_query + i); } @@ -3519,13 +3534,13 @@ } } else if (!query_state_pair->second) { // Unavailable and Not in flight skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, 0, - __LINE__, DRAWSTATE_INVALID_QUERY, "DS", + DRAWSTATE_INVALID_QUERY, "Cannot get query results on queryPool 0x%" PRIx64 " with index %d which is unavailable.", HandleToUint64(query_pool), first_query + i); } } else { // Uninitialized skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, 0, - __LINE__, DRAWSTATE_INVALID_QUERY, "DS", + DRAWSTATE_INVALID_QUERY, "Cannot get query results on queryPool 0x%" PRIx64 " with index %d as data has not been collected for this index.", HandleToUint64(query_pool), first_query + i); @@ -3604,7 +3619,7 @@ const char *r2_type_str = range2->image ? "image" : "buffer"; auto obj_type = range1->image ? VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT : VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT; *skip |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, obj_type, range1->handle, 0, MEMTRACK_INVALID_ALIASING, "MEM", + dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, obj_type, range1->handle, MEMTRACK_INVALID_ALIASING, "%s %s 0x%" PRIx64 " is aliased with %s %s 0x%" PRIx64 " which may indicate a bug. For further info refer to the Buffer-Image Granularity section of the Vulkan " "specification. " @@ -3670,11 +3685,11 @@ if (memoryOffset >= mem_info->alloc_info.allocationSize) { UNIQUE_VALIDATION_ERROR_CODE error_code = is_image ? VALIDATION_ERROR_1740082c : VALIDATION_ERROR_1700080e; skip = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem_info->mem), __LINE__, error_code, "MEM", + HandleToUint64(mem_info->mem), error_code, "In %s, attempting to bind memory (0x%" PRIx64 ") to object (0x%" PRIx64 "), memoryOffset=0x%" PRIxLEAST64 - " must be less than the memory allocation size 0x%" PRIxLEAST64 ". %s", + " must be less than the memory allocation size 0x%" PRIxLEAST64 ".", api_name, HandleToUint64(mem_info->mem), HandleToUint64(handle), memoryOffset, - mem_info->alloc_info.allocationSize, validation_error_map[error_code]); + mem_info->alloc_info.allocationSize); } return skip; @@ -3818,11 +3833,10 @@ bool skip = false; if (((1 << mem_info->alloc_info.memoryTypeIndex) & memory_type_bits) == 0) { skip = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem_info->mem), __LINE__, msgCode, "MT", + HandleToUint64(mem_info->mem), msgCode, "%s(): MemoryRequirements->memoryTypeBits (0x%X) for this object type are not compatible with the memory " - "type (0x%X) of this memory object 0x%" PRIx64 ". %s", - funcName, memory_type_bits, mem_info->alloc_info.memoryTypeIndex, HandleToUint64(mem_info->mem), - validation_error_map[msgCode]); + "type (0x%X) of this memory object 0x%" PRIx64 ".", + funcName, memory_type_bits, mem_info->alloc_info.memoryTypeIndex, HandleToUint64(mem_info->mem)); } return skip; } @@ -3840,7 +3854,7 @@ // BindBufferMemory, but it's implied in that memory being bound must conform with VkMemoryRequirements from // vkGetBufferMemoryRequirements() skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, - buffer_handle, __LINE__, DRAWSTATE_INVALID_BUFFER, "DS", + buffer_handle, DRAWSTATE_INVALID_BUFFER, "%s: Binding memory to buffer 0x%" PRIx64 " but vkGetBufferMemoryRequirements() has not been called on that buffer.", api_name, HandleToUint64(buffer_handle)); @@ -3851,7 +3865,7 @@ } // Validate bound memory range information - auto mem_info = GetMemObjInfo(dev_data, mem); + const auto mem_info = GetMemObjInfo(dev_data, mem); if (mem_info) { skip |= ValidateInsertBufferMemoryRange(dev_data, buffer, mem_info, memoryOffset, buffer_state->requirements, api_name); skip |= ValidateMemoryTypes(dev_data, mem_info, buffer_state->requirements.memoryTypeBits, api_name, @@ -3861,24 +3875,38 @@ // Validate memory requirements alignment if (SafeModulo(memoryOffset, buffer_state->requirements.alignment) != 0) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, - buffer_handle, __LINE__, VALIDATION_ERROR_17000818, "DS", + buffer_handle, VALIDATION_ERROR_17000818, "%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. %s", - api_name, memoryOffset, buffer_state->requirements.alignment, - validation_error_map[VALIDATION_ERROR_17000818]); + ", returned from a call to vkGetBufferMemoryRequirements with buffer.", + api_name, memoryOffset, buffer_state->requirements.alignment); } - // Validate memory requirements size if (mem_info) { + // Validate memory requirements size if (buffer_state->requirements.size > (mem_info->alloc_info.allocationSize - memoryOffset)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, - buffer_handle, __LINE__, VALIDATION_ERROR_1700081a, "DS", + buffer_handle, VALIDATION_ERROR_1700081a, "%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. %s", - api_name, mem_info->alloc_info.allocationSize - memoryOffset, buffer_state->requirements.size, - validation_error_map[VALIDATION_ERROR_1700081a]); + ", returned from a call to vkGetBufferMemoryRequirements with buffer.", + api_name, mem_info->alloc_info.allocationSize - memoryOffset, buffer_state->requirements.size); + } + + // 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 = VALIDATION_ERROR_UNDEFINED; + if (strcmp(api_name, "vkBindBufferMemory()") == 0) { + validation_error = VALIDATION_ERROR_17000bc8; + } + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, + buffer_handle, validation_error, + "%s: for dedicated memory allocation 0x%" PRIxLEAST64 + ", VkMemoryDedicatedAllocateInfoKHR::buffer 0x%" PRIXLEAST64 " must be equal to buffer 0x%" PRIxLEAST64 + " and memoryOffset 0x%" PRIxLEAST64 " must be zero.", + api_name, HandleToUint64(mem), HandleToUint64(mem_info->dedicated_buffer), buffer_handle, memoryOffset); } } @@ -3907,11 +3935,10 @@ if (usage & usage_list[i]) { if (SafeModulo(memoryOffset, offset_requirement[i]) != 0) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, - buffer_handle, __LINE__, msgCode[i], "DS", + buffer_handle, msgCode[i], "%s: %s memoryOffset is 0x%" PRIxLEAST64 - " but must be a multiple of device limit %s 0x%" PRIxLEAST64 ". %s", - api_name, memory_type[i], memoryOffset, offset_name[i], offset_requirement[i], - validation_error_map[msgCode[i]]); + " but must be a multiple of device limit %s 0x%" PRIxLEAST64 ".", + api_name, memory_type[i], memoryOffset, offset_name[i], offset_requirement[i]); } } } @@ -4301,16 +4328,18 @@ return skip; } -static void PostCallRecordDestroyDescriptorPool(layer_data *dev_data, VkDescriptorPool descriptorPool, - DESCRIPTOR_POOL_STATE *desc_pool_state, VK_OBJECT obj_struct) { - // Any bound cmd buffers are now invalid - invalidateCommandBuffers(dev_data, desc_pool_state->cb_bindings, obj_struct); - // Free sets that were in this pool - for (auto ds : desc_pool_state->sets) { - freeDescriptorSet(dev_data, ds); +static void PreCallRecordDestroyDescriptorPool(layer_data *dev_data, VkDescriptorPool descriptorPool, + DESCRIPTOR_POOL_STATE *desc_pool_state, VK_OBJECT obj_struct) { + if (desc_pool_state) { + // Any bound cmd buffers are now invalid + invalidateCommandBuffers(dev_data, desc_pool_state->cb_bindings, obj_struct); + // Free sets that were in this pool + for (auto ds : desc_pool_state->sets) { + freeDescriptorSet(dev_data, ds); + } + dev_data->descriptorPoolMap.erase(descriptorPool); + delete desc_pool_state; } - dev_data->descriptorPoolMap.erase(descriptorPool); - delete desc_pool_state; } VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, @@ -4321,14 +4350,12 @@ unique_lock_t lock(global_lock); bool skip = PreCallValidateDestroyDescriptorPool(dev_data, descriptorPool, &desc_pool_state, &obj_struct); if (!skip) { + PreCallRecordDestroyDescriptorPool(dev_data, descriptorPool, desc_pool_state, obj_struct); lock.unlock(); dev_data->dispatch_table.DestroyDescriptorPool(device, descriptorPool, pAllocator); - lock.lock(); - if (descriptorPool != VK_NULL_HANDLE) { - PostCallRecordDestroyDescriptorPool(dev_data, descriptorPool, desc_pool_state, obj_struct); - } } } + // Verify cmdBuffer in given cb_node is not in global in-flight set, and return skip result // If this is a secondary command buffer, then make sure its primary is also in-flight // If primary is not in-flight, then remove secondary from global in-flight set @@ -4338,9 +4365,9 @@ bool skip = false; if (cb_node->in_use.load()) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, error_code, "DS", - "Attempt to %s command buffer (0x%" PRIx64 ") which is in use. %s", action, - HandleToUint64(cb_node->commandBuffer), validation_error_map[error_code]); + HandleToUint64(cb_node->commandBuffer), error_code, + "Attempt to %s command buffer (0x%" PRIx64 ") which is in use.", action, + HandleToUint64(cb_node->commandBuffer)); } return skip; } @@ -4417,10 +4444,9 @@ if (pCreateInfo && pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) { if (!dev_data->enabled_features.pipelineStatisticsQuery) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, 0, - __LINE__, VALIDATION_ERROR_11c0062e, "DS", + VALIDATION_ERROR_11c0062e, "Query pool with type VK_QUERY_TYPE_PIPELINE_STATISTICS created on a device with " - "VkDeviceCreateInfo.pEnabledFeatures.pipelineStatisticsQuery == VK_FALSE. %s", - validation_error_map[VALIDATION_ERROR_11c0062e]); + "VkDeviceCreateInfo.pEnabledFeatures.pipelineStatisticsQuery == VK_FALSE."); } } @@ -4447,7 +4473,7 @@ return skip; } -static void PostCallRecordDestroyCommandPool(layer_data *dev_data, VkCommandPool pool) { +static void PreCallRecordDestroyCommandPool(layer_data *dev_data, VkCommandPool pool) { COMMAND_POOL_NODE *cp_state = GetCommandPoolNode(dev_data, pool); // Remove cmdpool from cmdpoolmap, after freeing layer data for the command buffers // "When a pool is destroyed, all command buffers allocated from the pool are freed." @@ -4465,12 +4491,9 @@ unique_lock_t lock(global_lock); bool skip = PreCallValidateDestroyCommandPool(dev_data, commandPool); if (!skip) { + PreCallRecordDestroyCommandPool(dev_data, commandPool); lock.unlock(); dev_data->dispatch_table.DestroyCommandPool(device, commandPool, pAllocator); - lock.lock(); - if (commandPool != VK_NULL_HANDLE) { - PostCallRecordDestroyCommandPool(dev_data, commandPool); - } } } @@ -4505,10 +4528,9 @@ for (uint32_t i = 0; i < fenceCount; ++i) { auto pFence = GetFenceNode(dev_data, pFences[i]); if (pFence && pFence->scope == kSyncScopeInternal && pFence->state == FENCE_INFLIGHT) { - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - HandleToUint64(pFences[i]), __LINE__, VALIDATION_ERROR_32e008c6, "DS", "Fence 0x%" PRIx64 " is in use. %s", - HandleToUint64(pFences[i]), validation_error_map[VALIDATION_ERROR_32e008c6]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, + HandleToUint64(pFences[i]), VALIDATION_ERROR_32e008c6, "Fence 0x%" PRIx64 " is in use.", + HandleToUint64(pFences[i])); } } lock.unlock(); @@ -4540,7 +4562,7 @@ for (auto cb_node : cb_nodes) { if (cb_node->state == CB_RECORDING) { log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_node->commandBuffer), __LINE__, DRAWSTATE_INVALID_COMMAND_BUFFER, "DS", + HandleToUint64(cb_node->commandBuffer), DRAWSTATE_INVALID_COMMAND_BUFFER, "Invalidating a command buffer that's currently being recorded: 0x%" PRIx64 ".", HandleToUint64(cb_node->commandBuffer)); cb_node->state = CB_INVALID_INCOMPLETE; @@ -4564,7 +4586,7 @@ bool skip = false; if (*framebuffer_state) { skip |= - ValidateObjectNotInUse(dev_data, *framebuffer_state, *obj_struct, "vkDestroyFrameBuffer", VALIDATION_ERROR_250006f8); + ValidateObjectNotInUse(dev_data, *framebuffer_state, *obj_struct, "vkDestroyFramebuffer", VALIDATION_ERROR_250006f8); } return skip; } @@ -4717,6 +4739,10 @@ const VkPhysicalDeviceFeatures *GetEnabledFeatures(const layer_data *device_data) { return &device_data->enabled_features; } +const VkPhysicalDeviceDescriptorIndexingFeaturesEXT *GetEnabledDescriptorIndexingFeatures(const layer_data *device_data) { + return &device_data->phys_dev_ext_props.descriptor_indexing_features; +} + const DeviceExtensions *GetDeviceExtensions(const layer_data *device_data) { return &device_data->extensions; } VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, @@ -4824,9 +4850,9 @@ for (uint32_t i = 0; i < srcCacheCount; i++) { if (src[i] == dst) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT, - 0, __LINE__, VALIDATION_ERROR_3e600c00, "DS", - "vkMergeValidationCachesEXT: dstCache (0x%" PRIx64 ") must not appear in pSrcCaches array. %s", - HandleToUint64(dstCache), validation_error_map[VALIDATION_ERROR_3e600c00]); + 0, VALIDATION_ERROR_3e600c00, + "vkMergeValidationCachesEXT: dstCache (0x%" PRIx64 ") must not appear in pSrcCaches array.", + HandleToUint64(dstCache)); result = VK_ERROR_VALIDATION_FAILED_EXT; } if (!skip) { @@ -4873,7 +4899,7 @@ (pipe_state->attachments[i].srcAlphaBlendFactor == VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - HandleToUint64(pipe_state->pipeline), __LINE__, DRAWSTATE_INVALID_FEATURE, "DS", + HandleToUint64(pipe_state->pipeline), DRAWSTATE_INVALID_FEATURE, "CmdBindPipeline: vkPipeline (0x%" PRIx64 ") attachment[" PRINTF_SIZE_T_SPECIFIER "] has a dual-source blend factor but this device feature is not enabled.", HandleToUint64(pipe_state->pipeline), i); @@ -4990,9 +5016,10 @@ static bool PreCallValidateCreateDescriptorSetLayout(layer_data *dev_data, const VkDescriptorSetLayoutCreateInfo *create_info) { if (dev_data->instance_data->disabled.create_descriptor_set_layout) return false; - return cvdescriptorset::DescriptorSetLayout::ValidateCreateInfo(dev_data->report_data, create_info, - dev_data->extensions.vk_khr_push_descriptor, - dev_data->phys_dev_ext_props.max_push_descriptors); + return cvdescriptorset::DescriptorSetLayout::ValidateCreateInfo( + dev_data->report_data, create_info, dev_data->extensions.vk_khr_push_descriptor, + dev_data->phys_dev_ext_props.max_push_descriptors, dev_data->extensions.vk_ext_descriptor_indexing, + &dev_data->phys_dev_ext_props.descriptor_indexing_features); } static void PostCallRecordCreateDescriptorSetLayout(layer_data *dev_data, const VkDescriptorSetLayoutCreateInfo *create_info, @@ -5032,38 +5059,36 @@ if (0 == strcmp(caller_name, "vkCreatePipelineLayout()")) { if (offset >= maxPushConstantsSize) { skip |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_11a0024c, "DS", - "%s call has push constants index %u with offset %u that exceeds this device's maxPushConstantSize of %u. %s", - caller_name, index, offset, maxPushConstantsSize, validation_error_map[VALIDATION_ERROR_11a0024c]); + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_11a0024c, + "%s call has push constants index %u with offset %u that exceeds this device's maxPushConstantSize of %u.", + caller_name, index, offset, maxPushConstantsSize); } if (size > maxPushConstantsSize - offset) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_11a00254, "DS", + VALIDATION_ERROR_11a00254, "%s call has push constants index %u with offset %u and size %u that exceeds this device's " - "maxPushConstantSize of %u. %s", - caller_name, index, offset, size, maxPushConstantsSize, - validation_error_map[VALIDATION_ERROR_11a00254]); + "maxPushConstantSize of %u.", + caller_name, index, offset, size, maxPushConstantsSize); } } else if (0 == strcmp(caller_name, "vkCmdPushConstants()")) { if (offset >= maxPushConstantsSize) { skip |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_1bc002e4, "DS", - "%s call has push constants index %u with offset %u that exceeds this device's maxPushConstantSize of %u. %s", - caller_name, index, offset, maxPushConstantsSize, validation_error_map[VALIDATION_ERROR_1bc002e4]); + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_1bc002e4, + "%s call has push constants index %u with offset %u that exceeds this device's maxPushConstantSize of %u.", + caller_name, index, offset, maxPushConstantsSize); } if (size > maxPushConstantsSize - offset) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1bc002e6, "DS", + VALIDATION_ERROR_1bc002e6, "%s call has push constants index %u with offset %u and size %u that exceeds this device's " - "maxPushConstantSize of %u. %s", - caller_name, index, offset, size, maxPushConstantsSize, - validation_error_map[VALIDATION_ERROR_1bc002e6]); + "maxPushConstantSize of %u.", + caller_name, index, offset, size, maxPushConstantsSize); } } else { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_INTERNAL_ERROR, "DS", "%s caller not supported.", caller_name); + DRAWSTATE_INTERNAL_ERROR, "%s caller not supported.", caller_name); } } // size needs to be non-zero and a multiple of 4. @@ -5071,49 +5096,48 @@ if (0 == strcmp(caller_name, "vkCreatePipelineLayout()")) { if (size == 0) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_11a00250, "DS", - "%s call has push constants index %u with size %u. Size must be greater than zero. %s", caller_name, - index, size, validation_error_map[VALIDATION_ERROR_11a00250]); + VALIDATION_ERROR_11a00250, + "%s call has push constants index %u with size %u. Size must be greater than zero.", caller_name, + index, size); } if (size & 0x3) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_11a00252, "DS", - "%s call has push constants index %u with size %u. Size must be a multiple of 4. %s", caller_name, - index, size, validation_error_map[VALIDATION_ERROR_11a00252]); + VALIDATION_ERROR_11a00252, + "%s call has push constants index %u with size %u. Size must be a multiple of 4.", caller_name, + index, size); } } else if (0 == strcmp(caller_name, "vkCmdPushConstants()")) { if (size == 0) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1bc2c21b, "DS", - "%s call has push constants index %u with size %u. Size must be greater than zero. %s", caller_name, - index, size, validation_error_map[VALIDATION_ERROR_1bc2c21b]); + VALIDATION_ERROR_1bc2c21b, + "%s call has push constants index %u with size %u. Size must be greater than zero.", caller_name, + index, size); } if (size & 0x3) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1bc002e2, "DS", - "%s call has push constants index %u with size %u. Size must be a multiple of 4. %s", caller_name, - index, size, validation_error_map[VALIDATION_ERROR_1bc002e2]); + VALIDATION_ERROR_1bc002e2, + "%s call has push constants index %u with size %u. Size must be a multiple of 4.", caller_name, + index, size); } } else { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_INTERNAL_ERROR, "DS", "%s caller not supported.", caller_name); + DRAWSTATE_INTERNAL_ERROR, "%s caller not supported.", caller_name); } } // offset needs to be a multiple of 4. if ((offset & 0x3) != 0) { if (0 == strcmp(caller_name, "vkCreatePipelineLayout()")) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_11a0024e, "DS", - "%s call has push constants index %u with offset %u. Offset must be a multiple of 4. %s", caller_name, - index, offset, validation_error_map[VALIDATION_ERROR_11a0024e]); + VALIDATION_ERROR_11a0024e, + "%s call has push constants index %u with offset %u. Offset must be a multiple of 4.", caller_name, + index, offset); } else if (0 == strcmp(caller_name, "vkCmdPushConstants()")) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1bc002e0, "DS", - "%s call has push constants with offset %u. Offset must be a multiple of 4. %s", caller_name, offset, - validation_error_map[VALIDATION_ERROR_1bc002e0]); + VALIDATION_ERROR_1bc002e0, "%s call has push constants with offset %u. Offset must be a multiple of 4.", + caller_name, offset); } else { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_INTERNAL_ERROR, "DS", "%s caller not supported.", caller_name); + DRAWSTATE_INTERNAL_ERROR, "%s caller not supported.", caller_name); } } return skip; @@ -5132,7 +5156,8 @@ // Used by PreCallValiateCreatePipelineLayout. // Returns an array of size DSL_NUM_DESCRIPTOR_GROUPS of the maximum number of descriptors used in any single pipeline stage std::valarray GetDescriptorCountMaxPerStage( - const layer_data *dev_data, const std::vector> set_layouts) { + const layer_data *dev_data, const std::vector> set_layouts, + bool skip_update_after_bind) { // Identify active pipeline stages std::vector stage_flags = {VK_SHADER_STAGE_VERTEX_BIT, VK_SHADER_STAGE_FRAGMENT_BIT, VK_SHADER_STAGE_COMPUTE_BIT}; @@ -5153,6 +5178,11 @@ for (auto stage : stage_flags) { std::valarray stage_sum(0U, DSL_NUM_DESCRIPTOR_GROUPS); // per-stage sums for (auto dsl : set_layouts) { + if (skip_update_after_bind && + (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); if (0 != (stage & binding->stageFlags)) { @@ -5196,31 +5226,21 @@ return max_sum; } -// Used by PreCallValiateCreatePipelineLayout. -// Returns an array of size VK_DESCRIPTOR_TYPE_RANGE_SIZE of the summed descriptors by type across all pipeline stages -std::valarray GetDescriptorSumAcrossStages( - const layer_data *dev_data, const std::vector> set_layouts) { - // Identify active pipeline stages - std::vector stage_flags = {VK_SHADER_STAGE_VERTEX_BIT, VK_SHADER_STAGE_FRAGMENT_BIT, - VK_SHADER_STAGE_COMPUTE_BIT}; - if (dev_data->enabled_features.geometryShader) { - stage_flags.push_back(VK_SHADER_STAGE_GEOMETRY_BIT); - } - if (dev_data->enabled_features.tessellationShader) { - stage_flags.push_back(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT); - stage_flags.push_back(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT); - } - - // Sum by descriptor type across all enabled stages +// Used by PreCallValidateCreatePipelineLayout. +// Returns an array of size VK_DESCRIPTOR_TYPE_RANGE_SIZE of the summed descriptors by type. +// Note: descriptors only count against the limit once even if used by multiple stages. +std::valarray GetDescriptorSum( + const layer_data *dev_data, const std::vector> &set_layouts, + bool skip_update_after_bind) { std::valarray sum_by_type(0U, VK_DESCRIPTOR_TYPE_RANGE_SIZE); - for (auto stage : stage_flags) { - for (auto dsl : set_layouts) { - for (uint32_t binding_idx = 0; binding_idx < dsl->GetBindingCount(); binding_idx++) { - const VkDescriptorSetLayoutBinding *binding = dsl->GetDescriptorSetLayoutBindingPtrFromIndex(binding_idx); - if (0 != (stage & binding->stageFlags)) { - sum_by_type[binding->descriptorType] += binding->descriptorCount; - } - } + for (auto dsl : set_layouts) { + if (skip_update_after_bind && (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); + sum_by_type[binding->descriptorType] += binding->descriptorCount; } } return sum_by_type; @@ -5231,12 +5251,10 @@ // Validate layout count against device physical limit if (pCreateInfo->setLayoutCount > dev_data->phys_dev_props.limits.maxBoundDescriptorSets) { - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe0023c, "DS", - "vkCreatePipelineLayout(): setLayoutCount (%d) exceeds physical device maxBoundDescriptorSets limit (%d). %s", - pCreateInfo->setLayoutCount, dev_data->phys_dev_props.limits.maxBoundDescriptorSets, - validation_error_map[VALIDATION_ERROR_0fe0023c]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe0023c, + "vkCreatePipelineLayout(): setLayoutCount (%d) exceeds physical device maxBoundDescriptorSets limit (%d).", + pCreateInfo->setLayoutCount, dev_data->phys_dev_props.limits.maxBoundDescriptorSets); } // Validate Push Constant ranges @@ -5246,8 +5264,7 @@ pCreateInfo->pPushConstantRanges[i].size, "vkCreatePipelineLayout()", i); if (0 == pCreateInfo->pPushConstantRanges[i].stageFlags) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_11a2dc03, "DS", "vkCreatePipelineLayout() call has no stageFlags set. %s", - validation_error_map[VALIDATION_ERROR_11a2dc03]); + VALIDATION_ERROR_11a2dc03, "vkCreatePipelineLayout() call has no stageFlags set."); } } @@ -5256,9 +5273,8 @@ for (j = i + 1; j < pCreateInfo->pushConstantRangeCount; ++j) { if (0 != (pCreateInfo->pPushConstantRanges[i].stageFlags & pCreateInfo->pPushConstantRanges[j].stageFlags)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_0fe00248, "DS", - "vkCreatePipelineLayout() Duplicate stage flags found in ranges %d and %d. %s", i, j, - validation_error_map[VALIDATION_ERROR_0fe00248]); + VALIDATION_ERROR_0fe00248, + "vkCreatePipelineLayout() Duplicate stage flags found in ranges %d and %d.", i, j); } } } @@ -5277,178 +5293,382 @@ } // Unlock if (push_descriptor_set_count > 1) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe0024a, "DS", "vkCreatePipelineLayout() Multiple push descriptor sets found. %s", - validation_error_map[VALIDATION_ERROR_0fe0024a]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe0024a, "vkCreatePipelineLayout() Multiple push descriptor sets found."); } // Max descriptors by type, within a single pipeline stage - std::valarray max_descriptors_per_stage = GetDescriptorCountMaxPerStage(dev_data, set_layouts); + std::valarray max_descriptors_per_stage = GetDescriptorCountMaxPerStage(dev_data, set_layouts, true); // Samplers if (max_descriptors_per_stage[DSL_TYPE_SAMPLERS] > dev_data->phys_dev_props.limits.maxPerStageDescriptorSamplers) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe0023e, "DS", - "vkCreatePipelineLayout(): max per-stage sampler bindings count (%d) exceeds device " - "maxPerStageDescriptorSamplers limit (%d). %s", - max_descriptors_per_stage[DSL_TYPE_SAMPLERS], dev_data->phys_dev_props.limits.maxPerStageDescriptorSamplers, - validation_error_map[VALIDATION_ERROR_0fe0023e]); + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe0023e, + "vkCreatePipelineLayout(): max per-stage sampler bindings count (%d) exceeds device " + "maxPerStageDescriptorSamplers limit (%d).", + max_descriptors_per_stage[DSL_TYPE_SAMPLERS], dev_data->phys_dev_props.limits.maxPerStageDescriptorSamplers); } // Uniform buffers if (max_descriptors_per_stage[DSL_TYPE_UNIFORM_BUFFERS] > dev_data->phys_dev_props.limits.maxPerStageDescriptorUniformBuffers) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00240, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00240, "vkCreatePipelineLayout(): max per-stage uniform buffer bindings count (%d) exceeds device " - "maxPerStageDescriptorUniformBuffers limit (%d). %s", + "maxPerStageDescriptorUniformBuffers limit (%d).", max_descriptors_per_stage[DSL_TYPE_UNIFORM_BUFFERS], - dev_data->phys_dev_props.limits.maxPerStageDescriptorUniformBuffers, - validation_error_map[VALIDATION_ERROR_0fe00240]); + dev_data->phys_dev_props.limits.maxPerStageDescriptorUniformBuffers); } // Storage buffers if (max_descriptors_per_stage[DSL_TYPE_STORAGE_BUFFERS] > dev_data->phys_dev_props.limits.maxPerStageDescriptorStorageBuffers) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00242, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00242, "vkCreatePipelineLayout(): max per-stage storage buffer bindings count (%d) exceeds device " - "maxPerStageDescriptorStorageBuffers limit (%d). %s", + "maxPerStageDescriptorStorageBuffers limit (%d).", max_descriptors_per_stage[DSL_TYPE_STORAGE_BUFFERS], - dev_data->phys_dev_props.limits.maxPerStageDescriptorStorageBuffers, - validation_error_map[VALIDATION_ERROR_0fe00242]); + dev_data->phys_dev_props.limits.maxPerStageDescriptorStorageBuffers); } // Sampled images if (max_descriptors_per_stage[DSL_TYPE_SAMPLED_IMAGES] > dev_data->phys_dev_props.limits.maxPerStageDescriptorSampledImages) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00244, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00244, "vkCreatePipelineLayout(): max per-stage sampled image bindings count (%d) exceeds device " - "maxPerStageDescriptorSampledImages limit (%d). %s", + "maxPerStageDescriptorSampledImages limit (%d).", max_descriptors_per_stage[DSL_TYPE_SAMPLED_IMAGES], - dev_data->phys_dev_props.limits.maxPerStageDescriptorSampledImages, - validation_error_map[VALIDATION_ERROR_0fe00244]); + dev_data->phys_dev_props.limits.maxPerStageDescriptorSampledImages); } // Storage images if (max_descriptors_per_stage[DSL_TYPE_STORAGE_IMAGES] > dev_data->phys_dev_props.limits.maxPerStageDescriptorStorageImages) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00246, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00246, "vkCreatePipelineLayout(): max per-stage storage image bindings count (%d) exceeds device " - "maxPerStageDescriptorStorageImages limit (%d). %s", + "maxPerStageDescriptorStorageImages limit (%d).", max_descriptors_per_stage[DSL_TYPE_STORAGE_IMAGES], - dev_data->phys_dev_props.limits.maxPerStageDescriptorStorageImages, - validation_error_map[VALIDATION_ERROR_0fe00246]); + dev_data->phys_dev_props.limits.maxPerStageDescriptorStorageImages); } // Input attachments if (max_descriptors_per_stage[DSL_TYPE_INPUT_ATTACHMENTS] > dev_data->phys_dev_props.limits.maxPerStageDescriptorInputAttachments) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00d18, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00d18, "vkCreatePipelineLayout(): max per-stage input attachment bindings count (%d) exceeds device " - "maxPerStageDescriptorInputAttachments limit (%d). %s", + "maxPerStageDescriptorInputAttachments limit (%d).", max_descriptors_per_stage[DSL_TYPE_INPUT_ATTACHMENTS], - dev_data->phys_dev_props.limits.maxPerStageDescriptorInputAttachments, - validation_error_map[VALIDATION_ERROR_0fe00d18]); + dev_data->phys_dev_props.limits.maxPerStageDescriptorInputAttachments); } - // Total descriptors by type, summed across all pipeline stages + // Total descriptors by type // - std::valarray sum_all_stages = GetDescriptorSumAcrossStages(dev_data, set_layouts); + std::valarray sum_all_stages = GetDescriptorSum(dev_data, set_layouts, true); // Samplers - if ((sum_all_stages[VK_DESCRIPTOR_TYPE_SAMPLER] + sum_all_stages[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER]) > - dev_data->phys_dev_props.limits.maxDescriptorSetSamplers) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00d1a, "DS", + uint32_t sum = sum_all_stages[VK_DESCRIPTOR_TYPE_SAMPLER] + sum_all_stages[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER]; + if (sum > dev_data->phys_dev_props.limits.maxDescriptorSetSamplers) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00d1a, "vkCreatePipelineLayout(): sum of sampler bindings among all stages (%d) exceeds device " - "maxDescriptorSetSamplers limit (%d). %s", - sum_all_stages[VK_DESCRIPTOR_TYPE_SAMPLER] + sum_all_stages[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER], - dev_data->phys_dev_props.limits.maxDescriptorSetSamplers, validation_error_map[VALIDATION_ERROR_0fe00d1a]); + "maxDescriptorSetSamplers limit (%d).", + sum, dev_data->phys_dev_props.limits.maxDescriptorSetSamplers); } // Uniform buffers if (sum_all_stages[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER] > dev_data->phys_dev_props.limits.maxDescriptorSetUniformBuffers) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00d1c, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00d1c, "vkCreatePipelineLayout(): sum of uniform buffer bindings among all stages (%d) exceeds device " - "maxDescriptorSetUniformBuffers limit (%d). %s", + "maxDescriptorSetUniformBuffers limit (%d).", sum_all_stages[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER], - dev_data->phys_dev_props.limits.maxDescriptorSetUniformBuffers, - validation_error_map[VALIDATION_ERROR_0fe00d1c]); + dev_data->phys_dev_props.limits.maxDescriptorSetUniformBuffers); } // Dynamic uniform buffers if (sum_all_stages[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC] > dev_data->phys_dev_props.limits.maxDescriptorSetUniformBuffersDynamic) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00d1e, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00d1e, "vkCreatePipelineLayout(): sum of dynamic uniform buffer bindings among all stages (%d) exceeds device " - "maxDescriptorSetUniformBuffersDynamic limit (%d). %s", + "maxDescriptorSetUniformBuffersDynamic limit (%d).", sum_all_stages[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC], - dev_data->phys_dev_props.limits.maxDescriptorSetUniformBuffersDynamic, - validation_error_map[VALIDATION_ERROR_0fe00d1e]); + dev_data->phys_dev_props.limits.maxDescriptorSetUniformBuffersDynamic); } // Storage buffers if (sum_all_stages[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER] > dev_data->phys_dev_props.limits.maxDescriptorSetStorageBuffers) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00d20, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00d20, "vkCreatePipelineLayout(): sum of storage buffer bindings among all stages (%d) exceeds device " - "maxDescriptorSetStorageBuffers limit (%d). %s", + "maxDescriptorSetStorageBuffers limit (%d).", sum_all_stages[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER], - dev_data->phys_dev_props.limits.maxDescriptorSetStorageBuffers, - validation_error_map[VALIDATION_ERROR_0fe00d20]); + dev_data->phys_dev_props.limits.maxDescriptorSetStorageBuffers); } // Dynamic storage buffers if (sum_all_stages[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC] > dev_data->phys_dev_props.limits.maxDescriptorSetStorageBuffersDynamic) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00d22, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00d22, "vkCreatePipelineLayout(): sum of dynamic storage buffer bindings among all stages (%d) exceeds device " - "maxDescriptorSetStorageBuffersDynamic limit (%d). %s", + "maxDescriptorSetStorageBuffersDynamic limit (%d).", sum_all_stages[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC], - dev_data->phys_dev_props.limits.maxDescriptorSetStorageBuffersDynamic, - validation_error_map[VALIDATION_ERROR_0fe00d22]); + dev_data->phys_dev_props.limits.maxDescriptorSetStorageBuffersDynamic); } // Sampled images - if ((sum_all_stages[VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE] + sum_all_stages[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] + - sum_all_stages[VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER]) > dev_data->phys_dev_props.limits.maxDescriptorSetSampledImages) { - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00d24, "DS", - "vkCreatePipelineLayout(): sum of sampled image bindings among all stages (%d) exceeds device " - "maxDescriptorSetSampledImages limit (%d). %s", - sum_all_stages[VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE] + sum_all_stages[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] + - sum_all_stages[VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER], - dev_data->phys_dev_props.limits.maxDescriptorSetSampledImages, validation_error_map[VALIDATION_ERROR_0fe00d24]); + sum = sum_all_stages[VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE] + sum_all_stages[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] + + sum_all_stages[VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER]; + if (sum > dev_data->phys_dev_props.limits.maxDescriptorSetSampledImages) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00d24, + "vkCreatePipelineLayout(): sum of sampled image bindings among all stages (%d) exceeds device " + "maxDescriptorSetSampledImages limit (%d).", + sum, dev_data->phys_dev_props.limits.maxDescriptorSetSampledImages); } // Storage images - if ((sum_all_stages[VK_DESCRIPTOR_TYPE_STORAGE_IMAGE] + sum_all_stages[VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER]) > - dev_data->phys_dev_props.limits.maxDescriptorSetStorageImages) { - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00d26, "DS", - "vkCreatePipelineLayout(): sum of storage image bindings among all stages (%d) exceeds device " - "maxDescriptorSetStorageImages limit (%d). %s", - sum_all_stages[VK_DESCRIPTOR_TYPE_STORAGE_IMAGE] + sum_all_stages[VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER], - dev_data->phys_dev_props.limits.maxDescriptorSetStorageImages, validation_error_map[VALIDATION_ERROR_0fe00d26]); + sum = sum_all_stages[VK_DESCRIPTOR_TYPE_STORAGE_IMAGE] + sum_all_stages[VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER]; + if (sum > dev_data->phys_dev_props.limits.maxDescriptorSetStorageImages) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00d26, + "vkCreatePipelineLayout(): sum of storage image bindings among all stages (%d) exceeds device " + "maxDescriptorSetStorageImages limit (%d).", + sum, dev_data->phys_dev_props.limits.maxDescriptorSetStorageImages); } // Input attachments if (sum_all_stages[VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT] > dev_data->phys_dev_props.limits.maxDescriptorSetInputAttachments) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0fe00d28, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe00d28, "vkCreatePipelineLayout(): sum of input attachment bindings among all stages (%d) exceeds device " - "maxDescriptorSetInputAttachments limit (%d). %s", + "maxDescriptorSetInputAttachments limit (%d).", sum_all_stages[VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT], - dev_data->phys_dev_props.limits.maxDescriptorSetInputAttachments, - validation_error_map[VALIDATION_ERROR_0fe00d28]); + dev_data->phys_dev_props.limits.maxDescriptorSetInputAttachments); } + if (dev_data->extensions.vk_ext_descriptor_indexing) { + // XXX TODO: replace with correct VU messages + + // Max descriptors by type, within a single pipeline stage + std::valarray max_descriptors_per_stage_update_after_bind = + GetDescriptorCountMaxPerStage(dev_data, set_layouts, false); + // Samplers + if (max_descriptors_per_stage_update_after_bind[DSL_TYPE_SAMPLERS] > + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxPerStageDescriptorUpdateAfterBindSamplers) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe0179c, + "vkCreatePipelineLayout(): max per-stage sampler bindings count (%d) exceeds device " + "maxPerStageDescriptorUpdateAfterBindSamplers limit (%d).", + max_descriptors_per_stage_update_after_bind[DSL_TYPE_SAMPLERS], + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxPerStageDescriptorUpdateAfterBindSamplers); + } + + // Uniform buffers + if (max_descriptors_per_stage_update_after_bind[DSL_TYPE_UNIFORM_BUFFERS] > + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxPerStageDescriptorUpdateAfterBindUniformBuffers) { + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe0179e, + "vkCreatePipelineLayout(): max per-stage uniform buffer bindings count (%d) exceeds device " + "maxPerStageDescriptorUpdateAfterBindUniformBuffers limit (%d).", + max_descriptors_per_stage_update_after_bind[DSL_TYPE_UNIFORM_BUFFERS], + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxPerStageDescriptorUpdateAfterBindUniformBuffers); + } + + // Storage buffers + if (max_descriptors_per_stage_update_after_bind[DSL_TYPE_STORAGE_BUFFERS] > + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxPerStageDescriptorUpdateAfterBindStorageBuffers) { + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe017a0, + "vkCreatePipelineLayout(): max per-stage storage buffer bindings count (%d) exceeds device " + "maxPerStageDescriptorUpdateAfterBindStorageBuffers limit (%d).", + max_descriptors_per_stage_update_after_bind[DSL_TYPE_STORAGE_BUFFERS], + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxPerStageDescriptorUpdateAfterBindStorageBuffers); + } + + // Sampled images + if (max_descriptors_per_stage_update_after_bind[DSL_TYPE_SAMPLED_IMAGES] > + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxPerStageDescriptorUpdateAfterBindSampledImages) { + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe017a2, + "vkCreatePipelineLayout(): max per-stage sampled image bindings count (%d) exceeds device " + "maxPerStageDescriptorUpdateAfterBindSampledImages limit (%d).", + max_descriptors_per_stage_update_after_bind[DSL_TYPE_SAMPLED_IMAGES], + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxPerStageDescriptorUpdateAfterBindSampledImages); + } + + // Storage images + if (max_descriptors_per_stage_update_after_bind[DSL_TYPE_STORAGE_IMAGES] > + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxPerStageDescriptorUpdateAfterBindStorageImages) { + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe017a4, + "vkCreatePipelineLayout(): max per-stage storage image bindings count (%d) exceeds device " + "maxPerStageDescriptorUpdateAfterBindStorageImages limit (%d).", + max_descriptors_per_stage_update_after_bind[DSL_TYPE_STORAGE_IMAGES], + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxPerStageDescriptorUpdateAfterBindStorageImages); + } + + // Input attachments + if (max_descriptors_per_stage_update_after_bind[DSL_TYPE_INPUT_ATTACHMENTS] > + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxPerStageDescriptorUpdateAfterBindInputAttachments) { + skip |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe017a6, + "vkCreatePipelineLayout(): max per-stage input attachment bindings count (%d) exceeds device " + "maxPerStageDescriptorUpdateAfterBindInputAttachments limit (%d).", + max_descriptors_per_stage_update_after_bind[DSL_TYPE_INPUT_ATTACHMENTS], + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxPerStageDescriptorUpdateAfterBindInputAttachments); + } + + // Total descriptors by type, summed across all pipeline stages + // + std::valarray sum_all_stages_update_after_bind = GetDescriptorSum(dev_data, set_layouts, false); + // Samplers + sum = sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_SAMPLER] + + sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER]; + if (sum > dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindSamplers) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe017b8, + "vkCreatePipelineLayout(): sum of sampler bindings among all stages (%d) exceeds device " + "maxDescriptorSetUpdateAfterBindSamplers limit (%d).", + sum, dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindSamplers); + } + + // Uniform buffers + if (sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER] > + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindUniformBuffers) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe017ba, + "vkCreatePipelineLayout(): sum of uniform buffer bindings among all stages (%d) exceeds device " + "maxDescriptorSetUpdateAfterBindUniformBuffers limit (%d).", + sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER], + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindUniformBuffers); + } + + // Dynamic uniform buffers + if (sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC] > + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic) { + skip |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe017bc, + "vkCreatePipelineLayout(): sum of dynamic uniform buffer bindings among all stages (%d) exceeds device " + "maxDescriptorSetUpdateAfterBindUniformBuffersDynamic limit (%d).", + sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC], + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic); + } + + // Storage buffers + if (sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER] > + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindStorageBuffers) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe017be, + "vkCreatePipelineLayout(): sum of storage buffer bindings among all stages (%d) exceeds device " + "maxDescriptorSetUpdateAfterBindStorageBuffers limit (%d).", + sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER], + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindStorageBuffers); + } + + // Dynamic storage buffers + if (sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC] > + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic) { + skip |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe017c0, + "vkCreatePipelineLayout(): sum of dynamic storage buffer bindings among all stages (%d) exceeds device " + "maxDescriptorSetUpdateAfterBindStorageBuffersDynamic limit (%d).", + sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC], + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic); + } + + // Sampled images + sum = sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE] + + sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] + + sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER]; + if (sum > dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindSampledImages) { + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe017c2, + "vkCreatePipelineLayout(): sum of sampled image bindings among all stages (%d) exceeds device " + "maxDescriptorSetUpdateAfterBindSampledImages limit (%d).", + sum, dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindSampledImages); + } + + // Storage images + sum = sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_STORAGE_IMAGE] + + sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER]; + if (sum > dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindStorageImages) { + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe017c4, + "vkCreatePipelineLayout(): sum of storage image bindings among all stages (%d) exceeds device " + "maxDescriptorSetUpdateAfterBindStorageImages limit (%d).", + sum, dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindStorageImages); + } + + // Input attachments + if (sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT] > + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindInputAttachments) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0fe017c6, + "vkCreatePipelineLayout(): sum of input attachment bindings among all stages (%d) exceeds device " + "maxDescriptorSetUpdateAfterBindInputAttachments limit (%d).", + sum_all_stages_update_after_bind[VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT], + dev_data->phys_dev_ext_props.descriptor_indexing_props.maxDescriptorSetUpdateAfterBindInputAttachments); + } + } return skip; } +// For repeatable sorting, not very useful for "memory in range" search +struct PushConstantRangeCompare { + bool operator()(const VkPushConstantRange *lhs, const VkPushConstantRange *rhs) const { + if (lhs->offset == rhs->offset) { + if (lhs->size == rhs->size) { + // The comparison is arbitrary, but avoids false aliasing by comparing all fields. + return lhs->stageFlags < rhs->stageFlags; + } + // If the offsets are the same then sorting by the end of range is useful for validation + return lhs->size < rhs->size; + } + return lhs->offset < rhs->offset; + } +}; + +static PushConstantRangesDict push_constant_ranges_dict; + +PushConstantRangesId get_canonical_id(const VkPipelineLayoutCreateInfo *info) { + if (!info->pPushConstantRanges) { + // Hand back the empty entry (creating as needed)... + return push_constant_ranges_dict.look_up(PushConstantRanges()); + } + + // Sort the input ranges to ensure equivalent ranges map to the same id + std::set sorted; + for (uint32_t i = 0; i < info->pushConstantRangeCount; i++) { + sorted.insert(info->pPushConstantRanges + i); + } + + PushConstantRanges ranges(sorted.size()); + for (const auto range : sorted) { + ranges.emplace_back(*range); + } + return push_constant_ranges_dict.look_up(std::move(ranges)); +} + +// Dictionary of canoncial form of the pipeline set layout of descriptor set layouts +static PipelineLayoutSetLayoutsDict pipeline_layout_set_layouts_dict; + +// Dictionary of canonical form of the "compatible for set" records +static PipelineLayoutCompatDict pipeline_layout_compat_dict; + +static PipelineLayoutCompatId get_canonical_id(const uint32_t set_index, const PushConstantRangesId pcr_id, + const PipelineLayoutSetLayoutsId set_layouts_id) { + return pipeline_layout_compat_dict.look_up(PipelineLayoutCompatDef(set_index, pcr_id, set_layouts_id)); +} + static void PostCallRecordCreatePipelineLayout(layer_data *dev_data, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkPipelineLayout *pPipelineLayout) { unique_lock_t lock(global_lock); // Lock while accessing state @@ -5456,13 +5676,22 @@ PIPELINE_LAYOUT_NODE &plNode = dev_data->pipelineLayoutMap[*pPipelineLayout]; plNode.layout = *pPipelineLayout; plNode.set_layouts.resize(pCreateInfo->setLayoutCount); + PipelineLayoutSetLayoutsDef set_layouts(pCreateInfo->setLayoutCount); for (uint32_t i = 0; i < pCreateInfo->setLayoutCount; ++i) { plNode.set_layouts[i] = GetDescriptorSetLayout(dev_data, pCreateInfo->pSetLayouts[i]); + set_layouts[i] = plNode.set_layouts[i]->get_layout_id(); } - plNode.push_constant_ranges.resize(pCreateInfo->pushConstantRangeCount); - for (uint32_t i = 0; i < pCreateInfo->pushConstantRangeCount; ++i) { - plNode.push_constant_ranges[i] = pCreateInfo->pPushConstantRanges[i]; + + // Get canonical form IDs for the "compatible for set" contents + plNode.push_constant_ranges = get_canonical_id(pCreateInfo); + auto set_layouts_id = pipeline_layout_set_layouts_dict.look_up(set_layouts); + plNode.compat_for_set.reserve(pCreateInfo->setLayoutCount); + + // Create table of "compatible for set N" cannonical forms for trivial accept validation + for (uint32_t i = 0; i < pCreateInfo->setLayoutCount; ++i) { + plNode.compat_for_set.emplace_back(get_canonical_id(i, plNode.push_constant_ranges, set_layouts_id)); } + // Implicit unlock }; @@ -5489,7 +5718,7 @@ DESCRIPTOR_POOL_STATE *pNewNode = new DESCRIPTOR_POOL_STATE(*pDescriptorPool, pCreateInfo); if (NULL == pNewNode) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - HandleToUint64(*pDescriptorPool), __LINE__, DRAWSTATE_OUT_OF_MEMORY, "DS", + HandleToUint64(*pDescriptorPool), DRAWSTATE_OUT_OF_MEMORY, "Out of memory while attempting to allocate DESCRIPTOR_POOL_STATE in vkCreateDescriptorPool()")) return VK_ERROR_VALIDATION_FAILED_EXT; } else { @@ -5569,10 +5798,9 @@ if (pool_state && !(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT & pool_state->createInfo.flags)) { // Can't Free from a NON_FREE pool skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - HandleToUint64(pool), __LINE__, VALIDATION_ERROR_28600270, "DS", + HandleToUint64(pool), VALIDATION_ERROR_28600270, "It is invalid to call vkFreeDescriptorSets() with a pool created without setting " - "VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT. %s", - validation_error_map[VALIDATION_ERROR_28600270]); + "VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT."); } return skip; } @@ -5707,10 +5935,10 @@ // This implicitly resets the Cmd Buffer so make sure any fence is done and then clear memory references if (cb_node->in_use.load()) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_16e00062, "MEM", + HandleToUint64(commandBuffer), VALIDATION_ERROR_16e00062, "Calling vkBeginCommandBuffer() on active command buffer %" PRIx64 - " before it has completed. You must check command buffer fence before this call. %s", - HandleToUint64(commandBuffer), validation_error_map[VALIDATION_ERROR_16e00062]); + " before it has completed. You must check command buffer fence before this call.", + HandleToUint64(commandBuffer)); } clear_cmd_buf_and_mem_references(dev_data, cb_node); if (cb_node->createInfo.level != VK_COMMAND_BUFFER_LEVEL_PRIMARY) { @@ -5719,9 +5947,9 @@ if (!pInfo) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_16e00066, "DS", - "vkBeginCommandBuffer(): Secondary Command Buffer (0x%" PRIx64 ") must have inheritance info. %s", - HandleToUint64(commandBuffer), validation_error_map[VALIDATION_ERROR_16e00066]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_16e00066, + "vkBeginCommandBuffer(): Secondary Command Buffer (0x%" PRIx64 ") must have inheritance info.", + HandleToUint64(commandBuffer)); } else { if (pBeginInfo->flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) { assert(pInfo->renderPass); @@ -5742,12 +5970,12 @@ if ((pInfo->occlusionQueryEnable == VK_FALSE || dev_data->enabled_features.occlusionQueryPrecise == VK_FALSE) && (pInfo->queryFlags & VK_QUERY_CONTROL_PRECISE_BIT)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(commandBuffer), __LINE__, - VALIDATION_ERROR_16e00068, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(commandBuffer), + VALIDATION_ERROR_16e00068, "vkBeginCommandBuffer(): Secondary Command Buffer (0x%" PRIx64 ") must not have VK_QUERY_CONTROL_PRECISE_BIT if occulusionQuery is disabled or the device " - "does not support precise occlusion queries. %s", - HandleToUint64(commandBuffer), validation_error_map[VALIDATION_ERROR_16e00068]); + "does not support precise occlusion queries.", + HandleToUint64(commandBuffer)); } } if (pInfo && pInfo->renderPass != VK_NULL_HANDLE) { @@ -5755,33 +5983,32 @@ if (renderPass) { if (pInfo->subpass >= renderPass->createInfo.subpassCount) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(commandBuffer), __LINE__, - VALIDATION_ERROR_0280006c, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(commandBuffer), + VALIDATION_ERROR_0280006c, "vkBeginCommandBuffer(): Secondary Command Buffers (0x%" PRIx64 - ") must have a subpass index (%d) that is less than the number of subpasses (%d). %s", - HandleToUint64(commandBuffer), pInfo->subpass, renderPass->createInfo.subpassCount, - validation_error_map[VALIDATION_ERROR_0280006c]); + ") must have a subpass index (%d) that is less than the number of subpasses (%d).", + HandleToUint64(commandBuffer), pInfo->subpass, renderPass->createInfo.subpassCount); } } } } if (CB_RECORDING == cb_node->state) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_16e00062, "DS", + HandleToUint64(commandBuffer), VALIDATION_ERROR_16e00062, "vkBeginCommandBuffer(): Cannot call Begin on command buffer (0x%" PRIx64 - ") in the RECORDING state. Must first call vkEndCommandBuffer(). %s", - HandleToUint64(commandBuffer), validation_error_map[VALIDATION_ERROR_16e00062]); + ") in the RECORDING state. Must first call vkEndCommandBuffer().", + HandleToUint64(commandBuffer)); } else if (CB_RECORDED == cb_node->state || CB_INVALID_COMPLETE == cb_node->state) { VkCommandPool cmdPool = cb_node->createInfo.commandPool; auto pPool = GetCommandPoolNode(dev_data, cmdPool); if (!(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT & pPool->createFlags)) { - skip |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_16e00064, "DS", - "Call to vkBeginCommandBuffer() on command buffer (0x%" PRIx64 - ") attempts to implicitly reset cmdBuffer created from command pool (0x%" PRIx64 - ") that does NOT have the VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT bit set. %s", - HandleToUint64(commandBuffer), HandleToUint64(cmdPool), validation_error_map[VALIDATION_ERROR_16e00064]); + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_16e00064, + "Call to vkBeginCommandBuffer() on command buffer (0x%" PRIx64 + ") attempts to implicitly reset cmdBuffer created from command pool (0x%" PRIx64 + ") that does NOT have the VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT bit set.", + HandleToUint64(commandBuffer), HandleToUint64(cmdPool)); } ResetCommandBufferState(dev_data, commandBuffer); } @@ -5832,9 +6059,9 @@ skip |= ValidateCmd(dev_data, pCB, CMD_ENDCOMMANDBUFFER, "vkEndCommandBuffer()"); for (auto query : pCB->activeQueries) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_2740007a, "DS", - "Ending command buffer with in progress query: queryPool 0x%" PRIx64 ", index %d. %s", - HandleToUint64(query.pool), query.index, validation_error_map[VALIDATION_ERROR_2740007a]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_2740007a, + "Ending command buffer with in progress query: queryPool 0x%" PRIx64 ", index %d.", + HandleToUint64(query.pool), query.index); } } if (!skip) { @@ -5860,10 +6087,10 @@ auto pPool = GetCommandPoolNode(dev_data, cmdPool); if (!(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT & pPool->createFlags)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_3260005c, "DS", + HandleToUint64(commandBuffer), VALIDATION_ERROR_3260005c, "Attempt to reset command buffer (0x%" PRIx64 ") created from command pool (0x%" PRIx64 - ") that does NOT have the VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT bit set. %s", - HandleToUint64(commandBuffer), HandleToUint64(cmdPool), validation_error_map[VALIDATION_ERROR_3260005c]); + ") that does NOT have the VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT bit set.", + HandleToUint64(commandBuffer), HandleToUint64(cmdPool)); } skip |= checkCommandBufferInFlight(dev_data, pCB, "reset", VALIDATION_ERROR_3260005a); lock.unlock(); @@ -5915,9 +6142,8 @@ skip |= ValidateCmd(dev_data, pCB, CMD_SETVIEWPORT, "vkCmdSetViewport()"); if (pCB->static_status & CBSTATUS_VIEWPORT_SET) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1e00098a, "DS", - "vkCmdSetViewport(): pipeline was created without VK_DYNAMIC_STATE_VIEWPORT flag. %s.", - validation_error_map[VALIDATION_ERROR_1e00098a]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_1e00098a, + "vkCmdSetViewport(): pipeline was created without VK_DYNAMIC_STATE_VIEWPORT flag.."); } if (!skip) { pCB->viewportMask |= ((1u << viewportCount) - 1u) << firstViewport; @@ -5939,9 +6165,8 @@ skip |= ValidateCmd(dev_data, pCB, CMD_SETSCISSOR, "vkCmdSetScissor()"); if (pCB->static_status & CBSTATUS_SCISSOR_SET) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1d80049c, "DS", - "vkCmdSetScissor(): pipeline was created without VK_DYNAMIC_STATE_SCISSOR flag. %s.", - validation_error_map[VALIDATION_ERROR_1d80049c]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_1d80049c, + "vkCmdSetScissor(): pipeline was created without VK_DYNAMIC_STATE_SCISSOR flag.."); } if (!skip) { pCB->scissorMask |= ((1u << scissorCount) - 1u) << firstScissor; @@ -5963,9 +6188,8 @@ if (pCB->static_status & CBSTATUS_LINE_WIDTH_SET) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1d600626, "DS", - "vkCmdSetLineWidth called but pipeline was created without VK_DYNAMIC_STATE_LINE_WIDTH flag. %s", - validation_error_map[VALIDATION_ERROR_1d600626]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_1d600626, + "vkCmdSetLineWidth called but pipeline was created without VK_DYNAMIC_STATE_LINE_WIDTH flag."); } if (!skip) { pCB->status |= CBSTATUS_LINE_WIDTH_SET; @@ -5986,16 +6210,14 @@ skip |= ValidateCmd(dev_data, pCB, CMD_SETDEPTHBIAS, "vkCmdSetDepthBias()"); if (pCB->static_status & CBSTATUS_DEPTH_BIAS_SET) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1cc0062a, "DS", - "vkCmdSetDepthBias(): pipeline was created without VK_DYNAMIC_STATE_DEPTH_BIAS flag. %s.", - validation_error_map[VALIDATION_ERROR_1cc0062a]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_1cc0062a, + "vkCmdSetDepthBias(): pipeline was created without VK_DYNAMIC_STATE_DEPTH_BIAS flag.."); } if ((depthBiasClamp != 0.0) && (!dev_data->enabled_features.depthBiasClamp)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1cc0062c, "DS", + HandleToUint64(commandBuffer), VALIDATION_ERROR_1cc0062c, "vkCmdSetDepthBias(): the depthBiasClamp device feature is disabled: the depthBiasClamp parameter must " - "be set to 0.0. %s", - validation_error_map[VALIDATION_ERROR_1cc0062c]); + "be set to 0.0."); } if (!skip) { pCB->status |= CBSTATUS_DEPTH_BIAS_SET; @@ -6016,9 +6238,8 @@ skip |= ValidateCmd(dev_data, pCB, CMD_SETBLENDCONSTANTS, "vkCmdSetBlendConstants()"); if (pCB->static_status & CBSTATUS_BLEND_CONSTANTS_SET) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1ca004c8, "DS", - "vkCmdSetBlendConstants(): pipeline was created without VK_DYNAMIC_STATE_BLEND_CONSTANTS flag. %s.", - validation_error_map[VALIDATION_ERROR_1ca004c8]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_1ca004c8, + "vkCmdSetBlendConstants(): pipeline was created without VK_DYNAMIC_STATE_BLEND_CONSTANTS flag.."); } if (!skip) { pCB->status |= CBSTATUS_BLEND_CONSTANTS_SET; @@ -6038,9 +6259,8 @@ skip |= ValidateCmd(dev_data, pCB, CMD_SETDEPTHBOUNDS, "vkCmdSetDepthBounds()"); if (pCB->static_status & CBSTATUS_DEPTH_BOUNDS_SET) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1ce004ae, "DS", - "vkCmdSetDepthBounds(): pipeline was created without VK_DYNAMIC_STATE_DEPTH_BOUNDS flag. %s.", - validation_error_map[VALIDATION_ERROR_1ce004ae]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_1ce004ae, + "vkCmdSetDepthBounds(): pipeline was created without VK_DYNAMIC_STATE_DEPTH_BOUNDS flag.."); } if (!skip) { pCB->status |= CBSTATUS_DEPTH_BOUNDS_SET; @@ -6061,11 +6281,10 @@ ValidateCmdQueueFlags(dev_data, pCB, "vkCmdSetStencilCompareMask()", VK_QUEUE_GRAPHICS_BIT, VALIDATION_ERROR_1da02415); skip |= ValidateCmd(dev_data, pCB, CMD_SETSTENCILCOMPAREMASK, "vkCmdSetStencilCompareMask()"); if (pCB->static_status & CBSTATUS_STENCIL_READ_MASK_SET) { - skip |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1da004b4, "DS", - "vkCmdSetStencilCompareMask(): pipeline was created without VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK flag. %s.", - validation_error_map[VALIDATION_ERROR_1da004b4]); + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1da004b4, + "vkCmdSetStencilCompareMask(): pipeline was created without VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK flag.."); } if (!skip) { pCB->status |= CBSTATUS_STENCIL_READ_MASK_SET; @@ -6085,11 +6304,9 @@ ValidateCmdQueueFlags(dev_data, pCB, "vkCmdSetStencilWriteMask()", VK_QUEUE_GRAPHICS_BIT, VALIDATION_ERROR_1de02415); skip |= ValidateCmd(dev_data, pCB, CMD_SETSTENCILWRITEMASK, "vkCmdSetStencilWriteMask()"); if (pCB->static_status & CBSTATUS_STENCIL_WRITE_MASK_SET) { - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1de004b6, "DS", - "vkCmdSetStencilWriteMask(): pipeline was created without VK_DYNAMIC_STATE_STENCIL_WRITE_MASK flag. %s.", - validation_error_map[VALIDATION_ERROR_1de004b6]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1de004b6, + "vkCmdSetStencilWriteMask(): pipeline was created without VK_DYNAMIC_STATE_STENCIL_WRITE_MASK flag.."); } if (!skip) { pCB->status |= CBSTATUS_STENCIL_WRITE_MASK_SET; @@ -6110,9 +6327,8 @@ skip |= ValidateCmd(dev_data, pCB, CMD_SETSTENCILREFERENCE, "vkCmdSetStencilReference()"); if (pCB->static_status & CBSTATUS_STENCIL_REFERENCE_SET) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1dc004b8, "DS", - "vkCmdSetStencilReference(): pipeline was created without VK_DYNAMIC_STATE_STENCIL_REFERENCE flag. %s.", - validation_error_map[VALIDATION_ERROR_1dc004b8]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_1dc004b8, + "vkCmdSetStencilReference(): pipeline was created without VK_DYNAMIC_STATE_STENCIL_REFERENCE flag.."); } if (!skip) { pCB->status |= CBSTATUS_STENCIL_REFERENCE_SET; @@ -6122,63 +6338,128 @@ if (!skip) dev_data->dispatch_table.CmdSetStencilReference(commandBuffer, faceMask, reference); } -static void PreCallRecordCmdBindDescriptorSets(layer_data *device_data, GLOBAL_CB_NODE *cb_state, - VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, - uint32_t setCount, const VkDescriptorSet *pDescriptorSets, - uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) { - uint32_t total_dynamic_descriptors = 0; - string error_string = ""; - uint32_t last_set_index = firstSet + setCount - 1; - auto last_bound = &cb_state->lastBound[pipelineBindPoint]; +// Update pipeline_layout bind points applying the "Pipeline Layout Compatibility" rules +static void UpdateLastBoundDescriptorSets(layer_data *device_data, GLOBAL_CB_NODE *cb_state, + VkPipelineBindPoint pipeline_bind_point, const PIPELINE_LAYOUT_NODE *pipeline_layout, + uint32_t first_set, uint32_t set_count, + const std::vector descriptor_sets, + uint32_t dynamic_offset_count, const uint32_t *p_dynamic_offsets) { + // Defensive + assert(set_count); + if (0 == set_count) return; + assert(pipeline_layout); + if (!pipeline_layout) return; + + uint32_t required_size = first_set + set_count; + const uint32_t last_binding_index = required_size - 1; + assert(last_binding_index < pipeline_layout->compat_for_set.size()); + + // Some useful shorthand + auto &last_bound = cb_state->lastBound[pipeline_bind_point]; + + auto &bound_sets = last_bound.boundDescriptorSets; + auto &dynamic_offsets = last_bound.dynamicOffsets; + auto &bound_compat_ids = last_bound.compat_id_for_set; + auto &pipe_compat_ids = pipeline_layout->compat_for_set; + + const uint32_t current_size = static_cast(bound_sets.size()); + assert(current_size == dynamic_offsets.size()); + assert(current_size == bound_compat_ids.size()); + + // We need this three times in this function, but nowhere else + auto push_descriptor_cleanup = [&last_bound](const cvdescriptorset::DescriptorSet *ds) -> bool { + if (ds && ds->IsPushDescriptor()) { + assert(ds == last_bound.push_descriptor_set.get()); + last_bound.push_descriptor_set = nullptr; + return true; + } + return false; + }; - if (last_set_index >= last_bound->boundDescriptorSets.size()) { - last_bound->boundDescriptorSets.resize(last_set_index + 1); - last_bound->dynamicOffsets.resize(last_set_index + 1); + // Clean up the "disturbed" before and after the range to be set + if (required_size < current_size) { + if (bound_compat_ids[last_binding_index] != pipe_compat_ids[last_binding_index]) { + // We're disturbing those after last, we'll shrink below, but first need to check for and cleanup the push_descriptor + for (auto set_idx = required_size; set_idx < current_size; ++set_idx) { + if (push_descriptor_cleanup(bound_sets[set_idx])) break; + } + } else { + // We're not disturbing past last, so leave the upper binding data alone. + required_size = current_size; + } } - auto old_final_bound_set = last_bound->boundDescriptorSets[last_set_index]; - auto pipeline_layout = getPipelineLayout(device_data, layout); - for (uint32_t set_idx = 0; set_idx < setCount; set_idx++) { - cvdescriptorset::DescriptorSet *descriptor_set = GetSetNode(device_data, pDescriptorSets[set_idx]); - if (descriptor_set) { - last_bound->pipeline_layout = *pipeline_layout; - if ((last_bound->boundDescriptorSets[set_idx + firstSet] != nullptr) && - last_bound->boundDescriptorSets[set_idx + firstSet]->IsPushDescriptor()) { - last_bound->push_descriptor_set = nullptr; - last_bound->boundDescriptorSets[set_idx + firstSet] = nullptr; - } + // We resize if we need more set entries or if those past "last" are disturbed + if (required_size != current_size) { + // TODO: put these size tied things in a struct (touches many lines) + bound_sets.resize(required_size); + dynamic_offsets.resize(required_size); + bound_compat_ids.resize(required_size); + } + + // For any previously bound sets, need to set them to "invalid" if they were disturbed by this update + for (uint32_t set_idx = 0; set_idx < first_set; ++set_idx) { + if (bound_compat_ids[set_idx] != pipe_compat_ids[set_idx]) { + push_descriptor_cleanup(bound_sets[set_idx]); + bound_sets[set_idx] = nullptr; + dynamic_offsets[set_idx].clear(); + bound_compat_ids[set_idx] = pipe_compat_ids[set_idx]; + } + } - last_bound->boundDescriptorSets[set_idx + firstSet] = descriptor_set; + // Now update the bound sets with the input sets + const uint32_t *input_dynamic_offsets = p_dynamic_offsets; // "read" pointer for dynamic offset data + for (uint32_t input_idx = 0; input_idx < set_count; input_idx++) { + auto set_idx = input_idx + first_set; // set_idx is index within layout, input_idx is index within input descriptor sets + cvdescriptorset::DescriptorSet *descriptor_set = descriptor_sets[input_idx]; + // Record binding (or push) + push_descriptor_cleanup(bound_sets[set_idx]); + bound_sets[set_idx] = descriptor_set; + bound_compat_ids[set_idx] = pipe_compat_ids[set_idx]; // compat ids are canonical *per* set index + + if (descriptor_set) { auto set_dynamic_descriptor_count = descriptor_set->GetDynamicDescriptorCount(); - last_bound->dynamicOffsets[firstSet + set_idx].clear(); - if (set_dynamic_descriptor_count) { - last_bound->dynamicOffsets[firstSet + set_idx] = - std::vector(pDynamicOffsets + total_dynamic_descriptors, - pDynamicOffsets + total_dynamic_descriptors + set_dynamic_descriptor_count); - total_dynamic_descriptors += set_dynamic_descriptor_count; - } - cb_state->validated_descriptor_sets.insert(descriptor_set); - } - // For any previously bound sets, need to set them to "invalid" if they were disturbed by this update - if (firstSet > 0) { - for (uint32_t i = 0; i < firstSet; ++i) { - if (last_bound->boundDescriptorSets[i] && - !verify_set_layout_compatibility(last_bound->boundDescriptorSets[i], pipeline_layout, i, error_string)) { - last_bound->boundDescriptorSets[i] = VK_NULL_HANDLE; - } + // TODO: Add logic for tracking push_descriptor offsets (here or in caller) + if (set_dynamic_descriptor_count && input_dynamic_offsets) { + const uint32_t *end_offset = input_dynamic_offsets + set_dynamic_descriptor_count; + dynamic_offsets[set_idx] = std::vector(input_dynamic_offsets, end_offset); + input_dynamic_offsets = end_offset; + assert(input_dynamic_offsets <= (p_dynamic_offsets + dynamic_offset_count)); + } else { + dynamic_offsets[set_idx].clear(); } - } - // Check if newly last bound set invalidates any remaining bound sets - if ((last_bound->boundDescriptorSets.size() - 1) > (last_set_index)) { - if (old_final_bound_set && - !verify_set_layout_compatibility(old_final_bound_set, pipeline_layout, last_set_index, error_string)) { - last_bound->boundDescriptorSets.resize(last_set_index + 1); + if (!descriptor_set->IsPushDescriptor()) { + // Can't cache validation of push_descriptors + cb_state->validated_descriptor_sets.insert(descriptor_set); } } } } +// Update the bound state for the bind point, including the effects of incompatible pipeline layouts +static void PreCallRecordCmdBindDescriptorSets(layer_data *device_data, GLOBAL_CB_NODE *cb_state, + VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, + uint32_t setCount, const VkDescriptorSet *pDescriptorSets, + uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) { + auto pipeline_layout = getPipelineLayout(device_data, layout); + std::vector descriptor_sets; + descriptor_sets.reserve(setCount); + + // Construct a list of the descriptors + bool found_non_null = false; + for (uint32_t i = 0; i < setCount; i++) { + cvdescriptorset::DescriptorSet *descriptor_set = GetSetNode(device_data, pDescriptorSets[i]); + descriptor_sets.emplace_back(descriptor_set); + found_non_null |= descriptor_set != nullptr; + } + if (found_non_null) { // which implies setCount > 0 + UpdateLastBoundDescriptorSets(device_data, cb_state, pipelineBindPoint, pipeline_layout, firstSet, setCount, + descriptor_sets, dynamicOffsetCount, pDynamicOffsets); + cb_state->lastBound[pipelineBindPoint].pipeline_layout = layout; + } +} + static bool PreCallValidateCmdBindDescriptorSets(layer_data *device_data, GLOBAL_CB_NODE *cb_state, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount, const VkDescriptorSet *pDescriptorSets, @@ -6195,6 +6476,7 @@ if (last_set_index >= cb_state->lastBound[pipelineBindPoint].boundDescriptorSets.size()) { cb_state->lastBound[pipelineBindPoint].boundDescriptorSets.resize(last_set_index + 1); cb_state->lastBound[pipelineBindPoint].dynamicOffsets.resize(last_set_index + 1); + cb_state->lastBound[pipelineBindPoint].compat_id_for_set.resize(last_set_index + 1); } auto pipeline_layout = getPipelineLayout(device_data, layout); for (uint32_t set_idx = 0; set_idx < setCount; set_idx++) { @@ -6203,7 +6485,7 @@ if (!descriptor_set->IsUpdated() && (descriptor_set->GetTotalDescriptorCount() != 0)) { skip |= log_msg( device_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - HandleToUint64(pDescriptorSets[set_idx]), __LINE__, DRAWSTATE_DESCRIPTOR_SET_NOT_UPDATED, "DS", + HandleToUint64(pDescriptorSets[set_idx]), DRAWSTATE_DESCRIPTOR_SET_NOT_UPDATED, "Descriptor Set 0x%" PRIx64 " bound but it was never updated. You may want to either update it or not bind it.", HandleToUint64(pDescriptorSets[set_idx])); } @@ -6211,11 +6493,10 @@ if (!verify_set_layout_compatibility(descriptor_set, pipeline_layout, set_idx + firstSet, error_string)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - HandleToUint64(pDescriptorSets[set_idx]), __LINE__, VALIDATION_ERROR_17c002cc, "DS", + HandleToUint64(pDescriptorSets[set_idx]), VALIDATION_ERROR_17c002cc, "descriptorSet #%u being bound is not compatible with overlapping descriptorSetLayout at index %u of " - "pipelineLayout 0x%" PRIx64 " due to: %s. %s", - set_idx, set_idx + firstSet, HandleToUint64(layout), error_string.c_str(), - validation_error_map[VALIDATION_ERROR_17c002cc]); + "pipelineLayout 0x%" PRIx64 " due to: %s.", + set_idx, set_idx + firstSet, HandleToUint64(layout), error_string.c_str()); } auto set_dynamic_descriptor_count = descriptor_set->GetDynamicDescriptorCount(); @@ -6225,7 +6506,7 @@ if ((total_dynamic_descriptors + set_dynamic_descriptor_count) > dynamicOffsetCount) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, HandleToUint64(pDescriptorSets[set_idx]), - __LINE__, DRAWSTATE_INVALID_DYNAMIC_OFFSET_COUNT, "DS", + DRAWSTATE_INVALID_DYNAMIC_OFFSET_COUNT, "descriptorSet #%u (0x%" PRIx64 ") requires %u dynamicOffsets, but only %u dynamicOffsets are left in pDynamicOffsets array. " "There must be one dynamic offset for each dynamic descriptor being bound.", @@ -6239,13 +6520,11 @@ device_data->phys_dev_properties.properties.limits.minUniformBufferOffsetAlignment) != 0) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, - VALIDATION_ERROR_17c002d4, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, VALIDATION_ERROR_17c002d4, "vkCmdBindDescriptorSets(): pDynamicOffsets[%d] is %d but must be a multiple of " - "device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64 ". %s", + "device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64 ".", cur_dyn_offset, pDynamicOffsets[cur_dyn_offset], - device_data->phys_dev_properties.properties.limits.minUniformBufferOffsetAlignment, - validation_error_map[VALIDATION_ERROR_17c002d4]); + device_data->phys_dev_properties.properties.limits.minUniformBufferOffsetAlignment); } cur_dyn_offset++; } else if (descriptor_set->GetTypeFromGlobalIndex(d) == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) { @@ -6253,13 +6532,11 @@ device_data->phys_dev_properties.properties.limits.minStorageBufferOffsetAlignment) != 0) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, - VALIDATION_ERROR_17c002d4, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, VALIDATION_ERROR_17c002d4, "vkCmdBindDescriptorSets(): pDynamicOffsets[%d] is %d but must be a multiple of " - "device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64 ". %s", + "device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64 ".", cur_dyn_offset, pDynamicOffsets[cur_dyn_offset], - device_data->phys_dev_properties.properties.limits.minStorageBufferOffsetAlignment, - validation_error_map[VALIDATION_ERROR_17c002d4]); + device_data->phys_dev_properties.properties.limits.minStorageBufferOffsetAlignment); } cur_dyn_offset++; } @@ -6270,7 +6547,7 @@ } } else { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - HandleToUint64(pDescriptorSets[set_idx]), __LINE__, DRAWSTATE_INVALID_SET, "DS", + HandleToUint64(pDescriptorSets[set_idx]), DRAWSTATE_INVALID_SET, "Attempt to bind descriptor set 0x%" PRIx64 " that doesn't exist!", HandleToUint64(pDescriptorSets[set_idx])); } @@ -6278,10 +6555,10 @@ // dynamicOffsetCount must equal the total number of dynamic descriptors in the sets being bound if (total_dynamic_descriptors != dynamicOffsetCount) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, VALIDATION_ERROR_17c002ce, "DS", + HandleToUint64(cb_state->commandBuffer), VALIDATION_ERROR_17c002ce, "Attempting to bind %u descriptorSets with %u dynamic descriptors, but dynamicOffsetCount is %u. It should " - "exactly match the number of dynamic descriptors. %s", - setCount, total_dynamic_descriptors, dynamicOffsetCount, validation_error_map[VALIDATION_ERROR_17c002ce]); + "exactly match the number of dynamic descriptors.", + setCount, total_dynamic_descriptors, dynamicOffsetCount); } return skip; } @@ -6325,10 +6602,10 @@ auto cb_u64 = HandleToUint64(cb_state->commandBuffer); auto cp_u64 = HandleToUint64(cb_state->createInfo.commandPool); skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - cb_u64, __LINE__, error, "DS", + cb_u64, error, "%s: CommandBuffer 0x%" PRIxLEAST64 " was allocated from VkCommandPool 0x%" PRIxLEAST64 - " that does not support bindpoint %s. %s", - func_name, cb_u64, cp_u64, string_VkPipelineBindPoint(bind_point), validation_error_map[error]); + " that does not support bindpoint %s.", + func_name, cb_u64, cp_u64, string_VkPipelineBindPoint(bind_point)); } } return skip; @@ -6353,20 +6630,18 @@ if (set < set_layouts.size()) { const auto *dsl = set_layouts[set].get(); if (dsl && (0 == (dsl->GetCreateFlags() & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR))) { - skip = - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, layout_u64, __LINE__, VALIDATION_ERROR_1be002da, "DS", - "%s: Set index %" PRIu32 - " does not match push descriptor set layout index for VkPipelineLayout 0x%" PRIxLEAST64 ". %s", - func_name, set, layout_u64, validation_error_map[VALIDATION_ERROR_1be002da]); + skip = log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, layout_u64, VALIDATION_ERROR_1be002da, + "%s: Set index %" PRIu32 + " does not match push descriptor set layout index for VkPipelineLayout 0x%" PRIxLEAST64 ".", + func_name, set, layout_u64); } } else { skip = log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, - layout_u64, __LINE__, VALIDATION_ERROR_1be002d8, "DS", + layout_u64, VALIDATION_ERROR_1be002d8, "%s: Set index %" PRIu32 " is outside of range for VkPipelineLayout 0x%" PRIxLEAST64 " (set < %" PRIu32 - "). %s", - func_name, set, layout_u64, static_cast(set_layouts.size()), - validation_error_map[VALIDATION_ERROR_1be002d8]); + ").", + func_name, set, layout_u64, static_cast(set_layouts.size())); } } @@ -6375,15 +6650,15 @@ static void PreCallRecordCmdPushDescriptorSetKHR(layer_data *device_data, GLOBAL_CB_NODE *cb_state, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites) { - if (set >= cb_state->lastBound[pipelineBindPoint].boundDescriptorSets.size()) { - cb_state->lastBound[pipelineBindPoint].boundDescriptorSets.resize(set + 1); - cb_state->lastBound[pipelineBindPoint].dynamicOffsets.resize(set + 1); - } - const auto &layout_state = getPipelineLayout(device_data, layout); + const auto &pipeline_layout = getPipelineLayout(device_data, layout); + if (!pipeline_layout) return; std::unique_ptr new_desc{ - new cvdescriptorset::DescriptorSet(0, 0, layout_state->set_layouts[set], device_data)}; - cb_state->lastBound[pipelineBindPoint].boundDescriptorSets[set] = new_desc.get(); + new cvdescriptorset::DescriptorSet(0, 0, pipeline_layout->set_layouts[set], 0, device_data)}; + + std::vector descriptor_sets = {new_desc.get()}; + UpdateLastBoundDescriptorSets(device_data, cb_state, pipelineBindPoint, pipeline_layout, set, 1, descriptor_sets, 0, nullptr); cb_state->lastBound[pipelineBindPoint].push_descriptor_set = std::move(new_desc); + cb_state->lastBound[pipelineBindPoint].pipeline_layout = layout; } VKAPI_ATTR void VKAPI_CALL CmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, @@ -6435,9 +6710,9 @@ auto offset_align = GetIndexAlignment(indexType); if (offset % offset_align) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_17e00360, "DS", - "vkCmdBindIndexBuffer() offset (0x%" PRIxLEAST64 ") does not fall on alignment (%s) boundary. %s", offset, - string_VkIndexType(indexType), validation_error_map[VALIDATION_ERROR_17e00360]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_17e00360, + "vkCmdBindIndexBuffer() offset (0x%" PRIxLEAST64 ") does not fall on alignment (%s) boundary.", offset, + string_VkIndexType(indexType)); } if (skip) return; @@ -6483,9 +6758,8 @@ skip |= ValidateMemoryIsBoundToBuffer(dev_data, buffer_state, "vkCmdBindVertexBuffers()", VALIDATION_ERROR_182004e8); if (pOffsets[i] >= buffer_state->createInfo.size) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, - HandleToUint64(buffer_state->buffer), __LINE__, VALIDATION_ERROR_182004e4, "DS", - "vkCmdBindVertexBuffers() offset (0x%" PRIxLEAST64 ") is beyond the end of the buffer. %s", pOffsets[i], - validation_error_map[VALIDATION_ERROR_182004e4]); + HandleToUint64(buffer_state->buffer), VALIDATION_ERROR_182004e4, + "vkCmdBindVertexBuffers() offset (0x%" PRIxLEAST64 ") is beyond the end of the buffer.", pOffsets[i]); } } @@ -6797,10 +7071,10 @@ bool skip = false; if (image_state->createInfo.samples != sample_count) { skip = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), 0, msgCode, "DS", - "%s for image 0x%" PRIx64 " was created with a sample count of %s but must be %s. %s", location, + HandleToUint64(image_state->image), msgCode, + "%s for image 0x%" PRIx64 " was created with a sample count of %s but must be %s.", location, HandleToUint64(image_state->image), string_VkSampleCountFlagBits(image_state->createInfo.samples), - string_VkSampleCountFlagBits(sample_count), validation_error_map[msgCode]); + string_VkSampleCountFlagBits(sample_count)); } return skip; } @@ -7135,39 +7409,35 @@ if (!sub_image_found) { skip |= log_msg( device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, rp_handle, - __LINE__, VALIDATION_ERROR_1b800936, "CORE", + VALIDATION_ERROR_1b800936, "%s: Barrier pImageMemoryBarriers[%d].image (0x%" PRIx64 - ") is not referenced by the VkSubpassDescription for active subpass (%d) of current renderPass (0x%" PRIx64 "). %s", - funcName, img_index, HandleToUint64(img_bar_image), active_subpass, rp_handle, - validation_error_map[VALIDATION_ERROR_1b800936]); + ") is not referenced by the VkSubpassDescription for active subpass (%d) of current renderPass (0x%" PRIx64 ").", + funcName, img_index, HandleToUint64(img_bar_image), active_subpass, rp_handle); } } else { // !image_match auto const fb_handle = HandleToUint64(fb_state->framebuffer); - skip |= - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, fb_handle, - __LINE__, VALIDATION_ERROR_1b800936, "CORE", - "%s: Barrier pImageMemoryBarriers[%d].image (0x%" PRIx64 - ") does not match an image from the current framebuffer (0x%" PRIx64 "). %s", - funcName, img_index, HandleToUint64(img_bar_image), fb_handle, validation_error_map[VALIDATION_ERROR_1b800936]); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, + fb_handle, VALIDATION_ERROR_1b800936, + "%s: Barrier pImageMemoryBarriers[%d].image (0x%" PRIx64 + ") does not match an image from the current framebuffer (0x%" PRIx64 ").", + funcName, img_index, HandleToUint64(img_bar_image), fb_handle); } if (img_barrier.oldLayout != img_barrier.newLayout) { - skip |= - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, VALIDATION_ERROR_1b80093a, "CORE", - "%s: As the Image Barrier for image 0x%" PRIx64 - " is being executed within a render pass instance, oldLayout must equal newLayout yet they are %s and %s. %s", - funcName, HandleToUint64(img_barrier.image), string_VkImageLayout(img_barrier.oldLayout), - string_VkImageLayout(img_barrier.newLayout), validation_error_map[VALIDATION_ERROR_1b80093a]); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(cb_state->commandBuffer), VALIDATION_ERROR_1b80093a, + "%s: As the Image Barrier for image 0x%" PRIx64 + " is being executed within a render pass instance, oldLayout must equal newLayout yet they are %s and %s.", + funcName, HandleToUint64(img_barrier.image), string_VkImageLayout(img_barrier.oldLayout), + string_VkImageLayout(img_barrier.newLayout)); } else { if (sub_image_found && sub_image_layout != img_barrier.oldLayout) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - rp_handle, __LINE__, VALIDATION_ERROR_1b800938, "CORE", + rp_handle, VALIDATION_ERROR_1b800938, "%s: Barrier pImageMemoryBarriers[%d].image (0x%" PRIx64 ") is referenced by the VkSubpassDescription for active subpass (%d) of current renderPass (0x%" PRIx64 - ") as having layout %s, but image barrier has layout %s. %s", + ") as having layout %s, but image barrier has layout %s.", funcName, img_index, HandleToUint64(img_bar_image), active_subpass, rp_handle, - string_VkImageLayout(img_barrier.oldLayout), string_VkImageLayout(sub_image_layout), - validation_error_map[VALIDATION_ERROR_1b800938]); + string_VkImageLayout(img_barrier.oldLayout), string_VkImageLayout(sub_image_layout)); } } return skip; @@ -7184,35 +7454,32 @@ const auto &img_src_access_mask = img_barrier.srcAccessMask; if (img_src_access_mask != (sub_src_access_mask & img_src_access_mask)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - rp_handle, __LINE__, VALIDATION_ERROR_1b80092e, "CORE", + rp_handle, VALIDATION_ERROR_1b80092e, "%s: Barrier pImageMemoryBarriers[%d].srcAccessMask(0x%X) is not a subset of VkSubpassDependency " - "srcAccessMask(0x%X) of subpass %d of renderPass 0x%" PRIx64 ". %s", - funcName, i, img_src_access_mask, sub_src_access_mask, active_subpass, rp_handle, - validation_error_map[VALIDATION_ERROR_1b80092e]); + "srcAccessMask(0x%X) of subpass %d of renderPass 0x%" PRIx64 ".", + funcName, i, img_src_access_mask, sub_src_access_mask, active_subpass, rp_handle); } const auto &img_dst_access_mask = img_barrier.dstAccessMask; if (img_dst_access_mask != (sub_dst_access_mask & img_dst_access_mask)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - rp_handle, __LINE__, VALIDATION_ERROR_1b800930, "CORE", + rp_handle, VALIDATION_ERROR_1b800930, "%s: Barrier pImageMemoryBarriers[%d].dstAccessMask(0x%X) is not a subset of VkSubpassDependency " - "dstAccessMask(0x%X) of subpass %d of renderPass 0x%" PRIx64 ". %s", - funcName, i, img_dst_access_mask, sub_dst_access_mask, active_subpass, rp_handle, - validation_error_map[VALIDATION_ERROR_1b800930]); + "dstAccessMask(0x%X) of subpass %d of renderPass 0x%" PRIx64 ".", + funcName, i, img_dst_access_mask, sub_dst_access_mask, active_subpass, rp_handle); } if (VK_QUEUE_FAMILY_IGNORED != img_barrier.srcQueueFamilyIndex || VK_QUEUE_FAMILY_IGNORED != img_barrier.dstQueueFamilyIndex) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - rp_handle, __LINE__, VALIDATION_ERROR_1b80093c, "CORE", + rp_handle, VALIDATION_ERROR_1b80093c, "%s: Barrier pImageMemoryBarriers[%d].srcQueueFamilyIndex is %d and " - "pImageMemoryBarriers[%d].dstQueueFamilyIndex is %d but both must be VK_QUEUE_FAMILY_IGNORED. %s", - funcName, i, img_barrier.srcQueueFamilyIndex, i, img_barrier.dstQueueFamilyIndex, - validation_error_map[VALIDATION_ERROR_1b80093c]); + "pImageMemoryBarriers[%d].dstQueueFamilyIndex is %d but both must be VK_QUEUE_FAMILY_IGNORED.", + funcName, i, img_barrier.srcQueueFamilyIndex, i, img_barrier.dstQueueFamilyIndex); } // Secondary CBs can have null framebuffer so queue up validation in that case 'til FB is known if (VK_NULL_HANDLE == cb_state->activeFramebuffer) { assert(VK_COMMAND_BUFFER_LEVEL_SECONDARY == cb_state->createInfo.level); // Secondary CB case w/o FB specified delay validation - cb_state->cmd_execute_commands_functions.emplace_back([=](VkFramebuffer fb) { + cb_state->cmd_execute_commands_functions.emplace_back([=](GLOBAL_CB_NODE *primary_cb, VkFramebuffer fb) { return ValidateImageBarrierImage(device_data, funcName, cb_state, fb, active_subpass, sub_desc, rp_handle, i, img_barrier); }); @@ -7237,11 +7504,11 @@ const auto active_subpass = cb_state->activeSubpass; auto rp_handle = HandleToUint64(rp_state->renderPass); if (!rp_state->hasSelfDependency[active_subpass]) { - skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - rp_handle, __LINE__, VALIDATION_ERROR_1b800928, "CORE", - "%s: Barriers cannot be set during subpass %d of renderPass 0x%" PRIx64 - " with no self-dependency specified. %s", - funcName, active_subpass, rp_handle, validation_error_map[VALIDATION_ERROR_1b800928]); + skip |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, rp_handle, + VALIDATION_ERROR_1b800928, + "%s: Barriers cannot be set during subpass %d of renderPass 0x%" PRIx64 " with no self-dependency specified.", + funcName, active_subpass, rp_handle); } else { assert(rp_state->subpass_to_dependency_index[cb_state->activeSubpass] != -1); // Grab ref to current subpassDescription up-front for use below @@ -7252,27 +7519,24 @@ if ((sub_src_stage_mask != VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) && (src_stage_mask != (sub_src_stage_mask & src_stage_mask))) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - rp_handle, __LINE__, VALIDATION_ERROR_1b80092a, "CORE", + rp_handle, VALIDATION_ERROR_1b80092a, "%s: Barrier srcStageMask(0x%X) is not a subset of VkSubpassDependency srcStageMask(0x%X) of subpass " - "%d of renderPass 0x%" PRIx64 ". %s", - funcName, src_stage_mask, sub_src_stage_mask, active_subpass, rp_handle, - validation_error_map[VALIDATION_ERROR_1b80092a]); + "%d of renderPass 0x%" PRIx64 ".", + funcName, src_stage_mask, sub_src_stage_mask, active_subpass, rp_handle); } if ((sub_dst_stage_mask != VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) && (dst_stage_mask != (sub_dst_stage_mask & dst_stage_mask))) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - rp_handle, __LINE__, VALIDATION_ERROR_1b80092c, "CORE", + rp_handle, VALIDATION_ERROR_1b80092c, "%s: Barrier dstStageMask(0x%X) is not a subset of VkSubpassDependency dstStageMask(0x%X) of subpass " - "%d of renderPass 0x%" PRIx64 ". %s", - funcName, dst_stage_mask, sub_dst_stage_mask, active_subpass, rp_handle, - validation_error_map[VALIDATION_ERROR_1b80092c]); + "%d of renderPass 0x%" PRIx64 ".", + funcName, dst_stage_mask, sub_dst_stage_mask, active_subpass, rp_handle); } if (0 != buffer_mem_barrier_count) { - skip |= - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - rp_handle, __LINE__, VALIDATION_ERROR_1b800934, "CORE", - "%s: bufferMemoryBarrierCount is non-zero (%d) for subpass %d of renderPass 0x%" PRIx64 ". %s", funcName, - buffer_mem_barrier_count, active_subpass, rp_handle, validation_error_map[VALIDATION_ERROR_1b800934]); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, + rp_handle, VALIDATION_ERROR_1b800934, + "%s: bufferMemoryBarrierCount is non-zero (%d) for subpass %d of renderPass 0x%" PRIx64 ".", funcName, + buffer_mem_barrier_count, active_subpass, rp_handle); } const auto &sub_src_access_mask = sub_dep.srcAccessMask; const auto &sub_dst_access_mask = sub_dep.dstAccessMask; @@ -7280,31 +7544,28 @@ const auto &mb_src_access_mask = mem_barriers[i].srcAccessMask; if (mb_src_access_mask != (sub_src_access_mask & mb_src_access_mask)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, rp_handle, __LINE__, VALIDATION_ERROR_1b80092e, "CORE", + VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, rp_handle, VALIDATION_ERROR_1b80092e, "%s: Barrier pMemoryBarriers[%d].srcAccessMask(0x%X) is not a subset of VkSubpassDependency " - "srcAccessMask(0x%X) of subpass %d of renderPass 0x%" PRIx64 ". %s", - funcName, i, mb_src_access_mask, sub_src_access_mask, active_subpass, rp_handle, - validation_error_map[VALIDATION_ERROR_1b80092e]); + "srcAccessMask(0x%X) of subpass %d of renderPass 0x%" PRIx64 ".", + funcName, i, mb_src_access_mask, sub_src_access_mask, active_subpass, rp_handle); } const auto &mb_dst_access_mask = mem_barriers[i].dstAccessMask; if (mb_dst_access_mask != (sub_dst_access_mask & mb_dst_access_mask)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, rp_handle, __LINE__, VALIDATION_ERROR_1b800930, "CORE", + VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, rp_handle, VALIDATION_ERROR_1b800930, "%s: Barrier pMemoryBarriers[%d].dstAccessMask(0x%X) is not a subset of VkSubpassDependency " - "dstAccessMask(0x%X) of subpass %d of renderPass 0x%" PRIx64 ". %s", - funcName, i, mb_dst_access_mask, sub_dst_access_mask, active_subpass, rp_handle, - validation_error_map[VALIDATION_ERROR_1b800930]); + "dstAccessMask(0x%X) of subpass %d of renderPass 0x%" PRIx64 ".", + funcName, i, mb_dst_access_mask, sub_dst_access_mask, active_subpass, rp_handle); } } skip |= ValidateRenderPassImageBarriers(device_data, funcName, cb_state, active_subpass, sub_desc, rp_handle, sub_src_access_mask, sub_dst_access_mask, image_mem_barrier_count, image_barriers); if (sub_dep.dependencyFlags != dependency_flags) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - rp_handle, __LINE__, VALIDATION_ERROR_1b800932, "CORE", + rp_handle, VALIDATION_ERROR_1b800932, "%s: dependencyFlags param (0x%X) does not equal VkSubpassDependency dependencyFlags value (0x%X) for " - "subpass %d of renderPass 0x%" PRIx64 ". %s", - funcName, dependency_flags, sub_dep.dependencyFlags, cb_state->activeSubpass, rp_handle, - validation_error_map[VALIDATION_ERROR_1b800932]); + "subpass %d of renderPass 0x%" PRIx64 ".", + funcName, dependency_flags, sub_dep.dependencyFlags, cb_state->activeSubpass, rp_handle); } } return skip; @@ -7448,26 +7709,24 @@ // Log the messages using boilerplate from object state, and Vu specific information from the template arg // One and two family versions, in the single family version, Vu holds the name of the passed parameter - bool LogMsg(VuIndex vu_index, size_t location, uint32_t family, const char *param_name) const { + bool LogMsg(VuIndex vu_index, uint32_t family, const char *param_name) const { const UNIQUE_VALIDATION_ERROR_CODE val_code = val_codes_[vu_index]; const char *annotation = GetFamilyAnnotation(family); return log_msg(report_data_, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, cb_handle64_, - location, val_code, "DS", - "%s: Barrier using %s 0x%" PRIx64 " created with sharingMode %s, has %s %u%s. %s %s", func_name_, - GetTypeString(), barrier_handle64_, GetModeString(), param_name, family, annotation, vu_summary[vu_index], - validation_error_map[val_code]); + val_code, "%s: Barrier using %s 0x%" PRIx64 " created with sharingMode %s, has %s %u%s. %s", func_name_, + GetTypeString(), barrier_handle64_, GetModeString(), param_name, family, annotation, vu_summary[vu_index]); } - bool LogMsg(VuIndex vu_index, size_t location, uint32_t src_family, uint32_t dst_family) const { + bool LogMsg(VuIndex vu_index, uint32_t src_family, uint32_t dst_family) const { const UNIQUE_VALIDATION_ERROR_CODE val_code = val_codes_[vu_index]; const char *src_annotation = GetFamilyAnnotation(src_family); const char *dst_annotation = GetFamilyAnnotation(dst_family); return log_msg(report_data_, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, cb_handle64_, - location, val_code, "DS", + val_code, "%s: Barrier using %s 0x%" PRIx64 - " created with sharingMode %s, has srcQueueFamilyIndex %u%s and dstQueueFamilyIndex %u%s. %s %s", + " created with sharingMode %s, has srcQueueFamilyIndex %u%s and dstQueueFamilyIndex %u%s. %s", func_name_, GetTypeString(), barrier_handle64_, GetModeString(), src_family, src_annotation, dst_family, - dst_annotation, vu_summary[vu_index], validation_error_map[val_code]); + dst_annotation, vu_summary[vu_index]); } // This abstract Vu can only be tested at submit time, thus we need a callback from the closure containing the needed @@ -7484,12 +7743,11 @@ const char *src_annotation = val.GetFamilyAnnotation(src_family); const char *dst_annotation = val.GetFamilyAnnotation(dst_family); return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, - HandleToUint64(queue), __LINE__, val_code, "DS", + HandleToUint64(queue), val_code, "%s: Barrier submitted to queue with family index %u, using %s 0x%" PRIx64 - " created with sharingMode %s, has srcQueueFamilyIndex %u%s and dstQueueFamilyIndex %u%s. %s %s", + " created with sharingMode %s, has srcQueueFamilyIndex %u%s and dstQueueFamilyIndex %u%s. %s", "vkQueueSubmit", queue_family, val.GetTypeString(), val.barrier_handle64_, val.GetModeString(), - src_family, src_annotation, dst_family, dst_annotation, vu_summary[kSubmitQueueMustMatchSrcOrDst], - validation_error_map[val_code]); + src_family, src_annotation, dst_family, dst_annotation, vu_summary[kSubmitQueueMustMatchSrcOrDst]); } return false; } @@ -7553,34 +7811,34 @@ if (val.KhrExternalMem()) { if (mode_concurrent) { if (!(src_ignored || dst_ignored)) { - skip |= val.LogMsg(kSrcOrDstMustBeIgnore, __LINE__, src_queue_family, dst_queue_family); + skip |= val.LogMsg(kSrcOrDstMustBeIgnore, src_queue_family, dst_queue_family); } if ((src_ignored && !(dst_ignored || val.IsSpecial(dst_queue_family))) || (dst_ignored && !(src_ignored || val.IsSpecial(src_queue_family)))) { - skip |= val.LogMsg(kSpecialOrIgnoreOnly, __LINE__, src_queue_family, dst_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, __LINE__, src_queue_family, dst_queue_family); + skip |= val.LogMsg(kSrcIgnoreRequiresDstIgnore, src_queue_family, dst_queue_family); } if (!dst_ignored && !val.IsValidOrSpecial(dst_queue_family)) { - skip |= val.LogMsg(kDstValidOrSpecialIfNotIgnore, __LINE__, dst_queue_family, "dstQueueFamilyIndex"); + skip |= val.LogMsg(kDstValidOrSpecialIfNotIgnore, dst_queue_family, "dstQueueFamilyIndex"); } if (!src_ignored && !val.IsValidOrSpecial(src_queue_family)) { - skip |= val.LogMsg(kSrcValidOrSpecialIfNotIgnore, __LINE__, src_queue_family, "srcQueueFamilyIndex"); + skip |= val.LogMsg(kSrcValidOrSpecialIfNotIgnore, src_queue_family, "srcQueueFamilyIndex"); } } } else { // No memory extension if (mode_concurrent) { if (!src_ignored || !dst_ignored) { - skip |= val.LogMsg(kSrcAndDestMustBeIgnore, __LINE__, src_queue_family, dst_queue_family); + skip |= val.LogMsg(kSrcAndDestMustBeIgnore, src_queue_family, dst_queue_family); } } else { // VK_SHARING_MODE_EXCLUSIVE if (!((src_ignored && dst_ignored) || (val.IsValid(src_queue_family) && val.IsValid(dst_queue_family)))) { - skip |= val.LogMsg(kBothIgnoreOrBothValid, __LINE__, src_queue_family, dst_queue_family); + skip |= val.LogMsg(kBothIgnoreOrBothValid, src_queue_family, dst_queue_family); } } } @@ -7637,30 +7895,30 @@ const auto &mem_barrier = pMemBarriers[i]; if (!ValidateAccessMaskPipelineStage(mem_barrier.srcAccessMask, src_stage_mask)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, VALIDATION_ERROR_1b800940, "DS", - "%s: pMemBarriers[%d].srcAccessMask (0x%X) is not supported by srcStageMask (0x%X). %s", funcName, i, - mem_barrier.srcAccessMask, src_stage_mask, validation_error_map[VALIDATION_ERROR_1b800940]); + HandleToUint64(cb_state->commandBuffer), VALIDATION_ERROR_1b800940, + "%s: pMemBarriers[%d].srcAccessMask (0x%X) is not supported by srcStageMask (0x%X).", funcName, i, + mem_barrier.srcAccessMask, src_stage_mask); } if (!ValidateAccessMaskPipelineStage(mem_barrier.dstAccessMask, dst_stage_mask)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, VALIDATION_ERROR_1b800942, "DS", - "%s: pMemBarriers[%d].dstAccessMask (0x%X) is not supported by dstStageMask (0x%X). %s", funcName, i, - mem_barrier.dstAccessMask, dst_stage_mask, validation_error_map[VALIDATION_ERROR_1b800942]); + HandleToUint64(cb_state->commandBuffer), VALIDATION_ERROR_1b800942, + "%s: pMemBarriers[%d].dstAccessMask (0x%X) is not supported by dstStageMask (0x%X).", funcName, i, + mem_barrier.dstAccessMask, dst_stage_mask); } } for (uint32_t i = 0; i < imageMemBarrierCount; ++i) { auto mem_barrier = &pImageMemBarriers[i]; if (!ValidateAccessMaskPipelineStage(mem_barrier->srcAccessMask, src_stage_mask)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, VALIDATION_ERROR_1b800940, "DS", - "%s: pImageMemBarriers[%d].srcAccessMask (0x%X) is not supported by srcStageMask (0x%X). %s", funcName, - i, mem_barrier->srcAccessMask, src_stage_mask, validation_error_map[VALIDATION_ERROR_1b800940]); + HandleToUint64(cb_state->commandBuffer), VALIDATION_ERROR_1b800940, + "%s: pImageMemBarriers[%d].srcAccessMask (0x%X) is not supported by srcStageMask (0x%X).", funcName, i, + mem_barrier->srcAccessMask, src_stage_mask); } if (!ValidateAccessMaskPipelineStage(mem_barrier->dstAccessMask, dst_stage_mask)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, VALIDATION_ERROR_1b800942, "DS", - "%s: pImageMemBarriers[%d].dstAccessMask (0x%X) is not supported by dstStageMask (0x%X). %s", funcName, - i, mem_barrier->dstAccessMask, dst_stage_mask, validation_error_map[VALIDATION_ERROR_1b800942]); + HandleToUint64(cb_state->commandBuffer), VALIDATION_ERROR_1b800942, + "%s: pImageMemBarriers[%d].dstAccessMask (0x%X) is not supported by dstStageMask (0x%X).", funcName, i, + mem_barrier->dstAccessMask, dst_stage_mask); } auto image_data = GetImageState(device_data, mem_barrier->image); @@ -7668,9 +7926,8 @@ if (mem_barrier->newLayout == VK_IMAGE_LAYOUT_UNDEFINED || mem_barrier->newLayout == VK_IMAGE_LAYOUT_PREINITIALIZED) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, VALIDATION_ERROR_0a00095c, "DS", - "%s: Image Layout cannot be transitioned to UNDEFINED or PREINITIALIZED. %s", funcName, - validation_error_map[VALIDATION_ERROR_0a00095c]); + HandleToUint64(cb_state->commandBuffer), VALIDATION_ERROR_0a00095c, + "%s: Image Layout cannot be transitioned to UNDEFINED or PREINITIALIZED.", funcName); } if (image_data) { @@ -7695,15 +7952,15 @@ if (!ValidateAccessMaskPipelineStage(mem_barrier->srcAccessMask, src_stage_mask)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, VALIDATION_ERROR_1b800940, "DS", - "%s: pBufferMemBarriers[%d].srcAccessMask (0x%X) is not supported by srcStageMask (0x%X). %s", funcName, - i, mem_barrier->srcAccessMask, src_stage_mask, validation_error_map[VALIDATION_ERROR_1b800940]); + HandleToUint64(cb_state->commandBuffer), VALIDATION_ERROR_1b800940, + "%s: pBufferMemBarriers[%d].srcAccessMask (0x%X) is not supported by srcStageMask (0x%X).", funcName, i, + mem_barrier->srcAccessMask, src_stage_mask); } if (!ValidateAccessMaskPipelineStage(mem_barrier->dstAccessMask, dst_stage_mask)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, VALIDATION_ERROR_1b800942, "DS", - "%s: pBufferMemBarriers[%d].dstAccessMask (0x%X) is not supported by dstStageMask (0x%X). %s", funcName, - i, mem_barrier->dstAccessMask, dst_stage_mask, validation_error_map[VALIDATION_ERROR_1b800942]); + HandleToUint64(cb_state->commandBuffer), VALIDATION_ERROR_1b800942, + "%s: pBufferMemBarriers[%d].dstAccessMask (0x%X) is not supported by dstStageMask (0x%X).", funcName, i, + mem_barrier->dstAccessMask, dst_stage_mask); } // Validate buffer barrier queue family indices auto buffer_state = GetBufferState(device_data, mem_barrier->buffer); @@ -7720,19 +7977,18 @@ if (mem_barrier->offset >= buffer_size) { skip |= log_msg( device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, VALIDATION_ERROR_01800946, "DS", - "%s: Buffer Barrier 0x%" PRIx64 " has offset 0x%" PRIx64 " which is not less than total size 0x%" PRIx64 ". %s", - funcName, HandleToUint64(mem_barrier->buffer), HandleToUint64(mem_barrier->offset), HandleToUint64(buffer_size), - validation_error_map[VALIDATION_ERROR_01800946]); + HandleToUint64(cb_state->commandBuffer), VALIDATION_ERROR_01800946, + "%s: Buffer Barrier 0x%" PRIx64 " has offset 0x%" PRIx64 " which is not less than total size 0x%" PRIx64 ".", + funcName, HandleToUint64(mem_barrier->buffer), HandleToUint64(mem_barrier->offset), + HandleToUint64(buffer_size)); } else if (mem_barrier->size != VK_WHOLE_SIZE && (mem_barrier->offset + mem_barrier->size > buffer_size)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(cb_state->commandBuffer), __LINE__, VALIDATION_ERROR_0180094a, "DS", + HandleToUint64(cb_state->commandBuffer), VALIDATION_ERROR_0180094a, "%s: Buffer Barrier 0x%" PRIx64 " has offset 0x%" PRIx64 " and size 0x%" PRIx64 - " whose sum is greater than total size 0x%" PRIx64 ". %s", + " whose sum is greater than total size 0x%" PRIx64 ".", funcName, HandleToUint64(mem_barrier->buffer), HandleToUint64(mem_barrier->offset), - HandleToUint64(mem_barrier->size), HandleToUint64(buffer_size), - validation_error_map[VALIDATION_ERROR_0180094a]); + HandleToUint64(mem_barrier->size), HandleToUint64(buffer_size)); } } } @@ -7755,7 +8011,7 @@ auto global_event_data = GetEventNode(dev_data, event); if (!global_event_data) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, - HandleToUint64(event), __LINE__, DRAWSTATE_INVALID_EVENT, "DS", + HandleToUint64(event), DRAWSTATE_INVALID_EVENT, "Event 0x%" PRIx64 " cannot be waited on if it has never been set.", HandleToUint64(event)); } else { stageMask |= global_event_data->stageMask; @@ -7766,11 +8022,11 @@ // but set event can be called at any time. if (sourceStageMask != stageMask && sourceStageMask != (stageMask | VK_PIPELINE_STAGE_HOST_BIT)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, VALIDATION_ERROR_1e62d401, "DS", + HandleToUint64(pCB->commandBuffer), VALIDATION_ERROR_1e62d401, "Submitting cmdbuffer with call to VkCmdWaitEvents using srcStageMask 0x%X which must be the bitwise OR of " "the stageMask parameters used in calls to vkCmdSetEvent and VK_PIPELINE_STAGE_HOST_BIT if used with " - "vkSetEvent but instead is 0x%X. %s", - sourceStageMask, stageMask, validation_error_map[VALIDATION_ERROR_1e62d401]); + "vkSetEvent but instead is 0x%X.", + sourceStageMask, stageMask); } return skip; } @@ -7815,21 +8071,59 @@ for (const auto &item : stage_flag_bit_array) { if (stage_mask & item) { if ((supported_pipeline_stages_table[item] & queue_flags) == 0) { - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, error_code, "DL", - "%s(): %s flag %s is not compatible with the queue family properties of this command buffer. %s", - function, src_or_dest, string_VkPipelineStageFlagBits(static_cast(item)), - validation_error_map[error_code]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(command_buffer), error_code, + "%s(): %s flag %s is not compatible with the queue family properties of this command buffer.", + function, src_or_dest, string_VkPipelineStageFlagBits(static_cast(item))); } } } return skip; } +// Check if all barriers are of a given operation type. +template +static bool AllTransferOp(const COMMAND_POOL_NODE *pool, OpCheck &op_check, uint32_t count, const Barrier *barriers) { + if (!pool) return false; + + for (uint32_t b = 0; b < count; b++) { + if (!op_check(pool, barriers + b)) return false; + } + return true; +} + +enum BarrierOperationsType { + kAllAcquire, // All Barrier operations are "ownership acquire" operations + kAllRelease, // All Barrier operations are "ownership release" operations + kGeneral, // Either no ownership operations or a mix of ownership operation types and/or non-ownership operations +}; + +// Look at the barriers to see if we they are all release or all acquire, the result impacts queue properties validation +BarrierOperationsType ComputeBarrierOperationsType(layer_data *device_data, GLOBAL_CB_NODE *cb_state, uint32_t buffer_barrier_count, + const VkBufferMemoryBarrier *buffer_barriers, uint32_t image_barrier_count, + const VkImageMemoryBarrier *image_barriers) { + auto pool = GetCommandPoolNode(device_data, cb_state->createInfo.commandPool); + BarrierOperationsType op_type = kGeneral; + + // Look at the barrier details only if they exist + // Note: AllTransferOp returns true for count == 0 + if ((buffer_barrier_count + image_barrier_count) != 0) { + if (AllTransferOp(pool, IsReleaseOp, buffer_barrier_count, buffer_barriers) && + AllTransferOp(pool, IsReleaseOp, image_barrier_count, image_barriers)) { + op_type = kAllRelease; + } else if (AllTransferOp(pool, IsAcquireOp, buffer_barrier_count, buffer_barriers) && + AllTransferOp(pool, IsAcquireOp, image_barrier_count, image_barriers)) { + op_type = kAllAcquire; + } + } + + return op_type; +} + bool ValidateStageMasksAgainstQueueCapabilities(layer_data *dev_data, GLOBAL_CB_NODE const *cb_state, VkPipelineStageFlags source_stage_mask, VkPipelineStageFlags dest_stage_mask, - const char *function, UNIQUE_VALIDATION_ERROR_CODE error_code) { + BarrierOperationsType barrier_op_type, const char *function, + UNIQUE_VALIDATION_ERROR_CODE error_code) { bool skip = false; uint32_t queue_family_index = dev_data->commandPoolMap[cb_state->createInfo.commandPool].queueFamilyIndex; instance_layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(dev_data->physical_device), instance_layer_data_map); @@ -7842,11 +8136,13 @@ if (queue_family_index < physical_device_state->queue_family_properties.size()) { VkQueueFlags specified_queue_flags = physical_device_state->queue_family_properties[queue_family_index].queueFlags; - if ((source_stage_mask & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) == 0) { + // Only check the source stage mask if any barriers aren't "acquire ownership" + if ((barrier_op_type != kAllAcquire) && (source_stage_mask & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) == 0) { skip |= CheckStageMaskQueueCompatibility(dev_data, cb_state->commandBuffer, source_stage_mask, specified_queue_flags, function, "srcStageMask", error_code); } - if ((dest_stage_mask & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) == 0) { + // Only check the dest stage mask if any barriers aren't "release ownership" + if ((barrier_op_type != kAllRelease) && (dest_stage_mask & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) == 0) { skip |= CheckStageMaskQueueCompatibility(dev_data, cb_state->commandBuffer, dest_stage_mask, specified_queue_flags, function, "dstStageMask", error_code); } @@ -7864,8 +8160,10 @@ unique_lock_t lock(global_lock); GLOBAL_CB_NODE *cb_state = GetCBNode(dev_data, commandBuffer); if (cb_state) { - skip |= ValidateStageMasksAgainstQueueCapabilities(dev_data, cb_state, sourceStageMask, dstStageMask, "vkCmdWaitEvents", - VALIDATION_ERROR_1e600918); + auto barrier_op_type = ComputeBarrierOperationsType(dev_data, cb_state, bufferMemoryBarrierCount, pBufferMemoryBarriers, + imageMemoryBarrierCount, pImageMemoryBarriers); + skip |= ValidateStageMasksAgainstQueueCapabilities(dev_data, cb_state, sourceStageMask, dstStageMask, barrier_op_type, + "vkCmdWaitEvents", VALIDATION_ERROR_1e600918); skip |= ValidateStageMaskGsTsEnables(dev_data, sourceStageMask, "vkCmdWaitEvents()", VALIDATION_ERROR_1e60090e, VALIDATION_ERROR_1e600912); skip |= ValidateStageMaskGsTsEnables(dev_data, dstStageMask, "vkCmdWaitEvents()", VALIDATION_ERROR_1e600910, @@ -7891,7 +8189,7 @@ } cb_state->eventUpdates.emplace_back( [=](VkQueue q) { return validateEventStageMask(q, cb_state, eventCount, first_event_index, sourceStageMask); }); - TransitionImageLayouts(dev_data, commandBuffer, imageMemoryBarrierCount, pImageMemoryBarriers); + TransitionImageLayouts(dev_data, cb_state, imageMemoryBarrierCount, pImageMemoryBarriers); } } lock.unlock(); @@ -7907,8 +8205,10 @@ uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) { bool skip = false; - skip |= ValidateStageMasksAgainstQueueCapabilities(device_data, cb_state, srcStageMask, dstStageMask, "vkCmdPipelineBarrier", - VALIDATION_ERROR_1b80093e); + auto barrier_op_type = ComputeBarrierOperationsType(device_data, cb_state, bufferMemoryBarrierCount, pBufferMemoryBarriers, + imageMemoryBarrierCount, pImageMemoryBarriers); + skip |= ValidateStageMasksAgainstQueueCapabilities(device_data, cb_state, srcStageMask, dstStageMask, barrier_op_type, + "vkCmdPipelineBarrier", VALIDATION_ERROR_1b80093e); skip |= ValidateCmdQueueFlags(device_data, cb_state, "vkCmdPipelineBarrier()", VK_QUEUE_TRANSFER_BIT | VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT, VALIDATION_ERROR_1b802415); skip |= ValidateCmd(device_data, cb_state, CMD_PIPELINEBARRIER, "vkCmdPipelineBarrier()"); @@ -7932,7 +8232,7 @@ static void PreCallRecordCmdPipelineBarrier(layer_data *device_data, GLOBAL_CB_NODE *cb_state, VkCommandBuffer commandBuffer, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) { - TransitionImageLayouts(device_data, commandBuffer, imageMemoryBarrierCount, pImageMemoryBarriers); + TransitionImageLayouts(device_data, cb_state, imageMemoryBarrierCount, pImageMemoryBarriers); } VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, @@ -8010,9 +8310,9 @@ if (cb_state) { if (!cb_state->activeQueries.count(query)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1ae00652, "DS", - "Ending a query before it was started: queryPool 0x%" PRIx64 ", index %d. %s", - HandleToUint64(queryPool), slot, validation_error_map[VALIDATION_ERROR_1ae00652]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_1ae00f06, + "Ending a query before it was started: queryPool 0x%" PRIx64 ", index %d.", HandleToUint64(queryPool), + slot); } skip |= ValidateCmdQueueFlags(dev_data, cb_state, "VkCmdEndQuery()", VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT, VALIDATION_ERROR_1ae02415); @@ -8080,7 +8380,7 @@ for (uint32_t i = 0; i < queryCount; i++) { if (IsQueryInvalid(dev_data, queue_data, queryPool, firstQuery + i)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, DRAWSTATE_INVALID_QUERY, "DS", + HandleToUint64(pCB->commandBuffer), DRAWSTATE_INVALID_QUERY, "Requesting a copy from query to buffer with invalid query: queryPool 0x%" PRIx64 ", index %d", HandleToUint64(queryPool), firstQuery + i); } @@ -8141,32 +8441,44 @@ } skip |= validatePushConstantRange(dev_data, offset, size, "vkCmdPushConstants()"); if (0 == stageFlags) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1bc2dc03, "DS", - "vkCmdPushConstants() call has no stageFlags set. %s", validation_error_map[VALIDATION_ERROR_1bc2dc03]); + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1bc2dc03, "vkCmdPushConstants() call has no stageFlags set."); } - // Check if specified push constant range falls within a pipeline-defined range which has matching stageFlags. - // The spec doesn't seem to disallow having multiple push constant ranges with the - // same offset and size, but different stageFlags. So we can't just check the - // stageFlags in the first range with matching offset and size. + // Check if pipeline_layout VkPushConstantRange(s) overlapping offset, size have stageFlags set for each stage in the command + // stageFlags argument, *and* that the command stageFlags argument has bits set for the stageFlags in each overlapping range. if (!skip) { - const auto &ranges = getPipelineLayout(dev_data, layout)->push_constant_ranges; - bool found_matching_range = false; + const auto &ranges = *getPipelineLayout(dev_data, layout)->push_constant_ranges; + VkShaderStageFlags found_stages = 0; for (const auto &range : ranges) { - if ((stageFlags == range.stageFlags) && (offset >= range.offset) && (offset + size <= range.offset + range.size)) { - found_matching_range = true; - break; - } - } - if (!found_matching_range) { - skip |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1bc00e08, "DS", - "vkCmdPushConstants() stageFlags = 0x%" PRIx32 - " do not match the stageFlags in any of the ranges with offset = %d and size = %d in pipeline layout 0x%" PRIx64 - ". %s", - (uint32_t)stageFlags, offset, size, HandleToUint64(layout), validation_error_map[VALIDATION_ERROR_1bc00e08]); + if ((offset >= range.offset) && (offset + size <= range.offset + range.size)) { + VkShaderStageFlags matching_stages = range.stageFlags & stageFlags; + if (matching_stages != range.stageFlags) { + // VALIDATION_ERROR_1bc00e08 VUID-vkCmdPushConstants-offset-01796 + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(commandBuffer), + VALIDATION_ERROR_1bc00e08, + "vkCmdPushConstants(): stageFlags (0x%" PRIx32 ", offset (%" PRIu32 "), and size (%" PRIu32 + "), " + "must contain all stages in overlapping VkPushConstantRange stageFlags (0x%" PRIx32 + "), offset (%" PRIu32 "), and size (%" PRIu32 ") in pipeline layout 0x%" PRIx64 ".", + (uint32_t)stageFlags, offset, size, (uint32_t)range.stageFlags, range.offset, range.size, + HandleToUint64(layout)); + } + + // Accumulate all stages we've found + found_stages = matching_stages | found_stages; + } + } + if (found_stages != stageFlags) { + // VALIDATION_ERROR_1bc00e06 VUID-vkCmdPushConstants-offset-01795 + uint32_t missing_stages = ~found_stages & stageFlags; + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1bc00e06, + "vkCmdPushConstants(): stageFlags = 0x%" PRIx32 ", VkPushConstantRange in pipeline layout 0x%" PRIx64 + " overlapping offset = %d and size = %d, do not contain stageFlags 0x%" PRIx32 ".", + (uint32_t)stageFlags, HandleToUint64(layout), offset, size, missing_stages); } } lock.unlock(); @@ -8180,8 +8492,9 @@ unique_lock_t lock(global_lock); GLOBAL_CB_NODE *cb_state = GetCBNode(dev_data, commandBuffer); if (cb_state) { - skip |= ValidateCmdQueueFlags(dev_data, cb_state, "vkCmdWriteTimestamp()", VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT, - VALIDATION_ERROR_1e802415); + skip |= + ValidateCmdQueueFlags(dev_data, cb_state, "vkCmdWriteTimestamp()", + VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT, VALIDATION_ERROR_1e802415); skip |= ValidateCmd(dev_data, cb_state, CMD_WRITETIMESTAMP, "vkCmdWriteTimestamp()"); } lock.unlock(); @@ -8213,11 +8526,10 @@ if (ici != nullptr) { if ((ici->usage & usage_flag) == 0) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, error_code, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, error_code, "vkCreateFramebuffer: Framebuffer Attachment (%d) conflicts with the image's " - "IMAGE_USAGE flags (%s). %s", - attachments[attach].attachment, string_VkImageUsageFlagBits(usage_flag), - validation_error_map[error_code]); + "IMAGE_USAGE flags (%s).", + attachments[attach].attachment, string_VkImageUsageFlagBits(usage_flag)); } } } @@ -8244,11 +8556,10 @@ const VkRenderPassCreateInfo *rpci = rp_state->createInfo.ptr(); if (rpci->attachmentCount != pCreateInfo->attachmentCount) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - HandleToUint64(pCreateInfo->renderPass), __LINE__, VALIDATION_ERROR_094006d8, "DS", + HandleToUint64(pCreateInfo->renderPass), VALIDATION_ERROR_094006d8, "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of %u does not match attachmentCount " - "of %u of renderPass (0x%" PRIx64 ") being used to create Framebuffer. %s", - pCreateInfo->attachmentCount, rpci->attachmentCount, HandleToUint64(pCreateInfo->renderPass), - validation_error_map[VALIDATION_ERROR_094006d8]); + "of %u of renderPass (0x%" PRIx64 ") being used to create Framebuffer.", + pCreateInfo->attachmentCount, rpci->attachmentCount, HandleToUint64(pCreateInfo->renderPass)); } else { // attachmentCounts match, so make sure corresponding attachment details line up const VkImageView *image_views = pCreateInfo->pAttachments; @@ -8258,29 +8569,29 @@ if (ivci.format != rpci->pAttachments[i].format) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - HandleToUint64(pCreateInfo->renderPass), __LINE__, VALIDATION_ERROR_094006e0, "DS", + HandleToUint64(pCreateInfo->renderPass), VALIDATION_ERROR_094006e0, "vkCreateFramebuffer(): VkFramebufferCreateInfo attachment #%u has format of %s that does not " - "match the format of %s used by the corresponding attachment for renderPass (0x%" PRIx64 "). %s", + "match the format of %s used by the corresponding attachment for renderPass (0x%" PRIx64 ").", i, string_VkFormat(ivci.format), string_VkFormat(rpci->pAttachments[i].format), - HandleToUint64(pCreateInfo->renderPass), validation_error_map[VALIDATION_ERROR_094006e0]); + HandleToUint64(pCreateInfo->renderPass)); } const VkImageCreateInfo *ici = &GetImageState(dev_data, ivci.image)->createInfo; if (ici->samples != rpci->pAttachments[i].samples) { skip |= log_msg( dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - HandleToUint64(pCreateInfo->renderPass), __LINE__, VALIDATION_ERROR_094006e2, "DS", + HandleToUint64(pCreateInfo->renderPass), VALIDATION_ERROR_094006e2, "vkCreateFramebuffer(): VkFramebufferCreateInfo attachment #%u has %s samples that do not match the %s " - "samples used by the corresponding attachment for renderPass (0x%" PRIx64 "). %s", + "samples used by the corresponding attachment for renderPass (0x%" PRIx64 ").", i, string_VkSampleCountFlagBits(ici->samples), string_VkSampleCountFlagBits(rpci->pAttachments[i].samples), - HandleToUint64(pCreateInfo->renderPass), validation_error_map[VALIDATION_ERROR_094006e2]); + HandleToUint64(pCreateInfo->renderPass)); } // Verify that view only has a single mip level if (ivci.subresourceRange.levelCount != 1) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, - 0, __LINE__, VALIDATION_ERROR_094006e6, "DS", + 0, VALIDATION_ERROR_094006e6, "vkCreateFramebuffer(): VkFramebufferCreateInfo attachment #%u has mip levelCount of %u but " - "only a single mip level (levelCount == 1) is allowed when creating a Framebuffer. %s", - i, ivci.subresourceRange.levelCount, validation_error_map[VALIDATION_ERROR_094006e6]); + "only a single mip level (levelCount == 1) is allowed when creating a Framebuffer.", + i, ivci.subresourceRange.levelCount); } const uint32_t mip_level = ivci.subresourceRange.baseMipLevel; uint32_t mip_width = max(1u, ici->extent.width >> mip_level); @@ -8288,34 +8599,31 @@ if ((ivci.subresourceRange.layerCount < pCreateInfo->layers) || (mip_width < pCreateInfo->width) || (mip_height < pCreateInfo->height)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, - 0, __LINE__, VALIDATION_ERROR_094006e4, "DS", + 0, VALIDATION_ERROR_094006e4, "vkCreateFramebuffer(): VkFramebufferCreateInfo attachment #%u mip level %u has dimensions " "smaller than the corresponding framebuffer dimensions. Here are the respective dimensions for " "attachment #%u, framebuffer:\n" "width: %u, %u\n" "height: %u, %u\n" - "layerCount: %u, %u\n%s", + "layerCount: %u, %u\n", i, ivci.subresourceRange.baseMipLevel, i, mip_width, pCreateInfo->width, mip_height, - pCreateInfo->height, ivci.subresourceRange.layerCount, pCreateInfo->layers, - validation_error_map[VALIDATION_ERROR_094006e4]); + pCreateInfo->height, ivci.subresourceRange.layerCount, pCreateInfo->layers); } 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))) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, - 0, __LINE__, VALIDATION_ERROR_094006e8, "DS", + 0, VALIDATION_ERROR_094006e8, "vkCreateFramebuffer(): VkFramebufferCreateInfo attachment #%u has non-identy swizzle. All " "framebuffer attachments must have been 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" - "%s", + "a swizzle = %s\n", i, string_VkComponentSwizzle(ivci.components.r), string_VkComponentSwizzle(ivci.components.g), - string_VkComponentSwizzle(ivci.components.b), string_VkComponentSwizzle(ivci.components.a), - validation_error_map[VALIDATION_ERROR_094006e8]); + string_VkComponentSwizzle(ivci.components.b), string_VkComponentSwizzle(ivci.components.a)); } } } @@ -8338,47 +8646,41 @@ } // Verify FB dimensions are within physical device limits if (pCreateInfo->width > dev_data->phys_dev_properties.properties.limits.maxFramebufferWidth) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_094006ec, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_094006ec, "vkCreateFramebuffer(): Requested VkFramebufferCreateInfo width exceeds physical device limits. Requested " - "width: %u, device max: %u\n%s", - pCreateInfo->width, dev_data->phys_dev_properties.properties.limits.maxFramebufferWidth, - validation_error_map[VALIDATION_ERROR_094006ec]); + "width: %u, device max: %u\n", + pCreateInfo->width, dev_data->phys_dev_properties.properties.limits.maxFramebufferWidth); } if (pCreateInfo->height > dev_data->phys_dev_properties.properties.limits.maxFramebufferHeight) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_094006f0, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_094006f0, "vkCreateFramebuffer(): Requested VkFramebufferCreateInfo height exceeds physical device limits. Requested " - "height: %u, device max: %u\n%s", - pCreateInfo->height, dev_data->phys_dev_properties.properties.limits.maxFramebufferHeight, - validation_error_map[VALIDATION_ERROR_094006f0]); + "height: %u, device max: %u\n", + pCreateInfo->height, dev_data->phys_dev_properties.properties.limits.maxFramebufferHeight); } if (pCreateInfo->layers > dev_data->phys_dev_properties.properties.limits.maxFramebufferLayers) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_094006f4, "DS", + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_094006f4, "vkCreateFramebuffer(): Requested VkFramebufferCreateInfo layers exceeds physical device limits. Requested " - "layers: %u, device max: %u\n%s", - pCreateInfo->layers, dev_data->phys_dev_properties.properties.limits.maxFramebufferLayers, - validation_error_map[VALIDATION_ERROR_094006f4]); + "layers: %u, device max: %u\n", + pCreateInfo->layers, dev_data->phys_dev_properties.properties.limits.maxFramebufferLayers); } // Verify FB dimensions are greater than zero if (pCreateInfo->width <= 0) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_094006ea, "DS", - "vkCreateFramebuffer(): Requested VkFramebufferCreateInfo width must be greater than zero. %s", - validation_error_map[VALIDATION_ERROR_094006ea]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_094006ea, + "vkCreateFramebuffer(): Requested VkFramebufferCreateInfo width must be greater than zero."); } if (pCreateInfo->height <= 0) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_094006ee, "DS", - "vkCreateFramebuffer(): Requested VkFramebufferCreateInfo height must be greater than zero. %s", - validation_error_map[VALIDATION_ERROR_094006ee]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_094006ee, + "vkCreateFramebuffer(): Requested VkFramebufferCreateInfo height must be greater than zero."); } if (pCreateInfo->layers <= 0) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_094006f2, "DS", - "vkCreateFramebuffer(): Requested VkFramebufferCreateInfo layers must be greater than zero. %s", - validation_error_map[VALIDATION_ERROR_094006f2]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_094006f2, + "vkCreateFramebuffer(): Requested VkFramebufferCreateInfo layers must be greater than zero."); } return skip; } @@ -8466,7 +8768,7 @@ if (!(FindDependency(subpass, dependent_subpasses[k], subpass_to_node, processed_nodes) || FindDependency(dependent_subpasses[k], subpass, subpass_to_node, processed_nodes))) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", + DRAWSTATE_INVALID_RENDERPASS, "A dependency between subpasses %d and %d must exist but one is not specified.", subpass, dependent_subpasses[k]); result = false; @@ -8506,7 +8808,7 @@ } if (!has_preserved) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", + DRAWSTATE_INVALID_RENDERPASS, "Attachment %d is used by a later subpass and must be preserved in subpass %d.", attachment, index); } } @@ -8573,15 +8875,15 @@ for (auto other_attachment : overlapping_attachments[i]) { if (!(pCreateInfo->pAttachments[attachment].flags & VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, - HandleToUint64(framebuffer->framebuffer), __LINE__, VALIDATION_ERROR_12200682, "DS", - "Attachment %d aliases attachment %d but doesn't set VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT. %s", - attachment, other_attachment, validation_error_map[VALIDATION_ERROR_12200682]); + HandleToUint64(framebuffer->framebuffer), VALIDATION_ERROR_12200682, + "Attachment %d aliases attachment %d but doesn't set VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT.", + attachment, other_attachment); } if (!(pCreateInfo->pAttachments[other_attachment].flags & VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, - HandleToUint64(framebuffer->framebuffer), __LINE__, VALIDATION_ERROR_12200682, "DS", - "Attachment %d aliases attachment %d but doesn't set VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT. %s", - other_attachment, attachment, validation_error_map[VALIDATION_ERROR_12200682]); + HandleToUint64(framebuffer->framebuffer), VALIDATION_ERROR_12200682, + "Attachment %d aliases attachment %d but doesn't set VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT.", + other_attachment, attachment); } } } @@ -8617,7 +8919,7 @@ if (attachmentIndices.count(attachment)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", + DRAWSTATE_INVALID_RENDERPASS, "Cannot use same attachment (%u) as both color and depth output in same subpass (%u).", attachment, i); } } @@ -8668,13 +8970,12 @@ const VkSubpassDependency &dependency = pCreateInfo->pDependencies[i]; if (dependency.srcSubpass == VK_SUBPASS_EXTERNAL || dependency.dstSubpass == VK_SUBPASS_EXTERNAL) { if (dependency.srcSubpass == dependency.dstSubpass) { - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", "The src and dest subpasses cannot both be external."); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + DRAWSTATE_INVALID_RENDERPASS, "The src and dest subpasses cannot both be external."); } } else if (dependency.srcSubpass > dependency.dstSubpass) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", + DRAWSTATE_INVALID_RENDERPASS, "Dependency graph must be specified such that an earlier pass cannot depend on a later pass."); } else if (dependency.srcSubpass == dependency.dstSubpass) { has_self_dependency[dependency.srcSubpass] = true; @@ -8707,10 +9008,10 @@ static bool ValidateAttachmentIndex(layer_data *dev_data, uint32_t attachment, uint32_t attachment_count, const char *type) { bool skip = false; if (attachment >= attachment_count && attachment != VK_ATTACHMENT_UNUSED) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_12200684, "DS", - "CreateRenderPass: %s attachment %d must be less than the total number of attachments %d. %s", type, - attachment, attachment_count, validation_error_map[VALIDATION_ERROR_12200684]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_12200684, + "CreateRenderPass: %s attachment %d must be less than the total number of attachments %d.", type, + attachment, attachment_count); } return skip; } @@ -8723,18 +9024,16 @@ const VkSubpassDescription &subpass = pCreateInfo->pSubpasses[i]; if (subpass.pipelineBindPoint != VK_PIPELINE_BIND_POINT_GRAPHICS) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_14000698, "DS", - "CreateRenderPass: Pipeline bind point for subpass %d must be VK_PIPELINE_BIND_POINT_GRAPHICS. %s", i, - validation_error_map[VALIDATION_ERROR_14000698]); + VALIDATION_ERROR_14000698, + "CreateRenderPass: Pipeline bind point for subpass %d must be VK_PIPELINE_BIND_POINT_GRAPHICS.", i); } for (uint32_t j = 0; j < subpass.preserveAttachmentCount; ++j) { uint32_t attachment = subpass.pPreserveAttachments[j]; if (attachment == VK_ATTACHMENT_UNUSED) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_140006aa, "DS", - "CreateRenderPass: Preserve attachment (%d) must not be VK_ATTACHMENT_UNUSED. %s", j, - validation_error_map[VALIDATION_ERROR_140006aa]); + VALIDATION_ERROR_140006aa, + "CreateRenderPass: Preserve attachment (%d) must not be VK_ATTACHMENT_UNUSED.", j); } else { skip |= ValidateAttachmentIndex(dev_data, attachment, pCreateInfo->attachmentCount, "Preserve"); @@ -8748,10 +9047,10 @@ } if (found) { skip |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_140006ac, "DS", - "CreateRenderPass: subpass %u pPreserveAttachments[%u] (%u) must not be used elsewhere in the subpass. %s", - i, j, attachment, validation_error_map[VALIDATION_ERROR_140006ac]); + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_140006ac, + "CreateRenderPass: subpass %u pPreserveAttachments[%u] (%u) must not be used elsewhere in the subpass.", i, + j, attachment); } } } @@ -8772,20 +9071,19 @@ if (!skip && attachment != VK_ATTACHMENT_UNUSED && pCreateInfo->pAttachments[attachment].samples != VK_SAMPLE_COUNT_1_BIT) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, - 0, __LINE__, VALIDATION_ERROR_140006a2, "DS", + 0, VALIDATION_ERROR_140006a2, "CreateRenderPass: Subpass %u requests multisample resolve into attachment %u, which must " - "have VK_SAMPLE_COUNT_1_BIT but has %s. %s", - i, attachment, string_VkSampleCountFlagBits(pCreateInfo->pAttachments[attachment].samples), - validation_error_map[VALIDATION_ERROR_140006a2]); + "have VK_SAMPLE_COUNT_1_BIT but has %s.", + i, attachment, string_VkSampleCountFlagBits(pCreateInfo->pAttachments[attachment].samples)); } if (!skip && subpass.pResolveAttachments[j].attachment != VK_ATTACHMENT_UNUSED && subpass.pColorAttachments[j].attachment == VK_ATTACHMENT_UNUSED) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, - 0, __LINE__, VALIDATION_ERROR_1400069e, "DS", + 0, VALIDATION_ERROR_1400069e, "CreateRenderPass: Subpass %u requests multisample resolve from attachment %u which has " - "attachment=VK_ATTACHMENT_UNUSED. %s", - i, attachment, validation_error_map[VALIDATION_ERROR_1400069e]); + "attachment=VK_ATTACHMENT_UNUSED.", + i, attachment); } } attachment = subpass.pColorAttachments[j].attachment; @@ -8796,22 +9094,21 @@ if (subpass_performs_resolve && pCreateInfo->pAttachments[attachment].samples == VK_SAMPLE_COUNT_1_BIT) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, - 0, __LINE__, VALIDATION_ERROR_140006a0, "DS", + 0, VALIDATION_ERROR_140006a0, "CreateRenderPass: Subpass %u requests multisample resolve from attachment %u which has " - "VK_SAMPLE_COUNT_1_BIT. %s", - i, attachment, validation_error_map[VALIDATION_ERROR_140006a0]); + "VK_SAMPLE_COUNT_1_BIT.", + i, attachment); } if (subpass_performs_resolve && subpass.pResolveAttachments[j].attachment != VK_ATTACHMENT_UNUSED) { const auto &color_desc = pCreateInfo->pAttachments[attachment]; const auto &resolve_desc = pCreateInfo->pAttachments[subpass.pResolveAttachments[j].attachment]; if (color_desc.format != resolve_desc.format) { - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, - 0, __LINE__, VALIDATION_ERROR_140006a4, "DS", - "CreateRenderPass: Subpass %u pColorAttachments[%u] resolves to an attachment with a " - "different format. color format: %u, resolve format: %u. %s", - i, j, color_desc.format, resolve_desc.format, validation_error_map[VALIDATION_ERROR_140006a4]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, VALIDATION_ERROR_140006a4, + "CreateRenderPass: Subpass %u pColorAttachments[%u] resolves to an attachment with a " + "different format. color format: %u, resolve format: %u.", + i, j, color_desc.format, resolve_desc.format); } } @@ -8821,12 +9118,11 @@ pCreateInfo->pAttachments[subpass.pDepthStencilAttachment->attachment].samples; if (pCreateInfo->pAttachments[attachment].samples > depth_stencil_sample_count) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, VALIDATION_ERROR_14000bc4, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, VALIDATION_ERROR_14000bc4, "CreateRenderPass: Subpass %u pColorAttachments[%u] has %s which is larger than " - "depth/stencil attachment %s. %s", + "depth/stencil attachment %s.", i, j, string_VkSampleCountFlagBits(pCreateInfo->pAttachments[attachment].samples), - string_VkSampleCountFlagBits(depth_stencil_sample_count), - validation_error_map[VALIDATION_ERROR_14000bc4]); + string_VkSampleCountFlagBits(depth_stencil_sample_count)); } } } @@ -8848,9 +9144,8 @@ if (!dev_data->extensions.vk_amd_mixed_attachment_samples && sample_count && !IsPowerOfTwo(sample_count)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_0082b401, "DS", - "CreateRenderPass: Subpass %u attempts to render to attachments with inconsistent sample counts. %s", - i, validation_error_map[VALIDATION_ERROR_0082b401]); + VALIDATION_ERROR_0082b401, + "CreateRenderPass: Subpass %u attempts to render to attachments with inconsistent sample counts.", i); } } return skip; @@ -8930,8 +9225,8 @@ bool skip = false; if (pCB->createInfo.level != VK_COMMAND_BUFFER_LEVEL_PRIMARY) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, error_code, "DS", - "Cannot execute command %s on a secondary command buffer. %s", cmd_name, validation_error_map[error_code]); + HandleToUint64(pCB->commandBuffer), error_code, "Cannot execute command %s on a secondary command buffer.", + cmd_name); } return skip; } @@ -8945,8 +9240,8 @@ pRenderPassBegin->renderArea.offset.y < 0 || (pRenderPassBegin->renderArea.offset.y + pRenderPassBegin->renderArea.extent.height) > pFramebufferInfo->height) { skip |= static_cast(log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DRAWSTATE_INVALID_RENDER_AREA, "CORE", + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + DRAWSTATE_INVALID_RENDER_AREA, "Cannot execute a render pass with renderArea not within the bound of the framebuffer. RenderArea: x %d, y %d, width " "%d, height %d. Framebuffer: width %d, height %d.", pRenderPassBegin->renderArea.offset.x, pRenderPassBegin->renderArea.offset.y, pRenderPassBegin->renderArea.extent.width, @@ -9017,15 +9312,15 @@ } if (clear_op_size > pRenderPassBegin->clearValueCount) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, - HandleToUint64(render_pass_state->renderPass), __LINE__, VALIDATION_ERROR_1200070c, "DS", + HandleToUint64(render_pass_state->renderPass), VALIDATION_ERROR_1200070c, "In vkCmdBeginRenderPass() the VkRenderPassBeginInfo struct has a clearValueCount of %u but there " "must be at least %u entries in pClearValues array to account for the highest index attachment in " "renderPass 0x%" PRIx64 " that uses VK_ATTACHMENT_LOAD_OP_CLEAR is %u. Note that the pClearValues array is indexed by " "attachment number so even if some pClearValues entries between 0 and %u correspond to attachments " - "that aren't cleared they will be ignored. %s", + "that aren't cleared they will be ignored.", pRenderPassBegin->clearValueCount, clear_op_size, HandleToUint64(render_pass_state->renderPass), - clear_op_size, clear_op_size - 1, validation_error_map[VALIDATION_ERROR_1200070c]); + clear_op_size, clear_op_size - 1); } skip |= VerifyRenderAreaBounds(dev_data, pRenderPassBegin); skip |= VerifyFramebufferAndRenderPassLayouts(dev_data, cb_node, pRenderPassBegin, @@ -9076,9 +9371,8 @@ auto subpassCount = pCB->activeRenderPass->createInfo.subpassCount; if (pCB->activeSubpass == subpassCount - 1) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1b60071a, "DS", - "vkCmdNextSubpass(): Attempted to advance beyond final subpass. %s", - validation_error_map[VALIDATION_ERROR_1b60071a]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_1b60071a, + "vkCmdNextSubpass(): Attempted to advance beyond final subpass."); } } lock.unlock(); @@ -9108,9 +9402,8 @@ if (rp_state) { if (pCB->activeSubpass != rp_state->createInfo.subpassCount - 1) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(commandBuffer), __LINE__, - VALIDATION_ERROR_1b00071c, "DS", "vkCmdEndRenderPass(): Called before reaching final subpass. %s", - validation_error_map[VALIDATION_ERROR_1b00071c]); + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(commandBuffer), + VALIDATION_ERROR_1b00071c, "vkCmdEndRenderPass(): Called before reaching final subpass."); } for (size_t i = 0; i < rp_state->createInfo.attachmentCount; ++i) { @@ -9164,17 +9457,16 @@ if (secondary_fb != VK_NULL_HANDLE) { if (primary_fb != secondary_fb) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(primaryBuffer), __LINE__, VALIDATION_ERROR_1b2000c6, "DS", + HandleToUint64(primaryBuffer), VALIDATION_ERROR_1b2000c6, "vkCmdExecuteCommands() called w/ invalid secondary command buffer 0x%" PRIx64 " which has a framebuffer 0x%" PRIx64 - " that is not the same as the primary command buffer's current active framebuffer 0x%" PRIx64 ". %s", - HandleToUint64(secondaryBuffer), HandleToUint64(secondary_fb), HandleToUint64(primary_fb), - validation_error_map[VALIDATION_ERROR_1b2000c6]); + " that is not the same as the primary command buffer's current active framebuffer 0x%" PRIx64 ".", + HandleToUint64(secondaryBuffer), HandleToUint64(secondary_fb), HandleToUint64(primary_fb)); } auto fb = GetFramebufferState(dev_data, secondary_fb); if (!fb) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(primaryBuffer), __LINE__, DRAWSTATE_INVALID_SECONDARY_COMMAND_BUFFER, "DS", + HandleToUint64(primaryBuffer), DRAWSTATE_INVALID_SECONDARY_COMMAND_BUFFER, "vkCmdExecuteCommands() called w/ invalid Cmd Buffer 0x%" PRIx64 " which has invalid framebuffer 0x%" PRIx64 ".", HandleToUint64(secondaryBuffer), HandleToUint64(secondary_fb)); @@ -9196,12 +9488,11 @@ if ((cmdBufStatistics & queryPoolData->second.createInfo.pipelineStatistics) != cmdBufStatistics) { skip |= log_msg( dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, VALIDATION_ERROR_1b2000d0, "DS", + HandleToUint64(pCB->commandBuffer), VALIDATION_ERROR_1b2000d0, "vkCmdExecuteCommands() called w/ invalid Cmd Buffer 0x%" PRIx64 " which has invalid active query pool 0x%" PRIx64 - ". Pipeline statistics is being queried so the command buffer must have all bits set on the queryPool. %s", - HandleToUint64(pCB->commandBuffer), HandleToUint64(queryPoolData->first), - validation_error_map[VALIDATION_ERROR_1b2000d0]); + ". Pipeline statistics is being queried so the command buffer must have all bits set on the queryPool.", + HandleToUint64(pCB->commandBuffer), HandleToUint64(queryPoolData->first)); } } activeTypes.insert(queryPoolData->second.createInfo.queryType); @@ -9211,7 +9502,7 @@ auto queryPoolData = dev_data->queryPoolMap.find(queryObject.pool); if (queryPoolData != dev_data->queryPoolMap.end() && activeTypes.count(queryPoolData->second.createInfo.queryType)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCB->commandBuffer), __LINE__, DRAWSTATE_INVALID_SECONDARY_COMMAND_BUFFER, "DS", + HandleToUint64(pCB->commandBuffer), DRAWSTATE_INVALID_SECONDARY_COMMAND_BUFFER, "vkCmdExecuteCommands() called w/ invalid Cmd Buffer 0x%" PRIx64 " which has invalid active query pool 0x%" PRIx64 " of type %d but a query of that type has been started on secondary Cmd Buffer 0x%" PRIx64 ".", @@ -9224,7 +9515,7 @@ auto secondary_pool = GetCommandPoolNode(dev_data, pSubCB->createInfo.commandPool); if (primary_pool && secondary_pool && (primary_pool->queueFamilyIndex != secondary_pool->queueFamilyIndex)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pSubCB->commandBuffer), __LINE__, DRAWSTATE_INVALID_QUEUE_FAMILY, "DS", + HandleToUint64(pSubCB->commandBuffer), DRAWSTATE_INVALID_QUEUE_FAMILY, "vkCmdExecuteCommands(): Primary command buffer 0x%" PRIx64 " created in queue family %d has secondary command buffer 0x%" PRIx64 " created in queue family %d.", HandleToUint64(pCB->commandBuffer), primary_pool->queueFamilyIndex, HandleToUint64(pSubCB->commandBuffer), @@ -9246,25 +9537,24 @@ pSubCB = GetCBNode(dev_data, pCommandBuffers[i]); assert(pSubCB); if (VK_COMMAND_BUFFER_LEVEL_PRIMARY == pSubCB->createInfo.level) { - skip |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCommandBuffers[i]), __LINE__, VALIDATION_ERROR_1b2000b0, "DS", - "vkCmdExecuteCommands() called w/ Primary Cmd Buffer 0x%" PRIx64 - " in element %u of pCommandBuffers array. All cmd buffers in pCommandBuffers array must be secondary. %s", - HandleToUint64(pCommandBuffers[i]), i, validation_error_map[VALIDATION_ERROR_1b2000b0]); + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(pCommandBuffers[i]), VALIDATION_ERROR_1b2000b0, + "vkCmdExecuteCommands() called w/ Primary Cmd Buffer 0x%" PRIx64 + " in element %u of pCommandBuffers array. All cmd buffers in pCommandBuffers array must be secondary.", + HandleToUint64(pCommandBuffers[i]), i); } else if (pCB->activeRenderPass) { // Secondary CB w/i RenderPass must have *CONTINUE_BIT set if (pSubCB->beginInfo.pInheritanceInfo != nullptr) { auto secondary_rp_state = GetRenderPassState(dev_data, pSubCB->beginInfo.pInheritanceInfo->renderPass); if (!(pSubCB->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(pCommandBuffers[i]), - __LINE__, VALIDATION_ERROR_1b2000c0, "DS", + VALIDATION_ERROR_1b2000c0, "vkCmdExecuteCommands(): Secondary Command Buffer (0x%" PRIx64 ") executed within render pass (0x%" PRIx64 ") must have had vkBeginCommandBuffer() called w/ " - "VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT set. %s", - HandleToUint64(pCommandBuffers[i]), HandleToUint64(pCB->activeRenderPass->renderPass), - validation_error_map[VALIDATION_ERROR_1b2000c0]); + "VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT set.", + HandleToUint64(pCommandBuffers[i]), HandleToUint64(pCB->activeRenderPass->renderPass)); } else { // Make sure render pass is compatible with parent command buffer pass if has continue if (pCB->activeRenderPass->renderPass != secondary_rp_state->renderPass) { @@ -9275,10 +9565,10 @@ // If framebuffer for secondary CB is not NULL, then it must match active FB from primaryCB skip |= validateFramebuffer(dev_data, commandBuffer, pCB, pCommandBuffers[i], pSubCB, "vkCmdExecuteCommands()"); - if (VK_NULL_HANDLE == pSubCB->activeFramebuffer) { + if (!pSubCB->cmd_execute_commands_functions.empty()) { // Inherit primary's activeFramebuffer and while running validate functions for (auto &function : pSubCB->cmd_execute_commands_functions) { - skip |= function(pCB->activeFramebuffer); + skip |= function(pCB, pCB->activeFramebuffer); } } } @@ -9290,17 +9580,17 @@ if (!(pSubCB->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT)) { if (pSubCB->in_use.load() || pCB->linkedCommandBuffers.count(pSubCB)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(pCB->commandBuffer), __LINE__, - VALIDATION_ERROR_1b2000b4, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(pCB->commandBuffer), + VALIDATION_ERROR_1b2000b4, "Attempt to simultaneously execute command buffer 0x%" PRIx64 - " without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set! %s", - HandleToUint64(pCB->commandBuffer), validation_error_map[VALIDATION_ERROR_1b2000b4]); + " without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!", + HandleToUint64(pCB->commandBuffer)); } if (pCB->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) { // Warn that non-simultaneous secondary cmd buffer renders primary non-simultaneous skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(pCommandBuffers[i]), __LINE__, - DRAWSTATE_INVALID_CB_SIMULTANEOUS_USE, "DS", + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, HandleToUint64(pCommandBuffers[i]), + DRAWSTATE_INVALID_CB_SIMULTANEOUS_USE, "vkCmdExecuteCommands(): Secondary Command Buffer (0x%" PRIx64 ") does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and will cause primary " "command buffer (0x%" PRIx64 @@ -9313,10 +9603,10 @@ if (!pCB->activeQueries.empty() && !dev_data->enabled_features.inheritedQueries) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(pCommandBuffers[i]), __LINE__, VALIDATION_ERROR_1b2000ca, "DS", + HandleToUint64(pCommandBuffers[i]), VALIDATION_ERROR_1b2000ca, "vkCmdExecuteCommands(): Secondary Command Buffer (0x%" PRIx64 - ") cannot be submitted with a query in flight and inherited queries not supported on this device. %s", - HandleToUint64(pCommandBuffers[i]), validation_error_map[VALIDATION_ERROR_1b2000ca]); + ") cannot be submitted with a query in flight and inherited queries not supported on this device.", + HandleToUint64(pCommandBuffers[i])); } // TODO: separate validate from update! This is very tangled. // Propagate layout transitions to the primary cmd buffer @@ -9371,9 +9661,9 @@ if ((dev_data->phys_dev_mem_props.memoryTypes[mem_info->alloc_info.memoryTypeIndex].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0) { skip = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem), __LINE__, VALIDATION_ERROR_31200554, "MEM", - "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set: mem obj 0x%" PRIx64 ". %s", - HandleToUint64(mem), validation_error_map[VALIDATION_ERROR_31200554]); + HandleToUint64(mem), VALIDATION_ERROR_31200554, + "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set: mem obj 0x%" PRIx64 ".", + HandleToUint64(mem)); } } skip |= ValidateMapMemRange(dev_data, mem, offset, size); @@ -9412,13 +9702,12 @@ if (mem_info) { if (pMemRanges[i].size == VK_WHOLE_SIZE) { if (mem_info->mem_range.offset > pMemRanges[i].offset) { - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(pMemRanges[i].memory), __LINE__, VALIDATION_ERROR_0c20055c, "MEM", - "%s: Flush/Invalidate offset (" PRINTF_SIZE_T_SPECIFIER - ") is less than Memory Object's offset (" PRINTF_SIZE_T_SPECIFIER "). %s", - funcName, static_cast(pMemRanges[i].offset), - static_cast(mem_info->mem_range.offset), validation_error_map[VALIDATION_ERROR_0c20055c]); + skip |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, + HandleToUint64(pMemRanges[i].memory), VALIDATION_ERROR_0c20055c, + "%s: Flush/Invalidate offset (" PRINTF_SIZE_T_SPECIFIER + ") is less than Memory Object's offset (" PRINTF_SIZE_T_SPECIFIER ").", + funcName, static_cast(pMemRanges[i].offset), static_cast(mem_info->mem_range.offset)); } } else { const uint64_t data_end = (mem_info->mem_range.size == VK_WHOLE_SIZE) @@ -9428,12 +9717,11 @@ (data_end < (pMemRanges[i].offset + pMemRanges[i].size))) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(pMemRanges[i].memory), __LINE__, VALIDATION_ERROR_0c20055a, "MEM", + HandleToUint64(pMemRanges[i].memory), VALIDATION_ERROR_0c20055a, "%s: Flush/Invalidate size or offset (" PRINTF_SIZE_T_SPECIFIER ", " PRINTF_SIZE_T_SPECIFIER - ") exceed the Memory Object's upper-bound (" PRINTF_SIZE_T_SPECIFIER "). %s", + ") exceed the Memory Object's upper-bound (" PRINTF_SIZE_T_SPECIFIER ").", funcName, static_cast(pMemRanges[i].offset + pMemRanges[i].size), - static_cast(pMemRanges[i].offset), static_cast(data_end), - validation_error_map[VALIDATION_ERROR_0c20055a]); + static_cast(pMemRanges[i].offset), static_cast(data_end)); } } } @@ -9454,17 +9742,17 @@ char *data = static_cast(mem_info->shadow_copy); for (uint64_t j = 0; j < mem_info->shadow_pad_size; ++j) { if (data[j] != NoncoherentMemoryFillValue) { - skip |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem_ranges[i].memory), __LINE__, MEMTRACK_INVALID_MAP, "MEM", - "Memory underflow was detected on mem obj 0x%" PRIx64, HandleToUint64(mem_ranges[i].memory)); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, HandleToUint64(mem_ranges[i].memory), + MEMTRACK_INVALID_MAP, "Memory underflow was detected on mem obj 0x%" PRIx64, + HandleToUint64(mem_ranges[i].memory)); } } for (uint64_t j = (size + mem_info->shadow_pad_size); j < (2 * mem_info->shadow_pad_size + size); ++j) { if (data[j] != NoncoherentMemoryFillValue) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, HandleToUint64(mem_ranges[i].memory), - __LINE__, MEMTRACK_INVALID_MAP, "MEM", "Memory overflow was detected on mem obj 0x%" PRIx64, + MEMTRACK_INVALID_MAP, "Memory overflow was detected on mem obj 0x%" PRIx64, HandleToUint64(mem_ranges[i].memory)); } } @@ -9495,17 +9783,17 @@ uint64_t atom_size = dev_data->phys_dev_properties.properties.limits.nonCoherentAtomSize; if (SafeModulo(mem_ranges[i].offset, atom_size) != 0) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem_ranges->memory), __LINE__, VALIDATION_ERROR_0c20055e, "MEM", + HandleToUint64(mem_ranges->memory), VALIDATION_ERROR_0c20055e, "%s: Offset in pMemRanges[%d] is 0x%" PRIxLEAST64 - ", which is not a multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize (0x%" PRIxLEAST64 "). %s", - func_name, i, mem_ranges[i].offset, atom_size, validation_error_map[VALIDATION_ERROR_0c20055e]); + ", which is not a multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize (0x%" PRIxLEAST64 ").", + func_name, i, mem_ranges[i].offset, atom_size); } if ((mem_ranges[i].size != VK_WHOLE_SIZE) && (SafeModulo(mem_ranges[i].size, atom_size) != 0)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - HandleToUint64(mem_ranges->memory), __LINE__, VALIDATION_ERROR_0c200adc, "MEM", + HandleToUint64(mem_ranges->memory), VALIDATION_ERROR_0c200adc, "%s: Size in pMemRanges[%d] is 0x%" PRIxLEAST64 - ", which is not a multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize (0x%" PRIxLEAST64 "). %s", - func_name, i, mem_ranges[i].size, atom_size, validation_error_map[VALIDATION_ERROR_0c200adc]); + ", which is not a multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize (0x%" PRIxLEAST64 ").", + func_name, i, mem_ranges[i].size, atom_size); } } return skip; @@ -9573,7 +9861,7 @@ // BindImageMemory but it's implied in that memory being bound must conform with VkMemoryRequirements from // vkGetImageMemoryRequirements() skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - image_handle, __LINE__, DRAWSTATE_INVALID_IMAGE, "DS", + image_handle, DRAWSTATE_INVALID_IMAGE, "%s: Binding memory to image 0x%" PRIx64 " but vkGetImageMemoryRequirements() has not been called on that image.", api_name, HandleToUint64(image_handle)); @@ -9595,24 +9883,38 @@ // Validate memory requirements alignment if (SafeModulo(memoryOffset, image_state->requirements.alignment) != 0) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - image_handle, __LINE__, VALIDATION_ERROR_17400830, "DS", + image_handle, VALIDATION_ERROR_17400830, "%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. %s", - api_name, memoryOffset, image_state->requirements.alignment, - validation_error_map[VALIDATION_ERROR_17400830]); + ", returned from a call to vkGetImageMemoryRequirements with image.", + api_name, memoryOffset, image_state->requirements.alignment); } - // Validate memory requirements size if (mem_info) { + // Validate memory requirements size if (image_state->requirements.size > mem_info->alloc_info.allocationSize - memoryOffset) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - image_handle, __LINE__, VALIDATION_ERROR_17400832, "DS", + image_handle, VALIDATION_ERROR_17400832, "%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. %s", - api_name, mem_info->alloc_info.allocationSize - memoryOffset, image_state->requirements.size, - validation_error_map[VALIDATION_ERROR_17400832]); + ", returned from a call to vkGetImageMemoryRequirements with image.", + api_name, mem_info->alloc_info.allocationSize - memoryOffset, image_state->requirements.size); + } + + // Validate dedicated allocation + if (mem_info->is_dedicated && ((mem_info->dedicated_image != image) || (memoryOffset != 0))) { + // TODO: Add vkBindImageMemory2KHR error message when added to spec. + auto validation_error = VALIDATION_ERROR_UNDEFINED; + if (strcmp(api_name, "vkBindImageMemory()") == 0) { + validation_error = VALIDATION_ERROR_17400bca; + } + skip |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, + image_handle, validation_error, + "%s: for dedicated memory allocation 0x%" PRIxLEAST64 + ", VkMemoryDedicatedAllocateInfoKHR::image 0x%" PRIXLEAST64 " must be equal to image 0x%" PRIxLEAST64 + " and memoryOffset 0x%" PRIxLEAST64 " must be zero.", + api_name, HandleToUint64(mem), HandleToUint64(mem_info->dedicated_image), image_handle, memoryOffset); } } } @@ -9719,7 +10021,7 @@ event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT; if (event_state->write_in_use) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, - HandleToUint64(event), __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", + HandleToUint64(event), DRAWSTATE_QUEUE_FORWARD_PROGRESS, "Cannot call vkSetEvent() on event 0x%" PRIx64 " that is already in use by a command buffer.", HandleToUint64(event)); } @@ -9761,7 +10063,7 @@ if (unsignaled_semaphores.count(semaphore) || (!(signaled_semaphores.count(semaphore)) && !(pSemaphore->signaled))) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, - HandleToUint64(semaphore), __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", + HandleToUint64(semaphore), DRAWSTATE_QUEUE_FORWARD_PROGRESS, "Queue 0x%" PRIx64 " is waiting on semaphore 0x%" PRIx64 " that has no way to be signaled.", HandleToUint64(queue), HandleToUint64(semaphore)); } else { @@ -9779,7 +10081,7 @@ if (pSemaphore && pSemaphore->scope == kSyncScopeInternal) { if (signaled_semaphores.count(semaphore) || (!(unsignaled_semaphores.count(semaphore)) && pSemaphore->signaled)) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, - HandleToUint64(semaphore), __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", + HandleToUint64(semaphore), DRAWSTATE_QUEUE_FORWARD_PROGRESS, "Queue 0x%" PRIx64 " is signaling semaphore 0x%" PRIx64 " that has already been signaled but not waited on by queue 0x%" PRIx64 ".", HandleToUint64(queue), HandleToUint64(semaphore), HandleToUint64(pSemaphore->signaler.first)); @@ -9799,7 +10101,7 @@ if (!image_state->get_sparse_reqs_called || image_state->sparse_requirements.empty()) { // For now just warning if sparse image binding occurs without calling to get reqs first return log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, MEMTRACK_INVALID_STATE, "CV", + HandleToUint64(image_state->image), MEMTRACK_INVALID_STATE, "vkQueueBindSparse(): Binding sparse memory to image 0x%" PRIx64 " without first calling vkGetImageSparseMemoryRequirements[2KHR]() to retrieve requirements.", HandleToUint64(image_state->image)); @@ -9816,7 +10118,7 @@ if (!image_state->get_sparse_reqs_called || image_state->sparse_requirements.empty()) { // For now just warning if sparse image binding occurs without calling to get reqs first return log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(image_state->image), __LINE__, MEMTRACK_INVALID_STATE, "CV", + HandleToUint64(image_state->image), MEMTRACK_INVALID_STATE, "vkQueueBindSparse(): Binding opaque sparse memory to image 0x%" PRIx64 " without first calling vkGetImageSparseMemoryRequirements[2KHR]() to retrieve requirements.", HandleToUint64(image_state->image)); @@ -9826,7 +10128,7 @@ if (sparse_image_state->sparse_metadata_required && !sparse_image_state->sparse_metadata_bound) { // Warn if sparse image binding metadata required for image with sparse binding, but metadata not bound return log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(sparse_image_state->image), __LINE__, MEMTRACK_INVALID_STATE, "CV", + HandleToUint64(sparse_image_state->image), MEMTRACK_INVALID_STATE, "vkQueueBindSparse(): Binding sparse memory to image 0x%" PRIx64 " which requires a metadata aspect but no binding with VK_IMAGE_ASPECT_METADATA_BIT set was made.", HandleToUint64(sparse_image_state->image)); @@ -9856,7 +10158,7 @@ if (!dev_data->external_sync_warning) { dev_data->external_sync_warning = true; log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - HandleToUint64(fence), __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", + HandleToUint64(fence), DRAWSTATE_QUEUE_FORWARD_PROGRESS, "vkQueueBindSparse(): Signaling external fence 0x%" PRIx64 " on queue 0x%" PRIx64 " will disable validation of preceding command buffer lifecycle states and the in-use status of associated " "objects.", @@ -9931,7 +10233,7 @@ if (!dev_data->external_sync_warning) { dev_data->external_sync_warning = true; log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, - HandleToUint64(semaphore), __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", + HandleToUint64(semaphore), DRAWSTATE_QUEUE_FORWARD_PROGRESS, "vkQueueBindSparse(): Signaling external semaphore 0x%" PRIx64 " on queue 0x%" PRIx64 " will disable validation of preceding command buffer lifecycle states and the in-use status of " "associated objects.", @@ -10079,7 +10381,7 @@ bool skip = false; if (fence_node && fence_node->scope == kSyncScopeInternal && fence_node->state == FENCE_INFLIGHT) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - HandleToUint64(fence), __LINE__, VALIDATION_ERROR_UNDEFINED, "DS", + HandleToUint64(fence), VALIDATION_ERROR_UNDEFINED, "Cannot call %s on fence 0x%" PRIx64 " that is currently in use.", caller_name, HandleToUint64(fence)); } return skip; @@ -10201,31 +10503,40 @@ if (!is_supported) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_146009ec, "DS", + HandleToUint64(dev_data->device), VALIDATION_ERROR_146009ec, "%s: pCreateInfo->surface is not known at this time to be supported for presentation by this device. The " "vkGetPhysicalDeviceSurfaceSupportKHR() must be called beforehand, and it must return VK_TRUE support with " - "this surface for at least one queue family of this device. %s", - func_name, validation_error_map[VALIDATION_ERROR_146009ec])) + "this surface for at least one queue family of this device.", + func_name)) return true; } } if (most_recent_swapchain != old_swapchain_state || (surface_state->old_swapchain && surface_state->swapchain)) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, DRAWSTATE_SWAPCHAIN_ALREADY_EXISTS, "DS", + HandleToUint64(dev_data->device), DRAWSTATE_SWAPCHAIN_ALREADY_EXISTS, "%s: surface has an existing swapchain other than oldSwapchain", func_name)) return true; } if (old_swapchain_state && old_swapchain_state->createInfo.surface != pCreateInfo->surface) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, - HandleToUint64(pCreateInfo->oldSwapchain), __LINE__, DRAWSTATE_SWAPCHAIN_WRONG_SURFACE, "DS", + HandleToUint64(pCreateInfo->oldSwapchain), DRAWSTATE_SWAPCHAIN_WRONG_SURFACE, "%s: pCreateInfo->oldSwapchain's surface is not pCreateInfo->surface", func_name)) return true; } + + if ((pCreateInfo->imageExtent.width == 0) || (pCreateInfo->imageExtent.height == 0)) { + if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, + HandleToUint64(dev_data->device), VALIDATION_ERROR_14600d32, + "%s: pCreateInfo->imageExtent = (%d, %d) which is illegal.", func_name, pCreateInfo->imageExtent.width, + pCreateInfo->imageExtent.height)) + return true; + } + auto physical_device_state = GetPhysicalDeviceState(dev_data->instance_data, dev_data->physical_device); if (physical_device_state->vkGetPhysicalDeviceSurfaceCapabilitiesKHRState == UNCALLED) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, - HandleToUint64(dev_data->physical_device), __LINE__, DRAWSTATE_SWAPCHAIN_CREATE_BEFORE_QUERY, "DS", + HandleToUint64(dev_data->physical_device), DRAWSTATE_SWAPCHAIN_CREATE_BEFORE_QUERY, "%s: surface capabilities not retrieved for this physical device", func_name)) return true; } else { // have valid capabilities @@ -10233,21 +10544,19 @@ // Validate pCreateInfo->minImageCount against VkSurfaceCapabilitiesKHR::{min|max}ImageCount: if (pCreateInfo->minImageCount < capabilities.minImageCount) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_146009ee, "DS", + HandleToUint64(dev_data->device), VALIDATION_ERROR_146009ee, "%s called with minImageCount = %d, which is outside the bounds returned by " - "vkGetPhysicalDeviceSurfaceCapabilitiesKHR() (i.e. minImageCount = %d, maxImageCount = %d). %s", - func_name, pCreateInfo->minImageCount, capabilities.minImageCount, capabilities.maxImageCount, - validation_error_map[VALIDATION_ERROR_146009ee])) + "vkGetPhysicalDeviceSurfaceCapabilitiesKHR() (i.e. minImageCount = %d, maxImageCount = %d).", + func_name, pCreateInfo->minImageCount, capabilities.minImageCount, capabilities.maxImageCount)) return true; } if ((capabilities.maxImageCount > 0) && (pCreateInfo->minImageCount > capabilities.maxImageCount)) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_146009f0, "DS", + HandleToUint64(dev_data->device), VALIDATION_ERROR_146009f0, "%s called with minImageCount = %d, which is outside the bounds returned by " - "vkGetPhysicalDeviceSurfaceCapabilitiesKHR() (i.e. minImageCount = %d, maxImageCount = %d). %s", - func_name, pCreateInfo->minImageCount, capabilities.minImageCount, capabilities.maxImageCount, - validation_error_map[VALIDATION_ERROR_146009f0])) + "vkGetPhysicalDeviceSurfaceCapabilitiesKHR() (i.e. minImageCount = %d, maxImageCount = %d).", + func_name, pCreateInfo->minImageCount, capabilities.minImageCount, capabilities.maxImageCount)) return true; } @@ -10257,14 +10566,13 @@ (pCreateInfo->imageExtent.height < capabilities.minImageExtent.height) || (pCreateInfo->imageExtent.height > capabilities.maxImageExtent.height)) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_146009f4, "DS", + HandleToUint64(dev_data->device), VALIDATION_ERROR_146009f4, "%s called with imageExtent = (%d,%d), which is outside the bounds returned by " "vkGetPhysicalDeviceSurfaceCapabilitiesKHR(): currentExtent = (%d,%d), minImageExtent = (%d,%d), " - "maxImageExtent = (%d,%d). %s", + "maxImageExtent = (%d,%d).", func_name, pCreateInfo->imageExtent.width, pCreateInfo->imageExtent.height, capabilities.currentExtent.width, capabilities.currentExtent.height, capabilities.minImageExtent.width, - capabilities.minImageExtent.height, capabilities.maxImageExtent.width, capabilities.maxImageExtent.height, - validation_error_map[VALIDATION_ERROR_146009f4])) + capabilities.minImageExtent.height, capabilities.maxImageExtent.width, capabilities.maxImageExtent.height)) return true; } // pCreateInfo->preTransform should have exactly one bit set, and that bit must also be set in @@ -10289,8 +10597,7 @@ } // Log the message that we've built up: if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_146009fe, "DS", "%s. %s", errorString.c_str(), - validation_error_map[VALIDATION_ERROR_146009fe])) + HandleToUint64(dev_data->device), VALIDATION_ERROR_146009fe, "%s.", errorString.c_str())) return true; } @@ -10316,26 +10623,23 @@ } // Log the message that we've built up: if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_14600a00, "DS", "%s. %s", errorString.c_str(), - validation_error_map[VALIDATION_ERROR_14600a00])) + HandleToUint64(dev_data->device), VALIDATION_ERROR_14600a00, "%s.", errorString.c_str())) return true; } // Validate pCreateInfo->imageArrayLayers against VkSurfaceCapabilitiesKHR::maxImageArrayLayers: if (pCreateInfo->imageArrayLayers > capabilities.maxImageArrayLayers) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_146009f6, "DS", - "%s called with a non-supported imageArrayLayers (i.e. %d). Maximum value is %d. %s", func_name, - pCreateInfo->imageArrayLayers, capabilities.maxImageArrayLayers, - validation_error_map[VALIDATION_ERROR_146009f6])) + HandleToUint64(dev_data->device), VALIDATION_ERROR_146009f6, + "%s called with a non-supported imageArrayLayers (i.e. %d). Maximum value is %d.", func_name, + pCreateInfo->imageArrayLayers, capabilities.maxImageArrayLayers)) return true; } // Validate pCreateInfo->imageUsage against VkSurfaceCapabilitiesKHR::supportedUsageFlags: if (pCreateInfo->imageUsage != (pCreateInfo->imageUsage & capabilities.supportedUsageFlags)) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_146009f8, "DS", - "%s called with a non-supported pCreateInfo->imageUsage (i.e. 0x%08x). Supported flag bits are 0x%08x. %s", - func_name, pCreateInfo->imageUsage, capabilities.supportedUsageFlags, - validation_error_map[VALIDATION_ERROR_146009f8])) + HandleToUint64(dev_data->device), VALIDATION_ERROR_146009f8, + "%s called with a non-supported pCreateInfo->imageUsage (i.e. 0x%08x). Supported flag bits are 0x%08x.", + func_name, pCreateInfo->imageUsage, capabilities.supportedUsageFlags)) return true; } } @@ -10343,7 +10647,7 @@ // Validate pCreateInfo values with the results of vkGetPhysicalDeviceSurfaceFormatsKHR(): if (physical_device_state->vkGetPhysicalDeviceSurfaceFormatsKHRState != QUERY_DETAILS) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, DRAWSTATE_SWAPCHAIN_CREATE_BEFORE_QUERY, "DS", + HandleToUint64(dev_data->device), DRAWSTATE_SWAPCHAIN_CREATE_BEFORE_QUERY, "%s called before calling vkGetPhysicalDeviceSurfaceFormatsKHR().", func_name)) return true; } else { @@ -10368,16 +10672,16 @@ if (!foundMatch) { if (!foundFormat) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_146009f2, "DS", - "%s called with a non-supported pCreateInfo->imageFormat (i.e. %d). %s", func_name, - pCreateInfo->imageFormat, validation_error_map[VALIDATION_ERROR_146009f2])) + HandleToUint64(dev_data->device), VALIDATION_ERROR_146009f2, + "%s called with a non-supported pCreateInfo->imageFormat (i.e. %d).", func_name, + pCreateInfo->imageFormat)) return true; } if (!foundColorSpace) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_146009f2, "DS", - "%s called with a non-supported pCreateInfo->imageColorSpace (i.e. %d). %s", func_name, - pCreateInfo->imageColorSpace, validation_error_map[VALIDATION_ERROR_146009f2])) + HandleToUint64(dev_data->device), VALIDATION_ERROR_146009f2, + "%s called with a non-supported pCreateInfo->imageColorSpace (i.e. %d).", func_name, + pCreateInfo->imageColorSpace)) return true; } } @@ -10388,7 +10692,7 @@ // FIFO is required to always be supported if (pCreateInfo->presentMode != VK_PRESENT_MODE_FIFO_KHR) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, DRAWSTATE_SWAPCHAIN_CREATE_BEFORE_QUERY, "DS", + HandleToUint64(dev_data->device), DRAWSTATE_SWAPCHAIN_CREATE_BEFORE_QUERY, "%s called before calling vkGetPhysicalDeviceSurfacePresentModesKHR().", func_name)) return true; } @@ -10398,9 +10702,9 @@ pCreateInfo->presentMode) != physical_device_state->present_modes.end(); if (!foundMatch) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_14600a02, "DS", - "%s called with a non-supported presentMode (i.e. %s). %s", func_name, - string_VkPresentModeKHR(pCreateInfo->presentMode), validation_error_map[VALIDATION_ERROR_14600a02])) + HandleToUint64(dev_data->device), VALIDATION_ERROR_14600a02, + "%s called with a non-supported presentMode (i.e. %s).", func_name, + string_VkPresentModeKHR(pCreateInfo->presentMode))) return true; } } @@ -10409,18 +10713,17 @@ VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR == pCreateInfo->presentMode) { if (!dev_data->extensions.vk_khr_shared_presentable_image) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, DRAWSTATE_EXTENSION_NOT_ENABLED, "DS", + HandleToUint64(dev_data->device), DRAWSTATE_EXTENSION_NOT_ENABLED, "%s called with presentMode %s which requires the VK_KHR_shared_presentable_image extension, which has not " "been enabled.", func_name, string_VkPresentModeKHR(pCreateInfo->presentMode))) return true; } else if (pCreateInfo->minImageCount != 1) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(dev_data->device), __LINE__, VALIDATION_ERROR_14600ace, "DS", + HandleToUint64(dev_data->device), VALIDATION_ERROR_14600ace, "%s called with presentMode %s, but minImageCount value is %d. For shared presentable image, minImageCount " - "must be 1. %s", - func_name, string_VkPresentModeKHR(pCreateInfo->presentMode), pCreateInfo->minImageCount, - validation_error_map[VALIDATION_ERROR_14600ace])) + "must be 1.", + func_name, string_VkPresentModeKHR(pCreateInfo->presentMode), pCreateInfo->minImageCount)) return true; } } @@ -10512,13 +10815,13 @@ // Compare the preliminary value of *pSwapchainImageCount with the value this time: if (swapchain_state->vkGetSwapchainImagesKHRState == UNCALLED) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(device), __LINE__, SWAPCHAIN_PRIOR_COUNT, "DS", + HandleToUint64(device), SWAPCHAIN_PRIOR_COUNT, "vkGetSwapchainImagesKHR() called with non-NULL pSwapchainImageCount; but no prior positive value has " "been seen for pSwapchainImages."); } else if (*pSwapchainImageCount > swapchain_state->get_swapchain_image_count) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(device), __LINE__, SWAPCHAIN_INVALID_COUNT, "DS", + HandleToUint64(device), SWAPCHAIN_INVALID_COUNT, "vkGetSwapchainImagesKHR() called with non-NULL pSwapchainImageCount, and with pSwapchainImages set to a " "value (%d) that is greater than the value (%d) that was returned when pSwapchainImageCount was NULL.", *pSwapchainImageCount, swapchain_state->get_swapchain_image_count); @@ -10605,7 +10908,7 @@ auto pSemaphore = GetSemaphoreNode(dev_data, pPresentInfo->pWaitSemaphores[i]); if (pSemaphore && !pSemaphore->signaled) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, 0, - __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", + DRAWSTATE_QUEUE_FORWARD_PROGRESS, "Queue 0x%" PRIx64 " is waiting on semaphore 0x%" PRIx64 " that has no way to be signaled.", HandleToUint64(queue), HandleToUint64(pPresentInfo->pWaitSemaphores[i])); } @@ -10617,7 +10920,7 @@ if (pPresentInfo->pImageIndices[i] >= swapchain_data->images.size()) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, - HandleToUint64(pPresentInfo->pSwapchains[i]), __LINE__, DRAWSTATE_SWAPCHAIN_INVALID_IMAGE, "DS", + HandleToUint64(pPresentInfo->pSwapchains[i]), DRAWSTATE_SWAPCHAIN_INVALID_IMAGE, "vkQueuePresentKHR: Swapchain image index too large (%u). There are only %u images in this swapchain.", pPresentInfo->pImageIndices[i], (uint32_t)swapchain_data->images.size()); } else { @@ -10633,7 +10936,7 @@ if (!image_state->acquired) { skip |= log_msg( dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, - HandleToUint64(pPresentInfo->pSwapchains[i]), __LINE__, DRAWSTATE_SWAPCHAIN_IMAGE_NOT_ACQUIRED, "DS", + HandleToUint64(pPresentInfo->pSwapchains[i]), DRAWSTATE_SWAPCHAIN_IMAGE_NOT_ACQUIRED, "vkQueuePresentKHR: Swapchain image index %u has not been acquired.", pPresentInfo->pImageIndices[i]); } @@ -10642,12 +10945,11 @@ for (auto layout : layouts) { if ((layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) && (!dev_data->extensions.vk_khr_shared_presentable_image || (layout != VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR))) { - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, - HandleToUint64(queue), __LINE__, VALIDATION_ERROR_11200a20, "DS", - "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. %s", - string_VkImageLayout(layout), validation_error_map[VALIDATION_ERROR_11200a20]); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, HandleToUint64(queue), VALIDATION_ERROR_11200a20, + "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)); } } } @@ -10663,14 +10965,13 @@ if (support_it == surface_state->gpu_queue_support.end()) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, - HandleToUint64(pPresentInfo->pSwapchains[i]), __LINE__, DRAWSTATE_SWAPCHAIN_UNSUPPORTED_QUEUE, "DS", + HandleToUint64(pPresentInfo->pSwapchains[i]), DRAWSTATE_SWAPCHAIN_UNSUPPORTED_QUEUE, "vkQueuePresentKHR: Presenting image without calling vkGetPhysicalDeviceSurfaceSupportKHR"); } else if (!support_it->second) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, - HandleToUint64(pPresentInfo->pSwapchains[i]), __LINE__, VALIDATION_ERROR_31800a18, "DS", - "vkQueuePresentKHR: Presenting image on queue that cannot present to this surface. %s", - validation_error_map[VALIDATION_ERROR_31800a18]); + HandleToUint64(pPresentInfo->pSwapchains[i]), VALIDATION_ERROR_31800a18, + "vkQueuePresentKHR: Presenting image on queue that cannot present to this surface."); } } } @@ -10685,11 +10986,10 @@ VkPresentRegionKHR region = present_regions->pRegions[i]; for (uint32_t j = 0; j < region.rectangleCount; ++j) { VkRectLayerKHR rect = region.pRectangles[j]; - // TODO: Need to update these errors to their unique error ids when available if ((rect.offset.x + rect.extent.width) > swapchain_data->createInfo.imageExtent.width) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, HandleToUint64(pPresentInfo->pSwapchains[i]), - __LINE__, DRAWSTATE_SWAPCHAIN_INVALID_IMAGE, "DS", + VALIDATION_ERROR_11e009da, "vkQueuePresentKHR(): For VkPresentRegionKHR down pNext chain, " "pRegion[%i].pRectangles[%i], the sum of offset.x (%i) and extent.width (%i) is greater " "than the corresponding swapchain's imageExtent.width (%i).", @@ -10698,7 +10998,7 @@ if ((rect.offset.y + rect.extent.height) > swapchain_data->createInfo.imageExtent.height) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, HandleToUint64(pPresentInfo->pSwapchains[i]), - __LINE__, DRAWSTATE_SWAPCHAIN_INVALID_IMAGE, "DS", + VALIDATION_ERROR_11e009da, "vkQueuePresentKHR(): For VkPresentRegionKHR down pNext chain, " "pRegion[%i].pRectangles[%i], the sum of offset.y (%i) and extent.height (%i) is greater " "than the corresponding swapchain's imageExtent.height (%i).", @@ -10707,7 +11007,7 @@ if (rect.layer > swapchain_data->createInfo.imageArrayLayers) { skip |= log_msg( dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, - HandleToUint64(pPresentInfo->pSwapchains[i]), __LINE__, DRAWSTATE_SWAPCHAIN_INVALID_IMAGE, "DS", + HandleToUint64(pPresentInfo->pSwapchains[i]), VALIDATION_ERROR_11e009dc, "vkQueuePresentKHR(): For VkPresentRegionKHR down pNext chain, pRegion[%i].pRectangles[%i], the layer " "(%i) is greater than the corresponding swapchain's imageArrayLayers (%i).", i, j, rect.layer, swapchain_data->createInfo.imageArrayLayers); @@ -10721,9 +11021,9 @@ if (pPresentInfo->swapchainCount != present_times_info->swapchainCount) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, - HandleToUint64(pPresentInfo->pSwapchains[0]), __LINE__, + HandleToUint64(pPresentInfo->pSwapchains[0]), - VALIDATION_ERROR_118009be, "DS", + VALIDATION_ERROR_118009be, "vkQueuePresentKHR(): VkPresentTimesInfoGOOGLE.swapchainCount is %i but pPresentInfo->swapchainCount " "is %i. For VkPresentTimesInfoGOOGLE down pNext chain of VkPresentInfoKHR, " "VkPresentTimesInfoGOOGLE.swapchainCount must equal VkPresentInfoKHR.swapchainCount.", @@ -10847,7 +11147,7 @@ bool skip = false; if (fence == VK_NULL_HANDLE && semaphore == VK_NULL_HANDLE) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(device), __LINE__, DRAWSTATE_SWAPCHAIN_NO_SYNC_FOR_ACQUIRE, "DS", + HandleToUint64(device), DRAWSTATE_SWAPCHAIN_NO_SYNC_FOR_ACQUIRE, "vkAcquireNextImageKHR: Semaphore and fence cannot both be VK_NULL_HANDLE. There would be no way to " "determine the completion of this operation."); } @@ -10855,9 +11155,8 @@ auto pSemaphore = GetSemaphoreNode(dev_data, semaphore); if (pSemaphore && pSemaphore->scope == kSyncScopeInternal && pSemaphore->signaled) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, - HandleToUint64(semaphore), __LINE__, VALIDATION_ERROR_16400a0c, "DS", - "vkAcquireNextImageKHR: Semaphore must not be currently signaled or in a wait state. %s", - validation_error_map[VALIDATION_ERROR_16400a0c]); + HandleToUint64(semaphore), VALIDATION_ERROR_16400a0c, + "vkAcquireNextImageKHR: Semaphore must not be currently signaled or in a wait state."); } auto pFence = GetFenceNode(dev_data, fence); @@ -10868,7 +11167,7 @@ auto swapchain_data = GetSwapchainNode(dev_data, swapchain); if (swapchain_data->replaced) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, - HandleToUint64(swapchain), __LINE__, DRAWSTATE_SWAPCHAIN_REPLACED, "DS", + HandleToUint64(swapchain), DRAWSTATE_SWAPCHAIN_REPLACED, "vkAcquireNextImageKHR: This swapchain has been replaced. The application can still present any images it " "has acquired, but cannot acquire any more."); } @@ -10880,7 +11179,7 @@ if (acquired_images > swapchain_data->images.size() - physical_device_state->surfaceCapabilities.minImageCount) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, - HandleToUint64(swapchain), __LINE__, DRAWSTATE_SWAPCHAIN_TOO_MANY_IMAGES, "DS", + HandleToUint64(swapchain), DRAWSTATE_SWAPCHAIN_TOO_MANY_IMAGES, "vkAcquireNextImageKHR: Application has already acquired the maximum number of images (0x%" PRIxLEAST64 ")", acquired_images); } @@ -10888,7 +11187,7 @@ if (swapchain_data->images.size() == 0) { skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, - HandleToUint64(swapchain), __LINE__, DRAWSTATE_SWAPCHAIN_IMAGES_NOT_FOUND, "DS", + HandleToUint64(swapchain), DRAWSTATE_SWAPCHAIN_IMAGES_NOT_FOUND, "vkAcquireNextImageKHR: No images found to acquire from. Application probably did not call " "vkGetSwapchainImagesKHR after swapchain creation."); } @@ -10956,14 +11255,14 @@ // Flag warning here. You can call this without having queried the count, but it may not be // robust on platforms with multiple physical devices. skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, - 0, __LINE__, DEVLIMITS_MISSING_QUERY_COUNT, "DL", + 0, DEVLIMITS_MISSING_QUERY_COUNT, "Call sequence has vkEnumeratePhysicalDevices() w/ non-NULL pPhysicalDevices. You should first call " "vkEnumeratePhysicalDevices() w/ NULL pPhysicalDevices to query pPhysicalDeviceCount."); } // TODO : Could also flag a warning if re-calling this function in QUERY_DETAILS state else if (instance_data->physical_devices_count != *pPhysicalDeviceCount) { // Having actual count match count from app is not a requirement, so this can be a warning skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVLIMITS_COUNT_MISMATCH, "DL", + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, DEVLIMITS_COUNT_MISMATCH, "Call to vkEnumeratePhysicalDevices() w/ pPhysicalDeviceCount value %u, but actual count supported by " "this instance is %u.", *pPhysicalDeviceCount, instance_data->physical_devices_count); @@ -10998,7 +11297,7 @@ if (UNCALLED == pd_state->vkGetPhysicalDeviceQueueFamilyPropertiesState) { skip |= log_msg( instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, - HandleToUint64(pd_state->phys_device), __LINE__, DEVLIMITS_MISSING_QUERY_COUNT, "DL", + HandleToUint64(pd_state->phys_device), DEVLIMITS_MISSING_QUERY_COUNT, "%s is called with non-NULL pQueueFamilyProperties before obtaining pQueueFamilyPropertyCount. It is recommended " "to first call %s with NULL pQueueFamilyProperties in order to obtain the maximal pQueueFamilyPropertyCount.", caller_name, caller_name); @@ -11006,7 +11305,7 @@ } else if (pd_state->queue_family_count != requested_queue_family_property_count) { skip |= log_msg( instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, - HandleToUint64(pd_state->phys_device), __LINE__, DEVLIMITS_COUNT_MISMATCH, "DL", + HandleToUint64(pd_state->phys_device), DEVLIMITS_COUNT_MISMATCH, "%s is called with non-NULL pQueueFamilyProperties and pQueueFamilyPropertyCount value %" PRIu32 ", but the largest previously returned pQueueFamilyPropertyCount for this physicalDevice is %" PRIu32 ". It is recommended to instead receive all the properties by calling %s with pQueueFamilyPropertyCount that was " @@ -11161,9 +11460,8 @@ if ((surface_state) && (surface_state->swapchain)) { skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, - HandleToUint64(instance), __LINE__, VALIDATION_ERROR_26c009e4, "DS", - "vkDestroySurfaceKHR() called before its associated VkSwapchainKHR was destroyed. %s", - validation_error_map[VALIDATION_ERROR_26c009e4]); + HandleToUint64(instance), VALIDATION_ERROR_26c009e4, + "vkDestroySurfaceKHR() called before its associated VkSwapchainKHR was destroyed."); } instance_data->surface_map.erase(surface); lock.unlock(); @@ -11184,6 +11482,20 @@ } #endif // VK_USE_PLATFORM_ANDROID_KHR +#ifdef VK_USE_PLATFORM_IOS_MVK +VKAPI_ATTR VkResult VKAPI_CALL CreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) { + return CreateSurface(instance, pCreateInfo, pAllocator, pSurface, &VkLayerInstanceDispatchTable::CreateIOSSurfaceMVK); +} +#endif // VK_USE_PLATFORM_IOS_MVK + +#ifdef VK_USE_PLATFORM_MACOS_MVK +VKAPI_ATTR VkResult VKAPI_CALL CreateMacOSSurfaceMVK(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) { + return CreateSurface(instance, pCreateInfo, pAllocator, pSurface, &VkLayerInstanceDispatchTable::CreateMacOSSurfaceMVK); +} +#endif // VK_USE_PLATFORM_MACOS_MVK + #ifdef VK_USE_PLATFORM_MIR_KHR VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) { @@ -11448,8 +11760,8 @@ switch (call_state) { case UNCALLED: skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), __LINE__, - DEVLIMITS_MUST_QUERY_COUNT, "DL", + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), + DEVLIMITS_MUST_QUERY_COUNT, "vkGetPhysicalDeviceSurfacePresentModesKHR() called with non-NULL pPresentModeCount; but no prior " "positive value has been seen for pPresentModeCount."); break; @@ -11457,8 +11769,8 @@ // both query count and query details if (*pPresentModeCount != prev_mode_count) { skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), __LINE__, - DEVLIMITS_COUNT_MISMATCH, "DL", + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), + DEVLIMITS_COUNT_MISMATCH, "vkGetPhysicalDeviceSurfacePresentModesKHR() called with *pPresentModeCount (%u) that differs " "from the value (%u) that was returned when pPresentModes was NULL.", *pPresentModeCount, prev_mode_count); @@ -11510,16 +11822,16 @@ // didn't // previously call this function with a NULL value of pSurfaceFormats: skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), __LINE__, - DEVLIMITS_MUST_QUERY_COUNT, "DL", + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), + DEVLIMITS_MUST_QUERY_COUNT, "vkGetPhysicalDeviceSurfaceFormatsKHR() called with non-NULL pSurfaceFormatCount; but no prior " "positive value has been seen for pSurfaceFormats."); break; default: if (prev_format_count != *pSurfaceFormatCount) { skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), __LINE__, - DEVLIMITS_COUNT_MISMATCH, "DL", + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), + DEVLIMITS_COUNT_MISMATCH, "vkGetPhysicalDeviceSurfaceFormatsKHR() called with non-NULL pSurfaceFormatCount, and with " "pSurfaceFormats set to a value (%u) that is greater than the value (%u) that was returned " "when pSurfaceFormatCount was NULL.", @@ -11757,7 +12069,7 @@ // Flag warning here. You can call this without having queried the count, but it may not be // robust on platforms with multiple physical devices. skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, 0, __LINE__, DEVLIMITS_MISSING_QUERY_COUNT, "DL", + VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, 0, DEVLIMITS_MISSING_QUERY_COUNT, "Call sequence has vkEnumeratePhysicalDeviceGroups() w/ non-NULL " "pPhysicalDeviceGroupProperties. You should first call vkEnumeratePhysicalDeviceGroups() w/ " "NULL pPhysicalDeviceGroupProperties to query pPhysicalDeviceGroupCount."); @@ -11765,15 +12077,15 @@ else if (instance_data->physical_device_groups_count != *pPhysicalDeviceGroupCount) { // Having actual count match count from app is not a requirement, so this can be a warning skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVLIMITS_COUNT_MISMATCH, "DL", + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, DEVLIMITS_COUNT_MISMATCH, "Call to vkEnumeratePhysicalDeviceGroups() w/ pPhysicalDeviceGroupCount value %u, but actual count " "supported by this instance is %u.", *pPhysicalDeviceGroupCount, instance_data->physical_device_groups_count); } } } else { - log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, 0, __LINE__, - DEVLIMITS_INVALID_INSTANCE, "DL", "Invalid instance (0x%" PRIx64 ") passed into vkEnumeratePhysicalDeviceGroups().", + log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, 0, + DEVLIMITS_INVALID_INSTANCE, "Invalid instance (0x%" PRIx64 ") passed into vkEnumeratePhysicalDeviceGroups().", HandleToUint64(instance)); } @@ -11845,6 +12157,48 @@ return result; } +static bool PreCallValidateCreateDescriptorUpdateTemplate(const char *func_name, layer_data *device_data, + const VkDescriptorUpdateTemplateCreateInfoKHR *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate) { + bool skip = false; + const auto layout = GetDescriptorSetLayout(device_data, pCreateInfo->descriptorSetLayout); + if (VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET == pCreateInfo->templateType && !layout) { + auto ds_uint = HandleToUint64(pCreateInfo->descriptorSetLayout); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, + ds_uint, VALIDATION_ERROR_052002bc, "%s: Invalid pCreateInfo->descriptorSetLayout (%" PRIx64 ")", func_name, + ds_uint); + } 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); + if (!valid_bp) { + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_052002be, "%s: Invalid pCreateInfo->pipelineBindPoint (%" PRIu32 ").", func_name, + static_cast(bind_point)); + } + const auto pipeline_layout = getPipelineLayout(device_data, pCreateInfo->pipelineLayout); + if (!pipeline_layout) { + uint64_t pl_uint = HandleToUint64(pCreateInfo->pipelineLayout); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pl_uint, VALIDATION_ERROR_052002c0, + "%s: Invalid pCreateInfo->pipelineLayout (%" PRIx64 ")", func_name, pl_uint); + } else { + const uint32_t pd_set = pCreateInfo->set; + if ((pd_set >= pipeline_layout->set_layouts.size()) || !pipeline_layout->set_layouts[pd_set] || + !pipeline_layout->set_layouts[pd_set]->IsPushDescriptor()) { + uint64_t pl_uint = HandleToUint64(pCreateInfo->pipelineLayout); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pl_uint, VALIDATION_ERROR_052002c2, + "%s: pCreateInfo->set (%" PRIu32 + ") does not refer to the push descriptor set layout for " + "pCreateInfo->pipelineLayout (%" PRIx64 ").", + func_name, pd_set, pl_uint); + } + } + } + return skip; +} + static void PostCallRecordCreateDescriptorUpdateTemplate(layer_data *device_data, const VkDescriptorUpdateTemplateCreateInfoKHR *pCreateInfo, VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate) { @@ -11859,11 +12213,19 @@ const VkAllocationCallbacks *pAllocator, VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate) { layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); - VkResult result = - device_data->dispatch_table.CreateDescriptorUpdateTemplate(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate); - if (VK_SUCCESS == result) { - lock_guard_t lock(global_lock); - PostCallRecordCreateDescriptorUpdateTemplate(device_data, pCreateInfo, pDescriptorUpdateTemplate); + unique_lock_t lock(global_lock); + bool skip = PreCallValidateCreateDescriptorUpdateTemplate("vkCreateDescriptorUpdateTemplate()", device_data, pCreateInfo, + pAllocator, pDescriptorUpdateTemplate); + + VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; + if (!skip) { + lock.unlock(); + result = + device_data->dispatch_table.CreateDescriptorUpdateTemplate(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate); + if (VK_SUCCESS == result) { + lock.lock(); + PostCallRecordCreateDescriptorUpdateTemplate(device_data, pCreateInfo, pDescriptorUpdateTemplate); + } } return result; } @@ -11873,11 +12235,19 @@ const VkAllocationCallbacks *pAllocator, VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate) { layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); - VkResult result = - device_data->dispatch_table.CreateDescriptorUpdateTemplateKHR(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate); - if (VK_SUCCESS == result) { - lock_guard_t lock(global_lock); - PostCallRecordCreateDescriptorUpdateTemplate(device_data, pCreateInfo, pDescriptorUpdateTemplate); + unique_lock_t lock(global_lock); + bool skip = PreCallValidateCreateDescriptorUpdateTemplate("vkCreateDescriptorUpdateTemplateKHR()", device_data, pCreateInfo, + pAllocator, pDescriptorUpdateTemplate); + + VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; + if (!skip) { + lock.unlock(); + result = device_data->dispatch_table.CreateDescriptorUpdateTemplateKHR(device, pCreateInfo, pAllocator, + pDescriptorUpdateTemplate); + if (VK_SUCCESS == result) { + lock.lock(); + PostCallRecordCreateDescriptorUpdateTemplate(device_data, pCreateInfo, pDescriptorUpdateTemplate); + } } return result; } @@ -11995,16 +12365,16 @@ if (physical_device_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHRState == UNCALLED) { skip |= log_msg( instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, - HandleToUint64(physicalDevice), __LINE__, SWAPCHAIN_GET_SUPPORTED_DISPLAYS_WITHOUT_QUERY, "DL", + HandleToUint64(physicalDevice), SWAPCHAIN_GET_SUPPORTED_DISPLAYS_WITHOUT_QUERY, "Potential problem with calling %s() without first querying vkGetPhysicalDeviceDisplayPlanePropertiesKHR.", api_name); } else { if (planeIndex >= physical_device_state->display_plane_property_count) { skip |= log_msg( instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, - HandleToUint64(physicalDevice), __LINE__, VALIDATION_ERROR_29c009c2, "DL", + HandleToUint64(physicalDevice), VALIDATION_ERROR_29c009c2, "%s(): planeIndex must be in the range [0, %d] that was returned by vkGetPhysicalDeviceDisplayPlanePropertiesKHR. " - "Do you have the plane index hardcoded? %s", - api_name, physical_device_state->display_plane_property_count - 1, validation_error_map[VALIDATION_ERROR_29c009c2]); + "Do you have the plane index hardcoded?", + api_name, physical_device_state->display_plane_property_count - 1); } } return skip; @@ -12336,6 +12706,12 @@ {"vkCreateXlibSurfaceKHR", (void *)CreateXlibSurfaceKHR}, {"vkGetPhysicalDeviceXlibPresentationSupportKHR", (void *)GetPhysicalDeviceXlibPresentationSupportKHR}, #endif +#ifdef VK_USE_PLATFORM_IOS_MVK + {"vkCreateIOSSurfaceMVK", (void *)CreateIOSSurfaceMVK}, +#endif +#ifdef VK_USE_PLATFORM_MACOS_MVK + {"vkCreateMacOSSurfaceMVK", (void *)CreateMacOSSurfaceMVK}, +#endif {"vkCreateDisplayPlaneSurfaceKHR", (void *)CreateDisplayPlaneSurfaceKHR}, {"vkDestroySurfaceKHR", (void *)DestroySurfaceKHR}, {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR", (void *)GetPhysicalDeviceSurfaceCapabilitiesKHR}, diff -Nru vulkan-1.1.70+dfsg1/layers/core_validation.h vulkan-1.1.73+dfsg/layers/core_validation.h --- vulkan-1.1.70+dfsg1/layers/core_validation.h 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/core_validation.h 2018-04-27 11:24:19.000000000 +0000 @@ -68,11 +68,6 @@ // TODO : Is there a way to track when Cmd Buffer finishes & remove mem references at that point? // TODO : Could potentially store a list of freed mem allocs to flag when they're incorrectly used -struct GENERIC_HEADER { - VkStructureType sType; - const void *pNext; -}; - enum SyncScope { kSyncScopeInternal, kSyncScopeExternalTemporary, diff -Nru vulkan-1.1.70+dfsg1/layers/core_validation_layer.md vulkan-1.1.73+dfsg/layers/core_validation_layer.md --- vulkan-1.1.70+dfsg1/layers/core_validation_layer.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/core_validation_layer.md 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,44 @@ +# VK\_LAYER\_LUNARG\_core\_validation +The `VK_LAYER_LUNARG_core_validation` layer validates the status of descriptor sets, command buffers, shader modules, pipeline states, renderpass usage, synchronization, dynamic states and is the workhorse layer for many other types of valid usage. + +`VK_LAYER_LUNARG_core_validation` validates that: + + - the descriptor set state and pipeline state at each draw call are consistent + - pipelines are created correctly, known when used and bound at draw time + - descriptor sets are known and consist of valid types, formats, and layout + - descriptor set regions are valid, bound, and updated appropriately + - command buffers referenced are known and valid + - command sequencing for specific state dependencies and renderpass use is correct + - memory is available + - dynamic state is correctly set. + +The `VK_LAYER_LUNARG_core_validation` layer will print errors if validation checks are not correctly met. `VK_LAYER_LUNARG_core_validation` will also display the values of the objects tracked. + +## Memory/Resource related functionality +This layer additionally attempts to ensure that memory objects are managed correctly by the application. These memory objects may be bound to pipelines, objects, and command buffers, and then submitted to the GPU for work. Specifically the layer validates that: + + - the correct memory objects have been bound + - memory objects are specified correctly upon command buffer submittal + - only existing memory objects are referenced + - destroyed memory objects are not referenced + - the application has confirmed any memory objects to be reused or destroyed have been properly unbound + - checks texture formats and render target formats. + +Errors will be printed if validation checks are not correctly met and warnings if improper (but not illegal) use of memory is detected. This validation layer also dumps all memory references and bindings for each operation. + +## Shader validation functionality +Checks performed by this layer apply to the VS->FS and FS->CB interfaces with the pipeline. These checks include: + + - validating that all variables which are part of a shader interface are decorated with either `spv::DecLocation` or `spv::DecBuiltin` (that is, only the SSO rendezvous-by-location model is supported) + - emitting a warning if a location is declared only in the producing stage (useless work is being done) + - emitting an error if a location is declared only in the consuming stage (garbage will be read). + +A special error checking case invoked when the FS stage writes a built-in corresponding to the legacy `gl_FragColor`. In this case, an error is emitted if + + - the FS also writes any user-defined output + - the CB has any attachment with a `UINT` or `SINT` type. + +These extra checks are to ensure that the legacy broadcast of `gl_FragColor` to all bound color attachments is well-defined. + +## Swapchain validation functionality +This area of functionality validates the use of the WSI (Window System Integration) "swapchain" extensions (i.e., `VK_EXT_KHR_swapchain` and `VK_EXT_KHR_device_swapchain`). diff -Nru vulkan-1.1.70+dfsg1/layers/core_validation_types.h vulkan-1.1.73+dfsg/layers/core_validation_types.h --- vulkan-1.1.70+dfsg1/layers/core_validation_types.h 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/core_validation_types.h 2018-04-27 11:24:19.000000000 +0000 @@ -23,6 +23,7 @@ #ifndef CORE_VALIDATION_TYPES_H_ #define CORE_VALIDATION_TYPES_H_ +#include "hash_vk_types.h" #include "vk_safe_struct.h" #include "vulkan/vulkan.h" #include "vk_validation_error_messages.h" @@ -39,8 +40,9 @@ #include #include -// Fwd declarations +// Fwd declarations -- including descriptor_set.h creates an ugly include loop namespace cvdescriptorset { +class DescriptorSetLayoutDef; class DescriptorSetLayout; class DescriptorSet; } // namespace cvdescriptorset @@ -74,6 +76,22 @@ std::unordered_set commandBuffers; }; +// Utilities for barriers and the commmand pool +template +static bool IsTransferOp(const Barrier *barrier) { + return barrier->srcQueueFamilyIndex != barrier->dstQueueFamilyIndex; +} + +template +static bool IsReleaseOp(const COMMAND_POOL_NODE *pool, const Barrier *barrier) { + return (assume_transfer || IsTransferOp(barrier)) && (pool->queueFamilyIndex == barrier->srcQueueFamilyIndex); +} + +template +static bool IsAcquireOp(const COMMAND_POOL_NODE *pool, const Barrier *barrier) { + return (assume_transfer || IsTransferOp(barrier)) && (pool->queueFamilyIndex == barrier->dstQueueFamilyIndex); +} + // Generic wrapper for vulkan objects struct VK_OBJECT { uint64_t handle; @@ -318,6 +336,9 @@ bool global_valid; // If allocation is mapped or external, set to "true" to be picked up by subsequently bound ranges VkDeviceMemory mem; VkMemoryAllocateInfo alloc_info; + bool is_dedicated; + VkBuffer dedicated_buffer; + VkImage dedicated_image; std::unordered_set obj_bindings; // objects bound to this memory std::unordered_map bound_ranges; // Map of object to its binding range // Convenience vectors image/buff handles to speed up iterating over images or buffers independently @@ -336,6 +357,9 @@ global_valid(false), mem(in_mem), alloc_info(*p_alloc_info), + is_dedicated(false), + dedicated_buffer(VK_NULL_HANDLE), + dedicated_image(VK_NULL_HANDLE), mem_range{}, shadow_copy_base(0), shadow_copy(0), @@ -536,18 +560,50 @@ }; } // namespace std +// Canonical dictionary for PushConstantRanges +using PushConstantRangesDict = hash_util::Dictionary; +using PushConstantRangesId = PushConstantRangesDict::Id; + +// Canonical dictionary for the pipeline layout's layout of descriptorsetlayouts +using DescriptorSetLayoutDef = cvdescriptorset::DescriptorSetLayoutDef; +using DescriptorSetLayoutId = std::shared_ptr; +using PipelineLayoutSetLayoutsDef = std::vector; +using PipelineLayoutSetLayoutsDict = + hash_util::Dictionary>; +using PipelineLayoutSetLayoutsId = PipelineLayoutSetLayoutsDict::Id; + +// Defines/stores a compatibility defintion for set N +// The "layout layout" must store at least set+1 entries, but only the first set+1 are considered for hash and equality testing +// Note: the "cannonical" data are referenced by Id, not including handle or device specific state +// Note: hash and equality only consider layout_id entries [0, set] for determining uniqueness +struct PipelineLayoutCompatDef { + uint32_t set; + PushConstantRangesId push_constant_ranges; + PipelineLayoutSetLayoutsId set_layouts_id; + PipelineLayoutCompatDef(const uint32_t set_index, const PushConstantRangesId pcr_id, const PipelineLayoutSetLayoutsId sl_id) + : set(set_index), push_constant_ranges(pcr_id), set_layouts_id(sl_id) {} + size_t hash() const; + bool operator==(const PipelineLayoutCompatDef &other) const; +}; + +// Canonical dictionary for PipelineLayoutCompat records +using PipelineLayoutCompatDict = hash_util::Dictionary>; +using PipelineLayoutCompatId = PipelineLayoutCompatDict::Id; + // Store layouts and pushconstants for PipelineLayout struct PIPELINE_LAYOUT_NODE { VkPipelineLayout layout; std::vector> set_layouts; - std::vector push_constant_ranges; + PushConstantRangesId push_constant_ranges; + std::vector compat_for_set; - PIPELINE_LAYOUT_NODE() : layout(VK_NULL_HANDLE), set_layouts{}, push_constant_ranges{} {} + PIPELINE_LAYOUT_NODE() : layout(VK_NULL_HANDLE), set_layouts{}, push_constant_ranges{}, compat_for_set{} {} void reset() { layout = VK_NULL_HANDLE; set_layouts.clear(); - push_constant_ranges.clear(); + push_constant_ranges.reset(); + compat_for_set.clear(); } }; @@ -568,6 +624,7 @@ std::vector attachments; bool blendConstantsEnabled; // Blend constants enabled for any attachments PIPELINE_LAYOUT_NODE pipeline_layout; + VkPrimitiveTopology topology_at_rasterizer; // Default constructor PIPELINE_STATE() @@ -581,7 +638,8 @@ vertexBindingDescriptions(), attachments(), blendConstantsEnabled(false), - pipeline_layout() {} + pipeline_layout(), + topology_at_rasterizer{} {} void initGraphicsPipeline(const VkGraphicsPipelineCreateInfo *pCreateInfo, std::shared_ptr &&rpstate) { bool uses_color_attachment = false; @@ -623,6 +681,9 @@ pCBCI->pAttachments + pCBCI->attachmentCount); } } + if (graphicsPipelineCI.pInputAssemblyState) { + topology_at_rasterizer = graphicsPipelineCI.pInputAssemblyState->topology; + } rp_state = rpstate; } @@ -645,17 +706,18 @@ // Track last states that are bound per pipeline bind point (Gfx & Compute) struct LAST_BOUND_STATE { PIPELINE_STATE *pipeline_state; - PIPELINE_LAYOUT_NODE pipeline_layout; + VkPipelineLayout pipeline_layout; // Track each set that has been bound // Ordered bound set tracking where index is set# that given set is bound to std::vector boundDescriptorSets; std::unique_ptr push_descriptor_set; // one dynamic offset per dynamic descriptor bound to this CB std::vector> dynamicOffsets; + std::vector compat_id_for_set; void reset() { pipeline_state = nullptr; - pipeline_layout.reset(); + pipeline_layout = VK_NULL_HANDLE; boundDescriptorSets.clear(); push_descriptor_set = nullptr; dynamicOffsets.clear(); @@ -717,7 +779,7 @@ // Validation functions run at primary CB queue submit time std::vector> queue_submit_functions; // Validation functions run when secondary CB is executed in primary - std::vector> cmd_execute_commands_functions; + std::vector> cmd_execute_commands_functions; std::unordered_set memObjs; std::vector> eventUpdates; std::vector> queryUpdates; @@ -830,6 +892,7 @@ const PHYS_DEV_PROPERTIES_NODE *GetPhysDevProperties(const layer_data *device_data); const VkPhysicalDeviceFeatures *GetEnabledFeatures(const layer_data *device_data); const DeviceExtensions *GetEnabledExtensions(const layer_data *device_data); +const VkPhysicalDeviceDescriptorIndexingFeaturesEXT *GetEnabledDescriptorIndexingFeatures(const layer_data *device_data); void invalidateCommandBuffers(const layer_data *, std::unordered_set const &, VK_OBJECT); bool ValidateMemoryIsBoundToBuffer(const layer_data *, const BUFFER_STATE *, const char *, UNIQUE_VALIDATION_ERROR_CODE); diff -Nru vulkan-1.1.70+dfsg1/layers/descriptor_sets.cpp vulkan-1.1.73+dfsg/layers/descriptor_sets.cpp --- vulkan-1.1.70+dfsg1/layers/descriptor_sets.cpp 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/descriptor_sets.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -23,34 +23,57 @@ #define NOMINMAX #include "descriptor_sets.h" +#include "hash_vk_types.h" #include "vk_enum_string_helper.h" #include "vk_safe_struct.h" +#include "vk_typemap_helper.h" #include "buffer_validation.h" #include #include +#include + +// ExtendedBinding collects a VkDescriptorSetLayoutBinding and any extended +// state that comes from a different array/structure so they can stay together +// while being sorted by binding number. +struct ExtendedBinding { + ExtendedBinding(const VkDescriptorSetLayoutBinding *l, VkDescriptorBindingFlagsEXT f) : layout_binding(l), binding_flags(f) {} + + const VkDescriptorSetLayoutBinding *layout_binding; + VkDescriptorBindingFlagsEXT binding_flags; +}; struct BindingNumCmp { - bool operator()(const VkDescriptorSetLayoutBinding *a, const VkDescriptorSetLayoutBinding *b) const { - return a->binding < b->binding; + bool operator()(const ExtendedBinding &a, const ExtendedBinding &b) const { + return a.layout_binding->binding < b.layout_binding->binding; } }; +using DescriptorSetLayoutDef = cvdescriptorset::DescriptorSetLayoutDef; +using DescriptorSetLayoutId = cvdescriptorset::DescriptorSetLayoutId; + +// Canonical dictionary of DescriptorSetLayoutDef (without any handle/device specific information) +cvdescriptorset::DescriptorSetLayoutDict descriptor_set_layout_dict; + +DescriptorSetLayoutId get_canonical_id(const VkDescriptorSetLayoutCreateInfo *p_create_info) { + return descriptor_set_layout_dict.look_up(DescriptorSetLayoutDef(p_create_info)); +} + // Construct DescriptorSetLayout instance from given create info // Proactively reserve and resize as possible, as the reallocation was visible in profiling -cvdescriptorset::DescriptorSetLayout::DescriptorSetLayout(const VkDescriptorSetLayoutCreateInfo *p_create_info, - const VkDescriptorSetLayout layout) - : layout_(layout), - layout_destroyed_(false), - flags_(p_create_info->flags), - binding_count_(0), - descriptor_count_(0), - dynamic_descriptor_count_(0) { +cvdescriptorset::DescriptorSetLayoutDef::DescriptorSetLayoutDef(const VkDescriptorSetLayoutCreateInfo *p_create_info) + : flags_(p_create_info->flags), binding_count_(0), descriptor_count_(0), dynamic_descriptor_count_(0) { + const auto *flags_create_info = lvl_find_in_chain(p_create_info->pNext); + binding_type_stats_ = {0, 0, 0}; - std::set sorted_bindings; + std::set sorted_bindings; const uint32_t input_bindings_count = p_create_info->bindingCount; // Sort the input bindings in binding number order, eliminating duplicates for (uint32_t i = 0; i < input_bindings_count; i++) { - sorted_bindings.insert(p_create_info->pBindings + i); + VkDescriptorBindingFlagsEXT flags = 0; + if (flags_create_info && flags_create_info->bindingCount == p_create_info->bindingCount) { + flags = flags_create_info->pBindingFlags[i]; + } + sorted_bindings.insert(ExtendedBinding(p_create_info->pBindings + i, flags)); } // Store the create info in the sorted order from above @@ -58,13 +81,15 @@ uint32_t index = 0; binding_count_ = static_cast(sorted_bindings.size()); bindings_.reserve(binding_count_); + binding_flags_.reserve(binding_count_); binding_to_index_map_.reserve(binding_count_); for (auto input_binding : sorted_bindings) { // Add to binding and map, s.t. it is robust to invalid duplication of binding_num - const auto binding_num = input_binding->binding; + const auto binding_num = input_binding.layout_binding->binding; binding_to_index_map_[binding_num] = index++; - bindings_.emplace_back(input_binding); + bindings_.emplace_back(input_binding.layout_binding); auto &binding_info = bindings_.back(); + binding_flags_.emplace_back(input_binding.binding_flags); descriptor_count_ += binding_info.descriptorCount; if (binding_info.descriptorCount > 0) { @@ -84,6 +109,7 @@ } } assert(bindings_.size() == binding_count_); + assert(binding_flags_.size() == binding_count_); uint32_t global_index = 0; binding_to_global_index_range_map_.reserve(binding_count_); // Vector order is finalized so create maps of bindings to descriptors and descriptors to indices @@ -106,91 +132,53 @@ } } -// Validate descriptor set layout create info -bool cvdescriptorset::DescriptorSetLayout::ValidateCreateInfo(const debug_report_data *report_data, - const VkDescriptorSetLayoutCreateInfo *create_info, - const bool push_descriptor_ext, const uint32_t max_push_descriptors) { - bool skip = false; - std::unordered_set bindings; - uint64_t total_descriptors = 0; - - const bool push_descriptor_set = create_info->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR; - if (push_descriptor_set && !push_descriptor_ext) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DRAWSTATE_EXTENSION_NOT_ENABLED, "DS", - "Attemped to use %s in %s but its required extension %s has not been enabled.\n", - "VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR", "VkDescriptorSetLayoutCreateInfo::flags", - VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); - } - - auto valid_type = [push_descriptor_set](const VkDescriptorType type) { - return !push_descriptor_set || - ((type != VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) && (type != VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)); - }; - - for (uint32_t i = 0; i < create_info->bindingCount; ++i) { - const auto &binding_info = create_info->pBindings[i]; - if (!bindings.insert(binding_info.binding).second) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0500022e, "DS", "duplicated binding number in VkDescriptorSetLayoutBinding. %s", - validation_error_map[VALIDATION_ERROR_0500022e]); - } - if (!valid_type(binding_info.descriptorType)) { - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_05000230, "DS", - "invalid type %s ,for push descriptors in VkDescriptorSetLayoutBinding entry %" PRIu32 ". %s", - string_VkDescriptorType(binding_info.descriptorType), i, validation_error_map[VALIDATION_ERROR_05000230]); - } - total_descriptors += binding_info.descriptorCount; - } - - if ((push_descriptor_set) && (total_descriptors > max_push_descriptors)) { - const char *undefined = push_descriptor_ext ? "" : " -- undefined"; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_05000232, "DS", - "for push descriptor, total descriptor count in layout (%" PRIu64 - ") must not be greater than VkPhysicalDevicePushDescriptorPropertiesKHR::maxPushDescriptors (%" PRIu32 - "%s). %s", - total_descriptors, max_push_descriptors, undefined, validation_error_map[VALIDATION_ERROR_05000232]); - } - - return skip; +size_t cvdescriptorset::DescriptorSetLayoutDef::hash() const { + hash_util::HashCombiner hc; + hc << flags_; + hc.Combine(bindings_); + return hc.Value(); } +// // Return valid index or "end" i.e. binding_count_; // The asserts in "Get" are reduced to the set where no valid answer(like null or 0) could be given // Common code for all binding lookups. -uint32_t cvdescriptorset::DescriptorSetLayout::GetIndexFromBinding(uint32_t binding) const { +uint32_t cvdescriptorset::DescriptorSetLayoutDef::GetIndexFromBinding(uint32_t binding) const { const auto &bi_itr = binding_to_index_map_.find(binding); if (bi_itr != binding_to_index_map_.cend()) return bi_itr->second; return GetBindingCount(); } -VkDescriptorSetLayoutBinding const *cvdescriptorset::DescriptorSetLayout::GetDescriptorSetLayoutBindingPtrFromIndex( +VkDescriptorSetLayoutBinding const *cvdescriptorset::DescriptorSetLayoutDef::GetDescriptorSetLayoutBindingPtrFromIndex( const uint32_t index) const { if (index >= bindings_.size()) return nullptr; return bindings_[index].ptr(); } // Return descriptorCount for given index, 0 if index is unavailable -uint32_t cvdescriptorset::DescriptorSetLayout::GetDescriptorCountFromIndex(const uint32_t index) const { +uint32_t cvdescriptorset::DescriptorSetLayoutDef::GetDescriptorCountFromIndex(const uint32_t index) const { if (index >= bindings_.size()) return 0; return bindings_[index].descriptorCount; } // For the given index, return descriptorType -VkDescriptorType cvdescriptorset::DescriptorSetLayout::GetTypeFromIndex(const uint32_t index) const { +VkDescriptorType cvdescriptorset::DescriptorSetLayoutDef::GetTypeFromIndex(const uint32_t index) const { assert(index < bindings_.size()); if (index < bindings_.size()) return bindings_[index].descriptorType; return VK_DESCRIPTOR_TYPE_MAX_ENUM; } // For the given index, return stageFlags -VkShaderStageFlags cvdescriptorset::DescriptorSetLayout::GetStageFlagsFromIndex(const uint32_t index) const { +VkShaderStageFlags cvdescriptorset::DescriptorSetLayoutDef::GetStageFlagsFromIndex(const uint32_t index) const { assert(index < bindings_.size()); if (index < bindings_.size()) return bindings_[index].stageFlags; return VkShaderStageFlags(0); } +// Return binding flags for given index, 0 if index is unavailable +VkDescriptorBindingFlagsEXT cvdescriptorset::DescriptorSetLayoutDef::GetDescriptorBindingFlagsFromIndex( + const uint32_t index) const { + if (index >= binding_flags_.size()) return 0; + return binding_flags_[index]; +} // For the given global index, return index -uint32_t cvdescriptorset::DescriptorSetLayout::GetIndexFromGlobalIndex(const uint32_t global_index) const { +uint32_t cvdescriptorset::DescriptorSetLayoutDef::GetIndexFromGlobalIndex(const uint32_t global_index) const { auto start_it = global_start_to_index_map_.upper_bound(global_index); uint32_t index = binding_count_; assert(start_it != global_start_to_index_map_.cbegin()); @@ -207,7 +195,7 @@ // For the given binding, return the global index range // As start and end are often needed in pairs, get both with a single hash lookup. -const cvdescriptorset::IndexRange &cvdescriptorset::DescriptorSetLayout::GetGlobalIndexRangeFromBinding( +const cvdescriptorset::IndexRange &cvdescriptorset::DescriptorSetLayoutDef::GetGlobalIndexRangeFromBinding( const uint32_t binding) const { assert(binding_to_global_index_range_map_.count(binding)); // In error case max uint32_t so index is out of bounds to break ASAP @@ -220,7 +208,7 @@ } // For given binding, return ptr to ImmutableSampler array -VkSampler const *cvdescriptorset::DescriptorSetLayout::GetImmutableSamplerPtrFromBinding(const uint32_t binding) const { +VkSampler const *cvdescriptorset::DescriptorSetLayoutDef::GetImmutableSamplerPtrFromBinding(const uint32_t binding) const { const auto &bi_itr = binding_to_index_map_.find(binding); if (bi_itr != binding_to_index_map_.end()) { return bindings_[bi_itr->second].pImmutableSamplers; @@ -228,14 +216,14 @@ return nullptr; } // Move to next valid binding having a non-zero binding count -uint32_t cvdescriptorset::DescriptorSetLayout::GetNextValidBinding(const uint32_t binding) const { +uint32_t cvdescriptorset::DescriptorSetLayoutDef::GetNextValidBinding(const uint32_t binding) const { auto it = non_empty_bindings_.upper_bound(binding); assert(it != non_empty_bindings_.cend()); if (it != non_empty_bindings_.cend()) return *it; return GetMaxBinding() + 1; } // For given index, return ptr to ImmutableSampler array -VkSampler const *cvdescriptorset::DescriptorSetLayout::GetImmutableSamplerPtrFromIndex(const uint32_t index) const { +VkSampler const *cvdescriptorset::DescriptorSetLayoutDef::GetImmutableSamplerPtrFromIndex(const uint32_t index) const { if (index < bindings_.size()) { return bindings_[index].pImmutableSamplers; } @@ -247,42 +235,55 @@ std::string *error_msg) const { // Trivial case if (layout_ == rh_ds_layout->GetDescriptorSetLayout()) return true; - if (descriptor_count_ != rh_ds_layout->descriptor_count_) { + if (get_layout_def() == rh_ds_layout->get_layout_def()) return true; + bool detailed_compat_check = + get_layout_def()->IsCompatible(layout_, rh_ds_layout->GetDescriptorSetLayout(), rh_ds_layout->get_layout_def(), error_msg); + // The detailed check should never tell us mismatching DSL are compatible + assert(!detailed_compat_check); + return detailed_compat_check; +} + +// Do a detailed compatibility check of this def (referenced by ds_layout), vs. the rhs (layout and def) +// Should only be called if trivial accept has failed, and in that context should return false. +bool cvdescriptorset::DescriptorSetLayoutDef::IsCompatible(VkDescriptorSetLayout ds_layout, VkDescriptorSetLayout rh_ds_layout, + DescriptorSetLayoutDef const *const rh_ds_layout_def, + std::string *error_msg) const { + if (descriptor_count_ != rh_ds_layout_def->descriptor_count_) { std::stringstream error_str; - error_str << "DescriptorSetLayout " << layout_ << " has " << descriptor_count_ << " descriptors, but DescriptorSetLayout " - << rh_ds_layout->GetDescriptorSetLayout() << ", which comes from pipelineLayout, has " - << rh_ds_layout->descriptor_count_ << " descriptors."; + error_str << "DescriptorSetLayout " << ds_layout << " has " << descriptor_count_ << " descriptors, but DescriptorSetLayout " + << rh_ds_layout << ", which comes from pipelineLayout, has " << rh_ds_layout_def->descriptor_count_ + << " descriptors."; *error_msg = error_str.str(); return false; // trivial fail case } + // Descriptor counts match so need to go through bindings one-by-one // and verify that type and stageFlags match for (auto binding : bindings_) { // TODO : Do we also need to check immutable samplers? // VkDescriptorSetLayoutBinding *rh_binding; - if (binding.descriptorCount != rh_ds_layout->GetDescriptorCountFromBinding(binding.binding)) { + if (binding.descriptorCount != rh_ds_layout_def->GetDescriptorCountFromBinding(binding.binding)) { std::stringstream error_str; - error_str << "Binding " << binding.binding << " for DescriptorSetLayout " << layout_ << " has a descriptorCount of " + error_str << "Binding " << binding.binding << " for DescriptorSetLayout " << ds_layout << " has a descriptorCount of " << binding.descriptorCount << " but binding " << binding.binding << " for DescriptorSetLayout " - << rh_ds_layout->GetDescriptorSetLayout() << ", which comes from pipelineLayout, has a descriptorCount of " - << rh_ds_layout->GetDescriptorCountFromBinding(binding.binding); + << rh_ds_layout << ", which comes from pipelineLayout, has a descriptorCount of " + << rh_ds_layout_def->GetDescriptorCountFromBinding(binding.binding); *error_msg = error_str.str(); return false; - } else if (binding.descriptorType != rh_ds_layout->GetTypeFromBinding(binding.binding)) { + } else if (binding.descriptorType != rh_ds_layout_def->GetTypeFromBinding(binding.binding)) { std::stringstream error_str; - error_str << "Binding " << binding.binding << " for DescriptorSetLayout " << layout_ << " is type '" + error_str << "Binding " << binding.binding << " for DescriptorSetLayout " << ds_layout << " is type '" << string_VkDescriptorType(binding.descriptorType) << "' but binding " << binding.binding - << " for DescriptorSetLayout " << rh_ds_layout->GetDescriptorSetLayout() - << ", which comes from pipelineLayout, is type '" - << string_VkDescriptorType(rh_ds_layout->GetTypeFromBinding(binding.binding)) << "'"; + << " for DescriptorSetLayout " << rh_ds_layout << ", which comes from pipelineLayout, is type '" + << string_VkDescriptorType(rh_ds_layout_def->GetTypeFromBinding(binding.binding)) << "'"; *error_msg = error_str.str(); return false; - } else if (binding.stageFlags != rh_ds_layout->GetStageFlagsFromBinding(binding.binding)) { + } else if (binding.stageFlags != rh_ds_layout_def->GetStageFlagsFromBinding(binding.binding)) { std::stringstream error_str; - error_str << "Binding " << binding.binding << " for DescriptorSetLayout " << layout_ << " has stageFlags " - << binding.stageFlags << " but binding " << binding.binding << " for DescriptorSetLayout " - << rh_ds_layout->GetDescriptorSetLayout() << ", which comes from pipelineLayout, has stageFlags " - << rh_ds_layout->GetStageFlagsFromBinding(binding.binding); + error_str << "Binding " << binding.binding << " for DescriptorSetLayout " << ds_layout << " has stageFlags " + << binding.stageFlags << " but binding " << binding.binding << " for DescriptorSetLayout " << rh_ds_layout + << ", which comes from pipelineLayout, has stageFlags " + << rh_ds_layout_def->GetStageFlagsFromBinding(binding.binding); *error_msg = error_str.str(); return false; } @@ -290,7 +291,7 @@ return true; } -bool cvdescriptorset::DescriptorSetLayout::IsNextBindingConsistent(const uint32_t binding) const { +bool cvdescriptorset::DescriptorSetLayoutDef::IsNextBindingConsistent(const uint32_t binding) const { if (!binding_to_index_map_.count(binding + 1)) return false; auto const &bi_itr = binding_to_index_map_.find(binding); if (bi_itr != binding_to_index_map_.end()) { @@ -299,9 +300,11 @@ auto type = bindings_[bi_itr->second].descriptorType; auto stage_flags = bindings_[bi_itr->second].stageFlags; auto immut_samp = bindings_[bi_itr->second].pImmutableSamplers ? true : false; + auto flags = binding_flags_[bi_itr->second]; if ((type != bindings_[next_bi_itr->second].descriptorType) || (stage_flags != bindings_[next_bi_itr->second].stageFlags) || - (immut_samp != (bindings_[next_bi_itr->second].pImmutableSamplers ? true : false))) { + (immut_samp != (bindings_[next_bi_itr->second].pImmutableSamplers ? true : false)) || + (flags != binding_flags_[next_bi_itr->second])) { return false; } return true; @@ -313,9 +316,9 @@ // 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::DescriptorSetLayout::VerifyUpdateConsistency(uint32_t current_binding, uint32_t offset, uint32_t update_count, - const char *type, const VkDescriptorSet set, - std::string *error_msg) const { +bool cvdescriptorset::DescriptorSetLayoutDef::VerifyUpdateConsistency(uint32_t current_binding, uint32_t offset, + uint32_t update_count, const char *type, + const VkDescriptorSet set, std::string *error_msg) const { // Verify consecutive bindings match (if needed) auto orig_binding = current_binding; // Track count of descriptors in the current_bindings that are remaining to be updated @@ -346,17 +349,204 @@ return true; } +// The DescriptorSetLayout stores the per handle data for a descriptor set layout, and references the common defintion for the +// handle invariant portion +cvdescriptorset::DescriptorSetLayout::DescriptorSetLayout(const VkDescriptorSetLayoutCreateInfo *p_create_info, + const VkDescriptorSetLayout layout) + : layout_(layout), layout_destroyed_(false), layout_id_(get_canonical_id(p_create_info)) {} + +// Validate descriptor set layout create info +bool cvdescriptorset::DescriptorSetLayout::ValidateCreateInfo( + const debug_report_data *report_data, const VkDescriptorSetLayoutCreateInfo *create_info, const bool push_descriptor_ext, + const uint32_t max_push_descriptors, const bool descriptor_indexing_ext, + const VkPhysicalDeviceDescriptorIndexingFeaturesEXT *descriptor_indexing_features) { + bool skip = false; + std::unordered_set bindings; + uint64_t total_descriptors = 0; + + const auto *flags_create_info = lvl_find_in_chain(create_info->pNext); + + const bool push_descriptor_set = !!(create_info->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR); + if (push_descriptor_set && !push_descriptor_ext) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + DRAWSTATE_EXTENSION_NOT_ENABLED, + "Attempted to use %s in %s but its required extension %s has not been enabled.\n", + "VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR", "VkDescriptorSetLayoutCreateInfo::flags", + VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); + } + + const bool update_after_bind_set = !!(create_info->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT); + if (update_after_bind_set && !descriptor_indexing_ext) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + DRAWSTATE_EXTENSION_NOT_ENABLED, + "Attemped to use %s in %s but its required extension %s has not been enabled.\n", + "VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT", "VkDescriptorSetLayoutCreateInfo::flags", + VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); + } + + auto valid_type = [push_descriptor_set](const VkDescriptorType type) { + return !push_descriptor_set || + ((type != VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) && (type != VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)); + }; + + uint32_t max_binding = 0; + + for (uint32_t i = 0; i < create_info->bindingCount; ++i) { + const auto &binding_info = create_info->pBindings[i]; + max_binding = std::max(max_binding, binding_info.binding); + + if (!bindings.insert(binding_info.binding).second) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0500022e, "duplicated binding number in VkDescriptorSetLayoutBinding."); + } + if (!valid_type(binding_info.descriptorType)) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_05000230, + "invalid type %s ,for push descriptors in VkDescriptorSetLayoutBinding entry %" PRIu32 ".", + string_VkDescriptorType(binding_info.descriptorType), i); + } + total_descriptors += binding_info.descriptorCount; + } + + if (flags_create_info) { + if (flags_create_info->bindingCount != 0 && flags_create_info->bindingCount != create_info->bindingCount) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a01774, + "VkDescriptorSetLayoutCreateInfo::bindingCount (%d) != " + "VkDescriptorSetLayoutBindingFlagsCreateInfoEXT::bindingCount (%d)", + create_info->bindingCount, flags_create_info->bindingCount); + } + + if (flags_create_info->bindingCount == create_info->bindingCount) { + for (uint32_t i = 0; i < create_info->bindingCount; ++i) { + const auto &binding_info = create_info->pBindings[i]; + + if (flags_create_info->pBindingFlags[i] & VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT) { + if (!update_after_bind_set) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_05001770, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + + if (binding_info.descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER && + !descriptor_indexing_features->descriptorBindingUniformBufferUpdateAfterBind) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a0177a, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + if ((binding_info.descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER || + binding_info.descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER || + binding_info.descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) && + !descriptor_indexing_features->descriptorBindingSampledImageUpdateAfterBind) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a0177c, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + if (binding_info.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE && + !descriptor_indexing_features->descriptorBindingStorageImageUpdateAfterBind) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a0177e, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + if (binding_info.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER && + !descriptor_indexing_features->descriptorBindingStorageBufferUpdateAfterBind) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a01780, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + if (binding_info.descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER && + !descriptor_indexing_features->descriptorBindingUniformTexelBufferUpdateAfterBind) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a01782, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + if (binding_info.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER && + !descriptor_indexing_features->descriptorBindingStorageTexelBufferUpdateAfterBind) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a01784, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + if ((binding_info.descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT || + binding_info.descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC || + binding_info.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a01786, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + } + + if (flags_create_info->pBindingFlags[i] & VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT) { + if (!descriptor_indexing_features->descriptorBindingUpdateUnusedWhilePending) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a01788, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + } + + if (flags_create_info->pBindingFlags[i] & VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT) { + if (!descriptor_indexing_features->descriptorBindingPartiallyBound) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a0178a, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + } + + if (flags_create_info->pBindingFlags[i] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT) { + if (binding_info.binding != max_binding) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a01778, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + + if (!descriptor_indexing_features->descriptorBindingVariableDescriptorCount) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a0178c, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + if ((binding_info.descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC || + binding_info.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a0178e, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + } + + if (push_descriptor_set && + (flags_create_info->pBindingFlags[i] & + (VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT | VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT | + VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT))) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_46a01776, "Invalid flags for VkDescriptorSetLayoutBinding entry %" PRIu32, i); + } + } + } + } + + if ((push_descriptor_set) && (total_descriptors > max_push_descriptors)) { + const char *undefined = push_descriptor_ext ? "" : " -- undefined"; + skip |= log_msg( + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, VALIDATION_ERROR_05000232, + "for push descriptor, total descriptor count in layout (%" PRIu64 + ") must not be greater than VkPhysicalDevicePushDescriptorPropertiesKHR::maxPushDescriptors (%" PRIu32 "%s).", + total_descriptors, max_push_descriptors, undefined); + } + + return skip; +} + cvdescriptorset::AllocateDescriptorSetsData::AllocateDescriptorSetsData(uint32_t count) : required_descriptors_by_type{}, layout_nodes(count, nullptr) {} cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const VkDescriptorPool pool, - const std::shared_ptr &layout, layer_data *dev_data) + const std::shared_ptr &layout, uint32_t variable_count, + layer_data *dev_data) : some_update_(false), set_(set), pool_state_(nullptr), p_layout_(layout), device_data_(dev_data), - limits_(GetPhysDevProperties(dev_data)->properties.limits) { + limits_(GetPhysDevProperties(dev_data)->properties.limits), + variable_count_(variable_count) { pool_state_ = GetDescriptorPoolState(dev_data, pool); // Foreach binding, create default descriptors of given type descriptors_.reserve(p_layout_->GetTotalDescriptorCount()); @@ -450,8 +640,18 @@ } IndexRange index_range = p_layout_->GetGlobalIndexRangeFromBinding(binding); auto array_idx = 0; // Track array idx if we're dealing with array descriptors + + if (IsVariableDescriptorCount(binding)) { + // Only validate the first N descriptors if it uses variable_count + index_range.end = index_range.start + GetVariableDescriptorCount(); + } + for (uint32_t i = index_range.start; i < index_range.end; ++i, ++array_idx) { - if (!descriptors_[i]->updated) { + if (p_layout_->GetDescriptorBindingFlagsFromBinding(binding) & VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT) { + // Can't validate the descriptor because it may not have been updated, + // or the view could have been destroyed + continue; + } else if (!descriptors_[i]->updated) { std::stringstream error_str; error_str << "Descriptor in binding #" << binding << " at global descriptor index " << i << " is being used in draw but has not been updated."; @@ -587,6 +787,22 @@ return false; } } + if (descriptor_class == ImageSampler || descriptor_class == PlainSampler) { + // Verify Sampler still valid + VkSampler sampler; + if (descriptor_class == ImageSampler) { + sampler = static_cast(descriptors_[i].get())->GetSampler(); + } else { + sampler = static_cast(descriptors_[i].get())->GetSampler(); + } + if (!ValidateSampler(sampler, device_data_)) { + std::stringstream error_str; + error_str << "Descriptor in binding #" << binding << " at global descriptor index " << i + << " is using sampler " << sampler << " that has been destroyed."; + *error = error_str.str(); + return false; + } + } } } } @@ -661,7 +877,10 @@ } if (update->descriptorCount) some_update_ = true; - InvalidateBoundCmdBuffers(); + if (!(p_layout_->GetDescriptorBindingFlagsFromBinding(update->dstBinding) & + (VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT))) { + InvalidateBoundCmdBuffers(); + } } // Validate Copy update bool cvdescriptorset::DescriptorSet::ValidateCopyUpdate(const debug_report_data *report_data, const VkCopyDescriptorSet *update, @@ -688,16 +907,6 @@ return false; } - // Verify idle ds - if (in_use.load()) { - // TODO : Re-using Free Idle error code, need copy update idle error code - *error_code = VALIDATION_ERROR_2860026a; - std::stringstream error_str; - error_str << "Cannot call vkUpdateDescriptorSets() to perform copy update on descriptor set " << set_ - << " that is in use by a command buffer"; - *error_msg = error_str.str(); - return false; - } if (!p_layout_->HasBinding(update->dstBinding)) { *error_code = VALIDATION_ERROR_032002b6; std::stringstream error_str; @@ -712,6 +921,18 @@ *error_msg = error_str.str(); return false; } + // Verify idle ds + if (in_use.load() && + !(p_layout_->GetDescriptorBindingFlagsFromBinding(update->dstBinding) & + (VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT))) { + // TODO : Re-using Free Idle error code, need copy update idle error code + *error_code = VALIDATION_ERROR_2860026a; + std::stringstream error_str; + error_str << "Cannot call vkUpdateDescriptorSets() to perform copy update on descriptor set " << set_ + << " that is in use by a command buffer"; + *error_msg = error_str.str(); + return false; + } // src & dst set bindings are valid // Check bounds of src & dst auto src_start_idx = src_set->GetGlobalIndexRangeFromBinding(update->srcBinding).start + update->srcArrayElement; @@ -759,6 +980,67 @@ set_, error_msg))) { return false; } + + if ((src_set->GetLayout()->GetCreateFlags() & VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT) && + !(GetLayout()->GetCreateFlags() & VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT)) { + *error_code = VALIDATION_ERROR_03200efc; + std::stringstream error_str; + error_str << "If pname:srcSet's (" << 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 + << ") 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(); + return false; + } + + if (!(src_set->GetLayout()->GetCreateFlags() & VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT) && + (GetLayout()->GetCreateFlags() & VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT)) { + *error_code = VALIDATION_ERROR_03200efe; + std::stringstream error_str; + error_str << "If pname:srcSet's (" << 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 + << ") 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(); + return false; + } + + if ((src_set->GetPoolState()->createInfo.flags & VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT) && + !(GetPoolState()->createInfo.flags & VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT)) { + *error_code = VALIDATION_ERROR_03200f00; + std::stringstream error_str; + error_str << "If the descriptor pool from which pname:srcSet (" << 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 + << ") 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(); + return false; + } + + if (!(src_set->GetPoolState()->createInfo.flags & VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT) && + (GetPoolState()->createInfo.flags & VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT)) { + *error_code = VALIDATION_ERROR_03200f02; + std::stringstream error_str; + error_str << "If the descriptor pool from which pname:srcSet (" << 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 + << ") 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(); + return false; + } + // Update parameters all look good and descriptor updated so verify update contents if (!VerifyCopyUpdateContents(update, src_set, src_type, src_start_idx, error_code, error_msg)) return false; @@ -781,7 +1063,10 @@ } } - InvalidateBoundCmdBuffers(); + if (!(p_layout_->GetDescriptorBindingFlagsFromBinding(update->dstBinding) & + (VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT))) { + InvalidateBoundCmdBuffers(); + } } // Bind cb_node to this set and this set to cb_node. @@ -1073,7 +1358,9 @@ } void cvdescriptorset::SamplerDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index) { - sampler_ = update->pImageInfo[index].sampler; + if (!immutable_) { + sampler_ = update->pImageInfo[index].sampler; + } updated = true; } @@ -1105,7 +1392,9 @@ void cvdescriptorset::ImageSamplerDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index) { updated = true; const auto &image_info = update->pImageInfo[index]; - sampler_ = image_info.sampler; + if (!immutable_) { + sampler_ = image_info.sampler; + } image_view_ = image_info.imageView; image_layout_ = image_info.imageLayout; } @@ -1238,7 +1527,7 @@ if (!set_node) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - HandleToUint64(dest_set), __LINE__, DRAWSTATE_INVALID_DESCRIPTOR_SET, "DS", + HandleToUint64(dest_set), DRAWSTATE_INVALID_DESCRIPTOR_SET, "Cannot call vkUpdateDescriptorSets() on descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", HandleToUint64(dest_set)); } else { @@ -1246,10 +1535,10 @@ std::string error_str; if (!set_node->ValidateWriteUpdate(report_data, &p_wds[i], &error_code, &error_str)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - HandleToUint64(dest_set), __LINE__, error_code, "DS", + HandleToUint64(dest_set), error_code, "vkUpdateDescriptorSets() failed write update validation for Descriptor Set 0x%" PRIx64 - " with error: %s. %s", - HandleToUint64(dest_set), error_str.c_str(), validation_error_map[error_code]); + " with error: %s.", + HandleToUint64(dest_set), error_str.c_str()); } } } @@ -1266,10 +1555,10 @@ std::string error_str; if (!dst_node->ValidateCopyUpdate(report_data, &p_cds[i], src_node, &error_code, &error_str)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - HandleToUint64(dst_set), __LINE__, error_code, "DS", + HandleToUint64(dst_set), error_code, "vkUpdateDescriptorSets() failed copy update from Descriptor Set 0x%" PRIx64 - " to Descriptor Set 0x%" PRIx64 " with error: %s. %s", - HandleToUint64(src_set), HandleToUint64(dst_set), error_str.c_str(), validation_error_map[error_code]); + " to Descriptor Set 0x%" PRIx64 " with error: %s.", + HandleToUint64(src_set), HandleToUint64(dst_set), error_str.c_str()); } } return skip; @@ -1383,16 +1672,6 @@ HandleToUint64(set_), HandleToUint64(p_layout_->GetDescriptorSetLayout())); return false; } - // Verify idle ds - if (in_use.load()) { - // TODO : Re-using Free Idle error code, need write update idle error code - *error_code = VALIDATION_ERROR_2860026a; - std::stringstream error_str; - error_str << "Cannot call vkUpdateDescriptorSets() to perform write update on descriptor set " << set_ - << " that is in use by a command buffer"; - *error_msg = error_str.str(); - return false; - } // Verify dst binding exists if (!p_layout_->HasBinding(update->dstBinding)) { *error_code = VALIDATION_ERROR_15c00276; @@ -1410,6 +1689,18 @@ return false; } } + // Verify idle ds + if (in_use.load() && + !(p_layout_->GetDescriptorBindingFlagsFromBinding(update->dstBinding) & + (VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT))) { + // TODO : Re-using Free Idle error code, need write update idle error code + *error_code = VALIDATION_ERROR_2860026a; + std::stringstream error_str; + error_str << "Cannot call vkUpdateDescriptorSets() to perform write update on descriptor set " << set_ + << " that is in use by a command buffer"; + *error_msg = error_str.str(); + return false; + } // We know that binding is valid, verify update and do update on each descriptor auto start_idx = p_layout_->GetGlobalIndexRangeFromBinding(update->dstBinding).start + update->dstArrayElement; auto type = p_layout_->GetTypeFromBinding(update->dstBinding); @@ -1819,42 +2110,69 @@ const AllocateDescriptorSetsData *ds_data) { bool skip = false; auto report_data = core_validation::GetReportData(dev_data); + auto pool_state = GetDescriptorPoolState(dev_data, p_alloc_info->descriptorPool); for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { auto layout = GetDescriptorSetLayout(dev_data, p_alloc_info->pSetLayouts[i]); if (layout) { // nullptr layout indicates no valid layout handle for this device, validated/logged in object_tracker if (layout->GetCreateFlags() & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, - HandleToUint64(p_alloc_info->pSetLayouts[i]), __LINE__, VALIDATION_ERROR_04c00268, "DS", + HandleToUint64(p_alloc_info->pSetLayouts[i]), VALIDATION_ERROR_04c00268, "Layout 0x%" PRIxLEAST64 " specified at pSetLayouts[%" PRIu32 - "] in vkAllocateDescriptorSets() was created with invalid flag %s set. %s", + "] in vkAllocateDescriptorSets() was created with invalid flag %s set.", HandleToUint64(p_alloc_info->pSetLayouts[i]), i, - "VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR", - validation_error_map[VALIDATION_ERROR_04c00268]); + "VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR"); + } + if (layout->GetCreateFlags() & VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT && + !(pool_state->createInfo.flags & VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT)) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, + 0, VALIDATION_ERROR_04c017c8, + "Descriptor set layout create flags and pool create flags mismatch for index (%d)", i); } } } if (!GetDeviceExtensions(dev_data)->vk_khr_maintenance1) { - auto pool_state = GetDescriptorPoolState(dev_data, p_alloc_info->descriptorPool); // Track number of descriptorSets allowable in this pool if (pool_state->availableSets < p_alloc_info->descriptorSetCount) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - HandleToUint64(pool_state->pool), __LINE__, VALIDATION_ERROR_04c00264, "DS", + HandleToUint64(pool_state->pool), VALIDATION_ERROR_04c00264, "Unable to allocate %u descriptorSets from pool 0x%" PRIxLEAST64 - ". This pool only has %d descriptorSets remaining. %s", - p_alloc_info->descriptorSetCount, HandleToUint64(pool_state->pool), pool_state->availableSets, - validation_error_map[VALIDATION_ERROR_04c00264]); + ". This pool only has %d descriptorSets remaining.", + p_alloc_info->descriptorSetCount, HandleToUint64(pool_state->pool), pool_state->availableSets); } // Determine whether descriptor counts are satisfiable for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { if (ds_data->required_descriptors_by_type[i] > pool_state->availableDescriptorTypeCount[i]) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - HandleToUint64(pool_state->pool), __LINE__, VALIDATION_ERROR_04c00266, "DS", + HandleToUint64(pool_state->pool), VALIDATION_ERROR_04c00266, "Unable to allocate %u descriptors of type %s from pool 0x%" PRIxLEAST64 - ". This pool only has %d descriptors of this type remaining. %s", + ". This pool only has %d descriptors of this type remaining.", ds_data->required_descriptors_by_type[i], string_VkDescriptorType(VkDescriptorType(i)), - HandleToUint64(pool_state->pool), pool_state->availableDescriptorTypeCount[i], - validation_error_map[VALIDATION_ERROR_04c00266]); + HandleToUint64(pool_state->pool), pool_state->availableDescriptorTypeCount[i]); + } + } + } + + const auto *count_allocate_info = lvl_find_in_chain(p_alloc_info->pNext); + + if (count_allocate_info) { + if (count_allocate_info->descriptorSetCount != 0 && + count_allocate_info->descriptorSetCount != p_alloc_info->descriptorSetCount) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, 0, + VALIDATION_ERROR_46c017ca, + "VkDescriptorSetAllocateInfo::descriptorSetCount (%d) != " + "VkDescriptorSetVariableDescriptorCountAllocateInfoEXT::descriptorSetCount (%d)", + p_alloc_info->descriptorSetCount, count_allocate_info->descriptorSetCount); + } + if (count_allocate_info->descriptorSetCount == p_alloc_info->descriptorSetCount) { + for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { + auto layout = GetDescriptorSetLayout(dev_data, p_alloc_info->pSetLayouts[i]); + if (count_allocate_info->pDescriptorCounts[i] > layout->GetDescriptorCountFromBinding(layout->GetMaxBinding())) { + skip |= log_msg( + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, 0, + VALIDATION_ERROR_46c017cc, "pDescriptorCounts[%d] = (%d), binding's descriptorCount = (%d)", i, + count_allocate_info->pDescriptorCounts[i], layout->GetDescriptorCountFromBinding(layout->GetMaxBinding())); + } } } } @@ -1874,10 +2192,16 @@ for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { pool_state->availableDescriptorTypeCount[i] -= ds_data->required_descriptors_by_type[i]; } + + const auto *variable_count_info = lvl_find_in_chain(p_alloc_info->pNext); + bool variable_count_valid = variable_count_info && variable_count_info->descriptorSetCount == p_alloc_info->descriptorSetCount; + // Create tracking object for each descriptor set; insert into global map and the pool's set. for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { + uint32_t variable_count = variable_count_valid ? variable_count_info->pDescriptorCounts[i] : 0; + auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], p_alloc_info->descriptorPool, ds_data->layout_nodes[i], - dev_data); + variable_count, dev_data); pool_state->sets.insert(new_ds); new_ds->in_use.store(0); diff -Nru vulkan-1.1.70+dfsg1/layers/descriptor_sets.h vulkan-1.1.73+dfsg/layers/descriptor_sets.h --- vulkan-1.1.70+dfsg1/layers/descriptor_sets.h 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/descriptor_sets.h 2018-04-27 11:24:19.000000000 +0000 @@ -24,6 +24,7 @@ #include "core_validation_error_enums.h" #include "vk_validation_error_messages.h" #include "core_validation_types.h" +#include "hash_vk_types.h" #include "vk_layer_logging.h" #include "vk_layer_utils.h" #include "vk_safe_struct.h" @@ -52,11 +53,17 @@ typedef std::map BindingReqMap; /* - * DescriptorSetLayout class + * DescriptorSetLayoutDef/DescriptorSetLayout classes * - * Overview - This class encapsulates the Vulkan VkDescriptorSetLayout data (layout). + * Overview - These two classes encapsulate the Vulkan VkDescriptorSetLayout data (layout). * A layout consists of some number of bindings, each of which has a binding#, a * type, descriptor count, stage flags, and pImmutableSamplers. + + * The DescriptorSetLayoutDef represents a canonicalization of the input data and contains + * neither per handle or per device state. It is possible for different handles on + * different devices to share a common def. This is used and useful for quick compatibiltiy + * validation. The DescriptorSetLayout refers to a DescriptorSetLayoutDef and contains + * all per handle state. * * Index vs Binding - A layout is created with an array of VkDescriptorSetLayoutBinding * where each array index will have a corresponding binding# that is defined in that struct. @@ -81,16 +88,12 @@ * 10, then the GlobalStartIndex of the 2nd lowest binding# will be 10 where 0-9 are the * global indices for the lowest binding#. */ -class DescriptorSetLayout { +class DescriptorSetLayoutDef { public: // Constructors and destructor - DescriptorSetLayout(const VkDescriptorSetLayoutCreateInfo *p_create_info, const VkDescriptorSetLayout layout); - // Validate create info - should be called prior to creation - static bool ValidateCreateInfo(const debug_report_data *, const VkDescriptorSetLayoutCreateInfo *, const bool, const uint32_t); - // Straightforward Get functions - VkDescriptorSetLayout GetDescriptorSetLayout() const { return layout_; }; - bool IsDestroyed() const { return layout_destroyed_; } - void MarkDestroyed() { layout_destroyed_ = true; } + DescriptorSetLayoutDef(const VkDescriptorSetLayoutCreateInfo *p_create_info); + size_t hash() const; + uint32_t GetTotalDescriptorCount() const { return descriptor_count_; }; uint32_t GetDynamicDescriptorCount() const { return dynamic_descriptor_count_; }; VkDescriptorSetLayoutCreateFlags GetCreateFlags() const { return flags_; } @@ -100,9 +103,9 @@ const std::set &GetSortedBindingSet() const { return non_empty_bindings_; } // Return true if given binding is present in this layout bool HasBinding(const uint32_t binding) const { return binding_to_index_map_.count(binding) > 0; }; - // Return true if this layout is compatible with passed in layout from a pipelineLayout, - // else return false and update error_msg with description of incompatibility - bool IsCompatible(DescriptorSetLayout const *const, std::string *) const; + // Return true if this DSL Def (referenced by the 1st layout) is compatible with another DSL Def (ref'd from the 2nd layout) + // else return false and update error_msg with description of incompatibility + bool IsCompatible(VkDescriptorSetLayout, VkDescriptorSetLayout, DescriptorSetLayoutDef const *const, std::string *) const; // Return true if binding 1 beyond given exists and has same type, stageFlags & immutable sampler use bool IsNextBindingConsistent(const uint32_t) const; uint32_t GetIndexFromBinding(uint32_t binding) const; @@ -113,6 +116,7 @@ VkDescriptorSetLayoutBinding const *GetDescriptorSetLayoutBindingPtrFromBinding(uint32_t binding) const { return GetDescriptorSetLayoutBindingPtrFromIndex(GetIndexFromBinding(binding)); } + const std::vector &GetBindings() const { return bindings_; } uint32_t GetDescriptorCountFromIndex(const uint32_t) const; uint32_t GetDescriptorCountFromBinding(const uint32_t binding) const { return GetDescriptorCountFromIndex(GetIndexFromBinding(binding)); @@ -123,6 +127,10 @@ VkShaderStageFlags GetStageFlagsFromBinding(const uint32_t binding) const { return GetStageFlagsFromIndex(GetIndexFromBinding(binding)); } + VkDescriptorBindingFlagsEXT GetDescriptorBindingFlagsFromIndex(const uint32_t) const; + VkDescriptorBindingFlagsEXT GetDescriptorBindingFlagsFromBinding(const uint32_t binding) const { + return GetDescriptorBindingFlagsFromIndex(GetIndexFromBinding(binding)); + } uint32_t GetIndexFromGlobalIndex(const uint32_t global_index) const; VkDescriptorType GetTypeFromGlobalIndex(const uint32_t global_index) const { return GetTypeFromIndex(GetIndexFromGlobalIndex(global_index)); @@ -157,8 +165,13 @@ const BindingTypeStats &GetBindingTypeStats() const { return binding_type_stats_; } private: - VkDescriptorSetLayout layout_; - bool layout_destroyed_; + // Only the first two data members are used for hash and equality checks, the other members are derived from them, and are used + // to speed up the various lookups/queries/validations + VkDescriptorSetLayoutCreateFlags flags_; + std::vector bindings_; + std::vector binding_flags_; + + // Convenience data structures for rapid lookup of various descriptor set layout properties std::set non_empty_bindings_; // Containing non-emtpy bindings in numerical order std::unordered_map binding_to_index_map_; // The following map allows an non-iterative lookup of a binding from a global index... @@ -166,14 +179,110 @@ std::unordered_map binding_to_global_index_range_map_; // range is exclusive of .end // For a given binding map to associated index in the dynamic offset array std::unordered_map binding_to_dynamic_array_idx_map_; - VkDescriptorSetLayoutCreateFlags flags_; - uint32_t binding_count_; // # of bindings in this layout - std::vector bindings_; + + uint32_t binding_count_; // # of bindings in this layout uint32_t descriptor_count_; // total # descriptors in this layout uint32_t dynamic_descriptor_count_; BindingTypeStats binding_type_stats_; }; +static bool operator==(const DescriptorSetLayoutDef &lhs, const DescriptorSetLayoutDef &rhs) { + return (lhs.GetCreateFlags() == rhs.GetCreateFlags()) && (lhs.GetBindings() == rhs.GetBindings()); +} + +// Canonical dictionary of DSL definitions -- independent of device or handle +using DescriptorSetLayoutDict = hash_util::Dictionary>; +using DescriptorSetLayoutId = DescriptorSetLayoutDict::Id; + +class DescriptorSetLayout { + public: + // Constructors and destructor + DescriptorSetLayout(const VkDescriptorSetLayoutCreateInfo *p_create_info, const VkDescriptorSetLayout layout); + // Validate create info - should be called prior to creation + static bool ValidateCreateInfo(const debug_report_data *, const VkDescriptorSetLayoutCreateInfo *, const bool, const uint32_t, + const bool, const VkPhysicalDeviceDescriptorIndexingFeaturesEXT *descriptor_indexing_features); + bool HasBinding(const uint32_t binding) const { return layout_id_->HasBinding(binding); } + // Return true if this layout is compatible with passed in layout from a pipelineLayout, + // else return false and update error_msg with description of incompatibility + bool IsCompatible(DescriptorSetLayout const *const, std::string *) const; + // Straightforward Get functions + VkDescriptorSetLayout GetDescriptorSetLayout() const { return layout_; }; + bool IsDestroyed() const { return layout_destroyed_; } + void MarkDestroyed() { layout_destroyed_ = true; } + const DescriptorSetLayoutDef *get_layout_def() const { return layout_id_.get(); } + DescriptorSetLayoutId get_layout_id() const { return layout_id_; } + uint32_t GetTotalDescriptorCount() const { return layout_id_->GetTotalDescriptorCount(); }; + uint32_t GetDynamicDescriptorCount() const { return layout_id_->GetDynamicDescriptorCount(); }; + uint32_t GetBindingCount() const { return layout_id_->GetBindingCount(); }; + VkDescriptorSetLayoutCreateFlags GetCreateFlags() const { return layout_id_->GetCreateFlags(); } + bool IsNextBindingConsistent(const uint32_t) const; + uint32_t GetIndexFromBinding(uint32_t binding) const { return layout_id_->GetIndexFromBinding(binding); } + // Various Get functions that can either be passed a binding#, which will + // be automatically translated into the appropriate index, or the index# can be passed in directly + uint32_t GetMaxBinding() const { return layout_id_->GetMaxBinding(); } + VkDescriptorSetLayoutBinding const *GetDescriptorSetLayoutBindingPtrFromIndex(const uint32_t index) const { + return layout_id_->GetDescriptorSetLayoutBindingPtrFromIndex(index); + } + VkDescriptorSetLayoutBinding const *GetDescriptorSetLayoutBindingPtrFromBinding(uint32_t binding) const { + return layout_id_->GetDescriptorSetLayoutBindingPtrFromBinding(binding); + } + const std::vector &GetBindings() const { return layout_id_->GetBindings(); } + uint32_t GetDescriptorCountFromIndex(const uint32_t index) const { return layout_id_->GetDescriptorCountFromIndex(index); } + uint32_t GetDescriptorCountFromBinding(const uint32_t binding) const { + return layout_id_->GetDescriptorCountFromBinding(binding); + } + VkDescriptorType GetTypeFromIndex(const uint32_t index) const { return layout_id_->GetTypeFromIndex(index); } + VkDescriptorType GetTypeFromBinding(const uint32_t binding) const { return layout_id_->GetTypeFromBinding(binding); } + VkShaderStageFlags GetStageFlagsFromIndex(const uint32_t index) const { return layout_id_->GetStageFlagsFromIndex(index); } + VkShaderStageFlags GetStageFlagsFromBinding(const uint32_t binding) const { + return layout_id_->GetStageFlagsFromBinding(binding); + } + VkDescriptorBindingFlagsEXT GetDescriptorBindingFlagsFromIndex(const uint32_t index) const { + return layout_id_->GetDescriptorBindingFlagsFromIndex(index); + } + VkDescriptorBindingFlagsEXT GetDescriptorBindingFlagsFromBinding(const uint32_t binding) const { + return layout_id_->GetDescriptorBindingFlagsFromBinding(binding); + } + uint32_t GetIndexFromGlobalIndex(const uint32_t global_index) const { + return layout_id_->GetIndexFromGlobalIndex(global_index); + } + VkDescriptorType GetTypeFromGlobalIndex(const uint32_t global_index) const { + return GetTypeFromIndex(GetIndexFromGlobalIndex(global_index)); + } + VkSampler const *GetImmutableSamplerPtrFromBinding(const uint32_t binding) const { + return layout_id_->GetImmutableSamplerPtrFromBinding(binding); + } + VkSampler const *GetImmutableSamplerPtrFromIndex(const uint32_t index) const { + return layout_id_->GetImmutableSamplerPtrFromIndex(index); + } + // For a given binding and array index, return the corresponding index into the dynamic offset array + int32_t GetDynamicOffsetIndexFromBinding(uint32_t binding) const { + return layout_id_->GetDynamicOffsetIndexFromBinding(binding); + } + // For a particular binding, get the global index range + // This call should be guarded by a call to "HasBinding(binding)" to verify that the given binding exists + const IndexRange &GetGlobalIndexRangeFromBinding(const uint32_t binding) const { + return layout_id_->GetGlobalIndexRangeFromBinding(binding); + } + // Helper function to get the next valid binding for a descriptor + uint32_t GetNextValidBinding(const uint32_t binding) const { return layout_id_->GetNextValidBinding(binding); } + // 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(uint32_t current_binding, uint32_t offset, uint32_t update_count, const char *type, + const VkDescriptorSet set, std::string *error_msg) const { + return layout_id_->VerifyUpdateConsistency(current_binding, offset, update_count, type, set, error_msg); + } + bool IsPushDescriptor() const { return layout_id_->IsPushDescriptor(); } + + using BindingTypeStats = DescriptorSetLayoutDef::BindingTypeStats; + const BindingTypeStats &GetBindingTypeStats() const { return layout_id_->GetBindingTypeStats(); } + + private: + VkDescriptorSetLayout layout_; + bool layout_destroyed_; + DescriptorSetLayoutId layout_id_; +}; + /* * Descriptor classes * Descriptor is an abstract base class from which 5 separate descriptor types are derived. @@ -338,7 +447,7 @@ class DescriptorSet : public BASE_NODE { public: DescriptorSet(const VkDescriptorSet, const VkDescriptorPool, const std::shared_ptr &, - core_validation::layer_data *); + uint32_t variable_count, core_validation::layer_data *); ~DescriptorSet(); // A number of common Get* functions that return data based on layout from which this set was created uint32_t GetTotalDescriptorCount() const { return p_layout_->GetTotalDescriptorCount(); }; @@ -379,7 +488,7 @@ // Perform a CopyUpdate whose contents were just validated using ValidateCopyUpdate void PerformCopyUpdate(const VkCopyDescriptorSet *, const DescriptorSet *); - std::shared_ptr const GetLayout() const { return p_layout_; }; + const std::shared_ptr GetLayout() const { return p_layout_; }; VkDescriptorSet GetSet() const { return set_; }; // Return unordered_set of all command buffers that this set is bound to std::unordered_set GetBoundCmdBuffers() const { return cb_bindings; } @@ -412,6 +521,12 @@ // Return true if any part of set has ever been updated bool IsUpdated() const { return some_update_; }; bool IsPushDescriptor() const { return p_layout_->IsPushDescriptor(); }; + bool IsVariableDescriptorCount(uint32_t binding) const { + return !!(p_layout_->GetDescriptorBindingFlagsFromBinding(binding) & + VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT); + } + uint32_t GetVariableDescriptorCount() const { return variable_count_; } + DESCRIPTOR_POOL_STATE *GetPoolState() const { return pool_state_; } private: bool VerifyWriteUpdateContents(const VkWriteDescriptorSet *, const uint32_t, UNIQUE_VALIDATION_ERROR_CODE *, @@ -431,6 +546,7 @@ // Ptr to device data used for various data look-ups core_validation::layer_data *const device_data_; const VkPhysicalDeviceLimits limits_; + uint32_t variable_count_; // Cached binding and validation support: // diff -Nru vulkan-1.1.70+dfsg1/layers/hash_util.h vulkan-1.1.73+dfsg/layers/hash_util.h --- vulkan-1.1.70+dfsg1/layers/hash_util.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/hash_util.h 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,164 @@ +/* Copyright (c) 2015-2016 The Khronos Group Inc. + * Copyright (c) 2015-2016 Valve Corporation + * Copyright (c) 2015-2016 LunarG, Inc. + * Copyright (C) 2015-2016 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 + */ +#ifndef HASH_UTIL_H_ +#define HASH_UTIL_H_ + +#define NOMINMAX +#include +#include +#include +#include +#include +#include +#include +#include + +// Hash and equality utilities for supporting hashing containers (e.g. unordered_set, unordered_map) +namespace hash_util { + +// True iff both pointers are null or both are non-null +template +bool similar_for_nullity(const T *const lhs, const T *const rhs) { + return ((lhs != nullptr) && (rhs != nullptr)) || ((lhs == nullptr) && (rhs == nullptr)); +} + +// Wrap std hash to avoid manual casts for the holes in std::hash (in C++11) +template +size_t HashWithUnderlying(Value value, typename std::enable_if::value, void *>::type = nullptr) { + return std::hash()(value); +} + +template +size_t HashWithUnderlying(Value value, typename std::enable_if::value, void *>::type = nullptr) { + using Underlying = typename std::underlying_type::type; + return std::hash()(static_cast(value)); +} + +class HashCombiner { + public: + using Key = size_t; + + template + struct WrappedHash { + size_t operator()(const Value &value) const { return HashWithUnderlying(value); } + }; + + HashCombiner(Key combined = 0) : combined_(combined) {} + // magic and combination algorithm based on boost::hash_combine + // http://www.boost.org/doc/libs/1_43_0/doc/html/hash/reference.html#boost.hash_combine + // Magic value is 2^size / ((1-sqrt(5)/2) + static const uint64_t kMagic = sizeof(Key) > 4 ? Key(0x9e3779b97f4a7c16UL) : Key(0x9e3779b9U); + + // If you need to override the default hash + template > + HashCombiner &Combine(const Value &value) { + combined_ ^= Hasher()(value) + kMagic + (combined_ << 6) + (combined_ >> 2); + return *this; + } + + template ::value_type>> + HashCombiner &Combine(Iterator first, Iterator end) { + using Value = typename std::iterator_traits::value_type; + auto current = first; + for (; current != end; ++current) { + Combine(*current); + } + return *this; + } + + template > + HashCombiner &Combine(const std::vector &vector) { + return Combine(vector.cbegin(), vector.cend()); + } + + template + HashCombiner &operator<<(const Value &value) { + return Combine(value); + } + + Key Value() const { return combined_; } + void Reset(Key combined = 0) { combined_ = combined; } + + private: + Key combined_; +}; + +// A template to inherit std::hash overloads from when T::hash() is defined +template +struct HasHashMember { + size_t operator()(const T &value) const { return value.hash(); } +}; + +// A template to inherit std::hash overloads from when is an *ordered* constainer +template +struct IsOrderedContainer { + size_t operator()(const T &value) const { return HashCombiner().Combine(value.cbegin(), value.cend()).Value(); } +}; + +// The dictionary provides a way of referencing canonical/reference +// data by id, such that the id's are invariant with dictionary +// resize/insert and that no entries point to identical data. This +// approach uses the address of the unique data and as the unique +// ID for a give value of T. +// +// Note: This ID is unique for a given application execution, neither +// globally unique, invariant, nor repeatable from execution to +// execution. +// +// The entries of the dictionary are shared_pointers (the contents of +// which are invariant with resize/insert), with the hash and equality +// template arguments wrapped in a shared pointer dereferencing +// function object +template , typename KeyEqual = std::equal_to> +class Dictionary { + public: + using Def = T; + using Id = std::shared_ptr; + + // Find the unique entry match the provided value, adding if needed + // TODO: segregate lookup from insert, using reader/write locks to reduce contention -- if needed + template + Id look_up(U &&value) { + // We create an Id from the value, which will either be retained by dict (if new) or deleted on return (if extant) + Id from_input = std::make_shared(std::forward(value)); + + // Insert takes care of the "unique" id part by rejecting the insert if a key matching by_value exists, but returning us + // the Id of the extant shared_pointer(id->def) instead. + // return the value of the Iterator from the pair returned by insert + Guard g(lock); // Dict isn't thread safe, and use is presumed to be multi-threaded + return *dict.insert(from_input).first; + } + + private: + struct HashKeyValue { + size_t operator()(const Id &value) const { return Hasher()(*value); } + }; + struct KeyValueEqual { + bool operator()(const Id &lhs, const Id &rhs) const { return KeyEqual()(*lhs, *rhs); } + }; + using Dict = std::unordered_set; + using Lock = std::mutex; + using Guard = std::lock_guard; + Lock lock; + Dict dict; +}; +} // namespace hash_util + +#endif // HASH_UTILS_H_ diff -Nru vulkan-1.1.70+dfsg1/layers/hash_vk_types.h vulkan-1.1.73+dfsg/layers/hash_vk_types.h --- vulkan-1.1.70+dfsg1/layers/hash_vk_types.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/hash_vk_types.h 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,86 @@ +/* Copyright (c) 2018 The Khronos Group Inc. + * Copyright (c) 2018 Valve Corporation + * Copyright (c) 2018 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 + */ +#ifndef HASH_VK_TYPES_H_ +#define HASH_VK_TYPES_H_ + +// Includes everything needed for overloading std::hash +#include "hash_util.h" + +#include +#include "vk_safe_struct.h" +#include + +// Hash and equality and/or compare functions for selected Vk types (and useful collections thereof) + +// VkDescriptorSetLayoutBinding +static bool operator==(const safe_VkDescriptorSetLayoutBinding &lhs, const safe_VkDescriptorSetLayoutBinding &rhs) { + if ((lhs.binding != rhs.binding) || (lhs.descriptorType != rhs.descriptorType) || + (lhs.descriptorCount != rhs.descriptorCount) || (lhs.stageFlags != rhs.stageFlags) || + !hash_util::similar_for_nullity(lhs.pImmutableSamplers, rhs.pImmutableSamplers)) { + return false; + } + if (lhs.pImmutableSamplers) { // either one will do as they *are* similar for nullity (i.e. either both null or both non-null) + for (uint32_t samp = 0; samp < lhs.descriptorCount; samp++) { + if (lhs.pImmutableSamplers[samp] != rhs.pImmutableSamplers[samp]) { + return false; + } + } + } + return true; +} + +namespace std { +template <> +struct hash { + size_t operator()(const safe_VkDescriptorSetLayoutBinding &value) const { + hash_util::HashCombiner hc; + hc << value.binding << value.descriptorType << value.descriptorCount << value.stageFlags; + if (value.pImmutableSamplers) { + for (uint32_t samp = 0; samp < value.descriptorCount; samp++) { + hc << value.pImmutableSamplers[samp]; + } + } + return hc.Value(); + } +}; +} // namespace std + +// VkPushConstantRange +static bool operator==(const VkPushConstantRange &lhs, const VkPushConstantRange &rhs) { + return (lhs.stageFlags == rhs.stageFlags) && (lhs.offset == rhs.offset) && (lhs.size == rhs.size); +} + +namespace std { +template <> +struct hash { + size_t operator()(const VkPushConstantRange &value) const { + hash_util::HashCombiner hc; + return (hc << value.stageFlags << value.offset << value.size).Value(); + } +}; +} // namespace std + +using PushConstantRanges = std::vector; + +namespace std { +template <> +struct hash : public hash_util::IsOrderedContainer {}; +} // namespace std + +#endif // HASH_VK_TYPES_H_ diff -Nru vulkan-1.1.70+dfsg1/layers/linux/VkLayer_core_validation.json vulkan-1.1.73+dfsg/layers/linux/VkLayer_core_validation.json --- vulkan-1.1.70+dfsg1/layers/linux/VkLayer_core_validation.json 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/linux/VkLayer_core_validation.json 2018-04-27 11:24:19.000000000 +0000 @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_core_validation", "type": "GLOBAL", "library_path": "./libVkLayer_core_validation.so", - "api_version": "1.1.70", + "api_version": "1.1.73", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff -Nru vulkan-1.1.70+dfsg1/layers/linux/VkLayer_object_tracker.json vulkan-1.1.73+dfsg/layers/linux/VkLayer_object_tracker.json --- vulkan-1.1.70+dfsg1/layers/linux/VkLayer_object_tracker.json 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/linux/VkLayer_object_tracker.json 2018-04-27 11:24:19.000000000 +0000 @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_object_tracker", "type": "GLOBAL", "library_path": "./libVkLayer_object_tracker.so", - "api_version": "1.1.70", + "api_version": "1.1.73", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff -Nru vulkan-1.1.70+dfsg1/layers/linux/VkLayer_parameter_validation.json vulkan-1.1.73+dfsg/layers/linux/VkLayer_parameter_validation.json --- vulkan-1.1.70+dfsg1/layers/linux/VkLayer_parameter_validation.json 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/linux/VkLayer_parameter_validation.json 2018-04-27 11:24:19.000000000 +0000 @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_parameter_validation", "type": "GLOBAL", "library_path": "./libVkLayer_parameter_validation.so", - "api_version": "1.1.70", + "api_version": "1.1.73", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff -Nru vulkan-1.1.70+dfsg1/layers/linux/VkLayer_standard_validation.json vulkan-1.1.73+dfsg/layers/linux/VkLayer_standard_validation.json --- vulkan-1.1.70+dfsg1/layers/linux/VkLayer_standard_validation.json 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/linux/VkLayer_standard_validation.json 2018-04-27 11:24:19.000000000 +0000 @@ -3,7 +3,7 @@ "layer": { "name": "VK_LAYER_LUNARG_standard_validation", "type": "GLOBAL", - "api_version": "1.1.70", + "api_version": "1.1.73", "implementation_version": "1", "description": "LunarG Standard Validation", "component_layers": [ diff -Nru vulkan-1.1.70+dfsg1/layers/linux/VkLayer_threading.json vulkan-1.1.73+dfsg/layers/linux/VkLayer_threading.json --- vulkan-1.1.70+dfsg1/layers/linux/VkLayer_threading.json 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/linux/VkLayer_threading.json 2018-04-27 11:24:19.000000000 +0000 @@ -4,7 +4,7 @@ "name": "VK_LAYER_GOOGLE_threading", "type": "GLOBAL", "library_path": "./libVkLayer_threading.so", - "api_version": "1.1.70", + "api_version": "1.1.73", "implementation_version": "1", "description": "Google Validation Layer", "instance_extensions": [ diff -Nru vulkan-1.1.70+dfsg1/layers/linux/VkLayer_unique_objects.json vulkan-1.1.73+dfsg/layers/linux/VkLayer_unique_objects.json --- vulkan-1.1.70+dfsg1/layers/linux/VkLayer_unique_objects.json 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/linux/VkLayer_unique_objects.json 2018-04-27 11:24:19.000000000 +0000 @@ -4,7 +4,7 @@ "name": "VK_LAYER_GOOGLE_unique_objects", "type": "GLOBAL", "library_path": "./libVkLayer_unique_objects.so", - "api_version": "1.1.70", + "api_version": "1.1.73", "implementation_version": "1", "description": "Google Validation Layer" } diff -Nru vulkan-1.1.70+dfsg1/layers/macos/VkLayer_core_validation.json vulkan-1.1.73+dfsg/layers/macos/VkLayer_core_validation.json --- vulkan-1.1.70+dfsg1/layers/macos/VkLayer_core_validation.json 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/macos/VkLayer_core_validation.json 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,29 @@ +{ + "file_format_version" : "1.1.0", + "layer" : { + "name": "VK_LAYER_LUNARG_core_validation", + "type": "GLOBAL", + "library_path": "./libVkLayer_core_validation.dylib", + "api_version": "1.0.69", + "implementation_version": "1", + "description": "LunarG Validation Layer", + "instance_extensions": [ + { + "name": "VK_EXT_debug_report", + "spec_version": "6" + } + ], + "device_extensions": [ + { + "name": "VK_EXT_debug_marker", + "spec_version": "4", + "entrypoints": ["vkDebugMarkerSetObjectTagEXT", + "vkDebugMarkerSetObjectNameEXT", + "vkCmdDebugMarkerBeginEXT", + "vkCmdDebugMarkerEndEXT", + "vkCmdDebugMarkerInsertEXT" + ] + } + ] + } +} diff -Nru vulkan-1.1.70+dfsg1/layers/macos/VkLayer_device_simulation.json vulkan-1.1.73+dfsg/layers/macos/VkLayer_device_simulation.json --- vulkan-1.1.70+dfsg1/layers/macos/VkLayer_device_simulation.json 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/macos/VkLayer_device_simulation.json 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,11 @@ +{ + "file_format_version" : "1.1.0", + "layer" : { + "name": "VK_LAYER_LUNARG_device_simulation", + "type": "GLOBAL", + "library_path": "./libVkLayer_device_simulation.dylib", + "api_version": "1.0.69", + "implementation_version": "1.2.0", + "description": "LunarG device simulation layer" + } +} diff -Nru vulkan-1.1.70+dfsg1/layers/macos/VkLayer_object_tracker.json vulkan-1.1.73+dfsg/layers/macos/VkLayer_object_tracker.json --- vulkan-1.1.70+dfsg1/layers/macos/VkLayer_object_tracker.json 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/macos/VkLayer_object_tracker.json 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,29 @@ +{ + "file_format_version" : "1.1.0", + "layer" : { + "name": "VK_LAYER_LUNARG_object_tracker", + "type": "GLOBAL", + "library_path": "./libVkLayer_object_tracker.dylib", + "api_version": "1.0.69", + "implementation_version": "1", + "description": "LunarG Validation Layer", + "instance_extensions": [ + { + "name": "VK_EXT_debug_report", + "spec_version": "6" + } + ], + "device_extensions": [ + { + "name": "VK_EXT_debug_marker", + "spec_version": "4", + "entrypoints": ["vkDebugMarkerSetObjectTagEXT", + "vkDebugMarkerSetObjectNameEXT", + "vkCmdDebugMarkerBeginEXT", + "vkCmdDebugMarkerEndEXT", + "vkCmdDebugMarkerInsertEXT" + ] + } + ] + } +} diff -Nru vulkan-1.1.70+dfsg1/layers/macos/VkLayer_parameter_validation.json vulkan-1.1.73+dfsg/layers/macos/VkLayer_parameter_validation.json --- vulkan-1.1.70+dfsg1/layers/macos/VkLayer_parameter_validation.json 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/macos/VkLayer_parameter_validation.json 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,29 @@ +{ + "file_format_version" : "1.1.0", + "layer" : { + "name": "VK_LAYER_LUNARG_parameter_validation", + "type": "GLOBAL", + "library_path": "./libVkLayer_parameter_validation.dylib", + "api_version": "1.0.69", + "implementation_version": "1", + "description": "LunarG Validation Layer", + "instance_extensions": [ + { + "name": "VK_EXT_debug_report", + "spec_version": "6" + } + ], + "device_extensions": [ + { + "name": "VK_EXT_debug_marker", + "spec_version": "4", + "entrypoints": ["vkDebugMarkerSetObjectTagEXT", + "vkDebugMarkerSetObjectNameEXT", + "vkCmdDebugMarkerBeginEXT", + "vkCmdDebugMarkerEndEXT", + "vkCmdDebugMarkerInsertEXT" + ] + } + ] + } +} diff -Nru vulkan-1.1.70+dfsg1/layers/macos/VkLayer_standard_validation.json vulkan-1.1.73+dfsg/layers/macos/VkLayer_standard_validation.json --- vulkan-1.1.70+dfsg1/layers/macos/VkLayer_standard_validation.json 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/macos/VkLayer_standard_validation.json 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,17 @@ +{ + "file_format_version": "1.1.1", + "layer": { + "name": "VK_LAYER_LUNARG_standard_validation", + "type": "GLOBAL", + "api_version": "1.0.69", + "implementation_version": "1", + "description": "LunarG Standard Validation", + "component_layers": [ + "VK_LAYER_GOOGLE_threading", + "VK_LAYER_LUNARG_parameter_validation", + "VK_LAYER_LUNARG_object_tracker", + "VK_LAYER_LUNARG_core_validation", + "VK_LAYER_GOOGLE_unique_objects" + ] + } +} diff -Nru vulkan-1.1.70+dfsg1/layers/macos/VkLayer_threading.json vulkan-1.1.73+dfsg/layers/macos/VkLayer_threading.json --- vulkan-1.1.70+dfsg1/layers/macos/VkLayer_threading.json 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/macos/VkLayer_threading.json 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,17 @@ +{ + "file_format_version" : "1.1.0", + "layer" : { + "name": "VK_LAYER_GOOGLE_threading", + "type": "GLOBAL", + "library_path": "./libVkLayer_threading.dylib", + "api_version": "1.0.69", + "implementation_version": "1", + "description": "Google Validation Layer", + "instance_extensions": [ + { + "name": "VK_EXT_debug_report", + "spec_version": "6" + } + ] + } +} diff -Nru vulkan-1.1.70+dfsg1/layers/macos/VkLayer_unique_objects.json vulkan-1.1.73+dfsg/layers/macos/VkLayer_unique_objects.json --- vulkan-1.1.70+dfsg1/layers/macos/VkLayer_unique_objects.json 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/macos/VkLayer_unique_objects.json 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,11 @@ +{ + "file_format_version" : "1.1.0", + "layer" : { + "name": "VK_LAYER_GOOGLE_unique_objects", + "type": "GLOBAL", + "library_path": "./libVkLayer_unique_objects.dylib", + "api_version": "1.0.69", + "implementation_version": "1", + "description": "Google Validation Layer" + } +} diff -Nru vulkan-1.1.70+dfsg1/layers/object_tracker.h vulkan-1.1.73+dfsg/layers/object_tracker.h --- vulkan-1.1.70+dfsg1/layers/object_tracker.h 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/object_tracker.h 2018-04-27 11:24:19.000000000 +0000 @@ -81,9 +81,6 @@ VkQueue queue; }; -// Layer name string to be logged with validation messages. -const char LayerName[] = "ObjectTracker"; - typedef std::unordered_map object_map_type; struct layer_data { @@ -143,6 +140,7 @@ extern const std::unordered_map name_to_funcptr_map; void DeviceReportUndestroyedObjects(VkDevice device, VulkanObjectType object_type, enum UNIQUE_VALIDATION_ERROR_CODE error_code); +void DeviceDestroyUndestroyedObjects(VkDevice device, VulkanObjectType object_type); void CreateQueue(VkDevice device, VkQueue vkObj); void AddQueueInfo(VkDevice device, uint32_t queue_node_index, VkQueue queue); void ValidateQueueFlags(VkQueue queue, const char *function); @@ -151,6 +149,7 @@ void AllocateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set); void CreateSwapchainImageObject(VkDevice dispatchable_object, VkImage swapchain_image, VkSwapchainKHR swapchain); void ReportUndestroyedObjects(VkDevice device, UNIQUE_VALIDATION_ERROR_CODE error_code); +void DestroyUndestroyedObjects(VkDevice device); bool ValidateDeviceObject(uint64_t device_handle, enum UNIQUE_VALIDATION_ERROR_CODE invalid_handle_code, enum UNIQUE_VALIDATION_ERROR_CODE wrong_device_code); @@ -184,10 +183,10 @@ // Object found on other device, report an error if object has a device parent error code if ((wrong_device_code != VALIDATION_ERROR_UNDEFINED) && (object_type != kVulkanObjectTypeSurfaceKHR)) { return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, debug_object_type, - object_handle, __LINE__, wrong_device_code, LayerName, + object_handle, wrong_device_code, "Object 0x%" PRIxLEAST64 - " was not created, allocated or retrieved from the correct device. %s", - object_handle, validation_error_map[wrong_device_code]); + " was not created, allocated or retrieved from the correct device.", + object_handle); } else { return false; } @@ -195,9 +194,8 @@ } } // Report an error if object was not found anywhere - return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, debug_object_type, object_handle, __LINE__, - invalid_handle_code, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s", object_string[object_type], - object_handle, validation_error_map[invalid_handle_code]); + return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, debug_object_type, object_handle, + invalid_handle_code, "Invalid %s Object 0x%" PRIxLEAST64 ".", object_string[object_type], object_handle); } } return false; @@ -212,9 +210,9 @@ if (!instance_data->object_map[object_type].count(object_handle)) { VkDebugReportObjectTypeEXT debug_object_type = get_debug_report_enum[object_type]; - log_msg(instance_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, debug_object_type, object_handle, __LINE__, - OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, - object_string[object_type], object_handle); + log_msg(instance_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, debug_object_type, object_handle, OBJTRACK_NONE, + "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, object_string[object_type], + object_handle); ObjTrackState *pNewObjNode = new ObjTrackState; pNewObjNode->object_type = object_type; @@ -228,6 +226,28 @@ } template +void DestroyObjectSilently(T1 dispatchable_object, T2 object, VulkanObjectType object_type) { + layer_data *device_data = GetLayerDataPtr(get_dispatch_key(dispatchable_object), layer_data_map); + + auto object_handle = HandleToUint64(object); + assert(object_handle != VK_NULL_HANDLE); + + auto item = device_data->object_map[object_type].find(object_handle); + assert(item != device_data->object_map[object_type].end()); + + ObjTrackState *pNode = item->second; + assert(device_data->num_total_objects > 0); + + device_data->num_total_objects--; + assert(device_data->num_objects[pNode->object_type] > 0); + + device_data->num_objects[pNode->object_type]--; + + delete pNode; + device_data->object_map[object_type].erase(item); +} + +template void DestroyObject(T1 dispatchable_object, T2 object, VulkanObjectType object_type, const VkAllocationCallbacks *pAllocator, enum UNIQUE_VALIDATION_ERROR_CODE expected_custom_allocator_code, enum UNIQUE_VALIDATION_ERROR_CODE expected_default_allocator_code) { @@ -241,38 +261,32 @@ auto item = device_data->object_map[object_type].find(object_handle); if (item != device_data->object_map[object_type].end()) { ObjTrackState *pNode = item->second; - assert(device_data->num_total_objects > 0); - device_data->num_total_objects--; - assert(device_data->num_objects[pNode->object_type] > 0); - device_data->num_objects[pNode->object_type]--; - log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, debug_object_type, object_handle, __LINE__, - OBJTRACK_NONE, LayerName, + log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, debug_object_type, object_handle, OBJTRACK_NONE, "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " %s objs).", - object_string[object_type], HandleToUint64(object), device_data->num_total_objects, - device_data->num_objects[pNode->object_type], object_string[object_type]); + object_string[object_type], HandleToUint64(object), device_data->num_total_objects - 1, + device_data->num_objects[pNode->object_type] - 1, object_string[object_type]); auto allocated_with_custom = (pNode->status & OBJSTATUS_CUSTOM_ALLOCATOR) ? true : false; if (allocated_with_custom && !custom_allocator && expected_custom_allocator_code != VALIDATION_ERROR_UNDEFINED) { // This check only verifies that custom allocation callbacks were provided to both Create and Destroy calls, // it cannot verify that these allocation callbacks are compatible with each other. - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, debug_object_type, object_handle, __LINE__, - expected_custom_allocator_code, LayerName, - "Custom allocator not specified while destroying %s obj 0x%" PRIxLEAST64 " but specified at creation. %s", - object_string[object_type], object_handle, validation_error_map[expected_custom_allocator_code]); + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, debug_object_type, object_handle, + expected_custom_allocator_code, + "Custom allocator not specified while destroying %s obj 0x%" PRIxLEAST64 " but specified at creation.", + object_string[object_type], object_handle); } else if (!allocated_with_custom && custom_allocator && expected_default_allocator_code != VALIDATION_ERROR_UNDEFINED) { - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, debug_object_type, object_handle, __LINE__, - expected_default_allocator_code, LayerName, - "Custom allocator specified while destroying %s obj 0x%" PRIxLEAST64 " but not specified at creation. %s", - object_string[object_type], object_handle, validation_error_map[expected_default_allocator_code]); + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, debug_object_type, object_handle, + expected_default_allocator_code, + "Custom allocator specified while destroying %s obj 0x%" PRIxLEAST64 " but not specified at creation.", + object_string[object_type], object_handle); } - delete pNode; - device_data->object_map[object_type].erase(item); + DestroyObjectSilently(dispatchable_object, object, object_type); } else { log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, object_handle, - __LINE__, OBJTRACK_UNKNOWN_OBJECT, LayerName, + OBJTRACK_UNKNOWN_OBJECT, "Unable to remove %s obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?", object_string[object_type], object_handle); } diff -Nru vulkan-1.1.70+dfsg1/layers/object_tracker_layer.md vulkan-1.1.73+dfsg/layers/object_tracker_layer.md --- vulkan-1.1.70+dfsg1/layers/object_tracker_layer.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/object_tracker_layer.md 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,12 @@ +# VK\_LAYER\_LUNARG\_object\_tracker +The `VK_LAYER_LUNARG_object_tracker` layer tracks all Vulkan objects. Object lifetimes are validated along with issues related to unknown objects and object destruction and cleanup. + +All Vulkan dispatchable and non-dispatchable objects are tracked by the `VK_LAYER_LUNARG_object_tracker` layer. + +This layer validates that: + + - only known objects are referenced and destroyed + - lookups are performed only on objects being tracked + - objects are correctly freed/destroyed. + +The `VK_LAYER_LUNARG_object_tracker` layer will print errors if validation checks are not correctly met and warnings if improper reference of objects is detected. diff -Nru vulkan-1.1.70+dfsg1/layers/object_tracker_utils.cpp vulkan-1.1.73+dfsg/layers/object_tracker_utils.cpp --- vulkan-1.1.70+dfsg1/layers/object_tracker_utils.cpp 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/object_tracker_utils.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -49,7 +49,7 @@ device_data->queue_info_map[queue] = p_queue_info; } else { log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, - HandleToUint64(queue), __LINE__, OBJTRACK_INTERNAL_ERROR, LayerName, + HandleToUint64(queue), OBJTRACK_INTERNAL_ERROR, "ERROR: VK_ERROR_OUT_OF_HOST_MEMORY -- could not allocate memory for Queue Information"); } } @@ -73,7 +73,7 @@ assert(device_data->num_objects[obj_index] > 0); device_data->num_objects[obj_index]--; log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, - queue->second->handle, __LINE__, OBJTRACK_NONE, LayerName, + queue->second->handle, OBJTRACK_NONE, "OBJ_STAT Destroy Queue obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " Queue objs).", queue->second->handle, device_data->num_total_objects, device_data->num_objects[obj_index]); delete queue->second; @@ -92,9 +92,8 @@ if ((instance_data->queue_family_properties[pQueueInfo->queue_node_index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) == 0) { log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, - HandleToUint64(queue), __LINE__, VALIDATION_ERROR_31600011, LayerName, - "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_SPARSE_BINDING_BIT not set. %s", - function, validation_error_map[VALIDATION_ERROR_31600011]); + HandleToUint64(queue), VALIDATION_ERROR_31600011, + "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_SPARSE_BINDING_BIT not set.", function); } } } @@ -116,8 +115,7 @@ layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(last_instance), layer_data_map); return log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, device_handle, - __LINE__, invalid_handle_code, LayerName, "Invalid Device Object 0x%" PRIxLEAST64 ". %s", device_handle, - validation_error_map[invalid_handle_code]); + invalid_handle_code, "Invalid Device Object 0x%" PRIxLEAST64 ".", device_handle); } void AllocateCommandBuffer(VkDevice device, const VkCommandPool command_pool, const VkCommandBuffer command_buffer, @@ -125,9 +123,8 @@ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(command_buffer), __LINE__, OBJTRACK_NONE, LayerName, - "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, - "VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT", HandleToUint64(command_buffer)); + HandleToUint64(command_buffer), OBJTRACK_NONE, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, + object_track_index++, "VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT", HandleToUint64(command_buffer)); ObjTrackState *pNewObjNode = new ObjTrackState; pNewObjNode->object_type = kVulkanObjectTypeCommandBuffer; @@ -153,17 +150,15 @@ if (pNode->parent_object != HandleToUint64(command_pool)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - object_handle, __LINE__, VALIDATION_ERROR_28411407, LayerName, + object_handle, VALIDATION_ERROR_28411407, "FreeCommandBuffers is attempting to free Command Buffer 0x%" PRIxLEAST64 - " belonging to Command Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 "). %s", - HandleToUint64(command_buffer), pNode->parent_object, HandleToUint64(command_pool), - validation_error_map[VALIDATION_ERROR_28411407]); + " belonging to Command Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 ").", + HandleToUint64(command_buffer), pNode->parent_object, HandleToUint64(command_pool)); } } else { - skip |= - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - object_handle, __LINE__, VALIDATION_ERROR_28400060, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s", - object_string[kVulkanObjectTypeCommandBuffer], object_handle, validation_error_map[VALIDATION_ERROR_28400060]); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + object_handle, VALIDATION_ERROR_28400060, "Invalid %s Object 0x%" PRIxLEAST64 ".", + object_string[kVulkanObjectTypeCommandBuffer], object_handle); } return skip; } @@ -172,9 +167,8 @@ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - HandleToUint64(descriptor_set), __LINE__, OBJTRACK_NONE, LayerName, - "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, - "VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT", HandleToUint64(descriptor_set)); + HandleToUint64(descriptor_set), OBJTRACK_NONE, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, + object_track_index++, "VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT", HandleToUint64(descriptor_set)); ObjTrackState *pNewObjNode = new ObjTrackState; pNewObjNode->object_type = kVulkanObjectTypeDescriptorSet; @@ -196,17 +190,15 @@ if (pNode->parent_object != HandleToUint64(descriptor_pool)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - object_handle, __LINE__, VALIDATION_ERROR_28613007, LayerName, + object_handle, VALIDATION_ERROR_28613007, "FreeDescriptorSets is attempting to free descriptorSet 0x%" PRIxLEAST64 - " belonging to Descriptor Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 "). %s", - HandleToUint64(descriptor_set), pNode->parent_object, HandleToUint64(descriptor_pool), - validation_error_map[VALIDATION_ERROR_28613007]); + " belonging to Descriptor Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 ").", + HandleToUint64(descriptor_set), pNode->parent_object, HandleToUint64(descriptor_pool)); } } else { - skip |= - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - object_handle, __LINE__, VALIDATION_ERROR_2860026c, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s", - object_string[kVulkanObjectTypeDescriptorSet], object_handle, validation_error_map[VALIDATION_ERROR_2860026c]); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + object_handle, VALIDATION_ERROR_2860026c, "Invalid %s Object 0x%" PRIxLEAST64 ".", + object_string[kVulkanObjectTypeDescriptorSet], object_handle); } return skip; } @@ -277,7 +269,7 @@ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, - HandleToUint64(vkObj), __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, + HandleToUint64(vkObj), OBJTRACK_NONE, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, "VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT", HandleToUint64(vkObj)); ObjTrackState *p_obj_node = NULL; @@ -298,9 +290,8 @@ void CreateSwapchainImageObject(VkDevice dispatchable_object, VkImage swapchain_image, VkSwapchainKHR swapchain) { layer_data *device_data = GetLayerDataPtr(get_dispatch_key(dispatchable_object), layer_data_map); log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - HandleToUint64(swapchain_image), __LINE__, OBJTRACK_NONE, LayerName, - "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, "SwapchainImage", - HandleToUint64(swapchain_image)); + HandleToUint64(swapchain_image), OBJTRACK_NONE, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, + object_track_index++, "SwapchainImage", HandleToUint64(swapchain_image)); ObjTrackState *pNewObjNode = new ObjTrackState; pNewObjNode->object_type = kVulkanObjectTypeImage; @@ -312,13 +303,21 @@ void DeviceReportUndestroyedObjects(VkDevice device, VulkanObjectType object_type, enum UNIQUE_VALIDATION_ERROR_CODE error_code) { layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); - for (auto item = device_data->object_map[object_type].begin(); item != device_data->object_map[object_type].end();) { - ObjTrackState *object_info = item->second; + for (const auto &item : device_data->object_map[object_type]) { + const ObjTrackState *object_info = item.second; log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, get_debug_report_enum[object_type], object_info->handle, - __LINE__, error_code, LayerName, - "OBJ ERROR : For device 0x%" PRIxLEAST64 ", %s object 0x%" PRIxLEAST64 " has not been destroyed. %s", - HandleToUint64(device), object_string[object_type], object_info->handle, validation_error_map[error_code]); - item = device_data->object_map[object_type].erase(item); + error_code, "OBJ ERROR : For device 0x%" PRIxLEAST64 ", %s object 0x%" PRIxLEAST64 " has not been destroyed.", + HandleToUint64(device), object_string[object_type], object_info->handle); + } +} + +void DeviceDestroyUndestroyedObjects(VkDevice device, VulkanObjectType object_type) { + layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); + while (!device_data->object_map[object_type].empty()) { + auto item = device_data->object_map[object_type].begin(); + + ObjTrackState *object_info = item->second; + DestroyObjectSilently(device, object_info->handle, object_type); } } @@ -360,12 +359,13 @@ VkDevice device = reinterpret_cast(pNode->handle); VkDebugReportObjectTypeEXT debug_object_type = get_debug_report_enum[pNode->object_type]; - log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, debug_object_type, pNode->handle, __LINE__, - OBJTRACK_OBJECT_LEAK, LayerName, "OBJ ERROR : %s object 0x%" PRIxLEAST64 " has not been destroyed.", + log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, debug_object_type, pNode->handle, OBJTRACK_OBJECT_LEAK, + "OBJ ERROR : %s object 0x%" PRIxLEAST64 " has not been destroyed.", string_VkDebugReportObjectTypeEXT(debug_object_type), pNode->handle); // Report any remaining objects in LL ReportUndestroyedObjects(device, VALIDATION_ERROR_258004ea); + DestroyUndestroyedObjects(device); DestroyObject(instance, device, kVulkanObjectTypeDevice, pAllocator, VALIDATION_ERROR_258004ec, VALIDATION_ERROR_258004ee); iit = instance_data->object_map[kVulkanObjectTypeDevice].begin(); @@ -402,6 +402,8 @@ instance_data->logging_callback.pop_back(); } + DestroyObject(instance, instance, kVulkanObjectTypeInstance, pAllocator, VALIDATION_ERROR_258004ec, VALIDATION_ERROR_258004ee); + layer_debug_utils_destroy_instance(instance_data->report_data); FreeLayerDataPtr(key, layer_data_map); @@ -419,6 +421,7 @@ // Report any remaining objects associated with this VkDevice object in LL ReportUndestroyedObjects(device, VALIDATION_ERROR_24a002f4); + DestroyUndestroyedObjects(device); // Clean up Queue's MemRef Linked Lists DestroyQueueDataStructures(device); diff -Nru vulkan-1.1.70+dfsg1/layers/parameter_validation.h vulkan-1.1.73+dfsg/layers/parameter_validation.h --- vulkan-1.1.70+dfsg1/layers/parameter_validation.h 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/parameter_validation.h 2018-04-27 11:24:19.000000000 +0000 @@ -47,6 +47,7 @@ extern const VkColorComponentFlags AllVkColorComponentFlagBits; extern const VkShaderStageFlags AllVkShaderStageFlagBits; extern const VkQueryControlFlags AllVkQueryControlFlagBits; +extern const VkImageUsageFlags AllVkImageUsageFlagBits; extern const std::vector AllVkCompareOpEnums; extern const std::vector AllVkStencilOpEnums; @@ -132,9 +133,6 @@ const void *pNext; }; -// Layer name string to be logged with validation messages. -const char LayerName[] = "ParameterValidation"; - // String returned by string_VkStructureType for an unrecognized type. const std::string UnsupportedStructureTypeString = "Unhandled VkStructureType"; @@ -154,7 +152,6 @@ const debug_report_data *debug_data; VkDebugReportObjectTypeEXT objectType; uint64_t srcObject; - const char *pLayerPrefix; const char *api_name; }; @@ -177,10 +174,10 @@ if (value <= lower_bound) { std::ostringstream ss; - ss << misc.api_name << ": parameter " << parameter_name.get_name() << " (= " << value << ") is greater than " << lower_bound - << ". " << validation_error_map[vuid]; - skip_call |= log_msg(misc.debug_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, misc.objectType, misc.srcObject, __LINE__, vuid, - misc.pLayerPrefix, "%s", ss.str().c_str()); + ss << misc.api_name << ": parameter " << parameter_name.get_name() << " (= " << value << ") is greater than " + << lower_bound; + skip_call |= + log_msg(misc.debug_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, misc.objectType, misc.srcObject, vuid, "%s", ss.str().c_str()); } return skip_call; @@ -207,9 +204,8 @@ bool skip_call = false; if (value == NULL) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, vuid, - LayerName, "%s: required parameter %s specified as NULL. %s", apiName, - parameterName.get_name().c_str(), validation_error_map[vuid]); + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, vuid, + "%s: required parameter %s specified as NULL.", apiName, parameterName.get_name().c_str()); } return skip_call; @@ -232,24 +228,24 @@ * @param arrayRequired The 'array' parameter may not be NULL when true. * @return Boolean value indicating that the call should be skipped. */ -template +template bool validate_array(debug_report_data *report_data, const char *apiName, const ParameterName &countName, - const ParameterName &arrayName, T count, const void *array, bool countRequired, bool arrayRequired, + const ParameterName &arrayName, T1 count, const T2 *array, bool countRequired, bool arrayRequired, UNIQUE_VALIDATION_ERROR_CODE count_required_vuid, UNIQUE_VALIDATION_ERROR_CODE array_required_vuid) { bool skip_call = false; // Count parameters not tagged as optional cannot be 0 if (countRequired && (count == 0)) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - count_required_vuid, LayerName, "%s: parameter %s must be greater than 0. %s", apiName, - countName.get_name().c_str(), validation_error_map[count_required_vuid]); + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, count_required_vuid, + "%s: parameter %s must be greater than 0.", apiName, countName.get_name().c_str()); } // Array parameters not tagged as optional cannot be NULL, unless the count is 0 - if ((array == NULL) && arrayRequired && (count != 0)) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - array_required_vuid, LayerName, "%s: required parameter %s specified as NULL. %s", apiName, - arrayName.get_name().c_str(), validation_error_map[array_required_vuid]); + if (arrayRequired && (count != 0) && (*array == NULL)) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, array_required_vuid, + "%s: required parameter %s specified as NULL.", apiName, arrayName.get_name().c_str()); } return skip_call; @@ -275,21 +271,21 @@ * @param arrayRequired The 'array' parameter may not be NULL when true. * @return Boolean value indicating that the call should be skipped. */ -template +template bool validate_array(debug_report_data *report_data, const char *apiName, const ParameterName &countName, - const ParameterName &arrayName, const T *count, const void *array, bool countPtrRequired, + const ParameterName &arrayName, const T1 *count, const T2 *array, bool countPtrRequired, bool countValueRequired, bool arrayRequired, UNIQUE_VALIDATION_ERROR_CODE count_required_vuid, UNIQUE_VALIDATION_ERROR_CODE array_required_vuid) { bool skip_call = false; if (count == NULL) { if (countPtrRequired) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - REQUIRED_PARAMETER, LayerName, "%s: required parameter %s specified as NULL", apiName, - countName.get_name().c_str()); + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, REQUIRED_PARAMETER, + "%s: required parameter %s specified as NULL", apiName, countName.get_name().c_str()); } } else { - skip_call |= validate_array(report_data, apiName, countName, arrayName, array ? (*count) : 0, array, countValueRequired, + skip_call |= validate_array(report_data, apiName, countName, arrayName, *array ? (*count) : 0, &array, countValueRequired, arrayRequired, count_required_vuid, array_required_vuid); } @@ -320,14 +316,13 @@ if (value == NULL) { if (required) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - REQUIRED_PARAMETER, LayerName, "%s: required parameter %s specified as NULL", apiName, - parameterName.get_name().c_str()); + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, REQUIRED_PARAMETER, + "%s: required parameter %s specified as NULL", apiName, parameterName.get_name().c_str()); } } else if (value->sType != sType) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, vuid, - LayerName, "%s: parameter %s->sType must be %s. %s", apiName, parameterName.get_name().c_str(), - sTypeName, validation_error_map[vuid]); + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, vuid, + "%s: parameter %s->sType must be %s.", apiName, parameterName.get_name().c_str(), sTypeName); } return skip_call; @@ -359,14 +354,14 @@ bool skip_call = false; if ((count == 0) || (array == NULL)) { - skip_call |= validate_array(report_data, apiName, countName, arrayName, count, array, countRequired, arrayRequired, + skip_call |= validate_array(report_data, apiName, countName, arrayName, count, &array, countRequired, arrayRequired, VALIDATION_ERROR_UNDEFINED, vuid); } else { // Verify that all structs in the array have the correct type for (uint32_t i = 0; i < count; ++i) { if (array[i].sType != sType) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, INVALID_STRUCT_STYPE, LayerName, "%s: parameter %s[%d].sType must be %s", apiName, + INVALID_STRUCT_STYPE, "%s: parameter %s[%d].sType must be %s", apiName, arrayName.get_name().c_str(), i, sTypeName); } } @@ -405,9 +400,9 @@ if (count == NULL) { if (countPtrRequired) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - REQUIRED_PARAMETER, LayerName, "%s: required parameter %s specified as NULL", apiName, - countName.get_name().c_str()); + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, REQUIRED_PARAMETER, + "%s: required parameter %s specified as NULL", apiName, countName.get_name().c_str()); } } else { skip_call |= validate_struct_type_array(report_data, apiName, countName, arrayName, sTypeName, (*count), array, sType, @@ -433,9 +428,9 @@ bool skip_call = false; if (value == VK_NULL_HANDLE) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - REQUIRED_PARAMETER, LayerName, "%s: required parameter %s specified as VK_NULL_HANDLE", api_name, - parameter_name.get_name().c_str()); + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, REQUIRED_PARAMETER, + "%s: required parameter %s specified as VK_NULL_HANDLE", api_name, parameter_name.get_name().c_str()); } return skip_call; @@ -470,16 +465,15 @@ bool skip_call = false; if ((count == 0) || (array == NULL)) { - skip_call |= validate_array(report_data, api_name, count_name, array_name, count, array, count_required, array_required, + skip_call |= validate_array(report_data, api_name, count_name, array_name, count, &array, count_required, array_required, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED); } else { // Verify that no handles in the array are VK_NULL_HANDLE for (uint32_t i = 0; i < count; ++i) { if (array[i] == VK_NULL_HANDLE) { - skip_call |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - REQUIRED_PARAMETER, LayerName, "%s: required parameter %s[%d] specified as VK_NULL_HANDLE", api_name, - array_name.get_name().c_str(), i); + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + REQUIRED_PARAMETER, "%s: required parameter %s[%d] specified as VK_NULL_HANDLE", api_name, + array_name.get_name().c_str(), i); } } } @@ -512,15 +506,15 @@ bool skip_call = false; if ((count == 0) || (array == NULL)) { - skip_call |= validate_array(report_data, apiName, countName, arrayName, count, array, countRequired, arrayRequired, + skip_call |= validate_array(report_data, apiName, countName, arrayName, count, &array, countRequired, arrayRequired, count_required_vuid, array_required_vuid); } else { // Verify that strings in the array are not NULL for (uint32_t i = 0; i < count; ++i) { if (array[i] == NULL) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, REQUIRED_PARAMETER, LayerName, "%s: required parameter %s[%d] specified as NULL", - apiName, arrayName.get_name().c_str(), i); + REQUIRED_PARAMETER, "%s: required parameter %s[%d] specified as NULL", apiName, + arrayName.get_name().c_str(), i); } } } @@ -541,7 +535,7 @@ * @param allowed_struct_names Names of allowed structs. * @param next Pointer to validate. * @param allowed_type_count Total number of allowed structure types. - * @param allowed_types Array of strcuture types allowed for pNext. + * @param allowed_types Array of structure types allowed for pNext. * @param header_version Version of header defining the pNext validation rules. * @return Boolean value indicating that the call should be skipped. */ @@ -562,11 +556,11 @@ // Codegen a map of vectors containing the allowable pNext types for each struct and use that here -- also simplifies parms. if (next != NULL) { if (allowed_type_count == 0) { - std::string message = "%s: value of %s must be NULL. %s "; + std::string message = "%s: value of %s must be NULL. "; message += disclaimer; - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - vuid, LayerName, message.c_str(), api_name, parameter_name.get_name().c_str(), - validation_error_map[vuid], header_version, parameter_name.get_name().c_str()); + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, vuid, + message.c_str(), api_name, parameter_name.get_name().c_str(), header_version, + parameter_name.get_name().c_str()); } else { const VkStructureType *start = allowed_types; const VkStructureType *end = allowed_types + allowed_type_count; @@ -578,8 +572,8 @@ if (cycle_check.find(current->pNext) != cycle_check.end()) { std::string message = "%s: %s chain contains a cycle -- pNext pointer " PRIx64 " is repeated."; skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, INVALID_STRUCT_PNEXT, LayerName, message.c_str(), api_name, - parameter_name.get_name().c_str(), reinterpret_cast(next)); + INVALID_STRUCT_PNEXT, message.c_str(), api_name, parameter_name.get_name().c_str(), + reinterpret_cast(next)); break; } else { cycle_check.insert(current->pNext); @@ -589,8 +583,8 @@ if (unique_stype_check.find(current->sType) != unique_stype_check.end()) { std::string message = "%s: %s chain contains duplicate structure types: %s appears multiple times."; skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, INVALID_STRUCT_PNEXT, LayerName, message.c_str(), api_name, - parameter_name.get_name().c_str(), type_name.c_str()); + INVALID_STRUCT_PNEXT, message.c_str(), api_name, parameter_name.get_name().c_str(), + type_name.c_str()); } else { unique_stype_check.insert(current->sType); } @@ -598,21 +592,19 @@ if (std::find(start, end, current->sType) == end) { if (type_name == UnsupportedStructureTypeString) { std::string message = - "%s: %s chain includes a structure with unknown VkStructureType (%d); Allowed structures are [%s]. %s "; + "%s: %s chain includes a structure with unknown VkStructureType (%d); Allowed structures are [%s]. "; message += disclaimer; skip_call |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, - 0, __LINE__, vuid, LayerName, message.c_str(), api_name, - parameter_name.get_name().c_str(), current->sType, allowed_struct_names, - validation_error_map[vuid], header_version, parameter_name.get_name().c_str()); + 0, vuid, message.c_str(), api_name, parameter_name.get_name().c_str(), current->sType, + allowed_struct_names, header_version, parameter_name.get_name().c_str()); } else { std::string message = - "%s: %s chain includes a structure with unexpected VkStructureType %s; Allowed structures are [%s]. " - "%s "; + "%s: %s chain includes a structure with unexpected VkStructureType %s; Allowed structures are [%s]. "; message += disclaimer; - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, - 0, __LINE__, vuid, LayerName, message.c_str(), api_name, - parameter_name.get_name().c_str(), type_name.c_str(), allowed_struct_names, - validation_error_map[vuid], header_version, parameter_name.get_name().c_str()); + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, vuid, + message.c_str(), api_name, parameter_name.get_name().c_str(), type_name.c_str(), + allowed_struct_names, header_version, parameter_name.get_name().c_str()); } } current = reinterpret_cast(current->pNext); @@ -639,9 +631,9 @@ bool skip_call = false; if ((value != VK_TRUE) && (value != VK_FALSE)) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - UNRECOGNIZED_VALUE, LayerName, "%s: value of %s (%d) is neither VK_TRUE nor VK_FALSE", apiName, - parameterName.get_name().c_str(), value); + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, UNRECOGNIZED_VALUE, + "%s: value of %s (%d) is neither VK_TRUE nor VK_FALSE", apiName, parameterName.get_name().c_str(), value); } return skip_call; @@ -671,11 +663,10 @@ bool skip = false; if (std::find(valid_values.begin(), valid_values.end(), value) == valid_values.end()) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, vuid, - LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, vuid, "%s: value of %s (%d) does not fall within the begin..end range of the core %s enumeration tokens and is " - "not an extension added token. %s", - apiName, parameterName.get_name().c_str(), value, enumName, validation_error_map[vuid]); + "not an extension added token.", + apiName, parameterName.get_name().c_str(), value, enumName); } return skip; @@ -710,13 +701,13 @@ bool skip_call = false; if ((count == 0) || (array == NULL)) { - skip_call |= validate_array(report_data, apiName, countName, arrayName, count, array, countRequired, arrayRequired, + skip_call |= validate_array(report_data, apiName, countName, arrayName, count, &array, countRequired, arrayRequired, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED); } else { for (uint32_t i = 0; i < count; ++i) { if (std::find(valid_values.begin(), valid_values.end(), array[i]) == valid_values.end()) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, UNRECOGNIZED_VALUE, LayerName, + UNRECOGNIZED_VALUE, "%s: value of %s[%d] (%d) does not fall within the begin..end range of the core %s " "enumeration tokens and is not an extension added token", apiName, arrayName.get_name().c_str(), i, array[i], enumName); @@ -744,9 +735,8 @@ bool skip_call = false; if (value != 0) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, vuid, - LayerName, "%s: parameter %s must be 0. %s", api_name, parameter_name.get_name().c_str(), - validation_error_map[vuid]); + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, vuid, + "%s: parameter %s must be 0.", api_name, parameter_name.get_name().c_str()); } return skip_call; @@ -775,20 +765,18 @@ if (value == 0) { if (flags_required) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - vuid, LayerName, "%s: value of %s must not be 0. %s", api_name, parameter_name.get_name().c_str(), - validation_error_map[vuid]); + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, vuid, + "%s: value of %s must not be 0.", api_name, parameter_name.get_name().c_str()); } } else if ((value & (~all_flags)) != 0) { - skip_call |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - UNRECOGNIZED_VALUE, LayerName, "%s: value of %s contains flag bits that are not recognized members of %s", - api_name, parameter_name.get_name().c_str(), flag_bits_name); + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + UNRECOGNIZED_VALUE, "%s: value of %s contains flag bits that are not recognized members of %s", + api_name, parameter_name.get_name().c_str(), flag_bits_name); } else if (singleFlag && (std::bitset(value).count() > 1)) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - UNRECOGNIZED_VALUE, LayerName, - "%s: value of %s contains multiple members of %s when only a single value is allowed", api_name, - parameter_name.get_name().c_str(), flag_bits_name); + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, UNRECOGNIZED_VALUE, + "%s: value of %s contains multiple members of %s when only a single value is allowed", api_name, + parameter_name.get_name().c_str(), flag_bits_name); } return skip_call; @@ -818,7 +806,7 @@ bool skip_call = false; if ((count == 0) || (array == NULL)) { - skip_call |= validate_array(report_data, api_name, count_name, array_name, count, array, count_required, array_required, + skip_call |= validate_array(report_data, api_name, count_name, array_name, count, &array, count_required, array_required, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED); } else { // Verify that all VkFlags values in the array @@ -828,14 +816,14 @@ // elements in the array are allowed be 0 if (array_required) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, REQUIRED_PARAMETER, LayerName, "%s: value of %s[%d] must not be 0", api_name, + REQUIRED_PARAMETER, "%s: value of %s[%d] must not be 0", api_name, array_name.get_name().c_str(), i); } } else if ((array[i] & (~all_flags)) != 0) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, UNRECOGNIZED_VALUE, LayerName, - "%s: value of %s[%d] contains flag bits that are not recognized members of %s", api_name, - array_name.get_name().c_str(), i, flag_bits_name); + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + UNRECOGNIZED_VALUE, "%s: value of %s[%d] contains flag bits that are not recognized members of %s", + api_name, array_name.get_name().c_str(), i, flag_bits_name); } } } @@ -909,13 +897,12 @@ std::string resultName = string_VkResult(result); if (resultName == UnsupportedResultString) { // Unrecognized result code - log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - FAILURE_RETURN_CODE, LayerName, "%s: returned a result code indicating that an error has occurred", apiName); + log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, FAILURE_RETURN_CODE, + "%s: returned a result code indicating that an error has occurred", apiName); } else { std::string resultDesc = get_result_description(result); - log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - FAILURE_RETURN_CODE, LayerName, "%s: returned %s, indicating that %s", apiName, resultName.c_str(), - resultDesc.c_str()); + log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, FAILURE_RETURN_CODE, + "%s: returned %s, indicating that %s", apiName, resultName.c_str(), resultDesc.c_str()); } } } diff -Nru vulkan-1.1.70+dfsg1/layers/parameter_validation_layer.md vulkan-1.1.73+dfsg/layers/parameter_validation_layer.md --- vulkan-1.1.70+dfsg1/layers/parameter_validation_layer.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/parameter_validation_layer.md 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,8 @@ +# VK\_LAYER\_LUNARG\_parameter\_validation +The `VK_LAYER_LUNARG_parameter_validation` validation layer checks the input parameters to API calls for validity. This layer performs the following tasks: + + - validation of structures; structures are recursed if necessary + - validation of enumerated type values + - null pointer conditions + - stateless valid usage checks + - validation of `VkResult`. diff -Nru vulkan-1.1.70+dfsg1/layers/parameter_validation_utils.cpp vulkan-1.1.73+dfsg/layers/parameter_validation_utils.cpp --- vulkan-1.1.70+dfsg1/layers/parameter_validation_utils.cpp 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/parameter_validation_utils.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -25,7 +25,6 @@ #include #include #include -#include #include #include @@ -52,7 +51,7 @@ #if defined __ANDROID__ #include -#define LOGCONSOLE(...) ((void)__android_log_print(ANDROID_LOG_INFO, "DS", __VA_ARGS__)) +#define LOGCONSOLE(...) ((void)__android_log_print(ANDROID_LOG_INFO, "PARAMETER_VALIDATION", __VA_ARGS__)) #else #define LOGCONSOLE(...) \ { \ @@ -138,35 +137,31 @@ if (result == VK_STRING_ERROR_NONE) { return skip; } else if (result & VK_STRING_ERROR_LENGTH) { - skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(), - MaxParamCheckerStringLength); + skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, INVALID_USAGE, + "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(), MaxParamCheckerStringLength); } else if (result & VK_STRING_ERROR_BAD_DATA) { - skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName, - stringName.get_name().c_str()); + skip = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, INVALID_USAGE, + "%s: string %s contains invalid characters or is badly formed", apiName, stringName.get_name().c_str()); } return skip; } static bool ValidateDeviceQueueFamily(layer_data *device_data, uint32_t queue_family, const char *cmd_name, - const char *parameter_name, int32_t error_code, bool optional = false, - const char *vu_note = nullptr) { + const char *parameter_name, int32_t error_code, bool optional = false) { bool skip = false; - if (!vu_note) vu_note = validation_error_map[error_code]; if (!optional && queue_family == VK_QUEUE_FAMILY_IGNORED) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(device_data->device), __LINE__, error_code, LayerName, - "%s: %s is VK_QUEUE_FAMILY_IGNORED, but it is required to provide a valid queue family index value. %s", - cmd_name, parameter_name, vu_note); + HandleToUint64(device_data->device), error_code, + "%s: %s is VK_QUEUE_FAMILY_IGNORED, but it is required to provide a valid queue family index value.", + cmd_name, parameter_name); } else if (device_data->queueFamilyIndexMap.find(queue_family) == device_data->queueFamilyIndexMap.end()) { - skip |= log_msg( - device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(device_data->device), __LINE__, error_code, LayerName, - "%s: %s (= %" PRIu32 - ") is not one of the queue families given via VkDeviceQueueCreateInfo structures when the device was created. %s", - cmd_name, parameter_name, queue_family, vu_note); + skip |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, + HandleToUint64(device_data->device), error_code, + "%s: %s (= %" PRIu32 + ") is not one of the queue families given via VkDeviceQueueCreateInfo structures when the device was created.", + cmd_name, parameter_name, queue_family); } return skip; @@ -174,11 +169,8 @@ static bool ValidateQueueFamilies(layer_data *device_data, uint32_t queue_family_count, const uint32_t *queue_families, const char *cmd_name, const char *array_parameter_name, int32_t unique_error_code, - int32_t valid_error_code, bool optional = false, const char *unique_vu_note = nullptr, - const char *valid_vu_note = nullptr) { + int32_t valid_error_code, bool optional = false) { bool skip = false; - if (!unique_vu_note) unique_vu_note = validation_error_map[unique_error_code]; - if (!valid_vu_note) valid_vu_note = validation_error_map[valid_error_code]; if (queue_families) { std::unordered_set set; for (uint32_t i = 0; i < queue_family_count; ++i) { @@ -186,13 +178,13 @@ if (set.count(queue_families[i])) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(device_data->device), __LINE__, VALIDATION_ERROR_056002e8, LayerName, - "%s: %s (=%" PRIu32 ") is not unique within %s array. %s", cmd_name, parameter_name.c_str(), - queue_families[i], array_parameter_name, unique_vu_note); + HandleToUint64(device_data->device), VALIDATION_ERROR_056002e8, + "%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(device_data, queue_families[i], cmd_name, parameter_name.c_str(), - valid_error_code, optional, valid_vu_note); + valid_error_code, optional); } } } @@ -200,7 +192,7 @@ } VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, - VkInstance *pInstance) { + VkInstance *pInstance) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); @@ -264,18 +256,29 @@ } init_parameter_validation(my_instance_data, pAllocator); - - uint32_t api_version = my_instance_data->extensions.InitFromInstanceCreateInfo( - (pCreateInfo->pApplicationInfo ? pCreateInfo->pApplicationInfo->apiVersion : VK_API_VERSION_1_0), pCreateInfo); - - if (pCreateInfo->pApplicationInfo) { - uint32_t specified_api_version = pCreateInfo->pApplicationInfo->apiVersion & ~VK_VERSION_PATCH(~0); - if (!(specified_api_version == VK_API_VERSION_1_0) && !(specified_api_version == VK_API_VERSION_1_1)) { - LOGCONSOLE( - "Warning: Unrecognized CreateInstance->pCreateInfo->pApplicationInfo.apiVersion number -- (0x%08x) assuming " - "%s.\n", - pCreateInfo->pApplicationInfo->apiVersion, - (api_version == VK_API_VERSION_1_0) ? "VK_API_VERSION_1_0" : "VK_API_VERSION_1_1"); + // Note: From the spec-- + // Providing a NULL VkInstanceCreateInfo::pApplicationInfo or providing an apiVersion of 0 is equivalent to providing + // an apiVersion of VK_MAKE_VERSION(1, 0, 0). (a.k.a. VK_API_VERSION_1_0) + uint32_t api_version = (pCreateInfo->pApplicationInfo && pCreateInfo->pApplicationInfo->apiVersion) + ? pCreateInfo->pApplicationInfo->apiVersion + : VK_API_VERSION_1_0; + + uint32_t effective_api_version = my_instance_data->extensions.InitFromInstanceCreateInfo(api_version, pCreateInfo); + + uint32_t api_version_nopatch = VK_MAKE_VERSION(VK_VERSION_MAJOR(api_version), VK_VERSION_MINOR(api_version), 0); + if (api_version_nopatch != effective_api_version) { + const char *effective_api_string = + (effective_api_version == VK_API_VERSION_1_0) ? "VK_API_VERSION_1_0" : "VK_API_VERSION_1_1"; + if (api_version_nopatch < VK_API_VERSION_1_0) { + log_msg(my_instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_UNDEFINED, + "Invalid CreateInstance->pCreateInfo->pApplicationInfo.apiVersion number (0x%08x). Using %s.\n", + api_version, effective_api_string); + } else { + log_msg(my_instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_UNDEFINED, + "Unrecognized CreateInstance->pCreateInfo->pApplicationInfo.apiVersion number (0x%08x). Assuming %s.\n", + api_version, effective_api_string); } } @@ -454,10 +457,9 @@ if (maint1 && negative_viewport) { skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_056002ec, LayerName, + VALIDATION_ERROR_056002ec, "VkDeviceCreateInfo->ppEnabledExtensionNames must not simultaneously include VK_KHR_maintenance1 and " - "VK_AMD_negative_viewport_height. %s", - validation_error_map[VALIDATION_ERROR_056002ec]); + "VK_AMD_negative_viewport_height."); } if (pCreateInfo->pNext != NULL && pCreateInfo->pEnabledFeatures) { @@ -466,7 +468,7 @@ if (features2) { // Cannot include VkPhysicalDeviceFeatures2KHR and have non-null pEnabledFeatures skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, INVALID_USAGE, LayerName, + INVALID_USAGE, "VkDeviceCreateInfo->pNext includes a VkPhysicalDeviceFeatures2KHR struct when " "pCreateInfo->pEnabledFeatures is non-NULL."); } @@ -480,19 +482,19 @@ const uint32_t requested_queue_family = pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex; if (requested_queue_family == VK_QUEUE_FAMILY_IGNORED) { skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), __LINE__, - VALIDATION_ERROR_06c002fa, LayerName, + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), + VALIDATION_ERROR_06c002fa, "vkCreateDevice: pCreateInfo->pQueueCreateInfos[%" PRIu32 "].queueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, but it is required to provide a valid queue family " - "index value. %s", - i, validation_error_map[VALIDATION_ERROR_06c002fa]); + "index value.", + i); } else if (set.count(requested_queue_family)) { skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), __LINE__, - VALIDATION_ERROR_056002e8, LayerName, + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), + VALIDATION_ERROR_056002e8, "vkCreateDevice: pCreateInfo->pQueueCreateInfos[%" PRIu32 "].queueFamilyIndex (=%" PRIu32 - ") is not unique within pCreateInfo->pQueueCreateInfos array. %s", - i, requested_queue_family, validation_error_map[VALIDATION_ERROR_056002e8]); + ") is not unique within pCreateInfo->pQueueCreateInfos array.", + i, requested_queue_family); } else { set.insert(requested_queue_family); } @@ -502,11 +504,11 @@ const float queue_priority = pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]; if (!(queue_priority >= 0.f) || !(queue_priority <= 1.f)) { skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), __LINE__, - VALIDATION_ERROR_06c002fe, LayerName, + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, HandleToUint64(physicalDevice), + VALIDATION_ERROR_06c002fe, "vkCreateDevice: pCreateInfo->pQueueCreateInfos[%" PRIu32 "].pQueuePriorities[%" PRIu32 - "] (=%f) is not between 0 and 1 (inclusive). %s", - i, j, queue_priority, validation_error_map[VALIDATION_ERROR_06c002fe]); + "] (=%f) is not between 0 and 1 (inclusive).", + i, j, queue_priority); } } } @@ -631,11 +633,11 @@ const auto &queue_data = device_data->queueFamilyIndexMap.find(queueFamilyIndex); if (queue_data != device_data->queueFamilyIndexMap.end() && queue_data->second <= queueIndex) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - HandleToUint64(device), __LINE__, VALIDATION_ERROR_29600302, LayerName, + HandleToUint64(device), VALIDATION_ERROR_29600302, "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 "). %s", - queueIndex, queueFamilyIndex, queue_data->second, validation_error_map[VALIDATION_ERROR_29600302]); + ") when the device was created (i.e. is not less than %" PRIu32 ").", + queueIndex, queueFamilyIndex, queue_data->second); } return skip; } @@ -674,11 +676,10 @@ if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) && ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_11c00630, LayerName, + VALIDATION_ERROR_11c00630, "vkCreateQueryPool(): if pCreateInfo->queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, " "pCreateInfo->pipelineStatistics must be a valid combination of VkQueryPipelineStatisticFlagBits " - "values. %s", - validation_error_map[VALIDATION_ERROR_11c00630]); + "values."); } } if (!skip) { @@ -765,7 +766,7 @@ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); debug_report_data *report_data = device_data->report_data; - const LogMiscParams log_misc{report_data, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, VK_NULL_HANDLE, LayerName, "vkCreateBuffer"}; + const LogMiscParams log_misc{report_data, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, VK_NULL_HANDLE, "vkCreateBuffer"}; if (pCreateInfo != nullptr) { skip |= ValidateGreaterThanZero(pCreateInfo->size, "pCreateInfo->size", VALIDATION_ERROR_01400720, log_misc); @@ -774,27 +775,24 @@ if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) { // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1 if (pCreateInfo->queueFamilyIndexCount <= 1) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_01400724, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_01400724, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, " - "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s", - validation_error_map[VALIDATION_ERROR_01400724]); + "pCreateInfo->queueFamilyIndexCount must be greater than 1."); } // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of // queueFamilyIndexCount uint32_t values if (pCreateInfo->pQueueFamilyIndices == nullptr) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_01400722, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_01400722, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, " "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of " - "pCreateInfo->queueFamilyIndexCount uint32_t values. %s", - validation_error_map[VALIDATION_ERROR_01400722]); + "pCreateInfo->queueFamilyIndexCount uint32_t values."); } else { - // TODO: Not in the spec VUs. Probably missing -- KhronosGroup/Vulkan-Docs#501. Update error codes when resolved. skip |= ValidateQueueFamilies(device_data, pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices", INVALID_USAGE, INVALID_USAGE, - false, "", ""); + false); } } @@ -802,11 +800,10 @@ // VK_BUFFER_CREATE_SPARSE_BINDING_BIT if (((pCreateInfo->flags & (VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_ALIASED_BIT)) != 0) && ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) != VK_BUFFER_CREATE_SPARSE_BINDING_BIT)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0140072c, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0140072c, "vkCreateBuffer: if pCreateInfo->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. %s", - validation_error_map[VALIDATION_ERROR_0140072c]); + "VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_BUFFER_CREATE_SPARSE_BINDING_BIT."); } } @@ -819,13 +816,12 @@ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); debug_report_data *report_data = device_data->report_data; - const LogMiscParams log_misc{report_data, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, VK_NULL_HANDLE, LayerName, "vkCreateImage"}; + const LogMiscParams log_misc{report_data, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, VK_NULL_HANDLE, "vkCreateImage"}; if (pCreateInfo != nullptr) { if ((device_data->physical_device_features.textureCompressionETC2 == false) && FormatIsCompressed_ETC2_EAC(pCreateInfo->format)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DEVICE_FEATURE, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, DEVICE_FEATURE, "vkCreateImage(): Attempting to create VkImage with format %s. The textureCompressionETC2 feature is " "not enabled: neither ETC2 nor EAC formats can be used to create images.", string_VkFormat(pCreateInfo->format)); @@ -833,16 +829,14 @@ if ((device_data->physical_device_features.textureCompressionASTC_LDR == false) && FormatIsCompressed_ASTC_LDR(pCreateInfo->format)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DEVICE_FEATURE, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, DEVICE_FEATURE, "vkCreateImage(): Attempting to create VkImage with format %s. The textureCompressionASTC_LDR feature " "is not enabled: ASTC formats cannot be used to create images.", string_VkFormat(pCreateInfo->format)); } if ((device_data->physical_device_features.textureCompressionBC == false) && FormatIsCompressed_BC(pCreateInfo->format)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DEVICE_FEATURE, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, DEVICE_FEATURE, "vkCreateImage(): Attempting to create VkImage with format %s. The textureCompressionBC feature is not " "enabled: BC compressed formats cannot be used to create images.", string_VkFormat(pCreateInfo->format)); @@ -852,27 +846,24 @@ if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) { // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1 if (pCreateInfo->queueFamilyIndexCount <= 1) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e0075c, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e0075c, "vkCreateImage(): if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, " - "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s", - validation_error_map[VALIDATION_ERROR_09e0075c]); + "pCreateInfo->queueFamilyIndexCount must be greater than 1."); } // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of // queueFamilyIndexCount uint32_t values if (pCreateInfo->pQueueFamilyIndices == nullptr) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e0075a, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e0075a, "vkCreateImage(): if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, " "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of " - "pCreateInfo->queueFamilyIndexCount uint32_t values. %s", - validation_error_map[VALIDATION_ERROR_09e0075a]); + "pCreateInfo->queueFamilyIndexCount uint32_t values."); } else { - // TODO: Not in the spec VUs. Probably missing -- KhronosGroup/Vulkan-Docs#501. Update error codes when resolved. - skip |= ValidateQueueFamilies(device_data, pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices, - "vkCreateImage", "pCreateInfo->pQueueFamilyIndices", INVALID_USAGE, INVALID_USAGE, - false, "", ""); + skip |= + ValidateQueueFamilies(device_data, pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices, + "vkCreateImage", "pCreateInfo->pQueueFamilyIndices", INVALID_USAGE, INVALID_USAGE, false); } } @@ -890,60 +881,62 @@ if ((pCreateInfo->initialLayout != VK_IMAGE_LAYOUT_UNDEFINED) && (pCreateInfo->initialLayout != VK_IMAGE_LAYOUT_PREINITIALIZED)) { skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e007c2, LayerName, - "vkCreateImage(): initialLayout is %s, must be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED. %s", - string_VkImageLayout(pCreateInfo->initialLayout), validation_error_map[VALIDATION_ERROR_09e007c2]); + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, VALIDATION_ERROR_09e007c2, + "vkCreateImage(): initialLayout is %s, must be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED.", + string_VkImageLayout(pCreateInfo->initialLayout)); } // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1 - if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00778, LayerName, + if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && + ((pCreateInfo->extent.height != 1) || (pCreateInfo->extent.depth != 1))) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e00778, "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both pCreateInfo->extent.height and " - "pCreateInfo->extent.depth must be 1. %s", - validation_error_map[VALIDATION_ERROR_09e00778]); + "pCreateInfo->extent.depth must be 1."); } if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) { - // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and - // extent.height must be equal - if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) && - (pCreateInfo->extent.width != pCreateInfo->extent.height)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00774, LayerName, - "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and pCreateInfo->flags contains " - "VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, pCreateInfo->extent.width and pCreateInfo->extent.height " - "must be equal. %s", - validation_error_map[VALIDATION_ERROR_09e00774]); + if (pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) { + if (pCreateInfo->extent.width != pCreateInfo->extent.height) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + VK_NULL_HANDLE, VALIDATION_ERROR_09e00774, + "vkCreateImage(): pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, but " + "pCreateInfo->extent.width (=%" PRIu32 ") and pCreateInfo->extent.height (=%" PRIu32 + ") are not equal.", + pCreateInfo->extent.width, pCreateInfo->extent.height); + } + + if (pCreateInfo->arrayLayers < 6) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + VK_NULL_HANDLE, VALIDATION_ERROR_09e00774, + "vkCreateImage(): pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, but " + "pCreateInfo->arrayLayers (=%" PRIu32 ") is not greater than or equal to 6.", + pCreateInfo->arrayLayers); + } } if (pCreateInfo->extent.depth != 1) { - skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e0077a, LayerName, - "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1. %s", - validation_error_map[VALIDATION_ERROR_09e0077a]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e0077a, + "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1."); } } // 3D image may have only 1 layer if ((pCreateInfo->imageType == VK_IMAGE_TYPE_3D) && (pCreateInfo->arrayLayers != 1)) { - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00782, LayerName, - "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_3D, pCreateInfo->arrayLayers must be 1. %s", - validation_error_map[VALIDATION_ERROR_09e00782]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e00782, + "vkCreateImage(): if pCreateInfo->imageType is VK_IMAGE_TYPE_3D, pCreateInfo->arrayLayers must be 1."); } // If multi-sample, validate type, usage, tiling and mip levels. if ((pCreateInfo->samples != VK_SAMPLE_COUNT_1_BIT) && ((pCreateInfo->imageType != VK_IMAGE_TYPE_2D) || (pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) || (pCreateInfo->tiling != VK_IMAGE_TILING_OPTIMAL) || (pCreateInfo->mipLevels != 1))) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00784, LayerName, - "vkCreateImage(): Multi-sample image with incompatible type, usage, tiling, or mips. %s", - validation_error_map[VALIDATION_ERROR_09e00784]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e00784, + "vkCreateImage(): Multi-sample image with incompatible type, usage, tiling, or mips."); } if (0 != (pCreateInfo->usage & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT)) { @@ -951,79 +944,78 @@ VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT); // At least one of the legal attachment bits must be set if (0 == (pCreateInfo->usage & legal_flags)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e0078c, LayerName, - "vkCreateImage(): Transient attachment image without a compatible attachment flag set. %s", - validation_error_map[VALIDATION_ERROR_09e0078c]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e0078c, + "vkCreateImage(): Transient attachment image without a compatible attachment flag set."); } // No flags other than the legal attachment bits may be set legal_flags |= VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT; if (0 != (pCreateInfo->usage & ~legal_flags)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00786, LayerName, - "vkCreateImage(): Transient attachment image with incompatible usage flags set. %s", - validation_error_map[VALIDATION_ERROR_09e00786]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e00786, + "vkCreateImage(): Transient attachment image with incompatible usage flags set."); } } // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1 uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth); if (maxDim > 0 && pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) { - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e0077c, LayerName, - "vkCreateImage(): pCreateInfo->mipLevels must be less than or equal to " - "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1. %s", - validation_error_map[VALIDATION_ERROR_09e0077c]); + skip |= log_msg( + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, VALIDATION_ERROR_09e0077c, + "vkCreateImage(): pCreateInfo->mipLevels must be less than or equal to " + "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1."); + } + + if ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) && (!device_data->physical_device_features.sparseBinding)) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, VK_NULL_HANDLE, + VALIDATION_ERROR_09e00792, + "vkCreateImage(): pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_BINDING_BIT, but the " + "VkPhysicalDeviceFeatures::sparseBinding feature is disabled."); } // 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) && ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e007b6, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e007b6, "vkCreateImage: if pCreateInfo->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. %s", - validation_error_map[VALIDATION_ERROR_09e007b6]); + "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT."); } // Check for combinations of attributes that are incompatible with having VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set if ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) != 0) { // Linear tiling is unsupported if (VK_IMAGE_TILING_LINEAR == pCreateInfo->tiling) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - INVALID_USAGE, LayerName, - "vkCreateImage: if pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image " - "tiling of VK_IMAGE_TILING_LINEAR is not supported"); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, INVALID_USAGE, + "vkCreateImage: if pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image " + "tiling of VK_IMAGE_TILING_LINEAR is not supported"); } // Sparse 1D image isn't valid if (VK_IMAGE_TYPE_1D == pCreateInfo->imageType) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00794, LayerName, - "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 1D image. %s", - validation_error_map[VALIDATION_ERROR_09e00794]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e00794, + "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 1D image."); } // Sparse 2D image when device doesn't support it if ((VK_FALSE == device_data->physical_device_features.sparseResidencyImage2D) && (VK_IMAGE_TYPE_2D == pCreateInfo->imageType)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00796, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e00796, "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 2D image if corresponding " - "feature is not enabled on the device. %s", - validation_error_map[VALIDATION_ERROR_09e00796]); + "feature is not enabled on the device."); } // Sparse 3D image when device doesn't support it if ((VK_FALSE == device_data->physical_device_features.sparseResidencyImage3D) && (VK_IMAGE_TYPE_3D == pCreateInfo->imageType)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_09e00798, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_09e00798, "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 3D image if corresponding " - "feature is not enabled on the device. %s", - validation_error_map[VALIDATION_ERROR_09e00798]); + "feature is not enabled on the device."); } // Multi-sample 2D image when device doesn't support it @@ -1031,31 +1023,27 @@ if ((VK_FALSE == device_data->physical_device_features.sparseResidency2Samples) && (VK_SAMPLE_COUNT_2_BIT == pCreateInfo->samples)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_09e0079a, LayerName, + VALIDATION_ERROR_09e0079a, "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 2-sample image if " - "corresponding feature is not enabled on the device. %s", - validation_error_map[VALIDATION_ERROR_09e0079a]); + "corresponding feature is not enabled on the device."); } else if ((VK_FALSE == device_data->physical_device_features.sparseResidency4Samples) && (VK_SAMPLE_COUNT_4_BIT == pCreateInfo->samples)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_09e0079c, LayerName, + VALIDATION_ERROR_09e0079c, "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 4-sample image if " - "corresponding feature is not enabled on the device. %s", - validation_error_map[VALIDATION_ERROR_09e0079c]); + "corresponding feature is not enabled on the device."); } else if ((VK_FALSE == device_data->physical_device_features.sparseResidency8Samples) && (VK_SAMPLE_COUNT_8_BIT == pCreateInfo->samples)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_09e0079e, LayerName, + VALIDATION_ERROR_09e0079e, "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 8-sample image if " - "corresponding feature is not enabled on the device. %s", - validation_error_map[VALIDATION_ERROR_09e0079e]); + "corresponding feature is not enabled on the device."); } else if ((VK_FALSE == device_data->physical_device_features.sparseResidency16Samples) && (VK_SAMPLE_COUNT_16_BIT == pCreateInfo->samples)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_09e007a0, LayerName, + VALIDATION_ERROR_09e007a0, "vkCreateImage: cannot specify VK_IMAGE_CREATE_SPARSE_BINDING_BIT for 16-sample image if " - "corresponding feature is not enabled on the device. %s", - validation_error_map[VALIDATION_ERROR_09e007a0]); + "corresponding feature is not enabled on the device."); } } } @@ -1073,8 +1061,8 @@ if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) { if ((pCreateInfo->subresourceRange.layerCount != 1) && (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1, - LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, 1, + "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, " "pCreateInfo->subresourceRange.layerCount must be 1", ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2)); @@ -1083,8 +1071,8 @@ (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) { if ((pCreateInfo->subresourceRange.layerCount < 1) && (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1, - LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, 1, + "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, " "pCreateInfo->subresourceRange.layerCount must be >= 1", ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2)); @@ -1092,39 +1080,57 @@ } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) { if ((pCreateInfo->subresourceRange.layerCount != 6) && (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1, - LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, 1, + "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, " "pCreateInfo->subresourceRange.layerCount must be 6"); } } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) { if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) && (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1, - LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, 1, + "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, " "pCreateInfo->subresourceRange.layerCount must be a multiple of 6"); } if (!device_data->physical_device_features.imageCubeArray) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1, - LayerName, "vkCreateImageView: Device feature imageCubeArray not enabled."); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, 1, + "vkCreateImageView: Device feature imageCubeArray not enabled."); } } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) { if (pCreateInfo->subresourceRange.baseArrayLayer != 0) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1, - LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, 1, + "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, " "pCreateInfo->subresourceRange.baseArrayLayer must be 0"); } if ((pCreateInfo->subresourceRange.layerCount != 1) && (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1, - LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, 1, + "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, " "pCreateInfo->subresourceRange.layerCount must be 1"); } } + + // Validate chained VkImageViewUsageCreateInfo struct, if present + if (nullptr != pCreateInfo->pNext) { + auto chained_ivuci_struct = lvl_find_in_chain(pCreateInfo->pNext); + if (chained_ivuci_struct) { + if (0 == chained_ivuci_struct->usage) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_3f230603, + "vkCreateImageView: Chained VkImageViewUsageCreateInfo usage field must not be 0."); + } else if (chained_ivuci_struct->usage & ~AllVkImageUsageFlagBits) { + std::stringstream ss; + ss << "vkCreateImageView: Chained VkImageViewUsageCreateInfo usage field (0x" << std::hex + << chained_ivuci_struct->usage << ") contains invalid flag bits."; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_3f230601, "%s", ss.str().c_str()); + } + } + } } return skip; } @@ -1169,68 +1175,66 @@ if (!(viewport.width > 0.0f)) { width_healthy = false; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, __LINE__, VALIDATION_ERROR_15000dd4, - LayerName, "%s: %s.width (=%f) is not greater than 0.0. %s", fn_name, param_name, viewport.width, - validation_error_map[VALIDATION_ERROR_15000dd4]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, VALIDATION_ERROR_15000dd4, + "%s: %s.width (=%f) is not greater than 0.0.", fn_name, param_name, viewport.width); } else if (!(f_lte_u32_exact(viewport.width, max_w) || f_lte_u32_direct(viewport.width, max_w))) { width_healthy = false; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, __LINE__, VALIDATION_ERROR_15000dd6, - LayerName, "%s: %s.width (=%f) exceeds VkPhysicalDeviceLimits::maxViewportDimensions[0] (=%" PRIu32 "). %s", - fn_name, param_name, viewport.width, max_w, validation_error_map[VALIDATION_ERROR_15000dd6]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, VALIDATION_ERROR_15000dd6, + "%s: %s.width (=%f) exceeds VkPhysicalDeviceLimits::maxViewportDimensions[0] (=%" PRIu32 ").", fn_name, + param_name, viewport.width, max_w); } else if (!f_lte_u32_exact(viewport.width, max_w) && f_lte_u32_direct(viewport.width, max_w)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, object_type, object, __LINE__, NONE, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, object_type, object, NONE, "%s: %s.width (=%f) technically exceeds VkPhysicalDeviceLimits::maxViewportDimensions[0] (=%" PRIu32 - "), but it is within the static_cast(maxViewportDimensions[0]) limit. %s", - fn_name, param_name, viewport.width, max_w, validation_error_map[VALIDATION_ERROR_15000dd6]); + "), but it is within the static_cast(maxViewportDimensions[0]) limit.", + fn_name, param_name, viewport.width, max_w); } // height bool height_healthy = true; - const bool negative_height_enabled = - device_data->extensions.vk_khr_maintenance1 || device_data->extensions.vk_amd_negative_viewport_height; + const bool negative_height_enabled = device_data->api_version >= VK_API_VERSION_1_1 || + device_data->extensions.vk_khr_maintenance1 || + device_data->extensions.vk_amd_negative_viewport_height; const auto max_h = device_data->device_limits.maxViewportDimensions[1]; if (!negative_height_enabled && !(viewport.height > 0.0f)) { height_healthy = false; - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, __LINE__, VALIDATION_ERROR_15000dd8, - LayerName, "%s: %s.height (=%f) is not greater 0.0. %s", fn_name, param_name, viewport.height, - validation_error_map[VALIDATION_ERROR_15000dd8]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, VALIDATION_ERROR_15000dd8, + "%s: %s.height (=%f) is not greater 0.0.", fn_name, param_name, viewport.height); } else if (!(f_lte_u32_exact(fabsf(viewport.height), max_h) || f_lte_u32_direct(fabsf(viewport.height), max_h))) { height_healthy = false; - skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, __LINE__, VALIDATION_ERROR_15000dda, LayerName, - "%s: Absolute value of %s.height (=%f) exceeds VkPhysicalDeviceLimits::maxViewportDimensions[1] (=%" PRIu32 "). %s", - fn_name, param_name, viewport.height, max_h, validation_error_map[VALIDATION_ERROR_15000dda]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, VALIDATION_ERROR_15000dda, + "%s: Absolute value of %s.height (=%f) exceeds VkPhysicalDeviceLimits::maxViewportDimensions[1] (=%" PRIu32 + ").", + fn_name, param_name, viewport.height, max_h); } else if (!f_lte_u32_exact(fabsf(viewport.height), max_h) && f_lte_u32_direct(fabsf(viewport.height), max_h)) { height_healthy = false; skip |= log_msg( - report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, object_type, object, __LINE__, NONE, LayerName, + report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, object_type, object, NONE, "%s: Absolute value of %s.height (=%f) technically exceeds VkPhysicalDeviceLimits::maxViewportDimensions[1] (=%" PRIu32 - "), but it is within the static_cast(maxViewportDimensions[1]) limit. %s", - fn_name, param_name, viewport.height, max_h, validation_error_map[VALIDATION_ERROR_15000dda]); + "), but it is within the static_cast(maxViewportDimensions[1]) limit.", + fn_name, param_name, viewport.height, max_h); } // x bool x_healthy = true; if (!(viewport.x >= device_data->device_limits.viewportBoundsRange[0])) { x_healthy = false; - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, __LINE__, VALIDATION_ERROR_15000ddc, LayerName, - "%s: %s.x (=%f) is less than VkPhysicalDeviceLimits::viewportBoundsRange[0] (=%f). %s", fn_name, param_name, - viewport.x, device_data->device_limits.viewportBoundsRange[0], validation_error_map[VALIDATION_ERROR_15000ddc]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, VALIDATION_ERROR_15000ddc, + "%s: %s.x (=%f) is less than VkPhysicalDeviceLimits::viewportBoundsRange[0] (=%f).", fn_name, param_name, + viewport.x, device_data->device_limits.viewportBoundsRange[0]); } // x + width if (x_healthy && width_healthy) { const float right_bound = viewport.x + viewport.width; if (!(right_bound <= device_data->device_limits.viewportBoundsRange[1])) { - skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, __LINE__, VALIDATION_ERROR_150009a0, LayerName, - "%s: %s.x + %s.width (=%f + %f = %f) is greater than VkPhysicalDeviceLimits::viewportBoundsRange[1] (=%f). %s", - fn_name, param_name, param_name, viewport.x, viewport.width, right_bound, - device_data->device_limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_150009a0]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, VALIDATION_ERROR_150009a0, + "%s: %s.x + %s.width (=%f + %f = %f) is greater than VkPhysicalDeviceLimits::viewportBoundsRange[1] (=%f).", + fn_name, param_name, param_name, viewport.x, viewport.width, right_bound, + device_data->device_limits.viewportBoundsRange[1]); } } @@ -1238,16 +1242,14 @@ bool y_healthy = true; if (!(viewport.y >= device_data->device_limits.viewportBoundsRange[0])) { y_healthy = false; - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, __LINE__, VALIDATION_ERROR_15000dde, LayerName, - "%s: %s.y (=%f) is less than VkPhysicalDeviceLimits::viewportBoundsRange[0] (=%f). %s", fn_name, param_name, - viewport.y, device_data->device_limits.viewportBoundsRange[0], validation_error_map[VALIDATION_ERROR_15000dde]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, VALIDATION_ERROR_15000dde, + "%s: %s.y (=%f) is less than VkPhysicalDeviceLimits::viewportBoundsRange[0] (=%f).", fn_name, param_name, + viewport.y, device_data->device_limits.viewportBoundsRange[0]); } else if (negative_height_enabled && !(viewport.y <= device_data->device_limits.viewportBoundsRange[1])) { y_healthy = false; - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, __LINE__, VALIDATION_ERROR_15000de0, LayerName, - "%s: %s.y (=%f) exceeds VkPhysicalDeviceLimits::viewportBoundsRange[1] (=%f). %s", fn_name, param_name, - viewport.y, device_data->device_limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_15000de0]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, VALIDATION_ERROR_15000de0, + "%s: %s.y (=%f) exceeds VkPhysicalDeviceLimits::viewportBoundsRange[1] (=%f).", fn_name, param_name, + viewport.y, device_data->device_limits.viewportBoundsRange[1]); } // y + height @@ -1255,37 +1257,35 @@ const float boundary = viewport.y + viewport.height; if (!(boundary <= device_data->device_limits.viewportBoundsRange[1])) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, __LINE__, VALIDATION_ERROR_150009a2, - LayerName, - "%s: %s.y + %s.height (=%f + %f = %f) exceeds VkPhysicalDeviceLimits::viewportBoundsRange[1] (=%f). %s", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, VALIDATION_ERROR_150009a2, + "%s: %s.y + %s.height (=%f + %f = %f) exceeds VkPhysicalDeviceLimits::viewportBoundsRange[1] (=%f).", fn_name, param_name, param_name, viewport.y, viewport.height, boundary, - device_data->device_limits.viewportBoundsRange[1], validation_error_map[VALIDATION_ERROR_150009a2]); + device_data->device_limits.viewportBoundsRange[1]); } else if (negative_height_enabled && !(boundary >= device_data->device_limits.viewportBoundsRange[0])) { skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, __LINE__, VALIDATION_ERROR_15000de2, LayerName, - "%s: %s.y + %s.height (=%f + %f = %f) is less than VkPhysicalDeviceLimits::viewportBoundsRange[0] (=%f). %s", - fn_name, param_name, param_name, viewport.y, viewport.height, boundary, - device_data->device_limits.viewportBoundsRange[0], validation_error_map[VALIDATION_ERROR_15000de2]); + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, VALIDATION_ERROR_15000de2, + "%s: %s.y + %s.height (=%f + %f = %f) is less than VkPhysicalDeviceLimits::viewportBoundsRange[0] (=%f).", fn_name, + param_name, param_name, viewport.y, viewport.height, boundary, device_data->device_limits.viewportBoundsRange[0]); } } if (!device_data->extensions.vk_ext_depth_range_unrestricted) { // minDepth if (!(viewport.minDepth >= 0.0) || !(viewport.minDepth <= 1.0)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, __LINE__, VALIDATION_ERROR_150009a4, - LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, VALIDATION_ERROR_150009a4, + "%s: VK_EXT_depth_range_unrestricted extension is not enabled and %s.minDepth (=%f) is not within the " - "[0.0, 1.0] range. %s", - fn_name, param_name, viewport.minDepth, validation_error_map[VALIDATION_ERROR_150009a4]); + "[0.0, 1.0] range.", + fn_name, param_name, viewport.minDepth); } // maxDepth if (!(viewport.maxDepth >= 0.0) || !(viewport.maxDepth <= 1.0)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, __LINE__, VALIDATION_ERROR_150009a6, - LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object, VALIDATION_ERROR_150009a6, + "%s: VK_EXT_depth_range_unrestricted extension is not enabled and %s.maxDepth (=%f) is not within the " - "[0.0, 1.0] range. %s", - fn_name, param_name, viewport.maxDepth, validation_error_map[VALIDATION_ERROR_150009a6]); + "[0.0, 1.0] range.", + fn_name, param_name, viewport.maxDepth); } } @@ -1327,22 +1327,20 @@ auto const &vertex_bind_desc = vertex_input_state->pVertexBindingDescriptions[d]; if (vertex_bind_desc.binding >= device_data->device_limits.maxVertexInputBindings) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_14c004d4, LayerName, + VALIDATION_ERROR_14c004d4, "vkCreateGraphicsPipelines: parameter " "pCreateInfos[%u].pVertexInputState->pVertexBindingDescriptions[%u].binding (%u) is " - "greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings (%u). %s", - i, d, vertex_bind_desc.binding, device_data->device_limits.maxVertexInputBindings, - validation_error_map[VALIDATION_ERROR_14c004d4]); + "greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings (%u).", + i, d, vertex_bind_desc.binding, device_data->device_limits.maxVertexInputBindings); } if (vertex_bind_desc.stride > device_data->device_limits.maxVertexInputBindingStride) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_14c004d6, LayerName, + VALIDATION_ERROR_14c004d6, "vkCreateGraphicsPipelines: parameter " "pCreateInfos[%u].pVertexInputState->pVertexBindingDescriptions[%u].stride (%u) is greater " - "than VkPhysicalDeviceLimits::maxVertexInputBindingStride (%u). %s", - i, d, vertex_bind_desc.stride, device_data->device_limits.maxVertexInputBindingStride, - validation_error_map[VALIDATION_ERROR_14c004d6]); + "than VkPhysicalDeviceLimits::maxVertexInputBindingStride (%u).", + i, d, vertex_bind_desc.stride, device_data->device_limits.maxVertexInputBindingStride); } } @@ -1350,32 +1348,29 @@ auto const &vertex_attrib_desc = vertex_input_state->pVertexAttributeDescriptions[d]; if (vertex_attrib_desc.location >= device_data->device_limits.maxVertexInputAttributes) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_14a004d8, LayerName, + VALIDATION_ERROR_14a004d8, "vkCreateGraphicsPipelines: parameter " "pCreateInfos[%u].pVertexInputState->pVertexAttributeDescriptions[%u].location (%u) is " - "greater than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributes (%u). %s", - i, d, vertex_attrib_desc.location, device_data->device_limits.maxVertexInputAttributes, - validation_error_map[VALIDATION_ERROR_14a004d8]); + "greater than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributes (%u).", + i, d, vertex_attrib_desc.location, device_data->device_limits.maxVertexInputAttributes); } if (vertex_attrib_desc.binding >= device_data->device_limits.maxVertexInputBindings) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_14a004da, LayerName, + VALIDATION_ERROR_14a004da, "vkCreateGraphicsPipelines: parameter " "pCreateInfos[%u].pVertexInputState->pVertexAttributeDescriptions[%u].binding (%u) is " - "greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings (%u). %s", - i, d, vertex_attrib_desc.binding, device_data->device_limits.maxVertexInputBindings, - validation_error_map[VALIDATION_ERROR_14a004da]); + "greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings (%u).", + i, d, vertex_attrib_desc.binding, device_data->device_limits.maxVertexInputBindings); } if (vertex_attrib_desc.offset > device_data->device_limits.maxVertexInputAttributeOffset) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_14a004dc, LayerName, + VALIDATION_ERROR_14a004dc, "vkCreateGraphicsPipelines: parameter " "pCreateInfos[%u].pVertexInputState->pVertexAttributeDescriptions[%u].offset (%u) is " - "greater than VkPhysicalDeviceLimits::maxVertexInputAttributeOffset (%u). %s", - i, d, vertex_attrib_desc.offset, device_data->device_limits.maxVertexInputAttributeOffset, - validation_error_map[VALIDATION_ERROR_14a004dc]); + "greater than VkPhysicalDeviceLimits::maxVertexInputAttributeOffset (%u).", + i, d, vertex_attrib_desc.offset, device_data->device_limits.maxVertexInputAttributeOffset); } } } @@ -1396,11 +1391,11 @@ if (has_control && has_eval) { if (pCreateInfos[i].pTessellationState == nullptr) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_096005b6, LayerName, + VALIDATION_ERROR_096005b6, "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation control " "shader stage and a tessellation evaluation shader stage, " - "pCreateInfos[%d].pTessellationState must not be NULL. %s", - i, i, validation_error_map[VALIDATION_ERROR_096005b6]); + "pCreateInfos[%d].pTessellationState must not be NULL.", + i, i); } else { skip |= validate_struct_pnext( report_data, "vkCreateGraphicsPipelines", @@ -1415,23 +1410,22 @@ if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1082b00b, LayerName, + VALIDATION_ERROR_1082b00b, "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must " - "be VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO. %s", - i, validation_error_map[VALIDATION_ERROR_1082b00b]); + "be VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO.", + i); } if (pCreateInfos[i].pTessellationState->patchControlPoints == 0 || pCreateInfos[i].pTessellationState->patchControlPoints > device_data->device_limits.maxTessellationPatchSize) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1080097c, LayerName, + VALIDATION_ERROR_1080097c, "vkCreateGraphicsPipelines: invalid parameter " "pCreateInfos[%d].pTessellationState->patchControlPoints value %u. patchControlPoints " - "should be >0 and <=%u. %s", + "should be >0 and <=%u.", i, pCreateInfos[i].pTessellationState->patchControlPoints, - device_data->device_limits.maxTessellationPatchSize, - validation_error_map[VALIDATION_ERROR_1080097c]); + device_data->device_limits.maxTessellationPatchSize); } } } @@ -1442,20 +1436,20 @@ (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) { if (pCreateInfos[i].pViewportState == nullptr) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_096005dc, LayerName, + VK_NULL_HANDLE, VALIDATION_ERROR_096005dc, "vkCreateGraphicsPipelines: Rasterization is enabled (pCreateInfos[%" PRIu32 "].pRasterizationState->rasterizerDiscardEnable is VK_FALSE), but pCreateInfos[%" PRIu32 - "].pViewportState (=NULL) is not a valid pointer. %s", - i, i, validation_error_map[VALIDATION_ERROR_096005dc]); + "].pViewportState (=NULL) is not a valid pointer.", + i, i); } else { const auto &viewport_state = *pCreateInfos[i].pViewportState; if (viewport_state.sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c2b00b, LayerName, + VK_NULL_HANDLE, VALIDATION_ERROR_10c2b00b, "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 - "].pViewportState->sType is not VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO. %s", - i, validation_error_map[VALIDATION_ERROR_10c2b00b]); + "].pViewportState->sType is not VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO.", + i); } const VkStructureType allowed_structs_VkPipelineViewportStateCreateInfo[] = { @@ -1476,83 +1470,78 @@ if (!device_data->physical_device_features.multiViewport) { if (viewport_state.viewportCount != 1) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c00980, LayerName, + VK_NULL_HANDLE, VALIDATION_ERROR_10c00980, "vkCreateGraphicsPipelines: The VkPhysicalDeviceFeatures::multiViewport feature is " "disabled, but pCreateInfos[%" PRIu32 "].pViewportState->viewportCount (=%" PRIu32 - ") is not 1. %s", - i, viewport_state.viewportCount, validation_error_map[VALIDATION_ERROR_10c00980]); + ") is not 1.", + i, viewport_state.viewportCount); } if (viewport_state.scissorCount != 1) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c00982, LayerName, + VK_NULL_HANDLE, VALIDATION_ERROR_10c00982, "vkCreateGraphicsPipelines: The VkPhysicalDeviceFeatures::multiViewport feature is " "disabled, but pCreateInfos[%" PRIu32 "].pViewportState->scissorCount (=%" PRIu32 - ") is not 1. %s", - i, viewport_state.scissorCount, validation_error_map[VALIDATION_ERROR_10c00982]); + ") is not 1.", + i, viewport_state.scissorCount); } } else { // multiViewport enabled if (viewport_state.viewportCount == 0) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c30a1b, LayerName, - "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 - "].pViewportState->viewportCount is 0. %s", - i, validation_error_map[VALIDATION_ERROR_10c30a1b]); + skip |= log_msg( + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, + VK_NULL_HANDLE, VALIDATION_ERROR_10c30a1b, + "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 "].pViewportState->viewportCount is 0.", i); } else if (viewport_state.viewportCount > device_data->device_limits.maxViewports) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c00984, LayerName, + VK_NULL_HANDLE, VALIDATION_ERROR_10c00984, "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 "].pViewportState->viewportCount (=%" PRIu32 - ") is greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 "). %s", - i, viewport_state.viewportCount, device_data->device_limits.maxViewports, - validation_error_map[VALIDATION_ERROR_10c00984]); + ") is greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 ").", + i, viewport_state.viewportCount, device_data->device_limits.maxViewports); } if (viewport_state.scissorCount == 0) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c2b61b, LayerName, - "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 - "].pViewportState->scissorCount is 0. %s", - i, validation_error_map[VALIDATION_ERROR_10c2b61b]); + skip |= log_msg( + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, + VK_NULL_HANDLE, VALIDATION_ERROR_10c2b61b, + "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 "].pViewportState->scissorCount is 0.", i); } else if (viewport_state.scissorCount > device_data->device_limits.maxViewports) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c00986, LayerName, + VK_NULL_HANDLE, VALIDATION_ERROR_10c00986, "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 "].pViewportState->scissorCount (=%" PRIu32 - ") is greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 "). %s", - i, viewport_state.scissorCount, device_data->device_limits.maxViewports, - validation_error_map[VALIDATION_ERROR_10c00986]); + ") is greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 ").", + i, viewport_state.scissorCount, device_data->device_limits.maxViewports); } } if (viewport_state.scissorCount != viewport_state.viewportCount) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c00988, LayerName, - "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 - "].pViewportState->scissorCount (=%" PRIu32 ") is not identical to pCreateInfos[%" PRIu32 - "].pViewportState->viewportCount (=%" PRIu32 "). %s", - i, viewport_state.scissorCount, i, viewport_state.viewportCount, - validation_error_map[VALIDATION_ERROR_10c00988]); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, + VK_NULL_HANDLE, VALIDATION_ERROR_10c00988, + "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 "].pViewportState->scissorCount (=%" PRIu32 + ") is not identical to pCreateInfos[%" PRIu32 "].pViewportState->viewportCount (=%" PRIu32 ").", + i, viewport_state.scissorCount, i, viewport_state.viewportCount); } if (!has_dynamic_viewport && viewport_state.viewportCount > 0 && viewport_state.pViewports == nullptr) { skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, VK_NULL_HANDLE, - __LINE__, VALIDATION_ERROR_096005d6, LayerName, + VALIDATION_ERROR_096005d6, "vkCreateGraphicsPipelines: The viewport state is static (pCreateInfos[%" PRIu32 "].pDynamicState->pDynamicStates does not contain VK_DYNAMIC_STATE_VIEWPORT), but pCreateInfos[%" PRIu32 - "].pViewportState->pViewports (=NULL) is an invalid pointer. %s", - i, i, validation_error_map[VALIDATION_ERROR_096005d6]); + "].pViewportState->pViewports (=NULL) is an invalid pointer.", + i, i); } if (!has_dynamic_scissor && viewport_state.scissorCount > 0 && viewport_state.pScissors == nullptr) { skip |= log_msg( report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, VK_NULL_HANDLE, - __LINE__, VALIDATION_ERROR_096005d8, LayerName, + VALIDATION_ERROR_096005d8, "vkCreateGraphicsPipelines: The scissor state is static (pCreateInfos[%" PRIu32 "].pDynamicState->pDynamicStates does not contain VK_DYNAMIC_STATE_SCISSOR), but pCreateInfos[%" PRIu32 - "].pViewportState->pScissors (=NULL) is an invalid pointer. %s", - i, i, validation_error_map[VALIDATION_ERROR_096005d8]); + "].pViewportState->pScissors (=NULL) is an invalid pointer.", + i, i); } // validate the VkViewports @@ -1569,7 +1558,7 @@ if (has_dynamic_viewport_w_scaling_nv && !device_data->extensions.vk_nv_clip_space_w_scaling) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - VK_NULL_HANDLE, __LINE__, EXTENSION_NOT_ENABLED, LayerName, + VK_NULL_HANDLE, EXTENSION_NOT_ENABLED, "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 "].pDynamicState->pDynamicStates contains VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV, but " "VK_NV_clip_space_w_scaling extension is not enabled.", @@ -1578,7 +1567,7 @@ if (has_dynamic_discard_rectangle_ext && !device_data->extensions.vk_ext_discard_rectangles) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - VK_NULL_HANDLE, __LINE__, EXTENSION_NOT_ENABLED, LayerName, + VK_NULL_HANDLE, EXTENSION_NOT_ENABLED, "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 "].pDynamicState->pDynamicStates contains VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT, but " "VK_EXT_discard_rectangles extension is not enabled.", @@ -1587,7 +1576,7 @@ if (has_dynamic_sample_locations_ext && !device_data->extensions.vk_ext_sample_locations) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - VK_NULL_HANDLE, __LINE__, EXTENSION_NOT_ENABLED, LayerName, + VK_NULL_HANDLE, EXTENSION_NOT_ENABLED, "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 "].pDynamicState->pDynamicStates contains VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, but " "VK_EXT_sample_locations extension is not enabled.", @@ -1597,10 +1586,10 @@ if (pCreateInfos[i].pMultisampleState == nullptr) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_096005de, LayerName, + VALIDATION_ERROR_096005de, "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable " - "is VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL. %s", - i, i, validation_error_map[VALIDATION_ERROR_096005de]); + "is VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL.", + i, i); } else { const VkStructureType valid_next_stypes[] = {LvlTypeMap::kSType, LvlTypeMap::kSType, @@ -1628,7 +1617,7 @@ report_data, "vkCreateGraphicsPipelines", ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}), ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}), - pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, + pCreateInfos[i].pMultisampleState->rasterizationSamples, &pCreateInfos[i].pMultisampleState->pSampleMask, true, false, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED); skip |= validate_bool32( @@ -1643,7 +1632,7 @@ if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, INVALID_STRUCT_STYPE, LayerName, + INVALID_STRUCT_STYPE, "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be " "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO", i); @@ -1651,19 +1640,18 @@ if (pCreateInfos[i].pMultisampleState->sampleShadingEnable == VK_TRUE) { if (!device_data->physical_device_features.sampleRateShading) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_10000620, LayerName, + VALIDATION_ERROR_10000620, "vkCreateGraphicsPipelines(): parameter " - "pCreateInfos[%d].pMultisampleState->sampleShadingEnable: %s", - i, validation_error_map[VALIDATION_ERROR_10000620]); + "pCreateInfos[%d].pMultisampleState->sampleShadingEnable.", + i); } // TODO Add documentation issue about when minSampleShading must be in range and when it is ignored // For now a "least noise" test *only* when sampleShadingEnable is VK_TRUE. if (!in_inclusive_range(pCreateInfos[i].pMultisampleState->minSampleShading, 0.F, 1.0F)) { skip |= log_msg( - report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_10000624, LayerName, - "vkCreateGraphicsPipelines(): parameter pCreateInfos[%d].pMultisampleState->minSampleShading: %s", - i, validation_error_map[VALIDATION_ERROR_10000624]); + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_10000624, + "vkCreateGraphicsPipelines(): parameter pCreateInfos[%d].pMultisampleState->minSampleShading.", i); } } } @@ -1768,7 +1756,7 @@ if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, INVALID_STRUCT_STYPE, LayerName, + INVALID_STRUCT_STYPE, "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be " "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO", i); @@ -1795,7 +1783,7 @@ report_data, "vkCreateGraphicsPipelines", ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}), ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}), - pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, + pCreateInfos[i].pColorBlendState->attachmentCount, &pCreateInfos[i].pColorBlendState->pAttachments, false, true, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED); if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) { @@ -1866,7 +1854,7 @@ if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, INVALID_STRUCT_STYPE, LayerName, + INVALID_STRUCT_STYPE, "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be " "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO", i); @@ -1886,22 +1874,20 @@ if (pCreateInfos[i].basePipelineIndex != -1) { if (pCreateInfos[i].basePipelineHandle != VK_NULL_HANDLE) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_096005a8, LayerName, + VALIDATION_ERROR_096005a8, "vkCreateGraphicsPipelines 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. %s", - validation_error_map[VALIDATION_ERROR_096005a8]); + "and pCreateInfos->basePipelineIndex is not -1."); } } if (pCreateInfos[i].basePipelineHandle != VK_NULL_HANDLE) { if (pCreateInfos[i].basePipelineIndex != -1) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_096005aa, LayerName, + VALIDATION_ERROR_096005aa, "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if " "pCreateInfos->flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and " - "pCreateInfos->basePipelineHandle is not VK_NULL_HANDLE. %s", - validation_error_map[VALIDATION_ERROR_096005aa]); + "pCreateInfos->basePipelineHandle is not VK_NULL_HANDLE."); } } } @@ -1910,7 +1896,7 @@ if ((pCreateInfos[i].pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) && (device_data->physical_device_features.fillModeNonSolid == false)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DEVICE_FEATURE, LayerName, + DEVICE_FEATURE, "vkCreateGraphicsPipelines parameter, VkPolygonMode " "pCreateInfos->pRasterizationState->polygonMode cannot be VK_POLYGON_MODE_POINT or " "VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false."); @@ -1919,13 +1905,12 @@ if (!has_dynamic_line_width && !device_data->physical_device_features.wideLines && (pCreateInfos[i].pRasterizationState->lineWidth != 1.0f)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, 0, __LINE__, VALIDATION_ERROR_096005da, LayerName, + VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, 0, VALIDATION_ERROR_096005da, "The line width state is static (pCreateInfos[%" PRIu32 "].pDynamicState->pDynamicStates does not contain VK_DYNAMIC_STATE_LINE_WIDTH) and " "VkPhysicalDeviceFeatures::wideLines is disabled, but pCreateInfos[%" PRIu32 - "].pRasterizationState->lineWidth (=%f) is not 1.0. %s", - i, i, pCreateInfos[i].pRasterizationState->lineWidth, - validation_error_map[VALIDATION_ERROR_096005da]); + "].pRasterizationState->lineWidth (=%f) is not 1.0.", + i, i, pCreateInfos[i].pRasterizationState->lineWidth); } } @@ -1966,29 +1951,27 @@ const auto &limits = device_data->device_limits; if (pCreateInfo->anisotropyEnable == VK_TRUE) { if (!in_inclusive_range(pCreateInfo->maxAnisotropy, 1.0F, limits.maxSamplerAnisotropy)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_1260085e, LayerName, - "vkCreateSampler(): value of %s must be in range [1.0, %f] %s, but %f found. %s", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_1260085e, + "vkCreateSampler(): value of %s must be in range [1.0, %f] %s, but %f found.", "pCreateInfo->maxAnisotropy", limits.maxSamplerAnisotropy, - "VkPhysicalDeviceLimits::maxSamplerAnistropy", pCreateInfo->maxAnisotropy, - validation_error_map[VALIDATION_ERROR_1260085e]); + "VkPhysicalDeviceLimits::maxSamplerAnistropy", pCreateInfo->maxAnisotropy); } // Anistropy cannot be enabled in sampler unless enabled as a feature if (features.samplerAnisotropy == VK_FALSE) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_1260085c, LayerName, - "vkCreateSampler(): Anisotropic sampling feature is not enabled, %s must be VK_FALSE. %s", - "pCreateInfo->anisotropyEnable", validation_error_map[VALIDATION_ERROR_1260085c]); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_1260085c, + "vkCreateSampler(): Anisotropic sampling feature is not enabled, %s must be VK_FALSE.", + "pCreateInfo->anisotropyEnable"); } // Anistropy and unnormalized coordinates cannot be enabled simultaneously if (pCreateInfo->unnormalizedCoordinates == VK_TRUE) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_12600868, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_12600868, "vkCreateSampler(): pCreateInfo->anisotropyEnable and pCreateInfo->unnormalizedCoordinates must " - "not both be VK_TRUE. %s", - validation_error_map[VALIDATION_ERROR_12600868]); + "not both be VK_TRUE."); } } @@ -2013,23 +1996,20 @@ ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE) || (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE) || (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE))) { - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_1260086e, LayerName, - "vkCreateSampler(): A VkSamplerAddressMode value is set to VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE " - "but the VK_KHR_sampler_mirror_clamp_to_edge extension has not been enabled. %s", - validation_error_map[VALIDATION_ERROR_1260086e]); + skip |= log_msg( + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, VALIDATION_ERROR_1260086e, + "vkCreateSampler(): A VkSamplerAddressMode value is set to VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE " + "but the VK_KHR_sampler_mirror_clamp_to_edge extension has not been enabled."); } // Checks for the IMG cubic filtering extension if (device_data->extensions.vk_img_filter_cubic) { if ((pCreateInfo->anisotropyEnable == VK_TRUE) && ((pCreateInfo->minFilter == VK_FILTER_CUBIC_IMG) || (pCreateInfo->magFilter == VK_FILTER_CUBIC_IMG))) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_12600872, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_12600872, "vkCreateSampler(): Anisotropic sampling must not be VK_TRUE when either minFilter or magFilter " - "are VK_FILTER_CUBIC_IMG. %s", - validation_error_map[VALIDATION_ERROR_12600872]); + "are VK_FILTER_CUBIC_IMG."); } } } @@ -2057,7 +2037,7 @@ ++descriptor_index) { if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, REQUIRED_PARAMETER, LayerName, + REQUIRED_PARAMETER, "vkCreateDescriptorSetLayout: required parameter " "pCreateInfo->pBindings[%d].pImmutableSamplers[%d] specified as VK_NULL_HANDLE", i, descriptor_index); @@ -2069,11 +2049,11 @@ if ((pCreateInfo->pBindings[i].stageFlags != 0) && ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_04e00236, LayerName, + VALIDATION_ERROR_04e00236, "vkCreateDescriptorSetLayout(): if pCreateInfo->pBindings[%d].descriptorCount is not 0, " "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits " - "values. %s", - i, i, validation_error_map[VALIDATION_ERROR_04e00236]); + "values.", + i, i); } } } @@ -2092,7 +2072,7 @@ // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond // validate_array() skip |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount, - pDescriptorSets, true, true, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED); + &pDescriptorSets, true, true, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED); return skip; } @@ -2108,10 +2088,9 @@ // descriptorCount must be greater than 0 if (pDescriptorWrites[i].descriptorCount == 0) { skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_15c0441b, LayerName, - "vkUpdateDescriptorSets(): parameter pDescriptorWrites[%d].descriptorCount must be greater than 0. %s", - i, validation_error_map[VALIDATION_ERROR_15c0441b]); + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_15c0441b, + "vkUpdateDescriptorSets(): parameter pDescriptorWrites[%d].descriptorCount must be greater than 0.", i); } // dstSet must be a valid VkDescriptorSet handle @@ -2129,12 +2108,12 @@ // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures if (pDescriptorWrites[i].pImageInfo == nullptr) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_15c00284, LayerName, + VALIDATION_ERROR_15c00284, "vkUpdateDescriptorSets(): if pDescriptorWrites[%d].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, pDescriptorWrites[%d].pImageInfo must not be NULL. %s", - i, i, validation_error_map[VALIDATION_ERROR_15c00284]); + "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL.", + 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 @@ -2162,12 +2141,12 @@ // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures if (pDescriptorWrites[i].pBufferInfo == nullptr) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_15c00288, LayerName, + VALIDATION_ERROR_15c00288, "vkUpdateDescriptorSets(): if pDescriptorWrites[%d].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, " - "pDescriptorWrites[%d].pBufferInfo must not be NULL. %s", - i, i, validation_error_map[VALIDATION_ERROR_15c00288]); + "pDescriptorWrites[%d].pBufferInfo must not be NULL.", + i, i); } else { for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) { skip |= validate_required_handle(report_data, "vkUpdateDescriptorSets", @@ -2182,11 +2161,11 @@ // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles if (pDescriptorWrites[i].pTexelBufferView == nullptr) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_15c00286, LayerName, + VALIDATION_ERROR_15c00286, "vkUpdateDescriptorSets(): 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. %s", - i, i, validation_error_map[VALIDATION_ERROR_15c00286]); + "pDescriptorWrites[%d].pTexelBufferView must not be NULL.", + i, i); } else { for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount; ++descriptor_index) { @@ -2204,13 +2183,12 @@ for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) { if (pDescriptorWrites[i].pBufferInfo != NULL) { if (SafeModulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) { - skip |= log_msg( - device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, VALIDATION_ERROR_15c0028e, LayerName, - "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64 - ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64 ". %s", - i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment, - validation_error_map[VALIDATION_ERROR_15c0028e]); + skip |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, VALIDATION_ERROR_15c0028e, + "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64 + ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64 ".", + i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment); } } } @@ -2220,13 +2198,12 @@ for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) { if (pDescriptorWrites[i].pBufferInfo != NULL) { if (SafeModulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) { - skip |= log_msg( - device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, VALIDATION_ERROR_15c00290, LayerName, - "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64 - ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64 ". %s", - i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment, - validation_error_map[VALIDATION_ERROR_15c00290]); + skip |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, VALIDATION_ERROR_15c00290, + "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64 + ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64 ".", + i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment); } } } @@ -2245,28 +2222,25 @@ for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) { if (pCreateInfo->pAttachments[i].format == VK_FORMAT_UNDEFINED) { std::stringstream ss; - ss << "vkCreateRenderPass: pCreateInfo->pAttachments[" << i << "].format is VK_FORMAT_UNDEFINED. " - << validation_error_map[VALIDATION_ERROR_00809201]; + ss << "vkCreateRenderPass: pCreateInfo->pAttachments[" << i << "].format is VK_FORMAT_UNDEFINED. "; skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_00809201, "IMAGE", "%s", ss.str().c_str()); + VALIDATION_ERROR_00809201, "%s", ss.str().c_str()); } if (pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_UNDEFINED || pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_PREINITIALIZED) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_00800696, "DL", + VALIDATION_ERROR_00800696, "pCreateInfo->pAttachments[%d].finalLayout must not be VK_IMAGE_LAYOUT_UNDEFINED or " - "VK_IMAGE_LAYOUT_PREINITIALIZED. %s", - i, validation_error_map[VALIDATION_ERROR_00800696]); + "VK_IMAGE_LAYOUT_PREINITIALIZED.", + i); } } for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) { if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1400069a, "DL", - "Cannot create a render pass with %d color attachments. Max is %d. %s", - pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments, - validation_error_map[VALIDATION_ERROR_1400069a]); + VALIDATION_ERROR_1400069a, "Cannot create a render pass with %d color attachments. Max is %d.", + pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments); } } return skip; @@ -2282,7 +2256,7 @@ // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond // validate_array() skip |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount, - pCommandBuffers, true, true, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED); + &pCommandBuffers, true, true, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED); return skip; } @@ -2319,10 +2293,9 @@ if (pInfo != NULL) { if ((device_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_02a00070, LayerName, + HandleToUint64(commandBuffer), VALIDATION_ERROR_02a00070, "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support " - "inheritedQueries. %s", - validation_error_map[VALIDATION_ERROR_02a00070]); + "inheritedQueries."); } if ((device_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) { skip |= validate_flags(device_data->report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags", @@ -2341,28 +2314,25 @@ if (!device_data->physical_device_features.multiViewport) { if (firstViewport != 0) { - skip |= - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1e000990, LayerName, - "vkCmdSetViewport: The multiViewport feature is disabled, but firstViewport (=%" PRIu32 ") is not 0. %s", - firstViewport, validation_error_map[VALIDATION_ERROR_1e000990]); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1e000990, + "vkCmdSetViewport: The multiViewport feature is disabled, but firstViewport (=%" PRIu32 ") is not 0.", + firstViewport); } if (viewportCount > 1) { - skip |= - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1e000992, LayerName, - "vkCmdSetViewport: The multiViewport feature is disabled, but viewportCount (=%" PRIu32 ") is not 1. %s", - viewportCount, validation_error_map[VALIDATION_ERROR_1e000992]); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1e000992, + "vkCmdSetViewport: The multiViewport feature is disabled, but viewportCount (=%" PRIu32 ") is not 1.", + viewportCount); } } else { // multiViewport enabled - const uint64_t sum = (uint64_t)firstViewport + viewportCount; + const uint64_t sum = static_cast(firstViewport) + static_cast(viewportCount); if (sum > device_data->device_limits.maxViewports) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1e00098e, LayerName, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1e00098e, "vkCmdSetViewport: firstViewport + viewportCount (=%" PRIu32 " + %" PRIu32 " = %" PRIu64 - ") is greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 "). %s", - firstViewport, viewportCount, sum, device_data->device_limits.maxViewports, - validation_error_map[VALIDATION_ERROR_1e00098e]); + ") is greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 ").", + firstViewport, viewportCount, sum, device_data->device_limits.maxViewports); } } @@ -2384,46 +2354,68 @@ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); debug_report_data *report_data = device_data->report_data; - if (device_data->physical_device_features.multiViewport == false) { - if (scissorCount != 1) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DEVICE_FEATURE, LayerName, - "vkCmdSetScissor(): The multiViewport feature is not enabled, so scissorCount must be 1 but is %d.", - scissorCount); - } + if (!device_data->physical_device_features.multiViewport) { if (firstScissor != 0) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DEVICE_FEATURE, LayerName, - "vkCmdSetScissor(): The multiViewport feature is not enabled, so firstScissor must be 0 but is %d.", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1d8004a2, + "vkCmdSetScissor: The multiViewport feature is disabled, but firstScissor (=%" PRIu32 ") is not 0.", firstScissor); } + if (scissorCount > 1) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1d8004a4, + "vkCmdSetScissor: The multiViewport feature is disabled, but scissorCount (=%" PRIu32 ") is not 1.", + scissorCount); + } + } else { // multiViewport enabled + const uint64_t sum = static_cast(firstScissor) + static_cast(scissorCount); + if (sum > device_data->device_limits.maxViewports) { + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1d8004a0, + "vkCmdSetScissor: firstScissor + scissorCount (=%" PRIu32 " + %" PRIu32 " = %" PRIu64 + ") is greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 ").", + firstScissor, scissorCount, sum, device_data->device_limits.maxViewports); + } } - for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex) { - const VkRect2D &pScissor = pScissors[scissorIndex]; - - if (pScissor.offset.x < 0) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_1d8004a6, LayerName, "vkCmdSetScissor %d: offset.x (%d) must not be negative. %s", - scissorIndex, pScissor.offset.x, validation_error_map[VALIDATION_ERROR_1d8004a6]); - } else if (static_cast(pScissor.extent.width) > (INT_MAX - pScissor.offset.x)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_1d8004a8, LayerName, - "vkCmdSetScissor %d: adding offset.x (%d) and extent.width (%u) will overflow. %s", scissorIndex, - pScissor.offset.x, pScissor.extent.width, validation_error_map[VALIDATION_ERROR_1d8004a8]); - } - - if (pScissor.offset.y < 0) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_1d8004a6, LayerName, "vkCmdSetScissor %d: offset.y (%d) must not be negative. %s", - scissorIndex, pScissor.offset.y, validation_error_map[VALIDATION_ERROR_1d8004a6]); - } else if (static_cast(pScissor.extent.height) > (INT_MAX - pScissor.offset.y)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_1d8004aa, LayerName, - "vkCmdSetScissor %d: adding offset.y (%d) and extent.height (%u) will overflow. %s", scissorIndex, - pScissor.offset.y, pScissor.extent.height, validation_error_map[VALIDATION_ERROR_1d8004aa]); + 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 |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1d8004a6, + "vkCmdSetScissor: pScissors[%" PRIu32 "].offset.x (=%" PRIi32 ") is negative.", scissor_i, + scissor.offset.x); + } + + if (scissor.offset.y < 0) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1d8004a6, + "vkCmdSetScissor: pScissors[%" PRIu32 "].offset.y (=%" PRIi32 ") is negative.", scissor_i, + scissor.offset.y); + } + + const int64_t x_sum = static_cast(scissor.offset.x) + static_cast(scissor.extent.width); + if (x_sum > INT32_MAX) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1d8004a8, + "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(scissor.offset.y) + static_cast(scissor.extent.height); + if (y_sum > INT32_MAX) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_1d8004aa, + "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; } @@ -2434,9 +2426,8 @@ if (!device_data->physical_device_features.wideLines && (lineWidth != 1.0f)) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1d600628, LayerName, - "VkPhysicalDeviceFeatures::wideLines is disabled, but lineWidth (=%f) is not 1.0. %s", lineWidth, - validation_error_map[VALIDATION_ERROR_1d600628]); + HandleToUint64(commandBuffer), VALIDATION_ERROR_1d600628, + "VkPhysicalDeviceFeatures::wideLines is disabled, but lineWidth (=%f) is not 1.0.", lineWidth); } return skip; @@ -2450,14 +2441,14 @@ // TODO: Verify against Valid Usage section. I don't see a non-zero vertexCount listed, may need to add that and make // this an error or leave as is. skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0"); + REQUIRED_PARAMETER, "vkCmdDraw parameter, uint32_t vertexCount, is 0"); } if (instanceCount == 0) { // TODO: Verify against Valid Usage section. I don't see a non-zero instanceCount listed, may need to add that and make // this an error or leave as is. skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0"); + REQUIRED_PARAMETER, "vkCmdDraw parameter, uint32_t instanceCount, is 0"); } return skip; } @@ -2468,7 +2459,7 @@ if (!device_data->physical_device_features.multiDrawIndirect && ((count > 1))) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, DEVICE_FEATURE, LayerName, + DEVICE_FEATURE, "CmdDrawIndirect(): Device feature multiDrawIndirect disabled: count must be 0 or 1 but is %d", count); } return skip; @@ -2479,10 +2470,9 @@ bool skip = false; layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!device_data->physical_device_features.multiDrawIndirect && ((count > 1))) { - skip |= - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DEVICE_FEATURE, LayerName, - "CmdDrawIndexedIndirect(): Device feature multiDrawIndirect disabled: count must be 0 or 1 but is %d", count); + skip |= log_msg( + device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, DEVICE_FEATURE, + "CmdDrawIndexedIndirect(): Device feature multiDrawIndirect disabled: count must be 0 or 1 but is %d", count); } return skip; } @@ -2492,22 +2482,24 @@ bool skip = false; layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); + VkImageAspectFlags legal_aspect_flags = + VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT; + if (device_data->extensions.vk_khr_sampler_ycbcr_conversion) { + legal_aspect_flags |= (VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } + if (pRegions != nullptr) { - if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) { + if ((pRegions->srcSubresource.aspectMask & legal_aspect_flags) == 0) { skip |= log_msg( - device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0a600c01, LayerName, - "vkCmdCopyImage() parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator. %s", - validation_error_map[VALIDATION_ERROR_0a600c01]); + device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0a600c01, + "vkCmdCopyImage() parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator."); } - if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) { + if ((pRegions->dstSubresource.aspectMask & legal_aspect_flags) == 0) { skip |= log_msg( - device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_0a600c01, LayerName, - "vkCmdCopyImage() parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator. %s", - validation_error_map[VALIDATION_ERROR_0a600c01]); + device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_0a600c01, + "vkCmdCopyImage() parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator."); } } return skip; @@ -2518,19 +2510,23 @@ bool skip = false; layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); + VkImageAspectFlags legal_aspect_flags = + VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT; + if (device_data->extensions.vk_khr_sampler_ycbcr_conversion) { + legal_aspect_flags |= (VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } + if (pRegions != nullptr) { - if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) { + if ((pRegions->srcSubresource.aspectMask & legal_aspect_flags) == 0) { skip |= log_msg( - device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - UNRECOGNIZED_VALUE, LayerName, + device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + UNRECOGNIZED_VALUE, "vkCmdBlitImage() parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator"); } - if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) { + if ((pRegions->dstSubresource.aspectMask & legal_aspect_flags) == 0) { skip |= log_msg( - device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - UNRECOGNIZED_VALUE, LayerName, + device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + UNRECOGNIZED_VALUE, "vkCmdBlitImage() parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator"); } } @@ -2542,11 +2538,16 @@ bool skip = false; layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); + VkImageAspectFlags legal_aspect_flags = + VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT; + if (device_data->extensions.vk_khr_sampler_ycbcr_conversion) { + legal_aspect_flags |= (VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } + if (pRegions != nullptr) { - if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) { + if ((pRegions->imageSubresource.aspectMask & legal_aspect_flags) == 0) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, UNRECOGNIZED_VALUE, LayerName, + UNRECOGNIZED_VALUE, "vkCmdCopyBufferToImage() parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an " "unrecognized enumerator"); } @@ -2559,11 +2560,16 @@ bool skip = false; layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); + VkImageAspectFlags legal_aspect_flags = + VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT; + if (device_data->extensions.vk_khr_sampler_ycbcr_conversion) { + legal_aspect_flags |= (VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | VK_IMAGE_ASPECT_PLANE_2_BIT_KHR); + } + if (pRegions != nullptr) { - if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | - VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) { - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - UNRECOGNIZED_VALUE, LayerName, + if ((pRegions->imageSubresource.aspectMask & legal_aspect_flags) == 0) { + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + UNRECOGNIZED_VALUE, "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized " "enumerator"); } @@ -2578,22 +2584,22 @@ if (dstOffset & 3) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1e400048, LayerName, - "vkCmdUpdateBuffer() parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4. %s", - dstOffset, validation_error_map[VALIDATION_ERROR_1e400048]); + VALIDATION_ERROR_1e400048, + "vkCmdUpdateBuffer() parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4.", + dstOffset); } if ((dataSize <= 0) || (dataSize > 65536)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1e40004a, LayerName, + VALIDATION_ERROR_1e40004a, "vkCmdUpdateBuffer() parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 - "), must be greater than zero and less than or equal to 65536. %s", - dataSize, validation_error_map[VALIDATION_ERROR_1e40004a]); + "), must be greater than zero and less than or equal to 65536.", + dataSize); } else if (dataSize & 3) { - skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1e40004c, LayerName, - "vkCmdUpdateBuffer() parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4. %s", - dataSize, validation_error_map[VALIDATION_ERROR_1e40004c]); + skip |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_1e40004c, + "vkCmdUpdateBuffer() parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4.", dataSize); } return skip; } @@ -2604,23 +2610,22 @@ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (dstOffset & 3) { - skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1b400032, LayerName, - "vkCmdFillBuffer() parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4. %s", - dstOffset, validation_error_map[VALIDATION_ERROR_1b400032]); + skip |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_1b400032, + "vkCmdFillBuffer() parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4.", dstOffset); } if (size != VK_WHOLE_SIZE) { if (size <= 0) { - skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1b400034, LayerName, - "vkCmdFillBuffer() parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero. %s", - size, validation_error_map[VALIDATION_ERROR_1b400034]); + skip |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_1b400034, + "vkCmdFillBuffer() parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero.", size); } else if (size & 3) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_1b400038, LayerName, - "vkCmdFillBuffer() parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4. %s", size, - validation_error_map[VALIDATION_ERROR_1b400038]); + VALIDATION_ERROR_1b400038, + "vkCmdFillBuffer() parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4.", size); } } return skip; @@ -2652,7 +2657,7 @@ instance_layer_data *local_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map); bool skip = validate_array(local_data->report_data, "vkEnumerateDeviceExtensionProperties", "pPropertyCount", "pProperties", - pPropertyCount, pProperties, true, false, false, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_2761f401); + pPropertyCount, &pProperties, true, false, false, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_2761f401); if (skip) return VK_ERROR_VALIDATION_FAILED_EXT; return local_data->dispatch_table.EnumerateDeviceExtensionProperties(physicalDevice, NULL, pPropertyCount, pProperties); @@ -2661,9 +2666,8 @@ static bool require_device_extension(layer_data *device_data, bool flag, char const *function_name, char const *extension_name) { if (!flag) { return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, EXTENSION_NOT_ENABLED, LayerName, - "%s() called even though the %s extension was not enabled for this VkDevice.", function_name, - extension_name); + EXTENSION_NOT_ENABLED, "%s() called even though the %s extension was not enabled for this VkDevice.", + function_name, extension_name); } return false; @@ -2675,15 +2679,14 @@ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); debug_report_data *report_data = device_data->report_data; - const LogMiscParams log_misc{report_data, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, VK_NULL_HANDLE, LayerName, + const LogMiscParams log_misc{report_data, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, VK_NULL_HANDLE, "vkCreateSwapchainKHR"}; if (pCreateInfo != nullptr) { if ((device_data->physical_device_features.textureCompressionETC2 == false) && FormatIsCompressed_ETC2_EAC(pCreateInfo->imageFormat)) { skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DEVICE_FEATURE, LayerName, + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, DEVICE_FEATURE, "vkCreateSwapchainKHR(): Attempting to create swapchain VkImage with format %s. The textureCompressionETC2 " "feature is not enabled: neither ETC2 nor EAC formats can be used to create images.", string_VkFormat(pCreateInfo->imageFormat)); @@ -2691,8 +2694,7 @@ if ((device_data->physical_device_features.textureCompressionASTC_LDR == false) && FormatIsCompressed_ASTC_LDR(pCreateInfo->imageFormat)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DEVICE_FEATURE, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, DEVICE_FEATURE, "vkCreateSwapchainKHR(): Attempting to create swapchain VkImage with format %s. The " "textureCompressionASTC_LDR feature is not enabled: ASTC formats cannot be used to create images.", string_VkFormat(pCreateInfo->imageFormat)); @@ -2700,8 +2702,7 @@ if ((device_data->physical_device_features.textureCompressionBC == false) && FormatIsCompressed_BC(pCreateInfo->imageFormat)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - DEVICE_FEATURE, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, DEVICE_FEATURE, "vkCreateSwapchainKHR(): Attempting to create swapchain VkImage with format %s. The " "textureCompressionBC feature is not enabled: BC compressed formats cannot be used to create images.", string_VkFormat(pCreateInfo->imageFormat)); @@ -2711,27 +2712,24 @@ if (pCreateInfo->imageSharingMode == VK_SHARING_MODE_CONCURRENT) { // If imageSharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1 if (pCreateInfo->queueFamilyIndexCount <= 1) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_146009fc, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_146009fc, "vkCreateSwapchainKHR(): if pCreateInfo->imageSharingMode is VK_SHARING_MODE_CONCURRENT, " - "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s", - validation_error_map[VALIDATION_ERROR_146009fc]); + "pCreateInfo->queueFamilyIndexCount must be greater than 1."); } // If imageSharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of // queueFamilyIndexCount uint32_t values if (pCreateInfo->pQueueFamilyIndices == nullptr) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_146009fa, LayerName, + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_146009fa, "vkCreateSwapchainKHR(): if pCreateInfo->imageSharingMode is VK_SHARING_MODE_CONCURRENT, " "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of " - "pCreateInfo->queueFamilyIndexCount uint32_t values. %s", - validation_error_map[VALIDATION_ERROR_146009fa]); + "pCreateInfo->queueFamilyIndexCount uint32_t values."); } else { - // TODO: Not in the spec VUs. Probably missing -- KhronosGroup/Vulkan-Docs#501. Update error codes when resolved. skip |= ValidateQueueFamilies(device_data, pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices, "vkCreateSwapchainKHR", "pCreateInfo->pQueueFamilyIndices", INVALID_USAGE, - INVALID_USAGE, false, "", ""); + INVALID_USAGE, false); } } @@ -2754,7 +2752,7 @@ VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME); if (present_regions->swapchainCount != pPresentInfo->swapchainCount) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, INVALID_USAGE, LayerName, + INVALID_USAGE, "QueuePresentKHR(): pPresentInfo->swapchainCount has a value of %i but VkPresentRegionsKHR " "extension swapchainCount is %i. These values must be equal.", pPresentInfo->swapchainCount, present_regions->swapchainCount); @@ -2762,12 +2760,12 @@ skip |= validate_struct_pnext(device_data->report_data, "QueuePresentKHR", "pCreateInfo->pNext->pNext", NULL, present_regions->pNext, 0, NULL, GeneratedHeaderVersion, VALIDATION_ERROR_1121c40d); skip |= validate_array(device_data->report_data, "QueuePresentKHR", "pCreateInfo->pNext->swapchainCount", - "pCreateInfo->pNext->pRegions", present_regions->swapchainCount, present_regions->pRegions, true, - false, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED); + "pCreateInfo->pNext->pRegions", present_regions->swapchainCount, &present_regions->pRegions, + true, false, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED); for (uint32_t i = 0; i < present_regions->swapchainCount; ++i) { skip |= validate_array(device_data->report_data, "QueuePresentKHR", "pCreateInfo->pNext->pRegions[].rectangleCount", "pCreateInfo->pNext->pRegions[].pRectangles", present_regions->pRegions[i].rectangleCount, - present_regions->pRegions[i].pRectangles, true, false, VALIDATION_ERROR_UNDEFINED, + &present_regions->pRegions[i].pRectangles, true, false, VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED); } } @@ -2784,9 +2782,7 @@ if (pCreateInfo->hwnd == nullptr) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, VALIDATION_ERROR_15a00a38, LayerName, - "vkCreateWin32SurfaceKHR(): hwnd must be a valid Win32 HWND but hwnd is NULL. %s", - validation_error_map[VALIDATION_ERROR_15a00a38]); + VALIDATION_ERROR_15a00a38, "vkCreateWin32SurfaceKHR(): hwnd must be a valid Win32 HWND but hwnd is NULL."); } return skip; @@ -2812,9 +2808,8 @@ if (pCreateInfo) { if (pCreateInfo->maxSets <= 0) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_0480025a, - LayerName, "vkCreateDescriptorPool(): pCreateInfo->maxSets is not greater than 0. %s", - validation_error_map[VALIDATION_ERROR_0480025a]); + VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, VK_NULL_HANDLE, VALIDATION_ERROR_0480025a, + "vkCreateDescriptorPool(): pCreateInfo->maxSets is not greater than 0."); } if (pCreateInfo->pPoolSizes) { @@ -2822,9 +2817,8 @@ if (pCreateInfo->pPoolSizes[i].descriptorCount <= 0) { skip |= log_msg( device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_04a0025c, LayerName, - "vkCreateDescriptorPool(): pCreateInfo->pPoolSizes[%" PRIu32 "].descriptorCount is not greater than 0. %s", - i, validation_error_map[VALIDATION_ERROR_04a0025c]); + VK_NULL_HANDLE, VALIDATION_ERROR_04a0025c, + "vkCreateDescriptorPool(): pCreateInfo->pPoolSizes[%" PRIu32 "].descriptorCount is not greater than 0.", i); } } } @@ -2838,27 +2832,27 @@ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (groupCountX > device_data->device_limits.maxComputeWorkGroupCount[0]) { - skip |= log_msg( - device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_19c00304, LayerName, - "vkCmdDispatch(): groupCountX (%" PRIu32 ") exceeds device limit maxComputeWorkGroupCount[0] (%" PRIu32 "). %s", - groupCountX, device_data->device_limits.maxComputeWorkGroupCount[0], validation_error_map[VALIDATION_ERROR_19c00304]); + skip |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_19c00304, + "vkCmdDispatch(): groupCountX (%" PRIu32 ") exceeds device limit maxComputeWorkGroupCount[0] (%" PRIu32 ").", + groupCountX, device_data->device_limits.maxComputeWorkGroupCount[0]); } if (groupCountY > device_data->device_limits.maxComputeWorkGroupCount[1]) { - skip |= log_msg( - device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_19c00306, LayerName, - "vkCmdDispatch(): groupCountY (%" PRIu32 ") exceeds device limit maxComputeWorkGroupCount[1] (%" PRIu32 "). %s", - groupCountY, device_data->device_limits.maxComputeWorkGroupCount[1], validation_error_map[VALIDATION_ERROR_19c00306]); + skip |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_19c00306, + "vkCmdDispatch(): groupCountY (%" PRIu32 ") exceeds device limit maxComputeWorkGroupCount[1] (%" PRIu32 ").", + groupCountY, device_data->device_limits.maxComputeWorkGroupCount[1]); } if (groupCountZ > device_data->device_limits.maxComputeWorkGroupCount[2]) { - skip |= log_msg( - device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_19c00308, LayerName, - "vkCmdDispatch(): groupCountZ (%" PRIu32 ") exceeds device limit maxComputeWorkGroupCount[2] (%" PRIu32 "). %s", - groupCountZ, device_data->device_limits.maxComputeWorkGroupCount[2], validation_error_map[VALIDATION_ERROR_19c00308]); + skip |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), VALIDATION_ERROR_19c00308, + "vkCmdDispatch(): groupCountZ (%" PRIu32 ") exceeds device limit maxComputeWorkGroupCount[2] (%" PRIu32 ").", + groupCountZ, device_data->device_limits.maxComputeWorkGroupCount[2]); } return skip; @@ -2873,46 +2867,46 @@ uint32_t limit = device_data->device_limits.maxComputeWorkGroupCount[0]; if (baseGroupX >= limit) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_19e0034a, LayerName, + HandleToUint64(commandBuffer), VALIDATION_ERROR_19e0034a, "vkCmdDispatch(): baseGroupX (%" PRIu32 - ") equals or exceeds device limit maxComputeWorkGroupCount[0] (%" PRIu32 "). %s", - baseGroupX, limit, validation_error_map[VALIDATION_ERROR_19e0034a]); + ") equals or exceeds device limit maxComputeWorkGroupCount[0] (%" PRIu32 ").", + baseGroupX, limit); } else if (groupCountX > (limit - baseGroupX)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_19e00350, LayerName, + HandleToUint64(commandBuffer), VALIDATION_ERROR_19e00350, "vkCmdDispatchBaseKHR(): baseGroupX (%" PRIu32 ") + groupCountX (%" PRIu32 - ") exceeds device limit maxComputeWorkGroupCount[0] (%" PRIu32 "). %s", - baseGroupX, groupCountX, limit, validation_error_map[VALIDATION_ERROR_19e00350]); + ") exceeds device limit maxComputeWorkGroupCount[0] (%" PRIu32 ").", + baseGroupX, groupCountX, limit); } limit = device_data->device_limits.maxComputeWorkGroupCount[1]; if (baseGroupY >= limit) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_19e0034c, LayerName, + HandleToUint64(commandBuffer), VALIDATION_ERROR_19e0034c, "vkCmdDispatch(): baseGroupY (%" PRIu32 - ") equals or exceeds device limit maxComputeWorkGroupCount[1] (%" PRIu32 "). %s", - baseGroupY, limit, validation_error_map[VALIDATION_ERROR_19e0034c]); + ") equals or exceeds device limit maxComputeWorkGroupCount[1] (%" PRIu32 ").", + baseGroupY, limit); } else if (groupCountY > (limit - baseGroupY)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_19e00352, LayerName, + HandleToUint64(commandBuffer), VALIDATION_ERROR_19e00352, "vkCmdDispatchBaseKHR(): baseGroupY (%" PRIu32 ") + groupCountY (%" PRIu32 - ") exceeds device limit maxComputeWorkGroupCount[1] (%" PRIu32 "). %s", - baseGroupY, groupCountY, limit, validation_error_map[VALIDATION_ERROR_19e00352]); + ") exceeds device limit maxComputeWorkGroupCount[1] (%" PRIu32 ").", + baseGroupY, groupCountY, limit); } limit = device_data->device_limits.maxComputeWorkGroupCount[2]; if (baseGroupZ >= limit) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_19e0034e, LayerName, + HandleToUint64(commandBuffer), VALIDATION_ERROR_19e0034e, "vkCmdDispatch(): baseGroupZ (%" PRIu32 - ") equals or exceeds device limit maxComputeWorkGroupCount[2] (%" PRIu32 "). %s", - baseGroupZ, limit, validation_error_map[VALIDATION_ERROR_19e0034e]); + ") equals or exceeds device limit maxComputeWorkGroupCount[2] (%" PRIu32 ").", + baseGroupZ, limit); } else if (groupCountZ > (limit - baseGroupZ)) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_19e00354, LayerName, + HandleToUint64(commandBuffer), VALIDATION_ERROR_19e00354, "vkCmdDispatchBaseKHR(): baseGroupZ (%" PRIu32 ") + groupCountZ (%" PRIu32 - ") exceeds device limit maxComputeWorkGroupCount[2] (%" PRIu32 "). %s", - baseGroupZ, groupCountZ, limit, validation_error_map[VALIDATION_ERROR_19e00354]); + ") exceeds device limit maxComputeWorkGroupCount[2] (%" PRIu32 ").", + baseGroupZ, groupCountZ, limit); } return skip; diff -Nru vulkan-1.1.70+dfsg1/layers/shader_validation.cpp vulkan-1.1.73+dfsg/layers/shader_validation.cpp --- vulkan-1.1.70+dfsg1/layers/shader_validation.cpp 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/shader_validation.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -171,6 +171,8 @@ return "image"; case spv::StorageClassPushConstant: return "push constant"; + case spv::StorageClassStorageBuffer: + return "storage buffer"; default: return "unknown"; } @@ -641,10 +643,47 @@ return out; } +static bool is_writable_descriptor_type(shader_module const *module, uint32_t type_id) { + 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. + while (type.opcode() == spv::OpTypeArray || type.opcode() == spv::OpTypePointer) { + if (type.opcode() == spv::OpTypeArray) { + type = module->get_def(type.word(2)); + } else { + if (type.word(2) == spv::StorageClassStorageBuffer) { + return true; + } + type = module->get_def(type.word(3)); + } + } + + switch (type.opcode()) { + case spv::OpTypeImage: { + auto dim = type.word(3); + auto sampled = type.word(7); + return sampled == 2 && dim != spv::DimSubpassData; + } + + case spv::OpTypeStruct: + for (auto insn : *module) { + if (insn.opcode() == spv::OpDecorate && insn.word(1) == type.word(1)) { + if (insn.word(2) == spv::DecorationBufferBlock) { + return true; + } + } + } + } + + return false; +} + static std::vector> collect_interface_by_descriptor_slot( - debug_report_data const *report_data, shader_module const *src, std::unordered_set const &accessible_ids) { + debug_report_data const *report_data, shader_module const *src, std::unordered_set const &accessible_ids, + bool *has_writable_descriptor) { std::unordered_map var_sets; std::unordered_map var_bindings; + std::unordered_map var_nonwritable; for (auto insn : *src) { // All variables in the Uniform or UniformConstant storage classes are required to be decorated with both @@ -657,6 +696,10 @@ if (insn.word(2) == spv::DecorationBinding) { var_bindings[insn.word(1)] = insn.word(3); } + + if (insn.word(2) == spv::DecorationNonWritable) { + var_nonwritable[insn.word(1)] = 1; + } } } @@ -667,7 +710,8 @@ assert(insn != src->end()); if (insn.opcode() == spv::OpVariable && - (insn.word(3) == spv::StorageClassUniform || insn.word(3) == spv::StorageClassUniformConstant)) { + (insn.word(3) == spv::StorageClassUniform || insn.word(3) == spv::StorageClassUniformConstant || + insn.word(3) == spv::StorageClassStorageBuffer)) { unsigned set = value_or_default(var_sets, insn.word(2), 0); unsigned binding = value_or_default(var_bindings, insn.word(2), 0); @@ -675,6 +719,10 @@ v.id = insn.word(2); v.type_id = insn.word(1); out.emplace_back(std::make_pair(set, binding), v); + + if (var_nonwritable.find(id) == var_nonwritable.end() && is_writable_descriptor_type(src, insn.word(1))) { + *has_writable_descriptor = true; + } } } @@ -692,8 +740,8 @@ auto &binding = bindings[desc->binding]; if (binding) { // TODO: VALIDATION_ERROR_096005cc perhaps? - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_INCONSISTENT_VI, "SC", "Duplicate vertex input binding descriptions for binding %d", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_INCONSISTENT_VI, "Duplicate vertex input binding descriptions for binding %d", desc->binding); } else { binding = desc; @@ -731,16 +779,16 @@ auto b_first = b_at_end ? 0 : it_b->first.first; if (!a_at_end && (b_at_end || a_first < b_first)) { if (!used && log_msg(report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, - 0, __LINE__, SHADER_CHECKER_OUTPUT_NOT_CONSUMED, "SC", + 0, SHADER_CHECKER_OUTPUT_NOT_CONSUMED, "Vertex attribute at location %d not consumed by vertex shader", a_first)) { skip = true; } used = false; it_a++; } else if (!b_at_end && (a_at_end || b_first < a_first)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, 0, __LINE__, - SHADER_CHECKER_INPUT_NOT_PRODUCED, "SC", "Vertex shader consumes input at location %d but not provided", - b_first); + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, 0, + SHADER_CHECKER_INPUT_NOT_PRODUCED, "Vertex shader consumes input at location %d but not provided", b_first); it_b++; } else { unsigned attrib_type = get_format_type(it_a->second->format); @@ -748,8 +796,8 @@ // Type checking if (!(attrib_type & input_type)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_INTERFACE_TYPE_MISMATCH, "SC", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_INTERFACE_TYPE_MISMATCH, "Attribute type of `%s` at location %d does not match vertex shader input type of `%s`", string_VkFormat(it_a->second->format), a_first, describe_type(vs, it_b->second.type_id).c_str()); } @@ -794,17 +842,16 @@ bool b_at_end = color_attachments.size() == 0 || it_b == color_attachments.end(); if (!a_at_end && (b_at_end || it_a->first.first < it_b->first)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_OUTPUT_NOT_CONSUMED, "SC", + skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_OUTPUT_NOT_CONSUMED, "fragment shader writes to output location %d with no matching attachment", it_a->first.first); it_a++; } else if (!b_at_end && (a_at_end || it_a->first.first > it_b->first)) { // Only complain if there are unmasked channels for this attachment. If the writemask is 0, it's acceptable for the // shader to not produce a matching output. if (pipeline->attachments[it_b->first].colorWriteMask != 0) { - skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_INPUT_NOT_PRODUCED, "SC", "Attachment %d not written by fragment shader", it_b->first); + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_INPUT_NOT_PRODUCED, "Attachment %d not written by fragment shader", it_b->first); } it_b++; } else { @@ -813,8 +860,8 @@ // Type checking if (!(output_type & att_type)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_INTERFACE_TYPE_MISMATCH, "SC", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_INTERFACE_TYPE_MISMATCH, "Attachment %d of type `%s` does not match fragment shader output type of `%s`", it_b->first, string_VkFormat(it_b->second), describe_type(fs, it_a->second.type_id).c_str()); } @@ -972,7 +1019,7 @@ if ((range.stageFlags & stage) == 0) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, SHADER_CHECKER_PUSH_CONSTANT_NOT_ACCESSIBLE_FROM_STAGE, "SC", + SHADER_CHECKER_PUSH_CONSTANT_NOT_ACCESSIBLE_FROM_STAGE, "Push constant range covering variable starting at offset %u not accessible from stage %s", offset, string_VkShaderStageFlagBits(stage)); } @@ -983,7 +1030,7 @@ if (!found_range) { skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, SHADER_CHECKER_PUSH_CONSTANT_OUT_OF_RANGE, "SC", + SHADER_CHECKER_PUSH_CONSTANT_OUT_OF_RANGE, "Push constant range covering variable starting at offset %u not declared in layout", offset); } } @@ -1019,13 +1066,12 @@ for (auto i = 0u; i < spec->mapEntryCount; i++) { // TODO: This is a good place for VALIDATION_ERROR_1360060a. if (spec->pMapEntries[i].offset + spec->pMapEntries[i].size > spec->dataSize) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, 0, __LINE__, - VALIDATION_ERROR_1360060c, "SC", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, 0, + VALIDATION_ERROR_1360060c, "Specialization entry %u (for constant id %u) references memory outside provided specialization " - "data (bytes %u.." PRINTF_SIZE_T_SPECIFIER "; " PRINTF_SIZE_T_SPECIFIER " bytes provided). %s.", + "data (bytes %u.." PRINTF_SIZE_T_SPECIFIER "; " PRINTF_SIZE_T_SPECIFIER " bytes provided)..", i, spec->pMapEntries[i].constantID, spec->pMapEntries[i].offset, - spec->pMapEntries[i].offset + spec->pMapEntries[i].size - 1, spec->dataSize, - validation_error_map[VALIDATION_ERROR_1360060c]); + spec->pMapEntries[i].offset + spec->pMapEntries[i].size - 1, spec->dataSize); } } } @@ -1036,15 +1082,21 @@ static bool descriptor_type_match(shader_module const *module, uint32_t type_id, VkDescriptorType descriptor_type, unsigned &descriptor_count) { auto type = module->get_def(type_id); - + bool is_storage_buffer = false; descriptor_count = 1; // Strip off any array or ptrs. Where we remove array levels, adjust the descriptor count for each dimension. - while (type.opcode() == spv::OpTypeArray || type.opcode() == spv::OpTypePointer) { - if (type.opcode() == spv::OpTypeArray) { + while (type.opcode() == spv::OpTypeArray || type.opcode() == spv::OpTypePointer || type.opcode() == spv::OpTypeRuntimeArray) { + if (type.opcode() == spv::OpTypeRuntimeArray) { + descriptor_count = 0; + type = module->get_def(type.word(2)); + } else if (type.opcode() == spv::OpTypeArray) { descriptor_count *= get_constant_value(module, type.word(3)); type = module->get_def(type.word(2)); } else { + if (type.word(2) == spv::StorageClassStorageBuffer) { + is_storage_buffer = true; + } type = module->get_def(type.word(3)); } } @@ -1054,8 +1106,13 @@ for (auto insn : *module) { if (insn.opcode() == spv::OpDecorate && insn.word(1) == type.word(1)) { if (insn.word(2) == spv::DecorationBlock) { - return descriptor_type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER || - descriptor_type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; + if (is_storage_buffer) { + return descriptor_type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER || + descriptor_type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC; + } else { + return descriptor_type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER || + descriptor_type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; + } } else if (insn.word(2) == spv::DecorationBufferBlock) { return descriptor_type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER || descriptor_type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC; @@ -1111,9 +1168,8 @@ static bool require_feature(debug_report_data const *report_data, VkBool32 feature, char const *feature_name) { if (!feature) { - if (log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_FEATURE_NOT_ENABLED, "SC", - "Shader requires VkPhysicalDeviceFeatures::%s but is not enabled on the device", feature_name)) { + if (log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_FEATURE_NOT_ENABLED, "Shader requires %s but is not enabled on the device", feature_name)) { return true; } } @@ -1123,8 +1179,8 @@ static bool require_extension(debug_report_data const *report_data, bool extension, char const *extension_name) { if (!extension) { - if (log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_FEATURE_NOT_ENABLED, "SC", "Shader requires extension %s but is not enabled on the device", + if (log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_FEATURE_NOT_ENABLED, "Shader requires extension %s but is not enabled on the device", extension_name)) { return true; } @@ -1133,22 +1189,21 @@ return false; } -static bool validate_shader_capabilities(layer_data *dev_data, shader_module const *src) { +static bool validate_shader_capabilities(layer_data *dev_data, shader_module const *src, VkShaderStageFlagBits stage, + bool has_writable_descriptor) { bool skip = false; auto report_data = GetReportData(dev_data); auto const &enabledFeatures = GetEnabledFeatures(dev_data); auto const &extensions = GetEnabledExtensions(dev_data); + auto const &descriptorIndexingFeatures = GetEnabledDescriptorIndexingFeatures(dev_data); struct CapabilityInfo { char const *name; - VkBool32 const VkPhysicalDeviceFeatures::*feature; - bool const DeviceExtensions::*extension; + VkBool32 const *feature; + bool const *extension; }; - using F = VkPhysicalDeviceFeatures; - using E = DeviceExtensions; - // clang-format off static const std::unordered_multimap capabilities = { // Capabilities always supported by a Vulkan 1.0 implementation -- no @@ -1164,41 +1219,67 @@ // Capabilities that are optionally supported, but require a feature to // be enabled on the device - {spv::CapabilityGeometry, {"geometryShader", &F::geometryShader}}, - {spv::CapabilityTessellation, {"tessellationShader", &F::tessellationShader}}, - {spv::CapabilityFloat64, {"shaderFloat64", &F::shaderFloat64}}, - {spv::CapabilityInt64, {"shaderInt64", &F::shaderInt64}}, - {spv::CapabilityTessellationPointSize, {"shaderTessellationAndGeometryPointSize", &F::shaderTessellationAndGeometryPointSize}}, - {spv::CapabilityGeometryPointSize, {"shaderTessellationAndGeometryPointSize", &F::shaderTessellationAndGeometryPointSize}}, - {spv::CapabilityImageGatherExtended, {"shaderImageGatherExtended", &F::shaderImageGatherExtended}}, - {spv::CapabilityStorageImageMultisample, {"shaderStorageImageMultisample", &F::shaderStorageImageMultisample}}, - {spv::CapabilityUniformBufferArrayDynamicIndexing, {"shaderUniformBufferArrayDynamicIndexing", &F::shaderUniformBufferArrayDynamicIndexing}}, - {spv::CapabilitySampledImageArrayDynamicIndexing, {"shaderSampledImageArrayDynamicIndexing", &F::shaderSampledImageArrayDynamicIndexing}}, - {spv::CapabilityStorageBufferArrayDynamicIndexing, {"shaderStorageBufferArrayDynamicIndexing", &F::shaderStorageBufferArrayDynamicIndexing}}, - {spv::CapabilityStorageImageArrayDynamicIndexing, {"shaderStorageImageArrayDynamicIndexing", &F::shaderStorageBufferArrayDynamicIndexing}}, - {spv::CapabilityClipDistance, {"shaderClipDistance", &F::shaderClipDistance}}, - {spv::CapabilityCullDistance, {"shaderCullDistance", &F::shaderCullDistance}}, - {spv::CapabilityImageCubeArray, {"imageCubeArray", &F::imageCubeArray}}, - {spv::CapabilitySampleRateShading, {"sampleRateShading", &F::sampleRateShading}}, - {spv::CapabilitySparseResidency, {"shaderResourceResidency", &F::shaderResourceResidency}}, - {spv::CapabilityMinLod, {"shaderResourceMinLod", &F::shaderResourceMinLod}}, - {spv::CapabilitySampledCubeArray, {"imageCubeArray", &F::imageCubeArray}}, - {spv::CapabilityImageMSArray, {"shaderStorageImageMultisample", &F::shaderStorageImageMultisample}}, - {spv::CapabilityStorageImageExtendedFormats, {"shaderStorageImageExtendedFormats", &F::shaderStorageImageExtendedFormats}}, - {spv::CapabilityInterpolationFunction, {"sampleRateShading", &F::sampleRateShading}}, - {spv::CapabilityStorageImageReadWithoutFormat, {"shaderStorageImageReadWithoutFormat", &F::shaderStorageImageReadWithoutFormat}}, - {spv::CapabilityStorageImageWriteWithoutFormat, {"shaderStorageImageWriteWithoutFormat", &F::shaderStorageImageWriteWithoutFormat}}, - {spv::CapabilityMultiViewport, {"multiViewport", &F::multiViewport}}, + {spv::CapabilityGeometry, {"VkPhysicalDeviceFeatures::geometryShader", &enabledFeatures->geometryShader}}, + {spv::CapabilityTessellation, {"VkPhysicalDeviceFeatures::tessellationShader", &enabledFeatures->tessellationShader}}, + {spv::CapabilityFloat64, {"VkPhysicalDeviceFeatures::shaderFloat64", &enabledFeatures->shaderFloat64}}, + {spv::CapabilityInt64, {"VkPhysicalDeviceFeatures::shaderInt64", &enabledFeatures->shaderInt64}}, + {spv::CapabilityTessellationPointSize, {"VkPhysicalDeviceFeatures::shaderTessellationAndGeometryPointSize", &enabledFeatures->shaderTessellationAndGeometryPointSize}}, + {spv::CapabilityGeometryPointSize, {"VkPhysicalDeviceFeatures::shaderTessellationAndGeometryPointSize", &enabledFeatures->shaderTessellationAndGeometryPointSize}}, + {spv::CapabilityImageGatherExtended, {"VkPhysicalDeviceFeatures::shaderImageGatherExtended", &enabledFeatures->shaderImageGatherExtended}}, + {spv::CapabilityStorageImageMultisample, {"VkPhysicalDeviceFeatures::shaderStorageImageMultisample", &enabledFeatures->shaderStorageImageMultisample}}, + {spv::CapabilityUniformBufferArrayDynamicIndexing, {"VkPhysicalDeviceFeatures::shaderUniformBufferArrayDynamicIndexing", &enabledFeatures->shaderUniformBufferArrayDynamicIndexing}}, + {spv::CapabilitySampledImageArrayDynamicIndexing, {"VkPhysicalDeviceFeatures::shaderSampledImageArrayDynamicIndexing", &enabledFeatures->shaderSampledImageArrayDynamicIndexing}}, + {spv::CapabilityStorageBufferArrayDynamicIndexing, {"VkPhysicalDeviceFeatures::shaderStorageBufferArrayDynamicIndexing", &enabledFeatures->shaderStorageBufferArrayDynamicIndexing}}, + {spv::CapabilityStorageImageArrayDynamicIndexing, {"VkPhysicalDeviceFeatures::shaderStorageImageArrayDynamicIndexing", &enabledFeatures->shaderStorageBufferArrayDynamicIndexing}}, + {spv::CapabilityClipDistance, {"VkPhysicalDeviceFeatures::shaderClipDistance", &enabledFeatures->shaderClipDistance}}, + {spv::CapabilityCullDistance, {"VkPhysicalDeviceFeatures::shaderCullDistance", &enabledFeatures->shaderCullDistance}}, + {spv::CapabilityImageCubeArray, {"VkPhysicalDeviceFeatures::imageCubeArray", &enabledFeatures->imageCubeArray}}, + {spv::CapabilitySampleRateShading, {"VkPhysicalDeviceFeatures::sampleRateShading", &enabledFeatures->sampleRateShading}}, + {spv::CapabilitySparseResidency, {"VkPhysicalDeviceFeatures::shaderResourceResidency", &enabledFeatures->shaderResourceResidency}}, + {spv::CapabilityMinLod, {"VkPhysicalDeviceFeatures::shaderResourceMinLod", &enabledFeatures->shaderResourceMinLod}}, + {spv::CapabilitySampledCubeArray, {"VkPhysicalDeviceFeatures::imageCubeArray", &enabledFeatures->imageCubeArray}}, + {spv::CapabilityImageMSArray, {"VkPhysicalDeviceFeatures::shaderStorageImageMultisample", &enabledFeatures->shaderStorageImageMultisample}}, + {spv::CapabilityStorageImageExtendedFormats, {"VkPhysicalDeviceFeatures::shaderStorageImageExtendedFormats", &enabledFeatures->shaderStorageImageExtendedFormats}}, + {spv::CapabilityInterpolationFunction, {"VkPhysicalDeviceFeatures::sampleRateShading", &enabledFeatures->sampleRateShading}}, + {spv::CapabilityStorageImageReadWithoutFormat, {"VkPhysicalDeviceFeatures::shaderStorageImageReadWithoutFormat", &enabledFeatures->shaderStorageImageReadWithoutFormat}}, + {spv::CapabilityStorageImageWriteWithoutFormat, {"VkPhysicalDeviceFeatures::shaderStorageImageWriteWithoutFormat", &enabledFeatures->shaderStorageImageWriteWithoutFormat}}, + {spv::CapabilityMultiViewport, {"VkPhysicalDeviceFeatures::multiViewport", &enabledFeatures->multiViewport}}, + + // XXX TODO: Descriptor indexing capability enums are not yet available in the spirv-tools we fetch. +#define CapabilityShaderNonUniformEXT 5301 +#define CapabilityRuntimeDescriptorArrayEXT 5302 +#define CapabilityInputAttachmentArrayDynamicIndexingEXT 5303 +#define CapabilityUniformTexelBufferArrayDynamicIndexingEXT 5304 +#define CapabilityStorageTexelBufferArrayDynamicIndexingEXT 5305 +#define CapabilityUniformBufferArrayNonUniformIndexingEXT 5306 +#define CapabilitySampledImageArrayNonUniformIndexingEXT 5307 +#define CapabilityStorageBufferArrayNonUniformIndexingEXT 5308 +#define CapabilityStorageImageArrayNonUniformIndexingEXT 5309 +#define CapabilityInputAttachmentArrayNonUniformIndexingEXT 5310 +#define CapabilityUniformTexelBufferArrayNonUniformIndexingEXT 5311 +#define CapabilityStorageTexelBufferArrayNonUniformIndexingEXT 5312 + {CapabilityShaderNonUniformEXT, {VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, nullptr, &extensions->vk_ext_descriptor_indexing}}, + {CapabilityRuntimeDescriptorArrayEXT, {"VkPhysicalDeviceDescriptorIndexingFeaturesEXT::runtimeDescriptorArray", &descriptorIndexingFeatures->runtimeDescriptorArray}}, + {CapabilityInputAttachmentArrayDynamicIndexingEXT, {"VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderInputAttachmentArrayDynamicIndexing", &descriptorIndexingFeatures->shaderInputAttachmentArrayDynamicIndexing}}, + {CapabilityUniformTexelBufferArrayDynamicIndexingEXT, {"VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderUniformTexelBufferArrayDynamicIndexing", &descriptorIndexingFeatures->shaderUniformTexelBufferArrayDynamicIndexing}}, + {CapabilityStorageTexelBufferArrayDynamicIndexingEXT, {"VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderStorageTexelBufferArrayDynamicIndexing", &descriptorIndexingFeatures->shaderStorageTexelBufferArrayDynamicIndexing}}, + {CapabilityUniformBufferArrayNonUniformIndexingEXT, {"VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderUniformBufferArrayNonUniformIndexing", &descriptorIndexingFeatures->shaderUniformBufferArrayNonUniformIndexing}}, + {CapabilitySampledImageArrayNonUniformIndexingEXT, {"VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderSampledImageArrayNonUniformIndexing", &descriptorIndexingFeatures->shaderSampledImageArrayNonUniformIndexing}}, + {CapabilityStorageBufferArrayNonUniformIndexingEXT, {"VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderStorageBufferArrayNonUniformIndexing", &descriptorIndexingFeatures->shaderStorageBufferArrayNonUniformIndexing}}, + {CapabilityStorageImageArrayNonUniformIndexingEXT, {"VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderStorageImageArrayNonUniformIndexing", &descriptorIndexingFeatures->shaderStorageImageArrayNonUniformIndexing}}, + {CapabilityInputAttachmentArrayNonUniformIndexingEXT, {"VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderInputAttachmentArrayNonUniformIndexing", &descriptorIndexingFeatures->shaderInputAttachmentArrayNonUniformIndexing}}, + {CapabilityUniformTexelBufferArrayNonUniformIndexingEXT, {"VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderUniformTexelBufferArrayNonUniformIndexing", &descriptorIndexingFeatures->shaderUniformTexelBufferArrayNonUniformIndexing}}, + {CapabilityStorageTexelBufferArrayNonUniformIndexingEXT , {"VkPhysicalDeviceDescriptorIndexingFeaturesEXT::shaderStorageTexelBufferArrayNonUniformIndexing", &descriptorIndexingFeatures->shaderStorageTexelBufferArrayNonUniformIndexing}}, // Capabilities that require an extension - {spv::CapabilityDrawParameters, {VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, nullptr, &E::vk_khr_shader_draw_parameters}}, - {spv::CapabilityGeometryShaderPassthroughNV, {VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME, nullptr, &E::vk_nv_geometry_shader_passthrough}}, - {spv::CapabilitySampleMaskOverrideCoverageNV, {VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME, nullptr, &E::vk_nv_sample_mask_override_coverage}}, - {spv::CapabilityShaderViewportIndexLayerEXT, {VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME, nullptr, &E::vk_ext_shader_viewport_index_layer}}, - {spv::CapabilityShaderViewportIndexLayerNV, {VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME, nullptr, &E::vk_nv_viewport_array2}}, - {spv::CapabilityShaderViewportMaskNV, {VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME, nullptr, &E::vk_nv_viewport_array2}}, - {spv::CapabilitySubgroupBallotKHR, {VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, nullptr, &E::vk_ext_shader_subgroup_ballot }}, - {spv::CapabilitySubgroupVoteKHR, {VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME, nullptr, &E::vk_ext_shader_subgroup_vote }}, + {spv::CapabilityDrawParameters, {VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, nullptr, &extensions->vk_khr_shader_draw_parameters}}, + {spv::CapabilityGeometryShaderPassthroughNV, {VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME, nullptr, &extensions->vk_nv_geometry_shader_passthrough}}, + {spv::CapabilitySampleMaskOverrideCoverageNV, {VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME, nullptr, &extensions->vk_nv_sample_mask_override_coverage}}, + {spv::CapabilityShaderViewportIndexLayerEXT, {VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME, nullptr, &extensions->vk_ext_shader_viewport_index_layer}}, + {spv::CapabilityShaderViewportIndexLayerNV, {VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME, nullptr, &extensions->vk_nv_viewport_array2}}, + {spv::CapabilityShaderViewportMaskNV, {VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME, nullptr, &extensions->vk_nv_viewport_array2}}, + {spv::CapabilitySubgroupBallotKHR, {VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, nullptr, &extensions->vk_ext_shader_subgroup_ballot }}, + {spv::CapabilitySubgroupVoteKHR, {VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME, nullptr, &extensions->vk_ext_shader_subgroup_vote }}, }; // clang-format on @@ -1209,10 +1290,10 @@ auto it = capabilities.find(insn.word(1)); if (it != capabilities.end()) { if (it->second.feature) { - skip |= require_feature(report_data, enabledFeatures->*(it->second.feature), it->second.name); + skip |= require_feature(report_data, *(it->second.feature), it->second.name); } if (it->second.extension) { - skip |= require_extension(report_data, extensions->*(it->second.extension), it->second.name); + skip |= require_extension(report_data, *(it->second.extension), it->second.name); } } } else if (1 < n) { // key occurs multiple times, at least one must be enabled @@ -1224,13 +1305,13 @@ for (auto it = caps.first; it != caps.second; ++it) { if (it->second.feature) { needs_feature = true; - has_feature = has_feature || enabledFeatures->*(it->second.feature); + has_feature = has_feature || *(it->second.feature); feature_names += it->second.name; feature_names += " "; } if (it->second.extension) { needs_ext = true; - has_ext = has_ext || extensions->*(it->second.extension); + has_ext = has_ext || *(it->second.extension); extension_names += it->second.name; extension_names += " "; } @@ -1247,6 +1328,22 @@ } } + if (has_writable_descriptor) { + switch (stage) { + case VK_SHADER_STAGE_COMPUTE_BIT: + /* No feature requirements for writes and atomics from compute + * stage */ + break; + case VK_SHADER_STAGE_FRAGMENT_BIT: + skip |= require_feature(report_data, enabledFeatures->fragmentStoresAndAtomics, "fragmentStoresAndAtomics"); + break; + default: + skip |= + require_feature(report_data, enabledFeatures->vertexPipelineStoresAndAtomics, "vertexPipelineStoresAndAtomics"); + break; + } + } + return skip; } @@ -1300,6 +1397,39 @@ return pipelineLayout->set_layouts[slot.first]->GetDescriptorSetLayoutBindingPtrFromBinding(slot.second); } +static void process_execution_modes(shader_module const *src, spirv_inst_iter entrypoint, PIPELINE_STATE *pipeline) { + auto entrypoint_id = entrypoint.word(1); + bool is_point_mode = false; + + for (auto insn : *src) { + if (insn.opcode() == spv::OpExecutionMode && insn.word(1) == entrypoint_id) { + switch (insn.word(2)) { + case spv::ExecutionModePointMode: + // In tessellation shaders, PointMode is separate and trumps the tessellation topology. + is_point_mode = true; + break; + + case spv::ExecutionModeOutputPoints: + pipeline->topology_at_rasterizer = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; + break; + + case spv::ExecutionModeIsolines: + case spv::ExecutionModeOutputLineStrip: + pipeline->topology_at_rasterizer = VK_PRIMITIVE_TOPOLOGY_LINE_STRIP; + break; + + case spv::ExecutionModeTriangles: + case spv::ExecutionModeQuads: + case spv::ExecutionModeOutputTriangleStrip: + pipeline->topology_at_rasterizer = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + break; + } + } + } + + if (is_point_mode) pipeline->topology_at_rasterizer = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; +} + static bool validate_pipeline_shader_stage(layer_data *dev_data, VkPipelineShaderStageCreateInfo const *pStage, PIPELINE_STATE *pipeline, shader_module const **out_module, spirv_inst_iter *out_entrypoint) { @@ -1312,24 +1442,26 @@ // Find the entrypoint auto entrypoint = *out_entrypoint = find_entrypoint(module, pStage->pName, pStage->stage); if (entrypoint == module->end()) { - if (log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_10600586, "SC", "No entrypoint found named `%s` for stage %s. %s.", pStage->pName, - string_VkShaderStageFlagBits(pStage->stage), validation_error_map[VALIDATION_ERROR_10600586])) { + if (log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_10600586, "No entrypoint found named `%s` for stage %s..", pStage->pName, + string_VkShaderStageFlagBits(pStage->stage))) { return true; // no point continuing beyond here, any analysis is just going to be garbage. } } - // Validate shader capabilities against enabled device features - skip |= validate_shader_capabilities(dev_data, module); - // Mark accessible ids auto accessible_ids = mark_accessible_ids(module, entrypoint); + process_execution_modes(module, entrypoint, pipeline); // Validate descriptor set layout against what the entrypoint actually uses - auto descriptor_uses = collect_interface_by_descriptor_slot(report_data, module, accessible_ids); + bool has_writable_descriptor = false; + auto descriptor_uses = collect_interface_by_descriptor_slot(report_data, module, accessible_ids, &has_writable_descriptor); + + // Validate shader capabilities against enabled device features + skip |= validate_shader_capabilities(dev_data, module, pStage->stage, has_writable_descriptor); skip |= validate_specialization_offsets(report_data, pStage); - skip |= validate_push_constant_usage(report_data, &pipeline->pipeline_layout.push_constant_ranges, module, accessible_ids, + skip |= validate_push_constant_usage(report_data, pipeline->pipeline_layout.push_constant_ranges.get(), module, accessible_ids, pStage->stage); // Validate descriptor use @@ -1343,25 +1475,25 @@ unsigned required_descriptor_count; if (!binding) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_MISSING_DESCRIPTOR, "SC", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_MISSING_DESCRIPTOR, "Shader uses descriptor slot %u.%u (used as type `%s`) but not declared in pipeline layout", use.first.first, use.first.second, describe_type(module, use.second.type_id).c_str()); } else if (~binding->stageFlags & pStage->stage) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, 0, __LINE__, - SHADER_CHECKER_DESCRIPTOR_NOT_ACCESSIBLE_FROM_STAGE, "SC", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, 0, + SHADER_CHECKER_DESCRIPTOR_NOT_ACCESSIBLE_FROM_STAGE, "Shader uses descriptor slot %u.%u (used as type `%s`) but descriptor not accessible from stage %s", use.first.first, use.first.second, describe_type(module, use.second.type_id).c_str(), string_VkShaderStageFlagBits(pStage->stage)); } else if (!descriptor_type_match(module, use.second.type_id, binding->descriptorType, required_descriptor_count)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_DESCRIPTOR_TYPE_MISMATCH, "SC", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_DESCRIPTOR_TYPE_MISMATCH, "Type mismatch on descriptor slot %u.%u (used as type `%s`) but descriptor of type %s", use.first.first, use.first.second, describe_type(module, use.second.type_id).c_str(), string_VkDescriptorType(binding->descriptorType)); } else if (binding->descriptorCount < required_descriptor_count) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_DESCRIPTOR_TYPE_MISMATCH, "SC", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_DESCRIPTOR_TYPE_MISMATCH, "Shader expects at least %u descriptors for binding %u.%u (used as type `%s`) but only %u provided", required_descriptor_count, use.first.first, use.first.second, describe_type(module, use.second.type_id).c_str(), binding->descriptorCount); @@ -1382,13 +1514,13 @@ : VK_ATTACHMENT_UNUSED; if (index == VK_ATTACHMENT_UNUSED) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_MISSING_INPUT_ATTACHMENT, "SC", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_MISSING_INPUT_ATTACHMENT, "Shader consumes input attachment index %d but not provided in subpass", use.first); } else if (!(get_format_type(rpci->pAttachments[index].format) & get_fundamental_type(module, use.second.type_id))) { skip |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_INPUT_ATTACHMENT_TYPE_MISMATCH, "SC", + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_INPUT_ATTACHMENT_TYPE_MISMATCH, "Subpass input attachment %u format of %s does not match type used in shader `%s`", use.first, string_VkFormat(rpci->pAttachments[index].format), describe_type(module, use.second.type_id).c_str()); } @@ -1421,13 +1553,12 @@ if (b_at_end || ((!a_at_end) && (a_first < b_first))) { skip |= log_msg(report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, SHADER_CHECKER_OUTPUT_NOT_CONSUMED, "SC", - "%s writes to output location %u.%u which is not consumed by %s", producer_stage->name, a_first.first, - a_first.second, consumer_stage->name); + SHADER_CHECKER_OUTPUT_NOT_CONSUMED, "%s writes to output location %u.%u which is not consumed by %s", + producer_stage->name, a_first.first, a_first.second, consumer_stage->name); a_it++; } else if (a_at_end || a_first > b_first) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_INPUT_NOT_PRODUCED, "SC", "%s consumes input location %u.%u which is not written by %s", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_INPUT_NOT_PRODUCED, "%s consumes input location %u.%u which is not written by %s", consumer_stage->name, b_first.first, b_first.second, producer_stage->name); b_it++; } else { @@ -1438,21 +1569,21 @@ if (!types_match(producer, consumer, a_it->second.type_id, b_it->second.type_id, producer_stage->arrayed_output && !a_it->second.is_patch && !a_it->second.is_block_member, consumer_stage->arrayed_input && !b_it->second.is_patch && !b_it->second.is_block_member, true)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - SHADER_CHECKER_INTERFACE_TYPE_MISMATCH, "SC", "Type mismatch on location %u.%u: '%s' vs '%s'", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + SHADER_CHECKER_INTERFACE_TYPE_MISMATCH, "Type mismatch on location %u.%u: '%s' vs '%s'", a_first.first, a_first.second, describe_type(producer, a_it->second.type_id).c_str(), describe_type(consumer, b_it->second.type_id).c_str()); } if (a_it->second.is_patch != b_it->second.is_patch) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, 0, __LINE__, - SHADER_CHECKER_INTERFACE_TYPE_MISMATCH, "SC", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, 0, + SHADER_CHECKER_INTERFACE_TYPE_MISMATCH, "Decoration mismatch on location %u.%u: is per-%s in %s stage but per-%s in %s stage", a_first.first, a_first.second, a_it->second.is_patch ? "patch" : "vertex", producer_stage->name, b_it->second.is_patch ? "patch" : "vertex", consumer_stage->name); } if (a_it->second.is_relaxed_precision != b_it->second.is_relaxed_precision) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, 0, __LINE__, - SHADER_CHECKER_INTERFACE_TYPE_MISMATCH, "SC", + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, 0, + SHADER_CHECKER_INTERFACE_TYPE_MISMATCH, "Decoration mismatch on location %u.%u: %s and %s stages differ in precision", a_first.first, a_first.second, producer_stage->name, consumer_stage->name); } @@ -1507,10 +1638,12 @@ for (; producer != fragment_stage && consumer <= fragment_stage; consumer++) { assert(shaders[producer]); - if (shaders[consumer] && shaders[consumer]->has_valid_spirv && shaders[producer]->has_valid_spirv) { - skip |= validate_interface_between_stages(report_data, shaders[producer], entrypoints[producer], - &shader_stage_attribs[producer], shaders[consumer], entrypoints[consumer], - &shader_stage_attribs[consumer]); + if (shaders[consumer]) { + if (shaders[consumer]->has_valid_spirv && shaders[producer]->has_valid_spirv) { + skip |= validate_interface_between_stages(report_data, shaders[producer], entrypoints[producer], + &shader_stage_attribs[producer], shaders[consumer], entrypoints[consumer], + &shader_stage_attribs[consumer]); + } producer = consumer; } @@ -1556,10 +1689,9 @@ auto have_glsl_shader = GetEnabledExtensions(dev_data)->vk_nv_glsl_shader; if (!have_glsl_shader && (pCreateInfo->codeSize % 4)) { - skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_12a00ac0, "SC", - "SPIR-V module not valid: Codesize must be a multiple of 4 but is " PRINTF_SIZE_T_SPECIFIER ". %s", - pCreateInfo->codeSize, validation_error_map[VALIDATION_ERROR_12a00ac0]); + skip |= log_msg( + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, VALIDATION_ERROR_12a00ac0, + "SPIR-V module not valid: Codesize must be a multiple of 4 but is " PRINTF_SIZE_T_SPECIFIER ".", pCreateInfo->codeSize); } else { auto cache = GetValidationCacheInfo(pCreateInfo); uint32_t hash = 0; @@ -1578,7 +1710,7 @@ if (!have_glsl_shader || (pCreateInfo->pCode[0] == spv::MagicNumber)) { skip |= log_msg(report_data, spv_valid == SPV_WARNING ? VK_DEBUG_REPORT_WARNING_BIT_EXT : VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, SHADER_CHECKER_INCONSISTENT_SPIRV, "SC", + VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, SHADER_CHECKER_INCONSISTENT_SPIRV, "SPIR-V module not valid: %s", diag && diag->error ? diag->error : "(no error text)"); } } else { diff -Nru vulkan-1.1.70+dfsg1/layers/threading.h vulkan-1.1.73+dfsg/layers/threading.h --- vulkan-1.1.70+dfsg1/layers/threading.h 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/threading.h 2018-04-27 11:24:19.000000000 +0000 @@ -26,11 +26,20 @@ #include "vk_layer_config.h" #include "vk_layer_logging.h" -#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__ia64) || defined(_M_IA64) || \ - defined(__aarch64__) || defined(__powerpc64__) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(DISTINCT_NONDISPATCHABLE_PHONY_HANDLE) +// The following line must match the vulkan_core.h condition guarding VK_DEFINE_NON_DISPATCHABLE_HANDLE +#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || \ + defined(_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) // If pointers are 64-bit, then there can be separate counters for each // NONDISPATCHABLE_HANDLE type. Otherwise they are all typedef uint64_t. #define DISTINCT_NONDISPATCHABLE_HANDLES +// Make sure we catch any disagreement between us and the vulkan definition +static_assert(std::is_pointer::value, + "Mismatched non-dispatchable handle handle, expected pointer type."); +#else +// Make sure we catch any disagreement between us and the vulkan definition +static_assert(std::is_same::value, + "Mismatched non-dispatchable handle handle, expected uint64_t."); #endif // Draw State ERROR codes @@ -94,10 +103,11 @@ if (use_data->reader_count == 0) { // There are no readers. Two writers just collided. if (use_data->thread != tid) { - skipCall |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, objectType, (uint64_t)(object), 0, - THREADING_CHECKER_MULTIPLE_THREADS, "THREADING", - "THREADING ERROR : object of type %s is simultaneously used in thread %ld and thread %ld", - typeName, use_data->thread, tid); + skipCall |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, objectType, (uint64_t)(object), + THREADING_CHECKER_MULTIPLE_THREADS, + "THREADING ERROR : object of type %s is simultaneously used in " + "thread 0x%" PRIx64 " and thread 0x%" PRIx64, + typeName, (uint64_t)use_data->thread, (uint64_t)tid); if (skipCall) { // Wait for thread-safe access to object instead of skipping call. while (uses.find(object) != uses.end()) { @@ -121,10 +131,11 @@ } else { // There are readers. This writer collided with them. if (use_data->thread != tid) { - skipCall |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, objectType, (uint64_t)(object), 0, - THREADING_CHECKER_MULTIPLE_THREADS, "THREADING", - "THREADING ERROR : object of type %s is simultaneously used in thread %ld and thread %ld", - typeName, use_data->thread, tid); + skipCall |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, objectType, (uint64_t)(object), + THREADING_CHECKER_MULTIPLE_THREADS, + "THREADING ERROR : object of type %s is simultaneously used in " + "thread 0x%" PRIx64 " and thread 0x%" PRIx64, + typeName, (uint64_t)use_data->thread, (uint64_t)tid); if (skipCall) { // Wait for thread-safe access to object instead of skipping call. while (uses.find(object) != uses.end()) { @@ -179,10 +190,11 @@ use_data->thread = tid; } else if (uses[object].writer_count > 0 && uses[object].thread != tid) { // There is a writer of the object. - skipCall |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, objectType, (uint64_t)(object), 0, - THREADING_CHECKER_MULTIPLE_THREADS, "THREADING", - "THREADING ERROR : object of type %s is simultaneously used in thread %ld and thread %ld", typeName, - uses[object].thread, tid); + skipCall |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, objectType, (uint64_t)(object), + THREADING_CHECKER_MULTIPLE_THREADS, + "THREADING ERROR : object of type %s is simultaneously used in " + "thread 0x%" PRIx64 " and thread 0x%" PRIx64, + typeName, (uint64_t)uses[object].thread, (uint64_t)tid); if (skipCall) { // Wait for thread-safe access to object instead of skipping call. while (uses.find(object) != uses.end()) { diff -Nru vulkan-1.1.70+dfsg1/layers/threading_layer.md vulkan-1.1.73+dfsg/layers/threading_layer.md --- vulkan-1.1.70+dfsg1/layers/threading_layer.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/threading_layer.md 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,2 @@ +# VK\_LAYER\_GOOGLE\_threading +The `VK_LAYER_GOOGLE_threading` layer checks multi-threading of API calls for validity. Checks performed by this layer include ensuring that only one thread at a time uses an object in free-threaded API calls. diff -Nru vulkan-1.1.70+dfsg1/layers/unique_objects.cpp vulkan-1.1.73+dfsg/layers/unique_objects.cpp --- vulkan-1.1.70+dfsg1/layers/unique_objects.cpp 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/unique_objects.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -71,8 +71,8 @@ for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { // Check for recognized instance extensions if (!white_list(pCreateInfo->ppEnabledExtensionNames[i], kInstanceExtensionNames)) { - log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_UNDEFINED, "UniqueObjects", + log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_UNDEFINED, "Instance Extension %s is not supported by this layer. Using this extension may adversely affect validation " "results and/or produce undefined behavior.", pCreateInfo->ppEnabledExtensionNames[i]); @@ -87,8 +87,8 @@ for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { // Check for recognized device extensions if (!white_list(pCreateInfo->ppEnabledExtensionNames[i], kDeviceExtensionNames)) { - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, - VALIDATION_ERROR_UNDEFINED, "UniqueObjects", + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_UNDEFINED, "Device Extension %s is not supported by this layer. Using this extension may adversely affect validation " "results and/or produce undefined behavior.", pCreateInfo->ppEnabledExtensionNames[i]); @@ -354,8 +354,7 @@ bool uses_color_attachment = false; bool uses_depthstencil_attachment = false; { - const auto subpasses_uses_it = - device_data->renderpasses_states.find(Unwrap(pCreateInfos[idx0].renderPass)); + const auto subpasses_uses_it = device_data->renderpasses_states.find(Unwrap(pCreateInfos[idx0].renderPass)); if (subpasses_uses_it != device_data->renderpasses_states.end()) { const auto &subpasses_uses = subpasses_uses_it->second; if (subpasses_uses.subpasses_using_color_attachment.count(pCreateInfos[idx0].subpass)) @@ -376,8 +375,7 @@ if (pCreateInfos[idx0].pStages) { for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) { if (pCreateInfos[idx0].pStages[idx1].module) { - local_pCreateInfos[idx0].pStages[idx1].module = - Unwrap(pCreateInfos[idx0].pStages[idx1].module); + local_pCreateInfos[idx0].pStages[idx1].module = Unwrap(pCreateInfos[idx0].pStages[idx1].module); } } } @@ -467,9 +465,8 @@ } VkResult result = my_map_data->dispatch_table.CreateSwapchainKHR(device, local_pCreateInfo->ptr(), pAllocator, pSwapchain); - if (local_pCreateInfo) { - delete local_pCreateInfo; - } + delete local_pCreateInfo; + if (VK_SUCCESS == result) { std::lock_guard lock(global_lock); *pSwapchain = WrapNew(*pSwapchain); @@ -500,7 +497,7 @@ } VkResult result = dev_data->dispatch_table.CreateSharedSwapchainsKHR(device, swapchainCount, local_pCreateInfos->ptr(), pAllocator, pSwapchains); - if (local_pCreateInfos) delete[] local_pCreateInfos; + delete[] local_pCreateInfos; if (VK_SUCCESS == result) { std::lock_guard lock(global_lock); for (uint32_t i = 0; i < swapchainCount; i++) { @@ -581,7 +578,7 @@ } } - if (local_pPresentInfo) delete local_pPresentInfo; + delete local_pPresentInfo; return result; } @@ -875,62 +872,62 @@ VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, const VkDebugMarkerObjectTagInfoEXT *pTagInfo) { layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); - auto local_tag_info = new safe_VkDebugMarkerObjectTagInfoEXT(pTagInfo); + safe_VkDebugMarkerObjectTagInfoEXT local_tag_info(pTagInfo); { std::lock_guard lock(global_lock); - auto it = unique_id_mapping.find(reinterpret_cast(local_tag_info->object)); + auto it = unique_id_mapping.find(reinterpret_cast(local_tag_info.object)); if (it != unique_id_mapping.end()) { - local_tag_info->object = it->second; + local_tag_info.object = it->second; } } VkResult result = device_data->dispatch_table.DebugMarkerSetObjectTagEXT( - device, reinterpret_cast(local_tag_info)); + device, reinterpret_cast(&local_tag_info)); return result; } VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, const VkDebugMarkerObjectNameInfoEXT *pNameInfo) { layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); - auto local_name_info = new safe_VkDebugMarkerObjectNameInfoEXT(pNameInfo); + safe_VkDebugMarkerObjectNameInfoEXT local_name_info(pNameInfo); { std::lock_guard lock(global_lock); - auto it = unique_id_mapping.find(reinterpret_cast(local_name_info->object)); + auto it = unique_id_mapping.find(reinterpret_cast(local_name_info.object)); if (it != unique_id_mapping.end()) { - local_name_info->object = it->second; + local_name_info.object = it->second; } } VkResult result = device_data->dispatch_table.DebugMarkerSetObjectNameEXT( - device, reinterpret_cast(local_name_info)); + device, reinterpret_cast(&local_name_info)); return result; } // VK_EXT_debug_utils VKAPI_ATTR VkResult VKAPI_CALL SetDebugUtilsObjectTagEXT(VkDevice device, const VkDebugUtilsObjectTagInfoEXT *pTagInfo) { layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); - auto local_tag_info = new safe_VkDebugUtilsObjectTagInfoEXT(pTagInfo); + safe_VkDebugUtilsObjectTagInfoEXT local_tag_info(pTagInfo); { std::lock_guard lock(global_lock); - auto it = unique_id_mapping.find(reinterpret_cast(local_tag_info->objectHandle)); + auto it = unique_id_mapping.find(reinterpret_cast(local_tag_info.objectHandle)); if (it != unique_id_mapping.end()) { - local_tag_info->objectHandle = it->second; + local_tag_info.objectHandle = it->second; } } VkResult result = device_data->dispatch_table.SetDebugUtilsObjectTagEXT( - device, reinterpret_cast(local_tag_info)); + device, reinterpret_cast(&local_tag_info)); return result; } VKAPI_ATTR VkResult VKAPI_CALL SetDebugUtilsObjectNameEXT(VkDevice device, const VkDebugUtilsObjectNameInfoEXT *pNameInfo) { layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); - auto local_name_info = new safe_VkDebugUtilsObjectNameInfoEXT(pNameInfo); + safe_VkDebugUtilsObjectNameInfoEXT local_name_info(pNameInfo); { std::lock_guard lock(global_lock); - auto it = unique_id_mapping.find(reinterpret_cast(local_name_info->objectHandle)); + auto it = unique_id_mapping.find(reinterpret_cast(local_name_info.objectHandle)); if (it != unique_id_mapping.end()) { - local_name_info->objectHandle = it->second; + local_name_info.objectHandle = it->second; } } VkResult result = device_data->dispatch_table.SetDebugUtilsObjectNameEXT( - device, reinterpret_cast(local_name_info)); + device, reinterpret_cast(&local_name_info)); return result; } diff -Nru vulkan-1.1.70+dfsg1/layers/unique_objects_layer.md vulkan-1.1.73+dfsg/layers/unique_objects_layer.md --- vulkan-1.1.70+dfsg1/layers/unique_objects_layer.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/unique_objects_layer.md 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,7 @@ +# VK\_LAYER\_GOOGLE\_unique\_objects +The `VK_LAYER_LUNARG_unique_objects` is a validation-supporting utility layer which enables consistent and coherent validation in addition to proper operation on systems which return non-unique object handles. This layer aliases all non-dispatchable Vulkan objects with a unique identifier at object-creation time. The aliased handles are used during validation to ensure that duplicate object handles are correctly managed and tracked by the validation layers. + +Note: + +* For optimal efficiency, this layer MUST be last in the chain (closest to the display driver). +* If you are developing Vulkan extensions which include new APIs taking one or more Vulkan dispatchable objects as parameters, you may find it necessary to disable the unique objects layer in order use the validation layers. The best way to do this is to explicitly load the layers in the optimal order specified earlier but without this layer. This should result in a minimal decrease in functionality but still allow you to benefit from using the validation layers. diff -Nru vulkan-1.1.70+dfsg1/layers/vk_format_utils.cpp vulkan-1.1.73+dfsg/layers/vk_format_utils.cpp --- vulkan-1.1.70+dfsg1/layers/vk_format_utils.cpp 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/vk_format_utils.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -189,7 +189,7 @@ {VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT}}, {VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT}}, {VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}}, - {VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}}, + {VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}}, {VK_FORMAT_EAC_R11_UNORM_BLOCK, {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT}}, {VK_FORMAT_EAC_R11_SNORM_BLOCK, {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT}}, {VK_FORMAT_EAC_R11G11_UNORM_BLOCK, {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT}}, @@ -229,7 +229,40 @@ {VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_2BPP_BIT}}, {VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_4BPP_BIT}}, {VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_2BPP_BIT}}, - {VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_4BPP_BIT}} + {VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_4BPP_BIT}}, + /* KHR_sampler_YCbCr_conversion */ + {VK_FORMAT_G8B8G8R8_422_UNORM_KHR, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32BIT_G8B8G8R8}}, + {VK_FORMAT_B8G8R8G8_422_UNORM_KHR, {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32BIT_B8G8R8G8}}, + {VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_R10G10B10A10}}, + {VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G10B10G10R10}}, + {VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B10G10R10G10}}, + {VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_R12G12B12A12}}, + {VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G12B12G12R12}}, + {VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B12G12R12G12}}, + {VK_FORMAT_G16B16G16R16_422_UNORM_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G16B16G16R16}}, + {VK_FORMAT_B16G16R16G16_422_UNORM_KHR, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B16G16R16G16}} +#if 0 // TBD - Figure out what 'size' means for multi-planar formats + {VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_420}}, + {VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_2PLANE_420}}, + {VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_422}}, + {VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_2PLANE_422}}, + {VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_444}}, + {VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_420}}, + {VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_2PLANE_420}}, + {VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_422}}, + {VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_2PLANE_422}}, + {VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_444}}, + {VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_420}}, + {VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_2PLANE_420}}, + {VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_422}}, + {VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_2PLANE_422}}, + {VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_444}}, + {VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_420}}, + {VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_2PLANE_420}}, + {VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_422}}, + {VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_2PLANE_422}}, + {VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR, {0, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_444}} +#endif }; // Renable formatting @@ -349,6 +382,27 @@ return found; } +// Single-plane "_422" formats are treated as 2x1 compressed (for copies) +VK_LAYER_EXPORT bool FormatIsSinglePlane_422(VkFormat format) { + bool found = false; + + switch (format) { + case VK_FORMAT_G8B8G8R8_422_UNORM_KHR: + case VK_FORMAT_B8G8R8G8_422_UNORM_KHR: + case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR: + case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR: + case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR: + case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR: + case VK_FORMAT_G16B16G16R16_422_UNORM_KHR: + case VK_FORMAT_B16G16R16G16_422_UNORM_KHR: + found = true; + break; + default: + break; + } + return found; +} + // 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) || @@ -858,6 +912,18 @@ case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG: block_size = {4, 4, 1}; break; + // With KHR_sampler_ycbcr_conversion, these formats are treated as 2x1 compressed (for copies) + case VK_FORMAT_G8B8G8R8_422_UNORM_KHR: + case VK_FORMAT_B8G8R8G8_422_UNORM_KHR: + case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR: + case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR: + case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR: + case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR: + case VK_FORMAT_G16B16G16R16_422_UNORM_KHR: + case VK_FORMAT_B16G16R16G16_422_UNORM_KHR: + block_size = {2, 1, 1}; + break; + default: break; } @@ -878,7 +944,7 @@ case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR: case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR: case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR: - return 3u; + return 3; break; case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR: case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR: @@ -888,10 +954,10 @@ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR: case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR: case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR: - return 2u; + return 2; break; default: - return 1u; + return 1; break; } } @@ -931,3 +997,88 @@ } return result; } + +struct VULKAN_PER_PLANE_COMPATIBILITY { + uint32_t width_divisor; + uint32_t height_divisor; + VkFormat compatible_format; +}; + +struct VULKAN_MULTIPLANE_COMPATIBILITY { + VULKAN_PER_PLANE_COMPATIBILITY per_plane[VK_MULTIPLANE_FORMAT_MAX_PLANES]; +}; + +// Source: Vulkan spec Table 45. Plane Format Compatibility Table +// clang-format off +const std::map vk_multiplane_compatibility_map { + { VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM }, + { 2, 2, VK_FORMAT_R8_UNORM }, + { 2, 2, VK_FORMAT_R8_UNORM } } } }, + { VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM }, + { 2, 2, VK_FORMAT_R8G8_UNORM }, + { 1, 1, VK_FORMAT_UNDEFINED } } } }, + { VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM }, + { 2, 1, VK_FORMAT_R8_UNORM }, + { 2, 1, VK_FORMAT_R8_UNORM } } } }, + { VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM }, + { 2, 1, VK_FORMAT_R8G8_UNORM }, + { 1, 1, VK_FORMAT_UNDEFINED } } } }, + { VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR, { { { 1, 1, VK_FORMAT_R8_UNORM }, + { 1, 1, VK_FORMAT_R8_UNORM }, + { 1, 1, VK_FORMAT_R8_UNORM } } } }, + { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR }, + { 2, 2, VK_FORMAT_R10X6_UNORM_PACK16_KHR }, + { 2, 2, VK_FORMAT_R10X6_UNORM_PACK16_KHR } } } }, + { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR }, + { 2, 2, VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR }, + { 1, 1, VK_FORMAT_UNDEFINED } } } }, + { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR }, + { 2, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR }, + { 2, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR } } } }, + { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR }, + { 2, 1, VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR }, + { 1, 1, VK_FORMAT_UNDEFINED } } } }, + { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR }, + { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR }, + { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR } } } }, + { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR }, + { 2, 2, VK_FORMAT_R12X4_UNORM_PACK16_KHR }, + { 2, 2, VK_FORMAT_R12X4_UNORM_PACK16_KHR } } } }, + { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR }, + { 2, 2, VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR }, + { 1, 1, VK_FORMAT_UNDEFINED } } } }, + { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR }, + { 2, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR }, + { 2, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR } } } }, + { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR }, + { 2, 1, VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR }, + { 1, 1, VK_FORMAT_UNDEFINED } } } }, + { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR }, + { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR }, + { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR } } } }, + { VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM }, + { 2, 2, VK_FORMAT_R16_UNORM }, + { 2, 2, VK_FORMAT_R16_UNORM } } } }, + { VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM }, + { 2, 2, VK_FORMAT_R16G16_UNORM }, + { 1, 1, VK_FORMAT_UNDEFINED } } } }, + { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM }, + { 2, 1, VK_FORMAT_R16_UNORM }, + { 2, 1, VK_FORMAT_R16_UNORM } } } }, + { VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM }, + { 2, 1, VK_FORMAT_R16G16_UNORM }, + { 1, 1, VK_FORMAT_UNDEFINED } } } }, + { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR, { { { 1, 1, VK_FORMAT_R16_UNORM }, + { 1, 1, VK_FORMAT_R16_UNORM }, + { 1, 1, VK_FORMAT_R16_UNORM } } } } +}; +// clang-format on + +VK_LAYER_EXPORT VkFormat FindMultiplaneCompatibleFormat(VkFormat mp_fmt, uint32_t plane) { + auto it = vk_multiplane_compatibility_map.find(mp_fmt); + if ((it == vk_multiplane_compatibility_map.end()) || (plane >= VK_MULTIPLANE_FORMAT_MAX_PLANES)) { + return VK_FORMAT_UNDEFINED; + } + + return it->second.per_plane[plane].compatible_format; +} diff -Nru vulkan-1.1.70+dfsg1/layers/vk_format_utils.h vulkan-1.1.73+dfsg/layers/vk_format_utils.h --- vulkan-1.1.70+dfsg1/layers/vk_format_utils.h 2018-03-08 15:06:23.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/vk_format_utils.h 2018-04-27 11:24:19.000000000 +0000 @@ -38,6 +38,8 @@ extern "C" { #endif +#define VK_MULTIPLANE_FORMAT_MAX_PLANES 3 + typedef enum VkFormatCompatibilityClass { VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT = 0, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT = 1, @@ -88,7 +90,38 @@ VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_4BPP_BIT = 46, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_2BPP_BIT = 47, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_4BPP_BIT = 48, - VK_FORMAT_COMPATIBILITY_CLASS_MAX_ENUM = 49 + /* KHR_sampler_YCbCr_conversion */ + VK_FORMAT_COMPATIBILITY_CLASS_32BIT_G8B8G8R8 = 49, + VK_FORMAT_COMPATIBILITY_CLASS_32BIT_B8G8R8G8 = 50, + VK_FORMAT_COMPATIBILITY_CLASS_64BIT_R10G10B10A10 = 51, + VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G10B10G10R10 = 52, + VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B10G10R10G10 = 53, + VK_FORMAT_COMPATIBILITY_CLASS_64BIT_R12G12B12A12 = 54, + VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G12B12G12R12 = 55, + VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B12G12R12G12 = 56, + VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G16B16G16R16 = 57, + VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B16G16R16G16 = 58, + VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_420 = 59, + VK_FORMAT_COMPATIBILITY_CLASS_8BIT_2PLANE_420 = 60, + VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_422 = 61, + VK_FORMAT_COMPATIBILITY_CLASS_8BIT_2PLANE_422 = 62, + VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_444 = 63, + VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_420 = 64, + VK_FORMAT_COMPATIBILITY_CLASS_10BIT_2PLANE_420 = 65, + VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_422 = 66, + VK_FORMAT_COMPATIBILITY_CLASS_10BIT_2PLANE_422 = 67, + VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_444 = 68, + VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_420 = 69, + VK_FORMAT_COMPATIBILITY_CLASS_12BIT_2PLANE_420 = 70, + VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_422 = 71, + VK_FORMAT_COMPATIBILITY_CLASS_12BIT_2PLANE_422 = 72, + VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_444 = 73, + VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_420 = 74, + VK_FORMAT_COMPATIBILITY_CLASS_16BIT_2PLANE_420 = 75, + VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_422 = 76, + VK_FORMAT_COMPATIBILITY_CLASS_16BIT_2PLANE_422 = 77, + VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_444 = 78, + VK_FORMAT_COMPATIBILITY_CLASS_MAX_ENUM = 79 } VkFormatCompatibilityClass; VK_LAYER_EXPORT bool FormatIsDepthOrStencil(VkFormat format); @@ -99,6 +132,7 @@ VK_LAYER_EXPORT bool FormatIsCompressed_ASTC_LDR(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); VK_LAYER_EXPORT bool FormatIsNorm(VkFormat format); VK_LAYER_EXPORT bool FormatIsUNorm(VkFormat format); VK_LAYER_EXPORT bool FormatIsSNorm(VkFormat format); @@ -117,12 +151,15 @@ VK_LAYER_EXPORT size_t FormatSize(VkFormat format); VK_LAYER_EXPORT VkFormatCompatibilityClass FormatCompatibilityClass(VkFormat format); VK_LAYER_EXPORT VkDeviceSize SafeModulo(VkDeviceSize dividend, VkDeviceSize divisor); +VK_LAYER_EXPORT VkFormat FindMultiplaneCompatibleFormat(VkFormat fmt, uint32_t plane); static inline bool FormatIsUndef(VkFormat format) { return (format == VK_FORMAT_UNDEFINED); } -static inline bool FormatIsColor(VkFormat format) { return !(FormatIsUndef(format) || FormatIsDepthOrStencil(format)); } static inline bool FormatHasDepth(VkFormat format) { return (FormatIsDepthOnly(format) || FormatIsDepthAndStencil(format)); } static inline bool FormatHasStencil(VkFormat format) { return (FormatIsStencilOnly(format) || FormatIsDepthAndStencil(format)); } static inline bool FormatIsMultiplane(VkFormat format) { return ((FormatPlaneCount(format)) > 1u); } +static inline bool FormatIsColor(VkFormat format) { + return !(FormatIsUndef(format) || FormatIsDepthOrStencil(format) || FormatIsMultiplane(format)); +} #ifdef __cplusplus } diff -Nru vulkan-1.1.70+dfsg1/layers/vk_layer_config.cpp vulkan-1.1.73+dfsg/layers/vk_layer_config.cpp --- vulkan-1.1.70+dfsg1/layers/vk_layer_config.cpp 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/vk_layer_config.cpp 2018-04-27 11:24:19.000000000 +0000 @@ -32,7 +32,7 @@ #include #if defined(_WIN32) -#include +#include #endif #define MAX_CHARS_PER_LINE 4096 diff -Nru vulkan-1.1.70+dfsg1/layers/vk_layer_logging.h vulkan-1.1.73+dfsg/layers/vk_layer_logging.h --- vulkan-1.1.70+dfsg1/layers/vk_layer_logging.h 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/vk_layer_logging.h 2018-04-27 11:24:19.000000000 +0000 @@ -30,6 +30,7 @@ #include "vk_loader_platform.h" #include "vulkan/vk_layer.h" #include "vk_object_types.h" +#include "vk_validation_error_messages.h" #include #include #include @@ -102,7 +103,7 @@ // Forward Declarations static inline bool debug_log_msg(const debug_report_data *debug_data, VkFlags msg_flags, VkDebugReportObjectTypeEXT object_type, uint64_t src_object, size_t location, int32_t msg_code, const char *layer_prefix, - const char *message); + const char *message, const char *text_vuid = NULL); // Add a debug message callback node structure to the specified callback linked list static inline void AddDebugCallbackNode(debug_report_data *debug_data, VkLayerDbgFunctionNode **list_head, @@ -204,10 +205,10 @@ *list_head = NULL; } -// Utility function to handle reporting +// Note that text_vuid is a default parameter, and is optional. See the above forward declaration static inline bool debug_log_msg(const debug_report_data *debug_data, VkFlags msg_flags, VkDebugReportObjectTypeEXT object_type, uint64_t src_object, size_t location, int32_t msg_code, const char *layer_prefix, - const char *message) { + const char *message, const char *text_vuid) { bool bail = false; VkLayerDbgFunctionNode *layer_dbg_node = NULL; @@ -233,7 +234,7 @@ callback_data.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT; callback_data.pNext = NULL; callback_data.flags = 0; - callback_data.pMessageIdName = layer_prefix; + callback_data.pMessageIdName = text_vuid; callback_data.messageIdNumber = msg_code; callback_data.pMessage = message; callback_data.queueLabelCount = 0; @@ -247,9 +248,9 @@ VkDebugUtilsLabelEXT *cmd_buf_labels = nullptr; std::string new_debug_report_message = ""; std::ostringstream oss; - oss << "Object: 0x" << std::hex << src_object; if (0 != src_object) { + oss << "Object: 0x" << std::hex << src_object; // If this is a queue, add any queue labels to the callback data. if (VK_OBJECT_TYPE_QUEUE == object_name_info.objectType) { auto label_iter = debug_data->debugUtilsQueueLabels->find(reinterpret_cast(src_object)); @@ -309,23 +310,39 @@ } } if (NULL != callback_data.pObjects[0].pObjectName) { - oss << " (Name = " << callback_data.pObjects[0].pObjectName << ")"; + oss << " (Name = " << callback_data.pObjects[0].pObjectName << " : Type = "; + } else { + oss << " (Type = "; } + oss << std::to_string(object_type) << ")"; + } else { + oss << "Object: VK_NULL_HANDLE (Type = " << std::to_string(object_type) << ")"; } new_debug_report_message += oss.str(); new_debug_report_message += " | "; new_debug_report_message += message; while (layer_dbg_node) { - if (!layer_dbg_node->is_messenger && (layer_dbg_node->report.msgFlags & msg_flags) && - layer_dbg_node->report.pfnMsgCallback(msg_flags, object_type, src_object, location, msg_code, layer_prefix, - new_debug_report_message.c_str(), layer_dbg_node->pUserData)) { - bail = true; + // If the app uses the VK_EXT_debug_report extension, call all of those registered callbacks. + if (!layer_dbg_node->is_messenger && (layer_dbg_node->report.msgFlags & msg_flags)) { + if (text_vuid != nullptr) { + // If a text vuid is supplied for the old debug report extension, prepend it to the message string + new_debug_report_message.insert(0, " ] "); + new_debug_report_message.insert(0, text_vuid); + new_debug_report_message.insert(0, " [ "); + } + + if (layer_dbg_node->report.pfnMsgCallback(msg_flags, object_type, src_object, location, msg_code, layer_prefix, + new_debug_report_message.c_str(), layer_dbg_node->pUserData)) { + bail = true; + } + // If the app uses the VK_EXT_debug_utils extension, call all of those registered callbacks. } else if (layer_dbg_node->is_messenger && (layer_dbg_node->messenger.messageSeverity & severity) && - (layer_dbg_node->messenger.messageType & types) && - layer_dbg_node->messenger.pfnUserCallback(static_cast(severity), types, - &callback_data, layer_dbg_node->pUserData)) { - bail = true; + (layer_dbg_node->messenger.messageType & types)) { + if (layer_dbg_node->messenger.pfnUserCallback(static_cast(severity), types, + &callback_data, layer_dbg_node->pUserData)) { + bail = true; + } } layer_dbg_node = layer_dbg_node->pNext; } @@ -676,8 +693,9 @@ // then allocates an array that can hold that many structs, as well as that // many VkDebugUtilsMessengerEXT handles. It then copies each // VkDebugUtilsMessengerCreateInfoEXT, and initializes each handle. -static VkResult layer_copy_tmp_debug_messengers(const void *pChain, uint32_t *num_messengers, - VkDebugUtilsMessengerCreateInfoEXT **infos, VkDebugUtilsMessengerEXT **messengers) { +static inline VkResult layer_copy_tmp_debug_messengers(const void *pChain, uint32_t *num_messengers, + VkDebugUtilsMessengerCreateInfoEXT **infos, + VkDebugUtilsMessengerEXT **messengers) { uint32_t n = *num_messengers = 0; const void *pNext = pChain; @@ -722,15 +740,17 @@ } // This utility frees the arrays allocated by layer_copy_tmp_debug_messengers() -static void layer_free_tmp_debug_messengers(VkDebugUtilsMessengerCreateInfoEXT *infos, VkDebugUtilsMessengerEXT *messengers) { +static inline void layer_free_tmp_debug_messengers(VkDebugUtilsMessengerCreateInfoEXT *infos, + VkDebugUtilsMessengerEXT *messengers) { free(infos); free(messengers); } // This utility enables all of the VkDebugUtilsMessengerCreateInfoEXT structs // that were copied by layer_copy_tmp_debug_messengers() -static VkResult layer_enable_tmp_debug_messengers(debug_report_data *debug_data, uint32_t num_messengers, - VkDebugUtilsMessengerCreateInfoEXT *infos, VkDebugUtilsMessengerEXT *messengers) { +static inline VkResult layer_enable_tmp_debug_messengers(debug_report_data *debug_data, uint32_t num_messengers, + VkDebugUtilsMessengerCreateInfoEXT *infos, + VkDebugUtilsMessengerEXT *messengers) { VkResult rtn = VK_SUCCESS; for (uint32_t i = 0; i < num_messengers; i++) { rtn = layer_create_messenger_callback(debug_data, false, &infos[i], NULL, &messengers[i]); @@ -746,8 +766,8 @@ // This utility disables all of the VkDebugUtilsMessengerCreateInfoEXT structs // that were copied by layer_copy_tmp_debug_messengers() -static void layer_disable_tmp_debug_messengers(debug_report_data *debug_data, uint32_t num_messengers, - VkDebugUtilsMessengerEXT *messengers) { +static inline void layer_disable_tmp_debug_messengers(debug_report_data *debug_data, uint32_t num_messengers, + VkDebugUtilsMessengerEXT *messengers) { for (uint32_t i = 0; i < num_messengers; i++) { layer_destroy_messenger_callback(debug_data, messengers[i], NULL); } @@ -799,17 +819,17 @@ } #endif -// Output log message via DEBUG_REPORT -// Takes format and variable arg list so that output string -// is only computed if a message needs to be logged +// Output log message via DEBUG_REPORT. Takes format and variable arg list so that output string is only computed if a message +// needs to be logged #ifndef WIN32 static inline bool log_msg(const debug_report_data *debug_data, VkFlags msg_flags, VkDebugReportObjectTypeEXT object_type, - uint64_t src_object, size_t location, int32_t msg_code, const char *layer_prefix, const char *format, - ...) __attribute__((format(printf, 8, 9))); + uint64_t src_object, int32_t msg_code, const char *format, ...) __attribute__((format(printf, 6, 7))); +static inline bool log_msg(const debug_report_data *debug_data, VkFlags msg_flags, VkDebugReportObjectTypeEXT object_type, + uint64_t src_object, std::string vuid_text, const char *format, ...) + __attribute__((format(printf, 6, 7))); #endif static inline bool log_msg(const debug_report_data *debug_data, VkFlags msg_flags, VkDebugReportObjectTypeEXT object_type, - uint64_t src_object, size_t location, int32_t msg_code, const char *layer_prefix, const char *format, - ...) { + uint64_t src_object, int32_t msg_code, const char *format, ...) { VkFlags local_severity = 0; VkFlags local_type = 0; DebugReportFlagsToAnnotFlags(msg_flags, true, &local_severity, &local_type); @@ -826,8 +846,54 @@ str = nullptr; } va_end(argptr); - bool result = debug_log_msg(debug_data, msg_flags, object_type, src_object, location, msg_code, layer_prefix, - str ? str : "Allocation failure"); + + std::string str_plus_spec_text(str); + + // If the msg_code is in the error map, tack on spec text to error message. + if (validation_error_map.find(msg_code) != validation_error_map.end()) { + str_plus_spec_text += " "; + str_plus_spec_text += validation_error_map[msg_code]; + } + + bool result = debug_log_msg(debug_data, msg_flags, object_type, src_object, 0, msg_code, "Validation", + str_plus_spec_text.c_str() ? str_plus_spec_text.c_str() : "Allocation failure"); + free(str); + return result; +} + +// Overload of log_msg that takes a VUID string in place of a numerical VUID abstraction +static inline bool log_msg(const debug_report_data *debug_data, VkFlags msg_flags, VkDebugReportObjectTypeEXT object_type, + uint64_t src_object, std::string vuid_text, const char *format, ...) { + VkFlags local_severity = 0; + VkFlags local_type = 0; + DebugReportFlagsToAnnotFlags(msg_flags, true, &local_severity, &local_type); + if (!debug_data || !(debug_data->active_severities & local_severity) || !(debug_data->active_types & local_type)) { + // Message is not wanted + return false; + } + + va_list argptr; + va_start(argptr, format); + char *str; + if (-1 == vasprintf(&str, format, argptr)) { + // On failure, glibc vasprintf leaves str undefined + str = nullptr; + } + va_end(argptr); + + std::string str_plus_spec_text(str); + + // If the msg_code is in the error map, get ID, look up spec text, and tack it onto error message. + if (validation_error_text_map.find(vuid_text.c_str()) != validation_error_text_map.end()) { + str_plus_spec_text += " "; + str_plus_spec_text += validation_error_map[validation_error_text_map[vuid_text.c_str()]]; + } + + // Append layer prefix with VUID string, pass in UNDEFINED for numerical VUID + static const int UNDEFINED_VUID = -1; + bool result = debug_log_msg(debug_data, msg_flags, object_type, src_object, 0, UNDEFINED_VUID, "Validation", + str_plus_spec_text.c_str() ? str_plus_spec_text.c_str() : "Allocation failure", vuid_text.c_str()); + free(str); return result; } @@ -839,8 +905,7 @@ PrintMessageFlags(msg_flags, msg_flag_string); - fprintf((FILE *)user_data, "%s(%s): object: 0x%" PRIx64 " type: %d location: %lu msg_code: %d: %s\n", layer_prefix, - msg_flag_string, src_object, obj_type, (unsigned long)location, msg_code, message); + fprintf((FILE *)user_data, "%s(%s): msg_code: %d: %s\n", layer_prefix, msg_flag_string, msg_code, message); fflush((FILE *)user_data); return false; @@ -855,9 +920,7 @@ char buf[2048]; PrintMessageFlags(msg_flags, msg_flag_string); - _snprintf(buf, sizeof(buf) - 1, - "%s (%s): object: 0x%" PRIxPTR " type: %d location: " PRINTF_SIZE_T_SPECIFIER " msg_code: %d: %s\n", layer_prefix, - msg_flag_string, (size_t)src_object, obj_type, location, msg_code, message); + _snprintf(buf, sizeof(buf) - 1, "%s (%s): msg_code: %d: %s\n", layer_prefix, msg_flag_string, msg_code, message); OutputDebugString(buf); #endif @@ -887,9 +950,14 @@ PrintMessageSeverity(message_severity, msg_severity); PrintMessageType(message_type, msg_type); - fprintf((FILE *)user_data, "%s(%s / %s): object: 0x%" PRIx64 " type: %d msgNum: %d - %s\n", callback_data->pMessageIdName, - msg_severity, msg_type, callback_data->pObjects[0].objectHandle, callback_data->pObjects[0].objectType, + fprintf((FILE *)user_data, "%s(%s / %s): msgNum: %d - %s\n", callback_data->pMessageIdName, msg_severity, msg_type, callback_data->messageIdNumber, callback_data->pMessage); + fprintf((FILE *)user_data, " Objects: %d\n", callback_data->objectCount); + for (uint32_t obj = 0; obj < callback_data->objectCount; ++obj) { + fprintf((FILE *)user_data, " [%d] 0x%" PRIx64 ", type: %d, name: %s\n", obj, + callback_data->pObjects[obj].objectHandle, callback_data->pObjects[obj].objectType, + callback_data->pObjects[obj].pObjectName); + } fflush((FILE *)user_data); return false; @@ -906,10 +974,20 @@ PrintMessageSeverity(message_severity, msg_severity); PrintMessageType(message_type, msg_type); - _snprintf(buf, sizeof(buf) - 1, "%s (%s / %s): object: 0x%" PRIx64 " type: %d msgNum: %d - %s\n", - callback_data->pMessageIdName, msg_severity, msg_type, HandleToUint64(callback_data->pObjects[0].objectHandle), - callback_data->pObjects[0].objectType, callback_data->messageIdNumber, callback_data->pMessage); - + size_t buffer_space = sizeof(buf) - 1; + size_t remaining_space = buffer_space; + _snprintf(buf, sizeof(buf) - 1, "%s(%s / %s): msgNum: %d - %s\n", callback_data->pMessageIdName, msg_severity, msg_type, + callback_data->messageIdNumber, callback_data->pMessage); + remaining_space = buffer_space - strlen(buf); + _snprintf(buf, remaining_space, " Objects: %d\n", callback_data->objectCount); + for (uint32_t obj = 0; obj < callback_data->objectCount; ++obj) { + remaining_space = buffer_space - strlen(buf); + if (remaining_space > 0) { + _snprintf(buf, remaining_space, " [%d] 0x%" PRIx64 ", type: %d, name: %s\n", obj, + callback_data->pObjects[obj].objectHandle, callback_data->pObjects[obj].objectType, + callback_data->pObjects[obj].pObjectName); + } + } OutputDebugString(buf); #endif @@ -928,7 +1006,8 @@ log_vector.push_back(log_label_data); } -static void BeginQueueDebugUtilsLabel(debug_report_data *report_data, VkQueue queue, const VkDebugUtilsLabelEXT *label_info) { +static inline void BeginQueueDebugUtilsLabel(debug_report_data *report_data, VkQueue queue, + const VkDebugUtilsLabelEXT *label_info) { if (nullptr != label_info && nullptr != label_info->pLabelName) { auto label_iter = report_data->debugUtilsQueueLabels->find(queue); if (label_iter == report_data->debugUtilsQueueLabels->end()) { @@ -949,7 +1028,7 @@ } } -static void EndQueueDebugUtilsLabel(debug_report_data *report_data, VkQueue queue) { +static inline void EndQueueDebugUtilsLabel(debug_report_data *report_data, VkQueue queue) { auto label_iter = report_data->debugUtilsQueueLabels->find(queue); if (label_iter != report_data->debugUtilsQueueLabels->end()) { // If the last thing was a label insert, we need to pop it off of the label vector before any @@ -965,7 +1044,8 @@ } } -static void InsertQueueDebugUtilsLabel(debug_report_data *report_data, VkQueue queue, const VkDebugUtilsLabelEXT *label_info) { +static inline void InsertQueueDebugUtilsLabel(debug_report_data *report_data, VkQueue queue, + const VkDebugUtilsLabelEXT *label_info) { if (nullptr != label_info && nullptr != label_info->pLabelName) { auto label_iter = report_data->debugUtilsQueueLabels->find(queue); if (label_iter == report_data->debugUtilsQueueLabels->end()) { @@ -988,8 +1068,8 @@ } } -static void BeginCmdDebugUtilsLabel(debug_report_data *report_data, VkCommandBuffer command_buffer, - const VkDebugUtilsLabelEXT *label_info) { +static inline void BeginCmdDebugUtilsLabel(debug_report_data *report_data, VkCommandBuffer command_buffer, + const VkDebugUtilsLabelEXT *label_info) { if (nullptr != label_info && nullptr != label_info->pLabelName) { auto label_iter = report_data->debugUtilsCmdBufLabels->find(command_buffer); if (label_iter == report_data->debugUtilsCmdBufLabels->end()) { @@ -1010,7 +1090,7 @@ } } -static void EndCmdDebugUtilsLabel(debug_report_data *report_data, VkCommandBuffer command_buffer) { +static inline void EndCmdDebugUtilsLabel(debug_report_data *report_data, VkCommandBuffer command_buffer) { auto label_iter = report_data->debugUtilsCmdBufLabels->find(command_buffer); if (label_iter != report_data->debugUtilsCmdBufLabels->end()) { // If the last thing was a label insert, we need to pop it off of the label vector before any @@ -1026,8 +1106,8 @@ } } -static void InsertCmdDebugUtilsLabel(debug_report_data *report_data, VkCommandBuffer command_buffer, - const VkDebugUtilsLabelEXT *label_info) { +static inline void InsertCmdDebugUtilsLabel(debug_report_data *report_data, VkCommandBuffer command_buffer, + const VkDebugUtilsLabelEXT *label_info) { if (nullptr != label_info && nullptr != label_info->pLabelName) { auto label_iter = report_data->debugUtilsCmdBufLabels->find(command_buffer); if (label_iter == report_data->debugUtilsCmdBufLabels->end()) { diff -Nru vulkan-1.1.70+dfsg1/layers/vk_validation_error_database.txt vulkan-1.1.73+dfsg/layers/vk_validation_error_database.txt --- vulkan-1.1.70+dfsg1/layers/vk_validation_error_database.txt 2018-03-09 17:41:55.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/vk_validation_error_database.txt 2018-04-27 11:24:19.000000000 +0000 @@ -10,20 +10,20 @@ # core|ext: Either 'core' for core spec or some extension string that indicates the extension required for this VU to be relevant # errormsg: The unique error message for this check that includes spec language and link # note: Free txt field with any custom notes related to the check in question -VALIDATION_ERROR_00000009~^~Y~^~None~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-commonparent~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'Each of fence, semaphore, and swapchain that are valid handles must have been created, allocated, or retrieved from the same VkInstance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-commonparent)~^~implicit -VALIDATION_ERROR_00000a10~^~N~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-semaphore-01288~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'If semaphore is not VK_NULL_HANDLE it must be unsignaled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-01288)~^~ -VALIDATION_ERROR_00000a12~^~N~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-fence-01289~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-fence-01289)~^~ -VALIDATION_ERROR_00000a14~^~N~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-deviceMask-01290~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must be a valid device mask' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-deviceMask-01290)~^~ -VALIDATION_ERROR_00000a16~^~N~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-deviceMask-01291~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must not be zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-deviceMask-01291)~^~ -VALIDATION_ERROR_00000d16~^~N~^~None~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-swapchain-01675~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'swapchain must not be in the retired state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-swapchain-01675)~^~ -VALIDATION_ERROR_00000dea~^~N~^~None~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHX-semaphore-01781~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHX-semaphore-01781)~^~ -VALIDATION_ERROR_00000dec~^~N~^~None~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHX-semaphore-01782~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'semaphore and fence must not both be equal to VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHX-semaphore-01782)~^~ -VALIDATION_ERROR_00000e18~^~N~^~None~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHX-semaphore-01804~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'semaphore and fence must not both be equal to VK_NULL_HANDLE.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHX-semaphore-01804)~^~ -VALIDATION_ERROR_00008801~^~Y~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-fence-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-fence-parameter)~^~implicit -VALIDATION_ERROR_0001c40d~^~Y~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-pNext-pNext~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-pNext-pNext)~^~implicit -VALIDATION_ERROR_0002b00b~^~Y~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-sType-sType)~^~implicit -VALIDATION_ERROR_0002b801~^~Y~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-semaphore-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-parameter)~^~implicit -VALIDATION_ERROR_0002f001~^~Y~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-swapchain-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'swapchain must be a valid VkSwapchainKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-swapchain-parameter)~^~implicit +VALIDATION_ERROR_00000009~^~Y~^~None~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-commonparent~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'Each of fence, semaphore, and swapchain that are valid handles must have been created, allocated, or retrieved from the same VkInstance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-commonparent)~^~implicit +VALIDATION_ERROR_00000a10~^~N~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-semaphore-01288~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'If semaphore is not VK_NULL_HANDLE it must be unsignaled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-01288)~^~ +VALIDATION_ERROR_00000a12~^~N~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-fence-01289~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-fence-01289)~^~ +VALIDATION_ERROR_00000a14~^~N~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-deviceMask-01290~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must be a valid device mask' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-deviceMask-01290)~^~ +VALIDATION_ERROR_00000a16~^~N~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-deviceMask-01291~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must not be zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-deviceMask-01291)~^~ +VALIDATION_ERROR_00000d16~^~N~^~None~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-swapchain-01675~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'swapchain must not be in the retired state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-swapchain-01675)~^~ +VALIDATION_ERROR_00000dea~^~N~^~None~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-semaphore-01781~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-01781)~^~ +VALIDATION_ERROR_00000dec~^~N~^~None~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-semaphore-01782~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'semaphore and fence must not both be equal to VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-01782)~^~ +VALIDATION_ERROR_00000e18~^~N~^~None~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-semaphore-01804~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'semaphore and fence must not both be equal to VK_NULL_HANDLE.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-01804)~^~ +VALIDATION_ERROR_00008801~^~Y~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-fence-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-fence-parameter)~^~implicit +VALIDATION_ERROR_0001c40d~^~Y~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-pNext-pNext~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-pNext-pNext)~^~implicit +VALIDATION_ERROR_0002b00b~^~Y~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-sType-sType)~^~implicit +VALIDATION_ERROR_0002b801~^~Y~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-semaphore-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-parameter)~^~implicit +VALIDATION_ERROR_0002f001~^~Y~^~Unknown~^~VkAcquireNextImageInfoKHR~^~VUID-VkAcquireNextImageInfoKHR-swapchain-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'swapchain must be a valid VkSwapchainKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-swapchain-parameter)~^~implicit VALIDATION_ERROR_002004f0~^~Y~^~Unknown~^~VkAllocationCallbacks~^~VUID-VkAllocationCallbacks-pfnAllocation-00632~^~core~^~The spec valid usage text states 'pfnAllocation must be a valid pointer to a valid user-defined PFN_vkAllocationFunction' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkAllocationCallbacks-pfnAllocation-00632)~^~ VALIDATION_ERROR_002004f2~^~Y~^~Unknown~^~VkAllocationCallbacks~^~VUID-VkAllocationCallbacks-pfnReallocation-00633~^~core~^~The spec valid usage text states 'pfnReallocation must be a valid pointer to a valid user-defined PFN_vkReallocationFunction' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkAllocationCallbacks-pfnReallocation-00633)~^~ VALIDATION_ERROR_002004f4~^~Y~^~Unknown~^~VkAllocationCallbacks~^~VUID-VkAllocationCallbacks-pfnFree-00634~^~core~^~The spec valid usage text states 'pfnFree must be a valid pointer to a valid user-defined PFN_vkFreeFunction' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkAllocationCallbacks-pfnFree-00634)~^~ @@ -48,56 +48,58 @@ VALIDATION_ERROR_0082e401~^~Y~^~Unknown~^~VkAttachmentDescription~^~VUID-VkAttachmentDescription-storeOp-parameter~^~core~^~The spec valid usage text states 'storeOp must be a valid VkAttachmentStoreOp value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkAttachmentDescription-storeOp-parameter)~^~implicit VALIDATION_ERROR_00a006b2~^~N~^~Unknown~^~VkAttachmentReference~^~VUID-VkAttachmentReference-layout-00857~^~core~^~The spec valid usage text states 'layout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkAttachmentReference-layout-00857)~^~ VALIDATION_ERROR_00a0be01~^~Y~^~Unknown~^~VkAttachmentReference~^~VUID-VkAttachmentReference-layout-parameter~^~core~^~The spec valid usage text states 'layout must be a valid VkImageLayout value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkAttachmentReference-layout-parameter)~^~implicit -VALIDATION_ERROR_00c00009~^~Y~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-commonparent~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'Both of buffer, and memory must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-commonparent)~^~implicit -VALIDATION_ERROR_00c00c72~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-buffer-01593~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'buffer must not already be backed by a memory object' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01593)~^~ -VALIDATION_ERROR_00c00c74~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-buffer-01594~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'buffer must not have been created with any sparse memory binding flags' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01594)~^~ -VALIDATION_ERROR_00c00c76~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-memoryOffset-01595~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'memoryOffset must be less than the size of memory' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-memoryOffset-01595)~^~ -VALIDATION_ERROR_00c00c78~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-buffer-01596~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01596)~^~ -VALIDATION_ERROR_00c00c7a~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-buffer-01597~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'If buffer was created with the VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01597)~^~ -VALIDATION_ERROR_00c00c7c~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-buffer-01598~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'If buffer was created with the VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01598)~^~ -VALIDATION_ERROR_00c00c7e~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-memory-01599~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-memory-01599)~^~ -VALIDATION_ERROR_00c00c80~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-memoryOffset-01600~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-memoryOffset-01600)~^~ -VALIDATION_ERROR_00c00c82~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-size-01601~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-size-01601)~^~ -VALIDATION_ERROR_00c00c84~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-buffer-01602~^~(VK_KHR_bind_memory2)+(VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'If buffer requires a dedicated allocation(as reported by vkGetBufferMemoryRequirements2 in VkMemoryDedicatedRequirements::requiresDedicatedAllocation for image), memory must have been created with VkMemoryDedicatedAllocateInfo::buffer equal to buffer and memoryOffset must be zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01602)~^~ -VALIDATION_ERROR_00c00c86~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-buffer-01603~^~(VK_KHR_bind_memory2)+(VK_NV_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01603)~^~ -VALIDATION_ERROR_00c00c88~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-buffer-01604~^~(VK_KHR_bind_memory2)+(VK_NV_dedicated_allocation)+!(VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01604)~^~ -VALIDATION_ERROR_00c00c8a~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfoKHR-pNext-01605~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'If the pNext chain includes VkBindBufferMemoryDeviceGroupInfo, all instances of memory specified by VkBindBufferMemoryDeviceGroupInfo::pDeviceIndices must have been allocated' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-pNext-01605)~^~ -VALIDATION_ERROR_00c01a01~^~Y~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-buffer-parameter~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-parameter)~^~implicit -VALIDATION_ERROR_00c0c601~^~Y~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-memory-parameter~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memory-parameter)~^~implicit -VALIDATION_ERROR_00c1c40d~^~Y~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-pNext-pNext~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkBindBufferMemoryDeviceGroupInfo' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_00c2b00b~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-sType-sType~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-sType-sType)~^~implicit -VALIDATION_ERROR_00e00009~^~Y~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-commonparent~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'Both of image, and memory that are valid handles must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-commonparent)~^~implicit -VALIDATION_ERROR_00e00c92~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-image-01609~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'image must not already be backed by a memory object' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-image-01609)~^~ -VALIDATION_ERROR_00e00c94~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-image-01610~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'image must not have been created with any sparse memory binding flags' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-image-01610)~^~ -VALIDATION_ERROR_00e00c96~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-memoryOffset-01611~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'memoryOffset must be less than the size of memory' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-memoryOffset-01611)~^~ -VALIDATION_ERROR_00e00c98~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-memory-01612~^~(VK_KHR_bind_memory2)+!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-memory-01612)~^~ -VALIDATION_ERROR_00e00c9a~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-memoryOffset-01613~^~(VK_KHR_bind_memory2)+!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-memoryOffset-01613)~^~ -VALIDATION_ERROR_00e00c9c~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-memory-01614~^~(VK_KHR_bind_memory2)+!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-memory-01614)~^~ -VALIDATION_ERROR_00e00c9e~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01615~^~(VK_KHR_bind_memory2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain does not include an instance of the 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01615)~^~ -VALIDATION_ERROR_00e00ca0~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01616~^~(VK_KHR_bind_memory2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain does not include an instance of the 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01616)~^~ -VALIDATION_ERROR_00e00ca2~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01617~^~(VK_KHR_bind_memory2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain does not include an instance of the 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01617)~^~ -VALIDATION_ERROR_00e00ca4~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01618~^~(VK_KHR_bind_memory2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain includes an instance of the VkBindImagePlaneMemoryInfo structure, image must have been created with the VK_IMAGE_CREATE_DISJOINT_BIT bit set.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01618)~^~ -VALIDATION_ERROR_00e00ca6~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01619~^~(VK_KHR_bind_memory2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2's pNext chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01619)~^~ -VALIDATION_ERROR_00e00ca8~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01620~^~(VK_KHR_bind_memory2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2's pNext chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01620)~^~ -VALIDATION_ERROR_00e00caa~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01621~^~(VK_KHR_bind_memory2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2's pNext chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01621)~^~ -VALIDATION_ERROR_00e00cac~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-image-01622~^~(VK_KHR_bind_memory2)+(VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-image-01622)~^~ -VALIDATION_ERROR_00e00cae~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-image-01623~^~(VK_KHR_bind_memory2)+(VK_NV_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-image-01623)~^~ -VALIDATION_ERROR_00e00cb0~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-image-01624~^~(VK_KHR_bind_memory2)+(VK_NV_dedicated_allocation)+!(VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-image-01624)~^~ -VALIDATION_ERROR_00e00cb2~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-memory-01625~^~(VK_KHR_bind_memory2)+!(VK_KHR_device_group)~^~The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-memory-01625)~^~ -VALIDATION_ERROR_00e00cb4~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01626~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, all instances of memory specified by VkBindImageMemoryDeviceGroupInfo::pDeviceIndices must have been allocated' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01626)~^~ -VALIDATION_ERROR_00e00cb6~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01627~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01627)~^~ -VALIDATION_ERROR_00e00cb8~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01628~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, all elements of VkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions must be valid rectangles contained within the dimensions of image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01628)~^~ -VALIDATION_ERROR_00e00cba~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01629~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01629)~^~ -VALIDATION_ERROR_00e00cbc~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-image-01630~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'If image was created with a valid swapchain handle in VkImageSwapchainCreateInfoKHR::swapchain, then the pNext chain must include a valid instance of VkBindImageMemorySwapchainInfoKHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-image-01630)~^~ -VALIDATION_ERROR_00e00cbe~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01631~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'If the pNext chain includes an instance of VkBindImageMemorySwapchainInfoKHR, memory must be VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01631)~^~ -VALIDATION_ERROR_00e00cc0~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfoKHR-pNext-01632~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'If the pNext chain does not include an instance of VkBindImageMemorySwapchainInfoKHR, memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01632)~^~ -VALIDATION_ERROR_00e0a001~^~Y~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-image-parameter~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-parameter)~^~implicit -VALIDATION_ERROR_00e1c40d~^~Y~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-pNext~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_00e2b00b~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-sType-sType~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-sType-sType)~^~implicit -VALIDATION_ERROR_00e2b00f~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-sType-unique~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-sType-unique)~^~implicit -VALIDATION_ERROR_01000cd8~^~N~^~None~^~VkBindImageMemorySwapchainInfoKHR~^~VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'imageIndex must be less than the number of images in swapchain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644)~^~ -VALIDATION_ERROR_0102b00b~^~N~^~Unknown~^~VkBindImageMemorySwapchainInfoKHR~^~VUID-VkBindImageMemorySwapchainInfoKHR-sType-sType~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemorySwapchainInfoKHR-sType-sType)~^~implicit -VALIDATION_ERROR_0102f001~^~N~^~Unknown~^~VkBindImageMemorySwapchainInfoKHR~^~VUID-VkBindImageMemorySwapchainInfoKHR-swapchain-parameter~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'swapchain must be a valid VkSwapchainKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemorySwapchainInfoKHR-swapchain-parameter)~^~implicit +VALIDATION_ERROR_00c00009~^~Y~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-commonparent~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'Both of buffer, and memory must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-commonparent)~^~implicit +VALIDATION_ERROR_00c00c72~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-buffer-01593~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'buffer must not already be backed by a memory object' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01593)~^~ +VALIDATION_ERROR_00c00c74~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-buffer-01594~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'buffer must not have been created with any sparse memory binding flags' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01594)~^~ +VALIDATION_ERROR_00c00c76~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-memoryOffset-01595~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'memoryOffset must be less than the size of memory' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memoryOffset-01595)~^~ +VALIDATION_ERROR_00c00c78~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-buffer-01596~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01596)~^~ +VALIDATION_ERROR_00c00c7a~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-buffer-01597~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'If buffer was created with the VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01597)~^~ +VALIDATION_ERROR_00c00c7c~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-buffer-01598~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'If buffer was created with the VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01598)~^~ +VALIDATION_ERROR_00c00c7e~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-memory-01599~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memory-01599)~^~ +VALIDATION_ERROR_00c00c80~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-memoryOffset-01600~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memoryOffset-01600)~^~ +VALIDATION_ERROR_00c00c82~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-size-01601~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-size-01601)~^~ +VALIDATION_ERROR_00c00c84~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-buffer-01602~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01602)~^~ +VALIDATION_ERROR_00c00c86~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-buffer-01603~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_NV_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01603)~^~ +VALIDATION_ERROR_00c00c88~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-buffer-01604~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_NV_dedicated_allocation)+!(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01604)~^~ +VALIDATION_ERROR_00c00c8a~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-pNext-01605~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'If the pNext chain includes VkBindBufferMemoryDeviceGroupInfo, all instances of memory specified by VkBindBufferMemoryDeviceGroupInfo::pDeviceIndices must have been allocated' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-pNext-01605)~^~ +VALIDATION_ERROR_00c00ed8~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-memory-01900~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'If the VkMemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfo 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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memory-01900)~^~ +VALIDATION_ERROR_00c01a01~^~Y~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-buffer-parameter~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-parameter)~^~implicit +VALIDATION_ERROR_00c0c601~^~Y~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-memory-parameter~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memory-parameter)~^~implicit +VALIDATION_ERROR_00c1c40d~^~Y~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkBindBufferMemoryDeviceGroupInfo' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-pNext-pNext)~^~implicit +VALIDATION_ERROR_00c2b00b~^~N~^~None~^~VkBindBufferMemoryInfo~^~VUID-VkBindBufferMemoryInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-sType-sType)~^~implicit +VALIDATION_ERROR_00e00009~^~Y~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-commonparent~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'Both of image, and memory that are valid handles must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-commonparent)~^~implicit +VALIDATION_ERROR_00e00c92~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-image-01609~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'image must not already be backed by a memory object' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01609)~^~ +VALIDATION_ERROR_00e00c94~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-image-01610~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'image must not have been created with any sparse memory binding flags' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01610)~^~ +VALIDATION_ERROR_00e00c96~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-memoryOffset-01611~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'memoryOffset must be less than the size of memory' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-memoryOffset-01611)~^~ +VALIDATION_ERROR_00e00c98~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-memory-01612~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-01612)~^~ +VALIDATION_ERROR_00e00c9a~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-memoryOffset-01613~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindImageMemoryInfo-memoryOffset-01613)~^~ +VALIDATION_ERROR_00e00c9c~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-memory-01614~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-01614)~^~ +VALIDATION_ERROR_00e00c9e~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01615~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain does not include an instance of the 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01615)~^~ +VALIDATION_ERROR_00e00ca0~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01616~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain does not include an instance of the 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01616)~^~ +VALIDATION_ERROR_00e00ca2~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01617~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain does not include an instance of the 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01617)~^~ +VALIDATION_ERROR_00e00ca4~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01618~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain includes an instance of the VkBindImagePlaneMemoryInfo structure, image must have been created with the VK_IMAGE_CREATE_DISJOINT_BIT bit set.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01618)~^~ +VALIDATION_ERROR_00e00ca6~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01619~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2's pNext chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01619)~^~ +VALIDATION_ERROR_00e00ca8~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01620~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2's pNext chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01620)~^~ +VALIDATION_ERROR_00e00caa~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01621~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2's pNext chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01621)~^~ +VALIDATION_ERROR_00e00cac~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-image-01622~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01622)~^~ +VALIDATION_ERROR_00e00cae~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-image-01623~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_NV_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01623)~^~ +VALIDATION_ERROR_00e00cb0~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-image-01624~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_NV_dedicated_allocation)+!(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01624)~^~ +VALIDATION_ERROR_00e00cb2~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-memory-01625~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+!(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-01625)~^~ +VALIDATION_ERROR_00e00cb4~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01626~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, all instances of memory specified by VkBindImageMemoryDeviceGroupInfo::pDeviceIndices must have been allocated' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01626)~^~ +VALIDATION_ERROR_00e00cb6~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01627~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01627)~^~ +VALIDATION_ERROR_00e00cb8~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01628~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, all elements of VkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions must be valid rectangles contained within the dimensions of image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01628)~^~ +VALIDATION_ERROR_00e00cba~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01629~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01629)~^~ +VALIDATION_ERROR_00e00cbc~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-image-01630~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'If image was created with a valid swapchain handle in VkImageSwapchainCreateInfoKHR::swapchain, then the pNext chain must include a valid instance of VkBindImageMemorySwapchainInfoKHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01630)~^~ +VALIDATION_ERROR_00e00cbe~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01631~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'If the pNext chain includes an instance of VkBindImageMemorySwapchainInfoKHR, memory must be VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01631)~^~ +VALIDATION_ERROR_00e00cc0~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-01632~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'If the pNext chain does not include an instance of VkBindImageMemorySwapchainInfoKHR, memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01632)~^~ +VALIDATION_ERROR_00e00ede~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-memory-01903~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'If the VkMemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfo 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-01903)~^~ +VALIDATION_ERROR_00e0a001~^~Y~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-image-parameter~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-parameter)~^~implicit +VALIDATION_ERROR_00e1c40d~^~Y~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-pNext)~^~implicit +VALIDATION_ERROR_00e2b00b~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-sType-sType)~^~implicit +VALIDATION_ERROR_00e2b00f~^~N~^~None~^~VkBindImageMemoryInfo~^~VUID-VkBindImageMemoryInfo-sType-unique~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-sType-unique)~^~implicit +VALIDATION_ERROR_01000cd8~^~N~^~None~^~VkBindImageMemorySwapchainInfoKHR~^~VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'imageIndex must be less than the number of images in swapchain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644)~^~ +VALIDATION_ERROR_0102b00b~^~N~^~Unknown~^~VkBindImageMemorySwapchainInfoKHR~^~VUID-VkBindImageMemorySwapchainInfoKHR-sType-sType~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemorySwapchainInfoKHR-sType-sType)~^~implicit +VALIDATION_ERROR_0102f001~^~N~^~Unknown~^~VkBindImageMemorySwapchainInfoKHR~^~VUID-VkBindImageMemorySwapchainInfoKHR-swapchain-parameter~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'swapchain must be a valid VkSwapchainKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemorySwapchainInfoKHR-swapchain-parameter)~^~implicit VALIDATION_ERROR_01200009~^~Y~^~Unknown~^~VkBindSparseInfo~^~VUID-VkBindSparseInfo-commonparent~^~core~^~The spec valid usage text states 'Both of the elements of pSignalSemaphores, and the elements of pWaitSemaphores that are valid handles must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindSparseInfo-commonparent)~^~implicit VALIDATION_ERROR_01210201~^~Y~^~None~^~VkBindSparseInfo~^~VUID-VkBindSparseInfo-pBufferBinds-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindSparseInfo-pBufferBinds-parameter)~^~implicit VALIDATION_ERROR_01218001~^~Y~^~None~^~VkBindSparseInfo~^~VUID-VkBindSparseInfo-pImageBinds-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindSparseInfo-pImageBinds-parameter)~^~implicit @@ -113,10 +115,12 @@ VALIDATION_ERROR_01400728~^~Y~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-flags-00916~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBufferCreateInfo-flags-00916)~^~ VALIDATION_ERROR_0140072a~^~Y~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-flags-00917~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBufferCreateInfo-flags-00917)~^~ VALIDATION_ERROR_0140072c~^~Y~^~SparseBindingImageBufferCreate~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-flags-00918~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBufferCreateInfo-flags-00918)~^~ -VALIDATION_ERROR_01400730~^~N~^~Unknown~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-pNext-00920~^~(VK_KHR_external_memory)~^~The spec valid usage text states 'If the pNext chain contains an instance of VkExternalMemoryBufferCreateInfo, its handleTypes member must only contain bits that are also in VkExternalBufferProperties::externalMemoryProperties.pname:compatibleHandleTypes, as returned by vkGetPhysicalDeviceExternalBufferProperties with pExternalBufferInfo-&gt;handleType equal to any one of the handle types specified in VkExternalMemoryBufferCreateInfo::handleTypes' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-pNext-00920)~^~ -VALIDATION_ERROR_01400ade~^~N~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-sharingMode-01391~^~!(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_01400b16~^~N~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-sharingMode-01419~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-sharingMode-01419)~^~ +VALIDATION_ERROR_01400730~^~N~^~Unknown~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-pNext-00920~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states 'If the pNext chain contains an instance of VkExternalMemoryBufferCreateInfo, its handleTypes member must only contain bits that are also in VkExternalBufferProperties::externalMemoryProperties.pname:compatibleHandleTypes, as returned by vkGetPhysicalDeviceExternalBufferProperties with pExternalBufferInfo-&gt;handleType equal to any one of the handle types specified in VkExternalMemoryBufferCreateInfo::handleTypes' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-pNext-00920)~^~ +VALIDATION_ERROR_01400ade~^~N~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-sharingMode-01391~^~!(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_01400b16~^~N~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-sharingMode-01419~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-sharingMode-01419)~^~ VALIDATION_ERROR_01400c46~^~N~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-pNext-01571~^~(VK_NV_dedicated_allocation)~^~The spec valid usage text states 'If the pNext chain contains an instance of VkDedicatedAllocationBufferCreateInfoNV, 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.0-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-pNext-01571)~^~ +VALIDATION_ERROR_01400ebe~^~N~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-flags-01887~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-flags-01887)~^~ +VALIDATION_ERROR_01400ec0~^~N~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-None-01888~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-None-01888)~^~ VALIDATION_ERROR_01409001~^~Y~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-flags-parameter~^~core~^~The spec valid usage text states 'flags must be a valid combination of VkBufferCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferCreateInfo-flags-parameter)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0141c40d~^~Y~^~Unknown~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states '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 VkDedicatedAllocationBufferCreateInfoNV or VkExternalMemoryBufferCreateInfo' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferCreateInfo-pNext-pNext)~^~implicit VALIDATION_ERROR_0142b00b~^~Y~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferCreateInfo-sType-sType)~^~implicit, TBD in parameter validation layer. @@ -124,7 +128,7 @@ VALIDATION_ERROR_0142c001~^~Y~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-sharingMode-parameter~^~core~^~The spec valid usage text states 'sharingMode must be a valid VkSharingMode value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferCreateInfo-sharingMode-parameter)~^~implicit VALIDATION_ERROR_01430601~^~N~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-usage-parameter~^~core~^~The spec valid usage text states 'usage must be a valid combination of VkBufferUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferCreateInfo-usage-parameter)~^~implicit VALIDATION_ERROR_01430603~^~Y~^~None~^~VkBufferCreateInfo~^~VUID-VkBufferCreateInfo-usage-requiredbitmask~^~core~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferCreateInfo-usage-requiredbitmask)~^~implicit -VALIDATION_ERROR_01600182~^~Y~^~MiscImageLayerTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferOffset-00193~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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 element size' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-bufferOffset-00193)~^~ +VALIDATION_ERROR_01600182~^~Y~^~MiscImageLayerTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferOffset-00193~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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 element size' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-bufferOffset-00193)~^~ VALIDATION_ERROR_01600184~^~Y~^~MiscImageLayerTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferOffset-00194~^~core~^~The spec valid usage text states 'bufferOffset must be a multiple of 4' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-bufferOffset-00194)~^~ VALIDATION_ERROR_01600186~^~Y~^~MiscImageLayerTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferRowLength-00195~^~core~^~The spec valid usage text states 'bufferRowLength must be 0, or greater than or equal to the width member of imageExtent' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-bufferRowLength-00195)~^~ VALIDATION_ERROR_01600188~^~Y~^~MiscImageLayerTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferImageHeight-00196~^~core~^~The spec valid usage text states 'bufferImageHeight must be 0, or greater than or equal to the height member of imageExtent' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-bufferImageHeight-00196)~^~ @@ -133,39 +137,40 @@ VALIDATION_ERROR_0160018e~^~Y~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-srcImage-00199~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBufferImageCopy-srcImage-00199)~^~ VALIDATION_ERROR_01600190~^~N~^~Unknown~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-imageOffset-00200~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBufferImageCopy-imageOffset-00200)~^~This VU has two distinct conditions and the implemented check looks at both, but there are two distinct test cases for this enum VALIDATION_ERROR_01600192~^~Y~^~MiscImageLayerTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-srcImage-00201~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBufferImageCopy-srcImage-00201)~^~ -VALIDATION_ERROR_01600196~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferRowLength-00203~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_01600198~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferImageHeight-00204~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_0160019a~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-imageOffset-00205~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_0160019c~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferOffset-00206~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_0160019e~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-imageExtent-00207~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_016001a0~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-imageExtent-00208~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_016001a2~^~Y~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-imageExtent-00209~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_01600196~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferRowLength-00203~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_01600198~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferImageHeight-00204~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_0160019a~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-imageOffset-00205~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_0160019c~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferOffset-00206~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_0160019e~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-imageExtent-00207~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_016001a0~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-imageExtent-00208~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_016001a2~^~Y~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-imageExtent-00209~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ VALIDATION_ERROR_016001a6~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-aspectMask-00211~^~core~^~The spec valid usage text states 'The aspectMask member of imageSubresource must specify aspects present in the calling command's VkImage parameter' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-aspectMask-00211)~^~ VALIDATION_ERROR_016001a8~^~Y~^~ImageBufferCopyTests~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-aspectMask-00212~^~core~^~The spec valid usage text states 'The aspectMask member of imageSubresource must only have a single bit set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-aspectMask-00212)~^~ VALIDATION_ERROR_016001aa~^~Y~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-baseArrayLayer-00213~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBufferImageCopy-baseArrayLayer-00213)~^~ VALIDATION_ERROR_016001ac~^~N~^~Unknown~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-00214~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBufferImageCopy-None-00214)~^~ -VALIDATION_ERROR_01600c2c~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferOffset-01558~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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 element size' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-bufferOffset-01558)~^~ -VALIDATION_ERROR_01600c2e~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferOffset-01559~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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 features-formats-compatible-planes' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-bufferOffset-01559)~^~ -VALIDATION_ERROR_01600c30~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-aspectMask-01560~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-aspectMask-01560)~^~ -VALIDATION_ERROR_01600d8e~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01735~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01735)~^~ -VALIDATION_ERROR_01600d90~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01736~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01736)~^~ -VALIDATION_ERROR_01600d92~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01737~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01737)~^~ -VALIDATION_ERROR_01600d94~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01738~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01738)~^~ -VALIDATION_ERROR_01600d96~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01739~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01739)~^~ -VALIDATION_ERROR_01600d98~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01740~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01740)~^~ -VALIDATION_ERROR_01600d9a~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01741~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01741)~^~ +VALIDATION_ERROR_01600c2c~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferOffset-01558~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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 element size' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-bufferOffset-01558)~^~ +VALIDATION_ERROR_01600c2e~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-bufferOffset-01559~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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 features-formats-compatible-planes' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-bufferOffset-01559)~^~ +VALIDATION_ERROR_01600c30~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-aspectMask-01560~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-aspectMask-01560)~^~ +VALIDATION_ERROR_01600d8e~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01735~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01735)~^~ +VALIDATION_ERROR_01600d90~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01736~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01736)~^~ +VALIDATION_ERROR_01600d92~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01737~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01737)~^~ +VALIDATION_ERROR_01600d94~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01738~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01738)~^~ +VALIDATION_ERROR_01600d96~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01739~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01739)~^~ +VALIDATION_ERROR_01600d98~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01740~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01740)~^~ +VALIDATION_ERROR_01600d9a~^~N~^~None~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-None-01741~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01741)~^~ VALIDATION_ERROR_0160aa01~^~N~^~Unknown~^~VkBufferImageCopy~^~VUID-VkBufferImageCopy-imageSubresource-parameter~^~core~^~The spec valid usage text states 'imageSubresource must be a valid VkImageSubresourceLayers structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-imageSubresource-parameter)~^~implicit VALIDATION_ERROR_01800946~^~Y~^~InvalidBarriers~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-offset-01187~^~core~^~The spec valid usage text states 'offset must be less than the size of buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-offset-01187)~^~ VALIDATION_ERROR_01800948~^~N~^~Unknown~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-size-01188~^~core~^~The spec valid usage text states 'If size is not equal to VK_WHOLE_SIZE, size must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-size-01188)~^~ VALIDATION_ERROR_0180094a~^~Y~^~InvalidBarriers~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-size-01189~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-size-01189)~^~ -VALIDATION_ERROR_0180094c~^~Y~^~InvalidBarrierQueueFamily~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01190~^~!(VK_KHR_external_memory)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_0180094e~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01191~^~(VK_KHR_external_memory)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01191)~^~ -VALIDATION_ERROR_01800950~^~Y~^~InvalidBarrierQueueFamily~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01192~^~!(VK_KHR_external_memory)~^~The spec valid usage text states '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 devsandqueues-queueprops)' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01192)~^~ -VALIDATION_ERROR_01800952~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01193~^~(VK_KHR_external_memory)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01193)~^~ +VALIDATION_ERROR_0180094c~^~Y~^~InvalidBarrierQueueFamily~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01190~^~!(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_0180094e~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01191~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01191)~^~ +VALIDATION_ERROR_01800950~^~Y~^~InvalidBarrierQueueFamily~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01192~^~!(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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 devsandqueues-queueprops)' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01192)~^~ +VALIDATION_ERROR_01800952~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01193~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01193)~^~ VALIDATION_ERROR_01800958~^~Y~^~InvalidBarrierQueueFamily~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01196~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01196)~^~ -VALIDATION_ERROR_01800dc6~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01763~^~(VK_KHR_external_memory)~^~The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01763)~^~ -VALIDATION_ERROR_01800dc8~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01764~^~(VK_KHR_external_memory)~^~The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01764)~^~ -VALIDATION_ERROR_01800dca~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01765~^~(VK_KHR_external_memory)~^~The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01765)~^~ +VALIDATION_ERROR_01800dc6~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01763~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01763)~^~ +VALIDATION_ERROR_01800dc8~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01764~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01764)~^~ +VALIDATION_ERROR_01800dca~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01765~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01765)~^~ +VALIDATION_ERROR_01800f16~^~N~^~None~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-01931~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01931)~^~ VALIDATION_ERROR_01801a01~^~Y~^~Unknown~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-buffer-parameter~^~core~^~The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-parameter)~^~implicit VALIDATION_ERROR_01806801~^~Y~^~Unknown~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-dstAccessMask-parameter~^~core~^~The spec valid usage text states 'dstAccessMask must be a valid combination of VkAccessFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-dstAccessMask-parameter)~^~implicit VALIDATION_ERROR_0181c40d~^~Y~^~Unknown~^~VkBufferMemoryBarrier~^~VUID-VkBufferMemoryBarrier-pNext-pNext~^~core~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-pNext-pNext)~^~implicit, TBD in parameter validation layer. @@ -191,6 +196,8 @@ VALIDATION_ERROR_01c0002a~^~N~^~Unknown~^~VkClearAttachment~^~VUID-VkClearAttachment-clearValue-00021~^~core~^~The spec valid usage text states 'clearValue must be a valid VkClearValue union' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkClearAttachment-clearValue-00021)~^~ VALIDATION_ERROR_01c00c01~^~Y~^~Unknown~^~VkClearAttachment~^~VUID-VkClearAttachment-aspectMask-parameter~^~core~^~The spec valid usage text states 'aspectMask must be a valid combination of VkImageAspectFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkClearAttachment-aspectMask-parameter)~^~implicit VALIDATION_ERROR_01c00c03~^~Y~^~Unknown~^~VkClearAttachment~^~VUID-VkClearAttachment-aspectMask-requiredbitmask~^~core~^~The spec valid usage text states 'aspectMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkClearAttachment-aspectMask-requiredbitmask)~^~implicit +VALIDATION_ERROR_01c00e22~^~N~^~None~^~VkClearAttachment~^~VUID-VkClearAttachment-commandBuffer-01809~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then the attachment to be cleared must not be a protected image.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkClearAttachment-commandBuffer-01809)~^~ +VALIDATION_ERROR_01c00e24~^~N~^~None~^~VkClearAttachment~^~VUID-VkClearAttachment-commandBuffer-01810~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then the attachment to be cleared must not be an unprotected image.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkClearAttachment-commandBuffer-01810)~^~ VALIDATION_ERROR_01e0002c~^~N~^~Unknown~^~VkClearDepthStencilValue~^~VUID-VkClearDepthStencilValue-depth-00022~^~(VK_EXT_depth_range_unrestricted)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkClearDepthStencilValue-depth-00022)~^~ VALIDATION_ERROR_0200002e~^~N~^~Unknown~^~VkClearValue~^~VUID-VkClearValue-depthStencil-00023~^~core~^~The spec valid usage text states 'depthStencil must be a valid VkClearDepthStencilValue structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkClearValue-depthStencil-00023)~^~ VALIDATION_ERROR_02200009~^~Y~^~Unknown~^~VkCmdProcessCommandsInfoNVX~^~VUID-VkCmdProcessCommandsInfoNVX-commonparent~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'Each of indirectCommandsLayout, objectTable, sequencesCountBuffer, sequencesIndexBuffer, and targetCommandBuffer that are valid handles must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkCmdProcessCommandsInfoNVX-commonparent)~^~implicit @@ -264,6 +271,10 @@ VALIDATION_ERROR_032002b6~^~Y~^~Unknown~^~VkCopyDescriptorSet~^~VUID-VkCopyDescriptorSet-dstBinding-00347~^~core~^~The spec valid usage text states 'dstBinding must be a valid binding within dstSet' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkCopyDescriptorSet-dstBinding-00347)~^~ VALIDATION_ERROR_032002b8~^~Y~^~Unknown~^~VkCopyDescriptorSet~^~VUID-VkCopyDescriptorSet-dstArrayElement-00348~^~core~^~The spec valid usage text states '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 descriptorsets-updates-consecutive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkCopyDescriptorSet-dstArrayElement-00348)~^~ VALIDATION_ERROR_032002ba~^~Y~^~Unknown~^~VkCopyDescriptorSet~^~VUID-VkCopyDescriptorSet-srcSet-00349~^~core~^~The spec valid usage text states '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 descriptorsets-updates-consecutive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-00349)~^~ +VALIDATION_ERROR_03200efc~^~Y~^~None~^~VkCopyDescriptorSet~^~VUID-VkCopyDescriptorSet-srcSet-01918~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If srcSet's layout was created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set, then dstSet's layout must also have been created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-01918)~^~ +VALIDATION_ERROR_03200efe~^~Y~^~None~^~VkCopyDescriptorSet~^~VUID-VkCopyDescriptorSet-srcSet-01919~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If srcSet's layout was created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set, then dstSet's layout must also have been created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-01919)~^~ +VALIDATION_ERROR_03200f00~^~Y~^~None~^~VkCopyDescriptorSet~^~VUID-VkCopyDescriptorSet-srcSet-01920~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If the descriptor pool from which srcSet was allocated was created with the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT 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_EXT flag set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-01920)~^~ +VALIDATION_ERROR_03200f02~^~Y~^~None~^~VkCopyDescriptorSet~^~VUID-VkCopyDescriptorSet-srcSet-01921~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If the descriptor pool from which srcSet was allocated was created without the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT 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_EXT flag set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-01921)~^~ VALIDATION_ERROR_03207601~^~Y~^~UpdateDestroyDescriptorSetLayout~^~VkCopyDescriptorSet~^~VUID-VkCopyDescriptorSet-dstSet-parameter~^~core~^~The spec valid usage text states 'dstSet must be a valid VkDescriptorSet handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkCopyDescriptorSet-dstSet-parameter)~^~implicit VALIDATION_ERROR_0321c40d~^~Y~^~Unknown~^~VkCopyDescriptorSet~^~VUID-VkCopyDescriptorSet-pNext-pNext~^~core~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkCopyDescriptorSet-pNext-pNext)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0322b00b~^~N~^~Unknown~^~VkCopyDescriptorSet~^~VUID-VkCopyDescriptorSet-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkCopyDescriptorSet-sType-sType)~^~implicit, TBD in parameter validation layer. @@ -293,7 +304,6 @@ VALIDATION_ERROR_03a2f41b~^~Y~^~Unknown~^~VkDebugMarkerObjectTagInfoEXT~^~VUID-VkDebugMarkerObjectTagInfoEXT-tagSize-arraylength~^~(VK_EXT_debug_marker)~^~The spec valid usage text states 'tagSize must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectTagInfoEXT-tagSize-arraylength)~^~implicit VALIDATION_ERROR_03c00ad2~^~N~^~Unknown~^~VkDebugReportCallbackCreateInfoEXT~^~VUID-VkDebugReportCallbackCreateInfoEXT-pfnCallback-01385~^~(VK_EXT_debug_report)~^~The spec valid usage text states 'pfnCallback must be a valid PFN_vkDebugReportCallbackEXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugReportCallbackCreateInfoEXT-pfnCallback-01385)~^~ VALIDATION_ERROR_03c09001~^~Y~^~Unknown~^~VkDebugReportCallbackCreateInfoEXT~^~VUID-VkDebugReportCallbackCreateInfoEXT-flags-parameter~^~(VK_EXT_debug_report)~^~The spec valid usage text states 'flags must be a valid combination of VkDebugReportFlagBitsEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugReportCallbackCreateInfoEXT-flags-parameter)~^~implicit, TBD in parameter validation layer. -VALIDATION_ERROR_03c1c40d~^~Y~^~Unknown~^~VkDebugReportCallbackCreateInfoEXT~^~VUID-VkDebugReportCallbackCreateInfoEXT-pNext-pNext~^~(VK_EXT_debug_report)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugReportCallbackCreateInfoEXT-pNext-pNext)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_03c2b00b~^~Y~^~Unknown~^~VkDebugReportCallbackCreateInfoEXT~^~VUID-VkDebugReportCallbackCreateInfoEXT-sType-sType~^~(VK_EXT_debug_report)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugReportCallbackCreateInfoEXT-sType-sType)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_03e2b00b~^~N~^~Unknown~^~VkDedicatedAllocationBufferCreateInfoNV~^~VUID-VkDedicatedAllocationBufferCreateInfoNV-sType-sType~^~(VK_NV_dedicated_allocation)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDedicatedAllocationBufferCreateInfoNV-sType-sType)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_040007c4~^~N~^~Unknown~^~VkDedicatedAllocationImageCreateInfoNV~^~VUID-VkDedicatedAllocationImageCreateInfoNV-dedicatedAllocation-00994~^~(VK_NV_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDedicatedAllocationImageCreateInfoNV-dedicatedAllocation-00994)~^~ @@ -314,10 +324,10 @@ VALIDATION_ERROR_044002ac~^~Y~^~DSBufferInfoErrors~^~VkDescriptorBufferInfo~^~VUID-VkDescriptorBufferInfo-range-00342~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkDescriptorBufferInfo-range-00342)~^~ VALIDATION_ERROR_04401a01~^~Y~^~Unknown~^~VkDescriptorBufferInfo~^~VUID-VkDescriptorBufferInfo-buffer-parameter~^~core~^~The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorBufferInfo-buffer-parameter)~^~implicit VALIDATION_ERROR_04600009~^~Y~^~Unknown~^~VkDescriptorImageInfo~^~VUID-VkDescriptorImageInfo-commonparent~^~core~^~The spec valid usage text states 'Both of imageView, and sampler that are valid handles must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorImageInfo-commonparent)~^~implicit -VALIDATION_ERROR_046002ae~^~Y~^~Maint1BindingSliceOf3DImage~^~VkDescriptorImageInfo~^~VUID-VkDescriptorImageInfo-imageView-00343~^~(VK_KHR_maintenance1)~^~The spec valid usage text states 'imageView must not be 2D or 2D array image view created from a 3D image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorImageInfo-imageView-00343)~^~ +VALIDATION_ERROR_046002ae~^~Y~^~Maint1BindingSliceOf3DImage~^~VkDescriptorImageInfo~^~VUID-VkDescriptorImageInfo-imageView-00343~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'imageView must not be 2D or 2D array image view created from a 3D image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorImageInfo-imageView-00343)~^~ VALIDATION_ERROR_046002b0~^~Y~^~Unknown~^~VkDescriptorImageInfo~^~VUID-VkDescriptorImageInfo-imageLayout-00344~^~core~^~The spec valid usage text states 'imageLayout must match the actual VkImageLayout of each subresource accessible from imageView at the time this descriptor is accessed' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorImageInfo-imageLayout-00344)~^~ -VALIDATION_ERROR_04600c36~^~N~^~None~^~VkDescriptorImageInfo~^~VUID-VkDescriptorImageInfo-sampler-01563~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If sampler is used and enables sampler Y'CBCR conversion:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorImageInfo-sampler-01563)~^~ -VALIDATION_ERROR_04600c38~^~N~^~None~^~VkDescriptorImageInfo~^~VUID-VkDescriptorImageInfo-sampler-01564~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If sampler is used and does not enable sampler Y'CBCR conversion 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.0-extensions/html/vkspec.html#VUID-VkDescriptorImageInfo-sampler-01564)~^~ +VALIDATION_ERROR_04600c36~^~N~^~None~^~VkDescriptorImageInfo~^~VUID-VkDescriptorImageInfo-sampler-01563~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If sampler is used and enables sampler Y'CBCR conversion:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorImageInfo-sampler-01563)~^~ +VALIDATION_ERROR_04600c38~^~N~^~None~^~VkDescriptorImageInfo~^~VUID-VkDescriptorImageInfo-sampler-01564~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If sampler is used and does not enable sampler Y'CBCR conversion 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.0-extensions/html/vkspec.html#VUID-VkDescriptorImageInfo-sampler-01564)~^~ VALIDATION_ERROR_0480025a~^~Y~^~InvalidCreateDescriptorPool~^~VkDescriptorPoolCreateInfo~^~VUID-VkDescriptorPoolCreateInfo-maxSets-00301~^~core~^~The spec valid usage text states 'maxSets must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorPoolCreateInfo-maxSets-00301)~^~ VALIDATION_ERROR_04809001~^~Y~^~Unknown~^~VkDescriptorPoolCreateInfo~^~VUID-VkDescriptorPoolCreateInfo-flags-parameter~^~core~^~The spec valid usage text states 'flags must be a valid combination of VkDescriptorPoolCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorPoolCreateInfo-flags-parameter)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0481c40d~^~Y~^~Unknown~^~VkDescriptorPoolCreateInfo~^~VUID-VkDescriptorPoolCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorPoolCreateInfo-pNext-pNext)~^~implicit, TBD in parameter validation layer. @@ -327,12 +337,13 @@ VALIDATION_ERROR_04a0025c~^~Y~^~InvalidCreateDescriptorPool~^~VkDescriptorPoolSize~^~VUID-VkDescriptorPoolSize-descriptorCount-00302~^~core~^~The spec valid usage text states 'descriptorCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorPoolSize-descriptorCount-00302)~^~ VALIDATION_ERROR_04a30401~^~Y~^~Unknown~^~VkDescriptorPoolSize~^~VUID-VkDescriptorPoolSize-type-parameter~^~core~^~The spec valid usage text states 'type must be a valid VkDescriptorType value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorPoolSize-type-parameter)~^~implicit VALIDATION_ERROR_04c00009~^~Y~^~Unknown~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-commonparent~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-commonparent)~^~implicit -VALIDATION_ERROR_04c00264~^~Y~^~AllocDescriptorFromEmptyPool~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-00306~^~!(VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_04c00266~^~Y~^~AllocDescriptorFromEmptyPool~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-descriptorPool-00307~^~!(VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_04c00264~^~Y~^~AllocDescriptorFromEmptyPool~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-00306~^~!(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_04c00266~^~Y~^~AllocDescriptorFromEmptyPool~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-descriptorPool-00307~^~!(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ VALIDATION_ERROR_04c00268~^~Y~^~AllocatePushDescriptorSet~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-pSetLayouts-00308~^~(VK_KHR_push_descriptor)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pSetLayouts-00308)~^~ +VALIDATION_ERROR_04c017c8~^~Y~^~DescriptorIndexingSetLayout~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-pSetLayouts-03044~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If any element of pSetLayouts was created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT bit set, descriptorPool must have been created with the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT flag set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pSetLayouts-03044)~^~ VALIDATION_ERROR_04c04601~^~Y~^~None~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-descriptorPool-parameter~^~core~^~The spec valid usage text states 'descriptorPool must be a valid VkDescriptorPool handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-descriptorPool-parameter)~^~implicit VALIDATION_ERROR_04c04a1b~^~N~^~Unknown~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-arraylength~^~core~^~The spec valid usage text states 'descriptorSetCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-arraylength)~^~implicit -VALIDATION_ERROR_04c1c40d~^~Y~^~Unknown~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-pNext-pNext~^~core~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pNext-pNext)~^~implicit, TBD in parameter validation layer. +VALIDATION_ERROR_04c1c40d~^~Y~^~Unknown~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-pNext-pNext~^~core~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkDescriptorSetVariableDescriptorCountAllocateInfoEXT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pNext-pNext)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_04c22c01~^~Y~^~None~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-pSetLayouts-parameter~^~core~^~The spec valid usage text states 'pSetLayouts must be a valid pointer to an array of descriptorSetCount valid VkDescriptorSetLayout handles' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pSetLayouts-parameter)~^~implicit VALIDATION_ERROR_04c2b00b~^~Y~^~Unknown~^~VkDescriptorSetAllocateInfo~^~VUID-VkDescriptorSetAllocateInfo-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-sType-sType)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_04e00234~^~Y~^~None~^~VkDescriptorSetLayoutBinding~^~VUID-VkDescriptorSetLayoutBinding-descriptorType-00282~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkDescriptorSetLayoutBinding-descriptorType-00282)~^~ @@ -342,31 +353,34 @@ VALIDATION_ERROR_0500022e~^~Y~^~DuplicateDescriptorBinding~^~VkDescriptorSetLayoutCreateInfo~^~VUID-VkDescriptorSetLayoutCreateInfo-binding-00279~^~core~^~The spec valid usage text states 'The VkDescriptorSetLayoutBinding::binding members of the elements of the pBindings array must each have different values.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-binding-00279)~^~ VALIDATION_ERROR_05000230~^~Y~^~InvalidPushDescriptorSetLayout~^~VkDescriptorSetLayoutCreateInfo~^~VUID-VkDescriptorSetLayoutCreateInfo-flags-00280~^~(VK_KHR_push_descriptor)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-00280)~^~ VALIDATION_ERROR_05000232~^~Y~^~InvalidPushDescriptorSetLayout~^~VkDescriptorSetLayoutCreateInfo~^~VUID-VkDescriptorSetLayoutCreateInfo-flags-00281~^~(VK_KHR_push_descriptor)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-00281)~^~ +VALIDATION_ERROR_05001770~^~Y~^~DescriptorIndexingSetLayout~^~VkDescriptorSetLayoutCreateInfo~^~VUID-VkDescriptorSetLayoutCreateInfo-flags-03000~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If any binding has the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT bit set, flags must include VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-03000)~^~ +VALIDATION_ERROR_05001772~^~N~^~None~^~VkDescriptorSetLayoutCreateInfo~^~VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-03001~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If any binding has the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-03001)~^~ VALIDATION_ERROR_05009001~^~Y~^~Unknown~^~VkDescriptorSetLayoutCreateInfo~^~VUID-VkDescriptorSetLayoutCreateInfo-flags-parameter~^~core~^~The spec valid usage text states 'flags must be a valid combination of VkDescriptorSetLayoutCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-parameter)~^~implicit VALIDATION_ERROR_0500fc01~^~Y~^~Unknown~^~VkDescriptorSetLayoutCreateInfo~^~VUID-VkDescriptorSetLayoutCreateInfo-pBindings-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-pBindings-parameter)~^~implicit -VALIDATION_ERROR_0501c40d~^~Y~^~Unknown~^~VkDescriptorSetLayoutCreateInfo~^~VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext)~^~implicit, TBD in parameter validation layer. +VALIDATION_ERROR_0501c40d~^~Y~^~Unknown~^~VkDescriptorSetLayoutCreateInfo~^~VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkDescriptorSetLayoutBindingFlagsCreateInfoEXT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0502b00b~^~Y~^~Unknown~^~VkDescriptorSetLayoutCreateInfo~^~VUID-VkDescriptorSetLayoutCreateInfo-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-sType-sType)~^~implicit, TBD in parameter validation layer. -VALIDATION_ERROR_05200009~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-commonparent~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'Both of descriptorSetLayout, and pipelineLayout that are valid handles must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-commonparent)~^~implicit -VALIDATION_ERROR_052002bc~^~N~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350)~^~ -VALIDATION_ERROR_052002be~^~N~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351~^~(VK_KHR_descriptor_update_template)+(VK_KHR_push_descriptor)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351)~^~ -VALIDATION_ERROR_052002c0~^~N~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352~^~(VK_KHR_descriptor_update_template)+(VK_KHR_push_descriptor)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352)~^~ -VALIDATION_ERROR_052002c2~^~N~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353~^~(VK_KHR_descriptor_update_template)+(VK_KHR_push_descriptor)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353)~^~ -VALIDATION_ERROR_05204c01~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorSetLayout-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'If descriptorSetLayout is not VK_NULL_HANDLE, descriptorSetLayout must be a valid VkDescriptorSetLayout handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorSetLayout-parameter)~^~implicit -VALIDATION_ERROR_0520501b~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorUpdateEntryCount-arraylength~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'descriptorUpdateEntryCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorUpdateEntryCount-arraylength)~^~implicit -VALIDATION_ERROR_05209005~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-flags-zerobitmask~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-flags-zerobitmask)~^~implicit -VALIDATION_ERROR_05213201~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-pDescriptorUpdateEntries-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'pDescriptorUpdateEntries must be a valid pointer to an array of descriptorUpdateEntryCount valid VkDescriptorUpdateTemplateEntry structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-pDescriptorUpdateEntries-parameter)~^~implicit -VALIDATION_ERROR_0521c40d~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-pNext-pNext~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_0522b00b~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-sType-sType~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-sType-sType)~^~implicit -VALIDATION_ERROR_0522f801~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'templateType must be a valid VkDescriptorUpdateTemplateType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-parameter)~^~implicit -VALIDATION_ERROR_054002c4~^~N~^~Unknown~^~VkDescriptorUpdateTemplateEntry~^~VUID-VkDescriptorUpdateTemplateEntry-dstBinding-00354~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateEntry-dstBinding-00354)~^~ -VALIDATION_ERROR_054002c6~^~N~^~Unknown~^~VkDescriptorUpdateTemplateEntry~^~VUID-VkDescriptorUpdateTemplateEntry-dstArrayElement-00355~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states '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 descriptorsets-updates-consecutive' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateEntry-dstArrayElement-00355)~^~ -VALIDATION_ERROR_05404e01~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateEntry~^~VUID-VkDescriptorUpdateTemplateEntry-descriptorType-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'descriptorType must be a valid VkDescriptorType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateEntry-descriptorType-parameter)~^~implicit +VALIDATION_ERROR_05200009~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-commonparent~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'Both of descriptorSetLayout, and pipelineLayout that are valid handles must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-commonparent)~^~implicit +VALIDATION_ERROR_052002bc~^~Y~^~CreateDescriptorUpdateTemplate~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350)~^~ +VALIDATION_ERROR_052002be~^~Y~^~CreateDescriptorUpdateTemplate~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)+(VK_KHR_push_descriptor)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351)~^~ +VALIDATION_ERROR_052002c0~^~Y~^~CreateDescriptorUpdateTemplate~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)+(VK_KHR_push_descriptor)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352)~^~ +VALIDATION_ERROR_052002c2~^~Y~^~CreateDescriptorUpdateTemplate~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)+(VK_KHR_push_descriptor)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353)~^~ +VALIDATION_ERROR_05204c01~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorSetLayout-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'If descriptorSetLayout is not VK_NULL_HANDLE, descriptorSetLayout must be a valid VkDescriptorSetLayout handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorSetLayout-parameter)~^~implicit +VALIDATION_ERROR_0520501b~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorUpdateEntryCount-arraylength~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'descriptorUpdateEntryCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorUpdateEntryCount-arraylength)~^~implicit +VALIDATION_ERROR_05209005~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-flags-zerobitmask~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-flags-zerobitmask)~^~implicit +VALIDATION_ERROR_05213201~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-pDescriptorUpdateEntries-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'pDescriptorUpdateEntries must be a valid pointer to an array of descriptorUpdateEntryCount valid VkDescriptorUpdateTemplateEntry structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-pDescriptorUpdateEntries-parameter)~^~implicit +VALIDATION_ERROR_0521c40d~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-pNext-pNext)~^~implicit +VALIDATION_ERROR_0522b00b~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-sType-sType)~^~implicit +VALIDATION_ERROR_0522f801~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateCreateInfo~^~VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'templateType must be a valid VkDescriptorUpdateTemplateType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-parameter)~^~implicit +VALIDATION_ERROR_054002c4~^~N~^~Unknown~^~VkDescriptorUpdateTemplateEntry~^~VUID-VkDescriptorUpdateTemplateEntry-dstBinding-00354~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateEntry-dstBinding-00354)~^~ +VALIDATION_ERROR_054002c6~^~N~^~Unknown~^~VkDescriptorUpdateTemplateEntry~^~VUID-VkDescriptorUpdateTemplateEntry-dstArrayElement-00355~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states '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 descriptorsets-updates-consecutive' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateEntry-dstArrayElement-00355)~^~ +VALIDATION_ERROR_05404e01~^~Y~^~Unknown~^~VkDescriptorUpdateTemplateEntry~^~VUID-VkDescriptorUpdateTemplateEntry-descriptorType-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'descriptorType must be a valid VkDescriptorType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateEntry-descriptorType-parameter)~^~implicit VALIDATION_ERROR_056002e8~^~Y~^~Unknown~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-queueFamilyIndex-00372~^~core~^~The spec valid usage text states '' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-queueFamilyIndex-00372)~^~ -VALIDATION_ERROR_056002ea~^~N~^~Unknown~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-pNext-00373~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'If the pNext chain includes a VkPhysicalDeviceFeatures2 structure, then pEnabledFeatures must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-pNext-00373)~^~ -VALIDATION_ERROR_056002ec~^~Y~^~Maintenance1AndNegativeViewport~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-00374~^~(VK_AMD_negative_viewport_height)+!(VK_VERSION_1_1)+(VK_KHR_maintenance1)~^~The spec valid usage text states 'ppEnabledExtensionNames must not contain both VK_KHR_maintenance1 and VK_AMD_negative_viewport_height' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-00374)~^~ +VALIDATION_ERROR_056002ea~^~N~^~Unknown~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-pNext-00373~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'If the pNext chain includes a VkPhysicalDeviceFeatures2 structure, then pEnabledFeatures must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-pNext-00373)~^~ +VALIDATION_ERROR_056002ec~^~Y~^~Maintenance1AndNegativeViewport~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-00374~^~(VK_AMD_negative_viewport_height)+!(VK_VERSION_1_1)+(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'ppEnabledExtensionNames must not contain both VK_KHR_maintenance1 and VK_AMD_negative_viewport_height' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-00374)~^~ +VALIDATION_ERROR_05600e60~^~N~^~None~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-01840~^~(VK_AMD_negative_viewport_height)+(VK_VERSION_1_1)~^~The spec valid usage text states 'ppEnabledExtensionNames must not contain VK_AMD_negative_viewport_height' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-01840)~^~ VALIDATION_ERROR_05609005~^~Y~^~Unknown~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-flags-zerobitmask~^~core~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-flags-zerobitmask)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_05615a01~^~N~^~Unknown~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-pEnabledFeatures-parameter~^~core~^~The spec valid usage text states 'If pEnabledFeatures is not NULL, pEnabledFeatures must be a valid pointer to a valid VkPhysicalDeviceFeatures structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-pEnabledFeatures-parameter)~^~implicit -VALIDATION_ERROR_0561c40d~^~N~^~Unknown~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states '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 VkDeviceGroupDeviceCreateInfo, VkPhysicalDevice16BitStorageFeatures, VkPhysicalDeviceFeatures2, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceSamplerYcbcrConversionFeatures, or VkPhysicalDeviceVariablePointerFeatures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-pNext-pNext)~^~implicit +VALIDATION_ERROR_0561c40d~^~N~^~Unknown~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states '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 VkDeviceGroupDeviceCreateInfo, VkPhysicalDevice16BitStorageFeatures, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, VkPhysicalDeviceFeatures2, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceSamplerYcbcrConversionFeatures, or VkPhysicalDeviceVariablePointerFeatures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-pNext-pNext)~^~implicit VALIDATION_ERROR_0561fe01~^~Y~^~Unknown~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-pQueueCreateInfos-parameter~^~core~^~The spec valid usage text states 'pQueueCreateInfos must be a valid pointer to an array of queueCreateInfoCount valid VkDeviceQueueCreateInfo structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-pQueueCreateInfos-parameter)~^~implicit VALIDATION_ERROR_05628e01~^~Y~^~Unknown~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-parameter)~^~implicit VALIDATION_ERROR_05629001~^~Y~^~Unknown~^~VkDeviceCreateInfo~^~VUID-VkDeviceCreateInfo-ppEnabledLayerNames-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledLayerNames-parameter)~^~implicit @@ -380,45 +394,45 @@ VALIDATION_ERROR_05a2b00b~^~Y~^~Unknown~^~VkDeviceGeneratedCommandsFeaturesNVX~^~VUID-VkDeviceGeneratedCommandsFeaturesNVX-sType-sType~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_FEATURES_NVX' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGeneratedCommandsFeaturesNVX-sType-sType)~^~implicit VALIDATION_ERROR_05c1c40d~^~N~^~Unknown~^~VkDeviceGeneratedCommandsLimitsNVX~^~VUID-VkDeviceGeneratedCommandsLimitsNVX-pNext-pNext~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGeneratedCommandsLimitsNVX-pNext-pNext)~^~implicit VALIDATION_ERROR_05c2b00b~^~Y~^~Unknown~^~VkDeviceGeneratedCommandsLimitsNVX~^~VUID-VkDeviceGeneratedCommandsLimitsNVX-sType-sType~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_LIMITS_NVX' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGeneratedCommandsLimitsNVX-sType-sType)~^~implicit -VALIDATION_ERROR_05e008bc~^~N~^~Unknown~^~VkDeviceGroupBindSparseInfo~^~VUID-VkDeviceGroupBindSparseInfo-resourceDeviceIndex-01118~^~(VK_KHR_device_group)~^~The spec valid usage text states 'resourceDeviceIndex and memoryDeviceIndex must both be valid device indices.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupBindSparseInfo-resourceDeviceIndex-01118)~^~ -VALIDATION_ERROR_05e008be~^~N~^~Unknown~^~VkDeviceGroupBindSparseInfo~^~VUID-VkDeviceGroupBindSparseInfo-memoryDeviceIndex-01119~^~(VK_KHR_device_group)~^~The spec valid usage text states 'Each memory allocation bound in this batch must have allocated an instance for memoryDeviceIndex.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupBindSparseInfo-memoryDeviceIndex-01119)~^~ -VALIDATION_ERROR_05e2b00b~^~N~^~Unknown~^~VkDeviceGroupBindSparseInfo~^~VUID-VkDeviceGroupBindSparseInfo-sType-sType~^~(VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupBindSparseInfo-sType-sType)~^~implicit -VALIDATION_ERROR_060000d4~^~N~^~Unknown~^~VkDeviceGroupCommandBufferBeginInfo~^~VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00106~^~(VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must be a valid device mask value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00106)~^~ -VALIDATION_ERROR_060000d6~^~N~^~Unknown~^~VkDeviceGroupCommandBufferBeginInfo~^~VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00107~^~(VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must not be zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00107)~^~ -VALIDATION_ERROR_0602b00b~^~N~^~Unknown~^~VkDeviceGroupCommandBufferBeginInfo~^~VUID-VkDeviceGroupCommandBufferBeginInfo-sType-sType~^~(VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupCommandBufferBeginInfo-sType-sType)~^~implicit -VALIDATION_ERROR_062002ee~^~N~^~Unknown~^~VkDeviceGroupDeviceCreateInfo~^~VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00375~^~(VK_KHR_device_group_creation)~^~The spec valid usage text states 'Each element of pPhysicalDevices must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00375)~^~ -VALIDATION_ERROR_062002f0~^~N~^~Unknown~^~VkDeviceGroupDeviceCreateInfo~^~VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00376~^~(VK_KHR_device_group_creation)~^~The spec valid usage text states 'All elements of pPhysicalDevices must be in the same device group as enumerated by vkEnumeratePhysicalDeviceGroups' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00376)~^~ -VALIDATION_ERROR_062002f2~^~N~^~Unknown~^~VkDeviceGroupDeviceCreateInfo~^~VUID-VkDeviceGroupDeviceCreateInfo-physicalDeviceCount-00377~^~(VK_KHR_device_group_creation)~^~The spec valid usage text states 'If physicalDeviceCount is not 0, the physicalDevice parameter of vkCreateDevice must be an element of pPhysicalDevices.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-physicalDeviceCount-00377)~^~ -VALIDATION_ERROR_0621dc01~^~N~^~Unknown~^~VkDeviceGroupDeviceCreateInfo~^~VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-parameter~^~(VK_KHR_device_group_creation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-parameter)~^~implicit -VALIDATION_ERROR_0622b00b~^~N~^~Unknown~^~VkDeviceGroupDeviceCreateInfo~^~VUID-VkDeviceGroupDeviceCreateInfo-sType-sType~^~(VK_KHR_device_group_creation)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-sType-sType)~^~implicit -VALIDATION_ERROR_06400a22~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-swapchainCount-01297~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'swapchainCount must equal 0 or VkPresentInfoKHR::swapchainCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-swapchainCount-01297)~^~ -VALIDATION_ERROR_06400a24~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-mode-01298~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01298)~^~ -VALIDATION_ERROR_06400a26~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-mode-01299~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01299)~^~ -VALIDATION_ERROR_06400a28~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-mode-01300~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01300)~^~ -VALIDATION_ERROR_06400a2a~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-mode-01301~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01301)~^~ -VALIDATION_ERROR_06400a2c~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-01302~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-01302)~^~ -VALIDATION_ERROR_06400a2e~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-mode-01303~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01303)~^~ -VALIDATION_ERROR_0640ce01~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-mode-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'mode must be a valid VkDeviceGroupPresentModeFlagBitsKHR value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-parameter)~^~implicit -VALIDATION_ERROR_06414001~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-parameter)~^~implicit -VALIDATION_ERROR_0642b00b~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-sType-sType)~^~implicit -VALIDATION_ERROR_06600712~^~N~^~Unknown~^~VkDeviceGroupRenderPassBeginInfo~^~VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905~^~(VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must be a valid device mask value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905)~^~ -VALIDATION_ERROR_06600714~^~N~^~Unknown~^~VkDeviceGroupRenderPassBeginInfo~^~VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00906~^~(VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must not be zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00906)~^~ -VALIDATION_ERROR_06600716~^~N~^~Unknown~^~VkDeviceGroupRenderPassBeginInfo~^~VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907~^~(VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must be a subset of the command buffer's initial device mask' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907)~^~ -VALIDATION_ERROR_06600718~^~N~^~Unknown~^~VkDeviceGroupRenderPassBeginInfo~^~VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908~^~(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908)~^~ -VALIDATION_ERROR_06614201~^~N~^~Unknown~^~VkDeviceGroupRenderPassBeginInfo~^~VUID-VkDeviceGroupRenderPassBeginInfo-pDeviceRenderAreas-parameter~^~(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-pDeviceRenderAreas-parameter)~^~implicit -VALIDATION_ERROR_0662b00b~^~N~^~Unknown~^~VkDeviceGroupRenderPassBeginInfo~^~VUID-VkDeviceGroupRenderPassBeginInfo-sType-sType~^~(VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-sType-sType)~^~implicit -VALIDATION_ERROR_068000a4~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-waitSemaphoreCount-00082~^~(VK_KHR_device_group)~^~The spec valid usage text states 'waitSemaphoreCount must equal VkSubmitInfo::waitSemaphoreCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-waitSemaphoreCount-00082)~^~ -VALIDATION_ERROR_068000a6~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-commandBufferCount-00083~^~(VK_KHR_device_group)~^~The spec valid usage text states 'commandBufferCount must equal VkSubmitInfo::commandBufferCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-commandBufferCount-00083)~^~ -VALIDATION_ERROR_068000a8~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-signalSemaphoreCount-00084~^~(VK_KHR_device_group)~^~The spec valid usage text states 'signalSemaphoreCount must equal VkSubmitInfo::signalSemaphoreCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-signalSemaphoreCount-00084)~^~ -VALIDATION_ERROR_068000aa~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-00085~^~(VK_KHR_device_group)~^~The spec valid usage text states 'All elements of pWaitSemaphoreDeviceIndices and pSignalSemaphoreDeviceIndices must be valid device indices' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-00085)~^~ -VALIDATION_ERROR_068000ac~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-00086~^~(VK_KHR_device_group)~^~The spec valid usage text states 'All elements of pCommandBufferDeviceMasks must be valid device masks' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-00086)~^~ -VALIDATION_ERROR_06811201~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-parameter~^~(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-parameter)~^~implicit -VALIDATION_ERROR_06823001~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-pSignalSemaphoreDeviceIndices-parameter~^~(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pSignalSemaphoreDeviceIndices-parameter)~^~implicit -VALIDATION_ERROR_06827201~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-parameter~^~(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-parameter)~^~implicit -VALIDATION_ERROR_0682b00b~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-sType-sType~^~(VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-sType-sType)~^~implicit -VALIDATION_ERROR_06a0d001~^~N~^~Unknown~^~VkDeviceGroupSwapchainCreateInfoKHR~^~VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'modes must be a valid combination of VkDeviceGroupPresentModeFlagBitsKHR values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-parameter)~^~implicit -VALIDATION_ERROR_06a0d003~^~N~^~Unknown~^~VkDeviceGroupSwapchainCreateInfoKHR~^~VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-requiredbitmask~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'modes must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-requiredbitmask)~^~implicit -VALIDATION_ERROR_06a2b00b~^~N~^~Unknown~^~VkDeviceGroupSwapchainCreateInfoKHR~^~VUID-VkDeviceGroupSwapchainCreateInfoKHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSwapchainCreateInfoKHR-sType-sType)~^~implicit +VALIDATION_ERROR_05e008bc~^~N~^~Unknown~^~VkDeviceGroupBindSparseInfo~^~VUID-VkDeviceGroupBindSparseInfo-resourceDeviceIndex-01118~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'resourceDeviceIndex and memoryDeviceIndex must both be valid device indices.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupBindSparseInfo-resourceDeviceIndex-01118)~^~ +VALIDATION_ERROR_05e008be~^~N~^~Unknown~^~VkDeviceGroupBindSparseInfo~^~VUID-VkDeviceGroupBindSparseInfo-memoryDeviceIndex-01119~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'Each memory allocation bound in this batch must have allocated an instance for memoryDeviceIndex.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupBindSparseInfo-memoryDeviceIndex-01119)~^~ +VALIDATION_ERROR_05e2b00b~^~N~^~Unknown~^~VkDeviceGroupBindSparseInfo~^~VUID-VkDeviceGroupBindSparseInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupBindSparseInfo-sType-sType)~^~implicit +VALIDATION_ERROR_060000d4~^~N~^~Unknown~^~VkDeviceGroupCommandBufferBeginInfo~^~VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00106~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must be a valid device mask value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00106)~^~ +VALIDATION_ERROR_060000d6~^~N~^~Unknown~^~VkDeviceGroupCommandBufferBeginInfo~^~VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00107~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must not be zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00107)~^~ +VALIDATION_ERROR_0602b00b~^~N~^~Unknown~^~VkDeviceGroupCommandBufferBeginInfo~^~VUID-VkDeviceGroupCommandBufferBeginInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupCommandBufferBeginInfo-sType-sType)~^~implicit +VALIDATION_ERROR_062002ee~^~N~^~Unknown~^~VkDeviceGroupDeviceCreateInfo~^~VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00375~^~(VK_VERSION_1_1,VK_KHR_device_group_creation)~^~The spec valid usage text states 'Each element of pPhysicalDevices must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00375)~^~ +VALIDATION_ERROR_062002f0~^~N~^~Unknown~^~VkDeviceGroupDeviceCreateInfo~^~VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00376~^~(VK_VERSION_1_1,VK_KHR_device_group_creation)~^~The spec valid usage text states 'All elements of pPhysicalDevices must be in the same device group as enumerated by vkEnumeratePhysicalDeviceGroups' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00376)~^~ +VALIDATION_ERROR_062002f2~^~N~^~Unknown~^~VkDeviceGroupDeviceCreateInfo~^~VUID-VkDeviceGroupDeviceCreateInfo-physicalDeviceCount-00377~^~(VK_VERSION_1_1,VK_KHR_device_group_creation)~^~The spec valid usage text states 'If physicalDeviceCount is not 0, the physicalDevice parameter of vkCreateDevice must be an element of pPhysicalDevices.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-physicalDeviceCount-00377)~^~ +VALIDATION_ERROR_0621dc01~^~N~^~Unknown~^~VkDeviceGroupDeviceCreateInfo~^~VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group_creation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-parameter)~^~implicit +VALIDATION_ERROR_0622b00b~^~N~^~Unknown~^~VkDeviceGroupDeviceCreateInfo~^~VUID-VkDeviceGroupDeviceCreateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_device_group_creation)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-sType-sType)~^~implicit +VALIDATION_ERROR_06400a22~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-swapchainCount-01297~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'swapchainCount must equal 0 or VkPresentInfoKHR::swapchainCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-swapchainCount-01297)~^~ +VALIDATION_ERROR_06400a24~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-mode-01298~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01298)~^~ +VALIDATION_ERROR_06400a26~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-mode-01299~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01299)~^~ +VALIDATION_ERROR_06400a28~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-mode-01300~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01300)~^~ +VALIDATION_ERROR_06400a2a~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-mode-01301~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01301)~^~ +VALIDATION_ERROR_06400a2c~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-01302~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-01302)~^~ +VALIDATION_ERROR_06400a2e~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-mode-01303~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01303)~^~ +VALIDATION_ERROR_0640ce01~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-mode-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'mode must be a valid VkDeviceGroupPresentModeFlagBitsKHR value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-parameter)~^~implicit +VALIDATION_ERROR_06414001~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-parameter)~^~implicit +VALIDATION_ERROR_0642b00b~^~N~^~Unknown~^~VkDeviceGroupPresentInfoKHR~^~VUID-VkDeviceGroupPresentInfoKHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-sType-sType)~^~implicit +VALIDATION_ERROR_06600712~^~N~^~Unknown~^~VkDeviceGroupRenderPassBeginInfo~^~VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must be a valid device mask value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905)~^~ +VALIDATION_ERROR_06600714~^~N~^~Unknown~^~VkDeviceGroupRenderPassBeginInfo~^~VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00906~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must not be zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00906)~^~ +VALIDATION_ERROR_06600716~^~N~^~Unknown~^~VkDeviceGroupRenderPassBeginInfo~^~VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must be a subset of the command buffer's initial device mask' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907)~^~ +VALIDATION_ERROR_06600718~^~N~^~Unknown~^~VkDeviceGroupRenderPassBeginInfo~^~VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908)~^~ +VALIDATION_ERROR_06614201~^~N~^~Unknown~^~VkDeviceGroupRenderPassBeginInfo~^~VUID-VkDeviceGroupRenderPassBeginInfo-pDeviceRenderAreas-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-pDeviceRenderAreas-parameter)~^~implicit +VALIDATION_ERROR_0662b00b~^~N~^~Unknown~^~VkDeviceGroupRenderPassBeginInfo~^~VUID-VkDeviceGroupRenderPassBeginInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-sType-sType)~^~implicit +VALIDATION_ERROR_068000a4~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-waitSemaphoreCount-00082~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'waitSemaphoreCount must equal VkSubmitInfo::waitSemaphoreCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-waitSemaphoreCount-00082)~^~ +VALIDATION_ERROR_068000a6~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-commandBufferCount-00083~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'commandBufferCount must equal VkSubmitInfo::commandBufferCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-commandBufferCount-00083)~^~ +VALIDATION_ERROR_068000a8~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-signalSemaphoreCount-00084~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'signalSemaphoreCount must equal VkSubmitInfo::signalSemaphoreCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-signalSemaphoreCount-00084)~^~ +VALIDATION_ERROR_068000aa~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-00085~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'All elements of pWaitSemaphoreDeviceIndices and pSignalSemaphoreDeviceIndices must be valid device indices' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-00085)~^~ +VALIDATION_ERROR_068000ac~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-00086~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'All elements of pCommandBufferDeviceMasks must be valid device masks' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-00086)~^~ +VALIDATION_ERROR_06811201~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-parameter)~^~implicit +VALIDATION_ERROR_06823001~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-pSignalSemaphoreDeviceIndices-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pSignalSemaphoreDeviceIndices-parameter)~^~implicit +VALIDATION_ERROR_06827201~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-parameter)~^~implicit +VALIDATION_ERROR_0682b00b~^~N~^~Unknown~^~VkDeviceGroupSubmitInfo~^~VUID-VkDeviceGroupSubmitInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-sType-sType)~^~implicit +VALIDATION_ERROR_06a0d001~^~N~^~Unknown~^~VkDeviceGroupSwapchainCreateInfoKHR~^~VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'modes must be a valid combination of VkDeviceGroupPresentModeFlagBitsKHR values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-parameter)~^~implicit +VALIDATION_ERROR_06a0d003~^~N~^~Unknown~^~VkDeviceGroupSwapchainCreateInfoKHR~^~VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-requiredbitmask~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'modes must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-requiredbitmask)~^~implicit +VALIDATION_ERROR_06a2b00b~^~N~^~Unknown~^~VkDeviceGroupSwapchainCreateInfoKHR~^~VUID-VkDeviceGroupSwapchainCreateInfoKHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupSwapchainCreateInfoKHR-sType-sType)~^~implicit VALIDATION_ERROR_06c002fa~^~Y~^~Unknown~^~VkDeviceQueueCreateInfo~^~VUID-VkDeviceQueueCreateInfo-queueFamilyIndex-00381~^~core~^~The spec valid usage text states 'queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-queueFamilyIndex-00381)~^~ VALIDATION_ERROR_06c002fc~^~Y~^~Unknown~^~VkDeviceQueueCreateInfo~^~VUID-VkDeviceQueueCreateInfo-queueCount-00382~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-queueCount-00382)~^~ VALIDATION_ERROR_06c002fe~^~Y~^~Unknown~^~VkDeviceQueueCreateInfo~^~VUID-VkDeviceQueueCreateInfo-pQueuePriorities-00383~^~core~^~The spec valid usage text states 'Each element of pQueuePriorities must be between 0.0 and 1.0 inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-pQueuePriorities-00383)~^~ @@ -457,7 +471,7 @@ VALIDATION_ERROR_0782b00b~^~Y~^~Unknown~^~VkDisplaySurfaceCreateInfoKHR~^~VUID-VkDisplaySurfaceCreateInfoKHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_display)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-sType-sType)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_07830201~^~Y~^~Unknown~^~VkDisplaySurfaceCreateInfoKHR~^~VUID-VkDisplaySurfaceCreateInfoKHR-transform-parameter~^~(VK_KHR_surface)+(VK_KHR_display)~^~The spec valid usage text states 'transform must be a valid VkSurfaceTransformFlagBitsKHR value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-transform-parameter)~^~implicit VALIDATION_ERROR_07a00450~^~N~^~Unknown~^~VkDrawIndexedIndirectCommand~^~VUID-VkDrawIndexedIndirectCommand-None-00552~^~core~^~The spec valid usage text states 'For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in fxvertex-input' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDrawIndexedIndirectCommand-None-00552)~^~ -VALIDATION_ERROR_07a00452~^~N~^~Unknown~^~VkDrawIndexedIndirectCommand~^~VUID-VkDrawIndexedIndirectCommand-indexSize-00553~^~core~^~The spec valid usage text states '(indexSize * (firstIndex + indexCount) + offset) must be less than or equal to the size of the currently 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.0/html/vkspec.html#VUID-VkDrawIndexedIndirectCommand-indexSize-00553)~^~ +VALIDATION_ERROR_07a00452~^~N~^~Unknown~^~VkDrawIndexedIndirectCommand~^~VUID-VkDrawIndexedIndirectCommand-indexSize-00553~^~core~^~The spec valid usage text states '(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.0/html/vkspec.html#VUID-VkDrawIndexedIndirectCommand-indexSize-00553)~^~ VALIDATION_ERROR_07a00454~^~N~^~Unknown~^~VkDrawIndexedIndirectCommand~^~VUID-VkDrawIndexedIndirectCommand-firstInstance-00554~^~core~^~The spec valid usage text states 'If the drawIndirectFirstInstance feature is not enabled, firstInstance must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDrawIndexedIndirectCommand-firstInstance-00554)~^~ VALIDATION_ERROR_07c003e8~^~N~^~Unknown~^~VkDrawIndirectCommand~^~VUID-VkDrawIndirectCommand-None-00500~^~core~^~The spec valid usage text states 'For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in fxvertex-input' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDrawIndirectCommand-None-00500)~^~ VALIDATION_ERROR_07c003ea~^~N~^~Unknown~^~VkDrawIndirectCommand~^~VUID-VkDrawIndirectCommand-firstInstance-00501~^~core~^~The spec valid usage text states 'If the drawIndirectFirstInstance feature is not enabled, firstInstance must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDrawIndirectCommand-firstInstance-00501)~^~ @@ -466,35 +480,26 @@ VALIDATION_ERROR_07e2b00b~^~Y~^~Unknown~^~VkEventCreateInfo~^~VUID-VkEventCreateInfo-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EVENT_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkEventCreateInfo-sType-sType)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_08000520~^~N~^~Unknown~^~VkExportMemoryAllocateInfo~^~VUID-VkExportMemoryAllocateInfo-handleTypes-00656~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states 'The bits in handleTypes must be supported and compatible, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfo-handleTypes-00656)~^~ VALIDATION_ERROR_08009e01~^~N~^~Unknown~^~VkExportMemoryAllocateInfo~^~VUID-VkExportMemoryAllocateInfo-handleTypes-parameter~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states 'handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfo-handleTypes-parameter)~^~implicit -VALIDATION_ERROR_0801c40d~^~N~^~Unknown~^~VkExportMemoryAllocateInfo~^~VUID-VkExportMemoryAllocateInfo-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfo-pNext-pNext)~^~implicit VALIDATION_ERROR_0802b00b~^~N~^~Unknown~^~VkExportMemoryAllocateInfo~^~VUID-VkExportMemoryAllocateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfo-sType-sType)~^~implicit VALIDATION_ERROR_08209e01~^~N~^~Unknown~^~VkExportMemoryAllocateInfoNV~^~VUID-VkExportMemoryAllocateInfoNV-handleTypes-parameter~^~(VK_NV_external_memory)~^~The spec valid usage text states 'handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfoNV-handleTypes-parameter)~^~implicit -VALIDATION_ERROR_0821c40d~^~N~^~Unknown~^~VkExportMemoryAllocateInfoNV~^~VUID-VkExportMemoryAllocateInfoNV-pNext-pNext~^~(VK_NV_external_memory)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfoNV-pNext-pNext)~^~implicit VALIDATION_ERROR_0822b00b~^~N~^~Unknown~^~VkExportMemoryAllocateInfoNV~^~VUID-VkExportMemoryAllocateInfoNV-sType-sType~^~(VK_NV_external_memory)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfoNV-sType-sType)~^~implicit VALIDATION_ERROR_08400522~^~N~^~Unknown~^~VkExportMemoryWin32HandleInfoKHR~^~VUID-VkExportMemoryWin32HandleInfoKHR-handleTypes-00657~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states '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, VkExportMemoryWin32HandleInfoKHR must not be in the pNext chain of VkMemoryAllocateInfo.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoKHR-handleTypes-00657)~^~ VALIDATION_ERROR_0840f401~^~N~^~Unknown~^~VkExportMemoryWin32HandleInfoKHR~^~VUID-VkExportMemoryWin32HandleInfoKHR-pAttributes-parameter~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoKHR-pAttributes-parameter)~^~implicit -VALIDATION_ERROR_0841c40d~^~N~^~Unknown~^~VkExportMemoryWin32HandleInfoKHR~^~VUID-VkExportMemoryWin32HandleInfoKHR-pNext-pNext~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoKHR-pNext-pNext)~^~implicit VALIDATION_ERROR_0842b00b~^~N~^~Unknown~^~VkExportMemoryWin32HandleInfoKHR~^~VUID-VkExportMemoryWin32HandleInfoKHR-sType-sType~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoKHR-sType-sType)~^~implicit VALIDATION_ERROR_0860f401~^~N~^~Unknown~^~VkExportMemoryWin32HandleInfoNV~^~VUID-VkExportMemoryWin32HandleInfoNV-pAttributes-parameter~^~(VK_NV_external_memory_win32)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoNV-pAttributes-parameter)~^~implicit -VALIDATION_ERROR_0861c40d~^~N~^~Unknown~^~VkExportMemoryWin32HandleInfoNV~^~VUID-VkExportMemoryWin32HandleInfoNV-pNext-pNext~^~(VK_NV_external_memory_win32)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoNV-pNext-pNext)~^~implicit VALIDATION_ERROR_0862b00b~^~N~^~Unknown~^~VkExportMemoryWin32HandleInfoNV~^~VUID-VkExportMemoryWin32HandleInfoNV-sType-sType~^~(VK_NV_external_memory_win32)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoNV-sType-sType)~^~implicit -VALIDATION_ERROR_088008c8~^~N~^~Unknown~^~VkExportSemaphoreCreateInfo~^~VUID-VkExportSemaphoreCreateInfo-handleTypes-01124~^~(VK_KHR_external_semaphore)~^~The spec valid usage text states 'The bits in handleTypes must be supported and compatible, as reported by VkExternalSemaphoreProperties.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-handleTypes-01124)~^~ -VALIDATION_ERROR_08809e01~^~N~^~Unknown~^~VkExportSemaphoreCreateInfo~^~VUID-VkExportSemaphoreCreateInfo-handleTypes-parameter~^~(VK_KHR_external_semaphore)~^~The spec valid usage text states 'handleTypes must be a valid combination of VkExternalSemaphoreHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-handleTypes-parameter)~^~implicit -VALIDATION_ERROR_0881c40d~^~N~^~Unknown~^~VkExportSemaphoreCreateInfo~^~VUID-VkExportSemaphoreCreateInfo-pNext-pNext~^~(VK_KHR_external_semaphore)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_0882b00b~^~N~^~Unknown~^~VkExportSemaphoreCreateInfo~^~VUID-VkExportSemaphoreCreateInfo-sType-sType~^~(VK_KHR_external_semaphore)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-sType-sType)~^~implicit +VALIDATION_ERROR_088008c8~^~N~^~Unknown~^~VkExportSemaphoreCreateInfo~^~VUID-VkExportSemaphoreCreateInfo-handleTypes-01124~^~(VK_VERSION_1_1,VK_KHR_external_semaphore)~^~The spec valid usage text states 'The bits in handleTypes must be supported and compatible, as reported by VkExternalSemaphoreProperties.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-handleTypes-01124)~^~ +VALIDATION_ERROR_08809e01~^~N~^~Unknown~^~VkExportSemaphoreCreateInfo~^~VUID-VkExportSemaphoreCreateInfo-handleTypes-parameter~^~(VK_VERSION_1_1,VK_KHR_external_semaphore)~^~The spec valid usage text states 'handleTypes must be a valid combination of VkExternalSemaphoreHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-handleTypes-parameter)~^~implicit +VALIDATION_ERROR_0882b00b~^~N~^~Unknown~^~VkExportSemaphoreCreateInfo~^~VUID-VkExportSemaphoreCreateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_external_semaphore)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-sType-sType)~^~implicit VALIDATION_ERROR_08a008ca~^~N~^~Unknown~^~VkExportSemaphoreWin32HandleInfoKHR~^~VUID-VkExportSemaphoreWin32HandleInfoKHR-handleTypes-01125~^~(VK_KHR_external_semaphore_win32)~^~The spec valid usage text states '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 in the pNext chain of VkSemaphoreCreateInfo.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreWin32HandleInfoKHR-handleTypes-01125)~^~ VALIDATION_ERROR_08a0f401~^~N~^~Unknown~^~VkExportSemaphoreWin32HandleInfoKHR~^~VUID-VkExportSemaphoreWin32HandleInfoKHR-pAttributes-parameter~^~(VK_KHR_external_semaphore_win32)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreWin32HandleInfoKHR-pAttributes-parameter)~^~implicit -VALIDATION_ERROR_08a1c40d~^~N~^~Unknown~^~VkExportSemaphoreWin32HandleInfoKHR~^~VUID-VkExportSemaphoreWin32HandleInfoKHR-pNext-pNext~^~(VK_KHR_external_semaphore_win32)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreWin32HandleInfoKHR-pNext-pNext)~^~implicit VALIDATION_ERROR_08a2b00b~^~N~^~Unknown~^~VkExportSemaphoreWin32HandleInfoKHR~^~VUID-VkExportSemaphoreWin32HandleInfoKHR-sType-sType~^~(VK_KHR_external_semaphore_win32)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreWin32HandleInfoKHR-sType-sType)~^~implicit -VALIDATION_ERROR_08c09e01~^~N~^~Unknown~^~VkExternalMemoryBufferCreateInfo~^~VUID-VkExternalMemoryBufferCreateInfo-handleTypes-parameter~^~(VK_KHR_external_memory)~^~The spec valid usage text states 'handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryBufferCreateInfo-handleTypes-parameter)~^~implicit -VALIDATION_ERROR_08c1c40d~^~N~^~Unknown~^~VkExternalMemoryBufferCreateInfo~^~VUID-VkExternalMemoryBufferCreateInfo-pNext-pNext~^~(VK_KHR_external_memory)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryBufferCreateInfo-pNext-pNext)~^~implicit, TBD in parameter validation layer. -VALIDATION_ERROR_08c2b00b~^~N~^~Unknown~^~VkExternalMemoryBufferCreateInfo~^~VUID-VkExternalMemoryBufferCreateInfo-sType-sType~^~(VK_KHR_external_memory)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryBufferCreateInfo-sType-sType)~^~implicit -VALIDATION_ERROR_08e09e01~^~N~^~Unknown~^~VkExternalMemoryImageCreateInfo~^~VUID-VkExternalMemoryImageCreateInfo-handleTypes-parameter~^~(VK_KHR_external_memory)~^~The spec valid usage text states 'handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-handleTypes-parameter)~^~implicit -VALIDATION_ERROR_08e09e03~^~N~^~Unknown~^~VkExternalMemoryImageCreateInfo~^~VUID-VkExternalMemoryImageCreateInfo-handleTypes-requiredbitmask~^~(VK_KHR_external_memory)~^~The spec valid usage text states 'handleTypes must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-handleTypes-requiredbitmask)~^~implicit -VALIDATION_ERROR_08e1c40d~^~N~^~Unknown~^~VkExternalMemoryImageCreateInfo~^~VUID-VkExternalMemoryImageCreateInfo-pNext-pNext~^~(VK_KHR_external_memory)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_08e2b00b~^~N~^~Unknown~^~VkExternalMemoryImageCreateInfo~^~VUID-VkExternalMemoryImageCreateInfo-sType-sType~^~(VK_KHR_external_memory)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-sType-sType)~^~implicit +VALIDATION_ERROR_08c09e01~^~N~^~Unknown~^~VkExternalMemoryBufferCreateInfo~^~VUID-VkExternalMemoryBufferCreateInfo-handleTypes-parameter~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states 'handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryBufferCreateInfo-handleTypes-parameter)~^~implicit +VALIDATION_ERROR_08c2b00b~^~N~^~Unknown~^~VkExternalMemoryBufferCreateInfo~^~VUID-VkExternalMemoryBufferCreateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryBufferCreateInfo-sType-sType)~^~implicit +VALIDATION_ERROR_08e09e01~^~N~^~Unknown~^~VkExternalMemoryImageCreateInfo~^~VUID-VkExternalMemoryImageCreateInfo-handleTypes-parameter~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states 'handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-handleTypes-parameter)~^~implicit +VALIDATION_ERROR_08e09e03~^~N~^~Unknown~^~VkExternalMemoryImageCreateInfo~^~VUID-VkExternalMemoryImageCreateInfo-handleTypes-requiredbitmask~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states 'handleTypes must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-handleTypes-requiredbitmask)~^~implicit +VALIDATION_ERROR_08e2b00b~^~N~^~Unknown~^~VkExternalMemoryImageCreateInfo~^~VUID-VkExternalMemoryImageCreateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-sType-sType)~^~implicit VALIDATION_ERROR_09009e01~^~N~^~Unknown~^~VkExternalMemoryImageCreateInfoNV~^~VUID-VkExternalMemoryImageCreateInfoNV-handleTypes-parameter~^~(VK_NV_external_memory)~^~The spec valid usage text states 'handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfoNV-handleTypes-parameter)~^~implicit -VALIDATION_ERROR_0901c40d~^~N~^~Unknown~^~VkExternalMemoryImageCreateInfoNV~^~VUID-VkExternalMemoryImageCreateInfoNV-pNext-pNext~^~(VK_NV_external_memory)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfoNV-pNext-pNext)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0902b00b~^~N~^~Unknown~^~VkExternalMemoryImageCreateInfoNV~^~VUID-VkExternalMemoryImageCreateInfoNV-sType-sType~^~(VK_NV_external_memory)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfoNV-sType-sType)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_09209001~^~Y~^~Unknown~^~VkFenceCreateInfo~^~VUID-VkFenceCreateInfo-flags-parameter~^~core~^~The spec valid usage text states 'flags must be a valid combination of VkFenceCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkFenceCreateInfo-flags-parameter)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0921c40d~^~Y~^~Unknown~^~VkFenceCreateInfo~^~VUID-VkFenceCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkFenceCreateInfo-pNext-pNext)~^~implicit, TBD in parameter validation layer. @@ -516,7 +521,7 @@ VALIDATION_ERROR_094006f0~^~Y~^~FramebufferCreateErrors~^~VkFramebufferCreateInfo~^~VUID-VkFramebufferCreateInfo-height-00888~^~core~^~The spec valid usage text states 'height must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferHeight' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkFramebufferCreateInfo-height-00888)~^~ VALIDATION_ERROR_094006f2~^~Y~^~FramebufferCreateErrors~^~VkFramebufferCreateInfo~^~VUID-VkFramebufferCreateInfo-layers-00889~^~core~^~The spec valid usage text states 'layers must be greater than 0.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkFramebufferCreateInfo-layers-00889)~^~ VALIDATION_ERROR_094006f4~^~Y~^~FramebufferCreateErrors~^~VkFramebufferCreateInfo~^~VUID-VkFramebufferCreateInfo-layers-00890~^~core~^~The spec valid usage text states 'layers must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferLayers' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkFramebufferCreateInfo-layers-00890)~^~ -VALIDATION_ERROR_094006f6~^~N~^~Unknown~^~VkFramebufferCreateInfo~^~VUID-VkFramebufferCreateInfo-pAttachments-00891~^~(VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-00891)~^~ +VALIDATION_ERROR_094006f6~^~N~^~Unknown~^~VkFramebufferCreateInfo~^~VUID-VkFramebufferCreateInfo-pAttachments-00891~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-00891)~^~ VALIDATION_ERROR_09409005~^~Y~^~Unknown~^~VkFramebufferCreateInfo~^~VUID-VkFramebufferCreateInfo-flags-zerobitmask~^~core~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-zerobitmask)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0940f201~^~Y~^~FramebufferCreateErrors~^~VkFramebufferCreateInfo~^~VUID-VkFramebufferCreateInfo-pAttachments-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-parameter)~^~implicit VALIDATION_ERROR_0941c40d~^~Y~^~Unknown~^~VkFramebufferCreateInfo~^~VUID-VkFramebufferCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkFramebufferCreateInfo-pNext-pNext)~^~implicit, TBD in parameter validation layer. @@ -544,8 +549,8 @@ VALIDATION_ERROR_096005c8~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-pStages-00740~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00740)~^~ VALIDATION_ERROR_096005ca~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-pStages-00741~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00741)~^~ VALIDATION_ERROR_096005cc~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-pStages-00742~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00742)~^~ -VALIDATION_ERROR_096005ce~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-00743~^~!(VK_KHR_maintenance2)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_096005d0~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-00744~^~!(VK_KHR_maintenance2)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_096005ce~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-00743~^~!(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_096005d0~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-00744~^~!(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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)~^~ VALIDATION_ERROR_096005d2~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-00745~^~core~^~The spec valid usage text states '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 format of the attachment does not support color blend operations, as specified by the VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT flag in VkFormatProperties::linearTilingFeatures or VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-00745)~^~ VALIDATION_ERROR_096005d4~^~Y~^~NumBlendAttachMismatch~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-attachmentCount-00746~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-attachmentCount-00746)~^~ VALIDATION_ERROR_096005d6~^~Y~^~PSOViewportStateTests,PSOViewportStateMultiViewportTests~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747~^~core~^~The spec valid usage text states '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 VkViewport structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747)~^~ @@ -561,11 +566,11 @@ VALIDATION_ERROR_096005ea~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-00757~^~!(VK_AMD_mixed_attachment_samples)+!(VK_NV_framebuffer_mixed_samples)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-00757)~^~ VALIDATION_ERROR_096005ec~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-00758~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-00758)~^~ VALIDATION_ERROR_096005ee~^~Y~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-00759~^~core~^~The spec valid usage text states 'subpass must be a valid subpass within renderPass' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-00759)~^~ -VALIDATION_ERROR_096005f0~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-renderPass-00760~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-00760)~^~ -VALIDATION_ERROR_096005f2~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-renderPass-00761~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-00761)~^~ -VALIDATION_ERROR_096005f4~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-renderPass-00762~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-00762)~^~ -VALIDATION_ERROR_096005f6~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-renderPass-00763~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-00763)~^~ -VALIDATION_ERROR_096005f8~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-flags-00764~^~(VK_KHR_device_group)~^~The spec valid usage text states 'flags must not contain the VK_PIPELINE_CREATE_DISPATCH_BASE flag.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-00764)~^~ +VALIDATION_ERROR_096005f0~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-renderPass-00760~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-00760)~^~ +VALIDATION_ERROR_096005f2~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-renderPass-00761~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-00761)~^~ +VALIDATION_ERROR_096005f4~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-renderPass-00762~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-00762)~^~ +VALIDATION_ERROR_096005f6~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-renderPass-00763~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-00763)~^~ +VALIDATION_ERROR_096005f8~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-flags-00764~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'flags must not contain the VK_PIPELINE_CREATE_DISPATCH_BASE flag.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-00764)~^~ VALIDATION_ERROR_09600b06~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-01411~^~(VK_NV_framebuffer_mixed_samples)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-01411)~^~ VALIDATION_ERROR_09600b08~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-01412~^~(VK_NV_framebuffer_mixed_samples)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-01412)~^~ VALIDATION_ERROR_09600bc2~^~Y~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-01505~^~(VK_AMD_mixed_attachment_samples)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-01505)~^~ @@ -573,11 +578,11 @@ VALIDATION_ERROR_09600be4~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure chained to 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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522)~^~ VALIDATION_ERROR_09600be6~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01523~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure chained to the pNext chain of pMultisampleState is VK_TRUE, sampleLocationsInfo.sampleLocationsPerPixel must equal rasterizationSamples' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01523)~^~ VALIDATION_ERROR_09600be8~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-sampleLocationsEnable-01524~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'If the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure chained to 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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-sampleLocationsEnable-01524)~^~ -VALIDATION_ERROR_09600c3a~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-pStages-01565~^~(VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-01565)~^~ +VALIDATION_ERROR_09600c3a~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-pStages-01565~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-01565)~^~ VALIDATION_ERROR_09600d30~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-layout-01688~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-layout-01688)~^~ VALIDATION_ERROR_09600d66~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715~^~(VK_NV_clip_space_w_scaling)~^~The spec valid usage text states '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, chained to 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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715)~^~ -VALIDATION_ERROR_09600db8~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-01756~^~(VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-01756)~^~ -VALIDATION_ERROR_09600dba~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-01757~^~(VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-01757)~^~ +VALIDATION_ERROR_09600db8~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-01756~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-01756)~^~ +VALIDATION_ERROR_09600dba~^~N~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-subpass-01757~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-01757)~^~ VALIDATION_ERROR_09609001~^~Y~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-flags-parameter~^~core~^~The spec valid usage text states 'flags must be a valid combination of VkPipelineCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-parameter)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0960be01~^~Y~^~None~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-layout-parameter~^~core~^~The spec valid usage text states 'layout must be a valid VkPipelineLayout handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-layout-parameter)~^~implicit VALIDATION_ERROR_09615601~^~N~^~Unknown~^~VkGraphicsPipelineCreateInfo~^~VUID-VkGraphicsPipelineCreateInfo-pDynamicState-parameter~^~core~^~The spec valid usage text states 'If pDynamicState is not NULL, pDynamicState must be a valid pointer to a valid VkPipelineDynamicStateCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicState-parameter)~^~implicit @@ -610,11 +615,11 @@ VALIDATION_ERROR_09a001f8~^~Y~^~BlitImageOffsets~^~VkImageBlit~^~VUID-VkImageBlit-dstImage-00252~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageBlit-dstImage-00252)~^~ VALIDATION_ERROR_09a07a01~^~N~^~Unknown~^~VkImageBlit~^~VUID-VkImageBlit-dstSubresource-parameter~^~core~^~The spec valid usage text states 'dstSubresource must be a valid VkImageSubresourceLayers structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageBlit-dstSubresource-parameter)~^~implicit VALIDATION_ERROR_09a2d601~^~N~^~Unknown~^~VkImageBlit~^~VUID-VkImageBlit-srcSubresource-parameter~^~core~^~The spec valid usage text states 'srcSubresource must be a valid VkImageSubresourceLayers structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageBlit-srcSubresource-parameter)~^~implicit -VALIDATION_ERROR_09c00112~^~Y~^~CopyImageAspectMismatch~^~VkImageCopy~^~VUID-VkImageCopy-aspectMask-00137~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09c00114~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-layerCount-00138~^~!(VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09c00116~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-00139~^~!(VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09c00118~^~Y~^~CopyImageLayerCountMismatch~^~VkImageCopy~^~VUID-VkImageCopy-extent-00140~^~(VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-extent-00140)~^~ -VALIDATION_ERROR_09c0011a~^~Y~^~CopyImageTypeExtentMismatch~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-00141~^~(VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-00141)~^~ +VALIDATION_ERROR_09c00112~^~Y~^~CopyImageAspectMismatch~^~VkImageCopy~^~VUID-VkImageCopy-aspectMask-00137~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09c00114~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-layerCount-00138~^~!(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09c00116~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-00139~^~!(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09c00118~^~Y~^~CopyImageLayerCountMismatch~^~VkImageCopy~^~VUID-VkImageCopy-extent-00140~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-extent-00140)~^~ +VALIDATION_ERROR_09c0011a~^~Y~^~CopyImageTypeExtentMismatch~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-00141~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-00141)~^~ VALIDATION_ERROR_09c0011c~^~Y~^~CopyImageAspectMismatch~^~VkImageCopy~^~VUID-VkImageCopy-aspectMask-00142~^~core~^~The spec valid usage text states 'The aspectMask member of srcSubresource must specify aspects present in the calling command's srcImage' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-aspectMask-00142)~^~ VALIDATION_ERROR_09c0011e~^~Y~^~CopyImageAspectMismatch~^~VkImageCopy~^~VUID-VkImageCopy-aspectMask-00143~^~core~^~The spec valid usage text states 'The aspectMask member of dstSubresource must specify aspects present in the calling command's dstImage' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-aspectMask-00143)~^~ VALIDATION_ERROR_09c00120~^~Y~^~CopyImageSrcSizeExceeded~^~VkImageCopy~^~VUID-VkImageCopy-srcOffset-00144~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCopy-srcOffset-00144)~^~ @@ -625,69 +630,69 @@ VALIDATION_ERROR_09c0012e~^~Y~^~CopyImageDstSizeExceeded~^~VkImageCopy~^~VUID-VkImageCopy-dstOffset-00151~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCopy-dstOffset-00151)~^~ VALIDATION_ERROR_09c00130~^~Y~^~CopyImageTypeExtentMismatch~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-00152~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCopy-dstImage-00152)~^~ VALIDATION_ERROR_09c00132~^~Y~^~CopyImageDstSizeExceeded~^~VkImageCopy~^~VUID-VkImageCopy-dstOffset-00153~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCopy-dstOffset-00153)~^~ -VALIDATION_ERROR_09c0013a~^~Y~^~Unknown~^~VkImageCopy~^~VUID-VkImageCopy-srcOffset-00157~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09c0013c~^~Y~^~Unknown~^~VkImageCopy~^~VUID-VkImageCopy-extent-00158~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09c0013e~^~Y~^~Unknown~^~VkImageCopy~^~VUID-VkImageCopy-extent-00159~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09c00140~^~Y~^~Unknown~^~VkImageCopy~^~VUID-VkImageCopy-extent-00160~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09c00144~^~Y~^~Unknown~^~VkImageCopy~^~VUID-VkImageCopy-dstOffset-00162~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09c00146~^~Y~^~Unknown~^~VkImageCopy~^~VUID-VkImageCopy-extent-00163~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09c00148~^~Y~^~Unknown~^~VkImageCopy~^~VUID-VkImageCopy-extent-00164~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09c0014a~^~Y~^~Unknown~^~VkImageCopy~^~VUID-VkImageCopy-extent-00165~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09c00c1e~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01551~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01551)~^~ -VALIDATION_ERROR_09c00c20~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01552~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01552)~^~ -VALIDATION_ERROR_09c00c22~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01553~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01553)~^~ -VALIDATION_ERROR_09c00c24~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01554~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01554)~^~ -VALIDATION_ERROR_09c00c26~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01555~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01555)~^~ -VALIDATION_ERROR_09c00c28~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01556~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01556)~^~ -VALIDATION_ERROR_09c00c2a~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01557~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01557)~^~ -VALIDATION_ERROR_09c00d7e~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01727~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01727)~^~ -VALIDATION_ERROR_09c00d80~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01728~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01728)~^~ -VALIDATION_ERROR_09c00d82~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01729~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01729)~^~ -VALIDATION_ERROR_09c00d84~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01730~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01730)~^~ -VALIDATION_ERROR_09c00d86~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01731~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01731)~^~ -VALIDATION_ERROR_09c00d88~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01732~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01732)~^~ -VALIDATION_ERROR_09c00d8a~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01733~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01733)~^~ -VALIDATION_ERROR_09c00d8c~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01734~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01734)~^~ +VALIDATION_ERROR_09c0013a~^~Y~^~CopyImageCompressedBlockAlignment~^~VkImageCopy~^~VUID-VkImageCopy-srcOffset-00157~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09c0013c~^~Y~^~CopyImageCompressedBlockAlignment~^~VkImageCopy~^~VUID-VkImageCopy-extent-00158~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09c0013e~^~Y~^~CopyImageCompressedBlockAlignment~^~VkImageCopy~^~VUID-VkImageCopy-extent-00159~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09c00140~^~Y~^~NotTestable~^~VkImageCopy~^~VUID-VkImageCopy-extent-00160~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09c00144~^~Y~^~CopyImageCompressedBlockAlignment~^~VkImageCopy~^~VUID-VkImageCopy-dstOffset-00162~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09c00146~^~Y~^~CopyImageCompressedBlockAlignment~^~VkImageCopy~^~VUID-VkImageCopy-extent-00163~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09c00148~^~Y~^~CopyImageCompressedBlockAlignment~^~VkImageCopy~^~VUID-VkImageCopy-extent-00164~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09c0014a~^~Y~^~NotTestable~^~VkImageCopy~^~VUID-VkImageCopy-extent-00165~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09c00c1e~^~Y~^~CopyImageAspectMismatch~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01551~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01551)~^~ +VALIDATION_ERROR_09c00c20~^~Y~^~CopyImageMultiplaneAspectBits~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01552~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01552)~^~ +VALIDATION_ERROR_09c00c22~^~Y~^~CopyImageMultiplaneAspectBits~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01553~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01553)~^~ +VALIDATION_ERROR_09c00c24~^~Y~^~CopyImageMultiplaneAspectBits~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01554~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01554)~^~ +VALIDATION_ERROR_09c00c26~^~Y~^~CopyImageMultiplaneAspectBits~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01555~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01555)~^~ +VALIDATION_ERROR_09c00c28~^~Y~^~CopyImageMultiplaneAspectBits~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01556~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01556)~^~ +VALIDATION_ERROR_09c00c2a~^~Y~^~CopyImageMultiplaneAspectBits~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01557~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01557)~^~ +VALIDATION_ERROR_09c00d7e~^~Y~^~CopyImageSinglePlane422Alignment,CopyImageCompressedBlockAlignment~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01727~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01727)~^~ +VALIDATION_ERROR_09c00d80~^~Y~^~CopyImageSinglePlane422Alignment,CopyImageCompressedBlockAlignment~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01728~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01728)~^~ +VALIDATION_ERROR_09c00d82~^~Y~^~CopyImageCompressedBlockAlignment~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01729~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01729)~^~ +VALIDATION_ERROR_09c00d84~^~Y~^~NotTestable~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01730~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01730)~^~ +VALIDATION_ERROR_09c00d86~^~Y~^~CopyImageSinglePlane422Alignment,CopyImageCompressedBlockAlignment~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01731~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01731)~^~ +VALIDATION_ERROR_09c00d88~^~Y~^~CopyImageSinglePlane422Alignment,CopyImageCompressedBlockAlignment~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01732~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01732)~^~ +VALIDATION_ERROR_09c00d8a~^~Y~^~CopyImageCompressedBlockAlignment~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01733~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01733)~^~ +VALIDATION_ERROR_09c00d8c~^~Y~^~NotTestable~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01734~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01734)~^~ VALIDATION_ERROR_09c00df2~^~Y~^~CopyImageTypeExtentMismatch~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01785~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCopy-srcImage-01785)~^~ VALIDATION_ERROR_09c00df4~^~Y~^~CopyImageTypeExtentMismatch~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01786~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCopy-dstImage-01786)~^~ -VALIDATION_ERROR_09c00df6~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01787~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCopy-srcImage-01787)~^~ -VALIDATION_ERROR_09c00df8~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01788~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCopy-dstImage-01788)~^~ -VALIDATION_ERROR_09c00dfa~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01789~^~!(VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09c00dfc~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01790~^~(VK_KHR_maintenance1)~^~The spec valid usage text states 'If both srcImage and dstImage are of type VK_IMAGE_TYPE_2D then then extent.depth must be 1.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01790)~^~ -VALIDATION_ERROR_09c00dfe~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01791~^~(VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01791)~^~ -VALIDATION_ERROR_09c00e00~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01792~^~(VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01792)~^~ +VALIDATION_ERROR_09c00df6~^~Y~^~CopyImageTypeExtentMismatch~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01787~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCopy-srcImage-01787)~^~ +VALIDATION_ERROR_09c00df8~^~Y~^~CopyImageTypeExtentMismatch~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01788~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCopy-dstImage-01788)~^~ +VALIDATION_ERROR_09c00dfa~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01789~^~!(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09c00dfc~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01790~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'If both srcImage and dstImage are of type VK_IMAGE_TYPE_2D then then extent.depth must be 1.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01790)~^~ +VALIDATION_ERROR_09c00dfe~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-srcImage-01791~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01791)~^~ +VALIDATION_ERROR_09c00e00~^~N~^~None~^~VkImageCopy~^~VUID-VkImageCopy-dstImage-01792~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01792)~^~ VALIDATION_ERROR_09c07a01~^~N~^~Unknown~^~VkImageCopy~^~VUID-VkImageCopy-dstSubresource-parameter~^~core~^~The spec valid usage text states 'dstSubresource must be a valid VkImageSubresourceLayers structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-dstSubresource-parameter)~^~implicit VALIDATION_ERROR_09c2d601~^~N~^~Unknown~^~VkImageCopy~^~VUID-VkImageCopy-srcSubresource-parameter~^~core~^~The spec valid usage text states 'srcSubresource must be a valid VkImageSubresourceLayers structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-srcSubresource-parameter)~^~implicit -VALIDATION_ERROR_09e00758~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-format-00940~^~core~^~The spec valid usage text states 'The combination of format, imageType, tiling, usage, and flags must be supported, as indicated by a VK_SUCCESS return value from vkGetPhysicalDeviceImageFormatProperties invoked with the same values passed to the corresponding parameters.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-format-00940)~^~ -VALIDATION_ERROR_09e0075a~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-sharingMode-00941~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-sharingMode-00941)~^~ -VALIDATION_ERROR_09e0075c~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-sharingMode-00942~^~core~^~The spec valid usage text states 'If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-sharingMode-00942)~^~ -VALIDATION_ERROR_09e0075e~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-format-00943~^~core~^~The spec valid usage text states 'format must not be VK_FORMAT_UNDEFINED' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-format-00943)~^~ +VALIDATION_ERROR_09e00758~^~Y~^~CreateImageFormatSupportErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-format-00940~^~!(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'The combination of format, imageType, tiling, usage, and flags must be supported, as indicated by a VK_SUCCESS return value from vkGetPhysicalDeviceImageFormatProperties invoked with the same values passed to the corresponding parameters.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-format-00940)~^~ +VALIDATION_ERROR_09e0075a~^~Y~^~CreateImageMiscErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-sharingMode-00941~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-sharingMode-00941)~^~ +VALIDATION_ERROR_09e0075c~^~Y~^~CreateImageMiscErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-sharingMode-00942~^~core~^~The spec valid usage text states 'If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-sharingMode-00942)~^~ +VALIDATION_ERROR_09e0075e~^~Y~^~CreateImageMiscErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-format-00943~^~core~^~The spec valid usage text states 'format must not be VK_FORMAT_UNDEFINED' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-format-00943)~^~ VALIDATION_ERROR_09e00760~^~Y~^~CreateImageMinLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-extent-00944~^~core~^~The spec valid usage text states 'extent::width must be greater than 0.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-extent-00944)~^~ VALIDATION_ERROR_09e00762~^~Y~^~CreateImageMinLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-extent-00945~^~core~^~The spec valid usage text states 'extent::height must be greater than 0.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-extent-00945)~^~ VALIDATION_ERROR_09e00764~^~Y~^~CreateImageMinLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-extent-00946~^~core~^~The spec valid usage text states 'extent::depth must be greater than 0.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-extent-00946)~^~ VALIDATION_ERROR_09e00766~^~Y~^~CreateImageMinLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-mipLevels-00947~^~core~^~The spec valid usage text states 'mipLevels must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-mipLevels-00947)~^~ VALIDATION_ERROR_09e00768~^~Y~^~CreateImageMinLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-arrayLayers-00948~^~core~^~The spec valid usage text states 'arrayLayers must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-arrayLayers-00948)~^~ -VALIDATION_ERROR_09e0076a~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-00949~^~core~^~The spec valid usage text states 'If flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, imageType must be VK_IMAGE_TYPE_2D' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-flags-00949)~^~ -VALIDATION_ERROR_09e0076c~^~N~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-00950~^~(VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-00950)~^~ -VALIDATION_ERROR_09e0076e~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00951~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_1D, extent.width must be less than or equal to VkPhysicalDeviceLimits::maxImageDimension1D, or VkImageFormatProperties::maxExtent.width (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure) - whichever is higher' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00951)~^~ -VALIDATION_ERROR_09e00770~^~Y~^~ImageFormatLimits~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00952~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_2D and flags does not contain VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and extent.height must be less than or equal to VkPhysicalDeviceLimits::maxImageDimension2D, or VkImageFormatProperties::maxExtent.width/height (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure) - whichever is higher' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00952)~^~ -VALIDATION_ERROR_09e00772~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00953~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and extent.height must be less than or equal to VkPhysicalDeviceLimits::maxImageDimensionCube, or VkImageFormatProperties::maxExtent.width/height (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure) - whichever is higher' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00953)~^~ -VALIDATION_ERROR_09e00774~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00954~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00954)~^~ -VALIDATION_ERROR_09e00776~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00955~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_3D, extent.width, extent.height and extent.depth must be less than or equal to VkPhysicalDeviceLimits::maxImageDimension3D, or VkImageFormatProperties::maxExtent.width/height/depth (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure) - whichever is higher' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00955)~^~ -VALIDATION_ERROR_09e00778~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00956~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00956)~^~ -VALIDATION_ERROR_09e0077a~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00957~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_2D, extent.depth must be 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00957)~^~ -VALIDATION_ERROR_09e0077c~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-mipLevels-00958~^~core~^~The spec valid usage text states 'mipLevels must be less than or equal to {lfloor}log2(max(extent.width, extent.height, extent.depth)){rfloor} + 1.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-mipLevels-00958)~^~ -VALIDATION_ERROR_09e0077e~^~Y~^~ImageFormatLimits~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-extent-00959~^~core~^~The spec valid usage text states 'mipLevels must be less than or equal to VkImageFormatProperties::maxMipLevels (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure)' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-extent-00959)~^~ -VALIDATION_ERROR_09e00780~^~Y~^~ImageFormatLimits~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-arrayLayers-00960~^~core~^~The spec valid usage text states 'arrayLayers must be less than or equal to VkImageFormatProperties::maxArrayLayers (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure)' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-arrayLayers-00960)~^~ -VALIDATION_ERROR_09e00782~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00961~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_3D, arrayLayers must be 1.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00961)~^~ -VALIDATION_ERROR_09e00784~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-samples-00962~^~core~^~The spec valid usage text states 'If samples is not VK_SAMPLE_COUNT_1_BIT, imageType must be VK_IMAGE_TYPE_2D, flags must not contain VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, tiling must be VK_IMAGE_TILING_OPTIMAL, and mipLevels must be equal to 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-samples-00962)~^~ -VALIDATION_ERROR_09e00786~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-usage-00963~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-usage-00963)~^~ -VALIDATION_ERROR_09e00788~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-usage-00964~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-usage-00964)~^~ -VALIDATION_ERROR_09e0078a~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-usage-00965~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-usage-00965)~^~ -VALIDATION_ERROR_09e0078c~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-usage-00966~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-usage-00966)~^~ -VALIDATION_ERROR_09e0078e~^~Y~^~ImageFormatLimits~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-samples-00967~^~core~^~The spec valid usage text states 'samples must be a bit value that is set in VkImageFormatProperties::sampleCounts returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-samples-00967)~^~ +VALIDATION_ERROR_09e0076a~^~Y~^~CreateImageMiscErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-00949~^~core~^~The spec valid usage text states 'If flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, imageType must be VK_IMAGE_TYPE_2D' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-flags-00949)~^~ +VALIDATION_ERROR_09e0076c~^~N~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-00950~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-00950)~^~ +VALIDATION_ERROR_09e0076e~^~Y~^~CreateImageMaxLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00951~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_1D, extent.width must be less than or equal to VkPhysicalDeviceLimits::maxImageDimension1D, or VkImageFormatProperties::maxExtent.width (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure) - whichever is higher' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00951)~^~ +VALIDATION_ERROR_09e00770~^~Y~^~CreateImageMaxLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00952~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_2D and flags does not contain VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and extent.height must be less than or equal to VkPhysicalDeviceLimits::maxImageDimension2D, or VkImageFormatProperties::maxExtent.width/height (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure) - whichever is higher' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00952)~^~ +VALIDATION_ERROR_09e00772~^~Y~^~CreateImageMaxLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00953~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and extent.height must be less than or equal to VkPhysicalDeviceLimits::maxImageDimensionCube, or VkImageFormatProperties::maxExtent.width/height (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure) - whichever is higher' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00953)~^~ +VALIDATION_ERROR_09e00774~^~Y~^~CreateImageMinLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00954~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00954)~^~ +VALIDATION_ERROR_09e00776~^~Y~^~CreateImageMaxLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00955~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_3D, extent.width, extent.height and extent.depth must be less than or equal to VkPhysicalDeviceLimits::maxImageDimension3D, or VkImageFormatProperties::maxExtent.width/height/depth (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure) - whichever is higher' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00955)~^~ +VALIDATION_ERROR_09e00778~^~Y~^~CreateImageMinLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00956~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00956)~^~ +VALIDATION_ERROR_09e0077a~^~Y~^~CreateImageMinLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00957~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_2D, extent.depth must be 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00957)~^~ +VALIDATION_ERROR_09e0077c~^~Y~^~CreateImageMaxLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-mipLevels-00958~^~core~^~The spec valid usage text states 'mipLevels must be less than or equal to {lfloor}log2(max(extent.width, extent.height, extent.depth)){rfloor} + 1.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-mipLevels-00958)~^~ +VALIDATION_ERROR_09e0077e~^~Y~^~CreateImageMaxLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-extent-00959~^~core~^~The spec valid usage text states 'mipLevels must be less than or equal to VkImageFormatProperties::maxMipLevels (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure)' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-extent-00959)~^~ +VALIDATION_ERROR_09e00780~^~Y~^~CreateImageMaxLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-arrayLayers-00960~^~core~^~The spec valid usage text states 'arrayLayers must be less than or equal to VkImageFormatProperties::maxArrayLayers (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure)' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-arrayLayers-00960)~^~ +VALIDATION_ERROR_09e00782~^~Y~^~CreateImageMinLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00961~^~core~^~The spec valid usage text states 'If imageType is VK_IMAGE_TYPE_3D, arrayLayers must be 1.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00961)~^~ +VALIDATION_ERROR_09e00784~^~Y~^~CreateImageMiscErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-samples-00962~^~core~^~The spec valid usage text states 'If samples is not VK_SAMPLE_COUNT_1_BIT, imageType must be VK_IMAGE_TYPE_2D, flags must not contain VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, tiling must be VK_IMAGE_TILING_OPTIMAL, and mipLevels must be equal to 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-samples-00962)~^~ +VALIDATION_ERROR_09e00786~^~Y~^~CreateImageMiscErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-usage-00963~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-usage-00963)~^~ +VALIDATION_ERROR_09e00788~^~Y~^~CreateImageMaxLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-usage-00964~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-usage-00964)~^~ +VALIDATION_ERROR_09e0078a~^~Y~^~CreateImageMaxLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-usage-00965~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-usage-00965)~^~ +VALIDATION_ERROR_09e0078c~^~Y~^~CreateImageMiscErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-usage-00966~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-usage-00966)~^~ +VALIDATION_ERROR_09e0078e~^~Y~^~CreateImageMaxLimitsViolation~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-samples-00967~^~core~^~The spec valid usage text states 'samples must be a bit value that is set in VkImageFormatProperties::sampleCounts returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-samples-00967)~^~ VALIDATION_ERROR_09e00790~^~N~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-usage-00968~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-usage-00968)~^~ -VALIDATION_ERROR_09e00792~^~Y~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-00969~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-flags-00969)~^~ +VALIDATION_ERROR_09e00792~^~Y~^~CreateImageMiscErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-00969~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-flags-00969)~^~ VALIDATION_ERROR_09e00794~^~Y~^~SparseResidencyImageCreateUnsupportedTypes~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00970~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00970)~^~ VALIDATION_ERROR_09e00796~^~Y~^~SparseResidencyImageCreateUnsupportedTypes~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00971~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00971)~^~ VALIDATION_ERROR_09e00798~^~Y~^~SparseResidencyImageCreateUnsupportedTypes~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00972~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00972)~^~ @@ -695,38 +700,35 @@ VALIDATION_ERROR_09e0079c~^~Y~^~SparseResidencyImageCreateUnsupportedSamples~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00974~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00974)~^~ VALIDATION_ERROR_09e0079e~^~Y~^~SparseResidencyImageCreateUnsupportedSamples~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00975~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00975)~^~ VALIDATION_ERROR_09e007a0~^~Y~^~SparseResidencyImageCreateUnsupportedSamples~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-00976~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00976)~^~ -VALIDATION_ERROR_09e007a2~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-00977~^~core~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, format must be a format that has at least one supported feature bit present in the value of VkFormatProperties::linearTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00977)~^~ -VALIDATION_ERROR_09e007a4~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-00978~^~core~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, and VkFormatProperties::linearTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT, usage must not contain VK_IMAGE_USAGE_SAMPLED_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00978)~^~ -VALIDATION_ERROR_09e007a6~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-00979~^~core~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, and VkFormatProperties::linearTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT, usage must not contain VK_IMAGE_USAGE_STORAGE_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00979)~^~ -VALIDATION_ERROR_09e007a8~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-00980~^~core~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, and VkFormatProperties::linearTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT, usage must not contain VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00980)~^~ -VALIDATION_ERROR_09e007aa~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-00981~^~core~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, and VkFormatProperties::linearTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT, usage must not contain VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00981)~^~ -VALIDATION_ERROR_09e007ac~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-00982~^~core~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, format must be a format that has at least one supported feature bit present in the value of VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00982)~^~ -VALIDATION_ERROR_09e007ae~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-00983~^~core~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, and VkFormatProperties::optimalTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT, usage must not contain VK_IMAGE_USAGE_SAMPLED_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00983)~^~ -VALIDATION_ERROR_09e007b0~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-00984~^~core~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, and VkFormatProperties::optimalTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT, usage must not contain VK_IMAGE_USAGE_STORAGE_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00984)~^~ -VALIDATION_ERROR_09e007b2~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-00985~^~core~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, and VkFormatProperties::optimalTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT, usage must not contain VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00985)~^~ -VALIDATION_ERROR_09e007b4~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-00986~^~core~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, and VkFormatProperties::optimalTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT, usage must not contain VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00986)~^~ VALIDATION_ERROR_09e007b6~^~Y~^~SparseBindingImageBufferCreate~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-00987~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-flags-00987)~^~ -VALIDATION_ERROR_09e007b8~^~N~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-pNext-00988~^~(VK_KHR_external_memory)+(VK_NV_external_memory)~^~The spec valid usage text states 'If the pNext chain contains an instance of VkExternalMemoryImageCreateInfoNV, it must not contain an instance of VkExternalMemoryImageCreateInfo.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-00988)~^~ -VALIDATION_ERROR_09e007bc~^~N~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-pNext-00990~^~(VK_KHR_external_memory)~^~The spec valid usage text states 'If the pNext chain contains an instance of VkExternalMemoryImageCreateInfo, 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 an instance of VkPhysicalDeviceExternalImageFormatInfo 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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-00990)~^~ +VALIDATION_ERROR_09e007b8~^~N~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-pNext-00988~^~(VK_VERSION_1_1,VK_KHR_external_memory)+(VK_NV_external_memory)~^~The spec valid usage text states 'If the pNext chain contains an instance of VkExternalMemoryImageCreateInfoNV, it must not contain an instance of VkExternalMemoryImageCreateInfo.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-00988)~^~ +VALIDATION_ERROR_09e007bc~^~N~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-pNext-00990~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states 'If the pNext chain contains an instance of VkExternalMemoryImageCreateInfo, 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 an instance of VkPhysicalDeviceExternalImageFormatInfo 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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-00990)~^~ VALIDATION_ERROR_09e007be~^~N~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-pNext-00991~^~(VK_NV_external_memory+VK_NV_external_memory_capabilities)~^~The spec valid usage text states 'If the pNext chain contains an instance of VkExternalMemoryImageCreateInfoNV, 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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-00991)~^~ -VALIDATION_ERROR_09e007c0~^~N~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-00992~^~(VK_KHR_device_group)~^~The spec valid usage text states '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 tiling must be VK_IMAGE_TILING_OPTIMAL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-00992)~^~ -VALIDATION_ERROR_09e007c2~^~Y~^~ImageCreateInfoStructErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-initialLayout-00993~^~core~^~The spec valid usage text states 'initialLayout must be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-initialLayout-00993)~^~ -VALIDATION_ERROR_09e00ae0~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-sharingMode-01392~^~!(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_09e00b18~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-sharingMode-01420~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-sharingMode-01420)~^~ -VALIDATION_ERROR_09e00b1a~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-physicalDeviceCount-01421~^~(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-physicalDeviceCount-01421)~^~ -VALIDATION_ERROR_09e00b46~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-pNext-01443~^~(VK_KHR_external_memory,VK_NV_external_memory)~^~The spec valid usage text states 'If the pNext chain includes a ifdef::VK_KHR_external_memory[VkExternalMemoryImageCreateInfo]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01443)~^~ +VALIDATION_ERROR_09e007c0~^~N~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-00992~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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 tiling must be VK_IMAGE_TILING_OPTIMAL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-00992)~^~ +VALIDATION_ERROR_09e007c2~^~Y~^~CreateImageMiscErrors~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-initialLayout-00993~^~core~^~The spec valid usage text states 'initialLayout must be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-initialLayout-00993)~^~ +VALIDATION_ERROR_09e00ae0~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-sharingMode-01392~^~!(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_09e00b18~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-sharingMode-01420~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-sharingMode-01420)~^~ +VALIDATION_ERROR_09e00b1a~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-physicalDeviceCount-01421~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-physicalDeviceCount-01421)~^~ +VALIDATION_ERROR_09e00b46~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-pNext-01443~^~(VK_VERSION_1_1,VK_KHR_external_memory,VK_NV_external_memory)~^~The spec valid usage text states 'If the pNext chain includes a ifdef::VK_VERSION_1_1,VK_KHR_external_memory[VkExternalMemoryImageCreateInfo]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01443)~^~ VALIDATION_ERROR_09e00bfa~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-01533~^~(VK_EXT_sample_locations)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01533)~^~ -VALIDATION_ERROR_09e00c48~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-01572~^~(VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01572)~^~ -VALIDATION_ERROR_09e00c4a~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-01573~^~(VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01573)~^~ -VALIDATION_ERROR_09e00c4c~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-format-01574~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the image format is one of those listed in features-formats-requiring-sampler-ycbcr-conversion:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-01574)~^~ -VALIDATION_ERROR_09e00c4e~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-01575~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, format is a multi-planar format, and VkFormatProperties::optimalTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_DISJOINT_BIT, flags must not contain VK_IMAGE_CREATE_DISJOINT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-tiling-01575)~^~ -VALIDATION_ERROR_09e00c50~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-01576~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, format is a multi-planar format, and VkFormatProperties::linearTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_DISJOINT_BIT, flags must not contain VK_IMAGE_CREATE_DISJOINT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-tiling-01576)~^~ -VALIDATION_ERROR_09e00c52~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-format-01577~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-01577)~^~ +VALIDATION_ERROR_09e00c48~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-01572~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01572)~^~ +VALIDATION_ERROR_09e00c4a~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-01573~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01573)~^~ +VALIDATION_ERROR_09e00c4c~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-format-01574~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the image format is one of those listed in features-formats-requiring-sampler-ycbcr-conversion:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-01574)~^~ +VALIDATION_ERROR_09e00c4e~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-01575~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, format is a multi-planar format, and VkFormatProperties::optimalTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_DISJOINT_BIT, flags must not contain VK_IMAGE_CREATE_DISJOINT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-tiling-01575)~^~ +VALIDATION_ERROR_09e00c50~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-01576~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, format is a multi-planar format, and VkFormatProperties::linearTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_DISJOINT_BIT, flags must not contain VK_IMAGE_CREATE_DISJOINT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-tiling-01576)~^~ +VALIDATION_ERROR_09e00c52~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-format-01577~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-01577)~^~ +VALIDATION_ERROR_09e00ec2~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-pNext-01889~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'If the pNext chain doesn't contain an instance of VkExternalFormatANDROID, or if format is not VK_FORMAT_UNDEFINED, the combination of format, imageType, tiling, usage, and flags must be supported, as indicated by a VK_SUCCESS return value from vkGetPhysicalDeviceImageFormatProperties invoked with the same values passed to the corresponding parameters.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01889)~^~ +VALIDATION_ERROR_09e00ec4~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-01890~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01890)~^~ +VALIDATION_ERROR_09e00ec6~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-None-01891~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-None-01891)~^~ +VALIDATION_ERROR_09e00ec8~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-pNext-01892~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'If the pNext chain includes a VkExternalMemoryImageCreateInfo structure whose handleTypes member includes VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01892)~^~ +VALIDATION_ERROR_09e00eca~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-pNext-01893~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'If the pNext chain includes a VkExternalFormatANDROID structure whose externalFormat member is not 0:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01893)~^~ +VALIDATION_ERROR_09e00f08~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-01924~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-flags-01924)~^~ +VALIDATION_ERROR_09e00f0a~^~N~^~None~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-None-01925~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-None-01925)~^~ VALIDATION_ERROR_09e09001~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-flags-parameter~^~core~^~The spec valid usage text states 'flags must be a valid combination of VkImageCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-flags-parameter)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_09e09201~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-format-parameter~^~core~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-format-parameter)~^~implicit VALIDATION_ERROR_09e0ac01~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-imageType-parameter~^~core~^~The spec valid usage text states 'imageType must be a valid VkImageType value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-parameter)~^~implicit -VALIDATION_ERROR_09e0b801~^~Y~^~ImageFormatLimits~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-initialLayout-parameter~^~core~^~The spec valid usage text states 'initialLayout must be a valid VkImageLayout value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-initialLayout-parameter)~^~implicit -VALIDATION_ERROR_09e1c40d~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states '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, VkExternalMemoryImageCreateInfo, VkExternalMemoryImageCreateInfoNV, VkImageFormatListCreateInfoKHR, or VkImageSwapchainCreateInfoKHR' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-pNext-pNext)~^~implicit +VALIDATION_ERROR_09e0b801~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-initialLayout-parameter~^~core~^~The spec valid usage text states 'initialLayout must be a valid VkImageLayout value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-initialLayout-parameter)~^~implicit +VALIDATION_ERROR_09e1c40d~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states '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, VkImageFormatListCreateInfoKHR, or VkImageSwapchainCreateInfoKHR' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-pNext-pNext)~^~implicit VALIDATION_ERROR_09e2b00b~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-sType-sType)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_09e2b00f~^~N~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-sType-unique~^~core~^~The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-sType-unique)~^~implicit VALIDATION_ERROR_09e2b401~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-samples-parameter~^~core~^~The spec valid usage text states 'samples must be a valid VkSampleCountFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-samples-parameter)~^~implicit @@ -734,11 +736,11 @@ VALIDATION_ERROR_09e2fa01~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-tiling-parameter~^~core~^~The spec valid usage text states 'tiling must be a valid VkImageTiling value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-parameter)~^~implicit VALIDATION_ERROR_09e30601~^~N~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-usage-parameter~^~core~^~The spec valid usage text states 'usage must be a valid combination of VkImageUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-usage-parameter)~^~implicit VALIDATION_ERROR_09e30603~^~Y~^~Unknown~^~VkImageCreateInfo~^~VUID-VkImageCreateInfo-usage-requiredbitmask~^~core~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-usage-requiredbitmask)~^~implicit -VALIDATION_ERROR_0a00095a~^~N~^~Unknown~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-oldLayout-01197~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01197)~^~ +VALIDATION_ERROR_0a00095a~^~Y~^~InvalidImageLayout~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-oldLayout-01197~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01197)~^~ VALIDATION_ERROR_0a00095c~^~Y~^~InvalidBarriers~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-newLayout-01198~^~core~^~The spec valid usage text states 'newLayout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-newLayout-01198)~^~ -VALIDATION_ERROR_0a00095e~^~Y~^~InvalidBarrierQueueFamily~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01199~^~!(VK_KHR_external_memory)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_0a000960~^~Y~^~InvalidBarrierQueueFamily~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01200~^~!(VK_KHR_external_memory)~^~The spec valid usage text states '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 devsandqueues-queueprops).' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01200)~^~ -VALIDATION_ERROR_0a000962~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01201~^~(VK_KHR_external_memory)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01201)~^~ +VALIDATION_ERROR_0a00095e~^~Y~^~InvalidBarrierQueueFamily~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01199~^~!(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_0a000960~^~Y~^~InvalidBarrierQueueFamily~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01200~^~!(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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 devsandqueues-queueprops).' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01200)~^~ +VALIDATION_ERROR_0a000962~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01201~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01201)~^~ VALIDATION_ERROR_0a00096a~^~Y~^~InvalidBarrierQueueFamily~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01205~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01205)~^~ VALIDATION_ERROR_0a00096e~^~Y~^~InvalidBarriers~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01207~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01207)~^~ VALIDATION_ERROR_0a000970~^~Y~^~InvalidBarriers~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-oldLayout-01208~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01208)~^~ @@ -747,19 +749,20 @@ VALIDATION_ERROR_0a000976~^~Y~^~InvalidBarriers~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-oldLayout-01211~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01211)~^~ VALIDATION_ERROR_0a000978~^~Y~^~InvalidBarriers~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-oldLayout-01212~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01212)~^~ VALIDATION_ERROR_0a00097a~^~Y~^~InvalidBarriers~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-oldLayout-01213~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01213)~^~ -VALIDATION_ERROR_0a000aca~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01381~^~(VK_KHR_external_memory)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01381)~^~ +VALIDATION_ERROR_0a000aca~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01381~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01381)~^~ VALIDATION_ERROR_0a000b9c~^~Y~^~ImageBarrierWithBadRange~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-subresourceRange-01486~^~core~^~The spec valid usage text states 'subresourceRange.baseMipLevel must be less than the mipLevels specified in VkImageCreateInfo when image was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-subresourceRange-01486)~^~ VALIDATION_ERROR_0a000ba0~^~Y~^~ImageBarrierWithBadRange~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-subresourceRange-01488~^~core~^~The spec valid usage text states '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-VkImageMemoryBarrier-subresourceRange-01488)~^~ -VALIDATION_ERROR_0a000cf4~^~N~^~None~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-oldLayout-01658~^~(VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01658)~^~ -VALIDATION_ERROR_0a000cf6~^~N~^~None~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-oldLayout-01659~^~(VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01659)~^~ -VALIDATION_ERROR_0a000d0e~^~N~^~None~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01671~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01671)~^~ -VALIDATION_ERROR_0a000d10~^~N~^~None~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01672~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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_KHR, VK_IMAGE_ASPECT_PLANE_1_BIT_KHR, and VK_IMAGE_ASPECT_PLANE_2_BIT_KHR; or must include VK_IMAGE_ASPECT_COLOR_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01672)~^~ -VALIDATION_ERROR_0a000d12~^~N~^~None~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01673~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01673)~^~ +VALIDATION_ERROR_0a000cf4~^~N~^~None~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-oldLayout-01658~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01658)~^~ +VALIDATION_ERROR_0a000cf6~^~N~^~None~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-oldLayout-01659~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01659)~^~ +VALIDATION_ERROR_0a000d0e~^~N~^~None~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01671~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01671)~^~ +VALIDATION_ERROR_0a000d10~^~N~^~None~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01672~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01672)~^~ +VALIDATION_ERROR_0a000d12~^~N~^~None~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01673~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01673)~^~ VALIDATION_ERROR_0a000d78~^~Y~^~ImageBarrierWithBadRange~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-subresourceRange-01724~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageMemoryBarrier-subresourceRange-01724)~^~ VALIDATION_ERROR_0a000d7a~^~Y~^~ImageBarrierWithBadRange~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-subresourceRange-01725~^~core~^~The spec valid usage text states '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-VkImageMemoryBarrier-subresourceRange-01725)~^~ -VALIDATION_ERROR_0a000dcc~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01766~^~(VK_KHR_external_memory)~^~The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01766)~^~ -VALIDATION_ERROR_0a000dce~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01767~^~(VK_KHR_external_memory)~^~The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01767)~^~ -VALIDATION_ERROR_0a000dd0~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01768~^~(VK_KHR_external_memory)~^~The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01768)~^~ +VALIDATION_ERROR_0a000dcc~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01766~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01766)~^~ +VALIDATION_ERROR_0a000dce~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01767~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01767)~^~ +VALIDATION_ERROR_0a000dd0~^~Y~^~InvalidBarrierQueueFamilyWithMemExt~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01768~^~(VK_VERSION_1_1,VK_KHR_external_memory)~^~The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01768)~^~ +VALIDATION_ERROR_0a000f18~^~N~^~None~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-01932~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01932)~^~ VALIDATION_ERROR_0a006801~^~Y~^~Unknown~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-dstAccessMask-parameter~^~core~^~The spec valid usage text states 'dstAccessMask must be a valid combination of VkAccessFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-dstAccessMask-parameter)~^~implicit VALIDATION_ERROR_0a00a001~^~Y~^~Unknown~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-image-parameter~^~core~^~The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-image-parameter)~^~implicit VALIDATION_ERROR_0a00d401~^~Y~^~Unknown~^~VkImageMemoryBarrier~^~VUID-VkImageMemoryBarrier-newLayout-parameter~^~core~^~The spec valid usage text states 'newLayout must be a valid VkImageLayout value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-newLayout-parameter)~^~implicit @@ -792,15 +795,15 @@ VALIDATION_ERROR_0a600d48~^~N~^~None~^~VkImageSubresourceLayers~^~VUID-VkImageSubresourceLayers-layerCount-01700~^~core~^~The spec valid usage text states 'layerCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceLayers-layerCount-01700)~^~ VALIDATION_ERROR_0a800c01~^~N~^~Unknown~^~VkImageSubresourceRange~^~VUID-VkImageSubresourceRange-aspectMask-parameter~^~core~^~The spec valid usage text states 'aspectMask must be a valid combination of VkImageAspectFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-parameter)~^~implicit VALIDATION_ERROR_0a800c03~^~Y~^~Unknown~^~VkImageSubresourceRange~^~VUID-VkImageSubresourceRange-aspectMask-requiredbitmask~^~core~^~The spec valid usage text states 'aspectMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-requiredbitmask)~^~implicit -VALIDATION_ERROR_0a800d0c~^~N~^~None~^~VkImageSubresourceRange~^~VUID-VkImageSubresourceRange-aspectMask-01670~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If aspectMask includes VK_IMAGE_ASPECT_COLOR_BIT, then it must not include any of VK_IMAGE_ASPECT_PLANE_0_BIT_KHR, VK_IMAGE_ASPECT_PLANE_1_BIT_KHR, or VK_IMAGE_ASPECT_PLANE_2_BIT_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-01670)~^~ +VALIDATION_ERROR_0a800d0c~^~N~^~None~^~VkImageSubresourceRange~^~VUID-VkImageSubresourceRange-aspectMask-01670~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-01670)~^~ VALIDATION_ERROR_0a800d70~^~N~^~None~^~VkImageSubresourceRange~^~VUID-VkImageSubresourceRange-levelCount-01720~^~core~^~The spec valid usage text states 'If levelCount is not VK_REMAINING_MIP_LEVELS, it must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceRange-levelCount-01720)~^~ VALIDATION_ERROR_0a800d72~^~N~^~None~^~VkImageSubresourceRange~^~VUID-VkImageSubresourceRange-layerCount-01721~^~core~^~The spec valid usage text states 'If layerCount is not VK_REMAINING_ARRAY_LAYERS, it must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceRange-layerCount-01721)~^~ -VALIDATION_ERROR_0aa007c6~^~N~^~Unknown~^~VkImageSwapchainCreateInfoKHR~^~VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995~^~(VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995)~^~ -VALIDATION_ERROR_0aa2b00b~^~N~^~Unknown~^~VkImageSwapchainCreateInfoKHR~^~VUID-VkImageSwapchainCreateInfoKHR-sType-sType~^~(VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSwapchainCreateInfoKHR-sType-sType)~^~implicit -VALIDATION_ERROR_0aa2f001~^~N~^~Unknown~^~VkImageSwapchainCreateInfoKHR~^~VUID-VkImageSwapchainCreateInfoKHR-swapchain-parameter~^~(VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'If swapchain is not VK_NULL_HANDLE, swapchain must be a valid VkSwapchainKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSwapchainCreateInfoKHR-swapchain-parameter)~^~implicit +VALIDATION_ERROR_0aa007c6~^~N~^~Unknown~^~VkImageSwapchainCreateInfoKHR~^~VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995~^~(VK_VERSION_1_1,VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995)~^~ +VALIDATION_ERROR_0aa2b00b~^~N~^~Unknown~^~VkImageSwapchainCreateInfoKHR~^~VUID-VkImageSwapchainCreateInfoKHR-sType-sType~^~(VK_VERSION_1_1,VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSwapchainCreateInfoKHR-sType-sType)~^~implicit +VALIDATION_ERROR_0aa2f001~^~N~^~Unknown~^~VkImageSwapchainCreateInfoKHR~^~VUID-VkImageSwapchainCreateInfoKHR-swapchain-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group)+(VK_KHR_swapchain)~^~The spec valid usage text states 'If swapchain is not VK_NULL_HANDLE, swapchain must be a valid VkSwapchainKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSwapchainCreateInfoKHR-swapchain-parameter)~^~implicit VALIDATION_ERROR_0ac007d6~^~Y~^~CreateImageViewBreaksParameterCompatibilityRequirements~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01003~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01003)~^~ VALIDATION_ERROR_0ac007d8~^~N~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-viewType-01004~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageViewCreateInfo-viewType-01004)~^~ -VALIDATION_ERROR_0ac007da~^~Y~^~CreateImageViewBreaksParameterCompatibilityRequirements~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01005~^~(VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01005)~^~ +VALIDATION_ERROR_0ac007da~^~Y~^~CreateImageViewBreaksParameterCompatibilityRequirements~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01005~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01005)~^~ VALIDATION_ERROR_0ac007dc~^~Y~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01006~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_LINEAR, format must be format that has at least one supported feature bit present in the value of VkFormatProperties::linearTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01006)~^~ VALIDATION_ERROR_0ac007de~^~N~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01007~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01007)~^~ VALIDATION_ERROR_0ac007e0~^~Y~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01008~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_LINEAR and usage contains VK_IMAGE_USAGE_SAMPLED_BIT, format must be supported for sampled images, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT flag in VkFormatProperties::linearTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01008)~^~ @@ -808,30 +811,31 @@ VALIDATION_ERROR_0ac007e4~^~Y~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01010~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_LINEAR and usage contains VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, format must be supported for color attachments, as specified by the VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT flag in VkFormatProperties::linearTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01010)~^~ VALIDATION_ERROR_0ac007e6~^~Y~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01011~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_LINEAR and usage contains VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, format must be supported for depth/stencil attachments, as specified by the VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT flag in VkFormatProperties::linearTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01011)~^~ VALIDATION_ERROR_0ac007e8~^~Y~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01012~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_OPTIMAL, format must be format that has at least one supported feature bit present in the value of VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01012)~^~ -VALIDATION_ERROR_0ac007ea~^~Y~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01013~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_OPTIMAL and usage contains VK_IMAGE_USAGE_SAMPLED_BIT, format must be supported for sampled images, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01013)~^~ -VALIDATION_ERROR_0ac007ec~^~Y~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01014~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_OPTIMAL and usage contains VK_IMAGE_USAGE_STORAGE_BIT, format must be supported for storage images, as specified by the VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01014)~^~ -VALIDATION_ERROR_0ac007ee~^~Y~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01015~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_OPTIMAL and usage contains VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, format must be supported for color attachments, as specified by the VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01015)~^~ -VALIDATION_ERROR_0ac007f0~^~Y~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01016~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_OPTIMAL and usage contains VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, format must be supported for depth/stencil attachments, as specified by the VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01016)~^~ +VALIDATION_ERROR_0ac007ea~^~Y~^~CreateImageViewFormatFeatureMismatch~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01013~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_OPTIMAL and usage contains VK_IMAGE_USAGE_SAMPLED_BIT, format must be supported for sampled images, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01013)~^~ +VALIDATION_ERROR_0ac007ec~^~Y~^~CreateImageViewFormatFeatureMismatch~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01014~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_OPTIMAL and usage contains VK_IMAGE_USAGE_STORAGE_BIT, format must be supported for storage images, as specified by the VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01014)~^~ +VALIDATION_ERROR_0ac007ee~^~Y~^~CreateImageViewFormatFeatureMismatch~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01015~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_OPTIMAL and usage contains VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, format must be supported for color attachments, as specified by the VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01015)~^~ +VALIDATION_ERROR_0ac007f0~^~Y~^~CreateImageViewFormatFeatureMismatch~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01016~^~core~^~The spec valid usage text states 'If image was created with VK_IMAGE_TILING_OPTIMAL and usage contains VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, format must be supported for depth/stencil attachments, as specified by the VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01016)~^~ VALIDATION_ERROR_0ac007f4~^~Y~^~CreateImageViewDifferentClass~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01018~^~core~^~The spec valid usage text states '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)~^~Multi-purposing this for some format compatibility checks, need unique enums. -VALIDATION_ERROR_0ac007f6~^~Y~^~CreateImageViewNoMutableFormatBit~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01019~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_0ac007f6~^~Y~^~CreateImageViewNoMutableFormatBit~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01019~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ VALIDATION_ERROR_0ac007f8~^~Y~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01020~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01020)~^~ VALIDATION_ERROR_0ac007fa~^~Y~^~CreateImageViewBreaksParameterCompatibilityRequirements~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-subResourceRange-01021~^~core~^~The spec valid usage text states 'subresourceRange and viewType must be compatible with the image, as described in the compatibility table' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-subResourceRange-01021)~^~ VALIDATION_ERROR_0ac00b8c~^~Y~^~CreateImageViewInvalidSubresourceRange~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-subresourceRange-01478~^~core~^~The spec valid usage text states 'subresourceRange.baseMipLevel must be less than the mipLevels specified in VkImageCreateInfo when image was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-01478)~^~ -VALIDATION_ERROR_0ac00b90~^~Y~^~CreateImageViewInvalidSubresourceRange~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-subresourceRange-01480~^~!(VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_0ac00b94~^~Y~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01482~^~(VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01482)~^~ -VALIDATION_ERROR_0ac00b96~^~Y~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-subresourceRange-01483~^~(VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-01483)~^~ -VALIDATION_ERROR_0ac00b98~^~Y~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01484~^~(VK_KHR_maintenance1)~^~The spec valid usage text states '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 extent.depth specified in VkImageCreateInfo when image was created' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01484)~^~ -VALIDATION_ERROR_0ac00b9a~^~Y~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-subresourceRange-01485~^~(VK_KHR_maintenance1)~^~The spec valid usage text states '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 extent.depth specified in VkImageCreateInfo when image was created' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-01485)~^~ -VALIDATION_ERROR_0ac00c5e~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01583~^~(VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01583)~^~ -VALIDATION_ERROR_0ac00c60~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01584~^~(VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01584)~^~ +VALIDATION_ERROR_0ac00b90~^~Y~^~CreateImageViewInvalidSubresourceRange~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-subresourceRange-01480~^~!(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_0ac00b94~^~Y~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01482~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01482)~^~ +VALIDATION_ERROR_0ac00b96~^~Y~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-subresourceRange-01483~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-01483)~^~ +VALIDATION_ERROR_0ac00b98~^~Y~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01484~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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 extent.depth specified in VkImageCreateInfo when image was created' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01484)~^~ +VALIDATION_ERROR_0ac00b9a~^~Y~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-subresourceRange-01485~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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 extent.depth specified in VkImageCreateInfo when image was created' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-01485)~^~ +VALIDATION_ERROR_0ac00c5e~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01583~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01583)~^~ +VALIDATION_ERROR_0ac00c60~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01584~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01584)~^~ VALIDATION_ERROR_0ac00c62~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-pNext-01585~^~(VK_KHR_image_format_list)~^~The spec valid usage text states 'If a VkImageFormatListCreateInfoKHR structure was included in the pNext chain of the VkImageCreateInfo struct used when creating image and the viewFormatCount field of VkImageFormatListCreateInfoKHR is not zero then format must be one of the formats in VkImageFormatListCreateInfoKHR::pViewFormats.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-pNext-01585)~^~ -VALIDATION_ERROR_0ac00c64~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01586~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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 features-formats-compatible-planes' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01586)~^~ +VALIDATION_ERROR_0ac00c64~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01586~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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 features-formats-compatible-planes' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01586)~^~ VALIDATION_ERROR_0ac00d6c~^~Y~^~CreateImageViewInvalidSubresourceRange~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-subresourceRange-01718~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-01718)~^~ -VALIDATION_ERROR_0ac00d6e~^~Y~^~CreateImageViewInvalidSubresourceRange~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-subresourceRange-01719~^~!(VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ -VALIDATION_ERROR_0ac00dbe~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01759~^~(VK_KHR_maintenance2)+!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01759)~^~ -VALIDATION_ERROR_0ac00dc0~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01760~^~!(VK_KHR_maintenance2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01760)~^~ -VALIDATION_ERROR_0ac00dc2~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01761~^~(VK_KHR_maintenance2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01761)~^~ -VALIDATION_ERROR_0ac00dc4~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01762~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If image was not created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag,' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01762)~^~ +VALIDATION_ERROR_0ac00d6e~^~Y~^~CreateImageViewInvalidSubresourceRange~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-subresourceRange-01719~^~!(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_0ac00dbe~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01759~^~(VK_VERSION_1_1,VK_KHR_maintenance2)+!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01759)~^~ +VALIDATION_ERROR_0ac00dc0~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01760~^~!(VK_VERSION_1_1,VK_KHR_maintenance2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01760)~^~ +VALIDATION_ERROR_0ac00dc2~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01761~^~(VK_VERSION_1_1,VK_KHR_maintenance2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01761)~^~ +VALIDATION_ERROR_0ac00dc4~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01762~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If image was not created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag,' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01762)~^~ +VALIDATION_ERROR_0ac00ed0~^~N~^~None~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-image-01896~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'If image has an external format:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01896)~^~ VALIDATION_ERROR_0ac02c01~^~N~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-components-parameter~^~core~^~The spec valid usage text states 'components must be a valid VkComponentMapping structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-components-parameter)~^~implicit VALIDATION_ERROR_0ac09005~^~Y~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-flags-zerobitmask~^~core~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-flags-zerobitmask)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0ac09201~^~Y~^~Unknown~^~VkImageViewCreateInfo~^~VUID-VkImageViewCreateInfo-format-parameter~^~core~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-format-parameter)~^~implicit @@ -848,7 +852,6 @@ VALIDATION_ERROR_0ae00be0~^~N~^~None~^~VkImportMemoryFdInfoKHR~^~VUID-VkImportMemoryFdInfoKHR-fd-01520~^~(VK_KHR_external_memory_fd)~^~The spec valid usage text states 'fd must obey any requirements listed for handleType in external memory handle types compatibility.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-fd-01520)~^~ VALIDATION_ERROR_0ae00da4~^~N~^~None~^~VkImportMemoryFdInfoKHR~^~VUID-VkImportMemoryFdInfoKHR-fd-01746~^~(VK_KHR_external_memory_fd)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-fd-01746)~^~ VALIDATION_ERROR_0ae09c01~^~N~^~Unknown~^~VkImportMemoryFdInfoKHR~^~VUID-VkImportMemoryFdInfoKHR-handleType-parameter~^~(VK_KHR_external_memory_fd)~^~The spec valid usage text states 'If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-handleType-parameter)~^~implicit -VALIDATION_ERROR_0ae1c40d~^~N~^~Unknown~^~VkImportMemoryFdInfoKHR~^~VUID-VkImportMemoryFdInfoKHR-pNext-pNext~^~(VK_KHR_external_memory_fd)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-pNext-pNext)~^~implicit VALIDATION_ERROR_0ae2b00b~^~N~^~Unknown~^~VkImportMemoryFdInfoKHR~^~VUID-VkImportMemoryFdInfoKHR-sType-sType~^~(VK_KHR_external_memory_fd)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-sType-sType)~^~implicit VALIDATION_ERROR_0b000524~^~N~^~Unknown~^~VkImportMemoryWin32HandleInfoKHR~^~VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00658~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00658)~^~ VALIDATION_ERROR_0b000526~^~N~^~Unknown~^~VkImportMemoryWin32HandleInfoKHR~^~VUID-VkImportMemoryWin32HandleInfoKHR-handle-00659~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handle-00659)~^~ @@ -860,12 +863,10 @@ VALIDATION_ERROR_0b000bdc~^~N~^~None~^~VkImportMemoryWin32HandleInfoKHR~^~VUID-VkImportMemoryWin32HandleInfoKHR-handle-01518~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handle-01518)~^~ VALIDATION_ERROR_0b000bde~^~N~^~None~^~VkImportMemoryWin32HandleInfoKHR~^~VUID-VkImportMemoryWin32HandleInfoKHR-name-01519~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-name-01519)~^~ VALIDATION_ERROR_0b009c01~^~N~^~Unknown~^~VkImportMemoryWin32HandleInfoKHR~^~VUID-VkImportMemoryWin32HandleInfoKHR-handleType-parameter~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states 'If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handleType-parameter)~^~implicit -VALIDATION_ERROR_0b01c40d~^~N~^~Unknown~^~VkImportMemoryWin32HandleInfoKHR~^~VUID-VkImportMemoryWin32HandleInfoKHR-pNext-pNext~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-pNext-pNext)~^~implicit VALIDATION_ERROR_0b02b00b~^~N~^~Unknown~^~VkImportMemoryWin32HandleInfoKHR~^~VUID-VkImportMemoryWin32HandleInfoKHR-sType-sType~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-sType-sType)~^~implicit VALIDATION_ERROR_0b200a5e~^~N~^~Unknown~^~VkImportMemoryWin32HandleInfoNV~^~VUID-VkImportMemoryWin32HandleInfoNV-handleType-01327~^~(VK_NV_external_memory_win32)~^~The spec valid usage text states 'handleType must not have more than one bit set.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-handleType-01327)~^~ VALIDATION_ERROR_0b200a60~^~N~^~Unknown~^~VkImportMemoryWin32HandleInfoNV~^~VUID-VkImportMemoryWin32HandleInfoNV-handle-01328~^~(VK_NV_external_memory_win32)~^~The spec valid usage text states 'handle must be a valid handle to memory, obtained as specified by handleType.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-handle-01328)~^~ VALIDATION_ERROR_0b209c01~^~N~^~Unknown~^~VkImportMemoryWin32HandleInfoNV~^~VUID-VkImportMemoryWin32HandleInfoNV-handleType-parameter~^~(VK_NV_external_memory_win32)~^~The spec valid usage text states 'handleType must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-handleType-parameter)~^~implicit -VALIDATION_ERROR_0b21c40d~^~N~^~Unknown~^~VkImportMemoryWin32HandleInfoNV~^~VUID-VkImportMemoryWin32HandleInfoNV-pNext-pNext~^~(VK_NV_external_memory_win32)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-pNext-pNext)~^~implicit VALIDATION_ERROR_0b22b00b~^~N~^~Unknown~^~VkImportMemoryWin32HandleInfoNV~^~VUID-VkImportMemoryWin32HandleInfoNV-sType-sType~^~(VK_NV_external_memory_win32)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-sType-sType)~^~implicit VALIDATION_ERROR_0b4008ee~^~N~^~Unknown~^~VkImportSemaphoreFdInfoKHR~^~VUID-VkImportSemaphoreFdInfoKHR-handleType-01143~^~(VK_KHR_external_semaphore_fd)~^~The spec valid usage text states 'handleType must be a value included in the Handle Types Supported by VkImportSemaphoreFdInfoKHR table.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-handleType-01143)~^~ VALIDATION_ERROR_0b400c10~^~N~^~None~^~VkImportSemaphoreFdInfoKHR~^~VUID-VkImportSemaphoreFdInfoKHR-fd-01544~^~(VK_KHR_external_semaphore_fd)~^~The spec valid usage text states 'fd must obey any requirements listed for handleType in external semaphore handle types compatibility.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-fd-01544)~^~ @@ -930,7 +931,7 @@ VALIDATION_ERROR_0c400548~^~N~^~Unknown~^~VkMemoryAllocateFlagsInfo~^~VUID-VkMemoryAllocateFlagsInfo-deviceMask-00676~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'If VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT is set, deviceMask must not be zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateFlagsInfo-deviceMask-00676)~^~ VALIDATION_ERROR_0c409001~^~N~^~Unknown~^~VkMemoryAllocateFlagsInfo~^~VUID-VkMemoryAllocateFlagsInfo-flags-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'flags must be a valid combination of VkMemoryAllocateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateFlagsInfo-flags-parameter)~^~implicit VALIDATION_ERROR_0c42b00b~^~N~^~Unknown~^~VkMemoryAllocateFlagsInfo~^~VUID-VkMemoryAllocateFlagsInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateFlagsInfo-sType-sType)~^~implicit -VALIDATION_ERROR_0c6004fc~^~N~^~Unknown~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-allocationSize-00638~^~core~^~The spec valid usage text states 'allocationSize must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-00638)~^~ +VALIDATION_ERROR_0c6004fc~^~N~^~Unknown~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-allocationSize-00638~^~!(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'allocationSize must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-00638)~^~ VALIDATION_ERROR_0c6004fe~^~N~^~Unknown~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-pNext-00639~^~(VK_KHR_external_memory)+(VK_KHR_dedicated_allocation,VK_NV_dedicated_allocation)~^~The spec valid usage text states 'If the pNext chain contains an instance of VkExportMemoryAllocateInfo, 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 contain an instance of ifdef::VK_KHR_dedicated_allocation[VkMemoryDedicatedAllocateInfo]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-00639)~^~ VALIDATION_ERROR_0c600500~^~N~^~Unknown~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-pNext-00640~^~(VK_KHR_external_memory)+(VK_NV_external_memory)~^~The spec valid usage text states 'If the pNext chain contains an instance of VkExportMemoryAllocateInfo, it must not contain an instance of VkExportMemoryAllocateInfoNV or VkExportMemoryWin32HandleInfoNV.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-00640)~^~ VALIDATION_ERROR_0c600502~^~N~^~Unknown~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-pNext-00641~^~(VK_KHR_external_memory_win32+VK_NV_external_memory_win32)~^~The spec valid usage text states 'If the pNext chain contains an instance of VkImportMemoryWin32HandleInfoKHR, it must not contain an instance of VkImportMemoryWin32HandleInfoNV.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-00641)~^~ @@ -944,7 +945,11 @@ VALIDATION_ERROR_0c600d9e~^~N~^~None~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-allocationSize-01743~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-01743)~^~ VALIDATION_ERROR_0c600da0~^~N~^~None~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-memoryTypeIndex-01744~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-memoryTypeIndex-01744)~^~ VALIDATION_ERROR_0c600da2~^~N~^~None~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-allocationSize-01745~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-01745)~^~ -VALIDATION_ERROR_0c61c40d~^~Y~^~Unknown~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-pNext-pNext~^~core~^~The spec valid usage text states '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, VkImportMemoryFdInfoKHR, VkImportMemoryHostPointerInfoEXT, VkImportMemoryWin32HandleInfoKHR, VkImportMemoryWin32HandleInfoNV, VkMemoryAllocateFlagsInfo, or VkMemoryDedicatedAllocateInfo' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-pNext)~^~implicit +VALIDATION_ERROR_0c600ea0~^~N~^~None~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-memoryTypeIndex-01872~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-memoryTypeIndex-01872)~^~ +VALIDATION_ERROR_0c600ea2~^~N~^~None~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-None-01873~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'If the parameters define an import operation and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BIT_ANDROID:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-None-01873)~^~ +VALIDATION_ERROR_0c600ea4~^~N~^~None~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-pNext-01874~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'If the parameters do not define an import operation, and the pNext chain contains an instance of VkExportMemoryAllocateInfo with VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID included in its handleTypes member, and the pNext contains an instance of VkMemoryDedicatedAllocateInfo 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.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-01874)~^~ +VALIDATION_ERROR_0c600ea6~^~N~^~None~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-pNext-01875~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes an instance of VkMemoryDedicatedAllocateInfo with image that is not VK_NULL_HANDLE:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-01875)~^~ +VALIDATION_ERROR_0c61c40d~^~Y~^~Unknown~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-pNext-pNext~^~core~^~The spec valid usage text states '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, or VkMemoryDedicatedAllocateInfo' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-pNext)~^~implicit VALIDATION_ERROR_0c62b00b~^~Y~^~Unknown~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkMemoryAllocateInfo-sType-sType)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0c62b00f~^~N~^~Unknown~^~VkMemoryAllocateInfo~^~VUID-VkMemoryAllocateInfo-sType-unique~^~core~^~The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkMemoryAllocateInfo-sType-unique)~^~implicit VALIDATION_ERROR_0c806801~^~Y~^~Unknown~^~VkMemoryBarrier~^~VUID-VkMemoryBarrier-dstAccessMask-parameter~^~core~^~The spec valid usage text states 'dstAccessMask must be a valid combination of VkAccessFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkMemoryBarrier-dstAccessMask-parameter)~^~implicit @@ -1003,44 +1008,40 @@ VALIDATION_ERROR_0d809001~^~N~^~Unknown~^~VkObjectTableVertexBufferEntryNVX~^~VUID-VkObjectTableVertexBufferEntryNVX-flags-parameter~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'flags must be a valid combination of VkObjectEntryUsageFlagBitsNVX values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkObjectTableVertexBufferEntryNVX-flags-parameter)~^~implicit VALIDATION_ERROR_0d809003~^~N~^~Unknown~^~VkObjectTableVertexBufferEntryNVX~^~VUID-VkObjectTableVertexBufferEntryNVX-flags-requiredbitmask~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'flags must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkObjectTableVertexBufferEntryNVX-flags-requiredbitmask)~^~implicit VALIDATION_ERROR_0d830401~^~N~^~Unknown~^~VkObjectTableVertexBufferEntryNVX~^~VUID-VkObjectTableVertexBufferEntryNVX-type-parameter~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'type must be a valid VkObjectEntryTypeNVX value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkObjectTableVertexBufferEntryNVX-type-parameter)~^~implicit -VALIDATION_ERROR_0da1c40d~^~N~^~Unknown~^~VkPhysicalDeviceDiscardRectanglePropertiesEXT~^~VUID-VkPhysicalDeviceDiscardRectanglePropertiesEXT-pNext-pNext~^~(VK_EXT_discard_rectangles)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDiscardRectanglePropertiesEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_0da2b00b~^~N~^~Unknown~^~VkPhysicalDeviceDiscardRectanglePropertiesEXT~^~VUID-VkPhysicalDeviceDiscardRectanglePropertiesEXT-sType-sType~^~(VK_EXT_discard_rectangles)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDiscardRectanglePropertiesEXT-sType-sType)~^~implicit -VALIDATION_ERROR_0dc09001~^~Y~^~Unknown~^~VkPhysicalDeviceExternalBufferInfo~^~VUID-VkPhysicalDeviceExternalBufferInfo-flags-parameter~^~(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'flags must be a valid combination of VkBufferCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-flags-parameter)~^~implicit -VALIDATION_ERROR_0dc09c01~^~Y~^~Unknown~^~VkPhysicalDeviceExternalBufferInfo~^~VUID-VkPhysicalDeviceExternalBufferInfo-handleType-parameter~^~(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-handleType-parameter)~^~implicit -VALIDATION_ERROR_0dc1c40d~^~Y~^~Unknown~^~VkPhysicalDeviceExternalBufferInfo~^~VUID-VkPhysicalDeviceExternalBufferInfo-pNext-pNext~^~(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_0dc2b00b~^~Y~^~Unknown~^~VkPhysicalDeviceExternalBufferInfo~^~VUID-VkPhysicalDeviceExternalBufferInfo-sType-sType~^~(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-sType-sType)~^~implicit -VALIDATION_ERROR_0dc30601~^~N~^~Unknown~^~VkPhysicalDeviceExternalBufferInfo~^~VUID-VkPhysicalDeviceExternalBufferInfo-usage-parameter~^~(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'usage must be a valid combination of VkBufferUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-usage-parameter)~^~implicit -VALIDATION_ERROR_0dc30603~^~Y~^~Unknown~^~VkPhysicalDeviceExternalBufferInfo~^~VUID-VkPhysicalDeviceExternalBufferInfo-usage-requiredbitmask~^~(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-usage-requiredbitmask)~^~implicit -VALIDATION_ERROR_0de09c01~^~N~^~Unknown~^~VkPhysicalDeviceExternalImageFormatInfo~^~VUID-VkPhysicalDeviceExternalImageFormatInfo-handleType-parameter~^~(VK_KHR_get_physical_device_properties2)+(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalImageFormatInfo-handleType-parameter)~^~implicit -VALIDATION_ERROR_0de2b00b~^~N~^~Unknown~^~VkPhysicalDeviceExternalImageFormatInfo~^~VUID-VkPhysicalDeviceExternalImageFormatInfo-sType-sType~^~(VK_KHR_get_physical_device_properties2)+(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalImageFormatInfo-sType-sType)~^~implicit -VALIDATION_ERROR_0e009c01~^~Y~^~Unknown~^~VkPhysicalDeviceExternalSemaphoreInfo~^~VUID-VkPhysicalDeviceExternalSemaphoreInfo-handleType-parameter~^~(VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-handleType-parameter)~^~implicit -VALIDATION_ERROR_0e01c40d~^~Y~^~Unknown~^~VkPhysicalDeviceExternalSemaphoreInfo~^~VUID-VkPhysicalDeviceExternalSemaphoreInfo-pNext-pNext~^~(VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_0e02b00b~^~Y~^~Unknown~^~VkPhysicalDeviceExternalSemaphoreInfo~^~VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-sType~^~(VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-sType)~^~implicit -VALIDATION_ERROR_0e41c40d~^~N~^~Unknown~^~VkPhysicalDeviceFeatures2~^~VUID-VkPhysicalDeviceFeatures2-pNext-pNext~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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 VkPhysicalDevice16BitStorageFeatures, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceSamplerYcbcrConversionFeatures, VkPhysicalDeviceShaderDrawParameterFeatures, or VkPhysicalDeviceVariablePointerFeatures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFeatures2-pNext-pNext)~^~implicit -VALIDATION_ERROR_0e42b00b~^~Y~^~Unknown~^~VkPhysicalDeviceFeatures2~^~VUID-VkPhysicalDeviceFeatures2-sType-sType~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFeatures2-sType-sType)~^~implicit -VALIDATION_ERROR_0e42b00f~^~N~^~None~^~VkPhysicalDeviceFeatures2~^~VUID-VkPhysicalDeviceFeatures2-sType-unique~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFeatures2-sType-unique)~^~implicit -VALIDATION_ERROR_0e609001~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-flags-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'flags must be a valid combination of VkImageCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-flags-parameter)~^~implicit -VALIDATION_ERROR_0e609201~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-format-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-format-parameter)~^~implicit -VALIDATION_ERROR_0e61c40d~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-pNext-pNext~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkPhysicalDeviceExternalImageFormatInfo' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-pNext-pNext)~^~implicit -VALIDATION_ERROR_0e62b00b~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-sType-sType~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-sType-sType)~^~implicit -VALIDATION_ERROR_0e62fa01~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-tiling-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'tiling must be a valid VkImageTiling value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-tiling-parameter)~^~implicit -VALIDATION_ERROR_0e630401~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-type-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'type must be a valid VkImageType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-type-parameter)~^~implicit -VALIDATION_ERROR_0e630601~^~N~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-usage-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'usage must be a valid combination of VkImageUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-usage-parameter)~^~implicit -VALIDATION_ERROR_0e630603~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-usage-requiredbitmask~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-usage-requiredbitmask)~^~implicit -VALIDATION_ERROR_0e800488~^~N~^~Unknown~^~VkPhysicalDeviceMultiviewFeatures~^~VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580~^~(VK_KHR_multiview)~^~The spec valid usage text states 'If multiviewGeometryShader is enabled then multiview must also be enabled.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580)~^~ -VALIDATION_ERROR_0e80048a~^~N~^~Unknown~^~VkPhysicalDeviceMultiviewFeatures~^~VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581~^~(VK_KHR_multiview)~^~The spec valid usage text states 'If multiviewTessellationShader is enabled then multiview must also be enabled.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581)~^~ -VALIDATION_ERROR_0e82b00b~^~N~^~Unknown~^~VkPhysicalDeviceMultiviewFeatures~^~VUID-VkPhysicalDeviceMultiviewFeatures-sType-sType~^~(VK_KHR_multiview)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewFeatures-sType-sType)~^~implicit -VALIDATION_ERROR_0ea1c40d~^~N~^~Unknown~^~VkPhysicalDevicePushDescriptorPropertiesKHR~^~VUID-VkPhysicalDevicePushDescriptorPropertiesKHR-pNext-pNext~^~(VK_KHR_push_descriptor)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDevicePushDescriptorPropertiesKHR-pNext-pNext)~^~implicit +VALIDATION_ERROR_0dc09001~^~Y~^~Unknown~^~VkPhysicalDeviceExternalBufferInfo~^~VUID-VkPhysicalDeviceExternalBufferInfo-flags-parameter~^~(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'flags must be a valid combination of VkBufferCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-flags-parameter)~^~implicit +VALIDATION_ERROR_0dc09c01~^~Y~^~Unknown~^~VkPhysicalDeviceExternalBufferInfo~^~VUID-VkPhysicalDeviceExternalBufferInfo-handleType-parameter~^~(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-handleType-parameter)~^~implicit +VALIDATION_ERROR_0dc1c40d~^~Y~^~Unknown~^~VkPhysicalDeviceExternalBufferInfo~^~VUID-VkPhysicalDeviceExternalBufferInfo-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-pNext-pNext)~^~implicit +VALIDATION_ERROR_0dc2b00b~^~Y~^~Unknown~^~VkPhysicalDeviceExternalBufferInfo~^~VUID-VkPhysicalDeviceExternalBufferInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-sType-sType)~^~implicit +VALIDATION_ERROR_0dc30601~^~N~^~Unknown~^~VkPhysicalDeviceExternalBufferInfo~^~VUID-VkPhysicalDeviceExternalBufferInfo-usage-parameter~^~(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'usage must be a valid combination of VkBufferUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-usage-parameter)~^~implicit +VALIDATION_ERROR_0dc30603~^~Y~^~Unknown~^~VkPhysicalDeviceExternalBufferInfo~^~VUID-VkPhysicalDeviceExternalBufferInfo-usage-requiredbitmask~^~(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-usage-requiredbitmask)~^~implicit +VALIDATION_ERROR_0de09c01~^~N~^~Unknown~^~VkPhysicalDeviceExternalImageFormatInfo~^~VUID-VkPhysicalDeviceExternalImageFormatInfo-handleType-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalImageFormatInfo-handleType-parameter)~^~implicit +VALIDATION_ERROR_0de2b00b~^~N~^~Unknown~^~VkPhysicalDeviceExternalImageFormatInfo~^~VUID-VkPhysicalDeviceExternalImageFormatInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalImageFormatInfo-sType-sType)~^~implicit +VALIDATION_ERROR_0e009c01~^~Y~^~Unknown~^~VkPhysicalDeviceExternalSemaphoreInfo~^~VUID-VkPhysicalDeviceExternalSemaphoreInfo-handleType-parameter~^~(VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-handleType-parameter)~^~implicit +VALIDATION_ERROR_0e01c40d~^~Y~^~Unknown~^~VkPhysicalDeviceExternalSemaphoreInfo~^~VUID-VkPhysicalDeviceExternalSemaphoreInfo-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-pNext-pNext)~^~implicit +VALIDATION_ERROR_0e02b00b~^~Y~^~Unknown~^~VkPhysicalDeviceExternalSemaphoreInfo~^~VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-sType)~^~implicit +VALIDATION_ERROR_0e42b00b~^~Y~^~Unknown~^~VkPhysicalDeviceFeatures2~^~VUID-VkPhysicalDeviceFeatures2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFeatures2-sType-sType)~^~implicit +VALIDATION_ERROR_0e609001~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-flags-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'flags must be a valid combination of VkImageCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-flags-parameter)~^~implicit +VALIDATION_ERROR_0e609201~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-format-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-format-parameter)~^~implicit +VALIDATION_ERROR_0e61c40d~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkPhysicalDeviceExternalImageFormatInfo' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-pNext-pNext)~^~implicit +VALIDATION_ERROR_0e62b00b~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-sType-sType)~^~implicit +VALIDATION_ERROR_0e62fa01~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-tiling-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'tiling must be a valid VkImageTiling value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-tiling-parameter)~^~implicit +VALIDATION_ERROR_0e630401~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-type-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'type must be a valid VkImageType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-type-parameter)~^~implicit +VALIDATION_ERROR_0e630601~^~N~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-usage-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'usage must be a valid combination of VkImageUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-usage-parameter)~^~implicit +VALIDATION_ERROR_0e630603~^~Y~^~Unknown~^~VkPhysicalDeviceImageFormatInfo2~^~VUID-VkPhysicalDeviceImageFormatInfo2-usage-requiredbitmask~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-usage-requiredbitmask)~^~implicit +VALIDATION_ERROR_0e800488~^~N~^~Unknown~^~VkPhysicalDeviceMultiviewFeatures~^~VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'If multiviewGeometryShader is enabled then multiview must also be enabled.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580)~^~ +VALIDATION_ERROR_0e80048a~^~N~^~Unknown~^~VkPhysicalDeviceMultiviewFeatures~^~VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'If multiviewTessellationShader is enabled then multiview must also be enabled.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581)~^~ +VALIDATION_ERROR_0e82b00b~^~N~^~Unknown~^~VkPhysicalDeviceMultiviewFeatures~^~VUID-VkPhysicalDeviceMultiviewFeatures-sType-sType~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewFeatures-sType-sType)~^~implicit VALIDATION_ERROR_0ea2b00b~^~N~^~Unknown~^~VkPhysicalDevicePushDescriptorPropertiesKHR~^~VUID-VkPhysicalDevicePushDescriptorPropertiesKHR-sType-sType~^~(VK_KHR_push_descriptor)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDevicePushDescriptorPropertiesKHR-sType-sType)~^~implicit -VALIDATION_ERROR_0ec0088e~^~N~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-01095~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-01095)~^~ -VALIDATION_ERROR_0ec09201~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-format-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-format-parameter)~^~implicit -VALIDATION_ERROR_0ec1c40d~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-pNext-pNext~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-pNext-pNext)~^~implicit -VALIDATION_ERROR_0ec2b00b~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-sType-sType~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-sType-sType)~^~implicit -VALIDATION_ERROR_0ec2b401~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'samples must be a valid VkSampleCountFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-parameter)~^~implicit -VALIDATION_ERROR_0ec2fa01~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-tiling-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'tiling must be a valid VkImageTiling value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-tiling-parameter)~^~implicit -VALIDATION_ERROR_0ec30401~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-type-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'type must be a valid VkImageType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-type-parameter)~^~implicit -VALIDATION_ERROR_0ec30601~^~N~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'usage must be a valid combination of VkImageUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-parameter)~^~implicit -VALIDATION_ERROR_0ec30603~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-requiredbitmask~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-requiredbitmask)~^~implicit +VALIDATION_ERROR_0ec0088e~^~N~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-01095~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-01095)~^~ +VALIDATION_ERROR_0ec09201~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-format-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-format-parameter)~^~implicit +VALIDATION_ERROR_0ec1c40d~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-pNext-pNext)~^~implicit +VALIDATION_ERROR_0ec2b00b~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-sType-sType)~^~implicit +VALIDATION_ERROR_0ec2b401~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'samples must be a valid VkSampleCountFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-parameter)~^~implicit +VALIDATION_ERROR_0ec2fa01~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-tiling-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'tiling must be a valid VkImageTiling value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-tiling-parameter)~^~implicit +VALIDATION_ERROR_0ec30401~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-type-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'type must be a valid VkImageType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-type-parameter)~^~implicit +VALIDATION_ERROR_0ec30601~^~N~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'usage must be a valid combination of VkImageUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-parameter)~^~implicit +VALIDATION_ERROR_0ec30603~^~Y~^~Unknown~^~VkPhysicalDeviceSparseImageFormatInfo2~^~VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-requiredbitmask~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-requiredbitmask)~^~implicit VALIDATION_ERROR_0ee1c40d~^~Y~^~Unknown~^~VkPhysicalDeviceSurfaceInfo2KHR~^~VUID-VkPhysicalDeviceSurfaceInfo2KHR-pNext-pNext~^~(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSurfaceInfo2KHR-pNext-pNext)~^~implicit VALIDATION_ERROR_0ee2b00b~^~Y~^~Unknown~^~VkPhysicalDeviceSurfaceInfo2KHR~^~VUID-VkPhysicalDeviceSurfaceInfo2KHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSurfaceInfo2KHR-sType-sType)~^~implicit VALIDATION_ERROR_0ee2ec01~^~Y~^~Unknown~^~VkPhysicalDeviceSurfaceInfo2KHR~^~VUID-VkPhysicalDeviceSurfaceInfo2KHR-surface-parameter~^~(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)~^~The spec valid usage text states 'surface must be a valid VkSurfaceKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSurfaceInfo2KHR-surface-parameter)~^~implicit @@ -1083,7 +1084,6 @@ VALIDATION_ERROR_0f80048c~^~N~^~Unknown~^~VkPipelineDiscardRectangleStateCreateInfoEXT~^~VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleCount-00582~^~(VK_EXT_discard_rectangles)~^~The spec valid usage text states 'discardRectangleCount must be between 0 and VkPhysicalDeviceDiscardRectanglePropertiesEXT::maxDiscardRectangles, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleCount-00582)~^~ VALIDATION_ERROR_0f805e01~^~N~^~Unknown~^~VkPipelineDiscardRectangleStateCreateInfoEXT~^~VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleMode-parameter~^~(VK_EXT_discard_rectangles)~^~The spec valid usage text states 'discardRectangleMode must be a valid VkDiscardRectangleModeEXT value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleMode-parameter)~^~implicit VALIDATION_ERROR_0f809005~^~N~^~Unknown~^~VkPipelineDiscardRectangleStateCreateInfoEXT~^~VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-flags-zerobitmask~^~(VK_EXT_discard_rectangles)~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-flags-zerobitmask)~^~implicit -VALIDATION_ERROR_0f81c40d~^~N~^~Unknown~^~VkPipelineDiscardRectangleStateCreateInfoEXT~^~VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-pNext-pNext~^~(VK_EXT_discard_rectangles)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_0f82b00b~^~N~^~Unknown~^~VkPipelineDiscardRectangleStateCreateInfoEXT~^~VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-sType-sType~^~(VK_EXT_discard_rectangles)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-sType-sType)~^~implicit VALIDATION_ERROR_0fa00b44~^~N~^~None~^~VkPipelineDynamicStateCreateInfo~^~VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442~^~core~^~The spec valid usage text states 'Each element of pDynamicStates must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442)~^~ VALIDATION_ERROR_0fa07c1b~^~N~^~Unknown~^~VkPipelineDynamicStateCreateInfo~^~VUID-VkPipelineDynamicStateCreateInfo-dynamicStateCount-arraylength~^~core~^~The spec valid usage text states 'dynamicStateCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineDynamicStateCreateInfo-dynamicStateCount-arraylength)~^~implicit @@ -1099,22 +1099,50 @@ VALIDATION_ERROR_0fc2b00b~^~Y~^~Unknown~^~VkPipelineInputAssemblyStateCreateInfo~^~VUID-VkPipelineInputAssemblyStateCreateInfo-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineInputAssemblyStateCreateInfo-sType-sType)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0fc30001~^~Y~^~Unknown~^~VkPipelineInputAssemblyStateCreateInfo~^~VUID-VkPipelineInputAssemblyStateCreateInfo-topology-parameter~^~core~^~The spec valid usage text states 'topology must be a valid VkPrimitiveTopology value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineInputAssemblyStateCreateInfo-topology-parameter)~^~implicit VALIDATION_ERROR_0fe0023c~^~Y~^~CreatePipelineLayoutExceedsSetLimit~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-setLayoutCount-00286~^~core~^~The spec valid usage text states 'setLayoutCount must be less than or equal to VkPhysicalDeviceLimits::maxBoundDescriptorSets' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-setLayoutCount-00286)~^~ -VALIDATION_ERROR_0fe0023e~^~Y~^~CreatePipelineLayoutExcessPerStageDescriptors~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00287~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00287)~^~ -VALIDATION_ERROR_0fe00240~^~Y~^~CreatePipelineLayoutExcessPerStageDescriptors~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00288~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00288)~^~ -VALIDATION_ERROR_0fe00242~^~Y~^~CreatePipelineLayoutExcessPerStageDescriptors~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00289~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00289)~^~ -VALIDATION_ERROR_0fe00244~^~Y~^~CreatePipelineLayoutExcessPerStageDescriptors~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00290~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00290)~^~ -VALIDATION_ERROR_0fe00246~^~Y~^~CreatePipelineLayoutExcessPerStageDescriptors~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00291~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00291)~^~ +VALIDATION_ERROR_0fe0023e~^~Y~^~CreatePipelineLayoutExcessPerStageDescriptors~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00287~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00287)~^~ +VALIDATION_ERROR_0fe00240~^~Y~^~CreatePipelineLayoutExcessPerStageDescriptors~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00288~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00288)~^~ +VALIDATION_ERROR_0fe00242~^~Y~^~CreatePipelineLayoutExcessPerStageDescriptors~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00289~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00289)~^~ +VALIDATION_ERROR_0fe00244~^~Y~^~CreatePipelineLayoutExcessPerStageDescriptors~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00290~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00290)~^~ +VALIDATION_ERROR_0fe00246~^~Y~^~CreatePipelineLayoutExcessPerStageDescriptors~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00291~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00291)~^~ VALIDATION_ERROR_0fe00248~^~Y~^~InvalidPushConstants~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-00292~^~core~^~The spec valid usage text states 'Any two elements of pPushConstantRanges must not include the same stage in stageFlags' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-00292)~^~ VALIDATION_ERROR_0fe0024a~^~Y~^~MultiplePushDescriptorSets~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00293~^~(VK_KHR_push_descriptor)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00293)~^~ -VALIDATION_ERROR_0fe00d18~^~Y~^~CreatePipelineLayoutExcessPerStageDescriptors~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01676~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01676)~^~ -VALIDATION_ERROR_0fe00d1a~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01677~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01677)~^~ -VALIDATION_ERROR_0fe00d1c~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01678~^~core~^~The spec valid usage text states 'The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stagess and and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01678)~^~ -VALIDATION_ERROR_0fe00d1e~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01679~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01679)~^~ -VALIDATION_ERROR_0fe00d20~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01680~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01680)~^~ -VALIDATION_ERROR_0fe00d22~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01681~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01681)~^~ -VALIDATION_ERROR_0fe00d24~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01682~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01682)~^~ -VALIDATION_ERROR_0fe00d26~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01683~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01683)~^~ -VALIDATION_ERROR_0fe00d28~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01684~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01684)~^~ +VALIDATION_ERROR_0fe00d18~^~Y~^~CreatePipelineLayoutExcessPerStageDescriptors~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01676~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01676)~^~ +VALIDATION_ERROR_0fe00d1a~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01677~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01677)~^~ +VALIDATION_ERROR_0fe00d1c~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01678~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stagess and and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01678)~^~ +VALIDATION_ERROR_0fe00d1e~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01679~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01679)~^~ +VALIDATION_ERROR_0fe00d20~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01680~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01680)~^~ +VALIDATION_ERROR_0fe00d22~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01681~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01681)~^~ +VALIDATION_ERROR_0fe00d24~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01682~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01682)~^~ +VALIDATION_ERROR_0fe00d26~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01683~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01683)~^~ +VALIDATION_ERROR_0fe00d28~^~Y~^~CreatePipelineLayoutExcessDescriptorsOverall~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01684~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01684)~^~ +VALIDATION_ERROR_0fe01790~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03016~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03016)~^~ +VALIDATION_ERROR_0fe01792~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03017~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03017)~^~ +VALIDATION_ERROR_0fe01794~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03018~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03018)~^~ +VALIDATION_ERROR_0fe01796~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03019~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03019)~^~ +VALIDATION_ERROR_0fe01798~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03020~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03020)~^~ +VALIDATION_ERROR_0fe0179a~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03021~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03021)~^~ +VALIDATION_ERROR_0fe0179c~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03022~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindSamplers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03022)~^~ +VALIDATION_ERROR_0fe0179e~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03023~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindUniformBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03023)~^~ +VALIDATION_ERROR_0fe017a0~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03024~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindStorageBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03024)~^~ +VALIDATION_ERROR_0fe017a2~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03025~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindSampledImages' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03025)~^~ +VALIDATION_ERROR_0fe017a4~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03026~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindStorageImages' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03026)~^~ +VALIDATION_ERROR_0fe017a6~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03027~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindInputAttachments' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03027)~^~ +VALIDATION_ERROR_0fe017a8~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03028~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03028)~^~ +VALIDATION_ERROR_0fe017aa~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03029~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stagess and and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03029)~^~ +VALIDATION_ERROR_0fe017ac~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03030~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03030)~^~ +VALIDATION_ERROR_0fe017ae~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03031~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03031)~^~ +VALIDATION_ERROR_0fe017b0~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03032~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03032)~^~ +VALIDATION_ERROR_0fe017b2~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03033~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03033)~^~ +VALIDATION_ERROR_0fe017b4~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03034~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03034)~^~ +VALIDATION_ERROR_0fe017b6~^~N~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-descriptorType-03035~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03035)~^~ +VALIDATION_ERROR_0fe017b8~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03036~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindSamplers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03036)~^~ +VALIDATION_ERROR_0fe017ba~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03037~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stagess and and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindUniformBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03037)~^~ +VALIDATION_ERROR_0fe017bc~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03038~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindUniformBuffersDynamic' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03038)~^~ +VALIDATION_ERROR_0fe017be~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03039~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindStorageBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03039)~^~ +VALIDATION_ERROR_0fe017c0~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03040~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindStorageBuffersDynamic' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03040)~^~ +VALIDATION_ERROR_0fe017c2~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03041~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindSampledImages' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03041)~^~ +VALIDATION_ERROR_0fe017c4~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03042~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindStorageImages' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03042)~^~ +VALIDATION_ERROR_0fe017c6~^~Y~^~None~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03043~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindInputAttachments' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03043)~^~ VALIDATION_ERROR_0fe09005~^~Y~^~Unknown~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-flags-zerobitmask~^~core~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-flags-zerobitmask)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0fe1c40d~^~Y~^~Unknown~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pNext-pNext)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_0fe1f801~^~Y~^~Unknown~^~VkPipelineLayoutCreateInfo~^~VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-parameter)~^~implicit @@ -1195,7 +1223,6 @@ VALIDATION_ERROR_10c30a1b~^~Y~^~PSOViewportStateMultiViewportTests~^~VkPipelineViewportStateCreateInfo~^~VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength~^~core~^~The spec valid usage text states 'viewportCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength)~^~implicit VALIDATION_ERROR_10e0097e~^~N~^~Unknown~^~VkPipelineViewportSwizzleStateCreateInfoNV~^~VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-01215~^~(VK_NV_viewport_swizzle)~^~The spec valid usage text states 'viewportCount must match the viewportCount set in VkPipelineViewportStateCreateInfo' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-01215)~^~ VALIDATION_ERROR_10e09005~^~N~^~Unknown~^~VkPipelineViewportSwizzleStateCreateInfoNV~^~VUID-VkPipelineViewportSwizzleStateCreateInfoNV-flags-zerobitmask~^~(VK_NV_viewport_swizzle)~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-flags-zerobitmask)~^~implicit, TBD in parameter validation layer. -VALIDATION_ERROR_10e1c40d~^~N~^~Unknown~^~VkPipelineViewportSwizzleStateCreateInfoNV~^~VUID-VkPipelineViewportSwizzleStateCreateInfoNV-pNext-pNext~^~(VK_NV_viewport_swizzle)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-pNext-pNext)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_10e2b00b~^~N~^~Unknown~^~VkPipelineViewportSwizzleStateCreateInfoNV~^~VUID-VkPipelineViewportSwizzleStateCreateInfoNV-sType-sType~^~(VK_NV_viewport_swizzle)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-sType-sType)~^~implicit VALIDATION_ERROR_10e30a1b~^~N~^~Unknown~^~VkPipelineViewportSwizzleStateCreateInfoNV~^~VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-arraylength~^~(VK_NV_viewport_swizzle)~^~The spec valid usage text states 'viewportCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-arraylength)~^~implicit VALIDATION_ERROR_1102b00b~^~N~^~Unknown~^~VkPipelineViewportWScalingStateCreateInfoNV~^~VUID-VkPipelineViewportWScalingStateCreateInfoNV-sType-sType~^~(VK_NV_clip_space_w_scaling)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportWScalingStateCreateInfoNV-sType-sType)~^~implicit @@ -1233,8 +1260,8 @@ VALIDATION_ERROR_11c1c40d~^~Y~^~Unknown~^~VkQueryPoolCreateInfo~^~VUID-VkQueryPoolCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkQueryPoolCreateInfo-pNext-pNext)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_11c29a01~^~Y~^~Unknown~^~VkQueryPoolCreateInfo~^~VUID-VkQueryPoolCreateInfo-queryType-parameter~^~core~^~The spec valid usage text states 'queryType must be a valid VkQueryType value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkQueryPoolCreateInfo-queryType-parameter)~^~implicit VALIDATION_ERROR_11c2b00b~^~Y~^~Unknown~^~VkQueryPoolCreateInfo~^~VUID-VkQueryPoolCreateInfo-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkQueryPoolCreateInfo-sType-sType)~^~implicit, TBD in parameter validation layer. -VALIDATION_ERROR_11e009da~^~N~^~Unknown~^~VkRectLayerKHR~^~VUID-VkRectLayerKHR-offset-01261~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_incremental_present)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRectLayerKHR-offset-01261)~^~ -VALIDATION_ERROR_11e009dc~^~N~^~Unknown~^~VkRectLayerKHR~^~VUID-VkRectLayerKHR-layer-01262~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_incremental_present)~^~The spec valid usage text states 'layer must be less than imageArrayLayers member of the VkSwapchainCreateInfoKHR structure given to vkCreateSwapchainKHR.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRectLayerKHR-layer-01262)~^~ +VALIDATION_ERROR_11e009da~^~Y~^~None~^~VkRectLayerKHR~^~VUID-VkRectLayerKHR-offset-01261~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_incremental_present)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRectLayerKHR-offset-01261)~^~ +VALIDATION_ERROR_11e009dc~^~Y~^~None~^~VkRectLayerKHR~^~VUID-VkRectLayerKHR-layer-01262~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_incremental_present)~^~The spec valid usage text states 'layer must be less than imageArrayLayers member of the VkSwapchainCreateInfoKHR structure given to vkCreateSwapchainKHR.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRectLayerKHR-layer-01262)~^~ VALIDATION_ERROR_12000009~^~Y~^~Unknown~^~VkRenderPassBeginInfo~^~VUID-VkRenderPassBeginInfo-commonparent~^~core~^~The spec valid usage text states 'Both of framebuffer, and renderPass must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassBeginInfo-commonparent)~^~implicit VALIDATION_ERROR_1200070c~^~Y~^~RenderPassClearOpMismatch~^~VkRenderPassBeginInfo~^~VUID-VkRenderPassBeginInfo-clearValueCount-00902~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkRenderPassBeginInfo-clearValueCount-00902)~^~ VALIDATION_ERROR_1200070e~^~N~^~Unknown~^~VkRenderPassBeginInfo~^~VUID-VkRenderPassBeginInfo-clearValueCount-00903~^~core~^~The spec valid usage text states 'If clearValueCount is not 0, pClearValues must be a valid pointer to an array of clearValueCount valid VkClearValue unions' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassBeginInfo-clearValueCount-00903)~^~ @@ -1251,8 +1278,13 @@ VALIDATION_ERROR_12200688~^~Y~^~Unknown~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pAttachments-00836~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-00836)~^~ VALIDATION_ERROR_1220068a~^~N~^~Unknown~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pDependencies-00837~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-pDependencies-00837)~^~ VALIDATION_ERROR_1220068c~^~N~^~Unknown~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pDependencies-00838~^~core~^~The spec valid usage text states '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 source subpass.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-pDependencies-00838)~^~ -VALIDATION_ERROR_12200c3c~^~N~^~None~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pAttachments-01566~^~(VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-01566)~^~ -VALIDATION_ERROR_12200c3e~^~N~^~None~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pAttachments-01567~^~(VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-01567)~^~ +VALIDATION_ERROR_12200c3c~^~N~^~None~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pAttachments-01566~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-01566)~^~ +VALIDATION_ERROR_12200c3e~^~N~^~None~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pAttachments-01567~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-01567)~^~ +VALIDATION_ERROR_12200f0c~^~N~^~None~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pNext-01926~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'If the pNext chain includes an instance of VkRenderPassInputAttachmentAspectCreateInfo, the subpass member of each element of its pAspectReferences member must be less than subpassCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01926)~^~ +VALIDATION_ERROR_12200f0e~^~N~^~None~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pNext-01927~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'If the pNext chain includes an instance of VkRenderPassInputAttachmentAspectCreateInfo, 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.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01927)~^~ +VALIDATION_ERROR_12200f10~^~N~^~None~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pNext-01928~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'If the pNext chain includes an instance of VkRenderPassMultiviewCreateInfo, 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.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01928)~^~ +VALIDATION_ERROR_12200f12~^~N~^~None~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pNext-01929~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'If the pNext chain includes an instance of VkRenderPassMultiviewCreateInfo, if its dependencyCount member is not zero, it must be equal to dependencyCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01929)~^~ +VALIDATION_ERROR_12200f14~^~N~^~None~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pNext-01930~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'If the pNext chain includes an instance of VkRenderPassMultiviewCreateInfo, 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.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01930)~^~ VALIDATION_ERROR_12209005~^~Y~^~Unknown~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-flags-zerobitmask~^~core~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-flags-zerobitmask)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_1220f201~^~Y~^~Unknown~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pAttachments-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-parameter)~^~implicit VALIDATION_ERROR_12212601~^~Y~^~Unknown~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-pDependencies-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-pDependencies-parameter)~^~implicit @@ -1261,15 +1293,11 @@ VALIDATION_ERROR_1222b00b~^~Y~^~Unknown~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-sType-sType)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_1222b00f~^~N~^~None~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-sType-unique~^~core~^~The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-sType-unique)~^~implicit VALIDATION_ERROR_1222e61b~^~Y~^~Unknown~^~VkRenderPassCreateInfo~^~VUID-VkRenderPassCreateInfo-subpassCount-arraylength~^~core~^~The spec valid usage text states 'subpassCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-subpassCount-arraylength)~^~implicit -VALIDATION_ERROR_1240068e~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-subpassCount-00839~^~(VK_KHR_multiview)~^~The spec valid usage text states 'If subpassCount is not zero, subpassCount must be equal to the subpassCount in the VkRenderPassCreateInfo structure at the start of the chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-subpassCount-00839)~^~ -VALIDATION_ERROR_12400690~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-dependencyCount-00840~^~(VK_KHR_multiview)~^~The spec valid usage text states 'If dependencyCount is not zero, dependencyCount must be equal to the dependencyCount in the VkRenderPassCreateInfo structure at the start of the chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-dependencyCount-00840)~^~ -VALIDATION_ERROR_12400692~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-00841~^~(VK_KHR_multiview)~^~The spec valid usage text states 'Each view index must not be set in more than one element of pCorrelationMasks' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-00841)~^~ -VALIDATION_ERROR_12400694~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-00842~^~(VK_KHR_multiview)~^~The spec valid usage text states 'If an element of pViewOffsets is non-zero, the corresponding VkSubpassDependency structure must have different values of srcSubpass and dstSubpass.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-00842)~^~ -VALIDATION_ERROR_12411a01~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-parameter~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-parameter)~^~implicit -VALIDATION_ERROR_1241c40d~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-pNext-pNext~^~(VK_KHR_multiview)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_12426c01~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-parameter~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-parameter)~^~implicit -VALIDATION_ERROR_12426e01~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-parameter~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-parameter)~^~implicit -VALIDATION_ERROR_1242b00b~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-sType-sType~^~(VK_KHR_multiview)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-sType-sType)~^~implicit +VALIDATION_ERROR_12400692~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-00841~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'Each view index must not be set in more than one element of pCorrelationMasks' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-00841)~^~ +VALIDATION_ERROR_12411a01~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-parameter~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-parameter)~^~implicit +VALIDATION_ERROR_12426c01~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-parameter~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-parameter)~^~implicit +VALIDATION_ERROR_12426e01~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-parameter~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-parameter)~^~implicit +VALIDATION_ERROR_1242b00b~^~N~^~Unknown~^~VkRenderPassMultiviewCreateInfo~^~VUID-VkRenderPassMultiviewCreateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-sType-sType)~^~implicit VALIDATION_ERROR_12600201~^~Y~^~Unknown~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-addressModeU-parameter~^~core~^~The spec valid usage text states 'addressModeU must be a valid VkSamplerAddressMode value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSamplerCreateInfo-addressModeU-parameter)~^~implicit VALIDATION_ERROR_12600401~^~Y~^~Unknown~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-addressModeV-parameter~^~core~^~The spec valid usage text states 'addressModeV must be a valid VkSamplerAddressMode value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSamplerCreateInfo-addressModeV-parameter)~^~implicit VALIDATION_ERROR_12600601~^~Y~^~Unknown~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-addressModeW-parameter~^~core~^~The spec valid usage text states 'addressModeW must be a valid VkSamplerAddressMode value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSamplerCreateInfo-addressModeW-parameter)~^~implicit @@ -1288,9 +1316,9 @@ VALIDATION_ERROR_12600872~^~Y~^~AnisotropyFeatureEnabled~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-magFilter-01081~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'If either magFilter or minFilter is VK_FILTER_CUBIC_IMG, anisotropyEnable must be VK_FALSE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-magFilter-01081)~^~ VALIDATION_ERROR_12600b1c~^~N~^~None~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-magFilter-01422~^~(VK_IMG_filter_cubic+VK_EXT_sampler_filter_minmax)~^~The spec valid usage text states 'If either magFilter or minFilter is VK_FILTER_CUBIC_IMG, the reductionMode member of VkSamplerReductionModeCreateInfoEXT must be VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-magFilter-01422)~^~ VALIDATION_ERROR_12600b1e~^~N~^~None~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-compareEnable-01423~^~(VK_EXT_sampler_filter_minmax)~^~The spec valid usage text states 'If compareEnable is VK_TRUE, the reductionMode member of VkSamplerReductionModeCreateInfoEXT must be VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-compareEnable-01423)~^~ -VALIDATION_ERROR_12600cda~^~N~^~None~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-minFilter-01645~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If sampler Y'CBCR 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 Y'CBCR conversion's chromaFilter' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-minFilter-01645)~^~ -VALIDATION_ERROR_12600cdc~^~N~^~None~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-addressModeU-01646~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If sampler Y'CBCR 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.0-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-addressModeU-01646)~^~ -VALIDATION_ERROR_12600cde~^~N~^~None~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-None-01647~^~(VK_KHR_sampler_ycbcr_conversion)+(VK_EXT_sampler_filter_minmax)~^~The spec valid usage text states 'The sampler reduction mode must be set to VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT if sampler Y'CBCR conversion is enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-None-01647)~^~ +VALIDATION_ERROR_12600cda~^~N~^~None~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-minFilter-01645~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If sampler Y'CBCR 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 Y'CBCR conversion's chromaFilter' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-minFilter-01645)~^~ +VALIDATION_ERROR_12600cdc~^~N~^~None~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-addressModeU-01646~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If sampler Y'CBCR 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.0-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-addressModeU-01646)~^~ +VALIDATION_ERROR_12600cde~^~N~^~None~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-None-01647~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)+(VK_EXT_sampler_filter_minmax)~^~The spec valid usage text states 'The sampler reduction mode must be set to VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT if sampler Y'CBCR conversion is enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-None-01647)~^~ VALIDATION_ERROR_12609005~^~Y~^~Unknown~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-flags-zerobitmask~^~core~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSamplerCreateInfo-flags-zerobitmask)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_1260c401~^~Y~^~Unknown~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-magFilter-parameter~^~core~^~The spec valid usage text states 'magFilter must be a valid VkFilter value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSamplerCreateInfo-magFilter-parameter)~^~implicit VALIDATION_ERROR_1260ca01~^~Y~^~Unknown~^~VkSamplerCreateInfo~^~VUID-VkSamplerCreateInfo-minFilter-parameter~^~core~^~The spec valid usage text states 'minFilter must be a valid VkFilter value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSamplerCreateInfo-minFilter-parameter)~^~implicit @@ -1384,9 +1412,9 @@ VALIDATION_ERROR_13e006c6~^~N~^~Unknown~^~VkSubpassDependency~^~VUID-VkSubpassDependency-srcSubpass-00867~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkSubpassDependency-srcSubpass-00867)~^~ VALIDATION_ERROR_13e006c8~^~N~^~Unknown~^~VkSubpassDependency~^~VUID-VkSubpassDependency-srcAccessMask-00868~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkSubpassDependency-srcAccessMask-00868)~^~ VALIDATION_ERROR_13e006ca~^~N~^~Unknown~^~VkSubpassDependency~^~VUID-VkSubpassDependency-dstAccessMask-00869~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkSubpassDependency-dstAccessMask-00869)~^~ -VALIDATION_ERROR_13e006cc~^~N~^~Unknown~^~VkSubpassDependency~^~VUID-VkSubpassDependency-dependencyFlags-00870~^~(VK_KHR_multiview)~^~The spec valid usage text states 'If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, then both srcSubpass and dstSubpass must not equal VK_SUBPASS_EXTERNAL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSubpassDependency-dependencyFlags-00870)~^~ -VALIDATION_ERROR_13e006ce~^~N~^~Unknown~^~VkSubpassDependency~^~VUID-VkSubpassDependency-dependencyFlags-00871~^~(VK_KHR_multiview)~^~The spec valid usage text states 'If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, then the render pass must have multiview enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSubpassDependency-dependencyFlags-00871)~^~ -VALIDATION_ERROR_13e006d0~^~N~^~Unknown~^~VkSubpassDependency~^~VUID-VkSubpassDependency-srcSubpass-00872~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcSubpass-00872)~^~ +VALIDATION_ERROR_13e006cc~^~N~^~Unknown~^~VkSubpassDependency~^~VUID-VkSubpassDependency-dependencyFlags-00870~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, then both srcSubpass and dstSubpass must not equal VK_SUBPASS_EXTERNAL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSubpassDependency-dependencyFlags-00870)~^~ +VALIDATION_ERROR_13e006ce~^~N~^~Unknown~^~VkSubpassDependency~^~VUID-VkSubpassDependency-dependencyFlags-00871~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, then the render pass must have multiview enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSubpassDependency-dependencyFlags-00871)~^~ +VALIDATION_ERROR_13e006d0~^~N~^~Unknown~^~VkSubpassDependency~^~VUID-VkSubpassDependency-srcSubpass-00872~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcSubpass-00872)~^~ VALIDATION_ERROR_13e03e01~^~Y~^~Unknown~^~VkSubpassDependency~^~VUID-VkSubpassDependency-dependencyFlags-parameter~^~core~^~The spec valid usage text states 'dependencyFlags must be a valid combination of VkDependencyFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSubpassDependency-dependencyFlags-parameter)~^~implicit VALIDATION_ERROR_13e06801~^~Y~^~Unknown~^~VkSubpassDependency~^~VUID-VkSubpassDependency-dstAccessMask-parameter~^~core~^~The spec valid usage text states 'dstAccessMask must be a valid combination of VkAccessFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSubpassDependency-dstAccessMask-parameter)~^~implicit VALIDATION_ERROR_13e07801~^~N~^~Unknown~^~VkSubpassDependency~^~VUID-VkSubpassDependency-dstStageMask-parameter~^~core~^~The spec valid usage text states 'dstStageMask must be a valid combination of VkPipelineStageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSubpassDependency-dstStageMask-parameter)~^~implicit @@ -1420,7 +1448,6 @@ VALIDATION_ERROR_1421c40d~^~N~^~None~^~VkSurfaceCapabilities2EXT~^~VUID-VkSurfaceCapabilities2EXT-pNext-pNext~^~(VK_KHR_surface)+(VK_EXT_display_surface_counter)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSurfaceCapabilities2EXT-pNext-pNext)~^~implicit VALIDATION_ERROR_1422b00b~^~Y~^~None~^~VkSurfaceCapabilities2EXT~^~VUID-VkSurfaceCapabilities2EXT-sType-sType~^~(VK_KHR_surface)+(VK_EXT_display_surface_counter)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSurfaceCapabilities2EXT-sType-sType)~^~implicit VALIDATION_ERROR_144009b8~^~N~^~Unknown~^~VkSwapchainCounterCreateInfoEXT~^~VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-01244~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_EXT_display_control)~^~The spec valid usage text states 'The bits in surfaceCounters must be supported by VkSwapchainCreateInfoKHR::surface, as reported by vkGetPhysicalDeviceSurfaceCapabilities2EXT.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-01244)~^~ -VALIDATION_ERROR_1441c40d~^~N~^~Unknown~^~VkSwapchainCounterCreateInfoEXT~^~VUID-VkSwapchainCounterCreateInfoEXT-pNext-pNext~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_EXT_display_control)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCounterCreateInfoEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_1442b00b~^~N~^~Unknown~^~VkSwapchainCounterCreateInfoEXT~^~VUID-VkSwapchainCounterCreateInfoEXT-sType-sType~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_EXT_display_control)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCounterCreateInfoEXT-sType-sType)~^~implicit VALIDATION_ERROR_1442ee01~^~N~^~Unknown~^~VkSwapchainCounterCreateInfoEXT~^~VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_EXT_display_control)~^~The spec valid usage text states 'surfaceCounters must be a valid combination of VkSurfaceCounterFlagBitsEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-parameter)~^~implicit VALIDATION_ERROR_14600009~^~Y~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-commonparent~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'Both of oldSwapchain, and surface that are valid handles must have been created, allocated, or retrieved from the same VkInstance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-commonparent)~^~implicit @@ -1438,13 +1465,13 @@ VALIDATION_ERROR_14600a02~^~Y~^~Unknown~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-presentMode-01281~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'presentMode must be one of the VkPresentModeKHR values returned by vkGetPhysicalDeviceSurfacePresentModesKHR for the surface' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-presentMode-01281)~^~ VALIDATION_ERROR_14600ace~^~Y~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-minImageCount-01383~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_shared_presentable_image)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-minImageCount-01383)~^~ VALIDATION_ERROR_14600ad0~^~N~^~Unknown~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-imageUsage-01384~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_shared_presentable_image)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageUsage-01384)~^~ -VALIDATION_ERROR_14600ae2~^~N~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01393~^~(VK_KHR_surface)+(VK_KHR_swapchain)+!(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01393)~^~ +VALIDATION_ERROR_14600ae2~^~N~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01393~^~(VK_KHR_surface)+(VK_KHR_swapchain)+!(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01393)~^~ VALIDATION_ERROR_14600b26~^~N~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-presentMode-01427~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_shared_presentable_image)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-presentMode-01427)~^~ -VALIDATION_ERROR_14600b28~^~N~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428)~^~ -VALIDATION_ERROR_14600b2a~^~N~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-physicalDeviceCount-01429~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-physicalDeviceCount-01429)~^~ -VALIDATION_ERROR_14600d14~^~N~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01674~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'oldSwapchain must not be in the retired state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01674)~^~ -VALIDATION_ERROR_14600d32~^~N~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-imageExtent-01689~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'imageExtent members width and height must both be non-zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageExtent-01689)~^~ +VALIDATION_ERROR_14600b28~^~N~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428)~^~ +VALIDATION_ERROR_14600b2a~^~N~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-physicalDeviceCount-01429~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-physicalDeviceCount-01429)~^~ +VALIDATION_ERROR_14600d32~^~Y~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-imageExtent-01689~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'imageExtent members width and height must both be non-zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageExtent-01689)~^~ VALIDATION_ERROR_14600de4~^~N~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-imageFormat-01778~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'imageFormat, imageUsage, imageExtent, and imageArrayLayers must be supported for VK_IMAGE_TYPE_2D VK_IMAGE_TILING_OPTIMAL images as reported by vkGetPhysicalDeviceImageFormatProperties.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageFormat-01778)~^~ +VALIDATION_ERROR_14600f1a~^~N~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01933~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01933)~^~ VALIDATION_ERROR_14602e01~^~Y~^~Unknown~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-compositeAlpha-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'compositeAlpha must be a valid VkCompositeAlphaFlagBitsKHR value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-compositeAlpha-parameter)~^~implicit VALIDATION_ERROR_14609001~^~Y~^~Unknown~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-flags-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'flags must be a valid combination of VkSwapchainCreateFlagBitsKHR values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-flags-parameter)~^~implicit VALIDATION_ERROR_1460a201~^~Y~^~Unknown~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-imageColorSpace-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'imageColorSpace must be a valid VkColorSpaceKHR value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageColorSpace-parameter)~^~implicit @@ -1462,7 +1489,6 @@ VALIDATION_ERROR_1462ec01~^~Y~^~None~^~VkSwapchainCreateInfoKHR~^~VUID-VkSwapchainCreateInfoKHR-surface-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'surface must be a valid VkSurfaceKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-surface-parameter)~^~implicit, This error applies to both vkCreateSwapchainKHR and vkCreateSharedSwapchainsKHR. VALIDATION_ERROR_14805a1b~^~N~^~Unknown~^~VkValidationFlagsEXT~^~VUID-VkValidationFlagsEXT-disabledValidationCheckCount-arraylength~^~(VK_EXT_validation_flags)~^~The spec valid usage text states 'disabledValidationCheckCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkValidationFlagsEXT-disabledValidationCheckCount-arraylength)~^~implicit VALIDATION_ERROR_14814401~^~N~^~Unknown~^~VkValidationFlagsEXT~^~VUID-VkValidationFlagsEXT-pDisabledValidationChecks-parameter~^~(VK_EXT_validation_flags)~^~The spec valid usage text states 'pDisabledValidationChecks must be a valid pointer to an array of disabledValidationCheckCount VkValidationCheckEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkValidationFlagsEXT-pDisabledValidationChecks-parameter)~^~implicit -VALIDATION_ERROR_1481c40d~^~N~^~Unknown~^~VkValidationFlagsEXT~^~VUID-VkValidationFlagsEXT-pNext-pNext~^~(VK_EXT_validation_flags)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkValidationFlagsEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_1482b00b~^~N~^~Unknown~^~VkValidationFlagsEXT~^~VUID-VkValidationFlagsEXT-sType-sType~^~(VK_EXT_validation_flags)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkValidationFlagsEXT-sType-sType)~^~implicit VALIDATION_ERROR_14a004d8~^~Y~^~VALIDATION_ERROR_14a004d8~^~VkVertexInputAttributeDescription~^~VUID-VkVertexInputAttributeDescription-location-00620~^~core~^~The spec valid usage text states 'location must be less than VkPhysicalDeviceLimits::maxVertexInputAttributes' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkVertexInputAttributeDescription-location-00620)~^~ VALIDATION_ERROR_14a004da~^~Y~^~VALIDATION_ERROR_14a004da~^~VkVertexInputAttributeDescription~^~VUID-VkVertexInputAttributeDescription-binding-00621~^~core~^~The spec valid usage text states 'binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkVertexInputAttributeDescription-binding-00621)~^~ @@ -1482,12 +1508,12 @@ VALIDATION_ERROR_150009a6~^~Y~^~SetDynViewportParamTests~^~VkViewport~^~VUID-VkViewport-maxDepth-01235~^~(VK_EXT_depth_range_unrestricted)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkViewport-maxDepth-01235)~^~ VALIDATION_ERROR_15000dd4~^~Y~^~SetDynViewportParamTests~^~VkViewport~^~VUID-VkViewport-width-01770~^~core~^~The spec valid usage text states 'width must be greater than 0.0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkViewport-width-01770)~^~ VALIDATION_ERROR_15000dd6~^~Y~^~SetDynViewportParamTests~^~VkViewport~^~VUID-VkViewport-width-01771~^~core~^~The spec valid usage text states 'width must be less than or equal to VkPhysicalDeviceLimits::maxViewportDimensions[0]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkViewport-width-01771)~^~ -VALIDATION_ERROR_15000dd8~^~Y~^~SetDynViewportParamTests~^~VkViewport~^~VUID-VkViewport-height-01772~^~!(VK_KHR_maintenance1,VK_AMD_negative_viewport_height)~^~The spec valid usage text states 'height must be greater than 0.0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkViewport-height-01772)~^~ +VALIDATION_ERROR_15000dd8~^~Y~^~SetDynViewportParamTests~^~VkViewport~^~VUID-VkViewport-height-01772~^~!(VK_VERSION_1_1,VK_KHR_maintenance1,VK_AMD_negative_viewport_height)~^~The spec valid usage text states 'height must be greater than 0.0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkViewport-height-01772)~^~ VALIDATION_ERROR_15000dda~^~Y~^~SetDynViewportParamTests,SetDynViewportParamMaintenance1Tests~^~VkViewport~^~VUID-VkViewport-height-01773~^~core~^~The spec valid usage text states 'The absolute value of height must be less than or equal to VkPhysicalDeviceLimits::maxViewportDimensions[1]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkViewport-height-01773)~^~ VALIDATION_ERROR_15000ddc~^~Y~^~SetDynViewportParamTests~^~VkViewport~^~VUID-VkViewport-x-01774~^~core~^~The spec valid usage text states 'x must be greater than or equal to viewportBoundsRange[0]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkViewport-x-01774)~^~ VALIDATION_ERROR_15000dde~^~Y~^~SetDynViewportParamTests,SetDynViewportParamMaintenance1Tests~^~VkViewport~^~VUID-VkViewport-y-01775~^~core~^~The spec valid usage text states 'y must be greater than or equal to viewportBoundsRange[0]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkViewport-y-01775)~^~ -VALIDATION_ERROR_15000de0~^~Y~^~SetDynViewportParamMaintenance1Tests~^~VkViewport~^~VUID-VkViewport-y-01776~^~(VK_KHR_maintenance1,VK_AMD_negative_viewport_height)~^~The spec valid usage text states 'y must be less than or equal to viewportBoundsRange[1]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkViewport-y-01776)~^~ -VALIDATION_ERROR_15000de2~^~Y~^~SetDynViewportParamMaintenance1Tests~^~VkViewport~^~VUID-VkViewport-y-01777~^~(VK_KHR_maintenance1,VK_AMD_negative_viewport_height)~^~The spec valid usage text states '(y + height) must be greater than or equal to viewportBoundsRange[0]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkViewport-y-01777)~^~ +VALIDATION_ERROR_15000de0~^~Y~^~SetDynViewportParamMaintenance1Tests~^~VkViewport~^~VUID-VkViewport-y-01776~^~(VK_VERSION_1_1,VK_KHR_maintenance1,VK_AMD_negative_viewport_height)~^~The spec valid usage text states 'y must be less than or equal to viewportBoundsRange[1]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkViewport-y-01776)~^~ +VALIDATION_ERROR_15000de2~^~Y~^~SetDynViewportParamMaintenance1Tests~^~VkViewport~^~VUID-VkViewport-y-01777~^~(VK_VERSION_1_1,VK_KHR_maintenance1,VK_AMD_negative_viewport_height)~^~The spec valid usage text states '(y + height) must be greater than or equal to viewportBoundsRange[0]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkViewport-y-01777)~^~ VALIDATION_ERROR_15230c01~^~N~^~Unknown~^~VkViewportSwizzleNV~^~VUID-VkViewportSwizzleNV-w-parameter~^~(VK_NV_viewport_swizzle)~^~The spec valid usage text states 'w must be a valid VkViewportCoordinateSwizzleNV value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkViewportSwizzleNV-w-parameter)~^~implicit VALIDATION_ERROR_15231001~^~N~^~Unknown~^~VkViewportSwizzleNV~^~VUID-VkViewportSwizzleNV-x-parameter~^~(VK_NV_viewport_swizzle)~^~The spec valid usage text states 'x must be a valid VkViewportCoordinateSwizzleNV value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkViewportSwizzleNV-x-parameter)~^~implicit VALIDATION_ERROR_15231201~^~N~^~Unknown~^~VkViewportSwizzleNV~^~VUID-VkViewportSwizzleNV-y-parameter~^~(VK_NV_viewport_swizzle)~^~The spec valid usage text states 'y must be a valid VkViewportCoordinateSwizzleNV value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkViewportSwizzleNV-y-parameter)~^~implicit @@ -1545,6 +1571,7 @@ VALIDATION_ERROR_15c002a6~^~N~^~Unknown~^~VkWriteDescriptorSet~^~VUID-VkWriteDescriptorSet-descriptorType-00339~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00339)~^~ VALIDATION_ERROR_15c00af4~^~N~^~None~^~VkWriteDescriptorSet~^~VUID-VkWriteDescriptorSet-descriptorType-01402~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-01402)~^~ VALIDATION_ERROR_15c00af6~^~N~^~None~^~VkWriteDescriptorSet~^~VUID-VkWriteDescriptorSet-descriptorType-01403~^~core~^~The spec valid usage text states '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 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-01403)~^~ +VALIDATION_ERROR_15c017d0~^~N~^~None~^~VkWriteDescriptorSet~^~VUID-VkWriteDescriptorSet-descriptorCount-03048~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'All consecutive bindings updated via a single VkWriteDescriptorSet structure, except those with a descriptorCount of zero, must have identical VkDescriptorBindingFlagBitsEXT.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorCount-03048)~^~ VALIDATION_ERROR_15c0441b~^~Y~^~Unknown~^~VkWriteDescriptorSet~^~VUID-VkWriteDescriptorSet-descriptorCount-arraylength~^~core~^~The spec valid usage text states 'descriptorCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorCount-arraylength)~^~implicit VALIDATION_ERROR_15c04e01~^~Y~^~Unknown~^~VkWriteDescriptorSet~^~VUID-VkWriteDescriptorSet-descriptorType-parameter~^~core~^~The spec valid usage text states 'descriptorType must be a valid VkDescriptorType value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-parameter)~^~implicit VALIDATION_ERROR_15c1c40d~^~Y~^~Unknown~^~VkWriteDescriptorSet~^~VUID-VkWriteDescriptorSet-pNext-pNext~^~core~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkWriteDescriptorSet-pNext-pNext)~^~implicit, TBD in parameter validation layer. @@ -1559,10 +1586,10 @@ VALIDATION_ERROR_16009005~^~Y~^~Unknown~^~VkXlibSurfaceCreateInfoKHR~^~VUID-VkXlibSurfaceCreateInfoKHR-flags-zerobitmask~^~(VK_KHR_surface)+(VK_KHR_xlib_surface)~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkXlibSurfaceCreateInfoKHR-flags-zerobitmask)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_1601c40d~^~Y~^~Unknown~^~VkXlibSurfaceCreateInfoKHR~^~VUID-VkXlibSurfaceCreateInfoKHR-pNext-pNext~^~(VK_KHR_surface)+(VK_KHR_xlib_surface)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkXlibSurfaceCreateInfoKHR-pNext-pNext)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_1602b00b~^~Y~^~Unknown~^~VkXlibSurfaceCreateInfoKHR~^~VUID-VkXlibSurfaceCreateInfoKHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_xlib_surface)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkXlibSurfaceCreateInfoKHR-sType-sType)~^~implicit, TBD in parameter validation layer. -VALIDATION_ERROR_16200e16~^~N~^~None~^~vkAcquireNextImage2KHR~^~VUID-vkAcquireNextImage2KHX-swapchain-01803~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHX-swapchain-01803)~^~ -VALIDATION_ERROR_16205601~^~Y~^~Unknown~^~vkAcquireNextImage2KHR~^~VUID-vkAcquireNextImage2KHR-device-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-device-parameter)~^~implicit -VALIDATION_ERROR_1620e001~^~N~^~Unknown~^~vkAcquireNextImage2KHR~^~VUID-vkAcquireNextImage2KHR-pAcquireInfo-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'pAcquireInfo must be a valid pointer to a valid VkAcquireNextImageInfoKHR structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-pAcquireInfo-parameter)~^~implicit -VALIDATION_ERROR_16218601~^~Y~^~Unknown~^~vkAcquireNextImage2KHR~^~VUID-vkAcquireNextImage2KHR-pImageIndex-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'pImageIndex must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-pImageIndex-parameter)~^~implicit +VALIDATION_ERROR_16200e16~^~N~^~None~^~vkAcquireNextImage2KHR~^~VUID-vkAcquireNextImage2KHR-swapchain-01803~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-swapchain-01803)~^~ +VALIDATION_ERROR_16205601~^~Y~^~Unknown~^~vkAcquireNextImage2KHR~^~VUID-vkAcquireNextImage2KHR-device-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-device-parameter)~^~implicit +VALIDATION_ERROR_1620e001~^~N~^~Unknown~^~vkAcquireNextImage2KHR~^~VUID-vkAcquireNextImage2KHR-pAcquireInfo-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'pAcquireInfo must be a valid pointer to a valid VkAcquireNextImageInfoKHR structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-pAcquireInfo-parameter)~^~implicit +VALIDATION_ERROR_16218601~^~Y~^~Unknown~^~vkAcquireNextImage2KHR~^~VUID-vkAcquireNextImage2KHR-pImageIndex-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'pImageIndex must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-pImageIndex-parameter)~^~implicit VALIDATION_ERROR_16400009~^~Y~^~None~^~vkAcquireNextImageKHR~^~VUID-vkAcquireNextImageKHR-commonparent~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'Both of device, and swapchain that are valid handles must have been created, allocated, or retrieved from the same VkInstance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-commonparent)~^~implicit VALIDATION_ERROR_16400a0a~^~N~^~Unknown~^~vkAcquireNextImageKHR~^~VUID-vkAcquireNextImageKHR-swapchain-01285~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'swapchain must not be in the retired state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-swapchain-01285)~^~ VALIDATION_ERROR_16400a0c~^~Y~^~Unknown~^~vkAcquireNextImageKHR~^~VUID-vkAcquireNextImageKHR-semaphore-01286~^~(VK_KHR_surface)+(VK_KHR_swapchain)~^~The spec valid usage text states 'If semaphore is not VK_NULL_HANDLE it must be unsignaled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-semaphore-01286)~^~ @@ -1608,17 +1635,19 @@ VALIDATION_ERROR_17000818~^~Y~^~BindInvalidMemory~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-memoryOffset-01036~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkBindBufferMemory-memoryOffset-01036)~^~ VALIDATION_ERROR_1700081a~^~Y~^~BindInvalidMemory~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-size-01037~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkBindBufferMemory-size-01037)~^~ VALIDATION_ERROR_1700081c~^~N~^~Unknown~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-buffer-01038~^~(VK_NV_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01038)~^~ -VALIDATION_ERROR_1700081e~^~N~^~Unknown~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-buffer-01039~^~(VK_NV_dedicated_allocation)+!(VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01039)~^~ -VALIDATION_ERROR_17000b48~^~N~^~None~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-buffer-01444~^~(VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'If buffer requires a dedicated allocation(as reported by vkGetBufferMemoryRequirements2 in VkMemoryDedicatedRequirements::requiresDedicatedAllocation for image), memory must have been created with VkMemoryDedicatedAllocateInfo::buffer equal to buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01444)~^~ -VALIDATION_ERROR_17000bc8~^~N~^~None~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-memory-01508~^~(VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'If the VkmemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfoKHR in its pNext chain, and VkMemoryDedicatedAllocateInfoKHR::buffer was not VK_NULL_HANDLE, then buffer must equal VkMemoryDedicatedAllocateInfoKHR::buffer and memoryOffset must be zero.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-memory-01508)~^~ +VALIDATION_ERROR_1700081e~^~N~^~Unknown~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-buffer-01039~^~(VK_NV_dedicated_allocation)+!(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01039)~^~ +VALIDATION_ERROR_17000b48~^~N~^~None~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-buffer-01444~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01444)~^~ +VALIDATION_ERROR_17000bc8~^~Y~^~DedicatedAllocation~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-memory-01508~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'If the VkMemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfo 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.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-memory-01508)~^~ +VALIDATION_ERROR_17000ed4~^~N~^~None~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-None-01898~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-None-01898)~^~ +VALIDATION_ERROR_17000ed6~^~N~^~None~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-None-01899~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-None-01899)~^~ VALIDATION_ERROR_17001a01~^~Y~^~VertexBufferInvalid~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-buffer-parameter~^~core~^~The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindBufferMemory-buffer-parameter)~^~implicit VALIDATION_ERROR_17001a07~^~Y~^~Unknown~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-buffer-parent~^~core~^~The spec valid usage text states 'buffer must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindBufferMemory-buffer-parent)~^~implicit VALIDATION_ERROR_17005601~^~Y~^~None~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-device-parameter~^~core~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindBufferMemory-device-parameter)~^~implicit VALIDATION_ERROR_1700c601~^~Y~^~BindInvalidMemory~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-memory-parameter~^~core~^~The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindBufferMemory-memory-parameter)~^~implicit VALIDATION_ERROR_1700c607~^~Y~^~Unknown~^~vkBindBufferMemory~^~VUID-vkBindBufferMemory-memory-parent~^~core~^~The spec valid usage text states 'memory must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindBufferMemory-memory-parent)~^~implicit -VALIDATION_ERROR_1720161b~^~N~^~None~^~vkBindBufferMemory2~^~VUID-vkBindBufferMemory2-bindInfoCount-arraylength~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'bindInfoCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory2-bindInfoCount-arraylength)~^~implicit -VALIDATION_ERROR_17205601~^~Y~^~None~^~vkBindBufferMemory2~^~VUID-vkBindBufferMemory2-device-parameter~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory2-device-parameter)~^~implicit -VALIDATION_ERROR_1720fa01~^~Y~^~None~^~vkBindBufferMemory2~^~VUID-vkBindBufferMemory2-pBindInfos-parameter~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindBufferMemoryInfo structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory2-pBindInfos-parameter)~^~implicit +VALIDATION_ERROR_1720161b~^~N~^~None~^~vkBindBufferMemory2~^~VUID-vkBindBufferMemory2-bindInfoCount-arraylength~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'bindInfoCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory2-bindInfoCount-arraylength)~^~implicit +VALIDATION_ERROR_17205601~^~Y~^~None~^~vkBindBufferMemory2~^~VUID-vkBindBufferMemory2-device-parameter~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory2-device-parameter)~^~implicit +VALIDATION_ERROR_1720fa01~^~Y~^~None~^~vkBindBufferMemory2~^~VUID-vkBindBufferMemory2-pBindInfos-parameter~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindBufferMemoryInfo structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory2-pBindInfos-parameter)~^~implicit VALIDATION_ERROR_17400828~^~Y~^~BindInvalidMemory~^~vkBindImageMemory~^~VUID-vkBindImageMemory-image-01044~^~core~^~The spec valid usage text states 'image must not already be backed by a memory object' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-image-01044)~^~ VALIDATION_ERROR_1740082a~^~Y~^~BindInvalidMemory~^~vkBindImageMemory~^~VUID-vkBindImageMemory-image-01045~^~core~^~The spec valid usage text states 'image must not have been created with any sparse memory binding flags' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-image-01045)~^~ VALIDATION_ERROR_1740082c~^~Y~^~BindInvalidMemory~^~vkBindImageMemory~^~VUID-vkBindImageMemory-memoryOffset-01046~^~core~^~The spec valid usage text states 'memoryOffset must be less than the size of memory' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-memoryOffset-01046)~^~ @@ -1626,30 +1655,30 @@ VALIDATION_ERROR_17400830~^~Y~^~BindInvalidMemory~^~vkBindImageMemory~^~VUID-vkBindImageMemory-memoryOffset-01048~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkBindImageMemory-memoryOffset-01048)~^~ VALIDATION_ERROR_17400832~^~Y~^~BindInvalidMemory~^~vkBindImageMemory~^~VUID-vkBindImageMemory-size-01049~^~core~^~The spec valid usage text states 'The size member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image must be less than or equal to the size of memory minus memoryOffset' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-size-01049)~^~ VALIDATION_ERROR_17400834~^~N~^~Unknown~^~vkBindImageMemory~^~VUID-vkBindImageMemory-image-01050~^~(VK_NV_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01050)~^~ -VALIDATION_ERROR_17400836~^~N~^~Unknown~^~vkBindImageMemory~^~VUID-vkBindImageMemory-image-01051~^~(VK_NV_dedicated_allocation)+!(VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-image-01051)~^~ -VALIDATION_ERROR_17400b4a~^~N~^~None~^~vkBindImageMemory~^~VUID-vkBindImageMemory-image-01445~^~(VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01445)~^~ -VALIDATION_ERROR_17400bca~^~N~^~None~^~vkBindImageMemory~^~VUID-vkBindImageMemory-memory-01509~^~(VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'If the VkmemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfoKHR in its pNext chain, and VkMemoryDedicatedAllocateInfoKHR::image was not VK_NULL_HANDLE, then image must equal VkMemoryDedicatedAllocateInfoKHR::image and memoryOffset must be zero.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-memory-01509)~^~ -VALIDATION_ERROR_17400c90~^~N~^~None~^~vkBindImageMemory~^~VUID-vkBindImageMemory-image-01608~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'image must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT set.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01608)~^~ +VALIDATION_ERROR_17400836~^~N~^~Unknown~^~vkBindImageMemory~^~VUID-vkBindImageMemory-image-01051~^~(VK_NV_dedicated_allocation)+!(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-image-01051)~^~ +VALIDATION_ERROR_17400b4a~^~N~^~None~^~vkBindImageMemory~^~VUID-vkBindImageMemory-image-01445~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01445)~^~ +VALIDATION_ERROR_17400bca~^~Y~^~DedicatedAllocation~^~vkBindImageMemory~^~VUID-vkBindImageMemory-memory-01509~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'If the VkMemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfo 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.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-memory-01509)~^~ +VALIDATION_ERROR_17400c90~^~N~^~None~^~vkBindImageMemory~^~VUID-vkBindImageMemory-image-01608~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'image must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT set.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01608)~^~ +VALIDATION_ERROR_17400eda~^~N~^~None~^~vkBindImageMemory~^~VUID-vkBindImageMemory-None-01901~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-None-01901)~^~ +VALIDATION_ERROR_17400edc~^~N~^~None~^~vkBindImageMemory~^~VUID-vkBindImageMemory-None-01902~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-None-01902)~^~ VALIDATION_ERROR_17405601~^~Y~^~None~^~vkBindImageMemory~^~VUID-vkBindImageMemory-device-parameter~^~core~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-device-parameter)~^~implicit VALIDATION_ERROR_1740a001~^~Y~^~BindMemoryToDestroyedObject~^~vkBindImageMemory~^~VUID-vkBindImageMemory-image-parameter~^~core~^~The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-image-parameter)~^~implicit VALIDATION_ERROR_1740a007~^~Y~^~Unknown~^~vkBindImageMemory~^~VUID-vkBindImageMemory-image-parent~^~core~^~The spec valid usage text states 'image must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-image-parent)~^~implicit VALIDATION_ERROR_1740c601~^~Y~^~BindInvalidMemory~^~vkBindImageMemory~^~VUID-vkBindImageMemory-memory-parameter~^~core~^~The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-memory-parameter)~^~implicit VALIDATION_ERROR_1740c607~^~Y~^~Unknown~^~vkBindImageMemory~^~VUID-vkBindImageMemory-memory-parent~^~core~^~The spec valid usage text states 'memory must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-memory-parent)~^~implicit -VALIDATION_ERROR_1760161b~^~N~^~None~^~vkBindImageMemory2~^~VUID-vkBindImageMemory2-bindInfoCount-arraylength~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'bindInfoCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory2-bindInfoCount-arraylength)~^~implicit -VALIDATION_ERROR_17605601~^~Y~^~None~^~vkBindImageMemory2~^~VUID-vkBindImageMemory2-device-parameter~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory2-device-parameter)~^~implicit -VALIDATION_ERROR_1760fa01~^~Y~^~None~^~vkBindImageMemory2~^~VUID-vkBindImageMemory2-pBindInfos-parameter~^~(VK_KHR_bind_memory2)~^~The spec valid usage text states 'pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindImageMemoryInfo structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory2-pBindInfos-parameter)~^~implicit +VALIDATION_ERROR_1760161b~^~N~^~None~^~vkBindImageMemory2~^~VUID-vkBindImageMemory2-bindInfoCount-arraylength~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'bindInfoCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory2-bindInfoCount-arraylength)~^~implicit +VALIDATION_ERROR_17605601~^~Y~^~None~^~vkBindImageMemory2~^~VUID-vkBindImageMemory2-device-parameter~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory2-device-parameter)~^~implicit +VALIDATION_ERROR_1760fa01~^~Y~^~None~^~vkBindImageMemory2~^~VUID-vkBindImageMemory2-pBindInfos-parameter~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)~^~The spec valid usage text states 'pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindImageMemoryInfo structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory2-pBindInfos-parameter)~^~implicit VALIDATION_ERROR_17800009~^~Y~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-commonparent~^~core~^~The spec valid usage text states 'Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-commonparent)~^~implicit -VALIDATION_ERROR_1780063c~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-queryPool-00798~^~core~^~The spec valid usage text states 'The query identified by queryPool and query must currently not be active' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-00798)~^~ -VALIDATION_ERROR_1780063e~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-queryPool-00799~^~core~^~The spec valid usage text states 'The query identified by queryPool and query must be unavailable' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-00799)~^~ VALIDATION_ERROR_17800640~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-queryType-00800~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-00800)~^~ -VALIDATION_ERROR_17800642~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-queryPool-00801~^~core~^~The spec valid usage text states 'queryPool must have been created with a queryType that differs from that of any other queries that have been made active, and are currently still active within commandBuffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-00801)~^~ VALIDATION_ERROR_17800644~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-query-00802~^~core~^~The spec valid usage text states 'query must be less than the number of queries in queryPool' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-query-00802)~^~ VALIDATION_ERROR_17800646~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-queryType-00803~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-00803)~^~ VALIDATION_ERROR_17800648~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-queryType-00804~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-00804)~^~ VALIDATION_ERROR_1780064a~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-queryType-00805~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-00805)~^~ -VALIDATION_ERROR_1780064c~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-None-00806~^~(VK_KHR_multiview)~^~The spec valid usage text states 'All queries used by the command must not be active' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-None-00806)~^~ -VALIDATION_ERROR_1780064e~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-None-00807~^~(VK_KHR_multiview)~^~The spec valid usage text states 'All queries used by the command must be unavailable' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-None-00807)~^~ -VALIDATION_ERROR_17800650~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-query-00808~^~(VK_KHR_multiview)~^~The spec valid usage text states 'If vkCmdBeginQuery 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.0-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-query-00808)~^~ +VALIDATION_ERROR_1780064e~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-None-00807~^~core~^~The spec valid usage text states 'All queries used by the command must be unavailable' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-None-00807)~^~ +VALIDATION_ERROR_17800650~^~N~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-query-00808~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'If vkCmdBeginQuery 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.0-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-query-00808)~^~ +VALIDATION_ERROR_17800eba~^~N~^~None~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-commandBuffer-01885~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'commandBuffer must not be a protected command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-commandBuffer-01885)~^~ +VALIDATION_ERROR_17800f04~^~N~^~None~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-queryPool-01922~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-01922)~^~ VALIDATION_ERROR_17802401~^~Y~^~None~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_17802413~^~Y~^~None~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-commandBuffer-recording)~^~implicit VALIDATION_ERROR_17802415~^~Y~^~Unknown~^~vkCmdBeginQuery~^~VUID-vkCmdBeginQuery-commandBuffer-cmdpool~^~core~^~The spec valid usage text states '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-vkCmdBeginQuery-commandBuffer-cmdpool)~^~implicit @@ -1658,13 +1687,13 @@ VALIDATION_ERROR_17a00017~^~Y~^~Unknown~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-renderpass~^~core~^~The spec valid usage text states 'This command must only be called outside of a render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-renderpass)~^~implicit VALIDATION_ERROR_17a00019~^~Y~^~Unknown~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-bufferlevel~^~core~^~The spec valid usage text states 'commandBuffer must be a primary VkCommandBuffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-bufferlevel)~^~implicit VALIDATION_ERROR_17a006fe~^~N~^~Unknown~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-initialLayout-00895~^~core~^~The spec valid usage text states '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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00895)~^~ -VALIDATION_ERROR_17a00700~^~N~^~Unknown~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-initialLayout-00896~^~!(VK_KHR_maintenance2)~^~The spec valid usage text states '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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00896)~^~ +VALIDATION_ERROR_17a00700~^~N~^~Unknown~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-initialLayout-00896~^~!(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00896)~^~ VALIDATION_ERROR_17a00702~^~N~^~Unknown~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-initialLayout-00897~^~core~^~The spec valid usage text states '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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin 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.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00897)~^~ VALIDATION_ERROR_17a00704~^~N~^~Unknown~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-initialLayout-00898~^~core~^~The spec valid usage text states '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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00898)~^~ VALIDATION_ERROR_17a00706~^~N~^~Unknown~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-initialLayout-00899~^~core~^~The spec valid usage text states '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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00899)~^~ VALIDATION_ERROR_17a00708~^~N~^~Unknown~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-initialLayout-00900~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00900)~^~ VALIDATION_ERROR_17a0070a~^~N~^~Unknown~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-srcStageMask-00901~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-srcStageMask-00901)~^~ -VALIDATION_ERROR_17a00dbc~^~N~^~None~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-initialLayout-01758~^~(VK_KHR_maintenance2)~^~The spec valid usage text states '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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-01758)~^~ +VALIDATION_ERROR_17a00dbc~^~N~^~None~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-initialLayout-01758~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states '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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-01758)~^~ VALIDATION_ERROR_17a02401~^~Y~^~None~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_17a02413~^~Y~^~None~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-commandBuffer-recording)~^~implicit VALIDATION_ERROR_17a02415~^~Y~^~Unknown~^~vkCmdBeginRenderPass~^~VUID-vkCmdBeginRenderPass-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-commandBuffer-cmdpool)~^~implicit @@ -1745,12 +1774,15 @@ VALIDATION_ERROR_184001da~^~Y~^~BlitImageFilters~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-filter-00237~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'If filter is VK_FILTER_CUBIC_IMG, srcImage must have a VkImageType of VK_IMAGE_TYPE_3D' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-filter-00237)~^~ VALIDATION_ERROR_18400aec~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-srcImageLayout-01398~^~(VK_KHR_shared_presentable_image)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImageLayout-01398)~^~ VALIDATION_ERROR_18400aee~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-dstImageLayout-01399~^~(VK_KHR_shared_presentable_image)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImageLayout-01399)~^~ -VALIDATION_ERROR_18400c32~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-srcImage-01561~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'srcImage must not use a format listed in features-formats-requiring-sampler-ycbcr-conversion' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-01561)~^~ -VALIDATION_ERROR_18400c34~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-dstImage-01562~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'dstImage must not use a format listed in features-formats-requiring-sampler-ycbcr-conversion' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImage-01562)~^~ +VALIDATION_ERROR_18400c32~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-srcImage-01561~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'srcImage must not use a format listed in features-formats-requiring-sampler-ycbcr-conversion' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-01561)~^~ +VALIDATION_ERROR_18400c34~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-dstImage-01562~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'dstImage must not use a format listed in features-formats-requiring-sampler-ycbcr-conversion' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImage-01562)~^~ VALIDATION_ERROR_18400d52~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-srcSubresource-01705~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBlitImage-srcSubresource-01705)~^~ VALIDATION_ERROR_18400d54~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-dstSubresource-01706~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBlitImage-dstSubresource-01706)~^~ VALIDATION_ERROR_18400d56~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-srcSubresource-01707~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBlitImage-srcSubresource-01707)~^~ VALIDATION_ERROR_18400d58~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-dstSubresource-01708~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBlitImage-dstSubresource-01708)~^~ +VALIDATION_ERROR_18400e54~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-commandBuffer-01834~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-01834)~^~ +VALIDATION_ERROR_18400e56~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-commandBuffer-01835~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-01835)~^~ +VALIDATION_ERROR_18400e58~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-commandBuffer-01836~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-01836)~^~ VALIDATION_ERROR_18402401~^~Y~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_18402413~^~Y~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-recording)~^~implicit VALIDATION_ERROR_18402415~^~Y~^~Unknown~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-cmdpool)~^~implicit @@ -1765,7 +1797,7 @@ VALIDATION_ERROR_1860001e~^~Y~^~MissingClearAttachment~^~vkCmdClearAttachments~^~VUID-vkCmdClearAttachments-aspectMask-00015~^~core~^~The spec valid usage text states 'If the aspectMask member of any element of pAttachments contains VK_IMAGE_ASPECT_COLOR_BIT, the colorAttachment member of that element must refer to a valid color attachment in the current subpass' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearAttachments-aspectMask-00015)~^~ VALIDATION_ERROR_18600020~^~Y~^~CmdClearAttachmentTests~^~vkCmdClearAttachments~^~VUID-vkCmdClearAttachments-pRects-00016~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearAttachments-pRects-00016)~^~ VALIDATION_ERROR_18600022~^~Y~^~CmdClearAttachmentTests~^~vkCmdClearAttachments~^~VUID-vkCmdClearAttachments-pRects-00017~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearAttachments-pRects-00017)~^~ -VALIDATION_ERROR_18600024~^~N~^~Unknown~^~vkCmdClearAttachments~^~VUID-vkCmdClearAttachments-baseArrayLayer-00018~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-baseArrayLayer-00018)~^~ +VALIDATION_ERROR_18600024~^~N~^~Unknown~^~vkCmdClearAttachments~^~VUID-vkCmdClearAttachments-baseArrayLayer-00018~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-baseArrayLayer-00018)~^~ VALIDATION_ERROR_18600e1b~^~Y~^~Unknown~^~vkCmdClearAttachments~^~VUID-vkCmdClearAttachments-attachmentCount-arraylength~^~core~^~The spec valid usage text states 'attachmentCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearAttachments-attachmentCount-arraylength)~^~implicit VALIDATION_ERROR_18602401~^~Y~^~None~^~vkCmdClearAttachments~^~VUID-vkCmdClearAttachments-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearAttachments-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_18602413~^~Y~^~None~^~vkCmdClearAttachments~^~VUID-vkCmdClearAttachments-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearAttachments-commandBuffer-recording)~^~implicit @@ -1773,7 +1805,7 @@ VALIDATION_ERROR_1860f201~^~Y~^~Unknown~^~vkCmdClearAttachments~^~VUID-vkCmdClearAttachments-pAttachments-parameter~^~core~^~The spec valid usage text states 'pAttachments must be a valid pointer to an array of attachmentCount valid VkClearAttachment structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearAttachments-pAttachments-parameter)~^~implicit VALIDATION_ERROR_18620e01~^~Y~^~Unknown~^~vkCmdClearAttachments~^~VUID-vkCmdClearAttachments-pRects-parameter~^~core~^~The spec valid usage text states 'pRects must be a valid pointer to an array of rectCount VkClearRect structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearAttachments-pRects-parameter)~^~implicit VALIDATION_ERROR_1862aa1b~^~Y~^~Unknown~^~vkCmdClearAttachments~^~VUID-vkCmdClearAttachments-rectCount-arraylength~^~core~^~The spec valid usage text states 'rectCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearAttachments-rectCount-arraylength)~^~implicit -VALIDATION_ERROR_18800002~^~N~^~Unknown~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-image-00001~^~(VK_KHR_maintenance1)~^~The spec valid usage text states 'image must use a format that supports VK_FORMAT_FEATURE_TRANSFER_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-image-00001)~^~ +VALIDATION_ERROR_18800002~^~N~^~Unknown~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-image-00001~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'image must use a format that supports VK_FORMAT_FEATURE_TRANSFER_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-image-00001)~^~ VALIDATION_ERROR_18800004~^~Y~^~Unknown~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-image-00002~^~core~^~The spec valid usage text states 'image must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearColorImage-image-00002)~^~ VALIDATION_ERROR_18800006~^~Y~^~Unknown~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-image-00003~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearColorImage-image-00003)~^~ VALIDATION_ERROR_18800008~^~Y~^~InvalidImageLayout~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-imageLayout-00004~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearColorImage-imageLayout-00004)~^~ @@ -1784,9 +1816,11 @@ VALIDATION_ERROR_18800ae4~^~N~^~None~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-imageLayout-01394~^~(VK_KHR_shared_presentable_image)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-imageLayout-01394)~^~ VALIDATION_ERROR_18800b7c~^~Y~^~ClearColorImageWithBadRange~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-baseMipLevel-01470~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearColorImage-baseMipLevel-01470)~^~ VALIDATION_ERROR_18800b80~^~Y~^~ClearColorImageWithBadRange~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-baseArrayLayer-01472~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearColorImage-baseArrayLayer-01472)~^~ -VALIDATION_ERROR_18800c12~^~N~^~None~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-image-01545~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'image must not use a format listed in features-formats-requiring-sampler-ycbcr-conversion' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-image-01545)~^~ +VALIDATION_ERROR_18800c12~^~N~^~None~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-image-01545~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'image must not use a format listed in features-formats-requiring-sampler-ycbcr-conversion' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-image-01545)~^~ VALIDATION_ERROR_18800d38~^~Y~^~ClearColorImageWithBadRange~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-pRanges-01692~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearColorImage-pRanges-01692)~^~ VALIDATION_ERROR_18800d3a~^~Y~^~ClearColorImageWithBadRange~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-pRanges-01693~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearColorImage-pRanges-01693)~^~ +VALIDATION_ERROR_18800e1a~^~N~^~None~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-commandBuffer-01805~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then image must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-01805)~^~ +VALIDATION_ERROR_18800e1c~^~N~^~None~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-commandBuffer-01806~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then image must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-01806)~^~ VALIDATION_ERROR_18802401~^~Y~^~None~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_18802413~^~Y~^~None~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-recording)~^~implicit VALIDATION_ERROR_18802415~^~Y~^~Unknown~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-commandBuffer-cmdpool~^~core~^~The spec valid usage text states '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-vkCmdClearColorImage-commandBuffer-cmdpool)~^~implicit @@ -1796,7 +1830,7 @@ VALIDATION_ERROR_18820601~^~Y~^~Unknown~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-pRanges-parameter~^~core~^~The spec valid usage text states 'pRanges must be a valid pointer to an array of rangeCount valid VkImageSubresourceRange structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearColorImage-pRanges-parameter)~^~implicit VALIDATION_ERROR_1882a41b~^~Y~^~Unknown~^~vkCmdClearColorImage~^~VUID-vkCmdClearColorImage-rangeCount-arraylength~^~core~^~The spec valid usage text states 'rangeCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearColorImage-rangeCount-arraylength)~^~implicit VALIDATION_ERROR_18a00009~^~Y~^~Unknown~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-commonparent~^~core~^~The spec valid usage text states 'Both of commandBuffer, and image must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commonparent)~^~implicit -VALIDATION_ERROR_18a00010~^~Y~^~Unknown~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-image-00008~^~(VK_KHR_maintenance1)~^~The spec valid usage text states 'image must use a format that supports VK_FORMAT_FEATURE_TRANSFER_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-image-00008)~^~ +VALIDATION_ERROR_18a00010~^~Y~^~Unknown~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-image-00008~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'image must use a format that supports VK_FORMAT_FEATURE_TRANSFER_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-image-00008)~^~ VALIDATION_ERROR_18a00012~^~Y~^~ClearDepthStencilImageErrors~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-image-00009~^~core~^~The spec valid usage text states 'image must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-image-00009)~^~ VALIDATION_ERROR_18a00014~^~Y~^~Unknown~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-image-00010~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-image-00010)~^~ VALIDATION_ERROR_18a00016~^~Y~^~InvalidImageLayout~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-imageLayout-00011~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-imageLayout-00011)~^~ @@ -1807,6 +1841,8 @@ VALIDATION_ERROR_18a00b88~^~Y~^~ClearDepthStencilWithBadRange~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-baseArrayLayer-01476~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-baseArrayLayer-01476)~^~ VALIDATION_ERROR_18a00d3c~^~Y~^~ClearDepthStencilWithBadRange~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-pRanges-01694~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-pRanges-01694)~^~ VALIDATION_ERROR_18a00d3e~^~Y~^~ClearDepthStencilWithBadRange~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-pRanges-01695~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-pRanges-01695)~^~ +VALIDATION_ERROR_18a00e1e~^~N~^~None~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-commandBuffer-01807~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then image must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-01807)~^~ +VALIDATION_ERROR_18a00e20~^~N~^~None~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-commandBuffer-01808~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then image must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-01808)~^~ VALIDATION_ERROR_18a02401~^~Y~^~None~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_18a02413~^~Y~^~None~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-recording)~^~implicit VALIDATION_ERROR_18a02415~^~Y~^~Unknown~^~vkCmdClearDepthStencilImage~^~VUID-vkCmdClearDepthStencilImage-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-cmdpool)~^~implicit @@ -1827,6 +1863,9 @@ VALIDATION_ERROR_18c000ee~^~Y~^~Unknown~^~vkCmdCopyBuffer~^~VUID-vkCmdCopyBuffer-srcBuffer-00119~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyBuffer-srcBuffer-00119)~^~ VALIDATION_ERROR_18c000f0~^~Y~^~None~^~vkCmdCopyBuffer~^~VUID-vkCmdCopyBuffer-dstBuffer-00120~^~core~^~The spec valid usage text states 'dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBuffer-dstBuffer-00120)~^~ VALIDATION_ERROR_18c000f2~^~Y~^~Unknown~^~vkCmdCopyBuffer~^~VUID-vkCmdCopyBuffer-dstBuffer-00121~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyBuffer-dstBuffer-00121)~^~ +VALIDATION_ERROR_18c00e3c~^~N~^~None~^~vkCmdCopyBuffer~^~VUID-vkCmdCopyBuffer-commandBuffer-01822~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-01822)~^~ +VALIDATION_ERROR_18c00e3e~^~N~^~None~^~vkCmdCopyBuffer~^~VUID-vkCmdCopyBuffer-commandBuffer-01823~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-01823)~^~ +VALIDATION_ERROR_18c00e40~^~N~^~None~^~vkCmdCopyBuffer~^~VUID-vkCmdCopyBuffer-commandBuffer-01824~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-01824)~^~ VALIDATION_ERROR_18c02401~^~Y~^~None~^~vkCmdCopyBuffer~^~VUID-vkCmdCopyBuffer-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_18c02413~^~Y~^~None~^~vkCmdCopyBuffer~^~VUID-vkCmdCopyBuffer-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-recording)~^~implicit VALIDATION_ERROR_18c02415~^~Y~^~Unknown~^~vkCmdCopyBuffer~^~VUID-vkCmdCopyBuffer-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-cmdpool)~^~implicit @@ -1840,7 +1879,7 @@ VALIDATION_ERROR_18e00158~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-pRegions-00172~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-pRegions-00172)~^~ VALIDATION_ERROR_18e0015a~^~N~^~Unknown~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-pRegions-00173~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-pRegions-00173)~^~ VALIDATION_ERROR_18e0015c~^~Y~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-srcBuffer-00174~^~core~^~The spec valid usage text states 'srcBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_SRC_BIT usage flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-srcBuffer-00174)~^~ -VALIDATION_ERROR_18e0015e~^~N~^~Unknown~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-dstImage-00175~^~(VK_KHR_maintenance1)~^~The spec valid usage text states 'dstImage must use a format that supports VK_FORMAT_FEATURE_TRANSFER_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImage-00175)~^~ +VALIDATION_ERROR_18e0015e~^~N~^~Unknown~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-dstImage-00175~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'dstImage must use a format that supports VK_FORMAT_FEATURE_TRANSFER_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImage-00175)~^~ VALIDATION_ERROR_18e00160~^~Y~^~Unknown~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-srcBuffer-00176~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-srcBuffer-00176)~^~ VALIDATION_ERROR_18e00162~^~Y~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-dstImage-00177~^~core~^~The spec valid usage text states 'dstImage must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImage-00177)~^~ VALIDATION_ERROR_18e00164~^~Y~^~Unknown~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-dstImage-00178~^~core~^~The spec valid usage text states '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-vkCmdCopyBufferToImage-dstImage-00178)~^~ @@ -1851,6 +1890,9 @@ VALIDATION_ERROR_18e00d4a~^~N~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-imageSubresource-01701~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageSubresource-01701)~^~ VALIDATION_ERROR_18e00d4c~^~N~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-imageSubresource-01702~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageSubresource-01702)~^~ VALIDATION_ERROR_18e00e02~^~N~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-imageOffset-01793~^~core~^~The spec valid usage text states 'The imageOffset and 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.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageOffset-01793)~^~ +VALIDATION_ERROR_18e00e48~^~N~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-commandBuffer-01828~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-01828)~^~ +VALIDATION_ERROR_18e00e4a~^~N~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-commandBuffer-01829~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-01829)~^~ +VALIDATION_ERROR_18e00e4c~^~N~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-commandBuffer-01830~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-01830)~^~ VALIDATION_ERROR_18e02401~^~Y~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_18e02413~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-recording)~^~implicit VALIDATION_ERROR_18e02415~^~Y~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-cmdpool)~^~implicit @@ -1864,30 +1906,34 @@ VALIDATION_ERROR_190000f4~^~Y~^~CopyImageSrcSizeExceeded~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-pRegions-00122~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImage-pRegions-00122)~^~ VALIDATION_ERROR_190000f6~^~Y~^~CopyImageDstSizeExceeded~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-pRegions-00123~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImage-pRegions-00123)~^~ VALIDATION_ERROR_190000f8~^~Y~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-pRegions-00124~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImage-pRegions-00124)~^~ -VALIDATION_ERROR_190000fa~^~N~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImage-00125~^~(VK_KHR_maintenance1)~^~The spec valid usage text states 'srcImage must use a format that supports VK_FORMAT_FEATURE_TRANSFER_SRC_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-00125)~^~ +VALIDATION_ERROR_190000fa~^~N~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImage-00125~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'srcImage must use a format that supports VK_FORMAT_FEATURE_TRANSFER_SRC_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-00125)~^~ VALIDATION_ERROR_190000fc~^~Y~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImage-00126~^~core~^~The spec valid usage text states 'srcImage must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-00126)~^~ -VALIDATION_ERROR_190000fe~^~Y~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImage-00127~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_190000fe~^~Y~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImage-00127~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ VALIDATION_ERROR_19000100~^~N~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImageLayout-00128~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImage-srcImageLayout-00128)~^~ VALIDATION_ERROR_19000102~^~Y~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImageLayout-00129~^~!(VK_KHR_shared_presentable_image)~^~The spec valid usage text states 'srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-srcImageLayout-00129)~^~ -VALIDATION_ERROR_19000104~^~N~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstImage-00130~^~(VK_KHR_maintenance1)~^~The spec valid usage text states 'dstImage must use a format that supports VK_FORMAT_FEATURE_TRANSFER_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImage-00130)~^~ +VALIDATION_ERROR_19000104~^~N~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstImage-00130~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'dstImage must use a format that supports VK_FORMAT_FEATURE_TRANSFER_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImage-00130)~^~ VALIDATION_ERROR_19000106~^~Y~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstImage-00131~^~core~^~The spec valid usage text states 'dstImage must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-dstImage-00131)~^~ -VALIDATION_ERROR_19000108~^~Y~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstImage-00132~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_19000108~^~Y~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstImage-00132~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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)~^~ VALIDATION_ERROR_1900010a~^~N~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstImageLayout-00133~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImage-dstImageLayout-00133)~^~ VALIDATION_ERROR_1900010c~^~Y~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstImageLayout-00134~^~!(VK_KHR_shared_presentable_image)~^~The spec valid usage text states 'dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-dstImageLayout-00134)~^~ -VALIDATION_ERROR_1900010e~^~Y~^~CopyImageFormatSizeMismatch~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImage-00135~^~!(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'The VkFormat of each of srcImage and dstImage must be compatible, as defined below' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-00135)~^~ +VALIDATION_ERROR_1900010e~^~Y~^~CopyImageFormatSizeMismatch~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImage-00135~^~!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'The VkFormat of each of srcImage and dstImage must be compatible, as defined below' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-00135)~^~ VALIDATION_ERROR_19000110~^~Y~^~CopyImageSampleCountMismatch~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImage-00136~^~core~^~The spec valid usage text states 'The sample count of srcImage and dstImage must match' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-00136)~^~ VALIDATION_ERROR_19000ae6~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstImageLayout-01395~^~(VK_KHR_shared_presentable_image)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImageLayout-01395)~^~ -VALIDATION_ERROR_19000c14~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImage-01546~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-01546)~^~ -VALIDATION_ERROR_19000c16~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstImage-01547~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImage-01547)~^~ -VALIDATION_ERROR_19000c18~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImage-01548~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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 below' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-01548)~^~ -VALIDATION_ERROR_19000c1a~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-None-01549~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-None-01549)~^~ -VALIDATION_ERROR_19000c1c~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-aspectMask-01550~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'When a copy is performed to or from an image with a multi-planar format, the aspectMask of the srcSubresource and/or dstSubresource that refers to the multi-planar image 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 a VkFormat with three planes)' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-aspectMask-01550)~^~ +VALIDATION_ERROR_19000c14~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImage-01546~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-01546)~^~ +VALIDATION_ERROR_19000c16~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstImage-01547~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImage-01547)~^~ +VALIDATION_ERROR_19000c18~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImage-01548~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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 below' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-01548)~^~ +VALIDATION_ERROR_19000c1a~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-None-01549~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-None-01549)~^~ +VALIDATION_ERROR_19000c1c~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-aspectMask-01550~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'When a copy is performed to or from an image with a multi-planar format, the aspectMask of the srcSubresource and/or dstSubresource that refers to the multi-planar image 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 a VkFormat with three planes)' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-aspectMask-01550)~^~ VALIDATION_ERROR_19000d40~^~Y~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcSubresource-01696~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImage-srcSubresource-01696)~^~ VALIDATION_ERROR_19000d42~^~Y~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstSubresource-01697~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImage-dstSubresource-01697)~^~ VALIDATION_ERROR_19000d44~^~Y~^~CopyImageTypeExtentMismatch~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcSubresource-01698~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImage-srcSubresource-01698)~^~ VALIDATION_ERROR_19000d46~^~Y~^~CopyImageTypeExtentMismatch~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstSubresource-01699~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImage-dstSubresource-01699)~^~ VALIDATION_ERROR_19000dee~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcOffset-01783~^~core~^~The spec valid usage text states 'The srcOffset and 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.0/html/vkspec.html#VUID-vkCmdCopyImage-srcOffset-01783)~^~ VALIDATION_ERROR_19000df0~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-dstOffset-01784~^~core~^~The spec valid usage text states 'The dstOffset and 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.0/html/vkspec.html#VUID-vkCmdCopyImage-dstOffset-01784)~^~ +VALIDATION_ERROR_19000e42~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-commandBuffer-01825~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-01825)~^~ +VALIDATION_ERROR_19000e44~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-commandBuffer-01826~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-01826)~^~ +VALIDATION_ERROR_19000e46~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-commandBuffer-01827~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-01827)~^~ +VALIDATION_ERROR_19000efa~^~N~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-srcImageLayout-01917~^~(VK_KHR_shared_presentable_image)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImageLayout-01917)~^~ VALIDATION_ERROR_19002401~^~Y~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_19002413~^~Y~^~None~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-recording)~^~implicit VALIDATION_ERROR_19002415~^~Y~^~Unknown~^~vkCmdCopyImage~^~VUID-vkCmdCopyImage-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-cmdpool)~^~implicit @@ -1902,7 +1948,7 @@ VALIDATION_ERROR_1920016c~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-pRegions-00182~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-pRegions-00182)~^~ VALIDATION_ERROR_1920016e~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-pRegions-00183~^~core~^~The spec valid usage text states 'The buffer region specified by each element of pRegions must be a region that is contained within dstBuffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-pRegions-00183)~^~ VALIDATION_ERROR_19200170~^~N~^~Unknown~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-pRegions-00184~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-pRegions-00184)~^~ -VALIDATION_ERROR_19200172~^~N~^~Unknown~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-srcImage-00185~^~(VK_KHR_maintenance1)~^~The spec valid usage text states 'srcImage must use a format that supports VK_FORMAT_FEATURE_TRANSFER_SRC_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImage-00185)~^~ +VALIDATION_ERROR_19200172~^~N~^~Unknown~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-srcImage-00185~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'srcImage must use a format that supports VK_FORMAT_FEATURE_TRANSFER_SRC_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImage-00185)~^~ VALIDATION_ERROR_19200174~^~Y~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-srcImage-00186~^~core~^~The spec valid usage text states 'srcImage must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImage-00186)~^~ VALIDATION_ERROR_19200176~^~Y~^~Unknown~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-srcImage-00187~^~core~^~The spec valid usage text states '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-vkCmdCopyImageToBuffer-srcImage-00187)~^~ VALIDATION_ERROR_19200178~^~Y~^~Unknown~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-srcImage-00188~^~core~^~The spec valid usage text states 'srcImage must have a sample count equal to VK_SAMPLE_COUNT_1_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImage-00188)~^~ @@ -1914,6 +1960,9 @@ VALIDATION_ERROR_19200d4e~^~N~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-imageSubresource-01703~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageSubresource-01703)~^~ VALIDATION_ERROR_19200d50~^~N~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-imageSubresource-01704~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageSubresource-01704)~^~ VALIDATION_ERROR_19200e04~^~N~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-imageOffset-01794~^~core~^~The spec valid usage text states 'The imageOffset and 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.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageOffset-01794)~^~ +VALIDATION_ERROR_19200e4e~^~N~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-commandBuffer-01831~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-01831)~^~ +VALIDATION_ERROR_19200e50~^~N~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-commandBuffer-01832~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-01832)~^~ +VALIDATION_ERROR_19200e52~^~N~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-commandBuffer-01833~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-01833)~^~ VALIDATION_ERROR_19202401~^~Y~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_19202413~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-recording)~^~implicit VALIDATION_ERROR_19202415~^~Y~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-cmdpool)~^~implicit @@ -1956,103 +2005,115 @@ VALIDATION_ERROR_19c00304~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatch~^~VUID-vkCmdDispatch-groupCountX-00386~^~core~^~The spec valid usage text states 'groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-groupCountX-00386)~^~ VALIDATION_ERROR_19c00306~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatch~^~VUID-vkCmdDispatch-groupCountY-00387~^~core~^~The spec valid usage text states 'groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-groupCountY-00387)~^~ VALIDATION_ERROR_19c00308~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatch~^~VUID-vkCmdDispatch-groupCountZ-00388~^~core~^~The spec valid usage text states 'groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-groupCountZ-00388)~^~ -VALIDATION_ERROR_19c0030a~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00389~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00389)~^~ -VALIDATION_ERROR_19c0030c~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00390~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00390)~^~ +VALIDATION_ERROR_19c0030a~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00389~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00389)~^~ +VALIDATION_ERROR_19c0030c~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00390~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00390)~^~ VALIDATION_ERROR_19c0030e~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00391~^~core~^~The spec valid usage text states 'A valid compute pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_COMPUTE' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00391)~^~ -VALIDATION_ERROR_19c00310~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00392~^~core~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE, a push constant value must have been set for VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for push constants with the one used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00392)~^~ -VALIDATION_ERROR_19c00312~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00393~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatch-None-00393)~^~ -VALIDATION_ERROR_19c00314~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00394~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatch-None-00394)~^~ -VALIDATION_ERROR_19c00316~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00395~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatch-None-00395)~^~ -VALIDATION_ERROR_19c00318~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00396~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00396)~^~ -VALIDATION_ERROR_19c0031a~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00397~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00397)~^~ +VALIDATION_ERROR_19c00310~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00392~^~core~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE, a push constant value must have been set for VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for push constants with the one used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00392)~^~ +VALIDATION_ERROR_19c00312~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00393~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatch-None-00393)~^~ +VALIDATION_ERROR_19c00314~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00394~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatch-None-00394)~^~ +VALIDATION_ERROR_19c00316~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00395~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatch-None-00395)~^~ +VALIDATION_ERROR_19c00318~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00396~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00396)~^~ +VALIDATION_ERROR_19c0031a~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00397~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00397)~^~ VALIDATION_ERROR_19c0031c~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-linearTilingFeatures-00398~^~core~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-linearTilingFeatures-00398)~^~ VALIDATION_ERROR_19c0031e~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-linearTilingFeatures-00399~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatch-linearTilingFeatures-00399)~^~ VALIDATION_ERROR_19c00320~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00400~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-00400)~^~ +VALIDATION_ERROR_19c00e68~^~N~^~None~^~vkCmdDispatch~^~VUID-vkCmdDispatch-commandBuffer-01844~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-01844)~^~ +VALIDATION_ERROR_19c00e6a~^~N~^~None~^~vkCmdDispatch~^~VUID-vkCmdDispatch-commandBuffer-01845~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_POINT_COMPUTE writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-01845)~^~ +VALIDATION_ERROR_19c00e6c~^~N~^~None~^~vkCmdDispatch~^~VUID-vkCmdDispatch-commandBuffer-01846~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the compute pipeline stage in the VkPipeline object bound to VK_PIPELINE_POINT_COMPUTE reads from any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-01846)~^~ VALIDATION_ERROR_19c02401~^~Y~^~None~^~vkCmdDispatch~^~VUID-vkCmdDispatch-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_19c02413~^~Y~^~None~^~vkCmdDispatch~^~VUID-vkCmdDispatch-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-recording)~^~implicit VALIDATION_ERROR_19c02415~^~Y~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-cmdpool)~^~implicit -VALIDATION_ERROR_19e00017~^~N~^~Unknown~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-renderpass~^~(VK_KHR_device_group)~^~The spec valid usage text states 'This command must only be called outside of a render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-renderpass)~^~implicit -VALIDATION_ERROR_19e00348~^~N~^~Unknown~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-None-00420~^~(VK_KHR_device_group)~^~The spec valid usage text states 'All valid usage rules from vkCmdDispatch apply' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-00420)~^~ -VALIDATION_ERROR_19e0034a~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-baseGroupX-00421~^~(VK_KHR_device_group)~^~The spec valid usage text states 'baseGroupX must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupX-00421)~^~ -VALIDATION_ERROR_19e0034c~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-baseGroupX-00422~^~(VK_KHR_device_group)~^~The spec valid usage text states 'baseGroupX must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupX-00422)~^~ -VALIDATION_ERROR_19e0034e~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-baseGroupZ-00423~^~(VK_KHR_device_group)~^~The spec valid usage text states 'baseGroupZ must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupZ-00423)~^~ -VALIDATION_ERROR_19e00350~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-groupCountX-00424~^~(VK_KHR_device_group)~^~The spec valid usage text states 'groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] minus baseGroupX' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-groupCountX-00424)~^~ -VALIDATION_ERROR_19e00352~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-groupCountY-00425~^~(VK_KHR_device_group)~^~The spec valid usage text states 'groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] minus baseGroupY' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-groupCountY-00425)~^~ -VALIDATION_ERROR_19e00354~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-groupCountZ-00426~^~(VK_KHR_device_group)~^~The spec valid usage text states 'groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] minus baseGroupZ' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-groupCountZ-00426)~^~ -VALIDATION_ERROR_19e00356~^~N~^~Unknown~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-baseGroupX-00427~^~(VK_KHR_device_group)~^~The spec valid usage text states 'If any of baseGroupX, baseGroupY, or baseGroupZ are not zero, then the currently bound compute pipeline must have been created with the VK_PIPELINE_CREATE_DISPATCH_BASE flag.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupX-00427)~^~ -VALIDATION_ERROR_19e02401~^~Y~^~Unknown~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-commandBuffer-parameter~^~(VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-parameter)~^~implicit -VALIDATION_ERROR_19e02413~^~N~^~Unknown~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-commandBuffer-recording~^~(VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-recording)~^~implicit -VALIDATION_ERROR_19e02415~^~N~^~Unknown~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-commandBuffer-cmdpool~^~(VK_KHR_device_group)~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-cmdpool)~^~implicit +VALIDATION_ERROR_19e00017~^~N~^~Unknown~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-renderpass~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'This command must only be called outside of a render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-renderpass)~^~implicit +VALIDATION_ERROR_19e00348~^~N~^~Unknown~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-None-00420~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'All valid usage rules from vkCmdDispatch apply' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-00420)~^~ +VALIDATION_ERROR_19e0034a~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-baseGroupX-00421~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'baseGroupX must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupX-00421)~^~ +VALIDATION_ERROR_19e0034c~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-baseGroupX-00422~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'baseGroupX must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupX-00422)~^~ +VALIDATION_ERROR_19e0034e~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-baseGroupZ-00423~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'baseGroupZ must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupZ-00423)~^~ +VALIDATION_ERROR_19e00350~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-groupCountX-00424~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] minus baseGroupX' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-groupCountX-00424)~^~ +VALIDATION_ERROR_19e00352~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-groupCountY-00425~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] minus baseGroupY' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-groupCountY-00425)~^~ +VALIDATION_ERROR_19e00354~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-groupCountZ-00426~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] minus baseGroupZ' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-groupCountZ-00426)~^~ +VALIDATION_ERROR_19e00356~^~N~^~Unknown~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-baseGroupX-00427~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupX-00427)~^~ +VALIDATION_ERROR_19e02401~^~Y~^~Unknown~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-commandBuffer-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-parameter)~^~implicit +VALIDATION_ERROR_19e02413~^~N~^~Unknown~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-commandBuffer-recording~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-recording)~^~implicit +VALIDATION_ERROR_19e02415~^~N~^~Unknown~^~vkCmdDispatchBase~^~VUID-vkCmdDispatchBase-commandBuffer-cmdpool~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_1a000009~^~Y~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-commonparent~^~core~^~The spec valid usage text states 'Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-commonparent)~^~implicit VALIDATION_ERROR_1a000017~^~Y~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-renderpass~^~core~^~The spec valid usage text states 'This command must only be called outside of a render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-renderpass)~^~implicit VALIDATION_ERROR_1a000322~^~Y~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-buffer-00401~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-buffer-00401)~^~ -VALIDATION_ERROR_1a000324~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00402~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00402)~^~ -VALIDATION_ERROR_1a000326~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00403~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00403)~^~ +VALIDATION_ERROR_1a000324~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00402~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00402)~^~ +VALIDATION_ERROR_1a000326~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00403~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00403)~^~ VALIDATION_ERROR_1a000328~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00404~^~core~^~The spec valid usage text states 'A valid compute pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_COMPUTE' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00404)~^~ VALIDATION_ERROR_1a00032a~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-buffer-00405~^~core~^~The spec valid usage text states 'buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-buffer-00405)~^~ VALIDATION_ERROR_1a00032c~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-offset-00406~^~core~^~The spec valid usage text states 'offset must be a multiple of 4' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-offset-00406)~^~ VALIDATION_ERROR_1a00032e~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-offset-00407~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-offset-00407)~^~ -VALIDATION_ERROR_1a000330~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00408~^~core~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE, a push constant value must have been set for VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for push constants with the one used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00408)~^~ -VALIDATION_ERROR_1a000332~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00409~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00409)~^~ -VALIDATION_ERROR_1a000334~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00410~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00410)~^~ -VALIDATION_ERROR_1a000336~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00411~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00411)~^~ -VALIDATION_ERROR_1a000338~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00412~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00412)~^~ -VALIDATION_ERROR_1a00033a~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00413~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00413)~^~ +VALIDATION_ERROR_1a000330~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00408~^~core~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE, a push constant value must have been set for VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for push constants with the one used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00408)~^~ +VALIDATION_ERROR_1a000332~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00409~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00409)~^~ +VALIDATION_ERROR_1a000334~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00410~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00410)~^~ +VALIDATION_ERROR_1a000336~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00411~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00411)~^~ +VALIDATION_ERROR_1a000338~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00412~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00412)~^~ +VALIDATION_ERROR_1a00033a~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00413~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00413)~^~ VALIDATION_ERROR_1a00033c~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-linearTilingFeatures-00414~^~core~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-linearTilingFeatures-00414)~^~ VALIDATION_ERROR_1a00033e~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-linearTilingFeatures-00415~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-linearTilingFeatures-00415)~^~ VALIDATION_ERROR_1a000340~^~N~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-None-00416~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00416)~^~ +VALIDATION_ERROR_1a000e6e~^~N~^~None~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-commandBuffer-01847~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-01847)~^~ +VALIDATION_ERROR_1a000e70~^~N~^~None~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-commandBuffer-01848~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_POINT_COMPUTE writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-01848)~^~ +VALIDATION_ERROR_1a000e72~^~N~^~None~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-commandBuffer-01849~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the compute pipeline stage in the VkPipeline object bound to VK_PIPELINE_POINT_COMPUTE reads from any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-01849)~^~ VALIDATION_ERROR_1a001a01~^~Y~^~None~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-buffer-parameter~^~core~^~The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-buffer-parameter)~^~implicit VALIDATION_ERROR_1a002401~^~Y~^~None~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1a002413~^~Y~^~None~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1a002415~^~Y~^~Unknown~^~vkCmdDispatchIndirect~^~VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_1a200017~^~Y~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-renderpass~^~core~^~The spec valid usage text states 'This command must only be called inside of a render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-renderpass)~^~implicit -VALIDATION_ERROR_1a200366~^~Y~^~RenderPassIncompatible~^~vkCmdDraw~^~VUID-vkCmdDraw-renderPass-00435~^~core~^~The spec valid usage text states 'The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-renderPass-00435)~^~ -VALIDATION_ERROR_1a200368~^~Y~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-subpass-00436~^~core~^~The spec valid usage text states 'The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-subpass-00436)~^~ -VALIDATION_ERROR_1a20036a~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00437~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00437)~^~ -VALIDATION_ERROR_1a20036c~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00438~^~core~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00438)~^~ -VALIDATION_ERROR_1a20036e~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00439~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00439)~^~ +VALIDATION_ERROR_1a200366~^~Y~^~RenderPassIncompatible~^~vkCmdDraw~^~VUID-vkCmdDraw-renderPass-00435~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDraw-renderPass-00435)~^~ +VALIDATION_ERROR_1a200368~^~Y~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-subpass-00436~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDraw-subpass-00436)~^~ +VALIDATION_ERROR_1a20036a~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00437~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00437)~^~ +VALIDATION_ERROR_1a20036c~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00438~^~core~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00438)~^~ +VALIDATION_ERROR_1a20036e~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00439~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00439)~^~ VALIDATION_ERROR_1a200370~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00440~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDraw-None-00440)~^~ VALIDATION_ERROR_1a200372~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00441~^~core~^~The spec valid usage text states 'For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in fxvertex-input' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00441)~^~ VALIDATION_ERROR_1a200374~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00442~^~core~^~The spec valid usage text states 'A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00442)~^~ -VALIDATION_ERROR_1a200376~^~Y~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00443~^~core~^~The spec valid usage text states 'If the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00443)~^~ +VALIDATION_ERROR_1a200376~^~Y~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00443~^~core~^~The spec valid usage text states 'If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00443)~^~ VALIDATION_ERROR_1a200378~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00444~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDraw-None-00444)~^~ -VALIDATION_ERROR_1a20037a~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00445~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDraw-None-00445)~^~ -VALIDATION_ERROR_1a20037c~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00446~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDraw-None-00446)~^~ -VALIDATION_ERROR_1a20037e~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00447~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDraw-None-00447)~^~ -VALIDATION_ERROR_1a200380~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00448~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00448)~^~ -VALIDATION_ERROR_1a200382~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00449~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00449)~^~ +VALIDATION_ERROR_1a20037a~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00445~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDraw-None-00445)~^~ +VALIDATION_ERROR_1a20037c~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00446~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDraw-None-00446)~^~ +VALIDATION_ERROR_1a20037e~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00447~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDraw-None-00447)~^~ +VALIDATION_ERROR_1a200380~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00448~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00448)~^~ +VALIDATION_ERROR_1a200382~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00449~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00449)~^~ VALIDATION_ERROR_1a200384~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-linearTilingFeatures-00450~^~core~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-linearTilingFeatures-00450)~^~ VALIDATION_ERROR_1a200386~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-linearTilingFeatures-00451~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDraw-linearTilingFeatures-00451)~^~ VALIDATION_ERROR_1a200388~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-None-00452~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDraw-None-00452)~^~ -VALIDATION_ERROR_1a20038a~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-maxMultiviewInstanceIndex-00453~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDraw-maxMultiviewInstanceIndex-00453)~^~ +VALIDATION_ERROR_1a20038a~^~N~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-maxMultiviewInstanceIndex-00453~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDraw-maxMultiviewInstanceIndex-00453)~^~ VALIDATION_ERROR_1a200bb6~^~N~^~None~^~vkCmdDraw~^~VUID-vkCmdDraw-None-01499~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDraw-None-01499)~^~ -VALIDATION_ERROR_1a200bd0~^~N~^~None~^~vkCmdDraw~^~VUID-vkCmdDraw-sampleLocationsEnable-01512~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'If the currently 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.0-extensions/html/vkspec.html#VUID-vkCmdDraw-sampleLocationsEnable-01512)~^~ +VALIDATION_ERROR_1a200bd0~^~N~^~None~^~vkCmdDraw~^~VUID-vkCmdDraw-sampleLocationsEnable-01512~^~(VK_EXT_sample_locations)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDraw-sampleLocationsEnable-01512)~^~ +VALIDATION_ERROR_1a200e74~^~N~^~None~^~vkCmdDraw~^~VUID-vkCmdDraw-commandBuffer-01850~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-01850)~^~ +VALIDATION_ERROR_1a200e76~^~N~^~None~^~vkCmdDraw~^~VUID-vkCmdDraw-commandBuffer-01851~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-01851)~^~ +VALIDATION_ERROR_1a200e78~^~N~^~None~^~vkCmdDraw~^~VUID-vkCmdDraw-commandBuffer-01852~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-01852)~^~ VALIDATION_ERROR_1a202401~^~Y~^~None~^~vkCmdDraw~^~VUID-vkCmdDraw-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1a202413~^~Y~^~None~^~vkCmdDraw~^~VUID-vkCmdDraw-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1a202415~^~Y~^~Unknown~^~vkCmdDraw~^~VUID-vkCmdDraw-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_1a400017~^~Y~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-renderpass~^~core~^~The spec valid usage text states 'This command must only be called inside of a render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-renderpass)~^~implicit -VALIDATION_ERROR_1a40038c~^~Y~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-renderPass-00454~^~core~^~The spec valid usage text states 'The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-renderPass-00454)~^~ -VALIDATION_ERROR_1a40038e~^~Y~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-subpass-00455~^~core~^~The spec valid usage text states 'The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-subpass-00455)~^~ -VALIDATION_ERROR_1a400390~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00456~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00456)~^~ -VALIDATION_ERROR_1a400392~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00457~^~core~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00457)~^~ -VALIDATION_ERROR_1a400394~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00458~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00458)~^~ +VALIDATION_ERROR_1a40038c~^~Y~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-renderPass-00454~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-renderPass-00454)~^~ +VALIDATION_ERROR_1a40038e~^~Y~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-subpass-00455~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-subpass-00455)~^~ +VALIDATION_ERROR_1a400390~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00456~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00456)~^~ +VALIDATION_ERROR_1a400392~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00457~^~core~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00457)~^~ +VALIDATION_ERROR_1a400394~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00458~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00458)~^~ VALIDATION_ERROR_1a400396~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00459~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00459)~^~ VALIDATION_ERROR_1a400398~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00460~^~core~^~The spec valid usage text states 'For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in fxvertex-input' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00460)~^~ VALIDATION_ERROR_1a40039a~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00461~^~core~^~The spec valid usage text states 'A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00461)~^~ -VALIDATION_ERROR_1a40039c~^~Y~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00462~^~core~^~The spec valid usage text states 'If the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00462)~^~ -VALIDATION_ERROR_1a40039e~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-indexSize-00463~^~core~^~The spec valid usage text states '(indexSize * (firstIndex + indexCount) + offset) must be less than or equal to the size of the currently 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-indexSize-00463)~^~ +VALIDATION_ERROR_1a40039c~^~Y~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00462~^~core~^~The spec valid usage text states 'If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00462)~^~ +VALIDATION_ERROR_1a40039e~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-indexSize-00463~^~core~^~The spec valid usage text states '(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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-indexSize-00463)~^~ VALIDATION_ERROR_1a4003a0~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00464~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00464)~^~ -VALIDATION_ERROR_1a4003a2~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00465~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00465)~^~ -VALIDATION_ERROR_1a4003a4~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00466~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00466)~^~ -VALIDATION_ERROR_1a4003a6~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00467~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00467)~^~ -VALIDATION_ERROR_1a4003a8~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00468~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00468)~^~ -VALIDATION_ERROR_1a4003aa~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00469~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00469)~^~ +VALIDATION_ERROR_1a4003a2~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00465~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00465)~^~ +VALIDATION_ERROR_1a4003a4~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00466~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00466)~^~ +VALIDATION_ERROR_1a4003a6~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00467~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00467)~^~ +VALIDATION_ERROR_1a4003a8~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00468~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00468)~^~ +VALIDATION_ERROR_1a4003aa~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00469~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00469)~^~ VALIDATION_ERROR_1a4003ac~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-linearTilingFeatures-00470~^~core~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-linearTilingFeatures-00470)~^~ VALIDATION_ERROR_1a4003ae~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-linearTilingFeatures-00471~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-linearTilingFeatures-00471)~^~ VALIDATION_ERROR_1a4003b0~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-00472~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00472)~^~ -VALIDATION_ERROR_1a4003b2~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-maxMultiviewInstanceIndex-00473~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-maxMultiviewInstanceIndex-00473)~^~ +VALIDATION_ERROR_1a4003b2~^~N~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-maxMultiviewInstanceIndex-00473~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-maxMultiviewInstanceIndex-00473)~^~ VALIDATION_ERROR_1a400bb8~^~N~^~None~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-None-01500~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-01500)~^~ -VALIDATION_ERROR_1a400bd2~^~N~^~None~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-sampleLocationsEnable-01513~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'If the currently 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-sampleLocationsEnable-01513)~^~ +VALIDATION_ERROR_1a400bd2~^~N~^~None~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-sampleLocationsEnable-01513~^~(VK_EXT_sample_locations)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-sampleLocationsEnable-01513)~^~ +VALIDATION_ERROR_1a400e7a~^~N~^~None~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-commandBuffer-01853~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-01853)~^~ +VALIDATION_ERROR_1a400e7c~^~N~^~None~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-commandBuffer-01854~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-01854)~^~ +VALIDATION_ERROR_1a400e7e~^~N~^~None~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-commandBuffer-01855~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-01855)~^~ VALIDATION_ERROR_1a402401~^~Y~^~None~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1a402413~^~Y~^~None~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1a402415~^~Y~^~Unknown~^~vkCmdDrawIndexed~^~VUID-vkCmdDrawIndexed-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-cmdpool)~^~implicit @@ -2063,30 +2124,33 @@ VALIDATION_ERROR_1a600420~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-drawCount-00528~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00528)~^~ VALIDATION_ERROR_1a600422~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-drawCount-00529~^~core~^~The spec valid usage text states 'If the multi-draw indirect feature is not enabled, drawCount must be 0 or 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00529)~^~ VALIDATION_ERROR_1a600424~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-firstInstance-00530~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-firstInstance-00530)~^~ -VALIDATION_ERROR_1a600426~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-renderPass-00531~^~core~^~The spec valid usage text states 'The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-renderPass-00531)~^~ -VALIDATION_ERROR_1a600428~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-subpass-00532~^~core~^~The spec valid usage text states 'The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-subpass-00532)~^~ -VALIDATION_ERROR_1a60042a~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00533~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00533)~^~ -VALIDATION_ERROR_1a60042c~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00534~^~core~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00534)~^~ -VALIDATION_ERROR_1a60042e~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00535~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00535)~^~ +VALIDATION_ERROR_1a600426~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-renderPass-00531~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-renderPass-00531)~^~ +VALIDATION_ERROR_1a600428~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-subpass-00532~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-subpass-00532)~^~ +VALIDATION_ERROR_1a60042a~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00533~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00533)~^~ +VALIDATION_ERROR_1a60042c~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00534~^~core~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00534)~^~ +VALIDATION_ERROR_1a60042e~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00535~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00535)~^~ VALIDATION_ERROR_1a600430~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00536~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00536)~^~ VALIDATION_ERROR_1a600432~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00537~^~core~^~The spec valid usage text states 'A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00537)~^~ -VALIDATION_ERROR_1a600434~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00538~^~core~^~The spec valid usage text states 'If the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00538)~^~ +VALIDATION_ERROR_1a600434~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00538~^~core~^~The spec valid usage text states 'If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00538)~^~ VALIDATION_ERROR_1a600436~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-drawCount-00539~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00539)~^~ VALIDATION_ERROR_1a600438~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-drawCount-00540~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00540)~^~ VALIDATION_ERROR_1a60043a~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-drawCount-00541~^~core~^~The spec valid usage text states 'drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00541)~^~ VALIDATION_ERROR_1a60043c~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00542~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00542)~^~ -VALIDATION_ERROR_1a60043e~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00543~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00543)~^~ -VALIDATION_ERROR_1a600440~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00544~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00544)~^~ -VALIDATION_ERROR_1a600442~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00545~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00545)~^~ -VALIDATION_ERROR_1a600444~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00546~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00546)~^~ -VALIDATION_ERROR_1a600446~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00547~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00547)~^~ +VALIDATION_ERROR_1a60043e~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00543~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00543)~^~ +VALIDATION_ERROR_1a600440~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00544~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00544)~^~ +VALIDATION_ERROR_1a600442~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00545~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00545)~^~ +VALIDATION_ERROR_1a600444~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00546~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00546)~^~ +VALIDATION_ERROR_1a600446~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00547~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00547)~^~ VALIDATION_ERROR_1a600448~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-linearTilingFeatures-00548~^~core~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-linearTilingFeatures-00548)~^~ VALIDATION_ERROR_1a60044a~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-linearTilingFeatures-00549~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-linearTilingFeatures-00549)~^~ VALIDATION_ERROR_1a60044c~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-00550~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00550)~^~ -VALIDATION_ERROR_1a60044e~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-maxMultiviewInstanceIndex-00551~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-maxMultiviewInstanceIndex-00551)~^~ +VALIDATION_ERROR_1a60044e~^~N~^~Unknown~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-maxMultiviewInstanceIndex-00551~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-maxMultiviewInstanceIndex-00551)~^~ VALIDATION_ERROR_1a600bbe~^~N~^~None~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-None-01503~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-01503)~^~ -VALIDATION_ERROR_1a600bd8~^~N~^~None~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-01516~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'If the currently 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-01516)~^~ +VALIDATION_ERROR_1a600bd8~^~N~^~None~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-01516~^~(VK_EXT_sample_locations)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-01516)~^~ VALIDATION_ERROR_1a600d02~^~N~^~None~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-buffer-01665~^~core~^~The spec valid usage text states 'buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-buffer-01665)~^~ +VALIDATION_ERROR_1a600e8c~^~N~^~None~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-commandBuffer-01862~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-01862)~^~ +VALIDATION_ERROR_1a600e8e~^~N~^~None~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-commandBuffer-01863~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-01863)~^~ +VALIDATION_ERROR_1a600e90~^~N~^~None~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-commandBuffer-01864~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-01864)~^~ VALIDATION_ERROR_1a601a01~^~Y~^~None~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-buffer-parameter~^~core~^~The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-buffer-parameter)~^~implicit VALIDATION_ERROR_1a602401~^~Y~^~None~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1a602413~^~Y~^~None~^~vkCmdDrawIndexedIndirect~^~VUID-vkCmdDrawIndexedIndirect-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-recording)~^~implicit @@ -2098,31 +2162,34 @@ VALIDATION_ERROR_1a80045a~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-stride-00557~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-stride-00557)~^~ VALIDATION_ERROR_1a80045c~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-maxDrawCount-00558~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-maxDrawCount-00558)~^~ VALIDATION_ERROR_1a80045e~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-firstInstance-00559~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-firstInstance-00559)~^~ -VALIDATION_ERROR_1a800460~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-renderPass-00560~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-renderPass-00560)~^~ -VALIDATION_ERROR_1a800462~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-subpass-00561~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-subpass-00561)~^~ -VALIDATION_ERROR_1a800464~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00562~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00562)~^~ -VALIDATION_ERROR_1a800466~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00563~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00563)~^~ -VALIDATION_ERROR_1a800468~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00564~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00564)~^~ +VALIDATION_ERROR_1a800460~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-renderPass-00560~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-renderPass-00560)~^~ +VALIDATION_ERROR_1a800462~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-subpass-00561~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-subpass-00561)~^~ +VALIDATION_ERROR_1a800464~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00562~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00562)~^~ +VALIDATION_ERROR_1a800466~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00563~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00563)~^~ +VALIDATION_ERROR_1a800468~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00564~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00564)~^~ VALIDATION_ERROR_1a80046a~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00565~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00565)~^~ VALIDATION_ERROR_1a80046c~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00566~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00566)~^~ -VALIDATION_ERROR_1a80046e~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00567~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00567)~^~ +VALIDATION_ERROR_1a80046e~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00567~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00567)~^~ VALIDATION_ERROR_1a800470~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-00568~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-00568)~^~ VALIDATION_ERROR_1a800472~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-00569~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-00569)~^~ VALIDATION_ERROR_1a800474~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-drawCount-00570~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-drawCount-00570)~^~ VALIDATION_ERROR_1a800476~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00571~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00571)~^~ -VALIDATION_ERROR_1a800478~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00572~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00572)~^~ -VALIDATION_ERROR_1a80047a~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00573~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00573)~^~ -VALIDATION_ERROR_1a80047c~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00574~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00574)~^~ -VALIDATION_ERROR_1a80047e~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00575~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00575)~^~ -VALIDATION_ERROR_1a800480~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00576~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00576)~^~ +VALIDATION_ERROR_1a800478~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00572~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00572)~^~ +VALIDATION_ERROR_1a80047a~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00573~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00573)~^~ +VALIDATION_ERROR_1a80047c~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00574~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00574)~^~ +VALIDATION_ERROR_1a80047e~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00575~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00575)~^~ +VALIDATION_ERROR_1a800480~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-00576~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00576)~^~ VALIDATION_ERROR_1a800482~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-linearTilingFeatures-00577~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-linearTilingFeatures-00577)~^~ -VALIDATION_ERROR_1a800484~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-maxMultiviewInstanceIndex-00578~^~(VK_AMD_draw_indirect_count)+(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-maxMultiviewInstanceIndex-00578)~^~ +VALIDATION_ERROR_1a800484~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-maxMultiviewInstanceIndex-00578~^~(VK_AMD_draw_indirect_count)+(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-maxMultiviewInstanceIndex-00578)~^~ VALIDATION_ERROR_1a800bc0~^~N~^~None~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-None-01504~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-01504)~^~ -VALIDATION_ERROR_1a800bda~^~N~^~None~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-sampleLocationsEnable-01517~^~(VK_AMD_draw_indirect_count)+(VK_EXT_sample_locations)~^~The spec valid usage text states 'If the currently 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-sampleLocationsEnable-01517)~^~ +VALIDATION_ERROR_1a800bda~^~N~^~None~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-sampleLocationsEnable-01517~^~(VK_AMD_draw_indirect_count)+(VK_EXT_sample_locations)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-sampleLocationsEnable-01517)~^~ VALIDATION_ERROR_1a800d04~^~N~^~None~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-01666~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-01666)~^~ VALIDATION_ERROR_1a800d06~^~N~^~None~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-01667~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-01667)~^~ VALIDATION_ERROR_1a800d08~^~N~^~None~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-01668~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-01668)~^~ VALIDATION_ERROR_1a800d0a~^~N~^~None~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-01669~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'countBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-01669)~^~ +VALIDATION_ERROR_1a800e92~^~N~^~None~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01865~^~(VK_AMD_draw_indirect_count)+(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01865)~^~ +VALIDATION_ERROR_1a800e94~^~N~^~None~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01866~^~(VK_AMD_draw_indirect_count)+(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01866)~^~ +VALIDATION_ERROR_1a800e96~^~N~^~None~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01867~^~(VK_AMD_draw_indirect_count)+(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01867)~^~ VALIDATION_ERROR_1a801a01~^~Y~^~None~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-parameter~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-parameter)~^~implicit VALIDATION_ERROR_1a802401~^~Y~^~None~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-parameter~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1a802413~^~N~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-recording~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-recording)~^~implicit @@ -2135,30 +2202,33 @@ VALIDATION_ERROR_1aa003b8~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-drawCount-00476~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00476)~^~ VALIDATION_ERROR_1aa003ba~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-drawCount-00477~^~core~^~The spec valid usage text states 'If the multi-draw indirect feature is not enabled, drawCount must be 0 or 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00477)~^~ VALIDATION_ERROR_1aa003bc~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-firstInstance-00478~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-firstInstance-00478)~^~ -VALIDATION_ERROR_1aa003be~^~Y~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-renderPass-00479~^~core~^~The spec valid usage text states 'The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-renderPass-00479)~^~ -VALIDATION_ERROR_1aa003c0~^~Y~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-subpass-00480~^~core~^~The spec valid usage text states 'The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-subpass-00480)~^~ -VALIDATION_ERROR_1aa003c2~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00481~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00481)~^~ -VALIDATION_ERROR_1aa003c4~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00482~^~core~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00482)~^~ -VALIDATION_ERROR_1aa003c6~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00483~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00483)~^~ +VALIDATION_ERROR_1aa003be~^~Y~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-renderPass-00479~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-renderPass-00479)~^~ +VALIDATION_ERROR_1aa003c0~^~Y~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-subpass-00480~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-subpass-00480)~^~ +VALIDATION_ERROR_1aa003c2~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00481~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00481)~^~ +VALIDATION_ERROR_1aa003c4~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00482~^~core~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00482)~^~ +VALIDATION_ERROR_1aa003c6~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00483~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00483)~^~ VALIDATION_ERROR_1aa003c8~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00484~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00484)~^~ VALIDATION_ERROR_1aa003ca~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00485~^~core~^~The spec valid usage text states 'A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00485)~^~ -VALIDATION_ERROR_1aa003cc~^~Y~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00486~^~core~^~The spec valid usage text states 'If the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00486)~^~ +VALIDATION_ERROR_1aa003cc~^~Y~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00486~^~core~^~The spec valid usage text states 'If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00486)~^~ VALIDATION_ERROR_1aa003ce~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-drawCount-00487~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00487)~^~ VALIDATION_ERROR_1aa003d0~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-drawCount-00488~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00488)~^~ VALIDATION_ERROR_1aa003d2~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-drawCount-00489~^~core~^~The spec valid usage text states 'drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00489)~^~ VALIDATION_ERROR_1aa003d4~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00490~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00490)~^~ -VALIDATION_ERROR_1aa003d6~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00491~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00491)~^~ -VALIDATION_ERROR_1aa003d8~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00492~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00492)~^~ -VALIDATION_ERROR_1aa003da~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00493~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00493)~^~ -VALIDATION_ERROR_1aa003dc~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00494~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00494)~^~ -VALIDATION_ERROR_1aa003de~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00495~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00495)~^~ +VALIDATION_ERROR_1aa003d6~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00491~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00491)~^~ +VALIDATION_ERROR_1aa003d8~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00492~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00492)~^~ +VALIDATION_ERROR_1aa003da~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00493~^~core~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00493)~^~ +VALIDATION_ERROR_1aa003dc~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00494~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00494)~^~ +VALIDATION_ERROR_1aa003de~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00495~^~core~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00495)~^~ VALIDATION_ERROR_1aa003e0~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-linearTilingFeatures-00496~^~core~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-linearTilingFeatures-00496)~^~ VALIDATION_ERROR_1aa003e2~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-linearTilingFeatures-00497~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-linearTilingFeatures-00497)~^~ VALIDATION_ERROR_1aa003e4~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-00498~^~(VK_IMG_filter_cubic)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00498)~^~ -VALIDATION_ERROR_1aa003e6~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-maxMultiviewInstanceIndex-00499~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-maxMultiviewInstanceIndex-00499)~^~ +VALIDATION_ERROR_1aa003e6~^~N~^~Unknown~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-maxMultiviewInstanceIndex-00499~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-maxMultiviewInstanceIndex-00499)~^~ VALIDATION_ERROR_1aa00bba~^~N~^~None~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-None-01501~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-01501)~^~ -VALIDATION_ERROR_1aa00bd4~^~N~^~None~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-sampleLocationsEnable-01514~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'If the currently 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-sampleLocationsEnable-01514)~^~ +VALIDATION_ERROR_1aa00bd4~^~N~^~None~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-sampleLocationsEnable-01514~^~(VK_EXT_sample_locations)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-sampleLocationsEnable-01514)~^~ VALIDATION_ERROR_1aa00cf8~^~N~^~None~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-buffer-01660~^~core~^~The spec valid usage text states 'buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-buffer-01660)~^~ +VALIDATION_ERROR_1aa00e80~^~N~^~None~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-commandBuffer-01856~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-01856)~^~ +VALIDATION_ERROR_1aa00e82~^~N~^~None~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-commandBuffer-01857~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-01857)~^~ +VALIDATION_ERROR_1aa00e84~^~N~^~None~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-commandBuffer-01858~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-01858)~^~ VALIDATION_ERROR_1aa01a01~^~Y~^~None~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-buffer-parameter~^~core~^~The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-buffer-parameter)~^~implicit VALIDATION_ERROR_1aa02401~^~Y~^~None~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1aa02413~^~Y~^~None~^~vkCmdDrawIndirect~^~VUID-vkCmdDrawIndirect-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-recording)~^~implicit @@ -2170,41 +2240,44 @@ VALIDATION_ERROR_1ac003f0~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-stride-00504~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-stride-00504)~^~ VALIDATION_ERROR_1ac003f2~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-maxDrawCount-00505~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-maxDrawCount-00505)~^~ VALIDATION_ERROR_1ac003f4~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-firstInstance-00506~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-firstInstance-00506)~^~ -VALIDATION_ERROR_1ac003f6~^~Y~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-renderPass-00507~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-renderPass-00507)~^~ -VALIDATION_ERROR_1ac003f8~^~Y~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-subpass-00508~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-subpass-00508)~^~ -VALIDATION_ERROR_1ac003fa~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00509~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00509)~^~ -VALIDATION_ERROR_1ac003fc~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00510~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00510)~^~ -VALIDATION_ERROR_1ac003fe~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00511~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00511)~^~ +VALIDATION_ERROR_1ac003f6~^~Y~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-renderPass-00507~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-renderPass-00507)~^~ +VALIDATION_ERROR_1ac003f8~^~Y~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-subpass-00508~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-subpass-00508)~^~ +VALIDATION_ERROR_1ac003fa~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00509~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00509)~^~ +VALIDATION_ERROR_1ac003fc~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00510~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00510)~^~ +VALIDATION_ERROR_1ac003fe~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00511~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00511)~^~ VALIDATION_ERROR_1ac00400~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00512~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00512)~^~ VALIDATION_ERROR_1ac00402~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00513~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00513)~^~ -VALIDATION_ERROR_1ac00404~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00514~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00514)~^~ +VALIDATION_ERROR_1ac00404~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00514~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00514)~^~ VALIDATION_ERROR_1ac00406~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-countBuffer-00515~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-countBuffer-00515)~^~ VALIDATION_ERROR_1ac00408~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-countBuffer-00516~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-countBuffer-00516)~^~ VALIDATION_ERROR_1ac0040a~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-countBuffer-00517~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'The count stored in countBuffer must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-countBuffer-00517)~^~ VALIDATION_ERROR_1ac0040c~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00518~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00518)~^~ -VALIDATION_ERROR_1ac0040e~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00519~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00519)~^~ -VALIDATION_ERROR_1ac00410~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00520~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00520)~^~ -VALIDATION_ERROR_1ac00412~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00521~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00521)~^~ -VALIDATION_ERROR_1ac00414~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00522~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00522)~^~ -VALIDATION_ERROR_1ac00416~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00523~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00523)~^~ +VALIDATION_ERROR_1ac0040e~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00519~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00519)~^~ +VALIDATION_ERROR_1ac00410~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00520~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00520)~^~ +VALIDATION_ERROR_1ac00412~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00521~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00521)~^~ +VALIDATION_ERROR_1ac00414~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00522~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00522)~^~ +VALIDATION_ERROR_1ac00416~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-00523~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00523)~^~ VALIDATION_ERROR_1ac00418~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-linearTilingFeatures-00524~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-linearTilingFeatures-00524)~^~ -VALIDATION_ERROR_1ac0041a~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-maxMultiviewInstanceIndex-00525~^~(VK_AMD_draw_indirect_count)+(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-maxMultiviewInstanceIndex-00525)~^~ +VALIDATION_ERROR_1ac0041a~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-maxMultiviewInstanceIndex-00525~^~(VK_AMD_draw_indirect_count)+(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-maxMultiviewInstanceIndex-00525)~^~ VALIDATION_ERROR_1ac00bbc~^~N~^~None~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-None-01502~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-01502)~^~ -VALIDATION_ERROR_1ac00bd6~^~N~^~None~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-sampleLocationsEnable-01515~^~(VK_AMD_draw_indirect_count)+(VK_EXT_sample_locations)~^~The spec valid usage text states 'If the currently 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-sampleLocationsEnable-01515)~^~ +VALIDATION_ERROR_1ac00bd6~^~N~^~None~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-sampleLocationsEnable-01515~^~(VK_AMD_draw_indirect_count)+(VK_EXT_sample_locations)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-sampleLocationsEnable-01515)~^~ VALIDATION_ERROR_1ac00cfa~^~N~^~None~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-buffer-01661~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-buffer-01661)~^~ VALIDATION_ERROR_1ac00cfc~^~N~^~None~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-buffer-01662~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-buffer-01662)~^~ VALIDATION_ERROR_1ac00cfe~^~N~^~None~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-countBuffer-01663~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-countBuffer-01663)~^~ VALIDATION_ERROR_1ac00d00~^~N~^~None~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-countBuffer-01664~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'countBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-countBuffer-01664)~^~ +VALIDATION_ERROR_1ac00e86~^~N~^~None~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01859~^~(VK_AMD_draw_indirect_count)+(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01859)~^~ +VALIDATION_ERROR_1ac00e88~^~N~^~None~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01860~^~(VK_AMD_draw_indirect_count)+(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01860)~^~ +VALIDATION_ERROR_1ac00e8a~^~N~^~None~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01861~^~(VK_AMD_draw_indirect_count)+(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01861)~^~ VALIDATION_ERROR_1ac01a01~^~Y~^~None~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-buffer-parameter~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-buffer-parameter)~^~implicit VALIDATION_ERROR_1ac02401~^~Y~^~None~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-commandBuffer-parameter~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1ac02413~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-commandBuffer-recording~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1ac02415~^~N~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-commandBuffer-cmdpool~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_1ac03401~^~Y~^~Unknown~^~vkCmdDrawIndirectCountAMD~^~VUID-vkCmdDrawIndirectCountAMD-countBuffer-parameter~^~(VK_AMD_draw_indirect_count)~^~The spec valid usage text states 'countBuffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-countBuffer-parameter)~^~implicit VALIDATION_ERROR_1ae00009~^~Y~^~Unknown~^~vkCmdEndQuery~^~VUID-vkCmdEndQuery-commonparent~^~core~^~The spec valid usage text states 'Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdEndQuery-commonparent)~^~implicit -VALIDATION_ERROR_1ae00652~^~Y~^~Unknown~^~vkCmdEndQuery~^~VUID-vkCmdEndQuery-queryPool-00809~^~core~^~The spec valid usage text states 'The query identified by queryPool and query must currently be active' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdEndQuery-queryPool-00809)~^~ VALIDATION_ERROR_1ae00654~^~N~^~Unknown~^~vkCmdEndQuery~^~VUID-vkCmdEndQuery-query-00810~^~core~^~The spec valid usage text states 'query must be less than the number of queries in queryPool' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdEndQuery-query-00810)~^~ -VALIDATION_ERROR_1ae00656~^~N~^~Unknown~^~vkCmdEndQuery~^~VUID-vkCmdEndQuery-None-00811~^~(VK_KHR_multiview)~^~The spec valid usage text states 'All queries used by the command must be active' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdEndQuery-None-00811)~^~ -VALIDATION_ERROR_1ae00658~^~N~^~Unknown~^~vkCmdEndQuery~^~VUID-vkCmdEndQuery-query-00812~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdEndQuery-query-00812)~^~ +VALIDATION_ERROR_1ae00658~^~N~^~Unknown~^~vkCmdEndQuery~^~VUID-vkCmdEndQuery-query-00812~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdEndQuery-query-00812)~^~ +VALIDATION_ERROR_1ae00ebc~^~N~^~None~^~vkCmdEndQuery~^~VUID-vkCmdEndQuery-commandBuffer-01886~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'commandBuffer must not be a protected command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdEndQuery-commandBuffer-01886)~^~ +VALIDATION_ERROR_1ae00f06~^~Y~^~None~^~vkCmdEndQuery~^~VUID-vkCmdEndQuery-None-01923~^~core~^~The spec valid usage text states 'All queries used by the command must be active' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdEndQuery-None-01923)~^~ VALIDATION_ERROR_1ae02401~^~Y~^~None~^~vkCmdEndQuery~^~VUID-vkCmdEndQuery-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdEndQuery-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1ae02413~^~Y~^~None~^~vkCmdEndQuery~^~VUID-vkCmdEndQuery-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdEndQuery-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1ae02415~^~Y~^~Unknown~^~vkCmdEndQuery~^~VUID-vkCmdEndQuery-commandBuffer-cmdpool~^~core~^~The spec valid usage text states '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-vkCmdEndQuery-commandBuffer-cmdpool)~^~implicit @@ -2236,6 +2309,8 @@ VALIDATION_ERROR_1b2000ce~^~N~^~Unknown~^~vkCmdExecuteCommands~^~VUID-vkCmdExecuteCommands-commandBuffer-00103~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-00103)~^~ VALIDATION_ERROR_1b2000d0~^~Y~^~Unknown~^~vkCmdExecuteCommands~^~VUID-vkCmdExecuteCommands-commandBuffer-00104~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-00104)~^~ VALIDATION_ERROR_1b2000d2~^~N~^~Unknown~^~vkCmdExecuteCommands~^~VUID-vkCmdExecuteCommands-pCommandBuffers-00105~^~core~^~The spec valid usage text states 'Each element of pCommandBuffers must not begin any query types that are active in commandBuffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00105)~^~ +VALIDATION_ERROR_1b200e38~^~N~^~None~^~vkCmdExecuteCommands~^~VUID-vkCmdExecuteCommands-commandBuffer-01820~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-01820)~^~ +VALIDATION_ERROR_1b200e3a~^~N~^~None~^~vkCmdExecuteCommands~^~VUID-vkCmdExecuteCommands-commandBuffer-01821~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-01821)~^~ VALIDATION_ERROR_1b202401~^~Y~^~None~^~vkCmdExecuteCommands~^~VUID-vkCmdExecuteCommands-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1b202413~^~Y~^~None~^~vkCmdExecuteCommands~^~VUID-vkCmdExecuteCommands-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1b202415~^~Y~^~Unknown~^~vkCmdExecuteCommands~^~VUID-vkCmdExecuteCommands-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-cmdpool)~^~implicit @@ -2249,8 +2324,10 @@ VALIDATION_ERROR_1b400036~^~N~^~Unknown~^~vkCmdFillBuffer~^~VUID-vkCmdFillBuffer-size-00027~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdFillBuffer-size-00027)~^~ VALIDATION_ERROR_1b400038~^~Y~^~Unknown~^~vkCmdFillBuffer~^~VUID-vkCmdFillBuffer-size-00028~^~core~^~The spec valid usage text states 'If size is not equal to VK_WHOLE_SIZE, size must be a multiple of 4' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdFillBuffer-size-00028)~^~ VALIDATION_ERROR_1b40003a~^~Y~^~None~^~vkCmdFillBuffer~^~VUID-vkCmdFillBuffer-dstBuffer-00029~^~core~^~The spec valid usage text states 'dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdFillBuffer-dstBuffer-00029)~^~ -VALIDATION_ERROR_1b40003c~^~N~^~None~^~vkCmdFillBuffer~^~VUID-vkCmdFillBuffer-commandBuffer-00030~^~!(VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ +VALIDATION_ERROR_1b40003c~^~N~^~None~^~vkCmdFillBuffer~^~VUID-vkCmdFillBuffer-commandBuffer-00030~^~!(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states '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)~^~ VALIDATION_ERROR_1b40003e~^~Y~^~Unknown~^~vkCmdFillBuffer~^~VUID-vkCmdFillBuffer-dstBuffer-00031~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdFillBuffer-dstBuffer-00031)~^~ +VALIDATION_ERROR_1b400e26~^~N~^~None~^~vkCmdFillBuffer~^~VUID-vkCmdFillBuffer-commandBuffer-01811~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-01811)~^~ +VALIDATION_ERROR_1b400e28~^~N~^~None~^~vkCmdFillBuffer~^~VUID-vkCmdFillBuffer-commandBuffer-01812~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-01812)~^~ VALIDATION_ERROR_1b402401~^~Y~^~None~^~vkCmdFillBuffer~^~VUID-vkCmdFillBuffer-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1b402413~^~Y~^~None~^~vkCmdFillBuffer~^~VUID-vkCmdFillBuffer-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1b402415~^~Y~^~Unknown~^~vkCmdFillBuffer~^~VUID-vkCmdFillBuffer-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-cmdpool)~^~implicit @@ -2280,7 +2357,7 @@ VALIDATION_ERROR_1b80093e~^~Y~^~InvalidBarriers~^~vkCmdPipelineBarrier~^~VUID-vkCmdPipelineBarrier-srcStageMask-01183~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdPipelineBarrier-srcStageMask-01183)~^~ VALIDATION_ERROR_1b800940~^~Y~^~InvalidBarriers~^~vkCmdPipelineBarrier~^~VUID-vkCmdPipelineBarrier-pMemoryBarriers-01184~^~core~^~The spec valid usage text states 'Each element of pMemoryBarriers, pBufferMemoryBarriers and 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.0/html/vkspec.html#VUID-vkCmdPipelineBarrier-pMemoryBarriers-01184)~^~ VALIDATION_ERROR_1b800942~^~Y~^~Unknown~^~vkCmdPipelineBarrier~^~VUID-vkCmdPipelineBarrier-pMemoryBarriers-01185~^~core~^~The spec valid usage text states 'Each element of pMemoryBarriers, pBufferMemoryBarriers and 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.0/html/vkspec.html#VUID-vkCmdPipelineBarrier-pMemoryBarriers-01185)~^~ -VALIDATION_ERROR_1b800944~^~N~^~Unknown~^~vkCmdPipelineBarrier~^~VUID-vkCmdPipelineBarrier-dependencyFlags-01186~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-dependencyFlags-01186)~^~ +VALIDATION_ERROR_1b800944~^~N~^~Unknown~^~vkCmdPipelineBarrier~^~VUID-vkCmdPipelineBarrier-dependencyFlags-01186~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-dependencyFlags-01186)~^~ VALIDATION_ERROR_1b802401~^~Y~^~None~^~vkCmdPipelineBarrier~^~VUID-vkCmdPipelineBarrier-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdPipelineBarrier-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1b802413~^~Y~^~None~^~vkCmdPipelineBarrier~^~VUID-vkCmdPipelineBarrier-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdPipelineBarrier-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1b802415~^~Y~^~Unknown~^~vkCmdPipelineBarrier~^~VUID-vkCmdPipelineBarrier-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdPipelineBarrier-commandBuffer-cmdpool)~^~implicit @@ -2302,7 +2379,7 @@ VALIDATION_ERROR_1bc002e2~^~Y~^~Unknown~^~vkCmdPushConstants~^~VUID-vkCmdPushConstants-size-00369~^~core~^~The spec valid usage text states 'size must be a multiple of 4' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdPushConstants-size-00369)~^~ VALIDATION_ERROR_1bc002e4~^~Y~^~Unknown~^~vkCmdPushConstants~^~VUID-vkCmdPushConstants-offset-00370~^~core~^~The spec valid usage text states 'offset must be less than VkPhysicalDeviceLimits::maxPushConstantsSize' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdPushConstants-offset-00370)~^~ VALIDATION_ERROR_1bc002e6~^~Y~^~Unknown~^~vkCmdPushConstants~^~VUID-vkCmdPushConstants-size-00371~^~core~^~The spec valid usage text states 'size must be less than or equal to VkPhysicalDeviceLimits::maxPushConstantsSize minus offset' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdPushConstants-size-00371)~^~ -VALIDATION_ERROR_1bc00e06~^~N~^~None~^~vkCmdPushConstants~^~VUID-vkCmdPushConstants-offset-01795~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdPushConstants-offset-01795)~^~ +VALIDATION_ERROR_1bc00e06~^~Y~^~InvalidPushConstants~^~vkCmdPushConstants~^~VUID-vkCmdPushConstants-offset-01795~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdPushConstants-offset-01795)~^~ VALIDATION_ERROR_1bc00e08~^~Y~^~InvalidPushConstants~^~vkCmdPushConstants~^~VUID-vkCmdPushConstants-offset-01796~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdPushConstants-offset-01796)~^~ VALIDATION_ERROR_1bc02401~^~Y~^~None~^~vkCmdPushConstants~^~VUID-vkCmdPushConstants-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdPushConstants-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1bc02413~^~Y~^~None~^~vkCmdPushConstants~^~VUID-vkCmdPushConstants-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdPushConstants-commandBuffer-recording)~^~implicit @@ -2323,14 +2400,14 @@ VALIDATION_ERROR_1be0be01~^~Y~^~Unknown~^~vkCmdPushDescriptorSetKHR~^~VUID-vkCmdPushDescriptorSetKHR-layout-parameter~^~(VK_KHR_push_descriptor)~^~The spec valid usage text states 'layout must be a valid VkPipelineLayout handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-layout-parameter)~^~implicit VALIDATION_ERROR_1be13601~^~Y~^~Unknown~^~vkCmdPushDescriptorSetKHR~^~VUID-vkCmdPushDescriptorSetKHR-pDescriptorWrites-parameter~^~(VK_KHR_push_descriptor)~^~The spec valid usage text states 'pDescriptorWrites must be a valid pointer to an array of descriptorWriteCount valid VkWriteDescriptorSet structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-pDescriptorWrites-parameter)~^~implicit VALIDATION_ERROR_1be27e01~^~Y~^~Unknown~^~vkCmdPushDescriptorSetKHR~^~VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-parameter~^~(VK_KHR_push_descriptor)~^~The spec valid usage text states 'pipelineBindPoint must be a valid VkPipelineBindPoint value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-parameter)~^~implicit -VALIDATION_ERROR_1c000009~^~Y~^~Unknown~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-commonparent~^~(VK_KHR_push_descriptor)+(VK_KHR_descriptor_update_template)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commonparent)~^~implicit -VALIDATION_ERROR_1c0002dc~^~N~^~Unknown~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-00366~^~(VK_KHR_push_descriptor)+(VK_KHR_descriptor_update_template)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-00366)~^~ -VALIDATION_ERROR_1c000d2c~^~N~^~None~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-pData-01686~^~(VK_KHR_push_descriptor)+(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'pData must be a valid pointer to a memory that contains 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.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-pData-01686)~^~ -VALIDATION_ERROR_1c002401~^~Y~^~Unknown~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-parameter~^~(VK_KHR_push_descriptor)+(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-parameter)~^~implicit -VALIDATION_ERROR_1c002413~^~Y~^~None~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-recording~^~(VK_KHR_push_descriptor)+(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-recording)~^~implicit -VALIDATION_ERROR_1c002415~^~N~^~Unknown~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-cmdpool~^~(VK_KHR_push_descriptor)+(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-cmdpool)~^~implicit -VALIDATION_ERROR_1c005201~^~Y~^~Unknown~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-descriptorUpdateTemplate-parameter~^~(VK_KHR_push_descriptor)+(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-descriptorUpdateTemplate-parameter)~^~implicit -VALIDATION_ERROR_1c00be01~^~Y~^~Unknown~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-layout-parameter~^~(VK_KHR_push_descriptor)+(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'layout must be a valid VkPipelineLayout handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-layout-parameter)~^~implicit +VALIDATION_ERROR_1c000009~^~Y~^~Unknown~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-commonparent~^~(VK_KHR_push_descriptor)+(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commonparent)~^~implicit +VALIDATION_ERROR_1c0002dc~^~N~^~Unknown~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-00366~^~(VK_KHR_push_descriptor)+(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-00366)~^~ +VALIDATION_ERROR_1c000d2c~^~N~^~None~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-pData-01686~^~(VK_KHR_push_descriptor)+(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'pData must be a valid pointer to a memory that contains 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.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-pData-01686)~^~ +VALIDATION_ERROR_1c002401~^~Y~^~Unknown~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-parameter~^~(VK_KHR_push_descriptor)+(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-parameter)~^~implicit +VALIDATION_ERROR_1c002413~^~Y~^~None~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-recording~^~(VK_KHR_push_descriptor)+(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-recording)~^~implicit +VALIDATION_ERROR_1c002415~^~N~^~Unknown~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-cmdpool~^~(VK_KHR_push_descriptor)+(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-cmdpool)~^~implicit +VALIDATION_ERROR_1c005201~^~Y~^~Unknown~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-descriptorUpdateTemplate-parameter~^~(VK_KHR_push_descriptor)+(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-descriptorUpdateTemplate-parameter)~^~implicit +VALIDATION_ERROR_1c00be01~^~Y~^~Unknown~^~vkCmdPushDescriptorSetWithTemplateKHR~^~VUID-vkCmdPushDescriptorSetWithTemplateKHR-layout-parameter~^~(VK_KHR_push_descriptor)+(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'layout must be a valid VkPipelineLayout handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-layout-parameter)~^~implicit VALIDATION_ERROR_1c200017~^~N~^~Unknown~^~vkCmdReserveSpaceForCommandsNVX~^~VUID-vkCmdReserveSpaceForCommandsNVX-renderpass~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'This command must only be called inside of a render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdReserveSpaceForCommandsNVX-renderpass)~^~implicit VALIDATION_ERROR_1c200019~^~N~^~Unknown~^~vkCmdReserveSpaceForCommandsNVX~^~VUID-vkCmdReserveSpaceForCommandsNVX-bufferlevel~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'commandBuffer must be a secondary VkCommandBuffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdReserveSpaceForCommandsNVX-bufferlevel)~^~implicit VALIDATION_ERROR_1c200a62~^~N~^~Unknown~^~vkCmdReserveSpaceForCommandsNVX~^~VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-01329~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'The provided commandBuffer must not have had a prior space reservation since its creation or the last reset.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-01329)~^~ @@ -2345,7 +2422,7 @@ VALIDATION_ERROR_1c400904~^~Y~^~Unknown~^~vkCmdResetEvent~^~VUID-vkCmdResetEvent-stageMask-01154~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdResetEvent-stageMask-01154)~^~ VALIDATION_ERROR_1c400906~^~Y~^~Unknown~^~vkCmdResetEvent~^~VUID-vkCmdResetEvent-stageMask-01155~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdResetEvent-stageMask-01155)~^~ VALIDATION_ERROR_1c400908~^~N~^~Unknown~^~vkCmdResetEvent~^~VUID-vkCmdResetEvent-event-01156~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdResetEvent-event-01156)~^~ -VALIDATION_ERROR_1c40090a~^~N~^~Unknown~^~vkCmdResetEvent~^~VUID-vkCmdResetEvent-commandBuffer-01157~^~(VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer's current device mask must include exactly one physical device.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResetEvent-commandBuffer-01157)~^~ +VALIDATION_ERROR_1c40090a~^~N~^~Unknown~^~vkCmdResetEvent~^~VUID-vkCmdResetEvent-commandBuffer-01157~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer's current device mask must include exactly one physical device.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResetEvent-commandBuffer-01157)~^~ VALIDATION_ERROR_1c402401~^~Y~^~None~^~vkCmdResetEvent~^~VUID-vkCmdResetEvent-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResetEvent-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1c402413~^~Y~^~None~^~vkCmdResetEvent~^~VUID-vkCmdResetEvent-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResetEvent-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1c402415~^~Y~^~Unknown~^~vkCmdResetEvent~^~VUID-vkCmdResetEvent-commandBuffer-cmdpool~^~core~^~The spec valid usage text states '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-vkCmdResetEvent-commandBuffer-cmdpool)~^~implicit @@ -2382,6 +2459,9 @@ VALIDATION_ERROR_1c800d5c~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-dstSubresource-01710~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdResolveImage-dstSubresource-01710)~^~ VALIDATION_ERROR_1c800d5e~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-srcSubresource-01711~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdResolveImage-srcSubresource-01711)~^~ VALIDATION_ERROR_1c800d60~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-dstSubresource-01712~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdResolveImage-dstSubresource-01712)~^~ +VALIDATION_ERROR_1c800e5a~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-commandBuffer-01837~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-01837)~^~ +VALIDATION_ERROR_1c800e5c~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-commandBuffer-01838~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-01838)~^~ +VALIDATION_ERROR_1c800e5e~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-commandBuffer-01839~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-01839)~^~ VALIDATION_ERROR_1c802401~^~Y~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1c802413~^~Y~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1c802415~^~Y~^~Unknown~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-cmdpool)~^~implicit @@ -2391,29 +2471,29 @@ VALIDATION_ERROR_1c82ac1b~^~Y~^~Unknown~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-regionCount-arraylength~^~core~^~The spec valid usage text states 'regionCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-regionCount-arraylength)~^~implicit VALIDATION_ERROR_1c82ce01~^~Y~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-srcImage-parameter~^~core~^~The spec valid usage text states 'srcImage must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-srcImage-parameter)~^~implicit VALIDATION_ERROR_1c82d001~^~Y~^~Unknown~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-srcImageLayout-parameter~^~core~^~The spec valid usage text states 'srcImageLayout must be a valid VkImageLayout value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-srcImageLayout-parameter)~^~implicit -VALIDATION_ERROR_1ca004c8~^~Y~^~Unknown~^~vkCmdSetBlendConstants~^~VUID-vkCmdSetBlendConstants-None-00612~^~core~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_BLEND_CONSTANTS dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetBlendConstants-None-00612)~^~ +VALIDATION_ERROR_1ca004c8~^~Y~^~Unknown~^~vkCmdSetBlendConstants~^~VUID-vkCmdSetBlendConstants-None-00612~^~core~^~The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_BLEND_CONSTANTS dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetBlendConstants-None-00612)~^~ VALIDATION_ERROR_1ca02401~^~Y~^~None~^~vkCmdSetBlendConstants~^~VUID-vkCmdSetBlendConstants-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetBlendConstants-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1ca02413~^~Y~^~None~^~vkCmdSetBlendConstants~^~VUID-vkCmdSetBlendConstants-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetBlendConstants-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1ca02415~^~Y~^~Unknown~^~vkCmdSetBlendConstants~^~VUID-vkCmdSetBlendConstants-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetBlendConstants-commandBuffer-cmdpool)~^~implicit -VALIDATION_ERROR_1cc0062a~^~Y~^~Unknown~^~vkCmdSetDepthBias~^~VUID-vkCmdSetDepthBias-None-00789~^~core~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DEPTH_BIAS dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBias-None-00789)~^~ +VALIDATION_ERROR_1cc0062a~^~Y~^~Unknown~^~vkCmdSetDepthBias~^~VUID-vkCmdSetDepthBias-None-00789~^~core~^~The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DEPTH_BIAS dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBias-None-00789)~^~ VALIDATION_ERROR_1cc0062c~^~Y~^~None~^~vkCmdSetDepthBias~^~VUID-vkCmdSetDepthBias-depthBiasClamp-00790~^~core~^~The spec valid usage text states 'If the depth bias clamping feature is not enabled, depthBiasClamp must be 0.0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBias-depthBiasClamp-00790)~^~ VALIDATION_ERROR_1cc02401~^~Y~^~None~^~vkCmdSetDepthBias~^~VUID-vkCmdSetDepthBias-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBias-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1cc02413~^~Y~^~None~^~vkCmdSetDepthBias~^~VUID-vkCmdSetDepthBias-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBias-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1cc02415~^~Y~^~Unknown~^~vkCmdSetDepthBias~^~VUID-vkCmdSetDepthBias-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBias-commandBuffer-cmdpool)~^~implicit -VALIDATION_ERROR_1ce004ae~^~Y~^~Unknown~^~vkCmdSetDepthBounds~^~VUID-vkCmdSetDepthBounds-None-00599~^~core~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DEPTH_BOUNDS dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBounds-None-00599)~^~ +VALIDATION_ERROR_1ce004ae~^~Y~^~Unknown~^~vkCmdSetDepthBounds~^~VUID-vkCmdSetDepthBounds-None-00599~^~core~^~The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DEPTH_BOUNDS dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBounds-None-00599)~^~ VALIDATION_ERROR_1ce004b0~^~N~^~Unknown~^~vkCmdSetDepthBounds~^~VUID-vkCmdSetDepthBounds-minDepthBounds-00600~^~(VK_EXT_depth_range_unrestricted)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetDepthBounds-minDepthBounds-00600)~^~ VALIDATION_ERROR_1ce004b2~^~N~^~Unknown~^~vkCmdSetDepthBounds~^~VUID-vkCmdSetDepthBounds-maxDepthBounds-00601~^~(VK_EXT_depth_range_unrestricted)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetDepthBounds-maxDepthBounds-00601)~^~ VALIDATION_ERROR_1ce02401~^~Y~^~None~^~vkCmdSetDepthBounds~^~VUID-vkCmdSetDepthBounds-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBounds-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1ce02413~^~Y~^~None~^~vkCmdSetDepthBounds~^~VUID-vkCmdSetDepthBounds-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBounds-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1ce02415~^~Y~^~Unknown~^~vkCmdSetDepthBounds~^~VUID-vkCmdSetDepthBounds-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBounds-commandBuffer-cmdpool)~^~implicit -VALIDATION_ERROR_1d0000d8~^~N~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-deviceMask-00108~^~(VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must be a valid device mask value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-deviceMask-00108)~^~ -VALIDATION_ERROR_1d0000da~^~N~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-deviceMask-00109~^~(VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must not be zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-deviceMask-00109)~^~ -VALIDATION_ERROR_1d0000dc~^~N~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-deviceMask-00110~^~(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-deviceMask-00110)~^~ -VALIDATION_ERROR_1d0000de~^~N~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-deviceMask-00111~^~(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-deviceMask-00111)~^~ -VALIDATION_ERROR_1d002401~^~Y~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-commandBuffer-parameter~^~(VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-commandBuffer-parameter)~^~implicit -VALIDATION_ERROR_1d002413~^~N~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-commandBuffer-recording~^~(VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-commandBuffer-recording)~^~implicit -VALIDATION_ERROR_1d002415~^~N~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-commandBuffer-cmdpool~^~(VK_KHR_device_group)~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-commandBuffer-cmdpool)~^~implicit -VALIDATION_ERROR_1d20048e~^~N~^~Unknown~^~vkCmdSetDiscardRectangleEXT~^~VUID-vkCmdSetDiscardRectangleEXT-None-00583~^~(VK_EXT_discard_rectangles)~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-None-00583)~^~ +VALIDATION_ERROR_1d0000d8~^~N~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-deviceMask-00108~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must be a valid device mask value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-deviceMask-00108)~^~ +VALIDATION_ERROR_1d0000da~^~N~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-deviceMask-00109~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'deviceMask must not be zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-deviceMask-00109)~^~ +VALIDATION_ERROR_1d0000dc~^~N~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-deviceMask-00110~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-deviceMask-00110)~^~ +VALIDATION_ERROR_1d0000de~^~N~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-deviceMask-00111~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-deviceMask-00111)~^~ +VALIDATION_ERROR_1d002401~^~Y~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-commandBuffer-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-commandBuffer-parameter)~^~implicit +VALIDATION_ERROR_1d002413~^~N~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-commandBuffer-recording~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-commandBuffer-recording)~^~implicit +VALIDATION_ERROR_1d002415~^~N~^~Unknown~^~vkCmdSetDeviceMask~^~VUID-vkCmdSetDeviceMask-commandBuffer-cmdpool~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-commandBuffer-cmdpool)~^~implicit +VALIDATION_ERROR_1d20048e~^~N~^~Unknown~^~vkCmdSetDiscardRectangleEXT~^~VUID-vkCmdSetDiscardRectangleEXT-None-00583~^~(VK_EXT_discard_rectangles)~^~The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-None-00583)~^~ VALIDATION_ERROR_1d200492~^~N~^~Unknown~^~vkCmdSetDiscardRectangleEXT~^~VUID-vkCmdSetDiscardRectangleEXT-firstDiscardRectangle-00585~^~(VK_EXT_discard_rectangles)~^~The spec valid usage text states 'The sum of firstDiscardRectangle and discardRectangleCount must be less than or equal to VkPhysicalDeviceDiscardRectanglePropertiesEXT::maxDiscardRectangles' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-firstDiscardRectangle-00585)~^~ VALIDATION_ERROR_1d200496~^~N~^~Unknown~^~vkCmdSetDiscardRectangleEXT~^~VUID-vkCmdSetDiscardRectangleEXT-x-00587~^~(VK_EXT_discard_rectangles)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-x-00587)~^~ VALIDATION_ERROR_1d200498~^~N~^~Unknown~^~vkCmdSetDiscardRectangleEXT~^~VUID-vkCmdSetDiscardRectangleEXT-offset-00588~^~(VK_EXT_discard_rectangles)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-offset-00588)~^~ @@ -2428,50 +2508,50 @@ VALIDATION_ERROR_1d4008fa~^~N~^~Unknown~^~vkCmdSetEvent~^~VUID-vkCmdSetEvent-stageMask-01149~^~core~^~The spec valid usage text states 'stageMask must not include VK_PIPELINE_STAGE_HOST_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-01149)~^~ VALIDATION_ERROR_1d4008fc~^~Y~^~StageMaskGsTsEnabled~^~vkCmdSetEvent~^~VUID-vkCmdSetEvent-stageMask-01150~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-01150)~^~ VALIDATION_ERROR_1d4008fe~^~Y~^~StageMaskGsTsEnabled~^~vkCmdSetEvent~^~VUID-vkCmdSetEvent-stageMask-01151~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-01151)~^~ -VALIDATION_ERROR_1d400900~^~N~^~Unknown~^~vkCmdSetEvent~^~VUID-vkCmdSetEvent-commandBuffer-01152~^~(VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer's current device mask must include exactly one physical device.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetEvent-commandBuffer-01152)~^~ +VALIDATION_ERROR_1d400900~^~N~^~Unknown~^~vkCmdSetEvent~^~VUID-vkCmdSetEvent-commandBuffer-01152~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer's current device mask must include exactly one physical device.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetEvent-commandBuffer-01152)~^~ VALIDATION_ERROR_1d402401~^~Y~^~None~^~vkCmdSetEvent~^~VUID-vkCmdSetEvent-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetEvent-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1d402413~^~Y~^~None~^~vkCmdSetEvent~^~VUID-vkCmdSetEvent-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetEvent-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1d402415~^~Y~^~Unknown~^~vkCmdSetEvent~^~VUID-vkCmdSetEvent-commandBuffer-cmdpool~^~core~^~The spec valid usage text states '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-vkCmdSetEvent-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_1d407e01~^~Y~^~None~^~vkCmdSetEvent~^~VUID-vkCmdSetEvent-event-parameter~^~core~^~The spec valid usage text states 'event must be a valid VkEvent handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetEvent-event-parameter)~^~implicit VALIDATION_ERROR_1d42de01~^~N~^~Unknown~^~vkCmdSetEvent~^~VUID-vkCmdSetEvent-stageMask-parameter~^~core~^~The spec valid usage text states 'stageMask must be a valid combination of VkPipelineStageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-parameter)~^~implicit VALIDATION_ERROR_1d42de03~^~Y~^~Unknown~^~vkCmdSetEvent~^~VUID-vkCmdSetEvent-stageMask-requiredbitmask~^~core~^~The spec valid usage text states 'stageMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-requiredbitmask)~^~implicit -VALIDATION_ERROR_1d600626~^~Y~^~Unknown~^~vkCmdSetLineWidth~^~VUID-vkCmdSetLineWidth-None-00787~^~core~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_LINE_WIDTH dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetLineWidth-None-00787)~^~ +VALIDATION_ERROR_1d600626~^~Y~^~Unknown~^~vkCmdSetLineWidth~^~VUID-vkCmdSetLineWidth-None-00787~^~core~^~The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_LINE_WIDTH dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetLineWidth-None-00787)~^~ VALIDATION_ERROR_1d600628~^~Y~^~PSOLineWidthInvalid~^~vkCmdSetLineWidth~^~VUID-vkCmdSetLineWidth-lineWidth-00788~^~core~^~The spec valid usage text states 'If the wide lines feature is not enabled, lineWidth must be 1.0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetLineWidth-lineWidth-00788)~^~ VALIDATION_ERROR_1d602401~^~Y~^~None~^~vkCmdSetLineWidth~^~VUID-vkCmdSetLineWidth-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetLineWidth-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1d602413~^~Y~^~None~^~vkCmdSetLineWidth~^~VUID-vkCmdSetLineWidth-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetLineWidth-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1d602415~^~Y~^~Unknown~^~vkCmdSetLineWidth~^~VUID-vkCmdSetLineWidth-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetLineWidth-commandBuffer-cmdpool)~^~implicit -VALIDATION_ERROR_1d80049c~^~Y~^~Unknown~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-None-00590~^~core~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_SCISSOR dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-None-00590)~^~ +VALIDATION_ERROR_1d80049c~^~Y~^~Unknown~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-None-00590~^~core~^~The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_SCISSOR dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-None-00590)~^~ VALIDATION_ERROR_1d80049e~^~N~^~Unknown~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-firstScissor-00591~^~core~^~The spec valid usage text states 'firstScissor must be less than VkPhysicalDeviceLimits::maxViewports' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-firstScissor-00591)~^~ -VALIDATION_ERROR_1d8004a0~^~N~^~Unknown~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-firstScissor-00592~^~core~^~The spec valid usage text states 'The sum of firstScissor and scissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-firstScissor-00592)~^~ -VALIDATION_ERROR_1d8004a2~^~N~^~Unknown~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-firstScissor-00593~^~core~^~The spec valid usage text states 'If the multiple viewports feature is not enabled, firstScissor must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-firstScissor-00593)~^~ -VALIDATION_ERROR_1d8004a4~^~N~^~Unknown~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-scissorCount-00594~^~core~^~The spec valid usage text states 'If the multiple viewports feature is not enabled, scissorCount must be 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-scissorCount-00594)~^~ -VALIDATION_ERROR_1d8004a6~^~Y~^~ScissorBoundsChecking~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-x-00595~^~core~^~The spec valid usage text states 'The x and y members of offset must be greater than or equal to 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-x-00595)~^~ -VALIDATION_ERROR_1d8004a8~^~Y~^~ScissorBoundsChecking~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-offset-00596~^~core~^~The spec valid usage text states 'Evaluation of (offset.x + extent.width) must not cause a signed integer addition overflow' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-offset-00596)~^~ -VALIDATION_ERROR_1d8004aa~^~Y~^~ScissorBoundsChecking~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-offset-00597~^~core~^~The spec valid usage text states 'Evaluation of (offset.y + extent.height) must not cause a signed integer addition overflow' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-offset-00597)~^~ +VALIDATION_ERROR_1d8004a0~^~Y~^~SetDynScissorParamMultiviewportTests~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-firstScissor-00592~^~core~^~The spec valid usage text states 'The sum of firstScissor and scissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-firstScissor-00592)~^~ +VALIDATION_ERROR_1d8004a2~^~Y~^~SetDynScissorParamTests~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-firstScissor-00593~^~core~^~The spec valid usage text states 'If the multiple viewports feature is not enabled, firstScissor must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-firstScissor-00593)~^~ +VALIDATION_ERROR_1d8004a4~^~Y~^~SetDynScissorParamTests~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-scissorCount-00594~^~core~^~The spec valid usage text states 'If the multiple viewports feature is not enabled, scissorCount must be 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-scissorCount-00594)~^~ +VALIDATION_ERROR_1d8004a6~^~Y~^~SetDynScissorParamTests~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-x-00595~^~core~^~The spec valid usage text states 'The x and y members of offset must be greater than or equal to 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-x-00595)~^~ +VALIDATION_ERROR_1d8004a8~^~Y~^~SetDynScissorParamTests~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-offset-00596~^~core~^~The spec valid usage text states 'Evaluation of (offset.x + extent.width) must not cause a signed integer addition overflow' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-offset-00596)~^~ +VALIDATION_ERROR_1d8004aa~^~Y~^~SetDynScissorParamTests~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-offset-00597~^~core~^~The spec valid usage text states 'Evaluation of (offset.y + extent.height) must not cause a signed integer addition overflow' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-offset-00597)~^~ VALIDATION_ERROR_1d802401~^~Y~^~None~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1d802413~^~Y~^~None~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1d802415~^~Y~^~Unknown~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_1d822601~^~Y~^~Unknown~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-pScissors-parameter~^~core~^~The spec valid usage text states 'pScissors must be a valid pointer to an array of scissorCount VkRect2D structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-pScissors-parameter)~^~implicit VALIDATION_ERROR_1d82b61b~^~Y~^~Unknown~^~vkCmdSetScissor~^~VUID-vkCmdSetScissor-scissorCount-arraylength~^~core~^~The spec valid usage text states 'scissorCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-scissorCount-arraylength)~^~implicit -VALIDATION_ERROR_1da004b4~^~Y~^~Unknown~^~vkCmdSetStencilCompareMask~^~VUID-vkCmdSetStencilCompareMask-None-00602~^~core~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-None-00602)~^~ +VALIDATION_ERROR_1da004b4~^~Y~^~Unknown~^~vkCmdSetStencilCompareMask~^~VUID-vkCmdSetStencilCompareMask-None-00602~^~core~^~The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-None-00602)~^~ VALIDATION_ERROR_1da02401~^~Y~^~None~^~vkCmdSetStencilCompareMask~^~VUID-vkCmdSetStencilCompareMask-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1da02413~^~Y~^~None~^~vkCmdSetStencilCompareMask~^~VUID-vkCmdSetStencilCompareMask-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1da02415~^~Y~^~Unknown~^~vkCmdSetStencilCompareMask~^~VUID-vkCmdSetStencilCompareMask-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_1da08401~^~N~^~Unknown~^~vkCmdSetStencilCompareMask~^~VUID-vkCmdSetStencilCompareMask-faceMask-parameter~^~core~^~The spec valid usage text states 'faceMask must be a valid combination of VkStencilFaceFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-faceMask-parameter)~^~implicit VALIDATION_ERROR_1da08403~^~Y~^~Unknown~^~vkCmdSetStencilCompareMask~^~VUID-vkCmdSetStencilCompareMask-faceMask-requiredbitmask~^~core~^~The spec valid usage text states 'faceMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-faceMask-requiredbitmask)~^~implicit -VALIDATION_ERROR_1dc004b8~^~Y~^~Unknown~^~vkCmdSetStencilReference~^~VUID-vkCmdSetStencilReference-None-00604~^~core~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_REFERENCE dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-None-00604)~^~ +VALIDATION_ERROR_1dc004b8~^~Y~^~Unknown~^~vkCmdSetStencilReference~^~VUID-vkCmdSetStencilReference-None-00604~^~core~^~The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_REFERENCE dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-None-00604)~^~ VALIDATION_ERROR_1dc02401~^~Y~^~None~^~vkCmdSetStencilReference~^~VUID-vkCmdSetStencilReference-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1dc02413~^~Y~^~None~^~vkCmdSetStencilReference~^~VUID-vkCmdSetStencilReference-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1dc02415~^~Y~^~Unknown~^~vkCmdSetStencilReference~^~VUID-vkCmdSetStencilReference-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_1dc08401~^~N~^~Unknown~^~vkCmdSetStencilReference~^~VUID-vkCmdSetStencilReference-faceMask-parameter~^~core~^~The spec valid usage text states 'faceMask must be a valid combination of VkStencilFaceFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-faceMask-parameter)~^~implicit VALIDATION_ERROR_1dc08403~^~Y~^~Unknown~^~vkCmdSetStencilReference~^~VUID-vkCmdSetStencilReference-faceMask-requiredbitmask~^~core~^~The spec valid usage text states 'faceMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-faceMask-requiredbitmask)~^~implicit -VALIDATION_ERROR_1de004b6~^~Y~^~Unknown~^~vkCmdSetStencilWriteMask~^~VUID-vkCmdSetStencilWriteMask-None-00603~^~core~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_WRITE_MASK dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-None-00603)~^~ +VALIDATION_ERROR_1de004b6~^~Y~^~Unknown~^~vkCmdSetStencilWriteMask~^~VUID-vkCmdSetStencilWriteMask-None-00603~^~core~^~The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_WRITE_MASK dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-None-00603)~^~ VALIDATION_ERROR_1de02401~^~Y~^~None~^~vkCmdSetStencilWriteMask~^~VUID-vkCmdSetStencilWriteMask-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1de02413~^~Y~^~None~^~vkCmdSetStencilWriteMask~^~VUID-vkCmdSetStencilWriteMask-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1de02415~^~Y~^~Unknown~^~vkCmdSetStencilWriteMask~^~VUID-vkCmdSetStencilWriteMask-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_1de08401~^~N~^~Unknown~^~vkCmdSetStencilWriteMask~^~VUID-vkCmdSetStencilWriteMask-faceMask-parameter~^~core~^~The spec valid usage text states 'faceMask must be a valid combination of VkStencilFaceFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-faceMask-parameter)~^~implicit VALIDATION_ERROR_1de08403~^~Y~^~Unknown~^~vkCmdSetStencilWriteMask~^~VUID-vkCmdSetStencilWriteMask-faceMask-requiredbitmask~^~core~^~The spec valid usage text states 'faceMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-faceMask-requiredbitmask)~^~implicit -VALIDATION_ERROR_1e00098a~^~Y~^~Unknown~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-None-01221~^~core~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_VIEWPORT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-None-01221)~^~ +VALIDATION_ERROR_1e00098a~^~Y~^~Unknown~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-None-01221~^~core~^~The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_VIEWPORT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-None-01221)~^~ VALIDATION_ERROR_1e00098c~^~N~^~Unknown~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-firstViewport-01222~^~core~^~The spec valid usage text states 'firstViewport must be less than VkPhysicalDeviceLimits::maxViewports' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01222)~^~redundant VU VALIDATION_ERROR_1e00098e~^~Y~^~SetDynViewportParamMultiviewportTests~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-firstViewport-01223~^~core~^~The spec valid usage text states 'The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01223)~^~ VALIDATION_ERROR_1e000990~^~Y~^~SetDynViewportParamTests~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-firstViewport-01224~^~core~^~The spec valid usage text states 'If the multiple viewports feature is not enabled, firstViewport must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01224)~^~ @@ -2481,7 +2561,7 @@ VALIDATION_ERROR_1e002415~^~Y~^~CommandQueueFlags~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_1e030a1b~^~Y~^~SetDynViewportParamTests~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-viewportCount-arraylength~^~core~^~The spec valid usage text states 'viewportCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-viewportCount-arraylength)~^~implicit VALIDATION_ERROR_1e03fa01~^~Y~^~SetDynViewportParamTests~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-pViewports-parameter~^~core~^~The spec valid usage text states 'pViewports must be a valid pointer to an array of viewportCount VkViewport structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-pViewports-parameter)~^~implicit -VALIDATION_ERROR_1e200a54~^~N~^~Unknown~^~vkCmdSetViewportWScalingNV~^~VUID-vkCmdSetViewportWScalingNV-None-01322~^~(VK_NV_clip_space_w_scaling)~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-None-01322)~^~ +VALIDATION_ERROR_1e200a54~^~N~^~Unknown~^~vkCmdSetViewportWScalingNV~^~VUID-vkCmdSetViewportWScalingNV-None-01322~^~(VK_NV_clip_space_w_scaling)~^~The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-None-01322)~^~ VALIDATION_ERROR_1e200a56~^~N~^~Unknown~^~vkCmdSetViewportWScalingNV~^~VUID-vkCmdSetViewportWScalingNV-firstViewport-01323~^~(VK_NV_clip_space_w_scaling)~^~The spec valid usage text states 'firstViewport must be less than VkPhysicalDeviceLimits::maxViewports' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-firstViewport-01323)~^~ VALIDATION_ERROR_1e200a58~^~N~^~Unknown~^~vkCmdSetViewportWScalingNV~^~VUID-vkCmdSetViewportWScalingNV-firstViewport-01324~^~(VK_NV_clip_space_w_scaling)~^~The spec valid usage text states 'The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-firstViewport-01324)~^~ VALIDATION_ERROR_1e202401~^~Y~^~Unknown~^~vkCmdSetViewportWScalingNV~^~VUID-vkCmdSetViewportWScalingNV-commandBuffer-parameter~^~(VK_NV_clip_space_w_scaling)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-commandBuffer-parameter)~^~implicit @@ -2498,6 +2578,8 @@ VALIDATION_ERROR_1e400048~^~Y~^~Unknown~^~vkCmdUpdateBuffer~^~VUID-vkCmdUpdateBuffer-dstOffset-00036~^~core~^~The spec valid usage text states 'dstOffset must be a multiple of 4' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdUpdateBuffer-dstOffset-00036)~^~ VALIDATION_ERROR_1e40004a~^~Y~^~Unknown~^~vkCmdUpdateBuffer~^~VUID-vkCmdUpdateBuffer-dataSize-00037~^~core~^~The spec valid usage text states 'dataSize must be less than or equal to 65536' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdUpdateBuffer-dataSize-00037)~^~ VALIDATION_ERROR_1e40004c~^~Y~^~Unknown~^~vkCmdUpdateBuffer~^~VUID-vkCmdUpdateBuffer-dataSize-00038~^~core~^~The spec valid usage text states 'dataSize must be a multiple of 4' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdUpdateBuffer-dataSize-00038)~^~ +VALIDATION_ERROR_1e400e2a~^~N~^~None~^~vkCmdUpdateBuffer~^~VUID-vkCmdUpdateBuffer-commandBuffer-01813~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-01813)~^~ +VALIDATION_ERROR_1e400e2c~^~N~^~None~^~vkCmdUpdateBuffer~^~VUID-vkCmdUpdateBuffer-commandBuffer-01814~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-01814)~^~ VALIDATION_ERROR_1e402401~^~Y~^~None~^~vkCmdUpdateBuffer~^~VUID-vkCmdUpdateBuffer-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1e402413~^~Y~^~None~^~vkCmdUpdateBuffer~^~VUID-vkCmdUpdateBuffer-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1e402415~^~Y~^~Unknown~^~vkCmdUpdateBuffer~^~VUID-vkCmdUpdateBuffer-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-cmdpool)~^~implicit @@ -2514,7 +2596,7 @@ VALIDATION_ERROR_1e600918~^~Y~^~InvalidBarriers~^~vkCmdWaitEvents~^~VUID-vkCmdWaitEvents-srcStageMask-01164~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdWaitEvents-srcStageMask-01164)~^~ VALIDATION_ERROR_1e60091a~^~N~^~Unknown~^~vkCmdWaitEvents~^~VUID-vkCmdWaitEvents-pMemoryBarriers-01165~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdWaitEvents-pMemoryBarriers-01165)~^~ VALIDATION_ERROR_1e60091c~^~N~^~Unknown~^~vkCmdWaitEvents~^~VUID-vkCmdWaitEvents-pMemoryBarriers-01166~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdWaitEvents-pMemoryBarriers-01166)~^~ -VALIDATION_ERROR_1e60091e~^~N~^~Unknown~^~vkCmdWaitEvents~^~VUID-vkCmdWaitEvents-commandBuffer-01167~^~(VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer's current device mask must include exactly one physical device.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-commandBuffer-01167)~^~ +VALIDATION_ERROR_1e60091e~^~N~^~Unknown~^~vkCmdWaitEvents~^~VUID-vkCmdWaitEvents-commandBuffer-01167~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'commandBuffer's current device mask must include exactly one physical device.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-commandBuffer-01167)~^~ VALIDATION_ERROR_1e602401~^~Y~^~None~^~vkCmdWaitEvents~^~VUID-vkCmdWaitEvents-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdWaitEvents-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1e602413~^~Y~^~None~^~vkCmdWaitEvents~^~VUID-vkCmdWaitEvents-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdWaitEvents-commandBuffer-recording)~^~implicit VALIDATION_ERROR_1e602415~^~Y~^~Unknown~^~vkCmdWaitEvents~^~VUID-vkCmdWaitEvents-commandBuffer-cmdpool~^~core~^~The spec valid usage text states '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-vkCmdWaitEvents-commandBuffer-cmdpool)~^~implicit @@ -2530,8 +2612,8 @@ VALIDATION_ERROR_1e800009~^~Y~^~Unknown~^~vkCmdWriteTimestamp~^~VUID-vkCmdWriteTimestamp-commonparent~^~core~^~The spec valid usage text states 'Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdWriteTimestamp-commonparent)~^~implicit VALIDATION_ERROR_1e800678~^~N~^~Unknown~^~vkCmdWriteTimestamp~^~VUID-vkCmdWriteTimestamp-queryPool-00828~^~core~^~The spec valid usage text states 'The query identified by queryPool and query must be unavailable' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdWriteTimestamp-queryPool-00828)~^~ VALIDATION_ERROR_1e80067a~^~N~^~Unknown~^~vkCmdWriteTimestamp~^~VUID-vkCmdWriteTimestamp-timestampValidBits-00829~^~core~^~The spec valid usage text states 'The command pool's queue family must support a non-zero timestampValidBits' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdWriteTimestamp-timestampValidBits-00829)~^~ -VALIDATION_ERROR_1e80067c~^~N~^~Unknown~^~vkCmdWriteTimestamp~^~VUID-vkCmdWriteTimestamp-None-00830~^~(VK_KHR_multiview)~^~The spec valid usage text states 'All queries used by the command must be unavailable' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-None-00830)~^~ -VALIDATION_ERROR_1e80067e~^~N~^~Unknown~^~vkCmdWriteTimestamp~^~VUID-vkCmdWriteTimestamp-query-00831~^~(VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-query-00831)~^~ +VALIDATION_ERROR_1e80067c~^~N~^~Unknown~^~vkCmdWriteTimestamp~^~VUID-vkCmdWriteTimestamp-None-00830~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'All queries used by the command must be unavailable' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-None-00830)~^~ +VALIDATION_ERROR_1e80067e~^~N~^~Unknown~^~vkCmdWriteTimestamp~^~VUID-vkCmdWriteTimestamp-query-00831~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-query-00831)~^~ VALIDATION_ERROR_1e800b10~^~N~^~None~^~vkCmdWriteTimestamp~^~VUID-vkCmdWriteTimestamp-queryPool-01416~^~core~^~The spec valid usage text states 'queryPool must have been created with a queryType of VK_QUERY_TYPE_TIMESTAMP' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdWriteTimestamp-queryPool-01416)~^~ VALIDATION_ERROR_1e802401~^~Y~^~None~^~vkCmdWriteTimestamp~^~VUID-vkCmdWriteTimestamp-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdWriteTimestamp-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_1e802413~^~Y~^~None~^~vkCmdWriteTimestamp~^~VUID-vkCmdWriteTimestamp-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdWriteTimestamp-commandBuffer-recording)~^~implicit @@ -2576,10 +2658,10 @@ VALIDATION_ERROR_1f80ec01~^~N~^~Unknown~^~vkCreateDescriptorSetLayout~^~VUID-vkCreateDescriptorSetLayout-pAllocator-parameter~^~core~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCreateDescriptorSetLayout-pAllocator-parameter)~^~implicit VALIDATION_ERROR_1f811e01~^~N~^~Unknown~^~vkCreateDescriptorSetLayout~^~VUID-vkCreateDescriptorSetLayout-pCreateInfo-parameter~^~core~^~The spec valid usage text states 'pCreateInfo must be a valid pointer to a valid VkDescriptorSetLayoutCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCreateDescriptorSetLayout-pCreateInfo-parameter)~^~implicit VALIDATION_ERROR_1f822a01~^~Y~^~Unknown~^~vkCreateDescriptorSetLayout~^~VUID-vkCreateDescriptorSetLayout-pSetLayout-parameter~^~core~^~The spec valid usage text states 'pSetLayout must be a valid pointer to a VkDescriptorSetLayout handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCreateDescriptorSetLayout-pSetLayout-parameter)~^~implicit -VALIDATION_ERROR_1fa05601~^~Y~^~Unknown~^~vkCreateDescriptorUpdateTemplate~^~VUID-vkCreateDescriptorUpdateTemplate-device-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDescriptorUpdateTemplate-device-parameter)~^~implicit -VALIDATION_ERROR_1fa0ec01~^~N~^~Unknown~^~vkCreateDescriptorUpdateTemplate~^~VUID-vkCreateDescriptorUpdateTemplate-pAllocator-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDescriptorUpdateTemplate-pAllocator-parameter)~^~implicit -VALIDATION_ERROR_1fa11e01~^~N~^~Unknown~^~vkCreateDescriptorUpdateTemplate~^~VUID-vkCreateDescriptorUpdateTemplate-pCreateInfo-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'pCreateInfo must be a valid pointer to a valid VkDescriptorUpdateTemplateCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDescriptorUpdateTemplate-pCreateInfo-parameter)~^~implicit -VALIDATION_ERROR_1fa13401~^~Y~^~Unknown~^~vkCreateDescriptorUpdateTemplate~^~VUID-vkCreateDescriptorUpdateTemplate-pDescriptorUpdateTemplate-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'pDescriptorUpdateTemplate must be a valid pointer to a VkDescriptorUpdateTemplate handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDescriptorUpdateTemplate-pDescriptorUpdateTemplate-parameter)~^~implicit +VALIDATION_ERROR_1fa05601~^~Y~^~Unknown~^~vkCreateDescriptorUpdateTemplate~^~VUID-vkCreateDescriptorUpdateTemplate-device-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDescriptorUpdateTemplate-device-parameter)~^~implicit +VALIDATION_ERROR_1fa0ec01~^~N~^~Unknown~^~vkCreateDescriptorUpdateTemplate~^~VUID-vkCreateDescriptorUpdateTemplate-pAllocator-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDescriptorUpdateTemplate-pAllocator-parameter)~^~implicit +VALIDATION_ERROR_1fa11e01~^~N~^~Unknown~^~vkCreateDescriptorUpdateTemplate~^~VUID-vkCreateDescriptorUpdateTemplate-pCreateInfo-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'pCreateInfo must be a valid pointer to a valid VkDescriptorUpdateTemplateCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDescriptorUpdateTemplate-pCreateInfo-parameter)~^~implicit +VALIDATION_ERROR_1fa13401~^~Y~^~Unknown~^~vkCreateDescriptorUpdateTemplate~^~VUID-vkCreateDescriptorUpdateTemplate-pDescriptorUpdateTemplate-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'pDescriptorUpdateTemplate must be a valid pointer to a VkDescriptorUpdateTemplate handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDescriptorUpdateTemplate-pDescriptorUpdateTemplate-parameter)~^~implicit VALIDATION_ERROR_1fc00ad6~^~N~^~None~^~vkCreateDevice~^~VUID-vkCreateDevice-ppEnabledExtensionNames-01387~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCreateDevice-ppEnabledExtensionNames-01387)~^~ VALIDATION_ERROR_1fc0ec01~^~N~^~Unknown~^~vkCreateDevice~^~VUID-vkCreateDevice-pAllocator-parameter~^~core~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCreateDevice-pAllocator-parameter)~^~implicit VALIDATION_ERROR_1fc11e01~^~N~^~Unknown~^~vkCreateDevice~^~VUID-vkCreateDevice-pCreateInfo-parameter~^~core~^~The spec valid usage text states 'pCreateInfo must be a valid pointer to a valid VkDeviceCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCreateDevice-pCreateInfo-parameter)~^~implicit @@ -2757,12 +2839,12 @@ VALIDATION_ERROR_24604c07~^~Y~^~Unknown~^~vkDestroyDescriptorSetLayout~^~VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-parent~^~core~^~The spec valid usage text states 'If descriptorSetLayout is a valid handle, it must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-parent)~^~implicit VALIDATION_ERROR_24605601~^~Y~^~None~^~vkDestroyDescriptorSetLayout~^~VUID-vkDestroyDescriptorSetLayout-device-parameter~^~core~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkDestroyDescriptorSetLayout-device-parameter)~^~implicit VALIDATION_ERROR_2460ec01~^~N~^~Unknown~^~vkDestroyDescriptorSetLayout~^~VUID-vkDestroyDescriptorSetLayout-pAllocator-parameter~^~core~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkDestroyDescriptorSetLayout-pAllocator-parameter)~^~implicit -VALIDATION_ERROR_248002c8~^~Y~^~Unknown~^~vkDestroyDescriptorUpdateTemplate~^~VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00356~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00356)~^~ -VALIDATION_ERROR_248002ca~^~Y~^~Unknown~^~vkDestroyDescriptorUpdateTemplate~^~VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00357~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'If no VkAllocationCallbacks were provided when descriptorSetLayout was created, pAllocator must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00357)~^~ -VALIDATION_ERROR_24805201~^~Y~^~Unknown~^~vkDestroyDescriptorUpdateTemplate~^~VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'If descriptorUpdateTemplate is not VK_NULL_HANDLE, descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parameter)~^~implicit -VALIDATION_ERROR_24805207~^~Y~^~Unknown~^~vkDestroyDescriptorUpdateTemplate~^~VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parent~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'If descriptorUpdateTemplate is a valid handle, it must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parent)~^~implicit -VALIDATION_ERROR_24805601~^~Y~^~Unknown~^~vkDestroyDescriptorUpdateTemplate~^~VUID-vkDestroyDescriptorUpdateTemplate-device-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-device-parameter)~^~implicit -VALIDATION_ERROR_2480ec01~^~N~^~Unknown~^~vkDestroyDescriptorUpdateTemplate~^~VUID-vkDestroyDescriptorUpdateTemplate-pAllocator-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-pAllocator-parameter)~^~implicit +VALIDATION_ERROR_248002c8~^~Y~^~Unknown~^~vkDestroyDescriptorUpdateTemplate~^~VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00356~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00356)~^~ +VALIDATION_ERROR_248002ca~^~Y~^~Unknown~^~vkDestroyDescriptorUpdateTemplate~^~VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00357~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'If no VkAllocationCallbacks were provided when descriptorSetLayout was created, pAllocator must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00357)~^~ +VALIDATION_ERROR_24805201~^~Y~^~Unknown~^~vkDestroyDescriptorUpdateTemplate~^~VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'If descriptorUpdateTemplate is not VK_NULL_HANDLE, descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parameter)~^~implicit +VALIDATION_ERROR_24805207~^~Y~^~Unknown~^~vkDestroyDescriptorUpdateTemplate~^~VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parent~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'If descriptorUpdateTemplate is a valid handle, it must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parent)~^~implicit +VALIDATION_ERROR_24805601~^~Y~^~Unknown~^~vkDestroyDescriptorUpdateTemplate~^~VUID-vkDestroyDescriptorUpdateTemplate-device-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-device-parameter)~^~implicit +VALIDATION_ERROR_2480ec01~^~N~^~Unknown~^~vkDestroyDescriptorUpdateTemplate~^~VUID-vkDestroyDescriptorUpdateTemplate-pAllocator-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-pAllocator-parameter)~^~implicit VALIDATION_ERROR_24a002f4~^~Y~^~Unknown~^~vkDestroyDevice~^~VUID-vkDestroyDevice-device-00378~^~core~^~The spec valid usage text states 'All child objects created on device must have been destroyed prior to destroying device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkDestroyDevice-device-00378)~^~ VALIDATION_ERROR_24a002f6~^~Y~^~Unknown~^~vkDestroyDevice~^~VUID-vkDestroyDevice-device-00379~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkDestroyDevice-device-00379)~^~ VALIDATION_ERROR_24a002f8~^~Y~^~Unknown~^~vkDestroyDevice~^~VUID-vkDestroyDevice-device-00380~^~core~^~The spec valid usage text states 'If no VkAllocationCallbacks were provided when device was created, pAllocator must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkDestroyDevice-device-00380)~^~ @@ -2897,6 +2979,7 @@ VALIDATION_ERROR_27400078~^~Y~^~Unknown~^~vkEndCommandBuffer~^~VUID-vkEndCommandBuffer-commandBuffer-00060~^~core~^~The spec valid usage text states 'If commandBuffer is a primary command buffer, there must not be an active render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-00060)~^~ VALIDATION_ERROR_2740007a~^~Y~^~Unknown~^~vkEndCommandBuffer~^~VUID-vkEndCommandBuffer-commandBuffer-00061~^~core~^~The spec valid usage text states 'All queries made active during the recording of commandBuffer must have been made inactive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-00061)~^~ VALIDATION_ERROR_2740007c~^~N~^~Unknown~^~vkEndCommandBuffer~^~VUID-vkEndCommandBuffer-commandBuffer-00062~^~(VK_EXT_debug_marker)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-00062)~^~ +VALIDATION_ERROR_27400e2e~^~N~^~None~^~vkEndCommandBuffer~^~VUID-vkEndCommandBuffer-commandBuffer-01815~^~(VK_EXT_debug_utils)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-01815)~^~ VALIDATION_ERROR_27402401~^~Y~^~None~^~vkEndCommandBuffer~^~VUID-vkEndCommandBuffer-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_27619e01~^~N~^~Unknown~^~vkEnumerateDeviceExtensionProperties~^~VUID-vkEnumerateDeviceExtensionProperties-pLayerName-parameter~^~core~^~The spec valid usage text states 'If pLayerName is not NULL, pLayerName must be a null-terminated UTF-8 string' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkEnumerateDeviceExtensionProperties-pLayerName-parameter)~^~implicit VALIDATION_ERROR_2761f401~^~Y~^~Unknown~^~vkEnumerateDeviceExtensionProperties~^~VUID-vkEnumerateDeviceExtensionProperties-pProperties-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkEnumerateDeviceExtensionProperties-pProperties-parameter)~^~implicit @@ -2910,9 +2993,9 @@ VALIDATION_ERROR_27a1f601~^~N~^~Unknown~^~vkEnumerateInstanceExtensionProperties~^~VUID-vkEnumerateInstanceExtensionProperties-pPropertyCount-parameter~^~core~^~The spec valid usage text states 'pPropertyCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkEnumerateInstanceExtensionProperties-pPropertyCount-parameter)~^~implicit VALIDATION_ERROR_27c1f401~^~N~^~Unknown~^~vkEnumerateInstanceLayerProperties~^~VUID-vkEnumerateInstanceLayerProperties-pProperties-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkEnumerateInstanceLayerProperties-pProperties-parameter)~^~implicit VALIDATION_ERROR_27c1f601~^~N~^~Unknown~^~vkEnumerateInstanceLayerProperties~^~VUID-vkEnumerateInstanceLayerProperties-pPropertyCount-parameter~^~core~^~The spec valid usage text states 'pPropertyCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkEnumerateInstanceLayerProperties-pPropertyCount-parameter)~^~implicit -VALIDATION_ERROR_27e0bc01~^~Y~^~Unknown~^~vkEnumeratePhysicalDeviceGroups~^~VUID-vkEnumeratePhysicalDeviceGroups-instance-parameter~^~(VK_KHR_device_group_creation)~^~The spec valid usage text states 'instance must be a valid VkInstance handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceGroups-instance-parameter)~^~implicit -VALIDATION_ERROR_27e1d801~^~N~^~Unknown~^~vkEnumeratePhysicalDeviceGroups~^~VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupCount-parameter~^~(VK_KHR_device_group_creation)~^~The spec valid usage text states 'pPhysicalDeviceGroupCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupCount-parameter)~^~implicit -VALIDATION_ERROR_27e1da01~^~Y~^~Unknown~^~vkEnumeratePhysicalDeviceGroups~^~VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupProperties-parameter~^~(VK_KHR_device_group_creation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupProperties-parameter)~^~implicit +VALIDATION_ERROR_27e0bc01~^~Y~^~Unknown~^~vkEnumeratePhysicalDeviceGroups~^~VUID-vkEnumeratePhysicalDeviceGroups-instance-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group_creation)~^~The spec valid usage text states 'instance must be a valid VkInstance handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceGroups-instance-parameter)~^~implicit +VALIDATION_ERROR_27e1d801~^~N~^~Unknown~^~vkEnumeratePhysicalDeviceGroups~^~VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupCount-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group_creation)~^~The spec valid usage text states 'pPhysicalDeviceGroupCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupCount-parameter)~^~implicit +VALIDATION_ERROR_27e1da01~^~Y~^~Unknown~^~vkEnumeratePhysicalDeviceGroups~^~VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupProperties-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group_creation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupProperties-parameter)~^~implicit VALIDATION_ERROR_2800bc01~^~Y~^~None~^~vkEnumeratePhysicalDevices~^~VUID-vkEnumeratePhysicalDevices-instance-parameter~^~core~^~The spec valid usage text states 'instance must be a valid VkInstance handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkEnumeratePhysicalDevices-instance-parameter)~^~implicit VALIDATION_ERROR_2801d601~^~N~^~Unknown~^~vkEnumeratePhysicalDevices~^~VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter~^~core~^~The spec valid usage text states 'pPhysicalDeviceCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter)~^~implicit VALIDATION_ERROR_2801dc01~^~Y~^~Unknown~^~vkEnumeratePhysicalDevices~^~VUID-vkEnumeratePhysicalDevices-pPhysicalDevices-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkEnumeratePhysicalDevices-pPhysicalDevices-parameter)~^~implicit @@ -2951,12 +3034,12 @@ VALIDATION_ERROR_28c05601~^~Y~^~Unknown~^~vkGetDeviceGroupPeerMemoryFeatures~^~VUID-vkGetDeviceGroupPeerMemoryFeatures-device-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPeerMemoryFeatures-device-parameter)~^~implicit VALIDATION_ERROR_28c1d401~^~Y~^~Unknown~^~vkGetDeviceGroupPeerMemoryFeatures~^~VUID-vkGetDeviceGroupPeerMemoryFeatures-pPeerMemoryFeatures-parameter~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'pPeerMemoryFeatures must be a valid pointer to a VkPeerMemoryFeatureFlags value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPeerMemoryFeatures-pPeerMemoryFeatures-parameter)~^~implicit VALIDATION_ERROR_28c1d403~^~N~^~Unknown~^~vkGetDeviceGroupPeerMemoryFeatures~^~VUID-vkGetDeviceGroupPeerMemoryFeatures-pPeerMemoryFeatures-requiredbitmask~^~(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'pPeerMemoryFeatures must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPeerMemoryFeatures-pPeerMemoryFeatures-requiredbitmask)~^~implicit -VALIDATION_ERROR_28e05601~^~Y~^~Unknown~^~vkGetDeviceGroupPresentCapabilitiesKHR~^~VUID-vkGetDeviceGroupPresentCapabilitiesKHR-device-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPresentCapabilitiesKHR-device-parameter)~^~implicit -VALIDATION_ERROR_28e13c01~^~N~^~Unknown~^~vkGetDeviceGroupPresentCapabilitiesKHR~^~VUID-vkGetDeviceGroupPresentCapabilitiesKHR-pDeviceGroupPresentCapabilities-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'pDeviceGroupPresentCapabilities must be a valid pointer to a VkDeviceGroupPresentCapabilitiesKHR structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPresentCapabilitiesKHR-pDeviceGroupPresentCapabilities-parameter)~^~implicit -VALIDATION_ERROR_29000009~^~Y~^~None~^~vkGetDeviceGroupSurfacePresentModesKHR~^~VUID-vkGetDeviceGroupSurfacePresentModesKHR-commonparent~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'Both of device, and surface must have been created, allocated, or retrieved from the same VkInstance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModesKHR-commonparent)~^~implicit -VALIDATION_ERROR_29005601~^~Y~^~Unknown~^~vkGetDeviceGroupSurfacePresentModesKHR~^~VUID-vkGetDeviceGroupSurfacePresentModesKHR-device-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModesKHR-device-parameter)~^~implicit -VALIDATION_ERROR_2901be01~^~N~^~Unknown~^~vkGetDeviceGroupSurfacePresentModesKHR~^~VUID-vkGetDeviceGroupSurfacePresentModesKHR-pModes-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'pModes must be a valid pointer to a VkDeviceGroupPresentModeFlagsKHR value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModesKHR-pModes-parameter)~^~implicit -VALIDATION_ERROR_2902ec01~^~Y~^~Unknown~^~vkGetDeviceGroupSurfacePresentModesKHR~^~VUID-vkGetDeviceGroupSurfacePresentModesKHR-surface-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'surface must be a valid VkSurfaceKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModesKHR-surface-parameter)~^~implicit +VALIDATION_ERROR_28e05601~^~Y~^~Unknown~^~vkGetDeviceGroupPresentCapabilitiesKHR~^~VUID-vkGetDeviceGroupPresentCapabilitiesKHR-device-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPresentCapabilitiesKHR-device-parameter)~^~implicit +VALIDATION_ERROR_28e13c01~^~N~^~Unknown~^~vkGetDeviceGroupPresentCapabilitiesKHR~^~VUID-vkGetDeviceGroupPresentCapabilitiesKHR-pDeviceGroupPresentCapabilities-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'pDeviceGroupPresentCapabilities must be a valid pointer to a VkDeviceGroupPresentCapabilitiesKHR structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPresentCapabilitiesKHR-pDeviceGroupPresentCapabilities-parameter)~^~implicit +VALIDATION_ERROR_29000009~^~Y~^~None~^~vkGetDeviceGroupSurfacePresentModesKHR~^~VUID-vkGetDeviceGroupSurfacePresentModesKHR-commonparent~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'Both of device, and surface must have been created, allocated, or retrieved from the same VkInstance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModesKHR-commonparent)~^~implicit +VALIDATION_ERROR_29005601~^~Y~^~Unknown~^~vkGetDeviceGroupSurfacePresentModesKHR~^~VUID-vkGetDeviceGroupSurfacePresentModesKHR-device-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModesKHR-device-parameter)~^~implicit +VALIDATION_ERROR_2901be01~^~N~^~Unknown~^~vkGetDeviceGroupSurfacePresentModesKHR~^~VUID-vkGetDeviceGroupSurfacePresentModesKHR-pModes-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'pModes must be a valid pointer to a VkDeviceGroupPresentModeFlagsKHR value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModesKHR-pModes-parameter)~^~implicit +VALIDATION_ERROR_2902ec01~^~Y~^~Unknown~^~vkGetDeviceGroupSurfacePresentModesKHR~^~VUID-vkGetDeviceGroupSurfacePresentModesKHR-surface-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'surface must be a valid VkSurfaceKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModesKHR-surface-parameter)~^~implicit VALIDATION_ERROR_29200564~^~N~^~Unknown~^~vkGetDeviceMemoryCommitment~^~VUID-vkGetDeviceMemoryCommitment-memory-00690~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetDeviceMemoryCommitment-memory-00690)~^~ VALIDATION_ERROR_29205601~^~Y~^~None~^~vkGetDeviceMemoryCommitment~^~VUID-vkGetDeviceMemoryCommitment-device-parameter~^~core~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetDeviceMemoryCommitment-device-parameter)~^~implicit VALIDATION_ERROR_2920c601~^~Y~^~None~^~vkGetDeviceMemoryCommitment~^~VUID-vkGetDeviceMemoryCommitment-memory-parameter~^~core~^~The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetDeviceMemoryCommitment-memory-parameter)~^~implicit @@ -2966,6 +3049,7 @@ VALIDATION_ERROR_2941c001~^~N~^~Unknown~^~vkGetDeviceProcAddr~^~VUID-vkGetDeviceProcAddr-pName-parameter~^~core~^~The spec valid usage text states 'pName must be a null-terminated UTF-8 string' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetDeviceProcAddr-pName-parameter)~^~implicit, The loader uses strcmp to dispatch and can fail to dispatch when name is not null-terminated. i.e. Validation layers are never called. VALIDATION_ERROR_29600300~^~Y~^~Unknown~^~vkGetDeviceQueue~^~VUID-vkGetDeviceQueue-queueFamilyIndex-00384~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetDeviceQueue-queueFamilyIndex-00384)~^~ VALIDATION_ERROR_29600302~^~Y~^~Unknown~^~vkGetDeviceQueue~^~VUID-vkGetDeviceQueue-queueIndex-00385~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetDeviceQueue-queueIndex-00385)~^~ +VALIDATION_ERROR_29600e62~^~N~^~None~^~vkGetDeviceQueue~^~VUID-vkGetDeviceQueue-flags-01841~^~core~^~The spec valid usage text states 'VkDeviceQueueCreateInfo::flags must have been set to zero when device was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetDeviceQueue-flags-01841)~^~ VALIDATION_ERROR_29605601~^~Y~^~None~^~vkGetDeviceQueue~^~VUID-vkGetDeviceQueue-device-parameter~^~core~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetDeviceQueue-device-parameter)~^~implicit VALIDATION_ERROR_2961fc01~^~Y~^~Unknown~^~vkGetDeviceQueue~^~VUID-vkGetDeviceQueue-pQueue-parameter~^~core~^~The spec valid usage text states 'pQueue must be a valid pointer to a VkQueue handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetDeviceQueue-pQueue-parameter)~^~implicit VALIDATION_ERROR_29806001~^~Y~^~Unknown~^~vkGetDisplayModePropertiesKHR~^~VUID-vkGetDisplayModePropertiesKHR-display-parameter~^~(VK_KHR_surface)+(VK_KHR_display)~^~The spec valid usage text states 'display must be a valid VkDisplayKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDisplayModePropertiesKHR-display-parameter)~^~implicit @@ -2985,6 +3069,7 @@ VALIDATION_ERROR_2a005601~^~Y~^~None~^~vkGetFenceStatus~^~VUID-vkGetFenceStatus-device-parameter~^~core~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetFenceStatus-device-parameter)~^~implicit VALIDATION_ERROR_2a008801~^~Y~^~None~^~vkGetFenceStatus~^~VUID-vkGetFenceStatus-fence-parameter~^~core~^~The spec valid usage text states 'fence must be a valid VkFence handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetFenceStatus-fence-parameter)~^~implicit VALIDATION_ERROR_2a008807~^~Y~^~Unknown~^~vkGetFenceStatus~^~VUID-vkGetFenceStatus-fence-parent~^~core~^~The spec valid usage text states 'fence must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetFenceStatus-fence-parent)~^~implicit +VALIDATION_ERROR_2a200c68~^~N~^~None~^~vkGetImageMemoryRequirements~^~VUID-vkGetImageMemoryRequirements-image-01588~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'image must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT flag set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements-image-01588)~^~ VALIDATION_ERROR_2a205601~^~Y~^~None~^~vkGetImageMemoryRequirements~^~VUID-vkGetImageMemoryRequirements-device-parameter~^~core~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageMemoryRequirements-device-parameter)~^~implicit VALIDATION_ERROR_2a20a001~^~Y~^~CreateUnknownObject~^~vkGetImageMemoryRequirements~^~VUID-vkGetImageMemoryRequirements-image-parameter~^~core~^~The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageMemoryRequirements-image-parameter)~^~implicit VALIDATION_ERROR_2a20a007~^~Y~^~Unknown~^~vkGetImageMemoryRequirements~^~VUID-vkGetImageMemoryRequirements-image-parent~^~core~^~The spec valid usage text states 'image must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageMemoryRequirements-image-parent)~^~implicit @@ -2996,10 +3081,11 @@ VALIDATION_ERROR_2a423801~^~Y~^~Unknown~^~vkGetImageSparseMemoryRequirements~^~VUID-vkGetImageSparseMemoryRequirements-pSparseMemoryRequirements-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements-pSparseMemoryRequirements-parameter)~^~implicit VALIDATION_ERROR_2a6007c8~^~Y~^~Unknown~^~vkGetImageSubresourceLayout~^~VUID-vkGetImageSubresourceLayout-image-00996~^~core~^~The spec valid usage text states 'image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageSubresourceLayout-image-00996)~^~ VALIDATION_ERROR_2a6007ca~^~Y~^~Unknown~^~vkGetImageSubresourceLayout~^~VUID-vkGetImageSubresourceLayout-aspectMask-00997~^~core~^~The spec valid usage text states 'The aspectMask member of pSubresource must only have a single bit set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageSubresourceLayout-aspectMask-00997)~^~ -VALIDATION_ERROR_2a600c5a~^~Y~^~MultiplaneImageLayoutBadAspectFlags~^~vkGetImageSubresourceLayout~^~VUID-vkGetImageSubresourceLayout-format-01581~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the format of image 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.0-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-format-01581)~^~ -VALIDATION_ERROR_2a600c5c~^~Y~^~MultiplaneImageLayoutBadAspectFlags~^~vkGetImageSubresourceLayout~^~VUID-vkGetImageSubresourceLayout-format-01582~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the format of image 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.0-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-format-01582)~^~ +VALIDATION_ERROR_2a600c5a~^~Y~^~MultiplaneImageLayoutBadAspectFlags~^~vkGetImageSubresourceLayout~^~VUID-vkGetImageSubresourceLayout-format-01581~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the format of image 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.0-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-format-01581)~^~ +VALIDATION_ERROR_2a600c5c~^~Y~^~MultiplaneImageLayoutBadAspectFlags~^~vkGetImageSubresourceLayout~^~VUID-vkGetImageSubresourceLayout-format-01582~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the format of image 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.0-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-format-01582)~^~ VALIDATION_ERROR_2a600d68~^~Y~^~ExerciseGetImageSubresourceLayout~^~vkGetImageSubresourceLayout~^~VUID-vkGetImageSubresourceLayout-mipLevel-01716~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetImageSubresourceLayout-mipLevel-01716)~^~ VALIDATION_ERROR_2a600d6a~^~Y~^~ExerciseGetImageSubresourceLayout~^~vkGetImageSubresourceLayout~^~VUID-vkGetImageSubresourceLayout-arrayLayer-01717~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetImageSubresourceLayout-arrayLayer-01717)~^~ +VALIDATION_ERROR_2a600ece~^~N~^~None~^~vkGetImageSubresourceLayout~^~VUID-vkGetImageSubresourceLayout-image-01895~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-image-01895)~^~ VALIDATION_ERROR_2a605601~^~Y~^~None~^~vkGetImageSubresourceLayout~^~VUID-vkGetImageSubresourceLayout-device-parameter~^~core~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageSubresourceLayout-device-parameter)~^~implicit VALIDATION_ERROR_2a60a001~^~Y~^~None~^~vkGetImageSubresourceLayout~^~VUID-vkGetImageSubresourceLayout-image-parameter~^~core~^~The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageSubresourceLayout-image-parameter)~^~implicit VALIDATION_ERROR_2a60a007~^~Y~^~Unknown~^~vkGetImageSubresourceLayout~^~VUID-vkGetImageSubresourceLayout-image-parent~^~core~^~The spec valid usage text states 'image must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageSubresourceLayout-image-parent)~^~implicit @@ -3041,9 +3127,9 @@ VALIDATION_ERROR_2b81f401~^~Y~^~Unknown~^~vkGetPhysicalDeviceDisplayPropertiesKHR~^~VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pProperties-parameter~^~(VK_KHR_surface)+(VK_KHR_display)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pProperties-parameter)~^~implicit VALIDATION_ERROR_2b81f601~^~N~^~Unknown~^~vkGetPhysicalDeviceDisplayPropertiesKHR~^~VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pPropertyCount-parameter~^~(VK_KHR_surface)+(VK_KHR_display)~^~The spec valid usage text states 'pPropertyCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pPropertyCount-parameter)~^~implicit VALIDATION_ERROR_2b827a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceDisplayPropertiesKHR~^~VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-physicalDevice-parameter~^~(VK_KHR_surface)+(VK_KHR_display)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-physicalDevice-parameter)~^~implicit -VALIDATION_ERROR_2ba16201~^~N~^~Unknown~^~vkGetPhysicalDeviceExternalBufferProperties~^~VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferInfo-parameter~^~(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'pExternalBufferInfo must be a valid pointer to a valid VkPhysicalDeviceExternalBufferInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferInfo-parameter)~^~implicit -VALIDATION_ERROR_2ba16401~^~N~^~Unknown~^~vkGetPhysicalDeviceExternalBufferProperties~^~VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferProperties-parameter~^~(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'pExternalBufferProperties must be a valid pointer to a VkExternalBufferProperties structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferProperties-parameter)~^~implicit -VALIDATION_ERROR_2ba27a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceExternalBufferProperties~^~VUID-vkGetPhysicalDeviceExternalBufferProperties-physicalDevice-parameter~^~(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalBufferProperties-physicalDevice-parameter)~^~implicit +VALIDATION_ERROR_2ba16201~^~N~^~Unknown~^~vkGetPhysicalDeviceExternalBufferProperties~^~VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferInfo-parameter~^~(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'pExternalBufferInfo must be a valid pointer to a valid VkPhysicalDeviceExternalBufferInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferInfo-parameter)~^~implicit +VALIDATION_ERROR_2ba16401~^~N~^~Unknown~^~vkGetPhysicalDeviceExternalBufferProperties~^~VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferProperties-parameter~^~(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'pExternalBufferProperties must be a valid pointer to a VkExternalBufferProperties structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferProperties-parameter)~^~implicit +VALIDATION_ERROR_2ba27a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceExternalBufferProperties~^~VUID-vkGetPhysicalDeviceExternalBufferProperties-physicalDevice-parameter~^~(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalBufferProperties-physicalDevice-parameter)~^~implicit VALIDATION_ERROR_2bc08201~^~Y~^~Unknown~^~vkGetPhysicalDeviceExternalImageFormatPropertiesNV~^~VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-externalHandleType-parameter~^~(VK_NV_external_memory_capabilities)~^~The spec valid usage text states 'externalHandleType must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-externalHandleType-parameter)~^~implicit VALIDATION_ERROR_2bc09001~^~Y~^~Unknown~^~vkGetPhysicalDeviceExternalImageFormatPropertiesNV~^~VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-flags-parameter~^~(VK_NV_external_memory_capabilities)~^~The spec valid usage text states 'flags must be a valid combination of VkImageCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-flags-parameter)~^~implicit, TBD in parameter validation layer. VALIDATION_ERROR_2bc09201~^~Y~^~Unknown~^~vkGetPhysicalDeviceExternalImageFormatPropertiesNV~^~VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-format-parameter~^~(VK_NV_external_memory_capabilities)~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-format-parameter)~^~implicit @@ -3053,19 +3139,19 @@ VALIDATION_ERROR_2bc30401~^~Y~^~Unknown~^~vkGetPhysicalDeviceExternalImageFormatPropertiesNV~^~VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-type-parameter~^~(VK_NV_external_memory_capabilities)~^~The spec valid usage text states 'type must be a valid VkImageType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-type-parameter)~^~implicit VALIDATION_ERROR_2bc30601~^~N~^~Unknown~^~vkGetPhysicalDeviceExternalImageFormatPropertiesNV~^~VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-parameter~^~(VK_NV_external_memory_capabilities)~^~The spec valid usage text states 'usage must be a valid combination of VkImageUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-parameter)~^~implicit VALIDATION_ERROR_2bc30603~^~Y~^~Unknown~^~vkGetPhysicalDeviceExternalImageFormatPropertiesNV~^~VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-requiredbitmask~^~(VK_NV_external_memory_capabilities)~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-requiredbitmask)~^~implicit -VALIDATION_ERROR_2be16801~^~N~^~Unknown~^~vkGetPhysicalDeviceExternalSemaphoreProperties~^~VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreInfo-parameter~^~(VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'pExternalSemaphoreInfo must be a valid pointer to a valid VkPhysicalDeviceExternalSemaphoreInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreInfo-parameter)~^~implicit -VALIDATION_ERROR_2be16a01~^~N~^~Unknown~^~vkGetPhysicalDeviceExternalSemaphoreProperties~^~VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreProperties-parameter~^~(VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'pExternalSemaphoreProperties must be a valid pointer to a VkExternalSemaphoreProperties structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreProperties-parameter)~^~implicit -VALIDATION_ERROR_2be27a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceExternalSemaphoreProperties~^~VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-physicalDevice-parameter~^~(VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-physicalDevice-parameter)~^~implicit +VALIDATION_ERROR_2be16801~^~N~^~Unknown~^~vkGetPhysicalDeviceExternalSemaphoreProperties~^~VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreInfo-parameter~^~(VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'pExternalSemaphoreInfo must be a valid pointer to a valid VkPhysicalDeviceExternalSemaphoreInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreInfo-parameter)~^~implicit +VALIDATION_ERROR_2be16a01~^~N~^~Unknown~^~vkGetPhysicalDeviceExternalSemaphoreProperties~^~VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreProperties-parameter~^~(VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'pExternalSemaphoreProperties must be a valid pointer to a VkExternalSemaphoreProperties structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreProperties-parameter)~^~implicit +VALIDATION_ERROR_2be27a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceExternalSemaphoreProperties~^~VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-physicalDevice-parameter~^~(VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-physicalDevice-parameter)~^~implicit VALIDATION_ERROR_2c016e01~^~Y~^~None~^~vkGetPhysicalDeviceFeatures~^~VUID-vkGetPhysicalDeviceFeatures-pFeatures-parameter~^~core~^~The spec valid usage text states 'pFeatures must be a valid pointer to a VkPhysicalDeviceFeatures structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceFeatures-pFeatures-parameter)~^~implicit VALIDATION_ERROR_2c027a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceFeatures~^~VUID-vkGetPhysicalDeviceFeatures-physicalDevice-parameter~^~core~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceFeatures-physicalDevice-parameter)~^~implicit -VALIDATION_ERROR_2c216e01~^~N~^~Unknown~^~vkGetPhysicalDeviceFeatures2~^~VUID-vkGetPhysicalDeviceFeatures2-pFeatures-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pFeatures must be a valid pointer to a VkPhysicalDeviceFeatures2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFeatures2-pFeatures-parameter)~^~implicit -VALIDATION_ERROR_2c227a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceFeatures2~^~VUID-vkGetPhysicalDeviceFeatures2-physicalDevice-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFeatures2-physicalDevice-parameter)~^~implicit +VALIDATION_ERROR_2c216e01~^~N~^~Unknown~^~vkGetPhysicalDeviceFeatures2~^~VUID-vkGetPhysicalDeviceFeatures2-pFeatures-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pFeatures must be a valid pointer to a VkPhysicalDeviceFeatures2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFeatures2-pFeatures-parameter)~^~implicit +VALIDATION_ERROR_2c227a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceFeatures2~^~VUID-vkGetPhysicalDeviceFeatures2-physicalDevice-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFeatures2-physicalDevice-parameter)~^~implicit VALIDATION_ERROR_2c409201~^~Y~^~Unknown~^~vkGetPhysicalDeviceFormatProperties~^~VUID-vkGetPhysicalDeviceFormatProperties-format-parameter~^~core~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties-format-parameter)~^~implicit VALIDATION_ERROR_2c417601~^~Y~^~Unknown~^~vkGetPhysicalDeviceFormatProperties~^~VUID-vkGetPhysicalDeviceFormatProperties-pFormatProperties-parameter~^~core~^~The spec valid usage text states 'pFormatProperties must be a valid pointer to a VkFormatProperties structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties-pFormatProperties-parameter)~^~implicit VALIDATION_ERROR_2c427a01~^~Y~^~None~^~vkGetPhysicalDeviceFormatProperties~^~VUID-vkGetPhysicalDeviceFormatProperties-physicalDevice-parameter~^~core~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties-physicalDevice-parameter)~^~implicit -VALIDATION_ERROR_2c609201~^~Y~^~Unknown~^~vkGetPhysicalDeviceFormatProperties2~^~VUID-vkGetPhysicalDeviceFormatProperties2-format-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties2-format-parameter)~^~implicit -VALIDATION_ERROR_2c617601~^~N~^~Unknown~^~vkGetPhysicalDeviceFormatProperties2~^~VUID-vkGetPhysicalDeviceFormatProperties2-pFormatProperties-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pFormatProperties must be a valid pointer to a VkFormatProperties2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties2-pFormatProperties-parameter)~^~implicit -VALIDATION_ERROR_2c627a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceFormatProperties2~^~VUID-vkGetPhysicalDeviceFormatProperties2-physicalDevice-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties2-physicalDevice-parameter)~^~implicit +VALIDATION_ERROR_2c609201~^~Y~^~Unknown~^~vkGetPhysicalDeviceFormatProperties2~^~VUID-vkGetPhysicalDeviceFormatProperties2-format-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties2-format-parameter)~^~implicit +VALIDATION_ERROR_2c617601~^~N~^~Unknown~^~vkGetPhysicalDeviceFormatProperties2~^~VUID-vkGetPhysicalDeviceFormatProperties2-pFormatProperties-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pFormatProperties must be a valid pointer to a VkFormatProperties2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties2-pFormatProperties-parameter)~^~implicit +VALIDATION_ERROR_2c627a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceFormatProperties2~^~VUID-vkGetPhysicalDeviceFormatProperties2-physicalDevice-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties2-physicalDevice-parameter)~^~implicit VALIDATION_ERROR_2c816e01~^~N~^~Unknown~^~vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX~^~VUID-vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX-pFeatures-parameter~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'pFeatures must be a valid pointer to a VkDeviceGeneratedCommandsFeaturesNVX structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX-pFeatures-parameter)~^~implicit VALIDATION_ERROR_2c81a401~^~N~^~Unknown~^~vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX~^~VUID-vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX-pLimits-parameter~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'pLimits must be a valid pointer to a VkDeviceGeneratedCommandsLimitsNVX structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX-pLimits-parameter)~^~implicit VALIDATION_ERROR_2c827a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX~^~VUID-vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX-physicalDevice-parameter~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX-physicalDevice-parameter)~^~implicit @@ -3077,9 +3163,10 @@ VALIDATION_ERROR_2ca30401~^~Y~^~Unknown~^~vkGetPhysicalDeviceImageFormatProperties~^~VUID-vkGetPhysicalDeviceImageFormatProperties-type-parameter~^~core~^~The spec valid usage text states 'type must be a valid VkImageType value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-type-parameter)~^~implicit VALIDATION_ERROR_2ca30601~^~N~^~Unknown~^~vkGetPhysicalDeviceImageFormatProperties~^~VUID-vkGetPhysicalDeviceImageFormatProperties-usage-parameter~^~core~^~The spec valid usage text states 'usage must be a valid combination of VkImageUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-usage-parameter)~^~implicit VALIDATION_ERROR_2ca30603~^~Y~^~Unknown~^~vkGetPhysicalDeviceImageFormatProperties~^~VUID-vkGetPhysicalDeviceImageFormatProperties-usage-requiredbitmask~^~core~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-usage-requiredbitmask)~^~implicit -VALIDATION_ERROR_2cc18201~^~N~^~Unknown~^~vkGetPhysicalDeviceImageFormatProperties2~^~VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatInfo-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pImageFormatInfo must be a valid pointer to a valid VkPhysicalDeviceImageFormatInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatInfo-parameter)~^~implicit -VALIDATION_ERROR_2cc18401~^~N~^~Unknown~^~vkGetPhysicalDeviceImageFormatProperties2~^~VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatProperties-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pImageFormatProperties must be a valid pointer to a VkImageFormatProperties2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatProperties-parameter)~^~implicit -VALIDATION_ERROR_2cc27a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceImageFormatProperties2~^~VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter)~^~implicit +VALIDATION_ERROR_2cc00e98~^~N~^~None~^~vkGetPhysicalDeviceImageFormatProperties2~^~VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-01868~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'If the pNext chain of pImageFormatProperties contains an instance of VkAndroidHardwareBufferUsageANDROID, the pNext chain of pImageFormatInfo must contain an instance of VkPhysicalDeviceExternalImageFormatInfo with handleType set to VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-01868)~^~ +VALIDATION_ERROR_2cc18201~^~N~^~Unknown~^~vkGetPhysicalDeviceImageFormatProperties2~^~VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatInfo-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pImageFormatInfo must be a valid pointer to a valid VkPhysicalDeviceImageFormatInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatInfo-parameter)~^~implicit +VALIDATION_ERROR_2cc18401~^~N~^~Unknown~^~vkGetPhysicalDeviceImageFormatProperties2~^~VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatProperties-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pImageFormatProperties must be a valid pointer to a VkImageFormatProperties2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatProperties-parameter)~^~implicit +VALIDATION_ERROR_2cc27a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceImageFormatProperties2~^~VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter)~^~implicit VALIDATION_ERROR_2ce1b001~^~Y~^~Unknown~^~vkGetPhysicalDeviceMemoryProperties~^~VUID-vkGetPhysicalDeviceMemoryProperties-pMemoryProperties-parameter~^~core~^~The spec valid usage text states 'pMemoryProperties must be a valid pointer to a VkPhysicalDeviceMemoryProperties structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceMemoryProperties-pMemoryProperties-parameter)~^~implicit VALIDATION_ERROR_2ce27a01~^~Y~^~None~^~vkGetPhysicalDeviceMemoryProperties~^~VUID-vkGetPhysicalDeviceMemoryProperties-physicalDevice-parameter~^~core~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceMemoryProperties-physicalDevice-parameter)~^~implicit VALIDATION_ERROR_2d01b001~^~N~^~Unknown~^~vkGetPhysicalDeviceMemoryProperties2~^~VUID-vkGetPhysicalDeviceMemoryProperties2-pMemoryProperties-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pMemoryProperties must be a valid pointer to a VkPhysicalDeviceMemoryProperties2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceMemoryProperties2-pMemoryProperties-parameter)~^~implicit @@ -3087,21 +3174,21 @@ VALIDATION_ERROR_2d2009e2~^~Y~^~Unknown~^~vkGetPhysicalDeviceMirPresentationSupportKHR~^~VUID-vkGetPhysicalDeviceMirPresentationSupportKHR-queueFamilyIndex-01265~^~(VK_KHR_surface)+(VK_KHR_mir_surface)~^~The spec valid usage text states 'queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceMirPresentationSupportKHR-queueFamilyIndex-01265)~^~ VALIDATION_ERROR_2d203001~^~Y~^~Unknown~^~vkGetPhysicalDeviceMirPresentationSupportKHR~^~VUID-vkGetPhysicalDeviceMirPresentationSupportKHR-connection-parameter~^~(VK_KHR_surface)+(VK_KHR_mir_surface)~^~The spec valid usage text states 'connection must be a valid pointer to a MirConnection value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceMirPresentationSupportKHR-connection-parameter)~^~implicit VALIDATION_ERROR_2d227a01~^~Y~^~None~^~vkGetPhysicalDeviceMirPresentationSupportKHR~^~VUID-vkGetPhysicalDeviceMirPresentationSupportKHR-physicalDevice-parameter~^~(VK_KHR_surface)+(VK_KHR_mir_surface)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceMirPresentationSupportKHR-physicalDevice-parameter)~^~implicit -VALIDATION_ERROR_2d400009~^~Y~^~None~^~vkGetPhysicalDevicePresentRectanglesKHR~^~VUID-vkGetPhysicalDevicePresentRectanglesKHR-commonparent~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-commonparent)~^~implicit -VALIDATION_ERROR_2d420a01~^~N~^~Unknown~^~vkGetPhysicalDevicePresentRectanglesKHR~^~VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRectCount-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'pRectCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRectCount-parameter)~^~implicit -VALIDATION_ERROR_2d420e01~^~Y~^~Unknown~^~vkGetPhysicalDevicePresentRectanglesKHR~^~VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRects-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRects-parameter)~^~implicit -VALIDATION_ERROR_2d427a01~^~Y~^~Unknown~^~vkGetPhysicalDevicePresentRectanglesKHR~^~VUID-vkGetPhysicalDevicePresentRectanglesKHR-physicalDevice-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-physicalDevice-parameter)~^~implicit -VALIDATION_ERROR_2d42ec01~^~Y~^~Unknown~^~vkGetPhysicalDevicePresentRectanglesKHR~^~VUID-vkGetPhysicalDevicePresentRectanglesKHR-surface-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'surface must be a valid VkSurfaceKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-surface-parameter)~^~implicit +VALIDATION_ERROR_2d400009~^~Y~^~None~^~vkGetPhysicalDevicePresentRectanglesKHR~^~VUID-vkGetPhysicalDevicePresentRectanglesKHR-commonparent~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-commonparent)~^~implicit +VALIDATION_ERROR_2d420a01~^~N~^~Unknown~^~vkGetPhysicalDevicePresentRectanglesKHR~^~VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRectCount-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'pRectCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRectCount-parameter)~^~implicit +VALIDATION_ERROR_2d420e01~^~Y~^~Unknown~^~vkGetPhysicalDevicePresentRectanglesKHR~^~VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRects-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRects-parameter)~^~implicit +VALIDATION_ERROR_2d427a01~^~Y~^~Unknown~^~vkGetPhysicalDevicePresentRectanglesKHR~^~VUID-vkGetPhysicalDevicePresentRectanglesKHR-physicalDevice-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-physicalDevice-parameter)~^~implicit +VALIDATION_ERROR_2d42ec01~^~Y~^~Unknown~^~vkGetPhysicalDevicePresentRectanglesKHR~^~VUID-vkGetPhysicalDevicePresentRectanglesKHR-surface-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'surface must be a valid VkSurfaceKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-surface-parameter)~^~implicit VALIDATION_ERROR_2d61f401~^~Y~^~Unknown~^~vkGetPhysicalDeviceProperties~^~VUID-vkGetPhysicalDeviceProperties-pProperties-parameter~^~core~^~The spec valid usage text states 'pProperties must be a valid pointer to a VkPhysicalDeviceProperties structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceProperties-pProperties-parameter)~^~implicit VALIDATION_ERROR_2d627a01~^~Y~^~None~^~vkGetPhysicalDeviceProperties~^~VUID-vkGetPhysicalDeviceProperties-physicalDevice-parameter~^~core~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceProperties-physicalDevice-parameter)~^~implicit -VALIDATION_ERROR_2d81f401~^~N~^~Unknown~^~vkGetPhysicalDeviceProperties2~^~VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pProperties must be a valid pointer to a VkPhysicalDeviceProperties2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter)~^~implicit -VALIDATION_ERROR_2d827a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceProperties2~^~VUID-vkGetPhysicalDeviceProperties2-physicalDevice-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceProperties2-physicalDevice-parameter)~^~implicit +VALIDATION_ERROR_2d81f401~^~N~^~Unknown~^~vkGetPhysicalDeviceProperties2~^~VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pProperties must be a valid pointer to a VkPhysicalDeviceProperties2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter)~^~implicit +VALIDATION_ERROR_2d827a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceProperties2~^~VUID-vkGetPhysicalDeviceProperties2-physicalDevice-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceProperties2-physicalDevice-parameter)~^~implicit VALIDATION_ERROR_2da20001~^~Y~^~Unknown~^~vkGetPhysicalDeviceQueueFamilyProperties~^~VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyProperties-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyProperties-parameter)~^~implicit VALIDATION_ERROR_2da20201~^~N~^~Unknown~^~vkGetPhysicalDeviceQueueFamilyProperties~^~VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyPropertyCount-parameter~^~core~^~The spec valid usage text states 'pQueueFamilyPropertyCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyPropertyCount-parameter)~^~implicit VALIDATION_ERROR_2da27a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceQueueFamilyProperties~^~VUID-vkGetPhysicalDeviceQueueFamilyProperties-physicalDevice-parameter~^~core~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties-physicalDevice-parameter)~^~implicit -VALIDATION_ERROR_2dc20001~^~Y~^~Unknown~^~vkGetPhysicalDeviceQueueFamilyProperties2~^~VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyProperties-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyProperties-parameter)~^~implicit -VALIDATION_ERROR_2dc20201~^~N~^~Unknown~^~vkGetPhysicalDeviceQueueFamilyProperties2~^~VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyPropertyCount-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pQueueFamilyPropertyCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyPropertyCount-parameter)~^~implicit -VALIDATION_ERROR_2dc27a01~^~N~^~Unknown~^~vkGetPhysicalDeviceQueueFamilyProperties2~^~VUID-vkGetPhysicalDeviceQueueFamilyProperties2-physicalDevice-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties2-physicalDevice-parameter)~^~implicit +VALIDATION_ERROR_2dc20001~^~Y~^~Unknown~^~vkGetPhysicalDeviceQueueFamilyProperties2~^~VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyProperties-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyProperties-parameter)~^~implicit +VALIDATION_ERROR_2dc20201~^~N~^~Unknown~^~vkGetPhysicalDeviceQueueFamilyProperties2~^~VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyPropertyCount-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pQueueFamilyPropertyCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyPropertyCount-parameter)~^~implicit +VALIDATION_ERROR_2dc27a01~^~N~^~Unknown~^~vkGetPhysicalDeviceQueueFamilyProperties2~^~VUID-vkGetPhysicalDeviceQueueFamilyProperties2-physicalDevice-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties2-physicalDevice-parameter)~^~implicit VALIDATION_ERROR_2de0088c~^~N~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-01094~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-01094)~^~ VALIDATION_ERROR_2de09201~^~Y~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties-format-parameter~^~core~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-format-parameter)~^~implicit VALIDATION_ERROR_2de1f401~^~Y~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties-pProperties-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-pProperties-parameter)~^~implicit @@ -3112,10 +3199,10 @@ VALIDATION_ERROR_2de30401~^~Y~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties-type-parameter~^~core~^~The spec valid usage text states 'type must be a valid VkImageType value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-type-parameter)~^~implicit VALIDATION_ERROR_2de30601~^~N~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-parameter~^~core~^~The spec valid usage text states 'usage must be a valid combination of VkImageUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-parameter)~^~implicit VALIDATION_ERROR_2de30603~^~Y~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-requiredbitmask~^~core~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-requiredbitmask)~^~implicit -VALIDATION_ERROR_2e017401~^~N~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties2~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pFormatInfo-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pFormatInfo must be a valid pointer to a valid VkPhysicalDeviceSparseImageFormatInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pFormatInfo-parameter)~^~implicit -VALIDATION_ERROR_2e01f401~^~Y~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties2~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pProperties-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pProperties-parameter)~^~implicit -VALIDATION_ERROR_2e01f601~^~N~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties2~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pPropertyCount-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pPropertyCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pPropertyCount-parameter)~^~implicit -VALIDATION_ERROR_2e027a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties2~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-physicalDevice-parameter~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-physicalDevice-parameter)~^~implicit +VALIDATION_ERROR_2e017401~^~N~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties2~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pFormatInfo-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pFormatInfo must be a valid pointer to a valid VkPhysicalDeviceSparseImageFormatInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pFormatInfo-parameter)~^~implicit +VALIDATION_ERROR_2e01f401~^~Y~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties2~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pProperties-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pProperties-parameter)~^~implicit +VALIDATION_ERROR_2e01f601~^~N~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties2~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pPropertyCount-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pPropertyCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pPropertyCount-parameter)~^~implicit +VALIDATION_ERROR_2e027a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceSparseImageFormatProperties2~^~VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-physicalDevice-parameter~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-physicalDevice-parameter)~^~implicit VALIDATION_ERROR_2e200009~^~Y~^~None~^~vkGetPhysicalDeviceSurfaceCapabilities2EXT~^~VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-commonparent~^~(VK_KHR_surface)+(VK_EXT_display_surface_counter)~^~The spec valid usage text states 'Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-commonparent)~^~implicit VALIDATION_ERROR_2e224a01~^~N~^~Unknown~^~vkGetPhysicalDeviceSurfaceCapabilities2EXT~^~VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-pSurfaceCapabilities-parameter~^~(VK_KHR_surface)+(VK_EXT_display_surface_counter)~^~The spec valid usage text states 'pSurfaceCapabilities must be a valid pointer to a VkSurfaceCapabilities2EXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-pSurfaceCapabilities-parameter)~^~implicit VALIDATION_ERROR_2e227a01~^~Y~^~Unknown~^~vkGetPhysicalDeviceSurfaceCapabilities2EXT~^~VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-physicalDevice-parameter~^~(VK_KHR_surface)+(VK_EXT_display_surface_counter)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-physicalDevice-parameter)~^~implicit @@ -3315,10 +3402,10 @@ VALIDATION_ERROR_3321ba01~^~Y~^~Unknown~^~vkSetHdrMetadataEXT~^~VUID-vkSetHdrMetadataEXT-pMetadata-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_EXT_hdr_metadata)~^~The spec valid usage text states 'pMetadata must be a valid pointer to an array of swapchainCount valid VkHdrMetadataEXT structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSetHdrMetadataEXT-pMetadata-parameter)~^~implicit VALIDATION_ERROR_33225801~^~Y~^~Unknown~^~vkSetHdrMetadataEXT~^~VUID-vkSetHdrMetadataEXT-pSwapchains-parameter~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_EXT_hdr_metadata)~^~The spec valid usage text states 'pSwapchains must be a valid pointer to an array of swapchainCount valid VkSwapchainKHR handles' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSetHdrMetadataEXT-pSwapchains-parameter)~^~implicit VALIDATION_ERROR_3322f21b~^~N~^~Unknown~^~vkSetHdrMetadataEXT~^~VUID-vkSetHdrMetadataEXT-swapchainCount-arraylength~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_EXT_hdr_metadata)~^~The spec valid usage text states 'swapchainCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSetHdrMetadataEXT-swapchainCount-arraylength)~^~implicit -VALIDATION_ERROR_33402801~^~Y~^~Unknown~^~vkTrimCommandPool~^~VUID-vkTrimCommandPool-commandPool-parameter~^~(VK_KHR_maintenance1)~^~The spec valid usage text states 'commandPool must be a valid VkCommandPool handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkTrimCommandPool-commandPool-parameter)~^~implicit -VALIDATION_ERROR_33402807~^~Y~^~Unknown~^~vkTrimCommandPool~^~VUID-vkTrimCommandPool-commandPool-parent~^~(VK_KHR_maintenance1)~^~The spec valid usage text states 'commandPool must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkTrimCommandPool-commandPool-parent)~^~implicit -VALIDATION_ERROR_33405601~^~Y~^~Unknown~^~vkTrimCommandPool~^~VUID-vkTrimCommandPool-device-parameter~^~(VK_KHR_maintenance1)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkTrimCommandPool-device-parameter)~^~implicit -VALIDATION_ERROR_33409005~^~Y~^~Unknown~^~vkTrimCommandPool~^~VUID-vkTrimCommandPool-flags-zerobitmask~^~(VK_KHR_maintenance1)~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkTrimCommandPool-flags-zerobitmask)~^~implicit +VALIDATION_ERROR_33402801~^~Y~^~Unknown~^~vkTrimCommandPool~^~VUID-vkTrimCommandPool-commandPool-parameter~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'commandPool must be a valid VkCommandPool handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkTrimCommandPool-commandPool-parameter)~^~implicit +VALIDATION_ERROR_33402807~^~Y~^~Unknown~^~vkTrimCommandPool~^~VUID-vkTrimCommandPool-commandPool-parent~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'commandPool must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkTrimCommandPool-commandPool-parent)~^~implicit +VALIDATION_ERROR_33405601~^~Y~^~Unknown~^~vkTrimCommandPool~^~VUID-vkTrimCommandPool-device-parameter~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkTrimCommandPool-device-parameter)~^~implicit +VALIDATION_ERROR_33409005~^~Y~^~Unknown~^~vkTrimCommandPool~^~VUID-vkTrimCommandPool-flags-zerobitmask~^~(VK_VERSION_1_1,VK_KHR_maintenance1)~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkTrimCommandPool-flags-zerobitmask)~^~implicit VALIDATION_ERROR_33600562~^~Y~^~Unknown~^~vkUnmapMemory~^~VUID-vkUnmapMemory-memory-00689~^~core~^~The spec valid usage text states 'memory must be currently mapped' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkUnmapMemory-memory-00689)~^~ VALIDATION_ERROR_33605601~^~Y~^~None~^~vkUnmapMemory~^~VUID-vkUnmapMemory-device-parameter~^~core~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkUnmapMemory-device-parameter)~^~implicit VALIDATION_ERROR_3360c601~^~Y~^~None~^~vkUnmapMemory~^~VUID-vkUnmapMemory-memory-parameter~^~core~^~The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkUnmapMemory-memory-parameter)~^~implicit @@ -3332,12 +3419,13 @@ VALIDATION_ERROR_3380d807~^~Y~^~Unknown~^~vkUnregisterObjectsNVX~^~VUID-vkUnregisterObjectsNVX-objectTable-parent~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'objectTable must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUnregisterObjectsNVX-objectTable-parent)~^~implicit VALIDATION_ERROR_3381c801~^~N~^~Unknown~^~vkUnregisterObjectsNVX~^~VUID-vkUnregisterObjectsNVX-pObjectEntryTypes-parameter~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'pObjectEntryTypes must be a valid pointer to an array of objectCount valid VkObjectEntryTypeNVX values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUnregisterObjectsNVX-pObjectEntryTypes-parameter)~^~implicit VALIDATION_ERROR_3381cc01~^~Y~^~Unknown~^~vkUnregisterObjectsNVX~^~VUID-vkUnregisterObjectsNVX-pObjectIndices-parameter~^~(VK_NVX_device_generated_commands)~^~The spec valid usage text states 'pObjectIndices must be a valid pointer to an array of objectCount uint32_t values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUnregisterObjectsNVX-pObjectIndices-parameter)~^~implicit -VALIDATION_ERROR_33a00d2a~^~N~^~None~^~vkUpdateDescriptorSetWithTemplate~^~VUID-vkUpdateDescriptorSetWithTemplateKHR-pData-01685~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'pData must be a valid pointer to a memory that contains 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.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplateKHR-pData-01685)~^~ -VALIDATION_ERROR_33a04801~^~Y~^~Unknown~^~vkUpdateDescriptorSetWithTemplate~^~VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'descriptorSet must be a valid VkDescriptorSet handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-parameter)~^~implicit -VALIDATION_ERROR_33a05201~^~Y~^~Unknown~^~vkUpdateDescriptorSetWithTemplate~^~VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parameter)~^~implicit -VALIDATION_ERROR_33a05207~^~Y~^~Unknown~^~vkUpdateDescriptorSetWithTemplate~^~VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parent~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'descriptorUpdateTemplate must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parent)~^~implicit -VALIDATION_ERROR_33a05601~^~Y~^~Unknown~^~vkUpdateDescriptorSetWithTemplate~^~VUID-vkUpdateDescriptorSetWithTemplate-device-parameter~^~(VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-device-parameter)~^~implicit -VALIDATION_ERROR_33c00274~^~N~^~Unknown~^~vkUpdateDescriptorSets~^~VUID-vkUpdateDescriptorSets-dstSet-00314~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkUpdateDescriptorSets-dstSet-00314)~^~ +VALIDATION_ERROR_33a00d2a~^~N~^~None~^~vkUpdateDescriptorSetWithTemplate~^~VUID-vkUpdateDescriptorSetWithTemplate-pData-01685~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'pData must be a valid pointer to a memory that contains 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.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-pData-01685)~^~ +VALIDATION_ERROR_33a04801~^~Y~^~Unknown~^~vkUpdateDescriptorSetWithTemplate~^~VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'descriptorSet must be a valid VkDescriptorSet handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-parameter)~^~implicit +VALIDATION_ERROR_33a05201~^~Y~^~Unknown~^~vkUpdateDescriptorSetWithTemplate~^~VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parameter)~^~implicit +VALIDATION_ERROR_33a05207~^~Y~^~Unknown~^~vkUpdateDescriptorSetWithTemplate~^~VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parent~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'descriptorUpdateTemplate must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parent)~^~implicit +VALIDATION_ERROR_33a05601~^~Y~^~Unknown~^~vkUpdateDescriptorSetWithTemplate~^~VUID-vkUpdateDescriptorSetWithTemplate-device-parameter~^~(VK_VERSION_1_1,VK_KHR_descriptor_update_template)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-device-parameter)~^~implicit +VALIDATION_ERROR_33c00274~^~N~^~Unknown~^~vkUpdateDescriptorSets~^~VUID-vkUpdateDescriptorSets-dstSet-00314~^~!(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkUpdateDescriptorSets-dstSet-00314)~^~ +VALIDATION_ERROR_33c017ce~^~N~^~None~^~vkUpdateDescriptorSets~^~VUID-vkUpdateDescriptorSets-None-03047~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'Descriptor bindings updated by this command which were created without the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT or VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSets-None-03047)~^~ VALIDATION_ERROR_33c05601~^~Y~^~None~^~vkUpdateDescriptorSets~^~VUID-vkUpdateDescriptorSets-device-parameter~^~core~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkUpdateDescriptorSets-device-parameter)~^~implicit VALIDATION_ERROR_33c12c01~^~Y~^~Unknown~^~vkUpdateDescriptorSets~^~VUID-vkUpdateDescriptorSets-pDescriptorCopies-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkUpdateDescriptorSets-pDescriptorCopies-parameter)~^~implicit VALIDATION_ERROR_33c13601~^~Y~^~Unknown~^~vkUpdateDescriptorSets~^~VUID-vkUpdateDescriptorSets-pDescriptorWrites-parameter~^~core~^~The spec valid usage text states '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.0/html/vkspec.html#VUID-vkUpdateDescriptorSets-pDescriptorWrites-parameter)~^~implicit @@ -3345,73 +3433,64 @@ VALIDATION_ERROR_33e08a1b~^~N~^~Unknown~^~vkWaitForFences~^~VUID-vkWaitForFences-fenceCount-arraylength~^~core~^~The spec valid usage text states 'fenceCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkWaitForFences-fenceCount-arraylength)~^~implicit VALIDATION_ERROR_33e17201~^~Y~^~Unknown~^~vkWaitForFences~^~VUID-vkWaitForFences-pFences-parameter~^~core~^~The spec valid usage text states 'pFences must be a valid pointer to an array of fenceCount valid VkFence handles' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkWaitForFences-pFences-parameter)~^~implicit VALIDATION_ERROR_33e17207~^~Y~^~None~^~vkWaitForFences~^~VUID-vkWaitForFences-pFences-parent~^~core~^~The spec valid usage text states 'Each element of pFences must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkWaitForFences-pFences-parent)~^~implicit -VALIDATION_ERROR_3401c40d~^~N~^~None~^~VkPhysicalDeviceProperties2~^~VUID-VkPhysicalDeviceProperties2-pNext-pNext~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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, VkPhysicalDeviceDiscardRectanglePropertiesEXT, VkPhysicalDeviceExternalMemoryHostPropertiesEXT, VkPhysicalDeviceIDProperties, VkPhysicalDeviceMaintenance3Properties, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, VkPhysicalDeviceMultiviewProperties, VkPhysicalDevicePointClippingProperties, VkPhysicalDeviceProtectedMemoryProperties, VkPhysicalDevicePushDescriptorPropertiesKHR, VkPhysicalDeviceSampleLocationsPropertiesEXT, VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT, VkPhysicalDeviceSubgroupProperties, or VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-pNext-pNext)~^~implicit -VALIDATION_ERROR_3402b00b~^~Y~^~None~^~VkPhysicalDeviceProperties2~^~VUID-VkPhysicalDeviceProperties2-sType-sType~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-sType-sType)~^~implicit -VALIDATION_ERROR_3402b00f~^~N~^~None~^~VkPhysicalDeviceProperties2~^~VUID-VkPhysicalDeviceProperties2-sType-unique~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-sType-unique)~^~implicit -VALIDATION_ERROR_3421c40d~^~N~^~None~^~VkFormatProperties2~^~VUID-VkFormatProperties2-pNext-pNext~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkFormatProperties2-pNext-pNext)~^~implicit -VALIDATION_ERROR_3422b00b~^~Y~^~None~^~VkFormatProperties2~^~VUID-VkFormatProperties2-sType-sType~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkFormatProperties2-sType-sType)~^~implicit -VALIDATION_ERROR_3441c40d~^~N~^~None~^~VkImageFormatProperties2~^~VUID-VkImageFormatProperties2-pNext-pNext~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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 VkExternalImageFormatProperties, VkSamplerYcbcrConversionImageFormatProperties, or VkTextureLODGatherFormatPropertiesAMD' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-pNext-pNext)~^~implicit -VALIDATION_ERROR_3442b00b~^~Y~^~None~^~VkImageFormatProperties2~^~VUID-VkImageFormatProperties2-sType-sType~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-sType-sType)~^~implicit -VALIDATION_ERROR_3442b00f~^~N~^~None~^~VkImageFormatProperties2~^~VUID-VkImageFormatProperties2-sType-unique~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-sType-unique)~^~implicit +VALIDATION_ERROR_3401c40d~^~N~^~None~^~VkPhysicalDeviceProperties2~^~VUID-VkPhysicalDeviceProperties2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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, VkPhysicalDeviceDescriptorIndexingPropertiesEXT, VkPhysicalDeviceDiscardRectanglePropertiesEXT, VkPhysicalDeviceExternalMemoryHostPropertiesEXT, VkPhysicalDeviceIDProperties, VkPhysicalDeviceMaintenance3Properties, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, VkPhysicalDeviceMultiviewProperties, VkPhysicalDevicePointClippingProperties, VkPhysicalDeviceProtectedMemoryProperties, VkPhysicalDevicePushDescriptorPropertiesKHR, VkPhysicalDeviceSampleLocationsPropertiesEXT, VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT, VkPhysicalDeviceShaderCorePropertiesAMD, VkPhysicalDeviceSubgroupProperties, or VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-pNext-pNext)~^~implicit +VALIDATION_ERROR_3402b00b~^~Y~^~None~^~VkPhysicalDeviceProperties2~^~VUID-VkPhysicalDeviceProperties2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-sType-sType)~^~implicit +VALIDATION_ERROR_3402b00f~^~N~^~None~^~VkPhysicalDeviceProperties2~^~VUID-VkPhysicalDeviceProperties2-sType-unique~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-sType-unique)~^~implicit +VALIDATION_ERROR_3421c40d~^~N~^~None~^~VkFormatProperties2~^~VUID-VkFormatProperties2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkFormatProperties2-pNext-pNext)~^~implicit +VALIDATION_ERROR_3422b00b~^~Y~^~None~^~VkFormatProperties2~^~VUID-VkFormatProperties2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkFormatProperties2-sType-sType)~^~implicit +VALIDATION_ERROR_3441c40d~^~N~^~None~^~VkImageFormatProperties2~^~VUID-VkImageFormatProperties2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states '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, VkSamplerYcbcrConversionImageFormatProperties, or VkTextureLODGatherFormatPropertiesAMD' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-pNext-pNext)~^~implicit +VALIDATION_ERROR_3442b00b~^~Y~^~None~^~VkImageFormatProperties2~^~VUID-VkImageFormatProperties2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-sType-sType)~^~implicit +VALIDATION_ERROR_3442b00f~^~N~^~None~^~VkImageFormatProperties2~^~VUID-VkImageFormatProperties2-sType-unique~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-sType-unique)~^~implicit VALIDATION_ERROR_3461c40d~^~N~^~None~^~VkPhysicalDeviceMemoryProperties2~^~VUID-VkPhysicalDeviceMemoryProperties2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMemoryProperties2-pNext-pNext)~^~implicit VALIDATION_ERROR_3462b00b~^~Y~^~None~^~VkPhysicalDeviceMemoryProperties2~^~VUID-VkPhysicalDeviceMemoryProperties2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMemoryProperties2-sType-sType)~^~implicit VALIDATION_ERROR_3481c40d~^~N~^~None~^~VkSurfaceCapabilities2KHR~^~VUID-VkSurfaceCapabilities2KHR-pNext-pNext~^~(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkSharedPresentSurfaceCapabilitiesKHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSurfaceCapabilities2KHR-pNext-pNext)~^~implicit VALIDATION_ERROR_3482b00b~^~Y~^~None~^~VkSurfaceCapabilities2KHR~^~VUID-VkSurfaceCapabilities2KHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSurfaceCapabilities2KHR-sType-sType)~^~implicit -VALIDATION_ERROR_34a1c40d~^~N~^~None~^~VkDeviceGroupPresentCapabilitiesKHR~^~VUID-VkDeviceGroupPresentCapabilitiesKHR-pNext-pNext~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentCapabilitiesKHR-pNext-pNext)~^~implicit -VALIDATION_ERROR_34a2b00b~^~Y~^~None~^~VkDeviceGroupPresentCapabilitiesKHR~^~VUID-VkDeviceGroupPresentCapabilitiesKHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentCapabilitiesKHR-sType-sType)~^~implicit -VALIDATION_ERROR_34c1c40d~^~N~^~None~^~VkExternalBufferProperties~^~VUID-VkExternalBufferProperties-pNext-pNext~^~(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalBufferProperties-pNext-pNext)~^~implicit -VALIDATION_ERROR_34c2b00b~^~Y~^~None~^~VkExternalBufferProperties~^~VUID-VkExternalBufferProperties-sType-sType~^~(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalBufferProperties-sType-sType)~^~implicit -VALIDATION_ERROR_3521c40d~^~N~^~None~^~VkExternalSemaphoreProperties~^~VUID-VkExternalSemaphoreProperties-pNext-pNext~^~(VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalSemaphoreProperties-pNext-pNext)~^~implicit -VALIDATION_ERROR_3522b00b~^~Y~^~None~^~VkExternalSemaphoreProperties~^~VUID-VkExternalSemaphoreProperties-sType-sType~^~(VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalSemaphoreProperties-sType-sType)~^~implicit -VALIDATION_ERROR_3541c40d~^~N~^~None~^~VkQueueFamilyProperties2~^~VUID-VkQueueFamilyProperties2-pNext-pNext~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkQueueFamilyProperties2-pNext-pNext)~^~implicit -VALIDATION_ERROR_3542b00b~^~N~^~None~^~VkQueueFamilyProperties2~^~VUID-VkQueueFamilyProperties2-sType-sType~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkQueueFamilyProperties2-sType-sType)~^~implicit -VALIDATION_ERROR_3561c40d~^~N~^~None~^~VkSparseImageFormatProperties2~^~VUID-VkSparseImageFormatProperties2-pNext-pNext~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSparseImageFormatProperties2-pNext-pNext)~^~implicit -VALIDATION_ERROR_3562b00b~^~N~^~None~^~VkSparseImageFormatProperties2~^~VUID-VkSparseImageFormatProperties2-sType-sType~^~(VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSparseImageFormatProperties2-sType-sType)~^~implicit +VALIDATION_ERROR_34a1c40d~^~N~^~None~^~VkDeviceGroupPresentCapabilitiesKHR~^~VUID-VkDeviceGroupPresentCapabilitiesKHR-pNext-pNext~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentCapabilitiesKHR-pNext-pNext)~^~implicit +VALIDATION_ERROR_34a2b00b~^~Y~^~None~^~VkDeviceGroupPresentCapabilitiesKHR~^~VUID-VkDeviceGroupPresentCapabilitiesKHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentCapabilitiesKHR-sType-sType)~^~implicit +VALIDATION_ERROR_34c1c40d~^~N~^~None~^~VkExternalBufferProperties~^~VUID-VkExternalBufferProperties-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalBufferProperties-pNext-pNext)~^~implicit +VALIDATION_ERROR_34c2b00b~^~Y~^~None~^~VkExternalBufferProperties~^~VUID-VkExternalBufferProperties-sType-sType~^~(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalBufferProperties-sType-sType)~^~implicit +VALIDATION_ERROR_3521c40d~^~N~^~None~^~VkExternalSemaphoreProperties~^~VUID-VkExternalSemaphoreProperties-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalSemaphoreProperties-pNext-pNext)~^~implicit +VALIDATION_ERROR_3522b00b~^~Y~^~None~^~VkExternalSemaphoreProperties~^~VUID-VkExternalSemaphoreProperties-sType-sType~^~(VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalSemaphoreProperties-sType-sType)~^~implicit +VALIDATION_ERROR_3541c40d~^~N~^~None~^~VkQueueFamilyProperties2~^~VUID-VkQueueFamilyProperties2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkQueueFamilyProperties2-pNext-pNext)~^~implicit +VALIDATION_ERROR_3542b00b~^~N~^~None~^~VkQueueFamilyProperties2~^~VUID-VkQueueFamilyProperties2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkQueueFamilyProperties2-sType-sType)~^~implicit +VALIDATION_ERROR_3561c40d~^~N~^~None~^~VkSparseImageFormatProperties2~^~VUID-VkSparseImageFormatProperties2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSparseImageFormatProperties2-pNext-pNext)~^~implicit +VALIDATION_ERROR_3562b00b~^~N~^~None~^~VkSparseImageFormatProperties2~^~VUID-VkSparseImageFormatProperties2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSparseImageFormatProperties2-sType-sType)~^~implicit VALIDATION_ERROR_3581c40d~^~N~^~None~^~VkSurfaceFormat2KHR~^~VUID-VkSurfaceFormat2KHR-pNext-pNext~^~(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSurfaceFormat2KHR-pNext-pNext)~^~implicit VALIDATION_ERROR_3582b00b~^~N~^~None~^~VkSurfaceFormat2KHR~^~VUID-VkSurfaceFormat2KHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSurfaceFormat2KHR-sType-sType)~^~implicit -VALIDATION_ERROR_35c1c40d~^~N~^~None~^~VkPhysicalDeviceMultiviewProperties~^~VUID-VkPhysicalDeviceMultiviewProperties-pNext-pNext~^~(VK_KHR_multiview)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewProperties-pNext-pNext)~^~implicit -VALIDATION_ERROR_35c2b00b~^~N~^~None~^~VkPhysicalDeviceMultiviewProperties~^~VUID-VkPhysicalDeviceMultiviewProperties-sType-sType~^~(VK_KHR_multiview)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewProperties-sType-sType)~^~implicit -VALIDATION_ERROR_3601c40d~^~N~^~None~^~VkExternalImageFormatProperties~^~VUID-VkExternalImageFormatProperties-pNext-pNext~^~(VK_KHR_get_physical_device_properties2)+(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalImageFormatProperties-pNext-pNext)~^~implicit -VALIDATION_ERROR_3602b00b~^~N~^~None~^~VkExternalImageFormatProperties~^~VUID-VkExternalImageFormatProperties-sType-sType~^~(VK_KHR_get_physical_device_properties2)+(VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalImageFormatProperties-sType-sType)~^~implicit -VALIDATION_ERROR_3621c40d~^~N~^~None~^~VkPhysicalDeviceIDProperties~^~VUID-VkPhysicalDeviceIDProperties-pNext-pNext~^~(VK_KHR_get_physical_device_properties2)+(VK_KHR_external_memory_capabilities,VK_KHR_external_semaphore_capabilities,VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceIDProperties-pNext-pNext)~^~implicit -VALIDATION_ERROR_3622b00b~^~N~^~None~^~VkPhysicalDeviceIDProperties~^~VUID-VkPhysicalDeviceIDProperties-sType-sType~^~(VK_KHR_get_physical_device_properties2)+(VK_KHR_external_memory_capabilities,VK_KHR_external_semaphore_capabilities,VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceIDProperties-sType-sType)~^~implicit +VALIDATION_ERROR_35c2b00b~^~N~^~None~^~VkPhysicalDeviceMultiviewProperties~^~VUID-VkPhysicalDeviceMultiviewProperties-sType-sType~^~(VK_VERSION_1_1,VK_KHR_multiview)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewProperties-sType-sType)~^~implicit +VALIDATION_ERROR_3602b00b~^~N~^~None~^~VkExternalImageFormatProperties~^~VUID-VkExternalImageFormatProperties-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalImageFormatProperties-sType-sType)~^~implicit +VALIDATION_ERROR_3622b00b~^~N~^~None~^~VkPhysicalDeviceIDProperties~^~VUID-VkPhysicalDeviceIDProperties-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_VERSION_1_1,VK_KHR_external_memory_capabilities,VK_KHR_external_semaphore_capabilities,VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceIDProperties-sType-sType)~^~implicit VALIDATION_ERROR_3642b00b~^~N~^~None~^~VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX~^~VUID-VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX-sType-sType~^~(VK_NVX_multiview_per_view_attributes)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX-sType-sType)~^~implicit VALIDATION_ERROR_37e2b00b~^~N~^~None~^~VkSharedPresentSurfaceCapabilitiesKHR~^~VUID-VkSharedPresentSurfaceCapabilitiesKHR-sType-sType~^~(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)+(VK_KHR_shared_presentable_image)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSharedPresentSurfaceCapabilitiesKHR-sType-sType)~^~implicit VALIDATION_ERROR_3822b00b~^~N~^~None~^~VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT~^~VUID-VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT-sType-sType~^~(VK_EXT_blend_operation_advanced)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT-sType-sType)~^~implicit VALIDATION_ERROR_3842b00b~^~N~^~None~^~VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT~^~VUID-VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT-sType-sType~^~(VK_EXT_blend_operation_advanced)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT-sType-sType)~^~implicit -VALIDATION_ERROR_3861c40d~^~N~^~None~^~VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT~^~VUID-VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT-pNext-pNext~^~(VK_EXT_sampler_filter_minmax)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_3862b00b~^~N~^~None~^~VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT~^~VUID-VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT-sType-sType~^~(VK_EXT_sampler_filter_minmax)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT-sType-sType)~^~implicit VALIDATION_ERROR_38800b20~^~N~^~None~^~VkPipelineColorBlendAdvancedStateCreateInfoEXT~^~VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-srcPremultiplied-01424~^~(VK_EXT_blend_operation_advanced)~^~The spec valid usage text states 'If the non-premultiplied source color property is not supported, srcPremultiplied must be VK_TRUE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-srcPremultiplied-01424)~^~ VALIDATION_ERROR_38800b22~^~N~^~None~^~VkPipelineColorBlendAdvancedStateCreateInfoEXT~^~VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-dstPremultiplied-01425~^~(VK_EXT_blend_operation_advanced)~^~The spec valid usage text states 'If the non-premultiplied destination color property is not supported, dstPremultiplied must be VK_TRUE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-dstPremultiplied-01425)~^~ VALIDATION_ERROR_38800b24~^~N~^~None~^~VkPipelineColorBlendAdvancedStateCreateInfoEXT~^~VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-01426~^~(VK_EXT_blend_operation_advanced)~^~The spec valid usage text states 'If the correlated overlap property is not supported, blendOverlap must be VK_BLEND_OVERLAP_UNCORRELATED_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-01426)~^~ -VALIDATION_ERROR_3881c40d~^~N~^~None~^~VkPipelineColorBlendAdvancedStateCreateInfoEXT~^~VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-pNext-pNext~^~(VK_EXT_blend_operation_advanced)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_3882b00b~^~N~^~None~^~VkPipelineColorBlendAdvancedStateCreateInfoEXT~^~VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-sType-sType~^~(VK_EXT_blend_operation_advanced)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-sType-sType)~^~implicit VALIDATION_ERROR_38834a01~^~N~^~None~^~VkPipelineColorBlendAdvancedStateCreateInfoEXT~^~VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-parameter~^~(VK_EXT_blend_operation_advanced)~^~The spec valid usage text states 'blendOverlap must be a valid VkBlendOverlapEXT value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-parameter)~^~implicit VALIDATION_ERROR_38a00afa~^~N~^~None~^~VkPipelineCoverageModulationStateCreateInfoNV~^~VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableEnable-01405~^~(VK_NV_framebuffer_mixed_samples)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableEnable-01405)~^~ VALIDATION_ERROR_38a09005~^~N~^~None~^~VkPipelineCoverageModulationStateCreateInfoNV~^~VUID-VkPipelineCoverageModulationStateCreateInfoNV-flags-zerobitmask~^~(VK_NV_framebuffer_mixed_samples)~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-flags-zerobitmask)~^~implicit -VALIDATION_ERROR_38a1c40d~^~N~^~None~^~VkPipelineCoverageModulationStateCreateInfoNV~^~VUID-VkPipelineCoverageModulationStateCreateInfoNV-pNext-pNext~^~(VK_NV_framebuffer_mixed_samples)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-pNext-pNext)~^~implicit VALIDATION_ERROR_38a2b00b~^~N~^~None~^~VkPipelineCoverageModulationStateCreateInfoNV~^~VUID-VkPipelineCoverageModulationStateCreateInfoNV-sType-sType~^~(VK_NV_framebuffer_mixed_samples)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-sType-sType)~^~implicit VALIDATION_ERROR_38a34c01~^~N~^~None~^~VkPipelineCoverageModulationStateCreateInfoNV~^~VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationMode-parameter~^~(VK_NV_framebuffer_mixed_samples)~^~The spec valid usage text states 'coverageModulationMode must be a valid VkCoverageModulationModeNV value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationMode-parameter)~^~implicit VALIDATION_ERROR_38a34e1b~^~N~^~None~^~VkPipelineCoverageModulationStateCreateInfoNV~^~VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableCount-arraylength~^~(VK_NV_framebuffer_mixed_samples)~^~The spec valid usage text states 'coverageModulationTableCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableCount-arraylength)~^~implicit VALIDATION_ERROR_38c00af8~^~N~^~None~^~VkPipelineCoverageToColorStateCreateInfoNV~^~VUID-VkPipelineCoverageToColorStateCreateInfoNV-coverageToColorEnable-01404~^~(VK_NV_fragment_coverage_to_color)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageToColorStateCreateInfoNV-coverageToColorEnable-01404)~^~ VALIDATION_ERROR_38c09005~^~N~^~None~^~VkPipelineCoverageToColorStateCreateInfoNV~^~VUID-VkPipelineCoverageToColorStateCreateInfoNV-flags-zerobitmask~^~(VK_NV_fragment_coverage_to_color)~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageToColorStateCreateInfoNV-flags-zerobitmask)~^~implicit -VALIDATION_ERROR_38c1c40d~^~N~^~None~^~VkPipelineCoverageToColorStateCreateInfoNV~^~VUID-VkPipelineCoverageToColorStateCreateInfoNV-pNext-pNext~^~(VK_NV_fragment_coverage_to_color)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageToColorStateCreateInfoNV-pNext-pNext)~^~implicit VALIDATION_ERROR_38c2b00b~^~N~^~None~^~VkPipelineCoverageToColorStateCreateInfoNV~^~VUID-VkPipelineCoverageToColorStateCreateInfoNV-sType-sType~^~(VK_NV_fragment_coverage_to_color)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageToColorStateCreateInfoNV-sType-sType)~^~implicit -VALIDATION_ERROR_38e1c40d~^~N~^~None~^~VkSamplerReductionModeCreateInfoEXT~^~VUID-VkSamplerReductionModeCreateInfoEXT-pNext-pNext~^~(VK_EXT_sampler_filter_minmax)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerReductionModeCreateInfoEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_38e2b00b~^~N~^~None~^~VkSamplerReductionModeCreateInfoEXT~^~VUID-VkSamplerReductionModeCreateInfoEXT-sType-sType~^~(VK_EXT_sampler_filter_minmax)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerReductionModeCreateInfoEXT-sType-sType)~^~implicit VALIDATION_ERROR_38e35001~^~N~^~None~^~VkSamplerReductionModeCreateInfoEXT~^~VUID-VkSamplerReductionModeCreateInfoEXT-reductionMode-parameter~^~(VK_EXT_sampler_filter_minmax)~^~The spec valid usage text states 'reductionMode must be a valid VkSamplerReductionModeEXT value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerReductionModeCreateInfoEXT-reductionMode-parameter)~^~implicit -VALIDATION_ERROR_39400b4c~^~N~^~None~^~VkExportFenceCreateInfo~^~VUID-VkExportFenceCreateInfo-handleTypes-01446~^~(VK_KHR_external_fence)~^~The spec valid usage text states 'The bits in handleTypes must be supported and compatible, as reported by VkExternalFenceProperties.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-handleTypes-01446)~^~ -VALIDATION_ERROR_39409e01~^~N~^~None~^~VkExportFenceCreateInfo~^~VUID-VkExportFenceCreateInfo-handleTypes-parameter~^~(VK_KHR_external_fence)~^~The spec valid usage text states 'handleTypes must be a valid combination of VkExternalFenceHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-handleTypes-parameter)~^~implicit -VALIDATION_ERROR_3941c40d~^~N~^~None~^~VkExportFenceCreateInfo~^~VUID-VkExportFenceCreateInfo-pNext-pNext~^~(VK_KHR_external_fence)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_3942b00b~^~N~^~None~^~VkExportFenceCreateInfo~^~VUID-VkExportFenceCreateInfo-sType-sType~^~(VK_KHR_external_fence)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-sType-sType)~^~implicit -VALIDATION_ERROR_39609c01~^~Y~^~None~^~VkPhysicalDeviceExternalFenceInfo~^~VUID-VkPhysicalDeviceExternalFenceInfo-handleType-parameter~^~(VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'handleType must be a valid VkExternalFenceHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalFenceInfo-handleType-parameter)~^~implicit -VALIDATION_ERROR_3961c40d~^~Y~^~None~^~VkPhysicalDeviceExternalFenceInfo~^~VUID-VkPhysicalDeviceExternalFenceInfo-pNext-pNext~^~(VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalFenceInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_3962b00b~^~Y~^~None~^~VkPhysicalDeviceExternalFenceInfo~^~VUID-VkPhysicalDeviceExternalFenceInfo-sType-sType~^~(VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalFenceInfo-sType-sType)~^~implicit -VALIDATION_ERROR_3981c40d~^~N~^~None~^~VkExternalFenceProperties~^~VUID-VkExternalFenceProperties-pNext-pNext~^~(VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalFenceProperties-pNext-pNext)~^~implicit -VALIDATION_ERROR_3982b00b~^~Y~^~None~^~VkExternalFenceProperties~^~VUID-VkExternalFenceProperties-sType-sType~^~(VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalFenceProperties-sType-sType)~^~implicit -VALIDATION_ERROR_39a27a01~^~Y~^~None~^~vkGetPhysicalDeviceExternalFenceProperties~^~VUID-vkGetPhysicalDeviceExternalFenceProperties-physicalDevice-parameter~^~(VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalFenceProperties-physicalDevice-parameter)~^~implicit -VALIDATION_ERROR_39a3a201~^~N~^~None~^~vkGetPhysicalDeviceExternalFenceProperties~^~VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceInfo-parameter~^~(VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'pExternalFenceInfo must be a valid pointer to a valid VkPhysicalDeviceExternalFenceInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceInfo-parameter)~^~implicit -VALIDATION_ERROR_39a3a401~^~N~^~None~^~vkGetPhysicalDeviceExternalFenceProperties~^~VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceProperties-parameter~^~(VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'pExternalFenceProperties must be a valid pointer to a VkExternalFenceProperties structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceProperties-parameter)~^~implicit +VALIDATION_ERROR_39400b4c~^~N~^~None~^~VkExportFenceCreateInfo~^~VUID-VkExportFenceCreateInfo-handleTypes-01446~^~(VK_VERSION_1_1,VK_KHR_external_fence)~^~The spec valid usage text states 'The bits in handleTypes must be supported and compatible, as reported by VkExternalFenceProperties.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-handleTypes-01446)~^~ +VALIDATION_ERROR_39409e01~^~N~^~None~^~VkExportFenceCreateInfo~^~VUID-VkExportFenceCreateInfo-handleTypes-parameter~^~(VK_VERSION_1_1,VK_KHR_external_fence)~^~The spec valid usage text states 'handleTypes must be a valid combination of VkExternalFenceHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-handleTypes-parameter)~^~implicit +VALIDATION_ERROR_3942b00b~^~N~^~None~^~VkExportFenceCreateInfo~^~VUID-VkExportFenceCreateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_external_fence)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-sType-sType)~^~implicit +VALIDATION_ERROR_39609c01~^~Y~^~None~^~VkPhysicalDeviceExternalFenceInfo~^~VUID-VkPhysicalDeviceExternalFenceInfo-handleType-parameter~^~(VK_VERSION_1_1,VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'handleType must be a valid VkExternalFenceHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalFenceInfo-handleType-parameter)~^~implicit +VALIDATION_ERROR_3961c40d~^~Y~^~None~^~VkPhysicalDeviceExternalFenceInfo~^~VUID-VkPhysicalDeviceExternalFenceInfo-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalFenceInfo-pNext-pNext)~^~implicit +VALIDATION_ERROR_3962b00b~^~Y~^~None~^~VkPhysicalDeviceExternalFenceInfo~^~VUID-VkPhysicalDeviceExternalFenceInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalFenceInfo-sType-sType)~^~implicit +VALIDATION_ERROR_3981c40d~^~N~^~None~^~VkExternalFenceProperties~^~VUID-VkExternalFenceProperties-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalFenceProperties-pNext-pNext)~^~implicit +VALIDATION_ERROR_3982b00b~^~Y~^~None~^~VkExternalFenceProperties~^~VUID-VkExternalFenceProperties-sType-sType~^~(VK_VERSION_1_1,VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalFenceProperties-sType-sType)~^~implicit +VALIDATION_ERROR_39a27a01~^~Y~^~None~^~vkGetPhysicalDeviceExternalFenceProperties~^~VUID-vkGetPhysicalDeviceExternalFenceProperties-physicalDevice-parameter~^~(VK_VERSION_1_1,VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalFenceProperties-physicalDevice-parameter)~^~implicit +VALIDATION_ERROR_39a3a201~^~N~^~None~^~vkGetPhysicalDeviceExternalFenceProperties~^~VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceInfo-parameter~^~(VK_VERSION_1_1,VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'pExternalFenceInfo must be a valid pointer to a valid VkPhysicalDeviceExternalFenceInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceInfo-parameter)~^~implicit +VALIDATION_ERROR_39a3a401~^~N~^~None~^~vkGetPhysicalDeviceExternalFenceProperties~^~VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceProperties-parameter~^~(VK_VERSION_1_1,VK_KHR_external_fence_capabilities)~^~The spec valid usage text states 'pExternalFenceProperties must be a valid pointer to a VkExternalFenceProperties structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceProperties-parameter)~^~implicit VALIDATION_ERROR_39c00b70~^~N~^~None~^~VkImportFenceFdInfoKHR~^~VUID-VkImportFenceFdInfoKHR-handleType-01464~^~(VK_KHR_external_fence_fd)~^~The spec valid usage text states 'handleType must be a value included in the Handle Types Supported by VkImportFenceFdInfoKHR table.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportFenceFdInfoKHR-handleType-01464)~^~ VALIDATION_ERROR_39c00c0a~^~N~^~None~^~VkImportFenceFdInfoKHR~^~VUID-VkImportFenceFdInfoKHR-fd-01541~^~(VK_KHR_external_fence_fd)~^~The spec valid usage text states 'fd must obey any requirements listed for handleType in external fence handle types compatibility.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportFenceFdInfoKHR-fd-01541)~^~ VALIDATION_ERROR_39c08801~^~Y~^~None~^~VkImportFenceFdInfoKHR~^~VUID-VkImportFenceFdInfoKHR-fence-parameter~^~(VK_KHR_external_fence_fd)~^~The spec valid usage text states 'fence must be a valid VkFence handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportFenceFdInfoKHR-fence-parameter)~^~implicit @@ -3447,7 +3526,6 @@ VALIDATION_ERROR_3a42b00b~^~Y~^~None~^~VkImportFenceWin32HandleInfoKHR~^~VUID-VkImportFenceWin32HandleInfoKHR-sType-sType~^~(VK_KHR_external_fence_win32)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-sType-sType)~^~implicit VALIDATION_ERROR_3a600b4e~^~N~^~None~^~VkExportFenceWin32HandleInfoKHR~^~VUID-VkExportFenceWin32HandleInfoKHR-handleTypes-01447~^~(VK_KHR_external_fence_win32)~^~The spec valid usage text states 'If VkExportFenceCreateInfo::handleTypes does not include VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT, VkExportFenceWin32HandleInfoKHR must not be in the pNext chain of VkFenceCreateInfo.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceWin32HandleInfoKHR-handleTypes-01447)~^~ VALIDATION_ERROR_3a60f401~^~N~^~None~^~VkExportFenceWin32HandleInfoKHR~^~VUID-VkExportFenceWin32HandleInfoKHR-pAttributes-parameter~^~(VK_KHR_external_fence_win32)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkExportFenceWin32HandleInfoKHR-pAttributes-parameter)~^~implicit -VALIDATION_ERROR_3a61c40d~^~N~^~None~^~VkExportFenceWin32HandleInfoKHR~^~VUID-VkExportFenceWin32HandleInfoKHR-pNext-pNext~^~(VK_KHR_external_fence_win32)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceWin32HandleInfoKHR-pNext-pNext)~^~implicit VALIDATION_ERROR_3a62b00b~^~N~^~None~^~VkExportFenceWin32HandleInfoKHR~^~VUID-VkExportFenceWin32HandleInfoKHR-sType-sType~^~(VK_KHR_external_fence_win32)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceWin32HandleInfoKHR-sType-sType)~^~implicit VALIDATION_ERROR_3a800b50~^~N~^~None~^~VkFenceGetWin32HandleInfoKHR~^~VUID-VkFenceGetWin32HandleInfoKHR-handleType-01448~^~(VK_KHR_external_fence_win32)~^~The spec valid usage text states 'handleType must have been included in VkExportFenceCreateInfo::handleTypes when the fence's current payload was created.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-handleType-01448)~^~ VALIDATION_ERROR_3a800b52~^~N~^~None~^~VkFenceGetWin32HandleInfoKHR~^~VUID-VkFenceGetWin32HandleInfoKHR-handleType-01449~^~(VK_KHR_external_fence_win32)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-handleType-01449)~^~ @@ -3495,66 +3573,62 @@ VALIDATION_ERROR_3b40c601~^~Y~^~None~^~VkMemoryGetWin32HandleInfoKHR~^~VUID-VkMemoryGetWin32HandleInfoKHR-memory-parameter~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-memory-parameter)~^~implicit VALIDATION_ERROR_3b41c40d~^~Y~^~None~^~VkMemoryGetWin32HandleInfoKHR~^~VUID-VkMemoryGetWin32HandleInfoKHR-pNext-pNext~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-pNext-pNext)~^~implicit VALIDATION_ERROR_3b42b00b~^~Y~^~None~^~VkMemoryGetWin32HandleInfoKHR~^~VUID-VkMemoryGetWin32HandleInfoKHR-sType-sType~^~(VK_KHR_external_memory_win32)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-sType-sType)~^~implicit -VALIDATION_ERROR_3b61c40d~^~N~^~None~^~VkMemoryDedicatedRequirements~^~VUID-VkMemoryDedicatedRequirements-pNext-pNext~^~(VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedRequirements-pNext-pNext)~^~implicit -VALIDATION_ERROR_3b62b00b~^~N~^~None~^~VkMemoryDedicatedRequirements~^~VUID-VkMemoryDedicatedRequirements-sType-sType~^~(VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedRequirements-sType-sType)~^~implicit +VALIDATION_ERROR_3b62b00b~^~N~^~None~^~VkMemoryDedicatedRequirements~^~VUID-VkMemoryDedicatedRequirements-sType-sType~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedRequirements-sType-sType)~^~implicit VALIDATION_ERROR_3b800009~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-commonparent~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'Both of buffer, and image that are valid handles must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-commonparent)~^~implicit VALIDATION_ERROR_3b800b30~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-image-01432~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'At least one of image and buffer must be VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01432)~^~ VALIDATION_ERROR_3b800b32~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-image-01433~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01433)~^~ VALIDATION_ERROR_3b800b34~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-image-01434~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01434)~^~ VALIDATION_ERROR_3b800b36~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-buffer-01435~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01435)~^~ VALIDATION_ERROR_3b800b38~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-buffer-01436~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01436)~^~ -VALIDATION_ERROR_3b800b3a~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-image-01437~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)+(VK_KHR_external_memory_win32,VK_KHR_external_memory_fd)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01437)~^~ -VALIDATION_ERROR_3b800b3c~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-buffer-01438~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)+(VK_KHR_external_memory_win32,VK_KHR_external_memory_fd)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01438)~^~ -VALIDATION_ERROR_3b800e0a~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfoKHR-image-01797~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If image is not VK_NULL_HANDLE, image must not have been created with VK_IMAGE_CREATE_DISJOINT_BIT_KHR set in VkImageCreateInfo::flags' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfoKHR-image-01797)~^~ +VALIDATION_ERROR_3b800e0a~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-image-01797~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01797)~^~ +VALIDATION_ERROR_3b800ea8~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-image-01876~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)+(VK_KHR_external_memory_win32)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01876)~^~ +VALIDATION_ERROR_3b800eaa~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-buffer-01877~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)+(VK_KHR_external_memory_win32)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01877)~^~ +VALIDATION_ERROR_3b800eac~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-image-01878~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)+(VK_KHR_external_memory_fd)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01878)~^~ +VALIDATION_ERROR_3b800eae~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-buffer-01879~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)+(VK_KHR_external_memory_fd)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01879)~^~ VALIDATION_ERROR_3b801a01~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-buffer-parameter~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-parameter)~^~implicit VALIDATION_ERROR_3b80a001~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-image-parameter~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'If image is not VK_NULL_HANDLE, image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-parameter)~^~implicit -VALIDATION_ERROR_3b81c40d~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-pNext-pNext)~^~implicit VALIDATION_ERROR_3b82b00b~^~N~^~None~^~VkMemoryDedicatedAllocateInfo~^~VUID-VkMemoryDedicatedAllocateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_dedicated_allocation)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-sType-sType)~^~implicit -VALIDATION_ERROR_3ba01a01~^~Y~^~None~^~VkBufferMemoryRequirementsInfo2~^~VUID-VkBufferMemoryRequirementsInfo2-buffer-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryRequirementsInfo2-buffer-parameter)~^~implicit -VALIDATION_ERROR_3ba1c40d~^~Y~^~None~^~VkBufferMemoryRequirementsInfo2~^~VUID-VkBufferMemoryRequirementsInfo2-pNext-pNext~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryRequirementsInfo2-pNext-pNext)~^~implicit -VALIDATION_ERROR_3ba2b00b~^~Y~^~None~^~VkBufferMemoryRequirementsInfo2~^~VUID-VkBufferMemoryRequirementsInfo2-sType-sType~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryRequirementsInfo2-sType-sType)~^~implicit -VALIDATION_ERROR_3bc00c6a~^~N~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2KHR-image-01589~^~(VK_KHR_get_memory_requirements2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If image was created with a multi-planar format and the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2KHR-image-01589)~^~ -VALIDATION_ERROR_3bc00c6c~^~N~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2KHR-image-01590~^~(VK_KHR_get_memory_requirements2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If image was not created with the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must not be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2KHR-image-01590)~^~ -VALIDATION_ERROR_3bc00c6e~^~N~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2KHR-image-01591~^~(VK_KHR_get_memory_requirements2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If image was created with a single-plane format, there must not be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2KHR-image-01591)~^~ -VALIDATION_ERROR_3bc0a001~^~Y~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2-image-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-parameter)~^~implicit -VALIDATION_ERROR_3bc1c40d~^~Y~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2-pNext-pNext~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkImagePlaneMemoryRequirementsInfo' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-pNext-pNext)~^~implicit -VALIDATION_ERROR_3bc2b00b~^~Y~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2-sType-sType~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-sType-sType)~^~implicit -VALIDATION_ERROR_3be0a001~^~Y~^~None~^~VkImageSparseMemoryRequirementsInfo2~^~VUID-VkImageSparseMemoryRequirementsInfo2-image-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSparseMemoryRequirementsInfo2-image-parameter)~^~implicit -VALIDATION_ERROR_3be1c40d~^~Y~^~None~^~VkImageSparseMemoryRequirementsInfo2~^~VUID-VkImageSparseMemoryRequirementsInfo2-pNext-pNext~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSparseMemoryRequirementsInfo2-pNext-pNext)~^~implicit -VALIDATION_ERROR_3be2b00b~^~Y~^~None~^~VkImageSparseMemoryRequirementsInfo2~^~VUID-VkImageSparseMemoryRequirementsInfo2-sType-sType~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSparseMemoryRequirementsInfo2-sType-sType)~^~implicit -VALIDATION_ERROR_3c01c40d~^~N~^~None~^~VkMemoryRequirements2~^~VUID-VkMemoryRequirements2-pNext-pNext~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkMemoryDedicatedRequirements' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryRequirements2-pNext-pNext)~^~implicit -VALIDATION_ERROR_3c02b00b~^~Y~^~None~^~VkMemoryRequirements2~^~VUID-VkMemoryRequirements2-sType-sType~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryRequirements2-sType-sType)~^~implicit -VALIDATION_ERROR_3c21c40d~^~N~^~None~^~VkSparseImageMemoryRequirements2~^~VUID-VkSparseImageMemoryRequirements2-pNext-pNext~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSparseImageMemoryRequirements2-pNext-pNext)~^~implicit -VALIDATION_ERROR_3c22b00b~^~N~^~None~^~VkSparseImageMemoryRequirements2~^~VUID-VkSparseImageMemoryRequirements2-sType-sType~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSparseImageMemoryRequirements2-sType-sType)~^~implicit -VALIDATION_ERROR_3c405601~^~Y~^~None~^~vkGetImageMemoryRequirements2~^~VUID-vkGetImageMemoryRequirements2-device-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements2-device-parameter)~^~implicit -VALIDATION_ERROR_3c41b401~^~N~^~None~^~vkGetImageMemoryRequirements2~^~VUID-vkGetImageMemoryRequirements2-pMemoryRequirements-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements2-pMemoryRequirements-parameter)~^~implicit -VALIDATION_ERROR_3c439c01~^~N~^~None~^~vkGetImageMemoryRequirements2~^~VUID-vkGetImageMemoryRequirements2-pInfo-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pInfo must be a valid pointer to a valid VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements2-pInfo-parameter)~^~implicit -VALIDATION_ERROR_3c605601~^~Y~^~None~^~vkGetBufferMemoryRequirements2~^~VUID-vkGetBufferMemoryRequirements2-device-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements2-device-parameter)~^~implicit -VALIDATION_ERROR_3c61b401~^~N~^~None~^~vkGetBufferMemoryRequirements2~^~VUID-vkGetBufferMemoryRequirements2-pMemoryRequirements-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements2-pMemoryRequirements-parameter)~^~implicit -VALIDATION_ERROR_3c639c01~^~N~^~None~^~vkGetBufferMemoryRequirements2~^~VUID-vkGetBufferMemoryRequirements2-pInfo-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pInfo must be a valid pointer to a valid VkBufferMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements2-pInfo-parameter)~^~implicit -VALIDATION_ERROR_3c805601~^~Y~^~None~^~vkGetImageSparseMemoryRequirements2~^~VUID-vkGetImageSparseMemoryRequirements2-device-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-device-parameter)~^~implicit -VALIDATION_ERROR_3c823601~^~N~^~None~^~vkGetImageSparseMemoryRequirements2~^~VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirementCount-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pSparseMemoryRequirementCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirementCount-parameter)~^~implicit -VALIDATION_ERROR_3c823801~^~Y~^~None~^~vkGetImageSparseMemoryRequirements2~^~VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirements-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirements-parameter)~^~implicit -VALIDATION_ERROR_3c839c01~^~N~^~None~^~vkGetImageSparseMemoryRequirements2~^~VUID-vkGetImageSparseMemoryRequirements2-pInfo-parameter~^~(VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pInfo must be a valid pointer to a valid VkImageSparseMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-pInfo-parameter)~^~implicit -VALIDATION_ERROR_3ca2b00b~^~N~^~None~^~VkPhysicalDevice16BitStorageFeatures~^~VUID-VkPhysicalDevice16BitStorageFeatures-sType-sType~^~(VK_KHR_16bit_storage)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDevice16BitStorageFeatures-sType-sType)~^~implicit -VALIDATION_ERROR_3cc00b2e~^~N~^~None~^~VkPhysicalDeviceVariablePointerFeatures~^~VUID-VkPhysicalDeviceVariablePointerFeatures-variablePointers-01431~^~(VK_KHR_variable_pointers)~^~The spec valid usage text states 'If variablePointers is enabled then variablePointersStorageBuffer must also be enabled.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVariablePointerFeatures-variablePointers-01431)~^~ -VALIDATION_ERROR_3cc1c40d~^~N~^~None~^~VkPhysicalDeviceVariablePointerFeatures~^~VUID-VkPhysicalDeviceVariablePointerFeatures-pNext-pNext~^~(VK_KHR_variable_pointers)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVariablePointerFeatures-pNext-pNext)~^~implicit -VALIDATION_ERROR_3cc2b00b~^~N~^~None~^~VkPhysicalDeviceVariablePointerFeatures~^~VUID-VkPhysicalDeviceVariablePointerFeatures-sType-sType~^~(VK_KHR_variable_pointers)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVariablePointerFeatures-sType-sType)~^~implicit +VALIDATION_ERROR_3ba01a01~^~Y~^~None~^~VkBufferMemoryRequirementsInfo2~^~VUID-VkBufferMemoryRequirementsInfo2-buffer-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryRequirementsInfo2-buffer-parameter)~^~implicit +VALIDATION_ERROR_3ba1c40d~^~Y~^~None~^~VkBufferMemoryRequirementsInfo2~^~VUID-VkBufferMemoryRequirementsInfo2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryRequirementsInfo2-pNext-pNext)~^~implicit +VALIDATION_ERROR_3ba2b00b~^~Y~^~None~^~VkBufferMemoryRequirementsInfo2~^~VUID-VkBufferMemoryRequirementsInfo2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryRequirementsInfo2-sType-sType)~^~implicit +VALIDATION_ERROR_3bc00c6a~^~N~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2-image-01589~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If image was created with a multi-planar format and the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-01589)~^~ +VALIDATION_ERROR_3bc00c6c~^~N~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2-image-01590~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If image was not created with the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must not be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-01590)~^~ +VALIDATION_ERROR_3bc00c6e~^~N~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2-image-01591~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If image was created with a single-plane format, there must not be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-01591)~^~ +VALIDATION_ERROR_3bc00ed2~^~N~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2-image-01897~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)+(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-01897)~^~ +VALIDATION_ERROR_3bc0a001~^~Y~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2-image-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-parameter)~^~implicit +VALIDATION_ERROR_3bc1c40d~^~Y~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkImagePlaneMemoryRequirementsInfo' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-pNext-pNext)~^~implicit +VALIDATION_ERROR_3bc2b00b~^~Y~^~None~^~VkImageMemoryRequirementsInfo2~^~VUID-VkImageMemoryRequirementsInfo2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-sType-sType)~^~implicit +VALIDATION_ERROR_3be0a001~^~Y~^~None~^~VkImageSparseMemoryRequirementsInfo2~^~VUID-VkImageSparseMemoryRequirementsInfo2-image-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSparseMemoryRequirementsInfo2-image-parameter)~^~implicit +VALIDATION_ERROR_3be1c40d~^~Y~^~None~^~VkImageSparseMemoryRequirementsInfo2~^~VUID-VkImageSparseMemoryRequirementsInfo2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSparseMemoryRequirementsInfo2-pNext-pNext)~^~implicit +VALIDATION_ERROR_3be2b00b~^~Y~^~None~^~VkImageSparseMemoryRequirementsInfo2~^~VUID-VkImageSparseMemoryRequirementsInfo2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSparseMemoryRequirementsInfo2-sType-sType)~^~implicit +VALIDATION_ERROR_3c01c40d~^~N~^~None~^~VkMemoryRequirements2~^~VUID-VkMemoryRequirements2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkMemoryDedicatedRequirements' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryRequirements2-pNext-pNext)~^~implicit +VALIDATION_ERROR_3c02b00b~^~Y~^~None~^~VkMemoryRequirements2~^~VUID-VkMemoryRequirements2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryRequirements2-sType-sType)~^~implicit +VALIDATION_ERROR_3c21c40d~^~N~^~None~^~VkSparseImageMemoryRequirements2~^~VUID-VkSparseImageMemoryRequirements2-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSparseImageMemoryRequirements2-pNext-pNext)~^~implicit +VALIDATION_ERROR_3c22b00b~^~N~^~None~^~VkSparseImageMemoryRequirements2~^~VUID-VkSparseImageMemoryRequirements2-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSparseImageMemoryRequirements2-sType-sType)~^~implicit +VALIDATION_ERROR_3c405601~^~Y~^~None~^~vkGetImageMemoryRequirements2~^~VUID-vkGetImageMemoryRequirements2-device-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements2-device-parameter)~^~implicit +VALIDATION_ERROR_3c41b401~^~N~^~None~^~vkGetImageMemoryRequirements2~^~VUID-vkGetImageMemoryRequirements2-pMemoryRequirements-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements2-pMemoryRequirements-parameter)~^~implicit +VALIDATION_ERROR_3c439c01~^~N~^~None~^~vkGetImageMemoryRequirements2~^~VUID-vkGetImageMemoryRequirements2-pInfo-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pInfo must be a valid pointer to a valid VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements2-pInfo-parameter)~^~implicit +VALIDATION_ERROR_3c605601~^~Y~^~None~^~vkGetBufferMemoryRequirements2~^~VUID-vkGetBufferMemoryRequirements2-device-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements2-device-parameter)~^~implicit +VALIDATION_ERROR_3c61b401~^~N~^~None~^~vkGetBufferMemoryRequirements2~^~VUID-vkGetBufferMemoryRequirements2-pMemoryRequirements-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements2-pMemoryRequirements-parameter)~^~implicit +VALIDATION_ERROR_3c639c01~^~N~^~None~^~vkGetBufferMemoryRequirements2~^~VUID-vkGetBufferMemoryRequirements2-pInfo-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pInfo must be a valid pointer to a valid VkBufferMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements2-pInfo-parameter)~^~implicit +VALIDATION_ERROR_3c805601~^~Y~^~None~^~vkGetImageSparseMemoryRequirements2~^~VUID-vkGetImageSparseMemoryRequirements2-device-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-device-parameter)~^~implicit +VALIDATION_ERROR_3c823601~^~N~^~None~^~vkGetImageSparseMemoryRequirements2~^~VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirementCount-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pSparseMemoryRequirementCount must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirementCount-parameter)~^~implicit +VALIDATION_ERROR_3c823801~^~Y~^~None~^~vkGetImageSparseMemoryRequirements2~^~VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirements-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirements-parameter)~^~implicit +VALIDATION_ERROR_3c839c01~^~N~^~None~^~vkGetImageSparseMemoryRequirements2~^~VUID-vkGetImageSparseMemoryRequirements2-pInfo-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)~^~The spec valid usage text states 'pInfo must be a valid pointer to a valid VkImageSparseMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-pInfo-parameter)~^~implicit +VALIDATION_ERROR_3ca2b00b~^~N~^~None~^~VkPhysicalDevice16BitStorageFeatures~^~VUID-VkPhysicalDevice16BitStorageFeatures-sType-sType~^~(VK_VERSION_1_1,VK_KHR_16bit_storage)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDevice16BitStorageFeatures-sType-sType)~^~implicit +VALIDATION_ERROR_3cc00b2e~^~N~^~None~^~VkPhysicalDeviceVariablePointerFeatures~^~VUID-VkPhysicalDeviceVariablePointerFeatures-variablePointers-01431~^~(VK_VERSION_1_1,VK_KHR_variable_pointers)~^~The spec valid usage text states 'If variablePointers is enabled then variablePointersStorageBuffer must also be enabled.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVariablePointerFeatures-variablePointers-01431)~^~ +VALIDATION_ERROR_3cc2b00b~^~N~^~None~^~VkPhysicalDeviceVariablePointerFeatures~^~VUID-VkPhysicalDeviceVariablePointerFeatures-sType-sType~^~(VK_VERSION_1_1,VK_KHR_variable_pointers)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVariablePointerFeatures-sType-sType)~^~implicit VALIDATION_ERROR_3ce00bec~^~N~^~None~^~VkSampleLocationsInfoEXT~^~VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-01526~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'sampleLocationsPerPixel must be a bit value that is set in VkPhysicalDeviceSampleLocationsPropertiesEXT::sampleLocationSampleCounts' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-01526)~^~ VALIDATION_ERROR_3ce00bee~^~N~^~None~^~VkSampleLocationsInfoEXT~^~VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'sampleLocationsCount must equal sampleLocationsPerPixel {times} sampleLocationGridSize.width {times} sampleLocationGridSize.height' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527)~^~ -VALIDATION_ERROR_3ce1c40d~^~Y~^~None~^~VkSampleLocationsInfoEXT~^~VUID-VkSampleLocationsInfoEXT-pNext-pNext~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_3ce2b00b~^~Y~^~None~^~VkSampleLocationsInfoEXT~^~VUID-VkSampleLocationsInfoEXT-sType-sType~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sType-sType)~^~implicit VALIDATION_ERROR_3ce3b201~^~Y~^~None~^~VkSampleLocationsInfoEXT~^~VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-parameter~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'sampleLocationsPerPixel must be a valid VkSampleCountFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-parameter)~^~implicit VALIDATION_ERROR_3ce3b41b~^~Y~^~None~^~VkSampleLocationsInfoEXT~^~VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-arraylength~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'sampleLocationsCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-arraylength)~^~implicit VALIDATION_ERROR_3ce3b601~^~Y~^~None~^~VkSampleLocationsInfoEXT~^~VUID-VkSampleLocationsInfoEXT-pSampleLocations-parameter~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'pSampleLocations must be a valid pointer to an array of sampleLocationsCount VkSampleLocationEXT structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-pSampleLocations-parameter)~^~implicit -VALIDATION_ERROR_3d01c40d~^~N~^~None~^~VkRenderPassSampleLocationsBeginInfoEXT~^~VUID-VkRenderPassSampleLocationsBeginInfoEXT-pNext-pNext~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassSampleLocationsBeginInfoEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_3d02b00b~^~N~^~None~^~VkRenderPassSampleLocationsBeginInfoEXT~^~VUID-VkRenderPassSampleLocationsBeginInfoEXT-sType-sType~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassSampleLocationsBeginInfoEXT-sType-sType)~^~implicit VALIDATION_ERROR_3d03ba01~^~N~^~None~^~VkRenderPassSampleLocationsBeginInfoEXT~^~VUID-VkRenderPassSampleLocationsBeginInfoEXT-pAttachmentInitialSampleLocations-parameter~^~(VK_EXT_sample_locations)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassSampleLocationsBeginInfoEXT-pAttachmentInitialSampleLocations-parameter)~^~implicit VALIDATION_ERROR_3d03e801~^~N~^~None~^~VkRenderPassSampleLocationsBeginInfoEXT~^~VUID-VkRenderPassSampleLocationsBeginInfoEXT-pPostSubpassSampleLocations-parameter~^~(VK_EXT_sample_locations)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassSampleLocationsBeginInfoEXT-pPostSubpassSampleLocations-parameter)~^~implicit -VALIDATION_ERROR_3d21c40d~^~N~^~None~^~VkPipelineSampleLocationsStateCreateInfoEXT~^~VUID-VkPipelineSampleLocationsStateCreateInfoEXT-pNext-pNext~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineSampleLocationsStateCreateInfoEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_3d22b00b~^~N~^~None~^~VkPipelineSampleLocationsStateCreateInfoEXT~^~VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sType-sType~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sType-sType)~^~implicit VALIDATION_ERROR_3d23c601~^~N~^~None~^~VkPipelineSampleLocationsStateCreateInfoEXT~^~VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sampleLocationsInfo-parameter~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sampleLocationsInfo-parameter)~^~implicit -VALIDATION_ERROR_3d41c40d~^~N~^~None~^~VkPhysicalDeviceSampleLocationsPropertiesEXT~^~VUID-VkPhysicalDeviceSampleLocationsPropertiesEXT-pNext-pNext~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSampleLocationsPropertiesEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_3d42b00b~^~N~^~None~^~VkPhysicalDeviceSampleLocationsPropertiesEXT~^~VUID-VkPhysicalDeviceSampleLocationsPropertiesEXT-sType-sType~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSampleLocationsPropertiesEXT-sType-sType)~^~implicit VALIDATION_ERROR_3d61c40d~^~N~^~None~^~VkMultisamplePropertiesEXT~^~VUID-VkMultisamplePropertiesEXT-pNext-pNext~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMultisamplePropertiesEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_3d62b00b~^~Y~^~None~^~VkMultisamplePropertiesEXT~^~VUID-VkMultisamplePropertiesEXT-sType-sType~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMultisamplePropertiesEXT-sType-sType)~^~implicit @@ -3567,7 +3641,6 @@ VALIDATION_ERROR_3da19601~^~Y~^~None~^~VkValidationCacheCreateInfoEXT~^~VUID-VkValidationCacheCreateInfoEXT-pInitialData-parameter~^~(VK_EXT_validation_cache)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkValidationCacheCreateInfoEXT-pInitialData-parameter)~^~implicit VALIDATION_ERROR_3da1c40d~^~Y~^~None~^~VkValidationCacheCreateInfoEXT~^~VUID-VkValidationCacheCreateInfoEXT-pNext-pNext~^~(VK_EXT_validation_cache)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkValidationCacheCreateInfoEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_3da2b00b~^~Y~^~None~^~VkValidationCacheCreateInfoEXT~^~VUID-VkValidationCacheCreateInfoEXT-sType-sType~^~(VK_EXT_validation_cache)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkValidationCacheCreateInfoEXT-sType-sType)~^~implicit -VALIDATION_ERROR_3dc1c40d~^~N~^~None~^~VkShaderModuleValidationCacheCreateInfoEXT~^~VUID-VkShaderModuleValidationCacheCreateInfoEXT-pNext-pNext~^~(VK_EXT_validation_cache)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkShaderModuleValidationCacheCreateInfoEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_3dc2b00b~^~N~^~None~^~VkShaderModuleValidationCacheCreateInfoEXT~^~VUID-VkShaderModuleValidationCacheCreateInfoEXT-sType-sType~^~(VK_EXT_validation_cache)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkShaderModuleValidationCacheCreateInfoEXT-sType-sType)~^~implicit VALIDATION_ERROR_3dc3c401~^~N~^~None~^~VkShaderModuleValidationCacheCreateInfoEXT~^~VUID-VkShaderModuleValidationCacheCreateInfoEXT-validationCache-parameter~^~(VK_EXT_validation_cache)~^~The spec valid usage text states 'validationCache must be a valid VkValidationCacheEXT handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkShaderModuleValidationCacheCreateInfoEXT-validationCache-parameter)~^~implicit VALIDATION_ERROR_3de05601~^~Y~^~None~^~vkCreateValidationCacheEXT~^~VUID-vkCreateValidationCacheEXT-device-parameter~^~(VK_EXT_validation_cache)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateValidationCacheEXT-device-parameter)~^~implicit @@ -3579,8 +3652,8 @@ VALIDATION_ERROR_3e012401~^~N~^~None~^~vkGetValidationCacheDataEXT~^~VUID-vkGetValidationCacheDataEXT-pDataSize-parameter~^~(VK_EXT_validation_cache)~^~The spec valid usage text states 'pDataSize must be a valid pointer to a size_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetValidationCacheDataEXT-pDataSize-parameter)~^~implicit VALIDATION_ERROR_3e03c401~^~Y~^~None~^~vkGetValidationCacheDataEXT~^~VUID-vkGetValidationCacheDataEXT-validationCache-parameter~^~(VK_EXT_validation_cache)~^~The spec valid usage text states 'validationCache must be a valid VkValidationCacheEXT handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetValidationCacheDataEXT-validationCache-parameter)~^~implicit VALIDATION_ERROR_3e03c407~^~Y~^~None~^~vkGetValidationCacheDataEXT~^~VUID-vkGetValidationCacheDataEXT-validationCache-parent~^~(VK_EXT_validation_cache)~^~The spec valid usage text states 'validationCache must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetValidationCacheDataEXT-validationCache-parent)~^~implicit -VALIDATION_ERROR_3e200bf0~^~N~^~None~^~vkCmdSetSampleLocationsEXT~^~VUID-vkCmdSetSampleLocationsEXT-None-01528~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-None-01528)~^~ -VALIDATION_ERROR_3e200bf2~^~N~^~None~^~vkCmdSetSampleLocationsEXT~^~VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'The sampleLocationsPerPixel member of pSampleLocationsInfo must equal the rasterizationSamples member of the VkPipelineMultisampleStateCreateInfo structure the currently bound graphics pipeline has been created with' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529)~^~ +VALIDATION_ERROR_3e200bf0~^~N~^~None~^~vkCmdSetSampleLocationsEXT~^~VUID-vkCmdSetSampleLocationsEXT-None-01528~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-None-01528)~^~ +VALIDATION_ERROR_3e200bf2~^~N~^~None~^~vkCmdSetSampleLocationsEXT~^~VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529~^~(VK_EXT_sample_locations)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529)~^~ VALIDATION_ERROR_3e200bf4~^~N~^~None~^~vkCmdSetSampleLocationsEXT~^~VUID-vkCmdSetSampleLocationsEXT-variableSampleLocations-01530~^~(VK_EXT_sample_locations)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-variableSampleLocations-01530)~^~ VALIDATION_ERROR_3e202401~^~Y~^~None~^~vkCmdSetSampleLocationsEXT~^~VUID-vkCmdSetSampleLocationsEXT-commandBuffer-parameter~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_3e202413~^~Y~^~None~^~vkCmdSetSampleLocationsEXT~^~VUID-vkCmdSetSampleLocationsEXT-commandBuffer-recording~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-commandBuffer-recording)~^~implicit @@ -3603,88 +3676,81 @@ VALIDATION_ERROR_3e83c601~^~N~^~None~^~VkAttachmentSampleLocationsEXT~^~VUID-VkAttachmentSampleLocationsEXT-sampleLocationsInfo-parameter~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAttachmentSampleLocationsEXT-sampleLocationsInfo-parameter)~^~implicit VALIDATION_ERROR_3ea00bf8~^~N~^~None~^~VkSubpassSampleLocationsEXT~^~VUID-VkSubpassSampleLocationsEXT-subpassIndex-01532~^~(VK_EXT_sample_locations)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSubpassSampleLocationsEXT-subpassIndex-01532)~^~ VALIDATION_ERROR_3ea3c601~^~N~^~None~^~VkSubpassSampleLocationsEXT~^~VUID-VkSubpassSampleLocationsEXT-sampleLocationsInfo-parameter~^~(VK_EXT_sample_locations)~^~The spec valid usage text states 'sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSubpassSampleLocationsEXT-sampleLocationsInfo-parameter)~^~implicit -VALIDATION_ERROR_3ec1c40d~^~N~^~None~^~VkPhysicalDevicePointClippingProperties~^~VUID-VkPhysicalDevicePointClippingProperties-pNext-pNext~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDevicePointClippingProperties-pNext-pNext)~^~implicit -VALIDATION_ERROR_3ec2b00b~^~N~^~None~^~VkPhysicalDevicePointClippingProperties~^~VUID-VkPhysicalDevicePointClippingProperties-sType-sType~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDevicePointClippingProperties-sType-sType)~^~implicit -VALIDATION_ERROR_3ee00c01~^~N~^~None~^~VkInputAttachmentAspectReference~^~VUID-VkInputAttachmentAspectReference-aspectMask-parameter~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'aspectMask must be a valid combination of VkImageAspectFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-aspectMask-parameter)~^~implicit -VALIDATION_ERROR_3ee00c03~^~N~^~None~^~VkInputAttachmentAspectReference~^~VUID-VkInputAttachmentAspectReference-aspectMask-requiredbitmask~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'aspectMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-aspectMask-requiredbitmask)~^~implicit -VALIDATION_ERROR_3ee00c40~^~N~^~None~^~VkInputAttachmentAspectReference~^~VUID-VkInputAttachmentAspectReferenceKHR-pCreateInfo-01568~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'There must be an input attachment at pCreateInfo::pSubpasses[subpass].pInputAttachments[inputAttachment].' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReferenceKHR-pCreateInfo-01568)~^~ -VALIDATION_ERROR_3ee00c42~^~N~^~None~^~VkInputAttachmentAspectReference~^~VUID-VkInputAttachmentAspectReferenceKHR-None-01569~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'The specified input attachment must have more than one aspect mask.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReferenceKHR-None-01569)~^~ -VALIDATION_ERROR_3ee00c44~^~N~^~None~^~VkInputAttachmentAspectReference~^~VUID-VkInputAttachmentAspectReferenceKHR-aspectMask-01570~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'aspectMask must be a subset of the aspect masks in the specified input attachment.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReferenceKHR-aspectMask-01570)~^~ -VALIDATION_ERROR_3f01c40d~^~N~^~None~^~VkRenderPassInputAttachmentAspectCreateInfo~^~VUID-VkRenderPassInputAttachmentAspectCreateInfo-pNext-pNext~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_3f02b00b~^~N~^~None~^~VkRenderPassInputAttachmentAspectCreateInfo~^~VUID-VkRenderPassInputAttachmentAspectCreateInfo-sType-sType~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-sType-sType)~^~implicit -VALIDATION_ERROR_3f03ce1b~^~N~^~None~^~VkRenderPassInputAttachmentAspectCreateInfo~^~VUID-VkRenderPassInputAttachmentAspectCreateInfo-aspectReferenceCount-arraylength~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'aspectReferenceCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-aspectReferenceCount-arraylength)~^~implicit -VALIDATION_ERROR_3f03d001~^~N~^~None~^~VkRenderPassInputAttachmentAspectCreateInfo~^~VUID-VkRenderPassInputAttachmentAspectCreateInfo-pAspectReferences-parameter~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'pAspectReferences must be a valid pointer to an array of aspectReferenceCount valid VkInputAttachmentAspectReference structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-pAspectReferences-parameter)~^~implicit -VALIDATION_ERROR_3f200c66~^~N~^~None~^~VkImageViewUsageCreateInfo~^~VUID-VkImageViewUsageCreateInfoKHR-usage-01587~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'usage must not include any set bits that were not set in the usage member of the VkImageCreateInfo structure used to create the image this image view is created from.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfoKHR-usage-01587)~^~ -VALIDATION_ERROR_3f21c40d~^~N~^~None~^~VkImageViewUsageCreateInfo~^~VUID-VkImageViewUsageCreateInfo-pNext-pNext~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_3f22b00b~^~N~^~None~^~VkImageViewUsageCreateInfo~^~VUID-VkImageViewUsageCreateInfo-sType-sType~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-sType-sType)~^~implicit -VALIDATION_ERROR_3f230601~^~N~^~None~^~VkImageViewUsageCreateInfo~^~VUID-VkImageViewUsageCreateInfo-usage-parameter~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'usage must be a valid combination of VkImageUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-usage-parameter)~^~implicit -VALIDATION_ERROR_3f230603~^~N~^~None~^~VkImageViewUsageCreateInfo~^~VUID-VkImageViewUsageCreateInfo-usage-requiredbitmask~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-usage-requiredbitmask)~^~implicit -VALIDATION_ERROR_3f41c40d~^~N~^~None~^~VkPipelineTessellationDomainOriginStateCreateInfo~^~VUID-VkPipelineTessellationDomainOriginStateCreateInfo-pNext-pNext~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineTessellationDomainOriginStateCreateInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_3f42b00b~^~N~^~None~^~VkPipelineTessellationDomainOriginStateCreateInfo~^~VUID-VkPipelineTessellationDomainOriginStateCreateInfo-sType-sType~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineTessellationDomainOriginStateCreateInfo-sType-sType)~^~implicit -VALIDATION_ERROR_3f43d201~^~N~^~None~^~VkPipelineTessellationDomainOriginStateCreateInfo~^~VUID-VkPipelineTessellationDomainOriginStateCreateInfo-domainOrigin-parameter~^~(VK_KHR_maintenance2)~^~The spec valid usage text states 'domainOrigin must be a valid VkTessellationDomainOrigin value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineTessellationDomainOriginStateCreateInfo-domainOrigin-parameter)~^~implicit +VALIDATION_ERROR_3ec2b00b~^~N~^~None~^~VkPhysicalDevicePointClippingProperties~^~VUID-VkPhysicalDevicePointClippingProperties-sType-sType~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDevicePointClippingProperties-sType-sType)~^~implicit +VALIDATION_ERROR_3ee00c01~^~N~^~None~^~VkInputAttachmentAspectReference~^~VUID-VkInputAttachmentAspectReference-aspectMask-parameter~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'aspectMask must be a valid combination of VkImageAspectFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-aspectMask-parameter)~^~implicit +VALIDATION_ERROR_3ee00c03~^~N~^~None~^~VkInputAttachmentAspectReference~^~VUID-VkInputAttachmentAspectReference-aspectMask-requiredbitmask~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'aspectMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-aspectMask-requiredbitmask)~^~implicit +VALIDATION_ERROR_3ee00c40~^~N~^~None~^~VkInputAttachmentAspectReference~^~VUID-VkInputAttachmentAspectReference-pCreateInfo-01568~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'There must be an input attachment at pCreateInfo::pSubpasses[subpass].pInputAttachments[inputAttachmentIndex].' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-pCreateInfo-01568)~^~ +VALIDATION_ERROR_3ee00c42~^~N~^~None~^~VkInputAttachmentAspectReference~^~VUID-VkInputAttachmentAspectReference-None-01569~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'The specified input attachment must have more than one aspect mask.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-None-01569)~^~ +VALIDATION_ERROR_3ee00c44~^~N~^~None~^~VkInputAttachmentAspectReference~^~VUID-VkInputAttachmentAspectReference-aspectMask-01570~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'aspectMask must be a subset of the aspect masks in the specified input attachment.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-aspectMask-01570)~^~ +VALIDATION_ERROR_3f02b00b~^~N~^~None~^~VkRenderPassInputAttachmentAspectCreateInfo~^~VUID-VkRenderPassInputAttachmentAspectCreateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-sType-sType)~^~implicit +VALIDATION_ERROR_3f03ce1b~^~N~^~None~^~VkRenderPassInputAttachmentAspectCreateInfo~^~VUID-VkRenderPassInputAttachmentAspectCreateInfo-aspectReferenceCount-arraylength~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'aspectReferenceCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-aspectReferenceCount-arraylength)~^~implicit +VALIDATION_ERROR_3f03d001~^~N~^~None~^~VkRenderPassInputAttachmentAspectCreateInfo~^~VUID-VkRenderPassInputAttachmentAspectCreateInfo-pAspectReferences-parameter~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'pAspectReferences must be a valid pointer to an array of aspectReferenceCount valid VkInputAttachmentAspectReference structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-pAspectReferences-parameter)~^~implicit +VALIDATION_ERROR_3f200c66~^~Y~^~InvalidImageViewUsageCreateInfo~^~VkImageViewUsageCreateInfo~^~VUID-VkImageViewUsageCreateInfo-usage-01587~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'usage must not include any set bits that were not set in the usage member of the VkImageCreateInfo structure used to create the image this image view is created from.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-usage-01587)~^~ +VALIDATION_ERROR_3f22b00b~^~N~^~None~^~VkImageViewUsageCreateInfo~^~VUID-VkImageViewUsageCreateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-sType-sType)~^~implicit +VALIDATION_ERROR_3f230601~^~Y~^~InvalidImageViewUsageCreateInfo~^~VkImageViewUsageCreateInfo~^~VUID-VkImageViewUsageCreateInfo-usage-parameter~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'usage must be a valid combination of VkImageUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-usage-parameter)~^~implicit +VALIDATION_ERROR_3f230603~^~Y~^~InvalidImageViewUsageCreateInfo~^~VkImageViewUsageCreateInfo~^~VUID-VkImageViewUsageCreateInfo-usage-requiredbitmask~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-usage-requiredbitmask)~^~implicit +VALIDATION_ERROR_3f42b00b~^~N~^~None~^~VkPipelineTessellationDomainOriginStateCreateInfo~^~VUID-VkPipelineTessellationDomainOriginStateCreateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineTessellationDomainOriginStateCreateInfo-sType-sType)~^~implicit +VALIDATION_ERROR_3f43d201~^~N~^~None~^~VkPipelineTessellationDomainOriginStateCreateInfo~^~VUID-VkPipelineTessellationDomainOriginStateCreateInfo-domainOrigin-parameter~^~(VK_VERSION_1_1,VK_KHR_maintenance2)~^~The spec valid usage text states 'domainOrigin must be a valid VkTessellationDomainOrigin value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineTessellationDomainOriginStateCreateInfo-domainOrigin-parameter)~^~implicit VALIDATION_ERROR_3f600c54~^~N~^~None~^~VkImageFormatListCreateInfoKHR~^~VUID-VkImageFormatListCreateInfoKHR-viewFormatCount-01578~^~(VK_KHR_image_format_list)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfoKHR-viewFormatCount-01578)~^~ VALIDATION_ERROR_3f600c56~^~N~^~None~^~VkImageFormatListCreateInfoKHR~^~VUID-VkImageFormatListCreateInfoKHR-flags-01579~^~(VK_KHR_image_format_list)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfoKHR-flags-01579)~^~ VALIDATION_ERROR_3f600c58~^~N~^~None~^~VkImageFormatListCreateInfoKHR~^~VUID-VkImageFormatListCreateInfoKHR-viewFormatCount-01580~^~(VK_KHR_image_format_list)~^~The spec valid usage text states 'If viewFormatCount is not 0, VkImageCreateInfo::format must be in pViewFormats.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfoKHR-viewFormatCount-01580)~^~ -VALIDATION_ERROR_3f61c40d~^~N~^~None~^~VkImageFormatListCreateInfoKHR~^~VUID-VkImageFormatListCreateInfoKHR-pNext-pNext~^~(VK_KHR_image_format_list)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfoKHR-pNext-pNext)~^~implicit VALIDATION_ERROR_3f62b00b~^~N~^~None~^~VkImageFormatListCreateInfoKHR~^~VUID-VkImageFormatListCreateInfoKHR-sType-sType~^~(VK_KHR_image_format_list)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfoKHR-sType-sType)~^~implicit VALIDATION_ERROR_3f63e401~^~N~^~None~^~VkImageFormatListCreateInfoKHR~^~VUID-VkImageFormatListCreateInfoKHR-pViewFormats-parameter~^~(VK_KHR_image_format_list)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfoKHR-pViewFormats-parameter)~^~implicit -VALIDATION_ERROR_3f800ce2~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfoKHR-format-01649~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'format must not be VK_FORMAT_UNDEFINED' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-format-01649)~^~ -VALIDATION_ERROR_3f800ce4~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfoKHR-format-01650~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-format-01650)~^~ -VALIDATION_ERROR_3f800ce6~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfoKHR-xChromaOffset-01651~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-xChromaOffset-01651)~^~ -VALIDATION_ERROR_3f800ce8~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfoKHR-xChromaOffset-01652~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-xChromaOffset-01652)~^~ -VALIDATION_ERROR_3f800cea~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfoKHR-format-01653~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'format must represent unsigned normalized values (i.e. the format must be a UNORM format)' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-format-01653)~^~ -VALIDATION_ERROR_3f800cec~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfoKHR-None-01654~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the format has a _422 or _420 suffix:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-None-01654)~^~ -VALIDATION_ERROR_3f800cee~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfoKHR-ycbcrModel-01655~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-ycbcrModel-01655)~^~ -VALIDATION_ERROR_3f800cf0~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfoKHR-forceExplicitReconstruction-01656~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the format does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT, forceExplicitReconstruction must be FALSE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-forceExplicitReconstruction-01656)~^~ -VALIDATION_ERROR_3f800cf2~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfoKHR-chromaFilter-01657~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the format does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT, chromaFilter must be VK_FILTER_NEAREST' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-chromaFilter-01657)~^~ -VALIDATION_ERROR_3f802c01~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-components-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'components must be a valid VkComponentMapping structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-components-parameter)~^~implicit -VALIDATION_ERROR_3f809201~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-format-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-parameter)~^~implicit -VALIDATION_ERROR_3f81c40d~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-pNext-pNext~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_3f82b00b~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-sType-sType~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-sType-sType)~^~implicit -VALIDATION_ERROR_3f83d401~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'ycbcrModel must be a valid VkSamplerYcbcrModelConversion value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-parameter)~^~implicit -VALIDATION_ERROR_3f83d601~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'ycbcrRange must be a valid VkSamplerYcbcrRange value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-parameter)~^~implicit -VALIDATION_ERROR_3f83d801~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'xChromaOffset must be a valid VkChromaLocation value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-parameter)~^~implicit -VALIDATION_ERROR_3f83da01~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-yChromaOffset-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'yChromaOffset must be a valid VkChromaLocation value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-yChromaOffset-parameter)~^~implicit -VALIDATION_ERROR_3f83dc01~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'chromaFilter must be a valid VkFilter value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-parameter)~^~implicit -VALIDATION_ERROR_3fa00cd4~^~N~^~None~^~VkBindImagePlaneMemoryInfo~^~VUID-VkBindImagePlaneMemoryInfoKHR-planeAspect-01642~^~(VK_KHR_bind_memory2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'planeAspect must be a single valid plane aspect for the image format (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.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfoKHR-planeAspect-01642)~^~ -VALIDATION_ERROR_3fa00cd6~^~N~^~None~^~VkBindImagePlaneMemoryInfo~^~VUID-VkBindImagePlaneMemoryInfoKHR-None-01643~^~(VK_KHR_bind_memory2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'A single call to vkBindImageMemory2 must bind all or none of the planes of an image (i.e. bindings to all planes of an image must be made in a single vkBindImageMemory2 call), as separate bindings' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfoKHR-None-01643)~^~ -VALIDATION_ERROR_3fa2b00b~^~N~^~None~^~VkBindImagePlaneMemoryInfo~^~VUID-VkBindImagePlaneMemoryInfo-sType-sType~^~(VK_KHR_bind_memory2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-sType-sType)~^~implicit -VALIDATION_ERROR_3fa3de01~^~N~^~None~^~VkBindImagePlaneMemoryInfo~^~VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter~^~(VK_KHR_bind_memory2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'planeAspect must be a valid VkImageAspectFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter)~^~implicit -VALIDATION_ERROR_3fc00c70~^~N~^~None~^~VkImagePlaneMemoryRequirementsInfo~^~VUID-VkImagePlaneMemoryRequirementsInfoKHR-planeAspect-01592~^~(VK_KHR_get_memory_requirements2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'planeAspect must be an aspect that exists in the format; 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.0-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfoKHR-planeAspect-01592)~^~ -VALIDATION_ERROR_3fc2b00b~^~N~^~None~^~VkImagePlaneMemoryRequirementsInfo~^~VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType~^~(VK_KHR_get_memory_requirements2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType)~^~implicit -VALIDATION_ERROR_3fc3de01~^~N~^~None~^~VkImagePlaneMemoryRequirementsInfo~^~VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter~^~(VK_KHR_get_memory_requirements2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'planeAspect must be a valid VkImageAspectFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter)~^~implicit -VALIDATION_ERROR_3fe00ce0~^~N~^~None~^~vkCreateSamplerYcbcrConversion~^~VUID-vkCreateSamplerYcbcrConversionKHR-None-01648~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'The sampler Y'CBCR conversion feature must be enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversionKHR-None-01648)~^~ -VALIDATION_ERROR_3fe05601~^~Y~^~None~^~vkCreateSamplerYcbcrConversion~^~VUID-vkCreateSamplerYcbcrConversion-device-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-device-parameter)~^~implicit -VALIDATION_ERROR_3fe0ec01~^~N~^~None~^~vkCreateSamplerYcbcrConversion~^~VUID-vkCreateSamplerYcbcrConversion-pAllocator-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-pAllocator-parameter)~^~implicit -VALIDATION_ERROR_3fe11e01~^~N~^~None~^~vkCreateSamplerYcbcrConversion~^~VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'pCreateInfo must be a valid pointer to a valid VkSamplerYcbcrConversionCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter)~^~implicit -VALIDATION_ERROR_3fe3e001~^~Y~^~None~^~vkCreateSamplerYcbcrConversion~^~VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'pYcbcrConversion must be a valid pointer to a VkSamplerYcbcrConversion handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter)~^~implicit -VALIDATION_ERROR_40000c8c~^~N~^~None~^~VkBindBufferMemoryDeviceGroupInfo~^~VUID-VkBindBufferMemoryDeviceGroupInfoKHR-deviceIndexCount-01606~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfoKHR-deviceIndexCount-01606)~^~ -VALIDATION_ERROR_40000c8e~^~N~^~None~^~VkBindBufferMemoryDeviceGroupInfo~^~VUID-VkBindBufferMemoryDeviceGroupInfoKHR-pDeviceIndices-01607~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'All elements of pDeviceIndices must be valid device indices' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfoKHR-pDeviceIndices-01607)~^~ -VALIDATION_ERROR_40013e01~^~N~^~None~^~VkBindBufferMemoryDeviceGroupInfo~^~VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-parameter~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-parameter)~^~implicit -VALIDATION_ERROR_4001c40d~^~N~^~None~^~VkBindBufferMemoryDeviceGroupInfo~^~VUID-VkBindBufferMemoryDeviceGroupInfo-pNext-pNext~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_4002b00b~^~N~^~None~^~VkBindBufferMemoryDeviceGroupInfo~^~VUID-VkBindBufferMemoryDeviceGroupInfo-sType-sType~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-sType-sType)~^~implicit -VALIDATION_ERROR_40200cc2~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfoKHR-deviceIndexCount-01633~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'At least one of deviceIndexCount and splitInstanceBindRegionCount must be zero.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-deviceIndexCount-01633)~^~ -VALIDATION_ERROR_40200cc4~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfoKHR-deviceIndexCount-01634~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-deviceIndexCount-01634)~^~ -VALIDATION_ERROR_40200cc6~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfoKHR-pDeviceIndices-01635~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'All elements of pDeviceIndices must be valid device indices.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-pDeviceIndices-01635)~^~ -VALIDATION_ERROR_40200cc8~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfoKHR-splitInstanceBindRegionCount-01636~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-splitInstanceBindRegionCount-01636)~^~ -VALIDATION_ERROR_40200cca~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfoKHR-pSplitInstanceBindRegions-01637~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'Elements of pSplitInstanceBindRegions that correspond to the same instance of an image must not overlap.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-pSplitInstanceBindRegions-01637)~^~ -VALIDATION_ERROR_40200ccc~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfoKHR-offset-01638~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-offset-01638)~^~ -VALIDATION_ERROR_40200cce~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfoKHR-offset-01639~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-offset-01639)~^~ -VALIDATION_ERROR_40200cd0~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfoKHR-extent-01640~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-extent-01640)~^~ -VALIDATION_ERROR_40200cd2~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfoKHR-extent-01641~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-extent-01641)~^~ -VALIDATION_ERROR_40213e01~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-parameter~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-parameter)~^~implicit -VALIDATION_ERROR_4021c40d~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-pNext-pNext~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pNext-pNext)~^~implicit -VALIDATION_ERROR_4022b00b~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-sType-sType~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-sType-sType)~^~implicit -VALIDATION_ERROR_4023fe01~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-parameter~^~(VK_KHR_bind_memory2)+(VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-parameter)~^~implicit -VALIDATION_ERROR_40405601~^~Y~^~None~^~vkDestroySamplerYcbcrConversion~^~VUID-vkDestroySamplerYcbcrConversion-device-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-device-parameter)~^~implicit -VALIDATION_ERROR_4040ec01~^~N~^~None~^~vkDestroySamplerYcbcrConversion~^~VUID-vkDestroySamplerYcbcrConversion-pAllocator-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-pAllocator-parameter)~^~implicit -VALIDATION_ERROR_4043e201~^~Y~^~None~^~vkDestroySamplerYcbcrConversion~^~VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If ycbcrConversion is not VK_NULL_HANDLE, ycbcrConversion must be a valid VkSamplerYcbcrConversion handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parameter)~^~implicit -VALIDATION_ERROR_4043e207~^~Y~^~None~^~vkDestroySamplerYcbcrConversion~^~VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parent~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If ycbcrConversion is a valid handle, it must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parent)~^~implicit -VALIDATION_ERROR_4062b00b~^~N~^~None~^~VkPhysicalDeviceSamplerYcbcrConversionFeatures~^~VUID-VkPhysicalDeviceSamplerYcbcrConversionFeatures-sType-sType~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSamplerYcbcrConversionFeatures-sType-sType)~^~implicit -VALIDATION_ERROR_4082b00b~^~N~^~None~^~VkSamplerYcbcrConversionImageFormatProperties~^~VUID-VkSamplerYcbcrConversionImageFormatProperties-sType-sType~^~(VK_KHR_get_physical_device_properties2)+(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionImageFormatProperties-sType-sType)~^~implicit -VALIDATION_ERROR_40a2b00b~^~N~^~None~^~VkSamplerYcbcrConversionInfo~^~VUID-VkSamplerYcbcrConversionInfo-sType-sType~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionInfo-sType-sType)~^~implicit -VALIDATION_ERROR_40a3e601~^~N~^~None~^~VkSamplerYcbcrConversionInfo~^~VUID-VkSamplerYcbcrConversionInfo-conversion-parameter~^~(VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'conversion must be a valid VkSamplerYcbcrConversion handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionInfo-conversion-parameter)~^~implicit -VALIDATION_ERROR_40c1c40d~^~N~^~None~^~VkDeviceQueueGlobalPriorityCreateInfoEXT~^~VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-pNext-pNext~^~(VK_EXT_global_priority)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-pNext-pNext)~^~implicit +VALIDATION_ERROR_3f800ce2~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-format-01649~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)+!(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'format must not be VK_FORMAT_UNDEFINED' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-01649)~^~ +VALIDATION_ERROR_3f800ce4~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-format-01650~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-01650)~^~ +VALIDATION_ERROR_3f800ce6~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651)~^~ +VALIDATION_ERROR_3f800ce8~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652)~^~ +VALIDATION_ERROR_3f800cea~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-format-01653~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'format must represent unsigned normalized values (i.e. the format must be a UNORM format)' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-01653)~^~ +VALIDATION_ERROR_3f800cec~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-None-01654~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the format has a _422 or _420 suffix:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-None-01654)~^~ +VALIDATION_ERROR_3f800cee~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-01655~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-01655)~^~ +VALIDATION_ERROR_3f800cf0~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the format does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT, forceExplicitReconstruction must be FALSE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656)~^~ +VALIDATION_ERROR_3f800cf2~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If the format does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT, chromaFilter must be VK_FILTER_NEAREST' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657)~^~ +VALIDATION_ERROR_3f800ee0~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-format-01904~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)+(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-01904)~^~ +VALIDATION_ERROR_3f802c01~^~N~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-components-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'components must be a valid VkComponentMapping structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-components-parameter)~^~implicit +VALIDATION_ERROR_3f809201~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-format-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-parameter)~^~implicit +VALIDATION_ERROR_3f81c40d~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkExternalFormatANDROID' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-pNext-pNext)~^~implicit +VALIDATION_ERROR_3f82b00b~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-sType-sType)~^~implicit +VALIDATION_ERROR_3f83d401~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'ycbcrModel must be a valid VkSamplerYcbcrModelConversion value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-parameter)~^~implicit +VALIDATION_ERROR_3f83d601~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'ycbcrRange must be a valid VkSamplerYcbcrRange value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-parameter)~^~implicit +VALIDATION_ERROR_3f83d801~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'xChromaOffset must be a valid VkChromaLocation value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-parameter)~^~implicit +VALIDATION_ERROR_3f83da01~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-yChromaOffset-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'yChromaOffset must be a valid VkChromaLocation value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-yChromaOffset-parameter)~^~implicit +VALIDATION_ERROR_3f83dc01~^~Y~^~None~^~VkSamplerYcbcrConversionCreateInfo~^~VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'chromaFilter must be a valid VkFilter value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-parameter)~^~implicit +VALIDATION_ERROR_3fa00cd4~^~N~^~None~^~VkBindImagePlaneMemoryInfo~^~VUID-VkBindImagePlaneMemoryInfo-planeAspect-01642~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'planeAspect must be a single valid plane aspect for the image format (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.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-planeAspect-01642)~^~ +VALIDATION_ERROR_3fa00cd6~^~N~^~None~^~VkBindImagePlaneMemoryInfo~^~VUID-VkBindImagePlaneMemoryInfo-None-01643~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'A single call to vkBindImageMemory2 must bind all or none of the planes of an image (i.e. bindings to all planes of an image must be made in a single vkBindImageMemory2 call), as separate bindings' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-None-01643)~^~ +VALIDATION_ERROR_3fa2b00b~^~N~^~None~^~VkBindImagePlaneMemoryInfo~^~VUID-VkBindImagePlaneMemoryInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-sType-sType)~^~implicit +VALIDATION_ERROR_3fa3de01~^~N~^~None~^~VkBindImagePlaneMemoryInfo~^~VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'planeAspect must be a valid VkImageAspectFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter)~^~implicit +VALIDATION_ERROR_3fc00c70~^~N~^~None~^~VkImagePlaneMemoryRequirementsInfo~^~VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-01592~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'planeAspect must be an aspect that exists in the format; 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.0-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-01592)~^~ +VALIDATION_ERROR_3fc2b00b~^~N~^~None~^~VkImagePlaneMemoryRequirementsInfo~^~VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType)~^~implicit +VALIDATION_ERROR_3fc3de01~^~N~^~None~^~VkImagePlaneMemoryRequirementsInfo~^~VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter~^~(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'planeAspect must be a valid VkImageAspectFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter)~^~implicit +VALIDATION_ERROR_3fe00ce0~^~N~^~None~^~vkCreateSamplerYcbcrConversion~^~VUID-vkCreateSamplerYcbcrConversion-None-01648~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'The sampler Y'CBCR conversion feature must be enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-None-01648)~^~ +VALIDATION_ERROR_3fe05601~^~Y~^~None~^~vkCreateSamplerYcbcrConversion~^~VUID-vkCreateSamplerYcbcrConversion-device-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-device-parameter)~^~implicit +VALIDATION_ERROR_3fe0ec01~^~N~^~None~^~vkCreateSamplerYcbcrConversion~^~VUID-vkCreateSamplerYcbcrConversion-pAllocator-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-pAllocator-parameter)~^~implicit +VALIDATION_ERROR_3fe11e01~^~N~^~None~^~vkCreateSamplerYcbcrConversion~^~VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'pCreateInfo must be a valid pointer to a valid VkSamplerYcbcrConversionCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter)~^~implicit +VALIDATION_ERROR_3fe3e001~^~Y~^~None~^~vkCreateSamplerYcbcrConversion~^~VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'pYcbcrConversion must be a valid pointer to a VkSamplerYcbcrConversion handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter)~^~implicit +VALIDATION_ERROR_40000c8c~^~N~^~None~^~VkBindBufferMemoryDeviceGroupInfo~^~VUID-VkBindBufferMemoryDeviceGroupInfo-deviceIndexCount-01606~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-deviceIndexCount-01606)~^~ +VALIDATION_ERROR_40000c8e~^~N~^~None~^~VkBindBufferMemoryDeviceGroupInfo~^~VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-01607~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'All elements of pDeviceIndices must be valid device indices' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-01607)~^~ +VALIDATION_ERROR_40013e01~^~N~^~None~^~VkBindBufferMemoryDeviceGroupInfo~^~VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-parameter~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-parameter)~^~implicit +VALIDATION_ERROR_4002b00b~^~N~^~None~^~VkBindBufferMemoryDeviceGroupInfo~^~VUID-VkBindBufferMemoryDeviceGroupInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-sType-sType)~^~implicit +VALIDATION_ERROR_40200cc2~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01633~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'At least one of deviceIndexCount and splitInstanceBindRegionCount must be zero.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01633)~^~ +VALIDATION_ERROR_40200cc4~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01634~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01634)~^~ +VALIDATION_ERROR_40200cc6~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-01635~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'All elements of pDeviceIndices must be valid device indices.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-01635)~^~ +VALIDATION_ERROR_40200cc8~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-splitInstanceBindRegionCount-01636~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-splitInstanceBindRegionCount-01636)~^~ +VALIDATION_ERROR_40200cca~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-01637~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'Elements of pSplitInstanceBindRegions that correspond to the same instance of an image must not overlap.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-01637)~^~ +VALIDATION_ERROR_40200ccc~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-offset-01638~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-offset-01638)~^~ +VALIDATION_ERROR_40200cce~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-offset-01639~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-offset-01639)~^~ +VALIDATION_ERROR_40200cd0~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-extent-01640~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-extent-01640)~^~ +VALIDATION_ERROR_40200cd2~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-extent-01641~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-extent-01641)~^~ +VALIDATION_ERROR_40213e01~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-parameter~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-parameter)~^~implicit +VALIDATION_ERROR_4022b00b~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-sType-sType)~^~implicit +VALIDATION_ERROR_4023fe01~^~N~^~None~^~VkBindImageMemoryDeviceGroupInfo~^~VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-parameter~^~(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-parameter)~^~implicit +VALIDATION_ERROR_40405601~^~Y~^~None~^~vkDestroySamplerYcbcrConversion~^~VUID-vkDestroySamplerYcbcrConversion-device-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-device-parameter)~^~implicit +VALIDATION_ERROR_4040ec01~^~N~^~None~^~vkDestroySamplerYcbcrConversion~^~VUID-vkDestroySamplerYcbcrConversion-pAllocator-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-pAllocator-parameter)~^~implicit +VALIDATION_ERROR_4043e201~^~Y~^~None~^~vkDestroySamplerYcbcrConversion~^~VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If ycbcrConversion is not VK_NULL_HANDLE, ycbcrConversion must be a valid VkSamplerYcbcrConversion handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parameter)~^~implicit +VALIDATION_ERROR_4043e207~^~Y~^~None~^~vkDestroySamplerYcbcrConversion~^~VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parent~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If ycbcrConversion is a valid handle, it must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parent)~^~implicit +VALIDATION_ERROR_4062b00b~^~N~^~None~^~VkPhysicalDeviceSamplerYcbcrConversionFeatures~^~VUID-VkPhysicalDeviceSamplerYcbcrConversionFeatures-sType-sType~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSamplerYcbcrConversionFeatures-sType-sType)~^~implicit +VALIDATION_ERROR_4082b00b~^~N~^~None~^~VkSamplerYcbcrConversionImageFormatProperties~^~VUID-VkSamplerYcbcrConversionImageFormatProperties-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionImageFormatProperties-sType-sType)~^~implicit +VALIDATION_ERROR_40a2b00b~^~N~^~None~^~VkSamplerYcbcrConversionInfo~^~VUID-VkSamplerYcbcrConversionInfo-sType-sType~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionInfo-sType-sType)~^~implicit +VALIDATION_ERROR_40a3e601~^~N~^~None~^~VkSamplerYcbcrConversionInfo~^~VUID-VkSamplerYcbcrConversionInfo-conversion-parameter~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'conversion must be a valid VkSamplerYcbcrConversion handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionInfo-conversion-parameter)~^~implicit VALIDATION_ERROR_40c2b00b~^~N~^~None~^~VkDeviceQueueGlobalPriorityCreateInfoEXT~^~VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-sType-sType~^~(VK_EXT_global_priority)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-sType-sType)~^~implicit VALIDATION_ERROR_40c3ea01~^~N~^~None~^~VkDeviceQueueGlobalPriorityCreateInfoEXT~^~VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-globalPriority-parameter~^~(VK_EXT_global_priority)~^~The spec valid usage text states 'globalPriority must be a valid VkQueueGlobalPriorityEXT value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-globalPriority-parameter)~^~implicit VALIDATION_ERROR_40e05601~^~Y~^~None~^~vkGetShaderInfoAMD~^~VUID-vkGetShaderInfoAMD-device-parameter~^~(VK_AMD_shader_info)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetShaderInfoAMD-device-parameter)~^~implicit @@ -3700,11 +3766,9 @@ VALIDATION_ERROR_41200dac~^~N~^~None~^~VkImportMemoryHostPointerInfoEXT~^~VUID-VkImportMemoryHostPointerInfoEXT-handleType-01750~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-handleType-01750)~^~ VALIDATION_ERROR_41200dae~^~N~^~None~^~VkImportMemoryHostPointerInfoEXT~^~VUID-VkImportMemoryHostPointerInfoEXT-handleType-01751~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-handleType-01751)~^~ VALIDATION_ERROR_41209c01~^~N~^~None~^~VkImportMemoryHostPointerInfoEXT~^~VUID-VkImportMemoryHostPointerInfoEXT-handleType-parameter~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states 'handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-handleType-parameter)~^~implicit -VALIDATION_ERROR_4121c40d~^~N~^~None~^~VkImportMemoryHostPointerInfoEXT~^~VUID-VkImportMemoryHostPointerInfoEXT-pNext-pNext~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_4122b00b~^~N~^~None~^~VkImportMemoryHostPointerInfoEXT~^~VUID-VkImportMemoryHostPointerInfoEXT-sType-sType~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-sType-sType)~^~implicit VALIDATION_ERROR_4141c40d~^~N~^~None~^~VkMemoryHostPointerPropertiesEXT~^~VUID-VkMemoryHostPointerPropertiesEXT-pNext-pNext~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryHostPointerPropertiesEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_4142b00b~^~Y~^~None~^~VkMemoryHostPointerPropertiesEXT~^~VUID-VkMemoryHostPointerPropertiesEXT-sType-sType~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryHostPointerPropertiesEXT-sType-sType)~^~implicit -VALIDATION_ERROR_4161c40d~^~N~^~None~^~VkPhysicalDeviceExternalMemoryHostPropertiesEXT~^~VUID-VkPhysicalDeviceExternalMemoryHostPropertiesEXT-pNext-pNext~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalMemoryHostPropertiesEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_4162b00b~^~N~^~None~^~VkPhysicalDeviceExternalMemoryHostPropertiesEXT~^~VUID-VkPhysicalDeviceExternalMemoryHostPropertiesEXT-sType-sType~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalMemoryHostPropertiesEXT-sType-sType)~^~implicit VALIDATION_ERROR_41800db0~^~N~^~None~^~vkGetMemoryHostPointerPropertiesEXT~^~VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01752~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01752)~^~ VALIDATION_ERROR_41800db2~^~N~^~None~^~vkGetMemoryHostPointerPropertiesEXT~^~VUID-vkGetMemoryHostPointerPropertiesEXT-pHostPointer-01753~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states 'pHostPointer must be a pointer aligned to an integer multiple of VkPhysicalDeviceExternalMemoryHostPropertiesEXT::minImportedHostPointerAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-pHostPointer-01753)~^~ @@ -3713,11 +3777,9 @@ VALIDATION_ERROR_41805601~^~Y~^~None~^~vkGetMemoryHostPointerPropertiesEXT~^~VUID-vkGetMemoryHostPointerPropertiesEXT-device-parameter~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-device-parameter)~^~implicit VALIDATION_ERROR_41809c01~^~Y~^~None~^~vkGetMemoryHostPointerPropertiesEXT~^~VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-parameter~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states 'handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-parameter)~^~implicit VALIDATION_ERROR_4183f401~^~N~^~None~^~vkGetMemoryHostPointerPropertiesEXT~^~VUID-vkGetMemoryHostPointerPropertiesEXT-pMemoryHostPointerProperties-parameter~^~(VK_EXT_external_memory_host)~^~The spec valid usage text states 'pMemoryHostPointerProperties must be a valid pointer to a VkMemoryHostPointerPropertiesEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-pMemoryHostPointerProperties-parameter)~^~implicit -VALIDATION_ERROR_41a1c40d~^~N~^~None~^~VkPhysicalDeviceConservativeRasterizationPropertiesEXT~^~VUID-VkPhysicalDeviceConservativeRasterizationPropertiesEXT-pNext-pNext~^~(VK_EXT_conservative_rasterization)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceConservativeRasterizationPropertiesEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_41a2b00b~^~N~^~None~^~VkPhysicalDeviceConservativeRasterizationPropertiesEXT~^~VUID-VkPhysicalDeviceConservativeRasterizationPropertiesEXT-sType-sType~^~(VK_EXT_conservative_rasterization)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceConservativeRasterizationPropertiesEXT-sType-sType)~^~implicit VALIDATION_ERROR_41c00dd2~^~N~^~None~^~VkPipelineRasterizationConservativeStateCreateInfoEXT~^~VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-extraPrimitiveOverestimationSize-01769~^~(VK_EXT_conservative_rasterization)~^~The spec valid usage text states 'extraPrimitiveOverestimationSize must be in the range of 0.0 to VkPhysicalDeviceConservativeRasterizationPropertiesEXT::maxExtraPrimitiveOverestimationSize inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-extraPrimitiveOverestimationSize-01769)~^~ VALIDATION_ERROR_41c09005~^~N~^~None~^~VkPipelineRasterizationConservativeStateCreateInfoEXT~^~VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-flags-zerobitmask~^~(VK_EXT_conservative_rasterization)~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-flags-zerobitmask)~^~implicit -VALIDATION_ERROR_41c1c40d~^~N~^~None~^~VkPipelineRasterizationConservativeStateCreateInfoEXT~^~VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-pNext-pNext~^~(VK_EXT_conservative_rasterization)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-pNext-pNext)~^~implicit VALIDATION_ERROR_41c2b00b~^~N~^~None~^~VkPipelineRasterizationConservativeStateCreateInfoEXT~^~VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-sType-sType~^~(VK_EXT_conservative_rasterization)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-sType-sType)~^~implicit VALIDATION_ERROR_41c3f801~^~N~^~None~^~VkPipelineRasterizationConservativeStateCreateInfoEXT~^~VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-conservativeRasterizationMode-parameter~^~(VK_EXT_conservative_rasterization)~^~The spec valid usage text states 'conservativeRasterizationMode must be a valid VkConservativeRasterizationModeEXT value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-conservativeRasterizationMode-parameter)~^~implicit VALIDATION_ERROR_41e00009~^~Y~^~None~^~vkCmdWriteBufferMarkerAMD~^~VUID-vkCmdWriteBufferMarkerAMD-commonparent~^~(VK_AMD_buffer_marker)~^~The spec valid usage text states 'Both of commandBuffer, and dstBuffer must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-commonparent)~^~implicit @@ -3730,30 +3792,147 @@ VALIDATION_ERROR_41e02415~^~N~^~None~^~vkCmdWriteBufferMarkerAMD~^~VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-cmdpool~^~(VK_AMD_buffer_marker)~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_41e06c01~^~Y~^~None~^~vkCmdWriteBufferMarkerAMD~^~VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-parameter~^~(VK_AMD_buffer_marker)~^~The spec valid usage text states 'dstBuffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-parameter)~^~implicit VALIDATION_ERROR_41e28401~^~Y~^~None~^~vkCmdWriteBufferMarkerAMD~^~VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-parameter~^~(VK_AMD_buffer_marker)~^~The spec valid usage text states 'pipelineStage must be a valid VkPipelineStageFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-parameter)~^~implicit -VALIDATION_ERROR_4201c40d~^~N~^~None~^~VkDescriptorSetLayoutSupport~^~VUID-VkDescriptorSetLayoutSupport-pNext-pNext~^~(VK_KHR_maintenance3)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutSupport-pNext-pNext)~^~implicit -VALIDATION_ERROR_4202b00b~^~Y~^~None~^~VkDescriptorSetLayoutSupport~^~VUID-VkDescriptorSetLayoutSupport-sType-sType~^~(VK_KHR_maintenance3)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutSupport-sType-sType)~^~implicit +VALIDATION_ERROR_4201c40d~^~N~^~None~^~VkDescriptorSetLayoutSupport~^~VUID-VkDescriptorSetLayoutSupport-pNext-pNext~^~(VK_VERSION_1_1,VK_KHR_maintenance3)~^~The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkDescriptorSetVariableDescriptorCountLayoutSupportEXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutSupport-pNext-pNext)~^~implicit +VALIDATION_ERROR_4202b00b~^~Y~^~None~^~VkDescriptorSetLayoutSupport~^~VUID-VkDescriptorSetLayoutSupport-sType-sType~^~(VK_VERSION_1_1,VK_KHR_maintenance3)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutSupport-sType-sType)~^~implicit +VALIDATION_ERROR_42200e64~^~N~^~None~^~VkDeviceQueueInfo2~^~VUID-VkDeviceQueueInfo2-queueFamilyIndex-01842~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-queueFamilyIndex-01842)~^~ +VALIDATION_ERROR_42200e66~^~N~^~None~^~VkDeviceQueueInfo2~^~VUID-VkDeviceQueueInfo2-queueIndex-01843~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-queueIndex-01843)~^~ VALIDATION_ERROR_42209001~^~N~^~None~^~VkDeviceQueueInfo2~^~VUID-VkDeviceQueueInfo2-flags-parameter~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'flags must be a valid combination of VkDeviceQueueCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-flags-parameter)~^~implicit VALIDATION_ERROR_42209003~^~Y~^~None~^~VkDeviceQueueInfo2~^~VUID-VkDeviceQueueInfo2-flags-requiredbitmask~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'flags must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-flags-requiredbitmask)~^~implicit VALIDATION_ERROR_4221c40d~^~Y~^~None~^~VkDeviceQueueInfo2~^~VUID-VkDeviceQueueInfo2-pNext-pNext~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-pNext-pNext)~^~implicit VALIDATION_ERROR_4222b00b~^~Y~^~None~^~VkDeviceQueueInfo2~^~VUID-VkDeviceQueueInfo2-sType-sType~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-sType-sType)~^~implicit -VALIDATION_ERROR_4241c40d~^~N~^~None~^~VkPhysicalDeviceMaintenance3Properties~^~VUID-VkPhysicalDeviceMaintenance3Properties-pNext-pNext~^~(VK_KHR_maintenance3)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMaintenance3Properties-pNext-pNext)~^~implicit -VALIDATION_ERROR_4242b00b~^~N~^~None~^~VkPhysicalDeviceMaintenance3Properties~^~VUID-VkPhysicalDeviceMaintenance3Properties-sType-sType~^~(VK_KHR_maintenance3)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMaintenance3Properties-sType-sType)~^~implicit -VALIDATION_ERROR_4261c40d~^~N~^~None~^~VkPhysicalDeviceProtectedMemoryFeatures~^~VUID-VkPhysicalDeviceProtectedMemoryFeatures-pNext-pNext~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProtectedMemoryFeatures-pNext-pNext)~^~implicit +VALIDATION_ERROR_4242b00b~^~N~^~None~^~VkPhysicalDeviceMaintenance3Properties~^~VUID-VkPhysicalDeviceMaintenance3Properties-sType-sType~^~(VK_VERSION_1_1,VK_KHR_maintenance3)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMaintenance3Properties-sType-sType)~^~implicit VALIDATION_ERROR_4262b00b~^~N~^~None~^~VkPhysicalDeviceProtectedMemoryFeatures~^~VUID-VkPhysicalDeviceProtectedMemoryFeatures-sType-sType~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProtectedMemoryFeatures-sType-sType)~^~implicit -VALIDATION_ERROR_4281c40d~^~N~^~None~^~VkPhysicalDeviceProtectedMemoryProperties~^~VUID-VkPhysicalDeviceProtectedMemoryProperties-pNext-pNext~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProtectedMemoryProperties-pNext-pNext)~^~implicit VALIDATION_ERROR_4282b00b~^~N~^~None~^~VkPhysicalDeviceProtectedMemoryProperties~^~VUID-VkPhysicalDeviceProtectedMemoryProperties-sType-sType~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProtectedMemoryProperties-sType-sType)~^~implicit VALIDATION_ERROR_42a2b00b~^~N~^~None~^~VkPhysicalDeviceShaderDrawParameterFeatures~^~VUID-VkPhysicalDeviceShaderDrawParameterFeatures-sType-sType~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderDrawParameterFeatures-sType-sType)~^~implicit -VALIDATION_ERROR_42c1c40d~^~N~^~None~^~VkPhysicalDeviceSubgroupProperties~^~VUID-VkPhysicalDeviceSubgroupProperties-pNext-pNext~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSubgroupProperties-pNext-pNext)~^~implicit VALIDATION_ERROR_42c2b00b~^~N~^~None~^~VkPhysicalDeviceSubgroupProperties~^~VUID-VkPhysicalDeviceSubgroupProperties-sType-sType~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSubgroupProperties-sType-sType)~^~implicit -VALIDATION_ERROR_42e1c40d~^~N~^~None~^~VkProtectedSubmitInfo~^~VUID-VkProtectedSubmitInfo-pNext-pNext~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-pNext-pNext)~^~implicit +VALIDATION_ERROR_42e00e30~^~N~^~None~^~VkProtectedSubmitInfo~^~VUID-VkProtectedSubmitInfo-protectedSubmit-01816~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If the protected memory feature is not enabled, protectedSubmit must not be VK_TRUE.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-protectedSubmit-01816)~^~ +VALIDATION_ERROR_42e00e32~^~N~^~None~^~VkProtectedSubmitInfo~^~VUID-VkProtectedSubmitInfo-protectedSubmit-01817~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-protectedSubmit-01817)~^~ +VALIDATION_ERROR_42e00e34~^~N~^~None~^~VkProtectedSubmitInfo~^~VUID-VkProtectedSubmitInfo-protectedSubmit-01818~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-protectedSubmit-01818)~^~ +VALIDATION_ERROR_42e00e36~^~N~^~None~^~VkProtectedSubmitInfo~^~VUID-VkProtectedSubmitInfo-pNext-01819~^~(VK_VERSION_1_1)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-pNext-01819)~^~ VALIDATION_ERROR_42e2b00b~^~N~^~None~^~VkProtectedSubmitInfo~^~VUID-VkProtectedSubmitInfo-sType-sType~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-sType-sType)~^~implicit VALIDATION_ERROR_43040001~^~N~^~None~^~vkEnumerateInstanceVersion~^~VUID-vkEnumerateInstanceVersion-pApiVersion-parameter~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'pApiVersion must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkEnumerateInstanceVersion-pApiVersion-parameter)~^~implicit -VALIDATION_ERROR_43205601~^~Y~^~None~^~vkGetDescriptorSetLayoutSupport~^~VUID-vkGetDescriptorSetLayoutSupport-device-parameter~^~(VK_KHR_maintenance3)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDescriptorSetLayoutSupport-device-parameter)~^~implicit -VALIDATION_ERROR_43211e01~^~N~^~None~^~vkGetDescriptorSetLayoutSupport~^~VUID-vkGetDescriptorSetLayoutSupport-pCreateInfo-parameter~^~(VK_KHR_maintenance3)~^~The spec valid usage text states 'pCreateInfo must be a valid pointer to a valid VkDescriptorSetLayoutCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDescriptorSetLayoutSupport-pCreateInfo-parameter)~^~implicit -VALIDATION_ERROR_43240201~^~N~^~None~^~vkGetDescriptorSetLayoutSupport~^~VUID-vkGetDescriptorSetLayoutSupport-pSupport-parameter~^~(VK_KHR_maintenance3)~^~The spec valid usage text states 'pSupport must be a valid pointer to a VkDescriptorSetLayoutSupport structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDescriptorSetLayoutSupport-pSupport-parameter)~^~implicit +VALIDATION_ERROR_43205601~^~Y~^~None~^~vkGetDescriptorSetLayoutSupport~^~VUID-vkGetDescriptorSetLayoutSupport-device-parameter~^~(VK_VERSION_1_1,VK_KHR_maintenance3)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDescriptorSetLayoutSupport-device-parameter)~^~implicit +VALIDATION_ERROR_43211e01~^~N~^~None~^~vkGetDescriptorSetLayoutSupport~^~VUID-vkGetDescriptorSetLayoutSupport-pCreateInfo-parameter~^~(VK_VERSION_1_1,VK_KHR_maintenance3)~^~The spec valid usage text states 'pCreateInfo must be a valid pointer to a valid VkDescriptorSetLayoutCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDescriptorSetLayoutSupport-pCreateInfo-parameter)~^~implicit +VALIDATION_ERROR_43240201~^~N~^~None~^~vkGetDescriptorSetLayoutSupport~^~VUID-vkGetDescriptorSetLayoutSupport-pSupport-parameter~^~(VK_VERSION_1_1,VK_KHR_maintenance3)~^~The spec valid usage text states 'pSupport must be a valid pointer to a VkDescriptorSetLayoutSupport structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDescriptorSetLayoutSupport-pSupport-parameter)~^~implicit VALIDATION_ERROR_43405601~^~Y~^~None~^~vkGetDeviceQueue2~^~VUID-vkGetDeviceQueue2-device-parameter~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceQueue2-device-parameter)~^~implicit VALIDATION_ERROR_4341fc01~^~Y~^~None~^~vkGetDeviceQueue2~^~VUID-vkGetDeviceQueue2-pQueue-parameter~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'pQueue must be a valid pointer to a VkQueue handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceQueue2-pQueue-parameter)~^~implicit VALIDATION_ERROR_43440401~^~N~^~None~^~vkGetDeviceQueue2~^~VUID-vkGetDeviceQueue2-pQueueInfo-parameter~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'pQueueInfo must be a valid pointer to a valid VkDeviceQueueInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceQueue2-pQueueInfo-parameter)~^~implicit -VALIDATION_ERROR_4441c40d~^~N~^~None~^~VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT~^~VUID-VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT-pNext-pNext~^~(VK_EXT_vertex_attribute_divisor)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT-pNext-pNext)~^~implicit +VALIDATION_ERROR_43600ee2~^~N~^~None~^~VkDebugUtilsObjectNameInfoEXT~^~VUID-VkDebugUtilsObjectNameInfoEXT-objectType-01905~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'objectType must not be VK_OBJECT_TYPE_UNKNOWN' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-objectType-01905)~^~ +VALIDATION_ERROR_43600ee4~^~N~^~None~^~VkDebugUtilsObjectNameInfoEXT~^~VUID-VkDebugUtilsObjectNameInfoEXT-objectHandle-01906~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'objectHandle must not be VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-objectHandle-01906)~^~ +VALIDATION_ERROR_43600ee6~^~N~^~None~^~VkDebugUtilsObjectNameInfoEXT~^~VUID-VkDebugUtilsObjectNameInfoEXT-objectHandle-01907~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'objectHandle must be a Vulkan object of the type associated with objectType as defined in debugging-object-types.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-objectHandle-01907)~^~ +VALIDATION_ERROR_4360da01~^~Y~^~None~^~VkDebugUtilsObjectNameInfoEXT~^~VUID-VkDebugUtilsObjectNameInfoEXT-objectType-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'objectType must be a valid VkObjectType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-objectType-parameter)~^~implicit +VALIDATION_ERROR_4361c40d~^~Y~^~None~^~VkDebugUtilsObjectNameInfoEXT~^~VUID-VkDebugUtilsObjectNameInfoEXT-pNext-pNext~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-pNext-pNext)~^~implicit +VALIDATION_ERROR_4361ce01~^~N~^~None~^~VkDebugUtilsObjectNameInfoEXT~^~VUID-VkDebugUtilsObjectNameInfoEXT-pObjectName-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'If pObjectName is not NULL, pObjectName must be a null-terminated UTF-8 string' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-pObjectName-parameter)~^~implicit +VALIDATION_ERROR_4362b00b~^~Y~^~None~^~VkDebugUtilsObjectNameInfoEXT~^~VUID-VkDebugUtilsObjectNameInfoEXT-sType-sType~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-sType-sType)~^~implicit +VALIDATION_ERROR_43800ee8~^~N~^~None~^~VkDebugUtilsObjectTagInfoEXT~^~VUID-VkDebugUtilsObjectTagInfoEXT-objectType-01908~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'objectType must not be VK_OBJECT_TYPE_UNKNOWN' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-objectType-01908)~^~ +VALIDATION_ERROR_43800eea~^~N~^~None~^~VkDebugUtilsObjectTagInfoEXT~^~VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01909~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'objectHandle must not be VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01909)~^~ +VALIDATION_ERROR_43800eec~^~N~^~None~^~VkDebugUtilsObjectTagInfoEXT~^~VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01910~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'objectHandle must be a Vulkan object of the type associated with objectType as defined in debugging-object-types.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01910)~^~ +VALIDATION_ERROR_4380da01~^~Y~^~None~^~VkDebugUtilsObjectTagInfoEXT~^~VUID-VkDebugUtilsObjectTagInfoEXT-objectType-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'objectType must be a valid VkObjectType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-objectType-parameter)~^~implicit +VALIDATION_ERROR_4381c40d~^~Y~^~None~^~VkDebugUtilsObjectTagInfoEXT~^~VUID-VkDebugUtilsObjectTagInfoEXT-pNext-pNext~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-pNext-pNext)~^~implicit +VALIDATION_ERROR_43825a01~^~Y~^~None~^~VkDebugUtilsObjectTagInfoEXT~^~VUID-VkDebugUtilsObjectTagInfoEXT-pTag-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pTag must be a valid pointer to an array of tagSize bytes' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-pTag-parameter)~^~implicit +VALIDATION_ERROR_4382b00b~^~Y~^~None~^~VkDebugUtilsObjectTagInfoEXT~^~VUID-VkDebugUtilsObjectTagInfoEXT-sType-sType~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-sType-sType)~^~implicit +VALIDATION_ERROR_4382f41b~^~Y~^~None~^~VkDebugUtilsObjectTagInfoEXT~^~VUID-VkDebugUtilsObjectTagInfoEXT-tagSize-arraylength~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'tagSize must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-tagSize-arraylength)~^~implicit +VALIDATION_ERROR_43a1c40d~^~Y~^~None~^~VkDebugUtilsLabelEXT~^~VUID-VkDebugUtilsLabelEXT-pNext-pNext~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsLabelEXT-pNext-pNext)~^~implicit +VALIDATION_ERROR_43a2b00b~^~Y~^~None~^~VkDebugUtilsLabelEXT~^~VUID-VkDebugUtilsLabelEXT-sType-sType~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsLabelEXT-sType-sType)~^~implicit +VALIDATION_ERROR_43a40801~^~Y~^~None~^~VkDebugUtilsLabelEXT~^~VUID-VkDebugUtilsLabelEXT-pLabelName-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pLabelName must be a null-terminated UTF-8 string' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsLabelEXT-pLabelName-parameter)~^~implicit +VALIDATION_ERROR_43c09005~^~Y~^~None~^~VkDebugUtilsMessengerCallbackDataEXT~^~VUID-VkDebugUtilsMessengerCallbackDataEXT-flags-zerobitmask~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-flags-zerobitmask)~^~implicit +VALIDATION_ERROR_43c0d61b~^~N~^~None~^~VkDebugUtilsMessengerCallbackDataEXT~^~VUID-VkDebugUtilsMessengerCallbackDataEXT-objectCount-arraylength~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'objectCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-objectCount-arraylength)~^~implicit +VALIDATION_ERROR_43c1b801~^~Y~^~None~^~VkDebugUtilsMessengerCallbackDataEXT~^~VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessage-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pMessage must be a null-terminated UTF-8 string' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessage-parameter)~^~implicit +VALIDATION_ERROR_43c1c40d~^~Y~^~None~^~VkDebugUtilsMessengerCallbackDataEXT~^~VUID-VkDebugUtilsMessengerCallbackDataEXT-pNext-pNext~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pNext-pNext)~^~implicit +VALIDATION_ERROR_43c2b00b~^~Y~^~None~^~VkDebugUtilsMessengerCallbackDataEXT~^~VUID-VkDebugUtilsMessengerCallbackDataEXT-sType-sType~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-sType-sType)~^~implicit +VALIDATION_ERROR_43c42201~^~N~^~None~^~VkDebugUtilsMessengerCallbackDataEXT~^~VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessageIdName-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'If pMessageIdName is not NULL, pMessageIdName must be a null-terminated UTF-8 string' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessageIdName-parameter)~^~implicit +VALIDATION_ERROR_43e00ef4~^~N~^~None~^~VkDebugUtilsMessengerCreateInfoEXT~^~VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-01914~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pfnUserCallback must be a valid PFN_vkDebugUtilsMessengerCallbackEXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-01914)~^~ +VALIDATION_ERROR_43e09005~^~Y~^~None~^~VkDebugUtilsMessengerCreateInfoEXT~^~VUID-VkDebugUtilsMessengerCreateInfoEXT-flags-zerobitmask~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-flags-zerobitmask)~^~implicit +VALIDATION_ERROR_43e2b00b~^~Y~^~None~^~VkDebugUtilsMessengerCreateInfoEXT~^~VUID-VkDebugUtilsMessengerCreateInfoEXT-sType-sType~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-sType-sType)~^~implicit +VALIDATION_ERROR_43e40a01~^~N~^~None~^~VkDebugUtilsMessengerCreateInfoEXT~^~VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'messageSeverity must be a valid combination of VkDebugUtilsMessageSeverityFlagBitsEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-parameter)~^~implicit +VALIDATION_ERROR_43e40a03~^~Y~^~None~^~VkDebugUtilsMessengerCreateInfoEXT~^~VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-requiredbitmask~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'messageSeverity must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-requiredbitmask)~^~implicit +VALIDATION_ERROR_43e40c01~^~N~^~None~^~VkDebugUtilsMessengerCreateInfoEXT~^~VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'messageType must be a valid combination of VkDebugUtilsMessageTypeFlagBitsEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-parameter)~^~implicit +VALIDATION_ERROR_43e40c03~^~Y~^~None~^~VkDebugUtilsMessengerCreateInfoEXT~^~VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-requiredbitmask~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'messageType must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-requiredbitmask)~^~implicit +VALIDATION_ERROR_4400bc01~^~N~^~None~^~vkCreateDebugUtilsMessengerEXT~^~VUID-vkCreateDebugUtilsMessengerEXT-instance-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'instance must be a valid VkInstance handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDebugUtilsMessengerEXT-instance-parameter)~^~implicit +VALIDATION_ERROR_4400ec01~^~N~^~None~^~vkCreateDebugUtilsMessengerEXT~^~VUID-vkCreateDebugUtilsMessengerEXT-pAllocator-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDebugUtilsMessengerEXT-pAllocator-parameter)~^~implicit +VALIDATION_ERROR_44011e01~^~N~^~None~^~vkCreateDebugUtilsMessengerEXT~^~VUID-vkCreateDebugUtilsMessengerEXT-pCreateInfo-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pCreateInfo must be a valid pointer to a valid VkDebugUtilsMessengerCreateInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDebugUtilsMessengerEXT-pCreateInfo-parameter)~^~implicit +VALIDATION_ERROR_44041001~^~Y~^~None~^~vkCreateDebugUtilsMessengerEXT~^~VUID-vkCreateDebugUtilsMessengerEXT-pMessenger-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pMessenger must be a valid pointer to a VkDebugUtilsMessengerEXT handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDebugUtilsMessengerEXT-pMessenger-parameter)~^~implicit +VALIDATION_ERROR_4420bc01~^~N~^~None~^~vkSubmitDebugUtilsMessageEXT~^~VUID-vkSubmitDebugUtilsMessageEXT-instance-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'instance must be a valid VkInstance handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-instance-parameter)~^~implicit +VALIDATION_ERROR_44240a01~^~Y~^~None~^~vkSubmitDebugUtilsMessageEXT~^~VUID-vkSubmitDebugUtilsMessageEXT-messageSeverity-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'messageSeverity must be a valid VkDebugUtilsMessageSeverityFlagBitsEXT value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-messageSeverity-parameter)~^~implicit +VALIDATION_ERROR_44241201~^~N~^~None~^~vkSubmitDebugUtilsMessageEXT~^~VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'messageTypes must be a valid combination of VkDebugUtilsMessageTypeFlagBitsEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-parameter)~^~implicit +VALIDATION_ERROR_44241203~^~Y~^~None~^~vkSubmitDebugUtilsMessageEXT~^~VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-requiredbitmask~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'messageTypes must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-requiredbitmask)~^~implicit +VALIDATION_ERROR_44242801~^~N~^~None~^~vkSubmitDebugUtilsMessageEXT~^~VUID-vkSubmitDebugUtilsMessageEXT-pCallbackData-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pCallbackData must be a valid pointer to a valid VkDebugUtilsMessengerCallbackDataEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-pCallbackData-parameter)~^~implicit VALIDATION_ERROR_4442b00b~^~N~^~None~^~VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT~^~VUID-VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT-sType-sType~^~(VK_EXT_vertex_attribute_divisor)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT-sType-sType)~^~implicit +VALIDATION_ERROR_4462b00b~^~N~^~None~^~VkPipelineVertexInputDivisorStateCreateInfoEXT~^~VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-sType-sType~^~(VK_EXT_vertex_attribute_divisor)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-sType-sType)~^~implicit +VALIDATION_ERROR_4464141b~^~N~^~None~^~VkPipelineVertexInputDivisorStateCreateInfoEXT~^~VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-vertexBindingDivisorCount-arraylength~^~(VK_EXT_vertex_attribute_divisor)~^~The spec valid usage text states 'vertexBindingDivisorCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-vertexBindingDivisorCount-arraylength)~^~implicit +VALIDATION_ERROR_44641601~^~N~^~None~^~VkPipelineVertexInputDivisorStateCreateInfoEXT~^~VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-pVertexBindingDivisors-parameter~^~(VK_EXT_vertex_attribute_divisor)~^~The spec valid usage text states 'pVertexBindingDivisors must be a valid pointer to an array of vertexBindingDivisorCount VkVertexInputBindingDivisorDescriptionEXT structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-pVertexBindingDivisors-parameter)~^~implicit +VALIDATION_ERROR_44800ecc~^~N~^~None~^~VkExternalFormatANDROID~^~VUID-VkExternalFormatANDROID-externalFormat-01894~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkExternalFormatANDROID-externalFormat-01894)~^~ +VALIDATION_ERROR_4482b00b~^~N~^~None~^~VkExternalFormatANDROID~^~VUID-VkExternalFormatANDROID-sType-sType~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalFormatANDROID-sType-sType)~^~implicit +VALIDATION_ERROR_44a00eb0~^~N~^~None~^~VkImportAndroidHardwareBufferInfoANDROID~^~VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01880~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01880)~^~ +VALIDATION_ERROR_44a00eb2~^~N~^~None~^~VkImportAndroidHardwareBufferInfoANDROID~^~VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'If buffer is not NULL, it must be a valid Android hardware buffer object with format and usage compatible with Vulkan as described by VkExternalMemoryHandleTypeFlagBits.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881)~^~ +VALIDATION_ERROR_44a01a01~^~N~^~None~^~VkImportAndroidHardwareBufferInfoANDROID~^~VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-parameter~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'buffer must be a valid pointer to a AHardwareBuffer value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-parameter)~^~implicit +VALIDATION_ERROR_44a2b00b~^~N~^~None~^~VkImportAndroidHardwareBufferInfoANDROID~^~VUID-VkImportAndroidHardwareBufferInfoANDROID-sType-sType~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportAndroidHardwareBufferInfoANDROID-sType-sType)~^~implicit +VALIDATION_ERROR_44c00eb4~^~N~^~None~^~VkMemoryGetAndroidHardwareBufferInfoANDROID~^~VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-handleTypes-01882~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID must have been included in VkExportMemoryAllocateInfoKHR::handleTypes when memory was created.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-handleTypes-01882)~^~ +VALIDATION_ERROR_44c00eb6~^~N~^~None~^~VkMemoryGetAndroidHardwareBufferInfoANDROID~^~VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-01883~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-01883)~^~ +VALIDATION_ERROR_44e00ef0~^~N~^~None~^~vkCmdEndDebugUtilsLabelEXT~^~VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01912~^~(VK_EXT_debug_utils)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01912)~^~ +VALIDATION_ERROR_44e00ef2~^~N~^~None~^~vkCmdEndDebugUtilsLabelEXT~^~VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01913~^~(VK_EXT_debug_utils)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01913)~^~ +VALIDATION_ERROR_44e02401~^~N~^~None~^~vkCmdEndDebugUtilsLabelEXT~^~VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-parameter)~^~implicit +VALIDATION_ERROR_44e02413~^~N~^~None~^~vkCmdEndDebugUtilsLabelEXT~^~VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-recording~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-recording)~^~implicit +VALIDATION_ERROR_44e02415~^~N~^~None~^~vkCmdEndDebugUtilsLabelEXT~^~VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-cmdpool~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-cmdpool)~^~implicit +VALIDATION_ERROR_45000ef6~^~N~^~None~^~vkDestroyDebugUtilsMessengerEXT~^~VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01915~^~(VK_EXT_debug_utils)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01915)~^~ +VALIDATION_ERROR_45000ef8~^~N~^~None~^~vkDestroyDebugUtilsMessengerEXT~^~VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01916~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'If no VkAllocationCallbacks were provided when messenger was created, pAllocator must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01916)~^~ +VALIDATION_ERROR_4500bc01~^~N~^~None~^~vkDestroyDebugUtilsMessengerEXT~^~VUID-vkDestroyDebugUtilsMessengerEXT-instance-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'instance must be a valid VkInstance handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-instance-parameter)~^~implicit +VALIDATION_ERROR_4500ec01~^~N~^~None~^~vkDestroyDebugUtilsMessengerEXT~^~VUID-vkDestroyDebugUtilsMessengerEXT-pAllocator-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-pAllocator-parameter)~^~implicit +VALIDATION_ERROR_45042601~^~N~^~None~^~vkDestroyDebugUtilsMessengerEXT~^~VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'messenger must be a valid VkDebugUtilsMessengerEXT handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parameter)~^~implicit +VALIDATION_ERROR_45042607~^~N~^~None~^~vkDestroyDebugUtilsMessengerEXT~^~VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'messenger must have been created, allocated, or retrieved from instance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent)~^~implicit +VALIDATION_ERROR_45200eb8~^~N~^~None~^~vkGetAndroidHardwareBufferPropertiesANDROID~^~VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-01884~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'buffer must be a valid Android hardware buffer object with at least one of the AHARDWAREBUFFER_USAGE_GPU_* usage flags.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-01884)~^~ +VALIDATION_ERROR_45201a01~^~Y~^~None~^~vkGetAndroidHardwareBufferPropertiesANDROID~^~VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-parameter~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'buffer must be a valid pointer to a valid AHardwareBuffer value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-parameter)~^~implicit +VALIDATION_ERROR_45205601~^~Y~^~None~^~vkGetAndroidHardwareBufferPropertiesANDROID~^~VUID-vkGetAndroidHardwareBufferPropertiesANDROID-device-parameter~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetAndroidHardwareBufferPropertiesANDROID-device-parameter)~^~implicit +VALIDATION_ERROR_4521f401~^~N~^~None~^~vkGetAndroidHardwareBufferPropertiesANDROID~^~VUID-vkGetAndroidHardwareBufferPropertiesANDROID-pProperties-parameter~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'pProperties must be a valid pointer to a VkAndroidHardwareBufferPropertiesANDROID structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetAndroidHardwareBufferPropertiesANDROID-pProperties-parameter)~^~implicit +VALIDATION_ERROR_45400eee~^~N~^~None~^~vkQueueEndDebugUtilsLabelEXT~^~VUID-vkQueueEndDebugUtilsLabelEXT-None-01911~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'There must be an outstanding vkQueueBeginDebugUtilsLabelEXT command prior to the vkQueueEndDebugUtilsLabelEXT on the queue' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkQueueEndDebugUtilsLabelEXT-None-01911)~^~ +VALIDATION_ERROR_45429c01~^~N~^~None~^~vkQueueEndDebugUtilsLabelEXT~^~VUID-vkQueueEndDebugUtilsLabelEXT-queue-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'queue must be a valid VkQueue handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkQueueEndDebugUtilsLabelEXT-queue-parameter)~^~implicit +VALIDATION_ERROR_4562b00b~^~N~^~None~^~VkAndroidHardwareBufferUsageANDROID~^~VUID-VkAndroidHardwareBufferUsageANDROID-sType-sType~^~(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAndroidHardwareBufferUsageANDROID-sType-sType)~^~implicit +VALIDATION_ERROR_45a05601~^~Y~^~None~^~vkGetMemoryAndroidHardwareBufferANDROID~^~VUID-vkGetMemoryAndroidHardwareBufferANDROID-device-parameter~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryAndroidHardwareBufferANDROID-device-parameter)~^~implicit +VALIDATION_ERROR_45a10001~^~Y~^~None~^~vkGetMemoryAndroidHardwareBufferANDROID~^~VUID-vkGetMemoryAndroidHardwareBufferANDROID-pBuffer-parameter~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'pBuffer must be a valid pointer to a valid pointer to a AHardwareBuffer value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryAndroidHardwareBufferANDROID-pBuffer-parameter)~^~implicit +VALIDATION_ERROR_45a39c01~^~N~^~None~^~vkGetMemoryAndroidHardwareBufferANDROID~^~VUID-vkGetMemoryAndroidHardwareBufferANDROID-pInfo-parameter~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'pInfo must be a valid pointer to a valid VkMemoryGetAndroidHardwareBufferInfoANDROID structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryAndroidHardwareBufferANDROID-pInfo-parameter)~^~implicit +VALIDATION_ERROR_45c2b00b~^~N~^~None~^~VkAndroidHardwareBufferFormatPropertiesANDROID~^~VUID-VkAndroidHardwareBufferFormatPropertiesANDROID-sType-sType~^~(VK_ANDROID_external_memory_android_hardware_buffer)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAndroidHardwareBufferFormatPropertiesANDROID-sType-sType)~^~implicit +VALIDATION_ERROR_45e02401~^~N~^~None~^~vkCmdBeginDebugUtilsLabelEXT~^~VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-parameter)~^~implicit +VALIDATION_ERROR_45e02413~^~N~^~None~^~vkCmdBeginDebugUtilsLabelEXT~^~VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-recording~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-recording)~^~implicit +VALIDATION_ERROR_45e02415~^~N~^~None~^~vkCmdBeginDebugUtilsLabelEXT~^~VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-cmdpool~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-cmdpool)~^~implicit +VALIDATION_ERROR_45e42401~^~N~^~None~^~vkCmdBeginDebugUtilsLabelEXT~^~VUID-vkCmdBeginDebugUtilsLabelEXT-pLabelInfo-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginDebugUtilsLabelEXT-pLabelInfo-parameter)~^~implicit +VALIDATION_ERROR_46002401~^~N~^~None~^~vkCmdInsertDebugUtilsLabelEXT~^~VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-parameter)~^~implicit +VALIDATION_ERROR_46002413~^~N~^~None~^~vkCmdInsertDebugUtilsLabelEXT~^~VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-recording~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-recording)~^~implicit +VALIDATION_ERROR_46002415~^~N~^~None~^~vkCmdInsertDebugUtilsLabelEXT~^~VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-cmdpool~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-cmdpool)~^~implicit +VALIDATION_ERROR_46042401~^~N~^~None~^~vkCmdInsertDebugUtilsLabelEXT~^~VUID-vkCmdInsertDebugUtilsLabelEXT-pLabelInfo-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdInsertDebugUtilsLabelEXT-pLabelInfo-parameter)~^~implicit +VALIDATION_ERROR_46229c01~^~N~^~None~^~vkQueueBeginDebugUtilsLabelEXT~^~VUID-vkQueueBeginDebugUtilsLabelEXT-queue-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'queue must be a valid VkQueue handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkQueueBeginDebugUtilsLabelEXT-queue-parameter)~^~implicit +VALIDATION_ERROR_46242401~^~N~^~None~^~vkQueueBeginDebugUtilsLabelEXT~^~VUID-vkQueueBeginDebugUtilsLabelEXT-pLabelInfo-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkQueueBeginDebugUtilsLabelEXT-pLabelInfo-parameter)~^~implicit +VALIDATION_ERROR_46429c01~^~N~^~None~^~vkQueueInsertDebugUtilsLabelEXT~^~VUID-vkQueueInsertDebugUtilsLabelEXT-queue-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'queue must be a valid VkQueue handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkQueueInsertDebugUtilsLabelEXT-queue-parameter)~^~implicit +VALIDATION_ERROR_46442401~^~N~^~None~^~vkQueueInsertDebugUtilsLabelEXT~^~VUID-vkQueueInsertDebugUtilsLabelEXT-pLabelInfo-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkQueueInsertDebugUtilsLabelEXT-pLabelInfo-parameter)~^~implicit +VALIDATION_ERROR_46605601~^~N~^~None~^~vkSetDebugUtilsObjectNameEXT~^~VUID-vkSetDebugUtilsObjectNameEXT-device-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectNameEXT-device-parameter)~^~implicit +VALIDATION_ERROR_4661c201~^~N~^~None~^~vkSetDebugUtilsObjectNameEXT~^~VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pNameInfo must be a valid pointer to a valid VkDebugUtilsObjectNameInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-parameter)~^~implicit +VALIDATION_ERROR_46805601~^~N~^~None~^~vkSetDebugUtilsObjectTagEXT~^~VUID-vkSetDebugUtilsObjectTagEXT-device-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectTagEXT-device-parameter)~^~implicit +VALIDATION_ERROR_46825c01~^~N~^~None~^~vkSetDebugUtilsObjectTagEXT~^~VUID-vkSetDebugUtilsObjectTagEXT-pTagInfo-parameter~^~(VK_EXT_debug_utils)~^~The spec valid usage text states 'pTagInfo must be a valid pointer to a valid VkDebugUtilsObjectTagInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectTagEXT-pTagInfo-parameter)~^~implicit +VALIDATION_ERROR_46a01774~^~Y~^~DescriptorIndexingSetLayout~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-bindingCount-03002~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If bindingCount is not zero, bindingCount must equal VkDescriptorSetLayoutCreateInfo::bindingCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-bindingCount-03002)~^~ +VALIDATION_ERROR_46a01776~^~Y~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-flags-03003~^~(VK_EXT_descriptor_indexing)+(VK_KHR_push_descriptor)~^~The spec valid usage text states '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_EXT, VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT, or VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-flags-03003)~^~ +VALIDATION_ERROR_46a01778~^~Y~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-03004~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If an element of pBindingFlags includes VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT, then all other elements of VkDescriptorSetLayoutCreateInfo::pBindings must have a smaller value of binding' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-03004)~^~ +VALIDATION_ERROR_46a0177a~^~Y~^~DescriptorIndexingSetLayout~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUniformBufferUpdateAfterBind-03005~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingUniformBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUniformBufferUpdateAfterBind-03005)~^~ +VALIDATION_ERROR_46a0177c~^~Y~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingSampledImageUpdateAfterBind-03006~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::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_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingSampledImageUpdateAfterBind-03006)~^~ +VALIDATION_ERROR_46a0177e~^~Y~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageImageUpdateAfterBind-03007~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingStorageImageUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_STORAGE_IMAGE must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageImageUpdateAfterBind-03007)~^~ +VALIDATION_ERROR_46a01780~^~Y~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageBufferUpdateAfterBind-03008~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingStorageBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageBufferUpdateAfterBind-03008)~^~ +VALIDATION_ERROR_46a01782~^~Y~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUniformTexelBufferUpdateAfterBind-03009~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::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_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUniformTexelBufferUpdateAfterBind-03009)~^~ +VALIDATION_ERROR_46a01784~^~Y~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageTexelBufferUpdateAfterBind-03010~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::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_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageTexelBufferUpdateAfterBind-03010)~^~ +VALIDATION_ERROR_46a01786~^~Y~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-None-03011~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-None-03011)~^~ +VALIDATION_ERROR_46a01788~^~Y~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUpdateUnusedWhilePending-03012~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingUpdateUnusedWhilePending is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUpdateUnusedWhilePending-03012)~^~ +VALIDATION_ERROR_46a0178a~^~Y~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingPartiallyBound-03013~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingPartiallyBound is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingPartiallyBound-03013)~^~ +VALIDATION_ERROR_46a0178c~^~Y~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingVariableDescriptorCount-03014~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingVariableDescriptorCount is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingVariableDescriptorCount-03014)~^~ +VALIDATION_ERROR_46a0178e~^~Y~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-03015~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If an element of pBindingFlags includes VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT, 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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-03015)~^~ +VALIDATION_ERROR_46a2b00b~^~N~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-sType-sType~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-sType-sType)~^~implicit +VALIDATION_ERROR_46a42a01~^~N~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-parameter~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If bindingCount is not 0, pBindingFlags must be a valid pointer to an array of bindingCount valid combinations of VkDescriptorBindingFlagBitsEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-parameter)~^~implicit +VALIDATION_ERROR_46a42a03~^~N~^~None~^~VkDescriptorSetLayoutBindingFlagsCreateInfoEXT~^~VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-requiredbitmask~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'Each element of pBindingFlags must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-requiredbitmask)~^~implicit +VALIDATION_ERROR_46c017ca~^~Y~^~None~^~VkDescriptorSetVariableDescriptorCountAllocateInfoEXT~^~VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-descriptorSetCount-03045~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'If descriptorSetCount is not zero, descriptorSetCount must equal VkDescriptorSetAllocateInfo::descriptorSetCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-descriptorSetCount-03045)~^~ +VALIDATION_ERROR_46c017cc~^~Y~^~DescriptorIndexingSetLayout~^~VkDescriptorSetVariableDescriptorCountAllocateInfoEXT~^~VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-pSetLayouts-03046~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-pSetLayouts-03046)~^~ +VALIDATION_ERROR_46c2b00b~^~N~^~None~^~VkDescriptorSetVariableDescriptorCountAllocateInfoEXT~^~VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-sType-sType~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-sType-sType)~^~implicit +VALIDATION_ERROR_46c42c01~^~N~^~None~^~VkDescriptorSetVariableDescriptorCountAllocateInfoEXT~^~VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-pDescriptorCounts-parameter~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-pDescriptorCounts-parameter)~^~implicit +VALIDATION_ERROR_46e2b00b~^~N~^~None~^~VkDescriptorSetVariableDescriptorCountLayoutSupportEXT~^~VUID-VkDescriptorSetVariableDescriptorCountLayoutSupportEXT-sType-sType~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountLayoutSupportEXT-sType-sType)~^~implicit +VALIDATION_ERROR_4702b00b~^~N~^~None~^~VkPhysicalDeviceDescriptorIndexingFeaturesEXT~^~VUID-VkPhysicalDeviceDescriptorIndexingFeaturesEXT-sType-sType~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDescriptorIndexingFeaturesEXT-sType-sType)~^~implicit +VALIDATION_ERROR_4722b00b~^~N~^~None~^~VkPhysicalDeviceDescriptorIndexingPropertiesEXT~^~VUID-VkPhysicalDeviceDescriptorIndexingPropertiesEXT-sType-sType~^~(VK_EXT_descriptor_indexing)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDescriptorIndexingPropertiesEXT-sType-sType)~^~implicit +VALIDATION_ERROR_4742b00b~^~N~^~None~^~VkPhysicalDeviceShaderCorePropertiesAMD~^~VUID-VkPhysicalDeviceShaderCorePropertiesAMD-sType-sType~^~(VK_AMD_shader_core_properties)~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderCorePropertiesAMD-sType-sType)~^~implicit +VALIDATION_ERROR_47600e9a~^~N~^~None~^~VkVertexInputBindingDivisorDescriptionEXT~^~VUID-VkVertexInputBindingDivisorDescriptionEXT-binding-01869~^~(VK_EXT_vertex_attribute_divisor)~^~The spec valid usage text states 'binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkVertexInputBindingDivisorDescriptionEXT-binding-01869)~^~ +VALIDATION_ERROR_47600e9c~^~N~^~None~^~VkVertexInputBindingDivisorDescriptionEXT~^~VUID-VkVertexInputBindingDivisorDescriptionEXT-divisor-01870~^~(VK_EXT_vertex_attribute_divisor)~^~The spec valid usage text states 'divisor must be a value between 0 and VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::maxVertexAttribDivisor, inclusive.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkVertexInputBindingDivisorDescriptionEXT-divisor-01870)~^~ +VALIDATION_ERROR_47600e9e~^~N~^~None~^~VkVertexInputBindingDivisorDescriptionEXT~^~VUID-VkVertexInputBindingDivisorDescriptionEXT-inputRate-01871~^~(VK_EXT_vertex_attribute_divisor)~^~The spec valid usage text states 'VkVertexInputBindingDescription::inputRate must be of type VK_VERTEX_INPUT_RATE_INSTANCE for this binding.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkVertexInputBindingDivisorDescriptionEXT-inputRate-01871)~^~ diff -Nru vulkan-1.1.70+dfsg1/layers/vk_validation_error_messages.h vulkan-1.1.73+dfsg/layers/vk_validation_error_messages.h --- vulkan-1.1.70+dfsg1/layers/vk_validation_error_messages.h 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/vk_validation_error_messages.h 2018-04-27 11:24:19.000000000 +0000 @@ -26,6 +26,7 @@ // Disable auto-formatting for generated file // clang-format off +#include #include // enum values for unique validation error codes @@ -86,6 +87,7 @@ VALIDATION_ERROR_00c00c86 = 0x00c00c86, VALIDATION_ERROR_00c00c88 = 0x00c00c88, VALIDATION_ERROR_00c00c8a = 0x00c00c8a, + VALIDATION_ERROR_00c00ed8 = 0x00c00ed8, VALIDATION_ERROR_00c01a01 = 0x00c01a01, VALIDATION_ERROR_00c0c601 = 0x00c0c601, VALIDATION_ERROR_00c1c40d = 0x00c1c40d, @@ -115,6 +117,7 @@ VALIDATION_ERROR_00e00cbc = 0x00e00cbc, VALIDATION_ERROR_00e00cbe = 0x00e00cbe, VALIDATION_ERROR_00e00cc0 = 0x00e00cc0, + VALIDATION_ERROR_00e00ede = 0x00e00ede, VALIDATION_ERROR_00e0a001 = 0x00e0a001, VALIDATION_ERROR_00e1c40d = 0x00e1c40d, VALIDATION_ERROR_00e2b00b = 0x00e2b00b, @@ -141,6 +144,8 @@ VALIDATION_ERROR_01400ade = 0x01400ade, VALIDATION_ERROR_01400b16 = 0x01400b16, VALIDATION_ERROR_01400c46 = 0x01400c46, + VALIDATION_ERROR_01400ebe = 0x01400ebe, + VALIDATION_ERROR_01400ec0 = 0x01400ec0, VALIDATION_ERROR_01409001 = 0x01409001, VALIDATION_ERROR_0141c40d = 0x0141c40d, VALIDATION_ERROR_0142b00b = 0x0142b00b, @@ -190,6 +195,7 @@ VALIDATION_ERROR_01800dc6 = 0x01800dc6, VALIDATION_ERROR_01800dc8 = 0x01800dc8, VALIDATION_ERROR_01800dca = 0x01800dca, + VALIDATION_ERROR_01800f16 = 0x01800f16, VALIDATION_ERROR_01801a01 = 0x01801a01, VALIDATION_ERROR_01806801 = 0x01806801, VALIDATION_ERROR_0181c40d = 0x0181c40d, @@ -215,6 +221,8 @@ VALIDATION_ERROR_01c0002a = 0x01c0002a, VALIDATION_ERROR_01c00c01 = 0x01c00c01, VALIDATION_ERROR_01c00c03 = 0x01c00c03, + VALIDATION_ERROR_01c00e22 = 0x01c00e22, + VALIDATION_ERROR_01c00e24 = 0x01c00e24, VALIDATION_ERROR_01e0002c = 0x01e0002c, VALIDATION_ERROR_0200002e = 0x0200002e, VALIDATION_ERROR_02200009 = 0x02200009, @@ -288,6 +296,10 @@ VALIDATION_ERROR_032002b6 = 0x032002b6, VALIDATION_ERROR_032002b8 = 0x032002b8, VALIDATION_ERROR_032002ba = 0x032002ba, + VALIDATION_ERROR_03200efc = 0x03200efc, + VALIDATION_ERROR_03200efe = 0x03200efe, + VALIDATION_ERROR_03200f00 = 0x03200f00, + VALIDATION_ERROR_03200f02 = 0x03200f02, VALIDATION_ERROR_03207601 = 0x03207601, VALIDATION_ERROR_0321c40d = 0x0321c40d, VALIDATION_ERROR_0322b00b = 0x0322b00b, @@ -317,7 +329,6 @@ VALIDATION_ERROR_03a2f41b = 0x03a2f41b, VALIDATION_ERROR_03c00ad2 = 0x03c00ad2, VALIDATION_ERROR_03c09001 = 0x03c09001, - VALIDATION_ERROR_03c1c40d = 0x03c1c40d, VALIDATION_ERROR_03c2b00b = 0x03c2b00b, VALIDATION_ERROR_03e2b00b = 0x03e2b00b, VALIDATION_ERROR_040007c4 = 0x040007c4, @@ -354,6 +365,7 @@ VALIDATION_ERROR_04c00264 = 0x04c00264, VALIDATION_ERROR_04c00266 = 0x04c00266, VALIDATION_ERROR_04c00268 = 0x04c00268, + VALIDATION_ERROR_04c017c8 = 0x04c017c8, VALIDATION_ERROR_04c04601 = 0x04c04601, VALIDATION_ERROR_04c04a1b = 0x04c04a1b, VALIDATION_ERROR_04c1c40d = 0x04c1c40d, @@ -366,6 +378,8 @@ VALIDATION_ERROR_0500022e = 0x0500022e, VALIDATION_ERROR_05000230 = 0x05000230, VALIDATION_ERROR_05000232 = 0x05000232, + VALIDATION_ERROR_05001770 = 0x05001770, + VALIDATION_ERROR_05001772 = 0x05001772, VALIDATION_ERROR_05009001 = 0x05009001, VALIDATION_ERROR_0500fc01 = 0x0500fc01, VALIDATION_ERROR_0501c40d = 0x0501c40d, @@ -388,6 +402,7 @@ VALIDATION_ERROR_056002e8 = 0x056002e8, VALIDATION_ERROR_056002ea = 0x056002ea, VALIDATION_ERROR_056002ec = 0x056002ec, + VALIDATION_ERROR_05600e60 = 0x05600e60, VALIDATION_ERROR_05609005 = 0x05609005, VALIDATION_ERROR_05615a01 = 0x05615a01, VALIDATION_ERROR_0561c40d = 0x0561c40d, @@ -490,35 +505,26 @@ VALIDATION_ERROR_07e2b00b = 0x07e2b00b, VALIDATION_ERROR_08000520 = 0x08000520, VALIDATION_ERROR_08009e01 = 0x08009e01, - VALIDATION_ERROR_0801c40d = 0x0801c40d, VALIDATION_ERROR_0802b00b = 0x0802b00b, VALIDATION_ERROR_08209e01 = 0x08209e01, - VALIDATION_ERROR_0821c40d = 0x0821c40d, VALIDATION_ERROR_0822b00b = 0x0822b00b, VALIDATION_ERROR_08400522 = 0x08400522, VALIDATION_ERROR_0840f401 = 0x0840f401, - VALIDATION_ERROR_0841c40d = 0x0841c40d, VALIDATION_ERROR_0842b00b = 0x0842b00b, VALIDATION_ERROR_0860f401 = 0x0860f401, - VALIDATION_ERROR_0861c40d = 0x0861c40d, VALIDATION_ERROR_0862b00b = 0x0862b00b, VALIDATION_ERROR_088008c8 = 0x088008c8, VALIDATION_ERROR_08809e01 = 0x08809e01, - VALIDATION_ERROR_0881c40d = 0x0881c40d, VALIDATION_ERROR_0882b00b = 0x0882b00b, VALIDATION_ERROR_08a008ca = 0x08a008ca, VALIDATION_ERROR_08a0f401 = 0x08a0f401, - VALIDATION_ERROR_08a1c40d = 0x08a1c40d, VALIDATION_ERROR_08a2b00b = 0x08a2b00b, VALIDATION_ERROR_08c09e01 = 0x08c09e01, - VALIDATION_ERROR_08c1c40d = 0x08c1c40d, VALIDATION_ERROR_08c2b00b = 0x08c2b00b, VALIDATION_ERROR_08e09e01 = 0x08e09e01, VALIDATION_ERROR_08e09e03 = 0x08e09e03, - VALIDATION_ERROR_08e1c40d = 0x08e1c40d, VALIDATION_ERROR_08e2b00b = 0x08e2b00b, VALIDATION_ERROR_09009e01 = 0x09009e01, - VALIDATION_ERROR_0901c40d = 0x0901c40d, VALIDATION_ERROR_0902b00b = 0x0902b00b, VALIDATION_ERROR_09209001 = 0x09209001, VALIDATION_ERROR_0921c40d = 0x0921c40d, @@ -719,16 +725,6 @@ VALIDATION_ERROR_09e0079c = 0x09e0079c, VALIDATION_ERROR_09e0079e = 0x09e0079e, VALIDATION_ERROR_09e007a0 = 0x09e007a0, - VALIDATION_ERROR_09e007a2 = 0x09e007a2, - VALIDATION_ERROR_09e007a4 = 0x09e007a4, - VALIDATION_ERROR_09e007a6 = 0x09e007a6, - VALIDATION_ERROR_09e007a8 = 0x09e007a8, - VALIDATION_ERROR_09e007aa = 0x09e007aa, - VALIDATION_ERROR_09e007ac = 0x09e007ac, - VALIDATION_ERROR_09e007ae = 0x09e007ae, - VALIDATION_ERROR_09e007b0 = 0x09e007b0, - VALIDATION_ERROR_09e007b2 = 0x09e007b2, - VALIDATION_ERROR_09e007b4 = 0x09e007b4, VALIDATION_ERROR_09e007b6 = 0x09e007b6, VALIDATION_ERROR_09e007b8 = 0x09e007b8, VALIDATION_ERROR_09e007bc = 0x09e007bc, @@ -746,6 +742,13 @@ VALIDATION_ERROR_09e00c4e = 0x09e00c4e, VALIDATION_ERROR_09e00c50 = 0x09e00c50, VALIDATION_ERROR_09e00c52 = 0x09e00c52, + VALIDATION_ERROR_09e00ec2 = 0x09e00ec2, + VALIDATION_ERROR_09e00ec4 = 0x09e00ec4, + VALIDATION_ERROR_09e00ec6 = 0x09e00ec6, + VALIDATION_ERROR_09e00ec8 = 0x09e00ec8, + VALIDATION_ERROR_09e00eca = 0x09e00eca, + VALIDATION_ERROR_09e00f08 = 0x09e00f08, + VALIDATION_ERROR_09e00f0a = 0x09e00f0a, VALIDATION_ERROR_09e09001 = 0x09e09001, VALIDATION_ERROR_09e09201 = 0x09e09201, VALIDATION_ERROR_09e0ac01 = 0x09e0ac01, @@ -784,6 +787,7 @@ VALIDATION_ERROR_0a000dcc = 0x0a000dcc, VALIDATION_ERROR_0a000dce = 0x0a000dce, VALIDATION_ERROR_0a000dd0 = 0x0a000dd0, + VALIDATION_ERROR_0a000f18 = 0x0a000f18, VALIDATION_ERROR_0a006801 = 0x0a006801, VALIDATION_ERROR_0a00a001 = 0x0a00a001, VALIDATION_ERROR_0a00d401 = 0x0a00d401, @@ -856,6 +860,7 @@ VALIDATION_ERROR_0ac00dc0 = 0x0ac00dc0, VALIDATION_ERROR_0ac00dc2 = 0x0ac00dc2, VALIDATION_ERROR_0ac00dc4 = 0x0ac00dc4, + VALIDATION_ERROR_0ac00ed0 = 0x0ac00ed0, VALIDATION_ERROR_0ac02c01 = 0x0ac02c01, VALIDATION_ERROR_0ac09005 = 0x0ac09005, VALIDATION_ERROR_0ac09201 = 0x0ac09201, @@ -872,7 +877,6 @@ VALIDATION_ERROR_0ae00be0 = 0x0ae00be0, VALIDATION_ERROR_0ae00da4 = 0x0ae00da4, VALIDATION_ERROR_0ae09c01 = 0x0ae09c01, - VALIDATION_ERROR_0ae1c40d = 0x0ae1c40d, VALIDATION_ERROR_0ae2b00b = 0x0ae2b00b, VALIDATION_ERROR_0b000524 = 0x0b000524, VALIDATION_ERROR_0b000526 = 0x0b000526, @@ -884,12 +888,10 @@ VALIDATION_ERROR_0b000bdc = 0x0b000bdc, VALIDATION_ERROR_0b000bde = 0x0b000bde, VALIDATION_ERROR_0b009c01 = 0x0b009c01, - VALIDATION_ERROR_0b01c40d = 0x0b01c40d, VALIDATION_ERROR_0b02b00b = 0x0b02b00b, VALIDATION_ERROR_0b200a5e = 0x0b200a5e, VALIDATION_ERROR_0b200a60 = 0x0b200a60, VALIDATION_ERROR_0b209c01 = 0x0b209c01, - VALIDATION_ERROR_0b21c40d = 0x0b21c40d, VALIDATION_ERROR_0b22b00b = 0x0b22b00b, VALIDATION_ERROR_0b4008ee = 0x0b4008ee, VALIDATION_ERROR_0b400c10 = 0x0b400c10, @@ -968,6 +970,10 @@ VALIDATION_ERROR_0c600d9e = 0x0c600d9e, VALIDATION_ERROR_0c600da0 = 0x0c600da0, VALIDATION_ERROR_0c600da2 = 0x0c600da2, + VALIDATION_ERROR_0c600ea0 = 0x0c600ea0, + VALIDATION_ERROR_0c600ea2 = 0x0c600ea2, + VALIDATION_ERROR_0c600ea4 = 0x0c600ea4, + VALIDATION_ERROR_0c600ea6 = 0x0c600ea6, VALIDATION_ERROR_0c61c40d = 0x0c61c40d, VALIDATION_ERROR_0c62b00b = 0x0c62b00b, VALIDATION_ERROR_0c62b00f = 0x0c62b00f, @@ -1027,7 +1033,6 @@ VALIDATION_ERROR_0d809001 = 0x0d809001, VALIDATION_ERROR_0d809003 = 0x0d809003, VALIDATION_ERROR_0d830401 = 0x0d830401, - VALIDATION_ERROR_0da1c40d = 0x0da1c40d, VALIDATION_ERROR_0da2b00b = 0x0da2b00b, VALIDATION_ERROR_0dc09001 = 0x0dc09001, VALIDATION_ERROR_0dc09c01 = 0x0dc09c01, @@ -1040,9 +1045,7 @@ VALIDATION_ERROR_0e009c01 = 0x0e009c01, VALIDATION_ERROR_0e01c40d = 0x0e01c40d, VALIDATION_ERROR_0e02b00b = 0x0e02b00b, - VALIDATION_ERROR_0e41c40d = 0x0e41c40d, VALIDATION_ERROR_0e42b00b = 0x0e42b00b, - VALIDATION_ERROR_0e42b00f = 0x0e42b00f, VALIDATION_ERROR_0e609001 = 0x0e609001, VALIDATION_ERROR_0e609201 = 0x0e609201, VALIDATION_ERROR_0e61c40d = 0x0e61c40d, @@ -1054,7 +1057,6 @@ VALIDATION_ERROR_0e800488 = 0x0e800488, VALIDATION_ERROR_0e80048a = 0x0e80048a, VALIDATION_ERROR_0e82b00b = 0x0e82b00b, - VALIDATION_ERROR_0ea1c40d = 0x0ea1c40d, VALIDATION_ERROR_0ea2b00b = 0x0ea2b00b, VALIDATION_ERROR_0ec0088e = 0x0ec0088e, VALIDATION_ERROR_0ec09201 = 0x0ec09201, @@ -1107,7 +1109,6 @@ VALIDATION_ERROR_0f80048c = 0x0f80048c, VALIDATION_ERROR_0f805e01 = 0x0f805e01, VALIDATION_ERROR_0f809005 = 0x0f809005, - VALIDATION_ERROR_0f81c40d = 0x0f81c40d, VALIDATION_ERROR_0f82b00b = 0x0f82b00b, VALIDATION_ERROR_0fa00b44 = 0x0fa00b44, VALIDATION_ERROR_0fa07c1b = 0x0fa07c1b, @@ -1139,6 +1140,34 @@ VALIDATION_ERROR_0fe00d24 = 0x0fe00d24, VALIDATION_ERROR_0fe00d26 = 0x0fe00d26, VALIDATION_ERROR_0fe00d28 = 0x0fe00d28, + VALIDATION_ERROR_0fe01790 = 0x0fe01790, + VALIDATION_ERROR_0fe01792 = 0x0fe01792, + VALIDATION_ERROR_0fe01794 = 0x0fe01794, + VALIDATION_ERROR_0fe01796 = 0x0fe01796, + VALIDATION_ERROR_0fe01798 = 0x0fe01798, + VALIDATION_ERROR_0fe0179a = 0x0fe0179a, + VALIDATION_ERROR_0fe0179c = 0x0fe0179c, + VALIDATION_ERROR_0fe0179e = 0x0fe0179e, + VALIDATION_ERROR_0fe017a0 = 0x0fe017a0, + VALIDATION_ERROR_0fe017a2 = 0x0fe017a2, + VALIDATION_ERROR_0fe017a4 = 0x0fe017a4, + VALIDATION_ERROR_0fe017a6 = 0x0fe017a6, + VALIDATION_ERROR_0fe017a8 = 0x0fe017a8, + VALIDATION_ERROR_0fe017aa = 0x0fe017aa, + VALIDATION_ERROR_0fe017ac = 0x0fe017ac, + VALIDATION_ERROR_0fe017ae = 0x0fe017ae, + VALIDATION_ERROR_0fe017b0 = 0x0fe017b0, + VALIDATION_ERROR_0fe017b2 = 0x0fe017b2, + VALIDATION_ERROR_0fe017b4 = 0x0fe017b4, + VALIDATION_ERROR_0fe017b6 = 0x0fe017b6, + VALIDATION_ERROR_0fe017b8 = 0x0fe017b8, + VALIDATION_ERROR_0fe017ba = 0x0fe017ba, + VALIDATION_ERROR_0fe017bc = 0x0fe017bc, + VALIDATION_ERROR_0fe017be = 0x0fe017be, + VALIDATION_ERROR_0fe017c0 = 0x0fe017c0, + VALIDATION_ERROR_0fe017c2 = 0x0fe017c2, + VALIDATION_ERROR_0fe017c4 = 0x0fe017c4, + VALIDATION_ERROR_0fe017c6 = 0x0fe017c6, VALIDATION_ERROR_0fe09005 = 0x0fe09005, VALIDATION_ERROR_0fe1c40d = 0x0fe1c40d, VALIDATION_ERROR_0fe1f801 = 0x0fe1f801, @@ -1219,7 +1248,6 @@ VALIDATION_ERROR_10c30a1b = 0x10c30a1b, VALIDATION_ERROR_10e0097e = 0x10e0097e, VALIDATION_ERROR_10e09005 = 0x10e09005, - VALIDATION_ERROR_10e1c40d = 0x10e1c40d, VALIDATION_ERROR_10e2b00b = 0x10e2b00b, VALIDATION_ERROR_10e30a1b = 0x10e30a1b, VALIDATION_ERROR_1102b00b = 0x1102b00b, @@ -1277,6 +1305,11 @@ VALIDATION_ERROR_1220068c = 0x1220068c, VALIDATION_ERROR_12200c3c = 0x12200c3c, VALIDATION_ERROR_12200c3e = 0x12200c3e, + VALIDATION_ERROR_12200f0c = 0x12200f0c, + VALIDATION_ERROR_12200f0e = 0x12200f0e, + VALIDATION_ERROR_12200f10 = 0x12200f10, + VALIDATION_ERROR_12200f12 = 0x12200f12, + VALIDATION_ERROR_12200f14 = 0x12200f14, VALIDATION_ERROR_12209005 = 0x12209005, VALIDATION_ERROR_1220f201 = 0x1220f201, VALIDATION_ERROR_12212601 = 0x12212601, @@ -1285,12 +1318,8 @@ VALIDATION_ERROR_1222b00b = 0x1222b00b, VALIDATION_ERROR_1222b00f = 0x1222b00f, VALIDATION_ERROR_1222e61b = 0x1222e61b, - VALIDATION_ERROR_1240068e = 0x1240068e, - VALIDATION_ERROR_12400690 = 0x12400690, VALIDATION_ERROR_12400692 = 0x12400692, - VALIDATION_ERROR_12400694 = 0x12400694, VALIDATION_ERROR_12411a01 = 0x12411a01, - VALIDATION_ERROR_1241c40d = 0x1241c40d, VALIDATION_ERROR_12426c01 = 0x12426c01, VALIDATION_ERROR_12426e01 = 0x12426e01, VALIDATION_ERROR_1242b00b = 0x1242b00b, @@ -1444,7 +1473,6 @@ VALIDATION_ERROR_1421c40d = 0x1421c40d, VALIDATION_ERROR_1422b00b = 0x1422b00b, VALIDATION_ERROR_144009b8 = 0x144009b8, - VALIDATION_ERROR_1441c40d = 0x1441c40d, VALIDATION_ERROR_1442b00b = 0x1442b00b, VALIDATION_ERROR_1442ee01 = 0x1442ee01, VALIDATION_ERROR_14600009 = 0x14600009, @@ -1466,9 +1494,9 @@ VALIDATION_ERROR_14600b26 = 0x14600b26, VALIDATION_ERROR_14600b28 = 0x14600b28, VALIDATION_ERROR_14600b2a = 0x14600b2a, - VALIDATION_ERROR_14600d14 = 0x14600d14, VALIDATION_ERROR_14600d32 = 0x14600d32, VALIDATION_ERROR_14600de4 = 0x14600de4, + VALIDATION_ERROR_14600f1a = 0x14600f1a, VALIDATION_ERROR_14602e01 = 0x14602e01, VALIDATION_ERROR_14609001 = 0x14609001, VALIDATION_ERROR_1460a201 = 0x1460a201, @@ -1486,7 +1514,6 @@ VALIDATION_ERROR_1462ec01 = 0x1462ec01, VALIDATION_ERROR_14805a1b = 0x14805a1b, VALIDATION_ERROR_14814401 = 0x14814401, - VALIDATION_ERROR_1481c40d = 0x1481c40d, VALIDATION_ERROR_1482b00b = 0x1482b00b, VALIDATION_ERROR_14a004d8 = 0x14a004d8, VALIDATION_ERROR_14a004da = 0x14a004da, @@ -1569,6 +1596,7 @@ VALIDATION_ERROR_15c002a6 = 0x15c002a6, VALIDATION_ERROR_15c00af4 = 0x15c00af4, VALIDATION_ERROR_15c00af6 = 0x15c00af6, + VALIDATION_ERROR_15c017d0 = 0x15c017d0, VALIDATION_ERROR_15c0441b = 0x15c0441b, VALIDATION_ERROR_15c04e01 = 0x15c04e01, VALIDATION_ERROR_15c1c40d = 0x15c1c40d, @@ -1635,6 +1663,8 @@ VALIDATION_ERROR_1700081e = 0x1700081e, VALIDATION_ERROR_17000b48 = 0x17000b48, VALIDATION_ERROR_17000bc8 = 0x17000bc8, + VALIDATION_ERROR_17000ed4 = 0x17000ed4, + VALIDATION_ERROR_17000ed6 = 0x17000ed6, VALIDATION_ERROR_17001a01 = 0x17001a01, VALIDATION_ERROR_17001a07 = 0x17001a07, VALIDATION_ERROR_17005601 = 0x17005601, @@ -1654,6 +1684,8 @@ VALIDATION_ERROR_17400b4a = 0x17400b4a, VALIDATION_ERROR_17400bca = 0x17400bca, VALIDATION_ERROR_17400c90 = 0x17400c90, + VALIDATION_ERROR_17400eda = 0x17400eda, + VALIDATION_ERROR_17400edc = 0x17400edc, VALIDATION_ERROR_17405601 = 0x17405601, VALIDATION_ERROR_1740a001 = 0x1740a001, VALIDATION_ERROR_1740a007 = 0x1740a007, @@ -1663,17 +1695,15 @@ VALIDATION_ERROR_17605601 = 0x17605601, VALIDATION_ERROR_1760fa01 = 0x1760fa01, VALIDATION_ERROR_17800009 = 0x17800009, - VALIDATION_ERROR_1780063c = 0x1780063c, - VALIDATION_ERROR_1780063e = 0x1780063e, VALIDATION_ERROR_17800640 = 0x17800640, - VALIDATION_ERROR_17800642 = 0x17800642, VALIDATION_ERROR_17800644 = 0x17800644, VALIDATION_ERROR_17800646 = 0x17800646, VALIDATION_ERROR_17800648 = 0x17800648, VALIDATION_ERROR_1780064a = 0x1780064a, - VALIDATION_ERROR_1780064c = 0x1780064c, VALIDATION_ERROR_1780064e = 0x1780064e, VALIDATION_ERROR_17800650 = 0x17800650, + VALIDATION_ERROR_17800eba = 0x17800eba, + VALIDATION_ERROR_17800f04 = 0x17800f04, VALIDATION_ERROR_17802401 = 0x17802401, VALIDATION_ERROR_17802413 = 0x17802413, VALIDATION_ERROR_17802415 = 0x17802415, @@ -1775,6 +1805,9 @@ VALIDATION_ERROR_18400d54 = 0x18400d54, VALIDATION_ERROR_18400d56 = 0x18400d56, VALIDATION_ERROR_18400d58 = 0x18400d58, + VALIDATION_ERROR_18400e54 = 0x18400e54, + VALIDATION_ERROR_18400e56 = 0x18400e56, + VALIDATION_ERROR_18400e58 = 0x18400e58, VALIDATION_ERROR_18402401 = 0x18402401, VALIDATION_ERROR_18402413 = 0x18402413, VALIDATION_ERROR_18402415 = 0x18402415, @@ -1811,6 +1844,8 @@ VALIDATION_ERROR_18800c12 = 0x18800c12, VALIDATION_ERROR_18800d38 = 0x18800d38, VALIDATION_ERROR_18800d3a = 0x18800d3a, + VALIDATION_ERROR_18800e1a = 0x18800e1a, + VALIDATION_ERROR_18800e1c = 0x18800e1c, VALIDATION_ERROR_18802401 = 0x18802401, VALIDATION_ERROR_18802413 = 0x18802413, VALIDATION_ERROR_18802415 = 0x18802415, @@ -1831,6 +1866,8 @@ VALIDATION_ERROR_18a00b88 = 0x18a00b88, VALIDATION_ERROR_18a00d3c = 0x18a00d3c, VALIDATION_ERROR_18a00d3e = 0x18a00d3e, + VALIDATION_ERROR_18a00e1e = 0x18a00e1e, + VALIDATION_ERROR_18a00e20 = 0x18a00e20, VALIDATION_ERROR_18a02401 = 0x18a02401, VALIDATION_ERROR_18a02413 = 0x18a02413, VALIDATION_ERROR_18a02415 = 0x18a02415, @@ -1851,6 +1888,9 @@ VALIDATION_ERROR_18c000ee = 0x18c000ee, VALIDATION_ERROR_18c000f0 = 0x18c000f0, VALIDATION_ERROR_18c000f2 = 0x18c000f2, + VALIDATION_ERROR_18c00e3c = 0x18c00e3c, + VALIDATION_ERROR_18c00e3e = 0x18c00e3e, + VALIDATION_ERROR_18c00e40 = 0x18c00e40, VALIDATION_ERROR_18c02401 = 0x18c02401, VALIDATION_ERROR_18c02413 = 0x18c02413, VALIDATION_ERROR_18c02415 = 0x18c02415, @@ -1875,6 +1915,9 @@ VALIDATION_ERROR_18e00d4a = 0x18e00d4a, VALIDATION_ERROR_18e00d4c = 0x18e00d4c, VALIDATION_ERROR_18e00e02 = 0x18e00e02, + VALIDATION_ERROR_18e00e48 = 0x18e00e48, + VALIDATION_ERROR_18e00e4a = 0x18e00e4a, + VALIDATION_ERROR_18e00e4c = 0x18e00e4c, VALIDATION_ERROR_18e02401 = 0x18e02401, VALIDATION_ERROR_18e02413 = 0x18e02413, VALIDATION_ERROR_18e02415 = 0x18e02415, @@ -1912,6 +1955,10 @@ VALIDATION_ERROR_19000d46 = 0x19000d46, VALIDATION_ERROR_19000dee = 0x19000dee, VALIDATION_ERROR_19000df0 = 0x19000df0, + VALIDATION_ERROR_19000e42 = 0x19000e42, + VALIDATION_ERROR_19000e44 = 0x19000e44, + VALIDATION_ERROR_19000e46 = 0x19000e46, + VALIDATION_ERROR_19000efa = 0x19000efa, VALIDATION_ERROR_19002401 = 0x19002401, VALIDATION_ERROR_19002413 = 0x19002413, VALIDATION_ERROR_19002415 = 0x19002415, @@ -1938,6 +1985,9 @@ VALIDATION_ERROR_19200d4e = 0x19200d4e, VALIDATION_ERROR_19200d50 = 0x19200d50, VALIDATION_ERROR_19200e04 = 0x19200e04, + VALIDATION_ERROR_19200e4e = 0x19200e4e, + VALIDATION_ERROR_19200e50 = 0x19200e50, + VALIDATION_ERROR_19200e52 = 0x19200e52, VALIDATION_ERROR_19202401 = 0x19202401, VALIDATION_ERROR_19202413 = 0x19202413, VALIDATION_ERROR_19202415 = 0x19202415, @@ -1992,6 +2042,9 @@ VALIDATION_ERROR_19c0031c = 0x19c0031c, VALIDATION_ERROR_19c0031e = 0x19c0031e, VALIDATION_ERROR_19c00320 = 0x19c00320, + VALIDATION_ERROR_19c00e68 = 0x19c00e68, + VALIDATION_ERROR_19c00e6a = 0x19c00e6a, + VALIDATION_ERROR_19c00e6c = 0x19c00e6c, VALIDATION_ERROR_19c02401 = 0x19c02401, VALIDATION_ERROR_19c02413 = 0x19c02413, VALIDATION_ERROR_19c02415 = 0x19c02415, @@ -2025,6 +2078,9 @@ VALIDATION_ERROR_1a00033c = 0x1a00033c, VALIDATION_ERROR_1a00033e = 0x1a00033e, VALIDATION_ERROR_1a000340 = 0x1a000340, + VALIDATION_ERROR_1a000e6e = 0x1a000e6e, + VALIDATION_ERROR_1a000e70 = 0x1a000e70, + VALIDATION_ERROR_1a000e72 = 0x1a000e72, VALIDATION_ERROR_1a001a01 = 0x1a001a01, VALIDATION_ERROR_1a002401 = 0x1a002401, VALIDATION_ERROR_1a002413 = 0x1a002413, @@ -2051,6 +2107,9 @@ VALIDATION_ERROR_1a20038a = 0x1a20038a, VALIDATION_ERROR_1a200bb6 = 0x1a200bb6, VALIDATION_ERROR_1a200bd0 = 0x1a200bd0, + VALIDATION_ERROR_1a200e74 = 0x1a200e74, + VALIDATION_ERROR_1a200e76 = 0x1a200e76, + VALIDATION_ERROR_1a200e78 = 0x1a200e78, VALIDATION_ERROR_1a202401 = 0x1a202401, VALIDATION_ERROR_1a202413 = 0x1a202413, VALIDATION_ERROR_1a202415 = 0x1a202415, @@ -2077,6 +2136,9 @@ VALIDATION_ERROR_1a4003b2 = 0x1a4003b2, VALIDATION_ERROR_1a400bb8 = 0x1a400bb8, VALIDATION_ERROR_1a400bd2 = 0x1a400bd2, + VALIDATION_ERROR_1a400e7a = 0x1a400e7a, + VALIDATION_ERROR_1a400e7c = 0x1a400e7c, + VALIDATION_ERROR_1a400e7e = 0x1a400e7e, VALIDATION_ERROR_1a402401 = 0x1a402401, VALIDATION_ERROR_1a402413 = 0x1a402413, VALIDATION_ERROR_1a402415 = 0x1a402415, @@ -2111,6 +2173,9 @@ VALIDATION_ERROR_1a600bbe = 0x1a600bbe, VALIDATION_ERROR_1a600bd8 = 0x1a600bd8, VALIDATION_ERROR_1a600d02 = 0x1a600d02, + VALIDATION_ERROR_1a600e8c = 0x1a600e8c, + VALIDATION_ERROR_1a600e8e = 0x1a600e8e, + VALIDATION_ERROR_1a600e90 = 0x1a600e90, VALIDATION_ERROR_1a601a01 = 0x1a601a01, VALIDATION_ERROR_1a602401 = 0x1a602401, VALIDATION_ERROR_1a602413 = 0x1a602413, @@ -2147,6 +2212,9 @@ VALIDATION_ERROR_1a800d06 = 0x1a800d06, VALIDATION_ERROR_1a800d08 = 0x1a800d08, VALIDATION_ERROR_1a800d0a = 0x1a800d0a, + VALIDATION_ERROR_1a800e92 = 0x1a800e92, + VALIDATION_ERROR_1a800e94 = 0x1a800e94, + VALIDATION_ERROR_1a800e96 = 0x1a800e96, VALIDATION_ERROR_1a801a01 = 0x1a801a01, VALIDATION_ERROR_1a802401 = 0x1a802401, VALIDATION_ERROR_1a802413 = 0x1a802413, @@ -2183,6 +2251,9 @@ VALIDATION_ERROR_1aa00bba = 0x1aa00bba, VALIDATION_ERROR_1aa00bd4 = 0x1aa00bd4, VALIDATION_ERROR_1aa00cf8 = 0x1aa00cf8, + VALIDATION_ERROR_1aa00e80 = 0x1aa00e80, + VALIDATION_ERROR_1aa00e82 = 0x1aa00e82, + VALIDATION_ERROR_1aa00e84 = 0x1aa00e84, VALIDATION_ERROR_1aa01a01 = 0x1aa01a01, VALIDATION_ERROR_1aa02401 = 0x1aa02401, VALIDATION_ERROR_1aa02413 = 0x1aa02413, @@ -2219,16 +2290,19 @@ VALIDATION_ERROR_1ac00cfc = 0x1ac00cfc, VALIDATION_ERROR_1ac00cfe = 0x1ac00cfe, VALIDATION_ERROR_1ac00d00 = 0x1ac00d00, + VALIDATION_ERROR_1ac00e86 = 0x1ac00e86, + VALIDATION_ERROR_1ac00e88 = 0x1ac00e88, + VALIDATION_ERROR_1ac00e8a = 0x1ac00e8a, VALIDATION_ERROR_1ac01a01 = 0x1ac01a01, VALIDATION_ERROR_1ac02401 = 0x1ac02401, VALIDATION_ERROR_1ac02413 = 0x1ac02413, VALIDATION_ERROR_1ac02415 = 0x1ac02415, VALIDATION_ERROR_1ac03401 = 0x1ac03401, VALIDATION_ERROR_1ae00009 = 0x1ae00009, - VALIDATION_ERROR_1ae00652 = 0x1ae00652, VALIDATION_ERROR_1ae00654 = 0x1ae00654, - VALIDATION_ERROR_1ae00656 = 0x1ae00656, VALIDATION_ERROR_1ae00658 = 0x1ae00658, + VALIDATION_ERROR_1ae00ebc = 0x1ae00ebc, + VALIDATION_ERROR_1ae00f06 = 0x1ae00f06, VALIDATION_ERROR_1ae02401 = 0x1ae02401, VALIDATION_ERROR_1ae02413 = 0x1ae02413, VALIDATION_ERROR_1ae02415 = 0x1ae02415, @@ -2260,6 +2334,8 @@ VALIDATION_ERROR_1b2000ce = 0x1b2000ce, VALIDATION_ERROR_1b2000d0 = 0x1b2000d0, VALIDATION_ERROR_1b2000d2 = 0x1b2000d2, + VALIDATION_ERROR_1b200e38 = 0x1b200e38, + VALIDATION_ERROR_1b200e3a = 0x1b200e3a, VALIDATION_ERROR_1b202401 = 0x1b202401, VALIDATION_ERROR_1b202413 = 0x1b202413, VALIDATION_ERROR_1b202415 = 0x1b202415, @@ -2275,6 +2351,8 @@ VALIDATION_ERROR_1b40003a = 0x1b40003a, VALIDATION_ERROR_1b40003c = 0x1b40003c, VALIDATION_ERROR_1b40003e = 0x1b40003e, + VALIDATION_ERROR_1b400e26 = 0x1b400e26, + VALIDATION_ERROR_1b400e28 = 0x1b400e28, VALIDATION_ERROR_1b402401 = 0x1b402401, VALIDATION_ERROR_1b402413 = 0x1b402413, VALIDATION_ERROR_1b402415 = 0x1b402415, @@ -2406,6 +2484,9 @@ VALIDATION_ERROR_1c800d5c = 0x1c800d5c, VALIDATION_ERROR_1c800d5e = 0x1c800d5e, VALIDATION_ERROR_1c800d60 = 0x1c800d60, + VALIDATION_ERROR_1c800e5a = 0x1c800e5a, + VALIDATION_ERROR_1c800e5c = 0x1c800e5c, + VALIDATION_ERROR_1c800e5e = 0x1c800e5e, VALIDATION_ERROR_1c802401 = 0x1c802401, VALIDATION_ERROR_1c802413 = 0x1c802413, VALIDATION_ERROR_1c802415 = 0x1c802415, @@ -2522,6 +2603,8 @@ VALIDATION_ERROR_1e400048 = 0x1e400048, VALIDATION_ERROR_1e40004a = 0x1e40004a, VALIDATION_ERROR_1e40004c = 0x1e40004c, + VALIDATION_ERROR_1e400e2a = 0x1e400e2a, + VALIDATION_ERROR_1e400e2c = 0x1e400e2c, VALIDATION_ERROR_1e402401 = 0x1e402401, VALIDATION_ERROR_1e402413 = 0x1e402413, VALIDATION_ERROR_1e402415 = 0x1e402415, @@ -2921,6 +3004,7 @@ VALIDATION_ERROR_27400078 = 0x27400078, VALIDATION_ERROR_2740007a = 0x2740007a, VALIDATION_ERROR_2740007c = 0x2740007c, + VALIDATION_ERROR_27400e2e = 0x27400e2e, VALIDATION_ERROR_27402401 = 0x27402401, VALIDATION_ERROR_27619e01 = 0x27619e01, VALIDATION_ERROR_2761f401 = 0x2761f401, @@ -2990,6 +3074,7 @@ VALIDATION_ERROR_2941c001 = 0x2941c001, VALIDATION_ERROR_29600300 = 0x29600300, VALIDATION_ERROR_29600302 = 0x29600302, + VALIDATION_ERROR_29600e62 = 0x29600e62, VALIDATION_ERROR_29605601 = 0x29605601, VALIDATION_ERROR_2961fc01 = 0x2961fc01, VALIDATION_ERROR_29806001 = 0x29806001, @@ -3009,6 +3094,7 @@ VALIDATION_ERROR_2a005601 = 0x2a005601, VALIDATION_ERROR_2a008801 = 0x2a008801, VALIDATION_ERROR_2a008807 = 0x2a008807, + VALIDATION_ERROR_2a200c68 = 0x2a200c68, VALIDATION_ERROR_2a205601 = 0x2a205601, VALIDATION_ERROR_2a20a001 = 0x2a20a001, VALIDATION_ERROR_2a20a007 = 0x2a20a007, @@ -3024,6 +3110,7 @@ VALIDATION_ERROR_2a600c5c = 0x2a600c5c, VALIDATION_ERROR_2a600d68 = 0x2a600d68, VALIDATION_ERROR_2a600d6a = 0x2a600d6a, + VALIDATION_ERROR_2a600ece = 0x2a600ece, VALIDATION_ERROR_2a605601 = 0x2a605601, VALIDATION_ERROR_2a60a001 = 0x2a60a001, VALIDATION_ERROR_2a60a007 = 0x2a60a007, @@ -3101,6 +3188,7 @@ VALIDATION_ERROR_2ca30401 = 0x2ca30401, VALIDATION_ERROR_2ca30601 = 0x2ca30601, VALIDATION_ERROR_2ca30603 = 0x2ca30603, + VALIDATION_ERROR_2cc00e98 = 0x2cc00e98, VALIDATION_ERROR_2cc18201 = 0x2cc18201, VALIDATION_ERROR_2cc18401 = 0x2cc18401, VALIDATION_ERROR_2cc27a01 = 0x2cc27a01, @@ -3362,6 +3450,7 @@ VALIDATION_ERROR_33a05207 = 0x33a05207, VALIDATION_ERROR_33a05601 = 0x33a05601, VALIDATION_ERROR_33c00274 = 0x33c00274, + VALIDATION_ERROR_33c017ce = 0x33c017ce, VALIDATION_ERROR_33c05601 = 0x33c05601, VALIDATION_ERROR_33c12c01 = 0x33c12c01, VALIDATION_ERROR_33c13601 = 0x33c13601, @@ -3393,40 +3482,31 @@ VALIDATION_ERROR_3562b00b = 0x3562b00b, VALIDATION_ERROR_3581c40d = 0x3581c40d, VALIDATION_ERROR_3582b00b = 0x3582b00b, - VALIDATION_ERROR_35c1c40d = 0x35c1c40d, VALIDATION_ERROR_35c2b00b = 0x35c2b00b, - VALIDATION_ERROR_3601c40d = 0x3601c40d, VALIDATION_ERROR_3602b00b = 0x3602b00b, - VALIDATION_ERROR_3621c40d = 0x3621c40d, VALIDATION_ERROR_3622b00b = 0x3622b00b, VALIDATION_ERROR_3642b00b = 0x3642b00b, VALIDATION_ERROR_37e2b00b = 0x37e2b00b, VALIDATION_ERROR_3822b00b = 0x3822b00b, VALIDATION_ERROR_3842b00b = 0x3842b00b, - VALIDATION_ERROR_3861c40d = 0x3861c40d, VALIDATION_ERROR_3862b00b = 0x3862b00b, VALIDATION_ERROR_38800b20 = 0x38800b20, VALIDATION_ERROR_38800b22 = 0x38800b22, VALIDATION_ERROR_38800b24 = 0x38800b24, - VALIDATION_ERROR_3881c40d = 0x3881c40d, VALIDATION_ERROR_3882b00b = 0x3882b00b, VALIDATION_ERROR_38834a01 = 0x38834a01, VALIDATION_ERROR_38a00afa = 0x38a00afa, VALIDATION_ERROR_38a09005 = 0x38a09005, - VALIDATION_ERROR_38a1c40d = 0x38a1c40d, VALIDATION_ERROR_38a2b00b = 0x38a2b00b, VALIDATION_ERROR_38a34c01 = 0x38a34c01, VALIDATION_ERROR_38a34e1b = 0x38a34e1b, VALIDATION_ERROR_38c00af8 = 0x38c00af8, VALIDATION_ERROR_38c09005 = 0x38c09005, - VALIDATION_ERROR_38c1c40d = 0x38c1c40d, VALIDATION_ERROR_38c2b00b = 0x38c2b00b, - VALIDATION_ERROR_38e1c40d = 0x38e1c40d, VALIDATION_ERROR_38e2b00b = 0x38e2b00b, VALIDATION_ERROR_38e35001 = 0x38e35001, VALIDATION_ERROR_39400b4c = 0x39400b4c, VALIDATION_ERROR_39409e01 = 0x39409e01, - VALIDATION_ERROR_3941c40d = 0x3941c40d, VALIDATION_ERROR_3942b00b = 0x3942b00b, VALIDATION_ERROR_39609c01 = 0x39609c01, VALIDATION_ERROR_3961c40d = 0x3961c40d, @@ -3471,7 +3551,6 @@ VALIDATION_ERROR_3a42b00b = 0x3a42b00b, VALIDATION_ERROR_3a600b4e = 0x3a600b4e, VALIDATION_ERROR_3a60f401 = 0x3a60f401, - VALIDATION_ERROR_3a61c40d = 0x3a61c40d, VALIDATION_ERROR_3a62b00b = 0x3a62b00b, VALIDATION_ERROR_3a800b50 = 0x3a800b50, VALIDATION_ERROR_3a800b52 = 0x3a800b52, @@ -3519,7 +3598,6 @@ VALIDATION_ERROR_3b40c601 = 0x3b40c601, VALIDATION_ERROR_3b41c40d = 0x3b41c40d, VALIDATION_ERROR_3b42b00b = 0x3b42b00b, - VALIDATION_ERROR_3b61c40d = 0x3b61c40d, VALIDATION_ERROR_3b62b00b = 0x3b62b00b, VALIDATION_ERROR_3b800009 = 0x3b800009, VALIDATION_ERROR_3b800b30 = 0x3b800b30, @@ -3527,12 +3605,13 @@ VALIDATION_ERROR_3b800b34 = 0x3b800b34, VALIDATION_ERROR_3b800b36 = 0x3b800b36, VALIDATION_ERROR_3b800b38 = 0x3b800b38, - VALIDATION_ERROR_3b800b3a = 0x3b800b3a, - VALIDATION_ERROR_3b800b3c = 0x3b800b3c, VALIDATION_ERROR_3b800e0a = 0x3b800e0a, + VALIDATION_ERROR_3b800ea8 = 0x3b800ea8, + VALIDATION_ERROR_3b800eaa = 0x3b800eaa, + VALIDATION_ERROR_3b800eac = 0x3b800eac, + VALIDATION_ERROR_3b800eae = 0x3b800eae, VALIDATION_ERROR_3b801a01 = 0x3b801a01, VALIDATION_ERROR_3b80a001 = 0x3b80a001, - VALIDATION_ERROR_3b81c40d = 0x3b81c40d, VALIDATION_ERROR_3b82b00b = 0x3b82b00b, VALIDATION_ERROR_3ba01a01 = 0x3ba01a01, VALIDATION_ERROR_3ba1c40d = 0x3ba1c40d, @@ -3540,6 +3619,7 @@ VALIDATION_ERROR_3bc00c6a = 0x3bc00c6a, VALIDATION_ERROR_3bc00c6c = 0x3bc00c6c, VALIDATION_ERROR_3bc00c6e = 0x3bc00c6e, + VALIDATION_ERROR_3bc00ed2 = 0x3bc00ed2, VALIDATION_ERROR_3bc0a001 = 0x3bc0a001, VALIDATION_ERROR_3bc1c40d = 0x3bc1c40d, VALIDATION_ERROR_3bc2b00b = 0x3bc2b00b, @@ -3562,23 +3642,18 @@ VALIDATION_ERROR_3c839c01 = 0x3c839c01, VALIDATION_ERROR_3ca2b00b = 0x3ca2b00b, VALIDATION_ERROR_3cc00b2e = 0x3cc00b2e, - VALIDATION_ERROR_3cc1c40d = 0x3cc1c40d, VALIDATION_ERROR_3cc2b00b = 0x3cc2b00b, VALIDATION_ERROR_3ce00bec = 0x3ce00bec, VALIDATION_ERROR_3ce00bee = 0x3ce00bee, - VALIDATION_ERROR_3ce1c40d = 0x3ce1c40d, VALIDATION_ERROR_3ce2b00b = 0x3ce2b00b, VALIDATION_ERROR_3ce3b201 = 0x3ce3b201, VALIDATION_ERROR_3ce3b41b = 0x3ce3b41b, VALIDATION_ERROR_3ce3b601 = 0x3ce3b601, - VALIDATION_ERROR_3d01c40d = 0x3d01c40d, VALIDATION_ERROR_3d02b00b = 0x3d02b00b, VALIDATION_ERROR_3d03ba01 = 0x3d03ba01, VALIDATION_ERROR_3d03e801 = 0x3d03e801, - VALIDATION_ERROR_3d21c40d = 0x3d21c40d, VALIDATION_ERROR_3d22b00b = 0x3d22b00b, VALIDATION_ERROR_3d23c601 = 0x3d23c601, - VALIDATION_ERROR_3d41c40d = 0x3d41c40d, VALIDATION_ERROR_3d42b00b = 0x3d42b00b, VALIDATION_ERROR_3d61c40d = 0x3d61c40d, VALIDATION_ERROR_3d62b00b = 0x3d62b00b, @@ -3591,7 +3666,6 @@ VALIDATION_ERROR_3da19601 = 0x3da19601, VALIDATION_ERROR_3da1c40d = 0x3da1c40d, VALIDATION_ERROR_3da2b00b = 0x3da2b00b, - VALIDATION_ERROR_3dc1c40d = 0x3dc1c40d, VALIDATION_ERROR_3dc2b00b = 0x3dc2b00b, VALIDATION_ERROR_3dc3c401 = 0x3dc3c401, VALIDATION_ERROR_3de05601 = 0x3de05601, @@ -3627,29 +3701,24 @@ VALIDATION_ERROR_3e83c601 = 0x3e83c601, VALIDATION_ERROR_3ea00bf8 = 0x3ea00bf8, VALIDATION_ERROR_3ea3c601 = 0x3ea3c601, - VALIDATION_ERROR_3ec1c40d = 0x3ec1c40d, VALIDATION_ERROR_3ec2b00b = 0x3ec2b00b, VALIDATION_ERROR_3ee00c01 = 0x3ee00c01, VALIDATION_ERROR_3ee00c03 = 0x3ee00c03, VALIDATION_ERROR_3ee00c40 = 0x3ee00c40, VALIDATION_ERROR_3ee00c42 = 0x3ee00c42, VALIDATION_ERROR_3ee00c44 = 0x3ee00c44, - VALIDATION_ERROR_3f01c40d = 0x3f01c40d, VALIDATION_ERROR_3f02b00b = 0x3f02b00b, VALIDATION_ERROR_3f03ce1b = 0x3f03ce1b, VALIDATION_ERROR_3f03d001 = 0x3f03d001, VALIDATION_ERROR_3f200c66 = 0x3f200c66, - VALIDATION_ERROR_3f21c40d = 0x3f21c40d, VALIDATION_ERROR_3f22b00b = 0x3f22b00b, VALIDATION_ERROR_3f230601 = 0x3f230601, VALIDATION_ERROR_3f230603 = 0x3f230603, - VALIDATION_ERROR_3f41c40d = 0x3f41c40d, VALIDATION_ERROR_3f42b00b = 0x3f42b00b, VALIDATION_ERROR_3f43d201 = 0x3f43d201, VALIDATION_ERROR_3f600c54 = 0x3f600c54, VALIDATION_ERROR_3f600c56 = 0x3f600c56, VALIDATION_ERROR_3f600c58 = 0x3f600c58, - VALIDATION_ERROR_3f61c40d = 0x3f61c40d, VALIDATION_ERROR_3f62b00b = 0x3f62b00b, VALIDATION_ERROR_3f63e401 = 0x3f63e401, VALIDATION_ERROR_3f800ce2 = 0x3f800ce2, @@ -3661,6 +3730,7 @@ VALIDATION_ERROR_3f800cee = 0x3f800cee, VALIDATION_ERROR_3f800cf0 = 0x3f800cf0, VALIDATION_ERROR_3f800cf2 = 0x3f800cf2, + VALIDATION_ERROR_3f800ee0 = 0x3f800ee0, VALIDATION_ERROR_3f802c01 = 0x3f802c01, VALIDATION_ERROR_3f809201 = 0x3f809201, VALIDATION_ERROR_3f81c40d = 0x3f81c40d, @@ -3685,7 +3755,6 @@ VALIDATION_ERROR_40000c8c = 0x40000c8c, VALIDATION_ERROR_40000c8e = 0x40000c8e, VALIDATION_ERROR_40013e01 = 0x40013e01, - VALIDATION_ERROR_4001c40d = 0x4001c40d, VALIDATION_ERROR_4002b00b = 0x4002b00b, VALIDATION_ERROR_40200cc2 = 0x40200cc2, VALIDATION_ERROR_40200cc4 = 0x40200cc4, @@ -3697,7 +3766,6 @@ VALIDATION_ERROR_40200cd0 = 0x40200cd0, VALIDATION_ERROR_40200cd2 = 0x40200cd2, VALIDATION_ERROR_40213e01 = 0x40213e01, - VALIDATION_ERROR_4021c40d = 0x4021c40d, VALIDATION_ERROR_4022b00b = 0x4022b00b, VALIDATION_ERROR_4023fe01 = 0x4023fe01, VALIDATION_ERROR_40405601 = 0x40405601, @@ -3708,7 +3776,6 @@ VALIDATION_ERROR_4082b00b = 0x4082b00b, VALIDATION_ERROR_40a2b00b = 0x40a2b00b, VALIDATION_ERROR_40a3e601 = 0x40a3e601, - VALIDATION_ERROR_40c1c40d = 0x40c1c40d, VALIDATION_ERROR_40c2b00b = 0x40c2b00b, VALIDATION_ERROR_40c3ea01 = 0x40c3ea01, VALIDATION_ERROR_40e05601 = 0x40e05601, @@ -3724,11 +3791,9 @@ VALIDATION_ERROR_41200dac = 0x41200dac, VALIDATION_ERROR_41200dae = 0x41200dae, VALIDATION_ERROR_41209c01 = 0x41209c01, - VALIDATION_ERROR_4121c40d = 0x4121c40d, VALIDATION_ERROR_4122b00b = 0x4122b00b, VALIDATION_ERROR_4141c40d = 0x4141c40d, VALIDATION_ERROR_4142b00b = 0x4142b00b, - VALIDATION_ERROR_4161c40d = 0x4161c40d, VALIDATION_ERROR_4162b00b = 0x4162b00b, VALIDATION_ERROR_41800db0 = 0x41800db0, VALIDATION_ERROR_41800db2 = 0x41800db2, @@ -3737,11 +3802,9 @@ VALIDATION_ERROR_41805601 = 0x41805601, VALIDATION_ERROR_41809c01 = 0x41809c01, VALIDATION_ERROR_4183f401 = 0x4183f401, - VALIDATION_ERROR_41a1c40d = 0x41a1c40d, VALIDATION_ERROR_41a2b00b = 0x41a2b00b, VALIDATION_ERROR_41c00dd2 = 0x41c00dd2, VALIDATION_ERROR_41c09005 = 0x41c09005, - VALIDATION_ERROR_41c1c40d = 0x41c1c40d, VALIDATION_ERROR_41c2b00b = 0x41c2b00b, VALIDATION_ERROR_41c3f801 = 0x41c3f801, VALIDATION_ERROR_41e00009 = 0x41e00009, @@ -3756,20 +3819,21 @@ VALIDATION_ERROR_41e28401 = 0x41e28401, VALIDATION_ERROR_4201c40d = 0x4201c40d, VALIDATION_ERROR_4202b00b = 0x4202b00b, + VALIDATION_ERROR_42200e64 = 0x42200e64, + VALIDATION_ERROR_42200e66 = 0x42200e66, VALIDATION_ERROR_42209001 = 0x42209001, VALIDATION_ERROR_42209003 = 0x42209003, VALIDATION_ERROR_4221c40d = 0x4221c40d, VALIDATION_ERROR_4222b00b = 0x4222b00b, - VALIDATION_ERROR_4241c40d = 0x4241c40d, VALIDATION_ERROR_4242b00b = 0x4242b00b, - VALIDATION_ERROR_4261c40d = 0x4261c40d, VALIDATION_ERROR_4262b00b = 0x4262b00b, - VALIDATION_ERROR_4281c40d = 0x4281c40d, VALIDATION_ERROR_4282b00b = 0x4282b00b, VALIDATION_ERROR_42a2b00b = 0x42a2b00b, - VALIDATION_ERROR_42c1c40d = 0x42c1c40d, VALIDATION_ERROR_42c2b00b = 0x42c2b00b, - VALIDATION_ERROR_42e1c40d = 0x42e1c40d, + VALIDATION_ERROR_42e00e30 = 0x42e00e30, + VALIDATION_ERROR_42e00e32 = 0x42e00e32, + VALIDATION_ERROR_42e00e34 = 0x42e00e34, + VALIDATION_ERROR_42e00e36 = 0x42e00e36, VALIDATION_ERROR_42e2b00b = 0x42e2b00b, VALIDATION_ERROR_43040001 = 0x43040001, VALIDATION_ERROR_43205601 = 0x43205601, @@ -3778,14 +3842,128 @@ VALIDATION_ERROR_43405601 = 0x43405601, VALIDATION_ERROR_4341fc01 = 0x4341fc01, VALIDATION_ERROR_43440401 = 0x43440401, - VALIDATION_ERROR_4441c40d = 0x4441c40d, + VALIDATION_ERROR_43600ee2 = 0x43600ee2, + VALIDATION_ERROR_43600ee4 = 0x43600ee4, + VALIDATION_ERROR_43600ee6 = 0x43600ee6, + VALIDATION_ERROR_4360da01 = 0x4360da01, + VALIDATION_ERROR_4361c40d = 0x4361c40d, + VALIDATION_ERROR_4361ce01 = 0x4361ce01, + VALIDATION_ERROR_4362b00b = 0x4362b00b, + VALIDATION_ERROR_43800ee8 = 0x43800ee8, + VALIDATION_ERROR_43800eea = 0x43800eea, + VALIDATION_ERROR_43800eec = 0x43800eec, + VALIDATION_ERROR_4380da01 = 0x4380da01, + VALIDATION_ERROR_4381c40d = 0x4381c40d, + VALIDATION_ERROR_43825a01 = 0x43825a01, + VALIDATION_ERROR_4382b00b = 0x4382b00b, + VALIDATION_ERROR_4382f41b = 0x4382f41b, + VALIDATION_ERROR_43a1c40d = 0x43a1c40d, + VALIDATION_ERROR_43a2b00b = 0x43a2b00b, + VALIDATION_ERROR_43a40801 = 0x43a40801, + VALIDATION_ERROR_43c09005 = 0x43c09005, + VALIDATION_ERROR_43c0d61b = 0x43c0d61b, + VALIDATION_ERROR_43c1b801 = 0x43c1b801, + VALIDATION_ERROR_43c1c40d = 0x43c1c40d, + VALIDATION_ERROR_43c2b00b = 0x43c2b00b, + VALIDATION_ERROR_43c42201 = 0x43c42201, + VALIDATION_ERROR_43e00ef4 = 0x43e00ef4, + VALIDATION_ERROR_43e09005 = 0x43e09005, + VALIDATION_ERROR_43e2b00b = 0x43e2b00b, + VALIDATION_ERROR_43e40a01 = 0x43e40a01, + VALIDATION_ERROR_43e40a03 = 0x43e40a03, + VALIDATION_ERROR_43e40c01 = 0x43e40c01, + VALIDATION_ERROR_43e40c03 = 0x43e40c03, + VALIDATION_ERROR_4400bc01 = 0x4400bc01, + VALIDATION_ERROR_4400ec01 = 0x4400ec01, + VALIDATION_ERROR_44011e01 = 0x44011e01, + VALIDATION_ERROR_44041001 = 0x44041001, + VALIDATION_ERROR_4420bc01 = 0x4420bc01, + VALIDATION_ERROR_44240a01 = 0x44240a01, + VALIDATION_ERROR_44241201 = 0x44241201, + VALIDATION_ERROR_44241203 = 0x44241203, + VALIDATION_ERROR_44242801 = 0x44242801, VALIDATION_ERROR_4442b00b = 0x4442b00b, + VALIDATION_ERROR_4462b00b = 0x4462b00b, + VALIDATION_ERROR_4464141b = 0x4464141b, + VALIDATION_ERROR_44641601 = 0x44641601, + VALIDATION_ERROR_44800ecc = 0x44800ecc, + VALIDATION_ERROR_4482b00b = 0x4482b00b, + VALIDATION_ERROR_44a00eb0 = 0x44a00eb0, + VALIDATION_ERROR_44a00eb2 = 0x44a00eb2, + VALIDATION_ERROR_44a01a01 = 0x44a01a01, + VALIDATION_ERROR_44a2b00b = 0x44a2b00b, + VALIDATION_ERROR_44c00eb4 = 0x44c00eb4, + VALIDATION_ERROR_44c00eb6 = 0x44c00eb6, + VALIDATION_ERROR_44e00ef0 = 0x44e00ef0, + VALIDATION_ERROR_44e00ef2 = 0x44e00ef2, + VALIDATION_ERROR_44e02401 = 0x44e02401, + VALIDATION_ERROR_44e02413 = 0x44e02413, + VALIDATION_ERROR_44e02415 = 0x44e02415, + VALIDATION_ERROR_45000ef6 = 0x45000ef6, + VALIDATION_ERROR_45000ef8 = 0x45000ef8, + VALIDATION_ERROR_4500bc01 = 0x4500bc01, + VALIDATION_ERROR_4500ec01 = 0x4500ec01, + VALIDATION_ERROR_45042601 = 0x45042601, + VALIDATION_ERROR_45042607 = 0x45042607, + VALIDATION_ERROR_45200eb8 = 0x45200eb8, + VALIDATION_ERROR_45201a01 = 0x45201a01, + VALIDATION_ERROR_45205601 = 0x45205601, + VALIDATION_ERROR_4521f401 = 0x4521f401, + VALIDATION_ERROR_45400eee = 0x45400eee, + VALIDATION_ERROR_45429c01 = 0x45429c01, + VALIDATION_ERROR_4562b00b = 0x4562b00b, + VALIDATION_ERROR_45a05601 = 0x45a05601, + VALIDATION_ERROR_45a10001 = 0x45a10001, + VALIDATION_ERROR_45a39c01 = 0x45a39c01, + VALIDATION_ERROR_45c2b00b = 0x45c2b00b, + VALIDATION_ERROR_45e02401 = 0x45e02401, + VALIDATION_ERROR_45e02413 = 0x45e02413, + VALIDATION_ERROR_45e02415 = 0x45e02415, + VALIDATION_ERROR_45e42401 = 0x45e42401, + VALIDATION_ERROR_46002401 = 0x46002401, + VALIDATION_ERROR_46002413 = 0x46002413, + VALIDATION_ERROR_46002415 = 0x46002415, + VALIDATION_ERROR_46042401 = 0x46042401, + VALIDATION_ERROR_46229c01 = 0x46229c01, + VALIDATION_ERROR_46242401 = 0x46242401, + VALIDATION_ERROR_46429c01 = 0x46429c01, + VALIDATION_ERROR_46442401 = 0x46442401, + VALIDATION_ERROR_46605601 = 0x46605601, + VALIDATION_ERROR_4661c201 = 0x4661c201, + VALIDATION_ERROR_46805601 = 0x46805601, + VALIDATION_ERROR_46825c01 = 0x46825c01, + VALIDATION_ERROR_46a01774 = 0x46a01774, + VALIDATION_ERROR_46a01776 = 0x46a01776, + VALIDATION_ERROR_46a01778 = 0x46a01778, + VALIDATION_ERROR_46a0177a = 0x46a0177a, + VALIDATION_ERROR_46a0177c = 0x46a0177c, + VALIDATION_ERROR_46a0177e = 0x46a0177e, + VALIDATION_ERROR_46a01780 = 0x46a01780, + VALIDATION_ERROR_46a01782 = 0x46a01782, + VALIDATION_ERROR_46a01784 = 0x46a01784, + VALIDATION_ERROR_46a01786 = 0x46a01786, + VALIDATION_ERROR_46a01788 = 0x46a01788, + VALIDATION_ERROR_46a0178a = 0x46a0178a, + VALIDATION_ERROR_46a0178c = 0x46a0178c, + VALIDATION_ERROR_46a0178e = 0x46a0178e, + VALIDATION_ERROR_46a2b00b = 0x46a2b00b, + VALIDATION_ERROR_46a42a01 = 0x46a42a01, + VALIDATION_ERROR_46a42a03 = 0x46a42a03, + VALIDATION_ERROR_46c017ca = 0x46c017ca, + VALIDATION_ERROR_46c017cc = 0x46c017cc, + VALIDATION_ERROR_46c2b00b = 0x46c2b00b, + VALIDATION_ERROR_46c42c01 = 0x46c42c01, + VALIDATION_ERROR_46e2b00b = 0x46e2b00b, + VALIDATION_ERROR_4702b00b = 0x4702b00b, + VALIDATION_ERROR_4722b00b = 0x4722b00b, + VALIDATION_ERROR_4742b00b = 0x4742b00b, + VALIDATION_ERROR_47600e9a = 0x47600e9a, + VALIDATION_ERROR_47600e9c = 0x47600e9c, + VALIDATION_ERROR_47600e9e = 0x47600e9e, VALIDATION_ERROR_MAX_ENUM = 1, }; -// Mapping from unique validation error enum to the corresponding error message -// The error message should be appended to the end of a custom error message that is passed -// as the pMessage parameter to the PFN_vkDebugReportCallbackEXT function +// Mapping from unique validation error enum to the corresponding spec text static std::unordered_map validation_error_map{ {VALIDATION_ERROR_00000009, "The spec valid usage text states 'Each of fence, semaphore, and swapchain that are valid handles must have been created, allocated, or retrieved from the same VkInstance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-commonparent)"}, {VALIDATION_ERROR_00000a10, "The spec valid usage text states 'If semaphore is not VK_NULL_HANDLE it must be unsignaled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-01288)"}, @@ -3793,9 +3971,9 @@ {VALIDATION_ERROR_00000a14, "The spec valid usage text states 'deviceMask must be a valid device mask' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-deviceMask-01290)"}, {VALIDATION_ERROR_00000a16, "The spec valid usage text states 'deviceMask must not be zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-deviceMask-01291)"}, {VALIDATION_ERROR_00000d16, "The spec valid usage text states 'swapchain must not be in the retired state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-swapchain-01675)"}, - {VALIDATION_ERROR_00000dea, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHX-semaphore-01781)"}, - {VALIDATION_ERROR_00000dec, "The spec valid usage text states 'semaphore and fence must not both be equal to VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHX-semaphore-01782)"}, - {VALIDATION_ERROR_00000e18, "The spec valid usage text states 'semaphore and fence must not both be equal to VK_NULL_HANDLE.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHX-semaphore-01804)"}, + {VALIDATION_ERROR_00000dea, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-01781)"}, + {VALIDATION_ERROR_00000dec, "The spec valid usage text states 'semaphore and fence must not both be equal to VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-01782)"}, + {VALIDATION_ERROR_00000e18, "The spec valid usage text states 'semaphore and fence must not both be equal to VK_NULL_HANDLE.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-01804)"}, {VALIDATION_ERROR_00008801, "The spec valid usage text states 'If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-fence-parameter)"}, {VALIDATION_ERROR_0001c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-pNext-pNext)"}, {VALIDATION_ERROR_0002b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-sType-sType)"}, @@ -3826,48 +4004,50 @@ {VALIDATION_ERROR_00a006b2, "The spec valid usage text states 'layout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkAttachmentReference-layout-00857)"}, {VALIDATION_ERROR_00a0be01, "The spec valid usage text states 'layout must be a valid VkImageLayout value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkAttachmentReference-layout-parameter)"}, {VALIDATION_ERROR_00c00009, "The spec valid usage text states 'Both of buffer, and memory must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-commonparent)"}, - {VALIDATION_ERROR_00c00c72, "The spec valid usage text states 'buffer must not already be backed by a memory object' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01593)"}, - {VALIDATION_ERROR_00c00c74, "The spec valid usage text states 'buffer must not have been created with any sparse memory binding flags' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01594)"}, - {VALIDATION_ERROR_00c00c76, "The spec valid usage text states 'memoryOffset must be less than the size of memory' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-memoryOffset-01595)"}, - {VALIDATION_ERROR_00c00c78, "The spec valid usage text states 'If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01596)"}, - {VALIDATION_ERROR_00c00c7a, "The spec valid usage text states 'If buffer was created with the VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01597)"}, - {VALIDATION_ERROR_00c00c7c, "The spec valid usage text states 'If buffer was created with the VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01598)"}, - {VALIDATION_ERROR_00c00c7e, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-memory-01599)"}, - {VALIDATION_ERROR_00c00c80, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-memoryOffset-01600)"}, - {VALIDATION_ERROR_00c00c82, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-size-01601)"}, - {VALIDATION_ERROR_00c00c84, "The spec valid usage text states 'If buffer requires a dedicated allocation(as reported by vkGetBufferMemoryRequirements2 in VkMemoryDedicatedRequirements::requiresDedicatedAllocation for image), memory must have been created with VkMemoryDedicatedAllocateInfo::buffer equal to buffer and memoryOffset must be zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01602)"}, - {VALIDATION_ERROR_00c00c86, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01603)"}, - {VALIDATION_ERROR_00c00c88, "The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-buffer-01604)"}, - {VALIDATION_ERROR_00c00c8a, "The spec valid usage text states 'If the pNext chain includes VkBindBufferMemoryDeviceGroupInfo, all instances of memory specified by VkBindBufferMemoryDeviceGroupInfo::pDeviceIndices must have been allocated' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfoKHR-pNext-01605)"}, + {VALIDATION_ERROR_00c00c72, "The spec valid usage text states 'buffer must not already be backed by a memory object' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01593)"}, + {VALIDATION_ERROR_00c00c74, "The spec valid usage text states 'buffer must not have been created with any sparse memory binding flags' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01594)"}, + {VALIDATION_ERROR_00c00c76, "The spec valid usage text states 'memoryOffset must be less than the size of memory' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memoryOffset-01595)"}, + {VALIDATION_ERROR_00c00c78, "The spec valid usage text states 'If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01596)"}, + {VALIDATION_ERROR_00c00c7a, "The spec valid usage text states 'If buffer was created with the VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01597)"}, + {VALIDATION_ERROR_00c00c7c, "The spec valid usage text states 'If buffer was created with the VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01598)"}, + {VALIDATION_ERROR_00c00c7e, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memory-01599)"}, + {VALIDATION_ERROR_00c00c80, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memoryOffset-01600)"}, + {VALIDATION_ERROR_00c00c82, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-size-01601)"}, + {VALIDATION_ERROR_00c00c84, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01602)"}, + {VALIDATION_ERROR_00c00c86, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01603)"}, + {VALIDATION_ERROR_00c00c88, "The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01604)"}, + {VALIDATION_ERROR_00c00c8a, "The spec valid usage text states 'If the pNext chain includes VkBindBufferMemoryDeviceGroupInfo, all instances of memory specified by VkBindBufferMemoryDeviceGroupInfo::pDeviceIndices must have been allocated' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-pNext-01605)"}, + {VALIDATION_ERROR_00c00ed8, "The spec valid usage text states 'If the VkMemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfo 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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memory-01900)"}, {VALIDATION_ERROR_00c01a01, "The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-parameter)"}, {VALIDATION_ERROR_00c0c601, "The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memory-parameter)"}, {VALIDATION_ERROR_00c1c40d, "The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkBindBufferMemoryDeviceGroupInfo' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-pNext-pNext)"}, {VALIDATION_ERROR_00c2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-sType-sType)"}, {VALIDATION_ERROR_00e00009, "The spec valid usage text states 'Both of image, and memory that are valid handles must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-commonparent)"}, - {VALIDATION_ERROR_00e00c92, "The spec valid usage text states 'image must not already be backed by a memory object' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-image-01609)"}, - {VALIDATION_ERROR_00e00c94, "The spec valid usage text states 'image must not have been created with any sparse memory binding flags' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-image-01610)"}, - {VALIDATION_ERROR_00e00c96, "The spec valid usage text states 'memoryOffset must be less than the size of memory' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-memoryOffset-01611)"}, - {VALIDATION_ERROR_00e00c98, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-memory-01612)"}, - {VALIDATION_ERROR_00e00c9a, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-memoryOffset-01613)"}, - {VALIDATION_ERROR_00e00c9c, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-memory-01614)"}, - {VALIDATION_ERROR_00e00c9e, "The spec valid usage text states 'If the pNext chain does not include an instance of the 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01615)"}, - {VALIDATION_ERROR_00e00ca0, "The spec valid usage text states 'If the pNext chain does not include an instance of the 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01616)"}, - {VALIDATION_ERROR_00e00ca2, "The spec valid usage text states 'If the pNext chain does not include an instance of the 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01617)"}, - {VALIDATION_ERROR_00e00ca4, "The spec valid usage text states 'If the pNext chain includes an instance of the VkBindImagePlaneMemoryInfo structure, image must have been created with the VK_IMAGE_CREATE_DISJOINT_BIT bit set.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01618)"}, - {VALIDATION_ERROR_00e00ca6, "The spec valid usage text states 'If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2's pNext chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01619)"}, - {VALIDATION_ERROR_00e00ca8, "The spec valid usage text states 'If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2's pNext chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01620)"}, - {VALIDATION_ERROR_00e00caa, "The spec valid usage text states 'If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2's pNext chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01621)"}, - {VALIDATION_ERROR_00e00cac, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-image-01622)"}, - {VALIDATION_ERROR_00e00cae, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-image-01623)"}, - {VALIDATION_ERROR_00e00cb0, "The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-image-01624)"}, - {VALIDATION_ERROR_00e00cb2, "The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-memory-01625)"}, - {VALIDATION_ERROR_00e00cb4, "The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, all instances of memory specified by VkBindImageMemoryDeviceGroupInfo::pDeviceIndices must have been allocated' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01626)"}, - {VALIDATION_ERROR_00e00cb6, "The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01627)"}, - {VALIDATION_ERROR_00e00cb8, "The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, all elements of VkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions must be valid rectangles contained within the dimensions of image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01628)"}, - {VALIDATION_ERROR_00e00cba, "The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01629)"}, - {VALIDATION_ERROR_00e00cbc, "The spec valid usage text states 'If image was created with a valid swapchain handle in VkImageSwapchainCreateInfoKHR::swapchain, then the pNext chain must include a valid instance of VkBindImageMemorySwapchainInfoKHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-image-01630)"}, - {VALIDATION_ERROR_00e00cbe, "The spec valid usage text states 'If the pNext chain includes an instance of VkBindImageMemorySwapchainInfoKHR, memory must be VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01631)"}, - {VALIDATION_ERROR_00e00cc0, "The spec valid usage text states 'If the pNext chain does not include an instance of VkBindImageMemorySwapchainInfoKHR, memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfoKHR-pNext-01632)"}, + {VALIDATION_ERROR_00e00c92, "The spec valid usage text states 'image must not already be backed by a memory object' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01609)"}, + {VALIDATION_ERROR_00e00c94, "The spec valid usage text states 'image must not have been created with any sparse memory binding flags' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01610)"}, + {VALIDATION_ERROR_00e00c96, "The spec valid usage text states 'memoryOffset must be less than the size of memory' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-memoryOffset-01611)"}, + {VALIDATION_ERROR_00e00c98, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-01612)"}, + {VALIDATION_ERROR_00e00c9a, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindImageMemoryInfo-memoryOffset-01613)"}, + {VALIDATION_ERROR_00e00c9c, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-01614)"}, + {VALIDATION_ERROR_00e00c9e, "The spec valid usage text states 'If the pNext chain does not include an instance of the 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01615)"}, + {VALIDATION_ERROR_00e00ca0, "The spec valid usage text states 'If the pNext chain does not include an instance of the 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01616)"}, + {VALIDATION_ERROR_00e00ca2, "The spec valid usage text states 'If the pNext chain does not include an instance of the 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01617)"}, + {VALIDATION_ERROR_00e00ca4, "The spec valid usage text states 'If the pNext chain includes an instance of the VkBindImagePlaneMemoryInfo structure, image must have been created with the VK_IMAGE_CREATE_DISJOINT_BIT bit set.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01618)"}, + {VALIDATION_ERROR_00e00ca6, "The spec valid usage text states 'If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2's pNext chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01619)"}, + {VALIDATION_ERROR_00e00ca8, "The spec valid usage text states 'If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2's pNext chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01620)"}, + {VALIDATION_ERROR_00e00caa, "The spec valid usage text states 'If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2's pNext chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01621)"}, + {VALIDATION_ERROR_00e00cac, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01622)"}, + {VALIDATION_ERROR_00e00cae, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01623)"}, + {VALIDATION_ERROR_00e00cb0, "The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01624)"}, + {VALIDATION_ERROR_00e00cb2, "The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-01625)"}, + {VALIDATION_ERROR_00e00cb4, "The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, all instances of memory specified by VkBindImageMemoryDeviceGroupInfo::pDeviceIndices must have been allocated' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01626)"}, + {VALIDATION_ERROR_00e00cb6, "The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01627)"}, + {VALIDATION_ERROR_00e00cb8, "The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, all elements of VkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions must be valid rectangles contained within the dimensions of image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01628)"}, + {VALIDATION_ERROR_00e00cba, "The spec valid usage text states 'If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01629)"}, + {VALIDATION_ERROR_00e00cbc, "The spec valid usage text states 'If image was created with a valid swapchain handle in VkImageSwapchainCreateInfoKHR::swapchain, then the pNext chain must include a valid instance of VkBindImageMemorySwapchainInfoKHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01630)"}, + {VALIDATION_ERROR_00e00cbe, "The spec valid usage text states 'If the pNext chain includes an instance of VkBindImageMemorySwapchainInfoKHR, memory must be VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01631)"}, + {VALIDATION_ERROR_00e00cc0, "The spec valid usage text states 'If the pNext chain does not include an instance of VkBindImageMemorySwapchainInfoKHR, memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01632)"}, + {VALIDATION_ERROR_00e00ede, "The spec valid usage text states 'If the VkMemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfo 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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-01903)"}, {VALIDATION_ERROR_00e0a001, "The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-parameter)"}, {VALIDATION_ERROR_00e1c40d, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-pNext)"}, {VALIDATION_ERROR_00e2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-sType-sType)"}, @@ -3894,6 +4074,8 @@ {VALIDATION_ERROR_01400ade, "The spec valid usage text states '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)"}, {VALIDATION_ERROR_01400b16, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-sharingMode-01419)"}, {VALIDATION_ERROR_01400c46, "The spec valid usage text states 'If the pNext chain contains an instance of VkDedicatedAllocationBufferCreateInfoNV, 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.0-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-pNext-01571)"}, + {VALIDATION_ERROR_01400ebe, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-flags-01887)"}, + {VALIDATION_ERROR_01400ec0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-None-01888)"}, {VALIDATION_ERROR_01409001, "The spec valid usage text states 'flags must be a valid combination of VkBufferCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferCreateInfo-flags-parameter)"}, {VALIDATION_ERROR_0141c40d, "The spec valid usage text states '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 VkDedicatedAllocationBufferCreateInfoNV or VkExternalMemoryBufferCreateInfo' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferCreateInfo-pNext-pNext)"}, {VALIDATION_ERROR_0142b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferCreateInfo-sType-sType)"}, @@ -3943,6 +4125,7 @@ {VALIDATION_ERROR_01800dc6, "The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01763)"}, {VALIDATION_ERROR_01800dc8, "The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01764)"}, {VALIDATION_ERROR_01800dca, "The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01765)"}, + {VALIDATION_ERROR_01800f16, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01931)"}, {VALIDATION_ERROR_01801a01, "The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-parameter)"}, {VALIDATION_ERROR_01806801, "The spec valid usage text states 'dstAccessMask must be a valid combination of VkAccessFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-dstAccessMask-parameter)"}, {VALIDATION_ERROR_0181c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-pNext-pNext)"}, @@ -3968,6 +4151,8 @@ {VALIDATION_ERROR_01c0002a, "The spec valid usage text states 'clearValue must be a valid VkClearValue union' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkClearAttachment-clearValue-00021)"}, {VALIDATION_ERROR_01c00c01, "The spec valid usage text states 'aspectMask must be a valid combination of VkImageAspectFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkClearAttachment-aspectMask-parameter)"}, {VALIDATION_ERROR_01c00c03, "The spec valid usage text states 'aspectMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkClearAttachment-aspectMask-requiredbitmask)"}, + {VALIDATION_ERROR_01c00e22, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then the attachment to be cleared must not be a protected image.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkClearAttachment-commandBuffer-01809)"}, + {VALIDATION_ERROR_01c00e24, "The spec valid usage text states 'If commandBuffer is a protected command buffer, then the attachment to be cleared must not be an unprotected image.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkClearAttachment-commandBuffer-01810)"}, {VALIDATION_ERROR_01e0002c, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkClearDepthStencilValue-depth-00022)"}, {VALIDATION_ERROR_0200002e, "The spec valid usage text states 'depthStencil must be a valid VkClearDepthStencilValue structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkClearValue-depthStencil-00023)"}, {VALIDATION_ERROR_02200009, "The spec valid usage text states 'Each of indirectCommandsLayout, objectTable, sequencesCountBuffer, sequencesIndexBuffer, and targetCommandBuffer that are valid handles must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkCmdProcessCommandsInfoNVX-commonparent)"}, @@ -4041,6 +4226,10 @@ {VALIDATION_ERROR_032002b6, "The spec valid usage text states 'dstBinding must be a valid binding within dstSet' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkCopyDescriptorSet-dstBinding-00347)"}, {VALIDATION_ERROR_032002b8, "The spec valid usage text states '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 descriptorsets-updates-consecutive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkCopyDescriptorSet-dstArrayElement-00348)"}, {VALIDATION_ERROR_032002ba, "The spec valid usage text states '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 descriptorsets-updates-consecutive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-00349)"}, + {VALIDATION_ERROR_03200efc, "The spec valid usage text states 'If srcSet's layout was created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set, then dstSet's layout must also have been created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-01918)"}, + {VALIDATION_ERROR_03200efe, "The spec valid usage text states 'If srcSet's layout was created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set, then dstSet's layout must also have been created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-01919)"}, + {VALIDATION_ERROR_03200f00, "The spec valid usage text states 'If the descriptor pool from which srcSet was allocated was created with the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT 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_EXT flag set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-01920)"}, + {VALIDATION_ERROR_03200f02, "The spec valid usage text states 'If the descriptor pool from which srcSet was allocated was created without the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT 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_EXT flag set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-01921)"}, {VALIDATION_ERROR_03207601, "The spec valid usage text states 'dstSet must be a valid VkDescriptorSet handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkCopyDescriptorSet-dstSet-parameter)"}, {VALIDATION_ERROR_0321c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkCopyDescriptorSet-pNext-pNext)"}, {VALIDATION_ERROR_0322b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkCopyDescriptorSet-sType-sType)"}, @@ -4070,7 +4259,6 @@ {VALIDATION_ERROR_03a2f41b, "The spec valid usage text states 'tagSize must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectTagInfoEXT-tagSize-arraylength)"}, {VALIDATION_ERROR_03c00ad2, "The spec valid usage text states 'pfnCallback must be a valid PFN_vkDebugReportCallbackEXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugReportCallbackCreateInfoEXT-pfnCallback-01385)"}, {VALIDATION_ERROR_03c09001, "The spec valid usage text states 'flags must be a valid combination of VkDebugReportFlagBitsEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugReportCallbackCreateInfoEXT-flags-parameter)"}, - {VALIDATION_ERROR_03c1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugReportCallbackCreateInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_03c2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugReportCallbackCreateInfoEXT-sType-sType)"}, {VALIDATION_ERROR_03e2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDedicatedAllocationBufferCreateInfoNV-sType-sType)"}, {VALIDATION_ERROR_040007c4, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDedicatedAllocationImageCreateInfoNV-dedicatedAllocation-00994)"}, @@ -4107,9 +4295,10 @@ {VALIDATION_ERROR_04c00264, "The spec valid usage text states '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)"}, {VALIDATION_ERROR_04c00266, "The spec valid usage text states '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)"}, {VALIDATION_ERROR_04c00268, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pSetLayouts-00308)"}, + {VALIDATION_ERROR_04c017c8, "The spec valid usage text states 'If any element of pSetLayouts was created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT bit set, descriptorPool must have been created with the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT flag set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pSetLayouts-03044)"}, {VALIDATION_ERROR_04c04601, "The spec valid usage text states 'descriptorPool must be a valid VkDescriptorPool handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-descriptorPool-parameter)"}, {VALIDATION_ERROR_04c04a1b, "The spec valid usage text states 'descriptorSetCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-arraylength)"}, - {VALIDATION_ERROR_04c1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pNext-pNext)"}, + {VALIDATION_ERROR_04c1c40d, "The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkDescriptorSetVariableDescriptorCountAllocateInfoEXT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pNext-pNext)"}, {VALIDATION_ERROR_04c22c01, "The spec valid usage text states 'pSetLayouts must be a valid pointer to an array of descriptorSetCount valid VkDescriptorSetLayout handles' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pSetLayouts-parameter)"}, {VALIDATION_ERROR_04c2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-sType-sType)"}, {VALIDATION_ERROR_04e00234, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkDescriptorSetLayoutBinding-descriptorType-00282)"}, @@ -4119,9 +4308,11 @@ {VALIDATION_ERROR_0500022e, "The spec valid usage text states 'The VkDescriptorSetLayoutBinding::binding members of the elements of the pBindings array must each have different values.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-binding-00279)"}, {VALIDATION_ERROR_05000230, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-00280)"}, {VALIDATION_ERROR_05000232, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-00281)"}, + {VALIDATION_ERROR_05001770, "The spec valid usage text states 'If any binding has the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT bit set, flags must include VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-03000)"}, + {VALIDATION_ERROR_05001772, "The spec valid usage text states 'If any binding has the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-03001)"}, {VALIDATION_ERROR_05009001, "The spec valid usage text states 'flags must be a valid combination of VkDescriptorSetLayoutCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-parameter)"}, {VALIDATION_ERROR_0500fc01, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-pBindings-parameter)"}, - {VALIDATION_ERROR_0501c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext)"}, + {VALIDATION_ERROR_0501c40d, "The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkDescriptorSetLayoutBindingFlagsCreateInfoEXT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext)"}, {VALIDATION_ERROR_0502b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-sType-sType)"}, {VALIDATION_ERROR_05200009, "The spec valid usage text states 'Both of descriptorSetLayout, and pipelineLayout that are valid handles must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-commonparent)"}, {VALIDATION_ERROR_052002bc, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350)"}, @@ -4141,9 +4332,10 @@ {VALIDATION_ERROR_056002e8, "The spec valid usage text states '' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-queueFamilyIndex-00372)"}, {VALIDATION_ERROR_056002ea, "The spec valid usage text states 'If the pNext chain includes a VkPhysicalDeviceFeatures2 structure, then pEnabledFeatures must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-pNext-00373)"}, {VALIDATION_ERROR_056002ec, "The spec valid usage text states 'ppEnabledExtensionNames must not contain both VK_KHR_maintenance1 and VK_AMD_negative_viewport_height' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-00374)"}, + {VALIDATION_ERROR_05600e60, "The spec valid usage text states 'ppEnabledExtensionNames must not contain VK_AMD_negative_viewport_height' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-01840)"}, {VALIDATION_ERROR_05609005, "The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-flags-zerobitmask)"}, {VALIDATION_ERROR_05615a01, "The spec valid usage text states 'If pEnabledFeatures is not NULL, pEnabledFeatures must be a valid pointer to a valid VkPhysicalDeviceFeatures structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-pEnabledFeatures-parameter)"}, - {VALIDATION_ERROR_0561c40d, "The spec valid usage text states '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 VkDeviceGroupDeviceCreateInfo, VkPhysicalDevice16BitStorageFeatures, VkPhysicalDeviceFeatures2, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceSamplerYcbcrConversionFeatures, or VkPhysicalDeviceVariablePointerFeatures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-pNext-pNext)"}, + {VALIDATION_ERROR_0561c40d, "The spec valid usage text states '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 VkDeviceGroupDeviceCreateInfo, VkPhysicalDevice16BitStorageFeatures, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, VkPhysicalDeviceFeatures2, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceSamplerYcbcrConversionFeatures, or VkPhysicalDeviceVariablePointerFeatures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-pNext-pNext)"}, {VALIDATION_ERROR_0561fe01, "The spec valid usage text states 'pQueueCreateInfos must be a valid pointer to an array of queueCreateInfoCount valid VkDeviceQueueCreateInfo structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDeviceCreateInfo-pQueueCreateInfos-parameter)"}, {VALIDATION_ERROR_05628e01, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-parameter)"}, {VALIDATION_ERROR_05629001, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledLayerNames-parameter)"}, @@ -4234,7 +4426,7 @@ {VALIDATION_ERROR_0782b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-sType-sType)"}, {VALIDATION_ERROR_07830201, "The spec valid usage text states 'transform must be a valid VkSurfaceTransformFlagBitsKHR value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-transform-parameter)"}, {VALIDATION_ERROR_07a00450, "The spec valid usage text states 'For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in fxvertex-input' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDrawIndexedIndirectCommand-None-00552)"}, - {VALIDATION_ERROR_07a00452, "The spec valid usage text states '(indexSize * (firstIndex + indexCount) + offset) must be less than or equal to the size of the currently 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.0/html/vkspec.html#VUID-VkDrawIndexedIndirectCommand-indexSize-00553)"}, + {VALIDATION_ERROR_07a00452, "The spec valid usage text states '(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.0/html/vkspec.html#VUID-VkDrawIndexedIndirectCommand-indexSize-00553)"}, {VALIDATION_ERROR_07a00454, "The spec valid usage text states 'If the drawIndirectFirstInstance feature is not enabled, firstInstance must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDrawIndexedIndirectCommand-firstInstance-00554)"}, {VALIDATION_ERROR_07c003e8, "The spec valid usage text states 'For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in fxvertex-input' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDrawIndirectCommand-None-00500)"}, {VALIDATION_ERROR_07c003ea, "The spec valid usage text states 'If the drawIndirectFirstInstance feature is not enabled, firstInstance must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDrawIndirectCommand-firstInstance-00501)"}, @@ -4243,35 +4435,26 @@ {VALIDATION_ERROR_07e2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EVENT_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkEventCreateInfo-sType-sType)"}, {VALIDATION_ERROR_08000520, "The spec valid usage text states 'The bits in handleTypes must be supported and compatible, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfo-handleTypes-00656)"}, {VALIDATION_ERROR_08009e01, "The spec valid usage text states 'handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfo-handleTypes-parameter)"}, - {VALIDATION_ERROR_0801c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfo-pNext-pNext)"}, {VALIDATION_ERROR_0802b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfo-sType-sType)"}, {VALIDATION_ERROR_08209e01, "The spec valid usage text states 'handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfoNV-handleTypes-parameter)"}, - {VALIDATION_ERROR_0821c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfoNV-pNext-pNext)"}, {VALIDATION_ERROR_0822b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfoNV-sType-sType)"}, {VALIDATION_ERROR_08400522, "The spec valid usage text states '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, VkExportMemoryWin32HandleInfoKHR must not be in the pNext chain of VkMemoryAllocateInfo.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoKHR-handleTypes-00657)"}, {VALIDATION_ERROR_0840f401, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoKHR-pAttributes-parameter)"}, - {VALIDATION_ERROR_0841c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoKHR-pNext-pNext)"}, {VALIDATION_ERROR_0842b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoKHR-sType-sType)"}, {VALIDATION_ERROR_0860f401, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoNV-pAttributes-parameter)"}, - {VALIDATION_ERROR_0861c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoNV-pNext-pNext)"}, {VALIDATION_ERROR_0862b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoNV-sType-sType)"}, {VALIDATION_ERROR_088008c8, "The spec valid usage text states 'The bits in handleTypes must be supported and compatible, as reported by VkExternalSemaphoreProperties.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-handleTypes-01124)"}, {VALIDATION_ERROR_08809e01, "The spec valid usage text states 'handleTypes must be a valid combination of VkExternalSemaphoreHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-handleTypes-parameter)"}, - {VALIDATION_ERROR_0881c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-pNext-pNext)"}, {VALIDATION_ERROR_0882b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-sType-sType)"}, {VALIDATION_ERROR_08a008ca, "The spec valid usage text states '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 in the pNext chain of VkSemaphoreCreateInfo.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreWin32HandleInfoKHR-handleTypes-01125)"}, {VALIDATION_ERROR_08a0f401, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreWin32HandleInfoKHR-pAttributes-parameter)"}, - {VALIDATION_ERROR_08a1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreWin32HandleInfoKHR-pNext-pNext)"}, {VALIDATION_ERROR_08a2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportSemaphoreWin32HandleInfoKHR-sType-sType)"}, {VALIDATION_ERROR_08c09e01, "The spec valid usage text states 'handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryBufferCreateInfo-handleTypes-parameter)"}, - {VALIDATION_ERROR_08c1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryBufferCreateInfo-pNext-pNext)"}, {VALIDATION_ERROR_08c2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryBufferCreateInfo-sType-sType)"}, {VALIDATION_ERROR_08e09e01, "The spec valid usage text states 'handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-handleTypes-parameter)"}, {VALIDATION_ERROR_08e09e03, "The spec valid usage text states 'handleTypes must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-handleTypes-requiredbitmask)"}, - {VALIDATION_ERROR_08e1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-pNext-pNext)"}, {VALIDATION_ERROR_08e2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-sType-sType)"}, {VALIDATION_ERROR_09009e01, "The spec valid usage text states 'handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfoNV-handleTypes-parameter)"}, - {VALIDATION_ERROR_0901c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfoNV-pNext-pNext)"}, {VALIDATION_ERROR_0902b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfoNV-sType-sType)"}, {VALIDATION_ERROR_09209001, "The spec valid usage text states 'flags must be a valid combination of VkFenceCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkFenceCreateInfo-flags-parameter)"}, {VALIDATION_ERROR_0921c40d, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkFenceCreateInfo-pNext-pNext)"}, @@ -4472,16 +4655,6 @@ {VALIDATION_ERROR_09e0079c, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00974)"}, {VALIDATION_ERROR_09e0079e, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00975)"}, {VALIDATION_ERROR_09e007a0, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00976)"}, - {VALIDATION_ERROR_09e007a2, "The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, format must be a format that has at least one supported feature bit present in the value of VkFormatProperties::linearTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00977)"}, - {VALIDATION_ERROR_09e007a4, "The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, and VkFormatProperties::linearTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT, usage must not contain VK_IMAGE_USAGE_SAMPLED_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00978)"}, - {VALIDATION_ERROR_09e007a6, "The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, and VkFormatProperties::linearTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT, usage must not contain VK_IMAGE_USAGE_STORAGE_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00979)"}, - {VALIDATION_ERROR_09e007a8, "The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, and VkFormatProperties::linearTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT, usage must not contain VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00980)"}, - {VALIDATION_ERROR_09e007aa, "The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, and VkFormatProperties::linearTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT, usage must not contain VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00981)"}, - {VALIDATION_ERROR_09e007ac, "The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, format must be a format that has at least one supported feature bit present in the value of VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00982)"}, - {VALIDATION_ERROR_09e007ae, "The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, and VkFormatProperties::optimalTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT, usage must not contain VK_IMAGE_USAGE_SAMPLED_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00983)"}, - {VALIDATION_ERROR_09e007b0, "The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, and VkFormatProperties::optimalTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT, usage must not contain VK_IMAGE_USAGE_STORAGE_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00984)"}, - {VALIDATION_ERROR_09e007b2, "The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, and VkFormatProperties::optimalTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT, usage must not contain VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00985)"}, - {VALIDATION_ERROR_09e007b4, "The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, and VkFormatProperties::optimalTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT, usage must not contain VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-tiling-00986)"}, {VALIDATION_ERROR_09e007b6, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-flags-00987)"}, {VALIDATION_ERROR_09e007b8, "The spec valid usage text states 'If the pNext chain contains an instance of VkExternalMemoryImageCreateInfoNV, it must not contain an instance of VkExternalMemoryImageCreateInfo.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-00988)"}, {VALIDATION_ERROR_09e007bc, "The spec valid usage text states 'If the pNext chain contains an instance of VkExternalMemoryImageCreateInfo, 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 an instance of VkPhysicalDeviceExternalImageFormatInfo 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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-00990)"}, @@ -4491,7 +4664,7 @@ {VALIDATION_ERROR_09e00ae0, "The spec valid usage text states '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)"}, {VALIDATION_ERROR_09e00b18, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-sharingMode-01420)"}, {VALIDATION_ERROR_09e00b1a, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-physicalDeviceCount-01421)"}, - {VALIDATION_ERROR_09e00b46, "The spec valid usage text states 'If the pNext chain includes a ifdef::VK_KHR_external_memory[VkExternalMemoryImageCreateInfo]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01443)"}, + {VALIDATION_ERROR_09e00b46, "The spec valid usage text states 'If the pNext chain includes a ifdef::VK_VERSION_1_1,VK_KHR_external_memory[VkExternalMemoryImageCreateInfo]' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01443)"}, {VALIDATION_ERROR_09e00bfa, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01533)"}, {VALIDATION_ERROR_09e00c48, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01572)"}, {VALIDATION_ERROR_09e00c4a, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01573)"}, @@ -4499,11 +4672,18 @@ {VALIDATION_ERROR_09e00c4e, "The spec valid usage text states 'If tiling is VK_IMAGE_TILING_OPTIMAL, format is a multi-planar format, and VkFormatProperties::optimalTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_DISJOINT_BIT, flags must not contain VK_IMAGE_CREATE_DISJOINT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-tiling-01575)"}, {VALIDATION_ERROR_09e00c50, "The spec valid usage text states 'If tiling is VK_IMAGE_TILING_LINEAR, format is a multi-planar format, and VkFormatProperties::linearTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_DISJOINT_BIT, flags must not contain VK_IMAGE_CREATE_DISJOINT_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-tiling-01576)"}, {VALIDATION_ERROR_09e00c52, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-01577)"}, + {VALIDATION_ERROR_09e00ec2, "The spec valid usage text states 'If the pNext chain doesn't contain an instance of VkExternalFormatANDROID, or if format is not VK_FORMAT_UNDEFINED, the combination of format, imageType, tiling, usage, and flags must be supported, as indicated by a VK_SUCCESS return value from vkGetPhysicalDeviceImageFormatProperties invoked with the same values passed to the corresponding parameters.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01889)"}, + {VALIDATION_ERROR_09e00ec4, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01890)"}, + {VALIDATION_ERROR_09e00ec6, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-None-01891)"}, + {VALIDATION_ERROR_09e00ec8, "The spec valid usage text states 'If the pNext chain includes a VkExternalMemoryImageCreateInfo structure whose handleTypes member includes VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01892)"}, + {VALIDATION_ERROR_09e00eca, "The spec valid usage text states 'If the pNext chain includes a VkExternalFormatANDROID structure whose externalFormat member is not 0:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01893)"}, + {VALIDATION_ERROR_09e00f08, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-flags-01924)"}, + {VALIDATION_ERROR_09e00f0a, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageCreateInfo-None-01925)"}, {VALIDATION_ERROR_09e09001, "The spec valid usage text states 'flags must be a valid combination of VkImageCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-flags-parameter)"}, {VALIDATION_ERROR_09e09201, "The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-format-parameter)"}, {VALIDATION_ERROR_09e0ac01, "The spec valid usage text states 'imageType must be a valid VkImageType value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-imageType-parameter)"}, {VALIDATION_ERROR_09e0b801, "The spec valid usage text states 'initialLayout must be a valid VkImageLayout value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-initialLayout-parameter)"}, - {VALIDATION_ERROR_09e1c40d, "The spec valid usage text states '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, VkExternalMemoryImageCreateInfo, VkExternalMemoryImageCreateInfoNV, VkImageFormatListCreateInfoKHR, or VkImageSwapchainCreateInfoKHR' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-pNext-pNext)"}, + {VALIDATION_ERROR_09e1c40d, "The spec valid usage text states '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, VkImageFormatListCreateInfoKHR, or VkImageSwapchainCreateInfoKHR' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-pNext-pNext)"}, {VALIDATION_ERROR_09e2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-sType-sType)"}, {VALIDATION_ERROR_09e2b00f, "The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-sType-unique)"}, {VALIDATION_ERROR_09e2b401, "The spec valid usage text states 'samples must be a valid VkSampleCountFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-samples-parameter)"}, @@ -4530,13 +4710,14 @@ {VALIDATION_ERROR_0a000cf4, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01658)"}, {VALIDATION_ERROR_0a000cf6, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01659)"}, {VALIDATION_ERROR_0a000d0e, "The spec valid usage text states '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' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01671)"}, - {VALIDATION_ERROR_0a000d10, "The spec valid usage text states '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_KHR, VK_IMAGE_ASPECT_PLANE_1_BIT_KHR, and VK_IMAGE_ASPECT_PLANE_2_BIT_KHR; or must include VK_IMAGE_ASPECT_COLOR_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01672)"}, - {VALIDATION_ERROR_0a000d12, "The spec valid usage text states '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_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01673)"}, + {VALIDATION_ERROR_0a000d10, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01672)"}, + {VALIDATION_ERROR_0a000d12, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01673)"}, {VALIDATION_ERROR_0a000d78, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageMemoryBarrier-subresourceRange-01724)"}, {VALIDATION_ERROR_0a000d7a, "The spec valid usage text states '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-VkImageMemoryBarrier-subresourceRange-01725)"}, {VALIDATION_ERROR_0a000dcc, "The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01766)"}, {VALIDATION_ERROR_0a000dce, "The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01767)"}, {VALIDATION_ERROR_0a000dd0, "The spec valid usage text states '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 synchronization-queue-transfers.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01768)"}, + {VALIDATION_ERROR_0a000f18, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01932)"}, {VALIDATION_ERROR_0a006801, "The spec valid usage text states 'dstAccessMask must be a valid combination of VkAccessFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-dstAccessMask-parameter)"}, {VALIDATION_ERROR_0a00a001, "The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-image-parameter)"}, {VALIDATION_ERROR_0a00d401, "The spec valid usage text states 'newLayout must be a valid VkImageLayout value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-newLayout-parameter)"}, @@ -4569,7 +4750,7 @@ {VALIDATION_ERROR_0a600d48, "The spec valid usage text states 'layerCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceLayers-layerCount-01700)"}, {VALIDATION_ERROR_0a800c01, "The spec valid usage text states 'aspectMask must be a valid combination of VkImageAspectFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-parameter)"}, {VALIDATION_ERROR_0a800c03, "The spec valid usage text states 'aspectMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-requiredbitmask)"}, - {VALIDATION_ERROR_0a800d0c, "The spec valid usage text states 'If aspectMask includes VK_IMAGE_ASPECT_COLOR_BIT, then it must not include any of VK_IMAGE_ASPECT_PLANE_0_BIT_KHR, VK_IMAGE_ASPECT_PLANE_1_BIT_KHR, or VK_IMAGE_ASPECT_PLANE_2_BIT_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-01670)"}, + {VALIDATION_ERROR_0a800d0c, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-01670)"}, {VALIDATION_ERROR_0a800d70, "The spec valid usage text states 'If levelCount is not VK_REMAINING_MIP_LEVELS, it must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceRange-levelCount-01720)"}, {VALIDATION_ERROR_0a800d72, "The spec valid usage text states 'If layerCount is not VK_REMAINING_ARRAY_LAYERS, it must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceRange-layerCount-01721)"}, {VALIDATION_ERROR_0aa007c6, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995)"}, @@ -4609,6 +4790,7 @@ {VALIDATION_ERROR_0ac00dc0, "The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01760)"}, {VALIDATION_ERROR_0ac00dc2, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01761)"}, {VALIDATION_ERROR_0ac00dc4, "The spec valid usage text states 'If image was not created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag,' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01762)"}, + {VALIDATION_ERROR_0ac00ed0, "The spec valid usage text states 'If image has an external format:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01896)"}, {VALIDATION_ERROR_0ac02c01, "The spec valid usage text states 'components must be a valid VkComponentMapping structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-components-parameter)"}, {VALIDATION_ERROR_0ac09005, "The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-flags-zerobitmask)"}, {VALIDATION_ERROR_0ac09201, "The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-format-parameter)"}, @@ -4625,7 +4807,6 @@ {VALIDATION_ERROR_0ae00be0, "The spec valid usage text states 'fd must obey any requirements listed for handleType in external memory handle types compatibility.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-fd-01520)"}, {VALIDATION_ERROR_0ae00da4, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-fd-01746)"}, {VALIDATION_ERROR_0ae09c01, "The spec valid usage text states 'If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-handleType-parameter)"}, - {VALIDATION_ERROR_0ae1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-pNext-pNext)"}, {VALIDATION_ERROR_0ae2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-sType-sType)"}, {VALIDATION_ERROR_0b000524, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00658)"}, {VALIDATION_ERROR_0b000526, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handle-00659)"}, @@ -4637,12 +4818,10 @@ {VALIDATION_ERROR_0b000bdc, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handle-01518)"}, {VALIDATION_ERROR_0b000bde, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-name-01519)"}, {VALIDATION_ERROR_0b009c01, "The spec valid usage text states 'If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handleType-parameter)"}, - {VALIDATION_ERROR_0b01c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-pNext-pNext)"}, {VALIDATION_ERROR_0b02b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-sType-sType)"}, {VALIDATION_ERROR_0b200a5e, "The spec valid usage text states 'handleType must not have more than one bit set.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-handleType-01327)"}, {VALIDATION_ERROR_0b200a60, "The spec valid usage text states 'handle must be a valid handle to memory, obtained as specified by handleType.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-handle-01328)"}, {VALIDATION_ERROR_0b209c01, "The spec valid usage text states 'handleType must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-handleType-parameter)"}, - {VALIDATION_ERROR_0b21c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-pNext-pNext)"}, {VALIDATION_ERROR_0b22b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-sType-sType)"}, {VALIDATION_ERROR_0b4008ee, "The spec valid usage text states 'handleType must be a value included in the Handle Types Supported by VkImportSemaphoreFdInfoKHR table.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-handleType-01143)"}, {VALIDATION_ERROR_0b400c10, "The spec valid usage text states 'fd must obey any requirements listed for handleType in external semaphore handle types compatibility.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-fd-01544)"}, @@ -4721,7 +4900,11 @@ {VALIDATION_ERROR_0c600d9e, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-01743)"}, {VALIDATION_ERROR_0c600da0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-memoryTypeIndex-01744)"}, {VALIDATION_ERROR_0c600da2, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-01745)"}, - {VALIDATION_ERROR_0c61c40d, "The spec valid usage text states '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, VkImportMemoryFdInfoKHR, VkImportMemoryHostPointerInfoEXT, VkImportMemoryWin32HandleInfoKHR, VkImportMemoryWin32HandleInfoNV, VkMemoryAllocateFlagsInfo, or VkMemoryDedicatedAllocateInfo' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-pNext)"}, + {VALIDATION_ERROR_0c600ea0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-memoryTypeIndex-01872)"}, + {VALIDATION_ERROR_0c600ea2, "The spec valid usage text states 'If the parameters define an import operation and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BIT_ANDROID:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-None-01873)"}, + {VALIDATION_ERROR_0c600ea4, "The spec valid usage text states 'If the parameters do not define an import operation, and the pNext chain contains an instance of VkExportMemoryAllocateInfo with VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID included in its handleTypes member, and the pNext contains an instance of VkMemoryDedicatedAllocateInfo 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.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-01874)"}, + {VALIDATION_ERROR_0c600ea6, "The spec valid usage text states 'If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes an instance of VkMemoryDedicatedAllocateInfo with image that is not VK_NULL_HANDLE:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-01875)"}, + {VALIDATION_ERROR_0c61c40d, "The spec valid usage text states '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, or VkMemoryDedicatedAllocateInfo' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-pNext)"}, {VALIDATION_ERROR_0c62b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkMemoryAllocateInfo-sType-sType)"}, {VALIDATION_ERROR_0c62b00f, "The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkMemoryAllocateInfo-sType-unique)"}, {VALIDATION_ERROR_0c806801, "The spec valid usage text states 'dstAccessMask must be a valid combination of VkAccessFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkMemoryBarrier-dstAccessMask-parameter)"}, @@ -4780,7 +4963,6 @@ {VALIDATION_ERROR_0d809001, "The spec valid usage text states 'flags must be a valid combination of VkObjectEntryUsageFlagBitsNVX values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkObjectTableVertexBufferEntryNVX-flags-parameter)"}, {VALIDATION_ERROR_0d809003, "The spec valid usage text states 'flags must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkObjectTableVertexBufferEntryNVX-flags-requiredbitmask)"}, {VALIDATION_ERROR_0d830401, "The spec valid usage text states 'type must be a valid VkObjectEntryTypeNVX value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkObjectTableVertexBufferEntryNVX-type-parameter)"}, - {VALIDATION_ERROR_0da1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDiscardRectanglePropertiesEXT-pNext-pNext)"}, {VALIDATION_ERROR_0da2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDiscardRectanglePropertiesEXT-sType-sType)"}, {VALIDATION_ERROR_0dc09001, "The spec valid usage text states 'flags must be a valid combination of VkBufferCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-flags-parameter)"}, {VALIDATION_ERROR_0dc09c01, "The spec valid usage text states 'handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-handleType-parameter)"}, @@ -4793,9 +4975,7 @@ {VALIDATION_ERROR_0e009c01, "The spec valid usage text states 'handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-handleType-parameter)"}, {VALIDATION_ERROR_0e01c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-pNext-pNext)"}, {VALIDATION_ERROR_0e02b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-sType)"}, - {VALIDATION_ERROR_0e41c40d, "The spec valid usage text states '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 VkPhysicalDevice16BitStorageFeatures, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceSamplerYcbcrConversionFeatures, VkPhysicalDeviceShaderDrawParameterFeatures, or VkPhysicalDeviceVariablePointerFeatures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFeatures2-pNext-pNext)"}, {VALIDATION_ERROR_0e42b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFeatures2-sType-sType)"}, - {VALIDATION_ERROR_0e42b00f, "The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFeatures2-sType-unique)"}, {VALIDATION_ERROR_0e609001, "The spec valid usage text states 'flags must be a valid combination of VkImageCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-flags-parameter)"}, {VALIDATION_ERROR_0e609201, "The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-format-parameter)"}, {VALIDATION_ERROR_0e61c40d, "The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkPhysicalDeviceExternalImageFormatInfo' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-pNext-pNext)"}, @@ -4807,7 +4987,6 @@ {VALIDATION_ERROR_0e800488, "The spec valid usage text states 'If multiviewGeometryShader is enabled then multiview must also be enabled.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580)"}, {VALIDATION_ERROR_0e80048a, "The spec valid usage text states 'If multiviewTessellationShader is enabled then multiview must also be enabled.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581)"}, {VALIDATION_ERROR_0e82b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewFeatures-sType-sType)"}, - {VALIDATION_ERROR_0ea1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDevicePushDescriptorPropertiesKHR-pNext-pNext)"}, {VALIDATION_ERROR_0ea2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDevicePushDescriptorPropertiesKHR-sType-sType)"}, {VALIDATION_ERROR_0ec0088e, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-01095)"}, {VALIDATION_ERROR_0ec09201, "The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-format-parameter)"}, @@ -4860,7 +5039,6 @@ {VALIDATION_ERROR_0f80048c, "The spec valid usage text states 'discardRectangleCount must be between 0 and VkPhysicalDeviceDiscardRectanglePropertiesEXT::maxDiscardRectangles, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleCount-00582)"}, {VALIDATION_ERROR_0f805e01, "The spec valid usage text states 'discardRectangleMode must be a valid VkDiscardRectangleModeEXT value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleMode-parameter)"}, {VALIDATION_ERROR_0f809005, "The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-flags-zerobitmask)"}, - {VALIDATION_ERROR_0f81c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_0f82b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-sType-sType)"}, {VALIDATION_ERROR_0fa00b44, "The spec valid usage text states 'Each element of pDynamicStates must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442)"}, {VALIDATION_ERROR_0fa07c1b, "The spec valid usage text states 'dynamicStateCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineDynamicStateCreateInfo-dynamicStateCount-arraylength)"}, @@ -4892,6 +5070,34 @@ {VALIDATION_ERROR_0fe00d24, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01682)"}, {VALIDATION_ERROR_0fe00d26, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01683)"}, {VALIDATION_ERROR_0fe00d28, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01684)"}, + {VALIDATION_ERROR_0fe01790, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03016)"}, + {VALIDATION_ERROR_0fe01792, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03017)"}, + {VALIDATION_ERROR_0fe01794, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03018)"}, + {VALIDATION_ERROR_0fe01796, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03019)"}, + {VALIDATION_ERROR_0fe01798, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03020)"}, + {VALIDATION_ERROR_0fe0179a, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03021)"}, + {VALIDATION_ERROR_0fe0179c, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindSamplers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03022)"}, + {VALIDATION_ERROR_0fe0179e, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindUniformBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03023)"}, + {VALIDATION_ERROR_0fe017a0, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindStorageBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03024)"}, + {VALIDATION_ERROR_0fe017a2, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindSampledImages' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03025)"}, + {VALIDATION_ERROR_0fe017a4, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindStorageImages' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03026)"}, + {VALIDATION_ERROR_0fe017a6, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindInputAttachments' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03027)"}, + {VALIDATION_ERROR_0fe017a8, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03028)"}, + {VALIDATION_ERROR_0fe017aa, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stagess and and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03029)"}, + {VALIDATION_ERROR_0fe017ac, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03030)"}, + {VALIDATION_ERROR_0fe017ae, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03031)"}, + {VALIDATION_ERROR_0fe017b0, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03032)"}, + {VALIDATION_ERROR_0fe017b2, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03033)"}, + {VALIDATION_ERROR_0fe017b4, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03034)"}, + {VALIDATION_ERROR_0fe017b6, "The spec valid usage text states 'The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03035)"}, + {VALIDATION_ERROR_0fe017b8, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindSamplers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03036)"}, + {VALIDATION_ERROR_0fe017ba, "The spec valid usage text states 'The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stagess and and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindUniformBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03037)"}, + {VALIDATION_ERROR_0fe017bc, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindUniformBuffersDynamic' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03038)"}, + {VALIDATION_ERROR_0fe017be, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindStorageBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03039)"}, + {VALIDATION_ERROR_0fe017c0, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindStorageBuffersDynamic' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03040)"}, + {VALIDATION_ERROR_0fe017c2, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindSampledImages' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03041)"}, + {VALIDATION_ERROR_0fe017c4, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindStorageImages' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03042)"}, + {VALIDATION_ERROR_0fe017c6, "The spec valid usage text states '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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindInputAttachments' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03043)"}, {VALIDATION_ERROR_0fe09005, "The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-flags-zerobitmask)"}, {VALIDATION_ERROR_0fe1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pNext-pNext)"}, {VALIDATION_ERROR_0fe1f801, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-parameter)"}, @@ -4972,7 +5178,6 @@ {VALIDATION_ERROR_10c30a1b, "The spec valid usage text states 'viewportCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength)"}, {VALIDATION_ERROR_10e0097e, "The spec valid usage text states 'viewportCount must match the viewportCount set in VkPipelineViewportStateCreateInfo' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-01215)"}, {VALIDATION_ERROR_10e09005, "The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-flags-zerobitmask)"}, - {VALIDATION_ERROR_10e1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-pNext-pNext)"}, {VALIDATION_ERROR_10e2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-sType-sType)"}, {VALIDATION_ERROR_10e30a1b, "The spec valid usage text states 'viewportCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-arraylength)"}, {VALIDATION_ERROR_1102b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportWScalingStateCreateInfoNV-sType-sType)"}, @@ -5030,6 +5235,11 @@ {VALIDATION_ERROR_1220068c, "The spec valid usage text states '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 source subpass.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-pDependencies-00838)"}, {VALIDATION_ERROR_12200c3c, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-01566)"}, {VALIDATION_ERROR_12200c3e, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-01567)"}, + {VALIDATION_ERROR_12200f0c, "The spec valid usage text states 'If the pNext chain includes an instance of VkRenderPassInputAttachmentAspectCreateInfo, the subpass member of each element of its pAspectReferences member must be less than subpassCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01926)"}, + {VALIDATION_ERROR_12200f0e, "The spec valid usage text states 'If the pNext chain includes an instance of VkRenderPassInputAttachmentAspectCreateInfo, 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.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01927)"}, + {VALIDATION_ERROR_12200f10, "The spec valid usage text states 'If the pNext chain includes an instance of VkRenderPassMultiviewCreateInfo, 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.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01928)"}, + {VALIDATION_ERROR_12200f12, "The spec valid usage text states 'If the pNext chain includes an instance of VkRenderPassMultiviewCreateInfo, if its dependencyCount member is not zero, it must be equal to dependencyCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01929)"}, + {VALIDATION_ERROR_12200f14, "The spec valid usage text states 'If the pNext chain includes an instance of VkRenderPassMultiviewCreateInfo, 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.0-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01930)"}, {VALIDATION_ERROR_12209005, "The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-flags-zerobitmask)"}, {VALIDATION_ERROR_1220f201, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-parameter)"}, {VALIDATION_ERROR_12212601, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-pDependencies-parameter)"}, @@ -5038,12 +5248,8 @@ {VALIDATION_ERROR_1222b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-sType-sType)"}, {VALIDATION_ERROR_1222b00f, "The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-sType-unique)"}, {VALIDATION_ERROR_1222e61b, "The spec valid usage text states 'subpassCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassCreateInfo-subpassCount-arraylength)"}, - {VALIDATION_ERROR_1240068e, "The spec valid usage text states 'If subpassCount is not zero, subpassCount must be equal to the subpassCount in the VkRenderPassCreateInfo structure at the start of the chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-subpassCount-00839)"}, - {VALIDATION_ERROR_12400690, "The spec valid usage text states 'If dependencyCount is not zero, dependencyCount must be equal to the dependencyCount in the VkRenderPassCreateInfo structure at the start of the chain' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-dependencyCount-00840)"}, {VALIDATION_ERROR_12400692, "The spec valid usage text states 'Each view index must not be set in more than one element of pCorrelationMasks' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-00841)"}, - {VALIDATION_ERROR_12400694, "The spec valid usage text states 'If an element of pViewOffsets is non-zero, the corresponding VkSubpassDependency structure must have different values of srcSubpass and dstSubpass.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-00842)"}, {VALIDATION_ERROR_12411a01, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-parameter)"}, - {VALIDATION_ERROR_1241c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pNext-pNext)"}, {VALIDATION_ERROR_12426c01, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-parameter)"}, {VALIDATION_ERROR_12426e01, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-parameter)"}, {VALIDATION_ERROR_1242b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-sType-sType)"}, @@ -5197,7 +5403,6 @@ {VALIDATION_ERROR_1421c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSurfaceCapabilities2EXT-pNext-pNext)"}, {VALIDATION_ERROR_1422b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSurfaceCapabilities2EXT-sType-sType)"}, {VALIDATION_ERROR_144009b8, "The spec valid usage text states 'The bits in surfaceCounters must be supported by VkSwapchainCreateInfoKHR::surface, as reported by vkGetPhysicalDeviceSurfaceCapabilities2EXT.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-01244)"}, - {VALIDATION_ERROR_1441c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCounterCreateInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_1442b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCounterCreateInfoEXT-sType-sType)"}, {VALIDATION_ERROR_1442ee01, "The spec valid usage text states 'surfaceCounters must be a valid combination of VkSurfaceCounterFlagBitsEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-parameter)"}, {VALIDATION_ERROR_14600009, "The spec valid usage text states 'Both of oldSwapchain, and surface that are valid handles must have been created, allocated, or retrieved from the same VkInstance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-commonparent)"}, @@ -5219,9 +5424,9 @@ {VALIDATION_ERROR_14600b26, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-presentMode-01427)"}, {VALIDATION_ERROR_14600b28, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428)"}, {VALIDATION_ERROR_14600b2a, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-physicalDeviceCount-01429)"}, - {VALIDATION_ERROR_14600d14, "The spec valid usage text states 'oldSwapchain must not be in the retired state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01674)"}, {VALIDATION_ERROR_14600d32, "The spec valid usage text states 'imageExtent members width and height must both be non-zero' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageExtent-01689)"}, {VALIDATION_ERROR_14600de4, "The spec valid usage text states 'imageFormat, imageUsage, imageExtent, and imageArrayLayers must be supported for VK_IMAGE_TYPE_2D VK_IMAGE_TILING_OPTIMAL images as reported by vkGetPhysicalDeviceImageFormatProperties.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageFormat-01778)"}, + {VALIDATION_ERROR_14600f1a, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01933)"}, {VALIDATION_ERROR_14602e01, "The spec valid usage text states 'compositeAlpha must be a valid VkCompositeAlphaFlagBitsKHR value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-compositeAlpha-parameter)"}, {VALIDATION_ERROR_14609001, "The spec valid usage text states 'flags must be a valid combination of VkSwapchainCreateFlagBitsKHR values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-flags-parameter)"}, {VALIDATION_ERROR_1460a201, "The spec valid usage text states 'imageColorSpace must be a valid VkColorSpaceKHR value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageColorSpace-parameter)"}, @@ -5239,7 +5444,6 @@ {VALIDATION_ERROR_1462ec01, "The spec valid usage text states 'surface must be a valid VkSurfaceKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-surface-parameter)"}, {VALIDATION_ERROR_14805a1b, "The spec valid usage text states 'disabledValidationCheckCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkValidationFlagsEXT-disabledValidationCheckCount-arraylength)"}, {VALIDATION_ERROR_14814401, "The spec valid usage text states 'pDisabledValidationChecks must be a valid pointer to an array of disabledValidationCheckCount VkValidationCheckEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkValidationFlagsEXT-pDisabledValidationChecks-parameter)"}, - {VALIDATION_ERROR_1481c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkValidationFlagsEXT-pNext-pNext)"}, {VALIDATION_ERROR_1482b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkValidationFlagsEXT-sType-sType)"}, {VALIDATION_ERROR_14a004d8, "The spec valid usage text states 'location must be less than VkPhysicalDeviceLimits::maxVertexInputAttributes' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkVertexInputAttributeDescription-location-00620)"}, {VALIDATION_ERROR_14a004da, "The spec valid usage text states 'binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkVertexInputAttributeDescription-binding-00621)"}, @@ -5322,6 +5526,7 @@ {VALIDATION_ERROR_15c002a6, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00339)"}, {VALIDATION_ERROR_15c00af4, "The spec valid usage text states '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.0/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-01402)"}, {VALIDATION_ERROR_15c00af6, "The spec valid usage text states '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 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-01403)"}, + {VALIDATION_ERROR_15c017d0, "The spec valid usage text states 'All consecutive bindings updated via a single VkWriteDescriptorSet structure, except those with a descriptorCount of zero, must have identical VkDescriptorBindingFlagBitsEXT.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorCount-03048)"}, {VALIDATION_ERROR_15c0441b, "The spec valid usage text states 'descriptorCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorCount-arraylength)"}, {VALIDATION_ERROR_15c04e01, "The spec valid usage text states 'descriptorType must be a valid VkDescriptorType value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-parameter)"}, {VALIDATION_ERROR_15c1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkWriteDescriptorSet-pNext-pNext)"}, @@ -5336,7 +5541,7 @@ {VALIDATION_ERROR_16009005, "The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkXlibSurfaceCreateInfoKHR-flags-zerobitmask)"}, {VALIDATION_ERROR_1601c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkXlibSurfaceCreateInfoKHR-pNext-pNext)"}, {VALIDATION_ERROR_1602b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkXlibSurfaceCreateInfoKHR-sType-sType)"}, - {VALIDATION_ERROR_16200e16, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHX-swapchain-01803)"}, + {VALIDATION_ERROR_16200e16, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-swapchain-01803)"}, {VALIDATION_ERROR_16205601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-device-parameter)"}, {VALIDATION_ERROR_1620e001, "The spec valid usage text states 'pAcquireInfo must be a valid pointer to a valid VkAcquireNextImageInfoKHR structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-pAcquireInfo-parameter)"}, {VALIDATION_ERROR_16218601, "The spec valid usage text states 'pImageIndex must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-pImageIndex-parameter)"}, @@ -5386,8 +5591,10 @@ {VALIDATION_ERROR_1700081a, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkBindBufferMemory-size-01037)"}, {VALIDATION_ERROR_1700081c, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01038)"}, {VALIDATION_ERROR_1700081e, "The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01039)"}, - {VALIDATION_ERROR_17000b48, "The spec valid usage text states 'If buffer requires a dedicated allocation(as reported by vkGetBufferMemoryRequirements2 in VkMemoryDedicatedRequirements::requiresDedicatedAllocation for image), memory must have been created with VkMemoryDedicatedAllocateInfo::buffer equal to buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01444)"}, - {VALIDATION_ERROR_17000bc8, "The spec valid usage text states 'If the VkmemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfoKHR in its pNext chain, and VkMemoryDedicatedAllocateInfoKHR::buffer was not VK_NULL_HANDLE, then buffer must equal VkMemoryDedicatedAllocateInfoKHR::buffer and memoryOffset must be zero.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-memory-01508)"}, + {VALIDATION_ERROR_17000b48, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01444)"}, + {VALIDATION_ERROR_17000bc8, "The spec valid usage text states 'If the VkMemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfo 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.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-memory-01508)"}, + {VALIDATION_ERROR_17000ed4, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-None-01898)"}, + {VALIDATION_ERROR_17000ed6, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindBufferMemory-None-01899)"}, {VALIDATION_ERROR_17001a01, "The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindBufferMemory-buffer-parameter)"}, {VALIDATION_ERROR_17001a07, "The spec valid usage text states 'buffer must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindBufferMemory-buffer-parent)"}, {VALIDATION_ERROR_17005601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindBufferMemory-device-parameter)"}, @@ -5405,8 +5612,10 @@ {VALIDATION_ERROR_17400834, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01050)"}, {VALIDATION_ERROR_17400836, "The spec valid usage text states '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://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-image-01051)"}, {VALIDATION_ERROR_17400b4a, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01445)"}, - {VALIDATION_ERROR_17400bca, "The spec valid usage text states 'If the VkmemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfoKHR in its pNext chain, and VkMemoryDedicatedAllocateInfoKHR::image was not VK_NULL_HANDLE, then image must equal VkMemoryDedicatedAllocateInfoKHR::image and memoryOffset must be zero.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-memory-01509)"}, + {VALIDATION_ERROR_17400bca, "The spec valid usage text states 'If the VkMemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfo 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.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-memory-01509)"}, {VALIDATION_ERROR_17400c90, "The spec valid usage text states 'image must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT set.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01608)"}, + {VALIDATION_ERROR_17400eda, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-None-01901)"}, + {VALIDATION_ERROR_17400edc, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkBindImageMemory-None-01902)"}, {VALIDATION_ERROR_17405601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-device-parameter)"}, {VALIDATION_ERROR_1740a001, "The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-image-parameter)"}, {VALIDATION_ERROR_1740a007, "The spec valid usage text states 'image must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkBindImageMemory-image-parent)"}, @@ -5416,17 +5625,15 @@ {VALIDATION_ERROR_17605601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory2-device-parameter)"}, {VALIDATION_ERROR_1760fa01, "The spec valid usage text states 'pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindImageMemoryInfo structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkBindImageMemory2-pBindInfos-parameter)"}, {VALIDATION_ERROR_17800009, "The spec valid usage text states 'Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-commonparent)"}, - {VALIDATION_ERROR_1780063c, "The spec valid usage text states 'The query identified by queryPool and query must currently not be active' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-00798)"}, - {VALIDATION_ERROR_1780063e, "The spec valid usage text states 'The query identified by queryPool and query must be unavailable' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-00799)"}, {VALIDATION_ERROR_17800640, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-00800)"}, - {VALIDATION_ERROR_17800642, "The spec valid usage text states 'queryPool must have been created with a queryType that differs from that of any other queries that have been made active, and are currently still active within commandBuffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-00801)"}, {VALIDATION_ERROR_17800644, "The spec valid usage text states 'query must be less than the number of queries in queryPool' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-query-00802)"}, {VALIDATION_ERROR_17800646, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-00803)"}, {VALIDATION_ERROR_17800648, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-00804)"}, {VALIDATION_ERROR_1780064a, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-00805)"}, - {VALIDATION_ERROR_1780064c, "The spec valid usage text states 'All queries used by the command must not be active' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-None-00806)"}, - {VALIDATION_ERROR_1780064e, "The spec valid usage text states 'All queries used by the command must be unavailable' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-None-00807)"}, + {VALIDATION_ERROR_1780064e, "The spec valid usage text states 'All queries used by the command must be unavailable' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-None-00807)"}, {VALIDATION_ERROR_17800650, "The spec valid usage text states 'If vkCmdBeginQuery 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.0-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-query-00808)"}, + {VALIDATION_ERROR_17800eba, "The spec valid usage text states 'commandBuffer must not be a protected command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-commandBuffer-01885)"}, + {VALIDATION_ERROR_17800f04, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-01922)"}, {VALIDATION_ERROR_17802401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-commandBuffer-parameter)"}, {VALIDATION_ERROR_17802413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginQuery-commandBuffer-recording)"}, {VALIDATION_ERROR_17802415, "The spec valid usage text states '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-vkCmdBeginQuery-commandBuffer-cmdpool)"}, @@ -5528,6 +5735,9 @@ {VALIDATION_ERROR_18400d54, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBlitImage-dstSubresource-01706)"}, {VALIDATION_ERROR_18400d56, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBlitImage-srcSubresource-01707)"}, {VALIDATION_ERROR_18400d58, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdBlitImage-dstSubresource-01708)"}, + {VALIDATION_ERROR_18400e54, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-01834)"}, + {VALIDATION_ERROR_18400e56, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-01835)"}, + {VALIDATION_ERROR_18400e58, "The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-01836)"}, {VALIDATION_ERROR_18402401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-parameter)"}, {VALIDATION_ERROR_18402413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-recording)"}, {VALIDATION_ERROR_18402415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-cmdpool)"}, @@ -5564,6 +5774,8 @@ {VALIDATION_ERROR_18800c12, "The spec valid usage text states 'image must not use a format listed in features-formats-requiring-sampler-ycbcr-conversion' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-image-01545)"}, {VALIDATION_ERROR_18800d38, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearColorImage-pRanges-01692)"}, {VALIDATION_ERROR_18800d3a, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearColorImage-pRanges-01693)"}, + {VALIDATION_ERROR_18800e1a, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then image must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-01805)"}, + {VALIDATION_ERROR_18800e1c, "The spec valid usage text states 'If commandBuffer is a protected command buffer, then image must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-01806)"}, {VALIDATION_ERROR_18802401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-parameter)"}, {VALIDATION_ERROR_18802413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-recording)"}, {VALIDATION_ERROR_18802415, "The spec valid usage text states '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-vkCmdClearColorImage-commandBuffer-cmdpool)"}, @@ -5584,6 +5796,8 @@ {VALIDATION_ERROR_18a00b88, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-baseArrayLayer-01476)"}, {VALIDATION_ERROR_18a00d3c, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-pRanges-01694)"}, {VALIDATION_ERROR_18a00d3e, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-pRanges-01695)"}, + {VALIDATION_ERROR_18a00e1e, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then image must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-01807)"}, + {VALIDATION_ERROR_18a00e20, "The spec valid usage text states 'If commandBuffer is a protected command buffer, then image must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-01808)"}, {VALIDATION_ERROR_18a02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-parameter)"}, {VALIDATION_ERROR_18a02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-recording)"}, {VALIDATION_ERROR_18a02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-cmdpool)"}, @@ -5604,6 +5818,9 @@ {VALIDATION_ERROR_18c000ee, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyBuffer-srcBuffer-00119)"}, {VALIDATION_ERROR_18c000f0, "The spec valid usage text states 'dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBuffer-dstBuffer-00120)"}, {VALIDATION_ERROR_18c000f2, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyBuffer-dstBuffer-00121)"}, + {VALIDATION_ERROR_18c00e3c, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-01822)"}, + {VALIDATION_ERROR_18c00e3e, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-01823)"}, + {VALIDATION_ERROR_18c00e40, "The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-01824)"}, {VALIDATION_ERROR_18c02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-parameter)"}, {VALIDATION_ERROR_18c02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-recording)"}, {VALIDATION_ERROR_18c02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-cmdpool)"}, @@ -5628,6 +5845,9 @@ {VALIDATION_ERROR_18e00d4a, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageSubresource-01701)"}, {VALIDATION_ERROR_18e00d4c, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageSubresource-01702)"}, {VALIDATION_ERROR_18e00e02, "The spec valid usage text states 'The imageOffset and 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.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageOffset-01793)"}, + {VALIDATION_ERROR_18e00e48, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-01828)"}, + {VALIDATION_ERROR_18e00e4a, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-01829)"}, + {VALIDATION_ERROR_18e00e4c, "The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-01830)"}, {VALIDATION_ERROR_18e02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-parameter)"}, {VALIDATION_ERROR_18e02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-recording)"}, {VALIDATION_ERROR_18e02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-cmdpool)"}, @@ -5665,6 +5885,10 @@ {VALIDATION_ERROR_19000d46, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImage-dstSubresource-01699)"}, {VALIDATION_ERROR_19000dee, "The spec valid usage text states 'The srcOffset and 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.0/html/vkspec.html#VUID-vkCmdCopyImage-srcOffset-01783)"}, {VALIDATION_ERROR_19000df0, "The spec valid usage text states 'The dstOffset and 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.0/html/vkspec.html#VUID-vkCmdCopyImage-dstOffset-01784)"}, + {VALIDATION_ERROR_19000e42, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-01825)"}, + {VALIDATION_ERROR_19000e44, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-01826)"}, + {VALIDATION_ERROR_19000e46, "The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-01827)"}, + {VALIDATION_ERROR_19000efa, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImageLayout-01917)"}, {VALIDATION_ERROR_19002401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-parameter)"}, {VALIDATION_ERROR_19002413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-recording)"}, {VALIDATION_ERROR_19002415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-cmdpool)"}, @@ -5691,6 +5915,9 @@ {VALIDATION_ERROR_19200d4e, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageSubresource-01703)"}, {VALIDATION_ERROR_19200d50, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageSubresource-01704)"}, {VALIDATION_ERROR_19200e04, "The spec valid usage text states 'The imageOffset and 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.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageOffset-01794)"}, + {VALIDATION_ERROR_19200e4e, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-01831)"}, + {VALIDATION_ERROR_19200e50, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-01832)"}, + {VALIDATION_ERROR_19200e52, "The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-01833)"}, {VALIDATION_ERROR_19202401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-parameter)"}, {VALIDATION_ERROR_19202413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-recording)"}, {VALIDATION_ERROR_19202415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-cmdpool)"}, @@ -5733,18 +5960,21 @@ {VALIDATION_ERROR_19c00304, "The spec valid usage text states 'groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-groupCountX-00386)"}, {VALIDATION_ERROR_19c00306, "The spec valid usage text states 'groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-groupCountY-00387)"}, {VALIDATION_ERROR_19c00308, "The spec valid usage text states 'groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-groupCountZ-00388)"}, - {VALIDATION_ERROR_19c0030a, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00389)"}, - {VALIDATION_ERROR_19c0030c, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00390)"}, + {VALIDATION_ERROR_19c0030a, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00389)"}, + {VALIDATION_ERROR_19c0030c, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00390)"}, {VALIDATION_ERROR_19c0030e, "The spec valid usage text states 'A valid compute pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_COMPUTE' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00391)"}, - {VALIDATION_ERROR_19c00310, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE, a push constant value must have been set for VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for push constants with the one used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00392)"}, - {VALIDATION_ERROR_19c00312, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatch-None-00393)"}, - {VALIDATION_ERROR_19c00314, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatch-None-00394)"}, - {VALIDATION_ERROR_19c00316, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatch-None-00395)"}, - {VALIDATION_ERROR_19c00318, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00396)"}, - {VALIDATION_ERROR_19c0031a, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00397)"}, + {VALIDATION_ERROR_19c00310, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE, a push constant value must have been set for VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for push constants with the one used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00392)"}, + {VALIDATION_ERROR_19c00312, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatch-None-00393)"}, + {VALIDATION_ERROR_19c00314, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatch-None-00394)"}, + {VALIDATION_ERROR_19c00316, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatch-None-00395)"}, + {VALIDATION_ERROR_19c00318, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00396)"}, + {VALIDATION_ERROR_19c0031a, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00397)"}, {VALIDATION_ERROR_19c0031c, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-linearTilingFeatures-00398)"}, {VALIDATION_ERROR_19c0031e, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatch-linearTilingFeatures-00399)"}, {VALIDATION_ERROR_19c00320, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-00400)"}, + {VALIDATION_ERROR_19c00e68, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-01844)"}, + {VALIDATION_ERROR_19c00e6a, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_POINT_COMPUTE writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-01845)"}, + {VALIDATION_ERROR_19c00e6c, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the compute pipeline stage in the VkPipeline object bound to VK_PIPELINE_POINT_COMPUTE reads from any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-01846)"}, {VALIDATION_ERROR_19c02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-parameter)"}, {VALIDATION_ERROR_19c02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-recording)"}, {VALIDATION_ERROR_19c02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-cmdpool)"}, @@ -5756,80 +5986,89 @@ {VALIDATION_ERROR_19e00350, "The spec valid usage text states 'groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] minus baseGroupX' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-groupCountX-00424)"}, {VALIDATION_ERROR_19e00352, "The spec valid usage text states 'groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] minus baseGroupY' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-groupCountY-00425)"}, {VALIDATION_ERROR_19e00354, "The spec valid usage text states 'groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] minus baseGroupZ' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-groupCountZ-00426)"}, - {VALIDATION_ERROR_19e00356, "The spec valid usage text states 'If any of baseGroupX, baseGroupY, or baseGroupZ are not zero, then the currently bound compute pipeline must have been created with the VK_PIPELINE_CREATE_DISPATCH_BASE flag.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupX-00427)"}, + {VALIDATION_ERROR_19e00356, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupX-00427)"}, {VALIDATION_ERROR_19e02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-parameter)"}, {VALIDATION_ERROR_19e02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-recording)"}, {VALIDATION_ERROR_19e02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-cmdpool)"}, {VALIDATION_ERROR_1a000009, "The spec valid usage text states 'Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-commonparent)"}, {VALIDATION_ERROR_1a000017, "The spec valid usage text states 'This command must only be called outside of a render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-renderpass)"}, {VALIDATION_ERROR_1a000322, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-buffer-00401)"}, - {VALIDATION_ERROR_1a000324, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00402)"}, - {VALIDATION_ERROR_1a000326, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00403)"}, + {VALIDATION_ERROR_1a000324, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00402)"}, + {VALIDATION_ERROR_1a000326, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00403)"}, {VALIDATION_ERROR_1a000328, "The spec valid usage text states 'A valid compute pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_COMPUTE' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00404)"}, {VALIDATION_ERROR_1a00032a, "The spec valid usage text states 'buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-buffer-00405)"}, {VALIDATION_ERROR_1a00032c, "The spec valid usage text states 'offset must be a multiple of 4' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-offset-00406)"}, {VALIDATION_ERROR_1a00032e, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-offset-00407)"}, - {VALIDATION_ERROR_1a000330, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE, a push constant value must have been set for VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for push constants with the one used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00408)"}, - {VALIDATION_ERROR_1a000332, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00409)"}, - {VALIDATION_ERROR_1a000334, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00410)"}, - {VALIDATION_ERROR_1a000336, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00411)"}, - {VALIDATION_ERROR_1a000338, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00412)"}, - {VALIDATION_ERROR_1a00033a, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00413)"}, + {VALIDATION_ERROR_1a000330, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE, a push constant value must have been set for VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for push constants with the one used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00408)"}, + {VALIDATION_ERROR_1a000332, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00409)"}, + {VALIDATION_ERROR_1a000334, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00410)"}, + {VALIDATION_ERROR_1a000336, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00411)"}, + {VALIDATION_ERROR_1a000338, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00412)"}, + {VALIDATION_ERROR_1a00033a, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00413)"}, {VALIDATION_ERROR_1a00033c, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-linearTilingFeatures-00414)"}, {VALIDATION_ERROR_1a00033e, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-linearTilingFeatures-00415)"}, {VALIDATION_ERROR_1a000340, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-00416)"}, + {VALIDATION_ERROR_1a000e6e, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-01847)"}, + {VALIDATION_ERROR_1a000e70, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_POINT_COMPUTE writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-01848)"}, + {VALIDATION_ERROR_1a000e72, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the compute pipeline stage in the VkPipeline object bound to VK_PIPELINE_POINT_COMPUTE reads from any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-01849)"}, {VALIDATION_ERROR_1a001a01, "The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-buffer-parameter)"}, {VALIDATION_ERROR_1a002401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-parameter)"}, {VALIDATION_ERROR_1a002413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-recording)"}, {VALIDATION_ERROR_1a002415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool)"}, {VALIDATION_ERROR_1a200017, "The spec valid usage text states 'This command must only be called inside of a render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-renderpass)"}, - {VALIDATION_ERROR_1a200366, "The spec valid usage text states 'The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-renderPass-00435)"}, - {VALIDATION_ERROR_1a200368, "The spec valid usage text states 'The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-subpass-00436)"}, - {VALIDATION_ERROR_1a20036a, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00437)"}, - {VALIDATION_ERROR_1a20036c, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00438)"}, - {VALIDATION_ERROR_1a20036e, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00439)"}, + {VALIDATION_ERROR_1a200366, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDraw-renderPass-00435)"}, + {VALIDATION_ERROR_1a200368, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDraw-subpass-00436)"}, + {VALIDATION_ERROR_1a20036a, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00437)"}, + {VALIDATION_ERROR_1a20036c, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00438)"}, + {VALIDATION_ERROR_1a20036e, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00439)"}, {VALIDATION_ERROR_1a200370, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDraw-None-00440)"}, {VALIDATION_ERROR_1a200372, "The spec valid usage text states 'For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in fxvertex-input' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00441)"}, {VALIDATION_ERROR_1a200374, "The spec valid usage text states 'A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00442)"}, - {VALIDATION_ERROR_1a200376, "The spec valid usage text states 'If the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00443)"}, + {VALIDATION_ERROR_1a200376, "The spec valid usage text states 'If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00443)"}, {VALIDATION_ERROR_1a200378, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDraw-None-00444)"}, - {VALIDATION_ERROR_1a20037a, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDraw-None-00445)"}, - {VALIDATION_ERROR_1a20037c, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDraw-None-00446)"}, - {VALIDATION_ERROR_1a20037e, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDraw-None-00447)"}, - {VALIDATION_ERROR_1a200380, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00448)"}, - {VALIDATION_ERROR_1a200382, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00449)"}, + {VALIDATION_ERROR_1a20037a, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDraw-None-00445)"}, + {VALIDATION_ERROR_1a20037c, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDraw-None-00446)"}, + {VALIDATION_ERROR_1a20037e, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDraw-None-00447)"}, + {VALIDATION_ERROR_1a200380, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00448)"}, + {VALIDATION_ERROR_1a200382, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-None-00449)"}, {VALIDATION_ERROR_1a200384, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-linearTilingFeatures-00450)"}, {VALIDATION_ERROR_1a200386, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDraw-linearTilingFeatures-00451)"}, {VALIDATION_ERROR_1a200388, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDraw-None-00452)"}, {VALIDATION_ERROR_1a20038a, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDraw-maxMultiviewInstanceIndex-00453)"}, {VALIDATION_ERROR_1a200bb6, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDraw-None-01499)"}, - {VALIDATION_ERROR_1a200bd0, "The spec valid usage text states 'If the currently 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.0-extensions/html/vkspec.html#VUID-vkCmdDraw-sampleLocationsEnable-01512)"}, + {VALIDATION_ERROR_1a200bd0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDraw-sampleLocationsEnable-01512)"}, + {VALIDATION_ERROR_1a200e74, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-01850)"}, + {VALIDATION_ERROR_1a200e76, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-01851)"}, + {VALIDATION_ERROR_1a200e78, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-01852)"}, {VALIDATION_ERROR_1a202401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-parameter)"}, {VALIDATION_ERROR_1a202413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-recording)"}, {VALIDATION_ERROR_1a202415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-cmdpool)"}, {VALIDATION_ERROR_1a400017, "The spec valid usage text states 'This command must only be called inside of a render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-renderpass)"}, - {VALIDATION_ERROR_1a40038c, "The spec valid usage text states 'The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-renderPass-00454)"}, - {VALIDATION_ERROR_1a40038e, "The spec valid usage text states 'The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-subpass-00455)"}, - {VALIDATION_ERROR_1a400390, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00456)"}, - {VALIDATION_ERROR_1a400392, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00457)"}, - {VALIDATION_ERROR_1a400394, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00458)"}, + {VALIDATION_ERROR_1a40038c, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-renderPass-00454)"}, + {VALIDATION_ERROR_1a40038e, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-subpass-00455)"}, + {VALIDATION_ERROR_1a400390, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00456)"}, + {VALIDATION_ERROR_1a400392, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00457)"}, + {VALIDATION_ERROR_1a400394, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00458)"}, {VALIDATION_ERROR_1a400396, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00459)"}, {VALIDATION_ERROR_1a400398, "The spec valid usage text states 'For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in fxvertex-input' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00460)"}, {VALIDATION_ERROR_1a40039a, "The spec valid usage text states 'A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00461)"}, - {VALIDATION_ERROR_1a40039c, "The spec valid usage text states 'If the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00462)"}, - {VALIDATION_ERROR_1a40039e, "The spec valid usage text states '(indexSize * (firstIndex + indexCount) + offset) must be less than or equal to the size of the currently 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-indexSize-00463)"}, + {VALIDATION_ERROR_1a40039c, "The spec valid usage text states 'If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00462)"}, + {VALIDATION_ERROR_1a40039e, "The spec valid usage text states '(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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-indexSize-00463)"}, {VALIDATION_ERROR_1a4003a0, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00464)"}, - {VALIDATION_ERROR_1a4003a2, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00465)"}, - {VALIDATION_ERROR_1a4003a4, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00466)"}, - {VALIDATION_ERROR_1a4003a6, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00467)"}, - {VALIDATION_ERROR_1a4003a8, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00468)"}, - {VALIDATION_ERROR_1a4003aa, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00469)"}, + {VALIDATION_ERROR_1a4003a2, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00465)"}, + {VALIDATION_ERROR_1a4003a4, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00466)"}, + {VALIDATION_ERROR_1a4003a6, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00467)"}, + {VALIDATION_ERROR_1a4003a8, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00468)"}, + {VALIDATION_ERROR_1a4003aa, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00469)"}, {VALIDATION_ERROR_1a4003ac, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-linearTilingFeatures-00470)"}, {VALIDATION_ERROR_1a4003ae, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-linearTilingFeatures-00471)"}, {VALIDATION_ERROR_1a4003b0, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-00472)"}, {VALIDATION_ERROR_1a4003b2, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-maxMultiviewInstanceIndex-00473)"}, {VALIDATION_ERROR_1a400bb8, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexed-None-01500)"}, - {VALIDATION_ERROR_1a400bd2, "The spec valid usage text states 'If the currently 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-sampleLocationsEnable-01513)"}, + {VALIDATION_ERROR_1a400bd2, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-sampleLocationsEnable-01513)"}, + {VALIDATION_ERROR_1a400e7a, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-01853)"}, + {VALIDATION_ERROR_1a400e7c, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-01854)"}, + {VALIDATION_ERROR_1a400e7e, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-01855)"}, {VALIDATION_ERROR_1a402401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-parameter)"}, {VALIDATION_ERROR_1a402413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-recording)"}, {VALIDATION_ERROR_1a402415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-cmdpool)"}, @@ -5840,30 +6079,33 @@ {VALIDATION_ERROR_1a600420, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00528)"}, {VALIDATION_ERROR_1a600422, "The spec valid usage text states 'If the multi-draw indirect feature is not enabled, drawCount must be 0 or 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00529)"}, {VALIDATION_ERROR_1a600424, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-firstInstance-00530)"}, - {VALIDATION_ERROR_1a600426, "The spec valid usage text states 'The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-renderPass-00531)"}, - {VALIDATION_ERROR_1a600428, "The spec valid usage text states 'The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-subpass-00532)"}, - {VALIDATION_ERROR_1a60042a, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00533)"}, - {VALIDATION_ERROR_1a60042c, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00534)"}, - {VALIDATION_ERROR_1a60042e, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00535)"}, + {VALIDATION_ERROR_1a600426, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-renderPass-00531)"}, + {VALIDATION_ERROR_1a600428, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-subpass-00532)"}, + {VALIDATION_ERROR_1a60042a, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00533)"}, + {VALIDATION_ERROR_1a60042c, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00534)"}, + {VALIDATION_ERROR_1a60042e, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00535)"}, {VALIDATION_ERROR_1a600430, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00536)"}, {VALIDATION_ERROR_1a600432, "The spec valid usage text states 'A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00537)"}, - {VALIDATION_ERROR_1a600434, "The spec valid usage text states 'If the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00538)"}, + {VALIDATION_ERROR_1a600434, "The spec valid usage text states 'If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00538)"}, {VALIDATION_ERROR_1a600436, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00539)"}, {VALIDATION_ERROR_1a600438, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00540)"}, {VALIDATION_ERROR_1a60043a, "The spec valid usage text states 'drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00541)"}, {VALIDATION_ERROR_1a60043c, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00542)"}, - {VALIDATION_ERROR_1a60043e, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00543)"}, - {VALIDATION_ERROR_1a600440, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00544)"}, - {VALIDATION_ERROR_1a600442, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00545)"}, - {VALIDATION_ERROR_1a600444, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00546)"}, - {VALIDATION_ERROR_1a600446, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00547)"}, + {VALIDATION_ERROR_1a60043e, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00543)"}, + {VALIDATION_ERROR_1a600440, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00544)"}, + {VALIDATION_ERROR_1a600442, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00545)"}, + {VALIDATION_ERROR_1a600444, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00546)"}, + {VALIDATION_ERROR_1a600446, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00547)"}, {VALIDATION_ERROR_1a600448, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-linearTilingFeatures-00548)"}, {VALIDATION_ERROR_1a60044a, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-linearTilingFeatures-00549)"}, {VALIDATION_ERROR_1a60044c, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-00550)"}, {VALIDATION_ERROR_1a60044e, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-maxMultiviewInstanceIndex-00551)"}, {VALIDATION_ERROR_1a600bbe, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-01503)"}, - {VALIDATION_ERROR_1a600bd8, "The spec valid usage text states 'If the currently 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-01516)"}, + {VALIDATION_ERROR_1a600bd8, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-01516)"}, {VALIDATION_ERROR_1a600d02, "The spec valid usage text states 'buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-buffer-01665)"}, + {VALIDATION_ERROR_1a600e8c, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-01862)"}, + {VALIDATION_ERROR_1a600e8e, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-01863)"}, + {VALIDATION_ERROR_1a600e90, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-01864)"}, {VALIDATION_ERROR_1a601a01, "The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-buffer-parameter)"}, {VALIDATION_ERROR_1a602401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-parameter)"}, {VALIDATION_ERROR_1a602413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-recording)"}, @@ -5875,31 +6117,34 @@ {VALIDATION_ERROR_1a80045a, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-stride-00557)"}, {VALIDATION_ERROR_1a80045c, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-maxDrawCount-00558)"}, {VALIDATION_ERROR_1a80045e, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-firstInstance-00559)"}, - {VALIDATION_ERROR_1a800460, "The spec valid usage text states 'The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-renderPass-00560)"}, - {VALIDATION_ERROR_1a800462, "The spec valid usage text states 'The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-subpass-00561)"}, - {VALIDATION_ERROR_1a800464, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00562)"}, - {VALIDATION_ERROR_1a800466, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00563)"}, - {VALIDATION_ERROR_1a800468, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00564)"}, + {VALIDATION_ERROR_1a800460, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-renderPass-00560)"}, + {VALIDATION_ERROR_1a800462, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-subpass-00561)"}, + {VALIDATION_ERROR_1a800464, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00562)"}, + {VALIDATION_ERROR_1a800466, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00563)"}, + {VALIDATION_ERROR_1a800468, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00564)"}, {VALIDATION_ERROR_1a80046a, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00565)"}, {VALIDATION_ERROR_1a80046c, "The spec valid usage text states 'A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00566)"}, - {VALIDATION_ERROR_1a80046e, "The spec valid usage text states 'If the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00567)"}, + {VALIDATION_ERROR_1a80046e, "The spec valid usage text states 'If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00567)"}, {VALIDATION_ERROR_1a800470, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-00568)"}, {VALIDATION_ERROR_1a800472, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-00569)"}, {VALIDATION_ERROR_1a800474, "The spec valid usage text states 'drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-drawCount-00570)"}, {VALIDATION_ERROR_1a800476, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00571)"}, - {VALIDATION_ERROR_1a800478, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00572)"}, - {VALIDATION_ERROR_1a80047a, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00573)"}, - {VALIDATION_ERROR_1a80047c, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00574)"}, - {VALIDATION_ERROR_1a80047e, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00575)"}, - {VALIDATION_ERROR_1a800480, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00576)"}, + {VALIDATION_ERROR_1a800478, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00572)"}, + {VALIDATION_ERROR_1a80047a, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00573)"}, + {VALIDATION_ERROR_1a80047c, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00574)"}, + {VALIDATION_ERROR_1a80047e, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00575)"}, + {VALIDATION_ERROR_1a800480, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-00576)"}, {VALIDATION_ERROR_1a800482, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-linearTilingFeatures-00577)"}, {VALIDATION_ERROR_1a800484, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-maxMultiviewInstanceIndex-00578)"}, {VALIDATION_ERROR_1a800bc0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-None-01504)"}, - {VALIDATION_ERROR_1a800bda, "The spec valid usage text states 'If the currently 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-sampleLocationsEnable-01517)"}, + {VALIDATION_ERROR_1a800bda, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-sampleLocationsEnable-01517)"}, {VALIDATION_ERROR_1a800d04, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-01666)"}, {VALIDATION_ERROR_1a800d06, "The spec valid usage text states 'buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-01667)"}, {VALIDATION_ERROR_1a800d08, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-01668)"}, {VALIDATION_ERROR_1a800d0a, "The spec valid usage text states 'countBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-01669)"}, + {VALIDATION_ERROR_1a800e92, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01865)"}, + {VALIDATION_ERROR_1a800e94, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01866)"}, + {VALIDATION_ERROR_1a800e96, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01867)"}, {VALIDATION_ERROR_1a801a01, "The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-parameter)"}, {VALIDATION_ERROR_1a802401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-parameter)"}, {VALIDATION_ERROR_1a802413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-recording)"}, @@ -5912,30 +6157,33 @@ {VALIDATION_ERROR_1aa003b8, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00476)"}, {VALIDATION_ERROR_1aa003ba, "The spec valid usage text states 'If the multi-draw indirect feature is not enabled, drawCount must be 0 or 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00477)"}, {VALIDATION_ERROR_1aa003bc, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-firstInstance-00478)"}, - {VALIDATION_ERROR_1aa003be, "The spec valid usage text states 'The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-renderPass-00479)"}, - {VALIDATION_ERROR_1aa003c0, "The spec valid usage text states 'The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-subpass-00480)"}, - {VALIDATION_ERROR_1aa003c2, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00481)"}, - {VALIDATION_ERROR_1aa003c4, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00482)"}, - {VALIDATION_ERROR_1aa003c6, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00483)"}, + {VALIDATION_ERROR_1aa003be, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-renderPass-00479)"}, + {VALIDATION_ERROR_1aa003c0, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-subpass-00480)"}, + {VALIDATION_ERROR_1aa003c2, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00481)"}, + {VALIDATION_ERROR_1aa003c4, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00482)"}, + {VALIDATION_ERROR_1aa003c6, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00483)"}, {VALIDATION_ERROR_1aa003c8, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00484)"}, {VALIDATION_ERROR_1aa003ca, "The spec valid usage text states 'A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00485)"}, - {VALIDATION_ERROR_1aa003cc, "The spec valid usage text states 'If the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00486)"}, + {VALIDATION_ERROR_1aa003cc, "The spec valid usage text states 'If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00486)"}, {VALIDATION_ERROR_1aa003ce, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00487)"}, {VALIDATION_ERROR_1aa003d0, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00488)"}, {VALIDATION_ERROR_1aa003d2, "The spec valid usage text states 'drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00489)"}, {VALIDATION_ERROR_1aa003d4, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00490)"}, - {VALIDATION_ERROR_1aa003d6, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00491)"}, - {VALIDATION_ERROR_1aa003d8, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00492)"}, - {VALIDATION_ERROR_1aa003da, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00493)"}, - {VALIDATION_ERROR_1aa003dc, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00494)"}, - {VALIDATION_ERROR_1aa003de, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00495)"}, + {VALIDATION_ERROR_1aa003d6, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00491)"}, + {VALIDATION_ERROR_1aa003d8, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00492)"}, + {VALIDATION_ERROR_1aa003da, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00493)"}, + {VALIDATION_ERROR_1aa003dc, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00494)"}, + {VALIDATION_ERROR_1aa003de, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00495)"}, {VALIDATION_ERROR_1aa003e0, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-linearTilingFeatures-00496)"}, {VALIDATION_ERROR_1aa003e2, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-linearTilingFeatures-00497)"}, {VALIDATION_ERROR_1aa003e4, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-00498)"}, {VALIDATION_ERROR_1aa003e6, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-maxMultiviewInstanceIndex-00499)"}, {VALIDATION_ERROR_1aa00bba, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdDrawIndirect-None-01501)"}, - {VALIDATION_ERROR_1aa00bd4, "The spec valid usage text states 'If the currently 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-sampleLocationsEnable-01514)"}, + {VALIDATION_ERROR_1aa00bd4, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-sampleLocationsEnable-01514)"}, {VALIDATION_ERROR_1aa00cf8, "The spec valid usage text states 'buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-buffer-01660)"}, + {VALIDATION_ERROR_1aa00e80, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-01856)"}, + {VALIDATION_ERROR_1aa00e82, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-01857)"}, + {VALIDATION_ERROR_1aa00e84, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-01858)"}, {VALIDATION_ERROR_1aa01a01, "The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-buffer-parameter)"}, {VALIDATION_ERROR_1aa02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-parameter)"}, {VALIDATION_ERROR_1aa02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-recording)"}, @@ -5947,41 +6195,44 @@ {VALIDATION_ERROR_1ac003f0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-stride-00504)"}, {VALIDATION_ERROR_1ac003f2, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-maxDrawCount-00505)"}, {VALIDATION_ERROR_1ac003f4, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-firstInstance-00506)"}, - {VALIDATION_ERROR_1ac003f6, "The spec valid usage text states 'The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-renderPass-00507)"}, - {VALIDATION_ERROR_1ac003f8, "The spec valid usage text states 'The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-subpass-00508)"}, - {VALIDATION_ERROR_1ac003fa, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00509)"}, - {VALIDATION_ERROR_1ac003fc, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00510)"}, - {VALIDATION_ERROR_1ac003fe, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00511)"}, + {VALIDATION_ERROR_1ac003f6, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-renderPass-00507)"}, + {VALIDATION_ERROR_1ac003f8, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-subpass-00508)"}, + {VALIDATION_ERROR_1ac003fa, "The spec valid usage text states 'For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00509)"}, + {VALIDATION_ERROR_1ac003fc, "The spec valid usage text states 'For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in descriptorsets-compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00510)"}, + {VALIDATION_ERROR_1ac003fe, "The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00511)"}, {VALIDATION_ERROR_1ac00400, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00512)"}, {VALIDATION_ERROR_1ac00402, "The spec valid usage text states 'A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00513)"}, - {VALIDATION_ERROR_1ac00404, "The spec valid usage text states 'If the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00514)"}, + {VALIDATION_ERROR_1ac00404, "The spec valid usage text states 'If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00514)"}, {VALIDATION_ERROR_1ac00406, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-countBuffer-00515)"}, {VALIDATION_ERROR_1ac00408, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-countBuffer-00516)"}, {VALIDATION_ERROR_1ac0040a, "The spec valid usage text states 'The count stored in countBuffer must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-countBuffer-00517)"}, {VALIDATION_ERROR_1ac0040c, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00518)"}, - {VALIDATION_ERROR_1ac0040e, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00519)"}, - {VALIDATION_ERROR_1ac00410, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00520)"}, - {VALIDATION_ERROR_1ac00412, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00521)"}, - {VALIDATION_ERROR_1ac00414, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00522)"}, - {VALIDATION_ERROR_1ac00416, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object currently bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the currently bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00523)"}, + {VALIDATION_ERROR_1ac0040e, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00519)"}, + {VALIDATION_ERROR_1ac00410, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00520)"}, + {VALIDATION_ERROR_1ac00412, "The spec valid usage text states 'If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00521)"}, + {VALIDATION_ERROR_1ac00414, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00522)"}, + {VALIDATION_ERROR_1ac00416, "The spec valid usage text states 'If the robust buffer access feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-00523)"}, {VALIDATION_ERROR_1ac00418, "The spec valid usage text states 'Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-linearTilingFeatures-00524)"}, {VALIDATION_ERROR_1ac0041a, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-maxMultiviewInstanceIndex-00525)"}, {VALIDATION_ERROR_1ac00bbc, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-None-01502)"}, - {VALIDATION_ERROR_1ac00bd6, "The spec valid usage text states 'If the currently 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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-sampleLocationsEnable-01515)"}, + {VALIDATION_ERROR_1ac00bd6, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-sampleLocationsEnable-01515)"}, {VALIDATION_ERROR_1ac00cfa, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-buffer-01661)"}, {VALIDATION_ERROR_1ac00cfc, "The spec valid usage text states 'buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-buffer-01662)"}, {VALIDATION_ERROR_1ac00cfe, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-countBuffer-01663)"}, {VALIDATION_ERROR_1ac00d00, "The spec valid usage text states 'countBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-countBuffer-01664)"}, + {VALIDATION_ERROR_1ac00e86, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01859)"}, + {VALIDATION_ERROR_1ac00e88, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01860)"}, + {VALIDATION_ERROR_1ac00e8a, "The spec valid usage text states 'If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01861)"}, {VALIDATION_ERROR_1ac01a01, "The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-buffer-parameter)"}, {VALIDATION_ERROR_1ac02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-commandBuffer-parameter)"}, {VALIDATION_ERROR_1ac02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-commandBuffer-recording)"}, {VALIDATION_ERROR_1ac02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-commandBuffer-cmdpool)"}, {VALIDATION_ERROR_1ac03401, "The spec valid usage text states 'countBuffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCountAMD-countBuffer-parameter)"}, {VALIDATION_ERROR_1ae00009, "The spec valid usage text states 'Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdEndQuery-commonparent)"}, - {VALIDATION_ERROR_1ae00652, "The spec valid usage text states 'The query identified by queryPool and query must currently be active' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdEndQuery-queryPool-00809)"}, {VALIDATION_ERROR_1ae00654, "The spec valid usage text states 'query must be less than the number of queries in queryPool' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdEndQuery-query-00810)"}, - {VALIDATION_ERROR_1ae00656, "The spec valid usage text states 'All queries used by the command must be active' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdEndQuery-None-00811)"}, {VALIDATION_ERROR_1ae00658, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdEndQuery-query-00812)"}, + {VALIDATION_ERROR_1ae00ebc, "The spec valid usage text states 'commandBuffer must not be a protected command buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdEndQuery-commandBuffer-01886)"}, + {VALIDATION_ERROR_1ae00f06, "The spec valid usage text states 'All queries used by the command must be active' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdEndQuery-None-01923)"}, {VALIDATION_ERROR_1ae02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdEndQuery-commandBuffer-parameter)"}, {VALIDATION_ERROR_1ae02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdEndQuery-commandBuffer-recording)"}, {VALIDATION_ERROR_1ae02415, "The spec valid usage text states '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-vkCmdEndQuery-commandBuffer-cmdpool)"}, @@ -6013,6 +6264,8 @@ {VALIDATION_ERROR_1b2000ce, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-00103)"}, {VALIDATION_ERROR_1b2000d0, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-00104)"}, {VALIDATION_ERROR_1b2000d2, "The spec valid usage text states 'Each element of pCommandBuffers must not begin any query types that are active in commandBuffer' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00105)"}, + {VALIDATION_ERROR_1b200e38, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-01820)"}, + {VALIDATION_ERROR_1b200e3a, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-01821)"}, {VALIDATION_ERROR_1b202401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-parameter)"}, {VALIDATION_ERROR_1b202413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-recording)"}, {VALIDATION_ERROR_1b202415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-cmdpool)"}, @@ -6028,6 +6281,8 @@ {VALIDATION_ERROR_1b40003a, "The spec valid usage text states 'dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdFillBuffer-dstBuffer-00029)"}, {VALIDATION_ERROR_1b40003c, "The spec valid usage text states '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)"}, {VALIDATION_ERROR_1b40003e, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdFillBuffer-dstBuffer-00031)"}, + {VALIDATION_ERROR_1b400e26, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-01811)"}, + {VALIDATION_ERROR_1b400e28, "The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-01812)"}, {VALIDATION_ERROR_1b402401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-parameter)"}, {VALIDATION_ERROR_1b402413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-recording)"}, {VALIDATION_ERROR_1b402415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-cmdpool)"}, @@ -6159,6 +6414,9 @@ {VALIDATION_ERROR_1c800d5c, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdResolveImage-dstSubresource-01710)"}, {VALIDATION_ERROR_1c800d5e, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdResolveImage-srcSubresource-01711)"}, {VALIDATION_ERROR_1c800d60, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkCmdResolveImage-dstSubresource-01712)"}, + {VALIDATION_ERROR_1c800e5a, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-01837)"}, + {VALIDATION_ERROR_1c800e5c, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-01838)"}, + {VALIDATION_ERROR_1c800e5e, "The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-01839)"}, {VALIDATION_ERROR_1c802401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-parameter)"}, {VALIDATION_ERROR_1c802413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-recording)"}, {VALIDATION_ERROR_1c802415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-cmdpool)"}, @@ -6168,16 +6426,16 @@ {VALIDATION_ERROR_1c82ac1b, "The spec valid usage text states 'regionCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-regionCount-arraylength)"}, {VALIDATION_ERROR_1c82ce01, "The spec valid usage text states 'srcImage must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-srcImage-parameter)"}, {VALIDATION_ERROR_1c82d001, "The spec valid usage text states 'srcImageLayout must be a valid VkImageLayout value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-srcImageLayout-parameter)"}, - {VALIDATION_ERROR_1ca004c8, "The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_BLEND_CONSTANTS dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetBlendConstants-None-00612)"}, + {VALIDATION_ERROR_1ca004c8, "The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_BLEND_CONSTANTS dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetBlendConstants-None-00612)"}, {VALIDATION_ERROR_1ca02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetBlendConstants-commandBuffer-parameter)"}, {VALIDATION_ERROR_1ca02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetBlendConstants-commandBuffer-recording)"}, {VALIDATION_ERROR_1ca02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetBlendConstants-commandBuffer-cmdpool)"}, - {VALIDATION_ERROR_1cc0062a, "The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DEPTH_BIAS dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBias-None-00789)"}, + {VALIDATION_ERROR_1cc0062a, "The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DEPTH_BIAS dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBias-None-00789)"}, {VALIDATION_ERROR_1cc0062c, "The spec valid usage text states 'If the depth bias clamping feature is not enabled, depthBiasClamp must be 0.0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBias-depthBiasClamp-00790)"}, {VALIDATION_ERROR_1cc02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBias-commandBuffer-parameter)"}, {VALIDATION_ERROR_1cc02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBias-commandBuffer-recording)"}, {VALIDATION_ERROR_1cc02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBias-commandBuffer-cmdpool)"}, - {VALIDATION_ERROR_1ce004ae, "The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DEPTH_BOUNDS dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBounds-None-00599)"}, + {VALIDATION_ERROR_1ce004ae, "The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DEPTH_BOUNDS dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBounds-None-00599)"}, {VALIDATION_ERROR_1ce004b0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetDepthBounds-minDepthBounds-00600)"}, {VALIDATION_ERROR_1ce004b2, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetDepthBounds-maxDepthBounds-00601)"}, {VALIDATION_ERROR_1ce02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetDepthBounds-commandBuffer-parameter)"}, @@ -6190,7 +6448,7 @@ {VALIDATION_ERROR_1d002401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-commandBuffer-parameter)"}, {VALIDATION_ERROR_1d002413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-commandBuffer-recording)"}, {VALIDATION_ERROR_1d002415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-commandBuffer-cmdpool)"}, - {VALIDATION_ERROR_1d20048e, "The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-None-00583)"}, + {VALIDATION_ERROR_1d20048e, "The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-None-00583)"}, {VALIDATION_ERROR_1d200492, "The spec valid usage text states 'The sum of firstDiscardRectangle and discardRectangleCount must be less than or equal to VkPhysicalDeviceDiscardRectanglePropertiesEXT::maxDiscardRectangles' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-firstDiscardRectangle-00585)"}, {VALIDATION_ERROR_1d200496, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-x-00587)"}, {VALIDATION_ERROR_1d200498, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-offset-00588)"}, @@ -6212,12 +6470,12 @@ {VALIDATION_ERROR_1d407e01, "The spec valid usage text states 'event must be a valid VkEvent handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetEvent-event-parameter)"}, {VALIDATION_ERROR_1d42de01, "The spec valid usage text states 'stageMask must be a valid combination of VkPipelineStageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-parameter)"}, {VALIDATION_ERROR_1d42de03, "The spec valid usage text states 'stageMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-requiredbitmask)"}, - {VALIDATION_ERROR_1d600626, "The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_LINE_WIDTH dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetLineWidth-None-00787)"}, + {VALIDATION_ERROR_1d600626, "The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_LINE_WIDTH dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetLineWidth-None-00787)"}, {VALIDATION_ERROR_1d600628, "The spec valid usage text states 'If the wide lines feature is not enabled, lineWidth must be 1.0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetLineWidth-lineWidth-00788)"}, {VALIDATION_ERROR_1d602401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetLineWidth-commandBuffer-parameter)"}, {VALIDATION_ERROR_1d602413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetLineWidth-commandBuffer-recording)"}, {VALIDATION_ERROR_1d602415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetLineWidth-commandBuffer-cmdpool)"}, - {VALIDATION_ERROR_1d80049c, "The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_SCISSOR dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-None-00590)"}, + {VALIDATION_ERROR_1d80049c, "The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_SCISSOR dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-None-00590)"}, {VALIDATION_ERROR_1d80049e, "The spec valid usage text states 'firstScissor must be less than VkPhysicalDeviceLimits::maxViewports' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-firstScissor-00591)"}, {VALIDATION_ERROR_1d8004a0, "The spec valid usage text states 'The sum of firstScissor and scissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-firstScissor-00592)"}, {VALIDATION_ERROR_1d8004a2, "The spec valid usage text states 'If the multiple viewports feature is not enabled, firstScissor must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-firstScissor-00593)"}, @@ -6230,25 +6488,25 @@ {VALIDATION_ERROR_1d802415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-commandBuffer-cmdpool)"}, {VALIDATION_ERROR_1d822601, "The spec valid usage text states 'pScissors must be a valid pointer to an array of scissorCount VkRect2D structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-pScissors-parameter)"}, {VALIDATION_ERROR_1d82b61b, "The spec valid usage text states 'scissorCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetScissor-scissorCount-arraylength)"}, - {VALIDATION_ERROR_1da004b4, "The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-None-00602)"}, + {VALIDATION_ERROR_1da004b4, "The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-None-00602)"}, {VALIDATION_ERROR_1da02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-commandBuffer-parameter)"}, {VALIDATION_ERROR_1da02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-commandBuffer-recording)"}, {VALIDATION_ERROR_1da02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-commandBuffer-cmdpool)"}, {VALIDATION_ERROR_1da08401, "The spec valid usage text states 'faceMask must be a valid combination of VkStencilFaceFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-faceMask-parameter)"}, {VALIDATION_ERROR_1da08403, "The spec valid usage text states 'faceMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-faceMask-requiredbitmask)"}, - {VALIDATION_ERROR_1dc004b8, "The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_REFERENCE dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-None-00604)"}, + {VALIDATION_ERROR_1dc004b8, "The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_REFERENCE dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-None-00604)"}, {VALIDATION_ERROR_1dc02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-commandBuffer-parameter)"}, {VALIDATION_ERROR_1dc02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-commandBuffer-recording)"}, {VALIDATION_ERROR_1dc02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-commandBuffer-cmdpool)"}, {VALIDATION_ERROR_1dc08401, "The spec valid usage text states 'faceMask must be a valid combination of VkStencilFaceFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-faceMask-parameter)"}, {VALIDATION_ERROR_1dc08403, "The spec valid usage text states 'faceMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilReference-faceMask-requiredbitmask)"}, - {VALIDATION_ERROR_1de004b6, "The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_WRITE_MASK dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-None-00603)"}, + {VALIDATION_ERROR_1de004b6, "The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_WRITE_MASK dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-None-00603)"}, {VALIDATION_ERROR_1de02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-commandBuffer-parameter)"}, {VALIDATION_ERROR_1de02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-commandBuffer-recording)"}, {VALIDATION_ERROR_1de02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-commandBuffer-cmdpool)"}, {VALIDATION_ERROR_1de08401, "The spec valid usage text states 'faceMask must be a valid combination of VkStencilFaceFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-faceMask-parameter)"}, {VALIDATION_ERROR_1de08403, "The spec valid usage text states 'faceMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-faceMask-requiredbitmask)"}, - {VALIDATION_ERROR_1e00098a, "The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_VIEWPORT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-None-01221)"}, + {VALIDATION_ERROR_1e00098a, "The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_VIEWPORT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-None-01221)"}, {VALIDATION_ERROR_1e00098c, "The spec valid usage text states 'firstViewport must be less than VkPhysicalDeviceLimits::maxViewports' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01222)"}, {VALIDATION_ERROR_1e00098e, "The spec valid usage text states 'The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01223)"}, {VALIDATION_ERROR_1e000990, "The spec valid usage text states 'If the multiple viewports feature is not enabled, firstViewport must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01224)"}, @@ -6258,7 +6516,7 @@ {VALIDATION_ERROR_1e002415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-commandBuffer-cmdpool)"}, {VALIDATION_ERROR_1e030a1b, "The spec valid usage text states 'viewportCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-viewportCount-arraylength)"}, {VALIDATION_ERROR_1e03fa01, "The spec valid usage text states 'pViewports must be a valid pointer to an array of viewportCount VkViewport structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-pViewports-parameter)"}, - {VALIDATION_ERROR_1e200a54, "The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-None-01322)"}, + {VALIDATION_ERROR_1e200a54, "The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-None-01322)"}, {VALIDATION_ERROR_1e200a56, "The spec valid usage text states 'firstViewport must be less than VkPhysicalDeviceLimits::maxViewports' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-firstViewport-01323)"}, {VALIDATION_ERROR_1e200a58, "The spec valid usage text states 'The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-firstViewport-01324)"}, {VALIDATION_ERROR_1e202401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-commandBuffer-parameter)"}, @@ -6275,6 +6533,8 @@ {VALIDATION_ERROR_1e400048, "The spec valid usage text states 'dstOffset must be a multiple of 4' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdUpdateBuffer-dstOffset-00036)"}, {VALIDATION_ERROR_1e40004a, "The spec valid usage text states 'dataSize must be less than or equal to 65536' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdUpdateBuffer-dataSize-00037)"}, {VALIDATION_ERROR_1e40004c, "The spec valid usage text states 'dataSize must be a multiple of 4' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdUpdateBuffer-dataSize-00038)"}, + {VALIDATION_ERROR_1e400e2a, "The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-01813)"}, + {VALIDATION_ERROR_1e400e2c, "The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-01814)"}, {VALIDATION_ERROR_1e402401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-parameter)"}, {VALIDATION_ERROR_1e402413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-recording)"}, {VALIDATION_ERROR_1e402415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-cmdpool)"}, @@ -6674,6 +6934,7 @@ {VALIDATION_ERROR_27400078, "The spec valid usage text states 'If commandBuffer is a primary command buffer, there must not be an active render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-00060)"}, {VALIDATION_ERROR_2740007a, "The spec valid usage text states 'All queries made active during the recording of commandBuffer must have been made inactive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-00061)"}, {VALIDATION_ERROR_2740007c, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-00062)"}, + {VALIDATION_ERROR_27400e2e, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-01815)"}, {VALIDATION_ERROR_27402401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-parameter)"}, {VALIDATION_ERROR_27619e01, "The spec valid usage text states 'If pLayerName is not NULL, pLayerName must be a null-terminated UTF-8 string' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkEnumerateDeviceExtensionProperties-pLayerName-parameter)"}, {VALIDATION_ERROR_2761f401, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkEnumerateDeviceExtensionProperties-pProperties-parameter)"}, @@ -6743,6 +7004,7 @@ {VALIDATION_ERROR_2941c001, "The spec valid usage text states 'pName must be a null-terminated UTF-8 string' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetDeviceProcAddr-pName-parameter)"}, {VALIDATION_ERROR_29600300, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetDeviceQueue-queueFamilyIndex-00384)"}, {VALIDATION_ERROR_29600302, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetDeviceQueue-queueIndex-00385)"}, + {VALIDATION_ERROR_29600e62, "The spec valid usage text states 'VkDeviceQueueCreateInfo::flags must have been set to zero when device was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetDeviceQueue-flags-01841)"}, {VALIDATION_ERROR_29605601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetDeviceQueue-device-parameter)"}, {VALIDATION_ERROR_2961fc01, "The spec valid usage text states 'pQueue must be a valid pointer to a VkQueue handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetDeviceQueue-pQueue-parameter)"}, {VALIDATION_ERROR_29806001, "The spec valid usage text states 'display must be a valid VkDisplayKHR handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDisplayModePropertiesKHR-display-parameter)"}, @@ -6762,6 +7024,7 @@ {VALIDATION_ERROR_2a005601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetFenceStatus-device-parameter)"}, {VALIDATION_ERROR_2a008801, "The spec valid usage text states 'fence must be a valid VkFence handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetFenceStatus-fence-parameter)"}, {VALIDATION_ERROR_2a008807, "The spec valid usage text states 'fence must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetFenceStatus-fence-parent)"}, + {VALIDATION_ERROR_2a200c68, "The spec valid usage text states 'image must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT flag set' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements-image-01588)"}, {VALIDATION_ERROR_2a205601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageMemoryRequirements-device-parameter)"}, {VALIDATION_ERROR_2a20a001, "The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageMemoryRequirements-image-parameter)"}, {VALIDATION_ERROR_2a20a007, "The spec valid usage text states 'image must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageMemoryRequirements-image-parent)"}, @@ -6777,6 +7040,7 @@ {VALIDATION_ERROR_2a600c5c, "The spec valid usage text states 'If the format of image 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.0-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-format-01582)"}, {VALIDATION_ERROR_2a600d68, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetImageSubresourceLayout-mipLevel-01716)"}, {VALIDATION_ERROR_2a600d6a, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkGetImageSubresourceLayout-arrayLayer-01717)"}, + {VALIDATION_ERROR_2a600ece, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-image-01895)"}, {VALIDATION_ERROR_2a605601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageSubresourceLayout-device-parameter)"}, {VALIDATION_ERROR_2a60a001, "The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageSubresourceLayout-image-parameter)"}, {VALIDATION_ERROR_2a60a007, "The spec valid usage text states 'image must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetImageSubresourceLayout-image-parent)"}, @@ -6854,6 +7118,7 @@ {VALIDATION_ERROR_2ca30401, "The spec valid usage text states 'type must be a valid VkImageType value' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-type-parameter)"}, {VALIDATION_ERROR_2ca30601, "The spec valid usage text states 'usage must be a valid combination of VkImageUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-usage-parameter)"}, {VALIDATION_ERROR_2ca30603, "The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-usage-requiredbitmask)"}, + {VALIDATION_ERROR_2cc00e98, "The spec valid usage text states 'If the pNext chain of pImageFormatProperties contains an instance of VkAndroidHardwareBufferUsageANDROID, the pNext chain of pImageFormatInfo must contain an instance of VkPhysicalDeviceExternalImageFormatInfo with handleType set to VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-01868)"}, {VALIDATION_ERROR_2cc18201, "The spec valid usage text states 'pImageFormatInfo must be a valid pointer to a valid VkPhysicalDeviceImageFormatInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatInfo-parameter)"}, {VALIDATION_ERROR_2cc18401, "The spec valid usage text states 'pImageFormatProperties must be a valid pointer to a VkImageFormatProperties2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatProperties-parameter)"}, {VALIDATION_ERROR_2cc27a01, "The spec valid usage text states 'physicalDevice must be a valid VkPhysicalDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter)"}, @@ -7109,12 +7374,13 @@ {VALIDATION_ERROR_3380d807, "The spec valid usage text states 'objectTable must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUnregisterObjectsNVX-objectTable-parent)"}, {VALIDATION_ERROR_3381c801, "The spec valid usage text states 'pObjectEntryTypes must be a valid pointer to an array of objectCount valid VkObjectEntryTypeNVX values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUnregisterObjectsNVX-pObjectEntryTypes-parameter)"}, {VALIDATION_ERROR_3381cc01, "The spec valid usage text states 'pObjectIndices must be a valid pointer to an array of objectCount uint32_t values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUnregisterObjectsNVX-pObjectIndices-parameter)"}, - {VALIDATION_ERROR_33a00d2a, "The spec valid usage text states 'pData must be a valid pointer to a memory that contains 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.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplateKHR-pData-01685)"}, + {VALIDATION_ERROR_33a00d2a, "The spec valid usage text states 'pData must be a valid pointer to a memory that contains 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.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-pData-01685)"}, {VALIDATION_ERROR_33a04801, "The spec valid usage text states 'descriptorSet must be a valid VkDescriptorSet handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-parameter)"}, {VALIDATION_ERROR_33a05201, "The spec valid usage text states 'descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parameter)"}, {VALIDATION_ERROR_33a05207, "The spec valid usage text states 'descriptorUpdateTemplate must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parent)"}, {VALIDATION_ERROR_33a05601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-device-parameter)"}, {VALIDATION_ERROR_33c00274, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkUpdateDescriptorSets-dstSet-00314)"}, + {VALIDATION_ERROR_33c017ce, "The spec valid usage text states 'Descriptor bindings updated by this command which were created without the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT or VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT 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.0-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSets-None-03047)"}, {VALIDATION_ERROR_33c05601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkUpdateDescriptorSets-device-parameter)"}, {VALIDATION_ERROR_33c12c01, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkUpdateDescriptorSets-pDescriptorCopies-parameter)"}, {VALIDATION_ERROR_33c13601, "The spec valid usage text states '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.0/html/vkspec.html#VUID-vkUpdateDescriptorSets-pDescriptorWrites-parameter)"}, @@ -7122,12 +7388,12 @@ {VALIDATION_ERROR_33e08a1b, "The spec valid usage text states 'fenceCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkWaitForFences-fenceCount-arraylength)"}, {VALIDATION_ERROR_33e17201, "The spec valid usage text states 'pFences must be a valid pointer to an array of fenceCount valid VkFence handles' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkWaitForFences-pFences-parameter)"}, {VALIDATION_ERROR_33e17207, "The spec valid usage text states 'Each element of pFences must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkWaitForFences-pFences-parent)"}, - {VALIDATION_ERROR_3401c40d, "The spec valid usage text states '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, VkPhysicalDeviceDiscardRectanglePropertiesEXT, VkPhysicalDeviceExternalMemoryHostPropertiesEXT, VkPhysicalDeviceIDProperties, VkPhysicalDeviceMaintenance3Properties, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, VkPhysicalDeviceMultiviewProperties, VkPhysicalDevicePointClippingProperties, VkPhysicalDeviceProtectedMemoryProperties, VkPhysicalDevicePushDescriptorPropertiesKHR, VkPhysicalDeviceSampleLocationsPropertiesEXT, VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT, VkPhysicalDeviceSubgroupProperties, or VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-pNext-pNext)"}, + {VALIDATION_ERROR_3401c40d, "The spec valid usage text states '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, VkPhysicalDeviceDescriptorIndexingPropertiesEXT, VkPhysicalDeviceDiscardRectanglePropertiesEXT, VkPhysicalDeviceExternalMemoryHostPropertiesEXT, VkPhysicalDeviceIDProperties, VkPhysicalDeviceMaintenance3Properties, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, VkPhysicalDeviceMultiviewProperties, VkPhysicalDevicePointClippingProperties, VkPhysicalDeviceProtectedMemoryProperties, VkPhysicalDevicePushDescriptorPropertiesKHR, VkPhysicalDeviceSampleLocationsPropertiesEXT, VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT, VkPhysicalDeviceShaderCorePropertiesAMD, VkPhysicalDeviceSubgroupProperties, or VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-pNext-pNext)"}, {VALIDATION_ERROR_3402b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-sType-sType)"}, {VALIDATION_ERROR_3402b00f, "The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-sType-unique)"}, {VALIDATION_ERROR_3421c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkFormatProperties2-pNext-pNext)"}, {VALIDATION_ERROR_3422b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkFormatProperties2-sType-sType)"}, - {VALIDATION_ERROR_3441c40d, "The spec valid usage text states '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 VkExternalImageFormatProperties, VkSamplerYcbcrConversionImageFormatProperties, or VkTextureLODGatherFormatPropertiesAMD' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-pNext-pNext)"}, + {VALIDATION_ERROR_3441c40d, "The spec valid usage text states '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, VkSamplerYcbcrConversionImageFormatProperties, or VkTextureLODGatherFormatPropertiesAMD' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-pNext-pNext)"}, {VALIDATION_ERROR_3442b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-sType-sType)"}, {VALIDATION_ERROR_3442b00f, "The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-sType-unique)"}, {VALIDATION_ERROR_3461c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMemoryProperties2-pNext-pNext)"}, @@ -7146,40 +7412,31 @@ {VALIDATION_ERROR_3562b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSparseImageFormatProperties2-sType-sType)"}, {VALIDATION_ERROR_3581c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSurfaceFormat2KHR-pNext-pNext)"}, {VALIDATION_ERROR_3582b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSurfaceFormat2KHR-sType-sType)"}, - {VALIDATION_ERROR_35c1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewProperties-pNext-pNext)"}, {VALIDATION_ERROR_35c2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewProperties-sType-sType)"}, - {VALIDATION_ERROR_3601c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalImageFormatProperties-pNext-pNext)"}, {VALIDATION_ERROR_3602b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalImageFormatProperties-sType-sType)"}, - {VALIDATION_ERROR_3621c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceIDProperties-pNext-pNext)"}, {VALIDATION_ERROR_3622b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceIDProperties-sType-sType)"}, {VALIDATION_ERROR_3642b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX-sType-sType)"}, {VALIDATION_ERROR_37e2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSharedPresentSurfaceCapabilitiesKHR-sType-sType)"}, {VALIDATION_ERROR_3822b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT-sType-sType)"}, {VALIDATION_ERROR_3842b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT-sType-sType)"}, - {VALIDATION_ERROR_3861c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT-pNext-pNext)"}, {VALIDATION_ERROR_3862b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT-sType-sType)"}, {VALIDATION_ERROR_38800b20, "The spec valid usage text states 'If the non-premultiplied source color property is not supported, srcPremultiplied must be VK_TRUE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-srcPremultiplied-01424)"}, {VALIDATION_ERROR_38800b22, "The spec valid usage text states 'If the non-premultiplied destination color property is not supported, dstPremultiplied must be VK_TRUE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-dstPremultiplied-01425)"}, {VALIDATION_ERROR_38800b24, "The spec valid usage text states 'If the correlated overlap property is not supported, blendOverlap must be VK_BLEND_OVERLAP_UNCORRELATED_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-01426)"}, - {VALIDATION_ERROR_3881c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_3882b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-sType-sType)"}, {VALIDATION_ERROR_38834a01, "The spec valid usage text states 'blendOverlap must be a valid VkBlendOverlapEXT value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-parameter)"}, {VALIDATION_ERROR_38a00afa, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableEnable-01405)"}, {VALIDATION_ERROR_38a09005, "The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-flags-zerobitmask)"}, - {VALIDATION_ERROR_38a1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-pNext-pNext)"}, {VALIDATION_ERROR_38a2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-sType-sType)"}, {VALIDATION_ERROR_38a34c01, "The spec valid usage text states 'coverageModulationMode must be a valid VkCoverageModulationModeNV value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationMode-parameter)"}, {VALIDATION_ERROR_38a34e1b, "The spec valid usage text states 'coverageModulationTableCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableCount-arraylength)"}, {VALIDATION_ERROR_38c00af8, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageToColorStateCreateInfoNV-coverageToColorEnable-01404)"}, {VALIDATION_ERROR_38c09005, "The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageToColorStateCreateInfoNV-flags-zerobitmask)"}, - {VALIDATION_ERROR_38c1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageToColorStateCreateInfoNV-pNext-pNext)"}, {VALIDATION_ERROR_38c2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineCoverageToColorStateCreateInfoNV-sType-sType)"}, - {VALIDATION_ERROR_38e1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerReductionModeCreateInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_38e2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerReductionModeCreateInfoEXT-sType-sType)"}, {VALIDATION_ERROR_38e35001, "The spec valid usage text states 'reductionMode must be a valid VkSamplerReductionModeEXT value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerReductionModeCreateInfoEXT-reductionMode-parameter)"}, {VALIDATION_ERROR_39400b4c, "The spec valid usage text states 'The bits in handleTypes must be supported and compatible, as reported by VkExternalFenceProperties.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-handleTypes-01446)"}, {VALIDATION_ERROR_39409e01, "The spec valid usage text states 'handleTypes must be a valid combination of VkExternalFenceHandleTypeFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-handleTypes-parameter)"}, - {VALIDATION_ERROR_3941c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-pNext-pNext)"}, {VALIDATION_ERROR_3942b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-sType-sType)"}, {VALIDATION_ERROR_39609c01, "The spec valid usage text states 'handleType must be a valid VkExternalFenceHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalFenceInfo-handleType-parameter)"}, {VALIDATION_ERROR_3961c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalFenceInfo-pNext-pNext)"}, @@ -7224,7 +7481,6 @@ {VALIDATION_ERROR_3a42b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-sType-sType)"}, {VALIDATION_ERROR_3a600b4e, "The spec valid usage text states 'If VkExportFenceCreateInfo::handleTypes does not include VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT, VkExportFenceWin32HandleInfoKHR must not be in the pNext chain of VkFenceCreateInfo.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceWin32HandleInfoKHR-handleTypes-01447)"}, {VALIDATION_ERROR_3a60f401, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkExportFenceWin32HandleInfoKHR-pAttributes-parameter)"}, - {VALIDATION_ERROR_3a61c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceWin32HandleInfoKHR-pNext-pNext)"}, {VALIDATION_ERROR_3a62b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExportFenceWin32HandleInfoKHR-sType-sType)"}, {VALIDATION_ERROR_3a800b50, "The spec valid usage text states 'handleType must have been included in VkExportFenceCreateInfo::handleTypes when the fence's current payload was created.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-handleType-01448)"}, {VALIDATION_ERROR_3a800b52, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-handleType-01449)"}, @@ -7272,7 +7528,6 @@ {VALIDATION_ERROR_3b40c601, "The spec valid usage text states 'memory must be a valid VkDeviceMemory handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-memory-parameter)"}, {VALIDATION_ERROR_3b41c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-pNext-pNext)"}, {VALIDATION_ERROR_3b42b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-sType-sType)"}, - {VALIDATION_ERROR_3b61c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedRequirements-pNext-pNext)"}, {VALIDATION_ERROR_3b62b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedRequirements-sType-sType)"}, {VALIDATION_ERROR_3b800009, "The spec valid usage text states 'Both of buffer, and image that are valid handles must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-commonparent)"}, {VALIDATION_ERROR_3b800b30, "The spec valid usage text states 'At least one of image and buffer must be VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01432)"}, @@ -7280,19 +7535,21 @@ {VALIDATION_ERROR_3b800b34, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01434)"}, {VALIDATION_ERROR_3b800b36, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01435)"}, {VALIDATION_ERROR_3b800b38, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01436)"}, - {VALIDATION_ERROR_3b800b3a, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01437)"}, - {VALIDATION_ERROR_3b800b3c, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01438)"}, - {VALIDATION_ERROR_3b800e0a, "The spec valid usage text states 'If image is not VK_NULL_HANDLE, image must not have been created with VK_IMAGE_CREATE_DISJOINT_BIT_KHR set in VkImageCreateInfo::flags' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfoKHR-image-01797)"}, + {VALIDATION_ERROR_3b800e0a, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01797)"}, + {VALIDATION_ERROR_3b800ea8, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01876)"}, + {VALIDATION_ERROR_3b800eaa, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01877)"}, + {VALIDATION_ERROR_3b800eac, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01878)"}, + {VALIDATION_ERROR_3b800eae, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01879)"}, {VALIDATION_ERROR_3b801a01, "The spec valid usage text states 'If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-parameter)"}, {VALIDATION_ERROR_3b80a001, "The spec valid usage text states 'If image is not VK_NULL_HANDLE, image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-parameter)"}, - {VALIDATION_ERROR_3b81c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-pNext-pNext)"}, {VALIDATION_ERROR_3b82b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-sType-sType)"}, {VALIDATION_ERROR_3ba01a01, "The spec valid usage text states 'buffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryRequirementsInfo2-buffer-parameter)"}, {VALIDATION_ERROR_3ba1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryRequirementsInfo2-pNext-pNext)"}, {VALIDATION_ERROR_3ba2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBufferMemoryRequirementsInfo2-sType-sType)"}, - {VALIDATION_ERROR_3bc00c6a, "The spec valid usage text states 'If image was created with a multi-planar format and the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2KHR-image-01589)"}, - {VALIDATION_ERROR_3bc00c6c, "The spec valid usage text states 'If image was not created with the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must not be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2KHR-image-01590)"}, - {VALIDATION_ERROR_3bc00c6e, "The spec valid usage text states 'If image was created with a single-plane format, there must not be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2KHR-image-01591)"}, + {VALIDATION_ERROR_3bc00c6a, "The spec valid usage text states 'If image was created with a multi-planar format and the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-01589)"}, + {VALIDATION_ERROR_3bc00c6c, "The spec valid usage text states 'If image was not created with the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must not be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-01590)"}, + {VALIDATION_ERROR_3bc00c6e, "The spec valid usage text states 'If image was created with a single-plane format, there must not be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-01591)"}, + {VALIDATION_ERROR_3bc00ed2, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-01897)"}, {VALIDATION_ERROR_3bc0a001, "The spec valid usage text states 'image must be a valid VkImage handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-parameter)"}, {VALIDATION_ERROR_3bc1c40d, "The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkImagePlaneMemoryRequirementsInfo' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-pNext-pNext)"}, {VALIDATION_ERROR_3bc2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-sType-sType)"}, @@ -7315,23 +7572,18 @@ {VALIDATION_ERROR_3c839c01, "The spec valid usage text states 'pInfo must be a valid pointer to a valid VkImageSparseMemoryRequirementsInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-pInfo-parameter)"}, {VALIDATION_ERROR_3ca2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDevice16BitStorageFeatures-sType-sType)"}, {VALIDATION_ERROR_3cc00b2e, "The spec valid usage text states 'If variablePointers is enabled then variablePointersStorageBuffer must also be enabled.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVariablePointerFeatures-variablePointers-01431)"}, - {VALIDATION_ERROR_3cc1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVariablePointerFeatures-pNext-pNext)"}, {VALIDATION_ERROR_3cc2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVariablePointerFeatures-sType-sType)"}, {VALIDATION_ERROR_3ce00bec, "The spec valid usage text states 'sampleLocationsPerPixel must be a bit value that is set in VkPhysicalDeviceSampleLocationsPropertiesEXT::sampleLocationSampleCounts' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-01526)"}, {VALIDATION_ERROR_3ce00bee, "The spec valid usage text states 'sampleLocationsCount must equal sampleLocationsPerPixel {times} sampleLocationGridSize.width {times} sampleLocationGridSize.height' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527)"}, - {VALIDATION_ERROR_3ce1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_3ce2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sType-sType)"}, {VALIDATION_ERROR_3ce3b201, "The spec valid usage text states 'sampleLocationsPerPixel must be a valid VkSampleCountFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-parameter)"}, {VALIDATION_ERROR_3ce3b41b, "The spec valid usage text states 'sampleLocationsCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-arraylength)"}, {VALIDATION_ERROR_3ce3b601, "The spec valid usage text states 'pSampleLocations must be a valid pointer to an array of sampleLocationsCount VkSampleLocationEXT structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-pSampleLocations-parameter)"}, - {VALIDATION_ERROR_3d01c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassSampleLocationsBeginInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_3d02b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassSampleLocationsBeginInfoEXT-sType-sType)"}, {VALIDATION_ERROR_3d03ba01, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassSampleLocationsBeginInfoEXT-pAttachmentInitialSampleLocations-parameter)"}, {VALIDATION_ERROR_3d03e801, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkRenderPassSampleLocationsBeginInfoEXT-pPostSubpassSampleLocations-parameter)"}, - {VALIDATION_ERROR_3d21c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineSampleLocationsStateCreateInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_3d22b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sType-sType)"}, {VALIDATION_ERROR_3d23c601, "The spec valid usage text states 'sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sampleLocationsInfo-parameter)"}, - {VALIDATION_ERROR_3d41c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSampleLocationsPropertiesEXT-pNext-pNext)"}, {VALIDATION_ERROR_3d42b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSampleLocationsPropertiesEXT-sType-sType)"}, {VALIDATION_ERROR_3d61c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMultisamplePropertiesEXT-pNext-pNext)"}, {VALIDATION_ERROR_3d62b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMultisamplePropertiesEXT-sType-sType)"}, @@ -7344,7 +7596,6 @@ {VALIDATION_ERROR_3da19601, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkValidationCacheCreateInfoEXT-pInitialData-parameter)"}, {VALIDATION_ERROR_3da1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkValidationCacheCreateInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_3da2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkValidationCacheCreateInfoEXT-sType-sType)"}, - {VALIDATION_ERROR_3dc1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkShaderModuleValidationCacheCreateInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_3dc2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkShaderModuleValidationCacheCreateInfoEXT-sType-sType)"}, {VALIDATION_ERROR_3dc3c401, "The spec valid usage text states 'validationCache must be a valid VkValidationCacheEXT handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkShaderModuleValidationCacheCreateInfoEXT-validationCache-parameter)"}, {VALIDATION_ERROR_3de05601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateValidationCacheEXT-device-parameter)"}, @@ -7356,8 +7607,8 @@ {VALIDATION_ERROR_3e012401, "The spec valid usage text states 'pDataSize must be a valid pointer to a size_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetValidationCacheDataEXT-pDataSize-parameter)"}, {VALIDATION_ERROR_3e03c401, "The spec valid usage text states 'validationCache must be a valid VkValidationCacheEXT handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetValidationCacheDataEXT-validationCache-parameter)"}, {VALIDATION_ERROR_3e03c407, "The spec valid usage text states 'validationCache must have been created, allocated, or retrieved from device' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetValidationCacheDataEXT-validationCache-parent)"}, - {VALIDATION_ERROR_3e200bf0, "The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-None-01528)"}, - {VALIDATION_ERROR_3e200bf2, "The spec valid usage text states 'The sampleLocationsPerPixel member of pSampleLocationsInfo must equal the rasterizationSamples member of the VkPipelineMultisampleStateCreateInfo structure the currently bound graphics pipeline has been created with' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529)"}, + {VALIDATION_ERROR_3e200bf0, "The spec valid usage text states 'The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-None-01528)"}, + {VALIDATION_ERROR_3e200bf2, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529)"}, {VALIDATION_ERROR_3e200bf4, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-variableSampleLocations-01530)"}, {VALIDATION_ERROR_3e202401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-commandBuffer-parameter)"}, {VALIDATION_ERROR_3e202413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-commandBuffer-recording)"}, @@ -7380,77 +7631,71 @@ {VALIDATION_ERROR_3e83c601, "The spec valid usage text states 'sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAttachmentSampleLocationsEXT-sampleLocationsInfo-parameter)"}, {VALIDATION_ERROR_3ea00bf8, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSubpassSampleLocationsEXT-subpassIndex-01532)"}, {VALIDATION_ERROR_3ea3c601, "The spec valid usage text states 'sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSubpassSampleLocationsEXT-sampleLocationsInfo-parameter)"}, - {VALIDATION_ERROR_3ec1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDevicePointClippingProperties-pNext-pNext)"}, {VALIDATION_ERROR_3ec2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDevicePointClippingProperties-sType-sType)"}, {VALIDATION_ERROR_3ee00c01, "The spec valid usage text states 'aspectMask must be a valid combination of VkImageAspectFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-aspectMask-parameter)"}, {VALIDATION_ERROR_3ee00c03, "The spec valid usage text states 'aspectMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-aspectMask-requiredbitmask)"}, - {VALIDATION_ERROR_3ee00c40, "The spec valid usage text states 'There must be an input attachment at pCreateInfo::pSubpasses[subpass].pInputAttachments[inputAttachment].' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReferenceKHR-pCreateInfo-01568)"}, - {VALIDATION_ERROR_3ee00c42, "The spec valid usage text states 'The specified input attachment must have more than one aspect mask.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReferenceKHR-None-01569)"}, - {VALIDATION_ERROR_3ee00c44, "The spec valid usage text states 'aspectMask must be a subset of the aspect masks in the specified input attachment.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReferenceKHR-aspectMask-01570)"}, - {VALIDATION_ERROR_3f01c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-pNext-pNext)"}, + {VALIDATION_ERROR_3ee00c40, "The spec valid usage text states 'There must be an input attachment at pCreateInfo::pSubpasses[subpass].pInputAttachments[inputAttachmentIndex].' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-pCreateInfo-01568)"}, + {VALIDATION_ERROR_3ee00c42, "The spec valid usage text states 'The specified input attachment must have more than one aspect mask.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-None-01569)"}, + {VALIDATION_ERROR_3ee00c44, "The spec valid usage text states 'aspectMask must be a subset of the aspect masks in the specified input attachment.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-aspectMask-01570)"}, {VALIDATION_ERROR_3f02b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-sType-sType)"}, {VALIDATION_ERROR_3f03ce1b, "The spec valid usage text states 'aspectReferenceCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-aspectReferenceCount-arraylength)"}, {VALIDATION_ERROR_3f03d001, "The spec valid usage text states 'pAspectReferences must be a valid pointer to an array of aspectReferenceCount valid VkInputAttachmentAspectReference structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-pAspectReferences-parameter)"}, - {VALIDATION_ERROR_3f200c66, "The spec valid usage text states 'usage must not include any set bits that were not set in the usage member of the VkImageCreateInfo structure used to create the image this image view is created from.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfoKHR-usage-01587)"}, - {VALIDATION_ERROR_3f21c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-pNext-pNext)"}, + {VALIDATION_ERROR_3f200c66, "The spec valid usage text states 'usage must not include any set bits that were not set in the usage member of the VkImageCreateInfo structure used to create the image this image view is created from.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-usage-01587)"}, {VALIDATION_ERROR_3f22b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-sType-sType)"}, {VALIDATION_ERROR_3f230601, "The spec valid usage text states 'usage must be a valid combination of VkImageUsageFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-usage-parameter)"}, {VALIDATION_ERROR_3f230603, "The spec valid usage text states 'usage must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-usage-requiredbitmask)"}, - {VALIDATION_ERROR_3f41c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineTessellationDomainOriginStateCreateInfo-pNext-pNext)"}, {VALIDATION_ERROR_3f42b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineTessellationDomainOriginStateCreateInfo-sType-sType)"}, {VALIDATION_ERROR_3f43d201, "The spec valid usage text states 'domainOrigin must be a valid VkTessellationDomainOrigin value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineTessellationDomainOriginStateCreateInfo-domainOrigin-parameter)"}, {VALIDATION_ERROR_3f600c54, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfoKHR-viewFormatCount-01578)"}, {VALIDATION_ERROR_3f600c56, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfoKHR-flags-01579)"}, {VALIDATION_ERROR_3f600c58, "The spec valid usage text states 'If viewFormatCount is not 0, VkImageCreateInfo::format must be in pViewFormats.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfoKHR-viewFormatCount-01580)"}, - {VALIDATION_ERROR_3f61c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfoKHR-pNext-pNext)"}, {VALIDATION_ERROR_3f62b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfoKHR-sType-sType)"}, {VALIDATION_ERROR_3f63e401, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfoKHR-pViewFormats-parameter)"}, - {VALIDATION_ERROR_3f800ce2, "The spec valid usage text states 'format must not be VK_FORMAT_UNDEFINED' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-format-01649)"}, - {VALIDATION_ERROR_3f800ce4, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-format-01650)"}, - {VALIDATION_ERROR_3f800ce6, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-xChromaOffset-01651)"}, - {VALIDATION_ERROR_3f800ce8, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-xChromaOffset-01652)"}, - {VALIDATION_ERROR_3f800cea, "The spec valid usage text states 'format must represent unsigned normalized values (i.e. the format must be a UNORM format)' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-format-01653)"}, - {VALIDATION_ERROR_3f800cec, "The spec valid usage text states 'If the format has a _422 or _420 suffix:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-None-01654)"}, - {VALIDATION_ERROR_3f800cee, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-ycbcrModel-01655)"}, - {VALIDATION_ERROR_3f800cf0, "The spec valid usage text states 'If the format does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT, forceExplicitReconstruction must be FALSE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-forceExplicitReconstruction-01656)"}, - {VALIDATION_ERROR_3f800cf2, "The spec valid usage text states 'If the format does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT, chromaFilter must be VK_FILTER_NEAREST' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfoKHR-chromaFilter-01657)"}, + {VALIDATION_ERROR_3f800ce2, "The spec valid usage text states 'format must not be VK_FORMAT_UNDEFINED' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-01649)"}, + {VALIDATION_ERROR_3f800ce4, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-01650)"}, + {VALIDATION_ERROR_3f800ce6, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651)"}, + {VALIDATION_ERROR_3f800ce8, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652)"}, + {VALIDATION_ERROR_3f800cea, "The spec valid usage text states 'format must represent unsigned normalized values (i.e. the format must be a UNORM format)' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-01653)"}, + {VALIDATION_ERROR_3f800cec, "The spec valid usage text states 'If the format has a _422 or _420 suffix:' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-None-01654)"}, + {VALIDATION_ERROR_3f800cee, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-01655)"}, + {VALIDATION_ERROR_3f800cf0, "The spec valid usage text states 'If the format does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT, forceExplicitReconstruction must be FALSE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656)"}, + {VALIDATION_ERROR_3f800cf2, "The spec valid usage text states 'If the format does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT, chromaFilter must be VK_FILTER_NEAREST' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657)"}, + {VALIDATION_ERROR_3f800ee0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-01904)"}, {VALIDATION_ERROR_3f802c01, "The spec valid usage text states 'components must be a valid VkComponentMapping structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-components-parameter)"}, {VALIDATION_ERROR_3f809201, "The spec valid usage text states 'format must be a valid VkFormat value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-parameter)"}, - {VALIDATION_ERROR_3f81c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-pNext-pNext)"}, + {VALIDATION_ERROR_3f81c40d, "The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkExternalFormatANDROID' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-pNext-pNext)"}, {VALIDATION_ERROR_3f82b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-sType-sType)"}, {VALIDATION_ERROR_3f83d401, "The spec valid usage text states 'ycbcrModel must be a valid VkSamplerYcbcrModelConversion value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-parameter)"}, {VALIDATION_ERROR_3f83d601, "The spec valid usage text states 'ycbcrRange must be a valid VkSamplerYcbcrRange value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-parameter)"}, {VALIDATION_ERROR_3f83d801, "The spec valid usage text states 'xChromaOffset must be a valid VkChromaLocation value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-parameter)"}, {VALIDATION_ERROR_3f83da01, "The spec valid usage text states 'yChromaOffset must be a valid VkChromaLocation value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-yChromaOffset-parameter)"}, {VALIDATION_ERROR_3f83dc01, "The spec valid usage text states 'chromaFilter must be a valid VkFilter value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-parameter)"}, - {VALIDATION_ERROR_3fa00cd4, "The spec valid usage text states 'planeAspect must be a single valid plane aspect for the image format (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.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfoKHR-planeAspect-01642)"}, - {VALIDATION_ERROR_3fa00cd6, "The spec valid usage text states 'A single call to vkBindImageMemory2 must bind all or none of the planes of an image (i.e. bindings to all planes of an image must be made in a single vkBindImageMemory2 call), as separate bindings' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfoKHR-None-01643)"}, + {VALIDATION_ERROR_3fa00cd4, "The spec valid usage text states 'planeAspect must be a single valid plane aspect for the image format (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.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-planeAspect-01642)"}, + {VALIDATION_ERROR_3fa00cd6, "The spec valid usage text states 'A single call to vkBindImageMemory2 must bind all or none of the planes of an image (i.e. bindings to all planes of an image must be made in a single vkBindImageMemory2 call), as separate bindings' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-None-01643)"}, {VALIDATION_ERROR_3fa2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-sType-sType)"}, {VALIDATION_ERROR_3fa3de01, "The spec valid usage text states 'planeAspect must be a valid VkImageAspectFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter)"}, - {VALIDATION_ERROR_3fc00c70, "The spec valid usage text states 'planeAspect must be an aspect that exists in the format; 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.0-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfoKHR-planeAspect-01592)"}, + {VALIDATION_ERROR_3fc00c70, "The spec valid usage text states 'planeAspect must be an aspect that exists in the format; 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.0-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-01592)"}, {VALIDATION_ERROR_3fc2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType)"}, {VALIDATION_ERROR_3fc3de01, "The spec valid usage text states 'planeAspect must be a valid VkImageAspectFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter)"}, - {VALIDATION_ERROR_3fe00ce0, "The spec valid usage text states 'The sampler Y'CBCR conversion feature must be enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversionKHR-None-01648)"}, + {VALIDATION_ERROR_3fe00ce0, "The spec valid usage text states 'The sampler Y'CBCR conversion feature must be enabled' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-None-01648)"}, {VALIDATION_ERROR_3fe05601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-device-parameter)"}, {VALIDATION_ERROR_3fe0ec01, "The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-pAllocator-parameter)"}, {VALIDATION_ERROR_3fe11e01, "The spec valid usage text states 'pCreateInfo must be a valid pointer to a valid VkSamplerYcbcrConversionCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter)"}, {VALIDATION_ERROR_3fe3e001, "The spec valid usage text states 'pYcbcrConversion must be a valid pointer to a VkSamplerYcbcrConversion handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter)"}, - {VALIDATION_ERROR_40000c8c, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfoKHR-deviceIndexCount-01606)"}, - {VALIDATION_ERROR_40000c8e, "The spec valid usage text states 'All elements of pDeviceIndices must be valid device indices' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfoKHR-pDeviceIndices-01607)"}, + {VALIDATION_ERROR_40000c8c, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-deviceIndexCount-01606)"}, + {VALIDATION_ERROR_40000c8e, "The spec valid usage text states 'All elements of pDeviceIndices must be valid device indices' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-01607)"}, {VALIDATION_ERROR_40013e01, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-parameter)"}, - {VALIDATION_ERROR_4001c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-pNext-pNext)"}, {VALIDATION_ERROR_4002b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-sType-sType)"}, - {VALIDATION_ERROR_40200cc2, "The spec valid usage text states 'At least one of deviceIndexCount and splitInstanceBindRegionCount must be zero.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-deviceIndexCount-01633)"}, - {VALIDATION_ERROR_40200cc4, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-deviceIndexCount-01634)"}, - {VALIDATION_ERROR_40200cc6, "The spec valid usage text states 'All elements of pDeviceIndices must be valid device indices.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-pDeviceIndices-01635)"}, - {VALIDATION_ERROR_40200cc8, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-splitInstanceBindRegionCount-01636)"}, - {VALIDATION_ERROR_40200cca, "The spec valid usage text states 'Elements of pSplitInstanceBindRegions that correspond to the same instance of an image must not overlap.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-pSplitInstanceBindRegions-01637)"}, - {VALIDATION_ERROR_40200ccc, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-offset-01638)"}, - {VALIDATION_ERROR_40200cce, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-offset-01639)"}, - {VALIDATION_ERROR_40200cd0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-extent-01640)"}, - {VALIDATION_ERROR_40200cd2, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfoKHR-extent-01641)"}, + {VALIDATION_ERROR_40200cc2, "The spec valid usage text states 'At least one of deviceIndexCount and splitInstanceBindRegionCount must be zero.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01633)"}, + {VALIDATION_ERROR_40200cc4, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01634)"}, + {VALIDATION_ERROR_40200cc6, "The spec valid usage text states 'All elements of pDeviceIndices must be valid device indices.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-01635)"}, + {VALIDATION_ERROR_40200cc8, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-splitInstanceBindRegionCount-01636)"}, + {VALIDATION_ERROR_40200cca, "The spec valid usage text states 'Elements of pSplitInstanceBindRegions that correspond to the same instance of an image must not overlap.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-01637)"}, + {VALIDATION_ERROR_40200ccc, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-offset-01638)"}, + {VALIDATION_ERROR_40200cce, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-offset-01639)"}, + {VALIDATION_ERROR_40200cd0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-extent-01640)"}, + {VALIDATION_ERROR_40200cd2, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-extent-01641)"}, {VALIDATION_ERROR_40213e01, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-parameter)"}, - {VALIDATION_ERROR_4021c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pNext-pNext)"}, {VALIDATION_ERROR_4022b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-sType-sType)"}, {VALIDATION_ERROR_4023fe01, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-parameter)"}, {VALIDATION_ERROR_40405601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-device-parameter)"}, @@ -7461,7 +7706,6 @@ {VALIDATION_ERROR_4082b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionImageFormatProperties-sType-sType)"}, {VALIDATION_ERROR_40a2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionInfo-sType-sType)"}, {VALIDATION_ERROR_40a3e601, "The spec valid usage text states 'conversion must be a valid VkSamplerYcbcrConversion handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionInfo-conversion-parameter)"}, - {VALIDATION_ERROR_40c1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_40c2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-sType-sType)"}, {VALIDATION_ERROR_40c3ea01, "The spec valid usage text states 'globalPriority must be a valid VkQueueGlobalPriorityEXT value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-globalPriority-parameter)"}, {VALIDATION_ERROR_40e05601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetShaderInfoAMD-device-parameter)"}, @@ -7477,11 +7721,9 @@ {VALIDATION_ERROR_41200dac, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-handleType-01750)"}, {VALIDATION_ERROR_41200dae, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-handleType-01751)"}, {VALIDATION_ERROR_41209c01, "The spec valid usage text states 'handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-handleType-parameter)"}, - {VALIDATION_ERROR_4121c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_4122b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-sType-sType)"}, {VALIDATION_ERROR_4141c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryHostPointerPropertiesEXT-pNext-pNext)"}, {VALIDATION_ERROR_4142b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryHostPointerPropertiesEXT-sType-sType)"}, - {VALIDATION_ERROR_4161c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalMemoryHostPropertiesEXT-pNext-pNext)"}, {VALIDATION_ERROR_4162b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalMemoryHostPropertiesEXT-sType-sType)"}, {VALIDATION_ERROR_41800db0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01752)"}, {VALIDATION_ERROR_41800db2, "The spec valid usage text states 'pHostPointer must be a pointer aligned to an integer multiple of VkPhysicalDeviceExternalMemoryHostPropertiesEXT::minImportedHostPointerAlignment' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-pHostPointer-01753)"}, @@ -7490,11 +7732,9 @@ {VALIDATION_ERROR_41805601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-device-parameter)"}, {VALIDATION_ERROR_41809c01, "The spec valid usage text states 'handleType must be a valid VkExternalMemoryHandleTypeFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-parameter)"}, {VALIDATION_ERROR_4183f401, "The spec valid usage text states 'pMemoryHostPointerProperties must be a valid pointer to a VkMemoryHostPointerPropertiesEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-pMemoryHostPointerProperties-parameter)"}, - {VALIDATION_ERROR_41a1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceConservativeRasterizationPropertiesEXT-pNext-pNext)"}, {VALIDATION_ERROR_41a2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceConservativeRasterizationPropertiesEXT-sType-sType)"}, {VALIDATION_ERROR_41c00dd2, "The spec valid usage text states 'extraPrimitiveOverestimationSize must be in the range of 0.0 to VkPhysicalDeviceConservativeRasterizationPropertiesEXT::maxExtraPrimitiveOverestimationSize inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-extraPrimitiveOverestimationSize-01769)"}, {VALIDATION_ERROR_41c09005, "The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-flags-zerobitmask)"}, - {VALIDATION_ERROR_41c1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-pNext-pNext)"}, {VALIDATION_ERROR_41c2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-sType-sType)"}, {VALIDATION_ERROR_41c3f801, "The spec valid usage text states 'conservativeRasterizationMode must be a valid VkConservativeRasterizationModeEXT value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-conservativeRasterizationMode-parameter)"}, {VALIDATION_ERROR_41e00009, "The spec valid usage text states 'Both of commandBuffer, and dstBuffer must have been created, allocated, or retrieved from the same VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-commonparent)"}, @@ -7507,22 +7747,23 @@ {VALIDATION_ERROR_41e02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-cmdpool)"}, {VALIDATION_ERROR_41e06c01, "The spec valid usage text states 'dstBuffer must be a valid VkBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-parameter)"}, {VALIDATION_ERROR_41e28401, "The spec valid usage text states 'pipelineStage must be a valid VkPipelineStageFlagBits value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-parameter)"}, - {VALIDATION_ERROR_4201c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutSupport-pNext-pNext)"}, + {VALIDATION_ERROR_4201c40d, "The spec valid usage text states 'pNext must be NULL or a pointer to a valid instance of VkDescriptorSetVariableDescriptorCountLayoutSupportEXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutSupport-pNext-pNext)"}, {VALIDATION_ERROR_4202b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutSupport-sType-sType)"}, + {VALIDATION_ERROR_42200e64, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-queueFamilyIndex-01842)"}, + {VALIDATION_ERROR_42200e66, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-queueIndex-01843)"}, {VALIDATION_ERROR_42209001, "The spec valid usage text states 'flags must be a valid combination of VkDeviceQueueCreateFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-flags-parameter)"}, {VALIDATION_ERROR_42209003, "The spec valid usage text states 'flags must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-flags-requiredbitmask)"}, {VALIDATION_ERROR_4221c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-pNext-pNext)"}, {VALIDATION_ERROR_4222b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-sType-sType)"}, - {VALIDATION_ERROR_4241c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMaintenance3Properties-pNext-pNext)"}, {VALIDATION_ERROR_4242b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMaintenance3Properties-sType-sType)"}, - {VALIDATION_ERROR_4261c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProtectedMemoryFeatures-pNext-pNext)"}, {VALIDATION_ERROR_4262b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProtectedMemoryFeatures-sType-sType)"}, - {VALIDATION_ERROR_4281c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProtectedMemoryProperties-pNext-pNext)"}, {VALIDATION_ERROR_4282b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProtectedMemoryProperties-sType-sType)"}, {VALIDATION_ERROR_42a2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderDrawParameterFeatures-sType-sType)"}, - {VALIDATION_ERROR_42c1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSubgroupProperties-pNext-pNext)"}, {VALIDATION_ERROR_42c2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSubgroupProperties-sType-sType)"}, - {VALIDATION_ERROR_42e1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-pNext-pNext)"}, + {VALIDATION_ERROR_42e00e30, "The spec valid usage text states 'If the protected memory feature is not enabled, protectedSubmit must not be VK_TRUE.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-protectedSubmit-01816)"}, + {VALIDATION_ERROR_42e00e32, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-protectedSubmit-01817)"}, + {VALIDATION_ERROR_42e00e34, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-protectedSubmit-01818)"}, + {VALIDATION_ERROR_42e00e36, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-pNext-01819)"}, {VALIDATION_ERROR_42e2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-sType-sType)"}, {VALIDATION_ERROR_43040001, "The spec valid usage text states 'pApiVersion must be a valid pointer to a uint32_t value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkEnumerateInstanceVersion-pApiVersion-parameter)"}, {VALIDATION_ERROR_43205601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDescriptorSetLayoutSupport-device-parameter)"}, @@ -7531,6 +7772,4052 @@ {VALIDATION_ERROR_43405601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceQueue2-device-parameter)"}, {VALIDATION_ERROR_4341fc01, "The spec valid usage text states 'pQueue must be a valid pointer to a VkQueue handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceQueue2-pQueue-parameter)"}, {VALIDATION_ERROR_43440401, "The spec valid usage text states 'pQueueInfo must be a valid pointer to a valid VkDeviceQueueInfo2 structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetDeviceQueue2-pQueueInfo-parameter)"}, - {VALIDATION_ERROR_4441c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT-pNext-pNext)"}, + {VALIDATION_ERROR_43600ee2, "The spec valid usage text states 'objectType must not be VK_OBJECT_TYPE_UNKNOWN' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-objectType-01905)"}, + {VALIDATION_ERROR_43600ee4, "The spec valid usage text states 'objectHandle must not be VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-objectHandle-01906)"}, + {VALIDATION_ERROR_43600ee6, "The spec valid usage text states 'objectHandle must be a Vulkan object of the type associated with objectType as defined in debugging-object-types.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-objectHandle-01907)"}, + {VALIDATION_ERROR_4360da01, "The spec valid usage text states 'objectType must be a valid VkObjectType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-objectType-parameter)"}, + {VALIDATION_ERROR_4361c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-pNext-pNext)"}, + {VALIDATION_ERROR_4361ce01, "The spec valid usage text states 'If pObjectName is not NULL, pObjectName must be a null-terminated UTF-8 string' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-pObjectName-parameter)"}, + {VALIDATION_ERROR_4362b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-sType-sType)"}, + {VALIDATION_ERROR_43800ee8, "The spec valid usage text states 'objectType must not be VK_OBJECT_TYPE_UNKNOWN' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-objectType-01908)"}, + {VALIDATION_ERROR_43800eea, "The spec valid usage text states 'objectHandle must not be VK_NULL_HANDLE' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01909)"}, + {VALIDATION_ERROR_43800eec, "The spec valid usage text states 'objectHandle must be a Vulkan object of the type associated with objectType as defined in debugging-object-types.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01910)"}, + {VALIDATION_ERROR_4380da01, "The spec valid usage text states 'objectType must be a valid VkObjectType value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-objectType-parameter)"}, + {VALIDATION_ERROR_4381c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-pNext-pNext)"}, + {VALIDATION_ERROR_43825a01, "The spec valid usage text states 'pTag must be a valid pointer to an array of tagSize bytes' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-pTag-parameter)"}, + {VALIDATION_ERROR_4382b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-sType-sType)"}, + {VALIDATION_ERROR_4382f41b, "The spec valid usage text states 'tagSize must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-tagSize-arraylength)"}, + {VALIDATION_ERROR_43a1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsLabelEXT-pNext-pNext)"}, + {VALIDATION_ERROR_43a2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsLabelEXT-sType-sType)"}, + {VALIDATION_ERROR_43a40801, "The spec valid usage text states 'pLabelName must be a null-terminated UTF-8 string' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsLabelEXT-pLabelName-parameter)"}, + {VALIDATION_ERROR_43c09005, "The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-flags-zerobitmask)"}, + {VALIDATION_ERROR_43c0d61b, "The spec valid usage text states 'objectCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-objectCount-arraylength)"}, + {VALIDATION_ERROR_43c1b801, "The spec valid usage text states 'pMessage must be a null-terminated UTF-8 string' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessage-parameter)"}, + {VALIDATION_ERROR_43c1c40d, "The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pNext-pNext)"}, + {VALIDATION_ERROR_43c2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-sType-sType)"}, + {VALIDATION_ERROR_43c42201, "The spec valid usage text states 'If pMessageIdName is not NULL, pMessageIdName must be a null-terminated UTF-8 string' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessageIdName-parameter)"}, + {VALIDATION_ERROR_43e00ef4, "The spec valid usage text states 'pfnUserCallback must be a valid PFN_vkDebugUtilsMessengerCallbackEXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-01914)"}, + {VALIDATION_ERROR_43e09005, "The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-flags-zerobitmask)"}, + {VALIDATION_ERROR_43e2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-sType-sType)"}, + {VALIDATION_ERROR_43e40a01, "The spec valid usage text states 'messageSeverity must be a valid combination of VkDebugUtilsMessageSeverityFlagBitsEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-parameter)"}, + {VALIDATION_ERROR_43e40a03, "The spec valid usage text states 'messageSeverity must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-requiredbitmask)"}, + {VALIDATION_ERROR_43e40c01, "The spec valid usage text states 'messageType must be a valid combination of VkDebugUtilsMessageTypeFlagBitsEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-parameter)"}, + {VALIDATION_ERROR_43e40c03, "The spec valid usage text states 'messageType must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-requiredbitmask)"}, + {VALIDATION_ERROR_4400bc01, "The spec valid usage text states 'instance must be a valid VkInstance handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDebugUtilsMessengerEXT-instance-parameter)"}, + {VALIDATION_ERROR_4400ec01, "The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDebugUtilsMessengerEXT-pAllocator-parameter)"}, + {VALIDATION_ERROR_44011e01, "The spec valid usage text states 'pCreateInfo must be a valid pointer to a valid VkDebugUtilsMessengerCreateInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDebugUtilsMessengerEXT-pCreateInfo-parameter)"}, + {VALIDATION_ERROR_44041001, "The spec valid usage text states 'pMessenger must be a valid pointer to a VkDebugUtilsMessengerEXT handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCreateDebugUtilsMessengerEXT-pMessenger-parameter)"}, + {VALIDATION_ERROR_4420bc01, "The spec valid usage text states 'instance must be a valid VkInstance handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-instance-parameter)"}, + {VALIDATION_ERROR_44240a01, "The spec valid usage text states 'messageSeverity must be a valid VkDebugUtilsMessageSeverityFlagBitsEXT value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-messageSeverity-parameter)"}, + {VALIDATION_ERROR_44241201, "The spec valid usage text states 'messageTypes must be a valid combination of VkDebugUtilsMessageTypeFlagBitsEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-parameter)"}, + {VALIDATION_ERROR_44241203, "The spec valid usage text states 'messageTypes must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-requiredbitmask)"}, + {VALIDATION_ERROR_44242801, "The spec valid usage text states 'pCallbackData must be a valid pointer to a valid VkDebugUtilsMessengerCallbackDataEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-pCallbackData-parameter)"}, {VALIDATION_ERROR_4442b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT-sType-sType)"}, + {VALIDATION_ERROR_4462b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-sType-sType)"}, + {VALIDATION_ERROR_4464141b, "The spec valid usage text states 'vertexBindingDivisorCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-vertexBindingDivisorCount-arraylength)"}, + {VALIDATION_ERROR_44641601, "The spec valid usage text states 'pVertexBindingDivisors must be a valid pointer to an array of vertexBindingDivisorCount VkVertexInputBindingDivisorDescriptionEXT structures' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-pVertexBindingDivisors-parameter)"}, + {VALIDATION_ERROR_44800ecc, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkExternalFormatANDROID-externalFormat-01894)"}, + {VALIDATION_ERROR_4482b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkExternalFormatANDROID-sType-sType)"}, + {VALIDATION_ERROR_44a00eb0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01880)"}, + {VALIDATION_ERROR_44a00eb2, "The spec valid usage text states 'If buffer is not NULL, it must be a valid Android hardware buffer object with format and usage compatible with Vulkan as described by VkExternalMemoryHandleTypeFlagBits.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881)"}, + {VALIDATION_ERROR_44a01a01, "The spec valid usage text states 'buffer must be a valid pointer to a AHardwareBuffer value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-parameter)"}, + {VALIDATION_ERROR_44a2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImportAndroidHardwareBufferInfoANDROID-sType-sType)"}, + {VALIDATION_ERROR_44c00eb4, "The spec valid usage text states 'VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID must have been included in VkExportMemoryAllocateInfoKHR::handleTypes when memory was created.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-handleTypes-01882)"}, + {VALIDATION_ERROR_44c00eb6, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-01883)"}, + {VALIDATION_ERROR_44e00ef0, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01912)"}, + {VALIDATION_ERROR_44e00ef2, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01913)"}, + {VALIDATION_ERROR_44e02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-parameter)"}, + {VALIDATION_ERROR_44e02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-recording)"}, + {VALIDATION_ERROR_44e02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-cmdpool)"}, + {VALIDATION_ERROR_45000ef6, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01915)"}, + {VALIDATION_ERROR_45000ef8, "The spec valid usage text states 'If no VkAllocationCallbacks were provided when messenger was created, pAllocator must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01916)"}, + {VALIDATION_ERROR_4500bc01, "The spec valid usage text states 'instance must be a valid VkInstance handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-instance-parameter)"}, + {VALIDATION_ERROR_4500ec01, "The spec valid usage text states 'If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-pAllocator-parameter)"}, + {VALIDATION_ERROR_45042601, "The spec valid usage text states 'messenger must be a valid VkDebugUtilsMessengerEXT handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parameter)"}, + {VALIDATION_ERROR_45042607, "The spec valid usage text states 'messenger must have been created, allocated, or retrieved from instance' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent)"}, + {VALIDATION_ERROR_45200eb8, "The spec valid usage text states 'buffer must be a valid Android hardware buffer object with at least one of the AHARDWAREBUFFER_USAGE_GPU_* usage flags.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-01884)"}, + {VALIDATION_ERROR_45201a01, "The spec valid usage text states 'buffer must be a valid pointer to a valid AHardwareBuffer value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-parameter)"}, + {VALIDATION_ERROR_45205601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetAndroidHardwareBufferPropertiesANDROID-device-parameter)"}, + {VALIDATION_ERROR_4521f401, "The spec valid usage text states 'pProperties must be a valid pointer to a VkAndroidHardwareBufferPropertiesANDROID structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetAndroidHardwareBufferPropertiesANDROID-pProperties-parameter)"}, + {VALIDATION_ERROR_45400eee, "The spec valid usage text states 'There must be an outstanding vkQueueBeginDebugUtilsLabelEXT command prior to the vkQueueEndDebugUtilsLabelEXT on the queue' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkQueueEndDebugUtilsLabelEXT-None-01911)"}, + {VALIDATION_ERROR_45429c01, "The spec valid usage text states 'queue must be a valid VkQueue handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkQueueEndDebugUtilsLabelEXT-queue-parameter)"}, + {VALIDATION_ERROR_4562b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAndroidHardwareBufferUsageANDROID-sType-sType)"}, + {VALIDATION_ERROR_45a05601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryAndroidHardwareBufferANDROID-device-parameter)"}, + {VALIDATION_ERROR_45a10001, "The spec valid usage text states 'pBuffer must be a valid pointer to a valid pointer to a AHardwareBuffer value' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryAndroidHardwareBufferANDROID-pBuffer-parameter)"}, + {VALIDATION_ERROR_45a39c01, "The spec valid usage text states 'pInfo must be a valid pointer to a valid VkMemoryGetAndroidHardwareBufferInfoANDROID structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkGetMemoryAndroidHardwareBufferANDROID-pInfo-parameter)"}, + {VALIDATION_ERROR_45c2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkAndroidHardwareBufferFormatPropertiesANDROID-sType-sType)"}, + {VALIDATION_ERROR_45e02401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-parameter)"}, + {VALIDATION_ERROR_45e02413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-recording)"}, + {VALIDATION_ERROR_45e02415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-cmdpool)"}, + {VALIDATION_ERROR_45e42401, "The spec valid usage text states 'pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBeginDebugUtilsLabelEXT-pLabelInfo-parameter)"}, + {VALIDATION_ERROR_46002401, "The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-parameter)"}, + {VALIDATION_ERROR_46002413, "The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-recording)"}, + {VALIDATION_ERROR_46002415, "The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-cmdpool)"}, + {VALIDATION_ERROR_46042401, "The spec valid usage text states 'pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdInsertDebugUtilsLabelEXT-pLabelInfo-parameter)"}, + {VALIDATION_ERROR_46229c01, "The spec valid usage text states 'queue must be a valid VkQueue handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkQueueBeginDebugUtilsLabelEXT-queue-parameter)"}, + {VALIDATION_ERROR_46242401, "The spec valid usage text states 'pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkQueueBeginDebugUtilsLabelEXT-pLabelInfo-parameter)"}, + {VALIDATION_ERROR_46429c01, "The spec valid usage text states 'queue must be a valid VkQueue handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkQueueInsertDebugUtilsLabelEXT-queue-parameter)"}, + {VALIDATION_ERROR_46442401, "The spec valid usage text states 'pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkQueueInsertDebugUtilsLabelEXT-pLabelInfo-parameter)"}, + {VALIDATION_ERROR_46605601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectNameEXT-device-parameter)"}, + {VALIDATION_ERROR_4661c201, "The spec valid usage text states 'pNameInfo must be a valid pointer to a valid VkDebugUtilsObjectNameInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-parameter)"}, + {VALIDATION_ERROR_46805601, "The spec valid usage text states 'device must be a valid VkDevice handle' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectTagEXT-device-parameter)"}, + {VALIDATION_ERROR_46825c01, "The spec valid usage text states 'pTagInfo must be a valid pointer to a valid VkDebugUtilsObjectTagInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectTagEXT-pTagInfo-parameter)"}, + {VALIDATION_ERROR_46a01774, "The spec valid usage text states 'If bindingCount is not zero, bindingCount must equal VkDescriptorSetLayoutCreateInfo::bindingCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-bindingCount-03002)"}, + {VALIDATION_ERROR_46a01776, "The spec valid usage text states '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_EXT, VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT, or VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-flags-03003)"}, + {VALIDATION_ERROR_46a01778, "The spec valid usage text states 'If an element of pBindingFlags includes VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT, then all other elements of VkDescriptorSetLayoutCreateInfo::pBindings must have a smaller value of binding' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-03004)"}, + {VALIDATION_ERROR_46a0177a, "The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingUniformBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUniformBufferUpdateAfterBind-03005)"}, + {VALIDATION_ERROR_46a0177c, "The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::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_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingSampledImageUpdateAfterBind-03006)"}, + {VALIDATION_ERROR_46a0177e, "The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingStorageImageUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_STORAGE_IMAGE must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageImageUpdateAfterBind-03007)"}, + {VALIDATION_ERROR_46a01780, "The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingStorageBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageBufferUpdateAfterBind-03008)"}, + {VALIDATION_ERROR_46a01782, "The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::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_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUniformTexelBufferUpdateAfterBind-03009)"}, + {VALIDATION_ERROR_46a01784, "The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::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_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageTexelBufferUpdateAfterBind-03010)"}, + {VALIDATION_ERROR_46a01786, "The spec valid usage text states '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_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-None-03011)"}, + {VALIDATION_ERROR_46a01788, "The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingUpdateUnusedWhilePending is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUpdateUnusedWhilePending-03012)"}, + {VALIDATION_ERROR_46a0178a, "The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingPartiallyBound is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingPartiallyBound-03013)"}, + {VALIDATION_ERROR_46a0178c, "The spec valid usage text states 'If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingVariableDescriptorCount is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingVariableDescriptorCount-03014)"}, + {VALIDATION_ERROR_46a0178e, "The spec valid usage text states 'If an element of pBindingFlags includes VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT, 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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-03015)"}, + {VALIDATION_ERROR_46a2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-sType-sType)"}, + {VALIDATION_ERROR_46a42a01, "The spec valid usage text states 'If bindingCount is not 0, pBindingFlags must be a valid pointer to an array of bindingCount valid combinations of VkDescriptorBindingFlagBitsEXT values' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-parameter)"}, + {VALIDATION_ERROR_46a42a03, "The spec valid usage text states 'Each element of pBindingFlags must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-requiredbitmask)"}, + {VALIDATION_ERROR_46c017ca, "The spec valid usage text states 'If descriptorSetCount is not zero, descriptorSetCount must equal VkDescriptorSetAllocateInfo::descriptorSetCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-descriptorSetCount-03045)"}, + {VALIDATION_ERROR_46c017cc, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-pSetLayouts-03046)"}, + {VALIDATION_ERROR_46c2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-sType-sType)"}, + {VALIDATION_ERROR_46c42c01, "The spec valid usage text states '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.0-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-pDescriptorCounts-parameter)"}, + {VALIDATION_ERROR_46e2b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountLayoutSupportEXT-sType-sType)"}, + {VALIDATION_ERROR_4702b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDescriptorIndexingFeaturesEXT-sType-sType)"}, + {VALIDATION_ERROR_4722b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDescriptorIndexingPropertiesEXT-sType-sType)"}, + {VALIDATION_ERROR_4742b00b, "The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderCorePropertiesAMD-sType-sType)"}, + {VALIDATION_ERROR_47600e9a, "The spec valid usage text states 'binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkVertexInputBindingDivisorDescriptionEXT-binding-01869)"}, + {VALIDATION_ERROR_47600e9c, "The spec valid usage text states 'divisor must be a value between 0 and VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::maxVertexAttribDivisor, inclusive.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkVertexInputBindingDivisorDescriptionEXT-divisor-01870)"}, + {VALIDATION_ERROR_47600e9e, "The spec valid usage text states 'VkVertexInputBindingDescription::inputRate must be of type VK_VERTEX_INPUT_RATE_INSTANCE for this binding.' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkVertexInputBindingDivisorDescriptionEXT-inputRate-01871)"}, +}; + + +// Mapping from spec validation error text string to unique validation error enum +static std::unordered_map validation_error_text_map{ + {"VUID-VkAcquireNextImageInfoKHR-commonparent", VALIDATION_ERROR_00000009}, + {"VUID-VkAcquireNextImageInfoKHR-semaphore-01288", VALIDATION_ERROR_00000a10}, + {"VUID-VkAcquireNextImageInfoKHR-fence-01289", VALIDATION_ERROR_00000a12}, + {"VUID-VkAcquireNextImageInfoKHR-deviceMask-01290", VALIDATION_ERROR_00000a14}, + {"VUID-VkAcquireNextImageInfoKHR-deviceMask-01291", VALIDATION_ERROR_00000a16}, + {"VUID-VkAcquireNextImageInfoKHR-swapchain-01675", VALIDATION_ERROR_00000d16}, + {"VUID-VkAcquireNextImageInfoKHR-semaphore-01781", VALIDATION_ERROR_00000dea}, + {"VUID-VkAcquireNextImageInfoKHR-semaphore-01782", VALIDATION_ERROR_00000dec}, + {"VUID-VkAcquireNextImageInfoKHR-semaphore-01804", VALIDATION_ERROR_00000e18}, + {"VUID-VkAcquireNextImageInfoKHR-fence-parameter", VALIDATION_ERROR_00008801}, + {"VUID-VkAcquireNextImageInfoKHR-pNext-pNext", VALIDATION_ERROR_0001c40d}, + {"VUID-VkAcquireNextImageInfoKHR-sType-sType", VALIDATION_ERROR_0002b00b}, + {"VUID-VkAcquireNextImageInfoKHR-semaphore-parameter", VALIDATION_ERROR_0002b801}, + {"VUID-VkAcquireNextImageInfoKHR-swapchain-parameter", VALIDATION_ERROR_0002f001}, + {"VUID-VkAllocationCallbacks-pfnAllocation-00632", VALIDATION_ERROR_002004f0}, + {"VUID-VkAllocationCallbacks-pfnReallocation-00633", VALIDATION_ERROR_002004f2}, + {"VUID-VkAllocationCallbacks-pfnFree-00634", VALIDATION_ERROR_002004f4}, + {"VUID-VkAllocationCallbacks-pfnInternalAllocation-00635", VALIDATION_ERROR_002004f6}, + {"VUID-VkAndroidSurfaceCreateInfoKHR-window-01248", VALIDATION_ERROR_004009c0}, + {"VUID-VkAndroidSurfaceCreateInfoKHR-flags-zerobitmask", VALIDATION_ERROR_00409005}, + {"VUID-VkAndroidSurfaceCreateInfoKHR-pNext-pNext", VALIDATION_ERROR_0041c40d}, + {"VUID-VkAndroidSurfaceCreateInfoKHR-sType-sType", VALIDATION_ERROR_0042b00b}, + {"VUID-VkApplicationInfo-pApplicationName-parameter", VALIDATION_ERROR_0060f001}, + {"VUID-VkApplicationInfo-pEngineName-parameter", VALIDATION_ERROR_00615c01}, + {"VUID-VkApplicationInfo-pNext-pNext", VALIDATION_ERROR_0061c40d}, + {"VUID-VkApplicationInfo-sType-sType", VALIDATION_ERROR_0062b00b}, + {"VUID-VkAttachmentDescription-finalLayout-00843", VALIDATION_ERROR_00800696}, + {"VUID-VkAttachmentDescription-finalLayout-parameter", VALIDATION_ERROR_00808e01}, + {"VUID-VkAttachmentDescription-flags-parameter", VALIDATION_ERROR_00809001}, + {"VUID-VkAttachmentDescription-format-parameter", VALIDATION_ERROR_00809201}, + {"VUID-VkAttachmentDescription-initialLayout-parameter", VALIDATION_ERROR_0080b801}, + {"VUID-VkAttachmentDescription-loadOp-parameter", VALIDATION_ERROR_0080c201}, + {"VUID-VkAttachmentDescription-samples-parameter", VALIDATION_ERROR_0082b401}, + {"VUID-VkAttachmentDescription-stencilLoadOp-parameter", VALIDATION_ERROR_0082e001}, + {"VUID-VkAttachmentDescription-stencilStoreOp-parameter", VALIDATION_ERROR_0082e201}, + {"VUID-VkAttachmentDescription-storeOp-parameter", VALIDATION_ERROR_0082e401}, + {"VUID-VkAttachmentReference-layout-00857", VALIDATION_ERROR_00a006b2}, + {"VUID-VkAttachmentReference-layout-parameter", VALIDATION_ERROR_00a0be01}, + {"VUID-VkBindBufferMemoryInfo-commonparent", VALIDATION_ERROR_00c00009}, + {"VUID-VkBindBufferMemoryInfo-buffer-01593", VALIDATION_ERROR_00c00c72}, + {"VUID-VkBindBufferMemoryInfo-buffer-01594", VALIDATION_ERROR_00c00c74}, + {"VUID-VkBindBufferMemoryInfo-memoryOffset-01595", VALIDATION_ERROR_00c00c76}, + {"VUID-VkBindBufferMemoryInfo-buffer-01596", VALIDATION_ERROR_00c00c78}, + {"VUID-VkBindBufferMemoryInfo-buffer-01597", VALIDATION_ERROR_00c00c7a}, + {"VUID-VkBindBufferMemoryInfo-buffer-01598", VALIDATION_ERROR_00c00c7c}, + {"VUID-VkBindBufferMemoryInfo-memory-01599", VALIDATION_ERROR_00c00c7e}, + {"VUID-VkBindBufferMemoryInfo-memoryOffset-01600", VALIDATION_ERROR_00c00c80}, + {"VUID-VkBindBufferMemoryInfo-size-01601", VALIDATION_ERROR_00c00c82}, + {"VUID-VkBindBufferMemoryInfo-buffer-01602", VALIDATION_ERROR_00c00c84}, + {"VUID-VkBindBufferMemoryInfo-buffer-01603", VALIDATION_ERROR_00c00c86}, + {"VUID-VkBindBufferMemoryInfo-buffer-01604", VALIDATION_ERROR_00c00c88}, + {"VUID-VkBindBufferMemoryInfo-pNext-01605", VALIDATION_ERROR_00c00c8a}, + {"VUID-VkBindBufferMemoryInfo-memory-01900", VALIDATION_ERROR_00c00ed8}, + {"VUID-VkBindBufferMemoryInfo-buffer-parameter", VALIDATION_ERROR_00c01a01}, + {"VUID-VkBindBufferMemoryInfo-memory-parameter", VALIDATION_ERROR_00c0c601}, + {"VUID-VkBindBufferMemoryInfo-pNext-pNext", VALIDATION_ERROR_00c1c40d}, + {"VUID-VkBindBufferMemoryInfo-sType-sType", VALIDATION_ERROR_00c2b00b}, + {"VUID-VkBindImageMemoryInfo-commonparent", VALIDATION_ERROR_00e00009}, + {"VUID-VkBindImageMemoryInfo-image-01609", VALIDATION_ERROR_00e00c92}, + {"VUID-VkBindImageMemoryInfo-image-01610", VALIDATION_ERROR_00e00c94}, + {"VUID-VkBindImageMemoryInfo-memoryOffset-01611", VALIDATION_ERROR_00e00c96}, + {"VUID-VkBindImageMemoryInfo-memory-01612", VALIDATION_ERROR_00e00c98}, + {"VUID-VkBindImageMemoryInfo-memoryOffset-01613", VALIDATION_ERROR_00e00c9a}, + {"VUID-VkBindImageMemoryInfo-memory-01614", VALIDATION_ERROR_00e00c9c}, + {"VUID-VkBindImageMemoryInfo-pNext-01615", VALIDATION_ERROR_00e00c9e}, + {"VUID-VkBindImageMemoryInfo-pNext-01616", VALIDATION_ERROR_00e00ca0}, + {"VUID-VkBindImageMemoryInfo-pNext-01617", VALIDATION_ERROR_00e00ca2}, + {"VUID-VkBindImageMemoryInfo-pNext-01618", VALIDATION_ERROR_00e00ca4}, + {"VUID-VkBindImageMemoryInfo-pNext-01619", VALIDATION_ERROR_00e00ca6}, + {"VUID-VkBindImageMemoryInfo-pNext-01620", VALIDATION_ERROR_00e00ca8}, + {"VUID-VkBindImageMemoryInfo-pNext-01621", VALIDATION_ERROR_00e00caa}, + {"VUID-VkBindImageMemoryInfo-image-01622", VALIDATION_ERROR_00e00cac}, + {"VUID-VkBindImageMemoryInfo-image-01623", VALIDATION_ERROR_00e00cae}, + {"VUID-VkBindImageMemoryInfo-image-01624", VALIDATION_ERROR_00e00cb0}, + {"VUID-VkBindImageMemoryInfo-memory-01625", VALIDATION_ERROR_00e00cb2}, + {"VUID-VkBindImageMemoryInfo-pNext-01626", VALIDATION_ERROR_00e00cb4}, + {"VUID-VkBindImageMemoryInfo-pNext-01627", VALIDATION_ERROR_00e00cb6}, + {"VUID-VkBindImageMemoryInfo-pNext-01628", VALIDATION_ERROR_00e00cb8}, + {"VUID-VkBindImageMemoryInfo-pNext-01629", VALIDATION_ERROR_00e00cba}, + {"VUID-VkBindImageMemoryInfo-image-01630", VALIDATION_ERROR_00e00cbc}, + {"VUID-VkBindImageMemoryInfo-pNext-01631", VALIDATION_ERROR_00e00cbe}, + {"VUID-VkBindImageMemoryInfo-pNext-01632", VALIDATION_ERROR_00e00cc0}, + {"VUID-VkBindImageMemoryInfo-memory-01903", VALIDATION_ERROR_00e00ede}, + {"VUID-VkBindImageMemoryInfo-image-parameter", VALIDATION_ERROR_00e0a001}, + {"VUID-VkBindImageMemoryInfo-pNext-pNext", VALIDATION_ERROR_00e1c40d}, + {"VUID-VkBindImageMemoryInfo-sType-sType", VALIDATION_ERROR_00e2b00b}, + {"VUID-VkBindImageMemoryInfo-sType-unique", VALIDATION_ERROR_00e2b00f}, + {"VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644", VALIDATION_ERROR_01000cd8}, + {"VUID-VkBindImageMemorySwapchainInfoKHR-sType-sType", VALIDATION_ERROR_0102b00b}, + {"VUID-VkBindImageMemorySwapchainInfoKHR-swapchain-parameter", VALIDATION_ERROR_0102f001}, + {"VUID-VkBindSparseInfo-commonparent", VALIDATION_ERROR_01200009}, + {"VUID-VkBindSparseInfo-pBufferBinds-parameter", VALIDATION_ERROR_01210201}, + {"VUID-VkBindSparseInfo-pImageBinds-parameter", VALIDATION_ERROR_01218001}, + {"VUID-VkBindSparseInfo-pImageOpaqueBinds-parameter", VALIDATION_ERROR_01218c01}, + {"VUID-VkBindSparseInfo-pNext-pNext", VALIDATION_ERROR_0121c40d}, + {"VUID-VkBindSparseInfo-pSignalSemaphores-parameter", VALIDATION_ERROR_01223401}, + {"VUID-VkBindSparseInfo-pWaitSemaphores-parameter", VALIDATION_ERROR_01227601}, + {"VUID-VkBindSparseInfo-sType-sType", VALIDATION_ERROR_0122b00b}, + {"VUID-VkBufferCreateInfo-size-00912", VALIDATION_ERROR_01400720}, + {"VUID-VkBufferCreateInfo-sharingMode-00913", VALIDATION_ERROR_01400722}, + {"VUID-VkBufferCreateInfo-sharingMode-00914", VALIDATION_ERROR_01400724}, + {"VUID-VkBufferCreateInfo-flags-00915", VALIDATION_ERROR_01400726}, + {"VUID-VkBufferCreateInfo-flags-00916", VALIDATION_ERROR_01400728}, + {"VUID-VkBufferCreateInfo-flags-00917", VALIDATION_ERROR_0140072a}, + {"VUID-VkBufferCreateInfo-flags-00918", VALIDATION_ERROR_0140072c}, + {"VUID-VkBufferCreateInfo-pNext-00920", VALIDATION_ERROR_01400730}, + {"VUID-VkBufferCreateInfo-sharingMode-01391", VALIDATION_ERROR_01400ade}, + {"VUID-VkBufferCreateInfo-sharingMode-01419", VALIDATION_ERROR_01400b16}, + {"VUID-VkBufferCreateInfo-pNext-01571", VALIDATION_ERROR_01400c46}, + {"VUID-VkBufferCreateInfo-flags-01887", VALIDATION_ERROR_01400ebe}, + {"VUID-VkBufferCreateInfo-None-01888", VALIDATION_ERROR_01400ec0}, + {"VUID-VkBufferCreateInfo-flags-parameter", VALIDATION_ERROR_01409001}, + {"VUID-VkBufferCreateInfo-pNext-pNext", VALIDATION_ERROR_0141c40d}, + {"VUID-VkBufferCreateInfo-sType-sType", VALIDATION_ERROR_0142b00b}, + {"VUID-VkBufferCreateInfo-sType-unique", VALIDATION_ERROR_0142b00f}, + {"VUID-VkBufferCreateInfo-sharingMode-parameter", VALIDATION_ERROR_0142c001}, + {"VUID-VkBufferCreateInfo-usage-parameter", VALIDATION_ERROR_01430601}, + {"VUID-VkBufferCreateInfo-usage-requiredbitmask", VALIDATION_ERROR_01430603}, + {"VUID-VkBufferImageCopy-bufferOffset-00193", VALIDATION_ERROR_01600182}, + {"VUID-VkBufferImageCopy-bufferOffset-00194", VALIDATION_ERROR_01600184}, + {"VUID-VkBufferImageCopy-bufferRowLength-00195", VALIDATION_ERROR_01600186}, + {"VUID-VkBufferImageCopy-bufferImageHeight-00196", VALIDATION_ERROR_01600188}, + {"VUID-VkBufferImageCopy-imageOffset-00197", VALIDATION_ERROR_0160018a}, + {"VUID-VkBufferImageCopy-imageOffset-00198", VALIDATION_ERROR_0160018c}, + {"VUID-VkBufferImageCopy-srcImage-00199", VALIDATION_ERROR_0160018e}, + {"VUID-VkBufferImageCopy-imageOffset-00200", VALIDATION_ERROR_01600190}, + {"VUID-VkBufferImageCopy-srcImage-00201", VALIDATION_ERROR_01600192}, + {"VUID-VkBufferImageCopy-bufferRowLength-00203", VALIDATION_ERROR_01600196}, + {"VUID-VkBufferImageCopy-bufferImageHeight-00204", VALIDATION_ERROR_01600198}, + {"VUID-VkBufferImageCopy-imageOffset-00205", VALIDATION_ERROR_0160019a}, + {"VUID-VkBufferImageCopy-bufferOffset-00206", VALIDATION_ERROR_0160019c}, + {"VUID-VkBufferImageCopy-imageExtent-00207", VALIDATION_ERROR_0160019e}, + {"VUID-VkBufferImageCopy-imageExtent-00208", VALIDATION_ERROR_016001a0}, + {"VUID-VkBufferImageCopy-imageExtent-00209", VALIDATION_ERROR_016001a2}, + {"VUID-VkBufferImageCopy-aspectMask-00211", VALIDATION_ERROR_016001a6}, + {"VUID-VkBufferImageCopy-aspectMask-00212", VALIDATION_ERROR_016001a8}, + {"VUID-VkBufferImageCopy-baseArrayLayer-00213", VALIDATION_ERROR_016001aa}, + {"VUID-VkBufferImageCopy-None-00214", VALIDATION_ERROR_016001ac}, + {"VUID-VkBufferImageCopy-bufferOffset-01558", VALIDATION_ERROR_01600c2c}, + {"VUID-VkBufferImageCopy-bufferOffset-01559", VALIDATION_ERROR_01600c2e}, + {"VUID-VkBufferImageCopy-aspectMask-01560", VALIDATION_ERROR_01600c30}, + {"VUID-VkBufferImageCopy-None-01735", VALIDATION_ERROR_01600d8e}, + {"VUID-VkBufferImageCopy-None-01736", VALIDATION_ERROR_01600d90}, + {"VUID-VkBufferImageCopy-None-01737", VALIDATION_ERROR_01600d92}, + {"VUID-VkBufferImageCopy-None-01738", VALIDATION_ERROR_01600d94}, + {"VUID-VkBufferImageCopy-None-01739", VALIDATION_ERROR_01600d96}, + {"VUID-VkBufferImageCopy-None-01740", VALIDATION_ERROR_01600d98}, + {"VUID-VkBufferImageCopy-None-01741", VALIDATION_ERROR_01600d9a}, + {"VUID-VkBufferImageCopy-imageSubresource-parameter", VALIDATION_ERROR_0160aa01}, + {"VUID-VkBufferMemoryBarrier-offset-01187", VALIDATION_ERROR_01800946}, + {"VUID-VkBufferMemoryBarrier-size-01188", VALIDATION_ERROR_01800948}, + {"VUID-VkBufferMemoryBarrier-size-01189", VALIDATION_ERROR_0180094a}, + {"VUID-VkBufferMemoryBarrier-buffer-01190", VALIDATION_ERROR_0180094c}, + {"VUID-VkBufferMemoryBarrier-buffer-01191", VALIDATION_ERROR_0180094e}, + {"VUID-VkBufferMemoryBarrier-buffer-01192", VALIDATION_ERROR_01800950}, + {"VUID-VkBufferMemoryBarrier-buffer-01193", VALIDATION_ERROR_01800952}, + {"VUID-VkBufferMemoryBarrier-buffer-01196", VALIDATION_ERROR_01800958}, + {"VUID-VkBufferMemoryBarrier-buffer-01763", VALIDATION_ERROR_01800dc6}, + {"VUID-VkBufferMemoryBarrier-buffer-01764", VALIDATION_ERROR_01800dc8}, + {"VUID-VkBufferMemoryBarrier-buffer-01765", VALIDATION_ERROR_01800dca}, + {"VUID-VkBufferMemoryBarrier-buffer-01931", VALIDATION_ERROR_01800f16}, + {"VUID-VkBufferMemoryBarrier-buffer-parameter", VALIDATION_ERROR_01801a01}, + {"VUID-VkBufferMemoryBarrier-dstAccessMask-parameter", VALIDATION_ERROR_01806801}, + {"VUID-VkBufferMemoryBarrier-pNext-pNext", VALIDATION_ERROR_0181c40d}, + {"VUID-VkBufferMemoryBarrier-sType-sType", VALIDATION_ERROR_0182b00b}, + {"VUID-VkBufferMemoryBarrier-srcAccessMask-parameter", VALIDATION_ERROR_0182c401}, + {"VUID-VkBufferViewCreateInfo-offset-00925", VALIDATION_ERROR_01a0073a}, + {"VUID-VkBufferViewCreateInfo-offset-00926", VALIDATION_ERROR_01a0073c}, + {"VUID-VkBufferViewCreateInfo-range-00928", VALIDATION_ERROR_01a00740}, + {"VUID-VkBufferViewCreateInfo-range-00929", VALIDATION_ERROR_01a00742}, + {"VUID-VkBufferViewCreateInfo-range-00930", VALIDATION_ERROR_01a00744}, + {"VUID-VkBufferViewCreateInfo-offset-00931", VALIDATION_ERROR_01a00746}, + {"VUID-VkBufferViewCreateInfo-buffer-00932", VALIDATION_ERROR_01a00748}, + {"VUID-VkBufferViewCreateInfo-buffer-00933", VALIDATION_ERROR_01a0074a}, + {"VUID-VkBufferViewCreateInfo-buffer-00934", VALIDATION_ERROR_01a0074c}, + {"VUID-VkBufferViewCreateInfo-buffer-00935", VALIDATION_ERROR_01a0074e}, + {"VUID-VkBufferViewCreateInfo-buffer-parameter", VALIDATION_ERROR_01a01a01}, + {"VUID-VkBufferViewCreateInfo-flags-zerobitmask", VALIDATION_ERROR_01a09005}, + {"VUID-VkBufferViewCreateInfo-format-parameter", VALIDATION_ERROR_01a09201}, + {"VUID-VkBufferViewCreateInfo-pNext-pNext", VALIDATION_ERROR_01a1c40d}, + {"VUID-VkBufferViewCreateInfo-sType-sType", VALIDATION_ERROR_01a2b00b}, + {"VUID-VkClearAttachment-aspectMask-00019", VALIDATION_ERROR_01c00026}, + {"VUID-VkClearAttachment-aspectMask-00020", VALIDATION_ERROR_01c00028}, + {"VUID-VkClearAttachment-clearValue-00021", VALIDATION_ERROR_01c0002a}, + {"VUID-VkClearAttachment-aspectMask-parameter", VALIDATION_ERROR_01c00c01}, + {"VUID-VkClearAttachment-aspectMask-requiredbitmask", VALIDATION_ERROR_01c00c03}, + {"VUID-VkClearAttachment-commandBuffer-01809", VALIDATION_ERROR_01c00e22}, + {"VUID-VkClearAttachment-commandBuffer-01810", VALIDATION_ERROR_01c00e24}, + {"VUID-VkClearDepthStencilValue-depth-00022", VALIDATION_ERROR_01e0002c}, + {"VUID-VkClearValue-depthStencil-00023", VALIDATION_ERROR_0200002e}, + {"VUID-VkCmdProcessCommandsInfoNVX-commonparent", VALIDATION_ERROR_02200009}, + {"VUID-VkCmdProcessCommandsInfoNVX-objectTable-01331", VALIDATION_ERROR_02200a66}, + {"VUID-VkCmdProcessCommandsInfoNVX-indirectCommandsTokenCount-01332", VALIDATION_ERROR_02200a68}, + {"VUID-VkCmdProcessCommandsInfoNVX-tokenType-01333", VALIDATION_ERROR_02200a6a}, + {"VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-01334", VALIDATION_ERROR_02200a6c}, + {"VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-01335", VALIDATION_ERROR_02200a6e}, + {"VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-01336", VALIDATION_ERROR_02200a70}, + {"VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-01337", VALIDATION_ERROR_02200a72}, + {"VUID-VkCmdProcessCommandsInfoNVX-sequencesCountBuffer-01338", VALIDATION_ERROR_02200a74}, + {"VUID-VkCmdProcessCommandsInfoNVX-sequencesCountBuffer-01339", VALIDATION_ERROR_02200a76}, + {"VUID-VkCmdProcessCommandsInfoNVX-sequencesIndexBuffer-01340", VALIDATION_ERROR_02200a78}, + {"VUID-VkCmdProcessCommandsInfoNVX-sequencesIndexBuffer-01341", VALIDATION_ERROR_02200a7a}, + {"VUID-VkCmdProcessCommandsInfoNVX-indirectCommandsLayout-parameter", VALIDATION_ERROR_0220b401}, + {"VUID-VkCmdProcessCommandsInfoNVX-indirectCommandsTokenCount-arraylength", VALIDATION_ERROR_0220b61b}, + {"VUID-VkCmdProcessCommandsInfoNVX-objectTable-parameter", VALIDATION_ERROR_0220d801}, + {"VUID-VkCmdProcessCommandsInfoNVX-pIndirectCommandsTokens-parameter", VALIDATION_ERROR_02219401}, + {"VUID-VkCmdProcessCommandsInfoNVX-pNext-pNext", VALIDATION_ERROR_0221c40d}, + {"VUID-VkCmdProcessCommandsInfoNVX-sType-sType", VALIDATION_ERROR_0222b00b}, + {"VUID-VkCmdProcessCommandsInfoNVX-sequencesCountBuffer-parameter", VALIDATION_ERROR_0222ba01}, + {"VUID-VkCmdProcessCommandsInfoNVX-sequencesIndexBuffer-parameter", VALIDATION_ERROR_0222bc01}, + {"VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-parameter", VALIDATION_ERROR_0222f601}, + {"VUID-VkCmdReserveSpaceForCommandsInfoNVX-commonparent", VALIDATION_ERROR_02400009}, + {"VUID-VkCmdReserveSpaceForCommandsInfoNVX-indirectCommandsLayout-parameter", VALIDATION_ERROR_0240b401}, + {"VUID-VkCmdReserveSpaceForCommandsInfoNVX-objectTable-parameter", VALIDATION_ERROR_0240d801}, + {"VUID-VkCmdReserveSpaceForCommandsInfoNVX-pNext-pNext", VALIDATION_ERROR_0241c40d}, + {"VUID-VkCmdReserveSpaceForCommandsInfoNVX-sType-sType", VALIDATION_ERROR_0242b00b}, + {"VUID-VkCommandBufferAllocateInfo-commandBufferCount-00044", VALIDATION_ERROR_02600058}, + {"VUID-VkCommandBufferAllocateInfo-commandPool-parameter", VALIDATION_ERROR_02602801}, + {"VUID-VkCommandBufferAllocateInfo-level-parameter", VALIDATION_ERROR_0260c001}, + {"VUID-VkCommandBufferAllocateInfo-pNext-pNext", VALIDATION_ERROR_0261c40d}, + {"VUID-VkCommandBufferAllocateInfo-sType-sType", VALIDATION_ERROR_0262b00b}, + {"VUID-VkCommandBufferBeginInfo-flags-00053", VALIDATION_ERROR_0280006a}, + {"VUID-VkCommandBufferBeginInfo-flags-00054", VALIDATION_ERROR_0280006c}, + {"VUID-VkCommandBufferBeginInfo-flags-00055", VALIDATION_ERROR_0280006e}, + {"VUID-VkCommandBufferBeginInfo-flags-parameter", VALIDATION_ERROR_02809001}, + {"VUID-VkCommandBufferBeginInfo-pNext-pNext", VALIDATION_ERROR_0281c40d}, + {"VUID-VkCommandBufferBeginInfo-sType-sType", VALIDATION_ERROR_0282b00b}, + {"VUID-VkCommandBufferInheritanceInfo-commonparent", VALIDATION_ERROR_02a00009}, + {"VUID-VkCommandBufferInheritanceInfo-occlusionQueryEnable-00056", VALIDATION_ERROR_02a00070}, + {"VUID-VkCommandBufferInheritanceInfo-queryFlags-00057", VALIDATION_ERROR_02a00072}, + {"VUID-VkCommandBufferInheritanceInfo-pipelineStatistics-00058", VALIDATION_ERROR_02a00074}, + {"VUID-VkCommandBufferInheritanceInfo-pNext-pNext", VALIDATION_ERROR_02a1c40d}, + {"VUID-VkCommandBufferInheritanceInfo-sType-sType", VALIDATION_ERROR_02a2b00b}, + {"VUID-VkCommandPoolCreateInfo-queueFamilyIndex-00039", VALIDATION_ERROR_02c0004e}, + {"VUID-VkCommandPoolCreateInfo-flags-parameter", VALIDATION_ERROR_02c09001}, + {"VUID-VkCommandPoolCreateInfo-pNext-pNext", VALIDATION_ERROR_02c1c40d}, + {"VUID-VkCommandPoolCreateInfo-sType-sType", VALIDATION_ERROR_02c2b00b}, + {"VUID-VkComponentMapping-a-parameter", VALIDATION_ERROR_02e00001}, + {"VUID-VkComponentMapping-b-parameter", VALIDATION_ERROR_02e01001}, + {"VUID-VkComponentMapping-g-parameter", VALIDATION_ERROR_02e09a01}, + {"VUID-VkComponentMapping-r-parameter", VALIDATION_ERROR_02e2a201}, + {"VUID-VkComputePipelineCreateInfo-commonparent", VALIDATION_ERROR_03000009}, + {"VUID-VkComputePipelineCreateInfo-flags-00697", VALIDATION_ERROR_03000572}, + {"VUID-VkComputePipelineCreateInfo-flags-00698", VALIDATION_ERROR_03000574}, + {"VUID-VkComputePipelineCreateInfo-flags-00699", VALIDATION_ERROR_03000576}, + {"VUID-VkComputePipelineCreateInfo-flags-00700", VALIDATION_ERROR_03000578}, + {"VUID-VkComputePipelineCreateInfo-stage-00701", VALIDATION_ERROR_0300057a}, + {"VUID-VkComputePipelineCreateInfo-stage-00702", VALIDATION_ERROR_0300057c}, + {"VUID-VkComputePipelineCreateInfo-layout-00703", VALIDATION_ERROR_0300057e}, + {"VUID-VkComputePipelineCreateInfo-layout-01687", VALIDATION_ERROR_03000d2e}, + {"VUID-VkComputePipelineCreateInfo-flags-parameter", VALIDATION_ERROR_03009001}, + {"VUID-VkComputePipelineCreateInfo-layout-parameter", VALIDATION_ERROR_0300be01}, + {"VUID-VkComputePipelineCreateInfo-pNext-pNext", VALIDATION_ERROR_0301c40d}, + {"VUID-VkComputePipelineCreateInfo-sType-sType", VALIDATION_ERROR_0302b00b}, + {"VUID-VkComputePipelineCreateInfo-stage-parameter", VALIDATION_ERROR_0302d801}, + {"VUID-VkCopyDescriptorSet-commonparent", VALIDATION_ERROR_03200009}, + {"VUID-VkCopyDescriptorSet-srcBinding-00345", VALIDATION_ERROR_032002b2}, + {"VUID-VkCopyDescriptorSet-srcArrayElement-00346", VALIDATION_ERROR_032002b4}, + {"VUID-VkCopyDescriptorSet-dstBinding-00347", VALIDATION_ERROR_032002b6}, + {"VUID-VkCopyDescriptorSet-dstArrayElement-00348", VALIDATION_ERROR_032002b8}, + {"VUID-VkCopyDescriptorSet-srcSet-00349", VALIDATION_ERROR_032002ba}, + {"VUID-VkCopyDescriptorSet-srcSet-01918", VALIDATION_ERROR_03200efc}, + {"VUID-VkCopyDescriptorSet-srcSet-01919", VALIDATION_ERROR_03200efe}, + {"VUID-VkCopyDescriptorSet-srcSet-01920", VALIDATION_ERROR_03200f00}, + {"VUID-VkCopyDescriptorSet-srcSet-01921", VALIDATION_ERROR_03200f02}, + {"VUID-VkCopyDescriptorSet-dstSet-parameter", VALIDATION_ERROR_03207601}, + {"VUID-VkCopyDescriptorSet-pNext-pNext", VALIDATION_ERROR_0321c40d}, + {"VUID-VkCopyDescriptorSet-sType-sType", VALIDATION_ERROR_0322b00b}, + {"VUID-VkCopyDescriptorSet-srcSet-parameter", VALIDATION_ERROR_0322d201}, + {"VUID-VkD3D12FenceSubmitInfoKHR-waitSemaphoreValuesCount-00079", VALIDATION_ERROR_0340009e}, + {"VUID-VkD3D12FenceSubmitInfoKHR-signalSemaphoreValuesCount-00080", VALIDATION_ERROR_034000a0}, + {"VUID-VkD3D12FenceSubmitInfoKHR-pSignalSemaphoreValues-parameter", VALIDATION_ERROR_03423201}, + {"VUID-VkD3D12FenceSubmitInfoKHR-pWaitSemaphoreValues-parameter", VALIDATION_ERROR_03427401}, + {"VUID-VkD3D12FenceSubmitInfoKHR-sType-sType", VALIDATION_ERROR_0342b00b}, + {"VUID-VkDebugMarkerMarkerInfoEXT-pMarkerName-parameter", VALIDATION_ERROR_0361a801}, + {"VUID-VkDebugMarkerMarkerInfoEXT-pNext-pNext", VALIDATION_ERROR_0361c40d}, + {"VUID-VkDebugMarkerMarkerInfoEXT-sType-sType", VALIDATION_ERROR_0362b00b}, + {"VUID-VkDebugMarkerObjectNameInfoEXT-objectType-01490", VALIDATION_ERROR_03800ba4}, + {"VUID-VkDebugMarkerObjectNameInfoEXT-object-01491", VALIDATION_ERROR_03800ba6}, + {"VUID-VkDebugMarkerObjectNameInfoEXT-object-01492", VALIDATION_ERROR_03800ba8}, + {"VUID-VkDebugMarkerObjectNameInfoEXT-objectType-parameter", VALIDATION_ERROR_0380da01}, + {"VUID-VkDebugMarkerObjectNameInfoEXT-pNext-pNext", VALIDATION_ERROR_0381c40d}, + {"VUID-VkDebugMarkerObjectNameInfoEXT-pObjectName-parameter", VALIDATION_ERROR_0381ce01}, + {"VUID-VkDebugMarkerObjectNameInfoEXT-sType-sType", VALIDATION_ERROR_0382b00b}, + {"VUID-VkDebugMarkerObjectTagInfoEXT-objectType-01493", VALIDATION_ERROR_03a00baa}, + {"VUID-VkDebugMarkerObjectTagInfoEXT-object-01494", VALIDATION_ERROR_03a00bac}, + {"VUID-VkDebugMarkerObjectTagInfoEXT-object-01495", VALIDATION_ERROR_03a00bae}, + {"VUID-VkDebugMarkerObjectTagInfoEXT-objectType-parameter", VALIDATION_ERROR_03a0da01}, + {"VUID-VkDebugMarkerObjectTagInfoEXT-pNext-pNext", VALIDATION_ERROR_03a1c40d}, + {"VUID-VkDebugMarkerObjectTagInfoEXT-pTag-parameter", VALIDATION_ERROR_03a25a01}, + {"VUID-VkDebugMarkerObjectTagInfoEXT-sType-sType", VALIDATION_ERROR_03a2b00b}, + {"VUID-VkDebugMarkerObjectTagInfoEXT-tagSize-arraylength", VALIDATION_ERROR_03a2f41b}, + {"VUID-VkDebugReportCallbackCreateInfoEXT-pfnCallback-01385", VALIDATION_ERROR_03c00ad2}, + {"VUID-VkDebugReportCallbackCreateInfoEXT-flags-parameter", VALIDATION_ERROR_03c09001}, + {"VUID-VkDebugReportCallbackCreateInfoEXT-sType-sType", VALIDATION_ERROR_03c2b00b}, + {"VUID-VkDedicatedAllocationBufferCreateInfoNV-sType-sType", VALIDATION_ERROR_03e2b00b}, + {"VUID-VkDedicatedAllocationImageCreateInfoNV-dedicatedAllocation-00994", VALIDATION_ERROR_040007c4}, + {"VUID-VkDedicatedAllocationImageCreateInfoNV-sType-sType", VALIDATION_ERROR_0402b00b}, + {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-commonparent", VALIDATION_ERROR_04200009}, + {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00649", VALIDATION_ERROR_04200512}, + {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00650", VALIDATION_ERROR_04200514}, + {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00651", VALIDATION_ERROR_04200516}, + {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00652", VALIDATION_ERROR_04200518}, + {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00653", VALIDATION_ERROR_0420051a}, + {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00654", VALIDATION_ERROR_0420051c}, + {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00655", VALIDATION_ERROR_0420051e}, + {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-parameter", VALIDATION_ERROR_04201a01}, + {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-parameter", VALIDATION_ERROR_0420a001}, + {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-sType-sType", VALIDATION_ERROR_0422b00b}, + {"VUID-VkDescriptorBufferInfo-offset-00340", VALIDATION_ERROR_044002a8}, + {"VUID-VkDescriptorBufferInfo-range-00341", VALIDATION_ERROR_044002aa}, + {"VUID-VkDescriptorBufferInfo-range-00342", VALIDATION_ERROR_044002ac}, + {"VUID-VkDescriptorBufferInfo-buffer-parameter", VALIDATION_ERROR_04401a01}, + {"VUID-VkDescriptorImageInfo-commonparent", VALIDATION_ERROR_04600009}, + {"VUID-VkDescriptorImageInfo-imageView-00343", VALIDATION_ERROR_046002ae}, + {"VUID-VkDescriptorImageInfo-imageLayout-00344", VALIDATION_ERROR_046002b0}, + {"VUID-VkDescriptorImageInfo-sampler-01563", VALIDATION_ERROR_04600c36}, + {"VUID-VkDescriptorImageInfo-sampler-01564", VALIDATION_ERROR_04600c38}, + {"VUID-VkDescriptorPoolCreateInfo-maxSets-00301", VALIDATION_ERROR_0480025a}, + {"VUID-VkDescriptorPoolCreateInfo-flags-parameter", VALIDATION_ERROR_04809001}, + {"VUID-VkDescriptorPoolCreateInfo-pNext-pNext", VALIDATION_ERROR_0481c40d}, + {"VUID-VkDescriptorPoolCreateInfo-pPoolSizes-parameter", VALIDATION_ERROR_0481e401}, + {"VUID-VkDescriptorPoolCreateInfo-poolSizeCount-arraylength", VALIDATION_ERROR_0482881b}, + {"VUID-VkDescriptorPoolCreateInfo-sType-sType", VALIDATION_ERROR_0482b00b}, + {"VUID-VkDescriptorPoolSize-descriptorCount-00302", VALIDATION_ERROR_04a0025c}, + {"VUID-VkDescriptorPoolSize-type-parameter", VALIDATION_ERROR_04a30401}, + {"VUID-VkDescriptorSetAllocateInfo-commonparent", VALIDATION_ERROR_04c00009}, + {"VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-00306", VALIDATION_ERROR_04c00264}, + {"VUID-VkDescriptorSetAllocateInfo-descriptorPool-00307", VALIDATION_ERROR_04c00266}, + {"VUID-VkDescriptorSetAllocateInfo-pSetLayouts-00308", VALIDATION_ERROR_04c00268}, + {"VUID-VkDescriptorSetAllocateInfo-pSetLayouts-03044", VALIDATION_ERROR_04c017c8}, + {"VUID-VkDescriptorSetAllocateInfo-descriptorPool-parameter", VALIDATION_ERROR_04c04601}, + {"VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-arraylength", VALIDATION_ERROR_04c04a1b}, + {"VUID-VkDescriptorSetAllocateInfo-pNext-pNext", VALIDATION_ERROR_04c1c40d}, + {"VUID-VkDescriptorSetAllocateInfo-pSetLayouts-parameter", VALIDATION_ERROR_04c22c01}, + {"VUID-VkDescriptorSetAllocateInfo-sType-sType", VALIDATION_ERROR_04c2b00b}, + {"VUID-VkDescriptorSetLayoutBinding-descriptorType-00282", VALIDATION_ERROR_04e00234}, + {"VUID-VkDescriptorSetLayoutBinding-descriptorCount-00283", VALIDATION_ERROR_04e00236}, + {"VUID-VkDescriptorSetLayoutBinding-descriptorType-01510", VALIDATION_ERROR_04e00bcc}, + {"VUID-VkDescriptorSetLayoutBinding-descriptorType-parameter", VALIDATION_ERROR_04e04e01}, + {"VUID-VkDescriptorSetLayoutCreateInfo-binding-00279", VALIDATION_ERROR_0500022e}, + {"VUID-VkDescriptorSetLayoutCreateInfo-flags-00280", VALIDATION_ERROR_05000230}, + {"VUID-VkDescriptorSetLayoutCreateInfo-flags-00281", VALIDATION_ERROR_05000232}, + {"VUID-VkDescriptorSetLayoutCreateInfo-flags-03000", VALIDATION_ERROR_05001770}, + {"VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-03001", VALIDATION_ERROR_05001772}, + {"VUID-VkDescriptorSetLayoutCreateInfo-flags-parameter", VALIDATION_ERROR_05009001}, + {"VUID-VkDescriptorSetLayoutCreateInfo-pBindings-parameter", VALIDATION_ERROR_0500fc01}, + {"VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext", VALIDATION_ERROR_0501c40d}, + {"VUID-VkDescriptorSetLayoutCreateInfo-sType-sType", VALIDATION_ERROR_0502b00b}, + {"VUID-VkDescriptorUpdateTemplateCreateInfo-commonparent", VALIDATION_ERROR_05200009}, + {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350", VALIDATION_ERROR_052002bc}, + {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351", VALIDATION_ERROR_052002be}, + {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352", VALIDATION_ERROR_052002c0}, + {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353", VALIDATION_ERROR_052002c2}, + {"VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorSetLayout-parameter", VALIDATION_ERROR_05204c01}, + {"VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorUpdateEntryCount-arraylength", VALIDATION_ERROR_0520501b}, + {"VUID-VkDescriptorUpdateTemplateCreateInfo-flags-zerobitmask", VALIDATION_ERROR_05209005}, + {"VUID-VkDescriptorUpdateTemplateCreateInfo-pDescriptorUpdateEntries-parameter", VALIDATION_ERROR_05213201}, + {"VUID-VkDescriptorUpdateTemplateCreateInfo-pNext-pNext", VALIDATION_ERROR_0521c40d}, + {"VUID-VkDescriptorUpdateTemplateCreateInfo-sType-sType", VALIDATION_ERROR_0522b00b}, + {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-parameter", VALIDATION_ERROR_0522f801}, + {"VUID-VkDescriptorUpdateTemplateEntry-dstBinding-00354", VALIDATION_ERROR_054002c4}, + {"VUID-VkDescriptorUpdateTemplateEntry-dstArrayElement-00355", VALIDATION_ERROR_054002c6}, + {"VUID-VkDescriptorUpdateTemplateEntry-descriptorType-parameter", VALIDATION_ERROR_05404e01}, + {"VUID-VkDeviceCreateInfo-queueFamilyIndex-00372", VALIDATION_ERROR_056002e8}, + {"VUID-VkDeviceCreateInfo-pNext-00373", VALIDATION_ERROR_056002ea}, + {"VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-00374", VALIDATION_ERROR_056002ec}, + {"VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-01840", VALIDATION_ERROR_05600e60}, + {"VUID-VkDeviceCreateInfo-flags-zerobitmask", VALIDATION_ERROR_05609005}, + {"VUID-VkDeviceCreateInfo-pEnabledFeatures-parameter", VALIDATION_ERROR_05615a01}, + {"VUID-VkDeviceCreateInfo-pNext-pNext", VALIDATION_ERROR_0561c40d}, + {"VUID-VkDeviceCreateInfo-pQueueCreateInfos-parameter", VALIDATION_ERROR_0561fe01}, + {"VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-parameter", VALIDATION_ERROR_05628e01}, + {"VUID-VkDeviceCreateInfo-ppEnabledLayerNames-parameter", VALIDATION_ERROR_05629001}, + {"VUID-VkDeviceCreateInfo-queueCreateInfoCount-arraylength", VALIDATION_ERROR_0562a01b}, + {"VUID-VkDeviceCreateInfo-sType-sType", VALIDATION_ERROR_0562b00b}, + {"VUID-VkDeviceCreateInfo-sType-unique", VALIDATION_ERROR_0562b00f}, + {"VUID-VkDeviceEventInfoEXT-deviceEvent-parameter", VALIDATION_ERROR_05805801}, + {"VUID-VkDeviceEventInfoEXT-pNext-pNext", VALIDATION_ERROR_0581c40d}, + {"VUID-VkDeviceEventInfoEXT-sType-sType", VALIDATION_ERROR_0582b00b}, + {"VUID-VkDeviceGeneratedCommandsFeaturesNVX-pNext-pNext", VALIDATION_ERROR_05a1c40d}, + {"VUID-VkDeviceGeneratedCommandsFeaturesNVX-sType-sType", VALIDATION_ERROR_05a2b00b}, + {"VUID-VkDeviceGeneratedCommandsLimitsNVX-pNext-pNext", VALIDATION_ERROR_05c1c40d}, + {"VUID-VkDeviceGeneratedCommandsLimitsNVX-sType-sType", VALIDATION_ERROR_05c2b00b}, + {"VUID-VkDeviceGroupBindSparseInfo-resourceDeviceIndex-01118", VALIDATION_ERROR_05e008bc}, + {"VUID-VkDeviceGroupBindSparseInfo-memoryDeviceIndex-01119", VALIDATION_ERROR_05e008be}, + {"VUID-VkDeviceGroupBindSparseInfo-sType-sType", VALIDATION_ERROR_05e2b00b}, + {"VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00106", VALIDATION_ERROR_060000d4}, + {"VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00107", VALIDATION_ERROR_060000d6}, + {"VUID-VkDeviceGroupCommandBufferBeginInfo-sType-sType", VALIDATION_ERROR_0602b00b}, + {"VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00375", VALIDATION_ERROR_062002ee}, + {"VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00376", VALIDATION_ERROR_062002f0}, + {"VUID-VkDeviceGroupDeviceCreateInfo-physicalDeviceCount-00377", VALIDATION_ERROR_062002f2}, + {"VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-parameter", VALIDATION_ERROR_0621dc01}, + {"VUID-VkDeviceGroupDeviceCreateInfo-sType-sType", VALIDATION_ERROR_0622b00b}, + {"VUID-VkDeviceGroupPresentInfoKHR-swapchainCount-01297", VALIDATION_ERROR_06400a22}, + {"VUID-VkDeviceGroupPresentInfoKHR-mode-01298", VALIDATION_ERROR_06400a24}, + {"VUID-VkDeviceGroupPresentInfoKHR-mode-01299", VALIDATION_ERROR_06400a26}, + {"VUID-VkDeviceGroupPresentInfoKHR-mode-01300", VALIDATION_ERROR_06400a28}, + {"VUID-VkDeviceGroupPresentInfoKHR-mode-01301", VALIDATION_ERROR_06400a2a}, + {"VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-01302", VALIDATION_ERROR_06400a2c}, + {"VUID-VkDeviceGroupPresentInfoKHR-mode-01303", VALIDATION_ERROR_06400a2e}, + {"VUID-VkDeviceGroupPresentInfoKHR-mode-parameter", VALIDATION_ERROR_0640ce01}, + {"VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-parameter", VALIDATION_ERROR_06414001}, + {"VUID-VkDeviceGroupPresentInfoKHR-sType-sType", VALIDATION_ERROR_0642b00b}, + {"VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905", VALIDATION_ERROR_06600712}, + {"VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00906", VALIDATION_ERROR_06600714}, + {"VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907", VALIDATION_ERROR_06600716}, + {"VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908", VALIDATION_ERROR_06600718}, + {"VUID-VkDeviceGroupRenderPassBeginInfo-pDeviceRenderAreas-parameter", VALIDATION_ERROR_06614201}, + {"VUID-VkDeviceGroupRenderPassBeginInfo-sType-sType", VALIDATION_ERROR_0662b00b}, + {"VUID-VkDeviceGroupSubmitInfo-waitSemaphoreCount-00082", VALIDATION_ERROR_068000a4}, + {"VUID-VkDeviceGroupSubmitInfo-commandBufferCount-00083", VALIDATION_ERROR_068000a6}, + {"VUID-VkDeviceGroupSubmitInfo-signalSemaphoreCount-00084", VALIDATION_ERROR_068000a8}, + {"VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-00085", VALIDATION_ERROR_068000aa}, + {"VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-00086", VALIDATION_ERROR_068000ac}, + {"VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-parameter", VALIDATION_ERROR_06811201}, + {"VUID-VkDeviceGroupSubmitInfo-pSignalSemaphoreDeviceIndices-parameter", VALIDATION_ERROR_06823001}, + {"VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-parameter", VALIDATION_ERROR_06827201}, + {"VUID-VkDeviceGroupSubmitInfo-sType-sType", VALIDATION_ERROR_0682b00b}, + {"VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-parameter", VALIDATION_ERROR_06a0d001}, + {"VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-requiredbitmask", VALIDATION_ERROR_06a0d003}, + {"VUID-VkDeviceGroupSwapchainCreateInfoKHR-sType-sType", VALIDATION_ERROR_06a2b00b}, + {"VUID-VkDeviceQueueCreateInfo-queueFamilyIndex-00381", VALIDATION_ERROR_06c002fa}, + {"VUID-VkDeviceQueueCreateInfo-queueCount-00382", VALIDATION_ERROR_06c002fc}, + {"VUID-VkDeviceQueueCreateInfo-pQueuePriorities-00383", VALIDATION_ERROR_06c002fe}, + {"VUID-VkDeviceQueueCreateInfo-flags-parameter", VALIDATION_ERROR_06c09001}, + {"VUID-VkDeviceQueueCreateInfo-pNext-pNext", VALIDATION_ERROR_06c1c40d}, + {"VUID-VkDeviceQueueCreateInfo-pQueuePriorities-parameter", VALIDATION_ERROR_06c20401}, + {"VUID-VkDeviceQueueCreateInfo-queueCount-arraylength", VALIDATION_ERROR_06c29e1b}, + {"VUID-VkDeviceQueueCreateInfo-sType-sType", VALIDATION_ERROR_06c2b00b}, + {"VUID-VkDispatchIndirectCommand-x-00417", VALIDATION_ERROR_06e00342}, + {"VUID-VkDispatchIndirectCommand-y-00418", VALIDATION_ERROR_06e00344}, + {"VUID-VkDispatchIndirectCommand-z-00419", VALIDATION_ERROR_06e00346}, + {"VUID-VkDisplayEventInfoEXT-displayEvent-parameter", VALIDATION_ERROR_07006201}, + {"VUID-VkDisplayEventInfoEXT-pNext-pNext", VALIDATION_ERROR_0701c40d}, + {"VUID-VkDisplayEventInfoEXT-sType-sType", VALIDATION_ERROR_0702b00b}, + {"VUID-VkDisplayModeCreateInfoKHR-width-01250", VALIDATION_ERROR_072009c4}, + {"VUID-VkDisplayModeCreateInfoKHR-refreshRate-01251", VALIDATION_ERROR_072009c6}, + {"VUID-VkDisplayModeCreateInfoKHR-flags-zerobitmask", VALIDATION_ERROR_07209005}, + {"VUID-VkDisplayModeCreateInfoKHR-pNext-pNext", VALIDATION_ERROR_0721c40d}, + {"VUID-VkDisplayModeCreateInfoKHR-sType-sType", VALIDATION_ERROR_0722b00b}, + {"VUID-VkDisplayPowerInfoEXT-pNext-pNext", VALIDATION_ERROR_0741c40d}, + {"VUID-VkDisplayPowerInfoEXT-powerState-parameter", VALIDATION_ERROR_07428a01}, + {"VUID-VkDisplayPowerInfoEXT-sType-sType", VALIDATION_ERROR_0742b00b}, + {"VUID-VkDisplayPresentInfoKHR-srcRect-01257", VALIDATION_ERROR_076009d2}, + {"VUID-VkDisplayPresentInfoKHR-dstRect-01258", VALIDATION_ERROR_076009d4}, + {"VUID-VkDisplayPresentInfoKHR-persistentContent-01259", VALIDATION_ERROR_076009d6}, + {"VUID-VkDisplayPresentInfoKHR-sType-sType", VALIDATION_ERROR_0762b00b}, + {"VUID-VkDisplaySurfaceCreateInfoKHR-planeIndex-01252", VALIDATION_ERROR_078009c8}, + {"VUID-VkDisplaySurfaceCreateInfoKHR-planeReorderPossible-01253", VALIDATION_ERROR_078009ca}, + {"VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-01254", VALIDATION_ERROR_078009cc}, + {"VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-01255", VALIDATION_ERROR_078009ce}, + {"VUID-VkDisplaySurfaceCreateInfoKHR-width-01256", VALIDATION_ERROR_078009d0}, + {"VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-parameter", VALIDATION_ERROR_07800a01}, + {"VUID-VkDisplaySurfaceCreateInfoKHR-displayMode-parameter", VALIDATION_ERROR_07806401}, + {"VUID-VkDisplaySurfaceCreateInfoKHR-flags-zerobitmask", VALIDATION_ERROR_07809005}, + {"VUID-VkDisplaySurfaceCreateInfoKHR-pNext-pNext", VALIDATION_ERROR_0781c40d}, + {"VUID-VkDisplaySurfaceCreateInfoKHR-sType-sType", VALIDATION_ERROR_0782b00b}, + {"VUID-VkDisplaySurfaceCreateInfoKHR-transform-parameter", VALIDATION_ERROR_07830201}, + {"VUID-VkDrawIndexedIndirectCommand-None-00552", VALIDATION_ERROR_07a00450}, + {"VUID-VkDrawIndexedIndirectCommand-indexSize-00553", VALIDATION_ERROR_07a00452}, + {"VUID-VkDrawIndexedIndirectCommand-firstInstance-00554", VALIDATION_ERROR_07a00454}, + {"VUID-VkDrawIndirectCommand-None-00500", VALIDATION_ERROR_07c003e8}, + {"VUID-VkDrawIndirectCommand-firstInstance-00501", VALIDATION_ERROR_07c003ea}, + {"VUID-VkEventCreateInfo-flags-zerobitmask", VALIDATION_ERROR_07e09005}, + {"VUID-VkEventCreateInfo-pNext-pNext", VALIDATION_ERROR_07e1c40d}, + {"VUID-VkEventCreateInfo-sType-sType", VALIDATION_ERROR_07e2b00b}, + {"VUID-VkExportMemoryAllocateInfo-handleTypes-00656", VALIDATION_ERROR_08000520}, + {"VUID-VkExportMemoryAllocateInfo-handleTypes-parameter", VALIDATION_ERROR_08009e01}, + {"VUID-VkExportMemoryAllocateInfo-sType-sType", VALIDATION_ERROR_0802b00b}, + {"VUID-VkExportMemoryAllocateInfoNV-handleTypes-parameter", VALIDATION_ERROR_08209e01}, + {"VUID-VkExportMemoryAllocateInfoNV-sType-sType", VALIDATION_ERROR_0822b00b}, + {"VUID-VkExportMemoryWin32HandleInfoKHR-handleTypes-00657", VALIDATION_ERROR_08400522}, + {"VUID-VkExportMemoryWin32HandleInfoKHR-pAttributes-parameter", VALIDATION_ERROR_0840f401}, + {"VUID-VkExportMemoryWin32HandleInfoKHR-sType-sType", VALIDATION_ERROR_0842b00b}, + {"VUID-VkExportMemoryWin32HandleInfoNV-pAttributes-parameter", VALIDATION_ERROR_0860f401}, + {"VUID-VkExportMemoryWin32HandleInfoNV-sType-sType", VALIDATION_ERROR_0862b00b}, + {"VUID-VkExportSemaphoreCreateInfo-handleTypes-01124", VALIDATION_ERROR_088008c8}, + {"VUID-VkExportSemaphoreCreateInfo-handleTypes-parameter", VALIDATION_ERROR_08809e01}, + {"VUID-VkExportSemaphoreCreateInfo-sType-sType", VALIDATION_ERROR_0882b00b}, + {"VUID-VkExportSemaphoreWin32HandleInfoKHR-handleTypes-01125", VALIDATION_ERROR_08a008ca}, + {"VUID-VkExportSemaphoreWin32HandleInfoKHR-pAttributes-parameter", VALIDATION_ERROR_08a0f401}, + {"VUID-VkExportSemaphoreWin32HandleInfoKHR-sType-sType", VALIDATION_ERROR_08a2b00b}, + {"VUID-VkExternalMemoryBufferCreateInfo-handleTypes-parameter", VALIDATION_ERROR_08c09e01}, + {"VUID-VkExternalMemoryBufferCreateInfo-sType-sType", VALIDATION_ERROR_08c2b00b}, + {"VUID-VkExternalMemoryImageCreateInfo-handleTypes-parameter", VALIDATION_ERROR_08e09e01}, + {"VUID-VkExternalMemoryImageCreateInfo-handleTypes-requiredbitmask", VALIDATION_ERROR_08e09e03}, + {"VUID-VkExternalMemoryImageCreateInfo-sType-sType", VALIDATION_ERROR_08e2b00b}, + {"VUID-VkExternalMemoryImageCreateInfoNV-handleTypes-parameter", VALIDATION_ERROR_09009e01}, + {"VUID-VkExternalMemoryImageCreateInfoNV-sType-sType", VALIDATION_ERROR_0902b00b}, + {"VUID-VkFenceCreateInfo-flags-parameter", VALIDATION_ERROR_09209001}, + {"VUID-VkFenceCreateInfo-pNext-pNext", VALIDATION_ERROR_0921c40d}, + {"VUID-VkFenceCreateInfo-sType-sType", VALIDATION_ERROR_0922b00b}, + {"VUID-VkFenceCreateInfo-sType-unique", VALIDATION_ERROR_0922b00f}, + {"VUID-VkFramebufferCreateInfo-commonparent", VALIDATION_ERROR_09400009}, + {"VUID-VkFramebufferCreateInfo-attachmentCount-00876", VALIDATION_ERROR_094006d8}, + {"VUID-VkFramebufferCreateInfo-pAttachments-00877", VALIDATION_ERROR_094006da}, + {"VUID-VkFramebufferCreateInfo-pAttachments-00878", VALIDATION_ERROR_094006dc}, + {"VUID-VkFramebufferCreateInfo-pAttachments-00879", VALIDATION_ERROR_094006de}, + {"VUID-VkFramebufferCreateInfo-pAttachments-00880", VALIDATION_ERROR_094006e0}, + {"VUID-VkFramebufferCreateInfo-pAttachments-00881", VALIDATION_ERROR_094006e2}, + {"VUID-VkFramebufferCreateInfo-pAttachments-00882", VALIDATION_ERROR_094006e4}, + {"VUID-VkFramebufferCreateInfo-pAttachments-00883", VALIDATION_ERROR_094006e6}, + {"VUID-VkFramebufferCreateInfo-pAttachments-00884", VALIDATION_ERROR_094006e8}, + {"VUID-VkFramebufferCreateInfo-width-00885", VALIDATION_ERROR_094006ea}, + {"VUID-VkFramebufferCreateInfo-width-00886", VALIDATION_ERROR_094006ec}, + {"VUID-VkFramebufferCreateInfo-height-00887", VALIDATION_ERROR_094006ee}, + {"VUID-VkFramebufferCreateInfo-height-00888", VALIDATION_ERROR_094006f0}, + {"VUID-VkFramebufferCreateInfo-layers-00889", VALIDATION_ERROR_094006f2}, + {"VUID-VkFramebufferCreateInfo-layers-00890", VALIDATION_ERROR_094006f4}, + {"VUID-VkFramebufferCreateInfo-pAttachments-00891", VALIDATION_ERROR_094006f6}, + {"VUID-VkFramebufferCreateInfo-flags-zerobitmask", VALIDATION_ERROR_09409005}, + {"VUID-VkFramebufferCreateInfo-pAttachments-parameter", VALIDATION_ERROR_0940f201}, + {"VUID-VkFramebufferCreateInfo-pNext-pNext", VALIDATION_ERROR_0941c40d}, + {"VUID-VkFramebufferCreateInfo-renderPass-parameter", VALIDATION_ERROR_0942ae01}, + {"VUID-VkFramebufferCreateInfo-sType-sType", VALIDATION_ERROR_0942b00b}, + {"VUID-VkGraphicsPipelineCreateInfo-commonparent", VALIDATION_ERROR_09600009}, + {"VUID-VkGraphicsPipelineCreateInfo-flags-00722", VALIDATION_ERROR_096005a4}, + {"VUID-VkGraphicsPipelineCreateInfo-flags-00723", VALIDATION_ERROR_096005a6}, + {"VUID-VkGraphicsPipelineCreateInfo-flags-00724", VALIDATION_ERROR_096005a8}, + {"VUID-VkGraphicsPipelineCreateInfo-flags-00725", VALIDATION_ERROR_096005aa}, + {"VUID-VkGraphicsPipelineCreateInfo-stage-00726", VALIDATION_ERROR_096005ac}, + {"VUID-VkGraphicsPipelineCreateInfo-stage-00727", VALIDATION_ERROR_096005ae}, + {"VUID-VkGraphicsPipelineCreateInfo-stage-00728", VALIDATION_ERROR_096005b0}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00729", VALIDATION_ERROR_096005b2}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00730", VALIDATION_ERROR_096005b4}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00731", VALIDATION_ERROR_096005b6}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00732", VALIDATION_ERROR_096005b8}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00733", VALIDATION_ERROR_096005ba}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00734", VALIDATION_ERROR_096005bc}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00735", VALIDATION_ERROR_096005be}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00736", VALIDATION_ERROR_096005c0}, + {"VUID-VkGraphicsPipelineCreateInfo-topology-00737", VALIDATION_ERROR_096005c2}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00738", VALIDATION_ERROR_096005c4}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00739", VALIDATION_ERROR_096005c6}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00740", VALIDATION_ERROR_096005c8}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00741", VALIDATION_ERROR_096005ca}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-00742", VALIDATION_ERROR_096005cc}, + {"VUID-VkGraphicsPipelineCreateInfo-subpass-00743", VALIDATION_ERROR_096005ce}, + {"VUID-VkGraphicsPipelineCreateInfo-subpass-00744", VALIDATION_ERROR_096005d0}, + {"VUID-VkGraphicsPipelineCreateInfo-subpass-00745", VALIDATION_ERROR_096005d2}, + {"VUID-VkGraphicsPipelineCreateInfo-attachmentCount-00746", VALIDATION_ERROR_096005d4}, + {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747", VALIDATION_ERROR_096005d6}, + {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00748", VALIDATION_ERROR_096005d8}, + {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00749", VALIDATION_ERROR_096005da}, + {"VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00750", VALIDATION_ERROR_096005dc}, + {"VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00751", VALIDATION_ERROR_096005de}, + {"VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00752", VALIDATION_ERROR_096005e0}, + {"VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00753", VALIDATION_ERROR_096005e2}, + {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00754", VALIDATION_ERROR_096005e4}, + {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00755", VALIDATION_ERROR_096005e6}, + {"VUID-VkGraphicsPipelineCreateInfo-layout-00756", VALIDATION_ERROR_096005e8}, + {"VUID-VkGraphicsPipelineCreateInfo-subpass-00757", VALIDATION_ERROR_096005ea}, + {"VUID-VkGraphicsPipelineCreateInfo-subpass-00758", VALIDATION_ERROR_096005ec}, + {"VUID-VkGraphicsPipelineCreateInfo-subpass-00759", VALIDATION_ERROR_096005ee}, + {"VUID-VkGraphicsPipelineCreateInfo-renderPass-00760", VALIDATION_ERROR_096005f0}, + {"VUID-VkGraphicsPipelineCreateInfo-renderPass-00761", VALIDATION_ERROR_096005f2}, + {"VUID-VkGraphicsPipelineCreateInfo-renderPass-00762", VALIDATION_ERROR_096005f4}, + {"VUID-VkGraphicsPipelineCreateInfo-renderPass-00763", VALIDATION_ERROR_096005f6}, + {"VUID-VkGraphicsPipelineCreateInfo-flags-00764", VALIDATION_ERROR_096005f8}, + {"VUID-VkGraphicsPipelineCreateInfo-subpass-01411", VALIDATION_ERROR_09600b06}, + {"VUID-VkGraphicsPipelineCreateInfo-subpass-01412", VALIDATION_ERROR_09600b08}, + {"VUID-VkGraphicsPipelineCreateInfo-subpass-01505", VALIDATION_ERROR_09600bc2}, + {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01521", VALIDATION_ERROR_09600be2}, + {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522", VALIDATION_ERROR_09600be4}, + {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01523", VALIDATION_ERROR_09600be6}, + {"VUID-VkGraphicsPipelineCreateInfo-sampleLocationsEnable-01524", VALIDATION_ERROR_09600be8}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-01565", VALIDATION_ERROR_09600c3a}, + {"VUID-VkGraphicsPipelineCreateInfo-layout-01688", VALIDATION_ERROR_09600d30}, + {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715", VALIDATION_ERROR_09600d66}, + {"VUID-VkGraphicsPipelineCreateInfo-subpass-01756", VALIDATION_ERROR_09600db8}, + {"VUID-VkGraphicsPipelineCreateInfo-subpass-01757", VALIDATION_ERROR_09600dba}, + {"VUID-VkGraphicsPipelineCreateInfo-flags-parameter", VALIDATION_ERROR_09609001}, + {"VUID-VkGraphicsPipelineCreateInfo-layout-parameter", VALIDATION_ERROR_0960be01}, + {"VUID-VkGraphicsPipelineCreateInfo-pDynamicState-parameter", VALIDATION_ERROR_09615601}, + {"VUID-VkGraphicsPipelineCreateInfo-pInputAssemblyState-parameter", VALIDATION_ERROR_09619801}, + {"VUID-VkGraphicsPipelineCreateInfo-pNext-pNext", VALIDATION_ERROR_0961c40d}, + {"VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-parameter", VALIDATION_ERROR_09620801}, + {"VUID-VkGraphicsPipelineCreateInfo-pStages-parameter", VALIDATION_ERROR_09623e01}, + {"VUID-VkGraphicsPipelineCreateInfo-pVertexInputState-parameter", VALIDATION_ERROR_09626801}, + {"VUID-VkGraphicsPipelineCreateInfo-renderPass-parameter", VALIDATION_ERROR_0962ae01}, + {"VUID-VkGraphicsPipelineCreateInfo-sType-sType", VALIDATION_ERROR_0962b00b}, + {"VUID-VkGraphicsPipelineCreateInfo-stageCount-arraylength", VALIDATION_ERROR_0962da1b}, + {"VUID-VkIOSSurfaceCreateInfoMVK-pView-01316", VALIDATION_ERROR_09800a48}, + {"VUID-VkIOSSurfaceCreateInfoMVK-flags-zerobitmask", VALIDATION_ERROR_09809005}, + {"VUID-VkIOSSurfaceCreateInfoMVK-pNext-pNext", VALIDATION_ERROR_0981c40d}, + {"VUID-VkIOSSurfaceCreateInfoMVK-sType-sType", VALIDATION_ERROR_0982b00b}, + {"VUID-VkImageBlit-aspectMask-00238", VALIDATION_ERROR_09a001dc}, + {"VUID-VkImageBlit-layerCount-00239", VALIDATION_ERROR_09a001de}, + {"VUID-VkImageBlit-srcImage-00240", VALIDATION_ERROR_09a001e0}, + {"VUID-VkImageBlit-aspectMask-00241", VALIDATION_ERROR_09a001e2}, + {"VUID-VkImageBlit-aspectMask-00242", VALIDATION_ERROR_09a001e4}, + {"VUID-VkImageBlit-srcOffset-00243", VALIDATION_ERROR_09a001e6}, + {"VUID-VkImageBlit-srcOffset-00244", VALIDATION_ERROR_09a001e8}, + {"VUID-VkImageBlit-srcImage-00245", VALIDATION_ERROR_09a001ea}, + {"VUID-VkImageBlit-srcOffset-00246", VALIDATION_ERROR_09a001ec}, + {"VUID-VkImageBlit-srcImage-00247", VALIDATION_ERROR_09a001ee}, + {"VUID-VkImageBlit-dstOffset-00248", VALIDATION_ERROR_09a001f0}, + {"VUID-VkImageBlit-dstOffset-00249", VALIDATION_ERROR_09a001f2}, + {"VUID-VkImageBlit-dstImage-00250", VALIDATION_ERROR_09a001f4}, + {"VUID-VkImageBlit-dstOffset-00251", VALIDATION_ERROR_09a001f6}, + {"VUID-VkImageBlit-dstImage-00252", VALIDATION_ERROR_09a001f8}, + {"VUID-VkImageBlit-dstSubresource-parameter", VALIDATION_ERROR_09a07a01}, + {"VUID-VkImageBlit-srcSubresource-parameter", VALIDATION_ERROR_09a2d601}, + {"VUID-VkImageCopy-aspectMask-00137", VALIDATION_ERROR_09c00112}, + {"VUID-VkImageCopy-layerCount-00138", VALIDATION_ERROR_09c00114}, + {"VUID-VkImageCopy-srcImage-00139", VALIDATION_ERROR_09c00116}, + {"VUID-VkImageCopy-extent-00140", VALIDATION_ERROR_09c00118}, + {"VUID-VkImageCopy-srcImage-00141", VALIDATION_ERROR_09c0011a}, + {"VUID-VkImageCopy-aspectMask-00142", VALIDATION_ERROR_09c0011c}, + {"VUID-VkImageCopy-aspectMask-00143", VALIDATION_ERROR_09c0011e}, + {"VUID-VkImageCopy-srcOffset-00144", VALIDATION_ERROR_09c00120}, + {"VUID-VkImageCopy-srcOffset-00145", VALIDATION_ERROR_09c00122}, + {"VUID-VkImageCopy-srcImage-00146", VALIDATION_ERROR_09c00124}, + {"VUID-VkImageCopy-srcOffset-00147", VALIDATION_ERROR_09c00126}, + {"VUID-VkImageCopy-dstOffset-00150", VALIDATION_ERROR_09c0012c}, + {"VUID-VkImageCopy-dstOffset-00151", VALIDATION_ERROR_09c0012e}, + {"VUID-VkImageCopy-dstImage-00152", VALIDATION_ERROR_09c00130}, + {"VUID-VkImageCopy-dstOffset-00153", VALIDATION_ERROR_09c00132}, + {"VUID-VkImageCopy-srcOffset-00157", VALIDATION_ERROR_09c0013a}, + {"VUID-VkImageCopy-extent-00158", VALIDATION_ERROR_09c0013c}, + {"VUID-VkImageCopy-extent-00159", VALIDATION_ERROR_09c0013e}, + {"VUID-VkImageCopy-extent-00160", VALIDATION_ERROR_09c00140}, + {"VUID-VkImageCopy-dstOffset-00162", VALIDATION_ERROR_09c00144}, + {"VUID-VkImageCopy-extent-00163", VALIDATION_ERROR_09c00146}, + {"VUID-VkImageCopy-extent-00164", VALIDATION_ERROR_09c00148}, + {"VUID-VkImageCopy-extent-00165", VALIDATION_ERROR_09c0014a}, + {"VUID-VkImageCopy-srcImage-01551", VALIDATION_ERROR_09c00c1e}, + {"VUID-VkImageCopy-srcImage-01552", VALIDATION_ERROR_09c00c20}, + {"VUID-VkImageCopy-srcImage-01553", VALIDATION_ERROR_09c00c22}, + {"VUID-VkImageCopy-dstImage-01554", VALIDATION_ERROR_09c00c24}, + {"VUID-VkImageCopy-dstImage-01555", VALIDATION_ERROR_09c00c26}, + {"VUID-VkImageCopy-srcImage-01556", VALIDATION_ERROR_09c00c28}, + {"VUID-VkImageCopy-dstImage-01557", VALIDATION_ERROR_09c00c2a}, + {"VUID-VkImageCopy-srcImage-01727", VALIDATION_ERROR_09c00d7e}, + {"VUID-VkImageCopy-srcImage-01728", VALIDATION_ERROR_09c00d80}, + {"VUID-VkImageCopy-srcImage-01729", VALIDATION_ERROR_09c00d82}, + {"VUID-VkImageCopy-srcImage-01730", VALIDATION_ERROR_09c00d84}, + {"VUID-VkImageCopy-dstImage-01731", VALIDATION_ERROR_09c00d86}, + {"VUID-VkImageCopy-dstImage-01732", VALIDATION_ERROR_09c00d88}, + {"VUID-VkImageCopy-dstImage-01733", VALIDATION_ERROR_09c00d8a}, + {"VUID-VkImageCopy-dstImage-01734", VALIDATION_ERROR_09c00d8c}, + {"VUID-VkImageCopy-srcImage-01785", VALIDATION_ERROR_09c00df2}, + {"VUID-VkImageCopy-dstImage-01786", VALIDATION_ERROR_09c00df4}, + {"VUID-VkImageCopy-srcImage-01787", VALIDATION_ERROR_09c00df6}, + {"VUID-VkImageCopy-dstImage-01788", VALIDATION_ERROR_09c00df8}, + {"VUID-VkImageCopy-srcImage-01789", VALIDATION_ERROR_09c00dfa}, + {"VUID-VkImageCopy-srcImage-01790", VALIDATION_ERROR_09c00dfc}, + {"VUID-VkImageCopy-srcImage-01791", VALIDATION_ERROR_09c00dfe}, + {"VUID-VkImageCopy-dstImage-01792", VALIDATION_ERROR_09c00e00}, + {"VUID-VkImageCopy-dstSubresource-parameter", VALIDATION_ERROR_09c07a01}, + {"VUID-VkImageCopy-srcSubresource-parameter", VALIDATION_ERROR_09c2d601}, + {"VUID-VkImageCreateInfo-format-00940", VALIDATION_ERROR_09e00758}, + {"VUID-VkImageCreateInfo-sharingMode-00941", VALIDATION_ERROR_09e0075a}, + {"VUID-VkImageCreateInfo-sharingMode-00942", VALIDATION_ERROR_09e0075c}, + {"VUID-VkImageCreateInfo-format-00943", VALIDATION_ERROR_09e0075e}, + {"VUID-VkImageCreateInfo-extent-00944", VALIDATION_ERROR_09e00760}, + {"VUID-VkImageCreateInfo-extent-00945", VALIDATION_ERROR_09e00762}, + {"VUID-VkImageCreateInfo-extent-00946", VALIDATION_ERROR_09e00764}, + {"VUID-VkImageCreateInfo-mipLevels-00947", VALIDATION_ERROR_09e00766}, + {"VUID-VkImageCreateInfo-arrayLayers-00948", VALIDATION_ERROR_09e00768}, + {"VUID-VkImageCreateInfo-flags-00949", VALIDATION_ERROR_09e0076a}, + {"VUID-VkImageCreateInfo-flags-00950", VALIDATION_ERROR_09e0076c}, + {"VUID-VkImageCreateInfo-imageType-00951", VALIDATION_ERROR_09e0076e}, + {"VUID-VkImageCreateInfo-imageType-00952", VALIDATION_ERROR_09e00770}, + {"VUID-VkImageCreateInfo-imageType-00953", VALIDATION_ERROR_09e00772}, + {"VUID-VkImageCreateInfo-imageType-00954", VALIDATION_ERROR_09e00774}, + {"VUID-VkImageCreateInfo-imageType-00955", VALIDATION_ERROR_09e00776}, + {"VUID-VkImageCreateInfo-imageType-00956", VALIDATION_ERROR_09e00778}, + {"VUID-VkImageCreateInfo-imageType-00957", VALIDATION_ERROR_09e0077a}, + {"VUID-VkImageCreateInfo-mipLevels-00958", VALIDATION_ERROR_09e0077c}, + {"VUID-VkImageCreateInfo-extent-00959", VALIDATION_ERROR_09e0077e}, + {"VUID-VkImageCreateInfo-arrayLayers-00960", VALIDATION_ERROR_09e00780}, + {"VUID-VkImageCreateInfo-imageType-00961", VALIDATION_ERROR_09e00782}, + {"VUID-VkImageCreateInfo-samples-00962", VALIDATION_ERROR_09e00784}, + {"VUID-VkImageCreateInfo-usage-00963", VALIDATION_ERROR_09e00786}, + {"VUID-VkImageCreateInfo-usage-00964", VALIDATION_ERROR_09e00788}, + {"VUID-VkImageCreateInfo-usage-00965", VALIDATION_ERROR_09e0078a}, + {"VUID-VkImageCreateInfo-usage-00966", VALIDATION_ERROR_09e0078c}, + {"VUID-VkImageCreateInfo-samples-00967", VALIDATION_ERROR_09e0078e}, + {"VUID-VkImageCreateInfo-usage-00968", VALIDATION_ERROR_09e00790}, + {"VUID-VkImageCreateInfo-flags-00969", VALIDATION_ERROR_09e00792}, + {"VUID-VkImageCreateInfo-imageType-00970", VALIDATION_ERROR_09e00794}, + {"VUID-VkImageCreateInfo-imageType-00971", VALIDATION_ERROR_09e00796}, + {"VUID-VkImageCreateInfo-imageType-00972", VALIDATION_ERROR_09e00798}, + {"VUID-VkImageCreateInfo-imageType-00973", VALIDATION_ERROR_09e0079a}, + {"VUID-VkImageCreateInfo-imageType-00974", VALIDATION_ERROR_09e0079c}, + {"VUID-VkImageCreateInfo-imageType-00975", VALIDATION_ERROR_09e0079e}, + {"VUID-VkImageCreateInfo-imageType-00976", VALIDATION_ERROR_09e007a0}, + {"VUID-VkImageCreateInfo-flags-00987", VALIDATION_ERROR_09e007b6}, + {"VUID-VkImageCreateInfo-pNext-00988", VALIDATION_ERROR_09e007b8}, + {"VUID-VkImageCreateInfo-pNext-00990", VALIDATION_ERROR_09e007bc}, + {"VUID-VkImageCreateInfo-pNext-00991", VALIDATION_ERROR_09e007be}, + {"VUID-VkImageCreateInfo-flags-00992", VALIDATION_ERROR_09e007c0}, + {"VUID-VkImageCreateInfo-initialLayout-00993", VALIDATION_ERROR_09e007c2}, + {"VUID-VkImageCreateInfo-sharingMode-01392", VALIDATION_ERROR_09e00ae0}, + {"VUID-VkImageCreateInfo-sharingMode-01420", VALIDATION_ERROR_09e00b18}, + {"VUID-VkImageCreateInfo-physicalDeviceCount-01421", VALIDATION_ERROR_09e00b1a}, + {"VUID-VkImageCreateInfo-pNext-01443", VALIDATION_ERROR_09e00b46}, + {"VUID-VkImageCreateInfo-flags-01533", VALIDATION_ERROR_09e00bfa}, + {"VUID-VkImageCreateInfo-flags-01572", VALIDATION_ERROR_09e00c48}, + {"VUID-VkImageCreateInfo-flags-01573", VALIDATION_ERROR_09e00c4a}, + {"VUID-VkImageCreateInfo-format-01574", VALIDATION_ERROR_09e00c4c}, + {"VUID-VkImageCreateInfo-tiling-01575", VALIDATION_ERROR_09e00c4e}, + {"VUID-VkImageCreateInfo-tiling-01576", VALIDATION_ERROR_09e00c50}, + {"VUID-VkImageCreateInfo-format-01577", VALIDATION_ERROR_09e00c52}, + {"VUID-VkImageCreateInfo-pNext-01889", VALIDATION_ERROR_09e00ec2}, + {"VUID-VkImageCreateInfo-flags-01890", VALIDATION_ERROR_09e00ec4}, + {"VUID-VkImageCreateInfo-None-01891", VALIDATION_ERROR_09e00ec6}, + {"VUID-VkImageCreateInfo-pNext-01892", VALIDATION_ERROR_09e00ec8}, + {"VUID-VkImageCreateInfo-pNext-01893", VALIDATION_ERROR_09e00eca}, + {"VUID-VkImageCreateInfo-flags-01924", VALIDATION_ERROR_09e00f08}, + {"VUID-VkImageCreateInfo-None-01925", VALIDATION_ERROR_09e00f0a}, + {"VUID-VkImageCreateInfo-flags-parameter", VALIDATION_ERROR_09e09001}, + {"VUID-VkImageCreateInfo-format-parameter", VALIDATION_ERROR_09e09201}, + {"VUID-VkImageCreateInfo-imageType-parameter", VALIDATION_ERROR_09e0ac01}, + {"VUID-VkImageCreateInfo-initialLayout-parameter", VALIDATION_ERROR_09e0b801}, + {"VUID-VkImageCreateInfo-pNext-pNext", VALIDATION_ERROR_09e1c40d}, + {"VUID-VkImageCreateInfo-sType-sType", VALIDATION_ERROR_09e2b00b}, + {"VUID-VkImageCreateInfo-sType-unique", VALIDATION_ERROR_09e2b00f}, + {"VUID-VkImageCreateInfo-samples-parameter", VALIDATION_ERROR_09e2b401}, + {"VUID-VkImageCreateInfo-sharingMode-parameter", VALIDATION_ERROR_09e2c001}, + {"VUID-VkImageCreateInfo-tiling-parameter", VALIDATION_ERROR_09e2fa01}, + {"VUID-VkImageCreateInfo-usage-parameter", VALIDATION_ERROR_09e30601}, + {"VUID-VkImageCreateInfo-usage-requiredbitmask", VALIDATION_ERROR_09e30603}, + {"VUID-VkImageMemoryBarrier-oldLayout-01197", VALIDATION_ERROR_0a00095a}, + {"VUID-VkImageMemoryBarrier-newLayout-01198", VALIDATION_ERROR_0a00095c}, + {"VUID-VkImageMemoryBarrier-image-01199", VALIDATION_ERROR_0a00095e}, + {"VUID-VkImageMemoryBarrier-image-01200", VALIDATION_ERROR_0a000960}, + {"VUID-VkImageMemoryBarrier-image-01201", VALIDATION_ERROR_0a000962}, + {"VUID-VkImageMemoryBarrier-image-01205", VALIDATION_ERROR_0a00096a}, + {"VUID-VkImageMemoryBarrier-image-01207", VALIDATION_ERROR_0a00096e}, + {"VUID-VkImageMemoryBarrier-oldLayout-01208", VALIDATION_ERROR_0a000970}, + {"VUID-VkImageMemoryBarrier-oldLayout-01209", VALIDATION_ERROR_0a000972}, + {"VUID-VkImageMemoryBarrier-oldLayout-01210", VALIDATION_ERROR_0a000974}, + {"VUID-VkImageMemoryBarrier-oldLayout-01211", VALIDATION_ERROR_0a000976}, + {"VUID-VkImageMemoryBarrier-oldLayout-01212", VALIDATION_ERROR_0a000978}, + {"VUID-VkImageMemoryBarrier-oldLayout-01213", VALIDATION_ERROR_0a00097a}, + {"VUID-VkImageMemoryBarrier-image-01381", VALIDATION_ERROR_0a000aca}, + {"VUID-VkImageMemoryBarrier-subresourceRange-01486", VALIDATION_ERROR_0a000b9c}, + {"VUID-VkImageMemoryBarrier-subresourceRange-01488", VALIDATION_ERROR_0a000ba0}, + {"VUID-VkImageMemoryBarrier-oldLayout-01658", VALIDATION_ERROR_0a000cf4}, + {"VUID-VkImageMemoryBarrier-oldLayout-01659", VALIDATION_ERROR_0a000cf6}, + {"VUID-VkImageMemoryBarrier-image-01671", VALIDATION_ERROR_0a000d0e}, + {"VUID-VkImageMemoryBarrier-image-01672", VALIDATION_ERROR_0a000d10}, + {"VUID-VkImageMemoryBarrier-image-01673", VALIDATION_ERROR_0a000d12}, + {"VUID-VkImageMemoryBarrier-subresourceRange-01724", VALIDATION_ERROR_0a000d78}, + {"VUID-VkImageMemoryBarrier-subresourceRange-01725", VALIDATION_ERROR_0a000d7a}, + {"VUID-VkImageMemoryBarrier-image-01766", VALIDATION_ERROR_0a000dcc}, + {"VUID-VkImageMemoryBarrier-image-01767", VALIDATION_ERROR_0a000dce}, + {"VUID-VkImageMemoryBarrier-image-01768", VALIDATION_ERROR_0a000dd0}, + {"VUID-VkImageMemoryBarrier-image-01932", VALIDATION_ERROR_0a000f18}, + {"VUID-VkImageMemoryBarrier-dstAccessMask-parameter", VALIDATION_ERROR_0a006801}, + {"VUID-VkImageMemoryBarrier-image-parameter", VALIDATION_ERROR_0a00a001}, + {"VUID-VkImageMemoryBarrier-newLayout-parameter", VALIDATION_ERROR_0a00d401}, + {"VUID-VkImageMemoryBarrier-oldLayout-parameter", VALIDATION_ERROR_0a00dc01}, + {"VUID-VkImageMemoryBarrier-pNext-pNext", VALIDATION_ERROR_0a01c40d}, + {"VUID-VkImageMemoryBarrier-sType-sType", VALIDATION_ERROR_0a02b00b}, + {"VUID-VkImageMemoryBarrier-srcAccessMask-parameter", VALIDATION_ERROR_0a02c401}, + {"VUID-VkImageMemoryBarrier-subresourceRange-parameter", VALIDATION_ERROR_0a02ea01}, + {"VUID-VkImageResolve-aspectMask-00266", VALIDATION_ERROR_0a200214}, + {"VUID-VkImageResolve-layerCount-00267", VALIDATION_ERROR_0a200216}, + {"VUID-VkImageResolve-srcImage-00268", VALIDATION_ERROR_0a200218}, + {"VUID-VkImageResolve-srcOffset-00269", VALIDATION_ERROR_0a20021a}, + {"VUID-VkImageResolve-srcOffset-00270", VALIDATION_ERROR_0a20021c}, + {"VUID-VkImageResolve-srcImage-00271", VALIDATION_ERROR_0a20021e}, + {"VUID-VkImageResolve-srcOffset-00272", VALIDATION_ERROR_0a200220}, + {"VUID-VkImageResolve-srcImage-00273", VALIDATION_ERROR_0a200222}, + {"VUID-VkImageResolve-dstOffset-00274", VALIDATION_ERROR_0a200224}, + {"VUID-VkImageResolve-dstOffset-00275", VALIDATION_ERROR_0a200226}, + {"VUID-VkImageResolve-dstImage-00276", VALIDATION_ERROR_0a200228}, + {"VUID-VkImageResolve-dstOffset-00277", VALIDATION_ERROR_0a20022a}, + {"VUID-VkImageResolve-dstImage-00278", VALIDATION_ERROR_0a20022c}, + {"VUID-VkImageResolve-dstSubresource-parameter", VALIDATION_ERROR_0a207a01}, + {"VUID-VkImageResolve-srcSubresource-parameter", VALIDATION_ERROR_0a22d601}, + {"VUID-VkImageSubresource-aspectMask-parameter", VALIDATION_ERROR_0a400c01}, + {"VUID-VkImageSubresource-aspectMask-requiredbitmask", VALIDATION_ERROR_0a400c03}, + {"VUID-VkImageSubresourceLayers-aspectMask-00167", VALIDATION_ERROR_0a60014e}, + {"VUID-VkImageSubresourceLayers-aspectMask-00168", VALIDATION_ERROR_0a600150}, + {"VUID-VkImageSubresourceLayers-aspectMask-parameter", VALIDATION_ERROR_0a600c01}, + {"VUID-VkImageSubresourceLayers-aspectMask-requiredbitmask", VALIDATION_ERROR_0a600c03}, + {"VUID-VkImageSubresourceLayers-layerCount-01700", VALIDATION_ERROR_0a600d48}, + {"VUID-VkImageSubresourceRange-aspectMask-parameter", VALIDATION_ERROR_0a800c01}, + {"VUID-VkImageSubresourceRange-aspectMask-requiredbitmask", VALIDATION_ERROR_0a800c03}, + {"VUID-VkImageSubresourceRange-aspectMask-01670", VALIDATION_ERROR_0a800d0c}, + {"VUID-VkImageSubresourceRange-levelCount-01720", VALIDATION_ERROR_0a800d70}, + {"VUID-VkImageSubresourceRange-layerCount-01721", VALIDATION_ERROR_0a800d72}, + {"VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995", VALIDATION_ERROR_0aa007c6}, + {"VUID-VkImageSwapchainCreateInfoKHR-sType-sType", VALIDATION_ERROR_0aa2b00b}, + {"VUID-VkImageSwapchainCreateInfoKHR-swapchain-parameter", VALIDATION_ERROR_0aa2f001}, + {"VUID-VkImageViewCreateInfo-image-01003", VALIDATION_ERROR_0ac007d6}, + {"VUID-VkImageViewCreateInfo-viewType-01004", VALIDATION_ERROR_0ac007d8}, + {"VUID-VkImageViewCreateInfo-image-01005", VALIDATION_ERROR_0ac007da}, + {"VUID-VkImageViewCreateInfo-image-01006", VALIDATION_ERROR_0ac007dc}, + {"VUID-VkImageViewCreateInfo-image-01007", VALIDATION_ERROR_0ac007de}, + {"VUID-VkImageViewCreateInfo-image-01008", VALIDATION_ERROR_0ac007e0}, + {"VUID-VkImageViewCreateInfo-image-01009", VALIDATION_ERROR_0ac007e2}, + {"VUID-VkImageViewCreateInfo-image-01010", VALIDATION_ERROR_0ac007e4}, + {"VUID-VkImageViewCreateInfo-image-01011", VALIDATION_ERROR_0ac007e6}, + {"VUID-VkImageViewCreateInfo-image-01012", VALIDATION_ERROR_0ac007e8}, + {"VUID-VkImageViewCreateInfo-image-01013", VALIDATION_ERROR_0ac007ea}, + {"VUID-VkImageViewCreateInfo-image-01014", VALIDATION_ERROR_0ac007ec}, + {"VUID-VkImageViewCreateInfo-image-01015", VALIDATION_ERROR_0ac007ee}, + {"VUID-VkImageViewCreateInfo-image-01016", VALIDATION_ERROR_0ac007f0}, + {"VUID-VkImageViewCreateInfo-image-01018", VALIDATION_ERROR_0ac007f4}, + {"VUID-VkImageViewCreateInfo-image-01019", VALIDATION_ERROR_0ac007f6}, + {"VUID-VkImageViewCreateInfo-image-01020", VALIDATION_ERROR_0ac007f8}, + {"VUID-VkImageViewCreateInfo-subResourceRange-01021", VALIDATION_ERROR_0ac007fa}, + {"VUID-VkImageViewCreateInfo-subresourceRange-01478", VALIDATION_ERROR_0ac00b8c}, + {"VUID-VkImageViewCreateInfo-subresourceRange-01480", VALIDATION_ERROR_0ac00b90}, + {"VUID-VkImageViewCreateInfo-image-01482", VALIDATION_ERROR_0ac00b94}, + {"VUID-VkImageViewCreateInfo-subresourceRange-01483", VALIDATION_ERROR_0ac00b96}, + {"VUID-VkImageViewCreateInfo-image-01484", VALIDATION_ERROR_0ac00b98}, + {"VUID-VkImageViewCreateInfo-subresourceRange-01485", VALIDATION_ERROR_0ac00b9a}, + {"VUID-VkImageViewCreateInfo-image-01583", VALIDATION_ERROR_0ac00c5e}, + {"VUID-VkImageViewCreateInfo-image-01584", VALIDATION_ERROR_0ac00c60}, + {"VUID-VkImageViewCreateInfo-pNext-01585", VALIDATION_ERROR_0ac00c62}, + {"VUID-VkImageViewCreateInfo-image-01586", VALIDATION_ERROR_0ac00c64}, + {"VUID-VkImageViewCreateInfo-subresourceRange-01718", VALIDATION_ERROR_0ac00d6c}, + {"VUID-VkImageViewCreateInfo-subresourceRange-01719", VALIDATION_ERROR_0ac00d6e}, + {"VUID-VkImageViewCreateInfo-image-01759", VALIDATION_ERROR_0ac00dbe}, + {"VUID-VkImageViewCreateInfo-image-01760", VALIDATION_ERROR_0ac00dc0}, + {"VUID-VkImageViewCreateInfo-image-01761", VALIDATION_ERROR_0ac00dc2}, + {"VUID-VkImageViewCreateInfo-image-01762", VALIDATION_ERROR_0ac00dc4}, + {"VUID-VkImageViewCreateInfo-image-01896", VALIDATION_ERROR_0ac00ed0}, + {"VUID-VkImageViewCreateInfo-components-parameter", VALIDATION_ERROR_0ac02c01}, + {"VUID-VkImageViewCreateInfo-flags-zerobitmask", VALIDATION_ERROR_0ac09005}, + {"VUID-VkImageViewCreateInfo-format-parameter", VALIDATION_ERROR_0ac09201}, + {"VUID-VkImageViewCreateInfo-image-parameter", VALIDATION_ERROR_0ac0a001}, + {"VUID-VkImageViewCreateInfo-pNext-pNext", VALIDATION_ERROR_0ac1c40d}, + {"VUID-VkImageViewCreateInfo-sType-sType", VALIDATION_ERROR_0ac2b00b}, + {"VUID-VkImageViewCreateInfo-sType-unique", VALIDATION_ERROR_0ac2b00f}, + {"VUID-VkImageViewCreateInfo-subresourceRange-parameter", VALIDATION_ERROR_0ac2ea01}, + {"VUID-VkImageViewCreateInfo-viewType-parameter", VALIDATION_ERROR_0ac30801}, + {"VUID-VkImportMemoryFdInfoKHR-handleType-00667", VALIDATION_ERROR_0ae00536}, + {"VUID-VkImportMemoryFdInfoKHR-fd-00668", VALIDATION_ERROR_0ae00538}, + {"VUID-VkImportMemoryFdInfoKHR-handleType-00669", VALIDATION_ERROR_0ae0053a}, + {"VUID-VkImportMemoryFdInfoKHR-handleType-00670", VALIDATION_ERROR_0ae0053c}, + {"VUID-VkImportMemoryFdInfoKHR-fd-01520", VALIDATION_ERROR_0ae00be0}, + {"VUID-VkImportMemoryFdInfoKHR-fd-01746", VALIDATION_ERROR_0ae00da4}, + {"VUID-VkImportMemoryFdInfoKHR-handleType-parameter", VALIDATION_ERROR_0ae09c01}, + {"VUID-VkImportMemoryFdInfoKHR-sType-sType", VALIDATION_ERROR_0ae2b00b}, + {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00658", VALIDATION_ERROR_0b000524}, + {"VUID-VkImportMemoryWin32HandleInfoKHR-handle-00659", VALIDATION_ERROR_0b000526}, + {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00660", VALIDATION_ERROR_0b000528}, + {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00661", VALIDATION_ERROR_0b00052a}, + {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-01439", VALIDATION_ERROR_0b000b3e}, + {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-01440", VALIDATION_ERROR_0b000b40}, + {"VUID-VkImportMemoryWin32HandleInfoKHR-handle-01441", VALIDATION_ERROR_0b000b42}, + {"VUID-VkImportMemoryWin32HandleInfoKHR-handle-01518", VALIDATION_ERROR_0b000bdc}, + {"VUID-VkImportMemoryWin32HandleInfoKHR-name-01519", VALIDATION_ERROR_0b000bde}, + {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-parameter", VALIDATION_ERROR_0b009c01}, + {"VUID-VkImportMemoryWin32HandleInfoKHR-sType-sType", VALIDATION_ERROR_0b02b00b}, + {"VUID-VkImportMemoryWin32HandleInfoNV-handleType-01327", VALIDATION_ERROR_0b200a5e}, + {"VUID-VkImportMemoryWin32HandleInfoNV-handle-01328", VALIDATION_ERROR_0b200a60}, + {"VUID-VkImportMemoryWin32HandleInfoNV-handleType-parameter", VALIDATION_ERROR_0b209c01}, + {"VUID-VkImportMemoryWin32HandleInfoNV-sType-sType", VALIDATION_ERROR_0b22b00b}, + {"VUID-VkImportSemaphoreFdInfoKHR-handleType-01143", VALIDATION_ERROR_0b4008ee}, + {"VUID-VkImportSemaphoreFdInfoKHR-fd-01544", VALIDATION_ERROR_0b400c10}, + {"VUID-VkImportSemaphoreFdInfoKHR-flags-parameter", VALIDATION_ERROR_0b409001}, + {"VUID-VkImportSemaphoreFdInfoKHR-handleType-parameter", VALIDATION_ERROR_0b409c01}, + {"VUID-VkImportSemaphoreFdInfoKHR-pNext-pNext", VALIDATION_ERROR_0b41c40d}, + {"VUID-VkImportSemaphoreFdInfoKHR-sType-sType", VALIDATION_ERROR_0b42b00b}, + {"VUID-VkImportSemaphoreFdInfoKHR-semaphore-parameter", VALIDATION_ERROR_0b42b801}, + {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01140", VALIDATION_ERROR_0b6008e8}, + {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01466", VALIDATION_ERROR_0b600b74}, + {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01467", VALIDATION_ERROR_0b600b76}, + {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01468", VALIDATION_ERROR_0b600b78}, + {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01469", VALIDATION_ERROR_0b600b7a}, + {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01542", VALIDATION_ERROR_0b600c0c}, + {"VUID-VkImportSemaphoreWin32HandleInfoKHR-name-01543", VALIDATION_ERROR_0b600c0e}, + {"VUID-VkImportSemaphoreWin32HandleInfoKHR-flags-parameter", VALIDATION_ERROR_0b609001}, + {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-parameter", VALIDATION_ERROR_0b609c01}, + {"VUID-VkImportSemaphoreWin32HandleInfoKHR-pNext-pNext", VALIDATION_ERROR_0b61c40d}, + {"VUID-VkImportSemaphoreWin32HandleInfoKHR-sType-sType", VALIDATION_ERROR_0b62b00b}, + {"VUID-VkImportSemaphoreWin32HandleInfoKHR-semaphore-parameter", VALIDATION_ERROR_0b62b801}, + {"VUID-VkIndirectCommandsLayoutCreateInfoNVX-tokenCount-01347", VALIDATION_ERROR_0b800a86}, + {"VUID-VkIndirectCommandsLayoutCreateInfoNVX-computeBindingPointSupport-01348", VALIDATION_ERROR_0b800a88}, + {"VUID-VkIndirectCommandsLayoutCreateInfoNVX-pTokens-01349", VALIDATION_ERROR_0b800a8a}, + {"VUID-VkIndirectCommandsLayoutCreateInfoNVX-pTokens-01350", VALIDATION_ERROR_0b800a8c}, + {"VUID-VkIndirectCommandsLayoutCreateInfoNVX-pTokens-01351", VALIDATION_ERROR_0b800a8e}, + {"VUID-VkIndirectCommandsLayoutCreateInfoNVX-flags-parameter", VALIDATION_ERROR_0b809001}, + {"VUID-VkIndirectCommandsLayoutCreateInfoNVX-flags-requiredbitmask", VALIDATION_ERROR_0b809003}, + {"VUID-VkIndirectCommandsLayoutCreateInfoNVX-pNext-pNext", VALIDATION_ERROR_0b81c40d}, + {"VUID-VkIndirectCommandsLayoutCreateInfoNVX-pTokens-parameter", VALIDATION_ERROR_0b826001}, + {"VUID-VkIndirectCommandsLayoutCreateInfoNVX-pipelineBindPoint-parameter", VALIDATION_ERROR_0b827e01}, + {"VUID-VkIndirectCommandsLayoutCreateInfoNVX-sType-sType", VALIDATION_ERROR_0b82b00b}, + {"VUID-VkIndirectCommandsLayoutCreateInfoNVX-tokenCount-arraylength", VALIDATION_ERROR_0b82fc1b}, + {"VUID-VkIndirectCommandsLayoutTokenNVX-bindingUnit-01342", VALIDATION_ERROR_0ba00a7c}, + {"VUID-VkIndirectCommandsLayoutTokenNVX-dynamicCount-01343", VALIDATION_ERROR_0ba00a7e}, + {"VUID-VkIndirectCommandsLayoutTokenNVX-divisor-01344", VALIDATION_ERROR_0ba00a80}, + {"VUID-VkIndirectCommandsLayoutTokenNVX-tokenType-parameter", VALIDATION_ERROR_0ba2fe01}, + {"VUID-VkIndirectCommandsTokenNVX-buffer-01345", VALIDATION_ERROR_0bc00a82}, + {"VUID-VkIndirectCommandsTokenNVX-offset-01346", VALIDATION_ERROR_0bc00a84}, + {"VUID-VkIndirectCommandsTokenNVX-buffer-parameter", VALIDATION_ERROR_0bc01a01}, + {"VUID-VkIndirectCommandsTokenNVX-tokenType-parameter", VALIDATION_ERROR_0bc2fe01}, + {"VUID-VkInstanceCreateInfo-flags-zerobitmask", VALIDATION_ERROR_0be09005}, + {"VUID-VkInstanceCreateInfo-pApplicationInfo-parameter", VALIDATION_ERROR_0be0ee01}, + {"VUID-VkInstanceCreateInfo-pNext-pNext", VALIDATION_ERROR_0be1c40d}, + {"VUID-VkInstanceCreateInfo-ppEnabledExtensionNames-parameter", VALIDATION_ERROR_0be28e01}, + {"VUID-VkInstanceCreateInfo-ppEnabledLayerNames-parameter", VALIDATION_ERROR_0be29001}, + {"VUID-VkInstanceCreateInfo-sType-sType", VALIDATION_ERROR_0be2b00b}, + {"VUID-VkInstanceCreateInfo-sType-unique", VALIDATION_ERROR_0be2b00f}, + {"VUID-VkMacOSSurfaceCreateInfoMVK-pView-01317", VALIDATION_ERROR_0c000a4a}, + {"VUID-VkMacOSSurfaceCreateInfoMVK-flags-zerobitmask", VALIDATION_ERROR_0c009005}, + {"VUID-VkMacOSSurfaceCreateInfoMVK-pNext-pNext", VALIDATION_ERROR_0c01c40d}, + {"VUID-VkMacOSSurfaceCreateInfoMVK-sType-sType", VALIDATION_ERROR_0c02b00b}, + {"VUID-VkMappedMemoryRange-memory-00684", VALIDATION_ERROR_0c200558}, + {"VUID-VkMappedMemoryRange-size-00685", VALIDATION_ERROR_0c20055a}, + {"VUID-VkMappedMemoryRange-size-00686", VALIDATION_ERROR_0c20055c}, + {"VUID-VkMappedMemoryRange-offset-00687", VALIDATION_ERROR_0c20055e}, + {"VUID-VkMappedMemoryRange-size-01389", VALIDATION_ERROR_0c200ada}, + {"VUID-VkMappedMemoryRange-size-01390", VALIDATION_ERROR_0c200adc}, + {"VUID-VkMappedMemoryRange-memory-parameter", VALIDATION_ERROR_0c20c601}, + {"VUID-VkMappedMemoryRange-pNext-pNext", VALIDATION_ERROR_0c21c40d}, + {"VUID-VkMappedMemoryRange-sType-sType", VALIDATION_ERROR_0c22b00b}, + {"VUID-VkMemoryAllocateFlagsInfo-deviceMask-00675", VALIDATION_ERROR_0c400546}, + {"VUID-VkMemoryAllocateFlagsInfo-deviceMask-00676", VALIDATION_ERROR_0c400548}, + {"VUID-VkMemoryAllocateFlagsInfo-flags-parameter", VALIDATION_ERROR_0c409001}, + {"VUID-VkMemoryAllocateFlagsInfo-sType-sType", VALIDATION_ERROR_0c42b00b}, + {"VUID-VkMemoryAllocateInfo-allocationSize-00638", VALIDATION_ERROR_0c6004fc}, + {"VUID-VkMemoryAllocateInfo-pNext-00639", VALIDATION_ERROR_0c6004fe}, + {"VUID-VkMemoryAllocateInfo-pNext-00640", VALIDATION_ERROR_0c600500}, + {"VUID-VkMemoryAllocateInfo-pNext-00641", VALIDATION_ERROR_0c600502}, + {"VUID-VkMemoryAllocateInfo-None-00643", VALIDATION_ERROR_0c600506}, + {"VUID-VkMemoryAllocateInfo-None-00644", VALIDATION_ERROR_0c600508}, + {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-00645", VALIDATION_ERROR_0c60050a}, + {"VUID-VkMemoryAllocateInfo-allocationSize-00646", VALIDATION_ERROR_0c60050c}, + {"VUID-VkMemoryAllocateInfo-allocationSize-00647", VALIDATION_ERROR_0c60050e}, + {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-00648", VALIDATION_ERROR_0c600510}, + {"VUID-VkMemoryAllocateInfo-allocationSize-01742", VALIDATION_ERROR_0c600d9c}, + {"VUID-VkMemoryAllocateInfo-allocationSize-01743", VALIDATION_ERROR_0c600d9e}, + {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-01744", VALIDATION_ERROR_0c600da0}, + {"VUID-VkMemoryAllocateInfo-allocationSize-01745", VALIDATION_ERROR_0c600da2}, + {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-01872", VALIDATION_ERROR_0c600ea0}, + {"VUID-VkMemoryAllocateInfo-None-01873", VALIDATION_ERROR_0c600ea2}, + {"VUID-VkMemoryAllocateInfo-pNext-01874", VALIDATION_ERROR_0c600ea4}, + {"VUID-VkMemoryAllocateInfo-pNext-01875", VALIDATION_ERROR_0c600ea6}, + {"VUID-VkMemoryAllocateInfo-pNext-pNext", VALIDATION_ERROR_0c61c40d}, + {"VUID-VkMemoryAllocateInfo-sType-sType", VALIDATION_ERROR_0c62b00b}, + {"VUID-VkMemoryAllocateInfo-sType-unique", VALIDATION_ERROR_0c62b00f}, + {"VUID-VkMemoryBarrier-dstAccessMask-parameter", VALIDATION_ERROR_0c806801}, + {"VUID-VkMemoryBarrier-pNext-pNext", VALIDATION_ERROR_0c81c40d}, + {"VUID-VkMemoryBarrier-sType-sType", VALIDATION_ERROR_0c82b00b}, + {"VUID-VkMemoryBarrier-srcAccessMask-parameter", VALIDATION_ERROR_0c82c401}, + {"VUID-VkMirSurfaceCreateInfoKHR-connection-01263", VALIDATION_ERROR_0ca009de}, + {"VUID-VkMirSurfaceCreateInfoKHR-surface-01264", VALIDATION_ERROR_0ca009e0}, + {"VUID-VkMirSurfaceCreateInfoKHR-flags-zerobitmask", VALIDATION_ERROR_0ca09005}, + {"VUID-VkMirSurfaceCreateInfoKHR-pNext-pNext", VALIDATION_ERROR_0ca1c40d}, + {"VUID-VkMirSurfaceCreateInfoKHR-sType-sType", VALIDATION_ERROR_0ca2b00b}, + {"VUID-VkObjectTableCreateInfoNVX-computeBindingPointSupport-01355", VALIDATION_ERROR_0cc00a96}, + {"VUID-VkObjectTableCreateInfoNVX-pObjectEntryCounts-01356", VALIDATION_ERROR_0cc00a98}, + {"VUID-VkObjectTableCreateInfoNVX-maxUniformBuffersPerDescriptor-01357", VALIDATION_ERROR_0cc00a9a}, + {"VUID-VkObjectTableCreateInfoNVX-maxStorageBuffersPerDescriptor-01358", VALIDATION_ERROR_0cc00a9c}, + {"VUID-VkObjectTableCreateInfoNVX-maxStorageImagesPerDescriptor-01359", VALIDATION_ERROR_0cc00a9e}, + {"VUID-VkObjectTableCreateInfoNVX-maxSampledImagesPerDescriptor-01360", VALIDATION_ERROR_0cc00aa0}, + {"VUID-VkObjectTableCreateInfoNVX-objectCount-arraylength", VALIDATION_ERROR_0cc0d61b}, + {"VUID-VkObjectTableCreateInfoNVX-pNext-pNext", VALIDATION_ERROR_0cc1c40d}, + {"VUID-VkObjectTableCreateInfoNVX-pObjectEntryCounts-parameter", VALIDATION_ERROR_0cc1c601}, + {"VUID-VkObjectTableCreateInfoNVX-pObjectEntryTypes-parameter", VALIDATION_ERROR_0cc1c801}, + {"VUID-VkObjectTableCreateInfoNVX-pObjectEntryUsageFlags-parameter", VALIDATION_ERROR_0cc1ca01}, + {"VUID-VkObjectTableCreateInfoNVX-pObjectEntryUsageFlags-requiredbitmask", VALIDATION_ERROR_0cc1ca03}, + {"VUID-VkObjectTableCreateInfoNVX-sType-sType", VALIDATION_ERROR_0cc2b00b}, + {"VUID-VkObjectTableDescriptorSetEntryNVX-commonparent", VALIDATION_ERROR_0ce00009}, + {"VUID-VkObjectTableDescriptorSetEntryNVX-type-01369", VALIDATION_ERROR_0ce00ab2}, + {"VUID-VkObjectTableDescriptorSetEntryNVX-descriptorSet-parameter", VALIDATION_ERROR_0ce04801}, + {"VUID-VkObjectTableDescriptorSetEntryNVX-flags-parameter", VALIDATION_ERROR_0ce09001}, + {"VUID-VkObjectTableDescriptorSetEntryNVX-flags-requiredbitmask", VALIDATION_ERROR_0ce09003}, + {"VUID-VkObjectTableDescriptorSetEntryNVX-pipelineLayout-parameter", VALIDATION_ERROR_0ce28201}, + {"VUID-VkObjectTableDescriptorSetEntryNVX-type-parameter", VALIDATION_ERROR_0ce30401}, + {"VUID-VkObjectTableEntryNVX-computeBindingPointSupport-01367", VALIDATION_ERROR_0d000aae}, + {"VUID-VkObjectTableEntryNVX-flags-parameter", VALIDATION_ERROR_0d009001}, + {"VUID-VkObjectTableEntryNVX-flags-requiredbitmask", VALIDATION_ERROR_0d009003}, + {"VUID-VkObjectTableEntryNVX-type-parameter", VALIDATION_ERROR_0d030401}, + {"VUID-VkObjectTableIndexBufferEntryNVX-type-01371", VALIDATION_ERROR_0d200ab6}, + {"VUID-VkObjectTableIndexBufferEntryNVX-buffer-parameter", VALIDATION_ERROR_0d201a01}, + {"VUID-VkObjectTableIndexBufferEntryNVX-flags-parameter", VALIDATION_ERROR_0d209001}, + {"VUID-VkObjectTableIndexBufferEntryNVX-flags-requiredbitmask", VALIDATION_ERROR_0d209003}, + {"VUID-VkObjectTableIndexBufferEntryNVX-indexType-parameter", VALIDATION_ERROR_0d20b201}, + {"VUID-VkObjectTableIndexBufferEntryNVX-type-parameter", VALIDATION_ERROR_0d230401}, + {"VUID-VkObjectTablePipelineEntryNVX-type-01368", VALIDATION_ERROR_0d400ab0}, + {"VUID-VkObjectTablePipelineEntryNVX-flags-parameter", VALIDATION_ERROR_0d409001}, + {"VUID-VkObjectTablePipelineEntryNVX-flags-requiredbitmask", VALIDATION_ERROR_0d409003}, + {"VUID-VkObjectTablePipelineEntryNVX-pipeline-parameter", VALIDATION_ERROR_0d427c01}, + {"VUID-VkObjectTablePipelineEntryNVX-type-parameter", VALIDATION_ERROR_0d430401}, + {"VUID-VkObjectTablePushConstantEntryNVX-type-01372", VALIDATION_ERROR_0d600ab8}, + {"VUID-VkObjectTablePushConstantEntryNVX-flags-parameter", VALIDATION_ERROR_0d609001}, + {"VUID-VkObjectTablePushConstantEntryNVX-flags-requiredbitmask", VALIDATION_ERROR_0d609003}, + {"VUID-VkObjectTablePushConstantEntryNVX-pipelineLayout-parameter", VALIDATION_ERROR_0d628201}, + {"VUID-VkObjectTablePushConstantEntryNVX-stageFlags-parameter", VALIDATION_ERROR_0d62dc01}, + {"VUID-VkObjectTablePushConstantEntryNVX-stageFlags-requiredbitmask", VALIDATION_ERROR_0d62dc03}, + {"VUID-VkObjectTablePushConstantEntryNVX-type-parameter", VALIDATION_ERROR_0d630401}, + {"VUID-VkObjectTableVertexBufferEntryNVX-type-01370", VALIDATION_ERROR_0d800ab4}, + {"VUID-VkObjectTableVertexBufferEntryNVX-buffer-parameter", VALIDATION_ERROR_0d801a01}, + {"VUID-VkObjectTableVertexBufferEntryNVX-flags-parameter", VALIDATION_ERROR_0d809001}, + {"VUID-VkObjectTableVertexBufferEntryNVX-flags-requiredbitmask", VALIDATION_ERROR_0d809003}, + {"VUID-VkObjectTableVertexBufferEntryNVX-type-parameter", VALIDATION_ERROR_0d830401}, + {"VUID-VkPhysicalDeviceDiscardRectanglePropertiesEXT-sType-sType", VALIDATION_ERROR_0da2b00b}, + {"VUID-VkPhysicalDeviceExternalBufferInfo-flags-parameter", VALIDATION_ERROR_0dc09001}, + {"VUID-VkPhysicalDeviceExternalBufferInfo-handleType-parameter", VALIDATION_ERROR_0dc09c01}, + {"VUID-VkPhysicalDeviceExternalBufferInfo-pNext-pNext", VALIDATION_ERROR_0dc1c40d}, + {"VUID-VkPhysicalDeviceExternalBufferInfo-sType-sType", VALIDATION_ERROR_0dc2b00b}, + {"VUID-VkPhysicalDeviceExternalBufferInfo-usage-parameter", VALIDATION_ERROR_0dc30601}, + {"VUID-VkPhysicalDeviceExternalBufferInfo-usage-requiredbitmask", VALIDATION_ERROR_0dc30603}, + {"VUID-VkPhysicalDeviceExternalImageFormatInfo-handleType-parameter", VALIDATION_ERROR_0de09c01}, + {"VUID-VkPhysicalDeviceExternalImageFormatInfo-sType-sType", VALIDATION_ERROR_0de2b00b}, + {"VUID-VkPhysicalDeviceExternalSemaphoreInfo-handleType-parameter", VALIDATION_ERROR_0e009c01}, + {"VUID-VkPhysicalDeviceExternalSemaphoreInfo-pNext-pNext", VALIDATION_ERROR_0e01c40d}, + {"VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-sType", VALIDATION_ERROR_0e02b00b}, + {"VUID-VkPhysicalDeviceFeatures2-sType-sType", VALIDATION_ERROR_0e42b00b}, + {"VUID-VkPhysicalDeviceImageFormatInfo2-flags-parameter", VALIDATION_ERROR_0e609001}, + {"VUID-VkPhysicalDeviceImageFormatInfo2-format-parameter", VALIDATION_ERROR_0e609201}, + {"VUID-VkPhysicalDeviceImageFormatInfo2-pNext-pNext", VALIDATION_ERROR_0e61c40d}, + {"VUID-VkPhysicalDeviceImageFormatInfo2-sType-sType", VALIDATION_ERROR_0e62b00b}, + {"VUID-VkPhysicalDeviceImageFormatInfo2-tiling-parameter", VALIDATION_ERROR_0e62fa01}, + {"VUID-VkPhysicalDeviceImageFormatInfo2-type-parameter", VALIDATION_ERROR_0e630401}, + {"VUID-VkPhysicalDeviceImageFormatInfo2-usage-parameter", VALIDATION_ERROR_0e630601}, + {"VUID-VkPhysicalDeviceImageFormatInfo2-usage-requiredbitmask", VALIDATION_ERROR_0e630603}, + {"VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580", VALIDATION_ERROR_0e800488}, + {"VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581", VALIDATION_ERROR_0e80048a}, + {"VUID-VkPhysicalDeviceMultiviewFeatures-sType-sType", VALIDATION_ERROR_0e82b00b}, + {"VUID-VkPhysicalDevicePushDescriptorPropertiesKHR-sType-sType", VALIDATION_ERROR_0ea2b00b}, + {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-01095", VALIDATION_ERROR_0ec0088e}, + {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-format-parameter", VALIDATION_ERROR_0ec09201}, + {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-pNext-pNext", VALIDATION_ERROR_0ec1c40d}, + {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-sType-sType", VALIDATION_ERROR_0ec2b00b}, + {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-parameter", VALIDATION_ERROR_0ec2b401}, + {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-tiling-parameter", VALIDATION_ERROR_0ec2fa01}, + {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-type-parameter", VALIDATION_ERROR_0ec30401}, + {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-parameter", VALIDATION_ERROR_0ec30601}, + {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-requiredbitmask", VALIDATION_ERROR_0ec30603}, + {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-pNext-pNext", VALIDATION_ERROR_0ee1c40d}, + {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-sType-sType", VALIDATION_ERROR_0ee2b00b}, + {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-surface-parameter", VALIDATION_ERROR_0ee2ec01}, + {"VUID-VkPipelineCacheCreateInfo-initialDataSize-00768", VALIDATION_ERROR_0f000600}, + {"VUID-VkPipelineCacheCreateInfo-initialDataSize-00769", VALIDATION_ERROR_0f000602}, + {"VUID-VkPipelineCacheCreateInfo-flags-zerobitmask", VALIDATION_ERROR_0f009005}, + {"VUID-VkPipelineCacheCreateInfo-pInitialData-parameter", VALIDATION_ERROR_0f019601}, + {"VUID-VkPipelineCacheCreateInfo-pNext-pNext", VALIDATION_ERROR_0f01c40d}, + {"VUID-VkPipelineCacheCreateInfo-sType-sType", VALIDATION_ERROR_0f02b00b}, + {"VUID-VkPipelineColorBlendAttachmentState-srcColorBlendFactor-00608", VALIDATION_ERROR_0f2004c0}, + {"VUID-VkPipelineColorBlendAttachmentState-dstColorBlendFactor-00609", VALIDATION_ERROR_0f2004c2}, + {"VUID-VkPipelineColorBlendAttachmentState-srcAlphaBlendFactor-00610", VALIDATION_ERROR_0f2004c4}, + {"VUID-VkPipelineColorBlendAttachmentState-dstAlphaBlendFactor-00611", VALIDATION_ERROR_0f2004c6}, + {"VUID-VkPipelineColorBlendAttachmentState-alphaBlendOp-parameter", VALIDATION_ERROR_0f200801}, + {"VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-01406", VALIDATION_ERROR_0f200afc}, + {"VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01407", VALIDATION_ERROR_0f200afe}, + {"VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01408", VALIDATION_ERROR_0f200b00}, + {"VUID-VkPipelineColorBlendAttachmentState-advancedBlendAllOperations-01409", VALIDATION_ERROR_0f200b02}, + {"VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-01410", VALIDATION_ERROR_0f200b04}, + {"VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-parameter", VALIDATION_ERROR_0f202001}, + {"VUID-VkPipelineColorBlendAttachmentState-colorWriteMask-parameter", VALIDATION_ERROR_0f202201}, + {"VUID-VkPipelineColorBlendAttachmentState-dstAlphaBlendFactor-parameter", VALIDATION_ERROR_0f206a01}, + {"VUID-VkPipelineColorBlendAttachmentState-dstColorBlendFactor-parameter", VALIDATION_ERROR_0f207001}, + {"VUID-VkPipelineColorBlendAttachmentState-srcAlphaBlendFactor-parameter", VALIDATION_ERROR_0f22c601}, + {"VUID-VkPipelineColorBlendAttachmentState-srcColorBlendFactor-parameter", VALIDATION_ERROR_0f22cc01}, + {"VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605", VALIDATION_ERROR_0f4004ba}, + {"VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00606", VALIDATION_ERROR_0f4004bc}, + {"VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00607", VALIDATION_ERROR_0f4004be}, + {"VUID-VkPipelineColorBlendStateCreateInfo-flags-zerobitmask", VALIDATION_ERROR_0f409005}, + {"VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-parameter", VALIDATION_ERROR_0f40f201}, + {"VUID-VkPipelineColorBlendStateCreateInfo-pNext-pNext", VALIDATION_ERROR_0f41c40d}, + {"VUID-VkPipelineColorBlendStateCreateInfo-sType-sType", VALIDATION_ERROR_0f42b00b}, + {"VUID-VkPipelineDepthStencilStateCreateInfo-depthBoundsTestEnable-00598", VALIDATION_ERROR_0f6004ac}, + {"VUID-VkPipelineDepthStencilStateCreateInfo-back-parameter", VALIDATION_ERROR_0f601201}, + {"VUID-VkPipelineDepthStencilStateCreateInfo-depthCompareOp-parameter", VALIDATION_ERROR_0f604001}, + {"VUID-VkPipelineDepthStencilStateCreateInfo-flags-zerobitmask", VALIDATION_ERROR_0f609005}, + {"VUID-VkPipelineDepthStencilStateCreateInfo-front-parameter", VALIDATION_ERROR_0f609601}, + {"VUID-VkPipelineDepthStencilStateCreateInfo-pNext-pNext", VALIDATION_ERROR_0f61c40d}, + {"VUID-VkPipelineDepthStencilStateCreateInfo-sType-sType", VALIDATION_ERROR_0f62b00b}, + {"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleCount-00582", VALIDATION_ERROR_0f80048c}, + {"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleMode-parameter", VALIDATION_ERROR_0f805e01}, + {"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-flags-zerobitmask", VALIDATION_ERROR_0f809005}, + {"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-sType-sType", VALIDATION_ERROR_0f82b00b}, + {"VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442", VALIDATION_ERROR_0fa00b44}, + {"VUID-VkPipelineDynamicStateCreateInfo-dynamicStateCount-arraylength", VALIDATION_ERROR_0fa07c1b}, + {"VUID-VkPipelineDynamicStateCreateInfo-flags-zerobitmask", VALIDATION_ERROR_0fa09005}, + {"VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-parameter", VALIDATION_ERROR_0fa15801}, + {"VUID-VkPipelineDynamicStateCreateInfo-pNext-pNext", VALIDATION_ERROR_0fa1c40d}, + {"VUID-VkPipelineDynamicStateCreateInfo-sType-sType", VALIDATION_ERROR_0fa2b00b}, + {"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428", VALIDATION_ERROR_0fc00358}, + {"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00429", VALIDATION_ERROR_0fc0035a}, + {"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00430", VALIDATION_ERROR_0fc0035c}, + {"VUID-VkPipelineInputAssemblyStateCreateInfo-flags-zerobitmask", VALIDATION_ERROR_0fc09005}, + {"VUID-VkPipelineInputAssemblyStateCreateInfo-pNext-pNext", VALIDATION_ERROR_0fc1c40d}, + {"VUID-VkPipelineInputAssemblyStateCreateInfo-sType-sType", VALIDATION_ERROR_0fc2b00b}, + {"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-parameter", VALIDATION_ERROR_0fc30001}, + {"VUID-VkPipelineLayoutCreateInfo-setLayoutCount-00286", VALIDATION_ERROR_0fe0023c}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00287", VALIDATION_ERROR_0fe0023e}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00288", VALIDATION_ERROR_0fe00240}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00289", VALIDATION_ERROR_0fe00242}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00290", VALIDATION_ERROR_0fe00244}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00291", VALIDATION_ERROR_0fe00246}, + {"VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-00292", VALIDATION_ERROR_0fe00248}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00293", VALIDATION_ERROR_0fe0024a}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01676", VALIDATION_ERROR_0fe00d18}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01677", VALIDATION_ERROR_0fe00d1a}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01678", VALIDATION_ERROR_0fe00d1c}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01679", VALIDATION_ERROR_0fe00d1e}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01680", VALIDATION_ERROR_0fe00d20}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01681", VALIDATION_ERROR_0fe00d22}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01682", VALIDATION_ERROR_0fe00d24}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01683", VALIDATION_ERROR_0fe00d26}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01684", VALIDATION_ERROR_0fe00d28}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03016", VALIDATION_ERROR_0fe01790}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03017", VALIDATION_ERROR_0fe01792}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03018", VALIDATION_ERROR_0fe01794}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03019", VALIDATION_ERROR_0fe01796}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03020", VALIDATION_ERROR_0fe01798}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03021", VALIDATION_ERROR_0fe0179a}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03022", VALIDATION_ERROR_0fe0179c}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03023", VALIDATION_ERROR_0fe0179e}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03024", VALIDATION_ERROR_0fe017a0}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03025", VALIDATION_ERROR_0fe017a2}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03026", VALIDATION_ERROR_0fe017a4}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03027", VALIDATION_ERROR_0fe017a6}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03028", VALIDATION_ERROR_0fe017a8}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03029", VALIDATION_ERROR_0fe017aa}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03030", VALIDATION_ERROR_0fe017ac}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03031", VALIDATION_ERROR_0fe017ae}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03032", VALIDATION_ERROR_0fe017b0}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03033", VALIDATION_ERROR_0fe017b2}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03034", VALIDATION_ERROR_0fe017b4}, + {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03035", VALIDATION_ERROR_0fe017b6}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03036", VALIDATION_ERROR_0fe017b8}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03037", VALIDATION_ERROR_0fe017ba}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03038", VALIDATION_ERROR_0fe017bc}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03039", VALIDATION_ERROR_0fe017be}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03040", VALIDATION_ERROR_0fe017c0}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03041", VALIDATION_ERROR_0fe017c2}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03042", VALIDATION_ERROR_0fe017c4}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03043", VALIDATION_ERROR_0fe017c6}, + {"VUID-VkPipelineLayoutCreateInfo-flags-zerobitmask", VALIDATION_ERROR_0fe09005}, + {"VUID-VkPipelineLayoutCreateInfo-pNext-pNext", VALIDATION_ERROR_0fe1c40d}, + {"VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-parameter", VALIDATION_ERROR_0fe1f801}, + {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-parameter", VALIDATION_ERROR_0fe22c01}, + {"VUID-VkPipelineLayoutCreateInfo-sType-sType", VALIDATION_ERROR_0fe2b00b}, + {"VUID-VkPipelineMultisampleStateCreateInfo-sampleShadingEnable-00784", VALIDATION_ERROR_10000620}, + {"VUID-VkPipelineMultisampleStateCreateInfo-alphaToOneEnable-00785", VALIDATION_ERROR_10000622}, + {"VUID-VkPipelineMultisampleStateCreateInfo-minSampleShading-00786", VALIDATION_ERROR_10000624}, + {"VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-01415", VALIDATION_ERROR_10000b0e}, + {"VUID-VkPipelineMultisampleStateCreateInfo-flags-zerobitmask", VALIDATION_ERROR_10009005}, + {"VUID-VkPipelineMultisampleStateCreateInfo-pNext-pNext", VALIDATION_ERROR_1001c40d}, + {"VUID-VkPipelineMultisampleStateCreateInfo-pSampleMask-parameter", VALIDATION_ERROR_10022201}, + {"VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-parameter", VALIDATION_ERROR_1002a801}, + {"VUID-VkPipelineMultisampleStateCreateInfo-sType-sType", VALIDATION_ERROR_1002b00b}, + {"VUID-VkPipelineMultisampleStateCreateInfo-sType-unique", VALIDATION_ERROR_1002b00f}, + {"VUID-VkPipelineRasterizationStateCreateInfo-depthClampEnable-00782", VALIDATION_ERROR_1020061c}, + {"VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01413", VALIDATION_ERROR_10200b0a}, + {"VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01414", VALIDATION_ERROR_10200b0c}, + {"VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01507", VALIDATION_ERROR_10200bc6}, + {"VUID-VkPipelineRasterizationStateCreateInfo-cullMode-parameter", VALIDATION_ERROR_10203a01}, + {"VUID-VkPipelineRasterizationStateCreateInfo-flags-zerobitmask", VALIDATION_ERROR_10209005}, + {"VUID-VkPipelineRasterizationStateCreateInfo-frontFace-parameter", VALIDATION_ERROR_10209801}, + {"VUID-VkPipelineRasterizationStateCreateInfo-pNext-pNext", VALIDATION_ERROR_1021c40d}, + {"VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-parameter", VALIDATION_ERROR_10228601}, + {"VUID-VkPipelineRasterizationStateCreateInfo-sType-sType", VALIDATION_ERROR_1022b00b}, + {"VUID-VkPipelineRasterizationStateCreateInfo-sType-unique", VALIDATION_ERROR_1022b00f}, + {"VUID-VkPipelineRasterizationStateRasterizationOrderAMD-rasterizationOrder-parameter", VALIDATION_ERROR_1042a601}, + {"VUID-VkPipelineRasterizationStateRasterizationOrderAMD-sType-sType", VALIDATION_ERROR_1042b00b}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-00704", VALIDATION_ERROR_10600580}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-00705", VALIDATION_ERROR_10600582}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-00706", VALIDATION_ERROR_10600584}, + {"VUID-VkPipelineShaderStageCreateInfo-pName-00707", VALIDATION_ERROR_10600586}, + {"VUID-VkPipelineShaderStageCreateInfo-maxClipDistances-00708", VALIDATION_ERROR_10600588}, + {"VUID-VkPipelineShaderStageCreateInfo-maxCullDistances-00709", VALIDATION_ERROR_1060058a}, + {"VUID-VkPipelineShaderStageCreateInfo-maxCombinedClipAndCullDistances-00710", VALIDATION_ERROR_1060058c}, + {"VUID-VkPipelineShaderStageCreateInfo-maxSampleMaskWords-00711", VALIDATION_ERROR_1060058e}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-00712", VALIDATION_ERROR_10600590}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-00713", VALIDATION_ERROR_10600592}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-00714", VALIDATION_ERROR_10600594}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-00715", VALIDATION_ERROR_10600596}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-00716", VALIDATION_ERROR_10600598}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-00717", VALIDATION_ERROR_1060059a}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-00718", VALIDATION_ERROR_1060059c}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-00719", VALIDATION_ERROR_1060059e}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-01511", VALIDATION_ERROR_10600bce}, + {"VUID-VkPipelineShaderStageCreateInfo-flags-zerobitmask", VALIDATION_ERROR_10609005}, + {"VUID-VkPipelineShaderStageCreateInfo-module-parameter", VALIDATION_ERROR_1060d201}, + {"VUID-VkPipelineShaderStageCreateInfo-pName-parameter", VALIDATION_ERROR_1061c001}, + {"VUID-VkPipelineShaderStageCreateInfo-pNext-pNext", VALIDATION_ERROR_1061c40d}, + {"VUID-VkPipelineShaderStageCreateInfo-pSpecializationInfo-parameter", VALIDATION_ERROR_10623a01}, + {"VUID-VkPipelineShaderStageCreateInfo-sType-sType", VALIDATION_ERROR_1062b00b}, + {"VUID-VkPipelineShaderStageCreateInfo-stage-parameter", VALIDATION_ERROR_1062d801}, + {"VUID-VkPipelineTessellationStateCreateInfo-patchControlPoints-01214", VALIDATION_ERROR_1080097c}, + {"VUID-VkPipelineTessellationStateCreateInfo-flags-zerobitmask", VALIDATION_ERROR_10809005}, + {"VUID-VkPipelineTessellationStateCreateInfo-pNext-pNext", VALIDATION_ERROR_1081c40d}, + {"VUID-VkPipelineTessellationStateCreateInfo-sType-sType", VALIDATION_ERROR_1082b00b}, + {"VUID-VkPipelineVertexInputStateCreateInfo-vertexBindingDescriptionCount-00613", VALIDATION_ERROR_10a004ca}, + {"VUID-VkPipelineVertexInputStateCreateInfo-vertexAttributeDescriptionCount-00614", VALIDATION_ERROR_10a004cc}, + {"VUID-VkPipelineVertexInputStateCreateInfo-binding-00615", VALIDATION_ERROR_10a004ce}, + {"VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-00616", VALIDATION_ERROR_10a004d0}, + {"VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-00617", VALIDATION_ERROR_10a004d2}, + {"VUID-VkPipelineVertexInputStateCreateInfo-flags-zerobitmask", VALIDATION_ERROR_10a09005}, + {"VUID-VkPipelineVertexInputStateCreateInfo-pNext-pNext", VALIDATION_ERROR_10a1c40d}, + {"VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-parameter", VALIDATION_ERROR_10a26401}, + {"VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-parameter", VALIDATION_ERROR_10a26601}, + {"VUID-VkPipelineVertexInputStateCreateInfo-sType-sType", VALIDATION_ERROR_10a2b00b}, + {"VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216", VALIDATION_ERROR_10c00980}, + {"VUID-VkPipelineViewportStateCreateInfo-scissorCount-01217", VALIDATION_ERROR_10c00982}, + {"VUID-VkPipelineViewportStateCreateInfo-viewportCount-01218", VALIDATION_ERROR_10c00984}, + {"VUID-VkPipelineViewportStateCreateInfo-scissorCount-01219", VALIDATION_ERROR_10c00986}, + {"VUID-VkPipelineViewportStateCreateInfo-scissorCount-01220", VALIDATION_ERROR_10c00988}, + {"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726", VALIDATION_ERROR_10c00d7c}, + {"VUID-VkPipelineViewportStateCreateInfo-flags-zerobitmask", VALIDATION_ERROR_10c09005}, + {"VUID-VkPipelineViewportStateCreateInfo-pNext-pNext", VALIDATION_ERROR_10c1c40d}, + {"VUID-VkPipelineViewportStateCreateInfo-sType-sType", VALIDATION_ERROR_10c2b00b}, + {"VUID-VkPipelineViewportStateCreateInfo-sType-unique", VALIDATION_ERROR_10c2b00f}, + {"VUID-VkPipelineViewportStateCreateInfo-scissorCount-arraylength", VALIDATION_ERROR_10c2b61b}, + {"VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength", VALIDATION_ERROR_10c30a1b}, + {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-01215", VALIDATION_ERROR_10e0097e}, + {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-flags-zerobitmask", VALIDATION_ERROR_10e09005}, + {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-sType-sType", VALIDATION_ERROR_10e2b00b}, + {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-arraylength", VALIDATION_ERROR_10e30a1b}, + {"VUID-VkPipelineViewportWScalingStateCreateInfoNV-sType-sType", VALIDATION_ERROR_1102b00b}, + {"VUID-VkPipelineViewportWScalingStateCreateInfoNV-viewportCount-arraylength", VALIDATION_ERROR_11030a1b}, + {"VUID-VkPresentInfoKHR-commonparent", VALIDATION_ERROR_11200009}, + {"VUID-VkPresentInfoKHR-pImageIndices-01296", VALIDATION_ERROR_11200a20}, + {"VUID-VkPresentInfoKHR-pImageIndices-01430", VALIDATION_ERROR_11200b2c}, + {"VUID-VkPresentInfoKHR-pImageIndices-parameter", VALIDATION_ERROR_11218801}, + {"VUID-VkPresentInfoKHR-pNext-pNext", VALIDATION_ERROR_1121c40d}, + {"VUID-VkPresentInfoKHR-pResults-parameter", VALIDATION_ERROR_11221e01}, + {"VUID-VkPresentInfoKHR-pSwapchains-parameter", VALIDATION_ERROR_11225801}, + {"VUID-VkPresentInfoKHR-pWaitSemaphores-parameter", VALIDATION_ERROR_11227601}, + {"VUID-VkPresentInfoKHR-sType-sType", VALIDATION_ERROR_1122b00b}, + {"VUID-VkPresentInfoKHR-sType-unique", VALIDATION_ERROR_1122b00f}, + {"VUID-VkPresentInfoKHR-swapchainCount-arraylength", VALIDATION_ERROR_1122f21b}, + {"VUID-VkPresentRegionKHR-pRectangles-parameter", VALIDATION_ERROR_11420c01}, + {"VUID-VkPresentRegionsKHR-swapchainCount-01260", VALIDATION_ERROR_116009d8}, + {"VUID-VkPresentRegionsKHR-pRegions-parameter", VALIDATION_ERROR_11621001}, + {"VUID-VkPresentRegionsKHR-sType-sType", VALIDATION_ERROR_1162b00b}, + {"VUID-VkPresentRegionsKHR-swapchainCount-arraylength", VALIDATION_ERROR_1162f21b}, + {"VUID-VkPresentTimesInfoGOOGLE-swapchainCount-01247", VALIDATION_ERROR_118009be}, + {"VUID-VkPresentTimesInfoGOOGLE-pTimes-parameter", VALIDATION_ERROR_11825e01}, + {"VUID-VkPresentTimesInfoGOOGLE-sType-sType", VALIDATION_ERROR_1182b00b}, + {"VUID-VkPresentTimesInfoGOOGLE-swapchainCount-arraylength", VALIDATION_ERROR_1182f21b}, + {"VUID-VkPushConstantRange-offset-00294", VALIDATION_ERROR_11a0024c}, + {"VUID-VkPushConstantRange-offset-00295", VALIDATION_ERROR_11a0024e}, + {"VUID-VkPushConstantRange-size-00296", VALIDATION_ERROR_11a00250}, + {"VUID-VkPushConstantRange-size-00297", VALIDATION_ERROR_11a00252}, + {"VUID-VkPushConstantRange-size-00298", VALIDATION_ERROR_11a00254}, + {"VUID-VkPushConstantRange-stageFlags-parameter", VALIDATION_ERROR_11a2dc01}, + {"VUID-VkPushConstantRange-stageFlags-requiredbitmask", VALIDATION_ERROR_11a2dc03}, + {"VUID-VkQueryPoolCreateInfo-queryType-00791", VALIDATION_ERROR_11c0062e}, + {"VUID-VkQueryPoolCreateInfo-queryType-00792", VALIDATION_ERROR_11c00630}, + {"VUID-VkQueryPoolCreateInfo-flags-zerobitmask", VALIDATION_ERROR_11c09005}, + {"VUID-VkQueryPoolCreateInfo-pNext-pNext", VALIDATION_ERROR_11c1c40d}, + {"VUID-VkQueryPoolCreateInfo-queryType-parameter", VALIDATION_ERROR_11c29a01}, + {"VUID-VkQueryPoolCreateInfo-sType-sType", VALIDATION_ERROR_11c2b00b}, + {"VUID-VkRectLayerKHR-offset-01261", VALIDATION_ERROR_11e009da}, + {"VUID-VkRectLayerKHR-layer-01262", VALIDATION_ERROR_11e009dc}, + {"VUID-VkRenderPassBeginInfo-commonparent", VALIDATION_ERROR_12000009}, + {"VUID-VkRenderPassBeginInfo-clearValueCount-00902", VALIDATION_ERROR_1200070c}, + {"VUID-VkRenderPassBeginInfo-clearValueCount-00903", VALIDATION_ERROR_1200070e}, + {"VUID-VkRenderPassBeginInfo-renderPass-00904", VALIDATION_ERROR_12000710}, + {"VUID-VkRenderPassBeginInfo-framebuffer-parameter", VALIDATION_ERROR_12009401}, + {"VUID-VkRenderPassBeginInfo-pNext-pNext", VALIDATION_ERROR_1201c40d}, + {"VUID-VkRenderPassBeginInfo-renderPass-parameter", VALIDATION_ERROR_1202ae01}, + {"VUID-VkRenderPassBeginInfo-sType-sType", VALIDATION_ERROR_1202b00b}, + {"VUID-VkRenderPassBeginInfo-sType-unique", VALIDATION_ERROR_1202b00f}, + {"VUID-VkRenderPassCreateInfo-None-00832", VALIDATION_ERROR_12200680}, + {"VUID-VkRenderPassCreateInfo-attachment-00833", VALIDATION_ERROR_12200682}, + {"VUID-VkRenderPassCreateInfo-attachment-00834", VALIDATION_ERROR_12200684}, + {"VUID-VkRenderPassCreateInfo-pPreserveAttachments-00835", VALIDATION_ERROR_12200686}, + {"VUID-VkRenderPassCreateInfo-pAttachments-00836", VALIDATION_ERROR_12200688}, + {"VUID-VkRenderPassCreateInfo-pDependencies-00837", VALIDATION_ERROR_1220068a}, + {"VUID-VkRenderPassCreateInfo-pDependencies-00838", VALIDATION_ERROR_1220068c}, + {"VUID-VkRenderPassCreateInfo-pAttachments-01566", VALIDATION_ERROR_12200c3c}, + {"VUID-VkRenderPassCreateInfo-pAttachments-01567", VALIDATION_ERROR_12200c3e}, + {"VUID-VkRenderPassCreateInfo-pNext-01926", VALIDATION_ERROR_12200f0c}, + {"VUID-VkRenderPassCreateInfo-pNext-01927", VALIDATION_ERROR_12200f0e}, + {"VUID-VkRenderPassCreateInfo-pNext-01928", VALIDATION_ERROR_12200f10}, + {"VUID-VkRenderPassCreateInfo-pNext-01929", VALIDATION_ERROR_12200f12}, + {"VUID-VkRenderPassCreateInfo-pNext-01930", VALIDATION_ERROR_12200f14}, + {"VUID-VkRenderPassCreateInfo-flags-zerobitmask", VALIDATION_ERROR_12209005}, + {"VUID-VkRenderPassCreateInfo-pAttachments-parameter", VALIDATION_ERROR_1220f201}, + {"VUID-VkRenderPassCreateInfo-pDependencies-parameter", VALIDATION_ERROR_12212601}, + {"VUID-VkRenderPassCreateInfo-pNext-pNext", VALIDATION_ERROR_1221c40d}, + {"VUID-VkRenderPassCreateInfo-pSubpasses-parameter", VALIDATION_ERROR_12224201}, + {"VUID-VkRenderPassCreateInfo-sType-sType", VALIDATION_ERROR_1222b00b}, + {"VUID-VkRenderPassCreateInfo-sType-unique", VALIDATION_ERROR_1222b00f}, + {"VUID-VkRenderPassCreateInfo-subpassCount-arraylength", VALIDATION_ERROR_1222e61b}, + {"VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-00841", VALIDATION_ERROR_12400692}, + {"VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-parameter", VALIDATION_ERROR_12411a01}, + {"VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-parameter", VALIDATION_ERROR_12426c01}, + {"VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-parameter", VALIDATION_ERROR_12426e01}, + {"VUID-VkRenderPassMultiviewCreateInfo-sType-sType", VALIDATION_ERROR_1242b00b}, + {"VUID-VkSamplerCreateInfo-addressModeU-parameter", VALIDATION_ERROR_12600201}, + {"VUID-VkSamplerCreateInfo-addressModeV-parameter", VALIDATION_ERROR_12600401}, + {"VUID-VkSamplerCreateInfo-addressModeW-parameter", VALIDATION_ERROR_12600601}, + {"VUID-VkSamplerCreateInfo-mipLodBias-01069", VALIDATION_ERROR_1260085a}, + {"VUID-VkSamplerCreateInfo-anisotropyEnable-01070", VALIDATION_ERROR_1260085c}, + {"VUID-VkSamplerCreateInfo-anisotropyEnable-01071", VALIDATION_ERROR_1260085e}, + {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01072", VALIDATION_ERROR_12600860}, + {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01073", VALIDATION_ERROR_12600862}, + {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01074", VALIDATION_ERROR_12600864}, + {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01075", VALIDATION_ERROR_12600866}, + {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01076", VALIDATION_ERROR_12600868}, + {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01077", VALIDATION_ERROR_1260086a}, + {"VUID-VkSamplerCreateInfo-addressModeU-01078", VALIDATION_ERROR_1260086c}, + {"VUID-VkSamplerCreateInfo-addressModeU-01079", VALIDATION_ERROR_1260086e}, + {"VUID-VkSamplerCreateInfo-compareEnable-01080", VALIDATION_ERROR_12600870}, + {"VUID-VkSamplerCreateInfo-magFilter-01081", VALIDATION_ERROR_12600872}, + {"VUID-VkSamplerCreateInfo-magFilter-01422", VALIDATION_ERROR_12600b1c}, + {"VUID-VkSamplerCreateInfo-compareEnable-01423", VALIDATION_ERROR_12600b1e}, + {"VUID-VkSamplerCreateInfo-minFilter-01645", VALIDATION_ERROR_12600cda}, + {"VUID-VkSamplerCreateInfo-addressModeU-01646", VALIDATION_ERROR_12600cdc}, + {"VUID-VkSamplerCreateInfo-None-01647", VALIDATION_ERROR_12600cde}, + {"VUID-VkSamplerCreateInfo-flags-zerobitmask", VALIDATION_ERROR_12609005}, + {"VUID-VkSamplerCreateInfo-magFilter-parameter", VALIDATION_ERROR_1260c401}, + {"VUID-VkSamplerCreateInfo-minFilter-parameter", VALIDATION_ERROR_1260ca01}, + {"VUID-VkSamplerCreateInfo-mipmapMode-parameter", VALIDATION_ERROR_1260cc01}, + {"VUID-VkSamplerCreateInfo-pNext-pNext", VALIDATION_ERROR_1261c40d}, + {"VUID-VkSamplerCreateInfo-sType-sType", VALIDATION_ERROR_1262b00b}, + {"VUID-VkSamplerCreateInfo-sType-unique", VALIDATION_ERROR_1262b00f}, + {"VUID-VkSemaphoreCreateInfo-flags-zerobitmask", VALIDATION_ERROR_12809005}, + {"VUID-VkSemaphoreCreateInfo-pNext-pNext", VALIDATION_ERROR_1281c40d}, + {"VUID-VkSemaphoreCreateInfo-sType-sType", VALIDATION_ERROR_1282b00b}, + {"VUID-VkSemaphoreCreateInfo-sType-unique", VALIDATION_ERROR_1282b00f}, + {"VUID-VkShaderModuleCreateInfo-codeSize-01085", VALIDATION_ERROR_12a0087a}, + {"VUID-VkShaderModuleCreateInfo-codeSize-01086", VALIDATION_ERROR_12a0087c}, + {"VUID-VkShaderModuleCreateInfo-pCode-01087", VALIDATION_ERROR_12a0087e}, + {"VUID-VkShaderModuleCreateInfo-pCode-01088", VALIDATION_ERROR_12a00880}, + {"VUID-VkShaderModuleCreateInfo-pCode-01089", VALIDATION_ERROR_12a00882}, + {"VUID-VkShaderModuleCreateInfo-pCode-01090", VALIDATION_ERROR_12a00884}, + {"VUID-VkShaderModuleCreateInfo-pCode-01091", VALIDATION_ERROR_12a00886}, + {"VUID-VkShaderModuleCreateInfo-pCode-01376", VALIDATION_ERROR_12a00ac0}, + {"VUID-VkShaderModuleCreateInfo-pCode-01377", VALIDATION_ERROR_12a00ac2}, + {"VUID-VkShaderModuleCreateInfo-pCode-01378", VALIDATION_ERROR_12a00ac4}, + {"VUID-VkShaderModuleCreateInfo-pCode-01379", VALIDATION_ERROR_12a00ac6}, + {"VUID-VkShaderModuleCreateInfo-flags-zerobitmask", VALIDATION_ERROR_12a09005}, + {"VUID-VkShaderModuleCreateInfo-pCode-parameter", VALIDATION_ERROR_12a10c01}, + {"VUID-VkShaderModuleCreateInfo-pNext-pNext", VALIDATION_ERROR_12a1c40d}, + {"VUID-VkShaderModuleCreateInfo-sType-sType", VALIDATION_ERROR_12a2b00b}, + {"VUID-VkSparseBufferMemoryBindInfo-bindCount-arraylength", VALIDATION_ERROR_12c0141b}, + {"VUID-VkSparseBufferMemoryBindInfo-buffer-parameter", VALIDATION_ERROR_12c01a01}, + {"VUID-VkSparseBufferMemoryBindInfo-pBinds-parameter", VALIDATION_ERROR_12c0fe01}, + {"VUID-VkSparseImageMemoryBind-memory-01104", VALIDATION_ERROR_12e008a0}, + {"VUID-VkSparseImageMemoryBind-memory-01105", VALIDATION_ERROR_12e008a2}, + {"VUID-VkSparseImageMemoryBind-subresource-01106", VALIDATION_ERROR_12e008a4}, + {"VUID-VkSparseImageMemoryBind-offset-01107", VALIDATION_ERROR_12e008a6}, + {"VUID-VkSparseImageMemoryBind-extent-01108", VALIDATION_ERROR_12e008a8}, + {"VUID-VkSparseImageMemoryBind-offset-01109", VALIDATION_ERROR_12e008aa}, + {"VUID-VkSparseImageMemoryBind-extent-01110", VALIDATION_ERROR_12e008ac}, + {"VUID-VkSparseImageMemoryBind-offset-01111", VALIDATION_ERROR_12e008ae}, + {"VUID-VkSparseImageMemoryBind-extent-01112", VALIDATION_ERROR_12e008b0}, + {"VUID-VkSparseImageMemoryBind-flags-parameter", VALIDATION_ERROR_12e09001}, + {"VUID-VkSparseImageMemoryBind-memory-parameter", VALIDATION_ERROR_12e0c601}, + {"VUID-VkSparseImageMemoryBind-subresource-parameter", VALIDATION_ERROR_12e2e801}, + {"VUID-VkSparseImageMemoryBindInfo-subresource-01722", VALIDATION_ERROR_13000d74}, + {"VUID-VkSparseImageMemoryBindInfo-subresource-01723", VALIDATION_ERROR_13000d76}, + {"VUID-VkSparseImageMemoryBindInfo-bindCount-arraylength", VALIDATION_ERROR_1300141b}, + {"VUID-VkSparseImageMemoryBindInfo-image-parameter", VALIDATION_ERROR_1300a001}, + {"VUID-VkSparseImageMemoryBindInfo-pBinds-parameter", VALIDATION_ERROR_1300fe01}, + {"VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-01103", VALIDATION_ERROR_1320089e}, + {"VUID-VkSparseImageOpaqueMemoryBindInfo-bindCount-arraylength", VALIDATION_ERROR_1320141b}, + {"VUID-VkSparseImageOpaqueMemoryBindInfo-image-parameter", VALIDATION_ERROR_1320a001}, + {"VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-parameter", VALIDATION_ERROR_1320fe01}, + {"VUID-VkSparseMemoryBind-memory-01096", VALIDATION_ERROR_13400890}, + {"VUID-VkSparseMemoryBind-memory-01097", VALIDATION_ERROR_13400892}, + {"VUID-VkSparseMemoryBind-size-01098", VALIDATION_ERROR_13400894}, + {"VUID-VkSparseMemoryBind-resourceOffset-01099", VALIDATION_ERROR_13400896}, + {"VUID-VkSparseMemoryBind-size-01100", VALIDATION_ERROR_13400898}, + {"VUID-VkSparseMemoryBind-memoryOffset-01101", VALIDATION_ERROR_1340089a}, + {"VUID-VkSparseMemoryBind-size-01102", VALIDATION_ERROR_1340089c}, + {"VUID-VkSparseMemoryBind-flags-parameter", VALIDATION_ERROR_13409001}, + {"VUID-VkSparseMemoryBind-memory-parameter", VALIDATION_ERROR_1340c601}, + {"VUID-VkSpecializationInfo-offset-00773", VALIDATION_ERROR_1360060a}, + {"VUID-VkSpecializationInfo-pMapEntries-00774", VALIDATION_ERROR_1360060c}, + {"VUID-VkSpecializationInfo-mapEntryCount-00775", VALIDATION_ERROR_1360060e}, + {"VUID-VkSpecializationInfo-pData-parameter", VALIDATION_ERROR_13612201}, + {"VUID-VkSpecializationMapEntry-constantID-00776", VALIDATION_ERROR_13800610}, + {"VUID-VkStencilOpState-compareOp-parameter", VALIDATION_ERROR_13a02a01}, + {"VUID-VkStencilOpState-depthFailOp-parameter", VALIDATION_ERROR_13a04201}, + {"VUID-VkStencilOpState-failOp-parameter", VALIDATION_ERROR_13a08601}, + {"VUID-VkStencilOpState-passOp-parameter", VALIDATION_ERROR_13a27801}, + {"VUID-VkSubmitInfo-commonparent", VALIDATION_ERROR_13c00009}, + {"VUID-VkSubmitInfo-pCommandBuffers-00075", VALIDATION_ERROR_13c00096}, + {"VUID-VkSubmitInfo-pWaitDstStageMask-00076", VALIDATION_ERROR_13c00098}, + {"VUID-VkSubmitInfo-pWaitDstStageMask-00077", VALIDATION_ERROR_13c0009a}, + {"VUID-VkSubmitInfo-pWaitDstStageMask-00078", VALIDATION_ERROR_13c0009c}, + {"VUID-VkSubmitInfo-pCommandBuffers-parameter", VALIDATION_ERROR_13c11401}, + {"VUID-VkSubmitInfo-pNext-pNext", VALIDATION_ERROR_13c1c40d}, + {"VUID-VkSubmitInfo-pSignalSemaphores-parameter", VALIDATION_ERROR_13c23401}, + {"VUID-VkSubmitInfo-pWaitDstStageMask-parameter", VALIDATION_ERROR_13c27001}, + {"VUID-VkSubmitInfo-pWaitDstStageMask-requiredbitmask", VALIDATION_ERROR_13c27003}, + {"VUID-VkSubmitInfo-pWaitSemaphores-parameter", VALIDATION_ERROR_13c27601}, + {"VUID-VkSubmitInfo-sType-sType", VALIDATION_ERROR_13c2b00b}, + {"VUID-VkSubmitInfo-sType-unique", VALIDATION_ERROR_13c2b00f}, + {"VUID-VkSubpassDependency-srcSubpass-00858", VALIDATION_ERROR_13e006b4}, + {"VUID-VkSubpassDependency-dstSubpass-00859", VALIDATION_ERROR_13e006b6}, + {"VUID-VkSubpassDependency-srcStageMask-00860", VALIDATION_ERROR_13e006b8}, + {"VUID-VkSubpassDependency-dstStageMask-00861", VALIDATION_ERROR_13e006ba}, + {"VUID-VkSubpassDependency-srcStageMask-00862", VALIDATION_ERROR_13e006bc}, + {"VUID-VkSubpassDependency-dstStageMask-00863", VALIDATION_ERROR_13e006be}, + {"VUID-VkSubpassDependency-srcSubpass-00864", VALIDATION_ERROR_13e006c0}, + {"VUID-VkSubpassDependency-srcSubpass-00865", VALIDATION_ERROR_13e006c2}, + {"VUID-VkSubpassDependency-srcSubpass-00866", VALIDATION_ERROR_13e006c4}, + {"VUID-VkSubpassDependency-srcSubpass-00867", VALIDATION_ERROR_13e006c6}, + {"VUID-VkSubpassDependency-srcAccessMask-00868", VALIDATION_ERROR_13e006c8}, + {"VUID-VkSubpassDependency-dstAccessMask-00869", VALIDATION_ERROR_13e006ca}, + {"VUID-VkSubpassDependency-dependencyFlags-00870", VALIDATION_ERROR_13e006cc}, + {"VUID-VkSubpassDependency-dependencyFlags-00871", VALIDATION_ERROR_13e006ce}, + {"VUID-VkSubpassDependency-srcSubpass-00872", VALIDATION_ERROR_13e006d0}, + {"VUID-VkSubpassDependency-dependencyFlags-parameter", VALIDATION_ERROR_13e03e01}, + {"VUID-VkSubpassDependency-dstAccessMask-parameter", VALIDATION_ERROR_13e06801}, + {"VUID-VkSubpassDependency-dstStageMask-parameter", VALIDATION_ERROR_13e07801}, + {"VUID-VkSubpassDependency-dstStageMask-requiredbitmask", VALIDATION_ERROR_13e07803}, + {"VUID-VkSubpassDependency-srcAccessMask-parameter", VALIDATION_ERROR_13e2c401}, + {"VUID-VkSubpassDependency-srcStageMask-parameter", VALIDATION_ERROR_13e2d401}, + {"VUID-VkSubpassDependency-srcStageMask-requiredbitmask", VALIDATION_ERROR_13e2d403}, + {"VUID-VkSubpassDescription-pipelineBindPoint-00844", VALIDATION_ERROR_14000698}, + {"VUID-VkSubpassDescription-colorAttachmentCount-00845", VALIDATION_ERROR_1400069a}, + {"VUID-VkSubpassDescription-loadOp-00846", VALIDATION_ERROR_1400069c}, + {"VUID-VkSubpassDescription-pResolveAttachments-00847", VALIDATION_ERROR_1400069e}, + {"VUID-VkSubpassDescription-pResolveAttachments-00848", VALIDATION_ERROR_140006a0}, + {"VUID-VkSubpassDescription-pResolveAttachments-00849", VALIDATION_ERROR_140006a2}, + {"VUID-VkSubpassDescription-pResolveAttachments-00850", VALIDATION_ERROR_140006a4}, + {"VUID-VkSubpassDescription-None-00852", VALIDATION_ERROR_140006a8}, + {"VUID-VkSubpassDescription-attachment-00853", VALIDATION_ERROR_140006aa}, + {"VUID-VkSubpassDescription-pPreserveAttachments-00854", VALIDATION_ERROR_140006ac}, + {"VUID-VkSubpassDescription-layout-00855", VALIDATION_ERROR_140006ae}, + {"VUID-VkSubpassDescription-flags-00856", VALIDATION_ERROR_140006b0}, + {"VUID-VkSubpassDescription-pColorAttachments-01417", VALIDATION_ERROR_14000b12}, + {"VUID-VkSubpassDescription-pDepthStencilAttachment-01418", VALIDATION_ERROR_14000b14}, + {"VUID-VkSubpassDescription-pColorAttachments-01506", VALIDATION_ERROR_14000bc4}, + {"VUID-VkSubpassDescription-flags-parameter", VALIDATION_ERROR_14009001}, + {"VUID-VkSubpassDescription-pColorAttachments-parameter", VALIDATION_ERROR_14011001}, + {"VUID-VkSubpassDescription-pDepthStencilAttachment-parameter", VALIDATION_ERROR_14012a01}, + {"VUID-VkSubpassDescription-pInputAttachments-parameter", VALIDATION_ERROR_14019a01}, + {"VUID-VkSubpassDescription-pPreserveAttachments-parameter", VALIDATION_ERROR_1401f001}, + {"VUID-VkSubpassDescription-pResolveAttachments-parameter", VALIDATION_ERROR_14021c01}, + {"VUID-VkSubpassDescription-pipelineBindPoint-parameter", VALIDATION_ERROR_14027e01}, + {"VUID-VkSurfaceCapabilities2EXT-supportedSurfaceCounters-01246", VALIDATION_ERROR_142009bc}, + {"VUID-VkSurfaceCapabilities2EXT-pNext-pNext", VALIDATION_ERROR_1421c40d}, + {"VUID-VkSurfaceCapabilities2EXT-sType-sType", VALIDATION_ERROR_1422b00b}, + {"VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-01244", VALIDATION_ERROR_144009b8}, + {"VUID-VkSwapchainCounterCreateInfoEXT-sType-sType", VALIDATION_ERROR_1442b00b}, + {"VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-parameter", VALIDATION_ERROR_1442ee01}, + {"VUID-VkSwapchainCreateInfoKHR-commonparent", VALIDATION_ERROR_14600009}, + {"VUID-VkSwapchainCreateInfoKHR-surface-01270", VALIDATION_ERROR_146009ec}, + {"VUID-VkSwapchainCreateInfoKHR-minImageCount-01271", VALIDATION_ERROR_146009ee}, + {"VUID-VkSwapchainCreateInfoKHR-minImageCount-01272", VALIDATION_ERROR_146009f0}, + {"VUID-VkSwapchainCreateInfoKHR-imageFormat-01273", VALIDATION_ERROR_146009f2}, + {"VUID-VkSwapchainCreateInfoKHR-imageExtent-01274", VALIDATION_ERROR_146009f4}, + {"VUID-VkSwapchainCreateInfoKHR-imageArrayLayers-01275", VALIDATION_ERROR_146009f6}, + {"VUID-VkSwapchainCreateInfoKHR-imageUsage-01276", VALIDATION_ERROR_146009f8}, + {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01277", VALIDATION_ERROR_146009fa}, + {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01278", VALIDATION_ERROR_146009fc}, + {"VUID-VkSwapchainCreateInfoKHR-preTransform-01279", VALIDATION_ERROR_146009fe}, + {"VUID-VkSwapchainCreateInfoKHR-compositeAlpha-01280", VALIDATION_ERROR_14600a00}, + {"VUID-VkSwapchainCreateInfoKHR-presentMode-01281", VALIDATION_ERROR_14600a02}, + {"VUID-VkSwapchainCreateInfoKHR-minImageCount-01383", VALIDATION_ERROR_14600ace}, + {"VUID-VkSwapchainCreateInfoKHR-imageUsage-01384", VALIDATION_ERROR_14600ad0}, + {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01393", VALIDATION_ERROR_14600ae2}, + {"VUID-VkSwapchainCreateInfoKHR-presentMode-01427", VALIDATION_ERROR_14600b26}, + {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428", VALIDATION_ERROR_14600b28}, + {"VUID-VkSwapchainCreateInfoKHR-physicalDeviceCount-01429", VALIDATION_ERROR_14600b2a}, + {"VUID-VkSwapchainCreateInfoKHR-imageExtent-01689", VALIDATION_ERROR_14600d32}, + {"VUID-VkSwapchainCreateInfoKHR-imageFormat-01778", VALIDATION_ERROR_14600de4}, + {"VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01933", VALIDATION_ERROR_14600f1a}, + {"VUID-VkSwapchainCreateInfoKHR-compositeAlpha-parameter", VALIDATION_ERROR_14602e01}, + {"VUID-VkSwapchainCreateInfoKHR-flags-parameter", VALIDATION_ERROR_14609001}, + {"VUID-VkSwapchainCreateInfoKHR-imageColorSpace-parameter", VALIDATION_ERROR_1460a201}, + {"VUID-VkSwapchainCreateInfoKHR-imageFormat-parameter", VALIDATION_ERROR_1460a401}, + {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-parameter", VALIDATION_ERROR_1460a801}, + {"VUID-VkSwapchainCreateInfoKHR-imageUsage-parameter", VALIDATION_ERROR_1460ae01}, + {"VUID-VkSwapchainCreateInfoKHR-imageUsage-requiredbitmask", VALIDATION_ERROR_1460ae03}, + {"VUID-VkSwapchainCreateInfoKHR-oldSwapchain-parameter", VALIDATION_ERROR_1460de01}, + {"VUID-VkSwapchainCreateInfoKHR-oldSwapchain-parent", VALIDATION_ERROR_1460de07}, + {"VUID-VkSwapchainCreateInfoKHR-pNext-pNext", VALIDATION_ERROR_1461c40d}, + {"VUID-VkSwapchainCreateInfoKHR-preTransform-parameter", VALIDATION_ERROR_14629401}, + {"VUID-VkSwapchainCreateInfoKHR-presentMode-parameter", VALIDATION_ERROR_14629601}, + {"VUID-VkSwapchainCreateInfoKHR-sType-sType", VALIDATION_ERROR_1462b00b}, + {"VUID-VkSwapchainCreateInfoKHR-sType-unique", VALIDATION_ERROR_1462b00f}, + {"VUID-VkSwapchainCreateInfoKHR-surface-parameter", VALIDATION_ERROR_1462ec01}, + {"VUID-VkValidationFlagsEXT-disabledValidationCheckCount-arraylength", VALIDATION_ERROR_14805a1b}, + {"VUID-VkValidationFlagsEXT-pDisabledValidationChecks-parameter", VALIDATION_ERROR_14814401}, + {"VUID-VkValidationFlagsEXT-sType-sType", VALIDATION_ERROR_1482b00b}, + {"VUID-VkVertexInputAttributeDescription-location-00620", VALIDATION_ERROR_14a004d8}, + {"VUID-VkVertexInputAttributeDescription-binding-00621", VALIDATION_ERROR_14a004da}, + {"VUID-VkVertexInputAttributeDescription-offset-00622", VALIDATION_ERROR_14a004dc}, + {"VUID-VkVertexInputAttributeDescription-format-00623", VALIDATION_ERROR_14a004de}, + {"VUID-VkVertexInputAttributeDescription-format-parameter", VALIDATION_ERROR_14a09201}, + {"VUID-VkVertexInputBindingDescription-binding-00618", VALIDATION_ERROR_14c004d4}, + {"VUID-VkVertexInputBindingDescription-stride-00619", VALIDATION_ERROR_14c004d6}, + {"VUID-VkVertexInputBindingDescription-inputRate-parameter", VALIDATION_ERROR_14c0ba01}, + {"VUID-VkViSurfaceCreateInfoNN-window-01318", VALIDATION_ERROR_14e00a4c}, + {"VUID-VkViSurfaceCreateInfoNN-flags-zerobitmask", VALIDATION_ERROR_14e09005}, + {"VUID-VkViSurfaceCreateInfoNN-pNext-pNext", VALIDATION_ERROR_14e1c40d}, + {"VUID-VkViSurfaceCreateInfoNN-sType-sType", VALIDATION_ERROR_14e2b00b}, + {"VUID-VkViewport-x-01232", VALIDATION_ERROR_150009a0}, + {"VUID-VkViewport-y-01233", VALIDATION_ERROR_150009a2}, + {"VUID-VkViewport-minDepth-01234", VALIDATION_ERROR_150009a4}, + {"VUID-VkViewport-maxDepth-01235", VALIDATION_ERROR_150009a6}, + {"VUID-VkViewport-width-01770", VALIDATION_ERROR_15000dd4}, + {"VUID-VkViewport-width-01771", VALIDATION_ERROR_15000dd6}, + {"VUID-VkViewport-height-01772", VALIDATION_ERROR_15000dd8}, + {"VUID-VkViewport-height-01773", VALIDATION_ERROR_15000dda}, + {"VUID-VkViewport-x-01774", VALIDATION_ERROR_15000ddc}, + {"VUID-VkViewport-y-01775", VALIDATION_ERROR_15000dde}, + {"VUID-VkViewport-y-01776", VALIDATION_ERROR_15000de0}, + {"VUID-VkViewport-y-01777", VALIDATION_ERROR_15000de2}, + {"VUID-VkViewportSwizzleNV-w-parameter", VALIDATION_ERROR_15230c01}, + {"VUID-VkViewportSwizzleNV-x-parameter", VALIDATION_ERROR_15231001}, + {"VUID-VkViewportSwizzleNV-y-parameter", VALIDATION_ERROR_15231201}, + {"VUID-VkViewportSwizzleNV-z-parameter", VALIDATION_ERROR_15231401}, + {"VUID-VkWaylandSurfaceCreateInfoKHR-display-01304", VALIDATION_ERROR_15400a30}, + {"VUID-VkWaylandSurfaceCreateInfoKHR-surface-01305", VALIDATION_ERROR_15400a32}, + {"VUID-VkWaylandSurfaceCreateInfoKHR-flags-zerobitmask", VALIDATION_ERROR_15409005}, + {"VUID-VkWaylandSurfaceCreateInfoKHR-pNext-pNext", VALIDATION_ERROR_1541c40d}, + {"VUID-VkWaylandSurfaceCreateInfoKHR-sType-sType", VALIDATION_ERROR_1542b00b}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-commonparent", VALIDATION_ERROR_15600009}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireSyncs-00081", VALIDATION_ERROR_156000a2}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireKeys-parameter", VALIDATION_ERROR_1560e201}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireSyncs-parameter", VALIDATION_ERROR_1560e401}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireTimeouts-parameter", VALIDATION_ERROR_1560e801}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pReleaseKeys-parameter", VALIDATION_ERROR_15621201}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pReleaseSyncs-parameter", VALIDATION_ERROR_15621401}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-sType-sType", VALIDATION_ERROR_1562b00b}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-commonparent", VALIDATION_ERROR_15800009}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireKeys-parameter", VALIDATION_ERROR_1580e201}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireSyncs-parameter", VALIDATION_ERROR_1580e401}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireTimeoutMilliseconds-parameter", VALIDATION_ERROR_1580e601}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pReleaseKeys-parameter", VALIDATION_ERROR_15821201}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pReleaseSyncs-parameter", VALIDATION_ERROR_15821401}, + {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-sType-sType", VALIDATION_ERROR_1582b00b}, + {"VUID-VkWin32SurfaceCreateInfoKHR-hinstance-01307", VALIDATION_ERROR_15a00a36}, + {"VUID-VkWin32SurfaceCreateInfoKHR-hwnd-01308", VALIDATION_ERROR_15a00a38}, + {"VUID-VkWin32SurfaceCreateInfoKHR-flags-zerobitmask", VALIDATION_ERROR_15a09005}, + {"VUID-VkWin32SurfaceCreateInfoKHR-pNext-pNext", VALIDATION_ERROR_15a1c40d}, + {"VUID-VkWin32SurfaceCreateInfoKHR-sType-sType", VALIDATION_ERROR_15a2b00b}, + {"VUID-VkWriteDescriptorSet-commonparent", VALIDATION_ERROR_15c00009}, + {"VUID-VkWriteDescriptorSet-dstBinding-00315", VALIDATION_ERROR_15c00276}, + {"VUID-VkWriteDescriptorSet-dstBinding-00316", VALIDATION_ERROR_15c00278}, + {"VUID-VkWriteDescriptorSet-descriptorCount-00317", VALIDATION_ERROR_15c0027a}, + {"VUID-VkWriteDescriptorSet-descriptorCount-00318", VALIDATION_ERROR_15c0027c}, + {"VUID-VkWriteDescriptorSet-descriptorType-00319", VALIDATION_ERROR_15c0027e}, + {"VUID-VkWriteDescriptorSet-dstSet-00320", VALIDATION_ERROR_15c00280}, + {"VUID-VkWriteDescriptorSet-dstArrayElement-00321", VALIDATION_ERROR_15c00282}, + {"VUID-VkWriteDescriptorSet-descriptorType-00322", VALIDATION_ERROR_15c00284}, + {"VUID-VkWriteDescriptorSet-descriptorType-00323", VALIDATION_ERROR_15c00286}, + {"VUID-VkWriteDescriptorSet-descriptorType-00324", VALIDATION_ERROR_15c00288}, + {"VUID-VkWriteDescriptorSet-descriptorType-00325", VALIDATION_ERROR_15c0028a}, + {"VUID-VkWriteDescriptorSet-descriptorType-00326", VALIDATION_ERROR_15c0028c}, + {"VUID-VkWriteDescriptorSet-descriptorType-00327", VALIDATION_ERROR_15c0028e}, + {"VUID-VkWriteDescriptorSet-descriptorType-00328", VALIDATION_ERROR_15c00290}, + {"VUID-VkWriteDescriptorSet-descriptorType-00329", VALIDATION_ERROR_15c00292}, + {"VUID-VkWriteDescriptorSet-descriptorType-00330", VALIDATION_ERROR_15c00294}, + {"VUID-VkWriteDescriptorSet-descriptorType-00331", VALIDATION_ERROR_15c00296}, + {"VUID-VkWriteDescriptorSet-descriptorType-00332", VALIDATION_ERROR_15c00298}, + {"VUID-VkWriteDescriptorSet-descriptorType-00333", VALIDATION_ERROR_15c0029a}, + {"VUID-VkWriteDescriptorSet-descriptorType-00334", VALIDATION_ERROR_15c0029c}, + {"VUID-VkWriteDescriptorSet-descriptorType-00335", VALIDATION_ERROR_15c0029e}, + {"VUID-VkWriteDescriptorSet-descriptorType-00336", VALIDATION_ERROR_15c002a0}, + {"VUID-VkWriteDescriptorSet-descriptorType-00337", VALIDATION_ERROR_15c002a2}, + {"VUID-VkWriteDescriptorSet-descriptorType-00338", VALIDATION_ERROR_15c002a4}, + {"VUID-VkWriteDescriptorSet-descriptorType-00339", VALIDATION_ERROR_15c002a6}, + {"VUID-VkWriteDescriptorSet-descriptorType-01402", VALIDATION_ERROR_15c00af4}, + {"VUID-VkWriteDescriptorSet-descriptorType-01403", VALIDATION_ERROR_15c00af6}, + {"VUID-VkWriteDescriptorSet-descriptorCount-03048", VALIDATION_ERROR_15c017d0}, + {"VUID-VkWriteDescriptorSet-descriptorCount-arraylength", VALIDATION_ERROR_15c0441b}, + {"VUID-VkWriteDescriptorSet-descriptorType-parameter", VALIDATION_ERROR_15c04e01}, + {"VUID-VkWriteDescriptorSet-pNext-pNext", VALIDATION_ERROR_15c1c40d}, + {"VUID-VkWriteDescriptorSet-sType-sType", VALIDATION_ERROR_15c2b00b}, + {"VUID-VkXcbSurfaceCreateInfoKHR-connection-01310", VALIDATION_ERROR_15e00a3c}, + {"VUID-VkXcbSurfaceCreateInfoKHR-window-01311", VALIDATION_ERROR_15e00a3e}, + {"VUID-VkXcbSurfaceCreateInfoKHR-flags-zerobitmask", VALIDATION_ERROR_15e09005}, + {"VUID-VkXcbSurfaceCreateInfoKHR-pNext-pNext", VALIDATION_ERROR_15e1c40d}, + {"VUID-VkXcbSurfaceCreateInfoKHR-sType-sType", VALIDATION_ERROR_15e2b00b}, + {"VUID-VkXlibSurfaceCreateInfoKHR-dpy-01313", VALIDATION_ERROR_16000a42}, + {"VUID-VkXlibSurfaceCreateInfoKHR-window-01314", VALIDATION_ERROR_16000a44}, + {"VUID-VkXlibSurfaceCreateInfoKHR-flags-zerobitmask", VALIDATION_ERROR_16009005}, + {"VUID-VkXlibSurfaceCreateInfoKHR-pNext-pNext", VALIDATION_ERROR_1601c40d}, + {"VUID-VkXlibSurfaceCreateInfoKHR-sType-sType", VALIDATION_ERROR_1602b00b}, + {"VUID-vkAcquireNextImage2KHR-swapchain-01803", VALIDATION_ERROR_16200e16}, + {"VUID-vkAcquireNextImage2KHR-device-parameter", VALIDATION_ERROR_16205601}, + {"VUID-vkAcquireNextImage2KHR-pAcquireInfo-parameter", VALIDATION_ERROR_1620e001}, + {"VUID-vkAcquireNextImage2KHR-pImageIndex-parameter", VALIDATION_ERROR_16218601}, + {"VUID-vkAcquireNextImageKHR-commonparent", VALIDATION_ERROR_16400009}, + {"VUID-vkAcquireNextImageKHR-swapchain-01285", VALIDATION_ERROR_16400a0a}, + {"VUID-vkAcquireNextImageKHR-semaphore-01286", VALIDATION_ERROR_16400a0c}, + {"VUID-vkAcquireNextImageKHR-fence-01287", VALIDATION_ERROR_16400a0e}, + {"VUID-vkAcquireNextImageKHR-semaphore-01779", VALIDATION_ERROR_16400de6}, + {"VUID-vkAcquireNextImageKHR-semaphore-01780", VALIDATION_ERROR_16400de8}, + {"VUID-vkAcquireNextImageKHR-swapchain-01802", VALIDATION_ERROR_16400e14}, + {"VUID-vkAcquireNextImageKHR-device-parameter", VALIDATION_ERROR_16405601}, + {"VUID-vkAcquireNextImageKHR-fence-parameter", VALIDATION_ERROR_16408801}, + {"VUID-vkAcquireNextImageKHR-fence-parent", VALIDATION_ERROR_16408807}, + {"VUID-vkAcquireNextImageKHR-pImageIndex-parameter", VALIDATION_ERROR_16418601}, + {"VUID-vkAcquireNextImageKHR-semaphore-parameter", VALIDATION_ERROR_1642b801}, + {"VUID-vkAcquireNextImageKHR-semaphore-parent", VALIDATION_ERROR_1642b807}, + {"VUID-vkAcquireNextImageKHR-swapchain-parameter", VALIDATION_ERROR_1642f001}, + {"VUID-vkAcquireXlibDisplayEXT-display-parameter", VALIDATION_ERROR_16606001}, + {"VUID-vkAcquireXlibDisplayEXT-dpy-parameter", VALIDATION_ERROR_16606601}, + {"VUID-vkAcquireXlibDisplayEXT-physicalDevice-parameter", VALIDATION_ERROR_16627a01}, + {"VUID-vkAllocateCommandBuffers-device-parameter", VALIDATION_ERROR_16805601}, + {"VUID-vkAllocateCommandBuffers-pAllocateInfo-parameter", VALIDATION_ERROR_1680ea01}, + {"VUID-vkAllocateCommandBuffers-pCommandBuffers-parameter", VALIDATION_ERROR_16811401}, + {"VUID-vkAllocateDescriptorSets-device-parameter", VALIDATION_ERROR_16a05601}, + {"VUID-vkAllocateDescriptorSets-pAllocateInfo-parameter", VALIDATION_ERROR_16a0ea01}, + {"VUID-vkAllocateDescriptorSets-pDescriptorSets-parameter", VALIDATION_ERROR_16a13001}, + {"VUID-vkAllocateMemory-pAllocateInfo-01713", VALIDATION_ERROR_16c00d62}, + {"VUID-vkAllocateMemory-pAllocateInfo-01714", VALIDATION_ERROR_16c00d64}, + {"VUID-vkAllocateMemory-device-parameter", VALIDATION_ERROR_16c05601}, + {"VUID-vkAllocateMemory-pAllocateInfo-parameter", VALIDATION_ERROR_16c0ea01}, + {"VUID-vkAllocateMemory-pAllocator-parameter", VALIDATION_ERROR_16c0ec01}, + {"VUID-vkAllocateMemory-pMemory-parameter", VALIDATION_ERROR_16c1aa01}, + {"VUID-vkBeginCommandBuffer-commandBuffer-00049", VALIDATION_ERROR_16e00062}, + {"VUID-vkBeginCommandBuffer-commandBuffer-00050", VALIDATION_ERROR_16e00064}, + {"VUID-vkBeginCommandBuffer-commandBuffer-00051", VALIDATION_ERROR_16e00066}, + {"VUID-vkBeginCommandBuffer-commandBuffer-00052", VALIDATION_ERROR_16e00068}, + {"VUID-vkBeginCommandBuffer-commandBuffer-parameter", VALIDATION_ERROR_16e02401}, + {"VUID-vkBeginCommandBuffer-pBeginInfo-parameter", VALIDATION_ERROR_16e0f601}, + {"VUID-vkBindBufferMemory-buffer-01029", VALIDATION_ERROR_1700080a}, + {"VUID-vkBindBufferMemory-buffer-01030", VALIDATION_ERROR_1700080c}, + {"VUID-vkBindBufferMemory-memoryOffset-01031", VALIDATION_ERROR_1700080e}, + {"VUID-vkBindBufferMemory-buffer-01032", VALIDATION_ERROR_17000810}, + {"VUID-vkBindBufferMemory-buffer-01033", VALIDATION_ERROR_17000812}, + {"VUID-vkBindBufferMemory-buffer-01034", VALIDATION_ERROR_17000814}, + {"VUID-vkBindBufferMemory-memory-01035", VALIDATION_ERROR_17000816}, + {"VUID-vkBindBufferMemory-memoryOffset-01036", VALIDATION_ERROR_17000818}, + {"VUID-vkBindBufferMemory-size-01037", VALIDATION_ERROR_1700081a}, + {"VUID-vkBindBufferMemory-buffer-01038", VALIDATION_ERROR_1700081c}, + {"VUID-vkBindBufferMemory-buffer-01039", VALIDATION_ERROR_1700081e}, + {"VUID-vkBindBufferMemory-buffer-01444", VALIDATION_ERROR_17000b48}, + {"VUID-vkBindBufferMemory-memory-01508", VALIDATION_ERROR_17000bc8}, + {"VUID-vkBindBufferMemory-None-01898", VALIDATION_ERROR_17000ed4}, + {"VUID-vkBindBufferMemory-None-01899", VALIDATION_ERROR_17000ed6}, + {"VUID-vkBindBufferMemory-buffer-parameter", VALIDATION_ERROR_17001a01}, + {"VUID-vkBindBufferMemory-buffer-parent", VALIDATION_ERROR_17001a07}, + {"VUID-vkBindBufferMemory-device-parameter", VALIDATION_ERROR_17005601}, + {"VUID-vkBindBufferMemory-memory-parameter", VALIDATION_ERROR_1700c601}, + {"VUID-vkBindBufferMemory-memory-parent", VALIDATION_ERROR_1700c607}, + {"VUID-vkBindBufferMemory2-bindInfoCount-arraylength", VALIDATION_ERROR_1720161b}, + {"VUID-vkBindBufferMemory2-device-parameter", VALIDATION_ERROR_17205601}, + {"VUID-vkBindBufferMemory2-pBindInfos-parameter", VALIDATION_ERROR_1720fa01}, + {"VUID-vkBindImageMemory-image-01044", VALIDATION_ERROR_17400828}, + {"VUID-vkBindImageMemory-image-01045", VALIDATION_ERROR_1740082a}, + {"VUID-vkBindImageMemory-memoryOffset-01046", VALIDATION_ERROR_1740082c}, + {"VUID-vkBindImageMemory-memory-01047", VALIDATION_ERROR_1740082e}, + {"VUID-vkBindImageMemory-memoryOffset-01048", VALIDATION_ERROR_17400830}, + {"VUID-vkBindImageMemory-size-01049", VALIDATION_ERROR_17400832}, + {"VUID-vkBindImageMemory-image-01050", VALIDATION_ERROR_17400834}, + {"VUID-vkBindImageMemory-image-01051", VALIDATION_ERROR_17400836}, + {"VUID-vkBindImageMemory-image-01445", VALIDATION_ERROR_17400b4a}, + {"VUID-vkBindImageMemory-memory-01509", VALIDATION_ERROR_17400bca}, + {"VUID-vkBindImageMemory-image-01608", VALIDATION_ERROR_17400c90}, + {"VUID-vkBindImageMemory-None-01901", VALIDATION_ERROR_17400eda}, + {"VUID-vkBindImageMemory-None-01902", VALIDATION_ERROR_17400edc}, + {"VUID-vkBindImageMemory-device-parameter", VALIDATION_ERROR_17405601}, + {"VUID-vkBindImageMemory-image-parameter", VALIDATION_ERROR_1740a001}, + {"VUID-vkBindImageMemory-image-parent", VALIDATION_ERROR_1740a007}, + {"VUID-vkBindImageMemory-memory-parameter", VALIDATION_ERROR_1740c601}, + {"VUID-vkBindImageMemory-memory-parent", VALIDATION_ERROR_1740c607}, + {"VUID-vkBindImageMemory2-bindInfoCount-arraylength", VALIDATION_ERROR_1760161b}, + {"VUID-vkBindImageMemory2-device-parameter", VALIDATION_ERROR_17605601}, + {"VUID-vkBindImageMemory2-pBindInfos-parameter", VALIDATION_ERROR_1760fa01}, + {"VUID-vkCmdBeginQuery-commonparent", VALIDATION_ERROR_17800009}, + {"VUID-vkCmdBeginQuery-queryType-00800", VALIDATION_ERROR_17800640}, + {"VUID-vkCmdBeginQuery-query-00802", VALIDATION_ERROR_17800644}, + {"VUID-vkCmdBeginQuery-queryType-00803", VALIDATION_ERROR_17800646}, + {"VUID-vkCmdBeginQuery-queryType-00804", VALIDATION_ERROR_17800648}, + {"VUID-vkCmdBeginQuery-queryType-00805", VALIDATION_ERROR_1780064a}, + {"VUID-vkCmdBeginQuery-None-00807", VALIDATION_ERROR_1780064e}, + {"VUID-vkCmdBeginQuery-query-00808", VALIDATION_ERROR_17800650}, + {"VUID-vkCmdBeginQuery-commandBuffer-01885", VALIDATION_ERROR_17800eba}, + {"VUID-vkCmdBeginQuery-queryPool-01922", VALIDATION_ERROR_17800f04}, + {"VUID-vkCmdBeginQuery-commandBuffer-parameter", VALIDATION_ERROR_17802401}, + {"VUID-vkCmdBeginQuery-commandBuffer-recording", VALIDATION_ERROR_17802413}, + {"VUID-vkCmdBeginQuery-commandBuffer-cmdpool", VALIDATION_ERROR_17802415}, + {"VUID-vkCmdBeginQuery-flags-parameter", VALIDATION_ERROR_17809001}, + {"VUID-vkCmdBeginQuery-queryPool-parameter", VALIDATION_ERROR_17829801}, + {"VUID-vkCmdBeginRenderPass-renderpass", VALIDATION_ERROR_17a00017}, + {"VUID-vkCmdBeginRenderPass-bufferlevel", VALIDATION_ERROR_17a00019}, + {"VUID-vkCmdBeginRenderPass-initialLayout-00895", VALIDATION_ERROR_17a006fe}, + {"VUID-vkCmdBeginRenderPass-initialLayout-00896", VALIDATION_ERROR_17a00700}, + {"VUID-vkCmdBeginRenderPass-initialLayout-00897", VALIDATION_ERROR_17a00702}, + {"VUID-vkCmdBeginRenderPass-initialLayout-00898", VALIDATION_ERROR_17a00704}, + {"VUID-vkCmdBeginRenderPass-initialLayout-00899", VALIDATION_ERROR_17a00706}, + {"VUID-vkCmdBeginRenderPass-initialLayout-00900", VALIDATION_ERROR_17a00708}, + {"VUID-vkCmdBeginRenderPass-srcStageMask-00901", VALIDATION_ERROR_17a0070a}, + {"VUID-vkCmdBeginRenderPass-initialLayout-01758", VALIDATION_ERROR_17a00dbc}, + {"VUID-vkCmdBeginRenderPass-commandBuffer-parameter", VALIDATION_ERROR_17a02401}, + {"VUID-vkCmdBeginRenderPass-commandBuffer-recording", VALIDATION_ERROR_17a02413}, + {"VUID-vkCmdBeginRenderPass-commandBuffer-cmdpool", VALIDATION_ERROR_17a02415}, + {"VUID-vkCmdBeginRenderPass-contents-parameter", VALIDATION_ERROR_17a03201}, + {"VUID-vkCmdBeginRenderPass-pRenderPassBegin-parameter", VALIDATION_ERROR_17a21801}, + {"VUID-vkCmdBindDescriptorSets-commonparent", VALIDATION_ERROR_17c00009}, + {"VUID-vkCmdBindDescriptorSets-pDescriptorSets-00358", VALIDATION_ERROR_17c002cc}, + {"VUID-vkCmdBindDescriptorSets-dynamicOffsetCount-00359", VALIDATION_ERROR_17c002ce}, + {"VUID-vkCmdBindDescriptorSets-firstSet-00360", VALIDATION_ERROR_17c002d0}, + {"VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361", VALIDATION_ERROR_17c002d2}, + {"VUID-vkCmdBindDescriptorSets-pDynamicOffsets-00362", VALIDATION_ERROR_17c002d4}, + {"VUID-vkCmdBindDescriptorSets-commandBuffer-parameter", VALIDATION_ERROR_17c02401}, + {"VUID-vkCmdBindDescriptorSets-commandBuffer-recording", VALIDATION_ERROR_17c02413}, + {"VUID-vkCmdBindDescriptorSets-commandBuffer-cmdpool", VALIDATION_ERROR_17c02415}, + {"VUID-vkCmdBindDescriptorSets-descriptorSetCount-arraylength", VALIDATION_ERROR_17c04a1b}, + {"VUID-vkCmdBindDescriptorSets-layout-parameter", VALIDATION_ERROR_17c0be01}, + {"VUID-vkCmdBindDescriptorSets-pDescriptorSets-parameter", VALIDATION_ERROR_17c13001}, + {"VUID-vkCmdBindDescriptorSets-pDynamicOffsets-parameter", VALIDATION_ERROR_17c15401}, + {"VUID-vkCmdBindDescriptorSets-pipelineBindPoint-parameter", VALIDATION_ERROR_17c27e01}, + {"VUID-vkCmdBindIndexBuffer-commonparent", VALIDATION_ERROR_17e00009}, + {"VUID-vkCmdBindIndexBuffer-offset-00431", VALIDATION_ERROR_17e0035e}, + {"VUID-vkCmdBindIndexBuffer-offset-00432", VALIDATION_ERROR_17e00360}, + {"VUID-vkCmdBindIndexBuffer-buffer-00433", VALIDATION_ERROR_17e00362}, + {"VUID-vkCmdBindIndexBuffer-buffer-00434", VALIDATION_ERROR_17e00364}, + {"VUID-vkCmdBindIndexBuffer-buffer-parameter", VALIDATION_ERROR_17e01a01}, + {"VUID-vkCmdBindIndexBuffer-commandBuffer-parameter", VALIDATION_ERROR_17e02401}, + {"VUID-vkCmdBindIndexBuffer-commandBuffer-recording", VALIDATION_ERROR_17e02413}, + {"VUID-vkCmdBindIndexBuffer-commandBuffer-cmdpool", VALIDATION_ERROR_17e02415}, + {"VUID-vkCmdBindIndexBuffer-indexType-parameter", VALIDATION_ERROR_17e0b201}, + {"VUID-vkCmdBindPipeline-commonparent", VALIDATION_ERROR_18000009}, + {"VUID-vkCmdBindPipeline-pipelineBindPoint-00777", VALIDATION_ERROR_18000612}, + {"VUID-vkCmdBindPipeline-pipelineBindPoint-00778", VALIDATION_ERROR_18000614}, + {"VUID-vkCmdBindPipeline-pipelineBindPoint-00779", VALIDATION_ERROR_18000616}, + {"VUID-vkCmdBindPipeline-pipelineBindPoint-00780", VALIDATION_ERROR_18000618}, + {"VUID-vkCmdBindPipeline-pipeline-00781", VALIDATION_ERROR_1800061a}, + {"VUID-vkCmdBindPipeline-variableSampleLocations-01525", VALIDATION_ERROR_18000bea}, + {"VUID-vkCmdBindPipeline-commandBuffer-parameter", VALIDATION_ERROR_18002401}, + {"VUID-vkCmdBindPipeline-commandBuffer-recording", VALIDATION_ERROR_18002413}, + {"VUID-vkCmdBindPipeline-commandBuffer-cmdpool", VALIDATION_ERROR_18002415}, + {"VUID-vkCmdBindPipeline-pipeline-parameter", VALIDATION_ERROR_18027c01}, + {"VUID-vkCmdBindPipeline-pipelineBindPoint-parameter", VALIDATION_ERROR_18027e01}, + {"VUID-vkCmdBindVertexBuffers-commonparent", VALIDATION_ERROR_18200009}, + {"VUID-vkCmdBindVertexBuffers-firstBinding-00624", VALIDATION_ERROR_182004e0}, + {"VUID-vkCmdBindVertexBuffers-firstBinding-00625", VALIDATION_ERROR_182004e2}, + {"VUID-vkCmdBindVertexBuffers-pOffsets-00626", VALIDATION_ERROR_182004e4}, + {"VUID-vkCmdBindVertexBuffers-pBuffers-00627", VALIDATION_ERROR_182004e6}, + {"VUID-vkCmdBindVertexBuffers-pBuffers-00628", VALIDATION_ERROR_182004e8}, + {"VUID-vkCmdBindVertexBuffers-bindingCount-arraylength", VALIDATION_ERROR_1820181b}, + {"VUID-vkCmdBindVertexBuffers-commandBuffer-parameter", VALIDATION_ERROR_18202401}, + {"VUID-vkCmdBindVertexBuffers-commandBuffer-recording", VALIDATION_ERROR_18202413}, + {"VUID-vkCmdBindVertexBuffers-commandBuffer-cmdpool", VALIDATION_ERROR_18202415}, + {"VUID-vkCmdBindVertexBuffers-pBuffers-parameter", VALIDATION_ERROR_18210601}, + {"VUID-vkCmdBindVertexBuffers-pOffsets-parameter", VALIDATION_ERROR_1821d201}, + {"VUID-vkCmdBlitImage-commonparent", VALIDATION_ERROR_18400009}, + {"VUID-vkCmdBlitImage-renderpass", VALIDATION_ERROR_18400017}, + {"VUID-vkCmdBlitImage-pRegions-00215", VALIDATION_ERROR_184001ae}, + {"VUID-vkCmdBlitImage-pRegions-00216", VALIDATION_ERROR_184001b0}, + {"VUID-vkCmdBlitImage-pRegions-00217", VALIDATION_ERROR_184001b2}, + {"VUID-vkCmdBlitImage-srcImage-00218", VALIDATION_ERROR_184001b4}, + {"VUID-vkCmdBlitImage-srcImage-00219", VALIDATION_ERROR_184001b6}, + {"VUID-vkCmdBlitImage-srcImage-00220", VALIDATION_ERROR_184001b8}, + {"VUID-vkCmdBlitImage-srcImageLayout-00221", VALIDATION_ERROR_184001ba}, + {"VUID-vkCmdBlitImage-srcImageLayout-00222", VALIDATION_ERROR_184001bc}, + {"VUID-vkCmdBlitImage-dstImage-00223", VALIDATION_ERROR_184001be}, + {"VUID-vkCmdBlitImage-dstImage-00224", VALIDATION_ERROR_184001c0}, + {"VUID-vkCmdBlitImage-dstImage-00225", VALIDATION_ERROR_184001c2}, + {"VUID-vkCmdBlitImage-dstImageLayout-00226", VALIDATION_ERROR_184001c4}, + {"VUID-vkCmdBlitImage-dstImageLayout-00227", VALIDATION_ERROR_184001c6}, + {"VUID-vkCmdBlitImage-srcImage-00228", VALIDATION_ERROR_184001c8}, + {"VUID-vkCmdBlitImage-srcImage-00229", VALIDATION_ERROR_184001ca}, + {"VUID-vkCmdBlitImage-srcImage-00230", VALIDATION_ERROR_184001cc}, + {"VUID-vkCmdBlitImage-srcImage-00231", VALIDATION_ERROR_184001ce}, + {"VUID-vkCmdBlitImage-srcImage-00232", VALIDATION_ERROR_184001d0}, + {"VUID-vkCmdBlitImage-srcImage-00233", VALIDATION_ERROR_184001d2}, + {"VUID-vkCmdBlitImage-dstImage-00234", VALIDATION_ERROR_184001d4}, + {"VUID-vkCmdBlitImage-filter-00235", VALIDATION_ERROR_184001d6}, + {"VUID-vkCmdBlitImage-filter-00236", VALIDATION_ERROR_184001d8}, + {"VUID-vkCmdBlitImage-filter-00237", VALIDATION_ERROR_184001da}, + {"VUID-vkCmdBlitImage-srcImageLayout-01398", VALIDATION_ERROR_18400aec}, + {"VUID-vkCmdBlitImage-dstImageLayout-01399", VALIDATION_ERROR_18400aee}, + {"VUID-vkCmdBlitImage-srcImage-01561", VALIDATION_ERROR_18400c32}, + {"VUID-vkCmdBlitImage-dstImage-01562", VALIDATION_ERROR_18400c34}, + {"VUID-vkCmdBlitImage-srcSubresource-01705", VALIDATION_ERROR_18400d52}, + {"VUID-vkCmdBlitImage-dstSubresource-01706", VALIDATION_ERROR_18400d54}, + {"VUID-vkCmdBlitImage-srcSubresource-01707", VALIDATION_ERROR_18400d56}, + {"VUID-vkCmdBlitImage-dstSubresource-01708", VALIDATION_ERROR_18400d58}, + {"VUID-vkCmdBlitImage-commandBuffer-01834", VALIDATION_ERROR_18400e54}, + {"VUID-vkCmdBlitImage-commandBuffer-01835", VALIDATION_ERROR_18400e56}, + {"VUID-vkCmdBlitImage-commandBuffer-01836", VALIDATION_ERROR_18400e58}, + {"VUID-vkCmdBlitImage-commandBuffer-parameter", VALIDATION_ERROR_18402401}, + {"VUID-vkCmdBlitImage-commandBuffer-recording", VALIDATION_ERROR_18402413}, + {"VUID-vkCmdBlitImage-commandBuffer-cmdpool", VALIDATION_ERROR_18402415}, + {"VUID-vkCmdBlitImage-dstImage-parameter", VALIDATION_ERROR_18407201}, + {"VUID-vkCmdBlitImage-dstImageLayout-parameter", VALIDATION_ERROR_18407401}, + {"VUID-vkCmdBlitImage-filter-parameter", VALIDATION_ERROR_18408c01}, + {"VUID-vkCmdBlitImage-pRegions-parameter", VALIDATION_ERROR_18421001}, + {"VUID-vkCmdBlitImage-regionCount-arraylength", VALIDATION_ERROR_1842ac1b}, + {"VUID-vkCmdBlitImage-srcImage-parameter", VALIDATION_ERROR_1842ce01}, + {"VUID-vkCmdBlitImage-srcImageLayout-parameter", VALIDATION_ERROR_1842d001}, + {"VUID-vkCmdClearAttachments-renderpass", VALIDATION_ERROR_18600017}, + {"VUID-vkCmdClearAttachments-aspectMask-00015", VALIDATION_ERROR_1860001e}, + {"VUID-vkCmdClearAttachments-pRects-00016", VALIDATION_ERROR_18600020}, + {"VUID-vkCmdClearAttachments-pRects-00017", VALIDATION_ERROR_18600022}, + {"VUID-vkCmdClearAttachments-baseArrayLayer-00018", VALIDATION_ERROR_18600024}, + {"VUID-vkCmdClearAttachments-attachmentCount-arraylength", VALIDATION_ERROR_18600e1b}, + {"VUID-vkCmdClearAttachments-commandBuffer-parameter", VALIDATION_ERROR_18602401}, + {"VUID-vkCmdClearAttachments-commandBuffer-recording", VALIDATION_ERROR_18602413}, + {"VUID-vkCmdClearAttachments-commandBuffer-cmdpool", VALIDATION_ERROR_18602415}, + {"VUID-vkCmdClearAttachments-pAttachments-parameter", VALIDATION_ERROR_1860f201}, + {"VUID-vkCmdClearAttachments-pRects-parameter", VALIDATION_ERROR_18620e01}, + {"VUID-vkCmdClearAttachments-rectCount-arraylength", VALIDATION_ERROR_1862aa1b}, + {"VUID-vkCmdClearColorImage-image-00001", VALIDATION_ERROR_18800002}, + {"VUID-vkCmdClearColorImage-image-00002", VALIDATION_ERROR_18800004}, + {"VUID-vkCmdClearColorImage-image-00003", VALIDATION_ERROR_18800006}, + {"VUID-vkCmdClearColorImage-imageLayout-00004", VALIDATION_ERROR_18800008}, + {"VUID-vkCmdClearColorImage-commonparent", VALIDATION_ERROR_18800009}, + {"VUID-vkCmdClearColorImage-imageLayout-00005", VALIDATION_ERROR_1880000a}, + {"VUID-vkCmdClearColorImage-image-00007", VALIDATION_ERROR_1880000e}, + {"VUID-vkCmdClearColorImage-renderpass", VALIDATION_ERROR_18800017}, + {"VUID-vkCmdClearColorImage-imageLayout-01394", VALIDATION_ERROR_18800ae4}, + {"VUID-vkCmdClearColorImage-baseMipLevel-01470", VALIDATION_ERROR_18800b7c}, + {"VUID-vkCmdClearColorImage-baseArrayLayer-01472", VALIDATION_ERROR_18800b80}, + {"VUID-vkCmdClearColorImage-image-01545", VALIDATION_ERROR_18800c12}, + {"VUID-vkCmdClearColorImage-pRanges-01692", VALIDATION_ERROR_18800d38}, + {"VUID-vkCmdClearColorImage-pRanges-01693", VALIDATION_ERROR_18800d3a}, + {"VUID-vkCmdClearColorImage-commandBuffer-01805", VALIDATION_ERROR_18800e1a}, + {"VUID-vkCmdClearColorImage-commandBuffer-01806", VALIDATION_ERROR_18800e1c}, + {"VUID-vkCmdClearColorImage-commandBuffer-parameter", VALIDATION_ERROR_18802401}, + {"VUID-vkCmdClearColorImage-commandBuffer-recording", VALIDATION_ERROR_18802413}, + {"VUID-vkCmdClearColorImage-commandBuffer-cmdpool", VALIDATION_ERROR_18802415}, + {"VUID-vkCmdClearColorImage-image-parameter", VALIDATION_ERROR_1880a001}, + {"VUID-vkCmdClearColorImage-imageLayout-parameter", VALIDATION_ERROR_1880a601}, + {"VUID-vkCmdClearColorImage-pColor-parameter", VALIDATION_ERROR_18810e01}, + {"VUID-vkCmdClearColorImage-pRanges-parameter", VALIDATION_ERROR_18820601}, + {"VUID-vkCmdClearColorImage-rangeCount-arraylength", VALIDATION_ERROR_1882a41b}, + {"VUID-vkCmdClearDepthStencilImage-commonparent", VALIDATION_ERROR_18a00009}, + {"VUID-vkCmdClearDepthStencilImage-image-00008", VALIDATION_ERROR_18a00010}, + {"VUID-vkCmdClearDepthStencilImage-image-00009", VALIDATION_ERROR_18a00012}, + {"VUID-vkCmdClearDepthStencilImage-image-00010", VALIDATION_ERROR_18a00014}, + {"VUID-vkCmdClearDepthStencilImage-imageLayout-00011", VALIDATION_ERROR_18a00016}, + {"VUID-vkCmdClearDepthStencilImage-renderpass", VALIDATION_ERROR_18a00017}, + {"VUID-vkCmdClearDepthStencilImage-imageLayout-00012", VALIDATION_ERROR_18a00018}, + {"VUID-vkCmdClearDepthStencilImage-image-00014", VALIDATION_ERROR_18a0001c}, + {"VUID-vkCmdClearDepthStencilImage-baseMipLevel-01474", VALIDATION_ERROR_18a00b84}, + {"VUID-vkCmdClearDepthStencilImage-baseArrayLayer-01476", VALIDATION_ERROR_18a00b88}, + {"VUID-vkCmdClearDepthStencilImage-pRanges-01694", VALIDATION_ERROR_18a00d3c}, + {"VUID-vkCmdClearDepthStencilImage-pRanges-01695", VALIDATION_ERROR_18a00d3e}, + {"VUID-vkCmdClearDepthStencilImage-commandBuffer-01807", VALIDATION_ERROR_18a00e1e}, + {"VUID-vkCmdClearDepthStencilImage-commandBuffer-01808", VALIDATION_ERROR_18a00e20}, + {"VUID-vkCmdClearDepthStencilImage-commandBuffer-parameter", VALIDATION_ERROR_18a02401}, + {"VUID-vkCmdClearDepthStencilImage-commandBuffer-recording", VALIDATION_ERROR_18a02413}, + {"VUID-vkCmdClearDepthStencilImage-commandBuffer-cmdpool", VALIDATION_ERROR_18a02415}, + {"VUID-vkCmdClearDepthStencilImage-image-parameter", VALIDATION_ERROR_18a0a001}, + {"VUID-vkCmdClearDepthStencilImage-imageLayout-parameter", VALIDATION_ERROR_18a0a601}, + {"VUID-vkCmdClearDepthStencilImage-pDepthStencil-parameter", VALIDATION_ERROR_18a12801}, + {"VUID-vkCmdClearDepthStencilImage-pRanges-parameter", VALIDATION_ERROR_18a20601}, + {"VUID-vkCmdClearDepthStencilImage-rangeCount-arraylength", VALIDATION_ERROR_18a2a41b}, + {"VUID-vkCmdCopyBuffer-commonparent", VALIDATION_ERROR_18c00009}, + {"VUID-vkCmdCopyBuffer-renderpass", VALIDATION_ERROR_18c00017}, + {"VUID-vkCmdCopyBuffer-size-00112", VALIDATION_ERROR_18c000e0}, + {"VUID-vkCmdCopyBuffer-srcOffset-00113", VALIDATION_ERROR_18c000e2}, + {"VUID-vkCmdCopyBuffer-dstOffset-00114", VALIDATION_ERROR_18c000e4}, + {"VUID-vkCmdCopyBuffer-size-00115", VALIDATION_ERROR_18c000e6}, + {"VUID-vkCmdCopyBuffer-size-00116", VALIDATION_ERROR_18c000e8}, + {"VUID-vkCmdCopyBuffer-pRegions-00117", VALIDATION_ERROR_18c000ea}, + {"VUID-vkCmdCopyBuffer-srcBuffer-00118", VALIDATION_ERROR_18c000ec}, + {"VUID-vkCmdCopyBuffer-srcBuffer-00119", VALIDATION_ERROR_18c000ee}, + {"VUID-vkCmdCopyBuffer-dstBuffer-00120", VALIDATION_ERROR_18c000f0}, + {"VUID-vkCmdCopyBuffer-dstBuffer-00121", VALIDATION_ERROR_18c000f2}, + {"VUID-vkCmdCopyBuffer-commandBuffer-01822", VALIDATION_ERROR_18c00e3c}, + {"VUID-vkCmdCopyBuffer-commandBuffer-01823", VALIDATION_ERROR_18c00e3e}, + {"VUID-vkCmdCopyBuffer-commandBuffer-01824", VALIDATION_ERROR_18c00e40}, + {"VUID-vkCmdCopyBuffer-commandBuffer-parameter", VALIDATION_ERROR_18c02401}, + {"VUID-vkCmdCopyBuffer-commandBuffer-recording", VALIDATION_ERROR_18c02413}, + {"VUID-vkCmdCopyBuffer-commandBuffer-cmdpool", VALIDATION_ERROR_18c02415}, + {"VUID-vkCmdCopyBuffer-dstBuffer-parameter", VALIDATION_ERROR_18c06c01}, + {"VUID-vkCmdCopyBuffer-pRegions-parameter", VALIDATION_ERROR_18c21001}, + {"VUID-vkCmdCopyBuffer-regionCount-arraylength", VALIDATION_ERROR_18c2ac1b}, + {"VUID-vkCmdCopyBuffer-srcBuffer-parameter", VALIDATION_ERROR_18c2c801}, + {"VUID-vkCmdCopyBufferToImage-commonparent", VALIDATION_ERROR_18e00009}, + {"VUID-vkCmdCopyBufferToImage-renderpass", VALIDATION_ERROR_18e00017}, + {"VUID-vkCmdCopyBufferToImage-pRegions-00171", VALIDATION_ERROR_18e00156}, + {"VUID-vkCmdCopyBufferToImage-pRegions-00172", VALIDATION_ERROR_18e00158}, + {"VUID-vkCmdCopyBufferToImage-pRegions-00173", VALIDATION_ERROR_18e0015a}, + {"VUID-vkCmdCopyBufferToImage-srcBuffer-00174", VALIDATION_ERROR_18e0015c}, + {"VUID-vkCmdCopyBufferToImage-dstImage-00175", VALIDATION_ERROR_18e0015e}, + {"VUID-vkCmdCopyBufferToImage-srcBuffer-00176", VALIDATION_ERROR_18e00160}, + {"VUID-vkCmdCopyBufferToImage-dstImage-00177", VALIDATION_ERROR_18e00162}, + {"VUID-vkCmdCopyBufferToImage-dstImage-00178", VALIDATION_ERROR_18e00164}, + {"VUID-vkCmdCopyBufferToImage-dstImage-00179", VALIDATION_ERROR_18e00166}, + {"VUID-vkCmdCopyBufferToImage-dstImageLayout-00180", VALIDATION_ERROR_18e00168}, + {"VUID-vkCmdCopyBufferToImage-dstImageLayout-00181", VALIDATION_ERROR_18e0016a}, + {"VUID-vkCmdCopyBufferToImage-dstImageLayout-01396", VALIDATION_ERROR_18e00ae8}, + {"VUID-vkCmdCopyBufferToImage-imageSubresource-01701", VALIDATION_ERROR_18e00d4a}, + {"VUID-vkCmdCopyBufferToImage-imageSubresource-01702", VALIDATION_ERROR_18e00d4c}, + {"VUID-vkCmdCopyBufferToImage-imageOffset-01793", VALIDATION_ERROR_18e00e02}, + {"VUID-vkCmdCopyBufferToImage-commandBuffer-01828", VALIDATION_ERROR_18e00e48}, + {"VUID-vkCmdCopyBufferToImage-commandBuffer-01829", VALIDATION_ERROR_18e00e4a}, + {"VUID-vkCmdCopyBufferToImage-commandBuffer-01830", VALIDATION_ERROR_18e00e4c}, + {"VUID-vkCmdCopyBufferToImage-commandBuffer-parameter", VALIDATION_ERROR_18e02401}, + {"VUID-vkCmdCopyBufferToImage-commandBuffer-recording", VALIDATION_ERROR_18e02413}, + {"VUID-vkCmdCopyBufferToImage-commandBuffer-cmdpool", VALIDATION_ERROR_18e02415}, + {"VUID-vkCmdCopyBufferToImage-dstImage-parameter", VALIDATION_ERROR_18e07201}, + {"VUID-vkCmdCopyBufferToImage-dstImageLayout-parameter", VALIDATION_ERROR_18e07401}, + {"VUID-vkCmdCopyBufferToImage-pRegions-parameter", VALIDATION_ERROR_18e21001}, + {"VUID-vkCmdCopyBufferToImage-regionCount-arraylength", VALIDATION_ERROR_18e2ac1b}, + {"VUID-vkCmdCopyBufferToImage-srcBuffer-parameter", VALIDATION_ERROR_18e2c801}, + {"VUID-vkCmdCopyImage-commonparent", VALIDATION_ERROR_19000009}, + {"VUID-vkCmdCopyImage-renderpass", VALIDATION_ERROR_19000017}, + {"VUID-vkCmdCopyImage-pRegions-00122", VALIDATION_ERROR_190000f4}, + {"VUID-vkCmdCopyImage-pRegions-00123", VALIDATION_ERROR_190000f6}, + {"VUID-vkCmdCopyImage-pRegions-00124", VALIDATION_ERROR_190000f8}, + {"VUID-vkCmdCopyImage-srcImage-00125", VALIDATION_ERROR_190000fa}, + {"VUID-vkCmdCopyImage-srcImage-00126", VALIDATION_ERROR_190000fc}, + {"VUID-vkCmdCopyImage-srcImage-00127", VALIDATION_ERROR_190000fe}, + {"VUID-vkCmdCopyImage-srcImageLayout-00128", VALIDATION_ERROR_19000100}, + {"VUID-vkCmdCopyImage-srcImageLayout-00129", VALIDATION_ERROR_19000102}, + {"VUID-vkCmdCopyImage-dstImage-00130", VALIDATION_ERROR_19000104}, + {"VUID-vkCmdCopyImage-dstImage-00131", VALIDATION_ERROR_19000106}, + {"VUID-vkCmdCopyImage-dstImage-00132", VALIDATION_ERROR_19000108}, + {"VUID-vkCmdCopyImage-dstImageLayout-00133", VALIDATION_ERROR_1900010a}, + {"VUID-vkCmdCopyImage-dstImageLayout-00134", VALIDATION_ERROR_1900010c}, + {"VUID-vkCmdCopyImage-srcImage-00135", VALIDATION_ERROR_1900010e}, + {"VUID-vkCmdCopyImage-srcImage-00136", VALIDATION_ERROR_19000110}, + {"VUID-vkCmdCopyImage-dstImageLayout-01395", VALIDATION_ERROR_19000ae6}, + {"VUID-vkCmdCopyImage-srcImage-01546", VALIDATION_ERROR_19000c14}, + {"VUID-vkCmdCopyImage-dstImage-01547", VALIDATION_ERROR_19000c16}, + {"VUID-vkCmdCopyImage-srcImage-01548", VALIDATION_ERROR_19000c18}, + {"VUID-vkCmdCopyImage-None-01549", VALIDATION_ERROR_19000c1a}, + {"VUID-vkCmdCopyImage-aspectMask-01550", VALIDATION_ERROR_19000c1c}, + {"VUID-vkCmdCopyImage-srcSubresource-01696", VALIDATION_ERROR_19000d40}, + {"VUID-vkCmdCopyImage-dstSubresource-01697", VALIDATION_ERROR_19000d42}, + {"VUID-vkCmdCopyImage-srcSubresource-01698", VALIDATION_ERROR_19000d44}, + {"VUID-vkCmdCopyImage-dstSubresource-01699", VALIDATION_ERROR_19000d46}, + {"VUID-vkCmdCopyImage-srcOffset-01783", VALIDATION_ERROR_19000dee}, + {"VUID-vkCmdCopyImage-dstOffset-01784", VALIDATION_ERROR_19000df0}, + {"VUID-vkCmdCopyImage-commandBuffer-01825", VALIDATION_ERROR_19000e42}, + {"VUID-vkCmdCopyImage-commandBuffer-01826", VALIDATION_ERROR_19000e44}, + {"VUID-vkCmdCopyImage-commandBuffer-01827", VALIDATION_ERROR_19000e46}, + {"VUID-vkCmdCopyImage-srcImageLayout-01917", VALIDATION_ERROR_19000efa}, + {"VUID-vkCmdCopyImage-commandBuffer-parameter", VALIDATION_ERROR_19002401}, + {"VUID-vkCmdCopyImage-commandBuffer-recording", VALIDATION_ERROR_19002413}, + {"VUID-vkCmdCopyImage-commandBuffer-cmdpool", VALIDATION_ERROR_19002415}, + {"VUID-vkCmdCopyImage-dstImage-parameter", VALIDATION_ERROR_19007201}, + {"VUID-vkCmdCopyImage-dstImageLayout-parameter", VALIDATION_ERROR_19007401}, + {"VUID-vkCmdCopyImage-pRegions-parameter", VALIDATION_ERROR_19021001}, + {"VUID-vkCmdCopyImage-regionCount-arraylength", VALIDATION_ERROR_1902ac1b}, + {"VUID-vkCmdCopyImage-srcImage-parameter", VALIDATION_ERROR_1902ce01}, + {"VUID-vkCmdCopyImage-srcImageLayout-parameter", VALIDATION_ERROR_1902d001}, + {"VUID-vkCmdCopyImageToBuffer-commonparent", VALIDATION_ERROR_19200009}, + {"VUID-vkCmdCopyImageToBuffer-renderpass", VALIDATION_ERROR_19200017}, + {"VUID-vkCmdCopyImageToBuffer-pRegions-00182", VALIDATION_ERROR_1920016c}, + {"VUID-vkCmdCopyImageToBuffer-pRegions-00183", VALIDATION_ERROR_1920016e}, + {"VUID-vkCmdCopyImageToBuffer-pRegions-00184", VALIDATION_ERROR_19200170}, + {"VUID-vkCmdCopyImageToBuffer-srcImage-00185", VALIDATION_ERROR_19200172}, + {"VUID-vkCmdCopyImageToBuffer-srcImage-00186", VALIDATION_ERROR_19200174}, + {"VUID-vkCmdCopyImageToBuffer-srcImage-00187", VALIDATION_ERROR_19200176}, + {"VUID-vkCmdCopyImageToBuffer-srcImage-00188", VALIDATION_ERROR_19200178}, + {"VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189", VALIDATION_ERROR_1920017a}, + {"VUID-vkCmdCopyImageToBuffer-srcImageLayout-00190", VALIDATION_ERROR_1920017c}, + {"VUID-vkCmdCopyImageToBuffer-dstBuffer-00191", VALIDATION_ERROR_1920017e}, + {"VUID-vkCmdCopyImageToBuffer-dstBuffer-00192", VALIDATION_ERROR_19200180}, + {"VUID-vkCmdCopyImageToBuffer-srcImageLayout-01397", VALIDATION_ERROR_19200aea}, + {"VUID-vkCmdCopyImageToBuffer-imageSubresource-01703", VALIDATION_ERROR_19200d4e}, + {"VUID-vkCmdCopyImageToBuffer-imageSubresource-01704", VALIDATION_ERROR_19200d50}, + {"VUID-vkCmdCopyImageToBuffer-imageOffset-01794", VALIDATION_ERROR_19200e04}, + {"VUID-vkCmdCopyImageToBuffer-commandBuffer-01831", VALIDATION_ERROR_19200e4e}, + {"VUID-vkCmdCopyImageToBuffer-commandBuffer-01832", VALIDATION_ERROR_19200e50}, + {"VUID-vkCmdCopyImageToBuffer-commandBuffer-01833", VALIDATION_ERROR_19200e52}, + {"VUID-vkCmdCopyImageToBuffer-commandBuffer-parameter", VALIDATION_ERROR_19202401}, + {"VUID-vkCmdCopyImageToBuffer-commandBuffer-recording", VALIDATION_ERROR_19202413}, + {"VUID-vkCmdCopyImageToBuffer-commandBuffer-cmdpool", VALIDATION_ERROR_19202415}, + {"VUID-vkCmdCopyImageToBuffer-dstBuffer-parameter", VALIDATION_ERROR_19206c01}, + {"VUID-vkCmdCopyImageToBuffer-pRegions-parameter", VALIDATION_ERROR_19221001}, + {"VUID-vkCmdCopyImageToBuffer-regionCount-arraylength", VALIDATION_ERROR_1922ac1b}, + {"VUID-vkCmdCopyImageToBuffer-srcImage-parameter", VALIDATION_ERROR_1922ce01}, + {"VUID-vkCmdCopyImageToBuffer-srcImageLayout-parameter", VALIDATION_ERROR_1922d001}, + {"VUID-vkCmdCopyQueryPoolResults-commonparent", VALIDATION_ERROR_19400009}, + {"VUID-vkCmdCopyQueryPoolResults-renderpass", VALIDATION_ERROR_19400017}, + {"VUID-vkCmdCopyQueryPoolResults-dstOffset-00819", VALIDATION_ERROR_19400666}, + {"VUID-vkCmdCopyQueryPoolResults-firstQuery-00820", VALIDATION_ERROR_19400668}, + {"VUID-vkCmdCopyQueryPoolResults-firstQuery-00821", VALIDATION_ERROR_1940066a}, + {"VUID-vkCmdCopyQueryPoolResults-flags-00822", VALIDATION_ERROR_1940066c}, + {"VUID-vkCmdCopyQueryPoolResults-flags-00823", VALIDATION_ERROR_1940066e}, + {"VUID-vkCmdCopyQueryPoolResults-dstBuffer-00824", VALIDATION_ERROR_19400670}, + {"VUID-vkCmdCopyQueryPoolResults-dstBuffer-00825", VALIDATION_ERROR_19400672}, + {"VUID-vkCmdCopyQueryPoolResults-dstBuffer-00826", VALIDATION_ERROR_19400674}, + {"VUID-vkCmdCopyQueryPoolResults-queryType-00827", VALIDATION_ERROR_19400676}, + {"VUID-vkCmdCopyQueryPoolResults-commandBuffer-parameter", VALIDATION_ERROR_19402401}, + {"VUID-vkCmdCopyQueryPoolResults-commandBuffer-recording", VALIDATION_ERROR_19402413}, + {"VUID-vkCmdCopyQueryPoolResults-commandBuffer-cmdpool", VALIDATION_ERROR_19402415}, + {"VUID-vkCmdCopyQueryPoolResults-dstBuffer-parameter", VALIDATION_ERROR_19406c01}, + {"VUID-vkCmdCopyQueryPoolResults-flags-parameter", VALIDATION_ERROR_19409001}, + {"VUID-vkCmdCopyQueryPoolResults-queryPool-parameter", VALIDATION_ERROR_19429801}, + {"VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-parameter", VALIDATION_ERROR_19602401}, + {"VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-recording", VALIDATION_ERROR_19602413}, + {"VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-cmdpool", VALIDATION_ERROR_19602415}, + {"VUID-vkCmdDebugMarkerBeginEXT-pMarkerInfo-parameter", VALIDATION_ERROR_1961a601}, + {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01239", VALIDATION_ERROR_198009ae}, + {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01240", VALIDATION_ERROR_198009b0}, + {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-parameter", VALIDATION_ERROR_19802401}, + {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-recording", VALIDATION_ERROR_19802413}, + {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-cmdpool", VALIDATION_ERROR_19802415}, + {"VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-parameter", VALIDATION_ERROR_19a02401}, + {"VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-recording", VALIDATION_ERROR_19a02413}, + {"VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-cmdpool", VALIDATION_ERROR_19a02415}, + {"VUID-vkCmdDebugMarkerInsertEXT-pMarkerInfo-parameter", VALIDATION_ERROR_19a1a601}, + {"VUID-vkCmdDispatch-renderpass", VALIDATION_ERROR_19c00017}, + {"VUID-vkCmdDispatch-groupCountX-00386", VALIDATION_ERROR_19c00304}, + {"VUID-vkCmdDispatch-groupCountY-00387", VALIDATION_ERROR_19c00306}, + {"VUID-vkCmdDispatch-groupCountZ-00388", VALIDATION_ERROR_19c00308}, + {"VUID-vkCmdDispatch-None-00389", VALIDATION_ERROR_19c0030a}, + {"VUID-vkCmdDispatch-None-00390", VALIDATION_ERROR_19c0030c}, + {"VUID-vkCmdDispatch-None-00391", VALIDATION_ERROR_19c0030e}, + {"VUID-vkCmdDispatch-None-00392", VALIDATION_ERROR_19c00310}, + {"VUID-vkCmdDispatch-None-00393", VALIDATION_ERROR_19c00312}, + {"VUID-vkCmdDispatch-None-00394", VALIDATION_ERROR_19c00314}, + {"VUID-vkCmdDispatch-None-00395", VALIDATION_ERROR_19c00316}, + {"VUID-vkCmdDispatch-None-00396", VALIDATION_ERROR_19c00318}, + {"VUID-vkCmdDispatch-None-00397", VALIDATION_ERROR_19c0031a}, + {"VUID-vkCmdDispatch-linearTilingFeatures-00398", VALIDATION_ERROR_19c0031c}, + {"VUID-vkCmdDispatch-linearTilingFeatures-00399", VALIDATION_ERROR_19c0031e}, + {"VUID-vkCmdDispatch-None-00400", VALIDATION_ERROR_19c00320}, + {"VUID-vkCmdDispatch-commandBuffer-01844", VALIDATION_ERROR_19c00e68}, + {"VUID-vkCmdDispatch-commandBuffer-01845", VALIDATION_ERROR_19c00e6a}, + {"VUID-vkCmdDispatch-commandBuffer-01846", VALIDATION_ERROR_19c00e6c}, + {"VUID-vkCmdDispatch-commandBuffer-parameter", VALIDATION_ERROR_19c02401}, + {"VUID-vkCmdDispatch-commandBuffer-recording", VALIDATION_ERROR_19c02413}, + {"VUID-vkCmdDispatch-commandBuffer-cmdpool", VALIDATION_ERROR_19c02415}, + {"VUID-vkCmdDispatchBase-renderpass", VALIDATION_ERROR_19e00017}, + {"VUID-vkCmdDispatchBase-None-00420", VALIDATION_ERROR_19e00348}, + {"VUID-vkCmdDispatchBase-baseGroupX-00421", VALIDATION_ERROR_19e0034a}, + {"VUID-vkCmdDispatchBase-baseGroupX-00422", VALIDATION_ERROR_19e0034c}, + {"VUID-vkCmdDispatchBase-baseGroupZ-00423", VALIDATION_ERROR_19e0034e}, + {"VUID-vkCmdDispatchBase-groupCountX-00424", VALIDATION_ERROR_19e00350}, + {"VUID-vkCmdDispatchBase-groupCountY-00425", VALIDATION_ERROR_19e00352}, + {"VUID-vkCmdDispatchBase-groupCountZ-00426", VALIDATION_ERROR_19e00354}, + {"VUID-vkCmdDispatchBase-baseGroupX-00427", VALIDATION_ERROR_19e00356}, + {"VUID-vkCmdDispatchBase-commandBuffer-parameter", VALIDATION_ERROR_19e02401}, + {"VUID-vkCmdDispatchBase-commandBuffer-recording", VALIDATION_ERROR_19e02413}, + {"VUID-vkCmdDispatchBase-commandBuffer-cmdpool", VALIDATION_ERROR_19e02415}, + {"VUID-vkCmdDispatchIndirect-commonparent", VALIDATION_ERROR_1a000009}, + {"VUID-vkCmdDispatchIndirect-renderpass", VALIDATION_ERROR_1a000017}, + {"VUID-vkCmdDispatchIndirect-buffer-00401", VALIDATION_ERROR_1a000322}, + {"VUID-vkCmdDispatchIndirect-None-00402", VALIDATION_ERROR_1a000324}, + {"VUID-vkCmdDispatchIndirect-None-00403", VALIDATION_ERROR_1a000326}, + {"VUID-vkCmdDispatchIndirect-None-00404", VALIDATION_ERROR_1a000328}, + {"VUID-vkCmdDispatchIndirect-buffer-00405", VALIDATION_ERROR_1a00032a}, + {"VUID-vkCmdDispatchIndirect-offset-00406", VALIDATION_ERROR_1a00032c}, + {"VUID-vkCmdDispatchIndirect-offset-00407", VALIDATION_ERROR_1a00032e}, + {"VUID-vkCmdDispatchIndirect-None-00408", VALIDATION_ERROR_1a000330}, + {"VUID-vkCmdDispatchIndirect-None-00409", VALIDATION_ERROR_1a000332}, + {"VUID-vkCmdDispatchIndirect-None-00410", VALIDATION_ERROR_1a000334}, + {"VUID-vkCmdDispatchIndirect-None-00411", VALIDATION_ERROR_1a000336}, + {"VUID-vkCmdDispatchIndirect-None-00412", VALIDATION_ERROR_1a000338}, + {"VUID-vkCmdDispatchIndirect-None-00413", VALIDATION_ERROR_1a00033a}, + {"VUID-vkCmdDispatchIndirect-linearTilingFeatures-00414", VALIDATION_ERROR_1a00033c}, + {"VUID-vkCmdDispatchIndirect-linearTilingFeatures-00415", VALIDATION_ERROR_1a00033e}, + {"VUID-vkCmdDispatchIndirect-None-00416", VALIDATION_ERROR_1a000340}, + {"VUID-vkCmdDispatchIndirect-commandBuffer-01847", VALIDATION_ERROR_1a000e6e}, + {"VUID-vkCmdDispatchIndirect-commandBuffer-01848", VALIDATION_ERROR_1a000e70}, + {"VUID-vkCmdDispatchIndirect-commandBuffer-01849", VALIDATION_ERROR_1a000e72}, + {"VUID-vkCmdDispatchIndirect-buffer-parameter", VALIDATION_ERROR_1a001a01}, + {"VUID-vkCmdDispatchIndirect-commandBuffer-parameter", VALIDATION_ERROR_1a002401}, + {"VUID-vkCmdDispatchIndirect-commandBuffer-recording", VALIDATION_ERROR_1a002413}, + {"VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool", VALIDATION_ERROR_1a002415}, + {"VUID-vkCmdDraw-renderpass", VALIDATION_ERROR_1a200017}, + {"VUID-vkCmdDraw-renderPass-00435", VALIDATION_ERROR_1a200366}, + {"VUID-vkCmdDraw-subpass-00436", VALIDATION_ERROR_1a200368}, + {"VUID-vkCmdDraw-None-00437", VALIDATION_ERROR_1a20036a}, + {"VUID-vkCmdDraw-None-00438", VALIDATION_ERROR_1a20036c}, + {"VUID-vkCmdDraw-None-00439", VALIDATION_ERROR_1a20036e}, + {"VUID-vkCmdDraw-None-00440", VALIDATION_ERROR_1a200370}, + {"VUID-vkCmdDraw-None-00441", VALIDATION_ERROR_1a200372}, + {"VUID-vkCmdDraw-None-00442", VALIDATION_ERROR_1a200374}, + {"VUID-vkCmdDraw-None-00443", VALIDATION_ERROR_1a200376}, + {"VUID-vkCmdDraw-None-00444", VALIDATION_ERROR_1a200378}, + {"VUID-vkCmdDraw-None-00445", VALIDATION_ERROR_1a20037a}, + {"VUID-vkCmdDraw-None-00446", VALIDATION_ERROR_1a20037c}, + {"VUID-vkCmdDraw-None-00447", VALIDATION_ERROR_1a20037e}, + {"VUID-vkCmdDraw-None-00448", VALIDATION_ERROR_1a200380}, + {"VUID-vkCmdDraw-None-00449", VALIDATION_ERROR_1a200382}, + {"VUID-vkCmdDraw-linearTilingFeatures-00450", VALIDATION_ERROR_1a200384}, + {"VUID-vkCmdDraw-linearTilingFeatures-00451", VALIDATION_ERROR_1a200386}, + {"VUID-vkCmdDraw-None-00452", VALIDATION_ERROR_1a200388}, + {"VUID-vkCmdDraw-maxMultiviewInstanceIndex-00453", VALIDATION_ERROR_1a20038a}, + {"VUID-vkCmdDraw-None-01499", VALIDATION_ERROR_1a200bb6}, + {"VUID-vkCmdDraw-sampleLocationsEnable-01512", VALIDATION_ERROR_1a200bd0}, + {"VUID-vkCmdDraw-commandBuffer-01850", VALIDATION_ERROR_1a200e74}, + {"VUID-vkCmdDraw-commandBuffer-01851", VALIDATION_ERROR_1a200e76}, + {"VUID-vkCmdDraw-commandBuffer-01852", VALIDATION_ERROR_1a200e78}, + {"VUID-vkCmdDraw-commandBuffer-parameter", VALIDATION_ERROR_1a202401}, + {"VUID-vkCmdDraw-commandBuffer-recording", VALIDATION_ERROR_1a202413}, + {"VUID-vkCmdDraw-commandBuffer-cmdpool", VALIDATION_ERROR_1a202415}, + {"VUID-vkCmdDrawIndexed-renderpass", VALIDATION_ERROR_1a400017}, + {"VUID-vkCmdDrawIndexed-renderPass-00454", VALIDATION_ERROR_1a40038c}, + {"VUID-vkCmdDrawIndexed-subpass-00455", VALIDATION_ERROR_1a40038e}, + {"VUID-vkCmdDrawIndexed-None-00456", VALIDATION_ERROR_1a400390}, + {"VUID-vkCmdDrawIndexed-None-00457", VALIDATION_ERROR_1a400392}, + {"VUID-vkCmdDrawIndexed-None-00458", VALIDATION_ERROR_1a400394}, + {"VUID-vkCmdDrawIndexed-None-00459", VALIDATION_ERROR_1a400396}, + {"VUID-vkCmdDrawIndexed-None-00460", VALIDATION_ERROR_1a400398}, + {"VUID-vkCmdDrawIndexed-None-00461", VALIDATION_ERROR_1a40039a}, + {"VUID-vkCmdDrawIndexed-None-00462", VALIDATION_ERROR_1a40039c}, + {"VUID-vkCmdDrawIndexed-indexSize-00463", VALIDATION_ERROR_1a40039e}, + {"VUID-vkCmdDrawIndexed-None-00464", VALIDATION_ERROR_1a4003a0}, + {"VUID-vkCmdDrawIndexed-None-00465", VALIDATION_ERROR_1a4003a2}, + {"VUID-vkCmdDrawIndexed-None-00466", VALIDATION_ERROR_1a4003a4}, + {"VUID-vkCmdDrawIndexed-None-00467", VALIDATION_ERROR_1a4003a6}, + {"VUID-vkCmdDrawIndexed-None-00468", VALIDATION_ERROR_1a4003a8}, + {"VUID-vkCmdDrawIndexed-None-00469", VALIDATION_ERROR_1a4003aa}, + {"VUID-vkCmdDrawIndexed-linearTilingFeatures-00470", VALIDATION_ERROR_1a4003ac}, + {"VUID-vkCmdDrawIndexed-linearTilingFeatures-00471", VALIDATION_ERROR_1a4003ae}, + {"VUID-vkCmdDrawIndexed-None-00472", VALIDATION_ERROR_1a4003b0}, + {"VUID-vkCmdDrawIndexed-maxMultiviewInstanceIndex-00473", VALIDATION_ERROR_1a4003b2}, + {"VUID-vkCmdDrawIndexed-None-01500", VALIDATION_ERROR_1a400bb8}, + {"VUID-vkCmdDrawIndexed-sampleLocationsEnable-01513", VALIDATION_ERROR_1a400bd2}, + {"VUID-vkCmdDrawIndexed-commandBuffer-01853", VALIDATION_ERROR_1a400e7a}, + {"VUID-vkCmdDrawIndexed-commandBuffer-01854", VALIDATION_ERROR_1a400e7c}, + {"VUID-vkCmdDrawIndexed-commandBuffer-01855", VALIDATION_ERROR_1a400e7e}, + {"VUID-vkCmdDrawIndexed-commandBuffer-parameter", VALIDATION_ERROR_1a402401}, + {"VUID-vkCmdDrawIndexed-commandBuffer-recording", VALIDATION_ERROR_1a402413}, + {"VUID-vkCmdDrawIndexed-commandBuffer-cmdpool", VALIDATION_ERROR_1a402415}, + {"VUID-vkCmdDrawIndexedIndirect-commonparent", VALIDATION_ERROR_1a600009}, + {"VUID-vkCmdDrawIndexedIndirect-renderpass", VALIDATION_ERROR_1a600017}, + {"VUID-vkCmdDrawIndexedIndirect-buffer-00526", VALIDATION_ERROR_1a60041c}, + {"VUID-vkCmdDrawIndexedIndirect-offset-00527", VALIDATION_ERROR_1a60041e}, + {"VUID-vkCmdDrawIndexedIndirect-drawCount-00528", VALIDATION_ERROR_1a600420}, + {"VUID-vkCmdDrawIndexedIndirect-drawCount-00529", VALIDATION_ERROR_1a600422}, + {"VUID-vkCmdDrawIndexedIndirect-firstInstance-00530", VALIDATION_ERROR_1a600424}, + {"VUID-vkCmdDrawIndexedIndirect-renderPass-00531", VALIDATION_ERROR_1a600426}, + {"VUID-vkCmdDrawIndexedIndirect-subpass-00532", VALIDATION_ERROR_1a600428}, + {"VUID-vkCmdDrawIndexedIndirect-None-00533", VALIDATION_ERROR_1a60042a}, + {"VUID-vkCmdDrawIndexedIndirect-None-00534", VALIDATION_ERROR_1a60042c}, + {"VUID-vkCmdDrawIndexedIndirect-None-00535", VALIDATION_ERROR_1a60042e}, + {"VUID-vkCmdDrawIndexedIndirect-None-00536", VALIDATION_ERROR_1a600430}, + {"VUID-vkCmdDrawIndexedIndirect-None-00537", VALIDATION_ERROR_1a600432}, + {"VUID-vkCmdDrawIndexedIndirect-None-00538", VALIDATION_ERROR_1a600434}, + {"VUID-vkCmdDrawIndexedIndirect-drawCount-00539", VALIDATION_ERROR_1a600436}, + {"VUID-vkCmdDrawIndexedIndirect-drawCount-00540", VALIDATION_ERROR_1a600438}, + {"VUID-vkCmdDrawIndexedIndirect-drawCount-00541", VALIDATION_ERROR_1a60043a}, + {"VUID-vkCmdDrawIndexedIndirect-None-00542", VALIDATION_ERROR_1a60043c}, + {"VUID-vkCmdDrawIndexedIndirect-None-00543", VALIDATION_ERROR_1a60043e}, + {"VUID-vkCmdDrawIndexedIndirect-None-00544", VALIDATION_ERROR_1a600440}, + {"VUID-vkCmdDrawIndexedIndirect-None-00545", VALIDATION_ERROR_1a600442}, + {"VUID-vkCmdDrawIndexedIndirect-None-00546", VALIDATION_ERROR_1a600444}, + {"VUID-vkCmdDrawIndexedIndirect-None-00547", VALIDATION_ERROR_1a600446}, + {"VUID-vkCmdDrawIndexedIndirect-linearTilingFeatures-00548", VALIDATION_ERROR_1a600448}, + {"VUID-vkCmdDrawIndexedIndirect-linearTilingFeatures-00549", VALIDATION_ERROR_1a60044a}, + {"VUID-vkCmdDrawIndexedIndirect-None-00550", VALIDATION_ERROR_1a60044c}, + {"VUID-vkCmdDrawIndexedIndirect-maxMultiviewInstanceIndex-00551", VALIDATION_ERROR_1a60044e}, + {"VUID-vkCmdDrawIndexedIndirect-None-01503", VALIDATION_ERROR_1a600bbe}, + {"VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-01516", VALIDATION_ERROR_1a600bd8}, + {"VUID-vkCmdDrawIndexedIndirect-buffer-01665", VALIDATION_ERROR_1a600d02}, + {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-01862", VALIDATION_ERROR_1a600e8c}, + {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-01863", VALIDATION_ERROR_1a600e8e}, + {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-01864", VALIDATION_ERROR_1a600e90}, + {"VUID-vkCmdDrawIndexedIndirect-buffer-parameter", VALIDATION_ERROR_1a601a01}, + {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-parameter", VALIDATION_ERROR_1a602401}, + {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-recording", VALIDATION_ERROR_1a602413}, + {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool", VALIDATION_ERROR_1a602415}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-commonparent", VALIDATION_ERROR_1a800009}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-renderpass", VALIDATION_ERROR_1a800017}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-offset-00555", VALIDATION_ERROR_1a800456}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-countBufferOffset-00556", VALIDATION_ERROR_1a800458}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-stride-00557", VALIDATION_ERROR_1a80045a}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-maxDrawCount-00558", VALIDATION_ERROR_1a80045c}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-firstInstance-00559", VALIDATION_ERROR_1a80045e}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-renderPass-00560", VALIDATION_ERROR_1a800460}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-subpass-00561", VALIDATION_ERROR_1a800462}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-00562", VALIDATION_ERROR_1a800464}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-00563", VALIDATION_ERROR_1a800466}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-00564", VALIDATION_ERROR_1a800468}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-00565", VALIDATION_ERROR_1a80046a}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-00566", VALIDATION_ERROR_1a80046c}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-00567", VALIDATION_ERROR_1a80046e}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-00568", VALIDATION_ERROR_1a800470}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-00569", VALIDATION_ERROR_1a800472}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-drawCount-00570", VALIDATION_ERROR_1a800474}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-00571", VALIDATION_ERROR_1a800476}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-00572", VALIDATION_ERROR_1a800478}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-00573", VALIDATION_ERROR_1a80047a}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-00574", VALIDATION_ERROR_1a80047c}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-00575", VALIDATION_ERROR_1a80047e}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-00576", VALIDATION_ERROR_1a800480}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-linearTilingFeatures-00577", VALIDATION_ERROR_1a800482}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-maxMultiviewInstanceIndex-00578", VALIDATION_ERROR_1a800484}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-None-01504", VALIDATION_ERROR_1a800bc0}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-sampleLocationsEnable-01517", VALIDATION_ERROR_1a800bda}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-01666", VALIDATION_ERROR_1a800d04}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-01667", VALIDATION_ERROR_1a800d06}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-01668", VALIDATION_ERROR_1a800d08}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-01669", VALIDATION_ERROR_1a800d0a}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01865", VALIDATION_ERROR_1a800e92}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01866", VALIDATION_ERROR_1a800e94}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01867", VALIDATION_ERROR_1a800e96}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-parameter", VALIDATION_ERROR_1a801a01}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-parameter", VALIDATION_ERROR_1a802401}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-recording", VALIDATION_ERROR_1a802413}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-cmdpool", VALIDATION_ERROR_1a802415}, + {"VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-parameter", VALIDATION_ERROR_1a803401}, + {"VUID-vkCmdDrawIndirect-commonparent", VALIDATION_ERROR_1aa00009}, + {"VUID-vkCmdDrawIndirect-renderpass", VALIDATION_ERROR_1aa00017}, + {"VUID-vkCmdDrawIndirect-buffer-00474", VALIDATION_ERROR_1aa003b4}, + {"VUID-vkCmdDrawIndirect-offset-00475", VALIDATION_ERROR_1aa003b6}, + {"VUID-vkCmdDrawIndirect-drawCount-00476", VALIDATION_ERROR_1aa003b8}, + {"VUID-vkCmdDrawIndirect-drawCount-00477", VALIDATION_ERROR_1aa003ba}, + {"VUID-vkCmdDrawIndirect-firstInstance-00478", VALIDATION_ERROR_1aa003bc}, + {"VUID-vkCmdDrawIndirect-renderPass-00479", VALIDATION_ERROR_1aa003be}, + {"VUID-vkCmdDrawIndirect-subpass-00480", VALIDATION_ERROR_1aa003c0}, + {"VUID-vkCmdDrawIndirect-None-00481", VALIDATION_ERROR_1aa003c2}, + {"VUID-vkCmdDrawIndirect-None-00482", VALIDATION_ERROR_1aa003c4}, + {"VUID-vkCmdDrawIndirect-None-00483", VALIDATION_ERROR_1aa003c6}, + {"VUID-vkCmdDrawIndirect-None-00484", VALIDATION_ERROR_1aa003c8}, + {"VUID-vkCmdDrawIndirect-None-00485", VALIDATION_ERROR_1aa003ca}, + {"VUID-vkCmdDrawIndirect-None-00486", VALIDATION_ERROR_1aa003cc}, + {"VUID-vkCmdDrawIndirect-drawCount-00487", VALIDATION_ERROR_1aa003ce}, + {"VUID-vkCmdDrawIndirect-drawCount-00488", VALIDATION_ERROR_1aa003d0}, + {"VUID-vkCmdDrawIndirect-drawCount-00489", VALIDATION_ERROR_1aa003d2}, + {"VUID-vkCmdDrawIndirect-None-00490", VALIDATION_ERROR_1aa003d4}, + {"VUID-vkCmdDrawIndirect-None-00491", VALIDATION_ERROR_1aa003d6}, + {"VUID-vkCmdDrawIndirect-None-00492", VALIDATION_ERROR_1aa003d8}, + {"VUID-vkCmdDrawIndirect-None-00493", VALIDATION_ERROR_1aa003da}, + {"VUID-vkCmdDrawIndirect-None-00494", VALIDATION_ERROR_1aa003dc}, + {"VUID-vkCmdDrawIndirect-None-00495", VALIDATION_ERROR_1aa003de}, + {"VUID-vkCmdDrawIndirect-linearTilingFeatures-00496", VALIDATION_ERROR_1aa003e0}, + {"VUID-vkCmdDrawIndirect-linearTilingFeatures-00497", VALIDATION_ERROR_1aa003e2}, + {"VUID-vkCmdDrawIndirect-None-00498", VALIDATION_ERROR_1aa003e4}, + {"VUID-vkCmdDrawIndirect-maxMultiviewInstanceIndex-00499", VALIDATION_ERROR_1aa003e6}, + {"VUID-vkCmdDrawIndirect-None-01501", VALIDATION_ERROR_1aa00bba}, + {"VUID-vkCmdDrawIndirect-sampleLocationsEnable-01514", VALIDATION_ERROR_1aa00bd4}, + {"VUID-vkCmdDrawIndirect-buffer-01660", VALIDATION_ERROR_1aa00cf8}, + {"VUID-vkCmdDrawIndirect-commandBuffer-01856", VALIDATION_ERROR_1aa00e80}, + {"VUID-vkCmdDrawIndirect-commandBuffer-01857", VALIDATION_ERROR_1aa00e82}, + {"VUID-vkCmdDrawIndirect-commandBuffer-01858", VALIDATION_ERROR_1aa00e84}, + {"VUID-vkCmdDrawIndirect-buffer-parameter", VALIDATION_ERROR_1aa01a01}, + {"VUID-vkCmdDrawIndirect-commandBuffer-parameter", VALIDATION_ERROR_1aa02401}, + {"VUID-vkCmdDrawIndirect-commandBuffer-recording", VALIDATION_ERROR_1aa02413}, + {"VUID-vkCmdDrawIndirect-commandBuffer-cmdpool", VALIDATION_ERROR_1aa02415}, + {"VUID-vkCmdDrawIndirectCountAMD-commonparent", VALIDATION_ERROR_1ac00009}, + {"VUID-vkCmdDrawIndirectCountAMD-renderpass", VALIDATION_ERROR_1ac00017}, + {"VUID-vkCmdDrawIndirectCountAMD-offset-00502", VALIDATION_ERROR_1ac003ec}, + {"VUID-vkCmdDrawIndirectCountAMD-countBufferOffset-00503", VALIDATION_ERROR_1ac003ee}, + {"VUID-vkCmdDrawIndirectCountAMD-stride-00504", VALIDATION_ERROR_1ac003f0}, + {"VUID-vkCmdDrawIndirectCountAMD-maxDrawCount-00505", VALIDATION_ERROR_1ac003f2}, + {"VUID-vkCmdDrawIndirectCountAMD-firstInstance-00506", VALIDATION_ERROR_1ac003f4}, + {"VUID-vkCmdDrawIndirectCountAMD-renderPass-00507", VALIDATION_ERROR_1ac003f6}, + {"VUID-vkCmdDrawIndirectCountAMD-subpass-00508", VALIDATION_ERROR_1ac003f8}, + {"VUID-vkCmdDrawIndirectCountAMD-None-00509", VALIDATION_ERROR_1ac003fa}, + {"VUID-vkCmdDrawIndirectCountAMD-None-00510", VALIDATION_ERROR_1ac003fc}, + {"VUID-vkCmdDrawIndirectCountAMD-None-00511", VALIDATION_ERROR_1ac003fe}, + {"VUID-vkCmdDrawIndirectCountAMD-None-00512", VALIDATION_ERROR_1ac00400}, + {"VUID-vkCmdDrawIndirectCountAMD-None-00513", VALIDATION_ERROR_1ac00402}, + {"VUID-vkCmdDrawIndirectCountAMD-None-00514", VALIDATION_ERROR_1ac00404}, + {"VUID-vkCmdDrawIndirectCountAMD-countBuffer-00515", VALIDATION_ERROR_1ac00406}, + {"VUID-vkCmdDrawIndirectCountAMD-countBuffer-00516", VALIDATION_ERROR_1ac00408}, + {"VUID-vkCmdDrawIndirectCountAMD-countBuffer-00517", VALIDATION_ERROR_1ac0040a}, + {"VUID-vkCmdDrawIndirectCountAMD-None-00518", VALIDATION_ERROR_1ac0040c}, + {"VUID-vkCmdDrawIndirectCountAMD-None-00519", VALIDATION_ERROR_1ac0040e}, + {"VUID-vkCmdDrawIndirectCountAMD-None-00520", VALIDATION_ERROR_1ac00410}, + {"VUID-vkCmdDrawIndirectCountAMD-None-00521", VALIDATION_ERROR_1ac00412}, + {"VUID-vkCmdDrawIndirectCountAMD-None-00522", VALIDATION_ERROR_1ac00414}, + {"VUID-vkCmdDrawIndirectCountAMD-None-00523", VALIDATION_ERROR_1ac00416}, + {"VUID-vkCmdDrawIndirectCountAMD-linearTilingFeatures-00524", VALIDATION_ERROR_1ac00418}, + {"VUID-vkCmdDrawIndirectCountAMD-maxMultiviewInstanceIndex-00525", VALIDATION_ERROR_1ac0041a}, + {"VUID-vkCmdDrawIndirectCountAMD-None-01502", VALIDATION_ERROR_1ac00bbc}, + {"VUID-vkCmdDrawIndirectCountAMD-sampleLocationsEnable-01515", VALIDATION_ERROR_1ac00bd6}, + {"VUID-vkCmdDrawIndirectCountAMD-buffer-01661", VALIDATION_ERROR_1ac00cfa}, + {"VUID-vkCmdDrawIndirectCountAMD-buffer-01662", VALIDATION_ERROR_1ac00cfc}, + {"VUID-vkCmdDrawIndirectCountAMD-countBuffer-01663", VALIDATION_ERROR_1ac00cfe}, + {"VUID-vkCmdDrawIndirectCountAMD-countBuffer-01664", VALIDATION_ERROR_1ac00d00}, + {"VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01859", VALIDATION_ERROR_1ac00e86}, + {"VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01860", VALIDATION_ERROR_1ac00e88}, + {"VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01861", VALIDATION_ERROR_1ac00e8a}, + {"VUID-vkCmdDrawIndirectCountAMD-buffer-parameter", VALIDATION_ERROR_1ac01a01}, + {"VUID-vkCmdDrawIndirectCountAMD-commandBuffer-parameter", VALIDATION_ERROR_1ac02401}, + {"VUID-vkCmdDrawIndirectCountAMD-commandBuffer-recording", VALIDATION_ERROR_1ac02413}, + {"VUID-vkCmdDrawIndirectCountAMD-commandBuffer-cmdpool", VALIDATION_ERROR_1ac02415}, + {"VUID-vkCmdDrawIndirectCountAMD-countBuffer-parameter", VALIDATION_ERROR_1ac03401}, + {"VUID-vkCmdEndQuery-commonparent", VALIDATION_ERROR_1ae00009}, + {"VUID-vkCmdEndQuery-query-00810", VALIDATION_ERROR_1ae00654}, + {"VUID-vkCmdEndQuery-query-00812", VALIDATION_ERROR_1ae00658}, + {"VUID-vkCmdEndQuery-commandBuffer-01886", VALIDATION_ERROR_1ae00ebc}, + {"VUID-vkCmdEndQuery-None-01923", VALIDATION_ERROR_1ae00f06}, + {"VUID-vkCmdEndQuery-commandBuffer-parameter", VALIDATION_ERROR_1ae02401}, + {"VUID-vkCmdEndQuery-commandBuffer-recording", VALIDATION_ERROR_1ae02413}, + {"VUID-vkCmdEndQuery-commandBuffer-cmdpool", VALIDATION_ERROR_1ae02415}, + {"VUID-vkCmdEndQuery-queryPool-parameter", VALIDATION_ERROR_1ae29801}, + {"VUID-vkCmdEndRenderPass-renderpass", VALIDATION_ERROR_1b000017}, + {"VUID-vkCmdEndRenderPass-bufferlevel", VALIDATION_ERROR_1b000019}, + {"VUID-vkCmdEndRenderPass-None-00910", VALIDATION_ERROR_1b00071c}, + {"VUID-vkCmdEndRenderPass-commandBuffer-parameter", VALIDATION_ERROR_1b002401}, + {"VUID-vkCmdEndRenderPass-commandBuffer-recording", VALIDATION_ERROR_1b002413}, + {"VUID-vkCmdEndRenderPass-commandBuffer-cmdpool", VALIDATION_ERROR_1b002415}, + {"VUID-vkCmdExecuteCommands-commonparent", VALIDATION_ERROR_1b200009}, + {"VUID-vkCmdExecuteCommands-bufferlevel", VALIDATION_ERROR_1b200019}, + {"VUID-vkCmdExecuteCommands-commandBuffer-00087", VALIDATION_ERROR_1b2000ae}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-00088", VALIDATION_ERROR_1b2000b0}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-00089", VALIDATION_ERROR_1b2000b2}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-00090", VALIDATION_ERROR_1b2000b4}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-00091", VALIDATION_ERROR_1b2000b6}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-00092", VALIDATION_ERROR_1b2000b8}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-00093", VALIDATION_ERROR_1b2000ba}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-00094", VALIDATION_ERROR_1b2000bc}, + {"VUID-vkCmdExecuteCommands-contents-00095", VALIDATION_ERROR_1b2000be}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-00096", VALIDATION_ERROR_1b2000c0}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-00097", VALIDATION_ERROR_1b2000c2}, + {"VUID-vkCmdExecuteCommands-pInheritanceInfo-00098", VALIDATION_ERROR_1b2000c4}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-00099", VALIDATION_ERROR_1b2000c6}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-00100", VALIDATION_ERROR_1b2000c8}, + {"VUID-vkCmdExecuteCommands-commandBuffer-00101", VALIDATION_ERROR_1b2000ca}, + {"VUID-vkCmdExecuteCommands-commandBuffer-00102", VALIDATION_ERROR_1b2000cc}, + {"VUID-vkCmdExecuteCommands-commandBuffer-00103", VALIDATION_ERROR_1b2000ce}, + {"VUID-vkCmdExecuteCommands-commandBuffer-00104", VALIDATION_ERROR_1b2000d0}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-00105", VALIDATION_ERROR_1b2000d2}, + {"VUID-vkCmdExecuteCommands-commandBuffer-01820", VALIDATION_ERROR_1b200e38}, + {"VUID-vkCmdExecuteCommands-commandBuffer-01821", VALIDATION_ERROR_1b200e3a}, + {"VUID-vkCmdExecuteCommands-commandBuffer-parameter", VALIDATION_ERROR_1b202401}, + {"VUID-vkCmdExecuteCommands-commandBuffer-recording", VALIDATION_ERROR_1b202413}, + {"VUID-vkCmdExecuteCommands-commandBuffer-cmdpool", VALIDATION_ERROR_1b202415}, + {"VUID-vkCmdExecuteCommands-commandBufferCount-arraylength", VALIDATION_ERROR_1b20261b}, + {"VUID-vkCmdExecuteCommands-pCommandBuffers-parameter", VALIDATION_ERROR_1b211401}, + {"VUID-vkCmdFillBuffer-commonparent", VALIDATION_ERROR_1b400009}, + {"VUID-vkCmdFillBuffer-renderpass", VALIDATION_ERROR_1b400017}, + {"VUID-vkCmdFillBuffer-dstOffset-00024", VALIDATION_ERROR_1b400030}, + {"VUID-vkCmdFillBuffer-dstOffset-00025", VALIDATION_ERROR_1b400032}, + {"VUID-vkCmdFillBuffer-size-00026", VALIDATION_ERROR_1b400034}, + {"VUID-vkCmdFillBuffer-size-00027", VALIDATION_ERROR_1b400036}, + {"VUID-vkCmdFillBuffer-size-00028", VALIDATION_ERROR_1b400038}, + {"VUID-vkCmdFillBuffer-dstBuffer-00029", VALIDATION_ERROR_1b40003a}, + {"VUID-vkCmdFillBuffer-commandBuffer-00030", VALIDATION_ERROR_1b40003c}, + {"VUID-vkCmdFillBuffer-dstBuffer-00031", VALIDATION_ERROR_1b40003e}, + {"VUID-vkCmdFillBuffer-commandBuffer-01811", VALIDATION_ERROR_1b400e26}, + {"VUID-vkCmdFillBuffer-commandBuffer-01812", VALIDATION_ERROR_1b400e28}, + {"VUID-vkCmdFillBuffer-commandBuffer-parameter", VALIDATION_ERROR_1b402401}, + {"VUID-vkCmdFillBuffer-commandBuffer-recording", VALIDATION_ERROR_1b402413}, + {"VUID-vkCmdFillBuffer-commandBuffer-cmdpool", VALIDATION_ERROR_1b402415}, + {"VUID-vkCmdFillBuffer-dstBuffer-parameter", VALIDATION_ERROR_1b406c01}, + {"VUID-vkCmdNextSubpass-renderpass", VALIDATION_ERROR_1b600017}, + {"VUID-vkCmdNextSubpass-bufferlevel", VALIDATION_ERROR_1b600019}, + {"VUID-vkCmdNextSubpass-None-00909", VALIDATION_ERROR_1b60071a}, + {"VUID-vkCmdNextSubpass-commandBuffer-parameter", VALIDATION_ERROR_1b602401}, + {"VUID-vkCmdNextSubpass-commandBuffer-recording", VALIDATION_ERROR_1b602413}, + {"VUID-vkCmdNextSubpass-commandBuffer-cmdpool", VALIDATION_ERROR_1b602415}, + {"VUID-vkCmdNextSubpass-contents-parameter", VALIDATION_ERROR_1b603201}, + {"VUID-vkCmdPipelineBarrier-srcStageMask-01168", VALIDATION_ERROR_1b800920}, + {"VUID-vkCmdPipelineBarrier-dstStageMask-01169", VALIDATION_ERROR_1b800922}, + {"VUID-vkCmdPipelineBarrier-srcStageMask-01170", VALIDATION_ERROR_1b800924}, + {"VUID-vkCmdPipelineBarrier-dstStageMask-01171", VALIDATION_ERROR_1b800926}, + {"VUID-vkCmdPipelineBarrier-pDependencies-01172", VALIDATION_ERROR_1b800928}, + {"VUID-vkCmdPipelineBarrier-srcStageMask-01173", VALIDATION_ERROR_1b80092a}, + {"VUID-vkCmdPipelineBarrier-dstStageMask-01174", VALIDATION_ERROR_1b80092c}, + {"VUID-vkCmdPipelineBarrier-srcAccessMask-01175", VALIDATION_ERROR_1b80092e}, + {"VUID-vkCmdPipelineBarrier-dstAccessMask-01176", VALIDATION_ERROR_1b800930}, + {"VUID-vkCmdPipelineBarrier-dependencyFlags-01177", VALIDATION_ERROR_1b800932}, + {"VUID-vkCmdPipelineBarrier-bufferMemoryBarrierCount-01178", VALIDATION_ERROR_1b800934}, + {"VUID-vkCmdPipelineBarrier-image-01179", VALIDATION_ERROR_1b800936}, + {"VUID-vkCmdPipelineBarrier-oldLayout-01180", VALIDATION_ERROR_1b800938}, + {"VUID-vkCmdPipelineBarrier-oldLayout-01181", VALIDATION_ERROR_1b80093a}, + {"VUID-vkCmdPipelineBarrier-srcQueueFamilyIndex-01182", VALIDATION_ERROR_1b80093c}, + {"VUID-vkCmdPipelineBarrier-srcStageMask-01183", VALIDATION_ERROR_1b80093e}, + {"VUID-vkCmdPipelineBarrier-pMemoryBarriers-01184", VALIDATION_ERROR_1b800940}, + {"VUID-vkCmdPipelineBarrier-pMemoryBarriers-01185", VALIDATION_ERROR_1b800942}, + {"VUID-vkCmdPipelineBarrier-dependencyFlags-01186", VALIDATION_ERROR_1b800944}, + {"VUID-vkCmdPipelineBarrier-commandBuffer-parameter", VALIDATION_ERROR_1b802401}, + {"VUID-vkCmdPipelineBarrier-commandBuffer-recording", VALIDATION_ERROR_1b802413}, + {"VUID-vkCmdPipelineBarrier-commandBuffer-cmdpool", VALIDATION_ERROR_1b802415}, + {"VUID-vkCmdPipelineBarrier-dependencyFlags-parameter", VALIDATION_ERROR_1b803e01}, + {"VUID-vkCmdPipelineBarrier-dstStageMask-parameter", VALIDATION_ERROR_1b807801}, + {"VUID-vkCmdPipelineBarrier-dstStageMask-requiredbitmask", VALIDATION_ERROR_1b807803}, + {"VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-parameter", VALIDATION_ERROR_1b810401}, + {"VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-parameter", VALIDATION_ERROR_1b818a01}, + {"VUID-vkCmdPipelineBarrier-pMemoryBarriers-parameter", VALIDATION_ERROR_1b81ac01}, + {"VUID-vkCmdPipelineBarrier-srcStageMask-parameter", VALIDATION_ERROR_1b82d401}, + {"VUID-vkCmdPipelineBarrier-srcStageMask-requiredbitmask", VALIDATION_ERROR_1b82d403}, + {"VUID-vkCmdProcessCommandsNVX-renderpass", VALIDATION_ERROR_1ba00017}, + {"VUID-vkCmdProcessCommandsNVX-commandBuffer-parameter", VALIDATION_ERROR_1ba02401}, + {"VUID-vkCmdProcessCommandsNVX-commandBuffer-recording", VALIDATION_ERROR_1ba02413}, + {"VUID-vkCmdProcessCommandsNVX-commandBuffer-cmdpool", VALIDATION_ERROR_1ba02415}, + {"VUID-vkCmdProcessCommandsNVX-pProcessCommandsInfo-parameter", VALIDATION_ERROR_1ba1f201}, + {"VUID-vkCmdPushConstants-commonparent", VALIDATION_ERROR_1bc00009}, + {"VUID-vkCmdPushConstants-offset-00368", VALIDATION_ERROR_1bc002e0}, + {"VUID-vkCmdPushConstants-size-00369", VALIDATION_ERROR_1bc002e2}, + {"VUID-vkCmdPushConstants-offset-00370", VALIDATION_ERROR_1bc002e4}, + {"VUID-vkCmdPushConstants-size-00371", VALIDATION_ERROR_1bc002e6}, + {"VUID-vkCmdPushConstants-offset-01795", VALIDATION_ERROR_1bc00e06}, + {"VUID-vkCmdPushConstants-offset-01796", VALIDATION_ERROR_1bc00e08}, + {"VUID-vkCmdPushConstants-commandBuffer-parameter", VALIDATION_ERROR_1bc02401}, + {"VUID-vkCmdPushConstants-commandBuffer-recording", VALIDATION_ERROR_1bc02413}, + {"VUID-vkCmdPushConstants-commandBuffer-cmdpool", VALIDATION_ERROR_1bc02415}, + {"VUID-vkCmdPushConstants-layout-parameter", VALIDATION_ERROR_1bc0be01}, + {"VUID-vkCmdPushConstants-pValues-parameter", VALIDATION_ERROR_1bc26201}, + {"VUID-vkCmdPushConstants-size-arraylength", VALIDATION_ERROR_1bc2c21b}, + {"VUID-vkCmdPushConstants-stageFlags-parameter", VALIDATION_ERROR_1bc2dc01}, + {"VUID-vkCmdPushConstants-stageFlags-requiredbitmask", VALIDATION_ERROR_1bc2dc03}, + {"VUID-vkCmdPushDescriptorSetKHR-commonparent", VALIDATION_ERROR_1be00009}, + {"VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363", VALIDATION_ERROR_1be002d6}, + {"VUID-vkCmdPushDescriptorSetKHR-set-00364", VALIDATION_ERROR_1be002d8}, + {"VUID-vkCmdPushDescriptorSetKHR-set-00365", VALIDATION_ERROR_1be002da}, + {"VUID-vkCmdPushDescriptorSetKHR-commandBuffer-parameter", VALIDATION_ERROR_1be02401}, + {"VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording", VALIDATION_ERROR_1be02413}, + {"VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool", VALIDATION_ERROR_1be02415}, + {"VUID-vkCmdPushDescriptorSetKHR-descriptorWriteCount-arraylength", VALIDATION_ERROR_1be0541b}, + {"VUID-vkCmdPushDescriptorSetKHR-layout-parameter", VALIDATION_ERROR_1be0be01}, + {"VUID-vkCmdPushDescriptorSetKHR-pDescriptorWrites-parameter", VALIDATION_ERROR_1be13601}, + {"VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-parameter", VALIDATION_ERROR_1be27e01}, + {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commonparent", VALIDATION_ERROR_1c000009}, + {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-00366", VALIDATION_ERROR_1c0002dc}, + {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-pData-01686", VALIDATION_ERROR_1c000d2c}, + {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-parameter", VALIDATION_ERROR_1c002401}, + {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-recording", VALIDATION_ERROR_1c002413}, + {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-cmdpool", VALIDATION_ERROR_1c002415}, + {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-descriptorUpdateTemplate-parameter", VALIDATION_ERROR_1c005201}, + {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-layout-parameter", VALIDATION_ERROR_1c00be01}, + {"VUID-vkCmdReserveSpaceForCommandsNVX-renderpass", VALIDATION_ERROR_1c200017}, + {"VUID-vkCmdReserveSpaceForCommandsNVX-bufferlevel", VALIDATION_ERROR_1c200019}, + {"VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-01329", VALIDATION_ERROR_1c200a62}, + {"VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-01330", VALIDATION_ERROR_1c200a64}, + {"VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-parameter", VALIDATION_ERROR_1c202401}, + {"VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-recording", VALIDATION_ERROR_1c202413}, + {"VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-cmdpool", VALIDATION_ERROR_1c202415}, + {"VUID-vkCmdReserveSpaceForCommandsNVX-pReserveSpaceInfo-parameter", VALIDATION_ERROR_1c221a01}, + {"VUID-vkCmdResetEvent-commonparent", VALIDATION_ERROR_1c400009}, + {"VUID-vkCmdResetEvent-renderpass", VALIDATION_ERROR_1c400017}, + {"VUID-vkCmdResetEvent-stageMask-01153", VALIDATION_ERROR_1c400902}, + {"VUID-vkCmdResetEvent-stageMask-01154", VALIDATION_ERROR_1c400904}, + {"VUID-vkCmdResetEvent-stageMask-01155", VALIDATION_ERROR_1c400906}, + {"VUID-vkCmdResetEvent-event-01156", VALIDATION_ERROR_1c400908}, + {"VUID-vkCmdResetEvent-commandBuffer-01157", VALIDATION_ERROR_1c40090a}, + {"VUID-vkCmdResetEvent-commandBuffer-parameter", VALIDATION_ERROR_1c402401}, + {"VUID-vkCmdResetEvent-commandBuffer-recording", VALIDATION_ERROR_1c402413}, + {"VUID-vkCmdResetEvent-commandBuffer-cmdpool", VALIDATION_ERROR_1c402415}, + {"VUID-vkCmdResetEvent-event-parameter", VALIDATION_ERROR_1c407e01}, + {"VUID-vkCmdResetEvent-stageMask-parameter", VALIDATION_ERROR_1c42de01}, + {"VUID-vkCmdResetEvent-stageMask-requiredbitmask", VALIDATION_ERROR_1c42de03}, + {"VUID-vkCmdResetQueryPool-commonparent", VALIDATION_ERROR_1c600009}, + {"VUID-vkCmdResetQueryPool-renderpass", VALIDATION_ERROR_1c600017}, + {"VUID-vkCmdResetQueryPool-firstQuery-00796", VALIDATION_ERROR_1c600638}, + {"VUID-vkCmdResetQueryPool-firstQuery-00797", VALIDATION_ERROR_1c60063a}, + {"VUID-vkCmdResetQueryPool-commandBuffer-parameter", VALIDATION_ERROR_1c602401}, + {"VUID-vkCmdResetQueryPool-commandBuffer-recording", VALIDATION_ERROR_1c602413}, + {"VUID-vkCmdResetQueryPool-commandBuffer-cmdpool", VALIDATION_ERROR_1c602415}, + {"VUID-vkCmdResetQueryPool-queryPool-parameter", VALIDATION_ERROR_1c629801}, + {"VUID-vkCmdResolveImage-commonparent", VALIDATION_ERROR_1c800009}, + {"VUID-vkCmdResolveImage-renderpass", VALIDATION_ERROR_1c800017}, + {"VUID-vkCmdResolveImage-pRegions-00253", VALIDATION_ERROR_1c8001fa}, + {"VUID-vkCmdResolveImage-pRegions-00254", VALIDATION_ERROR_1c8001fc}, + {"VUID-vkCmdResolveImage-pRegions-00255", VALIDATION_ERROR_1c8001fe}, + {"VUID-vkCmdResolveImage-srcImage-00256", VALIDATION_ERROR_1c800200}, + {"VUID-vkCmdResolveImage-srcImage-00257", VALIDATION_ERROR_1c800202}, + {"VUID-vkCmdResolveImage-dstImage-00258", VALIDATION_ERROR_1c800204}, + {"VUID-vkCmdResolveImage-dstImage-00259", VALIDATION_ERROR_1c800206}, + {"VUID-vkCmdResolveImage-srcImageLayout-00260", VALIDATION_ERROR_1c800208}, + {"VUID-vkCmdResolveImage-srcImageLayout-00261", VALIDATION_ERROR_1c80020a}, + {"VUID-vkCmdResolveImage-dstImageLayout-00262", VALIDATION_ERROR_1c80020c}, + {"VUID-vkCmdResolveImage-dstImageLayout-00263", VALIDATION_ERROR_1c80020e}, + {"VUID-vkCmdResolveImage-dstImage-00264", VALIDATION_ERROR_1c800210}, + {"VUID-vkCmdResolveImage-dstImage-00265", VALIDATION_ERROR_1c800212}, + {"VUID-vkCmdResolveImage-srcImage-01386", VALIDATION_ERROR_1c800ad4}, + {"VUID-vkCmdResolveImage-srcImageLayout-01400", VALIDATION_ERROR_1c800af0}, + {"VUID-vkCmdResolveImage-dstImageLayout-01401", VALIDATION_ERROR_1c800af2}, + {"VUID-vkCmdResolveImage-srcSubresource-01709", VALIDATION_ERROR_1c800d5a}, + {"VUID-vkCmdResolveImage-dstSubresource-01710", VALIDATION_ERROR_1c800d5c}, + {"VUID-vkCmdResolveImage-srcSubresource-01711", VALIDATION_ERROR_1c800d5e}, + {"VUID-vkCmdResolveImage-dstSubresource-01712", VALIDATION_ERROR_1c800d60}, + {"VUID-vkCmdResolveImage-commandBuffer-01837", VALIDATION_ERROR_1c800e5a}, + {"VUID-vkCmdResolveImage-commandBuffer-01838", VALIDATION_ERROR_1c800e5c}, + {"VUID-vkCmdResolveImage-commandBuffer-01839", VALIDATION_ERROR_1c800e5e}, + {"VUID-vkCmdResolveImage-commandBuffer-parameter", VALIDATION_ERROR_1c802401}, + {"VUID-vkCmdResolveImage-commandBuffer-recording", VALIDATION_ERROR_1c802413}, + {"VUID-vkCmdResolveImage-commandBuffer-cmdpool", VALIDATION_ERROR_1c802415}, + {"VUID-vkCmdResolveImage-dstImage-parameter", VALIDATION_ERROR_1c807201}, + {"VUID-vkCmdResolveImage-dstImageLayout-parameter", VALIDATION_ERROR_1c807401}, + {"VUID-vkCmdResolveImage-pRegions-parameter", VALIDATION_ERROR_1c821001}, + {"VUID-vkCmdResolveImage-regionCount-arraylength", VALIDATION_ERROR_1c82ac1b}, + {"VUID-vkCmdResolveImage-srcImage-parameter", VALIDATION_ERROR_1c82ce01}, + {"VUID-vkCmdResolveImage-srcImageLayout-parameter", VALIDATION_ERROR_1c82d001}, + {"VUID-vkCmdSetBlendConstants-None-00612", VALIDATION_ERROR_1ca004c8}, + {"VUID-vkCmdSetBlendConstants-commandBuffer-parameter", VALIDATION_ERROR_1ca02401}, + {"VUID-vkCmdSetBlendConstants-commandBuffer-recording", VALIDATION_ERROR_1ca02413}, + {"VUID-vkCmdSetBlendConstants-commandBuffer-cmdpool", VALIDATION_ERROR_1ca02415}, + {"VUID-vkCmdSetDepthBias-None-00789", VALIDATION_ERROR_1cc0062a}, + {"VUID-vkCmdSetDepthBias-depthBiasClamp-00790", VALIDATION_ERROR_1cc0062c}, + {"VUID-vkCmdSetDepthBias-commandBuffer-parameter", VALIDATION_ERROR_1cc02401}, + {"VUID-vkCmdSetDepthBias-commandBuffer-recording", VALIDATION_ERROR_1cc02413}, + {"VUID-vkCmdSetDepthBias-commandBuffer-cmdpool", VALIDATION_ERROR_1cc02415}, + {"VUID-vkCmdSetDepthBounds-None-00599", VALIDATION_ERROR_1ce004ae}, + {"VUID-vkCmdSetDepthBounds-minDepthBounds-00600", VALIDATION_ERROR_1ce004b0}, + {"VUID-vkCmdSetDepthBounds-maxDepthBounds-00601", VALIDATION_ERROR_1ce004b2}, + {"VUID-vkCmdSetDepthBounds-commandBuffer-parameter", VALIDATION_ERROR_1ce02401}, + {"VUID-vkCmdSetDepthBounds-commandBuffer-recording", VALIDATION_ERROR_1ce02413}, + {"VUID-vkCmdSetDepthBounds-commandBuffer-cmdpool", VALIDATION_ERROR_1ce02415}, + {"VUID-vkCmdSetDeviceMask-deviceMask-00108", VALIDATION_ERROR_1d0000d8}, + {"VUID-vkCmdSetDeviceMask-deviceMask-00109", VALIDATION_ERROR_1d0000da}, + {"VUID-vkCmdSetDeviceMask-deviceMask-00110", VALIDATION_ERROR_1d0000dc}, + {"VUID-vkCmdSetDeviceMask-deviceMask-00111", VALIDATION_ERROR_1d0000de}, + {"VUID-vkCmdSetDeviceMask-commandBuffer-parameter", VALIDATION_ERROR_1d002401}, + {"VUID-vkCmdSetDeviceMask-commandBuffer-recording", VALIDATION_ERROR_1d002413}, + {"VUID-vkCmdSetDeviceMask-commandBuffer-cmdpool", VALIDATION_ERROR_1d002415}, + {"VUID-vkCmdSetDiscardRectangleEXT-None-00583", VALIDATION_ERROR_1d20048e}, + {"VUID-vkCmdSetDiscardRectangleEXT-firstDiscardRectangle-00585", VALIDATION_ERROR_1d200492}, + {"VUID-vkCmdSetDiscardRectangleEXT-x-00587", VALIDATION_ERROR_1d200496}, + {"VUID-vkCmdSetDiscardRectangleEXT-offset-00588", VALIDATION_ERROR_1d200498}, + {"VUID-vkCmdSetDiscardRectangleEXT-offset-00589", VALIDATION_ERROR_1d20049a}, + {"VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-parameter", VALIDATION_ERROR_1d202401}, + {"VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-recording", VALIDATION_ERROR_1d202413}, + {"VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-cmdpool", VALIDATION_ERROR_1d202415}, + {"VUID-vkCmdSetDiscardRectangleEXT-discardRectangleCount-arraylength", VALIDATION_ERROR_1d205c1b}, + {"VUID-vkCmdSetDiscardRectangleEXT-pDiscardRectangles-parameter", VALIDATION_ERROR_1d214601}, + {"VUID-vkCmdSetEvent-commonparent", VALIDATION_ERROR_1d400009}, + {"VUID-vkCmdSetEvent-renderpass", VALIDATION_ERROR_1d400017}, + {"VUID-vkCmdSetEvent-stageMask-01149", VALIDATION_ERROR_1d4008fa}, + {"VUID-vkCmdSetEvent-stageMask-01150", VALIDATION_ERROR_1d4008fc}, + {"VUID-vkCmdSetEvent-stageMask-01151", VALIDATION_ERROR_1d4008fe}, + {"VUID-vkCmdSetEvent-commandBuffer-01152", VALIDATION_ERROR_1d400900}, + {"VUID-vkCmdSetEvent-commandBuffer-parameter", VALIDATION_ERROR_1d402401}, + {"VUID-vkCmdSetEvent-commandBuffer-recording", VALIDATION_ERROR_1d402413}, + {"VUID-vkCmdSetEvent-commandBuffer-cmdpool", VALIDATION_ERROR_1d402415}, + {"VUID-vkCmdSetEvent-event-parameter", VALIDATION_ERROR_1d407e01}, + {"VUID-vkCmdSetEvent-stageMask-parameter", VALIDATION_ERROR_1d42de01}, + {"VUID-vkCmdSetEvent-stageMask-requiredbitmask", VALIDATION_ERROR_1d42de03}, + {"VUID-vkCmdSetLineWidth-None-00787", VALIDATION_ERROR_1d600626}, + {"VUID-vkCmdSetLineWidth-lineWidth-00788", VALIDATION_ERROR_1d600628}, + {"VUID-vkCmdSetLineWidth-commandBuffer-parameter", VALIDATION_ERROR_1d602401}, + {"VUID-vkCmdSetLineWidth-commandBuffer-recording", VALIDATION_ERROR_1d602413}, + {"VUID-vkCmdSetLineWidth-commandBuffer-cmdpool", VALIDATION_ERROR_1d602415}, + {"VUID-vkCmdSetScissor-None-00590", VALIDATION_ERROR_1d80049c}, + {"VUID-vkCmdSetScissor-firstScissor-00591", VALIDATION_ERROR_1d80049e}, + {"VUID-vkCmdSetScissor-firstScissor-00592", VALIDATION_ERROR_1d8004a0}, + {"VUID-vkCmdSetScissor-firstScissor-00593", VALIDATION_ERROR_1d8004a2}, + {"VUID-vkCmdSetScissor-scissorCount-00594", VALIDATION_ERROR_1d8004a4}, + {"VUID-vkCmdSetScissor-x-00595", VALIDATION_ERROR_1d8004a6}, + {"VUID-vkCmdSetScissor-offset-00596", VALIDATION_ERROR_1d8004a8}, + {"VUID-vkCmdSetScissor-offset-00597", VALIDATION_ERROR_1d8004aa}, + {"VUID-vkCmdSetScissor-commandBuffer-parameter", VALIDATION_ERROR_1d802401}, + {"VUID-vkCmdSetScissor-commandBuffer-recording", VALIDATION_ERROR_1d802413}, + {"VUID-vkCmdSetScissor-commandBuffer-cmdpool", VALIDATION_ERROR_1d802415}, + {"VUID-vkCmdSetScissor-pScissors-parameter", VALIDATION_ERROR_1d822601}, + {"VUID-vkCmdSetScissor-scissorCount-arraylength", VALIDATION_ERROR_1d82b61b}, + {"VUID-vkCmdSetStencilCompareMask-None-00602", VALIDATION_ERROR_1da004b4}, + {"VUID-vkCmdSetStencilCompareMask-commandBuffer-parameter", VALIDATION_ERROR_1da02401}, + {"VUID-vkCmdSetStencilCompareMask-commandBuffer-recording", VALIDATION_ERROR_1da02413}, + {"VUID-vkCmdSetStencilCompareMask-commandBuffer-cmdpool", VALIDATION_ERROR_1da02415}, + {"VUID-vkCmdSetStencilCompareMask-faceMask-parameter", VALIDATION_ERROR_1da08401}, + {"VUID-vkCmdSetStencilCompareMask-faceMask-requiredbitmask", VALIDATION_ERROR_1da08403}, + {"VUID-vkCmdSetStencilReference-None-00604", VALIDATION_ERROR_1dc004b8}, + {"VUID-vkCmdSetStencilReference-commandBuffer-parameter", VALIDATION_ERROR_1dc02401}, + {"VUID-vkCmdSetStencilReference-commandBuffer-recording", VALIDATION_ERROR_1dc02413}, + {"VUID-vkCmdSetStencilReference-commandBuffer-cmdpool", VALIDATION_ERROR_1dc02415}, + {"VUID-vkCmdSetStencilReference-faceMask-parameter", VALIDATION_ERROR_1dc08401}, + {"VUID-vkCmdSetStencilReference-faceMask-requiredbitmask", VALIDATION_ERROR_1dc08403}, + {"VUID-vkCmdSetStencilWriteMask-None-00603", VALIDATION_ERROR_1de004b6}, + {"VUID-vkCmdSetStencilWriteMask-commandBuffer-parameter", VALIDATION_ERROR_1de02401}, + {"VUID-vkCmdSetStencilWriteMask-commandBuffer-recording", VALIDATION_ERROR_1de02413}, + {"VUID-vkCmdSetStencilWriteMask-commandBuffer-cmdpool", VALIDATION_ERROR_1de02415}, + {"VUID-vkCmdSetStencilWriteMask-faceMask-parameter", VALIDATION_ERROR_1de08401}, + {"VUID-vkCmdSetStencilWriteMask-faceMask-requiredbitmask", VALIDATION_ERROR_1de08403}, + {"VUID-vkCmdSetViewport-None-01221", VALIDATION_ERROR_1e00098a}, + {"VUID-vkCmdSetViewport-firstViewport-01222", VALIDATION_ERROR_1e00098c}, + {"VUID-vkCmdSetViewport-firstViewport-01223", VALIDATION_ERROR_1e00098e}, + {"VUID-vkCmdSetViewport-firstViewport-01224", VALIDATION_ERROR_1e000990}, + {"VUID-vkCmdSetViewport-viewportCount-01225", VALIDATION_ERROR_1e000992}, + {"VUID-vkCmdSetViewport-commandBuffer-parameter", VALIDATION_ERROR_1e002401}, + {"VUID-vkCmdSetViewport-commandBuffer-recording", VALIDATION_ERROR_1e002413}, + {"VUID-vkCmdSetViewport-commandBuffer-cmdpool", VALIDATION_ERROR_1e002415}, + {"VUID-vkCmdSetViewport-viewportCount-arraylength", VALIDATION_ERROR_1e030a1b}, + {"VUID-vkCmdSetViewport-pViewports-parameter", VALIDATION_ERROR_1e03fa01}, + {"VUID-vkCmdSetViewportWScalingNV-None-01322", VALIDATION_ERROR_1e200a54}, + {"VUID-vkCmdSetViewportWScalingNV-firstViewport-01323", VALIDATION_ERROR_1e200a56}, + {"VUID-vkCmdSetViewportWScalingNV-firstViewport-01324", VALIDATION_ERROR_1e200a58}, + {"VUID-vkCmdSetViewportWScalingNV-commandBuffer-parameter", VALIDATION_ERROR_1e202401}, + {"VUID-vkCmdSetViewportWScalingNV-commandBuffer-recording", VALIDATION_ERROR_1e202413}, + {"VUID-vkCmdSetViewportWScalingNV-commandBuffer-cmdpool", VALIDATION_ERROR_1e202415}, + {"VUID-vkCmdSetViewportWScalingNV-viewportCount-arraylength", VALIDATION_ERROR_1e230a1b}, + {"VUID-vkCmdSetViewportWScalingNV-pViewportWScalings-parameter", VALIDATION_ERROR_1e23fc01}, + {"VUID-vkCmdUpdateBuffer-commonparent", VALIDATION_ERROR_1e400009}, + {"VUID-vkCmdUpdateBuffer-renderpass", VALIDATION_ERROR_1e400017}, + {"VUID-vkCmdUpdateBuffer-dstOffset-00032", VALIDATION_ERROR_1e400040}, + {"VUID-vkCmdUpdateBuffer-dataSize-00033", VALIDATION_ERROR_1e400042}, + {"VUID-vkCmdUpdateBuffer-dstBuffer-00034", VALIDATION_ERROR_1e400044}, + {"VUID-vkCmdUpdateBuffer-dstBuffer-00035", VALIDATION_ERROR_1e400046}, + {"VUID-vkCmdUpdateBuffer-dstOffset-00036", VALIDATION_ERROR_1e400048}, + {"VUID-vkCmdUpdateBuffer-dataSize-00037", VALIDATION_ERROR_1e40004a}, + {"VUID-vkCmdUpdateBuffer-dataSize-00038", VALIDATION_ERROR_1e40004c}, + {"VUID-vkCmdUpdateBuffer-commandBuffer-01813", VALIDATION_ERROR_1e400e2a}, + {"VUID-vkCmdUpdateBuffer-commandBuffer-01814", VALIDATION_ERROR_1e400e2c}, + {"VUID-vkCmdUpdateBuffer-commandBuffer-parameter", VALIDATION_ERROR_1e402401}, + {"VUID-vkCmdUpdateBuffer-commandBuffer-recording", VALIDATION_ERROR_1e402413}, + {"VUID-vkCmdUpdateBuffer-commandBuffer-cmdpool", VALIDATION_ERROR_1e402415}, + {"VUID-vkCmdUpdateBuffer-dataSize-arraylength", VALIDATION_ERROR_1e403c1b}, + {"VUID-vkCmdUpdateBuffer-dstBuffer-parameter", VALIDATION_ERROR_1e406c01}, + {"VUID-vkCmdUpdateBuffer-pData-parameter", VALIDATION_ERROR_1e412201}, + {"VUID-vkCmdWaitEvents-commonparent", VALIDATION_ERROR_1e600009}, + {"VUID-vkCmdWaitEvents-srcStageMask-01158", VALIDATION_ERROR_1e60090c}, + {"VUID-vkCmdWaitEvents-srcStageMask-01159", VALIDATION_ERROR_1e60090e}, + {"VUID-vkCmdWaitEvents-dstStageMask-01160", VALIDATION_ERROR_1e600910}, + {"VUID-vkCmdWaitEvents-srcStageMask-01161", VALIDATION_ERROR_1e600912}, + {"VUID-vkCmdWaitEvents-dstStageMask-01162", VALIDATION_ERROR_1e600914}, + {"VUID-vkCmdWaitEvents-pEvents-01163", VALIDATION_ERROR_1e600916}, + {"VUID-vkCmdWaitEvents-srcStageMask-01164", VALIDATION_ERROR_1e600918}, + {"VUID-vkCmdWaitEvents-pMemoryBarriers-01165", VALIDATION_ERROR_1e60091a}, + {"VUID-vkCmdWaitEvents-pMemoryBarriers-01166", VALIDATION_ERROR_1e60091c}, + {"VUID-vkCmdWaitEvents-commandBuffer-01167", VALIDATION_ERROR_1e60091e}, + {"VUID-vkCmdWaitEvents-commandBuffer-parameter", VALIDATION_ERROR_1e602401}, + {"VUID-vkCmdWaitEvents-commandBuffer-recording", VALIDATION_ERROR_1e602413}, + {"VUID-vkCmdWaitEvents-commandBuffer-cmdpool", VALIDATION_ERROR_1e602415}, + {"VUID-vkCmdWaitEvents-dstStageMask-parameter", VALIDATION_ERROR_1e607801}, + {"VUID-vkCmdWaitEvents-dstStageMask-requiredbitmask", VALIDATION_ERROR_1e607803}, + {"VUID-vkCmdWaitEvents-eventCount-arraylength", VALIDATION_ERROR_1e60801b}, + {"VUID-vkCmdWaitEvents-pBufferMemoryBarriers-parameter", VALIDATION_ERROR_1e610401}, + {"VUID-vkCmdWaitEvents-pEvents-parameter", VALIDATION_ERROR_1e616001}, + {"VUID-vkCmdWaitEvents-pImageMemoryBarriers-parameter", VALIDATION_ERROR_1e618a01}, + {"VUID-vkCmdWaitEvents-pMemoryBarriers-parameter", VALIDATION_ERROR_1e61ac01}, + {"VUID-vkCmdWaitEvents-srcStageMask-parameter", VALIDATION_ERROR_1e62d401}, + {"VUID-vkCmdWaitEvents-srcStageMask-requiredbitmask", VALIDATION_ERROR_1e62d403}, + {"VUID-vkCmdWriteTimestamp-commonparent", VALIDATION_ERROR_1e800009}, + {"VUID-vkCmdWriteTimestamp-queryPool-00828", VALIDATION_ERROR_1e800678}, + {"VUID-vkCmdWriteTimestamp-timestampValidBits-00829", VALIDATION_ERROR_1e80067a}, + {"VUID-vkCmdWriteTimestamp-None-00830", VALIDATION_ERROR_1e80067c}, + {"VUID-vkCmdWriteTimestamp-query-00831", VALIDATION_ERROR_1e80067e}, + {"VUID-vkCmdWriteTimestamp-queryPool-01416", VALIDATION_ERROR_1e800b10}, + {"VUID-vkCmdWriteTimestamp-commandBuffer-parameter", VALIDATION_ERROR_1e802401}, + {"VUID-vkCmdWriteTimestamp-commandBuffer-recording", VALIDATION_ERROR_1e802413}, + {"VUID-vkCmdWriteTimestamp-commandBuffer-cmdpool", VALIDATION_ERROR_1e802415}, + {"VUID-vkCmdWriteTimestamp-pipelineStage-parameter", VALIDATION_ERROR_1e828401}, + {"VUID-vkCmdWriteTimestamp-queryPool-parameter", VALIDATION_ERROR_1e829801}, + {"VUID-vkCreateAndroidSurfaceKHR-instance-parameter", VALIDATION_ERROR_1ea0bc01}, + {"VUID-vkCreateAndroidSurfaceKHR-pAllocator-parameter", VALIDATION_ERROR_1ea0ec01}, + {"VUID-vkCreateAndroidSurfaceKHR-pCreateInfo-parameter", VALIDATION_ERROR_1ea11e01}, + {"VUID-vkCreateAndroidSurfaceKHR-pSurface-parameter", VALIDATION_ERROR_1ea24801}, + {"VUID-vkCreateBuffer-flags-00911", VALIDATION_ERROR_1ec0071e}, + {"VUID-vkCreateBuffer-device-parameter", VALIDATION_ERROR_1ec05601}, + {"VUID-vkCreateBuffer-pAllocator-parameter", VALIDATION_ERROR_1ec0ec01}, + {"VUID-vkCreateBuffer-pBuffer-parameter", VALIDATION_ERROR_1ec10001}, + {"VUID-vkCreateBuffer-pCreateInfo-parameter", VALIDATION_ERROR_1ec11e01}, + {"VUID-vkCreateBufferView-device-parameter", VALIDATION_ERROR_1ee05601}, + {"VUID-vkCreateBufferView-pAllocator-parameter", VALIDATION_ERROR_1ee0ec01}, + {"VUID-vkCreateBufferView-pCreateInfo-parameter", VALIDATION_ERROR_1ee11e01}, + {"VUID-vkCreateBufferView-pView-parameter", VALIDATION_ERROR_1ee26a01}, + {"VUID-vkCreateCommandPool-device-parameter", VALIDATION_ERROR_1f005601}, + {"VUID-vkCreateCommandPool-pAllocator-parameter", VALIDATION_ERROR_1f00ec01}, + {"VUID-vkCreateCommandPool-pCommandPool-parameter", VALIDATION_ERROR_1f011601}, + {"VUID-vkCreateCommandPool-pCreateInfo-parameter", VALIDATION_ERROR_1f011e01}, + {"VUID-vkCreateComputePipelines-flags-00695", VALIDATION_ERROR_1f20056e}, + {"VUID-vkCreateComputePipelines-flags-00696", VALIDATION_ERROR_1f200570}, + {"VUID-vkCreateComputePipelines-createInfoCount-arraylength", VALIDATION_ERROR_1f20381b}, + {"VUID-vkCreateComputePipelines-device-parameter", VALIDATION_ERROR_1f205601}, + {"VUID-vkCreateComputePipelines-pAllocator-parameter", VALIDATION_ERROR_1f20ec01}, + {"VUID-vkCreateComputePipelines-pCreateInfos-parameter", VALIDATION_ERROR_1f212001}, + {"VUID-vkCreateComputePipelines-pPipelines-parameter", VALIDATION_ERROR_1f21e201}, + {"VUID-vkCreateComputePipelines-pipelineCache-parameter", VALIDATION_ERROR_1f228001}, + {"VUID-vkCreateComputePipelines-pipelineCache-parent", VALIDATION_ERROR_1f228007}, + {"VUID-vkCreateDebugReportCallbackEXT-instance-parameter", VALIDATION_ERROR_1f40bc01}, + {"VUID-vkCreateDebugReportCallbackEXT-pAllocator-parameter", VALIDATION_ERROR_1f40ec01}, + {"VUID-vkCreateDebugReportCallbackEXT-pCallback-parameter", VALIDATION_ERROR_1f410801}, + {"VUID-vkCreateDebugReportCallbackEXT-pCreateInfo-parameter", VALIDATION_ERROR_1f411e01}, + {"VUID-vkCreateDescriptorPool-device-parameter", VALIDATION_ERROR_1f605601}, + {"VUID-vkCreateDescriptorPool-pAllocator-parameter", VALIDATION_ERROR_1f60ec01}, + {"VUID-vkCreateDescriptorPool-pCreateInfo-parameter", VALIDATION_ERROR_1f611e01}, + {"VUID-vkCreateDescriptorPool-pDescriptorPool-parameter", VALIDATION_ERROR_1f612e01}, + {"VUID-vkCreateDescriptorSetLayout-device-parameter", VALIDATION_ERROR_1f805601}, + {"VUID-vkCreateDescriptorSetLayout-pAllocator-parameter", VALIDATION_ERROR_1f80ec01}, + {"VUID-vkCreateDescriptorSetLayout-pCreateInfo-parameter", VALIDATION_ERROR_1f811e01}, + {"VUID-vkCreateDescriptorSetLayout-pSetLayout-parameter", VALIDATION_ERROR_1f822a01}, + {"VUID-vkCreateDescriptorUpdateTemplate-device-parameter", VALIDATION_ERROR_1fa05601}, + {"VUID-vkCreateDescriptorUpdateTemplate-pAllocator-parameter", VALIDATION_ERROR_1fa0ec01}, + {"VUID-vkCreateDescriptorUpdateTemplate-pCreateInfo-parameter", VALIDATION_ERROR_1fa11e01}, + {"VUID-vkCreateDescriptorUpdateTemplate-pDescriptorUpdateTemplate-parameter", VALIDATION_ERROR_1fa13401}, + {"VUID-vkCreateDevice-ppEnabledExtensionNames-01387", VALIDATION_ERROR_1fc00ad6}, + {"VUID-vkCreateDevice-pAllocator-parameter", VALIDATION_ERROR_1fc0ec01}, + {"VUID-vkCreateDevice-pCreateInfo-parameter", VALIDATION_ERROR_1fc11e01}, + {"VUID-vkCreateDevice-pDevice-parameter", VALIDATION_ERROR_1fc13801}, + {"VUID-vkCreateDevice-physicalDevice-parameter", VALIDATION_ERROR_1fc27a01}, + {"VUID-vkCreateDisplayModeKHR-display-parameter", VALIDATION_ERROR_1fe06001}, + {"VUID-vkCreateDisplayModeKHR-pAllocator-parameter", VALIDATION_ERROR_1fe0ec01}, + {"VUID-vkCreateDisplayModeKHR-pCreateInfo-parameter", VALIDATION_ERROR_1fe11e01}, + {"VUID-vkCreateDisplayModeKHR-pMode-parameter", VALIDATION_ERROR_1fe1bc01}, + {"VUID-vkCreateDisplayModeKHR-physicalDevice-parameter", VALIDATION_ERROR_1fe27a01}, + {"VUID-vkCreateDisplayPlaneSurfaceKHR-instance-parameter", VALIDATION_ERROR_2000bc01}, + {"VUID-vkCreateDisplayPlaneSurfaceKHR-pAllocator-parameter", VALIDATION_ERROR_2000ec01}, + {"VUID-vkCreateDisplayPlaneSurfaceKHR-pCreateInfo-parameter", VALIDATION_ERROR_20011e01}, + {"VUID-vkCreateDisplayPlaneSurfaceKHR-pSurface-parameter", VALIDATION_ERROR_20024801}, + {"VUID-vkCreateEvent-device-parameter", VALIDATION_ERROR_20205601}, + {"VUID-vkCreateEvent-pAllocator-parameter", VALIDATION_ERROR_2020ec01}, + {"VUID-vkCreateEvent-pCreateInfo-parameter", VALIDATION_ERROR_20211e01}, + {"VUID-vkCreateEvent-pEvent-parameter", VALIDATION_ERROR_20215e01}, + {"VUID-vkCreateFence-device-parameter", VALIDATION_ERROR_20405601}, + {"VUID-vkCreateFence-pAllocator-parameter", VALIDATION_ERROR_2040ec01}, + {"VUID-vkCreateFence-pCreateInfo-parameter", VALIDATION_ERROR_20411e01}, + {"VUID-vkCreateFence-pFence-parameter", VALIDATION_ERROR_20417001}, + {"VUID-vkCreateFramebuffer-device-parameter", VALIDATION_ERROR_20605601}, + {"VUID-vkCreateFramebuffer-pAllocator-parameter", VALIDATION_ERROR_2060ec01}, + {"VUID-vkCreateFramebuffer-pCreateInfo-parameter", VALIDATION_ERROR_20611e01}, + {"VUID-vkCreateFramebuffer-pFramebuffer-parameter", VALIDATION_ERROR_20617801}, + {"VUID-vkCreateGraphicsPipelines-flags-00720", VALIDATION_ERROR_208005a0}, + {"VUID-vkCreateGraphicsPipelines-flags-00721", VALIDATION_ERROR_208005a2}, + {"VUID-vkCreateGraphicsPipelines-createInfoCount-arraylength", VALIDATION_ERROR_2080381b}, + {"VUID-vkCreateGraphicsPipelines-device-parameter", VALIDATION_ERROR_20805601}, + {"VUID-vkCreateGraphicsPipelines-pAllocator-parameter", VALIDATION_ERROR_2080ec01}, + {"VUID-vkCreateGraphicsPipelines-pCreateInfos-parameter", VALIDATION_ERROR_20812001}, + {"VUID-vkCreateGraphicsPipelines-pPipelines-parameter", VALIDATION_ERROR_2081e201}, + {"VUID-vkCreateGraphicsPipelines-pipelineCache-parameter", VALIDATION_ERROR_20828001}, + {"VUID-vkCreateGraphicsPipelines-pipelineCache-parent", VALIDATION_ERROR_20828007}, + {"VUID-vkCreateIOSSurfaceMVK-instance-parameter", VALIDATION_ERROR_20a0bc01}, + {"VUID-vkCreateIOSSurfaceMVK-pAllocator-parameter", VALIDATION_ERROR_20a0ec01}, + {"VUID-vkCreateIOSSurfaceMVK-pCreateInfo-parameter", VALIDATION_ERROR_20a11e01}, + {"VUID-vkCreateIOSSurfaceMVK-pSurface-parameter", VALIDATION_ERROR_20a24801}, + {"VUID-vkCreateImage-flags-00939", VALIDATION_ERROR_20c00756}, + {"VUID-vkCreateImage-device-parameter", VALIDATION_ERROR_20c05601}, + {"VUID-vkCreateImage-pAllocator-parameter", VALIDATION_ERROR_20c0ec01}, + {"VUID-vkCreateImage-pCreateInfo-parameter", VALIDATION_ERROR_20c11e01}, + {"VUID-vkCreateImage-pImage-parameter", VALIDATION_ERROR_20c17e01}, + {"VUID-vkCreateImageView-device-parameter", VALIDATION_ERROR_20e05601}, + {"VUID-vkCreateImageView-pAllocator-parameter", VALIDATION_ERROR_20e0ec01}, + {"VUID-vkCreateImageView-pCreateInfo-parameter", VALIDATION_ERROR_20e11e01}, + {"VUID-vkCreateImageView-pView-parameter", VALIDATION_ERROR_20e26a01}, + {"VUID-vkCreateIndirectCommandsLayoutNVX-device-parameter", VALIDATION_ERROR_21005601}, + {"VUID-vkCreateIndirectCommandsLayoutNVX-pAllocator-parameter", VALIDATION_ERROR_2100ec01}, + {"VUID-vkCreateIndirectCommandsLayoutNVX-pCreateInfo-parameter", VALIDATION_ERROR_21011e01}, + {"VUID-vkCreateIndirectCommandsLayoutNVX-pIndirectCommandsLayout-parameter", VALIDATION_ERROR_21019201}, + {"VUID-vkCreateInstance-ppEnabledExtensionNames-01388", VALIDATION_ERROR_21200ad8}, + {"VUID-vkCreateInstance-pAllocator-parameter", VALIDATION_ERROR_2120ec01}, + {"VUID-vkCreateInstance-pCreateInfo-parameter", VALIDATION_ERROR_21211e01}, + {"VUID-vkCreateInstance-pInstance-parameter", VALIDATION_ERROR_21219c01}, + {"VUID-vkCreateMacOSSurfaceMVK-instance-parameter", VALIDATION_ERROR_2140bc01}, + {"VUID-vkCreateMacOSSurfaceMVK-pAllocator-parameter", VALIDATION_ERROR_2140ec01}, + {"VUID-vkCreateMacOSSurfaceMVK-pCreateInfo-parameter", VALIDATION_ERROR_21411e01}, + {"VUID-vkCreateMacOSSurfaceMVK-pSurface-parameter", VALIDATION_ERROR_21424801}, + {"VUID-vkCreateMirSurfaceKHR-instance-parameter", VALIDATION_ERROR_2160bc01}, + {"VUID-vkCreateMirSurfaceKHR-pAllocator-parameter", VALIDATION_ERROR_2160ec01}, + {"VUID-vkCreateMirSurfaceKHR-pCreateInfo-parameter", VALIDATION_ERROR_21611e01}, + {"VUID-vkCreateMirSurfaceKHR-pSurface-parameter", VALIDATION_ERROR_21624801}, + {"VUID-vkCreateObjectTableNVX-device-parameter", VALIDATION_ERROR_21805601}, + {"VUID-vkCreateObjectTableNVX-pAllocator-parameter", VALIDATION_ERROR_2180ec01}, + {"VUID-vkCreateObjectTableNVX-pCreateInfo-parameter", VALIDATION_ERROR_21811e01}, + {"VUID-vkCreateObjectTableNVX-pObjectTable-parameter", VALIDATION_ERROR_2181d001}, + {"VUID-vkCreatePipelineCache-device-parameter", VALIDATION_ERROR_21a05601}, + {"VUID-vkCreatePipelineCache-pAllocator-parameter", VALIDATION_ERROR_21a0ec01}, + {"VUID-vkCreatePipelineCache-pCreateInfo-parameter", VALIDATION_ERROR_21a11e01}, + {"VUID-vkCreatePipelineCache-pPipelineCache-parameter", VALIDATION_ERROR_21a1de01}, + {"VUID-vkCreatePipelineLayout-device-parameter", VALIDATION_ERROR_21c05601}, + {"VUID-vkCreatePipelineLayout-pAllocator-parameter", VALIDATION_ERROR_21c0ec01}, + {"VUID-vkCreatePipelineLayout-pCreateInfo-parameter", VALIDATION_ERROR_21c11e01}, + {"VUID-vkCreatePipelineLayout-pPipelineLayout-parameter", VALIDATION_ERROR_21c1e001}, + {"VUID-vkCreateQueryPool-device-parameter", VALIDATION_ERROR_21e05601}, + {"VUID-vkCreateQueryPool-pAllocator-parameter", VALIDATION_ERROR_21e0ec01}, + {"VUID-vkCreateQueryPool-pCreateInfo-parameter", VALIDATION_ERROR_21e11e01}, + {"VUID-vkCreateQueryPool-pQueryPool-parameter", VALIDATION_ERROR_21e1fa01}, + {"VUID-vkCreateRenderPass-device-parameter", VALIDATION_ERROR_22005601}, + {"VUID-vkCreateRenderPass-pAllocator-parameter", VALIDATION_ERROR_2200ec01}, + {"VUID-vkCreateRenderPass-pCreateInfo-parameter", VALIDATION_ERROR_22011e01}, + {"VUID-vkCreateRenderPass-pRenderPass-parameter", VALIDATION_ERROR_22021601}, + {"VUID-vkCreateSampler-device-parameter", VALIDATION_ERROR_22205601}, + {"VUID-vkCreateSampler-pAllocator-parameter", VALIDATION_ERROR_2220ec01}, + {"VUID-vkCreateSampler-pCreateInfo-parameter", VALIDATION_ERROR_22211e01}, + {"VUID-vkCreateSampler-pSampler-parameter", VALIDATION_ERROR_22222401}, + {"VUID-vkCreateSemaphore-device-parameter", VALIDATION_ERROR_22405601}, + {"VUID-vkCreateSemaphore-pAllocator-parameter", VALIDATION_ERROR_2240ec01}, + {"VUID-vkCreateSemaphore-pCreateInfo-parameter", VALIDATION_ERROR_22411e01}, + {"VUID-vkCreateSemaphore-pSemaphore-parameter", VALIDATION_ERROR_22422801}, + {"VUID-vkCreateShaderModule-device-parameter", VALIDATION_ERROR_22605601}, + {"VUID-vkCreateShaderModule-pAllocator-parameter", VALIDATION_ERROR_2260ec01}, + {"VUID-vkCreateShaderModule-pCreateInfo-parameter", VALIDATION_ERROR_22611e01}, + {"VUID-vkCreateShaderModule-pShaderModule-parameter", VALIDATION_ERROR_22622e01}, + {"VUID-vkCreateSharedSwapchainsKHR-device-parameter", VALIDATION_ERROR_22805601}, + {"VUID-vkCreateSharedSwapchainsKHR-pAllocator-parameter", VALIDATION_ERROR_2280ec01}, + {"VUID-vkCreateSharedSwapchainsKHR-pCreateInfos-parameter", VALIDATION_ERROR_22812001}, + {"VUID-vkCreateSharedSwapchainsKHR-pSwapchains-parameter", VALIDATION_ERROR_22825801}, + {"VUID-vkCreateSharedSwapchainsKHR-swapchainCount-arraylength", VALIDATION_ERROR_2282f21b}, + {"VUID-vkCreateSwapchainKHR-device-parameter", VALIDATION_ERROR_22a05601}, + {"VUID-vkCreateSwapchainKHR-pAllocator-parameter", VALIDATION_ERROR_22a0ec01}, + {"VUID-vkCreateSwapchainKHR-pCreateInfo-parameter", VALIDATION_ERROR_22a11e01}, + {"VUID-vkCreateSwapchainKHR-pSwapchain-parameter", VALIDATION_ERROR_22a25201}, + {"VUID-vkCreateViSurfaceNN-instance-parameter", VALIDATION_ERROR_22c0bc01}, + {"VUID-vkCreateViSurfaceNN-pAllocator-parameter", VALIDATION_ERROR_22c0ec01}, + {"VUID-vkCreateViSurfaceNN-pCreateInfo-parameter", VALIDATION_ERROR_22c11e01}, + {"VUID-vkCreateViSurfaceNN-pSurface-parameter", VALIDATION_ERROR_22c24801}, + {"VUID-vkCreateWaylandSurfaceKHR-instance-parameter", VALIDATION_ERROR_22e0bc01}, + {"VUID-vkCreateWaylandSurfaceKHR-pAllocator-parameter", VALIDATION_ERROR_22e0ec01}, + {"VUID-vkCreateWaylandSurfaceKHR-pCreateInfo-parameter", VALIDATION_ERROR_22e11e01}, + {"VUID-vkCreateWaylandSurfaceKHR-pSurface-parameter", VALIDATION_ERROR_22e24801}, + {"VUID-vkCreateWin32SurfaceKHR-instance-parameter", VALIDATION_ERROR_2300bc01}, + {"VUID-vkCreateWin32SurfaceKHR-pAllocator-parameter", VALIDATION_ERROR_2300ec01}, + {"VUID-vkCreateWin32SurfaceKHR-pCreateInfo-parameter", VALIDATION_ERROR_23011e01}, + {"VUID-vkCreateWin32SurfaceKHR-pSurface-parameter", VALIDATION_ERROR_23024801}, + {"VUID-vkCreateXcbSurfaceKHR-instance-parameter", VALIDATION_ERROR_2320bc01}, + {"VUID-vkCreateXcbSurfaceKHR-pAllocator-parameter", VALIDATION_ERROR_2320ec01}, + {"VUID-vkCreateXcbSurfaceKHR-pCreateInfo-parameter", VALIDATION_ERROR_23211e01}, + {"VUID-vkCreateXcbSurfaceKHR-pSurface-parameter", VALIDATION_ERROR_23224801}, + {"VUID-vkCreateXlibSurfaceKHR-instance-parameter", VALIDATION_ERROR_2340bc01}, + {"VUID-vkCreateXlibSurfaceKHR-pAllocator-parameter", VALIDATION_ERROR_2340ec01}, + {"VUID-vkCreateXlibSurfaceKHR-pCreateInfo-parameter", VALIDATION_ERROR_23411e01}, + {"VUID-vkCreateXlibSurfaceKHR-pSurface-parameter", VALIDATION_ERROR_23424801}, + {"VUID-vkDebugMarkerSetObjectNameEXT-device-parameter", VALIDATION_ERROR_23605601}, + {"VUID-vkDebugMarkerSetObjectNameEXT-pNameInfo-parameter", VALIDATION_ERROR_2361c201}, + {"VUID-vkDebugMarkerSetObjectTagEXT-device-parameter", VALIDATION_ERROR_23805601}, + {"VUID-vkDebugMarkerSetObjectTagEXT-pTagInfo-parameter", VALIDATION_ERROR_23825c01}, + {"VUID-vkDebugReportMessageEXT-object-01241", VALIDATION_ERROR_23a009b2}, + {"VUID-vkDebugReportMessageEXT-objectType-01498", VALIDATION_ERROR_23a00bb4}, + {"VUID-vkDebugReportMessageEXT-flags-parameter", VALIDATION_ERROR_23a09001}, + {"VUID-vkDebugReportMessageEXT-flags-requiredbitmask", VALIDATION_ERROR_23a09003}, + {"VUID-vkDebugReportMessageEXT-instance-parameter", VALIDATION_ERROR_23a0bc01}, + {"VUID-vkDebugReportMessageEXT-objectType-parameter", VALIDATION_ERROR_23a0da01}, + {"VUID-vkDebugReportMessageEXT-pLayerPrefix-parameter", VALIDATION_ERROR_23a1a001}, + {"VUID-vkDebugReportMessageEXT-pMessage-parameter", VALIDATION_ERROR_23a1b801}, + {"VUID-vkDestroyBuffer-buffer-00922", VALIDATION_ERROR_23c00734}, + {"VUID-vkDestroyBuffer-buffer-00923", VALIDATION_ERROR_23c00736}, + {"VUID-vkDestroyBuffer-buffer-00924", VALIDATION_ERROR_23c00738}, + {"VUID-vkDestroyBuffer-buffer-parameter", VALIDATION_ERROR_23c01a01}, + {"VUID-vkDestroyBuffer-buffer-parent", VALIDATION_ERROR_23c01a07}, + {"VUID-vkDestroyBuffer-device-parameter", VALIDATION_ERROR_23c05601}, + {"VUID-vkDestroyBuffer-pAllocator-parameter", VALIDATION_ERROR_23c0ec01}, + {"VUID-vkDestroyBufferView-bufferView-00936", VALIDATION_ERROR_23e00750}, + {"VUID-vkDestroyBufferView-bufferView-00937", VALIDATION_ERROR_23e00752}, + {"VUID-vkDestroyBufferView-bufferView-00938", VALIDATION_ERROR_23e00754}, + {"VUID-vkDestroyBufferView-bufferView-parameter", VALIDATION_ERROR_23e01c01}, + {"VUID-vkDestroyBufferView-bufferView-parent", VALIDATION_ERROR_23e01c07}, + {"VUID-vkDestroyBufferView-device-parameter", VALIDATION_ERROR_23e05601}, + {"VUID-vkDestroyBufferView-pAllocator-parameter", VALIDATION_ERROR_23e0ec01}, + {"VUID-vkDestroyCommandPool-commandPool-00041", VALIDATION_ERROR_24000052}, + {"VUID-vkDestroyCommandPool-commandPool-00042", VALIDATION_ERROR_24000054}, + {"VUID-vkDestroyCommandPool-commandPool-00043", VALIDATION_ERROR_24000056}, + {"VUID-vkDestroyCommandPool-commandPool-parameter", VALIDATION_ERROR_24002801}, + {"VUID-vkDestroyCommandPool-commandPool-parent", VALIDATION_ERROR_24002807}, + {"VUID-vkDestroyCommandPool-device-parameter", VALIDATION_ERROR_24005601}, + {"VUID-vkDestroyCommandPool-pAllocator-parameter", VALIDATION_ERROR_2400ec01}, + {"VUID-vkDestroyDebugReportCallbackEXT-instance-01242", VALIDATION_ERROR_242009b4}, + {"VUID-vkDestroyDebugReportCallbackEXT-instance-01243", VALIDATION_ERROR_242009b6}, + {"VUID-vkDestroyDebugReportCallbackEXT-callback-parameter", VALIDATION_ERROR_24201e01}, + {"VUID-vkDestroyDebugReportCallbackEXT-callback-parent", VALIDATION_ERROR_24201e07}, + {"VUID-vkDestroyDebugReportCallbackEXT-instance-parameter", VALIDATION_ERROR_2420bc01}, + {"VUID-vkDestroyDebugReportCallbackEXT-pAllocator-parameter", VALIDATION_ERROR_2420ec01}, + {"VUID-vkDestroyDescriptorPool-descriptorPool-00303", VALIDATION_ERROR_2440025e}, + {"VUID-vkDestroyDescriptorPool-descriptorPool-00304", VALIDATION_ERROR_24400260}, + {"VUID-vkDestroyDescriptorPool-descriptorPool-00305", VALIDATION_ERROR_24400262}, + {"VUID-vkDestroyDescriptorPool-descriptorPool-parameter", VALIDATION_ERROR_24404601}, + {"VUID-vkDestroyDescriptorPool-descriptorPool-parent", VALIDATION_ERROR_24404607}, + {"VUID-vkDestroyDescriptorPool-device-parameter", VALIDATION_ERROR_24405601}, + {"VUID-vkDestroyDescriptorPool-pAllocator-parameter", VALIDATION_ERROR_2440ec01}, + {"VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00284", VALIDATION_ERROR_24600238}, + {"VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00285", VALIDATION_ERROR_2460023a}, + {"VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-parameter", VALIDATION_ERROR_24604c01}, + {"VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-parent", VALIDATION_ERROR_24604c07}, + {"VUID-vkDestroyDescriptorSetLayout-device-parameter", VALIDATION_ERROR_24605601}, + {"VUID-vkDestroyDescriptorSetLayout-pAllocator-parameter", VALIDATION_ERROR_2460ec01}, + {"VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00356", VALIDATION_ERROR_248002c8}, + {"VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00357", VALIDATION_ERROR_248002ca}, + {"VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parameter", VALIDATION_ERROR_24805201}, + {"VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parent", VALIDATION_ERROR_24805207}, + {"VUID-vkDestroyDescriptorUpdateTemplate-device-parameter", VALIDATION_ERROR_24805601}, + {"VUID-vkDestroyDescriptorUpdateTemplate-pAllocator-parameter", VALIDATION_ERROR_2480ec01}, + {"VUID-vkDestroyDevice-device-00378", VALIDATION_ERROR_24a002f4}, + {"VUID-vkDestroyDevice-device-00379", VALIDATION_ERROR_24a002f6}, + {"VUID-vkDestroyDevice-device-00380", VALIDATION_ERROR_24a002f8}, + {"VUID-vkDestroyDevice-device-parameter", VALIDATION_ERROR_24a05601}, + {"VUID-vkDestroyDevice-pAllocator-parameter", VALIDATION_ERROR_24a0ec01}, + {"VUID-vkDestroyEvent-event-01145", VALIDATION_ERROR_24c008f2}, + {"VUID-vkDestroyEvent-event-01146", VALIDATION_ERROR_24c008f4}, + {"VUID-vkDestroyEvent-event-01147", VALIDATION_ERROR_24c008f6}, + {"VUID-vkDestroyEvent-device-parameter", VALIDATION_ERROR_24c05601}, + {"VUID-vkDestroyEvent-event-parameter", VALIDATION_ERROR_24c07e01}, + {"VUID-vkDestroyEvent-event-parent", VALIDATION_ERROR_24c07e07}, + {"VUID-vkDestroyEvent-pAllocator-parameter", VALIDATION_ERROR_24c0ec01}, + {"VUID-vkDestroyFence-fence-01120", VALIDATION_ERROR_24e008c0}, + {"VUID-vkDestroyFence-fence-01121", VALIDATION_ERROR_24e008c2}, + {"VUID-vkDestroyFence-fence-01122", VALIDATION_ERROR_24e008c4}, + {"VUID-vkDestroyFence-device-parameter", VALIDATION_ERROR_24e05601}, + {"VUID-vkDestroyFence-fence-parameter", VALIDATION_ERROR_24e08801}, + {"VUID-vkDestroyFence-fence-parent", VALIDATION_ERROR_24e08807}, + {"VUID-vkDestroyFence-pAllocator-parameter", VALIDATION_ERROR_24e0ec01}, + {"VUID-vkDestroyFramebuffer-framebuffer-00892", VALIDATION_ERROR_250006f8}, + {"VUID-vkDestroyFramebuffer-framebuffer-00893", VALIDATION_ERROR_250006fa}, + {"VUID-vkDestroyFramebuffer-framebuffer-00894", VALIDATION_ERROR_250006fc}, + {"VUID-vkDestroyFramebuffer-device-parameter", VALIDATION_ERROR_25005601}, + {"VUID-vkDestroyFramebuffer-framebuffer-parameter", VALIDATION_ERROR_25009401}, + {"VUID-vkDestroyFramebuffer-framebuffer-parent", VALIDATION_ERROR_25009407}, + {"VUID-vkDestroyFramebuffer-pAllocator-parameter", VALIDATION_ERROR_2500ec01}, + {"VUID-vkDestroyImage-image-01000", VALIDATION_ERROR_252007d0}, + {"VUID-vkDestroyImage-image-01001", VALIDATION_ERROR_252007d2}, + {"VUID-vkDestroyImage-image-01002", VALIDATION_ERROR_252007d4}, + {"VUID-vkDestroyImage-device-parameter", VALIDATION_ERROR_25205601}, + {"VUID-vkDestroyImage-image-parameter", VALIDATION_ERROR_2520a001}, + {"VUID-vkDestroyImage-image-parent", VALIDATION_ERROR_2520a007}, + {"VUID-vkDestroyImage-pAllocator-parameter", VALIDATION_ERROR_2520ec01}, + {"VUID-vkDestroyImageView-imageView-01026", VALIDATION_ERROR_25400804}, + {"VUID-vkDestroyImageView-imageView-01027", VALIDATION_ERROR_25400806}, + {"VUID-vkDestroyImageView-imageView-01028", VALIDATION_ERROR_25400808}, + {"VUID-vkDestroyImageView-device-parameter", VALIDATION_ERROR_25405601}, + {"VUID-vkDestroyImageView-imageView-parameter", VALIDATION_ERROR_2540b001}, + {"VUID-vkDestroyImageView-imageView-parent", VALIDATION_ERROR_2540b007}, + {"VUID-vkDestroyImageView-pAllocator-parameter", VALIDATION_ERROR_2540ec01}, + {"VUID-vkDestroyIndirectCommandsLayoutNVX-indirectCommandsLayout-01352", VALIDATION_ERROR_25600a90}, + {"VUID-vkDestroyIndirectCommandsLayoutNVX-objectTable-01353", VALIDATION_ERROR_25600a92}, + {"VUID-vkDestroyIndirectCommandsLayoutNVX-objectTable-01354", VALIDATION_ERROR_25600a94}, + {"VUID-vkDestroyIndirectCommandsLayoutNVX-device-parameter", VALIDATION_ERROR_25605601}, + {"VUID-vkDestroyIndirectCommandsLayoutNVX-indirectCommandsLayout-parameter", VALIDATION_ERROR_2560b401}, + {"VUID-vkDestroyIndirectCommandsLayoutNVX-indirectCommandsLayout-parent", VALIDATION_ERROR_2560b407}, + {"VUID-vkDestroyIndirectCommandsLayoutNVX-pAllocator-parameter", VALIDATION_ERROR_2560ec01}, + {"VUID-vkDestroyInstance-instance-00629", VALIDATION_ERROR_258004ea}, + {"VUID-vkDestroyInstance-instance-00630", VALIDATION_ERROR_258004ec}, + {"VUID-vkDestroyInstance-instance-00631", VALIDATION_ERROR_258004ee}, + {"VUID-vkDestroyInstance-instance-parameter", VALIDATION_ERROR_2580bc01}, + {"VUID-vkDestroyInstance-pAllocator-parameter", VALIDATION_ERROR_2580ec01}, + {"VUID-vkDestroyObjectTableNVX-objectTable-01361", VALIDATION_ERROR_25a00aa2}, + {"VUID-vkDestroyObjectTableNVX-objectTable-01362", VALIDATION_ERROR_25a00aa4}, + {"VUID-vkDestroyObjectTableNVX-objectTable-01363", VALIDATION_ERROR_25a00aa6}, + {"VUID-vkDestroyObjectTableNVX-device-parameter", VALIDATION_ERROR_25a05601}, + {"VUID-vkDestroyObjectTableNVX-objectTable-parameter", VALIDATION_ERROR_25a0d801}, + {"VUID-vkDestroyObjectTableNVX-objectTable-parent", VALIDATION_ERROR_25a0d807}, + {"VUID-vkDestroyObjectTableNVX-pAllocator-parameter", VALIDATION_ERROR_25a0ec01}, + {"VUID-vkDestroyPipeline-pipeline-00765", VALIDATION_ERROR_25c005fa}, + {"VUID-vkDestroyPipeline-pipeline-00766", VALIDATION_ERROR_25c005fc}, + {"VUID-vkDestroyPipeline-pipeline-00767", VALIDATION_ERROR_25c005fe}, + {"VUID-vkDestroyPipeline-device-parameter", VALIDATION_ERROR_25c05601}, + {"VUID-vkDestroyPipeline-pAllocator-parameter", VALIDATION_ERROR_25c0ec01}, + {"VUID-vkDestroyPipeline-pipeline-parameter", VALIDATION_ERROR_25c27c01}, + {"VUID-vkDestroyPipeline-pipeline-parent", VALIDATION_ERROR_25c27c07}, + {"VUID-vkDestroyPipelineCache-pipelineCache-00771", VALIDATION_ERROR_25e00606}, + {"VUID-vkDestroyPipelineCache-pipelineCache-00772", VALIDATION_ERROR_25e00608}, + {"VUID-vkDestroyPipelineCache-device-parameter", VALIDATION_ERROR_25e05601}, + {"VUID-vkDestroyPipelineCache-pAllocator-parameter", VALIDATION_ERROR_25e0ec01}, + {"VUID-vkDestroyPipelineCache-pipelineCache-parameter", VALIDATION_ERROR_25e28001}, + {"VUID-vkDestroyPipelineCache-pipelineCache-parent", VALIDATION_ERROR_25e28007}, + {"VUID-vkDestroyPipelineLayout-pipelineLayout-00299", VALIDATION_ERROR_26000256}, + {"VUID-vkDestroyPipelineLayout-pipelineLayout-00300", VALIDATION_ERROR_26000258}, + {"VUID-vkDestroyPipelineLayout-device-parameter", VALIDATION_ERROR_26005601}, + {"VUID-vkDestroyPipelineLayout-pAllocator-parameter", VALIDATION_ERROR_2600ec01}, + {"VUID-vkDestroyPipelineLayout-pipelineLayout-parameter", VALIDATION_ERROR_26028201}, + {"VUID-vkDestroyPipelineLayout-pipelineLayout-parent", VALIDATION_ERROR_26028207}, + {"VUID-vkDestroyQueryPool-queryPool-00793", VALIDATION_ERROR_26200632}, + {"VUID-vkDestroyQueryPool-queryPool-00794", VALIDATION_ERROR_26200634}, + {"VUID-vkDestroyQueryPool-queryPool-00795", VALIDATION_ERROR_26200636}, + {"VUID-vkDestroyQueryPool-device-parameter", VALIDATION_ERROR_26205601}, + {"VUID-vkDestroyQueryPool-pAllocator-parameter", VALIDATION_ERROR_2620ec01}, + {"VUID-vkDestroyQueryPool-queryPool-parameter", VALIDATION_ERROR_26229801}, + {"VUID-vkDestroyQueryPool-queryPool-parent", VALIDATION_ERROR_26229807}, + {"VUID-vkDestroyRenderPass-renderPass-00873", VALIDATION_ERROR_264006d2}, + {"VUID-vkDestroyRenderPass-renderPass-00874", VALIDATION_ERROR_264006d4}, + {"VUID-vkDestroyRenderPass-renderPass-00875", VALIDATION_ERROR_264006d6}, + {"VUID-vkDestroyRenderPass-device-parameter", VALIDATION_ERROR_26405601}, + {"VUID-vkDestroyRenderPass-pAllocator-parameter", VALIDATION_ERROR_2640ec01}, + {"VUID-vkDestroyRenderPass-renderPass-parameter", VALIDATION_ERROR_2642ae01}, + {"VUID-vkDestroyRenderPass-renderPass-parent", VALIDATION_ERROR_2642ae07}, + {"VUID-vkDestroySampler-sampler-01082", VALIDATION_ERROR_26600874}, + {"VUID-vkDestroySampler-sampler-01083", VALIDATION_ERROR_26600876}, + {"VUID-vkDestroySampler-sampler-01084", VALIDATION_ERROR_26600878}, + {"VUID-vkDestroySampler-device-parameter", VALIDATION_ERROR_26605601}, + {"VUID-vkDestroySampler-pAllocator-parameter", VALIDATION_ERROR_2660ec01}, + {"VUID-vkDestroySampler-sampler-parameter", VALIDATION_ERROR_2662b201}, + {"VUID-vkDestroySampler-sampler-parent", VALIDATION_ERROR_2662b207}, + {"VUID-vkDestroySemaphore-semaphore-01137", VALIDATION_ERROR_268008e2}, + {"VUID-vkDestroySemaphore-semaphore-01138", VALIDATION_ERROR_268008e4}, + {"VUID-vkDestroySemaphore-semaphore-01139", VALIDATION_ERROR_268008e6}, + {"VUID-vkDestroySemaphore-device-parameter", VALIDATION_ERROR_26805601}, + {"VUID-vkDestroySemaphore-pAllocator-parameter", VALIDATION_ERROR_2680ec01}, + {"VUID-vkDestroySemaphore-semaphore-parameter", VALIDATION_ERROR_2682b801}, + {"VUID-vkDestroySemaphore-semaphore-parent", VALIDATION_ERROR_2682b807}, + {"VUID-vkDestroyShaderModule-shaderModule-01092", VALIDATION_ERROR_26a00888}, + {"VUID-vkDestroyShaderModule-shaderModule-01093", VALIDATION_ERROR_26a0088a}, + {"VUID-vkDestroyShaderModule-device-parameter", VALIDATION_ERROR_26a05601}, + {"VUID-vkDestroyShaderModule-pAllocator-parameter", VALIDATION_ERROR_26a0ec01}, + {"VUID-vkDestroyShaderModule-shaderModule-parameter", VALIDATION_ERROR_26a2be01}, + {"VUID-vkDestroyShaderModule-shaderModule-parent", VALIDATION_ERROR_26a2be07}, + {"VUID-vkDestroySurfaceKHR-surface-01266", VALIDATION_ERROR_26c009e4}, + {"VUID-vkDestroySurfaceKHR-surface-01267", VALIDATION_ERROR_26c009e6}, + {"VUID-vkDestroySurfaceKHR-surface-01268", VALIDATION_ERROR_26c009e8}, + {"VUID-vkDestroySurfaceKHR-instance-parameter", VALIDATION_ERROR_26c0bc01}, + {"VUID-vkDestroySurfaceKHR-pAllocator-parameter", VALIDATION_ERROR_26c0ec01}, + {"VUID-vkDestroySurfaceKHR-surface-parameter", VALIDATION_ERROR_26c2ec01}, + {"VUID-vkDestroySurfaceKHR-surface-parent", VALIDATION_ERROR_26c2ec07}, + {"VUID-vkDestroySwapchainKHR-commonparent", VALIDATION_ERROR_26e00009}, + {"VUID-vkDestroySwapchainKHR-swapchain-01282", VALIDATION_ERROR_26e00a04}, + {"VUID-vkDestroySwapchainKHR-swapchain-01283", VALIDATION_ERROR_26e00a06}, + {"VUID-vkDestroySwapchainKHR-swapchain-01284", VALIDATION_ERROR_26e00a08}, + {"VUID-vkDestroySwapchainKHR-device-parameter", VALIDATION_ERROR_26e05601}, + {"VUID-vkDestroySwapchainKHR-pAllocator-parameter", VALIDATION_ERROR_26e0ec01}, + {"VUID-vkDestroySwapchainKHR-swapchain-parameter", VALIDATION_ERROR_26e2f001}, + {"VUID-vkDeviceWaitIdle-device-parameter", VALIDATION_ERROR_27005601}, + {"VUID-vkDisplayPowerControlEXT-device-parameter", VALIDATION_ERROR_27205601}, + {"VUID-vkDisplayPowerControlEXT-display-parameter", VALIDATION_ERROR_27206001}, + {"VUID-vkDisplayPowerControlEXT-pDisplayPowerInfo-parameter", VALIDATION_ERROR_27214e01}, + {"VUID-vkEndCommandBuffer-commandBuffer-00059", VALIDATION_ERROR_27400076}, + {"VUID-vkEndCommandBuffer-commandBuffer-00060", VALIDATION_ERROR_27400078}, + {"VUID-vkEndCommandBuffer-commandBuffer-00061", VALIDATION_ERROR_2740007a}, + {"VUID-vkEndCommandBuffer-commandBuffer-00062", VALIDATION_ERROR_2740007c}, + {"VUID-vkEndCommandBuffer-commandBuffer-01815", VALIDATION_ERROR_27400e2e}, + {"VUID-vkEndCommandBuffer-commandBuffer-parameter", VALIDATION_ERROR_27402401}, + {"VUID-vkEnumerateDeviceExtensionProperties-pLayerName-parameter", VALIDATION_ERROR_27619e01}, + {"VUID-vkEnumerateDeviceExtensionProperties-pProperties-parameter", VALIDATION_ERROR_2761f401}, + {"VUID-vkEnumerateDeviceExtensionProperties-pPropertyCount-parameter", VALIDATION_ERROR_2761f601}, + {"VUID-vkEnumerateDeviceExtensionProperties-physicalDevice-parameter", VALIDATION_ERROR_27627a01}, + {"VUID-vkEnumerateDeviceLayerProperties-pProperties-parameter", VALIDATION_ERROR_2781f401}, + {"VUID-vkEnumerateDeviceLayerProperties-pPropertyCount-parameter", VALIDATION_ERROR_2781f601}, + {"VUID-vkEnumerateDeviceLayerProperties-physicalDevice-parameter", VALIDATION_ERROR_27827a01}, + {"VUID-vkEnumerateInstanceExtensionProperties-pLayerName-parameter", VALIDATION_ERROR_27a19e01}, + {"VUID-vkEnumerateInstanceExtensionProperties-pProperties-parameter", VALIDATION_ERROR_27a1f401}, + {"VUID-vkEnumerateInstanceExtensionProperties-pPropertyCount-parameter", VALIDATION_ERROR_27a1f601}, + {"VUID-vkEnumerateInstanceLayerProperties-pProperties-parameter", VALIDATION_ERROR_27c1f401}, + {"VUID-vkEnumerateInstanceLayerProperties-pPropertyCount-parameter", VALIDATION_ERROR_27c1f601}, + {"VUID-vkEnumeratePhysicalDeviceGroups-instance-parameter", VALIDATION_ERROR_27e0bc01}, + {"VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupCount-parameter", VALIDATION_ERROR_27e1d801}, + {"VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupProperties-parameter", VALIDATION_ERROR_27e1da01}, + {"VUID-vkEnumeratePhysicalDevices-instance-parameter", VALIDATION_ERROR_2800bc01}, + {"VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter", VALIDATION_ERROR_2801d601}, + {"VUID-vkEnumeratePhysicalDevices-pPhysicalDevices-parameter", VALIDATION_ERROR_2801dc01}, + {"VUID-vkFlushMappedMemoryRanges-device-parameter", VALIDATION_ERROR_28205601}, + {"VUID-vkFlushMappedMemoryRanges-memoryRangeCount-arraylength", VALIDATION_ERROR_2820c81b}, + {"VUID-vkFlushMappedMemoryRanges-pMemoryRanges-parameter", VALIDATION_ERROR_2821b201}, + {"VUID-vkFreeCommandBuffers-pCommandBuffers-00047", VALIDATION_ERROR_2840005e}, + {"VUID-vkFreeCommandBuffers-pCommandBuffers-00048", VALIDATION_ERROR_28400060}, + {"VUID-vkFreeCommandBuffers-commandBufferCount-arraylength", VALIDATION_ERROR_2840261b}, + {"VUID-vkFreeCommandBuffers-commandPool-parameter", VALIDATION_ERROR_28402801}, + {"VUID-vkFreeCommandBuffers-commandPool-parent", VALIDATION_ERROR_28402807}, + {"VUID-vkFreeCommandBuffers-device-parameter", VALIDATION_ERROR_28405601}, + {"VUID-vkFreeCommandBuffers-pCommandBuffers-parent", VALIDATION_ERROR_28411407}, + {"VUID-vkFreeDescriptorSets-pDescriptorSets-00309", VALIDATION_ERROR_2860026a}, + {"VUID-vkFreeDescriptorSets-pDescriptorSets-00310", VALIDATION_ERROR_2860026c}, + {"VUID-vkFreeDescriptorSets-pDescriptorSets-00311", VALIDATION_ERROR_2860026e}, + {"VUID-vkFreeDescriptorSets-descriptorPool-00312", VALIDATION_ERROR_28600270}, + {"VUID-vkFreeDescriptorSets-descriptorPool-parameter", VALIDATION_ERROR_28604601}, + {"VUID-vkFreeDescriptorSets-descriptorPool-parent", VALIDATION_ERROR_28604607}, + {"VUID-vkFreeDescriptorSets-descriptorSetCount-arraylength", VALIDATION_ERROR_28604a1b}, + {"VUID-vkFreeDescriptorSets-device-parameter", VALIDATION_ERROR_28605601}, + {"VUID-vkFreeDescriptorSets-pDescriptorSets-parent", VALIDATION_ERROR_28613007}, + {"VUID-vkFreeMemory-memory-00677", VALIDATION_ERROR_2880054a}, + {"VUID-vkFreeMemory-device-parameter", VALIDATION_ERROR_28805601}, + {"VUID-vkFreeMemory-memory-parameter", VALIDATION_ERROR_2880c601}, + {"VUID-vkFreeMemory-memory-parent", VALIDATION_ERROR_2880c607}, + {"VUID-vkFreeMemory-pAllocator-parameter", VALIDATION_ERROR_2880ec01}, + {"VUID-vkGetBufferMemoryRequirements-buffer-parameter", VALIDATION_ERROR_28a01a01}, + {"VUID-vkGetBufferMemoryRequirements-buffer-parent", VALIDATION_ERROR_28a01a07}, + {"VUID-vkGetBufferMemoryRequirements-device-parameter", VALIDATION_ERROR_28a05601}, + {"VUID-vkGetBufferMemoryRequirements-pMemoryRequirements-parameter", VALIDATION_ERROR_28a1b401}, + {"VUID-vkGetDeviceGroupPeerMemoryFeatures-heapIndex-00691", VALIDATION_ERROR_28c00566}, + {"VUID-vkGetDeviceGroupPeerMemoryFeatures-localDeviceIndex-00692", VALIDATION_ERROR_28c00568}, + {"VUID-vkGetDeviceGroupPeerMemoryFeatures-remoteDeviceIndex-00693", VALIDATION_ERROR_28c0056a}, + {"VUID-vkGetDeviceGroupPeerMemoryFeatures-localDeviceIndex-00694", VALIDATION_ERROR_28c0056c}, + {"VUID-vkGetDeviceGroupPeerMemoryFeatures-device-parameter", VALIDATION_ERROR_28c05601}, + {"VUID-vkGetDeviceGroupPeerMemoryFeatures-pPeerMemoryFeatures-parameter", VALIDATION_ERROR_28c1d401}, + {"VUID-vkGetDeviceGroupPeerMemoryFeatures-pPeerMemoryFeatures-requiredbitmask", VALIDATION_ERROR_28c1d403}, + {"VUID-vkGetDeviceGroupPresentCapabilitiesKHR-device-parameter", VALIDATION_ERROR_28e05601}, + {"VUID-vkGetDeviceGroupPresentCapabilitiesKHR-pDeviceGroupPresentCapabilities-parameter", VALIDATION_ERROR_28e13c01}, + {"VUID-vkGetDeviceGroupSurfacePresentModesKHR-commonparent", VALIDATION_ERROR_29000009}, + {"VUID-vkGetDeviceGroupSurfacePresentModesKHR-device-parameter", VALIDATION_ERROR_29005601}, + {"VUID-vkGetDeviceGroupSurfacePresentModesKHR-pModes-parameter", VALIDATION_ERROR_2901be01}, + {"VUID-vkGetDeviceGroupSurfacePresentModesKHR-surface-parameter", VALIDATION_ERROR_2902ec01}, + {"VUID-vkGetDeviceMemoryCommitment-memory-00690", VALIDATION_ERROR_29200564}, + {"VUID-vkGetDeviceMemoryCommitment-device-parameter", VALIDATION_ERROR_29205601}, + {"VUID-vkGetDeviceMemoryCommitment-memory-parameter", VALIDATION_ERROR_2920c601}, + {"VUID-vkGetDeviceMemoryCommitment-memory-parent", VALIDATION_ERROR_2920c607}, + {"VUID-vkGetDeviceMemoryCommitment-pCommittedMemoryInBytes-parameter", VALIDATION_ERROR_29211801}, + {"VUID-vkGetDeviceProcAddr-device-parameter", VALIDATION_ERROR_29405601}, + {"VUID-vkGetDeviceProcAddr-pName-parameter", VALIDATION_ERROR_2941c001}, + {"VUID-vkGetDeviceQueue-queueFamilyIndex-00384", VALIDATION_ERROR_29600300}, + {"VUID-vkGetDeviceQueue-queueIndex-00385", VALIDATION_ERROR_29600302}, + {"VUID-vkGetDeviceQueue-flags-01841", VALIDATION_ERROR_29600e62}, + {"VUID-vkGetDeviceQueue-device-parameter", VALIDATION_ERROR_29605601}, + {"VUID-vkGetDeviceQueue-pQueue-parameter", VALIDATION_ERROR_2961fc01}, + {"VUID-vkGetDisplayModePropertiesKHR-display-parameter", VALIDATION_ERROR_29806001}, + {"VUID-vkGetDisplayModePropertiesKHR-pProperties-parameter", VALIDATION_ERROR_2981f401}, + {"VUID-vkGetDisplayModePropertiesKHR-pPropertyCount-parameter", VALIDATION_ERROR_2981f601}, + {"VUID-vkGetDisplayModePropertiesKHR-physicalDevice-parameter", VALIDATION_ERROR_29827a01}, + {"VUID-vkGetDisplayPlaneCapabilitiesKHR-mode-parameter", VALIDATION_ERROR_29a0ce01}, + {"VUID-vkGetDisplayPlaneCapabilitiesKHR-pCapabilities-parameter", VALIDATION_ERROR_29a10a01}, + {"VUID-vkGetDisplayPlaneCapabilitiesKHR-physicalDevice-parameter", VALIDATION_ERROR_29a27a01}, + {"VUID-vkGetDisplayPlaneSupportedDisplaysKHR-planeIndex-01249", VALIDATION_ERROR_29c009c2}, + {"VUID-vkGetDisplayPlaneSupportedDisplaysKHR-pDisplayCount-parameter", VALIDATION_ERROR_29c14a01}, + {"VUID-vkGetDisplayPlaneSupportedDisplaysKHR-pDisplays-parameter", VALIDATION_ERROR_29c15201}, + {"VUID-vkGetDisplayPlaneSupportedDisplaysKHR-physicalDevice-parameter", VALIDATION_ERROR_29c27a01}, + {"VUID-vkGetEventStatus-device-parameter", VALIDATION_ERROR_29e05601}, + {"VUID-vkGetEventStatus-event-parameter", VALIDATION_ERROR_29e07e01}, + {"VUID-vkGetEventStatus-event-parent", VALIDATION_ERROR_29e07e07}, + {"VUID-vkGetFenceStatus-device-parameter", VALIDATION_ERROR_2a005601}, + {"VUID-vkGetFenceStatus-fence-parameter", VALIDATION_ERROR_2a008801}, + {"VUID-vkGetFenceStatus-fence-parent", VALIDATION_ERROR_2a008807}, + {"VUID-vkGetImageMemoryRequirements-image-01588", VALIDATION_ERROR_2a200c68}, + {"VUID-vkGetImageMemoryRequirements-device-parameter", VALIDATION_ERROR_2a205601}, + {"VUID-vkGetImageMemoryRequirements-image-parameter", VALIDATION_ERROR_2a20a001}, + {"VUID-vkGetImageMemoryRequirements-image-parent", VALIDATION_ERROR_2a20a007}, + {"VUID-vkGetImageMemoryRequirements-pMemoryRequirements-parameter", VALIDATION_ERROR_2a21b401}, + {"VUID-vkGetImageSparseMemoryRequirements-device-parameter", VALIDATION_ERROR_2a405601}, + {"VUID-vkGetImageSparseMemoryRequirements-image-parameter", VALIDATION_ERROR_2a40a001}, + {"VUID-vkGetImageSparseMemoryRequirements-image-parent", VALIDATION_ERROR_2a40a007}, + {"VUID-vkGetImageSparseMemoryRequirements-pSparseMemoryRequirementCount-parameter", VALIDATION_ERROR_2a423601}, + {"VUID-vkGetImageSparseMemoryRequirements-pSparseMemoryRequirements-parameter", VALIDATION_ERROR_2a423801}, + {"VUID-vkGetImageSubresourceLayout-image-00996", VALIDATION_ERROR_2a6007c8}, + {"VUID-vkGetImageSubresourceLayout-aspectMask-00997", VALIDATION_ERROR_2a6007ca}, + {"VUID-vkGetImageSubresourceLayout-format-01581", VALIDATION_ERROR_2a600c5a}, + {"VUID-vkGetImageSubresourceLayout-format-01582", VALIDATION_ERROR_2a600c5c}, + {"VUID-vkGetImageSubresourceLayout-mipLevel-01716", VALIDATION_ERROR_2a600d68}, + {"VUID-vkGetImageSubresourceLayout-arrayLayer-01717", VALIDATION_ERROR_2a600d6a}, + {"VUID-vkGetImageSubresourceLayout-image-01895", VALIDATION_ERROR_2a600ece}, + {"VUID-vkGetImageSubresourceLayout-device-parameter", VALIDATION_ERROR_2a605601}, + {"VUID-vkGetImageSubresourceLayout-image-parameter", VALIDATION_ERROR_2a60a001}, + {"VUID-vkGetImageSubresourceLayout-image-parent", VALIDATION_ERROR_2a60a007}, + {"VUID-vkGetImageSubresourceLayout-pLayout-parameter", VALIDATION_ERROR_2a61a201}, + {"VUID-vkGetImageSubresourceLayout-pSubresource-parameter", VALIDATION_ERROR_2a624401}, + {"VUID-vkGetInstanceProcAddr-instance-parameter", VALIDATION_ERROR_2a80bc01}, + {"VUID-vkGetInstanceProcAddr-pName-parameter", VALIDATION_ERROR_2a81c001}, + {"VUID-vkGetMemoryFdKHR-device-parameter", VALIDATION_ERROR_2aa05601}, + {"VUID-vkGetMemoryFdKHR-pFd-parameter", VALIDATION_ERROR_2aa16c01}, + {"VUID-vkGetMemoryFdKHR-pGetFdInfo-parameter", VALIDATION_ERROR_2aa39e01}, + {"VUID-vkGetMemoryFdPropertiesKHR-fd-00673", VALIDATION_ERROR_2ac00542}, + {"VUID-vkGetMemoryFdPropertiesKHR-handleType-00674", VALIDATION_ERROR_2ac00544}, + {"VUID-vkGetMemoryFdPropertiesKHR-device-parameter", VALIDATION_ERROR_2ac05601}, + {"VUID-vkGetMemoryFdPropertiesKHR-handleType-parameter", VALIDATION_ERROR_2ac09c01}, + {"VUID-vkGetMemoryFdPropertiesKHR-pMemoryFdProperties-parameter", VALIDATION_ERROR_2ac1ae01}, + {"VUID-vkGetMemoryWin32HandleKHR-device-parameter", VALIDATION_ERROR_2ae05601}, + {"VUID-vkGetMemoryWin32HandleKHR-pHandle-parameter", VALIDATION_ERROR_2ae17c01}, + {"VUID-vkGetMemoryWin32HandleKHR-pGetWin32HandleInfo-parameter", VALIDATION_ERROR_2ae3a001}, + {"VUID-vkGetMemoryWin32HandleNV-handleType-01326", VALIDATION_ERROR_2b000a5c}, + {"VUID-vkGetMemoryWin32HandleNV-device-parameter", VALIDATION_ERROR_2b005601}, + {"VUID-vkGetMemoryWin32HandleNV-handleType-parameter", VALIDATION_ERROR_2b009c01}, + {"VUID-vkGetMemoryWin32HandleNV-handleType-requiredbitmask", VALIDATION_ERROR_2b009c03}, + {"VUID-vkGetMemoryWin32HandleNV-memory-parameter", VALIDATION_ERROR_2b00c601}, + {"VUID-vkGetMemoryWin32HandleNV-memory-parent", VALIDATION_ERROR_2b00c607}, + {"VUID-vkGetMemoryWin32HandleNV-pHandle-parameter", VALIDATION_ERROR_2b017c01}, + {"VUID-vkGetMemoryWin32HandlePropertiesKHR-handle-00665", VALIDATION_ERROR_2b200532}, + {"VUID-vkGetMemoryWin32HandlePropertiesKHR-handleType-00666", VALIDATION_ERROR_2b200534}, + {"VUID-vkGetMemoryWin32HandlePropertiesKHR-device-parameter", VALIDATION_ERROR_2b205601}, + {"VUID-vkGetMemoryWin32HandlePropertiesKHR-handleType-parameter", VALIDATION_ERROR_2b209c01}, + {"VUID-vkGetMemoryWin32HandlePropertiesKHR-pMemoryWin32HandleProperties-parameter", VALIDATION_ERROR_2b21b601}, + {"VUID-vkGetPastPresentationTimingGOOGLE-commonparent", VALIDATION_ERROR_2b400009}, + {"VUID-vkGetPastPresentationTimingGOOGLE-device-parameter", VALIDATION_ERROR_2b405601}, + {"VUID-vkGetPastPresentationTimingGOOGLE-pPresentationTimingCount-parameter", VALIDATION_ERROR_2b41ec01}, + {"VUID-vkGetPastPresentationTimingGOOGLE-pPresentationTimings-parameter", VALIDATION_ERROR_2b41ee01}, + {"VUID-vkGetPastPresentationTimingGOOGLE-swapchain-parameter", VALIDATION_ERROR_2b42f001}, + {"VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-pProperties-parameter", VALIDATION_ERROR_2b61f401}, + {"VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-pPropertyCount-parameter", VALIDATION_ERROR_2b61f601}, + {"VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-physicalDevice-parameter", VALIDATION_ERROR_2b627a01}, + {"VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pProperties-parameter", VALIDATION_ERROR_2b81f401}, + {"VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pPropertyCount-parameter", VALIDATION_ERROR_2b81f601}, + {"VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-physicalDevice-parameter", VALIDATION_ERROR_2b827a01}, + {"VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferInfo-parameter", VALIDATION_ERROR_2ba16201}, + {"VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferProperties-parameter", VALIDATION_ERROR_2ba16401}, + {"VUID-vkGetPhysicalDeviceExternalBufferProperties-physicalDevice-parameter", VALIDATION_ERROR_2ba27a01}, + {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-externalHandleType-parameter", VALIDATION_ERROR_2bc08201}, + {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-flags-parameter", VALIDATION_ERROR_2bc09001}, + {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-format-parameter", VALIDATION_ERROR_2bc09201}, + {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-pExternalImageFormatProperties-parameter", VALIDATION_ERROR_2bc16601}, + {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-physicalDevice-parameter", VALIDATION_ERROR_2bc27a01}, + {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-tiling-parameter", VALIDATION_ERROR_2bc2fa01}, + {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-type-parameter", VALIDATION_ERROR_2bc30401}, + {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-parameter", VALIDATION_ERROR_2bc30601}, + {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-requiredbitmask", VALIDATION_ERROR_2bc30603}, + {"VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreInfo-parameter", VALIDATION_ERROR_2be16801}, + {"VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreProperties-parameter", VALIDATION_ERROR_2be16a01}, + {"VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-physicalDevice-parameter", VALIDATION_ERROR_2be27a01}, + {"VUID-vkGetPhysicalDeviceFeatures-pFeatures-parameter", VALIDATION_ERROR_2c016e01}, + {"VUID-vkGetPhysicalDeviceFeatures-physicalDevice-parameter", VALIDATION_ERROR_2c027a01}, + {"VUID-vkGetPhysicalDeviceFeatures2-pFeatures-parameter", VALIDATION_ERROR_2c216e01}, + {"VUID-vkGetPhysicalDeviceFeatures2-physicalDevice-parameter", VALIDATION_ERROR_2c227a01}, + {"VUID-vkGetPhysicalDeviceFormatProperties-format-parameter", VALIDATION_ERROR_2c409201}, + {"VUID-vkGetPhysicalDeviceFormatProperties-pFormatProperties-parameter", VALIDATION_ERROR_2c417601}, + {"VUID-vkGetPhysicalDeviceFormatProperties-physicalDevice-parameter", VALIDATION_ERROR_2c427a01}, + {"VUID-vkGetPhysicalDeviceFormatProperties2-format-parameter", VALIDATION_ERROR_2c609201}, + {"VUID-vkGetPhysicalDeviceFormatProperties2-pFormatProperties-parameter", VALIDATION_ERROR_2c617601}, + {"VUID-vkGetPhysicalDeviceFormatProperties2-physicalDevice-parameter", VALIDATION_ERROR_2c627a01}, + {"VUID-vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX-pFeatures-parameter", VALIDATION_ERROR_2c816e01}, + {"VUID-vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX-pLimits-parameter", VALIDATION_ERROR_2c81a401}, + {"VUID-vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX-physicalDevice-parameter", VALIDATION_ERROR_2c827a01}, + {"VUID-vkGetPhysicalDeviceImageFormatProperties-flags-parameter", VALIDATION_ERROR_2ca09001}, + {"VUID-vkGetPhysicalDeviceImageFormatProperties-format-parameter", VALIDATION_ERROR_2ca09201}, + {"VUID-vkGetPhysicalDeviceImageFormatProperties-pImageFormatProperties-parameter", VALIDATION_ERROR_2ca18401}, + {"VUID-vkGetPhysicalDeviceImageFormatProperties-physicalDevice-parameter", VALIDATION_ERROR_2ca27a01}, + {"VUID-vkGetPhysicalDeviceImageFormatProperties-tiling-parameter", VALIDATION_ERROR_2ca2fa01}, + {"VUID-vkGetPhysicalDeviceImageFormatProperties-type-parameter", VALIDATION_ERROR_2ca30401}, + {"VUID-vkGetPhysicalDeviceImageFormatProperties-usage-parameter", VALIDATION_ERROR_2ca30601}, + {"VUID-vkGetPhysicalDeviceImageFormatProperties-usage-requiredbitmask", VALIDATION_ERROR_2ca30603}, + {"VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-01868", VALIDATION_ERROR_2cc00e98}, + {"VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatInfo-parameter", VALIDATION_ERROR_2cc18201}, + {"VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatProperties-parameter", VALIDATION_ERROR_2cc18401}, + {"VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter", VALIDATION_ERROR_2cc27a01}, + {"VUID-vkGetPhysicalDeviceMemoryProperties-pMemoryProperties-parameter", VALIDATION_ERROR_2ce1b001}, + {"VUID-vkGetPhysicalDeviceMemoryProperties-physicalDevice-parameter", VALIDATION_ERROR_2ce27a01}, + {"VUID-vkGetPhysicalDeviceMemoryProperties2-pMemoryProperties-parameter", VALIDATION_ERROR_2d01b001}, + {"VUID-vkGetPhysicalDeviceMemoryProperties2-physicalDevice-parameter", VALIDATION_ERROR_2d027a01}, + {"VUID-vkGetPhysicalDeviceMirPresentationSupportKHR-queueFamilyIndex-01265", VALIDATION_ERROR_2d2009e2}, + {"VUID-vkGetPhysicalDeviceMirPresentationSupportKHR-connection-parameter", VALIDATION_ERROR_2d203001}, + {"VUID-vkGetPhysicalDeviceMirPresentationSupportKHR-physicalDevice-parameter", VALIDATION_ERROR_2d227a01}, + {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-commonparent", VALIDATION_ERROR_2d400009}, + {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRectCount-parameter", VALIDATION_ERROR_2d420a01}, + {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRects-parameter", VALIDATION_ERROR_2d420e01}, + {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-physicalDevice-parameter", VALIDATION_ERROR_2d427a01}, + {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-surface-parameter", VALIDATION_ERROR_2d42ec01}, + {"VUID-vkGetPhysicalDeviceProperties-pProperties-parameter", VALIDATION_ERROR_2d61f401}, + {"VUID-vkGetPhysicalDeviceProperties-physicalDevice-parameter", VALIDATION_ERROR_2d627a01}, + {"VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter", VALIDATION_ERROR_2d81f401}, + {"VUID-vkGetPhysicalDeviceProperties2-physicalDevice-parameter", VALIDATION_ERROR_2d827a01}, + {"VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyProperties-parameter", VALIDATION_ERROR_2da20001}, + {"VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyPropertyCount-parameter", VALIDATION_ERROR_2da20201}, + {"VUID-vkGetPhysicalDeviceQueueFamilyProperties-physicalDevice-parameter", VALIDATION_ERROR_2da27a01}, + {"VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyProperties-parameter", VALIDATION_ERROR_2dc20001}, + {"VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyPropertyCount-parameter", VALIDATION_ERROR_2dc20201}, + {"VUID-vkGetPhysicalDeviceQueueFamilyProperties2-physicalDevice-parameter", VALIDATION_ERROR_2dc27a01}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-01094", VALIDATION_ERROR_2de0088c}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-format-parameter", VALIDATION_ERROR_2de09201}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-pProperties-parameter", VALIDATION_ERROR_2de1f401}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-pPropertyCount-parameter", VALIDATION_ERROR_2de1f601}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-physicalDevice-parameter", VALIDATION_ERROR_2de27a01}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-parameter", VALIDATION_ERROR_2de2b401}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-tiling-parameter", VALIDATION_ERROR_2de2fa01}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-type-parameter", VALIDATION_ERROR_2de30401}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-parameter", VALIDATION_ERROR_2de30601}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-requiredbitmask", VALIDATION_ERROR_2de30603}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pFormatInfo-parameter", VALIDATION_ERROR_2e017401}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pProperties-parameter", VALIDATION_ERROR_2e01f401}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pPropertyCount-parameter", VALIDATION_ERROR_2e01f601}, + {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-physicalDevice-parameter", VALIDATION_ERROR_2e027a01}, + {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-commonparent", VALIDATION_ERROR_2e200009}, + {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-pSurfaceCapabilities-parameter", VALIDATION_ERROR_2e224a01}, + {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-physicalDevice-parameter", VALIDATION_ERROR_2e227a01}, + {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-surface-parameter", VALIDATION_ERROR_2e22ec01}, + {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pSurfaceCapabilities-parameter", VALIDATION_ERROR_2e424a01}, + {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pSurfaceInfo-parameter", VALIDATION_ERROR_2e425001}, + {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-physicalDevice-parameter", VALIDATION_ERROR_2e427a01}, + {"VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-commonparent", VALIDATION_ERROR_2e600009}, + {"VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-pSurfaceCapabilities-parameter", VALIDATION_ERROR_2e624a01}, + {"VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-physicalDevice-parameter", VALIDATION_ERROR_2e627a01}, + {"VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-surface-parameter", VALIDATION_ERROR_2e62ec01}, + {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceFormatCount-parameter", VALIDATION_ERROR_2e824c01}, + {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceFormats-parameter", VALIDATION_ERROR_2e824e01}, + {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceInfo-parameter", VALIDATION_ERROR_2e825001}, + {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-physicalDevice-parameter", VALIDATION_ERROR_2e827a01}, + {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-commonparent", VALIDATION_ERROR_2ea00009}, + {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-pSurfaceFormatCount-parameter", VALIDATION_ERROR_2ea24c01}, + {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-pSurfaceFormats-parameter", VALIDATION_ERROR_2ea24e01}, + {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-physicalDevice-parameter", VALIDATION_ERROR_2ea27a01}, + {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-surface-parameter", VALIDATION_ERROR_2ea2ec01}, + {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-commonparent", VALIDATION_ERROR_2ec00009}, + {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-pPresentModeCount-parameter", VALIDATION_ERROR_2ec1e801}, + {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-pPresentModes-parameter", VALIDATION_ERROR_2ec1ea01}, + {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-physicalDevice-parameter", VALIDATION_ERROR_2ec27a01}, + {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-surface-parameter", VALIDATION_ERROR_2ec2ec01}, + {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-commonparent", VALIDATION_ERROR_2ee00009}, + {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-queueFamilyIndex-01269", VALIDATION_ERROR_2ee009ea}, + {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-pSupported-parameter", VALIDATION_ERROR_2ee24601}, + {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-physicalDevice-parameter", VALIDATION_ERROR_2ee27a01}, + {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-surface-parameter", VALIDATION_ERROR_2ee2ec01}, + {"VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-queueFamilyIndex-01306", VALIDATION_ERROR_2f000a34}, + {"VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-display-parameter", VALIDATION_ERROR_2f006001}, + {"VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-physicalDevice-parameter", VALIDATION_ERROR_2f027a01}, + {"VUID-vkGetPhysicalDeviceWin32PresentationSupportKHR-queueFamilyIndex-01309", VALIDATION_ERROR_2f200a3a}, + {"VUID-vkGetPhysicalDeviceWin32PresentationSupportKHR-physicalDevice-parameter", VALIDATION_ERROR_2f227a01}, + {"VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-queueFamilyIndex-01312", VALIDATION_ERROR_2f400a40}, + {"VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-connection-parameter", VALIDATION_ERROR_2f403001}, + {"VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-physicalDevice-parameter", VALIDATION_ERROR_2f427a01}, + {"VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-queueFamilyIndex-01315", VALIDATION_ERROR_2f600a46}, + {"VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-dpy-parameter", VALIDATION_ERROR_2f606601}, + {"VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-physicalDevice-parameter", VALIDATION_ERROR_2f627a01}, + {"VUID-vkGetPipelineCacheData-device-parameter", VALIDATION_ERROR_2f805601}, + {"VUID-vkGetPipelineCacheData-pData-parameter", VALIDATION_ERROR_2f812201}, + {"VUID-vkGetPipelineCacheData-pDataSize-parameter", VALIDATION_ERROR_2f812401}, + {"VUID-vkGetPipelineCacheData-pipelineCache-parameter", VALIDATION_ERROR_2f828001}, + {"VUID-vkGetPipelineCacheData-pipelineCache-parent", VALIDATION_ERROR_2f828007}, + {"VUID-vkGetQueryPoolResults-firstQuery-00813", VALIDATION_ERROR_2fa0065a}, + {"VUID-vkGetQueryPoolResults-flags-00814", VALIDATION_ERROR_2fa0065c}, + {"VUID-vkGetQueryPoolResults-flags-00815", VALIDATION_ERROR_2fa0065e}, + {"VUID-vkGetQueryPoolResults-firstQuery-00816", VALIDATION_ERROR_2fa00660}, + {"VUID-vkGetQueryPoolResults-dataSize-00817", VALIDATION_ERROR_2fa00662}, + {"VUID-vkGetQueryPoolResults-queryType-00818", VALIDATION_ERROR_2fa00664}, + {"VUID-vkGetQueryPoolResults-dataSize-arraylength", VALIDATION_ERROR_2fa03c1b}, + {"VUID-vkGetQueryPoolResults-device-parameter", VALIDATION_ERROR_2fa05601}, + {"VUID-vkGetQueryPoolResults-flags-parameter", VALIDATION_ERROR_2fa09001}, + {"VUID-vkGetQueryPoolResults-pData-parameter", VALIDATION_ERROR_2fa12201}, + {"VUID-vkGetQueryPoolResults-queryPool-parameter", VALIDATION_ERROR_2fa29801}, + {"VUID-vkGetQueryPoolResults-queryPool-parent", VALIDATION_ERROR_2fa29807}, + {"VUID-vkGetRandROutputDisplayEXT-dpy-parameter", VALIDATION_ERROR_2fc06601}, + {"VUID-vkGetRandROutputDisplayEXT-pDisplay-parameter", VALIDATION_ERROR_2fc14801}, + {"VUID-vkGetRandROutputDisplayEXT-physicalDevice-parameter", VALIDATION_ERROR_2fc27a01}, + {"VUID-vkGetRefreshCycleDurationGOOGLE-commonparent", VALIDATION_ERROR_2fe00009}, + {"VUID-vkGetRefreshCycleDurationGOOGLE-device-parameter", VALIDATION_ERROR_2fe05601}, + {"VUID-vkGetRefreshCycleDurationGOOGLE-pDisplayTimingProperties-parameter", VALIDATION_ERROR_2fe15001}, + {"VUID-vkGetRefreshCycleDurationGOOGLE-swapchain-parameter", VALIDATION_ERROR_2fe2f001}, + {"VUID-vkGetRenderAreaGranularity-device-parameter", VALIDATION_ERROR_30005601}, + {"VUID-vkGetRenderAreaGranularity-pGranularity-parameter", VALIDATION_ERROR_30017a01}, + {"VUID-vkGetRenderAreaGranularity-renderPass-parameter", VALIDATION_ERROR_3002ae01}, + {"VUID-vkGetRenderAreaGranularity-renderPass-parent", VALIDATION_ERROR_3002ae07}, + {"VUID-vkGetSemaphoreFdKHR-device-parameter", VALIDATION_ERROR_30205601}, + {"VUID-vkGetSemaphoreFdKHR-pFd-parameter", VALIDATION_ERROR_30216c01}, + {"VUID-vkGetSemaphoreFdKHR-pGetFdInfo-parameter", VALIDATION_ERROR_30239e01}, + {"VUID-vkGetSemaphoreWin32HandleKHR-device-parameter", VALIDATION_ERROR_30405601}, + {"VUID-vkGetSemaphoreWin32HandleKHR-pHandle-parameter", VALIDATION_ERROR_30417c01}, + {"VUID-vkGetSemaphoreWin32HandleKHR-pGetWin32HandleInfo-parameter", VALIDATION_ERROR_3043a001}, + {"VUID-vkGetSwapchainCounterEXT-commonparent", VALIDATION_ERROR_30600009}, + {"VUID-vkGetSwapchainCounterEXT-swapchain-01245", VALIDATION_ERROR_306009ba}, + {"VUID-vkGetSwapchainCounterEXT-counter-parameter", VALIDATION_ERROR_30603601}, + {"VUID-vkGetSwapchainCounterEXT-device-parameter", VALIDATION_ERROR_30605601}, + {"VUID-vkGetSwapchainCounterEXT-pCounterValue-parameter", VALIDATION_ERROR_30611c01}, + {"VUID-vkGetSwapchainCounterEXT-swapchain-parameter", VALIDATION_ERROR_3062f001}, + {"VUID-vkGetSwapchainImagesKHR-commonparent", VALIDATION_ERROR_30800009}, + {"VUID-vkGetSwapchainImagesKHR-device-parameter", VALIDATION_ERROR_30805601}, + {"VUID-vkGetSwapchainImagesKHR-pSwapchainImageCount-parameter", VALIDATION_ERROR_30825401}, + {"VUID-vkGetSwapchainImagesKHR-pSwapchainImages-parameter", VALIDATION_ERROR_30825601}, + {"VUID-vkGetSwapchainImagesKHR-swapchain-parameter", VALIDATION_ERROR_3082f001}, + {"VUID-vkGetSwapchainStatusKHR-commonparent", VALIDATION_ERROR_30a00009}, + {"VUID-vkGetSwapchainStatusKHR-device-parameter", VALIDATION_ERROR_30a05601}, + {"VUID-vkGetSwapchainStatusKHR-swapchain-parameter", VALIDATION_ERROR_30a2f001}, + {"VUID-vkImportSemaphoreFdKHR-semaphore-01142", VALIDATION_ERROR_30c008ec}, + {"VUID-vkImportSemaphoreFdKHR-device-parameter", VALIDATION_ERROR_30c05601}, + {"VUID-vkImportSemaphoreFdKHR-pImportSemaphoreFdInfo-parameter", VALIDATION_ERROR_30c18e01}, + {"VUID-vkImportSemaphoreWin32HandleKHR-device-parameter", VALIDATION_ERROR_30e05601}, + {"VUID-vkImportSemaphoreWin32HandleKHR-pImportSemaphoreWin32HandleInfo-parameter", VALIDATION_ERROR_30e19001}, + {"VUID-vkInvalidateMappedMemoryRanges-device-parameter", VALIDATION_ERROR_31005601}, + {"VUID-vkInvalidateMappedMemoryRanges-memoryRangeCount-arraylength", VALIDATION_ERROR_3100c81b}, + {"VUID-vkInvalidateMappedMemoryRanges-pMemoryRanges-parameter", VALIDATION_ERROR_3101b201}, + {"VUID-vkMapMemory-memory-00678", VALIDATION_ERROR_3120054c}, + {"VUID-vkMapMemory-offset-00679", VALIDATION_ERROR_3120054e}, + {"VUID-vkMapMemory-size-00680", VALIDATION_ERROR_31200550}, + {"VUID-vkMapMemory-size-00681", VALIDATION_ERROR_31200552}, + {"VUID-vkMapMemory-memory-00682", VALIDATION_ERROR_31200554}, + {"VUID-vkMapMemory-memory-00683", VALIDATION_ERROR_31200556}, + {"VUID-vkMapMemory-device-parameter", VALIDATION_ERROR_31205601}, + {"VUID-vkMapMemory-flags-zerobitmask", VALIDATION_ERROR_31209005}, + {"VUID-vkMapMemory-memory-parameter", VALIDATION_ERROR_3120c601}, + {"VUID-vkMapMemory-memory-parent", VALIDATION_ERROR_3120c607}, + {"VUID-vkMapMemory-ppData-parameter", VALIDATION_ERROR_31228c01}, + {"VUID-vkMergePipelineCaches-dstCache-00770", VALIDATION_ERROR_31400604}, + {"VUID-vkMergePipelineCaches-device-parameter", VALIDATION_ERROR_31405601}, + {"VUID-vkMergePipelineCaches-dstCache-parameter", VALIDATION_ERROR_31406e01}, + {"VUID-vkMergePipelineCaches-dstCache-parent", VALIDATION_ERROR_31406e07}, + {"VUID-vkMergePipelineCaches-pSrcCaches-parameter", VALIDATION_ERROR_31423c01}, + {"VUID-vkMergePipelineCaches-pSrcCaches-parent", VALIDATION_ERROR_31423c07}, + {"VUID-vkMergePipelineCaches-srcCacheCount-arraylength", VALIDATION_ERROR_3142ca1b}, + {"VUID-vkQueueBindSparse-commonparent", VALIDATION_ERROR_31600009}, + {"VUID-vkQueueBindSparse-queuetype", VALIDATION_ERROR_31600011}, + {"VUID-vkQueueBindSparse-fence-01113", VALIDATION_ERROR_316008b2}, + {"VUID-vkQueueBindSparse-fence-01114", VALIDATION_ERROR_316008b4}, + {"VUID-vkQueueBindSparse-pSignalSemaphores-01115", VALIDATION_ERROR_316008b6}, + {"VUID-vkQueueBindSparse-pWaitSemaphores-01116", VALIDATION_ERROR_316008b8}, + {"VUID-vkQueueBindSparse-pWaitSemaphores-01117", VALIDATION_ERROR_316008ba}, + {"VUID-vkQueueBindSparse-fence-parameter", VALIDATION_ERROR_31608801}, + {"VUID-vkQueueBindSparse-pBindInfo-parameter", VALIDATION_ERROR_3160f801}, + {"VUID-vkQueueBindSparse-queue-parameter", VALIDATION_ERROR_31629c01}, + {"VUID-vkQueuePresentKHR-pSwapchains-01292", VALIDATION_ERROR_31800a18}, + {"VUID-vkQueuePresentKHR-pSwapchains-01293", VALIDATION_ERROR_31800a1a}, + {"VUID-vkQueuePresentKHR-pWaitSemaphores-01294", VALIDATION_ERROR_31800a1c}, + {"VUID-vkQueuePresentKHR-pWaitSemaphores-01295", VALIDATION_ERROR_31800a1e}, + {"VUID-vkQueuePresentKHR-pPresentInfo-parameter", VALIDATION_ERROR_3181e601}, + {"VUID-vkQueuePresentKHR-queue-parameter", VALIDATION_ERROR_31829c01}, + {"VUID-vkQueueSubmit-commonparent", VALIDATION_ERROR_31a00009}, + {"VUID-vkQueueSubmit-fence-00063", VALIDATION_ERROR_31a0007e}, + {"VUID-vkQueueSubmit-fence-00064", VALIDATION_ERROR_31a00080}, + {"VUID-vkQueueSubmit-pCommandBuffers-00065", VALIDATION_ERROR_31a00082}, + {"VUID-vkQueueSubmit-pWaitDstStageMask-00066", VALIDATION_ERROR_31a00084}, + {"VUID-vkQueueSubmit-pSignalSemaphores-00067", VALIDATION_ERROR_31a00086}, + {"VUID-vkQueueSubmit-pWaitSemaphores-00068", VALIDATION_ERROR_31a00088}, + {"VUID-vkQueueSubmit-pWaitSemaphores-00069", VALIDATION_ERROR_31a0008a}, + {"VUID-vkQueueSubmit-pCommandBuffers-00070", VALIDATION_ERROR_31a0008c}, + {"VUID-vkQueueSubmit-pCommandBuffers-00071", VALIDATION_ERROR_31a0008e}, + {"VUID-vkQueueSubmit-pCommandBuffers-00072", VALIDATION_ERROR_31a00090}, + {"VUID-vkQueueSubmit-pCommandBuffers-00073", VALIDATION_ERROR_31a00092}, + {"VUID-vkQueueSubmit-pCommandBuffers-00074", VALIDATION_ERROR_31a00094}, + {"VUID-vkQueueSubmit-fence-parameter", VALIDATION_ERROR_31a08801}, + {"VUID-vkQueueSubmit-pSubmits-parameter", VALIDATION_ERROR_31a24001}, + {"VUID-vkQueueSubmit-queue-parameter", VALIDATION_ERROR_31a29c01}, + {"VUID-vkQueueWaitIdle-queue-parameter", VALIDATION_ERROR_31c29c01}, + {"VUID-vkRegisterDeviceEventEXT-device-parameter", VALIDATION_ERROR_31e05601}, + {"VUID-vkRegisterDeviceEventEXT-pAllocator-parameter", VALIDATION_ERROR_31e0ec01}, + {"VUID-vkRegisterDeviceEventEXT-pDeviceEventInfo-parameter", VALIDATION_ERROR_31e13a01}, + {"VUID-vkRegisterDeviceEventEXT-pFence-parameter", VALIDATION_ERROR_31e17001}, + {"VUID-vkRegisterDisplayEventEXT-device-parameter", VALIDATION_ERROR_32005601}, + {"VUID-vkRegisterDisplayEventEXT-display-parameter", VALIDATION_ERROR_32006001}, + {"VUID-vkRegisterDisplayEventEXT-pAllocator-parameter", VALIDATION_ERROR_3200ec01}, + {"VUID-vkRegisterDisplayEventEXT-pDisplayEventInfo-parameter", VALIDATION_ERROR_32014c01}, + {"VUID-vkRegisterDisplayEventEXT-pFence-parameter", VALIDATION_ERROR_32017001}, + {"VUID-vkRegisterObjectsNVX-pObjectTableEntry-01364", VALIDATION_ERROR_32200aa8}, + {"VUID-vkRegisterObjectsNVX-pObjectIndices-01365", VALIDATION_ERROR_32200aaa}, + {"VUID-vkRegisterObjectsNVX-pObjectIndices-01366", VALIDATION_ERROR_32200aac}, + {"VUID-vkRegisterObjectsNVX-device-parameter", VALIDATION_ERROR_32205601}, + {"VUID-vkRegisterObjectsNVX-objectCount-arraylength", VALIDATION_ERROR_3220d61b}, + {"VUID-vkRegisterObjectsNVX-objectTable-parameter", VALIDATION_ERROR_3220d801}, + {"VUID-vkRegisterObjectsNVX-objectTable-parent", VALIDATION_ERROR_3220d807}, + {"VUID-vkRegisterObjectsNVX-pObjectIndices-parameter", VALIDATION_ERROR_3221cc01}, + {"VUID-vkRegisterObjectsNVX-ppObjectTableEntries-parameter", VALIDATION_ERROR_32229201}, + {"VUID-vkReleaseDisplayEXT-display-parameter", VALIDATION_ERROR_32406001}, + {"VUID-vkReleaseDisplayEXT-physicalDevice-parameter", VALIDATION_ERROR_32427a01}, + {"VUID-vkResetCommandBuffer-commandBuffer-00045", VALIDATION_ERROR_3260005a}, + {"VUID-vkResetCommandBuffer-commandBuffer-00046", VALIDATION_ERROR_3260005c}, + {"VUID-vkResetCommandBuffer-commandBuffer-parameter", VALIDATION_ERROR_32602401}, + {"VUID-vkResetCommandBuffer-flags-parameter", VALIDATION_ERROR_32609001}, + {"VUID-vkResetCommandPool-commandPool-00040", VALIDATION_ERROR_32800050}, + {"VUID-vkResetCommandPool-commandPool-parameter", VALIDATION_ERROR_32802801}, + {"VUID-vkResetCommandPool-commandPool-parent", VALIDATION_ERROR_32802807}, + {"VUID-vkResetCommandPool-device-parameter", VALIDATION_ERROR_32805601}, + {"VUID-vkResetCommandPool-flags-parameter", VALIDATION_ERROR_32809001}, + {"VUID-vkResetDescriptorPool-descriptorPool-00313", VALIDATION_ERROR_32a00272}, + {"VUID-vkResetDescriptorPool-descriptorPool-parameter", VALIDATION_ERROR_32a04601}, + {"VUID-vkResetDescriptorPool-descriptorPool-parent", VALIDATION_ERROR_32a04607}, + {"VUID-vkResetDescriptorPool-device-parameter", VALIDATION_ERROR_32a05601}, + {"VUID-vkResetDescriptorPool-flags-zerobitmask", VALIDATION_ERROR_32a09005}, + {"VUID-vkResetEvent-event-01148", VALIDATION_ERROR_32c008f8}, + {"VUID-vkResetEvent-device-parameter", VALIDATION_ERROR_32c05601}, + {"VUID-vkResetEvent-event-parameter", VALIDATION_ERROR_32c07e01}, + {"VUID-vkResetEvent-event-parent", VALIDATION_ERROR_32c07e07}, + {"VUID-vkResetFences-pFences-01123", VALIDATION_ERROR_32e008c6}, + {"VUID-vkResetFences-device-parameter", VALIDATION_ERROR_32e05601}, + {"VUID-vkResetFences-fenceCount-arraylength", VALIDATION_ERROR_32e08a1b}, + {"VUID-vkResetFences-pFences-parameter", VALIDATION_ERROR_32e17201}, + {"VUID-vkResetFences-pFences-parent", VALIDATION_ERROR_32e17207}, + {"VUID-vkSetEvent-device-parameter", VALIDATION_ERROR_33005601}, + {"VUID-vkSetEvent-event-parameter", VALIDATION_ERROR_33007e01}, + {"VUID-vkSetEvent-event-parent", VALIDATION_ERROR_33007e07}, + {"VUID-vkSetHdrMetadataEXT-commonparent", VALIDATION_ERROR_33200009}, + {"VUID-vkSetHdrMetadataEXT-device-parameter", VALIDATION_ERROR_33205601}, + {"VUID-vkSetHdrMetadataEXT-pMetadata-parameter", VALIDATION_ERROR_3321ba01}, + {"VUID-vkSetHdrMetadataEXT-pSwapchains-parameter", VALIDATION_ERROR_33225801}, + {"VUID-vkSetHdrMetadataEXT-swapchainCount-arraylength", VALIDATION_ERROR_3322f21b}, + {"VUID-vkTrimCommandPool-commandPool-parameter", VALIDATION_ERROR_33402801}, + {"VUID-vkTrimCommandPool-commandPool-parent", VALIDATION_ERROR_33402807}, + {"VUID-vkTrimCommandPool-device-parameter", VALIDATION_ERROR_33405601}, + {"VUID-vkTrimCommandPool-flags-zerobitmask", VALIDATION_ERROR_33409005}, + {"VUID-vkUnmapMemory-memory-00689", VALIDATION_ERROR_33600562}, + {"VUID-vkUnmapMemory-device-parameter", VALIDATION_ERROR_33605601}, + {"VUID-vkUnmapMemory-memory-parameter", VALIDATION_ERROR_3360c601}, + {"VUID-vkUnmapMemory-memory-parent", VALIDATION_ERROR_3360c607}, + {"VUID-vkUnregisterObjectsNVX-pObjectIndices-01373", VALIDATION_ERROR_33800aba}, + {"VUID-vkUnregisterObjectsNVX-pObjectEntryTypes-01374", VALIDATION_ERROR_33800abc}, + {"VUID-vkUnregisterObjectsNVX-None-01375", VALIDATION_ERROR_33800abe}, + {"VUID-vkUnregisterObjectsNVX-device-parameter", VALIDATION_ERROR_33805601}, + {"VUID-vkUnregisterObjectsNVX-objectCount-arraylength", VALIDATION_ERROR_3380d61b}, + {"VUID-vkUnregisterObjectsNVX-objectTable-parameter", VALIDATION_ERROR_3380d801}, + {"VUID-vkUnregisterObjectsNVX-objectTable-parent", VALIDATION_ERROR_3380d807}, + {"VUID-vkUnregisterObjectsNVX-pObjectEntryTypes-parameter", VALIDATION_ERROR_3381c801}, + {"VUID-vkUnregisterObjectsNVX-pObjectIndices-parameter", VALIDATION_ERROR_3381cc01}, + {"VUID-vkUpdateDescriptorSetWithTemplate-pData-01685", VALIDATION_ERROR_33a00d2a}, + {"VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-parameter", VALIDATION_ERROR_33a04801}, + {"VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parameter", VALIDATION_ERROR_33a05201}, + {"VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parent", VALIDATION_ERROR_33a05207}, + {"VUID-vkUpdateDescriptorSetWithTemplate-device-parameter", VALIDATION_ERROR_33a05601}, + {"VUID-vkUpdateDescriptorSets-dstSet-00314", VALIDATION_ERROR_33c00274}, + {"VUID-vkUpdateDescriptorSets-None-03047", VALIDATION_ERROR_33c017ce}, + {"VUID-vkUpdateDescriptorSets-device-parameter", VALIDATION_ERROR_33c05601}, + {"VUID-vkUpdateDescriptorSets-pDescriptorCopies-parameter", VALIDATION_ERROR_33c12c01}, + {"VUID-vkUpdateDescriptorSets-pDescriptorWrites-parameter", VALIDATION_ERROR_33c13601}, + {"VUID-vkWaitForFences-device-parameter", VALIDATION_ERROR_33e05601}, + {"VUID-vkWaitForFences-fenceCount-arraylength", VALIDATION_ERROR_33e08a1b}, + {"VUID-vkWaitForFences-pFences-parameter", VALIDATION_ERROR_33e17201}, + {"VUID-vkWaitForFences-pFences-parent", VALIDATION_ERROR_33e17207}, + {"VUID-VkPhysicalDeviceProperties2-pNext-pNext", VALIDATION_ERROR_3401c40d}, + {"VUID-VkPhysicalDeviceProperties2-sType-sType", VALIDATION_ERROR_3402b00b}, + {"VUID-VkPhysicalDeviceProperties2-sType-unique", VALIDATION_ERROR_3402b00f}, + {"VUID-VkFormatProperties2-pNext-pNext", VALIDATION_ERROR_3421c40d}, + {"VUID-VkFormatProperties2-sType-sType", VALIDATION_ERROR_3422b00b}, + {"VUID-VkImageFormatProperties2-pNext-pNext", VALIDATION_ERROR_3441c40d}, + {"VUID-VkImageFormatProperties2-sType-sType", VALIDATION_ERROR_3442b00b}, + {"VUID-VkImageFormatProperties2-sType-unique", VALIDATION_ERROR_3442b00f}, + {"VUID-VkPhysicalDeviceMemoryProperties2-pNext-pNext", VALIDATION_ERROR_3461c40d}, + {"VUID-VkPhysicalDeviceMemoryProperties2-sType-sType", VALIDATION_ERROR_3462b00b}, + {"VUID-VkSurfaceCapabilities2KHR-pNext-pNext", VALIDATION_ERROR_3481c40d}, + {"VUID-VkSurfaceCapabilities2KHR-sType-sType", VALIDATION_ERROR_3482b00b}, + {"VUID-VkDeviceGroupPresentCapabilitiesKHR-pNext-pNext", VALIDATION_ERROR_34a1c40d}, + {"VUID-VkDeviceGroupPresentCapabilitiesKHR-sType-sType", VALIDATION_ERROR_34a2b00b}, + {"VUID-VkExternalBufferProperties-pNext-pNext", VALIDATION_ERROR_34c1c40d}, + {"VUID-VkExternalBufferProperties-sType-sType", VALIDATION_ERROR_34c2b00b}, + {"VUID-VkExternalSemaphoreProperties-pNext-pNext", VALIDATION_ERROR_3521c40d}, + {"VUID-VkExternalSemaphoreProperties-sType-sType", VALIDATION_ERROR_3522b00b}, + {"VUID-VkQueueFamilyProperties2-pNext-pNext", VALIDATION_ERROR_3541c40d}, + {"VUID-VkQueueFamilyProperties2-sType-sType", VALIDATION_ERROR_3542b00b}, + {"VUID-VkSparseImageFormatProperties2-pNext-pNext", VALIDATION_ERROR_3561c40d}, + {"VUID-VkSparseImageFormatProperties2-sType-sType", VALIDATION_ERROR_3562b00b}, + {"VUID-VkSurfaceFormat2KHR-pNext-pNext", VALIDATION_ERROR_3581c40d}, + {"VUID-VkSurfaceFormat2KHR-sType-sType", VALIDATION_ERROR_3582b00b}, + {"VUID-VkPhysicalDeviceMultiviewProperties-sType-sType", VALIDATION_ERROR_35c2b00b}, + {"VUID-VkExternalImageFormatProperties-sType-sType", VALIDATION_ERROR_3602b00b}, + {"VUID-VkPhysicalDeviceIDProperties-sType-sType", VALIDATION_ERROR_3622b00b}, + {"VUID-VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX-sType-sType", VALIDATION_ERROR_3642b00b}, + {"VUID-VkSharedPresentSurfaceCapabilitiesKHR-sType-sType", VALIDATION_ERROR_37e2b00b}, + {"VUID-VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT-sType-sType", VALIDATION_ERROR_3822b00b}, + {"VUID-VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT-sType-sType", VALIDATION_ERROR_3842b00b}, + {"VUID-VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT-sType-sType", VALIDATION_ERROR_3862b00b}, + {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-srcPremultiplied-01424", VALIDATION_ERROR_38800b20}, + {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-dstPremultiplied-01425", VALIDATION_ERROR_38800b22}, + {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-01426", VALIDATION_ERROR_38800b24}, + {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-sType-sType", VALIDATION_ERROR_3882b00b}, + {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-parameter", VALIDATION_ERROR_38834a01}, + {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableEnable-01405", VALIDATION_ERROR_38a00afa}, + {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-flags-zerobitmask", VALIDATION_ERROR_38a09005}, + {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-sType-sType", VALIDATION_ERROR_38a2b00b}, + {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationMode-parameter", VALIDATION_ERROR_38a34c01}, + {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableCount-arraylength", VALIDATION_ERROR_38a34e1b}, + {"VUID-VkPipelineCoverageToColorStateCreateInfoNV-coverageToColorEnable-01404", VALIDATION_ERROR_38c00af8}, + {"VUID-VkPipelineCoverageToColorStateCreateInfoNV-flags-zerobitmask", VALIDATION_ERROR_38c09005}, + {"VUID-VkPipelineCoverageToColorStateCreateInfoNV-sType-sType", VALIDATION_ERROR_38c2b00b}, + {"VUID-VkSamplerReductionModeCreateInfoEXT-sType-sType", VALIDATION_ERROR_38e2b00b}, + {"VUID-VkSamplerReductionModeCreateInfoEXT-reductionMode-parameter", VALIDATION_ERROR_38e35001}, + {"VUID-VkExportFenceCreateInfo-handleTypes-01446", VALIDATION_ERROR_39400b4c}, + {"VUID-VkExportFenceCreateInfo-handleTypes-parameter", VALIDATION_ERROR_39409e01}, + {"VUID-VkExportFenceCreateInfo-sType-sType", VALIDATION_ERROR_3942b00b}, + {"VUID-VkPhysicalDeviceExternalFenceInfo-handleType-parameter", VALIDATION_ERROR_39609c01}, + {"VUID-VkPhysicalDeviceExternalFenceInfo-pNext-pNext", VALIDATION_ERROR_3961c40d}, + {"VUID-VkPhysicalDeviceExternalFenceInfo-sType-sType", VALIDATION_ERROR_3962b00b}, + {"VUID-VkExternalFenceProperties-pNext-pNext", VALIDATION_ERROR_3981c40d}, + {"VUID-VkExternalFenceProperties-sType-sType", VALIDATION_ERROR_3982b00b}, + {"VUID-vkGetPhysicalDeviceExternalFenceProperties-physicalDevice-parameter", VALIDATION_ERROR_39a27a01}, + {"VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceInfo-parameter", VALIDATION_ERROR_39a3a201}, + {"VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceProperties-parameter", VALIDATION_ERROR_39a3a401}, + {"VUID-VkImportFenceFdInfoKHR-handleType-01464", VALIDATION_ERROR_39c00b70}, + {"VUID-VkImportFenceFdInfoKHR-fd-01541", VALIDATION_ERROR_39c00c0a}, + {"VUID-VkImportFenceFdInfoKHR-fence-parameter", VALIDATION_ERROR_39c08801}, + {"VUID-VkImportFenceFdInfoKHR-flags-parameter", VALIDATION_ERROR_39c09001}, + {"VUID-VkImportFenceFdInfoKHR-handleType-parameter", VALIDATION_ERROR_39c09c01}, + {"VUID-VkImportFenceFdInfoKHR-pNext-pNext", VALIDATION_ERROR_39c1c40d}, + {"VUID-VkImportFenceFdInfoKHR-sType-sType", VALIDATION_ERROR_39c2b00b}, + {"VUID-VkFenceGetFdInfoKHR-handleType-01453", VALIDATION_ERROR_39e00b5a}, + {"VUID-VkFenceGetFdInfoKHR-handleType-01454", VALIDATION_ERROR_39e00b5c}, + {"VUID-VkFenceGetFdInfoKHR-fence-01455", VALIDATION_ERROR_39e00b5e}, + {"VUID-VkFenceGetFdInfoKHR-handleType-01456", VALIDATION_ERROR_39e00b60}, + {"VUID-VkFenceGetFdInfoKHR-fence-parameter", VALIDATION_ERROR_39e08801}, + {"VUID-VkFenceGetFdInfoKHR-handleType-parameter", VALIDATION_ERROR_39e09c01}, + {"VUID-VkFenceGetFdInfoKHR-pNext-pNext", VALIDATION_ERROR_39e1c40d}, + {"VUID-VkFenceGetFdInfoKHR-sType-sType", VALIDATION_ERROR_39e2b00b}, + {"VUID-vkImportFenceFdKHR-fence-01463", VALIDATION_ERROR_3a000b6e}, + {"VUID-vkImportFenceFdKHR-device-parameter", VALIDATION_ERROR_3a005601}, + {"VUID-vkImportFenceFdKHR-pImportFenceFdInfo-parameter", VALIDATION_ERROR_3a03a801}, + {"VUID-vkGetFenceFdKHR-device-parameter", VALIDATION_ERROR_3a205601}, + {"VUID-vkGetFenceFdKHR-pFd-parameter", VALIDATION_ERROR_3a216c01}, + {"VUID-vkGetFenceFdKHR-pGetFdInfo-parameter", VALIDATION_ERROR_3a239e01}, + {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-01457", VALIDATION_ERROR_3a400b62}, + {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-01459", VALIDATION_ERROR_3a400b66}, + {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-01460", VALIDATION_ERROR_3a400b68}, + {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-01461", VALIDATION_ERROR_3a400b6a}, + {"VUID-VkImportFenceWin32HandleInfoKHR-handle-01462", VALIDATION_ERROR_3a400b6c}, + {"VUID-VkImportFenceWin32HandleInfoKHR-handle-01539", VALIDATION_ERROR_3a400c06}, + {"VUID-VkImportFenceWin32HandleInfoKHR-name-01540", VALIDATION_ERROR_3a400c08}, + {"VUID-VkImportFenceWin32HandleInfoKHR-fence-parameter", VALIDATION_ERROR_3a408801}, + {"VUID-VkImportFenceWin32HandleInfoKHR-flags-parameter", VALIDATION_ERROR_3a409001}, + {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-parameter", VALIDATION_ERROR_3a409c01}, + {"VUID-VkImportFenceWin32HandleInfoKHR-pNext-pNext", VALIDATION_ERROR_3a41c40d}, + {"VUID-VkImportFenceWin32HandleInfoKHR-sType-sType", VALIDATION_ERROR_3a42b00b}, + {"VUID-VkExportFenceWin32HandleInfoKHR-handleTypes-01447", VALIDATION_ERROR_3a600b4e}, + {"VUID-VkExportFenceWin32HandleInfoKHR-pAttributes-parameter", VALIDATION_ERROR_3a60f401}, + {"VUID-VkExportFenceWin32HandleInfoKHR-sType-sType", VALIDATION_ERROR_3a62b00b}, + {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-01448", VALIDATION_ERROR_3a800b50}, + {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-01449", VALIDATION_ERROR_3a800b52}, + {"VUID-VkFenceGetWin32HandleInfoKHR-fence-01450", VALIDATION_ERROR_3a800b54}, + {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-01451", VALIDATION_ERROR_3a800b56}, + {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-01452", VALIDATION_ERROR_3a800b58}, + {"VUID-VkFenceGetWin32HandleInfoKHR-fence-parameter", VALIDATION_ERROR_3a808801}, + {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-parameter", VALIDATION_ERROR_3a809c01}, + {"VUID-VkFenceGetWin32HandleInfoKHR-pNext-pNext", VALIDATION_ERROR_3a81c40d}, + {"VUID-VkFenceGetWin32HandleInfoKHR-sType-sType", VALIDATION_ERROR_3a82b00b}, + {"VUID-vkImportFenceWin32HandleKHR-device-parameter", VALIDATION_ERROR_3aa05601}, + {"VUID-vkImportFenceWin32HandleKHR-pImportFenceWin32HandleInfo-parameter", VALIDATION_ERROR_3aa3aa01}, + {"VUID-vkGetFenceWin32HandleKHR-device-parameter", VALIDATION_ERROR_3ac05601}, + {"VUID-vkGetFenceWin32HandleKHR-pHandle-parameter", VALIDATION_ERROR_3ac17c01}, + {"VUID-vkGetFenceWin32HandleKHR-pGetWin32HandleInfo-parameter", VALIDATION_ERROR_3ac3a001}, + {"VUID-VkSemaphoreGetFdInfoKHR-handleType-01132", VALIDATION_ERROR_3ae008d8}, + {"VUID-VkSemaphoreGetFdInfoKHR-semaphore-01133", VALIDATION_ERROR_3ae008da}, + {"VUID-VkSemaphoreGetFdInfoKHR-handleType-01134", VALIDATION_ERROR_3ae008dc}, + {"VUID-VkSemaphoreGetFdInfoKHR-handleType-01135", VALIDATION_ERROR_3ae008de}, + {"VUID-VkSemaphoreGetFdInfoKHR-handleType-01136", VALIDATION_ERROR_3ae008e0}, + {"VUID-VkSemaphoreGetFdInfoKHR-handleType-parameter", VALIDATION_ERROR_3ae09c01}, + {"VUID-VkSemaphoreGetFdInfoKHR-pNext-pNext", VALIDATION_ERROR_3ae1c40d}, + {"VUID-VkSemaphoreGetFdInfoKHR-sType-sType", VALIDATION_ERROR_3ae2b00b}, + {"VUID-VkSemaphoreGetFdInfoKHR-semaphore-parameter", VALIDATION_ERROR_3ae2b801}, + {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01126", VALIDATION_ERROR_3b0008cc}, + {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01127", VALIDATION_ERROR_3b0008ce}, + {"VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-01128", VALIDATION_ERROR_3b0008d0}, + {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01129", VALIDATION_ERROR_3b0008d2}, + {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01130", VALIDATION_ERROR_3b0008d4}, + {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01131", VALIDATION_ERROR_3b0008d6}, + {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-parameter", VALIDATION_ERROR_3b009c01}, + {"VUID-VkSemaphoreGetWin32HandleInfoKHR-pNext-pNext", VALIDATION_ERROR_3b01c40d}, + {"VUID-VkSemaphoreGetWin32HandleInfoKHR-sType-sType", VALIDATION_ERROR_3b02b00b}, + {"VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-parameter", VALIDATION_ERROR_3b02b801}, + {"VUID-VkMemoryGetFdInfoKHR-handleType-00671", VALIDATION_ERROR_3b20053e}, + {"VUID-VkMemoryGetFdInfoKHR-handleType-00672", VALIDATION_ERROR_3b200540}, + {"VUID-VkMemoryGetFdInfoKHR-handleType-parameter", VALIDATION_ERROR_3b209c01}, + {"VUID-VkMemoryGetFdInfoKHR-memory-parameter", VALIDATION_ERROR_3b20c601}, + {"VUID-VkMemoryGetFdInfoKHR-pNext-pNext", VALIDATION_ERROR_3b21c40d}, + {"VUID-VkMemoryGetFdInfoKHR-sType-sType", VALIDATION_ERROR_3b22b00b}, + {"VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00662", VALIDATION_ERROR_3b40052c}, + {"VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00663", VALIDATION_ERROR_3b40052e}, + {"VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00664", VALIDATION_ERROR_3b400530}, + {"VUID-VkMemoryGetWin32HandleInfoKHR-handleType-parameter", VALIDATION_ERROR_3b409c01}, + {"VUID-VkMemoryGetWin32HandleInfoKHR-memory-parameter", VALIDATION_ERROR_3b40c601}, + {"VUID-VkMemoryGetWin32HandleInfoKHR-pNext-pNext", VALIDATION_ERROR_3b41c40d}, + {"VUID-VkMemoryGetWin32HandleInfoKHR-sType-sType", VALIDATION_ERROR_3b42b00b}, + {"VUID-VkMemoryDedicatedRequirements-sType-sType", VALIDATION_ERROR_3b62b00b}, + {"VUID-VkMemoryDedicatedAllocateInfo-commonparent", VALIDATION_ERROR_3b800009}, + {"VUID-VkMemoryDedicatedAllocateInfo-image-01432", VALIDATION_ERROR_3b800b30}, + {"VUID-VkMemoryDedicatedAllocateInfo-image-01433", VALIDATION_ERROR_3b800b32}, + {"VUID-VkMemoryDedicatedAllocateInfo-image-01434", VALIDATION_ERROR_3b800b34}, + {"VUID-VkMemoryDedicatedAllocateInfo-buffer-01435", VALIDATION_ERROR_3b800b36}, + {"VUID-VkMemoryDedicatedAllocateInfo-buffer-01436", VALIDATION_ERROR_3b800b38}, + {"VUID-VkMemoryDedicatedAllocateInfo-image-01797", VALIDATION_ERROR_3b800e0a}, + {"VUID-VkMemoryDedicatedAllocateInfo-image-01876", VALIDATION_ERROR_3b800ea8}, + {"VUID-VkMemoryDedicatedAllocateInfo-buffer-01877", VALIDATION_ERROR_3b800eaa}, + {"VUID-VkMemoryDedicatedAllocateInfo-image-01878", VALIDATION_ERROR_3b800eac}, + {"VUID-VkMemoryDedicatedAllocateInfo-buffer-01879", VALIDATION_ERROR_3b800eae}, + {"VUID-VkMemoryDedicatedAllocateInfo-buffer-parameter", VALIDATION_ERROR_3b801a01}, + {"VUID-VkMemoryDedicatedAllocateInfo-image-parameter", VALIDATION_ERROR_3b80a001}, + {"VUID-VkMemoryDedicatedAllocateInfo-sType-sType", VALIDATION_ERROR_3b82b00b}, + {"VUID-VkBufferMemoryRequirementsInfo2-buffer-parameter", VALIDATION_ERROR_3ba01a01}, + {"VUID-VkBufferMemoryRequirementsInfo2-pNext-pNext", VALIDATION_ERROR_3ba1c40d}, + {"VUID-VkBufferMemoryRequirementsInfo2-sType-sType", VALIDATION_ERROR_3ba2b00b}, + {"VUID-VkImageMemoryRequirementsInfo2-image-01589", VALIDATION_ERROR_3bc00c6a}, + {"VUID-VkImageMemoryRequirementsInfo2-image-01590", VALIDATION_ERROR_3bc00c6c}, + {"VUID-VkImageMemoryRequirementsInfo2-image-01591", VALIDATION_ERROR_3bc00c6e}, + {"VUID-VkImageMemoryRequirementsInfo2-image-01897", VALIDATION_ERROR_3bc00ed2}, + {"VUID-VkImageMemoryRequirementsInfo2-image-parameter", VALIDATION_ERROR_3bc0a001}, + {"VUID-VkImageMemoryRequirementsInfo2-pNext-pNext", VALIDATION_ERROR_3bc1c40d}, + {"VUID-VkImageMemoryRequirementsInfo2-sType-sType", VALIDATION_ERROR_3bc2b00b}, + {"VUID-VkImageSparseMemoryRequirementsInfo2-image-parameter", VALIDATION_ERROR_3be0a001}, + {"VUID-VkImageSparseMemoryRequirementsInfo2-pNext-pNext", VALIDATION_ERROR_3be1c40d}, + {"VUID-VkImageSparseMemoryRequirementsInfo2-sType-sType", VALIDATION_ERROR_3be2b00b}, + {"VUID-VkMemoryRequirements2-pNext-pNext", VALIDATION_ERROR_3c01c40d}, + {"VUID-VkMemoryRequirements2-sType-sType", VALIDATION_ERROR_3c02b00b}, + {"VUID-VkSparseImageMemoryRequirements2-pNext-pNext", VALIDATION_ERROR_3c21c40d}, + {"VUID-VkSparseImageMemoryRequirements2-sType-sType", VALIDATION_ERROR_3c22b00b}, + {"VUID-vkGetImageMemoryRequirements2-device-parameter", VALIDATION_ERROR_3c405601}, + {"VUID-vkGetImageMemoryRequirements2-pMemoryRequirements-parameter", VALIDATION_ERROR_3c41b401}, + {"VUID-vkGetImageMemoryRequirements2-pInfo-parameter", VALIDATION_ERROR_3c439c01}, + {"VUID-vkGetBufferMemoryRequirements2-device-parameter", VALIDATION_ERROR_3c605601}, + {"VUID-vkGetBufferMemoryRequirements2-pMemoryRequirements-parameter", VALIDATION_ERROR_3c61b401}, + {"VUID-vkGetBufferMemoryRequirements2-pInfo-parameter", VALIDATION_ERROR_3c639c01}, + {"VUID-vkGetImageSparseMemoryRequirements2-device-parameter", VALIDATION_ERROR_3c805601}, + {"VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirementCount-parameter", VALIDATION_ERROR_3c823601}, + {"VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirements-parameter", VALIDATION_ERROR_3c823801}, + {"VUID-vkGetImageSparseMemoryRequirements2-pInfo-parameter", VALIDATION_ERROR_3c839c01}, + {"VUID-VkPhysicalDevice16BitStorageFeatures-sType-sType", VALIDATION_ERROR_3ca2b00b}, + {"VUID-VkPhysicalDeviceVariablePointerFeatures-variablePointers-01431", VALIDATION_ERROR_3cc00b2e}, + {"VUID-VkPhysicalDeviceVariablePointerFeatures-sType-sType", VALIDATION_ERROR_3cc2b00b}, + {"VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-01526", VALIDATION_ERROR_3ce00bec}, + {"VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527", VALIDATION_ERROR_3ce00bee}, + {"VUID-VkSampleLocationsInfoEXT-sType-sType", VALIDATION_ERROR_3ce2b00b}, + {"VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-parameter", VALIDATION_ERROR_3ce3b201}, + {"VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-arraylength", VALIDATION_ERROR_3ce3b41b}, + {"VUID-VkSampleLocationsInfoEXT-pSampleLocations-parameter", VALIDATION_ERROR_3ce3b601}, + {"VUID-VkRenderPassSampleLocationsBeginInfoEXT-sType-sType", VALIDATION_ERROR_3d02b00b}, + {"VUID-VkRenderPassSampleLocationsBeginInfoEXT-pAttachmentInitialSampleLocations-parameter", VALIDATION_ERROR_3d03ba01}, + {"VUID-VkRenderPassSampleLocationsBeginInfoEXT-pPostSubpassSampleLocations-parameter", VALIDATION_ERROR_3d03e801}, + {"VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sType-sType", VALIDATION_ERROR_3d22b00b}, + {"VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sampleLocationsInfo-parameter", VALIDATION_ERROR_3d23c601}, + {"VUID-VkPhysicalDeviceSampleLocationsPropertiesEXT-sType-sType", VALIDATION_ERROR_3d42b00b}, + {"VUID-VkMultisamplePropertiesEXT-pNext-pNext", VALIDATION_ERROR_3d61c40d}, + {"VUID-VkMultisamplePropertiesEXT-sType-sType", VALIDATION_ERROR_3d62b00b}, + {"VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-physicalDevice-parameter", VALIDATION_ERROR_3d827a01}, + {"VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-samples-parameter", VALIDATION_ERROR_3d82b401}, + {"VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-pMultisampleProperties-parameter", VALIDATION_ERROR_3d83ca01}, + {"VUID-VkValidationCacheCreateInfoEXT-initialDataSize-01534", VALIDATION_ERROR_3da00bfc}, + {"VUID-VkValidationCacheCreateInfoEXT-initialDataSize-01535", VALIDATION_ERROR_3da00bfe}, + {"VUID-VkValidationCacheCreateInfoEXT-flags-zerobitmask", VALIDATION_ERROR_3da09005}, + {"VUID-VkValidationCacheCreateInfoEXT-pInitialData-parameter", VALIDATION_ERROR_3da19601}, + {"VUID-VkValidationCacheCreateInfoEXT-pNext-pNext", VALIDATION_ERROR_3da1c40d}, + {"VUID-VkValidationCacheCreateInfoEXT-sType-sType", VALIDATION_ERROR_3da2b00b}, + {"VUID-VkShaderModuleValidationCacheCreateInfoEXT-sType-sType", VALIDATION_ERROR_3dc2b00b}, + {"VUID-VkShaderModuleValidationCacheCreateInfoEXT-validationCache-parameter", VALIDATION_ERROR_3dc3c401}, + {"VUID-vkCreateValidationCacheEXT-device-parameter", VALIDATION_ERROR_3de05601}, + {"VUID-vkCreateValidationCacheEXT-pAllocator-parameter", VALIDATION_ERROR_3de0ec01}, + {"VUID-vkCreateValidationCacheEXT-pCreateInfo-parameter", VALIDATION_ERROR_3de11e01}, + {"VUID-vkCreateValidationCacheEXT-pValidationCache-parameter", VALIDATION_ERROR_3de3c201}, + {"VUID-vkGetValidationCacheDataEXT-device-parameter", VALIDATION_ERROR_3e005601}, + {"VUID-vkGetValidationCacheDataEXT-pData-parameter", VALIDATION_ERROR_3e012201}, + {"VUID-vkGetValidationCacheDataEXT-pDataSize-parameter", VALIDATION_ERROR_3e012401}, + {"VUID-vkGetValidationCacheDataEXT-validationCache-parameter", VALIDATION_ERROR_3e03c401}, + {"VUID-vkGetValidationCacheDataEXT-validationCache-parent", VALIDATION_ERROR_3e03c407}, + {"VUID-vkCmdSetSampleLocationsEXT-None-01528", VALIDATION_ERROR_3e200bf0}, + {"VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529", VALIDATION_ERROR_3e200bf2}, + {"VUID-vkCmdSetSampleLocationsEXT-variableSampleLocations-01530", VALIDATION_ERROR_3e200bf4}, + {"VUID-vkCmdSetSampleLocationsEXT-commandBuffer-parameter", VALIDATION_ERROR_3e202401}, + {"VUID-vkCmdSetSampleLocationsEXT-commandBuffer-recording", VALIDATION_ERROR_3e202413}, + {"VUID-vkCmdSetSampleLocationsEXT-commandBuffer-cmdpool", VALIDATION_ERROR_3e202415}, + {"VUID-vkCmdSetSampleLocationsEXT-pSampleLocationsInfo-parameter", VALIDATION_ERROR_3e23c801}, + {"VUID-vkDestroyValidationCacheEXT-validationCache-01537", VALIDATION_ERROR_3e400c02}, + {"VUID-vkDestroyValidationCacheEXT-validationCache-01538", VALIDATION_ERROR_3e400c04}, + {"VUID-vkDestroyValidationCacheEXT-device-parameter", VALIDATION_ERROR_3e405601}, + {"VUID-vkDestroyValidationCacheEXT-pAllocator-parameter", VALIDATION_ERROR_3e40ec01}, + {"VUID-vkDestroyValidationCacheEXT-validationCache-parameter", VALIDATION_ERROR_3e43c401}, + {"VUID-vkDestroyValidationCacheEXT-validationCache-parent", VALIDATION_ERROR_3e43c407}, + {"VUID-vkMergeValidationCachesEXT-dstCache-01536", VALIDATION_ERROR_3e600c00}, + {"VUID-vkMergeValidationCachesEXT-device-parameter", VALIDATION_ERROR_3e605601}, + {"VUID-vkMergeValidationCachesEXT-dstCache-parameter", VALIDATION_ERROR_3e606e01}, + {"VUID-vkMergeValidationCachesEXT-dstCache-parent", VALIDATION_ERROR_3e606e07}, + {"VUID-vkMergeValidationCachesEXT-pSrcCaches-parameter", VALIDATION_ERROR_3e623c01}, + {"VUID-vkMergeValidationCachesEXT-pSrcCaches-parent", VALIDATION_ERROR_3e623c07}, + {"VUID-vkMergeValidationCachesEXT-srcCacheCount-arraylength", VALIDATION_ERROR_3e62ca1b}, + {"VUID-VkAttachmentSampleLocationsEXT-attachmentIndex-01531", VALIDATION_ERROR_3e800bf6}, + {"VUID-VkAttachmentSampleLocationsEXT-sampleLocationsInfo-parameter", VALIDATION_ERROR_3e83c601}, + {"VUID-VkSubpassSampleLocationsEXT-subpassIndex-01532", VALIDATION_ERROR_3ea00bf8}, + {"VUID-VkSubpassSampleLocationsEXT-sampleLocationsInfo-parameter", VALIDATION_ERROR_3ea3c601}, + {"VUID-VkPhysicalDevicePointClippingProperties-sType-sType", VALIDATION_ERROR_3ec2b00b}, + {"VUID-VkInputAttachmentAspectReference-aspectMask-parameter", VALIDATION_ERROR_3ee00c01}, + {"VUID-VkInputAttachmentAspectReference-aspectMask-requiredbitmask", VALIDATION_ERROR_3ee00c03}, + {"VUID-VkInputAttachmentAspectReference-pCreateInfo-01568", VALIDATION_ERROR_3ee00c40}, + {"VUID-VkInputAttachmentAspectReference-None-01569", VALIDATION_ERROR_3ee00c42}, + {"VUID-VkInputAttachmentAspectReference-aspectMask-01570", VALIDATION_ERROR_3ee00c44}, + {"VUID-VkRenderPassInputAttachmentAspectCreateInfo-sType-sType", VALIDATION_ERROR_3f02b00b}, + {"VUID-VkRenderPassInputAttachmentAspectCreateInfo-aspectReferenceCount-arraylength", VALIDATION_ERROR_3f03ce1b}, + {"VUID-VkRenderPassInputAttachmentAspectCreateInfo-pAspectReferences-parameter", VALIDATION_ERROR_3f03d001}, + {"VUID-VkImageViewUsageCreateInfo-usage-01587", VALIDATION_ERROR_3f200c66}, + {"VUID-VkImageViewUsageCreateInfo-sType-sType", VALIDATION_ERROR_3f22b00b}, + {"VUID-VkImageViewUsageCreateInfo-usage-parameter", VALIDATION_ERROR_3f230601}, + {"VUID-VkImageViewUsageCreateInfo-usage-requiredbitmask", VALIDATION_ERROR_3f230603}, + {"VUID-VkPipelineTessellationDomainOriginStateCreateInfo-sType-sType", VALIDATION_ERROR_3f42b00b}, + {"VUID-VkPipelineTessellationDomainOriginStateCreateInfo-domainOrigin-parameter", VALIDATION_ERROR_3f43d201}, + {"VUID-VkImageFormatListCreateInfoKHR-viewFormatCount-01578", VALIDATION_ERROR_3f600c54}, + {"VUID-VkImageFormatListCreateInfoKHR-flags-01579", VALIDATION_ERROR_3f600c56}, + {"VUID-VkImageFormatListCreateInfoKHR-viewFormatCount-01580", VALIDATION_ERROR_3f600c58}, + {"VUID-VkImageFormatListCreateInfoKHR-sType-sType", VALIDATION_ERROR_3f62b00b}, + {"VUID-VkImageFormatListCreateInfoKHR-pViewFormats-parameter", VALIDATION_ERROR_3f63e401}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-format-01649", VALIDATION_ERROR_3f800ce2}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-format-01650", VALIDATION_ERROR_3f800ce4}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651", VALIDATION_ERROR_3f800ce6}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652", VALIDATION_ERROR_3f800ce8}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-format-01653", VALIDATION_ERROR_3f800cea}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-None-01654", VALIDATION_ERROR_3f800cec}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-01655", VALIDATION_ERROR_3f800cee}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656", VALIDATION_ERROR_3f800cf0}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657", VALIDATION_ERROR_3f800cf2}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-format-01904", VALIDATION_ERROR_3f800ee0}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-components-parameter", VALIDATION_ERROR_3f802c01}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-format-parameter", VALIDATION_ERROR_3f809201}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-pNext-pNext", VALIDATION_ERROR_3f81c40d}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-sType-sType", VALIDATION_ERROR_3f82b00b}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-parameter", VALIDATION_ERROR_3f83d401}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-parameter", VALIDATION_ERROR_3f83d601}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-parameter", VALIDATION_ERROR_3f83d801}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-yChromaOffset-parameter", VALIDATION_ERROR_3f83da01}, + {"VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-parameter", VALIDATION_ERROR_3f83dc01}, + {"VUID-VkBindImagePlaneMemoryInfo-planeAspect-01642", VALIDATION_ERROR_3fa00cd4}, + {"VUID-VkBindImagePlaneMemoryInfo-None-01643", VALIDATION_ERROR_3fa00cd6}, + {"VUID-VkBindImagePlaneMemoryInfo-sType-sType", VALIDATION_ERROR_3fa2b00b}, + {"VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter", VALIDATION_ERROR_3fa3de01}, + {"VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-01592", VALIDATION_ERROR_3fc00c70}, + {"VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType", VALIDATION_ERROR_3fc2b00b}, + {"VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter", VALIDATION_ERROR_3fc3de01}, + {"VUID-vkCreateSamplerYcbcrConversion-None-01648", VALIDATION_ERROR_3fe00ce0}, + {"VUID-vkCreateSamplerYcbcrConversion-device-parameter", VALIDATION_ERROR_3fe05601}, + {"VUID-vkCreateSamplerYcbcrConversion-pAllocator-parameter", VALIDATION_ERROR_3fe0ec01}, + {"VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter", VALIDATION_ERROR_3fe11e01}, + {"VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter", VALIDATION_ERROR_3fe3e001}, + {"VUID-VkBindBufferMemoryDeviceGroupInfo-deviceIndexCount-01606", VALIDATION_ERROR_40000c8c}, + {"VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-01607", VALIDATION_ERROR_40000c8e}, + {"VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-parameter", VALIDATION_ERROR_40013e01}, + {"VUID-VkBindBufferMemoryDeviceGroupInfo-sType-sType", VALIDATION_ERROR_4002b00b}, + {"VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01633", VALIDATION_ERROR_40200cc2}, + {"VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01634", VALIDATION_ERROR_40200cc4}, + {"VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-01635", VALIDATION_ERROR_40200cc6}, + {"VUID-VkBindImageMemoryDeviceGroupInfo-splitInstanceBindRegionCount-01636", VALIDATION_ERROR_40200cc8}, + {"VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-01637", VALIDATION_ERROR_40200cca}, + {"VUID-VkBindImageMemoryDeviceGroupInfo-offset-01638", VALIDATION_ERROR_40200ccc}, + {"VUID-VkBindImageMemoryDeviceGroupInfo-offset-01639", VALIDATION_ERROR_40200cce}, + {"VUID-VkBindImageMemoryDeviceGroupInfo-extent-01640", VALIDATION_ERROR_40200cd0}, + {"VUID-VkBindImageMemoryDeviceGroupInfo-extent-01641", VALIDATION_ERROR_40200cd2}, + {"VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-parameter", VALIDATION_ERROR_40213e01}, + {"VUID-VkBindImageMemoryDeviceGroupInfo-sType-sType", VALIDATION_ERROR_4022b00b}, + {"VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-parameter", VALIDATION_ERROR_4023fe01}, + {"VUID-vkDestroySamplerYcbcrConversion-device-parameter", VALIDATION_ERROR_40405601}, + {"VUID-vkDestroySamplerYcbcrConversion-pAllocator-parameter", VALIDATION_ERROR_4040ec01}, + {"VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parameter", VALIDATION_ERROR_4043e201}, + {"VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parent", VALIDATION_ERROR_4043e207}, + {"VUID-VkPhysicalDeviceSamplerYcbcrConversionFeatures-sType-sType", VALIDATION_ERROR_4062b00b}, + {"VUID-VkSamplerYcbcrConversionImageFormatProperties-sType-sType", VALIDATION_ERROR_4082b00b}, + {"VUID-VkSamplerYcbcrConversionInfo-sType-sType", VALIDATION_ERROR_40a2b00b}, + {"VUID-VkSamplerYcbcrConversionInfo-conversion-parameter", VALIDATION_ERROR_40a3e601}, + {"VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-sType-sType", VALIDATION_ERROR_40c2b00b}, + {"VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-globalPriority-parameter", VALIDATION_ERROR_40c3ea01}, + {"VUID-vkGetShaderInfoAMD-device-parameter", VALIDATION_ERROR_40e05601}, + {"VUID-vkGetShaderInfoAMD-pipeline-parameter", VALIDATION_ERROR_40e27c01}, + {"VUID-vkGetShaderInfoAMD-pipeline-parent", VALIDATION_ERROR_40e27c07}, + {"VUID-vkGetShaderInfoAMD-pInfo-parameter", VALIDATION_ERROR_40e39c01}, + {"VUID-vkGetShaderInfoAMD-shaderStage-parameter", VALIDATION_ERROR_40e3ec01}, + {"VUID-vkGetShaderInfoAMD-infoType-parameter", VALIDATION_ERROR_40e3ee01}, + {"VUID-vkGetShaderInfoAMD-pInfoSize-parameter", VALIDATION_ERROR_40e3f001}, + {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-01747", VALIDATION_ERROR_41200da6}, + {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-01748", VALIDATION_ERROR_41200da8}, + {"VUID-VkImportMemoryHostPointerInfoEXT-pHostPointer-01749", VALIDATION_ERROR_41200daa}, + {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-01750", VALIDATION_ERROR_41200dac}, + {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-01751", VALIDATION_ERROR_41200dae}, + {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-parameter", VALIDATION_ERROR_41209c01}, + {"VUID-VkImportMemoryHostPointerInfoEXT-sType-sType", VALIDATION_ERROR_4122b00b}, + {"VUID-VkMemoryHostPointerPropertiesEXT-pNext-pNext", VALIDATION_ERROR_4141c40d}, + {"VUID-VkMemoryHostPointerPropertiesEXT-sType-sType", VALIDATION_ERROR_4142b00b}, + {"VUID-VkPhysicalDeviceExternalMemoryHostPropertiesEXT-sType-sType", VALIDATION_ERROR_4162b00b}, + {"VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01752", VALIDATION_ERROR_41800db0}, + {"VUID-vkGetMemoryHostPointerPropertiesEXT-pHostPointer-01753", VALIDATION_ERROR_41800db2}, + {"VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01754", VALIDATION_ERROR_41800db4}, + {"VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01755", VALIDATION_ERROR_41800db6}, + {"VUID-vkGetMemoryHostPointerPropertiesEXT-device-parameter", VALIDATION_ERROR_41805601}, + {"VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-parameter", VALIDATION_ERROR_41809c01}, + {"VUID-vkGetMemoryHostPointerPropertiesEXT-pMemoryHostPointerProperties-parameter", VALIDATION_ERROR_4183f401}, + {"VUID-VkPhysicalDeviceConservativeRasterizationPropertiesEXT-sType-sType", VALIDATION_ERROR_41a2b00b}, + {"VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-extraPrimitiveOverestimationSize-01769", VALIDATION_ERROR_41c00dd2}, + {"VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-flags-zerobitmask", VALIDATION_ERROR_41c09005}, + {"VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-sType-sType", VALIDATION_ERROR_41c2b00b}, + {"VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-conservativeRasterizationMode-parameter", VALIDATION_ERROR_41c3f801}, + {"VUID-vkCmdWriteBufferMarkerAMD-commonparent", VALIDATION_ERROR_41e00009}, + {"VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01798", VALIDATION_ERROR_41e00e0c}, + {"VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01799", VALIDATION_ERROR_41e00e0e}, + {"VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01800", VALIDATION_ERROR_41e00e10}, + {"VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01801", VALIDATION_ERROR_41e00e12}, + {"VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-parameter", VALIDATION_ERROR_41e02401}, + {"VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-recording", VALIDATION_ERROR_41e02413}, + {"VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-cmdpool", VALIDATION_ERROR_41e02415}, + {"VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-parameter", VALIDATION_ERROR_41e06c01}, + {"VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-parameter", VALIDATION_ERROR_41e28401}, + {"VUID-VkDescriptorSetLayoutSupport-pNext-pNext", VALIDATION_ERROR_4201c40d}, + {"VUID-VkDescriptorSetLayoutSupport-sType-sType", VALIDATION_ERROR_4202b00b}, + {"VUID-VkDeviceQueueInfo2-queueFamilyIndex-01842", VALIDATION_ERROR_42200e64}, + {"VUID-VkDeviceQueueInfo2-queueIndex-01843", VALIDATION_ERROR_42200e66}, + {"VUID-VkDeviceQueueInfo2-flags-parameter", VALIDATION_ERROR_42209001}, + {"VUID-VkDeviceQueueInfo2-flags-requiredbitmask", VALIDATION_ERROR_42209003}, + {"VUID-VkDeviceQueueInfo2-pNext-pNext", VALIDATION_ERROR_4221c40d}, + {"VUID-VkDeviceQueueInfo2-sType-sType", VALIDATION_ERROR_4222b00b}, + {"VUID-VkPhysicalDeviceMaintenance3Properties-sType-sType", VALIDATION_ERROR_4242b00b}, + {"VUID-VkPhysicalDeviceProtectedMemoryFeatures-sType-sType", VALIDATION_ERROR_4262b00b}, + {"VUID-VkPhysicalDeviceProtectedMemoryProperties-sType-sType", VALIDATION_ERROR_4282b00b}, + {"VUID-VkPhysicalDeviceShaderDrawParameterFeatures-sType-sType", VALIDATION_ERROR_42a2b00b}, + {"VUID-VkPhysicalDeviceSubgroupProperties-sType-sType", VALIDATION_ERROR_42c2b00b}, + {"VUID-VkProtectedSubmitInfo-protectedSubmit-01816", VALIDATION_ERROR_42e00e30}, + {"VUID-VkProtectedSubmitInfo-protectedSubmit-01817", VALIDATION_ERROR_42e00e32}, + {"VUID-VkProtectedSubmitInfo-protectedSubmit-01818", VALIDATION_ERROR_42e00e34}, + {"VUID-VkProtectedSubmitInfo-pNext-01819", VALIDATION_ERROR_42e00e36}, + {"VUID-VkProtectedSubmitInfo-sType-sType", VALIDATION_ERROR_42e2b00b}, + {"VUID-vkEnumerateInstanceVersion-pApiVersion-parameter", VALIDATION_ERROR_43040001}, + {"VUID-vkGetDescriptorSetLayoutSupport-device-parameter", VALIDATION_ERROR_43205601}, + {"VUID-vkGetDescriptorSetLayoutSupport-pCreateInfo-parameter", VALIDATION_ERROR_43211e01}, + {"VUID-vkGetDescriptorSetLayoutSupport-pSupport-parameter", VALIDATION_ERROR_43240201}, + {"VUID-vkGetDeviceQueue2-device-parameter", VALIDATION_ERROR_43405601}, + {"VUID-vkGetDeviceQueue2-pQueue-parameter", VALIDATION_ERROR_4341fc01}, + {"VUID-vkGetDeviceQueue2-pQueueInfo-parameter", VALIDATION_ERROR_43440401}, + {"VUID-VkDebugUtilsObjectNameInfoEXT-objectType-01905", VALIDATION_ERROR_43600ee2}, + {"VUID-VkDebugUtilsObjectNameInfoEXT-objectHandle-01906", VALIDATION_ERROR_43600ee4}, + {"VUID-VkDebugUtilsObjectNameInfoEXT-objectHandle-01907", VALIDATION_ERROR_43600ee6}, + {"VUID-VkDebugUtilsObjectNameInfoEXT-objectType-parameter", VALIDATION_ERROR_4360da01}, + {"VUID-VkDebugUtilsObjectNameInfoEXT-pNext-pNext", VALIDATION_ERROR_4361c40d}, + {"VUID-VkDebugUtilsObjectNameInfoEXT-pObjectName-parameter", VALIDATION_ERROR_4361ce01}, + {"VUID-VkDebugUtilsObjectNameInfoEXT-sType-sType", VALIDATION_ERROR_4362b00b}, + {"VUID-VkDebugUtilsObjectTagInfoEXT-objectType-01908", VALIDATION_ERROR_43800ee8}, + {"VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01909", VALIDATION_ERROR_43800eea}, + {"VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01910", VALIDATION_ERROR_43800eec}, + {"VUID-VkDebugUtilsObjectTagInfoEXT-objectType-parameter", VALIDATION_ERROR_4380da01}, + {"VUID-VkDebugUtilsObjectTagInfoEXT-pNext-pNext", VALIDATION_ERROR_4381c40d}, + {"VUID-VkDebugUtilsObjectTagInfoEXT-pTag-parameter", VALIDATION_ERROR_43825a01}, + {"VUID-VkDebugUtilsObjectTagInfoEXT-sType-sType", VALIDATION_ERROR_4382b00b}, + {"VUID-VkDebugUtilsObjectTagInfoEXT-tagSize-arraylength", VALIDATION_ERROR_4382f41b}, + {"VUID-VkDebugUtilsLabelEXT-pNext-pNext", VALIDATION_ERROR_43a1c40d}, + {"VUID-VkDebugUtilsLabelEXT-sType-sType", VALIDATION_ERROR_43a2b00b}, + {"VUID-VkDebugUtilsLabelEXT-pLabelName-parameter", VALIDATION_ERROR_43a40801}, + {"VUID-VkDebugUtilsMessengerCallbackDataEXT-flags-zerobitmask", VALIDATION_ERROR_43c09005}, + {"VUID-VkDebugUtilsMessengerCallbackDataEXT-objectCount-arraylength", VALIDATION_ERROR_43c0d61b}, + {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessage-parameter", VALIDATION_ERROR_43c1b801}, + {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pNext-pNext", VALIDATION_ERROR_43c1c40d}, + {"VUID-VkDebugUtilsMessengerCallbackDataEXT-sType-sType", VALIDATION_ERROR_43c2b00b}, + {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessageIdName-parameter", VALIDATION_ERROR_43c42201}, + {"VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-01914", VALIDATION_ERROR_43e00ef4}, + {"VUID-VkDebugUtilsMessengerCreateInfoEXT-flags-zerobitmask", VALIDATION_ERROR_43e09005}, + {"VUID-VkDebugUtilsMessengerCreateInfoEXT-sType-sType", VALIDATION_ERROR_43e2b00b}, + {"VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-parameter", VALIDATION_ERROR_43e40a01}, + {"VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-requiredbitmask", VALIDATION_ERROR_43e40a03}, + {"VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-parameter", VALIDATION_ERROR_43e40c01}, + {"VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-requiredbitmask", VALIDATION_ERROR_43e40c03}, + {"VUID-vkCreateDebugUtilsMessengerEXT-instance-parameter", VALIDATION_ERROR_4400bc01}, + {"VUID-vkCreateDebugUtilsMessengerEXT-pAllocator-parameter", VALIDATION_ERROR_4400ec01}, + {"VUID-vkCreateDebugUtilsMessengerEXT-pCreateInfo-parameter", VALIDATION_ERROR_44011e01}, + {"VUID-vkCreateDebugUtilsMessengerEXT-pMessenger-parameter", VALIDATION_ERROR_44041001}, + {"VUID-vkSubmitDebugUtilsMessageEXT-instance-parameter", VALIDATION_ERROR_4420bc01}, + {"VUID-vkSubmitDebugUtilsMessageEXT-messageSeverity-parameter", VALIDATION_ERROR_44240a01}, + {"VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-parameter", VALIDATION_ERROR_44241201}, + {"VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-requiredbitmask", VALIDATION_ERROR_44241203}, + {"VUID-vkSubmitDebugUtilsMessageEXT-pCallbackData-parameter", VALIDATION_ERROR_44242801}, + {"VUID-VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT-sType-sType", VALIDATION_ERROR_4442b00b}, + {"VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-sType-sType", VALIDATION_ERROR_4462b00b}, + {"VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-vertexBindingDivisorCount-arraylength", VALIDATION_ERROR_4464141b}, + {"VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-pVertexBindingDivisors-parameter", VALIDATION_ERROR_44641601}, + {"VUID-VkExternalFormatANDROID-externalFormat-01894", VALIDATION_ERROR_44800ecc}, + {"VUID-VkExternalFormatANDROID-sType-sType", VALIDATION_ERROR_4482b00b}, + {"VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01880", VALIDATION_ERROR_44a00eb0}, + {"VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881", VALIDATION_ERROR_44a00eb2}, + {"VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-parameter", VALIDATION_ERROR_44a01a01}, + {"VUID-VkImportAndroidHardwareBufferInfoANDROID-sType-sType", VALIDATION_ERROR_44a2b00b}, + {"VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-handleTypes-01882", VALIDATION_ERROR_44c00eb4}, + {"VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-01883", VALIDATION_ERROR_44c00eb6}, + {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01912", VALIDATION_ERROR_44e00ef0}, + {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01913", VALIDATION_ERROR_44e00ef2}, + {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-parameter", VALIDATION_ERROR_44e02401}, + {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-recording", VALIDATION_ERROR_44e02413}, + {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-cmdpool", VALIDATION_ERROR_44e02415}, + {"VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01915", VALIDATION_ERROR_45000ef6}, + {"VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01916", VALIDATION_ERROR_45000ef8}, + {"VUID-vkDestroyDebugUtilsMessengerEXT-instance-parameter", VALIDATION_ERROR_4500bc01}, + {"VUID-vkDestroyDebugUtilsMessengerEXT-pAllocator-parameter", VALIDATION_ERROR_4500ec01}, + {"VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parameter", VALIDATION_ERROR_45042601}, + {"VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent", VALIDATION_ERROR_45042607}, + {"VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-01884", VALIDATION_ERROR_45200eb8}, + {"VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-parameter", VALIDATION_ERROR_45201a01}, + {"VUID-vkGetAndroidHardwareBufferPropertiesANDROID-device-parameter", VALIDATION_ERROR_45205601}, + {"VUID-vkGetAndroidHardwareBufferPropertiesANDROID-pProperties-parameter", VALIDATION_ERROR_4521f401}, + {"VUID-vkQueueEndDebugUtilsLabelEXT-None-01911", VALIDATION_ERROR_45400eee}, + {"VUID-vkQueueEndDebugUtilsLabelEXT-queue-parameter", VALIDATION_ERROR_45429c01}, + {"VUID-VkAndroidHardwareBufferUsageANDROID-sType-sType", VALIDATION_ERROR_4562b00b}, + {"VUID-vkGetMemoryAndroidHardwareBufferANDROID-device-parameter", VALIDATION_ERROR_45a05601}, + {"VUID-vkGetMemoryAndroidHardwareBufferANDROID-pBuffer-parameter", VALIDATION_ERROR_45a10001}, + {"VUID-vkGetMemoryAndroidHardwareBufferANDROID-pInfo-parameter", VALIDATION_ERROR_45a39c01}, + {"VUID-VkAndroidHardwareBufferFormatPropertiesANDROID-sType-sType", VALIDATION_ERROR_45c2b00b}, + {"VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-parameter", VALIDATION_ERROR_45e02401}, + {"VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-recording", VALIDATION_ERROR_45e02413}, + {"VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-cmdpool", VALIDATION_ERROR_45e02415}, + {"VUID-vkCmdBeginDebugUtilsLabelEXT-pLabelInfo-parameter", VALIDATION_ERROR_45e42401}, + {"VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-parameter", VALIDATION_ERROR_46002401}, + {"VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-recording", VALIDATION_ERROR_46002413}, + {"VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-cmdpool", VALIDATION_ERROR_46002415}, + {"VUID-vkCmdInsertDebugUtilsLabelEXT-pLabelInfo-parameter", VALIDATION_ERROR_46042401}, + {"VUID-vkQueueBeginDebugUtilsLabelEXT-queue-parameter", VALIDATION_ERROR_46229c01}, + {"VUID-vkQueueBeginDebugUtilsLabelEXT-pLabelInfo-parameter", VALIDATION_ERROR_46242401}, + {"VUID-vkQueueInsertDebugUtilsLabelEXT-queue-parameter", VALIDATION_ERROR_46429c01}, + {"VUID-vkQueueInsertDebugUtilsLabelEXT-pLabelInfo-parameter", VALIDATION_ERROR_46442401}, + {"VUID-vkSetDebugUtilsObjectNameEXT-device-parameter", VALIDATION_ERROR_46605601}, + {"VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-parameter", VALIDATION_ERROR_4661c201}, + {"VUID-vkSetDebugUtilsObjectTagEXT-device-parameter", VALIDATION_ERROR_46805601}, + {"VUID-vkSetDebugUtilsObjectTagEXT-pTagInfo-parameter", VALIDATION_ERROR_46825c01}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-bindingCount-03002", VALIDATION_ERROR_46a01774}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-flags-03003", VALIDATION_ERROR_46a01776}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-03004", VALIDATION_ERROR_46a01778}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUniformBufferUpdateAfterBind-03005", VALIDATION_ERROR_46a0177a}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingSampledImageUpdateAfterBind-03006", VALIDATION_ERROR_46a0177c}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageImageUpdateAfterBind-03007", VALIDATION_ERROR_46a0177e}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageBufferUpdateAfterBind-03008", VALIDATION_ERROR_46a01780}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUniformTexelBufferUpdateAfterBind-03009", VALIDATION_ERROR_46a01782}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageTexelBufferUpdateAfterBind-03010", VALIDATION_ERROR_46a01784}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-None-03011", VALIDATION_ERROR_46a01786}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUpdateUnusedWhilePending-03012", VALIDATION_ERROR_46a01788}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingPartiallyBound-03013", VALIDATION_ERROR_46a0178a}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingVariableDescriptorCount-03014", VALIDATION_ERROR_46a0178c}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-03015", VALIDATION_ERROR_46a0178e}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-sType-sType", VALIDATION_ERROR_46a2b00b}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-parameter", VALIDATION_ERROR_46a42a01}, + {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-requiredbitmask", VALIDATION_ERROR_46a42a03}, + {"VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-descriptorSetCount-03045", VALIDATION_ERROR_46c017ca}, + {"VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-pSetLayouts-03046", VALIDATION_ERROR_46c017cc}, + {"VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-sType-sType", VALIDATION_ERROR_46c2b00b}, + {"VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-pDescriptorCounts-parameter", VALIDATION_ERROR_46c42c01}, + {"VUID-VkDescriptorSetVariableDescriptorCountLayoutSupportEXT-sType-sType", VALIDATION_ERROR_46e2b00b}, + {"VUID-VkPhysicalDeviceDescriptorIndexingFeaturesEXT-sType-sType", VALIDATION_ERROR_4702b00b}, + {"VUID-VkPhysicalDeviceDescriptorIndexingPropertiesEXT-sType-sType", VALIDATION_ERROR_4722b00b}, + {"VUID-VkPhysicalDeviceShaderCorePropertiesAMD-sType-sType", VALIDATION_ERROR_4742b00b}, + {"VUID-VkVertexInputBindingDivisorDescriptionEXT-binding-01869", VALIDATION_ERROR_47600e9a}, + {"VUID-VkVertexInputBindingDivisorDescriptionEXT-divisor-01870", VALIDATION_ERROR_47600e9c}, + {"VUID-VkVertexInputBindingDivisorDescriptionEXT-inputRate-01871", VALIDATION_ERROR_47600e9e}, }; diff -Nru vulkan-1.1.70+dfsg1/layers/windows/VkLayer_core_validation.json vulkan-1.1.73+dfsg/layers/windows/VkLayer_core_validation.json --- vulkan-1.1.70+dfsg1/layers/windows/VkLayer_core_validation.json 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/windows/VkLayer_core_validation.json 2018-04-27 11:24:19.000000000 +0000 @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_core_validation", "type": "GLOBAL", "library_path": ".\\VkLayer_core_validation.dll", - "api_version": "1.1.70", + "api_version": "1.1.73", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff -Nru vulkan-1.1.70+dfsg1/layers/windows/VkLayer_object_tracker.json vulkan-1.1.73+dfsg/layers/windows/VkLayer_object_tracker.json --- vulkan-1.1.70+dfsg1/layers/windows/VkLayer_object_tracker.json 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/windows/VkLayer_object_tracker.json 2018-04-27 11:24:19.000000000 +0000 @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_object_tracker", "type": "GLOBAL", "library_path": ".\\VkLayer_object_tracker.dll", - "api_version": "1.1.70", + "api_version": "1.1.73", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff -Nru vulkan-1.1.70+dfsg1/layers/windows/VkLayer_parameter_validation.json vulkan-1.1.73+dfsg/layers/windows/VkLayer_parameter_validation.json --- vulkan-1.1.70+dfsg1/layers/windows/VkLayer_parameter_validation.json 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/windows/VkLayer_parameter_validation.json 2018-04-27 11:24:19.000000000 +0000 @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_parameter_validation", "type": "GLOBAL", "library_path": ".\\VkLayer_parameter_validation.dll", - "api_version": "1.1.70", + "api_version": "1.1.73", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff -Nru vulkan-1.1.70+dfsg1/layers/windows/VkLayer_standard_validation.json vulkan-1.1.73+dfsg/layers/windows/VkLayer_standard_validation.json --- vulkan-1.1.70+dfsg1/layers/windows/VkLayer_standard_validation.json 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/windows/VkLayer_standard_validation.json 2018-04-27 11:24:19.000000000 +0000 @@ -3,7 +3,7 @@ "layer": { "name": "VK_LAYER_LUNARG_standard_validation", "type": "GLOBAL", - "api_version": "1.1.70", + "api_version": "1.1.73", "implementation_version": "1", "description": "LunarG Standard Validation", "component_layers": [ diff -Nru vulkan-1.1.70+dfsg1/layers/windows/VkLayer_threading.json vulkan-1.1.73+dfsg/layers/windows/VkLayer_threading.json --- vulkan-1.1.70+dfsg1/layers/windows/VkLayer_threading.json 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/windows/VkLayer_threading.json 2018-04-27 11:24:19.000000000 +0000 @@ -4,7 +4,7 @@ "name": "VK_LAYER_GOOGLE_threading", "type": "GLOBAL", "library_path": ".\\VkLayer_threading.dll", - "api_version": "1.1.70", + "api_version": "1.1.73", "implementation_version": "1", "description": "Google Validation Layer", "instance_extensions": [ diff -Nru vulkan-1.1.70+dfsg1/layers/windows/VkLayer_unique_objects.json vulkan-1.1.73+dfsg/layers/windows/VkLayer_unique_objects.json --- vulkan-1.1.70+dfsg1/layers/windows/VkLayer_unique_objects.json 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/layers/windows/VkLayer_unique_objects.json 2018-04-27 11:24:19.000000000 +0000 @@ -4,7 +4,7 @@ "name": "VK_LAYER_GOOGLE_unique_objects", "type": "GLOBAL", "library_path": ".\\VkLayer_unique_objects.dll", - "api_version": "1.1.70", + "api_version": "1.1.73", "implementation_version": "1", "description": "Google Validation Layer" } diff -Nru vulkan-1.1.70+dfsg1/libs/vkjson/README.md vulkan-1.1.73+dfsg/libs/vkjson/README.md --- vulkan-1.1.70+dfsg1/libs/vkjson/README.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/libs/vkjson/README.md 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,13 @@ +### Android + +vkjson_info for Android is built as an executable for devices with root access. + +To use, simply push it to the device and run it: + + ./build_all.sh + adb push obj/local//vkjson_info /data/tmp/ + adb shell /data/tmp/vkjson_info + +The resulting json file will be found in: + + /sdcard/Android/.json \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/loader/asm_offset.c vulkan-1.1.73+dfsg/loader/asm_offset.c --- vulkan-1.1.70+dfsg1/loader/asm_offset.c 2018-03-08 07:03:43.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/asm_offset.c 2018-04-27 11:24:19.000000000 +0000 @@ -1,7 +1,7 @@ /* - * Copyright (c) 2017 The Khronos Group Inc. - * Copyright (c) 2017 Valve Corporation - * Copyright (c) 2017 LunarG, Inc. + * Copyright (c) 2017-2018 The Khronos Group Inc. + * Copyright (c) 2017-2018 Valve Corporation + * Copyright (c) 2017-2018 LunarG, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,29 +49,6 @@ return 1; } - struct loader_instance instance; - size_t hash_offset = ((size_t) &instance.phys_dev_ext_disp_hash) - ((size_t) &instance); - - struct loader_instance_dispatch_table disp; - size_t phys_dev_offset_dispatch = ((size_t) &disp.phys_dev_ext) - ((size_t) &disp); - - struct loader_physical_device_tramp phys_dev_tramp; - size_t phys_dev_offset_tramp = ((size_t) &phys_dev_tramp.phys_dev) - ((size_t) &phys_dev_tramp); - - struct loader_physical_device_term phys_dev_term; - size_t icd_term_offset = ((size_t) &phys_dev_term.this_icd_term) - ((size_t) &phys_dev_term); - size_t phys_dev_offset_term = ((size_t) &phys_dev_term.phys_dev) - ((size_t) &phys_dev_term); - - struct loader_icd_term icd_term; - size_t instance_offset = ((size_t) &icd_term.this_instance) - ((size_t) &icd_term); - size_t dispatch_offset = ((size_t) &icd_term.phys_dev_ext) - ((size_t) &icd_term); - - struct loader_dispatch_hash_entry hash; - size_t func_name_offset = ((size_t) &hash.func_name) - ((size_t) &hash); - - struct loader_dev_dispatch_table dev_disp; - size_t dev_disp_offset = ((size_t) &dev_disp.ext_dispatch) - ((size_t) &dev_disp); - struct ValueInfo values[] = { { .name = "VK_DEBUG_REPORT_ERROR_BIT_EXT", .value = (size_t) VK_DEBUG_REPORT_ERROR_BIT_EXT, .comment = "The numerical value of the enum value 'VK_DEBUG_REPORT_ERROR_BIT_EXT'" }, @@ -79,23 +56,23 @@ .comment = "The size of a pointer" }, { .name = "HASH_SIZE", .value = sizeof(struct loader_dispatch_hash_entry), .comment = "The size of a 'loader_dispatch_hash_entry' struct" }, - { .name = "HASH_OFFSET_INSTANCE", .value = hash_offset, + { .name = "HASH_OFFSET_INSTANCE", .value = offsetof(struct loader_instance, phys_dev_ext_disp_hash), .comment = "The offset of 'phys_dev_ext_disp_hash' within a 'loader_instance' struct" }, - { .name = "PHYS_DEV_OFFSET_INST_DISPATCH", .value = phys_dev_offset_dispatch, + { .name = "PHYS_DEV_OFFSET_INST_DISPATCH", .value = offsetof(struct loader_instance_dispatch_table, phys_dev_ext), .comment = "The offset of 'phys_dev_ext' within in 'loader_instance_dispatch_table' struct" }, - { .name = "PHYS_DEV_OFFSET_PHYS_DEV_TRAMP", .value = phys_dev_offset_tramp, + { .name = "PHYS_DEV_OFFSET_PHYS_DEV_TRAMP", .value = offsetof(struct loader_physical_device_tramp, phys_dev), .comment = "The offset of 'phys_dev' within a 'loader_physical_device_tramp' struct" }, - { .name = "ICD_TERM_OFFSET_PHYS_DEV_TERM", .value = icd_term_offset, + { .name = "ICD_TERM_OFFSET_PHYS_DEV_TERM", .value = offsetof(struct loader_physical_device_term, this_icd_term), .comment = "The offset of 'this_icd_term' within a 'loader_physical_device_term' struct" }, - { .name = "PHYS_DEV_OFFSET_PHYS_DEV_TERM", .value = phys_dev_offset_term, + { .name = "PHYS_DEV_OFFSET_PHYS_DEV_TERM", .value = offsetof(struct loader_physical_device_term, phys_dev), .comment = "The offset of 'phys_dev' within a 'loader_physical_device_term' struct" }, - { .name = "INSTANCE_OFFSET_ICD_TERM", .value = instance_offset, + { .name = "INSTANCE_OFFSET_ICD_TERM", .value = offsetof(struct loader_icd_term, this_instance), .comment = "The offset of 'this_instance' within a 'loader_icd_term' struct" }, - { .name = "DISPATCH_OFFSET_ICD_TERM", .value = dispatch_offset, + { .name = "DISPATCH_OFFSET_ICD_TERM", .value = offsetof(struct loader_icd_term, phys_dev_ext), .comment = "The offset of 'phys_dev_ext' within a 'loader_icd_term' struct" }, - { .name = "FUNC_NAME_OFFSET_HASH", .value = func_name_offset, + { .name = "FUNC_NAME_OFFSET_HASH", .value = offsetof(struct loader_dispatch_hash_entry, func_name), .comment = "The offset of 'func_name' within a 'loader_dispatch_hash_entry' struct" }, - { .name = "EXT_OFFSET_DEVICE_DISPATCH", .value = dev_disp_offset, + { .name = "EXT_OFFSET_DEVICE_DISPATCH", .value = offsetof(struct loader_dev_dispatch_table, ext_dispatch), .comment = "The offset of 'ext_dispatch' within a 'loader_dev_dispatch_table' struct" }, }; diff -Nru vulkan-1.1.70+dfsg1/loader/CMakeLists.txt vulkan-1.1.73+dfsg/loader/CMakeLists.txt --- vulkan-1.1.70+dfsg1/loader/CMakeLists.txt 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/CMakeLists.txt 2018-04-27 11:24:19.000000000 +0000 @@ -49,6 +49,8 @@ add_definitions(-DVK_USE_PLATFORM_MIR_KHR) include_directories(${MIR_INCLUDE_DIR}) endif() +elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + add_definitions(-DVK_USE_PLATFORM_MACOS_MVK) else() message(FATAL_ERROR "Unsupported Platform!") endif() @@ -110,6 +112,11 @@ set(OPT_LOADER_SRCS ${OPT_LOADER_SRCS} unknown_ext_chain.c) add_custom_target(loader_asm_gen_files) endif() +elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + # For MacOS, use the C code and force the compiler's tail-call optimization instead of using assembly code. + set(OPT_LOADER_SRCS ${OPT_LOADER_SRCS} unknown_ext_chain.c) + set_source_files_properties(${OPT_LOADER_SRCS} PROPERTIES COMPILE_FLAGS -O) + add_custom_target(loader_asm_gen_files) # This causes no assembly files to be generated. else() enable_language(ASM-ATT) set(CMAKE_ASM-ATT_COMPILE_FLAGS "${CMAKE_ASM-ATT_COMPILE_FLAGS} $ENV{ASFLAGS}") @@ -211,6 +218,7 @@ COMMAND xcopy /Y /I ${COPY_SRC_PATH} ${COPY_DST_TEST_PATH}) else() + # Linux and MacOS set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith") # Clang (and not gcc) warns about redefining a typedef with the same types, so disable that warning. @@ -225,21 +233,75 @@ set_target_properties(${API_LOWERCASE} PROPERTIES SOVERSION "1" VERSION "1.1.${vk_header_version}") target_link_libraries(${API_LOWERCASE} -ldl -lpthread -lm) + if(APPLE) + find_library(COREFOUNDATION_LIBRARY NAMES CoreFoundation) + target_link_libraries(${API_LOWERCASE} "-framework CoreFoundation") + + # Build vulkan.framework + set(FRAMEWORK_HEADERS + ${PROJECT_SOURCE_DIR}/include/vulkan/vk_icd.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vk_layer.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vk_platform.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vk_sdk_platform.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan_android.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan_core.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan_ios.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan_macos.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan_mir.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan_vi.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan_wayland.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan_win32.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan_xcb.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan_xlib.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan_xlib_xrandr.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan.h + ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan.hpp + ) + add_library(vulkan-framework SHARED ${NORMAL_LOADER_SRCS} ${OPT_LOADER_SRCS} ${FRAMEWORK_HEADERS}) + add_dependencies(vulkan-framework generate_helper_files loader_gen_files loader_asm_gen_files) + target_compile_definitions(vulkan-framework PUBLIC -DLOADER_DYNAMIC_LIB) + target_link_libraries(vulkan-framework -ldl -lpthread -lm "-framework CoreFoundation") + + # The FRAMEWORK_VERSION needs to be "A" here so that Xcode code-signing works when + # a user adds their framework to an Xcode project and does "Sign on Copy". + # It would have been nicer to use "1" to denote Vulkan 1. + # Although Apple docs say that a framework version does not have to be "A", + # this part of the Apple toolchain expects it. + # https://forums.developer.apple.com/thread/65963 + set_target_properties(vulkan-framework PROPERTIES + OUTPUT_NAME vulkan + FRAMEWORK TRUE + FRAMEWORK_VERSION A + VERSION "1.1.${vk_header_version}" # "current version" + SOVERSION "1.0.0" # "compatibility version" + MACOSX_FRAMEWORK_IDENTIFIER com.lunarg.vulkanFramework + PUBLIC_HEADER "${FRAMEWORK_HEADERS}" + ) + install(TARGETS vulkan-framework + PUBLIC_HEADER DESTINATION vulkan + FRAMEWORK DESTINATION loader + ) + endif(APPLE) + if(INSTALL_LVL_FILES) install(TARGETS ${API_LOWERCASE} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() - # Generate pkg-config file. - include(FindPkgConfig QUIET) - if(PKG_CONFIG_FOUND) - set(VK_API_VERSION "1.1.${vk_header_version}") - foreach(LIB ${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES} ${PLATFORM_LIBS}) - set(PRIVATE_LIBS "${PRIVATE_LIBS} -l${LIB}") - endforeach() - configure_file("vulkan.pc.in" "vulkan.pc" @ONLY) - if(INSTALL_LVL_FILES) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/vulkan.pc" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") + if(NOT APPLE) + # Generate pkg-config file. + include(FindPkgConfig QUIET) + if(PKG_CONFIG_FOUND) + set(VK_API_VERSION "1.1.${vk_header_version}") + foreach(LIB ${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES} ${PLATFORM_LIBS}) + set(PRIVATE_LIBS "${PRIVATE_LIBS} -l${LIB}") + endforeach() + configure_file("vulkan.pc.in" "vulkan.pc" @ONLY) + if(INSTALL_LVL_FILES) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/vulkan.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") + endif() endif() endif() endif() + + diff -Nru vulkan-1.1.70+dfsg1/loader/extension_manual.h vulkan-1.1.73+dfsg/loader/extension_manual.h --- vulkan-1.1.70+dfsg1/loader/extension_manual.h 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/extension_manual.h 2018-04-27 11:24:19.000000000 +0000 @@ -25,14 +25,6 @@ // These functions, for whatever reason, require more complex changes than // can easily be automatically generated. -/*VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDeviceGroupsKHR( - VkInstance instance, uint32_t *pPhysicalDeviceGroupCount, - VkPhysicalDeviceGroupPropertiesKHR *pPhysicalDeviceGroupProperties); - -VKAPI_ATTR VkResult VKAPI_CALL terminator_EnumeratePhysicalDeviceGroupsKHR( - VkInstance instance, uint32_t *pPhysicalDeviceGroupCount, - VkPhysicalDeviceGroupPropertiesKHR *pPhysicalDeviceGroupProperties);*/ - VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV( VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, diff -Nru vulkan-1.1.70+dfsg1/loader/gpa_helper.h vulkan-1.1.73+dfsg/loader/gpa_helper.h --- vulkan-1.1.70+dfsg1/loader/gpa_helper.h 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/gpa_helper.h 2018-04-27 11:24:19.000000000 +0000 @@ -186,6 +186,9 @@ if (!strcmp(funcName, "vkCreateSamplerYcbcrConversion")) return (PFN_vkVoidFunction)vkCreateSamplerYcbcrConversion; if (!strcmp(funcName, "vkDestroySamplerYcbcrConversion")) return (PFN_vkVoidFunction)vkDestroySamplerYcbcrConversion; if (!strcmp(funcName, "vkGetDescriptorSetLayoutSupport")) return (PFN_vkVoidFunction)vkGetDescriptorSetLayoutSupport; + if (!strcmp(funcName, "vkCreateDescriptorUpdateTemplate")) return (PFN_vkCreateDescriptorUpdateTemplate)vkCreateDescriptorUpdateTemplate; + if (!strcmp(funcName, "vkDestroyDescriptorUpdateTemplate")) return (PFN_vkDestroyDescriptorUpdateTemplate)vkDestroyDescriptorUpdateTemplate; + if (!strcmp(funcName, "vkUpdateDescriptorSetWithTemplate")) return (PFN_vkUpdateDescriptorSetWithTemplate)vkUpdateDescriptorSetWithTemplate; // Instance extensions void *addr; diff -Nru vulkan-1.1.70+dfsg1/loader/LoaderAndLayerInterface.md vulkan-1.1.73+dfsg/loader/LoaderAndLayerInterface.md --- vulkan-1.1.70+dfsg1/loader/LoaderAndLayerInterface.md 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/LoaderAndLayerInterface.md 2018-04-27 11:24:19.000000000 +0000 @@ -55,7 +55,7 @@ ![High Level View of Loader](./images/high_level_loader.png) The general concepts in this document are applicable to the loaders available -for Windows, Linux and Android based systems. +for Windows, Linux, Android and MacOS based systems. #### Who Should Read This Document @@ -293,7 +293,7 @@ ##### Vulkan Direct Exports -The loader library on Windows, Linux and Android will export all core Vulkan +The loader library on Windows, Linux, Android and MacOS will export all core Vulkan and all appropriate Window System Interface (WSI) extensions. This is done to make it simpler to get started with Vulkan development. When an application links directly to the loader library in this way, the Vulkan calls are simple @@ -305,7 +305,8 @@ ###### Dynamic Linking The loader is ordinarily distributed as a dynamic library (.dll on Windows or -.so on Linux) which gets installed to the system path for dynamic libraries. +.so on Linux or .dylib on MacOS) which gets installed to the system path +for dynamic libraries. Linking to the dynamic library is generally the preferred method of linking to the loader, as doing so allows the loader to be updated for bug fixes and improvements. Furthermore, the dynamic library is generally installed to Windows @@ -364,8 +365,8 @@ ![Instance Call Chain](./images/loader_instance_chain.png) This is also how a Vulkan Device function call chain looks if you query it -using `vkGetInstanceProcAddr`. On the otherhand, a Device -function doesn't need to worry about the broadcast becuase it knows specifically +using `vkGetInstanceProcAddr`. On the other hand, a Device +function doesn't need to worry about the broadcast because it knows specifically which associated ICD and which associated Physical Device the call should terminate at. Because of this, the loader doesn't need to get involved between any enabled layers and the ICD. Thus, if you used a loader-exported Vulkan @@ -416,11 +417,12 @@ version of the loader with the same name can be found in the windows/sysWOW64 directory). -For Linux, shared libraries are versioned based on a suffix. Thus, the ABI +For Linux and MacOS, shared libraries are versioned based on a suffix. Thus, the ABI number is not encoded in the base of the library filename as on Windows. On Linux an application wanting to link to the latest Vulkan ABI version would just link to the name vulkan (libvulkan.so). A specific Vulkan ABI version can also be linked to by applications (e.g. libvulkan.so.1). +On MacOS, the libraries are libvulkan.dylib abd libvulkan.1.dylib. #### Application Layer Usage @@ -520,8 +522,8 @@ require being able to be disabled by an environmental variable. This is due to the fact that they are not visible to the application and could cause issues. A good principle to keep in mind would be to define both an enable and disable -environment variable so the users can deterministicly enable the functionality. -On Desktop platforms (Windows and Linux), these enable/disable settings are +environment variable so the users can deterministically enable the functionality. +On Desktop platforms (Windows, Linux, and MacOS), these enable/disable settings are defined in the layer's JSON file. Discovery of system-installed implicit and explicit layers is described later in @@ -534,6 +536,7 @@ | Windows | Implicit Layers are located in a different Windows registry location than Explicit Layers. | | Linux | Implicit Layers are located in a different directory location than Explicit Layers. | | Android | There is **No Support For Implicit Layers** on Android. | +| MacOS | Implicit Layers are located in a different directory location than Explicit Layers. | ##### Forcing Layer Source Folders @@ -542,10 +545,10 @@ system-installed layers. You can direct the loader to look for layers in a specific folder by defining the "VK\_LAYER\_PATH" environment variable. This will override the mechanism used for finding system-installed layers. Because -layers of interest may exist in several disinct folders on a system, this -environment variable can containis several paths seperated by the operating +layers of interest may exist in several distinct folders on a system, this +environment variable can contains several paths separated by the operating specific path separator. On Windows, each separate folder should be separated -in the list using a semi-colon. On Linux, each folder name should be separated +in the list using a semi-colon. On Linux and MacOS, each folder name should be separated using a colon. If "VK\_LAYER\_PATH" exists, **only** the folders listed in it will be scanned @@ -553,13 +556,13 @@ containing layer manifest files. -##### Forcing Layers to be Enabled on Windows and Linux +##### Forcing Layers to be Enabled on Windows, Linux and MacOS Developers may want to enable layers that are not enabled by the given -application they are using. On Linux and Windows, the environment variable +application they are using. On desktop systems, the environment variable "VK\_INSTANCE\_LAYERS" can be used to enable additional layers which are not specified (enabled) by the application at `vkCreateInstance`. -"VK\_INSTANCE\_LAYERS" is a colon (Linux)/semi-colon (Windows) separated +"VK\_INSTANCE\_LAYERS" is a colon (Linux and MacOS)/semi-colon (Windows) separated list of layer names to enable. Order is relevant with the first layer in the list being the top-most layer (closest to the application) and the last layer in the list being the bottom-most layer (closest to the driver). @@ -572,7 +575,7 @@ application) while layers specified by the application are bottommost. An example of using these environment variables to activate the validation -layer `VK_LAYER_LUNARG_parameter_validation` on Windows or Linux is as follows: +layer `VK_LAYER_LUNARG_parameter_validation` on Windows, Linux or MacOS is as follows: ``` > $ export VK_INSTANCE_LAYERS=VK_LAYER_LUNARG_parameter_validation @@ -667,7 +670,7 @@ Integration support for various execution environments. It is important to understand that some WSI extensions are valid for all targets, but others are particular to a given execution environment (and loader). This desktop loader -(currently targeting Windows and Linux) only enables and directly exports those +(currently targeting Windows, Linux, and MacOS) only enables and directly exports those WSI extensions that are appropriate to the current environment. For the most part, the selection is done in the loader using compile-time preprocessor flags. All versions of the desktop loader currently expose at least the following WSI @@ -685,6 +688,7 @@ | Linux (Default) | VK_KHR_xcb_surface and VK_KHR_xlib_surface | | Linux (Wayland) | VK_KHR_wayland_surface | | Linux (Mir) | VK_KHR_mir_surface | +| MacOS (MoltenVK) | VK_MVK_macos_surface | **NOTE:** Wayland and Mir targets are not fully supported at this time. Wayland support is present, but should be considered Beta quality. Mir support is not @@ -709,7 +713,7 @@ loader knows nothing about. If the extension is a device extension, the loader will pass the unknown entry-point down the device call chain ending with the appropriate ICD entry-points. The same thing will happen, if the extension is -an instance extension which takes a physical device paramater as it's first +an instance extension which takes a physical device parameter as it's first component. However, for all other instance extensions the loader will fail to load it. @@ -744,7 +748,7 @@ extensions when an application calls `vkEnumerateInstanceExtensionProperties`. Additionally, this behavior will cause the loader to throw an error during `vkCreateInstance` if you still attempt to use one of these extensions. The intent is -to protect applications so that they don't inadvertantly use functionality +to protect applications so that they don't inadvertently use functionality which could lead to a crash. On the other-hand, if you know you can safely use the extension, you may disable @@ -763,6 +767,7 @@ * [Android Layer Discovery](#android-layer-discovery) * [Windows Layer Discovery](#windows-layer-discovery) * [Linux Layer Discovery](#linux-layer-discovery) + * [MacOS Layer Discovery](#macos-layer-discovery) * [Layer Version Negotiation](#layer-version-negotiation) * [Layer Call Chains and Distributed Dispatch](#layer-call-chains-and-distributed-dispatch) * [Layer Unknown Physical Device Extensions](#layer-unknown-physical-device-extensions) @@ -797,7 +802,7 @@ * Explicit Layers The main difference between the two is that Implicit Layers are automatically -enabled, unless overriden, and Explicit Layers must be enabled. Remember, +enabled, unless overridden, and Explicit Layers must be enabled. Remember, Implicit Layers are not present on all Operating Systems (like Android). On any system, the loader looks in specific areas for information on the @@ -816,7 +821,7 @@ ##### Layer Manifest File Usage -On Windows and Linux systems, JSON formatted manifest files are used to store +On Windows, Linux, and MacOS systems, JSON formatted manifest files are used to store layer information. In order to find system-installed layers, the Vulkan loader will read the JSON files to identify the names and attributes of layers and their extensions. The use of manifest files allows the loader to avoid loading @@ -891,7 +896,7 @@ In general, applications should install layers into the `SOFTWARE\Khrosos\Vulkan` paths. The PnP registry locations are intended specifically for layers that are -distrubuted as part of a driver installation. An application installer should not +distributed as part of a driver installation. An application installer should not modify the device-specific registries, while a device driver should not modify the system wide registries. @@ -920,7 +925,7 @@ $HOME/.local/share/vulkan/explicit_layer.d $HOME/.local/share/vulkan/implicit_layer.d -Of course, ther are some things you have to know about the above folders: +Of course, there are some things you have to know about the above folders: 1. The "/usr/local/*" directories can be configured to be other directories at build time. 2. $HOME is the current home directory of the application's user id; this path @@ -938,6 +943,33 @@ [Forcing Layer Source Folders](#forcing-layer-source-folders) for more information on this. +##### MacOS Layer Discovery + +On MacOS, the Vulkan loader will scan the files in the following directories: + + /Contents/Resources/vulkan/explicit_layer.d + /Contents/Resources/vulkan/implicit_layer.d + /etc/vulkan/explicit_layer.d + /etc/vulkan/implicit_layer.d + /usr/local/share/vulkan/explicit_layer.d + /usr/local/share/vulkan/implicit_layer.d + /usr/share/vulkan/explicit_layer.d + /usr/share/vulkan/implicit_layer.d + $HOME/.local/share/vulkan/explicit_layer.d + $HOME/.local/share/vulkan/implicit_layer.d + +1. <bundle> is the directory containing a bundled application. It is scanned first. +1. The "/usr/local/*" directories can be configured to be other directories at +build time. +1. $HOME is the current home directory of the application's user id; this path +will be ignored for suid programs. + +As on Windows, if VK\_LAYER\_PATH is defined, then the +loader will instead look at the paths defined by that variable instead of using +the information provided by these default paths. However, these +environment variables are only used for non-suid programs. See +[Forcing Layer Source Folders](#forcing-layer-source-folders) for more +information on this. #### Layer Version Negotiation @@ -970,11 +1002,11 @@ You'll notice the `VkNegotiateLayerInterface` structure is similar to other Vulkan structures. The "sType" field, in this case takes a new enum defined just for internal loader/layer interfacing use. The valid values for "sType" -could grow in the future, but right only havs the one value +could grow in the future, but right now only has the one value "LAYER_NEGOTIATE_INTERFACE_STRUCT". This function (`vkNegotiateLoaderLayerInterfaceVersion`) should be exported by -the layer so that using "GetProcAddress" on Windows or "dlsym" on Linux, should +the layer so that using "GetProcAddress" on Windows or "dlsym" on Linux or MacOS, should return a valid function pointer to it. Once the loader has grabbed a valid address to the layers function, the loader will create a variable of type `VkNegotiateLayerInterface` and initialize it in the following ways: @@ -1016,7 +1048,7 @@ the loader will use the “fpGetInstanceProcAddr†and “fpGetDeviceProcAddr†functions from the “VkNegotiateLayerInterface†structure. Prior to these changes, the loader would query each of those functions using "GetProcAddress" -on Windows or "dlsym" on Linux. +on Windows or "dlsym" on Linux or MacOS. #### Layer Call Chains and Distributed Dispatch @@ -1424,7 +1456,7 @@ to the application when queried. Restrictions to defining and using a meta-layer are: - 1. A Meta-layer Manifest file **must** be a properly formated that contains one + 1. A Meta-layer Manifest file **must** be a properly formatted that contains one or more component layers. 3. All component layers **must be** present on a system for the meta-layer to be used. @@ -1677,7 +1709,7 @@ #### Layer Manifest File Format -On Windows and Linux (desktop), the loader uses manifest files to discover +On Windows, Linux and MacOS (desktop), the loader uses manifest files to discover layer libraries and layers. The desktop loader doesn't directly query the layer library except during chaining. This is to reduce the likelihood of loading a malicious layer into memory. Instead, details are read from the @@ -1780,7 +1812,7 @@ | "name" | The string used to uniquely identify this layer to applications. | vkEnumerateInstanceLayerProperties | | "type" | This field indicates the type of layer. The values can be: GLOBAL, or INSTANCE | vkEnumerate*LayerProperties | | | **NOTES:** Prior to deprecation, the "type" node was used to indicate which layer chain(s) to activate the layer upon: instance, device, or both. Distinct instance and device layers are deprecated; there are now just layers. Allowable values for type (both before and after deprecation) are "INSTANCE", "GLOBAL" and, "DEVICE." "DEVICE" layers are skipped over by the loader as if they were not found. | | -| "library\_path" | The "library\_path" specifies either a filename, a relative pathname, or a full pathname to a layer shared library file. If "library\_path" specifies a relative pathname, it is relative to the path of the JSON manifest file (e.g. for cases when an application provides a layer that is in the same folder hierarchy as the rest of the application files). If "library\_path" specifies a filename, the library must live in the system's shared object search path. There are no rules about the name of the layer shared library files other than it should end with the appropriate suffix (".DLL" on Windows, and ".so" on Linux). **This field must not be present if "component_layers" is defined** | N/A | +| "library\_path" | The "library\_path" specifies either a filename, a relative pathname, or a full pathname to a layer shared library file. If "library\_path" specifies a relative pathname, it is relative to the path of the JSON manifest file (e.g. for cases when an application provides a layer that is in the same folder hierarchy as the rest of the application files). If "library\_path" specifies a filename, the library must live in the system's shared object search path. There are no rules about the name of the layer shared library files other than it should end with the appropriate suffix (".DLL" on Windows, ".so" on Linux, and ".dylib" on MacOS). **This field must not be present if "component_layers" is defined** | N/A | | "api\_version" | The major.minor.patch version number of the Vulkan API that the shared library file for the library was built against. For example: 1.0.33. | vkEnumerateInstanceLayerProperties | | "implementation_version" | The version of the layer implemented. If the layer itself has any major changes, this number should change so the loader and/or application can identify it properly. | vkEnumerateInstanceLayerProperties | | "description" | A high-level description of the layer and it's intended use. | vkEnumerateInstanceLayerProperties | @@ -1869,7 +1901,7 @@ [Layer Unknown Physical Device Extensions](#layer-unknown-physical-device- extensions) and the associated `vk_layerGetPhysicalDeviceProcAddr` function. Finally, it -changed the manifest file defition to 1.1.0. +changed the manifest file definition to 1.1.0. ##### Layer Library API Version 1 @@ -1940,7 +1972,8 @@ * [ICD Manifest File Usage](#icd-manifest-file-usage) * [ICD Discovery on Windows](#icd-discovery-on-windows) * [ICD Discovery on Linux](#icd-discovery-on-linux) - * [Using Pre-Production ICDs on Windows and Linux](#using-pre-production-icds-on-windows-and-linux) + * [ICD Discovery on MacOS](#icd-discovery-on-macos) + * [Using Pre-Production ICDs on Windows, Linux and MacOS](#using-pre-production-icds-on-windows-and-linux) * [ICD Discovery on Android](#icd-discovery-on-android) * [ICD Manifest File Format](#icd-manifest-file-format) * [ICD Manifest File Versions](#icd-manifest-file-versions) @@ -1951,7 +1984,7 @@ * [ICD Dispatchable Object Creation](#icd-dispatchable-object-creation) * [Handling KHR Surface Objects in WSI Extensions](#handling-khr-surface-objects-in-wsi-extensions) * [Loader and ICD Interface Negotiation](#loader-and-icd-interface-negotiation) - * [Windows and Linux ICD Negotiation](#windows-and-linux-icd-negotiation) + * [Windows, Linux, and MacOS ICD Negotiation](#windows-and-linux-icd-negotiation) * [Version Negotiation Between Loader and ICDs](#version-negotiation-between-loader-and-icds) * [Interfacing With Legacy ICDs or Loader](#interfacing-with-legacy-icds-or-loader) * [Loader Version 5 Interface Requirements](#loader-version-5-interface-requirements) @@ -1970,7 +2003,7 @@ of available ICDs, the loader can enumerate all the physical devices available for an application and return this information to the application. The process in which the loader discovers the available Installable Client Drivers (ICDs) -on a system is platform dependent. Windows, Linux and Android ICD discovery +on a system is platform dependent. Windows, Linux, Android, and MacOS ICD discovery details are listed below. #### Overriding the Default ICD Usage @@ -2003,10 +2036,18 @@ This is an example which is using the `VK_ICD_FILENAMES` override on Linux to point to the Intel Mesa driver's ICD Manifest file. +##### On MacOS + +``` +export VK_ICD_FILENAMES=/home/user/MoltenVK/Package/Latest/MoltenVK/macOS/MoltenVK_icd.json +``` + +This is an example which is using the `VK_ICD_FILENAMES` override on MacOS to point +to an installation and build of the MoltenVK GitHub repository that contains the MoltenVK ICD. #### ICD Manifest File Usage -As with layers, on Windows and Linux systems, JSON formatted manifest files are +As with layers, on Windows, Linux and MacOS systems, JSON formatted manifest files are used to store ICD information. In order to find system-installed drivers, the Vulkan loader will read the JSON files to identify the names and attributes of each driver. One thing you will notice is that ICD Manifest files are much @@ -2124,6 +2165,38 @@ See the [ICD Manifest File Format](#icd-manifest-file-format) section for more details. +#### ICD Discovery on MacOS + +In order to find installed ICDs, the Vulkan loader will scan the files +in the following directories: + +``` + /Contents/Resources/vulkan/icd.d + /etc/vulkan/icd.d + /usr/local/share/vulkan/icd.d + /usr/share/vulkan/icd.d + $HOME/.local/share/vulkan/icd.d +``` + +The "/usr/local/*" directories can be configured to be other directories at +build time. + +The typical usage of the directories is indicated in the table below. + +| Location | Details | +|-------------------|------------------------| +| <bundle>/Contents/Resources/vulkan/icd.d | Directory for ICDs that are bundled with the application (searched first) | +| "/etc/vulkan/icd.d" | Location of ICDs installed manually | +| "/usr/local/share/vulkan/icd.d" | Directory for locally built ICDs | +| "/usr/share/vulkan/icd.d" | Location of ICDs installed from packages | +| $HOME/.local/share/vulkan/icd.d | $HOME is the current home directory of the application's user id; this path will be ignored for suid programs | + +The Vulkan loader will open each manifest file found to obtain the name or +pathname of an ICD shared library (".dylib") file. + +See the [ICD Manifest File Format](#icd-manifest-file-format) section for more +details. + ##### Additional Settings For ICD Debugging If you are seeing issues which may be related to the ICD. A possible option to debug is to enable the @@ -2132,7 +2205,7 @@ to fail on loading the ICD. It is recommended that you enable `LD_BIND_NOW` along with `VK_LOADER_DEBUG=warn` to expose any issues. -#### Using Pre-Production ICDs on Windows and Linux +#### Using Pre-Production ICDs on Windows, Linux and MacOS Independent Hardware Vendor (IHV) pre-production ICDs. In some cases, a pre-production ICD may be in an installable package. In other cases, a @@ -2146,13 +2219,13 @@ The "VK\_ICD\_FILENAMES" environment variable is a list of ICD manifest files, containing the full path to the ICD JSON Manifest file. This -list is colon-separated on Linux, and semi-colon separated on Windows. +list is colon-separated on Linux and MacOS, and semi-colon separated on Windows. Typically, "VK\_ICD\_FILENAMES" will only contain a full pathname to one info file for a developer-built ICD. A separator (colon or semi-colon) is only used if more than one ICD is listed. -**NOTE:** On Linux, this environment variable will be ignored for suid programs. +**NOTE:** On Linux and MacOS, this environment variable will be ignored for suid programs. #### ICD Discovery on Android @@ -2185,7 +2258,7 @@ |----------------|--------------------| | "file\_format\_version" | The JSON format major.minor.patch version number of this file. Currently supported version is 1.0.0. | | "ICD" | The identifier used to group all ICD information together. | -| "library_path" | The "library\_path" specifies either a filename, a relative pathname, or a full pathname to a layer shared library file. If "library\_path" specifies a relative pathname, it is relative to the path of the JSON manifest file. If "library\_path" specifies a filename, the library must live in the system's shared object search path. There are no rules about the name of the ICD shared library files other than it should end with the appropriate suffix (".DLL" on Windows, and ".so" on Linux). | N/A | +| "library_path" | The "library\_path" specifies either a filename, a relative pathname, or a full pathname to a layer shared library file. If "library\_path" specifies a relative pathname, it is relative to the path of the JSON manifest file. If "library\_path" specifies a filename, the library must live in the system's shared object search path. There are no rules about the name of the ICD shared library files other than it should end with the appropriate suffix (".DLL" on Windows, ".so" on Linux and "*.dylib" on MacOS). | N/A | | "api_version" | The major.minor.patch version number of the Vulkan API that the shared library files for the ICD was built against. For example: 1.0.33. | **NOTE:** If the same ICD shared library supports multiple, incompatible @@ -2410,9 +2483,10 @@ ### Handling KHR Surface Objects in WSI Extensions Normally, ICDs handle object creation and destruction for various Vulkan -objects. The WSI surface extensions for Linux and Windows +objects. The WSI surface extensions for Linux, Windows, and MacOS ("VK\_KHR\_win32\_surface", "VK\_KHR\_xcb\_surface", "VK\_KHR\_xlib\_surface", -"VK\_KHR\_mir\_surface", "VK\_KHR\_wayland\_surface", and "VK\_KHR\_surface") +"VK\_KHR\_mir\_surface", "VK\_KHR\_wayland\_surface", "VK\_MVK\_macos\_surface" +and "VK\_KHR\_surface") are handled differently. For these extensions, the `VkSurfaceKHR` object creation and destruction may be handled by either the loader, or an ICD. @@ -2427,6 +2501,7 @@ * Xlib * Windows * Android + * MacOS (`vkCreateMacOSSurfaceMVK`) 2. The loader creates a `VkIcdSurfaceXXX` object for the corresponding `vkCreateXXXSurfaceKHR` call. * The `VkIcdSurfaceXXX` structures are defined in `include/vulkan/vk_icd.h`. @@ -2455,7 +2530,7 @@ object. This object acts as a container for each ICD's version of the `VkSurfaceKHR` object. If an ICD does not support the creation of its own `VkSurfaceKHR` object, the loader's container stores a NULL for that ICD. On -the otherhand, if the ICD does support `VkSurfaceKHR` creation, the loader will +the other hand, if the ICD does support `VkSurfaceKHR` creation, the loader will make the appropriate `vkCreateXXXSurfaceKHR` call to the ICD, and store the returned pointer in it's container object. The loader then returns the `VkSurfaceIcdXXX` as a `VkSurfaceKHR` object back up the call chain. Finally, @@ -2471,10 +2546,10 @@ functions or their parameters, but simply calls the ICDs entry-point for that function. There are specific additional interface requirements an ICD needs to comply with that are not part of any requirements from the Vulkan specification. -These addtional requirements are versioned to allow flexibility in the future. +These additional requirements are versioned to allow flexibility in the future. -#### Windows and Linux ICD Negotiation +#### Windows, Linux and MacOS ICD Negotiation ##### Version Negotiation Between Loader and ICDs @@ -2641,7 +2716,7 @@ table as described above. The only difference is that the Android loader queries layer and extension information directly from the respective libraries and does not use the json manifest files used -by the Windows and Linux loaders. +by the Windows, Linux and MacOS loaders. ## Table of Debug Environment Variables @@ -2654,7 +2729,7 @@ | VK_ICD_FILENAMES | Force the loader to use the specific ICD JSON files. The value should contain a list of delimited full path listings to ICD JSON Manifest files. **NOTE:** If you fail to use the global path to a JSON file, you may encounter issues. | `export VK_ICD_FILENAMES=\intel.json:\amd.json`

`set VK_ICD_FILENAMES=\nvidia.json;\mesa.json` | | VK_INSTANCE_LAYERS | Force the loader to add the given layers to the list of Enabled layers normally passed into `vkCreateInstance`. These layers are added first, and the loader will remove any duplicate layers that appear in both this list as well as that passed into `ppEnabledLayerNames`. | `export VK_INSTANCE_LAYERS=:`

`set VK_INSTANCE_LAYERS=;` | | VK_LAYER_PATH | Override the loader's standard Layer library search folders and use the provided delimited folders to search for layer Manifest files. | `export VK_LAYER_PATH=:`

`set VK_LAYER_PATH=;` | -| VK_LOADER_DISABLE_INST_EXT_FILTER | Disable the filtering out of instance extensions that the loader doesn't know about. This will allow applications to enable instance extensions exposed by ICDs but that the loader has no support for. **NOTE:** This may cause the loader or applciation to crash. | `export VK_LOADER_DISABLE_INST_EXT_FILTER=1`

`set VK_LOADER_DISABLE_INST_EXT_FILTER=1` | +| VK_LOADER_DISABLE_INST_EXT_FILTER | Disable the filtering out of instance extensions that the loader doesn't know about. This will allow applications to enable instance extensions exposed by ICDs but that the loader has no support for. **NOTE:** This may cause the loader or application to crash. | `export VK_LOADER_DISABLE_INST_EXT_FILTER=1`

`set VK_LOADER_DISABLE_INST_EXT_FILTER=1` | | VK_LOADER_DEBUG | Enable loader debug messages. Options are:
- error (only errors)
- warn (warnings and errors)
- info (info, warning, and errors)
- debug (debug + all before)
-all (report out all messages) | `export VK_LOADER_DEBUG=all`

`set VK_LOADER_DEBUG=warn` | ## Glossary of Terms @@ -2662,11 +2737,11 @@ | Field Name | Field Value | |:---:|--------------------| | Android Loader | The loader designed to work primarily for the Android OS. This is generated from a different code-base than the desktop loader. But, in all important aspects, should be functionally equivalent. | -| Desktop Loader | The loader designed to work on both Windows and Linux. This is generated from a different [code-base](#https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers) than the Android loader. But in all important aspects, should be functionally equivalent. | +| Desktop Loader | The loader designed to work on Windows, Linux and MacOS. This is generated from a different [code-base](#https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers) than the Android loader. But in all important aspects, should be functionally equivalent. | | Core Function | A function that is already part of the Vulkan core specification and not an extension. For example, vkCreateDevice(). | | Device Call Chain | The call chain of functions followed for device functions. This call chain for a device function is usually as follows: first the application calls into a loader trampoline, then the loader trampoline calls enabled layers, the final layer calls into the ICD specific to the device. See the [Dispatch Tables and Call Chains](#dispatch-tables-and-call-chains) section for more information | | Device Function | A Device function is any Vulkan function which takes a `VkDevice`, `VkQueue`, `VkCommandBuffer`, or any child of these, as its first parameter. Some Vulkan Device functions are: `vkQueueSubmit`, `vkBeginCommandBuffer`, `vkCreateEvent`. See the [Instance Versus Device](#instance-versus-device) section for more information. | -| Discovery | The process of the loader searching for ICD and Layer files to setup the internal list of Vulkan objects available. On Windows/Linux, the discovery process typically focuses on searching for Manifest files. While on Android, the process focuses on searching for library files. | +| Discovery | The process of the loader searching for ICD and Layer files to setup the internal list of Vulkan objects available. On Windows/Linux/MacOS, the discovery process typically focuses on searching for Manifest files. While on Android, the process focuses on searching for library files. | | Dispatch Table | An array of function pointers (including core and possibly extension functions) used to step to the next entity in a call chain. The entity could be the loader, a layer or an ICD. See [Dispatch Tables and Call Chains](#dispatch-tables-and-call-chains) for more information. | | Extension | A concept of Vulkan used to expand the core Vulkan functionality. Extensions may be IHV-specific, platform-specific, or more broadly available. You should always query if an extension exists, and enable it during `vkCreateInstance` (if it is an instance extension) or during `vkCreateDevice` (if it is a device extension). | | ICD | Acronym for Installable Client Driver. These are drivers that are provided by IHVs to interact with the hardware they provide. See [Installable Client Drivers](#installable-client-drivers) section for more information. diff -Nru vulkan-1.1.70+dfsg1/loader/loader.c vulkan-1.1.73+dfsg/loader/loader.c --- vulkan-1.1.70+dfsg1/loader/loader.c 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/loader.c 2018-04-27 11:24:19.000000000 +0000 @@ -26,13 +26,17 @@ */ #define _GNU_SOURCE +#include #include #include #include #include #include #include - +#if defined(__APPLE__) +#include +#include +#endif #include #if defined(_WIN32) #include "dirent_on_windows.h" @@ -209,7 +213,7 @@ } // Environment variables -#if defined(__linux__) +#if defined(__linux__) || defined(__APPLE__) static inline char *loader_getenv(const char *name, const struct loader_instance *inst) { // No allocation of memory necessary for Linux, but we should at least touch @@ -219,13 +223,22 @@ } static inline char *loader_secure_getenv(const char *name, const struct loader_instance *inst) { - // No allocation of memory necessary for Linux, but we should at least touch - // the inst pointer to get rid of compiler warnings. - (void)inst; - +#if defined(__APPLE__) + // Apple does not appear to have a secure getenv implementation. + // The main difference between secure getenv and getenv is that secure getenv + // returns NULL if the process is being run with elevated privileges by a normal user. + // The idea is to prevent the reading of malicious environment variables by a process + // that can do damage. + // This algorithm is derived from glibc code that sets an internal + // variable (__libc_enable_secure) if the process is running under setuid or setgid. + return geteuid() != getuid() || getegid() != getgid() ? NULL : loader_getenv(name, inst); +#else +// Linux #ifdef HAVE_SECURE_GETENV + (void)inst; return secure_getenv(name); #elif defined(HAVE___SECURE_GETENV) + (void)inst; return __secure_getenv(name); #else #pragma message( \ @@ -233,6 +246,7 @@ " updating to a different libc.") return loader_getenv(name, inst); #endif +#endif } static inline void loader_free_getenv(char *val, const struct loader_instance *inst) { @@ -1384,8 +1398,6 @@ VkResult loader_add_to_layer_list(const struct loader_instance *inst, struct loader_layer_list *list, uint32_t prop_list_count, const struct loader_layer_properties *props) { uint32_t i; - uint16_t layer_api_major_version; - uint16_t layer_api_minor_version; struct loader_layer_properties *layer; if (list->list == NULL || list->capacity == 0) { @@ -1416,18 +1428,6 @@ list->capacity = new_capacity; } - // Verify that the layer api version is at least that of the application's request, if not, throw a warning since - // undefined behavior could occur. - layer_api_major_version = VK_VERSION_MAJOR(props[i].info.specVersion); - layer_api_minor_version = VK_VERSION_MINOR(props[i].info.specVersion); - if (inst->app_api_major_version > layer_api_major_version || - (inst->app_api_major_version == layer_api_major_version && inst->app_api_minor_version > layer_api_minor_version)) { - loader_log( - inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, - "loader_add_to_layer_list: Explicit layer %s is using an old API version %d.%d versus application requested %d.%d", - props[i].info.layerName, layer_api_major_version, layer_api_minor_version, inst->app_api_major_version,- inst->app_api_minor_version); - } - memcpy(&list->list[list->count], layer, sizeof(struct loader_layer_properties)); list->count++; } @@ -2709,12 +2709,10 @@ strncpy(props->functions.str_gipa, vkGetInstanceProcAddr, sizeof(props->functions.str_gipa)); if (version.major > 1 || version.minor >= 1) { loader_log(inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, - "Indicating layer-specific vkGetInstanceProcAddr " - "function is deprecated starting with JSON file " - "version 1.1.0. Instead, use the new " - "vkNegotiateLayerInterfaceVersion function to " - "return the GetInstanceProcAddr function for this" - "layer"); + "Layer \"%s\" using deprecated \'vkGetInstanceProcAddr\' tag which was deprecated starting with JSON " + "file version 1.1.0. Instead, use the new vkNegotiateLayerInterfaceVersion function to return the " + "GetInstanceProcAddr function for this layer.", + name); } } props->functions.str_gipa[sizeof(props->functions.str_gipa) - 1] = '\0'; @@ -2722,12 +2720,10 @@ strncpy(props->functions.str_gdpa, vkGetDeviceProcAddr, sizeof(props->functions.str_gdpa)); if (version.major > 1 || version.minor >= 1) { loader_log(inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, - "Indicating layer-specific vkGetDeviceProcAddr " - "function is deprecated starting with JSON file " - "version 1.1.0. Instead, use the new " - "vkNegotiateLayerInterfaceVersion function to " - "return the GetDeviceProcAddr function for this" - "layer"); + "Layer \"%s\" using deprecated \'vkGetDeviceProcAddr\' tag which was deprecated starting with JSON " + "file version 1.1.0. Instead, use the new vkNegotiateLayerInterfaceVersion function to return the " + "GetDeviceProcAddr function for this layer.", + name); } } props->functions.str_gdpa[sizeof(props->functions.str_gdpa) - 1] = '\0'; @@ -3058,7 +3054,6 @@ override = override_getenv = loader_secure_getenv(env_override, inst); } } - #if !defined(_WIN32) if (relative_location == NULL) { #else @@ -3098,6 +3093,10 @@ #if defined(EXTRASYSCONFDIR) loc_size += strlen(EXTRASYSCONFDIR) + rel_size + 1; #endif +#if defined(__APPLE__) + // For bundle path + loc_size += MAXPATHLEN; +#endif #else loc_size += strlen(location) + 1; #endif @@ -3115,6 +3114,23 @@ const char *loc_read; size_t start, stop; +#if defined(__APPLE__) + // Add the bundle's Resources dir to the beginning of the search path. + // Looks for manifests in the bundle first, before any system directories. + CFBundleRef main_bundle = CFBundleGetMainBundle(); + if (NULL != main_bundle) { + CFURLRef ref = CFBundleCopyResourcesDirectoryURL(main_bundle); + if (NULL != ref) { + if (CFURLGetFileSystemRepresentation(ref, TRUE, (UInt8 *)loc_write, loc_size)) { + loc_write += strlen(loc_write); + memcpy(loc_write, relative_location, rel_size); + loc_write += rel_size; + *loc_write++ = PATH_SEPARATOR; + } + CFRelease(ref); + } + } +#endif loc_read = &xdgconfdirs[0]; start = 0; while (loc_read[start] != '\0') { @@ -3972,7 +3988,7 @@ // object before passing the appropriate info along to the ICD. // This is why we also have to override the direct ICD call to // vkGetDeviceProcAddr to intercept those calls. - PFN_vkVoidFunction addr = get_extension_device_proc_terminator(pName); + PFN_vkVoidFunction addr = get_extension_device_proc_terminator(dev, pName); if (NULL != addr) { return addr; } @@ -4505,6 +4521,10 @@ VkResult loader_enable_instance_layers(struct loader_instance *inst, const VkInstanceCreateInfo *pCreateInfo, const struct loader_layer_list *instance_layers) { VkResult err; + uint16_t layer_api_major_version; + uint16_t layer_api_minor_version; + uint32_t i; + struct loader_layer_properties *prop; assert(inst && "Cannot have null instance"); @@ -4533,6 +4553,22 @@ err = loader_add_layer_names_to_list(inst, &inst->app_activated_layer_list, &inst->expanded_activated_layer_list, pCreateInfo->enabledLayerCount, pCreateInfo->ppEnabledLayerNames, instance_layers); + for (i = 0; i < inst->expanded_activated_layer_list.count; i++) { + // Verify that the layer api version is at least that of the application's request, if not, throw a warning since + // undefined behavior could occur. + prop = inst->expanded_activated_layer_list.list + i; + layer_api_major_version = VK_VERSION_MAJOR(prop->info.specVersion); + layer_api_minor_version = VK_VERSION_MINOR(prop->info.specVersion); + if (inst->app_api_major_version > layer_api_major_version || + (inst->app_api_major_version == layer_api_major_version && inst->app_api_minor_version > layer_api_minor_version)) { + loader_log(inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, + "loader_add_to_layer_list: Explicit layer %s is using an old API version %" PRIu16 ".%" PRIu16 + " versus application requested %" PRIu16 ".%" PRIu16, + prop->info.layerName, layer_api_major_version, layer_api_minor_version, inst->app_api_major_version, + inst->app_api_minor_version); + } + } + return err; } @@ -5141,6 +5177,8 @@ // If any error happens after here, we need to remove the ICD from the list, // because we've already added it, but haven't validated it + // Make sure that we reset the pApplicationInfo so we don't get an old pointer + icd_create_info.pApplicationInfo = pCreateInfo->pApplicationInfo; icd_create_info.enabledExtensionCount = 0; struct loader_extension_list icd_exts; @@ -5202,14 +5240,15 @@ // Create an instance, substituting the version to 1.0 if necessary VkApplicationInfo icd_app_info; + uint32_t icd_version_nopatch = VK_MAKE_VERSION(VK_VERSION_MAJOR(icd_version), VK_VERSION_MINOR(icd_version), 0); uint32_t requested_version = pCreateInfo == NULL || pCreateInfo->pApplicationInfo == NULL ? VK_API_VERSION_1_0 : pCreateInfo->pApplicationInfo->apiVersion; - if (requested_version > icd_version) { + if ((requested_version != 0) && (icd_version_nopatch == VK_API_VERSION_1_0)) { if (icd_create_info.pApplicationInfo == NULL) { memset(&icd_app_info, 0, sizeof(icd_app_info)); } else { memcpy(&icd_app_info, icd_create_info.pApplicationInfo, sizeof(icd_app_info)); } - icd_app_info.apiVersion = icd_term->scanned_icd->api_version; + icd_app_info.apiVersion = icd_version; icd_create_info.pApplicationInfo = &icd_app_info; } icd_result = ptr_instance->icd_tramp_list.scanned_list[i].CreateInstance(&icd_create_info, pAllocator, &(icd_term->instance)); @@ -5509,6 +5548,19 @@ } } + // Every extension that has a loader-defined terminator needs to be marked as enabled or disabled so that we know whether or + // not to return that terminator when vkGetDeviceProcAddr is called + for (uint32_t i = 0; i < localCreateInfo.enabledExtensionCount; ++i) { + if (!strcmp(localCreateInfo.ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME)) { + dev->extensions.khr_swapchain_enabled = true; + } else if (!strcmp(localCreateInfo.ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME)) { + dev->extensions.khr_display_swapchain_enabled = true; + } else if (!strcmp(localCreateInfo.ppEnabledExtensionNames[i], VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) { + dev->extensions.ext_debug_marker_enabled = true; + } + dev->extensions.ext_debug_utils_enabled = icd_term->this_instance->enabled_known_extensions.ext_debug_utils; + } + res = fpCreateDevice(phys_dev_term->phys_dev, &localCreateInfo, pAllocator, &dev->icd_device); if (res != VK_SUCCESS) { loader_log(icd_term->this_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, diff -Nru vulkan-1.1.70+dfsg1/loader/loader.h vulkan-1.1.73+dfsg/loader/loader.h --- vulkan-1.1.70+dfsg1/loader/loader.h 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/loader.h 2018-04-27 11:24:19.000000000 +0000 @@ -192,6 +192,14 @@ VkAllocationCallbacks alloc_callbacks; + // List of activated device extensions that have terminators implemented in the loader + struct { + bool khr_swapchain_enabled; + bool khr_display_swapchain_enabled; + bool ext_debug_marker_enabled; + bool ext_debug_utils_enabled; + } extensions; + struct loader_device *next; }; @@ -305,6 +313,12 @@ #ifdef VK_USE_PLATFORM_ANDROID_KHR bool wsi_android_surface_enabled; #endif +#ifdef VK_USE_PLATFORM_MACOS_MVK + bool wsi_macos_surface_enabled; +#endif +#ifdef VK_USE_PLATFORM_IOS_MVK + bool wsi_ios_surface_enabled; +#endif bool wsi_display_enabled; }; diff -Nru vulkan-1.1.70+dfsg1/loader/loader.rc vulkan-1.1.73+dfsg/loader/loader.rc --- vulkan-1.1.70+dfsg1/loader/loader.rc 2017-11-08 08:23:03.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/loader.rc 2018-04-27 11:24:19.000000000 +0000 @@ -86,7 +86,7 @@ BEGIN VALUE "FileDescription", VER_FILE_DESCRIPTION_STR VALUE "FileVersion", VER_FILE_VERSION_STR - VALUE "LegalCopyright", "Copyright (C) 2015-2017" + VALUE "LegalCopyright", "Copyright (C) 2015-2018" VALUE "ProductName", "Vulkan Runtime" VALUE "ProductVersion", VER_FILE_VERSION_STR END diff -Nru vulkan-1.1.70+dfsg1/loader/trampoline.c vulkan-1.1.73+dfsg/loader/trampoline.c --- vulkan-1.1.70+dfsg1/loader/trampoline.c 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/trampoline.c 2018-04-27 11:24:19.000000000 +0000 @@ -2614,3 +2614,24 @@ const VkLayerDispatchTable *disp = loader_get_dispatch(device); disp->GetDescriptorSetLayoutSupport(device, pCreateInfo, pSupport); } + +LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL +vkCreateDescriptorUpdateTemplate(VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) { + const VkLayerDispatchTable *disp = loader_get_dispatch(device); + return disp->CreateDescriptorUpdateTemplate(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate); +} + +LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorUpdateTemplate(VkDevice device, + VkDescriptorUpdateTemplate descriptorUpdateTemplate, + const VkAllocationCallbacks *pAllocator) { + const VkLayerDispatchTable *disp = loader_get_dispatch(device); + disp->DestroyDescriptorUpdateTemplate(device, descriptorUpdateTemplate, pAllocator); +} + +LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet, + VkDescriptorUpdateTemplate descriptorUpdateTemplate, + const void *pData) { + const VkLayerDispatchTable *disp = loader_get_dispatch(device); + disp->UpdateDescriptorSetWithTemplate(device, descriptorSet, descriptorUpdateTemplate, pData); +} diff -Nru vulkan-1.1.70+dfsg1/loader/vk_loader_platform.h vulkan-1.1.73+dfsg/loader/vk_loader_platform.h --- vulkan-1.1.70+dfsg1/loader/vk_loader_platform.h 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/vk_loader_platform.h 2018-04-27 11:24:19.000000000 +0000 @@ -31,7 +31,7 @@ #include "vulkan/vk_platform.h" #include "vulkan/vk_sdk_platform.h" -#if defined(__linux__) +#if defined(__linux__) || defined(__APPLE__) /* Linux-specific common code: */ // Headers: @@ -296,7 +296,7 @@ static void *loader_platform_get_proc_address(loader_platform_dl_handle library, const char *name) { assert(library); assert(name); - return GetProcAddress(library, name); + return (void *)GetProcAddress(library, name); } static char *loader_platform_get_proc_address_error(const char *name) { static char errorMsg[120]; @@ -327,7 +327,7 @@ static void loader_platform_thread_once_fn(void *ctl, void (*func)(void)) { assert(func != NULL); assert(ctl != NULL); - InitOnceExecuteOnce((PINIT_ONCE)ctl, InitFuncWrapper, func, NULL); + InitOnceExecuteOnce((PINIT_ONCE)ctl, InitFuncWrapper, (void *)func, NULL); } #endif diff -Nru vulkan-1.1.70+dfsg1/loader/vulkan-1.def vulkan-1.1.73+dfsg/loader/vulkan-1.def --- vulkan-1.1.70+dfsg1/loader/vulkan-1.def 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/vulkan-1.def 2018-04-27 11:24:19.000000000 +0000 @@ -208,3 +208,6 @@ vkGetDeviceGroupSurfacePresentModesKHR vkGetPhysicalDevicePresentRectanglesKHR vkAcquireNextImage2KHR + vkCreateDescriptorUpdateTemplate + vkDestroyDescriptorUpdateTemplate + vkUpdateDescriptorSetWithTemplate diff -Nru vulkan-1.1.70+dfsg1/loader/wsi.c vulkan-1.1.73+dfsg/loader/wsi.c --- vulkan-1.1.70+dfsg1/loader/wsi.c 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/wsi.c 2018-04-27 11:24:19.000000000 +0000 @@ -55,6 +55,12 @@ #ifdef VK_USE_PLATFORM_ANDROID_KHR ptr_instance->wsi_android_surface_enabled = false; #endif // VK_USE_PLATFORM_ANDROID_KHR +#ifdef VK_USE_PLATFORM_MACOS_MVK + ptr_instance->wsi_macos_surface_enabled = false; +#endif // VK_USE_PLATFORM_MACOS_MVK +#ifdef VK_USE_PLATFORM_IOS_MVK + ptr_instance->wsi_ios_surface_enabled = false; +#endif // VK_USE_PLATFORM_IOS_MVK ptr_instance->wsi_display_enabled = false; @@ -99,6 +105,18 @@ continue; } #endif // VK_USE_PLATFORM_ANDROID_KHR +#ifdef VK_USE_PLATFORM_MACOS_MVK + if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_MVK_MACOS_SURFACE_EXTENSION_NAME) == 0) { + ptr_instance->wsi_macos_surface_enabled = true; + continue; + } +#endif // VK_USE_PLATFORM_MACOS_MVK +#ifdef VK_USE_PLATFORM_IOS_MVK + if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_MVK_IOS_SURFACE_EXTENSION_NAME) == 0) { + ptr_instance->wsi_ios_surface_enabled = true; + continue; + } +#endif // VK_USE_PLATFORM_IOS_MVK if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) { ptr_instance->wsi_display_enabled = true; continue; @@ -378,8 +396,7 @@ } VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkSwapchainKHR *pSwapchain) { + const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) { uint32_t icd_index = 0; struct loader_device *dev; struct loader_icd_term *icd_term = loader_get_icd_and_device(device, &dev, &icd_index); @@ -1066,7 +1083,6 @@ } pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_ANDROID; - pIcdSurface->dpy = dpy; pIcdSurface->window = window; *pSurface = (VkSurfaceKHR)pIcdSurface; @@ -1076,6 +1092,129 @@ #endif // VK_USE_PLATFORM_ANDROID_KHR +#ifdef VK_USE_PLATFORM_MACOS_MVK + +// Functions for the VK_MVK_macos_surface extension: + +// This is the trampoline entrypoint for CreateMacOSSurfaceMVK +LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK(VkInstance instance, + const VkMacOSSurfaceCreateInfoMVK *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkSurfaceKHR *pSurface) { + const VkLayerInstanceDispatchTable *disp; + disp = loader_get_instance_layer_dispatch(instance); + VkResult res; + + res = disp->CreateMacOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface); + return res; +} + +// This is the instance chain terminator function for CreateMacOSSurfaceKHR +VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateMacOSSurfaceMVK(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) { + VkResult vkRes = VK_SUCCESS; + VkIcdSurface *pIcdSurface = NULL; + uint32_t i = 0; + + // First, check to ensure the appropriate extension was enabled: + struct loader_instance *ptr_instance = loader_get_instance(instance); + if (!ptr_instance->wsi_macos_surface_enabled) { + loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, + "VK_MVK_macos_surface extension not enabled. vkCreateMacOSSurfaceMVK not executed!\n"); + vkRes = VK_ERROR_EXTENSION_NOT_PRESENT; + goto out; + } + + // Next, if so, proceed with the implementation of this function: + pIcdSurface = AllocateIcdSurfaceStruct(ptr_instance, sizeof(pIcdSurface->macos_surf.base), sizeof(pIcdSurface->macos_surf)); + if (pIcdSurface == NULL) { + vkRes = VK_ERROR_OUT_OF_HOST_MEMORY; + goto out; + } + + pIcdSurface->macos_surf.base.platform = VK_ICD_WSI_PLATFORM_MACOS; + pIcdSurface->macos_surf.pView = pCreateInfo->pView; + + // Loop through each ICD and determine if they need to create a surface + for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) { + if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) { + if (NULL != icd_term->dispatch.CreateMacOSSurfaceMVK) { + vkRes = icd_term->dispatch.CreateMacOSSurfaceMVK(icd_term->instance, pCreateInfo, pAllocator, + &pIcdSurface->real_icd_surfaces[i]); + if (VK_SUCCESS != vkRes) { + goto out; + } + } + } + } + + *pSurface = (VkSurfaceKHR)pIcdSurface; + +out: + + if (VK_SUCCESS != vkRes && NULL != pIcdSurface) { + if (NULL != pIcdSurface->real_icd_surfaces) { + i = 0; + for (struct loader_icd_term *icd_term = ptr_instance->icd_terms; icd_term != NULL; icd_term = icd_term->next, i++) { + if ((VkSurfaceKHR)NULL != pIcdSurface->real_icd_surfaces[i] && NULL != icd_term->dispatch.DestroySurfaceKHR) { + icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, pIcdSurface->real_icd_surfaces[i], pAllocator); + } + } + loader_instance_heap_free(ptr_instance, pIcdSurface->real_icd_surfaces); + } + loader_instance_heap_free(ptr_instance, pIcdSurface); + } + + return vkRes; +} + +#endif // VK_USE_PLATFORM_MACOS_MVK + +#ifdef VK_USE_PLATFORM_IOS_MVK + +// Functions for the VK_MVK_ios_surface extension: + +// This is the trampoline entrypoint for CreateIOSSurfaceMVK +LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateIOSSurfaceMVK(VkInstance instance, + const VkIOSSurfaceCreateInfoMVK *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkSurfaceKHR *pSurface) { + const VkLayerInstanceDispatchTable *disp; + disp = loader_get_instance_layer_dispatch(instance); + VkResult res; + + res = disp->CreateIOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface); + return res; +} + +// This is the instance chain terminator function for CreateIOSSurfaceKHR +VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) { + // First, check to ensure the appropriate extension was enabled: + struct loader_instance *ptr_instance = loader_get_instance(instance); + if (!ptr_instance->wsi_ios_surface_enabled) { + loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, + "VK_MVK_ios_surface extension not enabled. vkCreateIOSSurfaceMVK not executed!\n"); + return VK_ERROR_EXTENSION_NOT_PRESENT; + } + + // Next, if so, proceed with the implementation of this function: + VkIcdSurfaceIOS *pIcdSurface = + loader_instance_heap_alloc(ptr_instance, sizeof(VkIcdSurfaceIOS), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (pIcdSurface == NULL) { + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + + pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_IOS; + pIcdSurface->pView = pCreateInfo->pView; + + *pSurface = (VkSurfaceKHR)pIcdSurface; + + return VK_SUCCESS; +} + +#endif // VK_USE_PLATFORM_IOS_MVK + // Functions for the VK_KHR_display instance extension: LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, @@ -1591,10 +1730,26 @@ // Functions for the VK_KHR_android_surface extension: if (!strcmp("vkCreateAndroidSurfaceKHR", name)) { - *addr = ptr_instance->wsi_xlib_surface_enabled ? (void *)vkCreateAndroidSurfaceKHR : NULL; + *addr = ptr_instance->wsi_android_surface_enabled ? (void *)vkCreateAndroidSurfaceKHR : NULL; return true; } #endif // VK_USE_PLATFORM_ANDROID_KHR +#ifdef VK_USE_PLATFORM_MACOS_MVK + + // Functions for the VK_MVK_macos_surface extension: + if (!strcmp("vkCreateMacOSSurfaceMVK", name)) { + *addr = ptr_instance->wsi_macos_surface_enabled ? (void *)vkCreateMacOSSurfaceMVK : NULL; + return true; + } +#endif // VK_USE_PLATFORM_MACOS_MVK +#ifdef VK_USE_PLATFORM_IOS_MVK + + // Functions for the VK_MVK_ios_surface extension: + if (!strcmp("vkCreateIOSSurfaceMVK", name)) { + *addr = ptr_instance->wsi_ios_surface_enabled ? (void *)vkCreateIOSSurfaceMVK : NULL; + return true; + } +#endif // VK_USE_PLATFORM_IOS_MVK // Functions for VK_KHR_display extension: if (!strcmp("vkGetPhysicalDeviceDisplayPropertiesKHR", name)) { diff -Nru vulkan-1.1.70+dfsg1/loader/wsi.h vulkan-1.1.73+dfsg/loader/wsi.h --- vulkan-1.1.70+dfsg1/loader/wsi.h 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/loader/wsi.h 2018-04-27 11:24:19.000000000 +0000 @@ -42,6 +42,9 @@ #ifdef VK_USE_PLATFORM_XLIB_KHR VkIcdSurfaceXlib xlib_surf; #endif // VK_USE_PLATFORM_XLIB_KHR +#ifdef VK_USE_PLATFORM_MACOS_MVK + VkIcdSurfaceMacOS macos_surf; +#endif // VK_USE_PLATFORM_MACOS_MVK VkIcdSurfaceDisplay display_surf; }; uint32_t base_size; // Size of VkIcdSurfaceBase @@ -120,6 +123,14 @@ uint32_t queueFamilyIndex, Display *dpy, VisualID visualID); #endif +#ifdef VK_USE_PLATFORM_MACOS_MVK +VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateMacOSSurfaceMVK(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface); +#endif +#ifdef VK_USE_PLATFORM_IOS_MVK +VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface); +#endif VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPropertiesKHR *pProperties); diff -Nru vulkan-1.1.70+dfsg1/README.md vulkan-1.1.73+dfsg/README.md --- vulkan-1.1.70+dfsg1/README.md 2018-03-08 15:06:23.000000000 +0000 +++ vulkan-1.1.73+dfsg/README.md 2018-04-27 11:24:19.000000000 +0000 @@ -1,6 +1,6 @@ # Vulkan Ecosystem Components -This project provides the Khronos official Vulkan ICD desktop loader and the Vulkan validation layers for Windows, Linux, and Android. +This project provides the Khronos official Vulkan ICD desktop loader and the Vulkan validation layers for Windows, Linux, Android, and MacOS. ## CI Build Status | Platform | Build Status | @@ -29,7 +29,7 @@ - [*Tests*](tests/) ## Contact Information -* [Tobine Ehlis](mailto:tobine@google.com) +* [Tobin Ehlis](mailto:tobine@google.com) * [Mark Lobodzinski](mailto:mark@lunarg.com) ## Information for Developing or Contributing: diff -Nru vulkan-1.1.70+dfsg1/scripts/check_code_format.sh vulkan-1.1.73+dfsg/scripts/check_code_format.sh --- vulkan-1.1.70+dfsg1/scripts/check_code_format.sh 2018-03-08 15:06:23.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/check_code_format.sh 2018-04-27 11:24:19.000000000 +0000 @@ -22,7 +22,7 @@ GREEN='\033[0;32m' NC='\033[0m' # No Color -FILES_TO_CHECK=$(git diff --name-only master | grep -E ".*\.(cpp|cc|c\+\+|cxx|c|h|hpp)$") +FILES_TO_CHECK=$(git diff --name-only master | grep -v -E "^include/vulkan" | grep -E ".*\.(cpp|cc|c\+\+|cxx|c|h|hpp)$") if [ -z "${FILES_TO_CHECK}" ]; then echo -e "${GREEN}No source code to check for formatting.${NC}" diff -Nru vulkan-1.1.70+dfsg1/scripts/check_commit_message_format.sh vulkan-1.1.73+dfsg/scripts/check_commit_message_format.sh --- vulkan-1.1.70+dfsg1/scripts/check_commit_message_format.sh 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/check_commit_message_format.sh 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,102 @@ +#!/bin/bash +# Copyright (c) 2018 Valve Corporation +# Copyright (c) 2018 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. +# +# Checks commit messages against project standards in CONTRIBUTING.md document +# Script to determine if commit messages in Pull Request are properly formatted. +# Exits with non 0 exit code if reformatting is needed. + +# Disable subshells +shopt -s lastpipe + +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +# TRAVIS_COMMIT_RANGE contains range of commits for this PR + +# Get user-supplied commit message text for applicable commits and insert +# a unique separator string identifier. The git command returns ONLY the +# subject line and body for each of the commits. +COMMIT_TEXT=$(git log ${TRAVIS_COMMIT_RANGE} --pretty=format:"XXXNEWLINEXXX"%n%B) + +# Bail if there are none +if [ -z "${COMMIT_TEXT}" ]; then + echo -e "${GREEN}No commit messgages to check for formatting.${NC}" + exit 0 +elif ! echo $TRAVIS_COMMIT_RANGE | grep -q "\.\.\."; then + echo -e "${GREEN}No commit messgages to check for formatting.${NC}" + exit 0 +fi + +# Process commit messages +success=1 +current_line=0 +prevline="" + +# Process each line of the commit message output, resetting counter on separator +printf %s "$COMMIT_TEXT" | while IFS='' read -r line; do + # echo "Count = $current_line = $line" + current_line=$((current_line+1)) + if [ "$line" = "XXXNEWLINEXXX" ]; then + current_line=0 + fi + chars=${#line} + if [ $current_line -eq 1 ]; then + # Subject line should be 50 chars or less (but give some slack here) + if [ $chars -gt 54 ]; then + echo "The following subject line exceeds 50 characters in length." + echo " '$line'" + success=0 + fi + i=$(($chars-1)) + last_char=${line:$i:1} + # Output error if last char of subject line is not alpha-numeric + if [[ ! $last_char =~ [0-9a-zA-Z] ]]; then + echo "For the following commit, the last character of the subject line must not be non-alphanumeric." + echo " '$line'" + success=0 + fi + # Checking if subject line doesn't start with 'module: ' + prefix=$(echo $line | cut -f1 -d " ") + if [ "${prefix: -1}" != ":" ]; then + echo "The following subject line must start with a single word specifying the functional area of the change, followed by a colon and space. I.e., 'layers: Subject line here'" + echo " '$line'" + success=0 + fi + elif [ $current_line -eq 2 ]; then + # Commit message must have a blank line between subject and body + if [ $chars -ne 0 ]; then + echo "The following subject line must be followed by a blank line." + echo " '$prevline'" + success=0 + fi + else + # Lines in a commit message body must be less than 72 characters in length (but give some slack) + if [ $chars -gt 76 ]; then + echo "The following commit message body line exceeds the 72 character limit." + echo "'$line\'" + success=0 + fi + fi + prevline=$line +done + +if [ $success -eq 1 ]; then + echo -e "${GREEN}All commit messages in pull request are properly formatted.${NC}" + exit 0 +else + exit 1 +fi diff -Nru vulkan-1.1.70+dfsg1/scripts/helper_file_generator.py vulkan-1.1.73+dfsg/scripts/helper_file_generator.py --- vulkan-1.1.70+dfsg1/scripts/helper_file_generator.py 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/helper_file_generator.py 2018-04-27 11:24:19.000000000 +0000 @@ -19,6 +19,7 @@ # # Author: Mark Lobodzinski # Author: Tobin Ehlis +# Author: John Zulauf import os,re,sys import xml.etree.ElementTree as etree @@ -76,13 +77,12 @@ OutputGenerator.__init__(self, errFile, warnFile, diagFile) # Internal state - accumulators for different inner block text self.enum_output = '' # string built up of enum string routines - self.struct_size_h_output = '' # string built up of struct size header output - self.struct_size_c_output = '' # string built up of struct size source output # Internal state - accumulators for different inner block text self.structNames = [] # List of Vulkan struct typenames self.structTypes = dict() # Map of Vulkan struct typename to required VkStructureType self.structMembers = [] # List of StructMemberData records for all Vulkan structs self.object_types = [] # List of all handle types + 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.device_extension_info = dict() # Dict of device extension name defines and ifdef values @@ -182,18 +182,11 @@ groupElem = groupinfo.elem # For enum_string_header if self.helper_file_type == 'enum_string_header': - value_list = [] + value_set = set() for elem in groupElem.findall('enum'): if elem.get('supported') != 'disabled' and elem.get('alias') == None: - item_name = elem.get('name') - # Avoid duplicates - if item_name not in value_list: - value_list.append(item_name) - if value_list is not None: - #if alias: - # self.enum_output += self.GenerateEnumStringConversion(alias, value_list) - #else: - self.enum_output += self.GenerateEnumStringConversion(groupName, value_list) + value_set.add(elem.get('name')) + self.enum_output += self.GenerateEnumStringConversion(groupName, value_set) elif self.helper_file_type == 'object_types_header': if groupName == 'VkDebugReportObjectTypeEXT': for elem in groupElem.findall('enum'): @@ -215,7 +208,10 @@ # Otherwise, emit the tag text. category = typeElem.get('category') if category == 'handle': - self.object_types.append(name) + if alias: + self.object_type_aliases.append((name,alias)) + else: + self.object_types.append(name) elif (category == 'struct' or category == 'union'): self.structNames.append(name) self.genStruct(typeinfo, name, alias) @@ -411,38 +407,6 @@ enum_string_helper_header += self.DeIndexPhysDevFeatures() return enum_string_helper_header # - # struct_size_header: build function prototypes for header file - def GenerateStructSizeHeader(self): - outstring = '' - outstring += 'size_t get_struct_chain_size(const void* struct_ptr);\n' - outstring += 'size_t get_struct_size(const void* struct_ptr);\n' - for item in self.structMembers: - lower_case_name = item.name.lower() - if item.ifdef_protect != None: - outstring += '#ifdef %s\n' % item.ifdef_protect - outstring += 'size_t vk_size_%s(const %s* struct_ptr);\n' % (item.name.lower(), item.name) - if item.ifdef_protect != None: - outstring += '#endif // %s\n' % item.ifdef_protect - outstring += '#ifdef __cplusplus\n' - outstring += '}\n' - outstring += '#endif' - return outstring - # - # Combine struct size helper header file preamble with body text and return - def GenerateStructSizeHelperHeader(self): - struct_size_helper_header = '\n' - struct_size_helper_header += '#ifdef __cplusplus\n' - struct_size_helper_header += 'extern "C" {\n' - struct_size_helper_header += '#endif\n' - struct_size_helper_header += '\n' - struct_size_helper_header += '#include \n' - struct_size_helper_header += '#include \n' - struct_size_helper_header += '#include \n' - struct_size_helper_header += '\n' - struct_size_helper_header += '// Function Prototypes\n' - struct_size_helper_header += self.GenerateStructSizeHeader() - return struct_size_helper_header - # # Helper function for declaring a counter variable only once def DeclareCounter(self, string_var, declare_flag): if declare_flag == False: @@ -450,121 +414,6 @@ declare_flag = True return string_var, declare_flag # - # Build the header of the get_struct_chain_size function - def GenerateChainSizePreamble(self): - preamble = '\nsize_t get_struct_chain_size(const void* struct_ptr) {\n' - preamble += ' // Use VkApplicationInfo as struct until actual type is resolved\n' - preamble += ' VkApplicationInfo* pNext = (VkApplicationInfo*)struct_ptr;\n' - preamble += ' size_t struct_size = 0;\n' - preamble += ' while (pNext) {\n' - preamble += ' switch (pNext->sType) {\n' - return preamble - # - # Build the footer of the get_struct_chain_size function - def GenerateChainSizePostamble(self): - postamble = ' default:\n' - postamble += ' struct_size += 0;\n' - postamble += ' break;' - postamble += ' }\n' - postamble += ' pNext = (VkApplicationInfo*)pNext->pNext;\n' - postamble += ' }\n' - postamble += ' return struct_size;\n' - postamble += '}\n' - return postamble - # - # Build the header of the get_struct_size function - def GenerateStructSizePreamble(self): - preamble = '\nsize_t get_struct_size(const void* struct_ptr) {\n' - preamble += ' switch (((VkApplicationInfo*)struct_ptr)->sType) {\n' - return preamble - # - # Build the footer of the get_struct_size function - def GenerateStructSizePostamble(self): - postamble = ' default:\n' - postamble += ' return(0);\n' - postamble += ' }\n' - postamble += '}' - return postamble - # - # struct_size_helper source -- create bodies of struct size helper functions - def GenerateStructSizeSource(self): - # Construct the bodies of the struct size functions, get_struct_chain_size(), - # and get_struct_size() simultaneously - struct_size_funcs = '' - chain_size = self.GenerateChainSizePreamble() - struct_size = self.GenerateStructSizePreamble() - for item in self.structMembers: - struct_size_funcs += '\n' - lower_case_name = item.name.lower() - if item.ifdef_protect != None: - struct_size_funcs += '#ifdef %s\n' % item.ifdef_protect - struct_size += '#ifdef %s\n' % item.ifdef_protect - chain_size += '#ifdef %s\n' % item.ifdef_protect - if item.name in self.structTypes: - chain_size += ' case %s: {\n' % self.structTypes[item.name].value - chain_size += ' struct_size += vk_size_%s((%s*)pNext);\n' % (item.name.lower(), item.name) - chain_size += ' break;\n' - chain_size += ' }\n' - struct_size += ' case %s: \n' % self.structTypes[item.name].value - struct_size += ' return vk_size_%s((%s*)struct_ptr);\n' % (item.name.lower(), item.name) - struct_size_funcs += 'size_t vk_size_%s(const %s* struct_ptr) { \n' % (item.name.lower(), item.name) - struct_size_funcs += ' size_t struct_size = 0;\n' - struct_size_funcs += ' if (struct_ptr) {\n' - struct_size_funcs += ' struct_size = sizeof(%s);\n' % item.name - counter_declared = False - for member in item.members: - vulkan_type = next((i for i, v in enumerate(self.structMembers) if v[0] == member.type), None) - if member.ispointer == True: - if vulkan_type is not None: - # If this is another Vulkan structure call generated size function - if member.len is not None: - struct_size_funcs, counter_declared = self.DeclareCounter(struct_size_funcs, counter_declared) - struct_size_funcs += ' for (i = 0; i < struct_ptr->%s; i++) {\n' % member.len - struct_size_funcs += ' struct_size += vk_size_%s(&struct_ptr->%s[i]);\n' % (member.type.lower(), member.name) - struct_size_funcs += ' }\n' - else: - struct_size_funcs += ' struct_size += vk_size_%s(struct_ptr->%s);\n' % (member.type.lower(), member.name) - else: - if member.type == 'char': - # Deal with sizes of character strings - if member.len is not None: - struct_size_funcs, counter_declared = self.DeclareCounter(struct_size_funcs, counter_declared) - struct_size_funcs += ' for (i = 0; i < struct_ptr->%s; i++) {\n' % member.len - struct_size_funcs += ' struct_size += (sizeof(char*) + ROUNDUP_TO_4((sizeof(char) * (1 + strlen(struct_ptr->%s[i])))));\n' % (member.name) - struct_size_funcs += ' }\n' - else: - struct_size_funcs += ' struct_size += (struct_ptr->%s != NULL) ? ROUNDUP_TO_4(sizeof(char)*(1+strlen(struct_ptr->%s))) : 0;\n' % (member.name, member.name) - else: - if member.len is not None: - # Avoid using 'sizeof(void)', which generates compile-time warnings/errors - checked_type = member.type - if checked_type == 'void': - checked_type = 'void*' - struct_size_funcs += ' struct_size += (struct_ptr->%s ) * sizeof(%s);\n' % (member.len, checked_type) - struct_size_funcs += ' }\n' - struct_size_funcs += ' return struct_size;\n' - struct_size_funcs += '}\n' - if item.ifdef_protect != None: - struct_size_funcs += '#endif // %s\n' % item.ifdef_protect - struct_size += '#endif // %s\n' % item.ifdef_protect - chain_size += '#endif // %s\n' % item.ifdef_protect - chain_size += self.GenerateChainSizePostamble() - struct_size += self.GenerateStructSizePostamble() - return_value = struct_size_funcs + chain_size + struct_size; - return return_value - # - # Combine struct size helper source file preamble with body text and return - def GenerateStructSizeHelperSource(self): - struct_size_helper_source = '\n' - struct_size_helper_source += '#include "vk_struct_size_helper.h"\n' - struct_size_helper_source += '#include \n' - struct_size_helper_source += '#include \n' - struct_size_helper_source += '\n' - struct_size_helper_source += '#define ROUNDUP_TO_4(_len) ((((_len) + 3) >> 2) << 2)\n\n' - struct_size_helper_source += '// Function Definitions\n' - struct_size_helper_source += self.GenerateStructSizeSource() - return struct_size_helper_source - # # Combine safe struct helper header file preamble with body text and return def GenerateSafeStructHelperHeader(self): safe_struct_helper_header = '\n' @@ -666,10 +515,7 @@ struct += '\n' if type == 'Instance': struct += ' uint32_t NormalizeApiVersion(uint32_t specified_version) {\n' - struct += ' uint32_t api_version = specified_version & ~VK_VERSION_PATCH(~0);\n' - struct += ' if (!(api_version == VK_API_VERSION_1_0) && !(api_version == VK_API_VERSION_1_1)) {\n' - struct += ' api_version = VK_API_VERSION_1_1;\n' - struct += ' }\n' + struct += ' uint32_t api_version = (specified_version < VK_API_VERSION_1_1) ? VK_API_VERSION_1_0 : VK_API_VERSION_1_1;\n' struct += ' return api_version;\n' struct += ' }\n' struct += '\n' @@ -757,16 +603,22 @@ object_types_header += ' kVulkanObjectTypeUnknown = 0,\n' enum_num = 1 type_list = []; + enum_entry_map = {} # Output enum definition as each handle is processed, saving the names to use for the conversion routine for item in self.object_types: fixup_name = item[2:] enum_entry = 'kVulkanObjectType%s' % fixup_name + enum_entry_map[item] = enum_entry object_types_header += ' ' + enum_entry object_types_header += ' = %d,\n' % enum_num enum_num += 1 type_list.append(enum_entry) object_types_header += ' kVulkanObjectTypeMax = %d,\n' % enum_num + object_types_header += ' // Aliases for backwards compatibilty of "promoted" types\n' + for (name, alias) in self.object_type_aliases: + fixup_name = name[2:] + object_types_header += ' kVulkanObjectType{} = {},\n'.format(fixup_name, enum_entry_map[alias]) object_types_header += '} VulkanObjectType;\n\n' # Output name string helper @@ -778,41 +630,42 @@ object_types_header += ' "%s",\n' % fixup_name object_types_header += '};\n' + # Key creation helper for map comprehensions that convert between k and VK symbols + def to_key(regex, raw_key): return re.search(regex, raw_key).group(1).lower().replace("_","") + # Output a conversion routine from the layer object definitions to the debug report definitions + # As the VK_DEBUG_REPORT types are not being updated, specify UNKNOWN for unmatched types object_types_header += '\n' object_types_header += '// Helper array to get Vulkan VK_EXT_debug_report object type enum from the internal layers version\n' object_types_header += 'const VkDebugReportObjectTypeEXT get_debug_report_enum[] = {\n' object_types_header += ' VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, // kVulkanObjectTypeUnknown\n' + + dbg_re = '^VK_DEBUG_REPORT_OBJECT_TYPE_(.*)_EXT$' + dbg_map = {to_key(dbg_re, dbg) : dbg for dbg in self.debug_report_object_types} + dbg_default = 'VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT' for object_type in type_list: - search_type = object_type.replace("kVulkanObjectType", "").lower() - for vk_object_type in self.debug_report_object_types: - target_type = vk_object_type.replace("VK_DEBUG_REPORT_OBJECT_TYPE_", "").lower() - target_type = target_type[:-4] - target_type = target_type.replace("_", "") - if search_type == target_type: - object_types_header += ' %s, // %s\n' % (vk_object_type, object_type) - break + vk_object_type = dbg_map.get(object_type.replace("kVulkanObjectType", "").lower(), dbg_default) + object_types_header += ' %s, // %s\n' % (vk_object_type, object_type) object_types_header += '};\n' # Output a conversion routine from the layer object definitions to the core object type definitions + # This will intentionally *fail* for unmatched types as the VK_OBJECT_TYPE list should match the kVulkanObjectType list object_types_header += '\n' object_types_header += '// Helper array to get Official Vulkan VkObjectType enum from the internal layers version\n' object_types_header += 'const VkObjectType get_object_type_enum[] = {\n' object_types_header += ' VK_OBJECT_TYPE_UNKNOWN, // kVulkanObjectTypeUnknown\n' + + vko_re = '^VK_OBJECT_TYPE_(.*)' + vko_map = {to_key(vko_re, vko) : vko for vko in self.core_object_types} for object_type in type_list: - search_type = object_type.replace("kVulkanObjectType", "").lower() - for vk_object_type in self.core_object_types: - target_type = vk_object_type.replace("VK_OBJECT_TYPE_", "").lower() - target_type = target_type.replace("_", "") - if search_type == target_type: - object_types_header += ' %s, // %s\n' % (vk_object_type, object_type) - break + vk_object_type = vko_map[object_type.replace("kVulkanObjectType", "").lower()] + object_types_header += ' %s, // %s\n' % (vk_object_type, object_type) object_types_header += '};\n' # Create a function to convert from VkDebugReportObjectTypeEXT to VkObjectType object_types_header += '\n' object_types_header += '// Helper function to convert from VkDebugReportObjectTypeEXT to VkObjectType\n' - object_types_header += 'static VkObjectType convertDebugReportObjectToCoreObject(VkDebugReportObjectTypeEXT debug_report_obj){\n' + object_types_header += 'static inline VkObjectType convertDebugReportObjectToCoreObject(VkDebugReportObjectTypeEXT debug_report_obj){\n' object_types_header += ' if (debug_report_obj == VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT) {\n' object_types_header += ' return VK_OBJECT_TYPE_UNKNOWN;\n' for core_object_type in self.core_object_types: @@ -833,7 +686,7 @@ # Create a function to convert from VkObjectType to VkDebugReportObjectTypeEXT object_types_header += '\n' object_types_header += '// Helper function to convert from VkDebugReportObjectTypeEXT to VkObjectType\n' - object_types_header += 'static VkDebugReportObjectTypeEXT convertCoreObjectToDebugReportObject(VkObjectType core_report_obj){\n' + object_types_header += 'static inline VkDebugReportObjectTypeEXT convertCoreObjectToDebugReportObject(VkObjectType core_report_obj){\n' object_types_header += ' if (core_report_obj == VK_OBJECT_TYPE_UNKNOWN) {\n' object_types_header += ' return VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;\n' for core_object_type in self.core_object_types: @@ -867,6 +720,12 @@ safe_struct_helper_source = '\n' safe_struct_helper_source += '#include "vk_safe_struct.h"\n' safe_struct_helper_source += '#include \n' + safe_struct_helper_source += '#ifdef VK_USE_PLATFORM_ANDROID_KHR\n' + safe_struct_helper_source += '#if __ANDROID_API__ < __ANDROID_API_O__\n' + safe_struct_helper_source += 'struct AHardwareBuffer {};\n' + safe_struct_helper_source += '#endif\n' + safe_struct_helper_source += '#endif\n' + safe_struct_helper_source += '\n' safe_struct_helper_source += self.GenerateSafeStructSource() return safe_struct_helper_source @@ -1311,10 +1170,6 @@ def OutputDestFile(self): if self.helper_file_type == 'enum_string_header': return self.GenerateEnumStringHelperHeader() - elif self.helper_file_type == 'struct_size_header': - return self.GenerateStructSizeHelperHeader() - elif self.helper_file_type == 'struct_size_source': - return self.GenerateStructSizeHelperSource() elif self.helper_file_type == 'safe_struct_header': return self.GenerateSafeStructHelperHeader() elif self.helper_file_type == 'safe_struct_source': diff -Nru vulkan-1.1.70+dfsg1/scripts/loader_extension_generator.py vulkan-1.1.73+dfsg/scripts/loader_extension_generator.py --- vulkan-1.1.70+dfsg1/scripts/loader_extension_generator.py 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/loader_extension_generator.py 2018-04-27 11:24:19.000000000 +0000 @@ -35,6 +35,8 @@ 'VK_KHR_mir_surface', 'VK_KHR_win32_surface', 'VK_KHR_android_surface', + 'VK_MVK_macos_surface', + 'VK_MVK_ios_surface', 'VK_KHR_swapchain', 'VK_KHR_display_swapchain'] @@ -381,6 +383,7 @@ protos = '' protos += '// Structures defined externally, but used here\n' protos += 'struct loader_instance;\n' + protos += 'struct loader_device;\n' protos += 'struct loader_icd_term;\n' protos += 'struct loader_dev_dispatch_table;\n' protos += '\n' @@ -399,7 +402,7 @@ protos += '// Extension interception for vkGetDeviceProcAddr function, so we can return\n' protos += '// an appropriate terminator if this is one of those few device commands requiring\n' protos += '// a terminator.\n' - protos += 'PFN_vkVoidFunction get_extension_device_proc_terminator(const char *pName);\n' + protos += 'PFN_vkVoidFunction get_extension_device_proc_terminator(struct loader_device *dev, const char *pName);\n' protos += '\n' protos += '// Dispatch table properly filled in with appropriate terminators for the\n' protos += '// supported extensions.\n' @@ -1363,28 +1366,38 @@ term_func += '// Some device commands still need a terminator because the loader needs to unwrap something about them.\n' term_func += '// In many cases, the item needing unwrapping is a VkPhysicalDevice or VkSurfaceKHR object. But there may be other items\n' term_func += '// in the future.\n' - term_func += 'PFN_vkVoidFunction get_extension_device_proc_terminator(const char *pName) {\n' + term_func += 'PFN_vkVoidFunction get_extension_device_proc_terminator(struct loader_device *dev, const char *pName) {\n' term_func += ' PFN_vkVoidFunction addr = NULL;\n' count = 0 + is_extension = False for ext_cmd in self.ext_commands: if ext_cmd.name in DEVICE_CMDS_NEED_TERM: if ext_cmd.ext_name != cur_extension_name: + if count > 0: + count = 0; + term_func += ' }\n' + if is_extension: + term_func += ' }\n' + is_extension = False + if 'VK_VERSION_' in ext_cmd.ext_name: term_func += '\n // ---- Core %s commands\n' % ext_cmd.ext_name[11:] else: term_func += '\n // ---- %s extension commands\n' % ext_cmd.ext_name + term_func += ' if (dev->extensions.%s_enabled) {\n' % ext_cmd.ext_name[3:].lower() + is_extension = True cur_extension_name = ext_cmd.ext_name if ext_cmd.protect is not None: term_func += '#ifdef %s\n' % ext_cmd.protect if count == 0: - term_func += ' if' + term_func += ' if' else: - term_func += ' } else if' + term_func += ' } else if' term_func += '(!strcmp(pName, "%s")) {\n' % (ext_cmd.name) - term_func += ' addr = (PFN_vkVoidFunction)terminator_%s;\n' % (ext_cmd.name[2:]) + term_func += ' addr = (PFN_vkVoidFunction)terminator_%s;\n' % (ext_cmd.name[2:]) if ext_cmd.protect is not None: term_func += '#endif // %s\n' % ext_cmd.protect @@ -1392,6 +1405,8 @@ count += 1 if count > 0: + term_func += ' }\n' + if is_extension: term_func += ' }\n' term_func += ' return addr;\n' diff -Nru vulkan-1.1.70+dfsg1/scripts/lvl_genvk.py vulkan-1.1.73+dfsg/scripts/lvl_genvk.py --- vulkan-1.1.70+dfsg1/scripts/lvl_genvk.py 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/lvl_genvk.py 2018-04-27 11:24:19.000000000 +0000 @@ -1,6 +1,6 @@ #!/usr/bin/python3 # -# Copyright (c) 2013-2017 The Khronos Group Inc. +# Copyright (c) 2013-2018 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. @@ -93,7 +93,7 @@ # Copyright text prefixing all headers (list of strings). prefixStrings = [ '/*', - '** Copyright (c) 2015-2017 The Khronos Group Inc.', + '** Copyright (c) 2015-2018 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.', @@ -325,52 +325,6 @@ helper_file_type = 'enum_string_header') ] - # Helper file generator options for vk_struct_size_helper.h - genOpts['vk_struct_size_helper.h'] = [ - HelperFileOutputGenerator, - HelperFileOutputGeneratorOptions( - filename = 'vk_struct_size_helper.h', - directory = directory, - apiname = 'vulkan', - profile = None, - versions = featuresPat, - emitversions = featuresPat, - defaultExtensions = 'vulkan', - addExtensions = addExtensionsPat, - removeExtensions = removeExtensionsPat, - emitExtensions = emitExtensionsPat, - prefixText = prefixStrings + vkPrefixStrings, - apicall = 'VKAPI_ATTR ', - apientry = 'VKAPI_CALL ', - apientryp = 'VKAPI_PTR *', - alignFuncParam = 48, - expandEnumerants = False, - helper_file_type = 'struct_size_header') - ] - - # Helper file generator options for vk_struct_size_helper.c - genOpts['vk_struct_size_helper.c'] = [ - HelperFileOutputGenerator, - HelperFileOutputGeneratorOptions( - filename = 'vk_struct_size_helper.c', - directory = directory, - apiname = 'vulkan', - profile = None, - versions = featuresPat, - emitversions = featuresPat, - defaultExtensions = 'vulkan', - addExtensions = addExtensionsPat, - removeExtensions = removeExtensionsPat, - emitExtensions = emitExtensionsPat, - prefixText = prefixStrings + vkPrefixStrings, - apicall = 'VKAPI_ATTR ', - apientry = 'VKAPI_CALL ', - apientryp = 'VKAPI_PTR *', - alignFuncParam = 48, - expandEnumerants = False, - helper_file_type = 'struct_size_source') - ] - # Helper file generator options for vk_safe_struct.h genOpts['vk_safe_struct.h'] = [ HelperFileOutputGenerator, @@ -625,8 +579,10 @@ help='Create target and related files in specified directory') parser.add_argument('target', metavar='target', nargs='?', help='Specify target') - parser.add_argument('-quiet', action='store_true', default=False, + parser.add_argument('-quiet', action='store_true', default=True, help='Suppress script output during normal execution.') + parser.add_argument('-verbose', action='store_false', dest='quiet', default=True, + help='Enable script output during normal execution.') args = parser.parse_args() @@ -641,9 +597,12 @@ tree = etree.parse(args.registry) endTimer(args.time, '* Time to make ElementTree =') - startTimer(args.time) - reg.loadElementTree(tree) - endTimer(args.time, '* Time to parse 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() diff -Nru vulkan-1.1.70+dfsg1/scripts/mock_icd_generator.py vulkan-1.1.73+dfsg/scripts/mock_icd_generator.py --- vulkan-1.1.70+dfsg1/scripts/mock_icd_generator.py 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/mock_icd_generator.py 2018-04-27 11:24:19.000000000 +0000 @@ -535,6 +535,119 @@ // If requesting extension properties, fill in data struct for number of extensions return VK_SUCCESS; ''', +'vkGetPhysicalDeviceSurfacePresentModesKHR': ''' + // Currently always say that all present modes are supported + if (!pPresentModes) { + *pPresentModeCount = 6; + } else { + // Intentionally falling through and just filling however many modes are requested + switch(*pPresentModeCount) { + case 6: + pPresentModes[5] = VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR; + // fall through + case 5: + pPresentModes[4] = VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR; + // fall through + case 4: + pPresentModes[3] = VK_PRESENT_MODE_FIFO_RELAXED_KHR; + // fall through + case 3: + pPresentModes[2] = VK_PRESENT_MODE_FIFO_KHR; + // fall through + case 2: + pPresentModes[1] = VK_PRESENT_MODE_MAILBOX_KHR; + // fall through + default: + pPresentModes[0] = VK_PRESENT_MODE_IMMEDIATE_KHR; + break; + } + } + return VK_SUCCESS; +''', +'vkGetPhysicalDeviceSurfaceFormatsKHR': ''' + // Currently always say that RGBA8 & BGRA8 are supported + if (!pSurfaceFormats) { + *pSurfaceFormatCount = 2; + } else { + // Intentionally falling through and just filling however many types are requested + switch(*pSurfaceFormatCount) { + case 2: + pSurfaceFormats[1].format = VK_FORMAT_R8G8B8A8_UNORM; + pSurfaceFormats[1].colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; + // fall through + default: + pSurfaceFormats[0].format = VK_FORMAT_B8G8R8A8_UNORM; + pSurfaceFormats[0].colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; + break; + } + } + return VK_SUCCESS; +''', +'vkGetPhysicalDeviceSurfaceFormats2KHR': ''' + // Currently always say that RGBA8 & BGRA8 are supported + if (!pSurfaceFormats) { + *pSurfaceFormatCount = 2; + } else { + // Intentionally falling through and just filling however many types are requested + switch(*pSurfaceFormatCount) { + case 2: + pSurfaceFormats[1].pNext = nullptr; + pSurfaceFormats[1].surfaceFormat.format = VK_FORMAT_R8G8B8A8_UNORM; + pSurfaceFormats[1].surfaceFormat.colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; + // fall through + default: + pSurfaceFormats[1].pNext = nullptr; + pSurfaceFormats[0].surfaceFormat.format = VK_FORMAT_B8G8R8A8_UNORM; + pSurfaceFormats[0].surfaceFormat.colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; + break; + } + } + return VK_SUCCESS; +''', +'vkGetPhysicalDeviceSurfaceSupportKHR': ''' + // Currently say that all surface/queue combos are supported + *pSupported = VK_TRUE; + return VK_SUCCESS; +''', +'vkGetPhysicalDeviceSurfaceCapabilitiesKHR': ''' + // In general just say max supported is available for requested surface + pSurfaceCapabilities->minImageCount = 1; + pSurfaceCapabilities->maxImageCount = 0; + pSurfaceCapabilities->currentExtent.width = 0xFFFFFFFF; + pSurfaceCapabilities->currentExtent.height = 0xFFFFFFFF; + pSurfaceCapabilities->minImageExtent.width = 1; + pSurfaceCapabilities->minImageExtent.height = 1; + pSurfaceCapabilities->maxImageExtent.width = 3840; + pSurfaceCapabilities->maxImageExtent.height = 2160; + pSurfaceCapabilities->maxImageArrayLayers = 128; + pSurfaceCapabilities->supportedTransforms = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR | + VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR | + VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR | + VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR | + VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR | + VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR | + VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR | + VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR | + VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR; + pSurfaceCapabilities->currentTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; + pSurfaceCapabilities->supportedCompositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR | + VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR | + VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR | + VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR; + pSurfaceCapabilities->supportedUsageFlags = 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; + return VK_SUCCESS; +''', +'vkGetPhysicalDeviceSurfaceCapabilities2KHR': ''' + GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, pSurfaceInfo->surface, &pSurfaceCapabilities->surfaceCapabilities); + return VK_SUCCESS; +''', 'vkGetInstanceProcAddr': ''' if (!negotiate_loader_icd_interface_called) { loader_interface_version = 0; @@ -673,6 +786,21 @@ // Need safe values. Callers are computing memory offsets from pLayout, with no return code to flag failure. *pLayout = VkSubresourceLayout(); // Default constructor zero values. ''', +'vkGetSwapchainImagesKHR': ''' + if (!pSwapchainImages) { + *pSwapchainImageCount = 1; + } else if (*pSwapchainImageCount > 0) { + pSwapchainImages[0] = (VkImage)global_unique_handle++; + if (*pSwapchainImageCount != 1) { + return VK_INCOMPLETE; + } + } + return VK_SUCCESS; +''', +'vkAcquireNextImagesKHR': ''' + *pImageIndex = 0; + return VK_SUCCESS; +''', } # MockICDGeneratorOptions - subclass of GeneratorOptions. diff -Nru vulkan-1.1.70+dfsg1/scripts/object_tracker_generator.py vulkan-1.1.73+dfsg/scripts/object_tracker_generator.py --- vulkan-1.1.70+dfsg1/scripts/object_tracker_generator.py 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/object_tracker_generator.py 2018-04-27 11:24:19.000000000 +0000 @@ -290,6 +290,11 @@ else: print('Unrecognized len attribute value',val) isoptional = opts + if not isoptional: + # Matching logic in parameter validation and ValidityOutputGenerator.isHandleOptional + optString = param.attrib.get('noautovalidity') + if optString and optString == 'true': + isoptional = True; return isoptional # # Convert decimal number to 8 digit hexadecimal lower-case representation @@ -331,6 +336,7 @@ # Check if the parameter passed in is a pointer to an array def paramIsArray(self, param): return param.attrib.get('len') is not None + # # Generate the object tracker undestroyed object validation function def GenReportFunc(self): @@ -342,6 +348,19 @@ output_func += ' DeviceReportUndestroyedObjects(device, %s, error_code);\n' % (self.GetVulkanObjType(handle)) output_func += '}\n' return output_func + + # + # Generate the object tracker undestroyed object destruction function + def GenDestroyFunc(self): + output_func = '' + output_func += 'void DestroyUndestroyedObjects(VkDevice device) {\n' + output_func += ' DeviceDestroyUndestroyedObjects(device, kVulkanObjectTypeCommandBuffer);\n' + for handle in self.object_types: + if self.isHandleTypeNonDispatchable(handle): + output_func += ' DeviceDestroyUndestroyedObjects(device, %s);\n' % (self.GetVulkanObjType(handle)) + output_func += '}\n' + return output_func + # # Called at beginning of processing as file is opened def beginFile(self, genOpts): @@ -401,8 +420,12 @@ # Build undestroyed objects reporting function report_func = self.GenReportFunc() self.newline() + # Build undestroyed objects destruction function + destroy_func = self.GenDestroyFunc() + self.newline() write('// ObjectTracker undestroyed objects validation function', file=self.outFile) write('%s' % report_func, file=self.outFile) + write('%s' % destroy_func, file=self.outFile) # Actually write the interface to the output file. if (self.emit): self.newline() @@ -726,15 +749,11 @@ commonparent_vuid_string = 'VUID-%s-commonparent' % parent_name parent_vuid = self.GetVuid(commonparent_vuid_string) if obj_count is not None: - pre_call_code += '%s if (%s%s) {\n' % (indent, prefix, obj_name) - indent = self.incIndent(indent) pre_call_code += '%s for (uint32_t %s = 0; %s < %s; ++%s) {\n' % (indent, index, index, obj_count, index) indent = self.incIndent(indent) pre_call_code += '%s skip |= ValidateObject(%s, %s%s[%s], %s, %s, %s, %s);\n' % (indent, disp_name, prefix, obj_name, index, self.GetVulkanObjType(obj_type), null_allowed, param_vuid, parent_vuid) indent = self.decIndent(indent) pre_call_code += '%s }\n' % indent - indent = self.decIndent(indent) - pre_call_code += '%s }\n' % indent else: pre_call_code += '%s skip |= ValidateObject(%s, %s%s, %s, %s, %s, %s);\n' % (indent, disp_name, prefix, obj_name, self.GetVulkanObjType(obj_type), null_allowed, param_vuid, parent_vuid) return decl_code, pre_call_code, post_call_code diff -Nru vulkan-1.1.70+dfsg1/scripts/parameter_validation_generator.py vulkan-1.1.73+dfsg/scripts/parameter_validation_generator.py --- vulkan-1.1.70+dfsg1/scripts/parameter_validation_generator.py 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/parameter_validation_generator.py 2018-04-27 11:24:19.000000000 +0000 @@ -308,8 +308,8 @@ self.newline() ext_template = 'template \n' ext_template += 'bool OutputExtensionError(const T *layer_data, const std::string &api_name, const std::string &extension_name) {\n' - ext_template += ' return log_msg(layer_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,\n' - ext_template += ' EXTENSION_NOT_ENABLED, LayerName, "Attemped to call %s() but its required extension %s has not been enabled\\n",\n' + ext_template += ' return log_msg(layer_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,\n' + ext_template += ' EXTENSION_NOT_ENABLED, "Attemped to call %s() but its required extension %s has not been enabled\\n",\n' ext_template += ' api_name.c_str(), extension_name.c_str());\n' ext_template += '}\n' write(ext_template, file=self.outFile) @@ -433,8 +433,6 @@ # type declarations. The tags are just like tags - they are a declaration of a struct or union member. # Only simple member declarations are supported (no nested structs etc.) def genStruct(self, typeinfo, typeName, alias): - if alias: - print("genStruct {} {}".format(typeName, alias)) OutputGenerator.genStruct(self, typeinfo, typeName, alias) conditions = self.structMemberValidationConditions[typeName] if typeName in self.structMemberValidationConditions else None members = typeinfo.elem.findall('.//member') @@ -500,8 +498,6 @@ # Capture group (e.g. C "enum" type) info to be used for param check code generation. # These are concatenated together with other types. def genGroup(self, groupinfo, groupName, alias): - if alias: - print("genGroup {} {}".format(groupName, alias)) OutputGenerator.genGroup(self, groupinfo, groupName, alias) groupElem = groupinfo.elem # Store the sType values @@ -538,8 +534,6 @@ # # Capture command parameter info to be used for param check code generation. def genCmd(self, cmdinfo, name, alias): - if alias: - print("genCmd {} {}".format(name, alias)) OutputGenerator.genCmd(self, cmdinfo, name, alias) decls = self.makeCDecls(cmdinfo.elem) typedef = decls[1] @@ -879,14 +873,14 @@ # If count and array parameters are optional, there will be no validation if valueRequired == 'true' or lenPtrRequired == 'true' or lenValueRequired == 'true': # When the length parameter is a pointer, there is an extra Boolean parameter in the function call to indicate if it is required - checkExpr.append('skip |= validate_array(local_data->report_data, "{}", {ppp}"{ldn}"{pps}, {ppp}"{dn}"{pps}, {pf}{ln}, {pf}{vn}, {}, {}, {}, {}, {});\n'.format( + checkExpr.append('skip |= validate_array(local_data->report_data, "{}", {ppp}"{ldn}"{pps}, {ppp}"{dn}"{pps}, {pf}{ln}, &{pf}{vn}, {}, {}, {}, {}, {});\n'.format( funcPrintName, lenPtrRequired, lenValueRequired, valueRequired, count_required_vuid, array_required_vuid, ln=lenValue.name, ldn=lenPrintName, dn=valuePrintName, vn=value.name, pf=prefix, **postProcSpec)) # This is an array with an integer count value else: # If count and array parameters are optional, there will be no validation if valueRequired == 'true' or lenValueRequired == 'true': if value.type != 'char': - checkExpr.append('skip |= validate_array(local_data->report_data, "{}", {ppp}"{ldn}"{pps}, {ppp}"{dn}"{pps}, {pf}{ln}, {pf}{vn}, {}, {}, {}, {});\n'.format( + checkExpr.append('skip |= validate_array(local_data->report_data, "{}", {ppp}"{ldn}"{pps}, {ppp}"{dn}"{pps}, {pf}{ln}, &{pf}{vn}, {}, {}, {}, {});\n'.format( funcPrintName, lenValueRequired, valueRequired, count_required_vuid, array_required_vuid, ln=lenValue.name, ldn=lenPrintName, dn=valuePrintName, vn=value.name, pf=prefix, **postProcSpec)) else: # Arrays of strings receive special processing diff -Nru vulkan-1.1.70+dfsg1/scripts/spec.py vulkan-1.1.73+dfsg/scripts/spec.py --- vulkan-1.1.70+dfsg1/scripts/spec.py 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/spec.py 2018-04-27 11:24:19.000000000 +0000 @@ -28,11 +28,9 @@ out_filename = "../layers/vk_validation_error_messages.h" # can override w/ '-out ' option db_filename = "../layers/vk_validation_error_database.txt" # can override w/ '-gendb ' option -json_filename = None # con pass in w/ '-json option +json_filename = "../scripts/validusage.json" # can override w/ '-json-file option gen_db = False # set to True when '-gendb ' option provided json_compare = False # compare existing DB to json file input -json_url = "https://www.khronos.org/registry/vulkan/specs/1.0-extensions/validation/validusage.json" -read_json = False # This is the root spec link that is used in error messages to point users to spec sections #old_spec_url = "https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html" spec_url = "https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html" @@ -44,7 +42,7 @@ validation_error_enum_name = "VALIDATION_ERROR_" def printHelp(): - print ("Usage: python spec.py [-out ] [-gendb ] [-update] [-json ] [-help]") + print ("Usage: python spec.py [-out ] [-gendb ] [-update] [-json-file ] [-help]") print ("\n Default script behavior is to parse the specfile and generate a header of unique error enums and corresponding error messages based on the specfile.\n") print (" Default specfile is from online at %s" % (spec_url)) print (" Default headerfile is %s" % (out_filename)) @@ -53,8 +51,7 @@ print (" the list of enums and their error messages.") print ("\nIf '-update' option is specified this triggers the master flow to automate updating header and database files using default db file as baseline") print (" and online spec file as the latest. The default header and database files will be updated in-place for review and commit to the git repo.") - print ("\nIf '-json' option is used trigger the script to load in data from a json file.") - print ("\nIf '-json-file' option is it will point to a local json file, else '%s' is used from the web." % (json_url)) + print ("\nIf '-json-file' option is specified, it will override the default json file location") def get8digithex(dec_num): """Convert a decimal # into an 8-digit hex""" @@ -191,27 +188,32 @@ file_contents.append('\n#pragma once') file_contents.append('\n// Disable auto-formatting for generated file') file_contents.append('// clang-format off') - file_contents.append('\n#include ') + file_contents.append('\n#include ') + file_contents.append('#include ') file_contents.append('\n// enum values for unique validation error codes') file_contents.append('// Corresponding validation error message for each enum is given in the mapping table below') file_contents.append('// When a given error occurs, these enum values should be passed to the as the messageCode') file_contents.append('// parameter to the PFN_vkDebugReportCallbackEXT function') enum_decl = ['enum UNIQUE_VALIDATION_ERROR_CODE {\n VALIDATION_ERROR_UNDEFINED = -1,'] - error_string_map = ['static std::unordered_map validation_error_map{'] + vuid_int_to_error_map = ['static std::unordered_map validation_error_map{'] + vuid_string_to_error_map = ['static std::unordered_map validation_error_text_map{'] enum_value = 0 max_enum_val = 0 for enum in sorted(self.error_db_dict): enum_decl.append(' %s = 0x%s,' % (enum, enum[-8:])) - error_string_map.append(' {%s, "%s"},' % (enum, self.error_db_dict[enum]['error_msg'].replace('"', '\\"'))) + vuid_int_to_error_map.append(' {%s, "%s"},' % (enum, self.error_db_dict[enum]['error_msg'].replace('"', '\\"'))) + vuid_str = self.error_db_dict[enum]['vuid_string'] + vuid_string_to_error_map.append(' {"%s", %s},' % (vuid_str, enum)) max_enum_val = max(max_enum_val, enum_value) enum_decl.append(' %sMAX_ENUM = %d,' % (validation_error_enum_name, max_enum_val + 1)) enum_decl.append('};') - error_string_map.append('};\n') + vuid_int_to_error_map.append('};\n') + vuid_string_to_error_map.append('};\n') file_contents.extend(enum_decl) - file_contents.append('\n// Mapping from unique validation error enum to the corresponding error message') - file_contents.append('// The error message should be appended to the end of a custom error message that is passed') - file_contents.append('// as the pMessage parameter to the PFN_vkDebugReportCallbackEXT function') - file_contents.extend(error_string_map) + file_contents.append('\n// Mapping from unique validation error enum to the corresponding spec text') + file_contents.extend(vuid_int_to_error_map) + file_contents.append('\n// Mapping from spec validation error text string to unique validation error enum') + file_contents.extend(vuid_string_to_error_map) #print ("File contents: %s" % (file_contents)) with open(header_file, "w") as outfile: outfile.write("\n".join(file_contents)) @@ -293,8 +295,6 @@ if (arg == '-json-file'): json_filename = sys.argv[i] i = i + 1 - elif (arg == '-json'): - read_json = True elif (arg == '-json-compare'): json_compare = True elif (arg == '-out'): @@ -307,17 +307,14 @@ db_filename = sys.argv[i] i = i + 1 elif (arg == '-update'): - read_json = True json_compare = True gen_db = True elif (arg in ['-help', '-h']): printHelp() sys.exit() spec = Specification() - if read_json: - spec.readJSON() - spec.parseJSON() - #sys.exit() + spec.readJSON() + spec.parseJSON() if (json_compare): # Read in current spec info from db file (orig_err_msg_dict) = spec.readDB(db_filename) diff -Nru vulkan-1.1.70+dfsg1/scripts/unique_objects_generator.py vulkan-1.1.73+dfsg/scripts/unique_objects_generator.py --- vulkan-1.1.70+dfsg1/scripts/unique_objects_generator.py 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/unique_objects_generator.py 2018-04-27 11:24:19.000000000 +0000 @@ -517,12 +517,24 @@ pnext_proc += '}\n\n' pnext_proc += '// Free a pNext extension chain\n' pnext_proc += 'void FreeUnwrappedExtensionStructs(void *head) {\n' - pnext_proc += ' void * curr_ptr = head;\n' + pnext_proc += ' GenericHeader *curr_ptr = reinterpret_cast(head);\n' pnext_proc += ' while (curr_ptr) {\n' - pnext_proc += ' GenericHeader *header = reinterpret_cast(curr_ptr);\n' - pnext_proc += ' void *temp = curr_ptr;\n' - pnext_proc += ' curr_ptr = header->pNext;\n' - pnext_proc += ' free(temp);\n' + pnext_proc += ' GenericHeader *header = curr_ptr;\n' + pnext_proc += ' curr_ptr = reinterpret_cast(header->pNext);\n\n' + pnext_proc += ' switch (header->sType) {\n'; + for item in self.extension_structs: + struct_info = self.struct_member_dict[item] + if struct_info[0].feature_protect is not None: + pnext_proc += '#ifdef %s \n' % struct_info[0].feature_protect + pnext_proc += ' case %s:\n' % self.structTypes[item].value + pnext_proc += ' delete reinterpret_cast(header);\n' % item + pnext_proc += ' break;\n' + if struct_info[0].feature_protect is not None: + pnext_proc += '#endif // %s \n' % struct_info[0].feature_protect + pnext_proc += '\n' + pnext_proc += ' default:\n' + pnext_proc += ' assert(0);\n' + pnext_proc += ' }\n' pnext_proc += ' }\n' pnext_proc += '}\n' return pnext_proc diff -Nru vulkan-1.1.70+dfsg1/scripts/validusage.json vulkan-1.1.73+dfsg/scripts/validusage.json --- vulkan-1.1.70+dfsg1/scripts/validusage.json 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/validusage.json 2018-04-27 11:24:19.000000000 +0000 @@ -0,0 +1,18388 @@ +{ + "version info": { + "schema version": 2, + "api version": "1.1.73", + "comment": "from git branch: master commit: 5300d9f05e03f721812273d5f9f9676c3227f056", + "date": "2018-04-16 14:18:46Z" + }, + "validation": { + "vkGetInstanceProcAddr": { + "core": [ + { + "vuid": "VUID-vkGetInstanceProcAddr-instance-parameter", + "text": " If instance is not NULL, instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkGetInstanceProcAddr-pName-parameter", + "text": " pName must be a null-terminated UTF-8 string" + } + ] + }, + "vkGetDeviceProcAddr": { + "core": [ + { + "vuid": "VUID-vkGetDeviceProcAddr-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetDeviceProcAddr-pName-parameter", + "text": " pName must be a null-terminated UTF-8 string" + } + ] + }, + "vkEnumerateInstanceVersion": { + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkEnumerateInstanceVersion-pApiVersion-parameter", + "text": " pApiVersion must be a valid pointer to a uint32_t value" + } + ] + }, + "vkCreateInstance": { + "core": [ + { + "vuid": "VUID-vkCreateInstance-ppEnabledExtensionNames-01388", + "text": " All &amp;lt;&amp;lt;extended-functionality-extensions-dependencies, required extensions&amp;gt;&amp;gt; for each extension in the VkInstanceCreateInfo::ppEnabledExtensionNames list must also be present in that list." + }, + { + "vuid": "VUID-vkCreateInstance-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkInstanceCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateInstance-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateInstance-pInstance-parameter", + "text": " pInstance must be a valid pointer to a VkInstance handle" + } + ] + }, + "VkInstanceCreateInfo": { + "core": [ + { + "vuid": "VUID-VkInstanceCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO" + }, + { + "vuid": "VUID-VkInstanceCreateInfo-pNext-pNext", + "text": " 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, or VkValidationFlagsEXT" + }, + { + "vuid": "VUID-VkInstanceCreateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkInstanceCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkInstanceCreateInfo-pApplicationInfo-parameter", + "text": " If pApplicationInfo is not NULL, pApplicationInfo must be a valid pointer to a valid VkApplicationInfo structure" + }, + { + "vuid": "VUID-VkInstanceCreateInfo-ppEnabledLayerNames-parameter", + "text": " If enabledLayerCount is not 0, ppEnabledLayerNames must be a valid pointer to an array of enabledLayerCount null-terminated UTF-8 strings" + }, + { + "vuid": "VUID-VkInstanceCreateInfo-ppEnabledExtensionNames-parameter", + "text": " If enabledExtensionCount is not 0, ppEnabledExtensionNames must be a valid pointer to an array of enabledExtensionCount null-terminated UTF-8 strings" + } + ] + }, + "VkValidationFlagsEXT": { + "(VK_EXT_validation_flags)": [ + { + "vuid": "VUID-VkValidationFlagsEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT" + }, + { + "vuid": "VUID-VkValidationFlagsEXT-pDisabledValidationChecks-parameter", + "text": " pDisabledValidationChecks must be a valid pointer to an array of disabledValidationCheckCount VkValidationCheckEXT values" + }, + { + "vuid": "VUID-VkValidationFlagsEXT-disabledValidationCheckCount-arraylength", + "text": " disabledValidationCheckCount must be greater than 0" + } + ] + }, + "VkApplicationInfo": { + "core": [ + { + "vuid": "VUID-VkApplicationInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_APPLICATION_INFO" + }, + { + "vuid": "VUID-VkApplicationInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkApplicationInfo-pApplicationName-parameter", + "text": " If pApplicationName is not NULL, pApplicationName must be a null-terminated UTF-8 string" + }, + { + "vuid": "VUID-VkApplicationInfo-pEngineName-parameter", + "text": " If pEngineName is not NULL, pEngineName must be a null-terminated UTF-8 string" + } + ] + }, + "vkDestroyInstance": { + "core": [ + { + "vuid": "VUID-vkDestroyInstance-instance-00629", + "text": " All child objects created using instance must have been destroyed prior to destroying instance" + }, + { + "vuid": "VUID-vkDestroyInstance-instance-00630", + "text": " If VkAllocationCallbacks were provided when instance was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyInstance-instance-00631", + "text": " If no VkAllocationCallbacks were provided when instance was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyInstance-instance-parameter", + "text": " If instance is not NULL, instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkDestroyInstance-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + } + ] + }, + "vkEnumeratePhysicalDevices": { + "core": [ + { + "vuid": "VUID-vkEnumeratePhysicalDevices-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter", + "text": " pPhysicalDeviceCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkEnumeratePhysicalDevices-pPhysicalDevices-parameter", + "text": " 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" + } + ] + }, + "vkGetPhysicalDeviceProperties": { + "core": [ + { + "vuid": "VUID-vkGetPhysicalDeviceProperties-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceProperties-pProperties-parameter", + "text": " pProperties must be a valid pointer to a VkPhysicalDeviceProperties structure" + } + ] + }, + "vkGetPhysicalDeviceProperties2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceProperties2-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter", + "text": " pProperties must be a valid pointer to a VkPhysicalDeviceProperties2 structure" + } + ] + }, + "VkPhysicalDeviceProperties2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkPhysicalDeviceProperties2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2" + }, + { + "vuid": "VUID-VkPhysicalDeviceProperties2-pNext-pNext", + "text": " 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, VkPhysicalDeviceDescriptorIndexingPropertiesEXT, VkPhysicalDeviceDiscardRectanglePropertiesEXT, VkPhysicalDeviceExternalMemoryHostPropertiesEXT, VkPhysicalDeviceIDProperties, VkPhysicalDeviceMaintenance3Properties, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, VkPhysicalDeviceMultiviewProperties, VkPhysicalDevicePointClippingProperties, VkPhysicalDeviceProtectedMemoryProperties, VkPhysicalDevicePushDescriptorPropertiesKHR, VkPhysicalDeviceSampleLocationsPropertiesEXT, VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT, VkPhysicalDeviceShaderCorePropertiesAMD, VkPhysicalDeviceSubgroupProperties, or VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT" + }, + { + "vuid": "VUID-VkPhysicalDeviceProperties2-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + } + ] + }, + "VkPhysicalDeviceIDProperties": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_VERSION_1_1,VK_KHR_external_memory_capabilities,VK_KHR_external_semaphore_capabilities,VK_KHR_external_fence_capabilities)": [ + { + "vuid": "VUID-VkPhysicalDeviceIDProperties-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES" + } + ] + }, + "vkGetPhysicalDeviceQueueFamilyProperties": { + "core": [ + { + "vuid": "VUID-vkGetPhysicalDeviceQueueFamilyProperties-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyPropertyCount-parameter", + "text": " pQueueFamilyPropertyCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyProperties-parameter", + "text": " 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" + } + ] + }, + "vkGetPhysicalDeviceQueueFamilyProperties2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceQueueFamilyProperties2-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyPropertyCount-parameter", + "text": " pQueueFamilyPropertyCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyProperties-parameter", + "text": " 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" + } + ] + }, + "VkQueueFamilyProperties2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkQueueFamilyProperties2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2" + }, + { + "vuid": "VUID-VkQueueFamilyProperties2-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "vkEnumeratePhysicalDeviceGroups": { + "(VK_VERSION_1_1,VK_KHR_device_group_creation)": [ + { + "vuid": "VUID-vkEnumeratePhysicalDeviceGroups-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupCount-parameter", + "text": " pPhysicalDeviceGroupCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupProperties-parameter", + "text": " 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" + } + ] + }, + "vkCreateDevice": { + "core": [ + { + "vuid": "VUID-vkCreateDevice-ppEnabledExtensionNames-01387", + "text": " All &amp;lt;&amp;lt;extended-functionality-extensions-dependencies, required extensions&amp;gt;&amp;gt; for each extension in the VkDeviceCreateInfo::ppEnabledExtensionNames list must also be present in that list." + }, + { + "vuid": "VUID-vkCreateDevice-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkCreateDevice-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkDeviceCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateDevice-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateDevice-pDevice-parameter", + "text": " pDevice must be a valid pointer to a VkDevice handle" + } + ] + }, + "VkDeviceCreateInfo": { + "core": [ + { + "vuid": "VUID-VkDeviceCreateInfo-queueFamilyIndex-00372", + "text": "" + }, + { + "vuid": "VUID-VkDeviceCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO" + }, + { + "vuid": "VUID-VkDeviceCreateInfo-pNext-pNext", + "text": " 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 VkDeviceGroupDeviceCreateInfo, VkPhysicalDevice16BitStorageFeatures, VkPhysicalDeviceDescriptorIndexingFeaturesEXT, VkPhysicalDeviceFeatures2, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceSamplerYcbcrConversionFeatures, or VkPhysicalDeviceVariablePointerFeatures" + }, + { + "vuid": "VUID-VkDeviceCreateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkDeviceCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkDeviceCreateInfo-pQueueCreateInfos-parameter", + "text": " pQueueCreateInfos must be a valid pointer to an array of queueCreateInfoCount valid VkDeviceQueueCreateInfo structures" + }, + { + "vuid": "VUID-VkDeviceCreateInfo-ppEnabledLayerNames-parameter", + "text": " If enabledLayerCount is not 0, ppEnabledLayerNames must be a valid pointer to an array of enabledLayerCount null-terminated UTF-8 strings" + }, + { + "vuid": "VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-parameter", + "text": " If enabledExtensionCount is not 0, ppEnabledExtensionNames must be a valid pointer to an array of enabledExtensionCount null-terminated UTF-8 strings" + }, + { + "vuid": "VUID-VkDeviceCreateInfo-pEnabledFeatures-parameter", + "text": " If pEnabledFeatures is not NULL, pEnabledFeatures must be a valid pointer to a valid VkPhysicalDeviceFeatures structure" + }, + { + "vuid": "VUID-VkDeviceCreateInfo-queueCreateInfoCount-arraylength", + "text": " queueCreateInfoCount must be greater than 0" + } + ], + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkDeviceCreateInfo-pNext-00373", + "text": " If the pNext chain includes a VkPhysicalDeviceFeatures2 structure, then pEnabledFeatures must be NULL" + } + ], + "(VK_AMD_negative_viewport_height)+(VK_VERSION_1_1)": [ + { + "vuid": "VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-01840", + "text": " ppEnabledExtensionNames must not contain VK_AMD_negative_viewport_height" + } + ], + "(VK_AMD_negative_viewport_height)+!(VK_VERSION_1_1)+(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-00374", + "text": " ppEnabledExtensionNames must not contain both VK_KHR_maintenance1 and VK_AMD_negative_viewport_height" + } + ] + }, + "VkDeviceGroupDeviceCreateInfo": { + "(VK_VERSION_1_1,VK_KHR_device_group_creation)": [ + { + "vuid": "VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00375", + "text": " Each element of pPhysicalDevices must be unique" + }, + { + "vuid": "VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00376", + "text": " All elements of pPhysicalDevices must be in the same device group as enumerated by vkEnumeratePhysicalDeviceGroups" + }, + { + "vuid": "VUID-VkDeviceGroupDeviceCreateInfo-physicalDeviceCount-00377", + "text": " If physicalDeviceCount is not 0, the physicalDevice parameter of vkCreateDevice must be an element of pPhysicalDevices." + }, + { + "vuid": "VUID-VkDeviceGroupDeviceCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO" + }, + { + "vuid": "VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-parameter", + "text": " If physicalDeviceCount is not 0, pPhysicalDevices must be a valid pointer to an array of physicalDeviceCount valid VkPhysicalDevice handles" + } + ] + }, + "vkDestroyDevice": { + "core": [ + { + "vuid": "VUID-vkDestroyDevice-device-00378", + "text": " All child objects created on device must have been destroyed prior to destroying device" + }, + { + "vuid": "VUID-vkDestroyDevice-device-00379", + "text": " If VkAllocationCallbacks were provided when device was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyDevice-device-00380", + "text": " If no VkAllocationCallbacks were provided when device was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyDevice-device-parameter", + "text": " If device is not NULL, device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyDevice-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + } + ] + }, + "VkDeviceQueueCreateInfo": { + "core": [ + { + "vuid": "VUID-VkDeviceQueueCreateInfo-queueFamilyIndex-00381", + "text": " queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties" + }, + { + "vuid": "VUID-VkDeviceQueueCreateInfo-queueCount-00382", + "text": " queueCount must be less than or equal to the queueCount member of the VkQueueFamilyProperties structure, as returned by vkGetPhysicalDeviceQueueFamilyProperties in the pQueueFamilyProperties[queueFamilyIndex]" + }, + { + "vuid": "VUID-VkDeviceQueueCreateInfo-pQueuePriorities-00383", + "text": " Each element of pQueuePriorities must be between 0.0 and 1.0 inclusive" + }, + { + "vuid": "VUID-VkDeviceQueueCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO" + }, + { + "vuid": "VUID-VkDeviceQueueCreateInfo-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkDeviceQueueGlobalPriorityCreateInfoEXT" + }, + { + "vuid": "VUID-VkDeviceQueueCreateInfo-flags-parameter", + "text": " flags must be a valid combination of VkDeviceQueueCreateFlagBits values" + }, + { + "vuid": "VUID-VkDeviceQueueCreateInfo-pQueuePriorities-parameter", + "text": " pQueuePriorities must be a valid pointer to an array of queueCount float values" + }, + { + "vuid": "VUID-VkDeviceQueueCreateInfo-queueCount-arraylength", + "text": " queueCount must be greater than 0" + } + ] + }, + "VkDeviceQueueGlobalPriorityCreateInfoEXT": { + "(VK_EXT_global_priority)": [ + { + "vuid": "VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-globalPriority-parameter", + "text": " globalPriority must be a valid VkQueueGlobalPriorityEXT value" + } + ] + }, + "vkGetDeviceQueue": { + "core": [ + { + "vuid": "VUID-vkGetDeviceQueue-queueFamilyIndex-00384", + "text": " queueFamilyIndex must be one of the queue family indices specified when device was created, via the VkDeviceQueueCreateInfo structure" + }, + { + "vuid": "VUID-vkGetDeviceQueue-queueIndex-00385", + "text": " 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" + }, + { + "vuid": "VUID-vkGetDeviceQueue-flags-01841", + "text": " VkDeviceQueueCreateInfo::flags must have been set to zero when device was created" + }, + { + "vuid": "VUID-vkGetDeviceQueue-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetDeviceQueue-pQueue-parameter", + "text": " pQueue must be a valid pointer to a VkQueue handle" + } + ] + }, + "vkGetDeviceQueue2": { + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkGetDeviceQueue2-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetDeviceQueue2-pQueueInfo-parameter", + "text": " pQueueInfo must be a valid pointer to a valid VkDeviceQueueInfo2 structure" + }, + { + "vuid": "VUID-vkGetDeviceQueue2-pQueue-parameter", + "text": " pQueue must be a valid pointer to a VkQueue handle" + } + ] + }, + "VkDeviceQueueInfo2": { + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-VkDeviceQueueInfo2-queueFamilyIndex-01842", + "text": " queueFamilyIndex must be one of the queue family indices specified when device was created, via the VkDeviceQueueCreateInfo structure" + }, + { + "vuid": "VUID-VkDeviceQueueInfo2-queueIndex-01843", + "text": " 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" + }, + { + "vuid": "VUID-VkDeviceQueueInfo2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2" + }, + { + "vuid": "VUID-VkDeviceQueueInfo2-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDeviceQueueInfo2-flags-parameter", + "text": " flags must be a valid combination of VkDeviceQueueCreateFlagBits values" + }, + { + "vuid": "VUID-VkDeviceQueueInfo2-flags-requiredbitmask", + "text": " flags must not be 0" + } + ] + }, + "vkCreateCommandPool": { + "core": [ + { + "vuid": "VUID-vkCreateCommandPool-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateCommandPool-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkCommandPoolCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateCommandPool-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateCommandPool-pCommandPool-parameter", + "text": " pCommandPool must be a valid pointer to a VkCommandPool handle" + } + ] + }, + "VkCommandPoolCreateInfo": { + "core": [ + { + "vuid": "VUID-VkCommandPoolCreateInfo-queueFamilyIndex-00039", + "text": " queueFamilyIndex must be the index of a queue family available in the calling command’s device parameter" + }, + { + "vuid": "VUID-VkCommandPoolCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO" + }, + { + "vuid": "VUID-VkCommandPoolCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkCommandPoolCreateInfo-flags-parameter", + "text": " flags must be a valid combination of VkCommandPoolCreateFlagBits values" + } + ] + }, + "vkTrimCommandPool": { + "(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-vkTrimCommandPool-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkTrimCommandPool-commandPool-parameter", + "text": " commandPool must be a valid VkCommandPool handle" + }, + { + "vuid": "VUID-vkTrimCommandPool-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-vkTrimCommandPool-commandPool-parent", + "text": " commandPool must have been created, allocated, or retrieved from device" + } + ] + }, + "vkResetCommandPool": { + "core": [ + { + "vuid": "VUID-vkResetCommandPool-commandPool-00040", + "text": " All VkCommandBuffer objects allocated from commandPool must not be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, pending state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkResetCommandPool-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkResetCommandPool-commandPool-parameter", + "text": " commandPool must be a valid VkCommandPool handle" + }, + { + "vuid": "VUID-vkResetCommandPool-flags-parameter", + "text": " flags must be a valid combination of VkCommandPoolResetFlagBits values" + }, + { + "vuid": "VUID-vkResetCommandPool-commandPool-parent", + "text": " commandPool must have been created, allocated, or retrieved from device" + } + ] + }, + "vkDestroyCommandPool": { + "core": [ + { + "vuid": "VUID-vkDestroyCommandPool-commandPool-00041", + "text": " All VkCommandBuffer objects allocated from commandPool must not be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, pending state&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkDestroyCommandPool-commandPool-00042", + "text": " If VkAllocationCallbacks were provided when commandPool was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyCommandPool-commandPool-00043", + "text": " If no VkAllocationCallbacks were provided when commandPool was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyCommandPool-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyCommandPool-commandPool-parameter", + "text": " If commandPool is not VK_NULL_HANDLE, commandPool must be a valid VkCommandPool handle" + }, + { + "vuid": "VUID-vkDestroyCommandPool-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyCommandPool-commandPool-parent", + "text": " If commandPool is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkAllocateCommandBuffers": { + "core": [ + { + "vuid": "VUID-vkAllocateCommandBuffers-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkAllocateCommandBuffers-pAllocateInfo-parameter", + "text": " pAllocateInfo must be a valid pointer to a valid VkCommandBufferAllocateInfo structure" + }, + { + "vuid": "VUID-vkAllocateCommandBuffers-pCommandBuffers-parameter", + "text": " pCommandBuffers must be a valid pointer to an array of pAllocateInfo::commandBufferCount VkCommandBuffer handles" + } + ] + }, + "VkCommandBufferAllocateInfo": { + "core": [ + { + "vuid": "VUID-VkCommandBufferAllocateInfo-commandBufferCount-00044", + "text": " commandBufferCount must be greater than 0" + }, + { + "vuid": "VUID-VkCommandBufferAllocateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO" + }, + { + "vuid": "VUID-VkCommandBufferAllocateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkCommandBufferAllocateInfo-commandPool-parameter", + "text": " commandPool must be a valid VkCommandPool handle" + }, + { + "vuid": "VUID-VkCommandBufferAllocateInfo-level-parameter", + "text": " level must be a valid VkCommandBufferLevel value" + } + ] + }, + "vkResetCommandBuffer": { + "core": [ + { + "vuid": "VUID-vkResetCommandBuffer-commandBuffer-00045", + "text": " commandBuffer must not be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, pending state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkResetCommandBuffer-commandBuffer-00046", + "text": " commandBuffer must have been allocated from a pool that was created with the VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT" + }, + { + "vuid": "VUID-vkResetCommandBuffer-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkResetCommandBuffer-flags-parameter", + "text": " flags must be a valid combination of VkCommandBufferResetFlagBits values" + } + ] + }, + "vkFreeCommandBuffers": { + "core": [ + { + "vuid": "VUID-vkFreeCommandBuffers-pCommandBuffers-00047", + "text": " All elements of pCommandBuffers must not be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, pending state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkFreeCommandBuffers-pCommandBuffers-00048", + "text": " 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" + }, + { + "vuid": "VUID-vkFreeCommandBuffers-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkFreeCommandBuffers-commandPool-parameter", + "text": " commandPool must be a valid VkCommandPool handle" + }, + { + "vuid": "VUID-vkFreeCommandBuffers-commandBufferCount-arraylength", + "text": " commandBufferCount must be greater than 0" + }, + { + "vuid": "VUID-vkFreeCommandBuffers-commandPool-parent", + "text": " commandPool must have been created, allocated, or retrieved from device" + }, + { + "vuid": "VUID-vkFreeCommandBuffers-pCommandBuffers-parent", + "text": " Each element of pCommandBuffers that is a valid handle must have been created, allocated, or retrieved from commandPool" + } + ] + }, + "vkBeginCommandBuffer": { + "core": [ + { + "vuid": "VUID-vkBeginCommandBuffer-commandBuffer-00049", + "text": " commandBuffer must not be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording or pending state&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkBeginCommandBuffer-commandBuffer-00050", + "text": " 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 &amp;lt;&amp;lt;commandbuffers-lifecycle, initial state&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkBeginCommandBuffer-commandBuffer-00051", + "text": " If commandBuffer is a secondary command buffer, the pInheritanceInfo member of pBeginInfo must be a valid VkCommandBufferInheritanceInfo structure" + }, + { + "vuid": "VUID-vkBeginCommandBuffer-commandBuffer-00052", + "text": " 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" + }, + { + "vuid": "VUID-vkBeginCommandBuffer-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkBeginCommandBuffer-pBeginInfo-parameter", + "text": " pBeginInfo must be a valid pointer to a valid VkCommandBufferBeginInfo structure" + } + ] + }, + "VkCommandBufferBeginInfo": { + "core": [ + { + "vuid": "VUID-VkCommandBufferBeginInfo-flags-00053", + "text": " If flags contains VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the renderPass member of pInheritanceInfo must be a valid VkRenderPass" + }, + { + "vuid": "VUID-VkCommandBufferBeginInfo-flags-00054", + "text": " 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" + }, + { + "vuid": "VUID-VkCommandBufferBeginInfo-flags-00055", + "text": " 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" + }, + { + "vuid": "VUID-VkCommandBufferBeginInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO" + }, + { + "vuid": "VUID-VkCommandBufferBeginInfo-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkDeviceGroupCommandBufferBeginInfo" + }, + { + "vuid": "VUID-VkCommandBufferBeginInfo-flags-parameter", + "text": " flags must be a valid combination of VkCommandBufferUsageFlagBits values" + } + ] + }, + "VkCommandBufferInheritanceInfo": { + "core": [ + { + "vuid": "VUID-VkCommandBufferInheritanceInfo-occlusionQueryEnable-00056", + "text": " If the &amp;lt;&amp;lt;features-features-inheritedQueries,inherited queries&amp;gt;&amp;gt; feature is not enabled, occlusionQueryEnable must be VK_FALSE" + }, + { + "vuid": "VUID-VkCommandBufferInheritanceInfo-queryFlags-00057", + "text": " If the &amp;lt;&amp;lt;features-features-inheritedQueries,inherited queries&amp;gt;&amp;gt; feature is enabled, queryFlags must be a valid combination of VkQueryControlFlagBits values" + }, + { + "vuid": "VUID-VkCommandBufferInheritanceInfo-pipelineStatistics-00058", + "text": " If the &amp;lt;&amp;lt;features-features-pipelineStatisticsQuery,pipeline statistics queries&amp;gt;&amp;gt; feature is not enabled, pipelineStatistics must be 0" + }, + { + "vuid": "VUID-VkCommandBufferInheritanceInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO" + }, + { + "vuid": "VUID-VkCommandBufferInheritanceInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkCommandBufferInheritanceInfo-commonparent", + "text": " Both of framebuffer, and renderPass that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "vkEndCommandBuffer": { + "core": [ + { + "vuid": "VUID-vkEndCommandBuffer-commandBuffer-00059", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkEndCommandBuffer-commandBuffer-00060", + "text": " If commandBuffer is a primary command buffer, there must not be an active render pass instance" + }, + { + "vuid": "VUID-vkEndCommandBuffer-commandBuffer-00061", + "text": " All queries made &amp;lt;&amp;lt;queries-operation-active,active&amp;gt;&amp;gt; during the recording of commandBuffer must have been made inactive" + }, + { + "vuid": "VUID-vkEndCommandBuffer-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + } + ], + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-vkEndCommandBuffer-commandBuffer-01815", + "text": " 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." + } + ], + "(VK_EXT_debug_marker)": [ + { + "vuid": "VUID-vkEndCommandBuffer-commandBuffer-00062", + "text": " 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." + } + ] + }, + "vkQueueSubmit": { + "core": [ + { + "vuid": "VUID-vkQueueSubmit-fence-00063", + "text": " If fence is not VK_NULL_HANDLE, fence must be unsignaled" + }, + { + "vuid": "VUID-vkQueueSubmit-fence-00064", + "text": " 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" + }, + { + "vuid": "VUID-vkQueueSubmit-pCommandBuffers-00065", + "text": " 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." + }, + { + "vuid": "VUID-vkQueueSubmit-pWaitDstStageMask-00066", + "text": " 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 &amp;lt;&amp;lt;synchronization-pipeline-stages-supported, table of supported pipeline stages&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkQueueSubmit-pSignalSemaphores-00067", + "text": " 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" + }, + { + "vuid": "VUID-vkQueueSubmit-pWaitSemaphores-00068", + "text": " When a semaphore unsignal operation defined by any element of the pWaitSemaphores member of any element of pSubmits executes on queue, no other queue must be waiting on the same semaphore." + }, + { + "vuid": "VUID-vkQueueSubmit-pWaitSemaphores-00069", + "text": " All elements of the pWaitSemaphores member of all elements of pSubmits must be semaphores that are signaled, or have &amp;lt;&amp;lt;synchronization-semaphores-signaling, semaphore signal operations&amp;gt;&amp;gt; previously submitted for execution." + }, + { + "vuid": "VUID-vkQueueSubmit-pCommandBuffers-00070", + "text": " Each element of the pCommandBuffers member of each element of pSubmits must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, pending or executable state&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkQueueSubmit-pCommandBuffers-00071", + "text": " 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 &amp;lt;&amp;lt;commandbuffers-lifecycle, pending state&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkQueueSubmit-pCommandBuffers-00072", + "text": " Any &amp;lt;&amp;lt;commandbuffers-secondary, secondary command buffers recorded&amp;gt;&amp;gt; into any element of the pCommandBuffers member of any element of pSubmits must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, pending or executable state&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkQueueSubmit-pCommandBuffers-00073", + "text": " If any &amp;lt;&amp;lt;commandbuffers-secondary, secondary command buffers recorded&amp;gt;&amp;gt; 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 &amp;lt;&amp;lt;commandbuffers-lifecycle, pending state&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkQueueSubmit-pCommandBuffers-00074", + "text": " 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." + }, + { + "vuid": "VUID-vkQueueSubmit-queue-parameter", + "text": " queue must be a valid VkQueue handle" + }, + { + "vuid": "VUID-vkQueueSubmit-pSubmits-parameter", + "text": " If submitCount is not 0, pSubmits must be a valid pointer to an array of submitCount valid VkSubmitInfo structures" + }, + { + "vuid": "VUID-vkQueueSubmit-fence-parameter", + "text": " If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle" + }, + { + "vuid": "VUID-vkQueueSubmit-commonparent", + "text": " Both of fence, and queue that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "VkSubmitInfo": { + "core": [ + { + "vuid": "VUID-VkSubmitInfo-pCommandBuffers-00075", + "text": " Each element of pCommandBuffers must not have been allocated with VK_COMMAND_BUFFER_LEVEL_SECONDARY" + }, + { + "vuid": "VUID-VkSubmitInfo-pWaitDstStageMask-00076", + "text": " If the &amp;lt;&amp;lt;features-features-geometryShader,geometry shaders&amp;gt;&amp;gt; feature is not enabled, each element of pWaitDstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT" + }, + { + "vuid": "VUID-VkSubmitInfo-pWaitDstStageMask-00077", + "text": " If the &amp;lt;&amp;lt;features-features-tessellationShader,tessellation shaders&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkSubmitInfo-pWaitDstStageMask-00078", + "text": " Each element of pWaitDstStageMask must not include VK_PIPELINE_STAGE_HOST_BIT." + }, + { + "vuid": "VUID-VkSubmitInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SUBMIT_INFO" + }, + { + "vuid": "VUID-VkSubmitInfo-pNext-pNext", + "text": " 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, VkProtectedSubmitInfo, VkWin32KeyedMutexAcquireReleaseInfoKHR, or VkWin32KeyedMutexAcquireReleaseInfoNV" + }, + { + "vuid": "VUID-VkSubmitInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkSubmitInfo-pWaitSemaphores-parameter", + "text": " If waitSemaphoreCount is not 0, pWaitSemaphores must be a valid pointer to an array of waitSemaphoreCount valid VkSemaphore handles" + }, + { + "vuid": "VUID-VkSubmitInfo-pWaitDstStageMask-parameter", + "text": " If waitSemaphoreCount is not 0, pWaitDstStageMask must be a valid pointer to an array of waitSemaphoreCount valid combinations of VkPipelineStageFlagBits values" + }, + { + "vuid": "VUID-VkSubmitInfo-pWaitDstStageMask-requiredbitmask", + "text": " Each element of pWaitDstStageMask must not be 0" + }, + { + "vuid": "VUID-VkSubmitInfo-pCommandBuffers-parameter", + "text": " If commandBufferCount is not 0, pCommandBuffers must be a valid pointer to an array of commandBufferCount valid VkCommandBuffer handles" + }, + { + "vuid": "VUID-VkSubmitInfo-pSignalSemaphores-parameter", + "text": " If signalSemaphoreCount is not 0, pSignalSemaphores must be a valid pointer to an array of signalSemaphoreCount valid VkSemaphore handles" + }, + { + "vuid": "VUID-VkSubmitInfo-commonparent", + "text": " Each of the elements of pCommandBuffers, the elements of pSignalSemaphores, and the elements of pWaitSemaphores that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "VkD3D12FenceSubmitInfoKHR": { + "(VK_KHR_external_semaphore_win32)": [ + { + "vuid": "VUID-VkD3D12FenceSubmitInfoKHR-waitSemaphoreValuesCount-00079", + "text": " waitSemaphoreValuesCount must be the same value as VkSubmitInfo::waitSemaphoreCount, where VkSubmitInfo is in the pNext chain of this VkD3D12FenceSubmitInfoKHR structure." + }, + { + "vuid": "VUID-VkD3D12FenceSubmitInfoKHR-signalSemaphoreValuesCount-00080", + "text": " signalSemaphoreValuesCount must be the same value as VkSubmitInfo::signalSemaphoreCount, where VkSubmitInfo is in the pNext chain of this VkD3D12FenceSubmitInfoKHR structure." + }, + { + "vuid": "VUID-VkD3D12FenceSubmitInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR" + }, + { + "vuid": "VUID-VkD3D12FenceSubmitInfoKHR-pWaitSemaphoreValues-parameter", + "text": " If waitSemaphoreValuesCount is not 0, and pWaitSemaphoreValues is not NULL, pWaitSemaphoreValues must be a valid pointer to an array of waitSemaphoreValuesCount uint64_t values" + }, + { + "vuid": "VUID-VkD3D12FenceSubmitInfoKHR-pSignalSemaphoreValues-parameter", + "text": " If signalSemaphoreValuesCount is not 0, and pSignalSemaphoreValues is not NULL, pSignalSemaphoreValues must be a valid pointer to an array of signalSemaphoreValuesCount uint64_t values" + } + ] + }, + "VkWin32KeyedMutexAcquireReleaseInfoKHR": { + "(VK_KHR_win32_keyed_mutex)": [ + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireSyncs-00081", + "text": " 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." + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR" + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireSyncs-parameter", + "text": " If acquireCount is not 0, pAcquireSyncs must be a valid pointer to an array of acquireCount valid VkDeviceMemory handles" + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireKeys-parameter", + "text": " If acquireCount is not 0, pAcquireKeys must be a valid pointer to an array of acquireCount uint64_t values" + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireTimeouts-parameter", + "text": " If acquireCount is not 0, pAcquireTimeouts must be a valid pointer to an array of acquireCount uint32_t values" + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pReleaseSyncs-parameter", + "text": " If releaseCount is not 0, pReleaseSyncs must be a valid pointer to an array of releaseCount valid VkDeviceMemory handles" + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pReleaseKeys-parameter", + "text": " If releaseCount is not 0, pReleaseKeys must be a valid pointer to an array of releaseCount uint64_t values" + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-commonparent", + "text": " Both of the elements of pAcquireSyncs, and the elements of pReleaseSyncs that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "VkWin32KeyedMutexAcquireReleaseInfoNV": { + "(VK_NV_win32_keyed_mutex)": [ + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV" + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireSyncs-parameter", + "text": " If acquireCount is not 0, pAcquireSyncs must be a valid pointer to an array of acquireCount valid VkDeviceMemory handles" + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireKeys-parameter", + "text": " If acquireCount is not 0, pAcquireKeys must be a valid pointer to an array of acquireCount uint64_t values" + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireTimeoutMilliseconds-parameter", + "text": " If acquireCount is not 0, pAcquireTimeoutMilliseconds must be a valid pointer to an array of acquireCount uint32_t values" + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pReleaseSyncs-parameter", + "text": " If releaseCount is not 0, pReleaseSyncs must be a valid pointer to an array of releaseCount valid VkDeviceMemory handles" + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pReleaseKeys-parameter", + "text": " If releaseCount is not 0, pReleaseKeys must be a valid pointer to an array of releaseCount uint64_t values" + }, + { + "vuid": "VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-commonparent", + "text": " Both of the elements of pAcquireSyncs, and the elements of pReleaseSyncs that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "VkProtectedSubmitInfo": { + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-VkProtectedSubmitInfo-protectedSubmit-01816", + "text": " If the protected memory feature is not enabled, protectedSubmit must not be VK_TRUE." + }, + { + "vuid": "VUID-VkProtectedSubmitInfo-protectedSubmit-01817", + "text": " If protectedSubmit is VK_TRUE, then each element of the pCommandBuffers array must be a protected command buffer." + }, + { + "vuid": "VUID-VkProtectedSubmitInfo-protectedSubmit-01818", + "text": " If protectedSubmit is VK_FALSE, then each element of the pCommandBuffers array must be an unprotected command buffer." + }, + { + "vuid": "VUID-VkProtectedSubmitInfo-pNext-01819", + "text": " 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." + }, + { + "vuid": "VUID-VkProtectedSubmitInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO" + } + ] + }, + "VkDeviceGroupSubmitInfo": { + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkDeviceGroupSubmitInfo-waitSemaphoreCount-00082", + "text": " waitSemaphoreCount must equal VkSubmitInfo::waitSemaphoreCount" + }, + { + "vuid": "VUID-VkDeviceGroupSubmitInfo-commandBufferCount-00083", + "text": " commandBufferCount must equal VkSubmitInfo::commandBufferCount" + }, + { + "vuid": "VUID-VkDeviceGroupSubmitInfo-signalSemaphoreCount-00084", + "text": " signalSemaphoreCount must equal VkSubmitInfo::signalSemaphoreCount" + }, + { + "vuid": "VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-00085", + "text": " All elements of pWaitSemaphoreDeviceIndices and pSignalSemaphoreDeviceIndices must be valid device indices" + }, + { + "vuid": "VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-00086", + "text": " All elements of pCommandBufferDeviceMasks must be valid device masks" + }, + { + "vuid": "VUID-VkDeviceGroupSubmitInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO" + }, + { + "vuid": "VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-parameter", + "text": " If waitSemaphoreCount is not 0, pWaitSemaphoreDeviceIndices must be a valid pointer to an array of waitSemaphoreCount uint32_t values" + }, + { + "vuid": "VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-parameter", + "text": " If commandBufferCount is not 0, pCommandBufferDeviceMasks must be a valid pointer to an array of commandBufferCount uint32_t values" + }, + { + "vuid": "VUID-VkDeviceGroupSubmitInfo-pSignalSemaphoreDeviceIndices-parameter", + "text": " If signalSemaphoreCount is not 0, pSignalSemaphoreDeviceIndices must be a valid pointer to an array of signalSemaphoreCount uint32_t values" + } + ] + }, + "vkCmdExecuteCommands": { + "core": [ + { + "vuid": "VUID-vkCmdExecuteCommands-commandBuffer-00087", + "text": " commandBuffer must have been allocated with a level of VK_COMMAND_BUFFER_LEVEL_PRIMARY" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-00088", + "text": " Each element of pCommandBuffers must have been allocated with a level of VK_COMMAND_BUFFER_LEVEL_SECONDARY" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-00089", + "text": " Each element of pCommandBuffers must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, pending or executable state&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-00090", + "text": " If any element of pCommandBuffers was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, and it was recorded into any other primary command buffer, that primary command buffer must not be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, pending state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-00091", + "text": " If any element of pCommandBuffers was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, it must not be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, pending state&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-00092", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-00093", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-00094", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-contents-00095", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-00096", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-00097", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pInheritanceInfo-00098", + "text": " If vkCmdExecuteCommands is being called within a render pass instance, the render passes specified in the pname::pBeginInfo::pInheritanceInfo::renderPass members of the vkBeginCommandBuffer commands used to begin recording each element of pCommandBuffers must be &amp;lt;&amp;lt;renderpass-compatibility,compatible&amp;gt;&amp;gt; with the current render pass." + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-00099", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-00100", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-commandBuffer-00101", + "text": " If the &amp;lt;&amp;lt;features-features-inheritedQueries,inherited queries&amp;gt;&amp;gt; feature is not enabled, commandBuffer must not have any queries &amp;lt;&amp;lt;queries-operation-active,active&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-commandBuffer-00102", + "text": " If commandBuffer has a VK_QUERY_TYPE_OCCLUSION query &amp;lt;&amp;lt;queries-operation-active,active&amp;gt;&amp;gt;, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceInfo::occlusionQueryEnable set to VK_TRUE" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-commandBuffer-00103", + "text": " If commandBuffer has a VK_QUERY_TYPE_OCCLUSION query &amp;lt;&amp;lt;queries-operation-active,active&amp;gt;&amp;gt;, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceInfo::queryFlags having all bits set that are set for the query" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-commandBuffer-00104", + "text": " If commandBuffer has a VK_QUERY_TYPE_PIPELINE_STATISTICS query &amp;lt;&amp;lt;queries-operation-active,active&amp;gt;&amp;gt;, 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" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-00105", + "text": " Each element of pCommandBuffers must not begin any query types that are &amp;lt;&amp;lt;queries-operation-active,active&amp;gt;&amp;gt; in commandBuffer" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-pCommandBuffers-parameter", + "text": " pCommandBuffers must be a valid pointer to an array of commandBufferCount valid VkCommandBuffer handles" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-bufferlevel", + "text": " commandBuffer must be a primary VkCommandBuffer" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-commandBufferCount-arraylength", + "text": " commandBufferCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdExecuteCommands-commonparent", + "text": " Both of commandBuffer, and the elements of pCommandBuffers must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdExecuteCommands-commandBuffer-01820", + "text": " If commandBuffer is a protected command buffer, then each element of pCommandBuffers must be a protected command buffer." + }, + { + "vuid": "VUID-vkCmdExecuteCommands-commandBuffer-01821", + "text": " If commandBuffer is an unprotected command buffer, then each element of pCommandBuffers must be an unprotected command buffer." + } + ] + }, + "VkDeviceGroupCommandBufferBeginInfo": { + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00106", + "text": " deviceMask must be a valid device mask value" + }, + { + "vuid": "VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00107", + "text": " deviceMask must not be zero" + }, + { + "vuid": "VUID-VkDeviceGroupCommandBufferBeginInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO" + } + ] + }, + "vkCmdSetDeviceMask": { + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-vkCmdSetDeviceMask-deviceMask-00108", + "text": " deviceMask must be a valid device mask value" + }, + { + "vuid": "VUID-vkCmdSetDeviceMask-deviceMask-00109", + "text": " deviceMask must not be zero" + }, + { + "vuid": "VUID-vkCmdSetDeviceMask-deviceMask-00110", + "text": " deviceMask must not include any set bits that were not in the VkDeviceGroupCommandBufferBeginInfo::deviceMask value when the command buffer began recording." + }, + { + "vuid": "VUID-vkCmdSetDeviceMask-deviceMask-00111", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdSetDeviceMask-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetDeviceMask-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetDeviceMask-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations" + } + ] + }, + "vkCreateFence": { + "core": [ + { + "vuid": "VUID-vkCreateFence-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateFence-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkFenceCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateFence-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateFence-pFence-parameter", + "text": " pFence must be a valid pointer to a VkFence handle" + } + ] + }, + "VkFenceCreateInfo": { + "core": [ + { + "vuid": "VUID-VkFenceCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_FENCE_CREATE_INFO" + }, + { + "vuid": "VUID-VkFenceCreateInfo-pNext-pNext", + "text": " 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" + }, + { + "vuid": "VUID-VkFenceCreateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkFenceCreateInfo-flags-parameter", + "text": " flags must be a valid combination of VkFenceCreateFlagBits values" + } + ] + }, + "VkExportFenceCreateInfo": { + "(VK_VERSION_1_1,VK_KHR_external_fence)": [ + { + "vuid": "VUID-VkExportFenceCreateInfo-handleTypes-01446", + "text": " The bits in handleTypes must be supported and compatible, as reported by VkExternalFenceProperties." + }, + { + "vuid": "VUID-VkExportFenceCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO" + }, + { + "vuid": "VUID-VkExportFenceCreateInfo-handleTypes-parameter", + "text": " handleTypes must be a valid combination of VkExternalFenceHandleTypeFlagBits values" + } + ] + }, + "VkExportFenceWin32HandleInfoKHR": { + "(VK_KHR_external_fence_win32)": [ + { + "vuid": "VUID-VkExportFenceWin32HandleInfoKHR-handleTypes-01447", + "text": " If VkExportFenceCreateInfo::handleTypes does not include VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT, VkExportFenceWin32HandleInfoKHR must not be in the pNext chain of VkFenceCreateInfo." + }, + { + "vuid": "VUID-VkExportFenceWin32HandleInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR" + }, + { + "vuid": "VUID-VkExportFenceWin32HandleInfoKHR-pAttributes-parameter", + "text": " If pAttributes is not NULL, pAttributes must be a valid pointer to a valid SECURITY_ATTRIBUTES value" + } + ] + }, + "vkGetFenceWin32HandleKHR": { + "(VK_KHR_external_fence_win32)": [ + { + "vuid": "VUID-vkGetFenceWin32HandleKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetFenceWin32HandleKHR-pGetWin32HandleInfo-parameter", + "text": " pGetWin32HandleInfo must be a valid pointer to a valid VkFenceGetWin32HandleInfoKHR structure" + }, + { + "vuid": "VUID-vkGetFenceWin32HandleKHR-pHandle-parameter", + "text": " pHandle must be a valid pointer to a HANDLE value" + } + ] + }, + "VkFenceGetWin32HandleInfoKHR": { + "(VK_KHR_external_fence_win32)": [ + { + "vuid": "VUID-VkFenceGetWin32HandleInfoKHR-handleType-01448", + "text": " handleType must have been included in VkExportFenceCreateInfo::handleTypes when the fence’s current payload was created." + }, + { + "vuid": "VUID-VkFenceGetWin32HandleInfoKHR-handleType-01449", + "text": " 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." + }, + { + "vuid": "VUID-VkFenceGetWin32HandleInfoKHR-fence-01450", + "text": " fence must not currently have its payload replaced by an imported payload as described below in &amp;lt;&amp;lt;synchronization-fences-importing,Importing Fence Payloads&amp;gt;&amp;gt; unless that imported payload’s handle type was included in VkExternalFenceProperties::exportFromImportedHandleTypes for handleType." + }, + { + "vuid": "VUID-VkFenceGetWin32HandleInfoKHR-handleType-01451", + "text": " If handleType refers to a handle type with copy payload transference semantics, fence must be signaled, or have an associated &amp;lt;&amp;lt;synchronization-fences-signaling,fence signal operation&amp;gt;&amp;gt; pending execution." + }, + { + "vuid": "VUID-VkFenceGetWin32HandleInfoKHR-handleType-01452", + "text": " handleType must be defined as an NT handle or a global share handle." + }, + { + "vuid": "VUID-VkFenceGetWin32HandleInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR" + }, + { + "vuid": "VUID-VkFenceGetWin32HandleInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkFenceGetWin32HandleInfoKHR-fence-parameter", + "text": " fence must be a valid VkFence handle" + }, + { + "vuid": "VUID-VkFenceGetWin32HandleInfoKHR-handleType-parameter", + "text": " handleType must be a valid VkExternalFenceHandleTypeFlagBits value" + } + ] + }, + "vkGetFenceFdKHR": { + "(VK_KHR_external_fence_fd)": [ + { + "vuid": "VUID-vkGetFenceFdKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetFenceFdKHR-pGetFdInfo-parameter", + "text": " pGetFdInfo must be a valid pointer to a valid VkFenceGetFdInfoKHR structure" + }, + { + "vuid": "VUID-vkGetFenceFdKHR-pFd-parameter", + "text": " pFd must be a valid pointer to a int value" + } + ] + }, + "VkFenceGetFdInfoKHR": { + "(VK_KHR_external_fence_fd)": [ + { + "vuid": "VUID-VkFenceGetFdInfoKHR-handleType-01453", + "text": " handleType must have been included in VkExportFenceCreateInfo::handleTypes when fence’s current payload was created." + }, + { + "vuid": "VUID-VkFenceGetFdInfoKHR-handleType-01454", + "text": " If handleType refers to a handle type with copy payload transference semantics, fence must be signaled, or have an associated &amp;lt;&amp;lt;synchronization-fences-signaling,fence signal operation&amp;gt;&amp;gt; pending execution." + }, + { + "vuid": "VUID-VkFenceGetFdInfoKHR-fence-01455", + "text": " fence must not currently have its payload replaced by an imported payload as described below in &amp;lt;&amp;lt;synchronization-fences-importing,Importing Fence Payloads&amp;gt;&amp;gt; unless that imported payload’s handle type was included in VkExternalFenceProperties::exportFromImportedHandleTypes for handleType." + }, + { + "vuid": "VUID-VkFenceGetFdInfoKHR-handleType-01456", + "text": " handleType must be defined as a POSIX file descriptor handle." + }, + { + "vuid": "VUID-VkFenceGetFdInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR" + }, + { + "vuid": "VUID-VkFenceGetFdInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkFenceGetFdInfoKHR-fence-parameter", + "text": " fence must be a valid VkFence handle" + }, + { + "vuid": "VUID-VkFenceGetFdInfoKHR-handleType-parameter", + "text": " handleType must be a valid VkExternalFenceHandleTypeFlagBits value" + } + ] + }, + "vkDestroyFence": { + "core": [ + { + "vuid": "VUID-vkDestroyFence-fence-01120", + "text": " All &amp;lt;&amp;lt;devsandqueues-submission, queue submission&amp;gt;&amp;gt; commands that refer to fence must have completed execution" + }, + { + "vuid": "VUID-vkDestroyFence-fence-01121", + "text": " If VkAllocationCallbacks were provided when fence was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyFence-fence-01122", + "text": " If no VkAllocationCallbacks were provided when fence was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyFence-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyFence-fence-parameter", + "text": " If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle" + }, + { + "vuid": "VUID-vkDestroyFence-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyFence-fence-parent", + "text": " If fence is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkGetFenceStatus": { + "core": [ + { + "vuid": "VUID-vkGetFenceStatus-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetFenceStatus-fence-parameter", + "text": " fence must be a valid VkFence handle" + }, + { + "vuid": "VUID-vkGetFenceStatus-fence-parent", + "text": " fence must have been created, allocated, or retrieved from device" + } + ] + }, + "vkResetFences": { + "core": [ + { + "vuid": "VUID-vkResetFences-pFences-01123", + "text": " Each element of pFences must not be currently associated with any queue command that has not yet completed execution on that queue" + }, + { + "vuid": "VUID-vkResetFences-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkResetFences-pFences-parameter", + "text": " pFences must be a valid pointer to an array of fenceCount valid VkFence handles" + }, + { + "vuid": "VUID-vkResetFences-fenceCount-arraylength", + "text": " fenceCount must be greater than 0" + }, + { + "vuid": "VUID-vkResetFences-pFences-parent", + "text": " Each element of pFences must have been created, allocated, or retrieved from device" + } + ] + }, + "vkWaitForFences": { + "core": [ + { + "vuid": "VUID-vkWaitForFences-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkWaitForFences-pFences-parameter", + "text": " pFences must be a valid pointer to an array of fenceCount valid VkFence handles" + }, + { + "vuid": "VUID-vkWaitForFences-fenceCount-arraylength", + "text": " fenceCount must be greater than 0" + }, + { + "vuid": "VUID-vkWaitForFences-pFences-parent", + "text": " Each element of pFences must have been created, allocated, or retrieved from device" + } + ] + }, + "vkRegisterDeviceEventEXT": { + "(VK_EXT_display_control)": [ + { + "vuid": "VUID-vkRegisterDeviceEventEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkRegisterDeviceEventEXT-pDeviceEventInfo-parameter", + "text": " pDeviceEventInfo must be a valid pointer to a valid VkDeviceEventInfoEXT structure" + }, + { + "vuid": "VUID-vkRegisterDeviceEventEXT-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkRegisterDeviceEventEXT-pFence-parameter", + "text": " pFence must be a valid pointer to a VkFence handle" + } + ] + }, + "VkDeviceEventInfoEXT": { + "(VK_EXT_display_control)": [ + { + "vuid": "VUID-VkDeviceEventInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT" + }, + { + "vuid": "VUID-VkDeviceEventInfoEXT-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDeviceEventInfoEXT-deviceEvent-parameter", + "text": " deviceEvent must be a valid VkDeviceEventTypeEXT value" + } + ] + }, + "vkRegisterDisplayEventEXT": { + "(VK_EXT_display_control)": [ + { + "vuid": "VUID-vkRegisterDisplayEventEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkRegisterDisplayEventEXT-display-parameter", + "text": " display must be a valid VkDisplayKHR handle" + }, + { + "vuid": "VUID-vkRegisterDisplayEventEXT-pDisplayEventInfo-parameter", + "text": " pDisplayEventInfo must be a valid pointer to a valid VkDisplayEventInfoEXT structure" + }, + { + "vuid": "VUID-vkRegisterDisplayEventEXT-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkRegisterDisplayEventEXT-pFence-parameter", + "text": " pFence must be a valid pointer to a VkFence handle" + } + ] + }, + "VkDisplayEventInfoEXT": { + "(VK_EXT_display_control)": [ + { + "vuid": "VUID-VkDisplayEventInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT" + }, + { + "vuid": "VUID-VkDisplayEventInfoEXT-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDisplayEventInfoEXT-displayEvent-parameter", + "text": " displayEvent must be a valid VkDisplayEventTypeEXT value" + } + ] + }, + "vkImportFenceWin32HandleKHR": { + "(VK_KHR_external_fence_win32)": [ + { + "vuid": "VUID-vkImportFenceWin32HandleKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkImportFenceWin32HandleKHR-pImportFenceWin32HandleInfo-parameter", + "text": " pImportFenceWin32HandleInfo must be a valid pointer to a valid VkImportFenceWin32HandleInfoKHR structure" + } + ] + }, + "VkImportFenceWin32HandleInfoKHR": { + "(VK_KHR_external_fence_win32)": [ + { + "vuid": "VUID-VkImportFenceWin32HandleInfoKHR-handleType-01457", + "text": " handleType must be a value included in the &amp;lt;&amp;lt;synchronization-fence-handletypes-win32, Handle Types Supported by VkImportFenceWin32HandleInfoKHR&amp;gt;&amp;gt; table." + }, + { + "vuid": "VUID-VkImportFenceWin32HandleInfoKHR-handleType-01459", + "text": " If handleType is not VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT, name must be NULL." + }, + { + "vuid": "VUID-VkImportFenceWin32HandleInfoKHR-handleType-01460", + "text": " If handleType is not 0 and handle is NULL, name must name a valid synchronization primitive of the type specified by handleType." + }, + { + "vuid": "VUID-VkImportFenceWin32HandleInfoKHR-handleType-01461", + "text": " If handleType is not 0 and name is NULL, handle must be a valid handle of the type specified by handleType." + }, + { + "vuid": "VUID-VkImportFenceWin32HandleInfoKHR-handle-01462", + "text": " If handle is not NULL, name must be NULL." + }, + { + "vuid": "VUID-VkImportFenceWin32HandleInfoKHR-handle-01539", + "text": " If handle is not NULL, it must obey any requirements listed for handleType in external fence handle types compatibility." + }, + { + "vuid": "VUID-VkImportFenceWin32HandleInfoKHR-name-01540", + "text": " If name is not NULL, it must obey any requirements listed for handleType in external fence handle types compatibility." + }, + { + "vuid": "VUID-VkImportFenceWin32HandleInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR" + }, + { + "vuid": "VUID-VkImportFenceWin32HandleInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkImportFenceWin32HandleInfoKHR-fence-parameter", + "text": " fence must be a valid VkFence handle" + }, + { + "vuid": "VUID-VkImportFenceWin32HandleInfoKHR-flags-parameter", + "text": " flags must be a valid combination of VkFenceImportFlagBits values" + }, + { + "vuid": "VUID-VkImportFenceWin32HandleInfoKHR-handleType-parameter", + "text": " If handleType is not 0, handleType must be a valid VkExternalFenceHandleTypeFlagBits value" + } + ] + }, + "vkImportFenceFdKHR": { + "(VK_KHR_external_fence_fd)": [ + { + "vuid": "VUID-vkImportFenceFdKHR-fence-01463", + "text": " fence must not be associated with any queue command that has not yet completed execution on that queue" + }, + { + "vuid": "VUID-vkImportFenceFdKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkImportFenceFdKHR-pImportFenceFdInfo-parameter", + "text": " pImportFenceFdInfo must be a valid pointer to a valid VkImportFenceFdInfoKHR structure" + } + ] + }, + "VkImportFenceFdInfoKHR": { + "(VK_KHR_external_fence_fd)": [ + { + "vuid": "VUID-VkImportFenceFdInfoKHR-handleType-01464", + "text": " handleType must be a value included in the &amp;lt;&amp;lt;synchronization-fence-handletypes-fd, Handle Types Supported by VkImportFenceFdInfoKHR&amp;gt;&amp;gt; table." + }, + { + "vuid": "VUID-VkImportFenceFdInfoKHR-fd-01541", + "text": " fd must obey any requirements listed for handleType in &amp;lt;&amp;lt;external-fence-handle-types-compatibility,external fence handle types compatibility&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkImportFenceFdInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR" + }, + { + "vuid": "VUID-VkImportFenceFdInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkImportFenceFdInfoKHR-fence-parameter", + "text": " fence must be a valid VkFence handle" + }, + { + "vuid": "VUID-VkImportFenceFdInfoKHR-flags-parameter", + "text": " flags must be a valid combination of VkFenceImportFlagBits values" + }, + { + "vuid": "VUID-VkImportFenceFdInfoKHR-handleType-parameter", + "text": " handleType must be a valid VkExternalFenceHandleTypeFlagBits value" + } + ] + }, + "vkCreateSemaphore": { + "core": [ + { + "vuid": "VUID-vkCreateSemaphore-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateSemaphore-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkSemaphoreCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateSemaphore-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateSemaphore-pSemaphore-parameter", + "text": " pSemaphore must be a valid pointer to a VkSemaphore handle" + } + ] + }, + "VkSemaphoreCreateInfo": { + "core": [ + { + "vuid": "VUID-VkSemaphoreCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO" + }, + { + "vuid": "VUID-VkSemaphoreCreateInfo-pNext-pNext", + "text": " 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 or VkExportSemaphoreWin32HandleInfoKHR" + }, + { + "vuid": "VUID-VkSemaphoreCreateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkSemaphoreCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "VkExportSemaphoreCreateInfo": { + "(VK_VERSION_1_1,VK_KHR_external_semaphore)": [ + { + "vuid": "VUID-VkExportSemaphoreCreateInfo-handleTypes-01124", + "text": " The bits in handleTypes must be supported and compatible, as reported by VkExternalSemaphoreProperties." + }, + { + "vuid": "VUID-VkExportSemaphoreCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO" + }, + { + "vuid": "VUID-VkExportSemaphoreCreateInfo-handleTypes-parameter", + "text": " handleTypes must be a valid combination of VkExternalSemaphoreHandleTypeFlagBits values" + } + ] + }, + "VkExportSemaphoreWin32HandleInfoKHR": { + "(VK_KHR_external_semaphore_win32)": [ + { + "vuid": "VUID-VkExportSemaphoreWin32HandleInfoKHR-handleTypes-01125", + "text": " 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 in the pNext chain of VkSemaphoreCreateInfo." + }, + { + "vuid": "VUID-VkExportSemaphoreWin32HandleInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR" + }, + { + "vuid": "VUID-VkExportSemaphoreWin32HandleInfoKHR-pAttributes-parameter", + "text": " If pAttributes is not NULL, pAttributes must be a valid pointer to a valid SECURITY_ATTRIBUTES value" + } + ] + }, + "vkGetSemaphoreWin32HandleKHR": { + "(VK_KHR_external_semaphore_win32)": [ + { + "vuid": "VUID-vkGetSemaphoreWin32HandleKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetSemaphoreWin32HandleKHR-pGetWin32HandleInfo-parameter", + "text": " pGetWin32HandleInfo must be a valid pointer to a valid VkSemaphoreGetWin32HandleInfoKHR structure" + }, + { + "vuid": "VUID-vkGetSemaphoreWin32HandleKHR-pHandle-parameter", + "text": " pHandle must be a valid pointer to a HANDLE value" + } + ] + }, + "VkSemaphoreGetWin32HandleInfoKHR": { + "(VK_KHR_external_semaphore_win32)": [ + { + "vuid": "VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01126", + "text": " handleType must have been included in VkExportSemaphoreCreateInfo::handleTypes when the semaphore’s current payload was created." + }, + { + "vuid": "VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01127", + "text": " 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." + }, + { + "vuid": "VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-01128", + "text": " semaphore must not currently have its payload replaced by an imported payload as described below in &amp;lt;&amp;lt;synchronization-semaphores-importing,Importing Semaphore Payloads&amp;gt;&amp;gt; unless that imported payload’s handle type was included in VkExternalSemaphoreProperties::exportFromImportedHandleTypes for handleType." + }, + { + "vuid": "VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01129", + "text": " If handleType refers to a handle type with copy payload transference semantics, as defined below in &amp;lt;&amp;lt;synchronization-semaphores-importing,Importing Semaphore Payloads&amp;gt;&amp;gt;, there must be no queue waiting on semaphore." + }, + { + "vuid": "VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01130", + "text": " If handleType refers to a handle type with copy payload transference semantics, semaphore must be signaled, or have an associated &amp;lt;&amp;lt;synchronization-semaphores-signaling,semaphore signal operation&amp;gt;&amp;gt; pending execution." + }, + { + "vuid": "VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01131", + "text": " handleType must be defined as an NT handle or a global share handle." + }, + { + "vuid": "VUID-VkSemaphoreGetWin32HandleInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR" + }, + { + "vuid": "VUID-VkSemaphoreGetWin32HandleInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-parameter", + "text": " semaphore must be a valid VkSemaphore handle" + }, + { + "vuid": "VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-parameter", + "text": " handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value" + } + ] + }, + "vkGetSemaphoreFdKHR": { + "(VK_KHR_external_semaphore_fd)": [ + { + "vuid": "VUID-vkGetSemaphoreFdKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetSemaphoreFdKHR-pGetFdInfo-parameter", + "text": " pGetFdInfo must be a valid pointer to a valid VkSemaphoreGetFdInfoKHR structure" + }, + { + "vuid": "VUID-vkGetSemaphoreFdKHR-pFd-parameter", + "text": " pFd must be a valid pointer to a int value" + } + ] + }, + "VkSemaphoreGetFdInfoKHR": { + "(VK_KHR_external_semaphore_fd)": [ + { + "vuid": "VUID-VkSemaphoreGetFdInfoKHR-handleType-01132", + "text": " handleType must have been included in VkExportSemaphoreCreateInfo::handleTypes when semaphore’s current payload was created." + }, + { + "vuid": "VUID-VkSemaphoreGetFdInfoKHR-semaphore-01133", + "text": " semaphore must not currently have its payload replaced by an imported payload as described below in &amp;lt;&amp;lt;synchronization-semaphores-importing,Importing Semaphore Payloads&amp;gt;&amp;gt; unless that imported payload’s handle type was included in VkExternalSemaphoreProperties::exportFromImportedHandleTypes for handleType." + }, + { + "vuid": "VUID-VkSemaphoreGetFdInfoKHR-handleType-01134", + "text": " If handleType refers to a handle type with copy payload transference semantics, as defined below in &amp;lt;&amp;lt;synchronization-semaphores-importing,Importing Semaphore Payloads&amp;gt;&amp;gt;, there must be no queue waiting on semaphore." + }, + { + "vuid": "VUID-VkSemaphoreGetFdInfoKHR-handleType-01135", + "text": " If handleType refers to a handle type with copy payload transference semantics, semaphore must be signaled, or have an associated &amp;lt;&amp;lt;synchronization-semaphores-signaling,semaphore signal operation&amp;gt;&amp;gt; pending execution." + }, + { + "vuid": "VUID-VkSemaphoreGetFdInfoKHR-handleType-01136", + "text": " handleType must be defined as a POSIX file descriptor handle." + }, + { + "vuid": "VUID-VkSemaphoreGetFdInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR" + }, + { + "vuid": "VUID-VkSemaphoreGetFdInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkSemaphoreGetFdInfoKHR-semaphore-parameter", + "text": " semaphore must be a valid VkSemaphore handle" + }, + { + "vuid": "VUID-VkSemaphoreGetFdInfoKHR-handleType-parameter", + "text": " handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value" + } + ] + }, + "vkDestroySemaphore": { + "core": [ + { + "vuid": "VUID-vkDestroySemaphore-semaphore-01137", + "text": " All submitted batches that refer to semaphore must have completed execution" + }, + { + "vuid": "VUID-vkDestroySemaphore-semaphore-01138", + "text": " If VkAllocationCallbacks were provided when semaphore was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroySemaphore-semaphore-01139", + "text": " If no VkAllocationCallbacks were provided when semaphore was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroySemaphore-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroySemaphore-semaphore-parameter", + "text": " If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle" + }, + { + "vuid": "VUID-vkDestroySemaphore-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroySemaphore-semaphore-parent", + "text": " If semaphore is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkImportSemaphoreWin32HandleKHR": { + "(VK_KHR_external_semaphore_win32)": [ + { + "vuid": "VUID-vkImportSemaphoreWin32HandleKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkImportSemaphoreWin32HandleKHR-pImportSemaphoreWin32HandleInfo-parameter", + "text": " pImportSemaphoreWin32HandleInfo must be a valid pointer to a valid VkImportSemaphoreWin32HandleInfoKHR structure" + } + ] + }, + "VkImportSemaphoreWin32HandleInfoKHR": { + "(VK_KHR_external_semaphore_win32)": [ + { + "vuid": "VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01140", + "text": " handleType must be a value included in the &amp;lt;&amp;lt;synchronization-semaphore-handletypes-win32,Handle Types Supported by VkImportSemaphoreWin32HandleInfoKHR&amp;gt;&amp;gt; table." + }, + { + "vuid": "VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01466", + "text": " 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." + }, + { + "vuid": "VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01467", + "text": " If handleType is not 0 and handle is NULL, name must name a valid synchronization primitive of the type specified by handleType." + }, + { + "vuid": "VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01468", + "text": " If handleType is not 0 and name is NULL, handle must be a valid handle of the type specified by handleType." + }, + { + "vuid": "VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01469", + "text": " If handle is not NULL, name must be NULL." + }, + { + "vuid": "VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01542", + "text": " If handle is not NULL, it must obey any requirements listed for handleType in external semaphore handle types compatibility." + }, + { + "vuid": "VUID-VkImportSemaphoreWin32HandleInfoKHR-name-01543", + "text": " If name is not NULL, it must obey any requirements listed for handleType in external semaphore handle types compatibility." + }, + { + "vuid": "VUID-VkImportSemaphoreWin32HandleInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR" + }, + { + "vuid": "VUID-VkImportSemaphoreWin32HandleInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkImportSemaphoreWin32HandleInfoKHR-semaphore-parameter", + "text": " semaphore must be a valid VkSemaphore handle" + }, + { + "vuid": "VUID-VkImportSemaphoreWin32HandleInfoKHR-flags-parameter", + "text": " flags must be a valid combination of VkSemaphoreImportFlagBits values" + }, + { + "vuid": "VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-parameter", + "text": " If handleType is not 0, handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value" + } + ] + }, + "vkImportSemaphoreFdKHR": { + "(VK_KHR_external_semaphore_fd)": [ + { + "vuid": "VUID-vkImportSemaphoreFdKHR-semaphore-01142", + "text": " semaphore must not be associated with any queue command that has not yet completed execution on that queue" + }, + { + "vuid": "VUID-vkImportSemaphoreFdKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkImportSemaphoreFdKHR-pImportSemaphoreFdInfo-parameter", + "text": " pImportSemaphoreFdInfo must be a valid pointer to a valid VkImportSemaphoreFdInfoKHR structure" + } + ] + }, + "VkImportSemaphoreFdInfoKHR": { + "(VK_KHR_external_semaphore_fd)": [ + { + "vuid": "VUID-VkImportSemaphoreFdInfoKHR-handleType-01143", + "text": " handleType must be a value included in the &amp;lt;&amp;lt;synchronization-semaphore-handletypes-fd,Handle Types Supported by VkImportSemaphoreFdInfoKHR&amp;gt;&amp;gt; table." + }, + { + "vuid": "VUID-VkImportSemaphoreFdInfoKHR-fd-01544", + "text": " fd must obey any requirements listed for handleType in &amp;lt;&amp;lt;external-semaphore-handle-types-compatibility,external semaphore handle types compatibility&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkImportSemaphoreFdInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR" + }, + { + "vuid": "VUID-VkImportSemaphoreFdInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkImportSemaphoreFdInfoKHR-semaphore-parameter", + "text": " semaphore must be a valid VkSemaphore handle" + }, + { + "vuid": "VUID-VkImportSemaphoreFdInfoKHR-flags-parameter", + "text": " flags must be a valid combination of VkSemaphoreImportFlagBits values" + }, + { + "vuid": "VUID-VkImportSemaphoreFdInfoKHR-handleType-parameter", + "text": " handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value" + } + ] + }, + "vkCreateEvent": { + "core": [ + { + "vuid": "VUID-vkCreateEvent-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateEvent-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkEventCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateEvent-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateEvent-pEvent-parameter", + "text": " pEvent must be a valid pointer to a VkEvent handle" + } + ] + }, + "VkEventCreateInfo": { + "core": [ + { + "vuid": "VUID-VkEventCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EVENT_CREATE_INFO" + }, + { + "vuid": "VUID-VkEventCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkEventCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "vkDestroyEvent": { + "core": [ + { + "vuid": "VUID-vkDestroyEvent-event-01145", + "text": " All submitted commands that refer to event must have completed execution" + }, + { + "vuid": "VUID-vkDestroyEvent-event-01146", + "text": " If VkAllocationCallbacks were provided when event was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyEvent-event-01147", + "text": " If no VkAllocationCallbacks were provided when event was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyEvent-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyEvent-event-parameter", + "text": " If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle" + }, + { + "vuid": "VUID-vkDestroyEvent-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyEvent-event-parent", + "text": " If event is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkGetEventStatus": { + "core": [ + { + "vuid": "VUID-vkGetEventStatus-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetEventStatus-event-parameter", + "text": " event must be a valid VkEvent handle" + }, + { + "vuid": "VUID-vkGetEventStatus-event-parent", + "text": " event must have been created, allocated, or retrieved from device" + } + ] + }, + "vkSetEvent": { + "core": [ + { + "vuid": "VUID-vkSetEvent-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkSetEvent-event-parameter", + "text": " event must be a valid VkEvent handle" + }, + { + "vuid": "VUID-vkSetEvent-event-parent", + "text": " event must have been created, allocated, or retrieved from device" + } + ] + }, + "vkResetEvent": { + "core": [ + { + "vuid": "VUID-vkResetEvent-event-01148", + "text": " event must not be waited on by a vkCmdWaitEvents command that is currently executing" + }, + { + "vuid": "VUID-vkResetEvent-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkResetEvent-event-parameter", + "text": " event must be a valid VkEvent handle" + }, + { + "vuid": "VUID-vkResetEvent-event-parent", + "text": " event must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCmdSetEvent": { + "core": [ + { + "vuid": "VUID-vkCmdSetEvent-stageMask-01149", + "text": " stageMask must not include VK_PIPELINE_STAGE_HOST_BIT" + }, + { + "vuid": "VUID-vkCmdSetEvent-stageMask-01150", + "text": " If the &amp;lt;&amp;lt;features-features-geometryShader,geometry shaders&amp;gt;&amp;gt; feature is not enabled, stageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT" + }, + { + "vuid": "VUID-vkCmdSetEvent-stageMask-01151", + "text": " If the &amp;lt;&amp;lt;features-features-tessellationShader,tessellation shaders&amp;gt;&amp;gt; feature is not enabled, stageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT" + }, + { + "vuid": "VUID-vkCmdSetEvent-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetEvent-event-parameter", + "text": " event must be a valid VkEvent handle" + }, + { + "vuid": "VUID-vkCmdSetEvent-stageMask-parameter", + "text": " stageMask must be a valid combination of VkPipelineStageFlagBits values" + }, + { + "vuid": "VUID-vkCmdSetEvent-stageMask-requiredbitmask", + "text": " stageMask must not be 0" + }, + { + "vuid": "VUID-vkCmdSetEvent-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetEvent-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdSetEvent-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdSetEvent-commonparent", + "text": " Both of commandBuffer, and event must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-vkCmdSetEvent-commandBuffer-01152", + "text": " commandBuffer’s current device mask must include exactly one physical device." + } + ] + }, + "vkCmdResetEvent": { + "core": [ + { + "vuid": "VUID-vkCmdResetEvent-stageMask-01153", + "text": " stageMask must not include VK_PIPELINE_STAGE_HOST_BIT" + }, + { + "vuid": "VUID-vkCmdResetEvent-stageMask-01154", + "text": " If the &amp;lt;&amp;lt;features-features-geometryShader,geometry shaders&amp;gt;&amp;gt; feature is not enabled, stageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT" + }, + { + "vuid": "VUID-vkCmdResetEvent-stageMask-01155", + "text": " If the &amp;lt;&amp;lt;features-features-tessellationShader,tessellation shaders&amp;gt;&amp;gt; feature is not enabled, stageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT" + }, + { + "vuid": "VUID-vkCmdResetEvent-event-01156", + "text": " When this command executes, event must not be waited on by a vkCmdWaitEvents command that is currently executing" + }, + { + "vuid": "VUID-vkCmdResetEvent-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdResetEvent-event-parameter", + "text": " event must be a valid VkEvent handle" + }, + { + "vuid": "VUID-vkCmdResetEvent-stageMask-parameter", + "text": " stageMask must be a valid combination of VkPipelineStageFlagBits values" + }, + { + "vuid": "VUID-vkCmdResetEvent-stageMask-requiredbitmask", + "text": " stageMask must not be 0" + }, + { + "vuid": "VUID-vkCmdResetEvent-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdResetEvent-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdResetEvent-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdResetEvent-commonparent", + "text": " Both of commandBuffer, and event must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-vkCmdResetEvent-commandBuffer-01157", + "text": " commandBuffer’s current device mask must include exactly one physical device." + } + ] + }, + "vkCmdWaitEvents": { + "core": [ + { + "vuid": "VUID-vkCmdWaitEvents-srcStageMask-01158", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdWaitEvents-srcStageMask-01159", + "text": " If the &amp;lt;&amp;lt;features-features-geometryShader,geometry shaders&amp;gt;&amp;gt; feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT" + }, + { + "vuid": "VUID-vkCmdWaitEvents-dstStageMask-01160", + "text": " If the &amp;lt;&amp;lt;features-features-geometryShader,geometry shaders&amp;gt;&amp;gt; feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT" + }, + { + "vuid": "VUID-vkCmdWaitEvents-srcStageMask-01161", + "text": " If the &amp;lt;&amp;lt;features-features-tessellationShader,tessellation shaders&amp;gt;&amp;gt; feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT" + }, + { + "vuid": "VUID-vkCmdWaitEvents-dstStageMask-01162", + "text": " If the &amp;lt;&amp;lt;features-features-tessellationShader,tessellation shaders&amp;gt;&amp;gt; feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT" + }, + { + "vuid": "VUID-vkCmdWaitEvents-pEvents-01163", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdWaitEvents-srcStageMask-01164", + "text": " 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 &amp;lt;&amp;lt;synchronization-pipeline-stages-supported, table of supported pipeline stages&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkCmdWaitEvents-pMemoryBarriers-01165", + "text": " 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 &amp;lt;&amp;lt;synchronization-access-types-supported, table of supported access types&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkCmdWaitEvents-pMemoryBarriers-01166", + "text": " 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 &amp;lt;&amp;lt;synchronization-access-types-supported, table of supported access types&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkCmdWaitEvents-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdWaitEvents-pEvents-parameter", + "text": " pEvents must be a valid pointer to an array of eventCount valid VkEvent handles" + }, + { + "vuid": "VUID-vkCmdWaitEvents-srcStageMask-parameter", + "text": " srcStageMask must be a valid combination of VkPipelineStageFlagBits values" + }, + { + "vuid": "VUID-vkCmdWaitEvents-srcStageMask-requiredbitmask", + "text": " srcStageMask must not be 0" + }, + { + "vuid": "VUID-vkCmdWaitEvents-dstStageMask-parameter", + "text": " dstStageMask must be a valid combination of VkPipelineStageFlagBits values" + }, + { + "vuid": "VUID-vkCmdWaitEvents-dstStageMask-requiredbitmask", + "text": " dstStageMask must not be 0" + }, + { + "vuid": "VUID-vkCmdWaitEvents-pMemoryBarriers-parameter", + "text": " If memoryBarrierCount is not 0, pMemoryBarriers must be a valid pointer to an array of memoryBarrierCount valid VkMemoryBarrier structures" + }, + { + "vuid": "VUID-vkCmdWaitEvents-pBufferMemoryBarriers-parameter", + "text": " If bufferMemoryBarrierCount is not 0, pBufferMemoryBarriers must be a valid pointer to an array of bufferMemoryBarrierCount valid VkBufferMemoryBarrier structures" + }, + { + "vuid": "VUID-vkCmdWaitEvents-pImageMemoryBarriers-parameter", + "text": " If imageMemoryBarrierCount is not 0, pImageMemoryBarriers must be a valid pointer to an array of imageMemoryBarrierCount valid VkImageMemoryBarrier structures" + }, + { + "vuid": "VUID-vkCmdWaitEvents-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdWaitEvents-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdWaitEvents-eventCount-arraylength", + "text": " eventCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdWaitEvents-commonparent", + "text": " Both of commandBuffer, and the elements of pEvents must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-vkCmdWaitEvents-commandBuffer-01167", + "text": " commandBuffer’s current device mask must include exactly one physical device." + } + ] + }, + "vkCmdPipelineBarrier": { + "core": [ + { + "vuid": "VUID-vkCmdPipelineBarrier-srcStageMask-01168", + "text": " If the &amp;lt;&amp;lt;features-features-geometryShader,geometry shaders&amp;gt;&amp;gt; feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-dstStageMask-01169", + "text": " If the &amp;lt;&amp;lt;features-features-geometryShader,geometry shaders&amp;gt;&amp;gt; feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-srcStageMask-01170", + "text": " If the &amp;lt;&amp;lt;features-features-tessellationShader,tessellation shaders&amp;gt;&amp;gt; feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-dstStageMask-01171", + "text": " If the &amp;lt;&amp;lt;features-features-tessellationShader,tessellation shaders&amp;gt;&amp;gt; feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-pDependencies-01172", + "text": " If vkCmdPipelineBarrier is called within a render pass instance, the render pass must have been created with a VkSubpassDependency instance in pDependencies that expresses a dependency from the current subpass to itself." + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-srcStageMask-01173", + "text": " If vkCmdPipelineBarrier is called within a render pass instance, srcStageMask must contain a subset of the bit values in the srcStageMask member of that instance of VkSubpassDependency" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-dstStageMask-01174", + "text": " If vkCmdPipelineBarrier is called within a render pass instance, dstStageMask must contain a subset of the bit values in the dstStageMask member of that instance of VkSubpassDependency" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-srcAccessMask-01175", + "text": " If vkCmdPipelineBarrier is called within a render pass instance, the srcAccessMask of any element of pMemoryBarriers or pImageMemoryBarriers must contain a subset of the bit values the srcAccessMask member of that instance of VkSubpassDependency" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-dstAccessMask-01176", + "text": " If vkCmdPipelineBarrier is called within a render pass instance, the dstAccessMask of any element of pMemoryBarriers or pImageMemoryBarriers must contain a subset of the bit values the dstAccessMask member of that instance of VkSubpassDependency" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-dependencyFlags-01177", + "text": " If vkCmdPipelineBarrier is called within a render pass instance, dependencyFlags must be equal to the dependencyFlags member of that instance of VkSubpassDependency" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-bufferMemoryBarrierCount-01178", + "text": " If vkCmdPipelineBarrier is called within a render pass instance, bufferMemoryBarrierCount must be 0" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-image-01179", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-oldLayout-01180", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-oldLayout-01181", + "text": " If vkCmdPipelineBarrier is called within a render pass instance, the oldLayout and newLayout members of an element of pImageMemoryBarriers must be equal" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-srcQueueFamilyIndex-01182", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-srcStageMask-01183", + "text": " 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 &amp;lt;&amp;lt;synchronization-pipeline-stages-supported, table of supported pipeline stages&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-pMemoryBarriers-01184", + "text": " Each element of pMemoryBarriers, pBufferMemoryBarriers and 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 &amp;lt;&amp;lt;synchronization-access-types-supported, table of supported access types&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-pMemoryBarriers-01185", + "text": " Each element of pMemoryBarriers, pBufferMemoryBarriers and 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 &amp;lt;&amp;lt;synchronization-access-types-supported, table of supported access types&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-srcStageMask-parameter", + "text": " srcStageMask must be a valid combination of VkPipelineStageFlagBits values" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-srcStageMask-requiredbitmask", + "text": " srcStageMask must not be 0" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-dstStageMask-parameter", + "text": " dstStageMask must be a valid combination of VkPipelineStageFlagBits values" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-dstStageMask-requiredbitmask", + "text": " dstStageMask must not be 0" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-dependencyFlags-parameter", + "text": " dependencyFlags must be a valid combination of VkDependencyFlagBits values" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-pMemoryBarriers-parameter", + "text": " If memoryBarrierCount is not 0, pMemoryBarriers must be a valid pointer to an array of memoryBarrierCount valid VkMemoryBarrier structures" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-parameter", + "text": " If bufferMemoryBarrierCount is not 0, pBufferMemoryBarriers must be a valid pointer to an array of bufferMemoryBarrierCount valid VkBufferMemoryBarrier structures" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-parameter", + "text": " If imageMemoryBarrierCount is not 0, pImageMemoryBarriers must be a valid pointer to an array of imageMemoryBarrierCount valid VkImageMemoryBarrier structures" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdPipelineBarrier-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations" + } + ], + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-vkCmdPipelineBarrier-dependencyFlags-01186", + "text": " If vkCmdPipelineBarrier is called outside of a render pass instance, dependencyFlags must not include VK_DEPENDENCY_VIEW_LOCAL_BIT" + } + ] + }, + "VkMemoryBarrier": { + "core": [ + { + "vuid": "VUID-VkMemoryBarrier-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MEMORY_BARRIER" + }, + { + "vuid": "VUID-VkMemoryBarrier-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkMemoryBarrier-srcAccessMask-parameter", + "text": " srcAccessMask must be a valid combination of VkAccessFlagBits values" + }, + { + "vuid": "VUID-VkMemoryBarrier-dstAccessMask-parameter", + "text": " dstAccessMask must be a valid combination of VkAccessFlagBits values" + } + ] + }, + "VkBufferMemoryBarrier": { + "core": [ + { + "vuid": "VUID-VkBufferMemoryBarrier-offset-01187", + "text": " offset must be less than the size of buffer" + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-size-01188", + "text": " If size is not equal to VK_WHOLE_SIZE, size must be greater than 0" + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-size-01189", + "text": " If size is not equal to VK_WHOLE_SIZE, size must be less than or equal to than the size of buffer minus offset" + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-buffer-01196", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-buffer-01931", + "text": " If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER" + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-srcAccessMask-parameter", + "text": " srcAccessMask must be a valid combination of VkAccessFlagBits values" + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-dstAccessMask-parameter", + "text": " dstAccessMask must be a valid combination of VkAccessFlagBits values" + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + } + ], + "!(VK_VERSION_1_1,VK_KHR_external_memory)": [ + { + "vuid": "VUID-VkBufferMemoryBarrier-buffer-01190", + "text": " If buffer was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, srcQueueFamilyIndex and dstQueueFamilyIndex must both be VK_QUEUE_FAMILY_IGNORED" + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-buffer-01192", + "text": " 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 &amp;lt;&amp;lt;devsandqueues-queueprops&amp;gt;&amp;gt;)" + } + ], + "(VK_VERSION_1_1,VK_KHR_external_memory)": [ + { + "vuid": "VUID-VkBufferMemoryBarrier-buffer-01191", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-buffer-01763", + "text": " 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 &amp;lt;&amp;lt;synchronization-queue-transfers&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-buffer-01193", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-buffer-01764", + "text": " 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 &amp;lt;&amp;lt;synchronization-queue-transfers&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkBufferMemoryBarrier-buffer-01765", + "text": " 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 &amp;lt;&amp;lt;synchronization-queue-transfers&amp;gt;&amp;gt;." + } + ] + }, + "VkImageMemoryBarrier": { + "core": [ + { + "vuid": "VUID-VkImageMemoryBarrier-oldLayout-01197", + "text": " oldLayout must be VK_IMAGE_LAYOUT_UNDEFINED or the current layout of the image subresources affected by the barrier" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-newLayout-01198", + "text": " newLayout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-image-01205", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-subresourceRange-01486", + "text": " subresourceRange.baseMipLevel must be less than the mipLevels specified in VkImageCreateInfo when image was created" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-subresourceRange-01724", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-subresourceRange-01488", + "text": " subresourceRange.baseArrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when image was created" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-subresourceRange-01725", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-image-01207", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-oldLayout-01208", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-oldLayout-01209", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-oldLayout-01210", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-oldLayout-01211", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-oldLayout-01212", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-oldLayout-01213", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-image-01932", + "text": " If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkSampleLocationsInfoEXT" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-srcAccessMask-parameter", + "text": " srcAccessMask must be a valid combination of VkAccessFlagBits values" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-dstAccessMask-parameter", + "text": " dstAccessMask must be a valid combination of VkAccessFlagBits values" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-oldLayout-parameter", + "text": " oldLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-newLayout-parameter", + "text": " newLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-image-parameter", + "text": " image must be a valid VkImage handle" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-subresourceRange-parameter", + "text": " subresourceRange must be a valid VkImageSubresourceRange structure" + } + ], + "!(VK_VERSION_1_1,VK_KHR_external_memory)": [ + { + "vuid": "VUID-VkImageMemoryBarrier-image-01199", + "text": " If image was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, srcQueueFamilyIndex and dstQueueFamilyIndex must both be VK_QUEUE_FAMILY_IGNORED" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-image-01200", + "text": " 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 &amp;lt;&amp;lt;devsandqueues-queueprops&amp;gt;&amp;gt;)." + } + ], + "(VK_VERSION_1_1,VK_KHR_external_memory)": [ + { + "vuid": "VUID-VkImageMemoryBarrier-image-01381", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-image-01766", + "text": " 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 &amp;lt;&amp;lt;synchronization-queue-transfers&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkImageMemoryBarrier-image-01201", + "text": " 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." + }, + { + "vuid": "VUID-VkImageMemoryBarrier-image-01767", + "text": " 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 &amp;lt;&amp;lt;synchronization-queue-transfers&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkImageMemoryBarrier-image-01768", + "text": " 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 &amp;lt;&amp;lt;synchronization-queue-transfers&amp;gt;&amp;gt;." + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkImageMemoryBarrier-image-01671", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-image-01672", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-image-01673", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-VkImageMemoryBarrier-oldLayout-01658", + "text": " 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" + }, + { + "vuid": "VUID-VkImageMemoryBarrier-oldLayout-01659", + "text": " 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" + } + ] + }, + "vkQueueWaitIdle": { + "core": [ + { + "vuid": "VUID-vkQueueWaitIdle-queue-parameter", + "text": " queue must be a valid VkQueue handle" + } + ] + }, + "vkDeviceWaitIdle": { + "core": [ + { + "vuid": "VUID-vkDeviceWaitIdle-device-parameter", + "text": " device must be a valid VkDevice handle" + } + ] + }, + "vkCreateRenderPass": { + "core": [ + { + "vuid": "VUID-vkCreateRenderPass-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateRenderPass-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkRenderPassCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateRenderPass-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateRenderPass-pRenderPass-parameter", + "text": " pRenderPass must be a valid pointer to a VkRenderPass handle" + } + ] + }, + "VkRenderPassCreateInfo": { + "core": [ + { + "vuid": "VUID-VkRenderPassCreateInfo-None-00832", + "text": " 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" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-attachment-00833", + "text": " If the attachment member of any element of pInputAttachments, pColorAttachments, pResolveAttachments or pDepthStencilAttachment, or the attachment indexed by any element of pPreserveAttachments in any 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 VkAttachmentDescription structures describing them must include VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT in flags" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-attachment-00834", + "text": " 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" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pPreserveAttachments-00835", + "text": " The value of each element of the pPreserveAttachments member in each element of pSubpasses must not be VK_ATTACHMENT_UNUSED" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pAttachments-00836", + "text": " 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." + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pDependencies-00837", + "text": " 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 &amp;lt;&amp;lt;synchronization-pipeline-stages-types, pipeline&amp;gt;&amp;gt; identified by the pipelineBindPoint member of the source subpass." + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pDependencies-00838", + "text": " 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 &amp;lt;&amp;lt;synchronization-pipeline-stages-types, pipeline&amp;gt;&amp;gt; identified by the pipelineBindPoint member of the source subpass." + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pNext-pNext", + "text": " 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 VkRenderPassInputAttachmentAspectCreateInfo or VkRenderPassMultiviewCreateInfo" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pAttachments-parameter", + "text": " If attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkAttachmentDescription structures" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pSubpasses-parameter", + "text": " pSubpasses must be a valid pointer to an array of subpassCount valid VkSubpassDescription structures" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pDependencies-parameter", + "text": " If dependencyCount is not 0, pDependencies must be a valid pointer to an array of dependencyCount valid VkSubpassDependency structures" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-subpassCount-arraylength", + "text": " subpassCount must be greater than 0" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-VkRenderPassCreateInfo-pAttachments-01566", + "text": " 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." + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pAttachments-01567", + "text": " 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." + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pNext-01926", + "text": " If the pNext chain includes an instance of VkRenderPassInputAttachmentAspectCreateInfo, the subpass member of each element of its pAspectReferences member must be less than subpassCount" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pNext-01927", + "text": " If the pNext chain includes an instance of VkRenderPassInputAttachmentAspectCreateInfo, 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-VkRenderPassCreateInfo-pNext-01928", + "text": " If the pNext chain includes an instance of VkRenderPassMultiviewCreateInfo, and its subpassCount member is not zero, that member must be equal to the value of subpassCount" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pNext-01929", + "text": " If the pNext chain includes an instance of VkRenderPassMultiviewCreateInfo, if its dependencyCount member is not zero, it must be equal to dependencyCount" + }, + { + "vuid": "VUID-VkRenderPassCreateInfo-pNext-01930", + "text": " If the pNext chain includes an instance of VkRenderPassMultiviewCreateInfo, for each non-zero element of pViewOffsets, the srcSubpass and dstSubpass members of pDependencies at the same index must not be equal" + } + ] + }, + "VkRenderPassMultiviewCreateInfo": { + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-00841", + "text": " Each view index must not be set in more than one element of pCorrelationMasks" + }, + { + "vuid": "VUID-VkRenderPassMultiviewCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO" + }, + { + "vuid": "VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-parameter", + "text": " If subpassCount is not 0, pViewMasks must be a valid pointer to an array of subpassCount uint32_t values" + }, + { + "vuid": "VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-parameter", + "text": " If dependencyCount is not 0, pViewOffsets must be a valid pointer to an array of dependencyCount int32_t values" + }, + { + "vuid": "VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-parameter", + "text": " If correlationMaskCount is not 0, pCorrelationMasks must be a valid pointer to an array of correlationMaskCount uint32_t values" + } + ] + }, + "VkAttachmentDescription": { + "core": [ + { + "vuid": "VUID-VkAttachmentDescription-finalLayout-00843", + "text": " finalLayout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED" + }, + { + "vuid": "VUID-VkAttachmentDescription-flags-parameter", + "text": " flags must be a valid combination of VkAttachmentDescriptionFlagBits values" + }, + { + "vuid": "VUID-VkAttachmentDescription-format-parameter", + "text": " format must be a valid VkFormat value" + }, + { + "vuid": "VUID-VkAttachmentDescription-samples-parameter", + "text": " samples must be a valid VkSampleCountFlagBits value" + }, + { + "vuid": "VUID-VkAttachmentDescription-loadOp-parameter", + "text": " loadOp must be a valid VkAttachmentLoadOp value" + }, + { + "vuid": "VUID-VkAttachmentDescription-storeOp-parameter", + "text": " storeOp must be a valid VkAttachmentStoreOp value" + }, + { + "vuid": "VUID-VkAttachmentDescription-stencilLoadOp-parameter", + "text": " stencilLoadOp must be a valid VkAttachmentLoadOp value" + }, + { + "vuid": "VUID-VkAttachmentDescription-stencilStoreOp-parameter", + "text": " stencilStoreOp must be a valid VkAttachmentStoreOp value" + }, + { + "vuid": "VUID-VkAttachmentDescription-initialLayout-parameter", + "text": " initialLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-VkAttachmentDescription-finalLayout-parameter", + "text": " finalLayout must be a valid VkImageLayout value" + } + ] + }, + "VkRenderPassInputAttachmentAspectCreateInfo": { + "(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-VkRenderPassInputAttachmentAspectCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO" + }, + { + "vuid": "VUID-VkRenderPassInputAttachmentAspectCreateInfo-pAspectReferences-parameter", + "text": " pAspectReferences must be a valid pointer to an array of aspectReferenceCount valid VkInputAttachmentAspectReference structures" + }, + { + "vuid": "VUID-VkRenderPassInputAttachmentAspectCreateInfo-aspectReferenceCount-arraylength", + "text": " aspectReferenceCount must be greater than 0" + } + ] + }, + "VkInputAttachmentAspectReference": { + "(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-VkInputAttachmentAspectReference-pCreateInfo-01568", + "text": " There must be an input attachment at pCreateInfo::pSubpasses[subpass].pInputAttachments[inputAttachmentIndex]." + }, + { + "vuid": "VUID-VkInputAttachmentAspectReference-None-01569", + "text": " The specified input attachment must have more than one aspect mask." + }, + { + "vuid": "VUID-VkInputAttachmentAspectReference-aspectMask-01570", + "text": " aspectMask must be a subset of the aspect masks in the specified input attachment." + }, + { + "vuid": "VUID-VkInputAttachmentAspectReference-aspectMask-parameter", + "text": " aspectMask must be a valid combination of VkImageAspectFlagBits values" + }, + { + "vuid": "VUID-VkInputAttachmentAspectReference-aspectMask-requiredbitmask", + "text": " aspectMask must not be 0" + } + ] + }, + "VkSubpassDescription": { + "core": [ + { + "vuid": "VUID-VkSubpassDescription-pipelineBindPoint-00844", + "text": " pipelineBindPoint must be VK_PIPELINE_BIND_POINT_GRAPHICS" + }, + { + "vuid": "VUID-VkSubpassDescription-colorAttachmentCount-00845", + "text": " colorAttachmentCount must be less than or equal to VkPhysicalDeviceLimits::maxColorAttachments" + }, + { + "vuid": "VUID-VkSubpassDescription-loadOp-00846", + "text": " 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" + }, + { + "vuid": "VUID-VkSubpassDescription-pResolveAttachments-00847", + "text": " 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" + }, + { + "vuid": "VUID-VkSubpassDescription-pResolveAttachments-00848", + "text": " If pResolveAttachments is not NULL, the sample count of each element of pColorAttachments must be anything other than VK_SAMPLE_COUNT_1_BIT" + }, + { + "vuid": "VUID-VkSubpassDescription-pResolveAttachments-00849", + "text": " Each element of pResolveAttachments must have a sample count of VK_SAMPLE_COUNT_1_BIT" + }, + { + "vuid": "VUID-VkSubpassDescription-pResolveAttachments-00850", + "text": " Each element of pResolveAttachments must have the same VkFormat as its corresponding color attachment" + }, + { + "vuid": "VUID-VkSubpassDescription-pColorAttachments-01417", + "text": " All attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have the same sample count" + }, + { + "vuid": "VUID-VkSubpassDescription-None-00852", + "text": " If any input attachments are VK_ATTACHMENT_UNUSED, then any pipelines bound during the subpass must not access those input attachments from the fragment shader" + }, + { + "vuid": "VUID-VkSubpassDescription-attachment-00853", + "text": " The attachment member of each element of pPreserveAttachments must not be VK_ATTACHMENT_UNUSED" + }, + { + "vuid": "VUID-VkSubpassDescription-pPreserveAttachments-00854", + "text": " Each element of pPreserveAttachments must not also be an element of any other member of the subpass description" + }, + { + "vuid": "VUID-VkSubpassDescription-layout-00855", + "text": " If any attachment is used as both an input attachment and a color or depth/stencil attachment, then each use must use the same layout" + }, + { + "vuid": "VUID-VkSubpassDescription-flags-parameter", + "text": " flags must be a valid combination of VkSubpassDescriptionFlagBits values" + }, + { + "vuid": "VUID-VkSubpassDescription-pipelineBindPoint-parameter", + "text": " pipelineBindPoint must be a valid VkPipelineBindPoint value" + }, + { + "vuid": "VUID-VkSubpassDescription-pInputAttachments-parameter", + "text": " If inputAttachmentCount is not 0, pInputAttachments must be a valid pointer to an array of inputAttachmentCount valid VkAttachmentReference structures" + }, + { + "vuid": "VUID-VkSubpassDescription-pColorAttachments-parameter", + "text": " If colorAttachmentCount is not 0, pColorAttachments must be a valid pointer to an array of colorAttachmentCount valid VkAttachmentReference structures" + }, + { + "vuid": "VUID-VkSubpassDescription-pResolveAttachments-parameter", + "text": " If colorAttachmentCount is not 0, and pResolveAttachments is not NULL, pResolveAttachments must be a valid pointer to an array of colorAttachmentCount valid VkAttachmentReference structures" + }, + { + "vuid": "VUID-VkSubpassDescription-pDepthStencilAttachment-parameter", + "text": " If pDepthStencilAttachment is not NULL, pDepthStencilAttachment must be a valid pointer to a valid VkAttachmentReference structure" + }, + { + "vuid": "VUID-VkSubpassDescription-pPreserveAttachments-parameter", + "text": " If preserveAttachmentCount is not 0, pPreserveAttachments must be a valid pointer to an array of preserveAttachmentCount uint32_t values" + } + ], + "(VK_AMD_mixed_attachment_samples)": [ + { + "vuid": "VUID-VkSubpassDescription-pColorAttachments-01506", + "text": " 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" + } + ], + "!(VK_AMD_mixed_attachment_samples)+!(VK_NV_framebuffer_mixed_samples)": [ + { + "vuid": "VUID-VkSubpassDescription-pDepthStencilAttachment-01418", + "text": " If pDepthStencilAttachment is not VK_ATTACHMENT_UNUSED and any attachments in pColorAttachments are not VK_ATTACHMENT_UNUSED, they must have the same sample count" + } + ], + "(VK_NVX_multiview_per_view_attributes)": [ + { + "vuid": "VUID-VkSubpassDescription-flags-00856", + "text": " 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." + } + ] + }, + "VkAttachmentReference": { + "core": [ + { + "vuid": "VUID-VkAttachmentReference-layout-00857", + "text": " layout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED" + }, + { + "vuid": "VUID-VkAttachmentReference-layout-parameter", + "text": " layout must be a valid VkImageLayout value" + } + ] + }, + "VkSubpassDependency": { + "core": [ + { + "vuid": "VUID-VkSubpassDependency-srcSubpass-00858", + "text": " If srcSubpass is not VK_SUBPASS_EXTERNAL, srcStageMask must not include VK_PIPELINE_STAGE_HOST_BIT" + }, + { + "vuid": "VUID-VkSubpassDependency-dstSubpass-00859", + "text": " If dstSubpass is not VK_SUBPASS_EXTERNAL, dstStageMask must not include VK_PIPELINE_STAGE_HOST_BIT" + }, + { + "vuid": "VUID-VkSubpassDependency-srcStageMask-00860", + "text": " If the &amp;lt;&amp;lt;features-features-geometryShader,geometry shaders&amp;gt;&amp;gt; feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT" + }, + { + "vuid": "VUID-VkSubpassDependency-dstStageMask-00861", + "text": " If the &amp;lt;&amp;lt;features-features-geometryShader,geometry shaders&amp;gt;&amp;gt; feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT" + }, + { + "vuid": "VUID-VkSubpassDependency-srcStageMask-00862", + "text": " If the &amp;lt;&amp;lt;features-features-tessellationShader,tessellation shaders&amp;gt;&amp;gt; feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT" + }, + { + "vuid": "VUID-VkSubpassDependency-dstStageMask-00863", + "text": " If the &amp;lt;&amp;lt;features-features-tessellationShader,tessellation shaders&amp;gt;&amp;gt; feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT" + }, + { + "vuid": "VUID-VkSubpassDependency-srcSubpass-00864", + "text": " 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" + }, + { + "vuid": "VUID-VkSubpassDependency-srcSubpass-00865", + "text": " srcSubpass and dstSubpass must not both be equal to VK_SUBPASS_EXTERNAL" + }, + { + "vuid": "VUID-VkSubpassDependency-srcSubpass-00866", + "text": " If srcSubpass is equal to dstSubpass, srcStageMask and dstStageMask must only contain one of 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_SHADER_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, or VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT" + }, + { + "vuid": "VUID-VkSubpassDependency-srcSubpass-00867", + "text": " If srcSubpass is equal to dstSubpass and not all of the stages in srcStageMask and dstStageMask are &amp;lt;&amp;lt;synchronization-framebuffer-regions,framebuffer-space stages&amp;gt;&amp;gt;, the &amp;lt;&amp;lt;synchronization-pipeline-stages-order, logically latest&amp;gt;&amp;gt; pipeline stage in srcStageMask must be &amp;lt;&amp;lt;synchronization-pipeline-stages-order, logically earlier&amp;gt;&amp;gt; than or equal to the &amp;lt;&amp;lt;synchronization-pipeline-stages-order, logically earliest&amp;gt;&amp;gt; pipeline stage in dstStageMask" + }, + { + "vuid": "VUID-VkSubpassDependency-srcAccessMask-00868", + "text": " Any access flag included in srcAccessMask must be supported by one of the pipeline stages in srcStageMask, as specified in the &amp;lt;&amp;lt;synchronization-access-types-supported, table of supported access types&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkSubpassDependency-dstAccessMask-00869", + "text": " Any access flag included in dstAccessMask must be supported by one of the pipeline stages in dstStageMask, as specified in the &amp;lt;&amp;lt;synchronization-access-types-supported, table of supported access types&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkSubpassDependency-srcStageMask-parameter", + "text": " srcStageMask must be a valid combination of VkPipelineStageFlagBits values" + }, + { + "vuid": "VUID-VkSubpassDependency-srcStageMask-requiredbitmask", + "text": " srcStageMask must not be 0" + }, + { + "vuid": "VUID-VkSubpassDependency-dstStageMask-parameter", + "text": " dstStageMask must be a valid combination of VkPipelineStageFlagBits values" + }, + { + "vuid": "VUID-VkSubpassDependency-dstStageMask-requiredbitmask", + "text": " dstStageMask must not be 0" + }, + { + "vuid": "VUID-VkSubpassDependency-srcAccessMask-parameter", + "text": " srcAccessMask must be a valid combination of VkAccessFlagBits values" + }, + { + "vuid": "VUID-VkSubpassDependency-dstAccessMask-parameter", + "text": " dstAccessMask must be a valid combination of VkAccessFlagBits values" + }, + { + "vuid": "VUID-VkSubpassDependency-dependencyFlags-parameter", + "text": " dependencyFlags must be a valid combination of VkDependencyFlagBits values" + } + ], + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-VkSubpassDependency-dependencyFlags-00870", + "text": " If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, then both srcSubpass and dstSubpass must not equal VK_SUBPASS_EXTERNAL" + }, + { + "vuid": "VUID-VkSubpassDependency-dependencyFlags-00871", + "text": " If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, then the render pass must have multiview enabled" + }, + { + "vuid": "VUID-VkSubpassDependency-srcSubpass-00872", + "text": " 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" + } + ] + }, + "vkDestroyRenderPass": { + "core": [ + { + "vuid": "VUID-vkDestroyRenderPass-renderPass-00873", + "text": " All submitted commands that refer to renderPass must have completed execution" + }, + { + "vuid": "VUID-vkDestroyRenderPass-renderPass-00874", + "text": " If VkAllocationCallbacks were provided when renderPass was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyRenderPass-renderPass-00875", + "text": " If no VkAllocationCallbacks were provided when renderPass was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyRenderPass-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyRenderPass-renderPass-parameter", + "text": " If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle" + }, + { + "vuid": "VUID-vkDestroyRenderPass-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyRenderPass-renderPass-parent", + "text": " If renderPass is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCreateFramebuffer": { + "core": [ + { + "vuid": "VUID-vkCreateFramebuffer-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateFramebuffer-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkFramebufferCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateFramebuffer-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateFramebuffer-pFramebuffer-parameter", + "text": " pFramebuffer must be a valid pointer to a VkFramebuffer handle" + } + ] + }, + "VkFramebufferCreateInfo": { + "core": [ + { + "vuid": "VUID-VkFramebufferCreateInfo-attachmentCount-00876", + "text": " attachmentCount must be equal to the attachment count specified in renderPass" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-pAttachments-00877", + "text": " 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" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-pAttachments-00878", + "text": " 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" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-pAttachments-00879", + "text": " 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" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-pAttachments-00880", + "text": " Each element of pAttachments must have been created with an VkFormat value that matches the VkFormat specified by the corresponding VkAttachmentDescription in renderPass" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-pAttachments-00881", + "text": " Each element of pAttachments must have been created with a samples value that matches the samples value specified by the corresponding VkAttachmentDescription in renderPass" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-pAttachments-00882", + "text": " Each element of pAttachments must have dimensions at least as large as the corresponding framebuffer dimension" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-pAttachments-00883", + "text": " Each element of pAttachments must only specify a single mip level" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-pAttachments-00884", + "text": " Each element of pAttachments must have been created with the identity swizzle" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-width-00885", + "text": " width must be greater than 0." + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-width-00886", + "text": " width must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferWidth" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-height-00887", + "text": " height must be greater than 0." + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-height-00888", + "text": " height must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferHeight" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-layers-00889", + "text": " layers must be greater than 0." + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-layers-00890", + "text": " layers must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferLayers" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-renderPass-parameter", + "text": " renderPass must be a valid VkRenderPass handle" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-pAttachments-parameter", + "text": " If attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkImageView handles" + }, + { + "vuid": "VUID-VkFramebufferCreateInfo-commonparent", + "text": " Both of renderPass, and the elements of pAttachments that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-VkFramebufferCreateInfo-pAttachments-00891", + "text": " 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" + } + ] + }, + "vkDestroyFramebuffer": { + "core": [ + { + "vuid": "VUID-vkDestroyFramebuffer-framebuffer-00892", + "text": " All submitted commands that refer to framebuffer must have completed execution" + }, + { + "vuid": "VUID-vkDestroyFramebuffer-framebuffer-00893", + "text": " If VkAllocationCallbacks were provided when framebuffer was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyFramebuffer-framebuffer-00894", + "text": " If no VkAllocationCallbacks were provided when framebuffer was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyFramebuffer-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyFramebuffer-framebuffer-parameter", + "text": " If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle" + }, + { + "vuid": "VUID-vkDestroyFramebuffer-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyFramebuffer-framebuffer-parent", + "text": " If framebuffer is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCmdBeginRenderPass": { + "core": [ + { + "vuid": "VUID-vkCmdBeginRenderPass-initialLayout-00895", + "text": " 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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT set" + }, + { + "vuid": "VUID-vkCmdBeginRenderPass-initialLayout-00897", + "text": " 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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set" + }, + { + "vuid": "VUID-vkCmdBeginRenderPass-initialLayout-00898", + "text": " 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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT set" + }, + { + "vuid": "VUID-vkCmdBeginRenderPass-initialLayout-00899", + "text": " 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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT set" + }, + { + "vuid": "VUID-vkCmdBeginRenderPass-initialLayout-00900", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdBeginRenderPass-srcStageMask-00901", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdBeginRenderPass-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdBeginRenderPass-pRenderPassBegin-parameter", + "text": " pRenderPassBegin must be a valid pointer to a valid VkRenderPassBeginInfo structure" + }, + { + "vuid": "VUID-vkCmdBeginRenderPass-contents-parameter", + "text": " contents must be a valid VkSubpassContents value" + }, + { + "vuid": "VUID-vkCmdBeginRenderPass-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdBeginRenderPass-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdBeginRenderPass-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdBeginRenderPass-bufferlevel", + "text": " commandBuffer must be a primary VkCommandBuffer" + } + ], + "!(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-vkCmdBeginRenderPass-initialLayout-00896", + "text": " 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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-vkCmdBeginRenderPass-initialLayout-01758", + "text": " 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 subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set" + } + ] + }, + "VkRenderPassBeginInfo": { + "core": [ + { + "vuid": "VUID-VkRenderPassBeginInfo-clearValueCount-00902", + "text": " 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" + }, + { + "vuid": "VUID-VkRenderPassBeginInfo-clearValueCount-00903", + "text": " If clearValueCount is not 0, pClearValues must be a valid pointer to an array of clearValueCount valid VkClearValue unions" + }, + { + "vuid": "VUID-VkRenderPassBeginInfo-renderPass-00904", + "text": " renderPass must be &amp;lt;&amp;lt;renderpass-compatibility,compatible&amp;gt;&amp;gt; with the renderPass member of the VkFramebufferCreateInfo structure specified when creating framebuffer." + }, + { + "vuid": "VUID-VkRenderPassBeginInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO" + }, + { + "vuid": "VUID-VkRenderPassBeginInfo-pNext-pNext", + "text": " 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 or VkRenderPassSampleLocationsBeginInfoEXT" + }, + { + "vuid": "VUID-VkRenderPassBeginInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkRenderPassBeginInfo-renderPass-parameter", + "text": " renderPass must be a valid VkRenderPass handle" + }, + { + "vuid": "VUID-VkRenderPassBeginInfo-framebuffer-parameter", + "text": " framebuffer must be a valid VkFramebuffer handle" + }, + { + "vuid": "VUID-VkRenderPassBeginInfo-commonparent", + "text": " Both of framebuffer, and renderPass must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "VkRenderPassSampleLocationsBeginInfoEXT": { + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-VkRenderPassSampleLocationsBeginInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT" + }, + { + "vuid": "VUID-VkRenderPassSampleLocationsBeginInfoEXT-pAttachmentInitialSampleLocations-parameter", + "text": " If attachmentInitialSampleLocationsCount is not 0, pAttachmentInitialSampleLocations must be a valid pointer to an array of attachmentInitialSampleLocationsCount valid VkAttachmentSampleLocationsEXT structures" + }, + { + "vuid": "VUID-VkRenderPassSampleLocationsBeginInfoEXT-pPostSubpassSampleLocations-parameter", + "text": " If postSubpassSampleLocationsCount is not 0, pPostSubpassSampleLocations must be a valid pointer to an array of postSubpassSampleLocationsCount valid VkSubpassSampleLocationsEXT structures" + } + ] + }, + "VkAttachmentSampleLocationsEXT": { + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-VkAttachmentSampleLocationsEXT-attachmentIndex-01531", + "text": " attachmentIndex must be less than the attachmentCount specified in VkRenderPassCreateInfo the render pass specified by VkRenderPassBeginInfo::renderPass was created with" + }, + { + "vuid": "VUID-VkAttachmentSampleLocationsEXT-sampleLocationsInfo-parameter", + "text": " sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure" + } + ] + }, + "VkSubpassSampleLocationsEXT": { + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-VkSubpassSampleLocationsEXT-subpassIndex-01532", + "text": " subpassIndex must be less than the subpassCount specified in VkRenderPassCreateInfo the render pass specified by VkRenderPassBeginInfo::renderPass was created with" + }, + { + "vuid": "VUID-VkSubpassSampleLocationsEXT-sampleLocationsInfo-parameter", + "text": " sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure" + } + ] + }, + "VkDeviceGroupRenderPassBeginInfo": { + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905", + "text": " deviceMask must be a valid device mask value" + }, + { + "vuid": "VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00906", + "text": " deviceMask must not be zero" + }, + { + "vuid": "VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907", + "text": " deviceMask must be a subset of the command buffer’s initial device mask" + }, + { + "vuid": "VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908", + "text": " deviceRenderAreaCount must either be zero or equal to the number of physical devices in the logical device." + }, + { + "vuid": "VUID-VkDeviceGroupRenderPassBeginInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO" + }, + { + "vuid": "VUID-VkDeviceGroupRenderPassBeginInfo-pDeviceRenderAreas-parameter", + "text": " If deviceRenderAreaCount is not 0, pDeviceRenderAreas must be a valid pointer to an array of deviceRenderAreaCount VkRect2D structures" + } + ] + }, + "vkGetRenderAreaGranularity": { + "core": [ + { + "vuid": "VUID-vkGetRenderAreaGranularity-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetRenderAreaGranularity-renderPass-parameter", + "text": " renderPass must be a valid VkRenderPass handle" + }, + { + "vuid": "VUID-vkGetRenderAreaGranularity-pGranularity-parameter", + "text": " pGranularity must be a valid pointer to a VkExtent2D structure" + }, + { + "vuid": "VUID-vkGetRenderAreaGranularity-renderPass-parent", + "text": " renderPass must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCmdNextSubpass": { + "core": [ + { + "vuid": "VUID-vkCmdNextSubpass-None-00909", + "text": " The current subpass index must be less than the number of subpasses in the render pass minus one" + }, + { + "vuid": "VUID-vkCmdNextSubpass-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdNextSubpass-contents-parameter", + "text": " contents must be a valid VkSubpassContents value" + }, + { + "vuid": "VUID-vkCmdNextSubpass-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdNextSubpass-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdNextSubpass-renderpass", + "text": " This command must only be called inside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdNextSubpass-bufferlevel", + "text": " commandBuffer must be a primary VkCommandBuffer" + } + ] + }, + "vkCmdEndRenderPass": { + "core": [ + { + "vuid": "VUID-vkCmdEndRenderPass-None-00910", + "text": " The current subpass index must be equal to the number of subpasses in the render pass minus one" + }, + { + "vuid": "VUID-vkCmdEndRenderPass-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdEndRenderPass-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdEndRenderPass-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdEndRenderPass-renderpass", + "text": " This command must only be called inside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdEndRenderPass-bufferlevel", + "text": " commandBuffer must be a primary VkCommandBuffer" + } + ] + }, + "vkCreateShaderModule": { + "core": [ + { + "vuid": "VUID-vkCreateShaderModule-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateShaderModule-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkShaderModuleCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateShaderModule-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateShaderModule-pShaderModule-parameter", + "text": " pShaderModule must be a valid pointer to a VkShaderModule handle" + } + ] + }, + "VkShaderModuleCreateInfo": { + "core": [ + { + "vuid": "VUID-VkShaderModuleCreateInfo-codeSize-01085", + "text": " codeSize must be greater than 0" + }, + { + "vuid": "VUID-VkShaderModuleCreateInfo-pCode-01089", + "text": " pCode must declare the Shader capability for SPIR-V code" + }, + { + "vuid": "VUID-VkShaderModuleCreateInfo-pCode-01090", + "text": " pCode must not declare any capability that is not supported by the API, as described by the &amp;lt;&amp;lt;spirvenv-module-validation, Capabilities&amp;gt;&amp;gt; section of the &amp;lt;&amp;lt;spirvenv-capabilities,SPIR-V Environment&amp;gt;&amp;gt; appendix" + }, + { + "vuid": "VUID-VkShaderModuleCreateInfo-pCode-01091", + "text": " If pCode declares any of the capabilities listed as optional in the &amp;lt;&amp;lt;spirvenv-capabilities-table,SPIR-V Environment&amp;gt;&amp;gt; appendix, the corresponding feature(s) must be enabled." + }, + { + "vuid": "VUID-VkShaderModuleCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO" + }, + { + "vuid": "VUID-VkShaderModuleCreateInfo-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkShaderModuleValidationCacheCreateInfoEXT" + }, + { + "vuid": "VUID-VkShaderModuleCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkShaderModuleCreateInfo-pCode-parameter", + "text": " pCode must be a valid pointer to an array of \\(codeSize \\over 4\\) uint32_t values" + } + ], + "!(VK_NV_glsl_shader)": [ + { + "vuid": "VUID-VkShaderModuleCreateInfo-codeSize-01086", + "text": " codeSize must be a multiple of 4" + }, + { + "vuid": "VUID-VkShaderModuleCreateInfo-pCode-01087", + "text": " pCode must point to valid SPIR-V code, formatted and packed as described by the &amp;lt;&amp;lt;spirv-spec,Khronos SPIR-V Specification&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkShaderModuleCreateInfo-pCode-01088", + "text": " pCode must adhere to the validation rules described by the &amp;lt;&amp;lt;spirvenv-module-validation, Validation Rules within a Module&amp;gt;&amp;gt; section of the &amp;lt;&amp;lt;spirvenv-capabilities,SPIR-V Environment&amp;gt;&amp;gt; appendix" + } + ], + "(VK_NV_glsl_shader)": [ + { + "vuid": "VUID-VkShaderModuleCreateInfo-pCode-01376", + "text": " If pCode points to SPIR-V code, codeSize must be a multiple of 4" + }, + { + "vuid": "VUID-VkShaderModuleCreateInfo-pCode-01377", + "text": " 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" + }, + { + "vuid": "VUID-VkShaderModuleCreateInfo-pCode-01378", + "text": " If pCode points to SPIR-V code, that code must adhere to the validation rules described by the &amp;lt;&amp;lt;spirvenv-module-validation, Validation Rules within a Module&amp;gt;&amp;gt; section of the &amp;lt;&amp;lt;spirvenv-capabilities,SPIR-V Environment&amp;gt;&amp;gt; appendix" + }, + { + "vuid": "VUID-VkShaderModuleCreateInfo-pCode-01379", + "text": " If pCode points to GLSL code, it must be valid GLSL code written to the GL_KHR_vulkan_glsl GLSL extension specification" + } + ] + }, + "VkShaderModuleValidationCacheCreateInfoEXT": { + "(VK_EXT_validation_cache)": [ + { + "vuid": "VUID-VkShaderModuleValidationCacheCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkShaderModuleValidationCacheCreateInfoEXT-validationCache-parameter", + "text": " validationCache must be a valid VkValidationCacheEXT handle" + } + ] + }, + "vkDestroyShaderModule": { + "core": [ + { + "vuid": "VUID-vkDestroyShaderModule-shaderModule-01092", + "text": " If VkAllocationCallbacks were provided when shaderModule was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyShaderModule-shaderModule-01093", + "text": " If no VkAllocationCallbacks were provided when shaderModule was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyShaderModule-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyShaderModule-shaderModule-parameter", + "text": " If shaderModule is not VK_NULL_HANDLE, shaderModule must be a valid VkShaderModule handle" + }, + { + "vuid": "VUID-vkDestroyShaderModule-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyShaderModule-shaderModule-parent", + "text": " If shaderModule is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCreateValidationCacheEXT": { + "(VK_EXT_validation_cache)": [ + { + "vuid": "VUID-vkCreateValidationCacheEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateValidationCacheEXT-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkValidationCacheCreateInfoEXT structure" + }, + { + "vuid": "VUID-vkCreateValidationCacheEXT-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateValidationCacheEXT-pValidationCache-parameter", + "text": " pValidationCache must be a valid pointer to a VkValidationCacheEXT handle" + } + ] + }, + "VkValidationCacheCreateInfoEXT": { + "(VK_EXT_validation_cache)": [ + { + "vuid": "VUID-VkValidationCacheCreateInfoEXT-initialDataSize-01534", + "text": " If initialDataSize is not 0, it must be equal to the size of pInitialData, as returned by vkGetValidationCacheDataEXT when pInitialData was originally retrieved" + }, + { + "vuid": "VUID-VkValidationCacheCreateInfoEXT-initialDataSize-01535", + "text": " If initialDataSize is not 0, pInitialData must have been retrieved from a previous call to vkGetValidationCacheDataEXT" + }, + { + "vuid": "VUID-VkValidationCacheCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkValidationCacheCreateInfoEXT-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkValidationCacheCreateInfoEXT-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkValidationCacheCreateInfoEXT-pInitialData-parameter", + "text": " If initialDataSize is not 0, pInitialData must be a valid pointer to an array of initialDataSize bytes" + } + ] + }, + "vkMergeValidationCachesEXT": { + "(VK_EXT_validation_cache)": [ + { + "vuid": "VUID-vkMergeValidationCachesEXT-dstCache-01536", + "text": " dstCache must not appear in the list of source caches" + }, + { + "vuid": "VUID-vkMergeValidationCachesEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkMergeValidationCachesEXT-dstCache-parameter", + "text": " dstCache must be a valid VkValidationCacheEXT handle" + }, + { + "vuid": "VUID-vkMergeValidationCachesEXT-pSrcCaches-parameter", + "text": " pSrcCaches must be a valid pointer to an array of srcCacheCount valid VkValidationCacheEXT handles" + }, + { + "vuid": "VUID-vkMergeValidationCachesEXT-srcCacheCount-arraylength", + "text": " srcCacheCount must be greater than 0" + }, + { + "vuid": "VUID-vkMergeValidationCachesEXT-dstCache-parent", + "text": " dstCache must have been created, allocated, or retrieved from device" + }, + { + "vuid": "VUID-vkMergeValidationCachesEXT-pSrcCaches-parent", + "text": " Each element of pSrcCaches must have been created, allocated, or retrieved from device" + } + ] + }, + "vkGetValidationCacheDataEXT": { + "(VK_EXT_validation_cache)": [ + { + "vuid": "VUID-vkGetValidationCacheDataEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetValidationCacheDataEXT-validationCache-parameter", + "text": " validationCache must be a valid VkValidationCacheEXT handle" + }, + { + "vuid": "VUID-vkGetValidationCacheDataEXT-pDataSize-parameter", + "text": " pDataSize must be a valid pointer to a size_t value" + }, + { + "vuid": "VUID-vkGetValidationCacheDataEXT-pData-parameter", + "text": " 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" + }, + { + "vuid": "VUID-vkGetValidationCacheDataEXT-validationCache-parent", + "text": " validationCache must have been created, allocated, or retrieved from device" + } + ] + }, + "vkDestroyValidationCacheEXT": { + "(VK_EXT_validation_cache)": [ + { + "vuid": "VUID-vkDestroyValidationCacheEXT-validationCache-01537", + "text": " If VkAllocationCallbacks were provided when validationCache was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyValidationCacheEXT-validationCache-01538", + "text": " If no VkAllocationCallbacks were provided when validationCache was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyValidationCacheEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyValidationCacheEXT-validationCache-parameter", + "text": " If validationCache is not VK_NULL_HANDLE, validationCache must be a valid VkValidationCacheEXT handle" + }, + { + "vuid": "VUID-vkDestroyValidationCacheEXT-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyValidationCacheEXT-validationCache-parent", + "text": " If validationCache is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCreateComputePipelines": { + "core": [ + { + "vuid": "VUID-vkCreateComputePipelines-flags-00695", + "text": " 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" + }, + { + "vuid": "VUID-vkCreateComputePipelines-flags-00696", + "text": " 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" + }, + { + "vuid": "VUID-vkCreateComputePipelines-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateComputePipelines-pipelineCache-parameter", + "text": " If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle" + }, + { + "vuid": "VUID-vkCreateComputePipelines-pCreateInfos-parameter", + "text": " pCreateInfos must be a valid pointer to an array of createInfoCount valid VkComputePipelineCreateInfo structures" + }, + { + "vuid": "VUID-vkCreateComputePipelines-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateComputePipelines-pPipelines-parameter", + "text": " pPipelines must be a valid pointer to an array of createInfoCount VkPipeline handles" + }, + { + "vuid": "VUID-vkCreateComputePipelines-createInfoCount-arraylength", + "text": " createInfoCount must be greater than 0" + }, + { + "vuid": "VUID-vkCreateComputePipelines-pipelineCache-parent", + "text": " If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "VkComputePipelineCreateInfo": { + "core": [ + { + "vuid": "VUID-VkComputePipelineCreateInfo-flags-00697", + "text": " If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is -1, basePipelineHandle must be a valid handle to a compute VkPipeline" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-flags-00698", + "text": " 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" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-flags-00699", + "text": " If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is not -1, basePipelineHandle must be VK_NULL_HANDLE" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-flags-00700", + "text": " If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is not VK_NULL_HANDLE, basePipelineIndex must be -1" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-stage-00701", + "text": " The stage member of stage must be VK_SHADER_STAGE_COMPUTE_BIT" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-stage-00702", + "text": " 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 &amp;lt;&amp;lt;interfaces,Shader Interfaces&amp;gt;&amp;gt; chapter" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-layout-00703", + "text": " layout must be &amp;lt;&amp;lt;descriptorsets-pipelinelayout-consistency,consistent&amp;gt;&amp;gt; with the layout of the compute shader specified in stage" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-layout-01687", + "text": " The number of resources in layout accessible to the compute shader stage must be less than or equal to VkPhysicalDeviceLimits::maxPerStageResources" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-flags-parameter", + "text": " flags must be a valid combination of VkPipelineCreateFlagBits values" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-stage-parameter", + "text": " stage must be a valid VkPipelineShaderStageCreateInfo structure" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-layout-parameter", + "text": " layout must be a valid VkPipelineLayout handle" + }, + { + "vuid": "VUID-VkComputePipelineCreateInfo-commonparent", + "text": " Both of basePipelineHandle, and layout that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "VkPipelineShaderStageCreateInfo": { + "core": [ + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-00704", + "text": " If the &amp;lt;&amp;lt;features-features-geometryShader,geometry shaders&amp;gt;&amp;gt; feature is not enabled, stage must not be VK_SHADER_STAGE_GEOMETRY_BIT" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-00705", + "text": " If the &amp;lt;&amp;lt;features-features-tessellationShader,tessellation shaders&amp;gt;&amp;gt; feature is not enabled, stage must not be VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT or VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-00706", + "text": " stage must not be VK_SHADER_STAGE_ALL_GRAPHICS, or VK_SHADER_STAGE_ALL" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-pName-00707", + "text": " pName must be the name of an OpEntryPoint in module with an execution model that matches stage" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-maxClipDistances-00708", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-maxCullDistances-00709", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-maxCombinedClipAndCullDistances-00710", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-maxSampleMaskWords-00711", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-00712", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-00713", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-00714", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-00715", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-00716", + "text": " If stage is VK_SHADER_STAGE_GEOMETRY_BIT, 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" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-00717", + "text": " If stage is VK_SHADER_STAGE_GEOMETRY_BIT, 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" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-00718", + "text": " If stage is VK_SHADER_STAGE_FRAGMENT_BIT, the identified entry point must not include any output variables in its interface decorated with CullDistance" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-00719", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-parameter", + "text": " stage must be a valid VkShaderStageFlagBits value" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-module-parameter", + "text": " module must be a valid VkShaderModule handle" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-pName-parameter", + "text": " pName must be a null-terminated UTF-8 string" + }, + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-pSpecializationInfo-parameter", + "text": " If pSpecializationInfo is not NULL, pSpecializationInfo must be a valid pointer to a valid VkSpecializationInfo structure" + } + ], + "(VK_EXT_shader_stencil_export)": [ + { + "vuid": "VUID-VkPipelineShaderStageCreateInfo-stage-01511", + "text": " 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" + } + ] + }, + "vkCreateGraphicsPipelines": { + "core": [ + { + "vuid": "VUID-vkCreateGraphicsPipelines-flags-00720", + "text": " 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" + }, + { + "vuid": "VUID-vkCreateGraphicsPipelines-flags-00721", + "text": " 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" + }, + { + "vuid": "VUID-vkCreateGraphicsPipelines-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateGraphicsPipelines-pipelineCache-parameter", + "text": " If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle" + }, + { + "vuid": "VUID-vkCreateGraphicsPipelines-pCreateInfos-parameter", + "text": " pCreateInfos must be a valid pointer to an array of createInfoCount valid VkGraphicsPipelineCreateInfo structures" + }, + { + "vuid": "VUID-vkCreateGraphicsPipelines-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateGraphicsPipelines-pPipelines-parameter", + "text": " pPipelines must be a valid pointer to an array of createInfoCount VkPipeline handles" + }, + { + "vuid": "VUID-vkCreateGraphicsPipelines-createInfoCount-arraylength", + "text": " createInfoCount must be greater than 0" + }, + { + "vuid": "VUID-vkCreateGraphicsPipelines-pipelineCache-parent", + "text": " If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "VkGraphicsPipelineCreateInfo": { + "core": [ + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-flags-00722", + "text": " If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is -1, basePipelineHandle must be a valid handle to a graphics VkPipeline" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-flags-00723", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-flags-00724", + "text": " If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is not -1, basePipelineHandle must be VK_NULL_HANDLE" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-flags-00725", + "text": " If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is not VK_NULL_HANDLE, basePipelineIndex must be -1" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-stage-00726", + "text": " The stage member of each element of pStages must be unique" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-stage-00727", + "text": " The stage member of one element of pStages must be VK_SHADER_STAGE_VERTEX_BIT" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-stage-00728", + "text": " The stage member of each element of pStages must not be VK_SHADER_STAGE_COMPUTE_BIT" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00729", + "text": " If pStages includes a tessellation control shader stage, it must include a tessellation evaluation shader stage" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00730", + "text": " If pStages includes a tessellation evaluation shader stage, it must include a tessellation control shader stage" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00731", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00732", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00733", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00734", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00735", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00736", + "text": " If pStages includes tessellation shader stages, the topology member of pInputAssembly must be VK_PRIMITIVE_TOPOLOGY_PATCH_LIST" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-topology-00737", + "text": " If the topology member of pInputAssembly is VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, pStages must include tessellation shader stages" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00738", + "text": " 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 &amp;lt;&amp;lt;shaders-geometry-execution, compatible&amp;gt;&amp;gt; with the primitive topology specified in pInputAssembly" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00739", + "text": " 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 &amp;lt;&amp;lt;shaders-geometry-execution, compatible&amp;gt;&amp;gt; with the primitive topology that is output by the tessellation stages" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00740", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00741", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-00742", + "text": " 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 &amp;lt;&amp;lt;interfaces,Shader Interfaces&amp;gt;&amp;gt; chapter" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-subpass-00745", + "text": " 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 format of the attachment does not support color blend operations, as specified by the VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT flag in VkFormatProperties::linearTilingFeatures or VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-attachmentCount-00746", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747", + "text": " 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 VkViewport structures" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00748", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00749", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00750", + "text": " If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a valid pointer to a valid VkPipelineViewportStateCreateInfo structure" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00751", + "text": " If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a valid pointer to a valid VkPipelineMultisampleStateCreateInfo structure" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00752", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00753", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00754", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-layout-00756", + "text": " layout must be &amp;lt;&amp;lt;descriptorsets-pipelinelayout-consistency,consistent&amp;gt;&amp;gt; with all shaders specified in pStages" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-subpass-00758", + "text": " If subpass does not use any color and/or depth/stencil attachments, then the rasterizationSamples member of pMultisampleState must follow the rules for a &amp;lt;&amp;lt;renderpass-noattachments, zero-attachment subpass&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-subpass-00759", + "text": " subpass must be a valid subpass within renderPass" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-layout-01688", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkPipelineDiscardRectangleStateCreateInfoEXT" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-flags-parameter", + "text": " flags must be a valid combination of VkPipelineCreateFlagBits values" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-parameter", + "text": " pStages must be a valid pointer to an array of stageCount valid VkPipelineShaderStageCreateInfo structures" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pVertexInputState-parameter", + "text": " pVertexInputState must be a valid pointer to a valid VkPipelineVertexInputStateCreateInfo structure" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pInputAssemblyState-parameter", + "text": " pInputAssemblyState must be a valid pointer to a valid VkPipelineInputAssemblyStateCreateInfo structure" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-parameter", + "text": " pRasterizationState must be a valid pointer to a valid VkPipelineRasterizationStateCreateInfo structure" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicState-parameter", + "text": " If pDynamicState is not NULL, pDynamicState must be a valid pointer to a valid VkPipelineDynamicStateCreateInfo structure" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-layout-parameter", + "text": " layout must be a valid VkPipelineLayout handle" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-renderPass-parameter", + "text": " renderPass must be a valid VkRenderPass handle" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-stageCount-arraylength", + "text": " stageCount must be greater than 0" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-commonparent", + "text": " Each of basePipelineHandle, layout, and renderPass that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "!(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-subpass-00743", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-subpass-00744", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-subpass-01756", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-subpass-01757", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pStages-01565", + "text": " 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." + } + ], + "!(VK_EXT_depth_range_unrestricted)": [ + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00755", + "text": " 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" + } + ], + "(VK_EXT_depth_range_unrestricted)": [ + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00755", + "text": " 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" + } + ], + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01521", + "text": " If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure chained to 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522", + "text": " If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure chained to 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01523", + "text": " If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure chained to the pNext chain of pMultisampleState is VK_TRUE, sampleLocationsInfo.sampleLocationsPerPixel must equal rasterizationSamples" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-sampleLocationsEnable-01524", + "text": " If the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure chained to the pNext chain of pMultisampleState is VK_TRUE, the fragment shader code must not statically use the extended instruction InterpolateAtSample" + } + ], + "!(VK_AMD_mixed_attachment_samples)+!(VK_NV_framebuffer_mixed_samples)": [ + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-subpass-00757", + "text": " 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" + } + ], + "(VK_AMD_mixed_attachment_samples)": [ + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-subpass-01505", + "text": " 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" + } + ], + "(VK_NV_framebuffer_mixed_samples)": [ + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-subpass-01411", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-subpass-01412", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-renderPass-00760", + "text": " 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." + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-renderPass-00761", + "text": " 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." + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-renderPass-00762", + "text": " 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" + }, + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-renderPass-00763", + "text": " If the renderPass has multiview enabled, then all shaders must not include variables decorated with the Layer built-in decoration in their interfaces." + } + ], + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-flags-00764", + "text": " flags must not contain the VK_PIPELINE_CREATE_DISPATCH_BASE flag." + } + ], + "(VK_NV_clip_space_w_scaling)": [ + { + "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715", + "text": " 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, chained to 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" + } + ] + }, + "VkPipelineDynamicStateCreateInfo": { + "core": [ + { + "vuid": "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442", + "text": " Each element of pDynamicStates must be unique" + }, + { + "vuid": "VUID-VkPipelineDynamicStateCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineDynamicStateCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkPipelineDynamicStateCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-parameter", + "text": " pDynamicStates must be a valid pointer to an array of dynamicStateCount valid VkDynamicState values" + }, + { + "vuid": "VUID-VkPipelineDynamicStateCreateInfo-dynamicStateCount-arraylength", + "text": " dynamicStateCount must be greater than 0" + } + ] + }, + "vkDestroyPipeline": { + "core": [ + { + "vuid": "VUID-vkDestroyPipeline-pipeline-00765", + "text": " All submitted commands that refer to pipeline must have completed execution" + }, + { + "vuid": "VUID-vkDestroyPipeline-pipeline-00766", + "text": " If VkAllocationCallbacks were provided when pipeline was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyPipeline-pipeline-00767", + "text": " If no VkAllocationCallbacks were provided when pipeline was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyPipeline-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyPipeline-pipeline-parameter", + "text": " If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle" + }, + { + "vuid": "VUID-vkDestroyPipeline-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyPipeline-pipeline-parent", + "text": " If pipeline is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCreatePipelineCache": { + "core": [ + { + "vuid": "VUID-vkCreatePipelineCache-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreatePipelineCache-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkPipelineCacheCreateInfo structure" + }, + { + "vuid": "VUID-vkCreatePipelineCache-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreatePipelineCache-pPipelineCache-parameter", + "text": " pPipelineCache must be a valid pointer to a VkPipelineCache handle" + } + ] + }, + "VkPipelineCacheCreateInfo": { + "core": [ + { + "vuid": "VUID-VkPipelineCacheCreateInfo-initialDataSize-00768", + "text": " If initialDataSize is not 0, it must be equal to the size of pInitialData, as returned by vkGetPipelineCacheData when pInitialData was originally retrieved" + }, + { + "vuid": "VUID-VkPipelineCacheCreateInfo-initialDataSize-00769", + "text": " If initialDataSize is not 0, pInitialData must have been retrieved from a previous call to vkGetPipelineCacheData" + }, + { + "vuid": "VUID-VkPipelineCacheCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineCacheCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkPipelineCacheCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineCacheCreateInfo-pInitialData-parameter", + "text": " If initialDataSize is not 0, pInitialData must be a valid pointer to an array of initialDataSize bytes" + } + ] + }, + "vkMergePipelineCaches": { + "core": [ + { + "vuid": "VUID-vkMergePipelineCaches-dstCache-00770", + "text": " dstCache must not appear in the list of source caches" + }, + { + "vuid": "VUID-vkMergePipelineCaches-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkMergePipelineCaches-dstCache-parameter", + "text": " dstCache must be a valid VkPipelineCache handle" + }, + { + "vuid": "VUID-vkMergePipelineCaches-pSrcCaches-parameter", + "text": " pSrcCaches must be a valid pointer to an array of srcCacheCount valid VkPipelineCache handles" + }, + { + "vuid": "VUID-vkMergePipelineCaches-srcCacheCount-arraylength", + "text": " srcCacheCount must be greater than 0" + }, + { + "vuid": "VUID-vkMergePipelineCaches-dstCache-parent", + "text": " dstCache must have been created, allocated, or retrieved from device" + }, + { + "vuid": "VUID-vkMergePipelineCaches-pSrcCaches-parent", + "text": " Each element of pSrcCaches must have been created, allocated, or retrieved from device" + } + ] + }, + "vkGetPipelineCacheData": { + "core": [ + { + "vuid": "VUID-vkGetPipelineCacheData-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetPipelineCacheData-pipelineCache-parameter", + "text": " pipelineCache must be a valid VkPipelineCache handle" + }, + { + "vuid": "VUID-vkGetPipelineCacheData-pDataSize-parameter", + "text": " pDataSize must be a valid pointer to a size_t value" + }, + { + "vuid": "VUID-vkGetPipelineCacheData-pData-parameter", + "text": " 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" + }, + { + "vuid": "VUID-vkGetPipelineCacheData-pipelineCache-parent", + "text": " pipelineCache must have been created, allocated, or retrieved from device" + } + ] + }, + "vkDestroyPipelineCache": { + "core": [ + { + "vuid": "VUID-vkDestroyPipelineCache-pipelineCache-00771", + "text": " If VkAllocationCallbacks were provided when pipelineCache was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyPipelineCache-pipelineCache-00772", + "text": " If no VkAllocationCallbacks were provided when pipelineCache was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyPipelineCache-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyPipelineCache-pipelineCache-parameter", + "text": " If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle" + }, + { + "vuid": "VUID-vkDestroyPipelineCache-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyPipelineCache-pipelineCache-parent", + "text": " If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "VkSpecializationInfo": { + "core": [ + { + "vuid": "VUID-VkSpecializationInfo-offset-00773", + "text": " The offset member of each element of pMapEntries must be less than dataSize" + }, + { + "vuid": "VUID-VkSpecializationInfo-pMapEntries-00774", + "text": " The size member of each element of pMapEntries must be less than or equal to dataSize minus offset" + }, + { + "vuid": "VUID-VkSpecializationInfo-mapEntryCount-00775", + "text": " If mapEntryCount is not 0, pMapEntries must be a valid pointer to an array of mapEntryCount valid VkSpecializationMapEntry structures" + }, + { + "vuid": "VUID-VkSpecializationInfo-pData-parameter", + "text": " If dataSize is not 0, pData must be a valid pointer to an array of dataSize bytes" + } + ] + }, + "VkSpecializationMapEntry": { + "core": [ + { + "vuid": "VUID-VkSpecializationMapEntry-constantID-00776", + "text": " 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" + } + ] + }, + "vkCmdBindPipeline": { + "core": [ + { + "vuid": "VUID-vkCmdBindPipeline-pipelineBindPoint-00777", + "text": " If pipelineBindPoint is VK_PIPELINE_BIND_POINT_COMPUTE, the VkCommandPool that commandBuffer was allocated from must support compute operations" + }, + { + "vuid": "VUID-vkCmdBindPipeline-pipelineBindPoint-00778", + "text": " If pipelineBindPoint is VK_PIPELINE_BIND_POINT_GRAPHICS, the VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdBindPipeline-pipelineBindPoint-00779", + "text": " If pipelineBindPoint is VK_PIPELINE_BIND_POINT_COMPUTE, pipeline must be a compute pipeline" + }, + { + "vuid": "VUID-vkCmdBindPipeline-pipelineBindPoint-00780", + "text": " If pipelineBindPoint is VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline must be a graphics pipeline" + }, + { + "vuid": "VUID-vkCmdBindPipeline-pipeline-00781", + "text": " If the &amp;lt;&amp;lt;features-features-variableMultisampleRate,variable multisample rate&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-vkCmdBindPipeline-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdBindPipeline-pipelineBindPoint-parameter", + "text": " pipelineBindPoint must be a valid VkPipelineBindPoint value" + }, + { + "vuid": "VUID-vkCmdBindPipeline-pipeline-parameter", + "text": " pipeline must be a valid VkPipeline handle" + }, + { + "vuid": "VUID-vkCmdBindPipeline-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdBindPipeline-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdBindPipeline-commonparent", + "text": " Both of commandBuffer, and pipeline must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-vkCmdBindPipeline-variableSampleLocations-01525", + "text": " 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" + } + ] + }, + "vkGetShaderInfoAMD": { + "(VK_AMD_shader_info)": [ + { + "vuid": "VUID-vkGetShaderInfoAMD-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetShaderInfoAMD-pipeline-parameter", + "text": " pipeline must be a valid VkPipeline handle" + }, + { + "vuid": "VUID-vkGetShaderInfoAMD-shaderStage-parameter", + "text": " shaderStage must be a valid VkShaderStageFlagBits value" + }, + { + "vuid": "VUID-vkGetShaderInfoAMD-infoType-parameter", + "text": " infoType must be a valid VkShaderInfoTypeAMD value" + }, + { + "vuid": "VUID-vkGetShaderInfoAMD-pInfoSize-parameter", + "text": " pInfoSize must be a valid pointer to a size_t value" + }, + { + "vuid": "VUID-vkGetShaderInfoAMD-pInfo-parameter", + "text": " 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" + }, + { + "vuid": "VUID-vkGetShaderInfoAMD-pipeline-parent", + "text": " pipeline must have been created, allocated, or retrieved from device" + } + ] + }, + "VkAllocationCallbacks": { + "core": [ + { + "vuid": "VUID-VkAllocationCallbacks-pfnAllocation-00632", + "text": " pfnAllocation must be a valid pointer to a valid user-defined PFN_vkAllocationFunction" + }, + { + "vuid": "VUID-VkAllocationCallbacks-pfnReallocation-00633", + "text": " pfnReallocation must be a valid pointer to a valid user-defined PFN_vkReallocationFunction" + }, + { + "vuid": "VUID-VkAllocationCallbacks-pfnFree-00634", + "text": " pfnFree must be a valid pointer to a valid user-defined PFN_vkFreeFunction" + }, + { + "vuid": "VUID-VkAllocationCallbacks-pfnInternalAllocation-00635", + "text": " If either of pfnInternalAllocation or pfnInternalFree is not NULL, both must be valid callbacks" + } + ] + }, + "vkGetPhysicalDeviceMemoryProperties": { + "core": [ + { + "vuid": "VUID-vkGetPhysicalDeviceMemoryProperties-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceMemoryProperties-pMemoryProperties-parameter", + "text": " pMemoryProperties must be a valid pointer to a VkPhysicalDeviceMemoryProperties structure" + } + ] + }, + "vkGetPhysicalDeviceMemoryProperties2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceMemoryProperties2-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceMemoryProperties2-pMemoryProperties-parameter", + "text": " pMemoryProperties must be a valid pointer to a VkPhysicalDeviceMemoryProperties2 structure" + } + ] + }, + "VkPhysicalDeviceMemoryProperties2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkPhysicalDeviceMemoryProperties2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2" + }, + { + "vuid": "VUID-VkPhysicalDeviceMemoryProperties2-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "vkAllocateMemory": { + "core": [ + { + "vuid": "VUID-vkAllocateMemory-pAllocateInfo-01713", + "text": " pAllocateInfo\\-&amp;gt;allocationSize must be less than or equal to VkPhysicalDeviceMemoryProperties::memoryHeaps[pAllocateInfo\\-&amp;gt;memoryTypeIndex].size as returned by vkGetPhysicalDeviceMemoryProperties for the VkPhysicalDevice that device was created from." + }, + { + "vuid": "VUID-vkAllocateMemory-pAllocateInfo-01714", + "text": " pAllocateInfo\\-&amp;gt;memoryTypeIndex must be less than VkPhysicalDeviceMemoryProperties::memoryTypeCount as returned by vkGetPhysicalDeviceMemoryProperties for the VkPhysicalDevice that device was created from." + }, + { + "vuid": "VUID-vkAllocateMemory-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkAllocateMemory-pAllocateInfo-parameter", + "text": " pAllocateInfo must be a valid pointer to a valid VkMemoryAllocateInfo structure" + }, + { + "vuid": "VUID-vkAllocateMemory-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkAllocateMemory-pMemory-parameter", + "text": " pMemory must be a valid pointer to a VkDeviceMemory handle" + } + ] + }, + "VkMemoryAllocateInfo": { + "!(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkMemoryAllocateInfo-allocationSize-00638", + "text": " allocationSize must be greater than 0" + } + ], + "(VK_KHR_external_memory)+(VK_KHR_dedicated_allocation,VK_NV_dedicated_allocation)": [ + { + "vuid": "VUID-VkMemoryAllocateInfo-pNext-00639", + "text": " If the pNext chain contains an instance of VkExportMemoryAllocateInfo, 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 contain an instance of ifdef::VK_KHR_dedicated_allocation[VkMemoryDedicatedAllocateInfo]" + } + ], + "(VK_KHR_external_memory)+(VK_NV_external_memory)": [ + { + "vuid": "VUID-VkMemoryAllocateInfo-pNext-00640", + "text": " If the pNext chain contains an instance of VkExportMemoryAllocateInfo, it must not contain an instance of VkExportMemoryAllocateInfoNV or VkExportMemoryWin32HandleInfoNV." + } + ], + "(VK_KHR_external_memory_win32+VK_NV_external_memory_win32)": [ + { + "vuid": "VUID-VkMemoryAllocateInfo-pNext-00641", + "text": " If the pNext chain contains an instance of VkImportMemoryWin32HandleInfoKHR, it must not contain an instance of VkImportMemoryWin32HandleInfoNV." + } + ], + "(VK_KHR_external_memory_fd)": [ + { + "vuid": "VUID-VkMemoryAllocateInfo-allocationSize-01742", + "text": " 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." + }, + { + "vuid": "VUID-VkMemoryAllocateInfo-memoryTypeIndex-00648", + "text": " 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." + } + ], + "(VK_KHR_external_memory+VK_KHR_device_group)": [ + { + "vuid": "VUID-VkMemoryAllocateInfo-None-00643", + "text": " 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." + }, + { + "vuid": "VUID-VkMemoryAllocateInfo-None-00644", + "text": " 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." + } + ], + "(VK_KHR_external_memory_win32)": [ + { + "vuid": "VUID-VkMemoryAllocateInfo-memoryTypeIndex-00645", + "text": " 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." + }, + { + "vuid": "VUID-VkMemoryAllocateInfo-allocationSize-01743", + "text": " 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." + }, + { + "vuid": "VUID-VkMemoryAllocateInfo-allocationSize-00646", + "text": " 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 instance of VkDedicatedAllocationMemoryAllocateInfoNV included in the pNext chain." + }, + { + "vuid": "VUID-VkMemoryAllocateInfo-allocationSize-00647", + "text": " 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." + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-VkMemoryAllocateInfo-memoryTypeIndex-01872", + "text": " If the protected memory feature is not enabled, the VkMemoryAllocateInfo::memoryTypeIndex must not indicate a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT." + } + ], + "(VK_EXT_external_memory_host)": [ + { + "vuid": "VUID-VkMemoryAllocateInfo-memoryTypeIndex-01744", + "text": " 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" + }, + { + "vuid": "VUID-VkMemoryAllocateInfo-allocationSize-01745", + "text": " If the parameters define an import operation and the external handle is a host pointer, allocationSize must be an integer multiple of VkPhysicalDeviceExternalMemoryHostPropertiesEXT::minImportedHostPointerAlignment" + } + ], + "(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkMemoryAllocateInfo-None-01873", + "text": " If the parameters define an import operation and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BIT_ANDROID:" + }, + { + "vuid": "VUID-VkMemoryAllocateInfo-pNext-01874", + "text": " If the parameters do not define an import operation, and the pNext chain contains an instance of VkExportMemoryAllocateInfo with VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID included in its handleTypes member, and the pNext contains an instance of VkMemoryDedicatedAllocateInfo with image not equal to VK_NULL_HANDLE, then allocationSize must be 0, otherwise allocationSize must be greater than 0." + }, + { + "vuid": "VUID-VkMemoryAllocateInfo-pNext-01875", + "text": " If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes an instance of VkMemoryDedicatedAllocateInfo with image that is not VK_NULL_HANDLE:" + } + ], + "core": [ + { + "vuid": "VUID-VkMemoryAllocateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO" + }, + { + "vuid": "VUID-VkMemoryAllocateInfo-pNext-pNext", + "text": " 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, or VkMemoryDedicatedAllocateInfo" + }, + { + "vuid": "VUID-VkMemoryAllocateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + } + ] + }, + "VkMemoryDedicatedAllocateInfo": { + "(VK_VERSION_1_1,VK_KHR_dedicated_allocation)": [ + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-image-01432", + "text": " At least one of image and buffer must be VK_NULL_HANDLE" + }, + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-image-01433", + "text": " If image is not VK_NULL_HANDLE, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the image" + }, + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-image-01434", + "text": " If image is not VK_NULL_HANDLE, image must have been created without VK_IMAGE_CREATE_SPARSE_BINDING_BIT set in VkImageCreateInfo::flags" + }, + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-buffer-01435", + "text": " If buffer is not VK_NULL_HANDLE, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the buffer" + }, + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-buffer-01436", + "text": " If buffer is not VK_NULL_HANDLE, buffer must have been created without VK_BUFFER_CREATE_SPARSE_BINDING_BIT set in VkBufferCreateInfo::flags" + }, + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO" + }, + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-image-parameter", + "text": " If image is not VK_NULL_HANDLE, image must be a valid VkImage handle" + }, + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-buffer-parameter", + "text": " If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-commonparent", + "text": " Both of buffer, and image that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_dedicated_allocation)+(VK_KHR_external_memory_win32)": [ + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-image-01876", + "text": " 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." + }, + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-buffer-01877", + "text": " 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." + } + ], + "(VK_VERSION_1_1,VK_KHR_dedicated_allocation)+(VK_KHR_external_memory_fd)": [ + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-image-01878", + "text": " 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." + }, + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-buffer-01879", + "text": " 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." + } + ], + "(VK_VERSION_1_1,VK_KHR_dedicated_allocation)+(VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkMemoryDedicatedAllocateInfo-image-01797", + "text": " If image is not VK_NULL_HANDLE, image must not have been created with VK_IMAGE_CREATE_DISJOINT_BIT set in VkImageCreateInfo::flags" + } + ] + }, + "VkDedicatedAllocationMemoryAllocateInfoNV": { + "(VK_NV_dedicated_allocation)": [ + { + "vuid": "VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00649", + "text": " At least one of image and buffer must be VK_NULL_HANDLE" + }, + { + "vuid": "VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00650", + "text": " If image is not VK_NULL_HANDLE, the image must have been created with VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation equal to VK_TRUE" + }, + { + "vuid": "VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00651", + "text": " If buffer is not VK_NULL_HANDLE, the buffer must have been created with VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation equal to VK_TRUE" + }, + { + "vuid": "VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00652", + "text": " If image is not VK_NULL_HANDLE, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the image" + }, + { + "vuid": "VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00653", + "text": " If buffer is not VK_NULL_HANDLE, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the buffer" + }, + { + "vuid": "VUID-VkDedicatedAllocationMemoryAllocateInfoNV-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV" + }, + { + "vuid": "VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-parameter", + "text": " If image is not VK_NULL_HANDLE, image must be a valid VkImage handle" + }, + { + "vuid": "VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-parameter", + "text": " If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-VkDedicatedAllocationMemoryAllocateInfoNV-commonparent", + "text": " Both of buffer, and image that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_NV_dedicated_allocation)+(VK_KHR_external_memory_win32,VK_KHR_external_memory_fd)": [ + { + "vuid": "VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00654", + "text": " 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." + }, + { + "vuid": "VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00655", + "text": " 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." + } + ] + }, + "VkExportMemoryAllocateInfo": { + "(VK_VERSION_1_1,VK_KHR_external_memory)": [ + { + "vuid": "VUID-VkExportMemoryAllocateInfo-handleTypes-00656", + "text": " The bits in handleTypes must be supported and compatible, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties." + }, + { + "vuid": "VUID-VkExportMemoryAllocateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO" + }, + { + "vuid": "VUID-VkExportMemoryAllocateInfo-handleTypes-parameter", + "text": " handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values" + } + ] + }, + "VkExportMemoryWin32HandleInfoKHR": { + "(VK_KHR_external_memory_win32)": [ + { + "vuid": "VUID-VkExportMemoryWin32HandleInfoKHR-handleTypes-00657", + "text": " 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, VkExportMemoryWin32HandleInfoKHR must not be in the pNext chain of VkMemoryAllocateInfo." + }, + { + "vuid": "VUID-VkExportMemoryWin32HandleInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR" + }, + { + "vuid": "VUID-VkExportMemoryWin32HandleInfoKHR-pAttributes-parameter", + "text": " If pAttributes is not NULL, pAttributes must be a valid pointer to a valid SECURITY_ATTRIBUTES value" + } + ] + }, + "VkImportMemoryWin32HandleInfoKHR": { + "(VK_KHR_external_memory_win32)": [ + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00658", + "text": " If handleType is not 0, it must be supported for import, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties." + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoKHR-handle-00659", + "text": " 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." + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00660", + "text": " If handleType is not 0, it must be defined as an NT handle or a global share handle." + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoKHR-handleType-01439", + "text": " 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." + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoKHR-handleType-01440", + "text": " If handleType is not 0 and handle is NULL, name must name a valid memory resource of the type specified by handleType." + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00661", + "text": " If handleType is not 0 and name is NULL, handle must be a valid handle of the type specified by handleType." + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoKHR-handle-01441", + "text": " if handle is not NULL, name must be NULL." + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoKHR-handle-01518", + "text": " If handle is not NULL, it must obey any requirements listed for handleType in external memory handle types compatibility." + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoKHR-name-01519", + "text": " If name is not NULL, it must obey any requirements listed for handleType in external memory handle types compatibility." + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR" + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoKHR-handleType-parameter", + "text": " If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value" + } + ] + }, + "vkGetMemoryWin32HandleKHR": { + "(VK_KHR_external_memory_win32)": [ + { + "vuid": "VUID-vkGetMemoryWin32HandleKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetMemoryWin32HandleKHR-pGetWin32HandleInfo-parameter", + "text": " pGetWin32HandleInfo must be a valid pointer to a valid VkMemoryGetWin32HandleInfoKHR structure" + }, + { + "vuid": "VUID-vkGetMemoryWin32HandleKHR-pHandle-parameter", + "text": " pHandle must be a valid pointer to a HANDLE value" + } + ] + }, + "VkMemoryGetWin32HandleInfoKHR": { + "(VK_KHR_external_memory_win32)": [ + { + "vuid": "VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00662", + "text": " handleType must have been included in VkExportMemoryAllocateInfo::handleTypes when memory was created." + }, + { + "vuid": "VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00663", + "text": " 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." + }, + { + "vuid": "VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00664", + "text": " handleType must be defined as an NT handle or a global share handle." + }, + { + "vuid": "VUID-VkMemoryGetWin32HandleInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR" + }, + { + "vuid": "VUID-VkMemoryGetWin32HandleInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkMemoryGetWin32HandleInfoKHR-memory-parameter", + "text": " memory must be a valid VkDeviceMemory handle" + }, + { + "vuid": "VUID-VkMemoryGetWin32HandleInfoKHR-handleType-parameter", + "text": " handleType must be a valid VkExternalMemoryHandleTypeFlagBits value" + } + ] + }, + "vkGetMemoryWin32HandlePropertiesKHR": { + "(VK_KHR_external_memory_win32)": [ + { + "vuid": "VUID-vkGetMemoryWin32HandlePropertiesKHR-handle-00665", + "text": " handle must be an external memory handle created outside of the Vulkan API." + }, + { + "vuid": "VUID-vkGetMemoryWin32HandlePropertiesKHR-handleType-00666", + "text": " handleType must not be one of the handle types defined as opaque." + }, + { + "vuid": "VUID-vkGetMemoryWin32HandlePropertiesKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetMemoryWin32HandlePropertiesKHR-handleType-parameter", + "text": " handleType must be a valid VkExternalMemoryHandleTypeFlagBits value" + }, + { + "vuid": "VUID-vkGetMemoryWin32HandlePropertiesKHR-pMemoryWin32HandleProperties-parameter", + "text": " pMemoryWin32HandleProperties must be a valid pointer to a VkMemoryWin32HandlePropertiesKHR structure" + } + ] + }, + "VkImportMemoryFdInfoKHR": { + "(VK_KHR_external_memory_fd)": [ + { + "vuid": "VUID-VkImportMemoryFdInfoKHR-handleType-00667", + "text": " If handleType is not 0, it must be supported for import, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties." + }, + { + "vuid": "VUID-VkImportMemoryFdInfoKHR-fd-00668", + "text": " The memory from which fd was exported must have been created on the same underlying physical device as device." + }, + { + "vuid": "VUID-VkImportMemoryFdInfoKHR-handleType-00669", + "text": " If handleType is not 0, it must be defined as a POSIX file descriptor handle." + }, + { + "vuid": "VUID-VkImportMemoryFdInfoKHR-handleType-00670", + "text": " If handleType is not 0, fd must be a valid handle of the type specified by handleType." + }, + { + "vuid": "VUID-VkImportMemoryFdInfoKHR-fd-01746", + "text": " 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 &amp;lt;&amp;lt;external-memory-handle-types-compatibility&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkImportMemoryFdInfoKHR-fd-01520", + "text": " fd must obey any requirements listed for handleType in &amp;lt;&amp;lt;external-memory-handle-types-compatibility,external memory handle types compatibility&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkImportMemoryFdInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR" + }, + { + "vuid": "VUID-VkImportMemoryFdInfoKHR-handleType-parameter", + "text": " If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value" + } + ] + }, + "vkGetMemoryFdKHR": { + "(VK_KHR_external_memory_fd)": [ + { + "vuid": "VUID-vkGetMemoryFdKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetMemoryFdKHR-pGetFdInfo-parameter", + "text": " pGetFdInfo must be a valid pointer to a valid VkMemoryGetFdInfoKHR structure" + }, + { + "vuid": "VUID-vkGetMemoryFdKHR-pFd-parameter", + "text": " pFd must be a valid pointer to a int value" + } + ] + }, + "VkMemoryGetFdInfoKHR": { + "(VK_KHR_external_memory_fd)": [ + { + "vuid": "VUID-VkMemoryGetFdInfoKHR-handleType-00671", + "text": " handleType must have been included in VkExportMemoryAllocateInfo::handleTypes when memory was created." + }, + { + "vuid": "VUID-VkMemoryGetFdInfoKHR-handleType-00672", + "text": " handleType must be defined as a POSIX file descriptor handle." + }, + { + "vuid": "VUID-VkMemoryGetFdInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR" + }, + { + "vuid": "VUID-VkMemoryGetFdInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkMemoryGetFdInfoKHR-memory-parameter", + "text": " memory must be a valid VkDeviceMemory handle" + }, + { + "vuid": "VUID-VkMemoryGetFdInfoKHR-handleType-parameter", + "text": " handleType must be a valid VkExternalMemoryHandleTypeFlagBits value" + } + ] + }, + "vkGetMemoryFdPropertiesKHR": { + "(VK_KHR_external_memory_fd)": [ + { + "vuid": "VUID-vkGetMemoryFdPropertiesKHR-fd-00673", + "text": " fd must be an external memory handle created outside of the Vulkan API." + }, + { + "vuid": "VUID-vkGetMemoryFdPropertiesKHR-handleType-00674", + "text": " handleType must not be VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR." + }, + { + "vuid": "VUID-vkGetMemoryFdPropertiesKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetMemoryFdPropertiesKHR-handleType-parameter", + "text": " handleType must be a valid VkExternalMemoryHandleTypeFlagBits value" + }, + { + "vuid": "VUID-vkGetMemoryFdPropertiesKHR-pMemoryFdProperties-parameter", + "text": " pMemoryFdProperties must be a valid pointer to a VkMemoryFdPropertiesKHR structure" + } + ] + }, + "VkImportMemoryHostPointerInfoEXT": { + "(VK_EXT_external_memory_host)": [ + { + "vuid": "VUID-VkImportMemoryHostPointerInfoEXT-handleType-01747", + "text": " If handleType is not 0, it must be supported for import, as reported in VkExternalMemoryPropertiesKHR" + }, + { + "vuid": "VUID-VkImportMemoryHostPointerInfoEXT-handleType-01748", + "text": " 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" + }, + { + "vuid": "VUID-VkImportMemoryHostPointerInfoEXT-pHostPointer-01749", + "text": " pHostPointer must be a pointer aligned to an integer multiple of VkPhysicalDeviceExternalMemoryHostPropertiesEXT::minImportedHostPointerAlignment" + }, + { + "vuid": "VUID-VkImportMemoryHostPointerInfoEXT-handleType-01750", + "text": " 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" + }, + { + "vuid": "VUID-VkImportMemoryHostPointerInfoEXT-handleType-01751", + "text": " 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" + }, + { + "vuid": "VUID-VkImportMemoryHostPointerInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT" + }, + { + "vuid": "VUID-VkImportMemoryHostPointerInfoEXT-handleType-parameter", + "text": " handleType must be a valid VkExternalMemoryHandleTypeFlagBits value" + } + ] + }, + "vkGetMemoryHostPointerPropertiesEXT": { + "(VK_EXT_external_memory_host)": [ + { + "vuid": "VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01752", + "text": " handleType must be VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT or VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT" + }, + { + "vuid": "VUID-vkGetMemoryHostPointerPropertiesEXT-pHostPointer-01753", + "text": " pHostPointer must be a pointer aligned to an integer multiple of VkPhysicalDeviceExternalMemoryHostPropertiesEXT::minImportedHostPointerAlignment" + }, + { + "vuid": "VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01754", + "text": " If handleType is VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT, pHostPointer must be a pointer to host memory" + }, + { + "vuid": "VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01755", + "text": " If handleType is VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT, pHostPointer must be a pointer to host mapped foreign memory" + }, + { + "vuid": "VUID-vkGetMemoryHostPointerPropertiesEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-parameter", + "text": " handleType must be a valid VkExternalMemoryHandleTypeFlagBits value" + }, + { + "vuid": "VUID-vkGetMemoryHostPointerPropertiesEXT-pMemoryHostPointerProperties-parameter", + "text": " pMemoryHostPointerProperties must be a valid pointer to a VkMemoryHostPointerPropertiesEXT structure" + } + ] + }, + "VkMemoryHostPointerPropertiesEXT": { + "(VK_EXT_external_memory_host)": [ + { + "vuid": "VUID-VkMemoryHostPointerPropertiesEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT" + }, + { + "vuid": "VUID-VkMemoryHostPointerPropertiesEXT-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "VkImportAndroidHardwareBufferInfoANDROID": { + "(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01880", + "text": " If buffer is not NULL, Android hardware buffers must be supported for import, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties." + }, + { + "vuid": "VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881", + "text": " If buffer is not NULL, it must be a valid Android hardware buffer object with format and usage compatible with Vulkan as described by VkExternalMemoryHandleTypeFlagBits." + }, + { + "vuid": "VUID-VkImportAndroidHardwareBufferInfoANDROID-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID" + }, + { + "vuid": "VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-parameter", + "text": " buffer must be a valid pointer to a AHardwareBuffer value" + } + ] + }, + "vkGetMemoryAndroidHardwareBufferANDROID": { + "(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-vkGetMemoryAndroidHardwareBufferANDROID-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetMemoryAndroidHardwareBufferANDROID-pInfo-parameter", + "text": " pInfo must be a valid pointer to a valid VkMemoryGetAndroidHardwareBufferInfoANDROID structure" + }, + { + "vuid": "VUID-vkGetMemoryAndroidHardwareBufferANDROID-pBuffer-parameter", + "text": " pBuffer must be a valid pointer to a valid pointer to a AHardwareBuffer value" + } + ] + }, + "VkMemoryGetAndroidHardwareBufferInfoANDROID": { + "(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-handleTypes-01882", + "text": " VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID must have been included in VkExportMemoryAllocateInfoKHR::handleTypes when memory was created." + }, + { + "vuid": "VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-01883", + "text": " 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." + } + ] + }, + "vkGetAndroidHardwareBufferPropertiesANDROID": { + "(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-01884", + "text": " buffer must be a valid Android hardware buffer object with at least one of the AHARDWAREBUFFER_USAGE_GPU_* usage flags." + }, + { + "vuid": "VUID-vkGetAndroidHardwareBufferPropertiesANDROID-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-parameter", + "text": " buffer must be a valid pointer to a valid AHardwareBuffer value" + }, + { + "vuid": "VUID-vkGetAndroidHardwareBufferPropertiesANDROID-pProperties-parameter", + "text": " pProperties must be a valid pointer to a VkAndroidHardwareBufferPropertiesANDROID structure" + } + ] + }, + "VkAndroidHardwareBufferFormatPropertiesANDROID": { + "(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkAndroidHardwareBufferFormatPropertiesANDROID-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID" + } + ] + }, + "VkExportMemoryAllocateInfoNV": { + "(VK_NV_external_memory)": [ + { + "vuid": "VUID-VkExportMemoryAllocateInfoNV-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV" + }, + { + "vuid": "VUID-VkExportMemoryAllocateInfoNV-handleTypes-parameter", + "text": " handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values" + } + ] + }, + "VkExportMemoryWin32HandleInfoNV": { + "(VK_NV_external_memory_win32)": [ + { + "vuid": "VUID-VkExportMemoryWin32HandleInfoNV-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV" + }, + { + "vuid": "VUID-VkExportMemoryWin32HandleInfoNV-pAttributes-parameter", + "text": " If pAttributes is not NULL, pAttributes must be a valid pointer to a valid SECURITY_ATTRIBUTES value" + } + ] + }, + "VkImportMemoryWin32HandleInfoNV": { + "(VK_NV_external_memory_win32)": [ + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoNV-handleType-01327", + "text": " handleType must not have more than one bit set." + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoNV-handle-01328", + "text": " handle must be a valid handle to memory, obtained as specified by handleType." + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoNV-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV" + }, + { + "vuid": "VUID-VkImportMemoryWin32HandleInfoNV-handleType-parameter", + "text": " handleType must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values" + } + ] + }, + "vkGetMemoryWin32HandleNV": { + "(VK_NV_external_memory_win32)": [ + { + "vuid": "VUID-vkGetMemoryWin32HandleNV-handleType-01326", + "text": " handleType must be a flag specified in VkExportMemoryAllocateInfoNV::handleTypes when allocating memory" + }, + { + "vuid": "VUID-vkGetMemoryWin32HandleNV-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetMemoryWin32HandleNV-memory-parameter", + "text": " memory must be a valid VkDeviceMemory handle" + }, + { + "vuid": "VUID-vkGetMemoryWin32HandleNV-handleType-parameter", + "text": " handleType must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values" + }, + { + "vuid": "VUID-vkGetMemoryWin32HandleNV-handleType-requiredbitmask", + "text": " handleType must not be 0" + }, + { + "vuid": "VUID-vkGetMemoryWin32HandleNV-pHandle-parameter", + "text": " pHandle must be a valid pointer to a HANDLE value" + }, + { + "vuid": "VUID-vkGetMemoryWin32HandleNV-memory-parent", + "text": " memory must have been created, allocated, or retrieved from device" + } + ] + }, + "VkMemoryAllocateFlagsInfo": { + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkMemoryAllocateFlagsInfo-deviceMask-00675", + "text": " If VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT is set, deviceMask must be a valid device mask." + }, + { + "vuid": "VUID-VkMemoryAllocateFlagsInfo-deviceMask-00676", + "text": " If VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT is set, deviceMask must not be zero" + }, + { + "vuid": "VUID-VkMemoryAllocateFlagsInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO" + }, + { + "vuid": "VUID-VkMemoryAllocateFlagsInfo-flags-parameter", + "text": " flags must be a valid combination of VkMemoryAllocateFlagBits values" + } + ] + }, + "vkFreeMemory": { + "core": [ + { + "vuid": "VUID-vkFreeMemory-memory-00677", + "text": " All submitted commands that refer to memory (via images or buffers) must have completed execution" + }, + { + "vuid": "VUID-vkFreeMemory-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkFreeMemory-memory-parameter", + "text": " If memory is not VK_NULL_HANDLE, memory must be a valid VkDeviceMemory handle" + }, + { + "vuid": "VUID-vkFreeMemory-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkFreeMemory-memory-parent", + "text": " If memory is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkMapMemory": { + "core": [ + { + "vuid": "VUID-vkMapMemory-memory-00678", + "text": " memory must not be currently mapped" + }, + { + "vuid": "VUID-vkMapMemory-offset-00679", + "text": " offset must be less than the size of memory" + }, + { + "vuid": "VUID-vkMapMemory-size-00680", + "text": " If size is not equal to VK_WHOLE_SIZE, size must be greater than 0" + }, + { + "vuid": "VUID-vkMapMemory-size-00681", + "text": " If size is not equal to VK_WHOLE_SIZE, size must be less than or equal to the size of the memory minus offset" + }, + { + "vuid": "VUID-vkMapMemory-memory-00682", + "text": " memory must have been created with a memory type that reports VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT" + }, + { + "vuid": "VUID-vkMapMemory-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkMapMemory-memory-parameter", + "text": " memory must be a valid VkDeviceMemory handle" + }, + { + "vuid": "VUID-vkMapMemory-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-vkMapMemory-ppData-parameter", + "text": " ppData must be a valid pointer to a pointer value" + }, + { + "vuid": "VUID-vkMapMemory-memory-parent", + "text": " memory must have been created, allocated, or retrieved from device" + } + ], + "(VK_KHR_device_group)": [ + { + "vuid": "VUID-vkMapMemory-memory-00683", + "text": " memory must not have been allocated with multiple instances." + } + ] + }, + "vkFlushMappedMemoryRanges": { + "core": [ + { + "vuid": "VUID-vkFlushMappedMemoryRanges-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkFlushMappedMemoryRanges-pMemoryRanges-parameter", + "text": " pMemoryRanges must be a valid pointer to an array of memoryRangeCount valid VkMappedMemoryRange structures" + }, + { + "vuid": "VUID-vkFlushMappedMemoryRanges-memoryRangeCount-arraylength", + "text": " memoryRangeCount must be greater than 0" + } + ] + }, + "vkInvalidateMappedMemoryRanges": { + "core": [ + { + "vuid": "VUID-vkInvalidateMappedMemoryRanges-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkInvalidateMappedMemoryRanges-pMemoryRanges-parameter", + "text": " pMemoryRanges must be a valid pointer to an array of memoryRangeCount valid VkMappedMemoryRange structures" + }, + { + "vuid": "VUID-vkInvalidateMappedMemoryRanges-memoryRangeCount-arraylength", + "text": " memoryRangeCount must be greater than 0" + } + ] + }, + "VkMappedMemoryRange": { + "core": [ + { + "vuid": "VUID-VkMappedMemoryRange-memory-00684", + "text": " memory must be currently mapped" + }, + { + "vuid": "VUID-VkMappedMemoryRange-size-00685", + "text": " If size is not equal to VK_WHOLE_SIZE, offset and size must specify a range contained within the currently mapped range of memory" + }, + { + "vuid": "VUID-VkMappedMemoryRange-size-00686", + "text": " If size is equal to VK_WHOLE_SIZE, offset must be within the currently mapped range of memory" + }, + { + "vuid": "VUID-VkMappedMemoryRange-size-01389", + "text": " 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." + }, + { + "vuid": "VUID-VkMappedMemoryRange-offset-00687", + "text": " offset must be a multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize" + }, + { + "vuid": "VUID-VkMappedMemoryRange-size-01390", + "text": " 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." + }, + { + "vuid": "VUID-VkMappedMemoryRange-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE" + }, + { + "vuid": "VUID-VkMappedMemoryRange-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkMappedMemoryRange-memory-parameter", + "text": " memory must be a valid VkDeviceMemory handle" + } + ] + }, + "vkUnmapMemory": { + "core": [ + { + "vuid": "VUID-vkUnmapMemory-memory-00689", + "text": " memory must be currently mapped" + }, + { + "vuid": "VUID-vkUnmapMemory-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkUnmapMemory-memory-parameter", + "text": " memory must be a valid VkDeviceMemory handle" + }, + { + "vuid": "VUID-vkUnmapMemory-memory-parent", + "text": " memory must have been created, allocated, or retrieved from device" + } + ] + }, + "vkGetDeviceMemoryCommitment": { + "core": [ + { + "vuid": "VUID-vkGetDeviceMemoryCommitment-memory-00690", + "text": " memory must have been created with a memory type that reports VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT" + }, + { + "vuid": "VUID-vkGetDeviceMemoryCommitment-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetDeviceMemoryCommitment-memory-parameter", + "text": " memory must be a valid VkDeviceMemory handle" + }, + { + "vuid": "VUID-vkGetDeviceMemoryCommitment-pCommittedMemoryInBytes-parameter", + "text": " pCommittedMemoryInBytes must be a valid pointer to a VkDeviceSize value" + }, + { + "vuid": "VUID-vkGetDeviceMemoryCommitment-memory-parent", + "text": " memory must have been created, allocated, or retrieved from device" + } + ] + }, + "vkGetDeviceGroupPeerMemoryFeatures": { + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-vkGetDeviceGroupPeerMemoryFeatures-heapIndex-00691", + "text": " heapIndex must be less than memoryHeapCount" + }, + { + "vuid": "VUID-vkGetDeviceGroupPeerMemoryFeatures-localDeviceIndex-00692", + "text": " localDeviceIndex must be a valid device index" + }, + { + "vuid": "VUID-vkGetDeviceGroupPeerMemoryFeatures-remoteDeviceIndex-00693", + "text": " remoteDeviceIndex must be a valid device index" + }, + { + "vuid": "VUID-vkGetDeviceGroupPeerMemoryFeatures-localDeviceIndex-00694", + "text": " localDeviceIndex must not equal remoteDeviceIndex" + }, + { + "vuid": "VUID-vkGetDeviceGroupPeerMemoryFeatures-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetDeviceGroupPeerMemoryFeatures-pPeerMemoryFeatures-parameter", + "text": " pPeerMemoryFeatures must be a valid pointer to a VkPeerMemoryFeatureFlags value" + }, + { + "vuid": "VUID-vkGetDeviceGroupPeerMemoryFeatures-pPeerMemoryFeatures-requiredbitmask", + "text": " pPeerMemoryFeatures must not be 0" + } + ] + }, + "vkCreateBuffer": { + "core": [ + { + "vuid": "VUID-vkCreateBuffer-flags-00911", + "text": " 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" + }, + { + "vuid": "VUID-vkCreateBuffer-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateBuffer-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkBufferCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateBuffer-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateBuffer-pBuffer-parameter", + "text": " pBuffer must be a valid pointer to a VkBuffer handle" + } + ] + }, + "VkBufferCreateInfo": { + "core": [ + { + "vuid": "VUID-VkBufferCreateInfo-size-00912", + "text": " size must be greater than 0" + }, + { + "vuid": "VUID-VkBufferCreateInfo-sharingMode-00913", + "text": " If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a valid pointer to an array of queueFamilyIndexCount uint32_t values" + }, + { + "vuid": "VUID-VkBufferCreateInfo-sharingMode-00914", + "text": " If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1" + }, + { + "vuid": "VUID-VkBufferCreateInfo-flags-00915", + "text": " If the &amp;lt;&amp;lt;features-features-sparseBinding,sparse bindings&amp;gt;&amp;gt; feature is not enabled, flags must not contain VK_BUFFER_CREATE_SPARSE_BINDING_BIT" + }, + { + "vuid": "VUID-VkBufferCreateInfo-flags-00916", + "text": " If the &amp;lt;&amp;lt;features-features-sparseResidencyBuffer,sparse buffer residency&amp;gt;&amp;gt; feature is not enabled, flags must not contain VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT" + }, + { + "vuid": "VUID-VkBufferCreateInfo-flags-00917", + "text": " If the &amp;lt;&amp;lt;features-features-sparseResidencyAliased,sparse aliased residency&amp;gt;&amp;gt; feature is not enabled, flags must not contain VK_BUFFER_CREATE_SPARSE_ALIASED_BIT" + }, + { + "vuid": "VUID-VkBufferCreateInfo-flags-00918", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO" + }, + { + "vuid": "VUID-VkBufferCreateInfo-pNext-pNext", + "text": " 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 VkDedicatedAllocationBufferCreateInfoNV or VkExternalMemoryBufferCreateInfo" + }, + { + "vuid": "VUID-VkBufferCreateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkBufferCreateInfo-flags-parameter", + "text": " flags must be a valid combination of VkBufferCreateFlagBits values" + }, + { + "vuid": "VUID-VkBufferCreateInfo-usage-parameter", + "text": " usage must be a valid combination of VkBufferUsageFlagBits values" + }, + { + "vuid": "VUID-VkBufferCreateInfo-usage-requiredbitmask", + "text": " usage must not be 0" + }, + { + "vuid": "VUID-VkBufferCreateInfo-sharingMode-parameter", + "text": " sharingMode must be a valid VkSharingMode value" + } + ], + "!(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkBufferCreateInfo-sharingMode-01391", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkBufferCreateInfo-sharingMode-01419", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_external_memory)": [ + { + "vuid": "VUID-VkBufferCreateInfo-pNext-00920", + "text": " If the pNext chain contains an instance of VkExternalMemoryBufferCreateInfo, its handleTypes member must only contain bits that are also in VkExternalBufferProperties::externalMemoryProperties.pname:compatibleHandleTypes, as returned by vkGetPhysicalDeviceExternalBufferProperties with pExternalBufferInfo\\-&amp;gt;handleType equal to any one of the handle types specified in VkExternalMemoryBufferCreateInfo::handleTypes" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-VkBufferCreateInfo-flags-01887", + "text": " If the protected memory feature is not enabled, flags must not contain VK_BUFFER_CREATE_PROTECTED_BIT" + }, + { + "vuid": "VUID-VkBufferCreateInfo-None-01888", + "text": " 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" + } + ], + "(VK_NV_dedicated_allocation)": [ + { + "vuid": "VUID-VkBufferCreateInfo-pNext-01571", + "text": " If the pNext chain contains an instance of VkDedicatedAllocationBufferCreateInfoNV, 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" + } + ] + }, + "VkDedicatedAllocationBufferCreateInfoNV": { + "(VK_NV_dedicated_allocation)": [ + { + "vuid": "VUID-VkDedicatedAllocationBufferCreateInfoNV-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV" + } + ] + }, + "VkExternalMemoryBufferCreateInfo": { + "(VK_VERSION_1_1,VK_KHR_external_memory)": [ + { + "vuid": "VUID-VkExternalMemoryBufferCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO" + }, + { + "vuid": "VUID-VkExternalMemoryBufferCreateInfo-handleTypes-parameter", + "text": " handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values" + } + ] + }, + "vkDestroyBuffer": { + "core": [ + { + "vuid": "VUID-vkDestroyBuffer-buffer-00922", + "text": " All submitted commands that refer to buffer, either directly or via a VkBufferView, must have completed execution" + }, + { + "vuid": "VUID-vkDestroyBuffer-buffer-00923", + "text": " If VkAllocationCallbacks were provided when buffer was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyBuffer-buffer-00924", + "text": " If no VkAllocationCallbacks were provided when buffer was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyBuffer-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyBuffer-buffer-parameter", + "text": " If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkDestroyBuffer-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyBuffer-buffer-parent", + "text": " If buffer is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCreateBufferView": { + "core": [ + { + "vuid": "VUID-vkCreateBufferView-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateBufferView-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkBufferViewCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateBufferView-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateBufferView-pView-parameter", + "text": " pView must be a valid pointer to a VkBufferView handle" + } + ] + }, + "VkBufferViewCreateInfo": { + "core": [ + { + "vuid": "VUID-VkBufferViewCreateInfo-offset-00925", + "text": " offset must be less than the size of buffer" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-offset-00926", + "text": " offset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-range-00928", + "text": " If range is not equal to VK_WHOLE_SIZE, range must be greater than 0" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-range-00929", + "text": " If range is not equal to VK_WHOLE_SIZE, range must be a multiple of the element size of format" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-range-00930", + "text": " If range is not equal to VK_WHOLE_SIZE, range divided by the element size of format must be less than or equal to VkPhysicalDeviceLimits::maxTexelBufferElements" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-offset-00931", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-buffer-00932", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-buffer-00933", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-buffer-00934", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-buffer-00935", + "text": " If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-VkBufferViewCreateInfo-format-parameter", + "text": " format must be a valid VkFormat value" + } + ] + }, + "vkDestroyBufferView": { + "core": [ + { + "vuid": "VUID-vkDestroyBufferView-bufferView-00936", + "text": " All submitted commands that refer to bufferView must have completed execution" + }, + { + "vuid": "VUID-vkDestroyBufferView-bufferView-00937", + "text": " If VkAllocationCallbacks were provided when bufferView was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyBufferView-bufferView-00938", + "text": " If no VkAllocationCallbacks were provided when bufferView was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyBufferView-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyBufferView-bufferView-parameter", + "text": " If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle" + }, + { + "vuid": "VUID-vkDestroyBufferView-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyBufferView-bufferView-parent", + "text": " If bufferView is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCreateImage": { + "core": [ + { + "vuid": "VUID-vkCreateImage-flags-00939", + "text": " 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" + }, + { + "vuid": "VUID-vkCreateImage-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateImage-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkImageCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateImage-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateImage-pImage-parameter", + "text": " pImage must be a valid pointer to a VkImage handle" + } + ] + }, + "VkImageCreateInfo": { + "!(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkImageCreateInfo-format-00940", + "text": " The combination of format, imageType, tiling, usage, and flags must be supported, as indicated by a VK_SUCCESS return value from vkGetPhysicalDeviceImageFormatProperties invoked with the same values passed to the corresponding parameters." + } + ], + "(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkImageCreateInfo-pNext-01889", + "text": " If the pNext chain doesn’t contain an instance of VkExternalFormatANDROID, or if format is not VK_FORMAT_UNDEFINED, the combination of format, imageType, tiling, usage, and flags must be supported, as indicated by a VK_SUCCESS return value from vkGetPhysicalDeviceImageFormatProperties invoked with the same values passed to the corresponding parameters." + }, + { + "vuid": "VUID-VkImageCreateInfo-pNext-01892", + "text": " If the pNext chain includes a VkExternalMemoryImageCreateInfo structure whose handleTypes member includes VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID:" + }, + { + "vuid": "VUID-VkImageCreateInfo-pNext-01893", + "text": " If the pNext chain includes a VkExternalFormatANDROID structure whose externalFormat member is not 0:" + } + ], + "core": [ + { + "vuid": "VUID-VkImageCreateInfo-sharingMode-00941", + "text": " If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a valid pointer to an array of queueFamilyIndexCount uint32_t values" + }, + { + "vuid": "VUID-VkImageCreateInfo-sharingMode-00942", + "text": " If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1" + }, + { + "vuid": "VUID-VkImageCreateInfo-format-00943", + "text": " format must not be VK_FORMAT_UNDEFINED" + }, + { + "vuid": "VUID-VkImageCreateInfo-extent-00944", + "text": " extent::width must be greater than 0." + }, + { + "vuid": "VUID-VkImageCreateInfo-extent-00945", + "text": " extent::height must be greater than 0." + }, + { + "vuid": "VUID-VkImageCreateInfo-extent-00946", + "text": " extent::depth must be greater than 0." + }, + { + "vuid": "VUID-VkImageCreateInfo-mipLevels-00947", + "text": " mipLevels must be greater than 0" + }, + { + "vuid": "VUID-VkImageCreateInfo-arrayLayers-00948", + "text": " arrayLayers must be greater than 0" + }, + { + "vuid": "VUID-VkImageCreateInfo-flags-00949", + "text": " If flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, imageType must be VK_IMAGE_TYPE_2D" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00951", + "text": " If imageType is VK_IMAGE_TYPE_1D, extent.width must be less than or equal to VkPhysicalDeviceLimits::maxImageDimension1D, or VkImageFormatProperties::maxExtent.width (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure) - whichever is higher" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00952", + "text": " If imageType is VK_IMAGE_TYPE_2D and flags does not contain VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and extent.height must be less than or equal to VkPhysicalDeviceLimits::maxImageDimension2D, or VkImageFormatProperties::maxExtent.width/height (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure) - whichever is higher" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00953", + "text": " If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and extent.height must be less than or equal to VkPhysicalDeviceLimits::maxImageDimensionCube, or VkImageFormatProperties::maxExtent.width/height (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure) - whichever is higher" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00954", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00955", + "text": " If imageType is VK_IMAGE_TYPE_3D, extent.width, extent.height and extent.depth must be less than or equal to VkPhysicalDeviceLimits::maxImageDimension3D, or VkImageFormatProperties::maxExtent.width/height/depth (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure) - whichever is higher" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00956", + "text": " If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00957", + "text": " If imageType is VK_IMAGE_TYPE_2D, extent.depth must be 1" + }, + { + "vuid": "VUID-VkImageCreateInfo-mipLevels-00958", + "text": " mipLevels must be less than or equal to {lfloor}log2(max(extent.width, extent.height, extent.depth)){rfloor} + 1." + }, + { + "vuid": "VUID-VkImageCreateInfo-extent-00959", + "text": " mipLevels must be less than or equal to VkImageFormatProperties::maxMipLevels (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure)" + }, + { + "vuid": "VUID-VkImageCreateInfo-arrayLayers-00960", + "text": " arrayLayers must be less than or equal to VkImageFormatProperties::maxArrayLayers (as returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure)" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00961", + "text": " If imageType is VK_IMAGE_TYPE_3D, arrayLayers must be 1." + }, + { + "vuid": "VUID-VkImageCreateInfo-samples-00962", + "text": " If samples is not VK_SAMPLE_COUNT_1_BIT, imageType must be VK_IMAGE_TYPE_2D, flags must not contain VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, tiling must be VK_IMAGE_TILING_OPTIMAL, and mipLevels must be equal to 1" + }, + { + "vuid": "VUID-VkImageCreateInfo-usage-00963", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCreateInfo-usage-00964", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCreateInfo-usage-00965", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCreateInfo-usage-00966", + "text": " 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." + }, + { + "vuid": "VUID-VkImageCreateInfo-samples-00967", + "text": " samples must be a bit value that is set in VkImageFormatProperties::sampleCounts returned by vkGetPhysicalDeviceImageFormatProperties with format, imageType, tiling, usage, and flags equal to those in this structure" + }, + { + "vuid": "VUID-VkImageCreateInfo-usage-00968", + "text": " If the &amp;lt;&amp;lt;features-features-shaderStorageImageMultisample,multisampled storage images&amp;gt;&amp;gt; feature is not enabled, and usage contains VK_IMAGE_USAGE_STORAGE_BIT, samples must be VK_SAMPLE_COUNT_1_BIT" + }, + { + "vuid": "VUID-VkImageCreateInfo-flags-00969", + "text": " If the &amp;lt;&amp;lt;features-features-sparseBinding,sparse bindings&amp;gt;&amp;gt; feature is not enabled, flags must not contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT" + }, + { + "vuid": "VUID-VkImageCreateInfo-flags-01924", + "text": " If the &amp;lt;&amp;lt;features-features-sparseResidencyAliased,sparse aliased residency&amp;gt;&amp;gt; feature is not enabled, flags must not contain VK_IMAGE_CREATE_SPARSE_ALIASED_BIT" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00970", + "text": " If imageType is VK_IMAGE_TYPE_1D, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00971", + "text": " If the &amp;lt;&amp;lt;features-features-sparseResidencyImage2D,sparse residency for 2D images&amp;gt;&amp;gt; feature is not enabled, and imageType is VK_IMAGE_TYPE_2D, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00972", + "text": " If the &amp;lt;&amp;lt;features-features-sparseResidencyImage3D,sparse residency for 3D images&amp;gt;&amp;gt; feature is not enabled, and imageType is VK_IMAGE_TYPE_3D, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00973", + "text": " If the &amp;lt;&amp;lt;features-features-sparseResidency2Samples,sparse residency for images with 2 samples&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00974", + "text": " If the &amp;lt;&amp;lt;features-features-sparseResidency4Samples,sparse residency for images with 4 samples&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00975", + "text": " If the &amp;lt;&amp;lt;features-features-sparseResidency8Samples,sparse residency for images with 8 samples&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-00976", + "text": " If the &amp;lt;&amp;lt;features-features-sparseResidency16Samples,sparse residency for images with 16 samples&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkImageCreateInfo-flags-00987", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCreateInfo-None-01925", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCreateInfo-initialLayout-00993", + "text": " initialLayout must be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED." + }, + { + "vuid": "VUID-VkImageCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO" + }, + { + "vuid": "VUID-VkImageCreateInfo-pNext-pNext", + "text": " 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, VkImageFormatListCreateInfoKHR, or VkImageSwapchainCreateInfoKHR" + }, + { + "vuid": "VUID-VkImageCreateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkImageCreateInfo-flags-parameter", + "text": " flags must be a valid combination of VkImageCreateFlagBits values" + }, + { + "vuid": "VUID-VkImageCreateInfo-imageType-parameter", + "text": " imageType must be a valid VkImageType value" + }, + { + "vuid": "VUID-VkImageCreateInfo-format-parameter", + "text": " format must be a valid VkFormat value" + }, + { + "vuid": "VUID-VkImageCreateInfo-samples-parameter", + "text": " samples must be a valid VkSampleCountFlagBits value" + }, + { + "vuid": "VUID-VkImageCreateInfo-tiling-parameter", + "text": " tiling must be a valid VkImageTiling value" + }, + { + "vuid": "VUID-VkImageCreateInfo-usage-parameter", + "text": " usage must be a valid combination of VkImageUsageFlagBits values" + }, + { + "vuid": "VUID-VkImageCreateInfo-usage-requiredbitmask", + "text": " usage must not be 0" + }, + { + "vuid": "VUID-VkImageCreateInfo-sharingMode-parameter", + "text": " sharingMode must be a valid VkSharingMode value" + }, + { + "vuid": "VUID-VkImageCreateInfo-initialLayout-parameter", + "text": " initialLayout must be a valid VkImageLayout value" + } + ], + "!(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkImageCreateInfo-sharingMode-01392", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkImageCreateInfo-sharingMode-01420", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-VkImageCreateInfo-flags-00950", + "text": " If flags contains VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT, imageType must be VK_IMAGE_TYPE_3D" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-VkImageCreateInfo-flags-01890", + "text": " If the protected memory feature is not enabled, flags must not contain VK_IMAGE_CREATE_PROTECTED_BIT." + }, + { + "vuid": "VUID-VkImageCreateInfo-None-01891", + "text": " 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." + } + ], + "(VK_VERSION_1_1,VK_KHR_external_memory)+(VK_NV_external_memory)": [ + { + "vuid": "VUID-VkImageCreateInfo-pNext-00988", + "text": " If the pNext chain contains an instance of VkExternalMemoryImageCreateInfoNV, it must not contain an instance of VkExternalMemoryImageCreateInfo." + } + ], + "(VK_VERSION_1_1,VK_KHR_external_memory)": [ + { + "vuid": "VUID-VkImageCreateInfo-pNext-00990", + "text": " If the pNext chain contains an instance of VkExternalMemoryImageCreateInfo, 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 an instance of VkPhysicalDeviceExternalImageFormatInfo in the pNext chain, with a handleType equal to any one of the handle types specified in VkExternalMemoryImageCreateInfo::handleTypes" + } + ], + "(VK_NV_external_memory+VK_NV_external_memory_capabilities)": [ + { + "vuid": "VUID-VkImageCreateInfo-pNext-00991", + "text": " If the pNext chain contains an instance of VkExternalMemoryImageCreateInfoNV, 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkImageCreateInfo-physicalDeviceCount-01421", + "text": " If the logical device was created with VkDeviceGroupDeviceCreateInfo::physicalDeviceCount equal to 1, flags must not contain VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT" + }, + { + "vuid": "VUID-VkImageCreateInfo-flags-00992", + "text": " 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 tiling must be VK_IMAGE_TILING_OPTIMAL" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-VkImageCreateInfo-flags-01572", + "text": " If flags contains VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, then format must be a &amp;lt;&amp;lt;appendix-compressedtex-bc,block-compressed image format&amp;gt;&amp;gt;, an &amp;lt;&amp;lt;appendix-compressedtex-etc2, ETC compressed image format&amp;gt;&amp;gt;, or an &amp;lt;&amp;lt;appendix-compressedtex-astc, ASTC compressed image format&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkImageCreateInfo-flags-01573", + "text": " If flags contains VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, then flags must also contain VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT." + } + ], + "(VK_VERSION_1_1,VK_KHR_external_memory,VK_NV_external_memory)": [ + { + "vuid": "VUID-VkImageCreateInfo-pNext-01443", + "text": " If the pNext chain includes a ifdef::VK_VERSION_1_1,VK_KHR_external_memory[VkExternalMemoryImageCreateInfo]" + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkImageCreateInfo-format-01574", + "text": " If the image format is one of those listed in &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion&amp;gt;&amp;gt;:" + }, + { + "vuid": "VUID-VkImageCreateInfo-tiling-01575", + "text": " If tiling is VK_IMAGE_TILING_OPTIMAL, format is a multi-planar format, and VkFormatProperties::optimalTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_DISJOINT_BIT, flags must not contain VK_IMAGE_CREATE_DISJOINT_BIT" + }, + { + "vuid": "VUID-VkImageCreateInfo-tiling-01576", + "text": " If tiling is VK_IMAGE_TILING_LINEAR, format is a multi-planar format, and VkFormatProperties::linearTilingFeatures (as returned by vkGetPhysicalDeviceFormatProperties with the same value of format) does not include VK_FORMAT_FEATURE_DISJOINT_BIT, flags must not contain VK_IMAGE_CREATE_DISJOINT_BIT" + }, + { + "vuid": "VUID-VkImageCreateInfo-format-01577", + "text": " 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" + } + ], + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-VkImageCreateInfo-flags-01533", + "text": " If flags contains VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT format must be a depth or depth/stencil format" + } + ] + }, + "VkDedicatedAllocationImageCreateInfoNV": { + "(VK_NV_dedicated_allocation)": [ + { + "vuid": "VUID-VkDedicatedAllocationImageCreateInfoNV-dedicatedAllocation-00994", + "text": " 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" + }, + { + "vuid": "VUID-VkDedicatedAllocationImageCreateInfoNV-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV" + } + ] + }, + "VkExternalMemoryImageCreateInfo": { + "(VK_VERSION_1_1,VK_KHR_external_memory)": [ + { + "vuid": "VUID-VkExternalMemoryImageCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO" + }, + { + "vuid": "VUID-VkExternalMemoryImageCreateInfo-handleTypes-parameter", + "text": " handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values" + }, + { + "vuid": "VUID-VkExternalMemoryImageCreateInfo-handleTypes-requiredbitmask", + "text": " handleTypes must not be 0" + } + ] + }, + "VkExternalMemoryImageCreateInfoNV": { + "(VK_NV_external_memory)": [ + { + "vuid": "VUID-VkExternalMemoryImageCreateInfoNV-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV" + }, + { + "vuid": "VUID-VkExternalMemoryImageCreateInfoNV-handleTypes-parameter", + "text": " handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values" + } + ] + }, + "VkExternalFormatANDROID": { + "(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkExternalFormatANDROID-externalFormat-01894", + "text": " externalFormat must be 0 or a value returned in the externalFormat member of VkAndroidHardwareBufferFormatPropertiesANDROID by an earlier call to vkGetAndroidHardwareBufferPropertiesANDROID" + }, + { + "vuid": "VUID-VkExternalFormatANDROID-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID" + } + ] + }, + "VkImageSwapchainCreateInfoKHR": { + "(VK_VERSION_1_1,VK_KHR_device_group)+(VK_KHR_swapchain)": [ + { + "vuid": "VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995", + "text": " If swapchain is not VK_NULL_HANDLE, the fields of VkImageCreateInfo must match the &amp;lt;&amp;lt;swapchain-wsi-image-create-info, implied image creation parameters&amp;gt;&amp;gt; of the swapchain" + }, + { + "vuid": "VUID-VkImageSwapchainCreateInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR" + }, + { + "vuid": "VUID-VkImageSwapchainCreateInfoKHR-swapchain-parameter", + "text": " If swapchain is not VK_NULL_HANDLE, swapchain must be a valid VkSwapchainKHR handle" + } + ] + }, + "VkImageFormatListCreateInfoKHR": { + "(VK_KHR_image_format_list)": [ + { + "vuid": "VUID-VkImageFormatListCreateInfoKHR-viewFormatCount-01578", + "text": " 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." + }, + { + "vuid": "VUID-VkImageFormatListCreateInfoKHR-flags-01579", + "text": " If VkImageCreateInfo::flags does not contain VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, viewFormatCount must be 0 or 1." + }, + { + "vuid": "VUID-VkImageFormatListCreateInfoKHR-viewFormatCount-01580", + "text": " If viewFormatCount is not 0, VkImageCreateInfo::format must be in pViewFormats." + }, + { + "vuid": "VUID-VkImageFormatListCreateInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR" + }, + { + "vuid": "VUID-VkImageFormatListCreateInfoKHR-pViewFormats-parameter", + "text": " If viewFormatCount is not 0, pViewFormats must be a valid pointer to an array of viewFormatCount valid VkFormat values" + } + ] + }, + "vkGetImageSubresourceLayout": { + "core": [ + { + "vuid": "VUID-vkGetImageSubresourceLayout-image-00996", + "text": " image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR" + }, + { + "vuid": "VUID-vkGetImageSubresourceLayout-aspectMask-00997", + "text": " The aspectMask member of pSubresource must only have a single bit set" + }, + { + "vuid": "VUID-vkGetImageSubresourceLayout-mipLevel-01716", + "text": " The mipLevel member of pSubresource must be less than the mipLevels specified in VkImageCreateInfo when image was created" + }, + { + "vuid": "VUID-vkGetImageSubresourceLayout-arrayLayer-01717", + "text": " The arrayLayer member of pSubresource must be less than the arrayLayers specified in VkImageCreateInfo when image was created" + }, + { + "vuid": "VUID-vkGetImageSubresourceLayout-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetImageSubresourceLayout-image-parameter", + "text": " image must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkGetImageSubresourceLayout-pSubresource-parameter", + "text": " pSubresource must be a valid pointer to a valid VkImageSubresource structure" + }, + { + "vuid": "VUID-vkGetImageSubresourceLayout-pLayout-parameter", + "text": " pLayout must be a valid pointer to a VkSubresourceLayout structure" + }, + { + "vuid": "VUID-vkGetImageSubresourceLayout-image-parent", + "text": " image must have been created, allocated, or retrieved from device" + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-vkGetImageSubresourceLayout-format-01581", + "text": " If the format of image is a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar format&amp;gt;&amp;gt; with two planes, the aspectMask member of pSubresource must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT" + }, + { + "vuid": "VUID-vkGetImageSubresourceLayout-format-01582", + "text": " If the format of image is a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar format&amp;gt;&amp;gt; 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" + } + ], + "(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-vkGetImageSubresourceLayout-image-01895", + "text": " 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." + } + ] + }, + "VkImageSubresource": { + "core": [ + { + "vuid": "VUID-VkImageSubresource-aspectMask-parameter", + "text": " aspectMask must be a valid combination of VkImageAspectFlagBits values" + }, + { + "vuid": "VUID-VkImageSubresource-aspectMask-requiredbitmask", + "text": " aspectMask must not be 0" + } + ] + }, + "vkDestroyImage": { + "core": [ + { + "vuid": "VUID-vkDestroyImage-image-01000", + "text": " All submitted commands that refer to image, either directly or via a VkImageView, must have completed execution" + }, + { + "vuid": "VUID-vkDestroyImage-image-01001", + "text": " If VkAllocationCallbacks were provided when image was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyImage-image-01002", + "text": " If no VkAllocationCallbacks were provided when image was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyImage-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyImage-image-parameter", + "text": " If image is not VK_NULL_HANDLE, image must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkDestroyImage-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyImage-image-parent", + "text": " If image is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCreateImageView": { + "core": [ + { + "vuid": "VUID-vkCreateImageView-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateImageView-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkImageViewCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateImageView-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateImageView-pView-parameter", + "text": " pView must be a valid pointer to a VkImageView handle" + } + ] + }, + "VkImageViewCreateInfo": { + "core": [ + { + "vuid": "VUID-VkImageViewCreateInfo-image-01003", + "text": " 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" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-viewType-01004", + "text": " If the &amp;lt;&amp;lt;features-features-imageCubeArray,image cubemap arrays&amp;gt;&amp;gt; feature is not enabled, viewType must not be VK_IMAGE_VIEW_TYPE_CUBE_ARRAY" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01006", + "text": " If image was created with VK_IMAGE_TILING_LINEAR, format must be format that has at least one supported feature bit present in the value of VkFormatProperties::linearTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01007", + "text": " 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" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01008", + "text": " If image was created with VK_IMAGE_TILING_LINEAR and usage contains VK_IMAGE_USAGE_SAMPLED_BIT, format must be supported for sampled images, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT flag in VkFormatProperties::linearTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01009", + "text": " If image was created with VK_IMAGE_TILING_LINEAR and usage contains VK_IMAGE_USAGE_STORAGE_BIT, format must be supported for storage images, as specified by the VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT flag in VkFormatProperties::linearTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01010", + "text": " If image was created with VK_IMAGE_TILING_LINEAR and usage contains VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, format must be supported for color attachments, as specified by the VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT flag in VkFormatProperties::linearTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01011", + "text": " If image was created with VK_IMAGE_TILING_LINEAR and usage contains VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, format must be supported for depth/stencil attachments, as specified by the VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT flag in VkFormatProperties::linearTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01012", + "text": " If image was created with VK_IMAGE_TILING_OPTIMAL, format must be format that has at least one supported feature bit present in the value of VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01013", + "text": " If image was created with VK_IMAGE_TILING_OPTIMAL and usage contains VK_IMAGE_USAGE_SAMPLED_BIT, format must be supported for sampled images, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01014", + "text": " If image was created with VK_IMAGE_TILING_OPTIMAL and usage contains VK_IMAGE_USAGE_STORAGE_BIT, format must be supported for storage images, as specified by the VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01015", + "text": " If image was created with VK_IMAGE_TILING_OPTIMAL and usage contains VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, format must be supported for color attachments, as specified by the VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01016", + "text": " If image was created with VK_IMAGE_TILING_OPTIMAL and usage contains VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, format must be supported for depth/stencil attachments, as specified by the VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties with the same value of format" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-subresourceRange-01478", + "text": " subresourceRange.baseMipLevel must be less than the mipLevels specified in VkImageCreateInfo when image was created" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-subresourceRange-01718", + "text": " 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" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01018", + "text": " 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 &amp;lt;&amp;lt;features-formats-compatibility-classes,Format Compatibility Classes&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01020", + "text": " If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-subResourceRange-01021", + "text": " subresourceRange and viewType must be compatible with the image, as described in the &amp;lt;&amp;lt;resources-image-views-compatibility,compatibility table&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-pNext-pNext", + "text": " 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 VkImageViewUsageCreateInfo or VkSamplerYcbcrConversionInfo" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-parameter", + "text": " image must be a valid VkImage handle" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-viewType-parameter", + "text": " viewType must be a valid VkImageViewType value" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-format-parameter", + "text": " format must be a valid VkFormat value" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-components-parameter", + "text": " components must be a valid VkComponentMapping structure" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-subresourceRange-parameter", + "text": " subresourceRange must be a valid VkImageSubresourceRange structure" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-VkImageViewCreateInfo-image-01005", + "text": " 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" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01482", + "text": " 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" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-subresourceRange-01483", + "text": " 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" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01484", + "text": " 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 extent.depth specified in VkImageCreateInfo when image was created" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-subresourceRange-01485", + "text": " 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 extent.depth specified in VkImageCreateInfo when image was created" + } + ], + "!(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-VkImageViewCreateInfo-subresourceRange-01480", + "text": " subresourceRange.baseArrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when image was created" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-subresourceRange-01719", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance2)+!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkImageViewCreateInfo-image-01759", + "text": " 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 &amp;lt;&amp;lt;features-formats-compatibility-classes,Format Compatibility Classes&amp;gt;&amp;gt;" + } + ], + "!(VK_VERSION_1_1,VK_KHR_maintenance2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkImageViewCreateInfo-image-01760", + "text": " If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, and if the format of the image is not a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar&amp;gt;&amp;gt; format, format must be compatible with the format used to create image, as defined in &amp;lt;&amp;lt;features-formats-compatibility-classes,Format Compatibility Classes&amp;gt;&amp;gt;" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkImageViewCreateInfo-image-01761", + "text": " 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 &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar&amp;gt;&amp;gt; format, format must be compatible with the format used to create image, as defined in &amp;lt;&amp;lt;features-formats-compatibility-classes,Format Compatibility Classes&amp;gt;&amp;gt;" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-VkImageViewCreateInfo-image-01583", + "text": " 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." + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01584", + "text": " 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." + } + ], + "(VK_KHR_image_format_list)": [ + { + "vuid": "VUID-VkImageViewCreateInfo-pNext-01585", + "text": " If a VkImageFormatListCreateInfoKHR structure was included in the pNext chain of the VkImageCreateInfo struct used when creating image and the viewFormatCount field of VkImageFormatListCreateInfoKHR is not zero then format must be one of the formats in VkImageFormatListCreateInfoKHR::pViewFormats." + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkImageViewCreateInfo-image-01586", + "text": " If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, if the format of the image is a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar&amp;gt;&amp;gt; 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 &amp;lt;&amp;lt;features-formats-compatible-planes&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkImageViewCreateInfo-image-01762", + "text": " If image was not created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag," + } + ], + "!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkImageViewCreateInfo-image-01019", + "text": " 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" + } + ], + "(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkImageViewCreateInfo-image-01896", + "text": " If image has an &amp;lt;&amp;lt;memory-external-android-hardware-buffer-external-formats,external format&amp;gt;&amp;gt;:" + } + ] + }, + "VkImageViewUsageCreateInfo": { + "(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-VkImageViewUsageCreateInfo-usage-01587", + "text": " usage must not include any set bits that were not set in the usage member of the VkImageCreateInfo structure used to create the image this image view is created from." + }, + { + "vuid": "VUID-VkImageViewUsageCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO" + }, + { + "vuid": "VUID-VkImageViewUsageCreateInfo-usage-parameter", + "text": " usage must be a valid combination of VkImageUsageFlagBits values" + }, + { + "vuid": "VUID-VkImageViewUsageCreateInfo-usage-requiredbitmask", + "text": " usage must not be 0" + } + ] + }, + "VkImageSubresourceRange": { + "core": [ + { + "vuid": "VUID-VkImageSubresourceRange-levelCount-01720", + "text": " If levelCount is not VK_REMAINING_MIP_LEVELS, it must be greater than 0" + }, + { + "vuid": "VUID-VkImageSubresourceRange-layerCount-01721", + "text": " If layerCount is not VK_REMAINING_ARRAY_LAYERS, it must be greater than 0" + }, + { + "vuid": "VUID-VkImageSubresourceRange-aspectMask-parameter", + "text": " aspectMask must be a valid combination of VkImageAspectFlagBits values" + }, + { + "vuid": "VUID-VkImageSubresourceRange-aspectMask-requiredbitmask", + "text": " aspectMask must not be 0" + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkImageSubresourceRange-aspectMask-01670", + "text": " 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" + } + ] + }, + "VkComponentMapping": { + "core": [ + { + "vuid": "VUID-VkComponentMapping-r-parameter", + "text": " r must be a valid VkComponentSwizzle value" + }, + { + "vuid": "VUID-VkComponentMapping-g-parameter", + "text": " g must be a valid VkComponentSwizzle value" + }, + { + "vuid": "VUID-VkComponentMapping-b-parameter", + "text": " b must be a valid VkComponentSwizzle value" + }, + { + "vuid": "VUID-VkComponentMapping-a-parameter", + "text": " a must be a valid VkComponentSwizzle value" + } + ] + }, + "vkDestroyImageView": { + "core": [ + { + "vuid": "VUID-vkDestroyImageView-imageView-01026", + "text": " All submitted commands that refer to imageView must have completed execution" + }, + { + "vuid": "VUID-vkDestroyImageView-imageView-01027", + "text": " If VkAllocationCallbacks were provided when imageView was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyImageView-imageView-01028", + "text": " If no VkAllocationCallbacks were provided when imageView was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyImageView-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyImageView-imageView-parameter", + "text": " If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle" + }, + { + "vuid": "VUID-vkDestroyImageView-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyImageView-imageView-parent", + "text": " If imageView is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkGetBufferMemoryRequirements": { + "core": [ + { + "vuid": "VUID-vkGetBufferMemoryRequirements-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetBufferMemoryRequirements-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkGetBufferMemoryRequirements-pMemoryRequirements-parameter", + "text": " pMemoryRequirements must be a valid pointer to a VkMemoryRequirements structure" + }, + { + "vuid": "VUID-vkGetBufferMemoryRequirements-buffer-parent", + "text": " buffer must have been created, allocated, or retrieved from device" + } + ] + }, + "vkGetImageMemoryRequirements": { + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-vkGetImageMemoryRequirements-image-01588", + "text": " image must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT flag set" + } + ], + "core": [ + { + "vuid": "VUID-vkGetImageMemoryRequirements-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetImageMemoryRequirements-image-parameter", + "text": " image must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkGetImageMemoryRequirements-pMemoryRequirements-parameter", + "text": " pMemoryRequirements must be a valid pointer to a VkMemoryRequirements structure" + }, + { + "vuid": "VUID-vkGetImageMemoryRequirements-image-parent", + "text": " image must have been created, allocated, or retrieved from device" + } + ] + }, + "vkGetBufferMemoryRequirements2": { + "(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)": [ + { + "vuid": "VUID-vkGetBufferMemoryRequirements2-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetBufferMemoryRequirements2-pInfo-parameter", + "text": " pInfo must be a valid pointer to a valid VkBufferMemoryRequirementsInfo2 structure" + }, + { + "vuid": "VUID-vkGetBufferMemoryRequirements2-pMemoryRequirements-parameter", + "text": " pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure" + } + ] + }, + "VkBufferMemoryRequirementsInfo2": { + "(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)": [ + { + "vuid": "VUID-VkBufferMemoryRequirementsInfo2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2" + }, + { + "vuid": "VUID-VkBufferMemoryRequirementsInfo2-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkBufferMemoryRequirementsInfo2-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + } + ] + }, + "vkGetImageMemoryRequirements2": { + "(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)": [ + { + "vuid": "VUID-vkGetImageMemoryRequirements2-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetImageMemoryRequirements2-pInfo-parameter", + "text": " pInfo must be a valid pointer to a valid VkImageMemoryRequirementsInfo2 structure" + }, + { + "vuid": "VUID-vkGetImageMemoryRequirements2-pMemoryRequirements-parameter", + "text": " pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure" + } + ] + }, + "VkImageMemoryRequirementsInfo2": { + "(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkImageMemoryRequirementsInfo2-image-01589", + "text": " If image was created with a multi-planar format and the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure" + }, + { + "vuid": "VUID-VkImageMemoryRequirementsInfo2-image-01590", + "text": " If image was not created with the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must not be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure" + }, + { + "vuid": "VUID-VkImageMemoryRequirementsInfo2-image-01591", + "text": " If image was created with a single-plane format, there must not be a VkImagePlaneMemoryRequirementsInfo in the pNext chain of the VkImageMemoryRequirementsInfo2 structure" + } + ], + "(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)+(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkImageMemoryRequirementsInfo2-image-01897", + "text": " 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." + } + ], + "(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)": [ + { + "vuid": "VUID-VkImageMemoryRequirementsInfo2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2" + }, + { + "vuid": "VUID-VkImageMemoryRequirementsInfo2-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkImagePlaneMemoryRequirementsInfo" + }, + { + "vuid": "VUID-VkImageMemoryRequirementsInfo2-image-parameter", + "text": " image must be a valid VkImage handle" + } + ] + }, + "VkImagePlaneMemoryRequirementsInfo": { + "(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-01592", + "text": " planeAspect must be an aspect that exists in the format; 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" + }, + { + "vuid": "VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO" + }, + { + "vuid": "VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter", + "text": " planeAspect must be a valid VkImageAspectFlagBits value" + } + ] + }, + "VkMemoryRequirements2": { + "(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)": [ + { + "vuid": "VUID-VkMemoryRequirements2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2" + }, + { + "vuid": "VUID-VkMemoryRequirements2-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkMemoryDedicatedRequirements" + } + ] + }, + "VkMemoryDedicatedRequirements": { + "(VK_VERSION_1_1,VK_KHR_dedicated_allocation)": [ + { + "vuid": "VUID-VkMemoryDedicatedRequirements-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS" + } + ] + }, + "vkBindBufferMemory": { + "core": [ + { + "vuid": "VUID-vkBindBufferMemory-buffer-01029", + "text": " buffer must not already be backed by a memory object" + }, + { + "vuid": "VUID-vkBindBufferMemory-buffer-01030", + "text": " buffer must not have been created with any sparse memory binding flags" + }, + { + "vuid": "VUID-vkBindBufferMemory-memoryOffset-01031", + "text": " memoryOffset must be less than the size of memory" + }, + { + "vuid": "VUID-vkBindBufferMemory-buffer-01032", + "text": " If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment" + }, + { + "vuid": "VUID-vkBindBufferMemory-buffer-01033", + "text": " If buffer was created with the VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment" + }, + { + "vuid": "VUID-vkBindBufferMemory-buffer-01034", + "text": " If buffer was created with the VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment" + }, + { + "vuid": "VUID-vkBindBufferMemory-memory-01035", + "text": " 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" + }, + { + "vuid": "VUID-vkBindBufferMemory-memoryOffset-01036", + "text": " memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer" + }, + { + "vuid": "VUID-vkBindBufferMemory-size-01037", + "text": " 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" + }, + { + "vuid": "VUID-vkBindBufferMemory-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkBindBufferMemory-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkBindBufferMemory-memory-parameter", + "text": " memory must be a valid VkDeviceMemory handle" + }, + { + "vuid": "VUID-vkBindBufferMemory-buffer-parent", + "text": " buffer must have been created, allocated, or retrieved from device" + }, + { + "vuid": "VUID-vkBindBufferMemory-memory-parent", + "text": " memory must have been created, allocated, or retrieved from device" + } + ], + "(VK_VERSION_1_1,VK_KHR_dedicated_allocation)": [ + { + "vuid": "VUID-vkBindBufferMemory-buffer-01444", + "text": " 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" + }, + { + "vuid": "VUID-vkBindBufferMemory-memory-01508", + "text": " If the VkMemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfo in its pNext chain, and VkMemoryDedicatedAllocateInfo::buffer was not VK_NULL_HANDLE, then buffer must equal VkMemoryDedicatedAllocateInfo::buffer, and memoryOffset must be zero." + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkBindBufferMemory-None-01898", + "text": " 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" + }, + { + "vuid": "VUID-vkBindBufferMemory-None-01899", + "text": " 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" + } + ], + "(VK_NV_dedicated_allocation)": [ + { + "vuid": "VUID-vkBindBufferMemory-buffer-01038", + "text": " 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" + } + ], + "(VK_NV_dedicated_allocation)+!(VK_VERSION_1_1,VK_KHR_dedicated_allocation)": [ + { + "vuid": "VUID-vkBindBufferMemory-buffer-01039", + "text": " 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" + } + ] + }, + "vkBindBufferMemory2": { + "(VK_VERSION_1_1,VK_KHR_bind_memory2)": [ + { + "vuid": "VUID-vkBindBufferMemory2-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkBindBufferMemory2-pBindInfos-parameter", + "text": " pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindBufferMemoryInfo structures" + }, + { + "vuid": "VUID-vkBindBufferMemory2-bindInfoCount-arraylength", + "text": " bindInfoCount must be greater than 0" + } + ] + }, + "VkBindBufferMemoryInfo": { + "(VK_VERSION_1_1,VK_KHR_bind_memory2)": [ + { + "vuid": "VUID-VkBindBufferMemoryInfo-buffer-01593", + "text": " buffer must not already be backed by a memory object" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-buffer-01594", + "text": " buffer must not have been created with any sparse memory binding flags" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-memoryOffset-01595", + "text": " memoryOffset must be less than the size of memory" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-buffer-01596", + "text": " If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-buffer-01597", + "text": " If buffer was created with the VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-buffer-01598", + "text": " If buffer was created with the VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, memoryOffset must be a multiple of VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-memory-01599", + "text": " 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" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-memoryOffset-01600", + "text": " memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-size-01601", + "text": " 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" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkBindBufferMemoryDeviceGroupInfo" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-memory-parameter", + "text": " memory must be a valid VkDeviceMemory handle" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-commonparent", + "text": " Both of buffer, and memory must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_dedicated_allocation)": [ + { + "vuid": "VUID-VkBindBufferMemoryInfo-buffer-01602", + "text": " 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" + }, + { + "vuid": "VUID-VkBindBufferMemoryInfo-memory-01900", + "text": " If the VkMemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfo in its pNext chain, and VkMemoryDedicatedAllocateInfo::buffer was not VK_NULL_HANDLE, then buffer must equal VkMemoryDedicatedAllocateInfo::buffer and memoryOffset must be zero." + } + ], + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_NV_dedicated_allocation)": [ + { + "vuid": "VUID-VkBindBufferMemoryInfo-buffer-01603", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_NV_dedicated_allocation)+!(VK_VERSION_1_1,VK_KHR_dedicated_allocation)": [ + { + "vuid": "VUID-VkBindBufferMemoryInfo-buffer-01604", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkBindBufferMemoryInfo-pNext-01605", + "text": " If the pNext chain includes VkBindBufferMemoryDeviceGroupInfo, all instances of memory specified by VkBindBufferMemoryDeviceGroupInfo::pDeviceIndices must have been allocated" + } + ] + }, + "VkBindBufferMemoryDeviceGroupInfo": { + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkBindBufferMemoryDeviceGroupInfo-deviceIndexCount-01606", + "text": " deviceIndexCount must either be zero or equal to the number of physical devices in the logical device" + }, + { + "vuid": "VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-01607", + "text": " All elements of pDeviceIndices must be valid device indices" + }, + { + "vuid": "VUID-VkBindBufferMemoryDeviceGroupInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO" + }, + { + "vuid": "VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-parameter", + "text": " If deviceIndexCount is not 0, pDeviceIndices must be a valid pointer to an array of deviceIndexCount uint32_t values" + } + ] + }, + "vkBindImageMemory": { + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-vkBindImageMemory-image-01608", + "text": " image must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT set." + } + ], + "core": [ + { + "vuid": "VUID-vkBindImageMemory-image-01044", + "text": " image must not already be backed by a memory object" + }, + { + "vuid": "VUID-vkBindImageMemory-image-01045", + "text": " image must not have been created with any sparse memory binding flags" + }, + { + "vuid": "VUID-vkBindImageMemory-memoryOffset-01046", + "text": " memoryOffset must be less than the size of memory" + }, + { + "vuid": "VUID-vkBindImageMemory-memory-01047", + "text": " 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" + }, + { + "vuid": "VUID-vkBindImageMemory-memoryOffset-01048", + "text": " memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image" + }, + { + "vuid": "VUID-vkBindImageMemory-size-01049", + "text": " The size member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image must be less than or equal to the size of memory minus memoryOffset" + }, + { + "vuid": "VUID-vkBindImageMemory-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkBindImageMemory-image-parameter", + "text": " image must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkBindImageMemory-memory-parameter", + "text": " memory must be a valid VkDeviceMemory handle" + }, + { + "vuid": "VUID-vkBindImageMemory-image-parent", + "text": " image must have been created, allocated, or retrieved from device" + }, + { + "vuid": "VUID-vkBindImageMemory-memory-parent", + "text": " memory must have been created, allocated, or retrieved from device" + } + ], + "(VK_VERSION_1_1,VK_KHR_dedicated_allocation)": [ + { + "vuid": "VUID-vkBindImageMemory-image-01445", + "text": " 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" + }, + { + "vuid": "VUID-vkBindImageMemory-memory-01509", + "text": " If the VkMemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfo in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then image must equal VkMemoryDedicatedAllocateInfo::image and memoryOffset must be zero." + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkBindImageMemory-None-01901", + "text": " 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" + }, + { + "vuid": "VUID-vkBindImageMemory-None-01902", + "text": " 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" + } + ], + "(VK_NV_dedicated_allocation)": [ + { + "vuid": "VUID-vkBindImageMemory-image-01050", + "text": " 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" + } + ], + "(VK_NV_dedicated_allocation)+!(VK_VERSION_1_1,VK_KHR_dedicated_allocation)": [ + { + "vuid": "VUID-vkBindImageMemory-image-01051", + "text": " 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" + } + ] + }, + "vkBindImageMemory2": { + "(VK_VERSION_1_1,VK_KHR_bind_memory2)": [ + { + "vuid": "VUID-vkBindImageMemory2-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkBindImageMemory2-pBindInfos-parameter", + "text": " pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindImageMemoryInfo structures" + }, + { + "vuid": "VUID-vkBindImageMemory2-bindInfoCount-arraylength", + "text": " bindInfoCount must be greater than 0" + } + ] + }, + "VkBindImageMemoryInfo": { + "(VK_VERSION_1_1,VK_KHR_bind_memory2)": [ + { + "vuid": "VUID-VkBindImageMemoryInfo-image-01609", + "text": " image must not already be backed by a memory object" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-image-01610", + "text": " image must not have been created with any sparse memory binding flags" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-memoryOffset-01611", + "text": " memoryOffset must be less than the size of memory" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-pNext", + "text": " 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" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-image-parameter", + "text": " image must be a valid VkImage handle" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-commonparent", + "text": " Both of image, and memory that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkBindImageMemoryInfo-memory-01612", + "text": " 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" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-memoryOffset-01613", + "text": " memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-memory-01614", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01615", + "text": " If the pNext chain does not include an instance of the 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" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01616", + "text": " If the pNext chain does not include an instance of the VkBindImagePlaneMemoryInfo structure, memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with image" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01617", + "text": " If the pNext chain does not include an instance of the 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" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01618", + "text": " If the pNext chain includes an instance of the VkBindImagePlaneMemoryInfo structure, image must have been created with the VK_IMAGE_CREATE_DISJOINT_BIT bit set." + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01619", + "text": " If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2’s pNext chain" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01620", + "text": " If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2’s pNext chain" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01621", + "text": " If the pNext chain includes an instance of the 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 the correct planeAspect for this plane in the VkImagePlaneMemoryRequirementsInfo structure attached to the VkImageMemoryRequirementsInfo2’s pNext chain" + } + ], + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_dedicated_allocation)": [ + { + "vuid": "VUID-VkBindImageMemoryInfo-image-01622", + "text": " 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" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-memory-01903", + "text": " If the VkMemoryAllocateInfo provided when memory was allocated included an instance of VkMemoryDedicatedAllocateInfo in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then image must equal VkMemoryDedicatedAllocateInfo::image and memoryOffset must be zero." + } + ], + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_NV_dedicated_allocation)": [ + { + "vuid": "VUID-VkBindImageMemoryInfo-image-01623", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_NV_dedicated_allocation)+!(VK_VERSION_1_1,VK_KHR_dedicated_allocation)": [ + { + "vuid": "VUID-VkBindImageMemoryInfo-image-01624", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+!(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkBindImageMemoryInfo-memory-01625", + "text": " memory must be a valid VkDeviceMemory handle" + } + ], + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01626", + "text": " If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, all instances of memory specified by VkBindImageMemoryDeviceGroupInfo::pDeviceIndices must have been allocated" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01627", + "text": " If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, and VkBindImageMemoryDeviceGroupInfo::splitInstanceBindRegionCount is not zero, then image must have been created with the VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT bit set" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01628", + "text": " If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, all elements of VkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions must be valid rectangles contained within the dimensions of image" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01629", + "text": " If the pNext chain includes VkBindImageMemoryDeviceGroupInfo, the union of the areas of all elements of VkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions that correspond to the same instance of image must cover the entire image." + } + ], + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)+(VK_KHR_swapchain)": [ + { + "vuid": "VUID-VkBindImageMemoryInfo-image-01630", + "text": " If image was created with a valid swapchain handle in VkImageSwapchainCreateInfoKHR::swapchain, then the pNext chain must include a valid instance of VkBindImageMemorySwapchainInfoKHR" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01631", + "text": " If the pNext chain includes an instance of VkBindImageMemorySwapchainInfoKHR, memory must be VK_NULL_HANDLE" + }, + { + "vuid": "VUID-VkBindImageMemoryInfo-pNext-01632", + "text": " If the pNext chain does not include an instance of VkBindImageMemorySwapchainInfoKHR, memory must be a valid VkDeviceMemory handle" + } + ] + }, + "VkBindImageMemoryDeviceGroupInfo": { + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01633", + "text": " At least one of deviceIndexCount and splitInstanceBindRegionCount must be zero." + }, + { + "vuid": "VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01634", + "text": " deviceIndexCount must either be zero or equal to the number of physical devices in the logical device" + }, + { + "vuid": "VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-01635", + "text": " All elements of pDeviceIndices must be valid device indices." + }, + { + "vuid": "VUID-VkBindImageMemoryDeviceGroupInfo-splitInstanceBindRegionCount-01636", + "text": " splitInstanceBindRegionCount must either be zero or equal to the number of physical devices in the logical device squared" + }, + { + "vuid": "VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-01637", + "text": " Elements of pSplitInstanceBindRegions that correspond to the same instance of an image must not overlap." + }, + { + "vuid": "VUID-VkBindImageMemoryDeviceGroupInfo-offset-01638", + "text": " 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" + }, + { + "vuid": "VUID-VkBindImageMemoryDeviceGroupInfo-offset-01639", + "text": " 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" + }, + { + "vuid": "VUID-VkBindImageMemoryDeviceGroupInfo-extent-01640", + "text": " 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" + }, + { + "vuid": "VUID-VkBindImageMemoryDeviceGroupInfo-extent-01641", + "text": " 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" + }, + { + "vuid": "VUID-VkBindImageMemoryDeviceGroupInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO" + }, + { + "vuid": "VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-parameter", + "text": " If deviceIndexCount is not 0, pDeviceIndices must be a valid pointer to an array of deviceIndexCount uint32_t values" + }, + { + "vuid": "VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-parameter", + "text": " If splitInstanceBindRegionCount is not 0, pSplitInstanceBindRegions must be a valid pointer to an array of splitInstanceBindRegionCount VkRect2D structures" + } + ] + }, + "VkBindImageMemorySwapchainInfoKHR": { + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_device_group)+(VK_KHR_swapchain)": [ + { + "vuid": "VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644", + "text": " imageIndex must be less than the number of images in swapchain" + }, + { + "vuid": "VUID-VkBindImageMemorySwapchainInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR" + }, + { + "vuid": "VUID-VkBindImageMemorySwapchainInfoKHR-swapchain-parameter", + "text": " swapchain must be a valid VkSwapchainKHR handle" + } + ] + }, + "VkBindImagePlaneMemoryInfo": { + "(VK_VERSION_1_1,VK_KHR_bind_memory2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkBindImagePlaneMemoryInfo-planeAspect-01642", + "text": " planeAspect must be a single valid plane aspect for the image format (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)" + }, + { + "vuid": "VUID-VkBindImagePlaneMemoryInfo-None-01643", + "text": " A single call to vkBindImageMemory2 must bind all or none of the planes of an image (i.e. bindings to all planes of an image must be made in a single vkBindImageMemory2 call), as separate bindings" + }, + { + "vuid": "VUID-VkBindImagePlaneMemoryInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO" + }, + { + "vuid": "VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter", + "text": " planeAspect must be a valid VkImageAspectFlagBits value" + } + ] + }, + "vkCreateSampler": { + "core": [ + { + "vuid": "VUID-vkCreateSampler-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateSampler-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkSamplerCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateSampler-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateSampler-pSampler-parameter", + "text": " pSampler must be a valid pointer to a VkSampler handle" + } + ] + }, + "VkSamplerCreateInfo": { + "core": [ + { + "vuid": "VUID-VkSamplerCreateInfo-mipLodBias-01069", + "text": " The absolute value of mipLodBias must be less than or equal to VkPhysicalDeviceLimits::maxSamplerLodBias" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-anisotropyEnable-01070", + "text": " If the &amp;lt;&amp;lt;features-features-samplerAnisotropy,anisotropic sampling&amp;gt;&amp;gt; feature is not enabled, anisotropyEnable must be VK_FALSE" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-anisotropyEnable-01071", + "text": " If anisotropyEnable is VK_TRUE, maxAnisotropy must be between 1.0 and VkPhysicalDeviceLimits::maxSamplerAnisotropy, inclusive" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01072", + "text": " If unnormalizedCoordinates is VK_TRUE, minFilter and magFilter must be equal" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01073", + "text": " If unnormalizedCoordinates is VK_TRUE, mipmapMode must be VK_SAMPLER_MIPMAP_MODE_NEAREST" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01074", + "text": " If unnormalizedCoordinates is VK_TRUE, minLod and maxLod must be zero" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01075", + "text": " 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" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01076", + "text": " If unnormalizedCoordinates is VK_TRUE, anisotropyEnable must be VK_FALSE" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01077", + "text": " If unnormalizedCoordinates is VK_TRUE, compareEnable must be VK_FALSE" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-addressModeU-01078", + "text": " If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a valid VkBorderColor value" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-addressModeU-01079", + "text": " 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" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-compareEnable-01080", + "text": " If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-pNext-pNext", + "text": " 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 VkSamplerReductionModeCreateInfoEXT or VkSamplerYcbcrConversionInfo" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-magFilter-parameter", + "text": " magFilter must be a valid VkFilter value" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-minFilter-parameter", + "text": " minFilter must be a valid VkFilter value" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-mipmapMode-parameter", + "text": " mipmapMode must be a valid VkSamplerMipmapMode value" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-addressModeU-parameter", + "text": " addressModeU must be a valid VkSamplerAddressMode value" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-addressModeV-parameter", + "text": " addressModeV must be a valid VkSamplerAddressMode value" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-addressModeW-parameter", + "text": " addressModeW must be a valid VkSamplerAddressMode value" + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkSamplerCreateInfo-minFilter-01645", + "text": " If &amp;lt;&amp;lt;samplers-YCbCr-conversion,sampler Y’CBCR conversion&amp;gt;&amp;gt; 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 Y’CBCR conversion’s chromaFilter" + }, + { + "vuid": "VUID-VkSamplerCreateInfo-addressModeU-01646", + "text": " If &amp;lt;&amp;lt;samplers-YCbCr-conversion,sampler Y’CBCR conversion&amp;gt;&amp;gt; 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)+(VK_EXT_sampler_filter_minmax)": [ + { + "vuid": "VUID-VkSamplerCreateInfo-None-01647", + "text": " The sampler reduction mode must be set to VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT if &amp;lt;&amp;lt;samplers-YCbCr-conversion,sampler Y’CBCR conversion&amp;gt;&amp;gt; is enabled" + } + ], + "(VK_IMG_filter_cubic)": [ + { + "vuid": "VUID-VkSamplerCreateInfo-magFilter-01081", + "text": " If either magFilter or minFilter is VK_FILTER_CUBIC_IMG, anisotropyEnable must be VK_FALSE" + } + ], + "(VK_IMG_filter_cubic+VK_EXT_sampler_filter_minmax)": [ + { + "vuid": "VUID-VkSamplerCreateInfo-magFilter-01422", + "text": " If either magFilter or minFilter is VK_FILTER_CUBIC_IMG, the reductionMode member of VkSamplerReductionModeCreateInfoEXT must be VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT" + } + ], + "(VK_EXT_sampler_filter_minmax)": [ + { + "vuid": "VUID-VkSamplerCreateInfo-compareEnable-01423", + "text": " If compareEnable is VK_TRUE, the reductionMode member of VkSamplerReductionModeCreateInfoEXT must be VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT" + } + ] + }, + "VkSamplerReductionModeCreateInfoEXT": { + "(VK_EXT_sampler_filter_minmax)": [ + { + "vuid": "VUID-VkSamplerReductionModeCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkSamplerReductionModeCreateInfoEXT-reductionMode-parameter", + "text": " reductionMode must be a valid VkSamplerReductionModeEXT value" + } + ] + }, + "vkDestroySampler": { + "core": [ + { + "vuid": "VUID-vkDestroySampler-sampler-01082", + "text": " All submitted commands that refer to sampler must have completed execution" + }, + { + "vuid": "VUID-vkDestroySampler-sampler-01083", + "text": " If VkAllocationCallbacks were provided when sampler was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroySampler-sampler-01084", + "text": " If no VkAllocationCallbacks were provided when sampler was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroySampler-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroySampler-sampler-parameter", + "text": " If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle" + }, + { + "vuid": "VUID-vkDestroySampler-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroySampler-sampler-parent", + "text": " If sampler is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "VkSamplerYcbcrConversionInfo": { + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkSamplerYcbcrConversionInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionInfo-conversion-parameter", + "text": " conversion must be a valid VkSamplerYcbcrConversion handle" + } + ] + }, + "vkCreateSamplerYcbcrConversion": { + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-vkCreateSamplerYcbcrConversion-None-01648", + "text": " The &amp;lt;&amp;lt;features-features-sampler-YCbCr-conversion, sampler Y’CBCR conversion feature&amp;gt;&amp;gt; must be enabled" + }, + { + "vuid": "VUID-vkCreateSamplerYcbcrConversion-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkSamplerYcbcrConversionCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateSamplerYcbcrConversion-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter", + "text": " pYcbcrConversion must be a valid pointer to a VkSamplerYcbcrConversion handle" + } + ] + }, + "VkSamplerYcbcrConversionCreateInfo": { + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)+!(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-format-01649", + "text": " format must not be VK_FORMAT_UNDEFINED" + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)+(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-format-01904", + "text": " If an external format conversion is being created, format must be VK_FORMAT_UNDEFINED, otherwise it must not be VK_FORMAT_UNDEFINED." + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-format-01650", + "text": " format must support VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT or VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651", + "text": " If the format does not support VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT, xChromaOffset and yChromaOffset must not be VK_CHROMA_LOCATION_COSITED_EVEN" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652", + "text": " If the format does not support VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT, xChromaOffset and yChromaOffset must not be VK_CHROMA_LOCATION_MIDPOINT" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-format-01653", + "text": " format must represent unsigned normalized values (i.e. the format must be a UNORM format)" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-None-01654", + "text": " If the format has a _422 or _420 suffix:" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-01655", + "text": " 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 &amp;lt;&amp;lt;textures-conversion-to-rgba,conversion to RGBA&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656", + "text": " If the format does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT, forceExplicitReconstruction must be FALSE" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657", + "text": " If the format does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT, chromaFilter must be VK_FILTER_NEAREST" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkExternalFormatANDROID" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-format-parameter", + "text": " format must be a valid VkFormat value" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-parameter", + "text": " ycbcrModel must be a valid VkSamplerYcbcrModelConversion value" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-parameter", + "text": " ycbcrRange must be a valid VkSamplerYcbcrRange value" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-components-parameter", + "text": " components must be a valid VkComponentMapping structure" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-parameter", + "text": " xChromaOffset must be a valid VkChromaLocation value" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-yChromaOffset-parameter", + "text": " yChromaOffset must be a valid VkChromaLocation value" + }, + { + "vuid": "VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-parameter", + "text": " chromaFilter must be a valid VkFilter value" + } + ] + }, + "vkDestroySamplerYcbcrConversion": { + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-vkDestroySamplerYcbcrConversion-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parameter", + "text": " If ycbcrConversion is not VK_NULL_HANDLE, ycbcrConversion must be a valid VkSamplerYcbcrConversion handle" + }, + { + "vuid": "VUID-vkDestroySamplerYcbcrConversion-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parent", + "text": " If ycbcrConversion is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCreateDescriptorSetLayout": { + "core": [ + { + "vuid": "VUID-vkCreateDescriptorSetLayout-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateDescriptorSetLayout-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkDescriptorSetLayoutCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateDescriptorSetLayout-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateDescriptorSetLayout-pSetLayout-parameter", + "text": " pSetLayout must be a valid pointer to a VkDescriptorSetLayout handle" + } + ] + }, + "VkDescriptorSetLayoutCreateInfo": { + "core": [ + { + "vuid": "VUID-VkDescriptorSetLayoutCreateInfo-binding-00279", + "text": " The VkDescriptorSetLayoutBinding::binding members of the elements of the pBindings array must each have different values." + }, + { + "vuid": "VUID-VkDescriptorSetLayoutCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkDescriptorSetLayoutBindingFlagsCreateInfoEXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutCreateInfo-flags-parameter", + "text": " flags must be a valid combination of VkDescriptorSetLayoutCreateFlagBits values" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutCreateInfo-pBindings-parameter", + "text": " If bindingCount is not 0, pBindings must be a valid pointer to an array of bindingCount valid VkDescriptorSetLayoutBinding structures" + } + ], + "(VK_KHR_push_descriptor)": [ + { + "vuid": "VUID-VkDescriptorSetLayoutCreateInfo-flags-00280", + "text": " 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" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutCreateInfo-flags-00281", + "text": " 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" + } + ], + "(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-VkDescriptorSetLayoutCreateInfo-flags-03000", + "text": " If any binding has the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT bit set, flags must include VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-03001", + "text": " If any binding has the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT bit set, then all bindings must not have descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC" + } + ] + }, + "VkDescriptorSetLayoutBinding": { + "core": [ + { + "vuid": "VUID-VkDescriptorSetLayoutBinding-descriptorType-00282", + "text": " 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" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBinding-descriptorCount-00283", + "text": " If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBinding-descriptorType-01510", + "text": " If descriptorType is VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT and descriptorCount is not 0, then stageFlags must be 0 or VK_SHADER_STAGE_FRAGMENT_BIT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBinding-descriptorType-parameter", + "text": " descriptorType must be a valid VkDescriptorType value" + } + ] + }, + "VkDescriptorSetLayoutBindingFlagsCreateInfoEXT": { + "(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-bindingCount-03002", + "text": " If bindingCount is not zero, bindingCount must equal VkDescriptorSetLayoutCreateInfo::bindingCount" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-03004", + "text": " If an element of pBindingFlags includes VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT, then all other elements of VkDescriptorSetLayoutCreateInfo::pBindings must have a smaller value of binding" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUniformBufferUpdateAfterBind-03005", + "text": " If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingUniformBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingSampledImageUpdateAfterBind-03006", + "text": " If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::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_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageImageUpdateAfterBind-03007", + "text": " If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingStorageImageUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_STORAGE_IMAGE must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageBufferUpdateAfterBind-03008", + "text": " If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingStorageBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUniformTexelBufferUpdateAfterBind-03009", + "text": " If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::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_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingStorageTexelBufferUpdateAfterBind-03010", + "text": " If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::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_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-None-03011", + "text": " 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_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingUpdateUnusedWhilePending-03012", + "text": " If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingUpdateUnusedWhilePending is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingPartiallyBound-03013", + "text": " If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingPartiallyBound is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-descriptorBindingVariableDescriptorCount-03014", + "text": " If VkPhysicalDeviceDescriptorIndexingFeaturesEXT::descriptorBindingVariableDescriptorCount is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-03015", + "text": " If an element of pBindingFlags includes VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT, that element’s descriptorType must not be VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-parameter", + "text": " If bindingCount is not 0, pBindingFlags must be a valid pointer to an array of bindingCount valid combinations of VkDescriptorBindingFlagBitsEXT values" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-pBindingFlags-requiredbitmask", + "text": " Each element of pBindingFlags must not be 0" + } + ], + "(VK_EXT_descriptor_indexing)+(VK_KHR_push_descriptor)": [ + { + "vuid": "VUID-VkDescriptorSetLayoutBindingFlagsCreateInfoEXT-flags-03003", + "text": " 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_EXT, VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT, or VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT" + } + ] + }, + "vkGetDescriptorSetLayoutSupport": { + "(VK_VERSION_1_1,VK_KHR_maintenance3)": [ + { + "vuid": "VUID-vkGetDescriptorSetLayoutSupport-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetDescriptorSetLayoutSupport-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkDescriptorSetLayoutCreateInfo structure" + }, + { + "vuid": "VUID-vkGetDescriptorSetLayoutSupport-pSupport-parameter", + "text": " pSupport must be a valid pointer to a VkDescriptorSetLayoutSupport structure" + } + ] + }, + "VkDescriptorSetLayoutSupport": { + "(VK_VERSION_1_1,VK_KHR_maintenance3)": [ + { + "vuid": "VUID-VkDescriptorSetLayoutSupport-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT" + }, + { + "vuid": "VUID-VkDescriptorSetLayoutSupport-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkDescriptorSetVariableDescriptorCountLayoutSupportEXT" + } + ] + }, + "VkDescriptorSetVariableDescriptorCountLayoutSupportEXT": { + "(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-VkDescriptorSetVariableDescriptorCountLayoutSupportEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT" + } + ] + }, + "vkDestroyDescriptorSetLayout": { + "core": [ + { + "vuid": "VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00284", + "text": " If VkAllocationCallbacks were provided when descriptorSetLayout was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00285", + "text": " If no VkAllocationCallbacks were provided when descriptorSetLayout was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyDescriptorSetLayout-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-parameter", + "text": " If descriptorSetLayout is not VK_NULL_HANDLE, descriptorSetLayout must be a valid VkDescriptorSetLayout handle" + }, + { + "vuid": "VUID-vkDestroyDescriptorSetLayout-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-parent", + "text": " If descriptorSetLayout is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCreatePipelineLayout": { + "core": [ + { + "vuid": "VUID-vkCreatePipelineLayout-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreatePipelineLayout-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkPipelineLayoutCreateInfo structure" + }, + { + "vuid": "VUID-vkCreatePipelineLayout-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreatePipelineLayout-pPipelineLayout-parameter", + "text": " pPipelineLayout must be a valid pointer to a VkPipelineLayout handle" + } + ] + }, + "VkPipelineLayoutCreateInfo": { + "core": [ + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-setLayoutCount-00286", + "text": " setLayoutCount must be less than or equal to VkPhysicalDeviceLimits::maxBoundDescriptorSets" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-00292", + "text": " Any two elements of pPushConstantRanges must not include the same stage in stageFlags" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-parameter", + "text": " If setLayoutCount is not 0, pSetLayouts must be a valid pointer to an array of setLayoutCount valid VkDescriptorSetLayout handles" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-parameter", + "text": " If pushConstantRangeCount is not 0, pPushConstantRanges must be a valid pointer to an array of pushConstantRangeCount valid VkPushConstantRange structures" + } + ], + "!(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00287", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00288", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00289", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00290", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00291", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01676", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01677", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01678", + "text": " The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stagess and and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffers" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01679", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01680", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01681", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01682", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01683", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01684", + "text": " 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" + } + ], + "(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03016", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03017", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03018", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03019", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03020", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03021", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03022", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindSamplers" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03023", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindUniformBuffers" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03024", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindStorageBuffers" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03025", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindSampledImages" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03026", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindStorageImages" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03027", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxPerStageDescriptorUpdateAfterBindInputAttachments" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03028", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03029", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stagess and and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffers" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03030", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03031", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03032", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03033", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03034", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-descriptorType-03035", + "text": " The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT 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" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03036", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindSamplers" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03037", + "text": " The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stagess and and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindUniformBuffers" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03038", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindUniformBuffersDynamic" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03039", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindStorageBuffers" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03040", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindStorageBuffersDynamic" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03041", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindSampledImages" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03042", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindStorageImages" + }, + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03043", + "text": " 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 VkPhysicalDeviceDescriptorIndexingPropertiesEXT::maxDescriptorSetUpdateAfterBindInputAttachments" + } + ], + "(VK_KHR_push_descriptor)": [ + { + "vuid": "VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00293", + "text": " pSetLayouts must not contain more than one descriptor set layout that was created with VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR set" + } + ] + }, + "VkPushConstantRange": { + "core": [ + { + "vuid": "VUID-VkPushConstantRange-offset-00294", + "text": " offset must be less than VkPhysicalDeviceLimits::maxPushConstantsSize" + }, + { + "vuid": "VUID-VkPushConstantRange-offset-00295", + "text": " offset must be a multiple of 4" + }, + { + "vuid": "VUID-VkPushConstantRange-size-00296", + "text": " size must be greater than 0" + }, + { + "vuid": "VUID-VkPushConstantRange-size-00297", + "text": " size must be a multiple of 4" + }, + { + "vuid": "VUID-VkPushConstantRange-size-00298", + "text": " size must be less than or equal to VkPhysicalDeviceLimits::maxPushConstantsSize minus offset" + }, + { + "vuid": "VUID-VkPushConstantRange-stageFlags-parameter", + "text": " stageFlags must be a valid combination of VkShaderStageFlagBits values" + }, + { + "vuid": "VUID-VkPushConstantRange-stageFlags-requiredbitmask", + "text": " stageFlags must not be 0" + } + ] + }, + "vkDestroyPipelineLayout": { + "core": [ + { + "vuid": "VUID-vkDestroyPipelineLayout-pipelineLayout-00299", + "text": " If VkAllocationCallbacks were provided when pipelineLayout was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyPipelineLayout-pipelineLayout-00300", + "text": " If no VkAllocationCallbacks were provided when pipelineLayout was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyPipelineLayout-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyPipelineLayout-pipelineLayout-parameter", + "text": " If pipelineLayout is not VK_NULL_HANDLE, pipelineLayout must be a valid VkPipelineLayout handle" + }, + { + "vuid": "VUID-vkDestroyPipelineLayout-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyPipelineLayout-pipelineLayout-parent", + "text": " If pipelineLayout is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCreateDescriptorPool": { + "core": [ + { + "vuid": "VUID-vkCreateDescriptorPool-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateDescriptorPool-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkDescriptorPoolCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateDescriptorPool-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateDescriptorPool-pDescriptorPool-parameter", + "text": " pDescriptorPool must be a valid pointer to a VkDescriptorPool handle" + } + ] + }, + "VkDescriptorPoolCreateInfo": { + "core": [ + { + "vuid": "VUID-VkDescriptorPoolCreateInfo-maxSets-00301", + "text": " maxSets must be greater than 0" + }, + { + "vuid": "VUID-VkDescriptorPoolCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO" + }, + { + "vuid": "VUID-VkDescriptorPoolCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDescriptorPoolCreateInfo-flags-parameter", + "text": " flags must be a valid combination of VkDescriptorPoolCreateFlagBits values" + }, + { + "vuid": "VUID-VkDescriptorPoolCreateInfo-pPoolSizes-parameter", + "text": " pPoolSizes must be a valid pointer to an array of poolSizeCount valid VkDescriptorPoolSize structures" + }, + { + "vuid": "VUID-VkDescriptorPoolCreateInfo-poolSizeCount-arraylength", + "text": " poolSizeCount must be greater than 0" + } + ] + }, + "VkDescriptorPoolSize": { + "core": [ + { + "vuid": "VUID-VkDescriptorPoolSize-descriptorCount-00302", + "text": " descriptorCount must be greater than 0" + }, + { + "vuid": "VUID-VkDescriptorPoolSize-type-parameter", + "text": " type must be a valid VkDescriptorType value" + } + ] + }, + "vkDestroyDescriptorPool": { + "core": [ + { + "vuid": "VUID-vkDestroyDescriptorPool-descriptorPool-00303", + "text": " All submitted commands that refer to descriptorPool (via any allocated descriptor sets) must have completed execution" + }, + { + "vuid": "VUID-vkDestroyDescriptorPool-descriptorPool-00304", + "text": " If VkAllocationCallbacks were provided when descriptorPool was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyDescriptorPool-descriptorPool-00305", + "text": " If no VkAllocationCallbacks were provided when descriptorPool was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyDescriptorPool-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyDescriptorPool-descriptorPool-parameter", + "text": " If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle" + }, + { + "vuid": "VUID-vkDestroyDescriptorPool-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyDescriptorPool-descriptorPool-parent", + "text": " If descriptorPool is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkAllocateDescriptorSets": { + "core": [ + { + "vuid": "VUID-vkAllocateDescriptorSets-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkAllocateDescriptorSets-pAllocateInfo-parameter", + "text": " pAllocateInfo must be a valid pointer to a valid VkDescriptorSetAllocateInfo structure" + }, + { + "vuid": "VUID-vkAllocateDescriptorSets-pDescriptorSets-parameter", + "text": " pDescriptorSets must be a valid pointer to an array of pAllocateInfo::descriptorSetCount VkDescriptorSet handles" + } + ] + }, + "VkDescriptorSetAllocateInfo": { + "!(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-00306", + "text": " descriptorSetCount must not be greater than the number of sets that are currently available for allocation in descriptorPool" + }, + { + "vuid": "VUID-VkDescriptorSetAllocateInfo-descriptorPool-00307", + "text": " descriptorPool must have enough free descriptor capacity remaining to allocate the descriptor sets of the specified layouts" + } + ], + "(VK_KHR_push_descriptor)": [ + { + "vuid": "VUID-VkDescriptorSetAllocateInfo-pSetLayouts-00308", + "text": " Each element of pSetLayouts must not have been created with VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR set" + } + ], + "(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-VkDescriptorSetAllocateInfo-pSetLayouts-03044", + "text": " If any element of pSetLayouts was created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT bit set, descriptorPool must have been created with the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT flag set" + } + ], + "core": [ + { + "vuid": "VUID-VkDescriptorSetAllocateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO" + }, + { + "vuid": "VUID-VkDescriptorSetAllocateInfo-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkDescriptorSetVariableDescriptorCountAllocateInfoEXT" + }, + { + "vuid": "VUID-VkDescriptorSetAllocateInfo-descriptorPool-parameter", + "text": " descriptorPool must be a valid VkDescriptorPool handle" + }, + { + "vuid": "VUID-VkDescriptorSetAllocateInfo-pSetLayouts-parameter", + "text": " pSetLayouts must be a valid pointer to an array of descriptorSetCount valid VkDescriptorSetLayout handles" + }, + { + "vuid": "VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-arraylength", + "text": " descriptorSetCount must be greater than 0" + }, + { + "vuid": "VUID-VkDescriptorSetAllocateInfo-commonparent", + "text": " Both of descriptorPool, and the elements of pSetLayouts must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "VkDescriptorSetVariableDescriptorCountAllocateInfoEXT": { + "(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-descriptorSetCount-03045", + "text": " If descriptorSetCount is not zero, descriptorSetCount must equal VkDescriptorSetAllocateInfo::descriptorSetCount" + }, + { + "vuid": "VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-pSetLayouts-03046", + "text": " 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." + }, + { + "vuid": "VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT" + }, + { + "vuid": "VUID-VkDescriptorSetVariableDescriptorCountAllocateInfoEXT-pDescriptorCounts-parameter", + "text": " If descriptorSetCount is not 0, pDescriptorCounts must be a valid pointer to an array of descriptorSetCount uint32_t values" + } + ] + }, + "vkFreeDescriptorSets": { + "core": [ + { + "vuid": "VUID-vkFreeDescriptorSets-pDescriptorSets-00309", + "text": " All submitted commands that refer to any element of pDescriptorSets must have completed execution" + }, + { + "vuid": "VUID-vkFreeDescriptorSets-pDescriptorSets-00310", + "text": " 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" + }, + { + "vuid": "VUID-vkFreeDescriptorSets-pDescriptorSets-00311", + "text": " Each valid handle in pDescriptorSets must have been allocated from descriptorPool" + }, + { + "vuid": "VUID-vkFreeDescriptorSets-descriptorPool-00312", + "text": " descriptorPool must have been created with the VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT flag" + }, + { + "vuid": "VUID-vkFreeDescriptorSets-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkFreeDescriptorSets-descriptorPool-parameter", + "text": " descriptorPool must be a valid VkDescriptorPool handle" + }, + { + "vuid": "VUID-vkFreeDescriptorSets-descriptorSetCount-arraylength", + "text": " descriptorSetCount must be greater than 0" + }, + { + "vuid": "VUID-vkFreeDescriptorSets-descriptorPool-parent", + "text": " descriptorPool must have been created, allocated, or retrieved from device" + }, + { + "vuid": "VUID-vkFreeDescriptorSets-pDescriptorSets-parent", + "text": " Each element of pDescriptorSets that is a valid handle must have been created, allocated, or retrieved from descriptorPool" + } + ] + }, + "vkResetDescriptorPool": { + "core": [ + { + "vuid": "VUID-vkResetDescriptorPool-descriptorPool-00313", + "text": " All uses of descriptorPool (via any allocated descriptor sets) must have completed execution" + }, + { + "vuid": "VUID-vkResetDescriptorPool-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkResetDescriptorPool-descriptorPool-parameter", + "text": " descriptorPool must be a valid VkDescriptorPool handle" + }, + { + "vuid": "VUID-vkResetDescriptorPool-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-vkResetDescriptorPool-descriptorPool-parent", + "text": " descriptorPool must have been created, allocated, or retrieved from device" + } + ] + }, + "vkUpdateDescriptorSets": { + "!(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-vkUpdateDescriptorSets-dstSet-00314", + "text": " 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 &amp;lt;&amp;lt;commandbuffers-lifecycle, pending state&amp;gt;&amp;gt;." + } + ], + "(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-vkUpdateDescriptorSets-None-03047", + "text": " Descriptor bindings updated by this command which were created without the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT or VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT bits set must not be used by any command that was recorded to a command buffer which is in the &amp;lt;&amp;lt;commandbuffers-lifecycle,pending state&amp;gt;&amp;gt;." + } + ], + "core": [ + { + "vuid": "VUID-vkUpdateDescriptorSets-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkUpdateDescriptorSets-pDescriptorWrites-parameter", + "text": " If descriptorWriteCount is not 0, pDescriptorWrites must be a valid pointer to an array of descriptorWriteCount valid VkWriteDescriptorSet structures" + }, + { + "vuid": "VUID-vkUpdateDescriptorSets-pDescriptorCopies-parameter", + "text": " If descriptorCopyCount is not 0, pDescriptorCopies must be a valid pointer to an array of descriptorCopyCount valid VkCopyDescriptorSet structures" + } + ] + }, + "VkWriteDescriptorSet": { + "core": [ + { + "vuid": "VUID-VkWriteDescriptorSet-dstBinding-00315", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-dstBinding-00316", + "text": " dstBinding must be a binding with a non-zero descriptorCount" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorCount-00317", + "text": " All consecutive bindings updated via a single VkWriteDescriptorSet structure, except those with a descriptorCount of zero, must have identical descriptorType and stageFlags." + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorCount-00318", + "text": " 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." + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00319", + "text": " descriptorType must match the type of dstBinding within dstSet" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-dstSet-00320", + "text": " dstSet must be a valid VkDescriptorSet handle" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-dstArrayElement-00321", + "text": " 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 &amp;lt;&amp;lt;descriptorsets-updates-consecutive&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00322", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00323", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00324", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00325", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00326", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-01402", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00327", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00328", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00329", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00330", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00331", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00332", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00333", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00334", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00335", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00336", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00337", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-01403", + "text": " 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 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00338", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-00339", + "text": " 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" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorType-parameter", + "text": " descriptorType must be a valid VkDescriptorType value" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorCount-arraylength", + "text": " descriptorCount must be greater than 0" + }, + { + "vuid": "VUID-VkWriteDescriptorSet-commonparent", + "text": " Both of dstSet, and the elements of pTexelBufferView that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-VkWriteDescriptorSet-descriptorCount-03048", + "text": " All consecutive bindings updated via a single VkWriteDescriptorSet structure, except those with a descriptorCount of zero, must have identical VkDescriptorBindingFlagBitsEXT." + } + ] + }, + "VkDescriptorBufferInfo": { + "core": [ + { + "vuid": "VUID-VkDescriptorBufferInfo-offset-00340", + "text": " offset must be less than the size of buffer" + }, + { + "vuid": "VUID-VkDescriptorBufferInfo-range-00341", + "text": " If range is not equal to VK_WHOLE_SIZE, range must be greater than 0" + }, + { + "vuid": "VUID-VkDescriptorBufferInfo-range-00342", + "text": " If range is not equal to VK_WHOLE_SIZE, range must be less than or equal to the size of buffer minus offset" + }, + { + "vuid": "VUID-VkDescriptorBufferInfo-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + } + ] + }, + "VkDescriptorImageInfo": { + "(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-VkDescriptorImageInfo-imageView-00343", + "text": " imageView must not be 2D or 2D array image view created from a 3D image" + } + ], + "core": [ + { + "vuid": "VUID-VkDescriptorImageInfo-imageLayout-00344", + "text": " imageLayout must match the actual VkImageLayout of each subresource accessible from imageView at the time this descriptor is accessed" + }, + { + "vuid": "VUID-VkDescriptorImageInfo-commonparent", + "text": " Both of imageView, and sampler that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkDescriptorImageInfo-sampler-01563", + "text": " If sampler is used and enables &amp;lt;&amp;lt;samplers-YCbCr-conversion,sampler Y’CBCR conversion&amp;gt;&amp;gt;:" + }, + { + "vuid": "VUID-VkDescriptorImageInfo-sampler-01564", + "text": " If sampler is used and does not enable &amp;lt;&amp;lt;samplers-YCbCr-conversion, sampler Y’CBCR conversion&amp;gt;&amp;gt; and the VkFormat of the image is a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar format&amp;gt;&amp;gt;, 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" + } + ] + }, + "VkCopyDescriptorSet": { + "core": [ + { + "vuid": "VUID-VkCopyDescriptorSet-srcBinding-00345", + "text": " srcBinding must be a valid binding within srcSet" + }, + { + "vuid": "VUID-VkCopyDescriptorSet-srcArrayElement-00346", + "text": " 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 &amp;lt;&amp;lt;descriptorsets-updates-consecutive&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkCopyDescriptorSet-dstBinding-00347", + "text": " dstBinding must be a valid binding within dstSet" + }, + { + "vuid": "VUID-VkCopyDescriptorSet-dstArrayElement-00348", + "text": " 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 &amp;lt;&amp;lt;descriptorsets-updates-consecutive&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkCopyDescriptorSet-srcSet-00349", + "text": " 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 &amp;lt;&amp;lt;descriptorsets-updates-consecutive&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkCopyDescriptorSet-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET" + }, + { + "vuid": "VUID-VkCopyDescriptorSet-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkCopyDescriptorSet-srcSet-parameter", + "text": " srcSet must be a valid VkDescriptorSet handle" + }, + { + "vuid": "VUID-VkCopyDescriptorSet-dstSet-parameter", + "text": " dstSet must be a valid VkDescriptorSet handle" + }, + { + "vuid": "VUID-VkCopyDescriptorSet-commonparent", + "text": " Both of dstSet, and srcSet must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-VkCopyDescriptorSet-srcSet-01918", + "text": " If srcSet’s layout was created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set, then dstSet’s layout must also have been created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set" + }, + { + "vuid": "VUID-VkCopyDescriptorSet-srcSet-01919", + "text": " If srcSet’s layout was created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set, then dstSet’s layout must also have been created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set" + }, + { + "vuid": "VUID-VkCopyDescriptorSet-srcSet-01920", + "text": " If the descriptor pool from which srcSet was allocated was created with the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT 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_EXT flag set" + }, + { + "vuid": "VUID-VkCopyDescriptorSet-srcSet-01921", + "text": " If the descriptor pool from which srcSet was allocated was created without the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT 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_EXT flag set" + } + ] + }, + "vkCreateDescriptorUpdateTemplate": { + "(VK_VERSION_1_1,VK_KHR_descriptor_update_template)": [ + { + "vuid": "VUID-vkCreateDescriptorUpdateTemplate-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateDescriptorUpdateTemplate-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkDescriptorUpdateTemplateCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateDescriptorUpdateTemplate-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateDescriptorUpdateTemplate-pDescriptorUpdateTemplate-parameter", + "text": " pDescriptorUpdateTemplate must be a valid pointer to a VkDescriptorUpdateTemplate handle" + } + ] + }, + "VkDescriptorUpdateTemplateCreateInfo": { + "(VK_VERSION_1_1,VK_KHR_descriptor_update_template)": [ + { + "vuid": "VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350", + "text": " If templateType is VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, descriptorSetLayout must be a valid VkDescriptorSetLayout handle" + }, + { + "vuid": "VUID-VkDescriptorUpdateTemplateCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO" + }, + { + "vuid": "VUID-VkDescriptorUpdateTemplateCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDescriptorUpdateTemplateCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkDescriptorUpdateTemplateCreateInfo-pDescriptorUpdateEntries-parameter", + "text": " pDescriptorUpdateEntries must be a valid pointer to an array of descriptorUpdateEntryCount valid VkDescriptorUpdateTemplateEntry structures" + }, + { + "vuid": "VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-parameter", + "text": " templateType must be a valid VkDescriptorUpdateTemplateType value" + }, + { + "vuid": "VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorSetLayout-parameter", + "text": " If descriptorSetLayout is not VK_NULL_HANDLE, descriptorSetLayout must be a valid VkDescriptorSetLayout handle" + }, + { + "vuid": "VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorUpdateEntryCount-arraylength", + "text": " descriptorUpdateEntryCount must be greater than 0" + }, + { + "vuid": "VUID-VkDescriptorUpdateTemplateCreateInfo-commonparent", + "text": " Both of descriptorSetLayout, and pipelineLayout that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_descriptor_update_template)+(VK_KHR_push_descriptor)": [ + { + "vuid": "VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351", + "text": " If templateType is VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, pipelineBindPoint must be a valid VkPipelineBindPoint value" + }, + { + "vuid": "VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352", + "text": " If templateType is VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, pipelineLayout must be a valid VkPipelineLayout handle" + }, + { + "vuid": "VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353", + "text": " 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" + } + ] + }, + "VkDescriptorUpdateTemplateEntry": { + "(VK_VERSION_1_1,VK_KHR_descriptor_update_template)": [ + { + "vuid": "VUID-VkDescriptorUpdateTemplateEntry-dstBinding-00354", + "text": " dstBinding must be a valid binding in the descriptor set layout implicitly specified when using a descriptor update template to update descriptors." + }, + { + "vuid": "VUID-VkDescriptorUpdateTemplateEntry-dstArrayElement-00355", + "text": " 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 &amp;lt;&amp;lt;descriptorsets-updates-consecutive&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkDescriptorUpdateTemplateEntry-descriptorType-parameter", + "text": " descriptorType must be a valid VkDescriptorType value" + } + ] + }, + "vkDestroyDescriptorUpdateTemplate": { + "(VK_VERSION_1_1,VK_KHR_descriptor_update_template)": [ + { + "vuid": "VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00356", + "text": " If VkAllocationCallbacks were provided when descriptorSetLayout was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00357", + "text": " If no VkAllocationCallbacks were provided when descriptorSetLayout was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyDescriptorUpdateTemplate-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parameter", + "text": " If descriptorUpdateTemplate is not VK_NULL_HANDLE, descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle" + }, + { + "vuid": "VUID-vkDestroyDescriptorUpdateTemplate-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parent", + "text": " If descriptorUpdateTemplate is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkUpdateDescriptorSetWithTemplate": { + "(VK_VERSION_1_1,VK_KHR_descriptor_update_template)": [ + { + "vuid": "VUID-vkUpdateDescriptorSetWithTemplate-pData-01685", + "text": " pData must be a valid pointer to a memory that contains one or more valid instances of VkDescriptorImageInfo, VkDescriptorBufferInfo, or VkBufferView in a layout defined by descriptorUpdateTemplate when it was created with vkCreateDescriptorUpdateTemplate" + }, + { + "vuid": "VUID-vkUpdateDescriptorSetWithTemplate-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-parameter", + "text": " descriptorSet must be a valid VkDescriptorSet handle" + }, + { + "vuid": "VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parameter", + "text": " descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle" + }, + { + "vuid": "VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parent", + "text": " descriptorUpdateTemplate must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCmdBindDescriptorSets": { + "core": [ + { + "vuid": "VUID-vkCmdBindDescriptorSets-pDescriptorSets-00358", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-dynamicOffsetCount-00359", + "text": " dynamicOffsetCount must be equal to the total number of dynamic descriptors in pDescriptorSets" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-firstSet-00360", + "text": " The sum of firstSet and descriptorSetCount must be less than or equal to VkPipelineLayoutCreateInfo::setLayoutCount provided when layout was created" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361", + "text": " pipelineBindPoint must be supported by the commandBuffer’s parent VkCommandPool’s queue family" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-pDynamicOffsets-00362", + "text": " Each element of pDynamicOffsets must satisfy the required alignment for the corresponding descriptor binding’s descriptor type" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-pipelineBindPoint-parameter", + "text": " pipelineBindPoint must be a valid VkPipelineBindPoint value" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-layout-parameter", + "text": " layout must be a valid VkPipelineLayout handle" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-pDescriptorSets-parameter", + "text": " pDescriptorSets must be a valid pointer to an array of descriptorSetCount valid VkDescriptorSet handles" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-pDynamicOffsets-parameter", + "text": " If dynamicOffsetCount is not 0, pDynamicOffsets must be a valid pointer to an array of dynamicOffsetCount uint32_t values" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-descriptorSetCount-arraylength", + "text": " descriptorSetCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdBindDescriptorSets-commonparent", + "text": " Each of commandBuffer, layout, and the elements of pDescriptorSets must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "vkCmdPushDescriptorSetKHR": { + "(VK_KHR_push_descriptor)": [ + { + "vuid": "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363", + "text": " pipelineBindPoint must be supported by the commandBuffer’s parent VkCommandPool’s queue family" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetKHR-set-00364", + "text": " set must be less than VkPipelineLayoutCreateInfo::setLayoutCount provided when layout was created" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetKHR-set-00365", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-parameter", + "text": " pipelineBindPoint must be a valid VkPipelineBindPoint value" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetKHR-layout-parameter", + "text": " layout must be a valid VkPipelineLayout handle" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetKHR-pDescriptorWrites-parameter", + "text": " pDescriptorWrites must be a valid pointer to an array of descriptorWriteCount valid VkWriteDescriptorSet structures" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetKHR-descriptorWriteCount-arraylength", + "text": " descriptorWriteCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetKHR-commonparent", + "text": " Both of commandBuffer, and layout must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "vkCmdPushDescriptorSetWithTemplateKHR": { + "(VK_KHR_push_descriptor)+(VK_VERSION_1_1,VK_KHR_descriptor_update_template)": [ + { + "vuid": "VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-00366", + "text": " The pipelineBindPoint specified during the creation of the descriptor update template must be supported by the commandBuffer’s parent VkCommandPool’s queue family" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetWithTemplateKHR-pData-01686", + "text": " pData must be a valid pointer to a memory that contains one or more valid instances of VkDescriptorImageInfo, VkDescriptorBufferInfo, or VkBufferView in a layout defined by descriptorUpdateTemplate when it was created with vkCreateDescriptorUpdateTemplateKHR" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetWithTemplateKHR-descriptorUpdateTemplate-parameter", + "text": " descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetWithTemplateKHR-layout-parameter", + "text": " layout must be a valid VkPipelineLayout handle" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdPushDescriptorSetWithTemplateKHR-commonparent", + "text": " Each of commandBuffer, descriptorUpdateTemplate, and layout must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "vkCmdPushConstants": { + "core": [ + { + "vuid": "VUID-vkCmdPushConstants-offset-01795", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdPushConstants-offset-01796", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdPushConstants-offset-00368", + "text": " offset must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdPushConstants-size-00369", + "text": " size must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdPushConstants-offset-00370", + "text": " offset must be less than VkPhysicalDeviceLimits::maxPushConstantsSize" + }, + { + "vuid": "VUID-vkCmdPushConstants-size-00371", + "text": " size must be less than or equal to VkPhysicalDeviceLimits::maxPushConstantsSize minus offset" + }, + { + "vuid": "VUID-vkCmdPushConstants-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdPushConstants-layout-parameter", + "text": " layout must be a valid VkPipelineLayout handle" + }, + { + "vuid": "VUID-vkCmdPushConstants-stageFlags-parameter", + "text": " stageFlags must be a valid combination of VkShaderStageFlagBits values" + }, + { + "vuid": "VUID-vkCmdPushConstants-stageFlags-requiredbitmask", + "text": " stageFlags must not be 0" + }, + { + "vuid": "VUID-vkCmdPushConstants-pValues-parameter", + "text": " pValues must be a valid pointer to an array of size bytes" + }, + { + "vuid": "VUID-vkCmdPushConstants-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdPushConstants-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdPushConstants-size-arraylength", + "text": " size must be greater than 0" + }, + { + "vuid": "VUID-vkCmdPushConstants-commonparent", + "text": " Both of commandBuffer, and layout must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "vkCreateQueryPool": { + "core": [ + { + "vuid": "VUID-vkCreateQueryPool-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateQueryPool-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkQueryPoolCreateInfo structure" + }, + { + "vuid": "VUID-vkCreateQueryPool-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateQueryPool-pQueryPool-parameter", + "text": " pQueryPool must be a valid pointer to a VkQueryPool handle" + } + ] + }, + "VkQueryPoolCreateInfo": { + "core": [ + { + "vuid": "VUID-VkQueryPoolCreateInfo-queryType-00791", + "text": " If the &amp;lt;&amp;lt;features-features-pipelineStatisticsQuery,pipeline statistics queries&amp;gt;&amp;gt; feature is not enabled, queryType must not be VK_QUERY_TYPE_PIPELINE_STATISTICS" + }, + { + "vuid": "VUID-VkQueryPoolCreateInfo-queryType-00792", + "text": " If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of VkQueryPipelineStatisticFlagBits values" + }, + { + "vuid": "VUID-VkQueryPoolCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO" + }, + { + "vuid": "VUID-VkQueryPoolCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkQueryPoolCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkQueryPoolCreateInfo-queryType-parameter", + "text": " queryType must be a valid VkQueryType value" + } + ] + }, + "vkDestroyQueryPool": { + "core": [ + { + "vuid": "VUID-vkDestroyQueryPool-queryPool-00793", + "text": " All submitted commands that refer to queryPool must have completed execution" + }, + { + "vuid": "VUID-vkDestroyQueryPool-queryPool-00794", + "text": " If VkAllocationCallbacks were provided when queryPool was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyQueryPool-queryPool-00795", + "text": " If no VkAllocationCallbacks were provided when queryPool was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyQueryPool-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyQueryPool-queryPool-parameter", + "text": " If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle" + }, + { + "vuid": "VUID-vkDestroyQueryPool-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyQueryPool-queryPool-parent", + "text": " If queryPool is a valid handle, it must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCmdResetQueryPool": { + "core": [ + { + "vuid": "VUID-vkCmdResetQueryPool-firstQuery-00796", + "text": " firstQuery must be less than the number of queries in queryPool" + }, + { + "vuid": "VUID-vkCmdResetQueryPool-firstQuery-00797", + "text": " The sum of firstQuery and queryCount must be less than or equal to the number of queries in queryPool" + }, + { + "vuid": "VUID-vkCmdResetQueryPool-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdResetQueryPool-queryPool-parameter", + "text": " queryPool must be a valid VkQueryPool handle" + }, + { + "vuid": "VUID-vkCmdResetQueryPool-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdResetQueryPool-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdResetQueryPool-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdResetQueryPool-commonparent", + "text": " Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "vkCmdBeginQuery": { + "core": [ + { + "vuid": "VUID-vkCmdBeginQuery-queryPool-01922", + "text": " queryPool must have been created with a queryType that differs from that of any queries that are &amp;lt;&amp;lt;queries-operation-active,active&amp;gt;&amp;gt; within commandBuffer" + }, + { + "vuid": "VUID-vkCmdBeginQuery-None-00807", + "text": " All queries used by the command must be unavailable" + }, + { + "vuid": "VUID-vkCmdBeginQuery-queryType-00800", + "text": " If the &amp;lt;&amp;lt;features-features-occlusionQueryPrecise,precise occlusion queries&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-vkCmdBeginQuery-query-00802", + "text": " query must be less than the number of queries in queryPool" + }, + { + "vuid": "VUID-vkCmdBeginQuery-queryType-00803", + "text": " If the queryType used to create queryPool was VK_QUERY_TYPE_OCCLUSION, the VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdBeginQuery-queryType-00804", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdBeginQuery-queryType-00805", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdBeginQuery-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdBeginQuery-queryPool-parameter", + "text": " queryPool must be a valid VkQueryPool handle" + }, + { + "vuid": "VUID-vkCmdBeginQuery-flags-parameter", + "text": " flags must be a valid combination of VkQueryControlFlagBits values" + }, + { + "vuid": "VUID-vkCmdBeginQuery-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdBeginQuery-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdBeginQuery-commonparent", + "text": " Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdBeginQuery-commandBuffer-01885", + "text": " commandBuffer must not be a protected command buffer" + } + ], + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-vkCmdBeginQuery-query-00808", + "text": " If vkCmdBeginQuery 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" + } + ] + }, + "vkCmdEndQuery": { + "core": [ + { + "vuid": "VUID-vkCmdEndQuery-None-01923", + "text": " All queries used by the command must be &amp;lt;&amp;lt;queries-operation-active,active&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdEndQuery-query-00810", + "text": " query must be less than the number of queries in queryPool" + }, + { + "vuid": "VUID-vkCmdEndQuery-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdEndQuery-queryPool-parameter", + "text": " queryPool must be a valid VkQueryPool handle" + }, + { + "vuid": "VUID-vkCmdEndQuery-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdEndQuery-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdEndQuery-commonparent", + "text": " Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdEndQuery-commandBuffer-01886", + "text": " commandBuffer must not be a protected command buffer" + } + ], + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-vkCmdEndQuery-query-00812", + "text": " 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" + } + ] + }, + "vkGetQueryPoolResults": { + "core": [ + { + "vuid": "VUID-vkGetQueryPoolResults-firstQuery-00813", + "text": " firstQuery must be less than the number of queries in queryPool" + }, + { + "vuid": "VUID-vkGetQueryPoolResults-flags-00814", + "text": " If VK_QUERY_RESULT_64_BIT is not set in flags then pData and stride must be multiples of 4" + }, + { + "vuid": "VUID-vkGetQueryPoolResults-flags-00815", + "text": " If VK_QUERY_RESULT_64_BIT is set in flags then pData and stride must be multiples of 8" + }, + { + "vuid": "VUID-vkGetQueryPoolResults-firstQuery-00816", + "text": " The sum of firstQuery and queryCount must be less than or equal to the number of queries in queryPool" + }, + { + "vuid": "VUID-vkGetQueryPoolResults-dataSize-00817", + "text": " dataSize must be large enough to contain the result of each query, as described &amp;lt;&amp;lt;queries-operation-memorylayout,here&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkGetQueryPoolResults-queryType-00818", + "text": " If the queryType used to create queryPool was VK_QUERY_TYPE_TIMESTAMP, flags must not contain VK_QUERY_RESULT_PARTIAL_BIT" + }, + { + "vuid": "VUID-vkGetQueryPoolResults-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetQueryPoolResults-queryPool-parameter", + "text": " queryPool must be a valid VkQueryPool handle" + }, + { + "vuid": "VUID-vkGetQueryPoolResults-pData-parameter", + "text": " pData must be a valid pointer to an array of dataSize bytes" + }, + { + "vuid": "VUID-vkGetQueryPoolResults-flags-parameter", + "text": " flags must be a valid combination of VkQueryResultFlagBits values" + }, + { + "vuid": "VUID-vkGetQueryPoolResults-dataSize-arraylength", + "text": " dataSize must be greater than 0" + }, + { + "vuid": "VUID-vkGetQueryPoolResults-queryPool-parent", + "text": " queryPool must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCmdCopyQueryPoolResults": { + "core": [ + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-dstOffset-00819", + "text": " dstOffset must be less than the size of dstBuffer" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-firstQuery-00820", + "text": " firstQuery must be less than the number of queries in queryPool" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-firstQuery-00821", + "text": " The sum of firstQuery and queryCount must be less than or equal to the number of queries in queryPool" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-flags-00822", + "text": " If VK_QUERY_RESULT_64_BIT is not set in flags then dstOffset and stride must be multiples of 4" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-flags-00823", + "text": " If VK_QUERY_RESULT_64_BIT is set in flags then dstOffset and stride must be multiples of 8" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-dstBuffer-00824", + "text": " dstBuffer must have enough storage, from dstOffset, to contain the result of each query, as described &amp;lt;&amp;lt;queries-operation-memorylayout,here&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-dstBuffer-00825", + "text": " dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-dstBuffer-00826", + "text": " If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-queryType-00827", + "text": " If the queryType used to create queryPool was VK_QUERY_TYPE_TIMESTAMP, flags must not contain VK_QUERY_RESULT_PARTIAL_BIT" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-queryPool-parameter", + "text": " queryPool must be a valid VkQueryPool handle" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-dstBuffer-parameter", + "text": " dstBuffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-flags-parameter", + "text": " flags must be a valid combination of VkQueryResultFlagBits values" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdCopyQueryPoolResults-commonparent", + "text": " Each of commandBuffer, dstBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "vkCmdWriteTimestamp": { + "core": [ + { + "vuid": "VUID-vkCmdWriteTimestamp-queryPool-01416", + "text": " queryPool must have been created with a queryType of VK_QUERY_TYPE_TIMESTAMP" + }, + { + "vuid": "VUID-vkCmdWriteTimestamp-queryPool-00828", + "text": " The query identified by queryPool and query must be unavailable" + }, + { + "vuid": "VUID-vkCmdWriteTimestamp-timestampValidBits-00829", + "text": " The command pool’s queue family must support a non-zero timestampValidBits" + }, + { + "vuid": "VUID-vkCmdWriteTimestamp-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdWriteTimestamp-pipelineStage-parameter", + "text": " pipelineStage must be a valid VkPipelineStageFlagBits value" + }, + { + "vuid": "VUID-vkCmdWriteTimestamp-queryPool-parameter", + "text": " queryPool must be a valid VkQueryPool handle" + }, + { + "vuid": "VUID-vkCmdWriteTimestamp-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdWriteTimestamp-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdWriteTimestamp-commonparent", + "text": " Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-vkCmdWriteTimestamp-None-00830", + "text": " All queries used by the command must be unavailable" + }, + { + "vuid": "VUID-vkCmdWriteTimestamp-query-00831", + "text": " 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" + } + ] + }, + "vkCmdClearColorImage": { + "(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-vkCmdClearColorImage-image-00001", + "text": " image must use a format that supports VK_FORMAT_FEATURE_TRANSFER_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties" + } + ], + "core": [ + { + "vuid": "VUID-vkCmdClearColorImage-image-00002", + "text": " image must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdClearColorImage-image-00003", + "text": " If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdClearColorImage-imageLayout-00004", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdClearColorImage-baseMipLevel-01470", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdClearColorImage-pRanges-01692", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdClearColorImage-baseArrayLayer-01472", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdClearColorImage-pRanges-01693", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdClearColorImage-image-00007", + "text": " image must not have a compressed or depth/stencil format" + }, + { + "vuid": "VUID-vkCmdClearColorImage-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdClearColorImage-image-parameter", + "text": " image must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkCmdClearColorImage-imageLayout-parameter", + "text": " imageLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-vkCmdClearColorImage-pColor-parameter", + "text": " pColor must be a valid pointer to a valid VkClearColorValue union" + }, + { + "vuid": "VUID-vkCmdClearColorImage-pRanges-parameter", + "text": " pRanges must be a valid pointer to an array of rangeCount valid VkImageSubresourceRange structures" + }, + { + "vuid": "VUID-vkCmdClearColorImage-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdClearColorImage-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdClearColorImage-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdClearColorImage-rangeCount-arraylength", + "text": " rangeCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdClearColorImage-commonparent", + "text": " Both of commandBuffer, and image must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-vkCmdClearColorImage-image-01545", + "text": " image must not use a format listed in &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion&amp;gt;&amp;gt;" + } + ], + "!(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkCmdClearColorImage-imageLayout-00005", + "text": " imageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + } + ], + "(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkCmdClearColorImage-imageLayout-01394", + "text": " imageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdClearColorImage-commandBuffer-01805", + "text": " If commandBuffer is an unprotected command buffer, then image must not be a protected image" + }, + { + "vuid": "VUID-vkCmdClearColorImage-commandBuffer-01806", + "text": " If commandBuffer is a protected command buffer, then image must not be an unprotected image" + } + ] + }, + "vkCmdClearDepthStencilImage": { + "(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-vkCmdClearDepthStencilImage-image-00008", + "text": " image must use a format that supports VK_FORMAT_FEATURE_TRANSFER_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties" + } + ], + "core": [ + { + "vuid": "VUID-vkCmdClearDepthStencilImage-image-00009", + "text": " image must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-image-00010", + "text": " If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-imageLayout-00011", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-imageLayout-00012", + "text": " imageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-baseMipLevel-01474", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-pRanges-01694", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-baseArrayLayer-01476", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-pRanges-01695", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-image-00014", + "text": " image must have a depth/stencil format" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-image-parameter", + "text": " image must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-imageLayout-parameter", + "text": " imageLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-pDepthStencil-parameter", + "text": " pDepthStencil must be a valid pointer to a valid VkClearDepthStencilValue structure" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-pRanges-parameter", + "text": " pRanges must be a valid pointer to an array of rangeCount valid VkImageSubresourceRange structures" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-rangeCount-arraylength", + "text": " rangeCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-commonparent", + "text": " Both of commandBuffer, and image must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdClearDepthStencilImage-commandBuffer-01807", + "text": " If commandBuffer is an unprotected command buffer, then image must not be a protected image" + }, + { + "vuid": "VUID-vkCmdClearDepthStencilImage-commandBuffer-01808", + "text": " If commandBuffer is a protected command buffer, then image must not be an unprotected image" + } + ] + }, + "vkCmdClearAttachments": { + "core": [ + { + "vuid": "VUID-vkCmdClearAttachments-aspectMask-00015", + "text": " If the aspectMask member of any element of pAttachments contains VK_IMAGE_ASPECT_COLOR_BIT, the colorAttachment member of that element must refer to a valid color attachment in the current subpass" + }, + { + "vuid": "VUID-vkCmdClearAttachments-pRects-00016", + "text": " The rectangular region specified by each element of pRects must be contained within the render area of the current render pass instance" + }, + { + "vuid": "VUID-vkCmdClearAttachments-pRects-00017", + "text": " The layers specified by each element of pRects must be contained within every attachment that pAttachments refers to" + }, + { + "vuid": "VUID-vkCmdClearAttachments-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdClearAttachments-pAttachments-parameter", + "text": " pAttachments must be a valid pointer to an array of attachmentCount valid VkClearAttachment structures" + }, + { + "vuid": "VUID-vkCmdClearAttachments-pRects-parameter", + "text": " pRects must be a valid pointer to an array of rectCount VkClearRect structures" + }, + { + "vuid": "VUID-vkCmdClearAttachments-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdClearAttachments-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdClearAttachments-renderpass", + "text": " This command must only be called inside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdClearAttachments-attachmentCount-arraylength", + "text": " attachmentCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdClearAttachments-rectCount-arraylength", + "text": " rectCount must be greater than 0" + } + ], + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-vkCmdClearAttachments-baseArrayLayer-00018", + "text": " If the render pass instance this is recorded in uses multiview, then baseArrayLayer must be zero and layerCount must be one." + } + ] + }, + "VkClearAttachment": { + "core": [ + { + "vuid": "VUID-VkClearAttachment-aspectMask-00019", + "text": " If aspectMask includes VK_IMAGE_ASPECT_COLOR_BIT, it must not include VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT" + }, + { + "vuid": "VUID-VkClearAttachment-aspectMask-00020", + "text": " aspectMask must not include VK_IMAGE_ASPECT_METADATA_BIT" + }, + { + "vuid": "VUID-VkClearAttachment-clearValue-00021", + "text": " clearValue must be a valid VkClearValue union" + }, + { + "vuid": "VUID-VkClearAttachment-aspectMask-parameter", + "text": " aspectMask must be a valid combination of VkImageAspectFlagBits values" + }, + { + "vuid": "VUID-VkClearAttachment-aspectMask-requiredbitmask", + "text": " aspectMask must not be 0" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-VkClearAttachment-commandBuffer-01809", + "text": " If commandBuffer is an unprotected command buffer, then the attachment to be cleared must not be a protected image." + }, + { + "vuid": "VUID-VkClearAttachment-commandBuffer-01810", + "text": " If commandBuffer is a protected command buffer, then the attachment to be cleared must not be an unprotected image." + } + ] + }, + "VkClearDepthStencilValue": { + "(VK_EXT_depth_range_unrestricted)": [ + { + "vuid": "VUID-VkClearDepthStencilValue-depth-00022", + "text": " Unless the VK_EXT_depth_range_unrestricted extension is enabled depth must be between 0.0 and 1.0, inclusive" + } + ], + "!(VK_EXT_depth_range_unrestricted)": [ + { + "vuid": "VUID-VkClearDepthStencilValue-depth-00022", + "text": " depth must be between 0.0 and 1.0, inclusive" + } + ] + }, + "VkClearValue": { + "core": [ + { + "vuid": "VUID-VkClearValue-depthStencil-00023", + "text": " depthStencil must be a valid VkClearDepthStencilValue structure" + } + ] + }, + "vkCmdFillBuffer": { + "core": [ + { + "vuid": "VUID-vkCmdFillBuffer-dstOffset-00024", + "text": " dstOffset must be less than the size of dstBuffer" + }, + { + "vuid": "VUID-vkCmdFillBuffer-dstOffset-00025", + "text": " dstOffset must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdFillBuffer-size-00026", + "text": " If size is not equal to VK_WHOLE_SIZE, size must be greater than 0" + }, + { + "vuid": "VUID-vkCmdFillBuffer-size-00027", + "text": " If size is not equal to VK_WHOLE_SIZE, size must be less than or equal to the size of dstBuffer minus dstOffset" + }, + { + "vuid": "VUID-vkCmdFillBuffer-size-00028", + "text": " If size is not equal to VK_WHOLE_SIZE, size must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdFillBuffer-dstBuffer-00029", + "text": " dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdFillBuffer-dstBuffer-00031", + "text": " If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdFillBuffer-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdFillBuffer-dstBuffer-parameter", + "text": " dstBuffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdFillBuffer-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdFillBuffer-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support transfer, graphics or compute operations" + }, + { + "vuid": "VUID-vkCmdFillBuffer-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdFillBuffer-commonparent", + "text": " Both of commandBuffer, and dstBuffer must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "!(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-vkCmdFillBuffer-commandBuffer-00030", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics or compute operations" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdFillBuffer-commandBuffer-01811", + "text": " If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer" + }, + { + "vuid": "VUID-vkCmdFillBuffer-commandBuffer-01812", + "text": " If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer" + } + ] + }, + "vkCmdUpdateBuffer": { + "core": [ + { + "vuid": "VUID-vkCmdUpdateBuffer-dstOffset-00032", + "text": " dstOffset must be less than the size of dstBuffer" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-dataSize-00033", + "text": " dataSize must be less than or equal to the size of dstBuffer minus dstOffset" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-dstBuffer-00034", + "text": " dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-dstBuffer-00035", + "text": " If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-dstOffset-00036", + "text": " dstOffset must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-dataSize-00037", + "text": " dataSize must be less than or equal to 65536" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-dataSize-00038", + "text": " dataSize must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-dstBuffer-parameter", + "text": " dstBuffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-pData-parameter", + "text": " pData must be a valid pointer to an array of dataSize bytes" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-dataSize-arraylength", + "text": " dataSize must be greater than 0" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-commonparent", + "text": " Both of commandBuffer, and dstBuffer must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdUpdateBuffer-commandBuffer-01813", + "text": " If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer" + }, + { + "vuid": "VUID-vkCmdUpdateBuffer-commandBuffer-01814", + "text": " If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer" + } + ] + }, + "vkCmdCopyBuffer": { + "core": [ + { + "vuid": "VUID-vkCmdCopyBuffer-size-00112", + "text": " The size member of each element of pRegions must be greater than 0" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-srcOffset-00113", + "text": " The srcOffset member of each element of pRegions must be less than the size of srcBuffer" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-dstOffset-00114", + "text": " The dstOffset member of each element of pRegions must be less than the size of dstBuffer" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-size-00115", + "text": " The size member of each element of pRegions must be less than or equal to the size of srcBuffer minus srcOffset" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-size-00116", + "text": " The size member of each element of pRegions must be less than or equal to the size of dstBuffer minus dstOffset" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-pRegions-00117", + "text": " The union of the source regions, and the union of the destination regions, specified by the elements of pRegions, must not overlap in memory" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-srcBuffer-00118", + "text": " srcBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_SRC_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-srcBuffer-00119", + "text": " If srcBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-dstBuffer-00120", + "text": " dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-dstBuffer-00121", + "text": " If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-srcBuffer-parameter", + "text": " srcBuffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-dstBuffer-parameter", + "text": " dstBuffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-pRegions-parameter", + "text": " pRegions must be a valid pointer to an array of regionCount VkBufferCopy structures" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-regionCount-arraylength", + "text": " regionCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-commonparent", + "text": " Each of commandBuffer, dstBuffer, and srcBuffer must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdCopyBuffer-commandBuffer-01822", + "text": " If commandBuffer is an unprotected command buffer, then srcBuffer must not be a protected buffer" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-commandBuffer-01823", + "text": " If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer" + }, + { + "vuid": "VUID-vkCmdCopyBuffer-commandBuffer-01824", + "text": " If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer" + } + ] + }, + "vkCmdCopyImage": { + "core": [ + { + "vuid": "VUID-vkCmdCopyImage-pRegions-00122", + "text": " The source region specified by each element of pRegions must be a region that is contained within srcImage" + }, + { + "vuid": "VUID-vkCmdCopyImage-pRegions-00123", + "text": " The destination region specified by each element of pRegions must be a region that is contained within dstImage" + }, + { + "vuid": "VUID-vkCmdCopyImage-pRegions-00124", + "text": " The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory" + }, + { + "vuid": "VUID-vkCmdCopyImage-srcImage-00126", + "text": " srcImage must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdCopyImage-srcImageLayout-00128", + "text": " srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice" + }, + { + "vuid": "VUID-vkCmdCopyImage-dstImage-00131", + "text": " dstImage must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdCopyImage-dstImageLayout-00133", + "text": " dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice" + }, + { + "vuid": "VUID-vkCmdCopyImage-srcImage-00136", + "text": " The sample count of srcImage and dstImage must match" + }, + { + "vuid": "VUID-vkCmdCopyImage-srcSubresource-01696", + "text": " The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created" + }, + { + "vuid": "VUID-vkCmdCopyImage-dstSubresource-01697", + "text": " The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created" + }, + { + "vuid": "VUID-vkCmdCopyImage-srcSubresource-01698", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdCopyImage-dstSubresource-01699", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdCopyImage-srcOffset-01783", + "text": " The srcOffset and 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" + }, + { + "vuid": "VUID-vkCmdCopyImage-dstOffset-01784", + "text": " The dstOffset and 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" + }, + { + "vuid": "VUID-vkCmdCopyImage-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdCopyImage-srcImage-parameter", + "text": " srcImage must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkCmdCopyImage-srcImageLayout-parameter", + "text": " srcImageLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-vkCmdCopyImage-dstImage-parameter", + "text": " dstImage must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkCmdCopyImage-dstImageLayout-parameter", + "text": " dstImageLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-vkCmdCopyImage-pRegions-parameter", + "text": " pRegions must be a valid pointer to an array of regionCount valid VkImageCopy structures" + }, + { + "vuid": "VUID-vkCmdCopyImage-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdCopyImage-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdCopyImage-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdCopyImage-regionCount-arraylength", + "text": " regionCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdCopyImage-commonparent", + "text": " Each of commandBuffer, dstImage, and srcImage must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-vkCmdCopyImage-srcImage-00125", + "text": " srcImage must use a format that supports VK_FORMAT_FEATURE_TRANSFER_SRC_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdCopyImage-dstImage-00130", + "text": " dstImage must use a format that supports VK_FORMAT_FEATURE_TRANSFER_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties" + } + ], + "!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-vkCmdCopyImage-srcImage-00127", + "text": " If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdCopyImage-dstImage-00132", + "text": " If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdCopyImage-srcImage-00135", + "text": " The VkFormat of each of srcImage and dstImage must be compatible, as defined &amp;lt;&amp;lt;copies-images-format-compatibility, below&amp;gt;&amp;gt;" + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-vkCmdCopyImage-srcImage-01546", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdCopyImage-dstImage-01547", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdCopyImage-srcImage-01548", + "text": " If the VkFormat of each of srcImage and dstImage is not a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar format&amp;gt;&amp;gt;, the VkFormat of each of srcImage and dstImage must be compatible, as defined &amp;lt;&amp;lt;copies-images-format-compatibility, below&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdCopyImage-None-01549", + "text": " In a copy to or from a plane of a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar image&amp;gt;&amp;gt;, the VkFormat of the image and plane must be compatible according to &amp;lt;&amp;lt;features-formats-compatible-planes,the description of compatible planes&amp;gt;&amp;gt; for the plane being copied" + }, + { + "vuid": "VUID-vkCmdCopyImage-aspectMask-01550", + "text": " When a copy is performed to or from an image with a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar format&amp;gt;&amp;gt;, the aspectMask of the srcSubresource and/or dstSubresource that refers to the multi-planar image 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 a VkFormat with three planes)" + } + ], + "!(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkCmdCopyImage-srcImageLayout-00129", + "text": " srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + }, + { + "vuid": "VUID-vkCmdCopyImage-dstImageLayout-00134", + "text": " dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + } + ], + "(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkCmdCopyImage-srcImageLayout-01917", + "text": " srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR" + }, + { + "vuid": "VUID-vkCmdCopyImage-dstImageLayout-01395", + "text": " dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdCopyImage-commandBuffer-01825", + "text": " If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image" + }, + { + "vuid": "VUID-vkCmdCopyImage-commandBuffer-01826", + "text": " If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image" + }, + { + "vuid": "VUID-vkCmdCopyImage-commandBuffer-01827", + "text": " If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image" + } + ] + }, + "VkImageCopy": { + "!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkImageCopy-aspectMask-00137", + "text": " The aspectMask member of srcSubresource and dstSubresource must match" + }, + { + "vuid": "VUID-VkImageCopy-srcOffset-00157", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-extent-00158", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-extent-00159", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-extent-00160", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-dstOffset-00162", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-extent-00163", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-extent-00164", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-extent-00165", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkImageCopy-srcImage-01551", + "text": " If neither the calling command’s srcImage nor the calling command’s dstImage has a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion, multi-planar image format&amp;gt;&amp;gt; then the aspectMask member of srcSubresource and dstSubresource must match" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-01552", + "text": " If the calling command’s srcImage has a VkFormat with &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,two planes&amp;gt;&amp;gt; then the srcSubresource aspectMask must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-01553", + "text": " If the calling command’s srcImage has a VkFormat with &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,three planes&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkImageCopy-dstImage-01554", + "text": " If the calling command’s dstImage has a VkFormat with &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,two planes&amp;gt;&amp;gt; then the dstSubresource aspectMask must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT" + }, + { + "vuid": "VUID-VkImageCopy-dstImage-01555", + "text": " If the calling command’s dstImage has a VkFormat with &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,three planes&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-01556", + "text": " If the calling command’s srcImage has a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar image format&amp;gt;&amp;gt; and the dstImage does not have a multi-planar image format, the dstSubresource aspectMask must be VK_IMAGE_ASPECT_COLOR_BIT" + }, + { + "vuid": "VUID-VkImageCopy-dstImage-01557", + "text": " If the calling command’s dstImage has a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar image format&amp;gt;&amp;gt; and the srcImage does not have a multi-planar image format, the srcSubresource aspectMask must be VK_IMAGE_ASPECT_COLOR_BIT" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-01727", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-01728", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-01729", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-01730", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-dstImage-01731", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-dstImage-01732", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-dstImage-01733", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-dstImage-01734", + "text": " 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" + } + ], + "!(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-VkImageCopy-layerCount-00138", + "text": " The layerCount member of srcSubresource and dstSubresource must match" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-00139", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-01789", + "text": " If the calling command’s srcImage or dstImage is of type VK_IMAGE_TYPE_2D, then extent.depth must be 1." + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-VkImageCopy-extent-00140", + "text": " 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)" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-00141", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-01790", + "text": " If both srcImage and dstImage are of type VK_IMAGE_TYPE_2D then then extent.depth must be 1." + }, + { + "vuid": "VUID-VkImageCopy-srcImage-01791", + "text": " 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." + }, + { + "vuid": "VUID-VkImageCopy-dstImage-01792", + "text": " 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." + } + ], + "core": [ + { + "vuid": "VUID-VkImageCopy-aspectMask-00142", + "text": " The aspectMask member of srcSubresource must specify aspects present in the calling command’s srcImage" + }, + { + "vuid": "VUID-VkImageCopy-aspectMask-00143", + "text": " The aspectMask member of dstSubresource must specify aspects present in the calling command’s dstImage" + }, + { + "vuid": "VUID-VkImageCopy-srcOffset-00144", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-srcOffset-00145", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-00146", + "text": " 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." + }, + { + "vuid": "VUID-VkImageCopy-srcOffset-00147", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-srcImage-01785", + "text": " 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." + }, + { + "vuid": "VUID-VkImageCopy-dstImage-01786", + "text": " 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." + }, + { + "vuid": "VUID-VkImageCopy-srcImage-01787", + "text": " If the calling command’s srcImage is of type VK_IMAGE_TYPE_2D, then srcOffset.z must be 0." + }, + { + "vuid": "VUID-VkImageCopy-dstImage-01788", + "text": " If the calling command’s dstImage is of type VK_IMAGE_TYPE_2D, then dstOffset.z must be 0." + }, + { + "vuid": "VUID-VkImageCopy-dstOffset-00150", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-dstOffset-00151", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-dstImage-00152", + "text": " 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." + }, + { + "vuid": "VUID-VkImageCopy-dstOffset-00153", + "text": " 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" + }, + { + "vuid": "VUID-VkImageCopy-srcSubresource-parameter", + "text": " srcSubresource must be a valid VkImageSubresourceLayers structure" + }, + { + "vuid": "VUID-VkImageCopy-dstSubresource-parameter", + "text": " dstSubresource must be a valid VkImageSubresourceLayers structure" + } + ] + }, + "VkImageSubresourceLayers": { + "core": [ + { + "vuid": "VUID-VkImageSubresourceLayers-aspectMask-00167", + "text": " 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" + }, + { + "vuid": "VUID-VkImageSubresourceLayers-aspectMask-00168", + "text": " aspectMask must not contain VK_IMAGE_ASPECT_METADATA_BIT" + }, + { + "vuid": "VUID-VkImageSubresourceLayers-layerCount-01700", + "text": " layerCount must be greater than 0" + }, + { + "vuid": "VUID-VkImageSubresourceLayers-aspectMask-parameter", + "text": " aspectMask must be a valid combination of VkImageAspectFlagBits values" + }, + { + "vuid": "VUID-VkImageSubresourceLayers-aspectMask-requiredbitmask", + "text": " aspectMask must not be 0" + } + ] + }, + "vkCmdCopyBufferToImage": { + "core": [ + { + "vuid": "VUID-vkCmdCopyBufferToImage-pRegions-00171", + "text": " The buffer region specified by each element of pRegions must be a region that is contained within srcBuffer" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-pRegions-00172", + "text": " The image region specified by each element of pRegions must be a region that is contained within dstImage" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-pRegions-00173", + "text": " The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-srcBuffer-00174", + "text": " srcBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_SRC_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-srcBuffer-00176", + "text": " If srcBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-dstImage-00177", + "text": " dstImage must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-dstImage-00178", + "text": " If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-dstImage-00179", + "text": " dstImage must have a sample count equal to VK_SAMPLE_COUNT_1_BIT" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180", + "text": " dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-imageSubresource-01701", + "text": " The imageSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-imageSubresource-01702", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-imageOffset-01793", + "text": " The imageOffset and 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" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-srcBuffer-parameter", + "text": " srcBuffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-dstImage-parameter", + "text": " dstImage must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-dstImageLayout-parameter", + "text": " dstImageLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-pRegions-parameter", + "text": " pRegions must be a valid pointer to an array of regionCount valid VkBufferImageCopy structures" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-regionCount-arraylength", + "text": " regionCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-commonparent", + "text": " Each of commandBuffer, dstImage, and srcBuffer must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-vkCmdCopyBufferToImage-dstImage-00175", + "text": " dstImage must use a format that supports VK_FORMAT_FEATURE_TRANSFER_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties" + } + ], + "!(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkCmdCopyBufferToImage-dstImageLayout-00181", + "text": " dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + } + ], + "(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkCmdCopyBufferToImage-dstImageLayout-01396", + "text": " dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdCopyBufferToImage-commandBuffer-01828", + "text": " If commandBuffer is an unprotected command buffer, then srcBuffer must not be a protected buffer" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-commandBuffer-01829", + "text": " If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image" + }, + { + "vuid": "VUID-vkCmdCopyBufferToImage-commandBuffer-01830", + "text": " If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image" + } + ] + }, + "vkCmdCopyImageToBuffer": { + "core": [ + { + "vuid": "VUID-vkCmdCopyImageToBuffer-pRegions-00182", + "text": " The image region specified by each element of pRegions must be a region that is contained within srcImage" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-pRegions-00183", + "text": " The buffer region specified by each element of pRegions must be a region that is contained within dstBuffer" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-pRegions-00184", + "text": " The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-srcImage-00186", + "text": " srcImage must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-srcImage-00187", + "text": " If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-srcImage-00188", + "text": " srcImage must have a sample count equal to VK_SAMPLE_COUNT_1_BIT" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189", + "text": " srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-dstBuffer-00191", + "text": " dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-dstBuffer-00192", + "text": " If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703", + "text": " The imageSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-imageOffset-01794", + "text": " The imageOffset and 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" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-srcImage-parameter", + "text": " srcImage must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-srcImageLayout-parameter", + "text": " srcImageLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-dstBuffer-parameter", + "text": " dstBuffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-pRegions-parameter", + "text": " pRegions must be a valid pointer to an array of regionCount valid VkBufferImageCopy structures" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-regionCount-arraylength", + "text": " regionCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-commonparent", + "text": " Each of commandBuffer, dstBuffer, and srcImage must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance1)": [ + { + "vuid": "VUID-vkCmdCopyImageToBuffer-srcImage-00185", + "text": " srcImage must use a format that supports VK_FORMAT_FEATURE_TRANSFER_SRC_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties" + } + ], + "!(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00190", + "text": " srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + } + ], + "(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkCmdCopyImageToBuffer-srcImageLayout-01397", + "text": " srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831", + "text": " If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832", + "text": " If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer" + }, + { + "vuid": "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833", + "text": " If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer" + } + ] + }, + "VkBufferImageCopy": { + "!(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkBufferImageCopy-bufferOffset-00193", + "text": " 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 element size" + }, + { + "vuid": "VUID-VkBufferImageCopy-bufferRowLength-00203", + "text": " If the calling command’s VkImage parameter is a compressed image, bufferRowLength must be a multiple of the compressed texel block width" + }, + { + "vuid": "VUID-VkBufferImageCopy-bufferImageHeight-00204", + "text": " If the calling command’s VkImage parameter is a compressed image, bufferImageHeight must be a multiple of the compressed texel block height" + }, + { + "vuid": "VUID-VkBufferImageCopy-imageOffset-00205", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-bufferOffset-00206", + "text": " If the calling command’s VkImage parameter is a compressed image, bufferOffset must be a multiple of the compressed texel block size in bytes" + }, + { + "vuid": "VUID-VkBufferImageCopy-imageExtent-00207", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-imageExtent-00208", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-imageExtent-00209", + "text": " 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkBufferImageCopy-bufferOffset-01558", + "text": " If the calling command’s VkImage parameter’s format is not a depth/stencil format or a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar format&amp;gt;&amp;gt;, then bufferOffset must be a multiple of the format’s element size" + }, + { + "vuid": "VUID-VkBufferImageCopy-bufferOffset-01559", + "text": " If the calling command’s VkImage parameter’s format is a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar format&amp;gt;&amp;gt;, 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 &amp;lt;&amp;lt;features-formats-compatible-planes&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkBufferImageCopy-None-01735", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-None-01736", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-None-01737", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-None-01738", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-None-01739", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-None-01740", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-None-01741", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-aspectMask-01560", + "text": " If the calling command’s VkImage parameter’s format is a &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion,multi-planar format&amp;gt;&amp;gt;, 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)" + } + ], + "core": [ + { + "vuid": "VUID-VkBufferImageCopy-bufferOffset-00194", + "text": " bufferOffset must be a multiple of 4" + }, + { + "vuid": "VUID-VkBufferImageCopy-bufferRowLength-00195", + "text": " bufferRowLength must be 0, or greater than or equal to the width member of imageExtent" + }, + { + "vuid": "VUID-VkBufferImageCopy-bufferImageHeight-00196", + "text": " bufferImageHeight must be 0, or greater than or equal to the height member of imageExtent" + }, + { + "vuid": "VUID-VkBufferImageCopy-imageOffset-00197", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-imageOffset-00198", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-srcImage-00199", + "text": " 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." + }, + { + "vuid": "VUID-VkBufferImageCopy-imageOffset-00200", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-srcImage-00201", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-aspectMask-00211", + "text": " The aspectMask member of imageSubresource must specify aspects present in the calling command’s VkImage parameter" + }, + { + "vuid": "VUID-VkBufferImageCopy-aspectMask-00212", + "text": " The aspectMask member of imageSubresource must only have a single bit set" + }, + { + "vuid": "VUID-VkBufferImageCopy-baseArrayLayer-00213", + "text": " 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" + }, + { + "vuid": "VUID-VkBufferImageCopy-None-00214", + "text": " When copying to the depth aspect of an image subresource, the data in the source buffer must be in the range [0,1]" + }, + { + "vuid": "VUID-VkBufferImageCopy-imageSubresource-parameter", + "text": " imageSubresource must be a valid VkImageSubresourceLayers structure" + } + ] + }, + "vkCmdBlitImage": { + "core": [ + { + "vuid": "VUID-vkCmdBlitImage-pRegions-00215", + "text": " The source region specified by each element of pRegions must be a region that is contained within srcImage" + }, + { + "vuid": "VUID-vkCmdBlitImage-pRegions-00216", + "text": " The destination region specified by each element of pRegions must be a region that is contained within dstImage" + }, + { + "vuid": "VUID-vkCmdBlitImage-pRegions-00217", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcImage-00218", + "text": " srcImage must use a format that supports VK_FORMAT_FEATURE_BLIT_SRC_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcImage-00219", + "text": " srcImage must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcImage-00220", + "text": " If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcImageLayout-00221", + "text": " srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice" + }, + { + "vuid": "VUID-vkCmdBlitImage-dstImage-00223", + "text": " dstImage must use a format that supports VK_FORMAT_FEATURE_BLIT_DST_BIT, which is indicated by VkFormatProperties::linearTilingFeatures (for linearly tiled images) or VkFormatProperties::optimalTilingFeatures (for optimally tiled images) - as returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdBlitImage-dstImage-00224", + "text": " dstImage must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdBlitImage-dstImage-00225", + "text": " If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdBlitImage-dstImageLayout-00226", + "text": " dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcImage-00228", + "text": " The sample count of srcImage and dstImage must both be equal to VK_SAMPLE_COUNT_1_BIT" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcImage-00229", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcImage-00230", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcImage-00231", + "text": " If either of srcImage or dstImage was created with a depth/stencil format, the other must have exactly the same format" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcImage-00232", + "text": " If srcImage was created with a depth/stencil format, filter must be VK_FILTER_NEAREST" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcImage-00233", + "text": " srcImage must have been created with a samples value of VK_SAMPLE_COUNT_1_BIT" + }, + { + "vuid": "VUID-vkCmdBlitImage-dstImage-00234", + "text": " dstImage must have been created with a samples value of VK_SAMPLE_COUNT_1_BIT" + }, + { + "vuid": "VUID-vkCmdBlitImage-filter-00235", + "text": " If filter is VK_FILTER_LINEAR, srcImage must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcSubresource-01705", + "text": " The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created" + }, + { + "vuid": "VUID-vkCmdBlitImage-dstSubresource-01706", + "text": " The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcSubresource-01707", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdBlitImage-dstSubresource-01708", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdBlitImage-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcImage-parameter", + "text": " srcImage must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkCmdBlitImage-srcImageLayout-parameter", + "text": " srcImageLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-vkCmdBlitImage-dstImage-parameter", + "text": " dstImage must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkCmdBlitImage-dstImageLayout-parameter", + "text": " dstImageLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-vkCmdBlitImage-pRegions-parameter", + "text": " pRegions must be a valid pointer to an array of regionCount valid VkImageBlit structures" + }, + { + "vuid": "VUID-vkCmdBlitImage-filter-parameter", + "text": " filter must be a valid VkFilter value" + }, + { + "vuid": "VUID-vkCmdBlitImage-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdBlitImage-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdBlitImage-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdBlitImage-regionCount-arraylength", + "text": " regionCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdBlitImage-commonparent", + "text": " Each of commandBuffer, dstImage, and srcImage must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-vkCmdBlitImage-srcImage-01561", + "text": " srcImage must not use a format listed in &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdBlitImage-dstImage-01562", + "text": " dstImage must not use a format listed in &amp;lt;&amp;lt;features-formats-requiring-sampler-ycbcr-conversion&amp;gt;&amp;gt;" + } + ], + "!(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkCmdBlitImage-srcImageLayout-00222", + "text": " srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + }, + { + "vuid": "VUID-vkCmdBlitImage-dstImageLayout-00227", + "text": " dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + } + ], + "(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkCmdBlitImage-srcImageLayout-01398", + "text": " srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + }, + { + "vuid": "VUID-vkCmdBlitImage-dstImageLayout-01399", + "text": " dstImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + } + ], + "(VK_IMG_filter_cubic)": [ + { + "vuid": "VUID-vkCmdBlitImage-filter-00236", + "text": " If filter is VK_FILTER_CUBIC_IMG, srcImage must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdBlitImage-filter-00237", + "text": " If filter is VK_FILTER_CUBIC_IMG, srcImage must have a VkImageType of VK_IMAGE_TYPE_3D" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdBlitImage-commandBuffer-01834", + "text": " If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image" + }, + { + "vuid": "VUID-vkCmdBlitImage-commandBuffer-01835", + "text": " If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image" + }, + { + "vuid": "VUID-vkCmdBlitImage-commandBuffer-01836", + "text": " If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image" + } + ] + }, + "VkImageBlit": { + "core": [ + { + "vuid": "VUID-VkImageBlit-aspectMask-00238", + "text": " The aspectMask member of srcSubresource and dstSubresource must match" + }, + { + "vuid": "VUID-VkImageBlit-layerCount-00239", + "text": " The layerCount member of srcSubresource and dstSubresource must match" + }, + { + "vuid": "VUID-VkImageBlit-srcImage-00240", + "text": " 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" + }, + { + "vuid": "VUID-VkImageBlit-aspectMask-00241", + "text": " The aspectMask member of srcSubresource must specify aspects present in the calling command’s srcImage" + }, + { + "vuid": "VUID-VkImageBlit-aspectMask-00242", + "text": " The aspectMask member of dstSubresource must specify aspects present in the calling command’s dstImage" + }, + { + "vuid": "VUID-VkImageBlit-srcOffset-00243", + "text": " 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" + }, + { + "vuid": "VUID-VkImageBlit-srcOffset-00244", + "text": " 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" + }, + { + "vuid": "VUID-VkImageBlit-srcImage-00245", + "text": " 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." + }, + { + "vuid": "VUID-VkImageBlit-srcOffset-00246", + "text": " 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" + }, + { + "vuid": "VUID-VkImageBlit-srcImage-00247", + "text": " 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." + }, + { + "vuid": "VUID-VkImageBlit-dstOffset-00248", + "text": " 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" + }, + { + "vuid": "VUID-VkImageBlit-dstOffset-00249", + "text": " 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" + }, + { + "vuid": "VUID-VkImageBlit-dstImage-00250", + "text": " 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." + }, + { + "vuid": "VUID-VkImageBlit-dstOffset-00251", + "text": " 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" + }, + { + "vuid": "VUID-VkImageBlit-dstImage-00252", + "text": " 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." + }, + { + "vuid": "VUID-VkImageBlit-srcSubresource-parameter", + "text": " srcSubresource must be a valid VkImageSubresourceLayers structure" + }, + { + "vuid": "VUID-VkImageBlit-dstSubresource-parameter", + "text": " dstSubresource must be a valid VkImageSubresourceLayers structure" + } + ] + }, + "vkCmdResolveImage": { + "core": [ + { + "vuid": "VUID-vkCmdResolveImage-pRegions-00253", + "text": " The source region specified by each element of pRegions must be a region that is contained within srcImage" + }, + { + "vuid": "VUID-vkCmdResolveImage-pRegions-00254", + "text": " The destination region specified by each element of pRegions must be a region that is contained within dstImage" + }, + { + "vuid": "VUID-vkCmdResolveImage-pRegions-00255", + "text": " The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory" + }, + { + "vuid": "VUID-vkCmdResolveImage-srcImage-00256", + "text": " If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdResolveImage-srcImage-00257", + "text": " srcImage must have a sample count equal to any valid sample count value other than VK_SAMPLE_COUNT_1_BIT" + }, + { + "vuid": "VUID-vkCmdResolveImage-dstImage-00258", + "text": " If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdResolveImage-dstImage-00259", + "text": " dstImage must have a sample count equal to VK_SAMPLE_COUNT_1_BIT" + }, + { + "vuid": "VUID-vkCmdResolveImage-srcImageLayout-00260", + "text": " srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice" + }, + { + "vuid": "VUID-vkCmdResolveImage-dstImageLayout-00262", + "text": " dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice" + }, + { + "vuid": "VUID-vkCmdResolveImage-dstImage-00264", + "text": " If dstImage was created with tiling equal to VK_IMAGE_TILING_LINEAR, dstImage must have been created with a format that supports being a color attachment, as specified by the VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT flag in VkFormatProperties::linearTilingFeatures returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdResolveImage-dstImage-00265", + "text": " If dstImage was created with tiling equal to VK_IMAGE_TILING_OPTIMAL, dstImage must have been created with a format that supports being a color attachment, as specified by the VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT flag in VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdResolveImage-srcImage-01386", + "text": " srcImage and dstImage must have been created with the same image format" + }, + { + "vuid": "VUID-vkCmdResolveImage-srcSubresource-01709", + "text": " The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created" + }, + { + "vuid": "VUID-vkCmdResolveImage-dstSubresource-01710", + "text": " The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created" + }, + { + "vuid": "VUID-vkCmdResolveImage-srcSubresource-01711", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdResolveImage-dstSubresource-01712", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdResolveImage-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdResolveImage-srcImage-parameter", + "text": " srcImage must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkCmdResolveImage-srcImageLayout-parameter", + "text": " srcImageLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-vkCmdResolveImage-dstImage-parameter", + "text": " dstImage must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkCmdResolveImage-dstImageLayout-parameter", + "text": " dstImageLayout must be a valid VkImageLayout value" + }, + { + "vuid": "VUID-vkCmdResolveImage-pRegions-parameter", + "text": " pRegions must be a valid pointer to an array of regionCount valid VkImageResolve structures" + }, + { + "vuid": "VUID-vkCmdResolveImage-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdResolveImage-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdResolveImage-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdResolveImage-regionCount-arraylength", + "text": " regionCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdResolveImage-commonparent", + "text": " Each of commandBuffer, dstImage, and srcImage must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "!(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkCmdResolveImage-srcImageLayout-00261", + "text": " srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + }, + { + "vuid": "VUID-vkCmdResolveImage-dstImageLayout-00263", + "text": " dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + } + ], + "(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkCmdResolveImage-srcImageLayout-01400", + "text": " srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + }, + { + "vuid": "VUID-vkCmdResolveImage-dstImageLayout-01401", + "text": " dstImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdResolveImage-commandBuffer-01837", + "text": " If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image" + }, + { + "vuid": "VUID-vkCmdResolveImage-commandBuffer-01838", + "text": " If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image" + }, + { + "vuid": "VUID-vkCmdResolveImage-commandBuffer-01839", + "text": " If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image" + } + ] + }, + "VkImageResolve": { + "core": [ + { + "vuid": "VUID-VkImageResolve-aspectMask-00266", + "text": " The aspectMask member of srcSubresource and dstSubresource must only contain VK_IMAGE_ASPECT_COLOR_BIT" + }, + { + "vuid": "VUID-VkImageResolve-layerCount-00267", + "text": " The layerCount member of srcSubresource and dstSubresource must match" + }, + { + "vuid": "VUID-VkImageResolve-srcImage-00268", + "text": " 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" + }, + { + "vuid": "VUID-VkImageResolve-srcOffset-00269", + "text": " 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" + }, + { + "vuid": "VUID-VkImageResolve-srcOffset-00270", + "text": " 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" + }, + { + "vuid": "VUID-VkImageResolve-srcImage-00271", + "text": " 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." + }, + { + "vuid": "VUID-VkImageResolve-srcOffset-00272", + "text": " 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" + }, + { + "vuid": "VUID-VkImageResolve-srcImage-00273", + "text": " 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." + }, + { + "vuid": "VUID-VkImageResolve-dstOffset-00274", + "text": " 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" + }, + { + "vuid": "VUID-VkImageResolve-dstOffset-00275", + "text": " 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" + }, + { + "vuid": "VUID-VkImageResolve-dstImage-00276", + "text": " 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." + }, + { + "vuid": "VUID-VkImageResolve-dstOffset-00277", + "text": " 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" + }, + { + "vuid": "VUID-VkImageResolve-dstImage-00278", + "text": " 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." + }, + { + "vuid": "VUID-VkImageResolve-srcSubresource-parameter", + "text": " srcSubresource must be a valid VkImageSubresourceLayers structure" + }, + { + "vuid": "VUID-VkImageResolve-dstSubresource-parameter", + "text": " dstSubresource must be a valid VkImageSubresourceLayers structure" + } + ] + }, + "vkCmdWriteBufferMarkerAMD": { + "(VK_AMD_buffer_marker)": [ + { + "vuid": "VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01798", + "text": " dstOffset must be less than or equal to the size of dstBuffer minus 4." + }, + { + "vuid": "VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01799", + "text": " dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag" + }, + { + "vuid": "VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01800", + "text": " If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01801", + "text": " dstOffset must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-parameter", + "text": " pipelineStage must be a valid VkPipelineStageFlagBits value" + }, + { + "vuid": "VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-parameter", + "text": " dstBuffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdWriteBufferMarkerAMD-commonparent", + "text": " Both of commandBuffer, and dstBuffer must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "VkPipelineInputAssemblyStateCreateInfo": { + "core": [ + { + "vuid": "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00429", + "text": " If the &amp;lt;&amp;lt;features-features-geometryShader,geometry shaders&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00430", + "text": " If the &amp;lt;&amp;lt;features-features-tessellationShader,tessellation shaders&amp;gt;&amp;gt; feature is not enabled, topology must not be VK_PRIMITIVE_TOPOLOGY_PATCH_LIST" + }, + { + "vuid": "VUID-VkPipelineInputAssemblyStateCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineInputAssemblyStateCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkPipelineInputAssemblyStateCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-parameter", + "text": " topology must be a valid VkPrimitiveTopology value" + } + ] + }, + "vkCmdBindIndexBuffer": { + "core": [ + { + "vuid": "VUID-vkCmdBindIndexBuffer-offset-00431", + "text": " offset must be less than the size of buffer" + }, + { + "vuid": "VUID-vkCmdBindIndexBuffer-offset-00432", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdBindIndexBuffer-buffer-00433", + "text": " buffer must have been created with the VK_BUFFER_USAGE_INDEX_BUFFER_BIT flag" + }, + { + "vuid": "VUID-vkCmdBindIndexBuffer-buffer-00434", + "text": " If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdBindIndexBuffer-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdBindIndexBuffer-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdBindIndexBuffer-indexType-parameter", + "text": " indexType must be a valid VkIndexType value" + }, + { + "vuid": "VUID-vkCmdBindIndexBuffer-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdBindIndexBuffer-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdBindIndexBuffer-commonparent", + "text": " Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "vkCmdDraw": { + "core": [ + { + "vuid": "VUID-vkCmdDraw-renderPass-00435", + "text": " The current render pass must be &amp;lt;&amp;lt;renderpass-compatibility,compatible&amp;gt;&amp;gt; with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS." + }, + { + "vuid": "VUID-vkCmdDraw-subpass-00436", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDraw-None-00437", + "text": " For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDraw-None-00438", + "text": " For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDraw-None-00439", + "text": " Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline" + }, + { + "vuid": "VUID-vkCmdDraw-None-00440", + "text": " All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point’s interface must have valid buffers bound" + }, + { + "vuid": "VUID-vkCmdDraw-None-00441", + "text": " For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in &amp;lt;&amp;lt;fxvertex-input&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDraw-None-00442", + "text": " A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS" + }, + { + "vuid": "VUID-vkCmdDraw-None-00443", + "text": " If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer" + }, + { + "vuid": "VUID-vkCmdDraw-None-00444", + "text": " Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set" + }, + { + "vuid": "VUID-vkCmdDraw-None-00445", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDraw-None-00446", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDraw-None-00447", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDraw-None-00448", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDraw-None-00449", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDraw-linearTilingFeatures-00450", + "text": " Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDraw-None-01499", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDraw-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdDraw-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDraw-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdDraw-renderpass", + "text": " This command must only be called inside of a render pass instance" + } + ], + "(VK_IMG_filter_cubic)": [ + { + "vuid": "VUID-vkCmdDraw-linearTilingFeatures-00451", + "text": " Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDraw-None-00452", + "text": " Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-vkCmdDraw-maxMultiviewInstanceIndex-00453", + "text": " 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." + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdDraw-commandBuffer-01850", + "text": " If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer." + }, + { + "vuid": "VUID-vkCmdDraw-commandBuffer-01851", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer." + }, + { + "vuid": "VUID-vkCmdDraw-commandBuffer-01852", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer." + } + ], + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-vkCmdDraw-sampleLocationsEnable-01512", + "text": " 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" + } + ] + }, + "vkCmdDrawIndexed": { + "core": [ + { + "vuid": "VUID-vkCmdDrawIndexed-renderPass-00454", + "text": " The current render pass must be &amp;lt;&amp;lt;renderpass-compatibility,compatible&amp;gt;&amp;gt; with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS." + }, + { + "vuid": "VUID-vkCmdDrawIndexed-subpass-00455", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00456", + "text": " For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00457", + "text": " For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00458", + "text": " Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00459", + "text": " All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point’s interface must have valid buffers bound" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00460", + "text": " For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in &amp;lt;&amp;lt;fxvertex-input&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00461", + "text": " A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00462", + "text": " If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-indexSize-00463", + "text": " (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" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00464", + "text": " Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00465", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00466", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00467", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00468", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00469", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-linearTilingFeatures-00470", + "text": " Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-01500", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDrawIndexed-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-renderpass", + "text": " This command must only be called inside of a render pass instance" + } + ], + "(VK_IMG_filter_cubic)": [ + { + "vuid": "VUID-vkCmdDrawIndexed-linearTilingFeatures-00471", + "text": " Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDrawIndexed-None-00472", + "text": " Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-vkCmdDrawIndexed-maxMultiviewInstanceIndex-00473", + "text": " 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." + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdDrawIndexed-commandBuffer-01853", + "text": " If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer." + }, + { + "vuid": "VUID-vkCmdDrawIndexed-commandBuffer-01854", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer." + }, + { + "vuid": "VUID-vkCmdDrawIndexed-commandBuffer-01855", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer." + } + ], + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-vkCmdDrawIndexed-sampleLocationsEnable-01513", + "text": " 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" + } + ] + }, + "vkCmdDrawIndirect": { + "core": [ + { + "vuid": "VUID-vkCmdDrawIndirect-buffer-00474", + "text": " If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-buffer-01660", + "text": " buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-offset-00475", + "text": " offset must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-drawCount-00476", + "text": " If drawCount is greater than 1, stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndirectCommand)" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-drawCount-00477", + "text": " If the multi-draw indirect feature is not enabled, drawCount must be 0 or 1" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-firstInstance-00478", + "text": " If the &amp;lt;&amp;lt;features-features-drawIndirectFirstInstance,drawIndirectFirstInstance&amp;gt;&amp;gt; feature is not enabled, all the firstInstance members of the VkDrawIndirectCommand structures accessed by this command must be 0" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-renderPass-00479", + "text": " The current render pass must be &amp;lt;&amp;lt;renderpass-compatibility,compatible&amp;gt;&amp;gt; with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS." + }, + { + "vuid": "VUID-vkCmdDrawIndirect-subpass-00480", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00481", + "text": " For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00482", + "text": " For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00483", + "text": " Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00484", + "text": " All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point’s interface must have valid buffers bound" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00485", + "text": " A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00486", + "text": " If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-drawCount-00487", + "text": " If drawCount is equal to 1, (offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-drawCount-00488", + "text": " If drawCount is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-drawCount-00489", + "text": " drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00490", + "text": " Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00491", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00492", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00493", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00494", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00495", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-linearTilingFeatures-00496", + "text": " Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-01501", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDrawIndirect-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-renderpass", + "text": " This command must only be called inside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-commonparent", + "text": " Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_IMG_filter_cubic)": [ + { + "vuid": "VUID-vkCmdDrawIndirect-linearTilingFeatures-00497", + "text": " Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDrawIndirect-None-00498", + "text": " Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-vkCmdDrawIndirect-maxMultiviewInstanceIndex-00499", + "text": " 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." + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdDrawIndirect-commandBuffer-01856", + "text": " If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer." + }, + { + "vuid": "VUID-vkCmdDrawIndirect-commandBuffer-01857", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer." + }, + { + "vuid": "VUID-vkCmdDrawIndirect-commandBuffer-01858", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer." + } + ], + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-vkCmdDrawIndirect-sampleLocationsEnable-01514", + "text": " 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" + } + ] + }, + "VkDrawIndirectCommand": { + "core": [ + { + "vuid": "VUID-VkDrawIndirectCommand-None-00500", + "text": " For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in &amp;lt;&amp;lt;fxvertex-input&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkDrawIndirectCommand-firstInstance-00501", + "text": " If the &amp;lt;&amp;lt;features-features-drawIndirectFirstInstance,drawIndirectFirstInstance&amp;gt;&amp;gt; feature is not enabled, firstInstance must be 0" + } + ] + }, + "vkCmdDrawIndirectCountAMD": { + "(VK_AMD_draw_indirect_count)": [ + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-buffer-01661", + "text": " If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-buffer-01662", + "text": " buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-countBuffer-01663", + "text": " If countBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-countBuffer-01664", + "text": " countBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-offset-00502", + "text": " offset must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-countBufferOffset-00503", + "text": " countBufferOffset must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-stride-00504", + "text": " stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndirectCommand)" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-maxDrawCount-00505", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-firstInstance-00506", + "text": " If the &amp;lt;&amp;lt;features-features-drawIndirectFirstInstance,drawIndirectFirstInstance&amp;gt;&amp;gt; feature is not enabled, all the firstInstance members of the VkDrawIndirectCommand structures accessed by this command must be 0" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-renderPass-00507", + "text": " The current render pass must be &amp;lt;&amp;lt;renderpass-compatibility,compatible&amp;gt;&amp;gt; with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS." + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-subpass-00508", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-00509", + "text": " For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-00510", + "text": " For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-00511", + "text": " Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-00512", + "text": " All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point’s interface must have valid buffers bound" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-00513", + "text": " A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-00514", + "text": " If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-countBuffer-00515", + "text": " If the count stored in countBuffer is equal to 1, (offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-countBuffer-00516", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-countBuffer-00517", + "text": " The count stored in countBuffer must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-00518", + "text": " Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-00519", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-00520", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-00521", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-00522", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-00523", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-linearTilingFeatures-00524", + "text": " Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-None-01502", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-countBuffer-parameter", + "text": " countBuffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-renderpass", + "text": " This command must only be called inside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-commonparent", + "text": " Each of buffer, commandBuffer, and countBuffer must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_AMD_draw_indirect_count)+(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-maxMultiviewInstanceIndex-00525", + "text": " 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." + } + ], + "(VK_AMD_draw_indirect_count)+(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01859", + "text": " If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer." + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01860", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer." + }, + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-commandBuffer-01861", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer." + } + ], + "(VK_AMD_draw_indirect_count)+(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-vkCmdDrawIndirectCountAMD-sampleLocationsEnable-01515", + "text": " 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" + } + ] + }, + "vkCmdDrawIndexedIndirect": { + "core": [ + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-buffer-00526", + "text": " If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-buffer-01665", + "text": " buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-offset-00527", + "text": " offset must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", + "text": " If drawCount is greater than 1, stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndexedIndirectCommand)" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-drawCount-00529", + "text": " If the multi-draw indirect feature is not enabled, drawCount must be 0 or 1" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-firstInstance-00530", + "text": " If the &amp;lt;&amp;lt;features-features-drawIndirectFirstInstance,drawIndirectFirstInstance&amp;gt;&amp;gt; feature is not enabled, all the firstInstance members of the VkDrawIndexedIndirectCommand structures accessed by this command must be 0" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-renderPass-00531", + "text": " The current render pass must be &amp;lt;&amp;lt;renderpass-compatibility,compatible&amp;gt;&amp;gt; with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS." + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-subpass-00532", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00533", + "text": " For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00534", + "text": " For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00535", + "text": " Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00536", + "text": " All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point’s interface must have valid buffers bound" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00537", + "text": " A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00538", + "text": " If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-drawCount-00539", + "text": " If drawCount is equal to 1, (offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", + "text": " If drawCount is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-drawCount-00541", + "text": " drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00542", + "text": " Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00543", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00544", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00545", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00546", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00547", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-linearTilingFeatures-00548", + "text": " Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-01503", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-renderpass", + "text": " This command must only be called inside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-commonparent", + "text": " Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_IMG_filter_cubic)": [ + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-linearTilingFeatures-00549", + "text": " Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-None-00550", + "text": " Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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" + } + ], + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-maxMultiviewInstanceIndex-00551", + "text": " 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." + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-commandBuffer-01862", + "text": " If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer." + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-commandBuffer-01863", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer." + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-commandBuffer-01864", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer." + } + ], + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-01516", + "text": " 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" + } + ] + }, + "VkDrawIndexedIndirectCommand": { + "core": [ + { + "vuid": "VUID-VkDrawIndexedIndirectCommand-None-00552", + "text": " For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in &amp;lt;&amp;lt;fxvertex-input&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkDrawIndexedIndirectCommand-indexSize-00553", + "text": " (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" + }, + { + "vuid": "VUID-VkDrawIndexedIndirectCommand-firstInstance-00554", + "text": " If the &amp;lt;&amp;lt;features-features-drawIndirectFirstInstance,drawIndirectFirstInstance&amp;gt;&amp;gt; feature is not enabled, firstInstance must be 0" + } + ] + }, + "vkCmdDrawIndexedIndirectCountAMD": { + "(VK_AMD_draw_indirect_count)": [ + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-01666", + "text": " If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-01667", + "text": " buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-01668", + "text": " If countBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-01669", + "text": " countBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-offset-00555", + "text": " offset must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-countBufferOffset-00556", + "text": " countBufferOffset must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-stride-00557", + "text": " stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndirectCommand)" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-maxDrawCount-00558", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-firstInstance-00559", + "text": " If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the VkDrawIndexedIndirectCommand structures accessed by this command must be 0" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-renderPass-00560", + "text": " The current render pass must be &amp;lt;&amp;lt;renderpass-compatibility,compatible&amp;gt;&amp;gt; with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS." + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-subpass-00561", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-00562", + "text": " For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-00563", + "text": " For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS, a push constant value must have been set for VK_PIPELINE_BIND_POINT_GRAPHICS, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-00564", + "text": " Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-00565", + "text": " All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point’s interface must have valid buffers bound" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-00566", + "text": " A valid graphics pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_GRAPHICS" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-00567", + "text": " If the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS requires any dynamic state, that state must have been set on the current command buffer" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-00568", + "text": " If count stored in countBuffer is equal to 1, (offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-00569", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-drawCount-00570", + "text": " drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-00571", + "text": " Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-00572", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-00573", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-00574", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-00575", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-00576", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-linearTilingFeatures-00577", + "text": " Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-None-01504", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-countBuffer-parameter", + "text": " countBuffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-renderpass", + "text": " This command must only be called inside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-commonparent", + "text": " Each of buffer, commandBuffer, and countBuffer must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_AMD_draw_indirect_count)+(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-maxMultiviewInstanceIndex-00578", + "text": " 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." + } + ], + "(VK_AMD_draw_indirect_count)+(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01865", + "text": " If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer." + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01866", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer." + }, + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-commandBuffer-01867", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage other than the framebuffer-space pipeline stages in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_GRAPHICS reads from or writes to any image or buffer, the image or buffer must not be a protected image or protected buffer." + } + ], + "(VK_AMD_draw_indirect_count)+(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-vkCmdDrawIndexedIndirectCountAMD-sampleLocationsEnable-01517", + "text": " 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" + } + ] + }, + "VkPipelineVertexInputStateCreateInfo": { + "core": [ + { + "vuid": "VUID-VkPipelineVertexInputStateCreateInfo-vertexBindingDescriptionCount-00613", + "text": " vertexBindingDescriptionCount must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings" + }, + { + "vuid": "VUID-VkPipelineVertexInputStateCreateInfo-vertexAttributeDescriptionCount-00614", + "text": " vertexAttributeDescriptionCount must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributes" + }, + { + "vuid": "VUID-VkPipelineVertexInputStateCreateInfo-binding-00615", + "text": " For every binding specified by each element of pVertexAttributeDescriptions, a VkVertexInputBindingDescription must exist in pVertexBindingDescriptions with the same value of binding" + }, + { + "vuid": "VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-00616", + "text": " All elements of pVertexBindingDescriptions must describe distinct binding numbers" + }, + { + "vuid": "VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-00617", + "text": " All elements of pVertexAttributeDescriptions must describe distinct attribute locations" + }, + { + "vuid": "VUID-VkPipelineVertexInputStateCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineVertexInputStateCreateInfo-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkPipelineVertexInputDivisorStateCreateInfoEXT" + }, + { + "vuid": "VUID-VkPipelineVertexInputStateCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-parameter", + "text": " If vertexBindingDescriptionCount is not 0, pVertexBindingDescriptions must be a valid pointer to an array of vertexBindingDescriptionCount valid VkVertexInputBindingDescription structures" + }, + { + "vuid": "VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-parameter", + "text": " If vertexAttributeDescriptionCount is not 0, pVertexAttributeDescriptions must be a valid pointer to an array of vertexAttributeDescriptionCount valid VkVertexInputAttributeDescription structures" + } + ] + }, + "VkVertexInputBindingDescription": { + "core": [ + { + "vuid": "VUID-VkVertexInputBindingDescription-binding-00618", + "text": " binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings" + }, + { + "vuid": "VUID-VkVertexInputBindingDescription-stride-00619", + "text": " stride must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindingStride" + }, + { + "vuid": "VUID-VkVertexInputBindingDescription-inputRate-parameter", + "text": " inputRate must be a valid VkVertexInputRate value" + } + ] + }, + "VkVertexInputAttributeDescription": { + "core": [ + { + "vuid": "VUID-VkVertexInputAttributeDescription-location-00620", + "text": " location must be less than VkPhysicalDeviceLimits::maxVertexInputAttributes" + }, + { + "vuid": "VUID-VkVertexInputAttributeDescription-binding-00621", + "text": " binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings" + }, + { + "vuid": "VUID-VkVertexInputAttributeDescription-offset-00622", + "text": " offset must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributeOffset" + }, + { + "vuid": "VUID-VkVertexInputAttributeDescription-format-00623", + "text": " 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" + }, + { + "vuid": "VUID-VkVertexInputAttributeDescription-format-parameter", + "text": " format must be a valid VkFormat value" + } + ] + }, + "vkCmdBindVertexBuffers": { + "core": [ + { + "vuid": "VUID-vkCmdBindVertexBuffers-firstBinding-00624", + "text": " firstBinding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings" + }, + { + "vuid": "VUID-vkCmdBindVertexBuffers-firstBinding-00625", + "text": " The sum of firstBinding and bindingCount must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings" + }, + { + "vuid": "VUID-vkCmdBindVertexBuffers-pOffsets-00626", + "text": " All elements of pOffsets must be less than the size of the corresponding element in pBuffers" + }, + { + "vuid": "VUID-vkCmdBindVertexBuffers-pBuffers-00627", + "text": " All elements of pBuffers must have been created with the VK_BUFFER_USAGE_VERTEX_BUFFER_BIT flag" + }, + { + "vuid": "VUID-vkCmdBindVertexBuffers-pBuffers-00628", + "text": " Each element of pBuffers that is non-sparse must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdBindVertexBuffers-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdBindVertexBuffers-pBuffers-parameter", + "text": " pBuffers must be a valid pointer to an array of bindingCount valid VkBuffer handles" + }, + { + "vuid": "VUID-vkCmdBindVertexBuffers-pOffsets-parameter", + "text": " pOffsets must be a valid pointer to an array of bindingCount VkDeviceSize values" + }, + { + "vuid": "VUID-vkCmdBindVertexBuffers-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdBindVertexBuffers-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdBindVertexBuffers-bindingCount-arraylength", + "text": " bindingCount must be greater than 0" + }, + { + "vuid": "VUID-vkCmdBindVertexBuffers-commonparent", + "text": " Both of commandBuffer, and the elements of pBuffers must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "VkPipelineVertexInputDivisorStateCreateInfoEXT": { + "(VK_EXT_vertex_attribute_divisor)": [ + { + "vuid": "VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-pVertexBindingDivisors-parameter", + "text": " pVertexBindingDivisors must be a valid pointer to an array of vertexBindingDivisorCount VkVertexInputBindingDivisorDescriptionEXT structures" + }, + { + "vuid": "VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-vertexBindingDivisorCount-arraylength", + "text": " vertexBindingDivisorCount must be greater than 0" + } + ] + }, + "VkVertexInputBindingDivisorDescriptionEXT": { + "(VK_EXT_vertex_attribute_divisor)": [ + { + "vuid": "VUID-VkVertexInputBindingDivisorDescriptionEXT-binding-01869", + "text": " binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings" + }, + { + "vuid": "VUID-VkVertexInputBindingDivisorDescriptionEXT-divisor-01870", + "text": " divisor must be a value between 0 and VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::maxVertexAttribDivisor, inclusive." + }, + { + "vuid": "VUID-VkVertexInputBindingDivisorDescriptionEXT-inputRate-01871", + "text": " VkVertexInputBindingDescription::inputRate must be of type VK_VERTEX_INPUT_RATE_INSTANCE for this binding." + } + ] + }, + "VkPipelineTessellationStateCreateInfo": { + "core": [ + { + "vuid": "VUID-VkPipelineTessellationStateCreateInfo-patchControlPoints-01214", + "text": " patchControlPoints must be greater than zero and less than or equal to VkPhysicalDeviceLimits::maxTessellationPatchSize" + }, + { + "vuid": "VUID-VkPipelineTessellationStateCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineTessellationStateCreateInfo-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkPipelineTessellationDomainOriginStateCreateInfo" + }, + { + "vuid": "VUID-VkPipelineTessellationStateCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "VkPipelineTessellationDomainOriginStateCreateInfo": { + "(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-VkPipelineTessellationDomainOriginStateCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineTessellationDomainOriginStateCreateInfo-domainOrigin-parameter", + "text": " domainOrigin must be a valid VkTessellationDomainOrigin value" + } + ] + }, + "VkPipelineViewportSwizzleStateCreateInfoNV": { + "(VK_NV_viewport_swizzle)": [ + { + "vuid": "VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-01215", + "text": " viewportCount must match the viewportCount set in VkPipelineViewportStateCreateInfo" + }, + { + "vuid": "VUID-VkPipelineViewportSwizzleStateCreateInfoNV-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV" + }, + { + "vuid": "VUID-VkPipelineViewportSwizzleStateCreateInfoNV-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-arraylength", + "text": " viewportCount must be greater than 0" + } + ] + }, + "VkViewportSwizzleNV": { + "(VK_NV_viewport_swizzle)": [ + { + "vuid": "VUID-VkViewportSwizzleNV-x-parameter", + "text": " x must be a valid VkViewportCoordinateSwizzleNV value" + }, + { + "vuid": "VUID-VkViewportSwizzleNV-y-parameter", + "text": " y must be a valid VkViewportCoordinateSwizzleNV value" + }, + { + "vuid": "VUID-VkViewportSwizzleNV-z-parameter", + "text": " z must be a valid VkViewportCoordinateSwizzleNV value" + }, + { + "vuid": "VUID-VkViewportSwizzleNV-w-parameter", + "text": " w must be a valid VkViewportCoordinateSwizzleNV value" + } + ] + }, + "VkPipelineViewportWScalingStateCreateInfoNV": { + "(VK_NV_clip_space_w_scaling)": [ + { + "vuid": "VUID-VkPipelineViewportWScalingStateCreateInfoNV-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV" + }, + { + "vuid": "VUID-VkPipelineViewportWScalingStateCreateInfoNV-viewportCount-arraylength", + "text": " viewportCount must be greater than 0" + } + ] + }, + "vkCmdSetViewportWScalingNV": { + "(VK_NV_clip_space_w_scaling)": [ + { + "vuid": "VUID-vkCmdSetViewportWScalingNV-None-01322", + "text": " The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV dynamic state enabled" + }, + { + "vuid": "VUID-vkCmdSetViewportWScalingNV-firstViewport-01323", + "text": " firstViewport must be less than VkPhysicalDeviceLimits::maxViewports" + }, + { + "vuid": "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324", + "text": " The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive" + }, + { + "vuid": "VUID-vkCmdSetViewportWScalingNV-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetViewportWScalingNV-pViewportWScalings-parameter", + "text": " pViewportWScalings must be a valid pointer to an array of viewportCount VkViewportWScalingNV structures" + }, + { + "vuid": "VUID-vkCmdSetViewportWScalingNV-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetViewportWScalingNV-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdSetViewportWScalingNV-viewportCount-arraylength", + "text": " viewportCount must be greater than 0" + } + ] + }, + "VkPipelineViewportStateCreateInfo": { + "core": [ + { + "vuid": "VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216", + "text": " If the multiple viewports feature is not enabled, viewportCount must be 1" + }, + { + "vuid": "VUID-VkPipelineViewportStateCreateInfo-scissorCount-01217", + "text": " If the multiple viewports feature is not enabled, scissorCount must be 1" + }, + { + "vuid": "VUID-VkPipelineViewportStateCreateInfo-viewportCount-01218", + "text": " viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive" + }, + { + "vuid": "VUID-VkPipelineViewportStateCreateInfo-scissorCount-01219", + "text": " scissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive" + }, + { + "vuid": "VUID-VkPipelineViewportStateCreateInfo-scissorCount-01220", + "text": " scissorCount and viewportCount must be identical" + }, + { + "vuid": "VUID-VkPipelineViewportStateCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineViewportStateCreateInfo-pNext-pNext", + "text": " 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 VkPipelineViewportSwizzleStateCreateInfoNV or VkPipelineViewportWScalingStateCreateInfoNV" + }, + { + "vuid": "VUID-VkPipelineViewportStateCreateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkPipelineViewportStateCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength", + "text": " viewportCount must be greater than 0" + }, + { + "vuid": "VUID-VkPipelineViewportStateCreateInfo-scissorCount-arraylength", + "text": " scissorCount must be greater than 0" + } + ], + "(VK_NV_clip_space_w_scaling)": [ + { + "vuid": "VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726", + "text": " If the viewportWScalingEnable member of a VkPipelineViewportWScalingStateCreateInfoNV structure chained to the pNext chain is VK_TRUE, the viewportCount member of the VkPipelineViewportWScalingStateCreateInfoNV structure must be equal to viewportCount" + } + ] + }, + "vkCmdSetViewport": { + "core": [ + { + "vuid": "VUID-vkCmdSetViewport-None-01221", + "text": " The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_VIEWPORT dynamic state enabled" + }, + { + "vuid": "VUID-vkCmdSetViewport-firstViewport-01222", + "text": " firstViewport must be less than VkPhysicalDeviceLimits::maxViewports" + }, + { + "vuid": "VUID-vkCmdSetViewport-firstViewport-01223", + "text": " The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive" + }, + { + "vuid": "VUID-vkCmdSetViewport-firstViewport-01224", + "text": " If the multiple viewports feature is not enabled, firstViewport must be 0" + }, + { + "vuid": "VUID-vkCmdSetViewport-viewportCount-01225", + "text": " If the multiple viewports feature is not enabled, viewportCount must be 1" + }, + { + "vuid": "VUID-vkCmdSetViewport-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetViewport-pViewports-parameter", + "text": " pViewports must be a valid pointer to an array of viewportCount VkViewport structures" + }, + { + "vuid": "VUID-vkCmdSetViewport-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetViewport-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdSetViewport-viewportCount-arraylength", + "text": " viewportCount must be greater than 0" + } + ] + }, + "VkViewport": { + "core": [ + { + "vuid": "VUID-VkViewport-width-01770", + "text": " width must be greater than 0.0" + }, + { + "vuid": "VUID-VkViewport-width-01771", + "text": " width must be less than or equal to VkPhysicalDeviceLimits::maxViewportDimensions[0]" + }, + { + "vuid": "VUID-VkViewport-height-01773", + "text": " The absolute value of height must be less than or equal to VkPhysicalDeviceLimits::maxViewportDimensions[1]" + }, + { + "vuid": "VUID-VkViewport-x-01774", + "text": " x must be greater than or equal to viewportBoundsRange[0]" + }, + { + "vuid": "VUID-VkViewport-x-01232", + "text": " (x + width) must be less than or equal to viewportBoundsRange[1]" + }, + { + "vuid": "VUID-VkViewport-y-01775", + "text": " y must be greater than or equal to viewportBoundsRange[0]" + }, + { + "vuid": "VUID-VkViewport-y-01233", + "text": " (y + height) must be less than or equal to viewportBoundsRange[1]" + } + ], + "!(VK_VERSION_1_1,VK_KHR_maintenance1,VK_AMD_negative_viewport_height)": [ + { + "vuid": "VUID-VkViewport-height-01772", + "text": " height must be greater than 0.0" + } + ], + "(VK_VERSION_1_1,VK_KHR_maintenance1,VK_AMD_negative_viewport_height)": [ + { + "vuid": "VUID-VkViewport-y-01776", + "text": " y must be less than or equal to viewportBoundsRange[1]" + }, + { + "vuid": "VUID-VkViewport-y-01777", + "text": " (y + height) must be greater than or equal to viewportBoundsRange[0]" + } + ], + "(VK_EXT_depth_range_unrestricted)": [ + { + "vuid": "VUID-VkViewport-minDepth-01234", + "text": " Unless VK_EXT_depth_range_unrestricted extension is enabled minDepth must be between 0.0 and 1.0, inclusive" + }, + { + "vuid": "VUID-VkViewport-maxDepth-01235", + "text": " Unless VK_EXT_depth_range_unrestricted extension is enabled maxDepth must be between 0.0 and 1.0, inclusive" + } + ], + "!(VK_EXT_depth_range_unrestricted)": [ + { + "vuid": "VUID-VkViewport-minDepth-01234", + "text": " minDepth must be between 0.0 and 1.0, inclusive" + }, + { + "vuid": "VUID-VkViewport-maxDepth-01235", + "text": " maxDepth must be between 0.0 and 1.0, inclusive" + } + ] + }, + "VkPipelineRasterizationStateCreateInfo": { + "core": [ + { + "vuid": "VUID-VkPipelineRasterizationStateCreateInfo-depthClampEnable-00782", + "text": " If the &amp;lt;&amp;lt;features-features-depthClamp,depth clamping&amp;gt;&amp;gt; feature is not enabled, depthClampEnable must be VK_FALSE" + }, + { + "vuid": "VUID-VkPipelineRasterizationStateCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineRasterizationStateCreateInfo-pNext-pNext", + "text": " 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 or VkPipelineRasterizationStateRasterizationOrderAMD" + }, + { + "vuid": "VUID-VkPipelineRasterizationStateCreateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkPipelineRasterizationStateCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-parameter", + "text": " polygonMode must be a valid VkPolygonMode value" + }, + { + "vuid": "VUID-VkPipelineRasterizationStateCreateInfo-cullMode-parameter", + "text": " cullMode must be a valid combination of VkCullModeFlagBits values" + }, + { + "vuid": "VUID-VkPipelineRasterizationStateCreateInfo-frontFace-parameter", + "text": " frontFace must be a valid VkFrontFace value" + } + ], + "!(VK_NV_fill_rectangle)": [ + { + "vuid": "VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01413", + "text": " If the &amp;lt;&amp;lt;features-features-fillModeNonSolid,non-solid fill modes&amp;gt;&amp;gt; feature is not enabled, polygonMode must be VK_POLYGON_MODE_FILL" + } + ], + "(VK_NV_fill_rectangle)": [ + { + "vuid": "VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01507", + "text": " If the &amp;lt;&amp;lt;features-features-fillModeNonSolid,non-solid fill modes&amp;gt;&amp;gt; feature is not enabled, polygonMode must be VK_POLYGON_MODE_FILL or VK_POLYGON_MODE_FILL_RECTANGLE_NV" + }, + { + "vuid": "VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01414", + "text": " If the VK_NV_fill_rectangle extension is not enabled, polygonMode must not be VK_POLYGON_MODE_FILL_RECTANGLE_NV" + } + ] + }, + "VkPipelineMultisampleStateCreateInfo": { + "core": [ + { + "vuid": "VUID-VkPipelineMultisampleStateCreateInfo-sampleShadingEnable-00784", + "text": " If the &amp;lt;&amp;lt;features-features-sampleRateShading,sample rate shading&amp;gt;&amp;gt; feature is not enabled, sampleShadingEnable must be VK_FALSE" + }, + { + "vuid": "VUID-VkPipelineMultisampleStateCreateInfo-alphaToOneEnable-00785", + "text": " If the &amp;lt;&amp;lt;features-features-alphaToOne,alpha to one&amp;gt;&amp;gt; feature is not enabled, alphaToOneEnable must be VK_FALSE" + }, + { + "vuid": "VUID-VkPipelineMultisampleStateCreateInfo-minSampleShading-00786", + "text": " minSampleShading must be in the range [0,1]" + }, + { + "vuid": "VUID-VkPipelineMultisampleStateCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineMultisampleStateCreateInfo-pNext-pNext", + "text": " 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, VkPipelineCoverageToColorStateCreateInfoNV, or VkPipelineSampleLocationsStateCreateInfoEXT" + }, + { + "vuid": "VUID-VkPipelineMultisampleStateCreateInfo-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkPipelineMultisampleStateCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-parameter", + "text": " rasterizationSamples must be a valid VkSampleCountFlagBits value" + }, + { + "vuid": "VUID-VkPipelineMultisampleStateCreateInfo-pSampleMask-parameter", + "text": " If pSampleMask is not NULL, pSampleMask must be a valid pointer to an array of \\(\\lceil{\\mathit{rasterizationSamples} \\over 32}\\rceil\\) VkSampleMask values" + } + ], + "(VK_NV_framebuffer_mixed_samples)": [ + { + "vuid": "VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-01415", + "text": " If the subpass has any color attachments and rasterizationSamples is greater than the number of color samples, then sampleShadingEnable must be VK_FALSE" + } + ] + }, + "VkPipelineRasterizationStateRasterizationOrderAMD": { + "(VK_AMD_rasterization_order)": [ + { + "vuid": "VUID-VkPipelineRasterizationStateRasterizationOrderAMD-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD" + }, + { + "vuid": "VUID-VkPipelineRasterizationStateRasterizationOrderAMD-rasterizationOrder-parameter", + "text": " rasterizationOrder must be a valid VkRasterizationOrderAMD value" + } + ] + }, + "VkPipelineSampleLocationsStateCreateInfoEXT": { + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sampleLocationsInfo-parameter", + "text": " sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure" + } + ] + }, + "VkSampleLocationsInfoEXT": { + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-01526", + "text": " sampleLocationsPerPixel must be a bit value that is set in VkPhysicalDeviceSampleLocationsPropertiesEXT::sampleLocationSampleCounts" + }, + { + "vuid": "VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527", + "text": " sampleLocationsCount must equal sampleLocationsPerPixel {times} sampleLocationGridSize.width {times} sampleLocationGridSize.height" + }, + { + "vuid": "VUID-VkSampleLocationsInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT" + }, + { + "vuid": "VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-parameter", + "text": " sampleLocationsPerPixel must be a valid VkSampleCountFlagBits value" + }, + { + "vuid": "VUID-VkSampleLocationsInfoEXT-pSampleLocations-parameter", + "text": " pSampleLocations must be a valid pointer to an array of sampleLocationsCount VkSampleLocationEXT structures" + }, + { + "vuid": "VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-arraylength", + "text": " sampleLocationsCount must be greater than 0" + } + ] + }, + "vkCmdSetSampleLocationsEXT": { + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-vkCmdSetSampleLocationsEXT-None-01528", + "text": " The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT dynamic state enabled" + }, + { + "vuid": "VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529", + "text": " The sampleLocationsPerPixel member of pSampleLocationsInfo must equal the rasterizationSamples member of the VkPipelineMultisampleStateCreateInfo structure the bound graphics pipeline has been created with" + }, + { + "vuid": "VUID-vkCmdSetSampleLocationsEXT-variableSampleLocations-01530", + "text": " 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" + }, + { + "vuid": "VUID-vkCmdSetSampleLocationsEXT-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetSampleLocationsEXT-pSampleLocationsInfo-parameter", + "text": " pSampleLocationsInfo must be a valid pointer to a valid VkSampleLocationsInfoEXT structure" + }, + { + "vuid": "VUID-vkCmdSetSampleLocationsEXT-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetSampleLocationsEXT-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + } + ] + }, + "vkCmdSetLineWidth": { + "core": [ + { + "vuid": "VUID-vkCmdSetLineWidth-None-00787", + "text": " The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_LINE_WIDTH dynamic state enabled" + }, + { + "vuid": "VUID-vkCmdSetLineWidth-lineWidth-00788", + "text": " If the wide lines feature is not enabled, lineWidth must be 1.0" + }, + { + "vuid": "VUID-vkCmdSetLineWidth-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetLineWidth-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetLineWidth-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + } + ] + }, + "vkCmdSetDepthBias": { + "core": [ + { + "vuid": "VUID-vkCmdSetDepthBias-None-00789", + "text": " The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DEPTH_BIAS dynamic state enabled" + }, + { + "vuid": "VUID-vkCmdSetDepthBias-depthBiasClamp-00790", + "text": " If the depth bias clamping feature is not enabled, depthBiasClamp must be 0.0" + }, + { + "vuid": "VUID-vkCmdSetDepthBias-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetDepthBias-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetDepthBias-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + } + ] + }, + "VkPipelineRasterizationConservativeStateCreateInfoEXT": { + "(VK_EXT_conservative_rasterization)": [ + { + "vuid": "VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-extraPrimitiveOverestimationSize-01769", + "text": " extraPrimitiveOverestimationSize must be in the range of 0.0 to VkPhysicalDeviceConservativeRasterizationPropertiesEXT::maxExtraPrimitiveOverestimationSize inclusive" + }, + { + "vuid": "VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-conservativeRasterizationMode-parameter", + "text": " conservativeRasterizationMode must be a valid VkConservativeRasterizationModeEXT value" + } + ] + }, + "VkPipelineDiscardRectangleStateCreateInfoEXT": { + "(VK_EXT_discard_rectangles)": [ + { + "vuid": "VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleCount-00582", + "text": " discardRectangleCount must be between 0 and VkPhysicalDeviceDiscardRectanglePropertiesEXT::maxDiscardRectangles, inclusive" + }, + { + "vuid": "VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleMode-parameter", + "text": " discardRectangleMode must be a valid VkDiscardRectangleModeEXT value" + } + ] + }, + "vkCmdSetDiscardRectangleEXT": { + "(VK_EXT_discard_rectangles)": [ + { + "vuid": "VUID-vkCmdSetDiscardRectangleEXT-None-00583", + "text": " The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT dynamic state enabled" + }, + { + "vuid": "VUID-vkCmdSetDiscardRectangleEXT-firstDiscardRectangle-00585", + "text": " The sum of firstDiscardRectangle and discardRectangleCount must be less than or equal to VkPhysicalDeviceDiscardRectanglePropertiesEXT::maxDiscardRectangles" + }, + { + "vuid": "VUID-vkCmdSetDiscardRectangleEXT-x-00587", + "text": " The x and y member of offset in each VkRect2D element of pDiscardRectangles must be greater than or equal to 0" + }, + { + "vuid": "VUID-vkCmdSetDiscardRectangleEXT-offset-00588", + "text": " Evaluation of (offset.x + extent.width) in each VkRect2D element of pDiscardRectangles must not cause a signed integer addition overflow" + }, + { + "vuid": "VUID-vkCmdSetDiscardRectangleEXT-offset-00589", + "text": " Evaluation of (offset.y + extent.height) in each VkRect2D element of pDiscardRectangles must not cause a signed integer addition overflow" + }, + { + "vuid": "VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetDiscardRectangleEXT-pDiscardRectangles-parameter", + "text": " pDiscardRectangles must be a valid pointer to an array of discardRectangleCount VkRect2D structures" + }, + { + "vuid": "VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdSetDiscardRectangleEXT-discardRectangleCount-arraylength", + "text": " discardRectangleCount must be greater than 0" + } + ] + }, + "vkCmdSetScissor": { + "core": [ + { + "vuid": "VUID-vkCmdSetScissor-None-00590", + "text": " The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_SCISSOR dynamic state enabled" + }, + { + "vuid": "VUID-vkCmdSetScissor-firstScissor-00591", + "text": " firstScissor must be less than VkPhysicalDeviceLimits::maxViewports" + }, + { + "vuid": "VUID-vkCmdSetScissor-firstScissor-00592", + "text": " The sum of firstScissor and scissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive" + }, + { + "vuid": "VUID-vkCmdSetScissor-firstScissor-00593", + "text": " If the multiple viewports feature is not enabled, firstScissor must be 0" + }, + { + "vuid": "VUID-vkCmdSetScissor-scissorCount-00594", + "text": " If the multiple viewports feature is not enabled, scissorCount must be 1" + }, + { + "vuid": "VUID-vkCmdSetScissor-x-00595", + "text": " The x and y members of offset must be greater than or equal to 0" + }, + { + "vuid": "VUID-vkCmdSetScissor-offset-00596", + "text": " Evaluation of (offset.x + extent.width) must not cause a signed integer addition overflow" + }, + { + "vuid": "VUID-vkCmdSetScissor-offset-00597", + "text": " Evaluation of (offset.y + extent.height) must not cause a signed integer addition overflow" + }, + { + "vuid": "VUID-vkCmdSetScissor-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetScissor-pScissors-parameter", + "text": " pScissors must be a valid pointer to an array of scissorCount VkRect2D structures" + }, + { + "vuid": "VUID-vkCmdSetScissor-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetScissor-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + }, + { + "vuid": "VUID-vkCmdSetScissor-scissorCount-arraylength", + "text": " scissorCount must be greater than 0" + } + ] + }, + "VkPipelineDepthStencilStateCreateInfo": { + "core": [ + { + "vuid": "VUID-VkPipelineDepthStencilStateCreateInfo-depthBoundsTestEnable-00598", + "text": " If the &amp;lt;&amp;lt;features-features-depthBounds,depth bounds testing&amp;gt;&amp;gt; feature is not enabled, depthBoundsTestEnable must be VK_FALSE" + }, + { + "vuid": "VUID-VkPipelineDepthStencilStateCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineDepthStencilStateCreateInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkPipelineDepthStencilStateCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineDepthStencilStateCreateInfo-depthCompareOp-parameter", + "text": " depthCompareOp must be a valid VkCompareOp value" + }, + { + "vuid": "VUID-VkPipelineDepthStencilStateCreateInfo-front-parameter", + "text": " front must be a valid VkStencilOpState structure" + }, + { + "vuid": "VUID-VkPipelineDepthStencilStateCreateInfo-back-parameter", + "text": " back must be a valid VkStencilOpState structure" + } + ] + }, + "vkCmdSetDepthBounds": { + "core": [ + { + "vuid": "VUID-vkCmdSetDepthBounds-None-00599", + "text": " The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_DEPTH_BOUNDS dynamic state enabled" + }, + { + "vuid": "VUID-vkCmdSetDepthBounds-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetDepthBounds-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetDepthBounds-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + } + ], + "(VK_EXT_depth_range_unrestricted)": [ + { + "vuid": "VUID-vkCmdSetDepthBounds-minDepthBounds-00600", + "text": " Unless the VK_EXT_depth_range_unrestricted extension is enabled minDepthBounds must be between 0.0 and 1.0, inclusive" + }, + { + "vuid": "VUID-vkCmdSetDepthBounds-maxDepthBounds-00601", + "text": " Unless the VK_EXT_depth_range_unrestricted extension is enabled maxDepthBounds must be between 0.0 and 1.0, inclusive" + } + ], + "!(VK_EXT_depth_range_unrestricted)": [ + { + "vuid": "VUID-vkCmdSetDepthBounds-minDepthBounds-00600", + "text": " minDepthBounds must be between 0.0 and 1.0, inclusive" + }, + { + "vuid": "VUID-vkCmdSetDepthBounds-maxDepthBounds-00601", + "text": " maxDepthBounds must be between 0.0 and 1.0, inclusive" + } + ] + }, + "VkStencilOpState": { + "core": [ + { + "vuid": "VUID-VkStencilOpState-failOp-parameter", + "text": " failOp must be a valid VkStencilOp value" + }, + { + "vuid": "VUID-VkStencilOpState-passOp-parameter", + "text": " passOp must be a valid VkStencilOp value" + }, + { + "vuid": "VUID-VkStencilOpState-depthFailOp-parameter", + "text": " depthFailOp must be a valid VkStencilOp value" + }, + { + "vuid": "VUID-VkStencilOpState-compareOp-parameter", + "text": " compareOp must be a valid VkCompareOp value" + } + ] + }, + "vkCmdSetStencilCompareMask": { + "core": [ + { + "vuid": "VUID-vkCmdSetStencilCompareMask-None-00602", + "text": " The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK dynamic state enabled" + }, + { + "vuid": "VUID-vkCmdSetStencilCompareMask-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetStencilCompareMask-faceMask-parameter", + "text": " faceMask must be a valid combination of VkStencilFaceFlagBits values" + }, + { + "vuid": "VUID-vkCmdSetStencilCompareMask-faceMask-requiredbitmask", + "text": " faceMask must not be 0" + }, + { + "vuid": "VUID-vkCmdSetStencilCompareMask-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetStencilCompareMask-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + } + ] + }, + "vkCmdSetStencilWriteMask": { + "core": [ + { + "vuid": "VUID-vkCmdSetStencilWriteMask-None-00603", + "text": " The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_WRITE_MASK dynamic state enabled" + }, + { + "vuid": "VUID-vkCmdSetStencilWriteMask-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetStencilWriteMask-faceMask-parameter", + "text": " faceMask must be a valid combination of VkStencilFaceFlagBits values" + }, + { + "vuid": "VUID-vkCmdSetStencilWriteMask-faceMask-requiredbitmask", + "text": " faceMask must not be 0" + }, + { + "vuid": "VUID-vkCmdSetStencilWriteMask-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetStencilWriteMask-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + } + ] + }, + "vkCmdSetStencilReference": { + "core": [ + { + "vuid": "VUID-vkCmdSetStencilReference-None-00604", + "text": " The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_STENCIL_REFERENCE dynamic state enabled" + }, + { + "vuid": "VUID-vkCmdSetStencilReference-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetStencilReference-faceMask-parameter", + "text": " faceMask must be a valid combination of VkStencilFaceFlagBits values" + }, + { + "vuid": "VUID-vkCmdSetStencilReference-faceMask-requiredbitmask", + "text": " faceMask must not be 0" + }, + { + "vuid": "VUID-vkCmdSetStencilReference-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetStencilReference-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + } + ] + }, + "VkPipelineCoverageToColorStateCreateInfoNV": { + "(VK_NV_fragment_coverage_to_color)": [ + { + "vuid": "VUID-VkPipelineCoverageToColorStateCreateInfoNV-coverageToColorEnable-01404", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineCoverageToColorStateCreateInfoNV-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV" + }, + { + "vuid": "VUID-VkPipelineCoverageToColorStateCreateInfoNV-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "VkPipelineCoverageModulationStateCreateInfoNV": { + "(VK_NV_framebuffer_mixed_samples)": [ + { + "vuid": "VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableEnable-01405", + "text": " 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." + }, + { + "vuid": "VUID-VkPipelineCoverageModulationStateCreateInfoNV-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV" + }, + { + "vuid": "VUID-VkPipelineCoverageModulationStateCreateInfoNV-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationMode-parameter", + "text": " coverageModulationMode must be a valid VkCoverageModulationModeNV value" + }, + { + "vuid": "VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableCount-arraylength", + "text": " coverageModulationTableCount must be greater than 0" + } + ] + }, + "VkPipelineColorBlendStateCreateInfo": { + "core": [ + { + "vuid": "VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605", + "text": " If the &amp;lt;&amp;lt;features-features-independentBlend,independent blending&amp;gt;&amp;gt; feature is not enabled, all elements of pAttachments must be identical" + }, + { + "vuid": "VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00606", + "text": " If the &amp;lt;&amp;lt;features-features-logicOp,logic operations&amp;gt;&amp;gt; feature is not enabled, logicOpEnable must be VK_FALSE" + }, + { + "vuid": "VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00607", + "text": " If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value" + }, + { + "vuid": "VUID-VkPipelineColorBlendStateCreateInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO" + }, + { + "vuid": "VUID-VkPipelineColorBlendStateCreateInfo-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkPipelineColorBlendAdvancedStateCreateInfoEXT" + }, + { + "vuid": "VUID-VkPipelineColorBlendStateCreateInfo-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-parameter", + "text": " If attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkPipelineColorBlendAttachmentState structures" + } + ] + }, + "VkPipelineColorBlendAttachmentState": { + "core": [ + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-srcColorBlendFactor-00608", + "text": " If the &amp;lt;&amp;lt;features-features-dualSrcBlend,dual source blending&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-dstColorBlendFactor-00609", + "text": " If the &amp;lt;&amp;lt;features-features-dualSrcBlend,dual source blending&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-srcAlphaBlendFactor-00610", + "text": " If the &amp;lt;&amp;lt;features-features-dualSrcBlend,dual source blending&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-dstAlphaBlendFactor-00611", + "text": " If the &amp;lt;&amp;lt;features-features-dualSrcBlend,dual source blending&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-srcColorBlendFactor-parameter", + "text": " srcColorBlendFactor must be a valid VkBlendFactor value" + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-dstColorBlendFactor-parameter", + "text": " dstColorBlendFactor must be a valid VkBlendFactor value" + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-parameter", + "text": " colorBlendOp must be a valid VkBlendOp value" + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-srcAlphaBlendFactor-parameter", + "text": " srcAlphaBlendFactor must be a valid VkBlendFactor value" + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-dstAlphaBlendFactor-parameter", + "text": " dstAlphaBlendFactor must be a valid VkBlendFactor value" + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-alphaBlendOp-parameter", + "text": " alphaBlendOp must be a valid VkBlendOp value" + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-colorWriteMask-parameter", + "text": " colorWriteMask must be a valid combination of VkColorComponentFlagBits values" + } + ], + "(VK_EXT_blend_operation_advanced)": [ + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-01406", + "text": " If either of colorBlendOp or alphaBlendOp is an &amp;lt;&amp;lt;framebuffer-blend-advanced,advanced blend operation&amp;gt;&amp;gt;, then colorBlendOp must equal alphaBlendOp" + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01407", + "text": " If VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::advancedBlendIndependentBlend is VK_FALSE and colorBlendOp is an &amp;lt;&amp;lt;framebuffer-blend-advanced,advanced blend operation&amp;gt;&amp;gt;, then colorBlendOp must be the same for all attachments." + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01408", + "text": " If VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::advancedBlendIndependentBlend is VK_FALSE and alphaBlendOp is an &amp;lt;&amp;lt;framebuffer-blend-advanced,advanced blend operation&amp;gt;&amp;gt;, then alphaBlendOp must be the same for all attachments." + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-advancedBlendAllOperations-01409", + "text": " 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" + }, + { + "vuid": "VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-01410", + "text": " If colorBlendOp or alphaBlendOp is an &amp;lt;&amp;lt;framebuffer-blend-advanced,advanced blend operation&amp;gt;&amp;gt;, then VkSubpassDescription::colorAttachmentCount of the subpass this pipeline is compiled against must be less than or equal to VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::advancedBlendMaxColorAttachments" + } + ] + }, + "vkCmdSetBlendConstants": { + "core": [ + { + "vuid": "VUID-vkCmdSetBlendConstants-None-00612", + "text": " The bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_BLEND_CONSTANTS dynamic state enabled" + }, + { + "vuid": "VUID-vkCmdSetBlendConstants-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdSetBlendConstants-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdSetBlendConstants-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics operations" + } + ] + }, + "VkPipelineColorBlendAdvancedStateCreateInfoEXT": { + "(VK_EXT_blend_operation_advanced)": [ + { + "vuid": "VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-srcPremultiplied-01424", + "text": " If the &amp;lt;&amp;lt;features-limits-advancedBlendNonPremultipliedSrcColor,non-premultiplied source color&amp;gt;&amp;gt; property is not supported, srcPremultiplied must be VK_TRUE" + }, + { + "vuid": "VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-dstPremultiplied-01425", + "text": " If the &amp;lt;&amp;lt;features-limits-advancedBlendNonPremultipliedDstColor,non-premultiplied destination color&amp;gt;&amp;gt; property is not supported, dstPremultiplied must be VK_TRUE" + }, + { + "vuid": "VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-01426", + "text": " If the &amp;lt;&amp;lt;features-limits-advancedBlendCorrelatedOverlap,correlated overlap&amp;gt;&amp;gt; property is not supported, blendOverlap must be VK_BLEND_OVERLAP_UNCORRELATED_EXT" + }, + { + "vuid": "VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-parameter", + "text": " blendOverlap must be a valid VkBlendOverlapEXT value" + } + ] + }, + "vkCmdDispatch": { + "core": [ + { + "vuid": "VUID-vkCmdDispatch-groupCountX-00386", + "text": " groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]" + }, + { + "vuid": "VUID-vkCmdDispatch-groupCountY-00387", + "text": " groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]" + }, + { + "vuid": "VUID-vkCmdDispatch-groupCountZ-00388", + "text": " groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]" + }, + { + "vuid": "VUID-vkCmdDispatch-None-00389", + "text": " For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDispatch-None-00390", + "text": " Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline" + }, + { + "vuid": "VUID-vkCmdDispatch-None-00391", + "text": " A valid compute pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_COMPUTE" + }, + { + "vuid": "VUID-vkCmdDispatch-None-00392", + "text": " For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE, a push constant value must have been set for VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for push constants with the one used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDispatch-None-00393", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDispatch-None-00394", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDispatch-None-00395", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDispatch-None-00396", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDispatch-None-00397", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDispatch-linearTilingFeatures-00398", + "text": " Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDispatch-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdDispatch-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDispatch-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support compute operations" + }, + { + "vuid": "VUID-vkCmdDispatch-renderpass", + "text": " This command must only be called outside of a render pass instance" + } + ], + "(VK_IMG_filter_cubic)": [ + { + "vuid": "VUID-vkCmdDispatch-linearTilingFeatures-00399", + "text": " Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDispatch-None-00400", + "text": " Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdDispatch-commandBuffer-01844", + "text": " If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer." + }, + { + "vuid": "VUID-vkCmdDispatch-commandBuffer-01845", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_POINT_COMPUTE writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer." + }, + { + "vuid": "VUID-vkCmdDispatch-commandBuffer-01846", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage other than the compute pipeline stage in the VkPipeline object bound to VK_PIPELINE_POINT_COMPUTE reads from any image or buffer, the image or buffer must not be a protected image or protected buffer." + } + ] + }, + "vkCmdDispatchIndirect": { + "core": [ + { + "vuid": "VUID-vkCmdDispatchIndirect-buffer-00401", + "text": " If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-None-00402", + "text": " For each set n that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-None-00403", + "text": " Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the bound VkPipeline object, specified via vkCmdBindPipeline" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-None-00404", + "text": " A valid compute pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_COMPUTE" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-buffer-00405", + "text": " buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-offset-00406", + "text": " offset must be a multiple of 4" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-offset-00407", + "text": " The sum of offset and the size of VkDispatchIndirectCommand must be less than or equal to the size of buffer" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-None-00408", + "text": " For each push constant that is statically used by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE, a push constant value must have been set for VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for push constants with the one used to create the current VkPipeline, as described in &amp;lt;&amp;lt;descriptorsets-compatibility&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-None-00409", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-None-00410", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-None-00411", + "text": " If any VkSampler object that is accessed from a shader by the VkPipeline bound to VK_PIPELINE_BIND_POINT_COMPUTE uses unnormalized coordinates, it 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" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-None-00412", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a uniform buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-None-00413", + "text": " If the &amp;lt;&amp;lt;features-features-robustBufferAccess,robust buffer access&amp;gt;&amp;gt; feature is not enabled, and any shader stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE accesses a storage buffer, it must not access values outside of the range of that buffer specified in the bound descriptor set" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-linearTilingFeatures-00414", + "text": " Any VkImageView being sampled with VK_FILTER_LINEAR as a result of this command must be of a format which supports linear filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support compute operations" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-renderpass", + "text": " This command must only be called outside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-commonparent", + "text": " Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice" + } + ], + "(VK_IMG_filter_cubic)": [ + { + "vuid": "VUID-vkCmdDispatchIndirect-linearTilingFeatures-00415", + "text": " Any VkImageView being sampled with VK_FILTER_CUBIC_IMG as a result of this command must be of a format which supports cubic filtering, as specified by the VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG flag in VkFormatProperties::linearTilingFeatures (for a linear image) or VkFormatProperties::optimalTilingFeatures(for an optimally tiled image) returned by vkGetPhysicalDeviceFormatProperties" + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-None-00416", + "text": " Any VkImageView being sampled with VK_FILTER_CUBIC_IMG 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" + } + ], + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-vkCmdDispatchIndirect-commandBuffer-01847", + "text": " If commandBuffer is an unprotected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_BIND_POINT_COMPUTE reads from or writes to any image or buffer, that image or buffer must not be a protected image or protected buffer." + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-commandBuffer-01848", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage in the VkPipeline object bound to VK_PIPELINE_POINT_COMPUTE writes to any image or buffer, that image or buffer must not be an unprotected image or unprotected buffer." + }, + { + "vuid": "VUID-vkCmdDispatchIndirect-commandBuffer-01849", + "text": " If commandBuffer is a protected command buffer, and any pipeline stage other than the compute pipeline stage in the VkPipeline object bound to VK_PIPELINE_POINT_COMPUTE reads from any image or buffer, the image or buffer must not be a protected image or protected buffer." + } + ] + }, + "VkDispatchIndirectCommand": { + "core": [ + { + "vuid": "VUID-VkDispatchIndirectCommand-x-00417", + "text": " x must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]" + }, + { + "vuid": "VUID-VkDispatchIndirectCommand-y-00418", + "text": " y must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]" + }, + { + "vuid": "VUID-VkDispatchIndirectCommand-z-00419", + "text": " z must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]" + } + ] + }, + "vkCmdDispatchBase": { + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-vkCmdDispatchBase-None-00420", + "text": " All valid usage rules from vkCmdDispatch apply" + }, + { + "vuid": "VUID-vkCmdDispatchBase-baseGroupX-00421", + "text": " baseGroupX must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]" + }, + { + "vuid": "VUID-vkCmdDispatchBase-baseGroupX-00422", + "text": " baseGroupX must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]" + }, + { + "vuid": "VUID-vkCmdDispatchBase-baseGroupZ-00423", + "text": " baseGroupZ must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]" + }, + { + "vuid": "VUID-vkCmdDispatchBase-groupCountX-00424", + "text": " groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] minus baseGroupX" + }, + { + "vuid": "VUID-vkCmdDispatchBase-groupCountY-00425", + "text": " groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] minus baseGroupY" + }, + { + "vuid": "VUID-vkCmdDispatchBase-groupCountZ-00426", + "text": " groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] minus baseGroupZ" + }, + { + "vuid": "VUID-vkCmdDispatchBase-baseGroupX-00427", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDispatchBase-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdDispatchBase-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDispatchBase-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support compute operations" + }, + { + "vuid": "VUID-vkCmdDispatchBase-renderpass", + "text": " This command must only be called outside of a render pass instance" + } + ] + }, + "vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX-pFeatures-parameter", + "text": " pFeatures must be a valid pointer to a VkDeviceGeneratedCommandsFeaturesNVX structure" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX-pLimits-parameter", + "text": " pLimits must be a valid pointer to a VkDeviceGeneratedCommandsLimitsNVX structure" + } + ] + }, + "VkDeviceGeneratedCommandsFeaturesNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkDeviceGeneratedCommandsFeaturesNVX-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_FEATURES_NVX" + }, + { + "vuid": "VUID-VkDeviceGeneratedCommandsFeaturesNVX-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "VkDeviceGeneratedCommandsLimitsNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkDeviceGeneratedCommandsLimitsNVX-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_LIMITS_NVX" + }, + { + "vuid": "VUID-VkDeviceGeneratedCommandsLimitsNVX-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "vkCreateObjectTableNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-vkCreateObjectTableNVX-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateObjectTableNVX-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkObjectTableCreateInfoNVX structure" + }, + { + "vuid": "VUID-vkCreateObjectTableNVX-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateObjectTableNVX-pObjectTable-parameter", + "text": " pObjectTable must be a valid pointer to a VkObjectTableNVX handle" + } + ] + }, + "VkObjectTableCreateInfoNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-computeBindingPointSupport-01355", + "text": " If the VkDeviceGeneratedCommandsFeaturesNVX::computeBindingPointSupport feature is not enabled, pObjectEntryUsageFlags must not contain VK_OBJECT_ENTRY_USAGE_COMPUTE_BIT_NVX" + }, + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-pObjectEntryCounts-01356", + "text": " Any value within pObjectEntryCounts must not exceed VkDeviceGeneratedCommandsLimitsNVX::maxObjectEntryCounts" + }, + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-maxUniformBuffersPerDescriptor-01357", + "text": " maxUniformBuffersPerDescriptor must be within the limits supported by the device." + }, + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-maxStorageBuffersPerDescriptor-01358", + "text": " maxStorageBuffersPerDescriptor must be within the limits supported by the device." + }, + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-maxStorageImagesPerDescriptor-01359", + "text": " maxStorageImagesPerDescriptor must be within the limits supported by the device." + }, + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-maxSampledImagesPerDescriptor-01360", + "text": " maxSampledImagesPerDescriptor must be within the limits supported by the device." + }, + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX" + }, + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-pObjectEntryTypes-parameter", + "text": " pObjectEntryTypes must be a valid pointer to an array of objectCount valid VkObjectEntryTypeNVX values" + }, + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-pObjectEntryCounts-parameter", + "text": " pObjectEntryCounts must be a valid pointer to an array of objectCount uint32_t values" + }, + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-pObjectEntryUsageFlags-parameter", + "text": " pObjectEntryUsageFlags must be a valid pointer to an array of objectCount valid combinations of VkObjectEntryUsageFlagBitsNVX values" + }, + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-pObjectEntryUsageFlags-requiredbitmask", + "text": " Each element of pObjectEntryUsageFlags must not be 0" + }, + { + "vuid": "VUID-VkObjectTableCreateInfoNVX-objectCount-arraylength", + "text": " objectCount must be greater than 0" + } + ] + }, + "vkDestroyObjectTableNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-vkDestroyObjectTableNVX-objectTable-01361", + "text": " All submitted commands that refer to objectTable must have completed execution." + }, + { + "vuid": "VUID-vkDestroyObjectTableNVX-objectTable-01362", + "text": " If VkAllocationCallbacks were provided when objectTable was created, a compatible set of callbacks must be provided here." + }, + { + "vuid": "VUID-vkDestroyObjectTableNVX-objectTable-01363", + "text": " If no VkAllocationCallbacks were provided when objectTable was created, pAllocator must be NULL." + }, + { + "vuid": "VUID-vkDestroyObjectTableNVX-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyObjectTableNVX-objectTable-parameter", + "text": " objectTable must be a valid VkObjectTableNVX handle" + }, + { + "vuid": "VUID-vkDestroyObjectTableNVX-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyObjectTableNVX-objectTable-parent", + "text": " objectTable must have been created, allocated, or retrieved from device" + } + ] + }, + "vkRegisterObjectsNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-vkRegisterObjectsNVX-pObjectTableEntry-01364", + "text": " The contents of pObjectTableEntry must yield plausible bindings supported by the device." + }, + { + "vuid": "VUID-vkRegisterObjectsNVX-pObjectIndices-01365", + "text": " At any pObjectIndices there must not be a registered resource already." + }, + { + "vuid": "VUID-vkRegisterObjectsNVX-pObjectIndices-01366", + "text": " Any value inside pObjectIndices must be below the appropriate VkObjectTableCreateInfoNVX::pObjectEntryCounts limits provided at objectTable creation time." + }, + { + "vuid": "VUID-vkRegisterObjectsNVX-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkRegisterObjectsNVX-objectTable-parameter", + "text": " objectTable must be a valid VkObjectTableNVX handle" + }, + { + "vuid": "VUID-vkRegisterObjectsNVX-ppObjectTableEntries-parameter", + "text": " ppObjectTableEntries must be a valid pointer to an array of objectCount valid VkObjectTableEntryNVX structures" + }, + { + "vuid": "VUID-vkRegisterObjectsNVX-pObjectIndices-parameter", + "text": " pObjectIndices must be a valid pointer to an array of objectCount uint32_t values" + }, + { + "vuid": "VUID-vkRegisterObjectsNVX-objectCount-arraylength", + "text": " objectCount must be greater than 0" + }, + { + "vuid": "VUID-vkRegisterObjectsNVX-objectTable-parent", + "text": " objectTable must have been created, allocated, or retrieved from device" + } + ] + }, + "VkObjectTableEntryNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkObjectTableEntryNVX-computeBindingPointSupport-01367", + "text": " If the VkDeviceGeneratedCommandsFeaturesNVX::computeBindingPointSupport feature is not enabled, flags must not contain VK_OBJECT_ENTRY_USAGE_COMPUTE_BIT_NVX" + }, + { + "vuid": "VUID-VkObjectTableEntryNVX-type-parameter", + "text": " type must be a valid VkObjectEntryTypeNVX value" + }, + { + "vuid": "VUID-VkObjectTableEntryNVX-flags-parameter", + "text": " flags must be a valid combination of VkObjectEntryUsageFlagBitsNVX values" + }, + { + "vuid": "VUID-VkObjectTableEntryNVX-flags-requiredbitmask", + "text": " flags must not be 0" + } + ] + }, + "VkObjectTablePipelineEntryNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkObjectTablePipelineEntryNVX-type-01368", + "text": " type must be VK_OBJECT_ENTRY_TYPE_PIPELINE_NVX" + }, + { + "vuid": "VUID-VkObjectTablePipelineEntryNVX-type-parameter", + "text": " type must be a valid VkObjectEntryTypeNVX value" + }, + { + "vuid": "VUID-VkObjectTablePipelineEntryNVX-flags-parameter", + "text": " flags must be a valid combination of VkObjectEntryUsageFlagBitsNVX values" + }, + { + "vuid": "VUID-VkObjectTablePipelineEntryNVX-flags-requiredbitmask", + "text": " flags must not be 0" + }, + { + "vuid": "VUID-VkObjectTablePipelineEntryNVX-pipeline-parameter", + "text": " pipeline must be a valid VkPipeline handle" + } + ] + }, + "VkObjectTableDescriptorSetEntryNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkObjectTableDescriptorSetEntryNVX-type-01369", + "text": " type must be VK_OBJECT_ENTRY_TYPE_DESCRIPTOR_SET_NVX" + }, + { + "vuid": "VUID-VkObjectTableDescriptorSetEntryNVX-type-parameter", + "text": " type must be a valid VkObjectEntryTypeNVX value" + }, + { + "vuid": "VUID-VkObjectTableDescriptorSetEntryNVX-flags-parameter", + "text": " flags must be a valid combination of VkObjectEntryUsageFlagBitsNVX values" + }, + { + "vuid": "VUID-VkObjectTableDescriptorSetEntryNVX-flags-requiredbitmask", + "text": " flags must not be 0" + }, + { + "vuid": "VUID-VkObjectTableDescriptorSetEntryNVX-pipelineLayout-parameter", + "text": " pipelineLayout must be a valid VkPipelineLayout handle" + }, + { + "vuid": "VUID-VkObjectTableDescriptorSetEntryNVX-descriptorSet-parameter", + "text": " descriptorSet must be a valid VkDescriptorSet handle" + }, + { + "vuid": "VUID-VkObjectTableDescriptorSetEntryNVX-commonparent", + "text": " Both of descriptorSet, and pipelineLayout must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "VkObjectTableVertexBufferEntryNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkObjectTableVertexBufferEntryNVX-type-01370", + "text": " type must be VK_OBJECT_ENTRY_TYPE_VERTEX_BUFFER_NVX" + }, + { + "vuid": "VUID-VkObjectTableVertexBufferEntryNVX-type-parameter", + "text": " type must be a valid VkObjectEntryTypeNVX value" + }, + { + "vuid": "VUID-VkObjectTableVertexBufferEntryNVX-flags-parameter", + "text": " flags must be a valid combination of VkObjectEntryUsageFlagBitsNVX values" + }, + { + "vuid": "VUID-VkObjectTableVertexBufferEntryNVX-flags-requiredbitmask", + "text": " flags must not be 0" + }, + { + "vuid": "VUID-VkObjectTableVertexBufferEntryNVX-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + } + ] + }, + "VkObjectTableIndexBufferEntryNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkObjectTableIndexBufferEntryNVX-type-01371", + "text": " type must be VK_OBJECT_ENTRY_TYPE_INDEX_BUFFER_NVX" + }, + { + "vuid": "VUID-VkObjectTableIndexBufferEntryNVX-type-parameter", + "text": " type must be a valid VkObjectEntryTypeNVX value" + }, + { + "vuid": "VUID-VkObjectTableIndexBufferEntryNVX-flags-parameter", + "text": " flags must be a valid combination of VkObjectEntryUsageFlagBitsNVX values" + }, + { + "vuid": "VUID-VkObjectTableIndexBufferEntryNVX-flags-requiredbitmask", + "text": " flags must not be 0" + }, + { + "vuid": "VUID-VkObjectTableIndexBufferEntryNVX-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-VkObjectTableIndexBufferEntryNVX-indexType-parameter", + "text": " indexType must be a valid VkIndexType value" + } + ] + }, + "VkObjectTablePushConstantEntryNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkObjectTablePushConstantEntryNVX-type-01372", + "text": " type must be VK_OBJECT_ENTRY_TYPE_PUSH_CONSTANT_NVX" + }, + { + "vuid": "VUID-VkObjectTablePushConstantEntryNVX-type-parameter", + "text": " type must be a valid VkObjectEntryTypeNVX value" + }, + { + "vuid": "VUID-VkObjectTablePushConstantEntryNVX-flags-parameter", + "text": " flags must be a valid combination of VkObjectEntryUsageFlagBitsNVX values" + }, + { + "vuid": "VUID-VkObjectTablePushConstantEntryNVX-flags-requiredbitmask", + "text": " flags must not be 0" + }, + { + "vuid": "VUID-VkObjectTablePushConstantEntryNVX-pipelineLayout-parameter", + "text": " pipelineLayout must be a valid VkPipelineLayout handle" + }, + { + "vuid": "VUID-VkObjectTablePushConstantEntryNVX-stageFlags-parameter", + "text": " stageFlags must be a valid combination of VkShaderStageFlagBits values" + }, + { + "vuid": "VUID-VkObjectTablePushConstantEntryNVX-stageFlags-requiredbitmask", + "text": " stageFlags must not be 0" + } + ] + }, + "vkUnregisterObjectsNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-vkUnregisterObjectsNVX-pObjectIndices-01373", + "text": " At any pObjectIndices there must be a registered resource already." + }, + { + "vuid": "VUID-vkUnregisterObjectsNVX-pObjectEntryTypes-01374", + "text": " The pObjectEntryTypes of the resource at pObjectIndices must match." + }, + { + "vuid": "VUID-vkUnregisterObjectsNVX-None-01375", + "text": " All operations on the device using the registered resource must have been completed." + }, + { + "vuid": "VUID-vkUnregisterObjectsNVX-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkUnregisterObjectsNVX-objectTable-parameter", + "text": " objectTable must be a valid VkObjectTableNVX handle" + }, + { + "vuid": "VUID-vkUnregisterObjectsNVX-pObjectEntryTypes-parameter", + "text": " pObjectEntryTypes must be a valid pointer to an array of objectCount valid VkObjectEntryTypeNVX values" + }, + { + "vuid": "VUID-vkUnregisterObjectsNVX-pObjectIndices-parameter", + "text": " pObjectIndices must be a valid pointer to an array of objectCount uint32_t values" + }, + { + "vuid": "VUID-vkUnregisterObjectsNVX-objectCount-arraylength", + "text": " objectCount must be greater than 0" + }, + { + "vuid": "VUID-vkUnregisterObjectsNVX-objectTable-parent", + "text": " objectTable must have been created, allocated, or retrieved from device" + } + ] + }, + "VkIndirectCommandsLayoutTokenNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkIndirectCommandsLayoutTokenNVX-bindingUnit-01342", + "text": " bindingUnit must stay within device supported limits for the appropriate commands." + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutTokenNVX-dynamicCount-01343", + "text": " dynamicCount must stay within device supported limits for the appropriate commands." + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutTokenNVX-divisor-01344", + "text": " divisor must be greater than 0 and a power of two." + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutTokenNVX-tokenType-parameter", + "text": " tokenType must be a valid VkIndirectCommandsTokenTypeNVX value" + } + ] + }, + "VkIndirectCommandsTokenNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkIndirectCommandsTokenNVX-buffer-01345", + "text": " The buffer’s usage flag must have the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set." + }, + { + "vuid": "VUID-VkIndirectCommandsTokenNVX-offset-01346", + "text": " The offset must be aligned to VkDeviceGeneratedCommandsLimitsNVX::minCommandsTokenBufferOffsetAlignment." + }, + { + "vuid": "VUID-VkIndirectCommandsTokenNVX-tokenType-parameter", + "text": " tokenType must be a valid VkIndirectCommandsTokenTypeNVX value" + }, + { + "vuid": "VUID-VkIndirectCommandsTokenNVX-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + } + ] + }, + "vkCreateIndirectCommandsLayoutNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-vkCreateIndirectCommandsLayoutNVX-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateIndirectCommandsLayoutNVX-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkIndirectCommandsLayoutCreateInfoNVX structure" + }, + { + "vuid": "VUID-vkCreateIndirectCommandsLayoutNVX-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateIndirectCommandsLayoutNVX-pIndirectCommandsLayout-parameter", + "text": " pIndirectCommandsLayout must be a valid pointer to a VkIndirectCommandsLayoutNVX handle" + } + ] + }, + "VkIndirectCommandsLayoutCreateInfoNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkIndirectCommandsLayoutCreateInfoNVX-tokenCount-01347", + "text": " tokenCount must be greater than 0 and below VkDeviceGeneratedCommandsLimitsNVX::maxIndirectCommandsLayoutTokenCount" + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutCreateInfoNVX-computeBindingPointSupport-01348", + "text": " If the VkDeviceGeneratedCommandsFeaturesNVX::computeBindingPointSupport feature is not enabled, then pipelineBindPoint must not be VK_PIPELINE_BIND_POINT_COMPUTE" + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutCreateInfoNVX-pTokens-01349", + "text": " If pTokens contains an entry of VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NVX it must be the first element of the array and there must be only a single element of such token type." + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutCreateInfoNVX-pTokens-01350", + "text": " All state binding tokens in pTokens must occur prior work provoking tokens (VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NVX, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NVX, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NVX)." + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutCreateInfoNVX-pTokens-01351", + "text": " The content of pTokens must include one single work provoking token that is compatible with the pipelineBindPoint." + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutCreateInfoNVX-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX" + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutCreateInfoNVX-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutCreateInfoNVX-pipelineBindPoint-parameter", + "text": " pipelineBindPoint must be a valid VkPipelineBindPoint value" + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutCreateInfoNVX-flags-parameter", + "text": " flags must be a valid combination of VkIndirectCommandsLayoutUsageFlagBitsNVX values" + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutCreateInfoNVX-flags-requiredbitmask", + "text": " flags must not be 0" + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutCreateInfoNVX-pTokens-parameter", + "text": " pTokens must be a valid pointer to an array of tokenCount valid VkIndirectCommandsLayoutTokenNVX structures" + }, + { + "vuid": "VUID-VkIndirectCommandsLayoutCreateInfoNVX-tokenCount-arraylength", + "text": " tokenCount must be greater than 0" + } + ] + }, + "vkDestroyIndirectCommandsLayoutNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-vkDestroyIndirectCommandsLayoutNVX-indirectCommandsLayout-01352", + "text": " All submitted commands that refer to indirectCommandsLayout must have completed execution" + }, + { + "vuid": "VUID-vkDestroyIndirectCommandsLayoutNVX-objectTable-01353", + "text": " If VkAllocationCallbacks were provided when objectTable was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyIndirectCommandsLayoutNVX-objectTable-01354", + "text": " If no VkAllocationCallbacks were provided when objectTable was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyIndirectCommandsLayoutNVX-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroyIndirectCommandsLayoutNVX-indirectCommandsLayout-parameter", + "text": " indirectCommandsLayout must be a valid VkIndirectCommandsLayoutNVX handle" + }, + { + "vuid": "VUID-vkDestroyIndirectCommandsLayoutNVX-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyIndirectCommandsLayoutNVX-indirectCommandsLayout-parent", + "text": " indirectCommandsLayout must have been created, allocated, or retrieved from device" + } + ] + }, + "vkCmdReserveSpaceForCommandsNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-01329", + "text": " The provided commandBuffer must not have had a prior space reservation since its creation or the last reset." + }, + { + "vuid": "VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-01330", + "text": " The state of the commandBuffer must be legal to execute all commands within the sequence provided by the indirectCommandsLayout member of pProcessCommandsInfo." + }, + { + "vuid": "VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdReserveSpaceForCommandsNVX-pReserveSpaceInfo-parameter", + "text": " pReserveSpaceInfo must be a valid pointer to a valid VkCmdReserveSpaceForCommandsInfoNVX structure" + }, + { + "vuid": "VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdReserveSpaceForCommandsNVX-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdReserveSpaceForCommandsNVX-renderpass", + "text": " This command must only be called inside of a render pass instance" + }, + { + "vuid": "VUID-vkCmdReserveSpaceForCommandsNVX-bufferlevel", + "text": " commandBuffer must be a secondary VkCommandBuffer" + } + ] + }, + "VkCmdReserveSpaceForCommandsInfoNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkCmdReserveSpaceForCommandsInfoNVX-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_CMD_RESERVE_SPACE_FOR_COMMANDS_INFO_NVX" + }, + { + "vuid": "VUID-VkCmdReserveSpaceForCommandsInfoNVX-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkCmdReserveSpaceForCommandsInfoNVX-objectTable-parameter", + "text": " objectTable must be a valid VkObjectTableNVX handle" + }, + { + "vuid": "VUID-VkCmdReserveSpaceForCommandsInfoNVX-indirectCommandsLayout-parameter", + "text": " indirectCommandsLayout must be a valid VkIndirectCommandsLayoutNVX handle" + }, + { + "vuid": "VUID-VkCmdReserveSpaceForCommandsInfoNVX-commonparent", + "text": " Both of indirectCommandsLayout, and objectTable must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "vkCmdProcessCommandsNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-vkCmdProcessCommandsNVX-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdProcessCommandsNVX-pProcessCommandsInfo-parameter", + "text": " pProcessCommandsInfo must be a valid pointer to a valid VkCmdProcessCommandsInfoNVX structure" + }, + { + "vuid": "VUID-vkCmdProcessCommandsNVX-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdProcessCommandsNVX-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + }, + { + "vuid": "VUID-vkCmdProcessCommandsNVX-renderpass", + "text": " This command must only be called inside of a render pass instance" + } + ] + }, + "VkCmdProcessCommandsInfoNVX": { + "(VK_NVX_device_generated_commands)": [ + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-objectTable-01331", + "text": " The provided objectTable must include all objects referenced by the generation process." + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-indirectCommandsTokenCount-01332", + "text": " indirectCommandsTokenCount must match the indirectCommandsLayout’s tokenCount." + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-tokenType-01333", + "text": " The tokenType member of each entry in the pIndirectCommandsTokens array must match the values used at creation time of indirectCommandsLayout" + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-01334", + "text": " If targetCommandBuffer is provided, it must have reserved command space." + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-01335", + "text": " If targetCommandBuffer is provided, the objectTable must match the reservation’s objectTable and must have had all referenced objects registered at reservation time." + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-01336", + "text": " If targetCommandBuffer is provided, the indirectCommandsLayout must match the reservation’s indirectCommandsLayout." + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-01337", + "text": " If targetCommandBuffer is provided, the maxSequencesCount must not exceed the reservation’s maxSequencesCount." + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-sequencesCountBuffer-01338", + "text": " If sequencesCountBuffer is used, its usage flag must have VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set." + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-sequencesCountBuffer-01339", + "text": " If sequencesCountBuffer is used, sequencesCountOffset must be aligned to VkDeviceGeneratedCommandsLimitsNVX::minSequenceCountBufferOffsetAlignment." + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-sequencesIndexBuffer-01340", + "text": " If sequencesIndexBuffer is used, its usage flag must have VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set." + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-sequencesIndexBuffer-01341", + "text": " If sequencesIndexBuffer is used, sequencesIndexOffset must be aligned to VkDeviceGeneratedCommandsLimitsNVX::minSequenceIndexBufferOffsetAlignment." + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_CMD_PROCESS_COMMANDS_INFO_NVX" + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-objectTable-parameter", + "text": " objectTable must be a valid VkObjectTableNVX handle" + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-indirectCommandsLayout-parameter", + "text": " indirectCommandsLayout must be a valid VkIndirectCommandsLayoutNVX handle" + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-pIndirectCommandsTokens-parameter", + "text": " pIndirectCommandsTokens must be a valid pointer to an array of indirectCommandsTokenCount valid VkIndirectCommandsTokenNVX structures" + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-targetCommandBuffer-parameter", + "text": " If targetCommandBuffer is not NULL, targetCommandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-sequencesCountBuffer-parameter", + "text": " If sequencesCountBuffer is not VK_NULL_HANDLE, sequencesCountBuffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-sequencesIndexBuffer-parameter", + "text": " If sequencesIndexBuffer is not VK_NULL_HANDLE, sequencesIndexBuffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-indirectCommandsTokenCount-arraylength", + "text": " indirectCommandsTokenCount must be greater than 0" + }, + { + "vuid": "VUID-VkCmdProcessCommandsInfoNVX-commonparent", + "text": " Each of indirectCommandsLayout, objectTable, sequencesCountBuffer, sequencesIndexBuffer, and targetCommandBuffer that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "vkGetPhysicalDeviceSparseImageFormatProperties": { + "core": [ + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-01094", + "text": " 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" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties-format-parameter", + "text": " format must be a valid VkFormat value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties-type-parameter", + "text": " type must be a valid VkImageType value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-parameter", + "text": " samples must be a valid VkSampleCountFlagBits value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-parameter", + "text": " usage must be a valid combination of VkImageUsageFlagBits values" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-requiredbitmask", + "text": " usage must not be 0" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties-tiling-parameter", + "text": " tiling must be a valid VkImageTiling value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties-pPropertyCount-parameter", + "text": " pPropertyCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties-pProperties-parameter", + "text": " 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" + } + ] + }, + "vkGetPhysicalDeviceSparseImageFormatProperties2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pFormatInfo-parameter", + "text": " pFormatInfo must be a valid pointer to a valid VkPhysicalDeviceSparseImageFormatInfo2 structure" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pPropertyCount-parameter", + "text": " pPropertyCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pProperties-parameter", + "text": " 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" + } + ] + }, + "VkPhysicalDeviceSparseImageFormatInfo2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-01095", + "text": " 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" + }, + { + "vuid": "VUID-VkPhysicalDeviceSparseImageFormatInfo2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2" + }, + { + "vuid": "VUID-VkPhysicalDeviceSparseImageFormatInfo2-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkPhysicalDeviceSparseImageFormatInfo2-format-parameter", + "text": " format must be a valid VkFormat value" + }, + { + "vuid": "VUID-VkPhysicalDeviceSparseImageFormatInfo2-type-parameter", + "text": " type must be a valid VkImageType value" + }, + { + "vuid": "VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-parameter", + "text": " samples must be a valid VkSampleCountFlagBits value" + }, + { + "vuid": "VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-parameter", + "text": " usage must be a valid combination of VkImageUsageFlagBits values" + }, + { + "vuid": "VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-requiredbitmask", + "text": " usage must not be 0" + }, + { + "vuid": "VUID-VkPhysicalDeviceSparseImageFormatInfo2-tiling-parameter", + "text": " tiling must be a valid VkImageTiling value" + } + ] + }, + "VkSparseImageFormatProperties2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkSparseImageFormatProperties2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2" + }, + { + "vuid": "VUID-VkSparseImageFormatProperties2-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "vkGetImageSparseMemoryRequirements": { + "core": [ + { + "vuid": "VUID-vkGetImageSparseMemoryRequirements-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetImageSparseMemoryRequirements-image-parameter", + "text": " image must be a valid VkImage handle" + }, + { + "vuid": "VUID-vkGetImageSparseMemoryRequirements-pSparseMemoryRequirementCount-parameter", + "text": " pSparseMemoryRequirementCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetImageSparseMemoryRequirements-pSparseMemoryRequirements-parameter", + "text": " 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" + }, + { + "vuid": "VUID-vkGetImageSparseMemoryRequirements-image-parent", + "text": " image must have been created, allocated, or retrieved from device" + } + ] + }, + "vkGetImageSparseMemoryRequirements2": { + "(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)": [ + { + "vuid": "VUID-vkGetImageSparseMemoryRequirements2-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetImageSparseMemoryRequirements2-pInfo-parameter", + "text": " pInfo must be a valid pointer to a valid VkImageSparseMemoryRequirementsInfo2 structure" + }, + { + "vuid": "VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirementCount-parameter", + "text": " pSparseMemoryRequirementCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirements-parameter", + "text": " 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" + } + ] + }, + "VkImageSparseMemoryRequirementsInfo2": { + "(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)": [ + { + "vuid": "VUID-VkImageSparseMemoryRequirementsInfo2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2" + }, + { + "vuid": "VUID-VkImageSparseMemoryRequirementsInfo2-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkImageSparseMemoryRequirementsInfo2-image-parameter", + "text": " image must be a valid VkImage handle" + } + ] + }, + "VkSparseImageMemoryRequirements2": { + "(VK_VERSION_1_1,VK_KHR_get_memory_requirements2)": [ + { + "vuid": "VUID-VkSparseImageMemoryRequirements2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2" + }, + { + "vuid": "VUID-VkSparseImageMemoryRequirements2-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "VkSparseMemoryBind": { + "core": [ + { + "vuid": "VUID-VkSparseMemoryBind-memory-01096", + "text": " If memory is not VK_NULL_HANDLE, memory and memoryOffset must match the memory requirements of the resource, as described in section &amp;lt;&amp;lt;resources-association&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkSparseMemoryBind-memory-01097", + "text": " 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" + }, + { + "vuid": "VUID-VkSparseMemoryBind-size-01098", + "text": " size must be greater than 0" + }, + { + "vuid": "VUID-VkSparseMemoryBind-resourceOffset-01099", + "text": " resourceOffset must be less than the size of the resource" + }, + { + "vuid": "VUID-VkSparseMemoryBind-size-01100", + "text": " size must be less than or equal to the size of the resource minus resourceOffset" + }, + { + "vuid": "VUID-VkSparseMemoryBind-memoryOffset-01101", + "text": " memoryOffset must be less than the size of memory" + }, + { + "vuid": "VUID-VkSparseMemoryBind-size-01102", + "text": " size must be less than or equal to the size of memory minus memoryOffset" + }, + { + "vuid": "VUID-VkSparseMemoryBind-memory-parameter", + "text": " If memory is not VK_NULL_HANDLE, memory must be a valid VkDeviceMemory handle" + }, + { + "vuid": "VUID-VkSparseMemoryBind-flags-parameter", + "text": " flags must be a valid combination of VkSparseMemoryBindFlagBits values" + } + ] + }, + "VkSparseBufferMemoryBindInfo": { + "core": [ + { + "vuid": "VUID-VkSparseBufferMemoryBindInfo-buffer-parameter", + "text": " buffer must be a valid VkBuffer handle" + }, + { + "vuid": "VUID-VkSparseBufferMemoryBindInfo-pBinds-parameter", + "text": " pBinds must be a valid pointer to an array of bindCount valid VkSparseMemoryBind structures" + }, + { + "vuid": "VUID-VkSparseBufferMemoryBindInfo-bindCount-arraylength", + "text": " bindCount must be greater than 0" + } + ] + }, + "VkSparseImageOpaqueMemoryBindInfo": { + "core": [ + { + "vuid": "VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-01103", + "text": " 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" + }, + { + "vuid": "VUID-VkSparseImageOpaqueMemoryBindInfo-image-parameter", + "text": " image must be a valid VkImage handle" + }, + { + "vuid": "VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-parameter", + "text": " pBinds must be a valid pointer to an array of bindCount valid VkSparseMemoryBind structures" + }, + { + "vuid": "VUID-VkSparseImageOpaqueMemoryBindInfo-bindCount-arraylength", + "text": " bindCount must be greater than 0" + } + ] + }, + "VkSparseImageMemoryBindInfo": { + "core": [ + { + "vuid": "VUID-VkSparseImageMemoryBindInfo-subresource-01722", + "text": " The subresource.mipLevel member of each element of pBinds must be less than the mipLevels specified in VkImageCreateInfo when image was created" + }, + { + "vuid": "VUID-VkSparseImageMemoryBindInfo-subresource-01723", + "text": " The subresource.arrayLayer member of each element of pBinds must be less than the arrayLayers specified in VkImageCreateInfo when image was created" + }, + { + "vuid": "VUID-VkSparseImageMemoryBindInfo-image-parameter", + "text": " image must be a valid VkImage handle" + }, + { + "vuid": "VUID-VkSparseImageMemoryBindInfo-pBinds-parameter", + "text": " pBinds must be a valid pointer to an array of bindCount valid VkSparseImageMemoryBind structures" + }, + { + "vuid": "VUID-VkSparseImageMemoryBindInfo-bindCount-arraylength", + "text": " bindCount must be greater than 0" + } + ] + }, + "VkSparseImageMemoryBind": { + "core": [ + { + "vuid": "VUID-VkSparseImageMemoryBind-memory-01104", + "text": " If the &amp;lt;&amp;lt;features-features-sparseResidencyAliased,sparse aliased residency&amp;gt;&amp;gt; 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" + }, + { + "vuid": "VUID-VkSparseImageMemoryBind-memory-01105", + "text": " memory and memoryOffset must match the memory requirements of the calling command’s image, as described in section &amp;lt;&amp;lt;resources-association&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-VkSparseImageMemoryBind-subresource-01106", + "text": " subresource must be a valid image subresource for image (see &amp;lt;&amp;lt;resources-image-views&amp;gt;&amp;gt;)" + }, + { + "vuid": "VUID-VkSparseImageMemoryBind-offset-01107", + "text": " offset.x must be a multiple of the sparse image block width (VkSparseImageFormatProperties::imageGranularity.width) of the image" + }, + { + "vuid": "VUID-VkSparseImageMemoryBind-extent-01108", + "text": " 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" + }, + { + "vuid": "VUID-VkSparseImageMemoryBind-offset-01109", + "text": " offset.y must be a multiple of the sparse image block height (VkSparseImageFormatProperties::imageGranularity.height) of the image" + }, + { + "vuid": "VUID-VkSparseImageMemoryBind-extent-01110", + "text": " 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" + }, + { + "vuid": "VUID-VkSparseImageMemoryBind-offset-01111", + "text": " offset.z must be a multiple of the sparse image block depth (VkSparseImageFormatProperties::imageGranularity.depth) of the image" + }, + { + "vuid": "VUID-VkSparseImageMemoryBind-extent-01112", + "text": " 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" + }, + { + "vuid": "VUID-VkSparseImageMemoryBind-subresource-parameter", + "text": " subresource must be a valid VkImageSubresource structure" + }, + { + "vuid": "VUID-VkSparseImageMemoryBind-memory-parameter", + "text": " If memory is not VK_NULL_HANDLE, memory must be a valid VkDeviceMemory handle" + }, + { + "vuid": "VUID-VkSparseImageMemoryBind-flags-parameter", + "text": " flags must be a valid combination of VkSparseMemoryBindFlagBits values" + } + ] + }, + "vkQueueBindSparse": { + "core": [ + { + "vuid": "VUID-vkQueueBindSparse-fence-01113", + "text": " If fence is not VK_NULL_HANDLE, fence must be unsignaled" + }, + { + "vuid": "VUID-vkQueueBindSparse-fence-01114", + "text": " 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" + }, + { + "vuid": "VUID-vkQueueBindSparse-pSignalSemaphores-01115", + "text": " 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" + }, + { + "vuid": "VUID-vkQueueBindSparse-pWaitSemaphores-01116", + "text": " When a semaphore unsignal operation defined by any element of the pWaitSemaphores member of any element of pBindInfo executes on queue, no other queue must be waiting on the same semaphore." + }, + { + "vuid": "VUID-vkQueueBindSparse-pWaitSemaphores-01117", + "text": " All elements of the pWaitSemaphores member of all elements of pBindInfo must be semaphores that are signaled, or have &amp;lt;&amp;lt;synchronization-semaphores-signaling, semaphore signal operations&amp;gt;&amp;gt; previously submitted for execution." + }, + { + "vuid": "VUID-vkQueueBindSparse-queue-parameter", + "text": " queue must be a valid VkQueue handle" + }, + { + "vuid": "VUID-vkQueueBindSparse-pBindInfo-parameter", + "text": " If bindInfoCount is not 0, pBindInfo must be a valid pointer to an array of bindInfoCount valid VkBindSparseInfo structures" + }, + { + "vuid": "VUID-vkQueueBindSparse-fence-parameter", + "text": " If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle" + }, + { + "vuid": "VUID-vkQueueBindSparse-queuetype", + "text": " The queue must support sparse binding operations" + }, + { + "vuid": "VUID-vkQueueBindSparse-commonparent", + "text": " Both of fence, and queue that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "VkBindSparseInfo": { + "core": [ + { + "vuid": "VUID-VkBindSparseInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_BIND_SPARSE_INFO" + }, + { + "vuid": "VUID-VkBindSparseInfo-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkDeviceGroupBindSparseInfo" + }, + { + "vuid": "VUID-VkBindSparseInfo-pWaitSemaphores-parameter", + "text": " If waitSemaphoreCount is not 0, pWaitSemaphores must be a valid pointer to an array of waitSemaphoreCount valid VkSemaphore handles" + }, + { + "vuid": "VUID-VkBindSparseInfo-pBufferBinds-parameter", + "text": " If bufferBindCount is not 0, pBufferBinds must be a valid pointer to an array of bufferBindCount valid VkSparseBufferMemoryBindInfo structures" + }, + { + "vuid": "VUID-VkBindSparseInfo-pImageOpaqueBinds-parameter", + "text": " If imageOpaqueBindCount is not 0, pImageOpaqueBinds must be a valid pointer to an array of imageOpaqueBindCount valid VkSparseImageOpaqueMemoryBindInfo structures" + }, + { + "vuid": "VUID-VkBindSparseInfo-pImageBinds-parameter", + "text": " If imageBindCount is not 0, pImageBinds must be a valid pointer to an array of imageBindCount valid VkSparseImageMemoryBindInfo structures" + }, + { + "vuid": "VUID-VkBindSparseInfo-pSignalSemaphores-parameter", + "text": " If signalSemaphoreCount is not 0, pSignalSemaphores must be a valid pointer to an array of signalSemaphoreCount valid VkSemaphore handles" + }, + { + "vuid": "VUID-VkBindSparseInfo-commonparent", + "text": " Both of the elements of pSignalSemaphores, and the elements of pWaitSemaphores that are valid handles must have been created, allocated, or retrieved from the same VkDevice" + } + ] + }, + "VkDeviceGroupBindSparseInfo": { + "(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkDeviceGroupBindSparseInfo-resourceDeviceIndex-01118", + "text": " resourceDeviceIndex and memoryDeviceIndex must both be valid device indices." + }, + { + "vuid": "VUID-VkDeviceGroupBindSparseInfo-memoryDeviceIndex-01119", + "text": " Each memory allocation bound in this batch must have allocated an instance for memoryDeviceIndex." + }, + { + "vuid": "VUID-VkDeviceGroupBindSparseInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO" + } + ] + }, + "vkCreateAndroidSurfaceKHR": { + "(VK_KHR_surface)+(VK_KHR_android_surface)": [ + { + "vuid": "VUID-vkCreateAndroidSurfaceKHR-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkCreateAndroidSurfaceKHR-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkAndroidSurfaceCreateInfoKHR structure" + }, + { + "vuid": "VUID-vkCreateAndroidSurfaceKHR-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateAndroidSurfaceKHR-pSurface-parameter", + "text": " pSurface must be a valid pointer to a VkSurfaceKHR handle" + } + ] + }, + "VkAndroidSurfaceCreateInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_android_surface)": [ + { + "vuid": "VUID-VkAndroidSurfaceCreateInfoKHR-window-01248", + "text": " window must point to a valid Android ANativeWindow." + }, + { + "vuid": "VUID-VkAndroidSurfaceCreateInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR" + }, + { + "vuid": "VUID-VkAndroidSurfaceCreateInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkAndroidSurfaceCreateInfoKHR-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "vkCreateMirSurfaceKHR": { + "(VK_KHR_surface)+(VK_KHR_mir_surface)": [ + { + "vuid": "VUID-vkCreateMirSurfaceKHR-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkCreateMirSurfaceKHR-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkMirSurfaceCreateInfoKHR structure" + }, + { + "vuid": "VUID-vkCreateMirSurfaceKHR-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateMirSurfaceKHR-pSurface-parameter", + "text": " pSurface must be a valid pointer to a VkSurfaceKHR handle" + } + ] + }, + "VkMirSurfaceCreateInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_mir_surface)": [ + { + "vuid": "VUID-VkMirSurfaceCreateInfoKHR-connection-01263", + "text": " connection must point to a valid MirConnection." + }, + { + "vuid": "VUID-VkMirSurfaceCreateInfoKHR-surface-01264", + "text": " surface must point to a valid MirSurface." + }, + { + "vuid": "VUID-VkMirSurfaceCreateInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR" + }, + { + "vuid": "VUID-VkMirSurfaceCreateInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkMirSurfaceCreateInfoKHR-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "vkCreateWaylandSurfaceKHR": { + "(VK_KHR_surface)+(VK_KHR_wayland_surface)": [ + { + "vuid": "VUID-vkCreateWaylandSurfaceKHR-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkCreateWaylandSurfaceKHR-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkWaylandSurfaceCreateInfoKHR structure" + }, + { + "vuid": "VUID-vkCreateWaylandSurfaceKHR-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateWaylandSurfaceKHR-pSurface-parameter", + "text": " pSurface must be a valid pointer to a VkSurfaceKHR handle" + } + ] + }, + "VkWaylandSurfaceCreateInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_wayland_surface)": [ + { + "vuid": "VUID-VkWaylandSurfaceCreateInfoKHR-display-01304", + "text": " display must point to a valid Wayland wl_display." + }, + { + "vuid": "VUID-VkWaylandSurfaceCreateInfoKHR-surface-01305", + "text": " surface must point to a valid Wayland wl_surface." + }, + { + "vuid": "VUID-VkWaylandSurfaceCreateInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR" + }, + { + "vuid": "VUID-VkWaylandSurfaceCreateInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkWaylandSurfaceCreateInfoKHR-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "vkCreateWin32SurfaceKHR": { + "(VK_KHR_surface)+(VK_KHR_win32_surface)": [ + { + "vuid": "VUID-vkCreateWin32SurfaceKHR-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkCreateWin32SurfaceKHR-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkWin32SurfaceCreateInfoKHR structure" + }, + { + "vuid": "VUID-vkCreateWin32SurfaceKHR-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateWin32SurfaceKHR-pSurface-parameter", + "text": " pSurface must be a valid pointer to a VkSurfaceKHR handle" + } + ] + }, + "VkWin32SurfaceCreateInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_win32_surface)": [ + { + "vuid": "VUID-VkWin32SurfaceCreateInfoKHR-hinstance-01307", + "text": " hinstance must be a valid Win32 HINSTANCE." + }, + { + "vuid": "VUID-VkWin32SurfaceCreateInfoKHR-hwnd-01308", + "text": " hwnd must be a valid Win32 HWND." + }, + { + "vuid": "VUID-VkWin32SurfaceCreateInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR" + }, + { + "vuid": "VUID-VkWin32SurfaceCreateInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkWin32SurfaceCreateInfoKHR-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "vkCreateXcbSurfaceKHR": { + "(VK_KHR_surface)+(VK_KHR_xcb_surface)": [ + { + "vuid": "VUID-vkCreateXcbSurfaceKHR-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkCreateXcbSurfaceKHR-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkXcbSurfaceCreateInfoKHR structure" + }, + { + "vuid": "VUID-vkCreateXcbSurfaceKHR-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateXcbSurfaceKHR-pSurface-parameter", + "text": " pSurface must be a valid pointer to a VkSurfaceKHR handle" + } + ] + }, + "VkXcbSurfaceCreateInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_xcb_surface)": [ + { + "vuid": "VUID-VkXcbSurfaceCreateInfoKHR-connection-01310", + "text": " connection must point to a valid X11 xcb_connection_t." + }, + { + "vuid": "VUID-VkXcbSurfaceCreateInfoKHR-window-01311", + "text": " window must be a valid X11 xcb_window_t." + }, + { + "vuid": "VUID-VkXcbSurfaceCreateInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR" + }, + { + "vuid": "VUID-VkXcbSurfaceCreateInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkXcbSurfaceCreateInfoKHR-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "vkCreateXlibSurfaceKHR": { + "(VK_KHR_surface)+(VK_KHR_xlib_surface)": [ + { + "vuid": "VUID-vkCreateXlibSurfaceKHR-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkCreateXlibSurfaceKHR-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkXlibSurfaceCreateInfoKHR structure" + }, + { + "vuid": "VUID-vkCreateXlibSurfaceKHR-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateXlibSurfaceKHR-pSurface-parameter", + "text": " pSurface must be a valid pointer to a VkSurfaceKHR handle" + } + ] + }, + "VkXlibSurfaceCreateInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_xlib_surface)": [ + { + "vuid": "VUID-VkXlibSurfaceCreateInfoKHR-dpy-01313", + "text": " dpy must point to a valid Xlib Display." + }, + { + "vuid": "VUID-VkXlibSurfaceCreateInfoKHR-window-01314", + "text": " window must be a valid Xlib Window." + }, + { + "vuid": "VUID-VkXlibSurfaceCreateInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR" + }, + { + "vuid": "VUID-VkXlibSurfaceCreateInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkXlibSurfaceCreateInfoKHR-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "vkCreateIOSSurfaceMVK": { + "(VK_KHR_surface)+(VK_MVK_ios_surface)": [ + { + "vuid": "VUID-vkCreateIOSSurfaceMVK-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkCreateIOSSurfaceMVK-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkIOSSurfaceCreateInfoMVK structure" + }, + { + "vuid": "VUID-vkCreateIOSSurfaceMVK-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateIOSSurfaceMVK-pSurface-parameter", + "text": " pSurface must be a valid pointer to a VkSurfaceKHR handle" + } + ] + }, + "VkIOSSurfaceCreateInfoMVK": { + "(VK_KHR_surface)+(VK_MVK_ios_surface)": [ + { + "vuid": "VUID-VkIOSSurfaceCreateInfoMVK-pView-01316", + "text": " pView must be a valid UIView and must be backed by a CALayer instance of type CAMetalLayer." + }, + { + "vuid": "VUID-VkIOSSurfaceCreateInfoMVK-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK" + }, + { + "vuid": "VUID-VkIOSSurfaceCreateInfoMVK-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkIOSSurfaceCreateInfoMVK-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "vkCreateMacOSSurfaceMVK": { + "(VK_KHR_surface)+(VK_MVK_macos_surface)": [ + { + "vuid": "VUID-vkCreateMacOSSurfaceMVK-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkCreateMacOSSurfaceMVK-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkMacOSSurfaceCreateInfoMVK structure" + }, + { + "vuid": "VUID-vkCreateMacOSSurfaceMVK-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateMacOSSurfaceMVK-pSurface-parameter", + "text": " pSurface must be a valid pointer to a VkSurfaceKHR handle" + } + ] + }, + "VkMacOSSurfaceCreateInfoMVK": { + "(VK_KHR_surface)+(VK_MVK_macos_surface)": [ + { + "vuid": "VUID-VkMacOSSurfaceCreateInfoMVK-pView-01317", + "text": " pView must be a valid NSView and must be backed by a CALayer instance of type CAMetalLayer." + }, + { + "vuid": "VUID-VkMacOSSurfaceCreateInfoMVK-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK" + }, + { + "vuid": "VUID-VkMacOSSurfaceCreateInfoMVK-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkMacOSSurfaceCreateInfoMVK-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "vkCreateViSurfaceNN": { + "(VK_KHR_surface)+(VK_NN_vi_surface)": [ + { + "vuid": "VUID-vkCreateViSurfaceNN-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkCreateViSurfaceNN-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkViSurfaceCreateInfoNN structure" + }, + { + "vuid": "VUID-vkCreateViSurfaceNN-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateViSurfaceNN-pSurface-parameter", + "text": " pSurface must be a valid pointer to a VkSurfaceKHR handle" + } + ] + }, + "VkViSurfaceCreateInfoNN": { + "(VK_KHR_surface)+(VK_NN_vi_surface)": [ + { + "vuid": "VUID-VkViSurfaceCreateInfoNN-window-01318", + "text": " window must be a valid nn::vi::NativeWindowHandle" + }, + { + "vuid": "VUID-VkViSurfaceCreateInfoNN-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN" + }, + { + "vuid": "VUID-VkViSurfaceCreateInfoNN-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkViSurfaceCreateInfoNN-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "vkDestroySurfaceKHR": { + "(VK_KHR_surface)": [ + { + "vuid": "VUID-vkDestroySurfaceKHR-surface-01266", + "text": " All VkSwapchainKHR objects created for surface must have been destroyed prior to destroying surface" + }, + { + "vuid": "VUID-vkDestroySurfaceKHR-surface-01267", + "text": " If VkAllocationCallbacks were provided when surface was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroySurfaceKHR-surface-01268", + "text": " If no VkAllocationCallbacks were provided when surface was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroySurfaceKHR-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkDestroySurfaceKHR-surface-parameter", + "text": " If surface is not VK_NULL_HANDLE, surface must be a valid VkSurfaceKHR handle" + }, + { + "vuid": "VUID-vkDestroySurfaceKHR-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroySurfaceKHR-surface-parent", + "text": " If surface is a valid handle, it must have been created, allocated, or retrieved from instance" + } + ] + }, + "vkGetPhysicalDeviceDisplayPropertiesKHR": { + "(VK_KHR_surface)+(VK_KHR_display)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pPropertyCount-parameter", + "text": " pPropertyCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pProperties-parameter", + "text": " 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" + } + ] + }, + "vkAcquireXlibDisplayEXT": { + "(VK_KHR_surface)+(VK_KHR_display)+(VK_EXT_direct_mode_display)+(VK_EXT_acquire_xlib_display)": [ + { + "vuid": "VUID-vkAcquireXlibDisplayEXT-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkAcquireXlibDisplayEXT-dpy-parameter", + "text": " dpy must be a valid pointer to a Display value" + }, + { + "vuid": "VUID-vkAcquireXlibDisplayEXT-display-parameter", + "text": " display must be a valid VkDisplayKHR handle" + } + ] + }, + "vkGetRandROutputDisplayEXT": { + "(VK_KHR_surface)+(VK_KHR_display)+(VK_EXT_direct_mode_display)+(VK_EXT_acquire_xlib_display)": [ + { + "vuid": "VUID-vkGetRandROutputDisplayEXT-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetRandROutputDisplayEXT-dpy-parameter", + "text": " dpy must be a valid pointer to a Display value" + }, + { + "vuid": "VUID-vkGetRandROutputDisplayEXT-pDisplay-parameter", + "text": " pDisplay must be a valid pointer to a VkDisplayKHR handle" + } + ] + }, + "vkReleaseDisplayEXT": { + "(VK_KHR_surface)+(VK_KHR_display)+(VK_EXT_direct_mode_display)": [ + { + "vuid": "VUID-vkReleaseDisplayEXT-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkReleaseDisplayEXT-display-parameter", + "text": " display must be a valid VkDisplayKHR handle" + } + ] + }, + "vkGetPhysicalDeviceDisplayPlanePropertiesKHR": { + "(VK_KHR_surface)+(VK_KHR_display)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-pPropertyCount-parameter", + "text": " pPropertyCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-pProperties-parameter", + "text": " 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" + } + ] + }, + "vkGetDisplayPlaneSupportedDisplaysKHR": { + "(VK_KHR_surface)+(VK_KHR_display)": [ + { + "vuid": "VUID-vkGetDisplayPlaneSupportedDisplaysKHR-planeIndex-01249", + "text": " planeIndex must be less than the number of display planes supported by the device as determined by calling vkGetPhysicalDeviceDisplayPlanePropertiesKHR" + }, + { + "vuid": "VUID-vkGetDisplayPlaneSupportedDisplaysKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetDisplayPlaneSupportedDisplaysKHR-pDisplayCount-parameter", + "text": " pDisplayCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetDisplayPlaneSupportedDisplaysKHR-pDisplays-parameter", + "text": " 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" + } + ] + }, + "vkGetDisplayModePropertiesKHR": { + "(VK_KHR_surface)+(VK_KHR_display)": [ + { + "vuid": "VUID-vkGetDisplayModePropertiesKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetDisplayModePropertiesKHR-display-parameter", + "text": " display must be a valid VkDisplayKHR handle" + }, + { + "vuid": "VUID-vkGetDisplayModePropertiesKHR-pPropertyCount-parameter", + "text": " pPropertyCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetDisplayModePropertiesKHR-pProperties-parameter", + "text": " 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" + } + ] + }, + "vkCreateDisplayModeKHR": { + "(VK_KHR_surface)+(VK_KHR_display)": [ + { + "vuid": "VUID-vkCreateDisplayModeKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkCreateDisplayModeKHR-display-parameter", + "text": " display must be a valid VkDisplayKHR handle" + }, + { + "vuid": "VUID-vkCreateDisplayModeKHR-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkDisplayModeCreateInfoKHR structure" + }, + { + "vuid": "VUID-vkCreateDisplayModeKHR-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateDisplayModeKHR-pMode-parameter", + "text": " pMode must be a valid pointer to a VkDisplayModeKHR handle" + } + ] + }, + "VkDisplayModeCreateInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_display)": [ + { + "vuid": "VUID-VkDisplayModeCreateInfoKHR-width-01250", + "text": " The width and height members of the visibleRegion member of parameters must be greater than 0" + }, + { + "vuid": "VUID-VkDisplayModeCreateInfoKHR-refreshRate-01251", + "text": " The refreshRate member of parameters must be greater than 0" + }, + { + "vuid": "VUID-VkDisplayModeCreateInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR" + }, + { + "vuid": "VUID-VkDisplayModeCreateInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDisplayModeCreateInfoKHR-flags-zerobitmask", + "text": " flags must be 0" + } + ] + }, + "vkGetDisplayPlaneCapabilitiesKHR": { + "(VK_KHR_surface)+(VK_KHR_display)": [ + { + "vuid": "VUID-vkGetDisplayPlaneCapabilitiesKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetDisplayPlaneCapabilitiesKHR-mode-parameter", + "text": " mode must be a valid VkDisplayModeKHR handle" + }, + { + "vuid": "VUID-vkGetDisplayPlaneCapabilitiesKHR-pCapabilities-parameter", + "text": " pCapabilities must be a valid pointer to a VkDisplayPlaneCapabilitiesKHR structure" + } + ] + }, + "vkDisplayPowerControlEXT": { + "(VK_KHR_surface)+(VK_KHR_display)+(VK_EXT_display_control)": [ + { + "vuid": "VUID-vkDisplayPowerControlEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDisplayPowerControlEXT-display-parameter", + "text": " display must be a valid VkDisplayKHR handle" + }, + { + "vuid": "VUID-vkDisplayPowerControlEXT-pDisplayPowerInfo-parameter", + "text": " pDisplayPowerInfo must be a valid pointer to a valid VkDisplayPowerInfoEXT structure" + } + ] + }, + "VkDisplayPowerInfoEXT": { + "(VK_KHR_surface)+(VK_KHR_display)+(VK_EXT_display_control)": [ + { + "vuid": "VUID-VkDisplayPowerInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT" + }, + { + "vuid": "VUID-VkDisplayPowerInfoEXT-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDisplayPowerInfoEXT-powerState-parameter", + "text": " powerState must be a valid VkDisplayPowerStateEXT value" + } + ] + }, + "vkCreateDisplayPlaneSurfaceKHR": { + "(VK_KHR_surface)+(VK_KHR_display)": [ + { + "vuid": "VUID-vkCreateDisplayPlaneSurfaceKHR-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkCreateDisplayPlaneSurfaceKHR-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkDisplaySurfaceCreateInfoKHR structure" + }, + { + "vuid": "VUID-vkCreateDisplayPlaneSurfaceKHR-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateDisplayPlaneSurfaceKHR-pSurface-parameter", + "text": " pSurface must be a valid pointer to a VkSurfaceKHR handle" + } + ] + }, + "VkDisplaySurfaceCreateInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_display)": [ + { + "vuid": "VUID-VkDisplaySurfaceCreateInfoKHR-planeIndex-01252", + "text": " planeIndex must be less than the number of display planes supported by the device as determined by calling vkGetPhysicalDeviceDisplayPlanePropertiesKHR" + }, + { + "vuid": "VUID-VkDisplaySurfaceCreateInfoKHR-planeReorderPossible-01253", + "text": " 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" + }, + { + "vuid": "VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-01254", + "text": " If alphaMode is VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR then globalAlpha must be between 0 and 1, inclusive" + }, + { + "vuid": "VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-01255", + "text": " 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" + }, + { + "vuid": "VUID-VkDisplaySurfaceCreateInfoKHR-width-01256", + "text": " The width and height members of imageExtent must be less than the maxImageDimensions2D member of VkPhysicalDeviceLimits" + }, + { + "vuid": "VUID-VkDisplaySurfaceCreateInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR" + }, + { + "vuid": "VUID-VkDisplaySurfaceCreateInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDisplaySurfaceCreateInfoKHR-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkDisplaySurfaceCreateInfoKHR-displayMode-parameter", + "text": " displayMode must be a valid VkDisplayModeKHR handle" + }, + { + "vuid": "VUID-VkDisplaySurfaceCreateInfoKHR-transform-parameter", + "text": " transform must be a valid VkSurfaceTransformFlagBitsKHR value" + }, + { + "vuid": "VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-parameter", + "text": " alphaMode must be a valid VkDisplayPlaneAlphaFlagBitsKHR value" + } + ] + }, + "vkGetPhysicalDeviceSurfaceSupportKHR": { + "(VK_KHR_surface)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceSupportKHR-queueFamilyIndex-01269", + "text": " queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceSupportKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceSupportKHR-surface-parameter", + "text": " surface must be a valid VkSurfaceKHR handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceSupportKHR-pSupported-parameter", + "text": " pSupported must be a valid pointer to a VkBool32 value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceSupportKHR-commonparent", + "text": " Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkGetPhysicalDeviceMirPresentationSupportKHR": { + "(VK_KHR_surface)+(VK_KHR_mir_surface)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceMirPresentationSupportKHR-queueFamilyIndex-01265", + "text": " queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceMirPresentationSupportKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceMirPresentationSupportKHR-connection-parameter", + "text": " connection must be a valid pointer to a MirConnection value" + } + ] + }, + "vkGetPhysicalDeviceWaylandPresentationSupportKHR": { + "(VK_KHR_surface)+(VK_KHR_wayland_surface)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-queueFamilyIndex-01306", + "text": " queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-display-parameter", + "text": " display must be a valid pointer to a wl_display value" + } + ] + }, + "vkGetPhysicalDeviceWin32PresentationSupportKHR": { + "(VK_KHR_surface)+(VK_KHR_win32_surface)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceWin32PresentationSupportKHR-queueFamilyIndex-01309", + "text": " queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceWin32PresentationSupportKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + } + ] + }, + "vkGetPhysicalDeviceXcbPresentationSupportKHR": { + "(VK_KHR_surface)+(VK_KHR_xcb_surface)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-queueFamilyIndex-01312", + "text": " queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-connection-parameter", + "text": " connection must be a valid pointer to a xcb_connection_t value" + } + ] + }, + "vkGetPhysicalDeviceXlibPresentationSupportKHR": { + "(VK_KHR_surface)+(VK_KHR_xlib_surface)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-queueFamilyIndex-01315", + "text": " queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-dpy-parameter", + "text": " dpy must be a valid pointer to a Display value" + } + ] + }, + "vkGetPhysicalDeviceSurfaceCapabilitiesKHR": { + "(VK_KHR_surface)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-surface-parameter", + "text": " surface must be a valid VkSurfaceKHR handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-pSurfaceCapabilities-parameter", + "text": " pSurfaceCapabilities must be a valid pointer to a VkSurfaceCapabilitiesKHR structure" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-commonparent", + "text": " Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkGetPhysicalDeviceSurfaceCapabilities2KHR": { + "(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pSurfaceInfo-parameter", + "text": " pSurfaceInfo must be a valid pointer to a valid VkPhysicalDeviceSurfaceInfo2KHR structure" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pSurfaceCapabilities-parameter", + "text": " pSurfaceCapabilities must be a valid pointer to a VkSurfaceCapabilities2KHR structure" + } + ] + }, + "VkPhysicalDeviceSurfaceInfo2KHR": { + "(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)": [ + { + "vuid": "VUID-VkPhysicalDeviceSurfaceInfo2KHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR" + }, + { + "vuid": "VUID-VkPhysicalDeviceSurfaceInfo2KHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkPhysicalDeviceSurfaceInfo2KHR-surface-parameter", + "text": " surface must be a valid VkSurfaceKHR handle" + } + ] + }, + "VkSurfaceCapabilities2KHR": { + "(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)": [ + { + "vuid": "VUID-VkSurfaceCapabilities2KHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR" + }, + { + "vuid": "VUID-VkSurfaceCapabilities2KHR-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkSharedPresentSurfaceCapabilitiesKHR" + } + ] + }, + "VkSharedPresentSurfaceCapabilitiesKHR": { + "(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)+(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-VkSharedPresentSurfaceCapabilitiesKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR" + } + ] + }, + "vkGetPhysicalDeviceSurfaceCapabilities2EXT": { + "(VK_KHR_surface)+(VK_EXT_display_surface_counter)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-surface-parameter", + "text": " surface must be a valid VkSurfaceKHR handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-pSurfaceCapabilities-parameter", + "text": " pSurfaceCapabilities must be a valid pointer to a VkSurfaceCapabilities2EXT structure" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-commonparent", + "text": " Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "VkSurfaceCapabilities2EXT": { + "(VK_KHR_surface)+(VK_EXT_display_surface_counter)": [ + { + "vuid": "VUID-VkSurfaceCapabilities2EXT-supportedSurfaceCounters-01246", + "text": " supportedSurfaceCounters must not include VK_SURFACE_COUNTER_VBLANK_EXT unless the surface queried is a &amp;lt;&amp;lt;wsi-display-surfaces,display surface&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkSurfaceCapabilities2EXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT" + }, + { + "vuid": "VUID-VkSurfaceCapabilities2EXT-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "vkGetPhysicalDeviceSurfaceFormatsKHR": { + "(VK_KHR_surface)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-surface-parameter", + "text": " surface must be a valid VkSurfaceKHR handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-pSurfaceFormatCount-parameter", + "text": " pSurfaceFormatCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-pSurfaceFormats-parameter", + "text": " 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" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-commonparent", + "text": " Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkGetPhysicalDeviceSurfaceFormats2KHR": { + "(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceInfo-parameter", + "text": " pSurfaceInfo must be a valid pointer to a valid VkPhysicalDeviceSurfaceInfo2KHR structure" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceFormatCount-parameter", + "text": " pSurfaceFormatCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceFormats-parameter", + "text": " 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" + } + ] + }, + "VkSurfaceFormat2KHR": { + "(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)": [ + { + "vuid": "VUID-VkSurfaceFormat2KHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR" + }, + { + "vuid": "VUID-VkSurfaceFormat2KHR-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "vkGetPhysicalDeviceSurfacePresentModesKHR": { + "(VK_KHR_surface)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-surface-parameter", + "text": " surface must be a valid VkSurfaceKHR handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-pPresentModeCount-parameter", + "text": " pPresentModeCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-pPresentModes-parameter", + "text": " 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" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-commonparent", + "text": " Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkGetDeviceGroupPresentCapabilitiesKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-vkGetDeviceGroupPresentCapabilitiesKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetDeviceGroupPresentCapabilitiesKHR-pDeviceGroupPresentCapabilities-parameter", + "text": " pDeviceGroupPresentCapabilities must be a valid pointer to a VkDeviceGroupPresentCapabilitiesKHR structure" + } + ] + }, + "VkDeviceGroupPresentCapabilitiesKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkDeviceGroupPresentCapabilitiesKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR" + }, + { + "vuid": "VUID-VkDeviceGroupPresentCapabilitiesKHR-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "vkGetDeviceGroupSurfacePresentModesKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-vkGetDeviceGroupSurfacePresentModesKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetDeviceGroupSurfacePresentModesKHR-surface-parameter", + "text": " surface must be a valid VkSurfaceKHR handle" + }, + { + "vuid": "VUID-vkGetDeviceGroupSurfacePresentModesKHR-pModes-parameter", + "text": " pModes must be a valid pointer to a VkDeviceGroupPresentModeFlagsKHR value" + }, + { + "vuid": "VUID-vkGetDeviceGroupSurfacePresentModesKHR-commonparent", + "text": " Both of device, and surface must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkGetPhysicalDevicePresentRectanglesKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-vkGetPhysicalDevicePresentRectanglesKHR-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDevicePresentRectanglesKHR-surface-parameter", + "text": " surface must be a valid VkSurfaceKHR handle" + }, + { + "vuid": "VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRectCount-parameter", + "text": " pRectCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRects-parameter", + "text": " 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" + }, + { + "vuid": "VUID-vkGetPhysicalDevicePresentRectanglesKHR-commonparent", + "text": " Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkGetRefreshCycleDurationGOOGLE": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_GOOGLE_display_timing)": [ + { + "vuid": "VUID-vkGetRefreshCycleDurationGOOGLE-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetRefreshCycleDurationGOOGLE-swapchain-parameter", + "text": " swapchain must be a valid VkSwapchainKHR handle" + }, + { + "vuid": "VUID-vkGetRefreshCycleDurationGOOGLE-pDisplayTimingProperties-parameter", + "text": " pDisplayTimingProperties must be a valid pointer to a VkRefreshCycleDurationGOOGLE structure" + }, + { + "vuid": "VUID-vkGetRefreshCycleDurationGOOGLE-commonparent", + "text": " Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkGetPastPresentationTimingGOOGLE": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_GOOGLE_display_timing)": [ + { + "vuid": "VUID-vkGetPastPresentationTimingGOOGLE-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetPastPresentationTimingGOOGLE-swapchain-parameter", + "text": " swapchain must be a valid VkSwapchainKHR handle" + }, + { + "vuid": "VUID-vkGetPastPresentationTimingGOOGLE-pPresentationTimingCount-parameter", + "text": " pPresentationTimingCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetPastPresentationTimingGOOGLE-pPresentationTimings-parameter", + "text": " 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" + }, + { + "vuid": "VUID-vkGetPastPresentationTimingGOOGLE-commonparent", + "text": " Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkGetSwapchainStatusKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-vkGetSwapchainStatusKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetSwapchainStatusKHR-swapchain-parameter", + "text": " swapchain must be a valid VkSwapchainKHR handle" + }, + { + "vuid": "VUID-vkGetSwapchainStatusKHR-commonparent", + "text": " Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkCreateSwapchainKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)": [ + { + "vuid": "VUID-vkCreateSwapchainKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateSwapchainKHR-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkSwapchainCreateInfoKHR structure" + }, + { + "vuid": "VUID-vkCreateSwapchainKHR-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateSwapchainKHR-pSwapchain-parameter", + "text": " pSwapchain must be a valid pointer to a VkSwapchainKHR handle" + } + ] + }, + "VkSwapchainCreateInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)": [ + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-surface-01270", + "text": " surface must be a surface that is supported by the device as determined using vkGetPhysicalDeviceSurfaceSupportKHR" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-minImageCount-01271", + "text": " 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" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-minImageCount-01272", + "text": " 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" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageFormat-01273", + "text": " imageFormat and imageColorSpace must match the format and colorSpace members, respectively, of one of the VkSurfaceFormatKHR structures returned by vkGetPhysicalDeviceSurfaceFormatsKHR for the surface" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageExtent-01274", + "text": " imageExtent must be between minImageExtent and maxImageExtent, inclusive, where minImageExtent and maxImageExtent are members of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageExtent-01689", + "text": " imageExtent members width and height must both be non-zero" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageArrayLayers-01275", + "text": " 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" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01277", + "text": " If imageSharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a valid pointer to an array of queueFamilyIndexCount uint32_t values" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01278", + "text": " If imageSharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-preTransform-01279", + "text": " preTransform must be one of the bits present in the supportedTransforms member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-compositeAlpha-01280", + "text": " compositeAlpha must be one of the bits present in the supportedCompositeAlpha member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-presentMode-01281", + "text": " presentMode must be one of the VkPresentModeKHR values returned by vkGetPhysicalDeviceSurfacePresentModesKHR for the surface" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01933", + "text": " If oldSwapchain is not VK_NULL_HANDLE, oldSwapchain must be a non-retired swapchain associated with native window referred to by surface" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageFormat-01778", + "text": " imageFormat, imageUsage, imageExtent, and imageArrayLayers must be supported for VK_IMAGE_TYPE_2D VK_IMAGE_TILING_OPTIMAL images as reported by vkGetPhysicalDeviceImageFormatProperties." + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-pNext-pNext", + "text": " 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 or VkSwapchainCounterCreateInfoEXT" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-flags-parameter", + "text": " flags must be a valid combination of VkSwapchainCreateFlagBitsKHR values" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-surface-parameter", + "text": " surface must be a valid VkSurfaceKHR handle" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageFormat-parameter", + "text": " imageFormat must be a valid VkFormat value" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageColorSpace-parameter", + "text": " imageColorSpace must be a valid VkColorSpaceKHR value" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageUsage-parameter", + "text": " imageUsage must be a valid combination of VkImageUsageFlagBits values" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageUsage-requiredbitmask", + "text": " imageUsage must not be 0" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageSharingMode-parameter", + "text": " imageSharingMode must be a valid VkSharingMode value" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-preTransform-parameter", + "text": " preTransform must be a valid VkSurfaceTransformFlagBitsKHR value" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-compositeAlpha-parameter", + "text": " compositeAlpha must be a valid VkCompositeAlphaFlagBitsKHR value" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-presentMode-parameter", + "text": " presentMode must be a valid VkPresentModeKHR value" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-oldSwapchain-parameter", + "text": " If oldSwapchain is not VK_NULL_HANDLE, oldSwapchain must be a valid VkSwapchainKHR handle" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-oldSwapchain-parent", + "text": " If oldSwapchain is a valid handle, it must have been created, allocated, or retrieved from surface" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-commonparent", + "text": " Both of oldSwapchain, and surface that are valid handles must have been created, allocated, or retrieved from the same VkInstance" + } + ], + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-minImageCount-01383", + "text": " minImageCount must be 1 if presentMode is either VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-presentMode-01427", + "text": " 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" + }, + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageUsage-01384", + "text": " 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" + } + ], + "(VK_KHR_surface)+(VK_KHR_swapchain)+!(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageUsage-01276", + "text": " 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" + } + ], + "(VK_KHR_surface)+(VK_KHR_swapchain)+!(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01393", + "text": " 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" + } + ], + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428", + "text": " 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" + } + ], + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkSwapchainCreateInfoKHR-physicalDeviceCount-01429", + "text": " 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" + } + ] + }, + "VkDeviceGroupSwapchainCreateInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkDeviceGroupSwapchainCreateInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR" + }, + { + "vuid": "VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-parameter", + "text": " modes must be a valid combination of VkDeviceGroupPresentModeFlagBitsKHR values" + }, + { + "vuid": "VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-requiredbitmask", + "text": " modes must not be 0" + } + ] + }, + "VkSwapchainCounterCreateInfoEXT": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_EXT_display_control)": [ + { + "vuid": "VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-01244", + "text": " The bits in surfaceCounters must be supported by VkSwapchainCreateInfoKHR::surface, as reported by vkGetPhysicalDeviceSurfaceCapabilities2EXT." + }, + { + "vuid": "VUID-VkSwapchainCounterCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-parameter", + "text": " surfaceCounters must be a valid combination of VkSurfaceCounterFlagBitsEXT values" + } + ] + }, + "vkGetSwapchainCounterEXT": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_EXT_display_control)": [ + { + "vuid": "VUID-vkGetSwapchainCounterEXT-swapchain-01245", + "text": " One or more present commands on swapchain must have been processed by the presentation engine." + }, + { + "vuid": "VUID-vkGetSwapchainCounterEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetSwapchainCounterEXT-swapchain-parameter", + "text": " swapchain must be a valid VkSwapchainKHR handle" + }, + { + "vuid": "VUID-vkGetSwapchainCounterEXT-counter-parameter", + "text": " counter must be a valid VkSurfaceCounterFlagBitsEXT value" + }, + { + "vuid": "VUID-vkGetSwapchainCounterEXT-pCounterValue-parameter", + "text": " pCounterValue must be a valid pointer to a uint64_t value" + }, + { + "vuid": "VUID-vkGetSwapchainCounterEXT-commonparent", + "text": " Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkDestroySwapchainKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)": [ + { + "vuid": "VUID-vkDestroySwapchainKHR-swapchain-01282", + "text": " All uses of presentable images acquired from swapchain must have completed execution" + }, + { + "vuid": "VUID-vkDestroySwapchainKHR-swapchain-01283", + "text": " If VkAllocationCallbacks were provided when swapchain was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroySwapchainKHR-swapchain-01284", + "text": " If no VkAllocationCallbacks were provided when swapchain was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroySwapchainKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDestroySwapchainKHR-swapchain-parameter", + "text": " If swapchain is not VK_NULL_HANDLE, swapchain must be a valid VkSwapchainKHR handle" + }, + { + "vuid": "VUID-vkDestroySwapchainKHR-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroySwapchainKHR-commonparent", + "text": " Both of device, and swapchain that are valid handles must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkCreateSharedSwapchainsKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_display_swapchain)": [ + { + "vuid": "VUID-vkCreateSharedSwapchainsKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkCreateSharedSwapchainsKHR-pCreateInfos-parameter", + "text": " pCreateInfos must be a valid pointer to an array of swapchainCount valid VkSwapchainCreateInfoKHR structures" + }, + { + "vuid": "VUID-vkCreateSharedSwapchainsKHR-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateSharedSwapchainsKHR-pSwapchains-parameter", + "text": " pSwapchains must be a valid pointer to an array of swapchainCount VkSwapchainKHR handles" + }, + { + "vuid": "VUID-vkCreateSharedSwapchainsKHR-swapchainCount-arraylength", + "text": " swapchainCount must be greater than 0" + } + ] + }, + "vkGetSwapchainImagesKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)": [ + { + "vuid": "VUID-vkGetSwapchainImagesKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkGetSwapchainImagesKHR-swapchain-parameter", + "text": " swapchain must be a valid VkSwapchainKHR handle" + }, + { + "vuid": "VUID-vkGetSwapchainImagesKHR-pSwapchainImageCount-parameter", + "text": " pSwapchainImageCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkGetSwapchainImagesKHR-pSwapchainImages-parameter", + "text": " 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" + }, + { + "vuid": "VUID-vkGetSwapchainImagesKHR-commonparent", + "text": " Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkAcquireNextImageKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)": [ + { + "vuid": "VUID-vkAcquireNextImageKHR-swapchain-01285", + "text": " swapchain must not be in the retired state" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-semaphore-01286", + "text": " If semaphore is not VK_NULL_HANDLE it must be unsignaled" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-semaphore-01779", + "text": " If semaphore is not VK_NULL_HANDLE it must not have any uncompleted signal or wait operations pending" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-fence-01287", + "text": " 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" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-semaphore-01780", + "text": " semaphore and fence must not both be equal to VK_NULL_HANDLE" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-swapchain-01802", + "text": " 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" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-swapchain-parameter", + "text": " swapchain must be a valid VkSwapchainKHR handle" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-semaphore-parameter", + "text": " If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-fence-parameter", + "text": " If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-pImageIndex-parameter", + "text": " pImageIndex must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-semaphore-parent", + "text": " If semaphore is a valid handle, it must have been created, allocated, or retrieved from device" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-fence-parent", + "text": " If fence is a valid handle, it must have been created, allocated, or retrieved from device" + }, + { + "vuid": "VUID-vkAcquireNextImageKHR-commonparent", + "text": " Both of device, and swapchain that are valid handles must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkAcquireNextImage2KHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-vkAcquireNextImage2KHR-swapchain-01803", + "text": " 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" + }, + { + "vuid": "VUID-vkAcquireNextImage2KHR-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkAcquireNextImage2KHR-pAcquireInfo-parameter", + "text": " pAcquireInfo must be a valid pointer to a valid VkAcquireNextImageInfoKHR structure" + }, + { + "vuid": "VUID-vkAcquireNextImage2KHR-pImageIndex-parameter", + "text": " pImageIndex must be a valid pointer to a uint32_t value" + } + ] + }, + "VkAcquireNextImageInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-swapchain-01675", + "text": " swapchain must not be in the retired state" + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-semaphore-01288", + "text": " If semaphore is not VK_NULL_HANDLE it must be unsignaled" + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-semaphore-01781", + "text": " If semaphore is not VK_NULL_HANDLE it must not have any uncompleted signal or wait operations pending" + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-fence-01289", + "text": " 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" + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-semaphore-01782", + "text": " semaphore and fence must not both be equal to VK_NULL_HANDLE" + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-deviceMask-01290", + "text": " deviceMask must be a valid device mask" + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-deviceMask-01291", + "text": " deviceMask must not be zero" + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-semaphore-01804", + "text": " semaphore and fence must not both be equal to VK_NULL_HANDLE." + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR" + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-swapchain-parameter", + "text": " swapchain must be a valid VkSwapchainKHR handle" + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-semaphore-parameter", + "text": " If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle" + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-fence-parameter", + "text": " If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle" + }, + { + "vuid": "VUID-VkAcquireNextImageInfoKHR-commonparent", + "text": " Each of fence, semaphore, and swapchain that are valid handles must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkQueuePresentKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)": [ + { + "vuid": "VUID-vkQueuePresentKHR-pSwapchains-01292", + "text": " 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" + }, + { + "vuid": "VUID-vkQueuePresentKHR-pWaitSemaphores-01294", + "text": " When a semaphore unsignal operation defined by the elements of the pWaitSemaphores member of pPresentInfo executes on queue, no other queue must be waiting on the same semaphore." + }, + { + "vuid": "VUID-vkQueuePresentKHR-pWaitSemaphores-01295", + "text": " All elements of the pWaitSemaphores member of pPresentInfo must be semaphores that are signaled, or have &amp;lt;&amp;lt;synchronization-semaphores-signaling, semaphore signal operations&amp;gt;&amp;gt; previously submitted for execution." + }, + { + "vuid": "VUID-vkQueuePresentKHR-queue-parameter", + "text": " queue must be a valid VkQueue handle" + }, + { + "vuid": "VUID-vkQueuePresentKHR-pPresentInfo-parameter", + "text": " pPresentInfo must be a valid pointer to a valid VkPresentInfoKHR structure" + } + ], + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_display_swapchain)": [ + { + "vuid": "VUID-vkQueuePresentKHR-pSwapchains-01293", + "text": " 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" + } + ] + }, + "VkPresentInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+!(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-VkPresentInfoKHR-pImageIndices-01296", + "text": " 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" + } + ], + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_shared_presentable_image)": [ + { + "vuid": "VUID-VkPresentInfoKHR-pImageIndices-01430", + "text": " 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" + } + ], + "(VK_KHR_surface)+(VK_KHR_swapchain)": [ + { + "vuid": "VUID-VkPresentInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PRESENT_INFO_KHR" + }, + { + "vuid": "VUID-VkPresentInfoKHR-pNext-pNext", + "text": " 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, VkPresentRegionsKHR, or VkPresentTimesInfoGOOGLE" + }, + { + "vuid": "VUID-VkPresentInfoKHR-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + }, + { + "vuid": "VUID-VkPresentInfoKHR-pWaitSemaphores-parameter", + "text": " If waitSemaphoreCount is not 0, pWaitSemaphores must be a valid pointer to an array of waitSemaphoreCount valid VkSemaphore handles" + }, + { + "vuid": "VUID-VkPresentInfoKHR-pSwapchains-parameter", + "text": " pSwapchains must be a valid pointer to an array of swapchainCount valid VkSwapchainKHR handles" + }, + { + "vuid": "VUID-VkPresentInfoKHR-pImageIndices-parameter", + "text": " pImageIndices must be a valid pointer to an array of swapchainCount uint32_t values" + }, + { + "vuid": "VUID-VkPresentInfoKHR-pResults-parameter", + "text": " If pResults is not NULL, pResults must be a valid pointer to an array of swapchainCount VkResult values" + }, + { + "vuid": "VUID-VkPresentInfoKHR-swapchainCount-arraylength", + "text": " swapchainCount must be greater than 0" + }, + { + "vuid": "VUID-VkPresentInfoKHR-commonparent", + "text": " Both of the elements of pSwapchains, and the elements of pWaitSemaphores that are valid handles must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "VkPresentRegionsKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_incremental_present)": [ + { + "vuid": "VUID-VkPresentRegionsKHR-swapchainCount-01260", + "text": " swapchainCount must be the same value as VkPresentInfoKHR::swapchainCount, where VkPresentInfoKHR is in the pNext-chain of this VkPresentRegionsKHR structure." + }, + { + "vuid": "VUID-VkPresentRegionsKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR" + }, + { + "vuid": "VUID-VkPresentRegionsKHR-pRegions-parameter", + "text": " If pRegions is not NULL, pRegions must be a valid pointer to an array of swapchainCount valid VkPresentRegionKHR structures" + }, + { + "vuid": "VUID-VkPresentRegionsKHR-swapchainCount-arraylength", + "text": " swapchainCount must be greater than 0" + } + ] + }, + "VkPresentRegionKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_incremental_present)": [ + { + "vuid": "VUID-VkPresentRegionKHR-pRectangles-parameter", + "text": " If rectangleCount is not 0, and pRectangles is not NULL, pRectangles must be a valid pointer to an array of rectangleCount VkRectLayerKHR structures" + } + ] + }, + "VkRectLayerKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_incremental_present)": [ + { + "vuid": "VUID-VkRectLayerKHR-offset-01261", + "text": " The sum of offset and extent must be no greater than the imageExtent member of the VkSwapchainCreateInfoKHR structure given to vkCreateSwapchainKHR." + }, + { + "vuid": "VUID-VkRectLayerKHR-layer-01262", + "text": " layer must be less than imageArrayLayers member of the VkSwapchainCreateInfoKHR structure given to vkCreateSwapchainKHR." + } + ] + }, + "VkDisplayPresentInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_display_swapchain)": [ + { + "vuid": "VUID-VkDisplayPresentInfoKHR-srcRect-01257", + "text": " srcRect must specify a rectangular region that is a subset of the image being presented" + }, + { + "vuid": "VUID-VkDisplayPresentInfoKHR-dstRect-01258", + "text": " dstRect must specify a rectangular region that is a subset of the visibleRegion parameter of the display mode the swapchain being presented uses" + }, + { + "vuid": "VUID-VkDisplayPresentInfoKHR-persistentContent-01259", + "text": " If the persistentContent member of the VkDisplayPropertiesKHR structure returned by vkGetPhysicalDeviceDisplayPropertiesKHR for the display the present operation targets then persistent must be VK_FALSE" + }, + { + "vuid": "VUID-VkDisplayPresentInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR" + } + ] + }, + "VkDeviceGroupPresentInfoKHR": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)": [ + { + "vuid": "VUID-VkDeviceGroupPresentInfoKHR-swapchainCount-01297", + "text": " swapchainCount must equal 0 or VkPresentInfoKHR::swapchainCount" + }, + { + "vuid": "VUID-VkDeviceGroupPresentInfoKHR-mode-01298", + "text": " 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" + }, + { + "vuid": "VUID-VkDeviceGroupPresentInfoKHR-mode-01299", + "text": " 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." + }, + { + "vuid": "VUID-VkDeviceGroupPresentInfoKHR-mode-01300", + "text": " 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" + }, + { + "vuid": "VUID-VkDeviceGroupPresentInfoKHR-mode-01301", + "text": " 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" + }, + { + "vuid": "VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-01302", + "text": " 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" + }, + { + "vuid": "VUID-VkDeviceGroupPresentInfoKHR-mode-01303", + "text": " mode must have exactly one bit set, and that bit must have been included in VkDeviceGroupSwapchainCreateInfoKHR::modes" + }, + { + "vuid": "VUID-VkDeviceGroupPresentInfoKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR" + }, + { + "vuid": "VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-parameter", + "text": " If swapchainCount is not 0, pDeviceMasks must be a valid pointer to an array of swapchainCount uint32_t values" + }, + { + "vuid": "VUID-VkDeviceGroupPresentInfoKHR-mode-parameter", + "text": " mode must be a valid VkDeviceGroupPresentModeFlagBitsKHR value" + } + ] + }, + "VkPresentTimesInfoGOOGLE": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_GOOGLE_display_timing)": [ + { + "vuid": "VUID-VkPresentTimesInfoGOOGLE-swapchainCount-01247", + "text": " swapchainCount must be the same value as VkPresentInfoKHR::swapchainCount, where VkPresentInfoKHR is in the pNext chain of this VkPresentTimesInfoGOOGLE structure." + }, + { + "vuid": "VUID-VkPresentTimesInfoGOOGLE-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE" + }, + { + "vuid": "VUID-VkPresentTimesInfoGOOGLE-pTimes-parameter", + "text": " If pTimes is not NULL, pTimes must be a valid pointer to an array of swapchainCount VkPresentTimeGOOGLE structures" + }, + { + "vuid": "VUID-VkPresentTimesInfoGOOGLE-swapchainCount-arraylength", + "text": " swapchainCount must be greater than 0" + } + ] + }, + "vkSetHdrMetadataEXT": { + "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_EXT_hdr_metadata)": [ + { + "vuid": "VUID-vkSetHdrMetadataEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkSetHdrMetadataEXT-pSwapchains-parameter", + "text": " pSwapchains must be a valid pointer to an array of swapchainCount valid VkSwapchainKHR handles" + }, + { + "vuid": "VUID-vkSetHdrMetadataEXT-pMetadata-parameter", + "text": " pMetadata must be a valid pointer to an array of swapchainCount valid VkHdrMetadataEXT structures" + }, + { + "vuid": "VUID-vkSetHdrMetadataEXT-swapchainCount-arraylength", + "text": " swapchainCount must be greater than 0" + }, + { + "vuid": "VUID-vkSetHdrMetadataEXT-commonparent", + "text": " Both of device, and the elements of pSwapchains must have been created, allocated, or retrieved from the same VkInstance" + } + ] + }, + "vkEnumerateInstanceLayerProperties": { + "core": [ + { + "vuid": "VUID-vkEnumerateInstanceLayerProperties-pPropertyCount-parameter", + "text": " pPropertyCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkEnumerateInstanceLayerProperties-pProperties-parameter", + "text": " 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" + } + ] + }, + "vkEnumerateDeviceLayerProperties": { + "core": [ + { + "vuid": "VUID-vkEnumerateDeviceLayerProperties-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkEnumerateDeviceLayerProperties-pPropertyCount-parameter", + "text": " pPropertyCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkEnumerateDeviceLayerProperties-pProperties-parameter", + "text": " 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" + } + ] + }, + "vkEnumerateInstanceExtensionProperties": { + "core": [ + { + "vuid": "VUID-vkEnumerateInstanceExtensionProperties-pLayerName-parameter", + "text": " If pLayerName is not NULL, pLayerName must be a null-terminated UTF-8 string" + }, + { + "vuid": "VUID-vkEnumerateInstanceExtensionProperties-pPropertyCount-parameter", + "text": " pPropertyCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkEnumerateInstanceExtensionProperties-pProperties-parameter", + "text": " 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" + } + ] + }, + "vkEnumerateDeviceExtensionProperties": { + "core": [ + { + "vuid": "VUID-vkEnumerateDeviceExtensionProperties-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkEnumerateDeviceExtensionProperties-pLayerName-parameter", + "text": " If pLayerName is not NULL, pLayerName must be a null-terminated UTF-8 string" + }, + { + "vuid": "VUID-vkEnumerateDeviceExtensionProperties-pPropertyCount-parameter", + "text": " pPropertyCount must be a valid pointer to a uint32_t value" + }, + { + "vuid": "VUID-vkEnumerateDeviceExtensionProperties-pProperties-parameter", + "text": " 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" + } + ] + }, + "vkGetPhysicalDeviceFeatures": { + "core": [ + { + "vuid": "VUID-vkGetPhysicalDeviceFeatures-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceFeatures-pFeatures-parameter", + "text": " pFeatures must be a valid pointer to a VkPhysicalDeviceFeatures structure" + } + ] + }, + "vkGetPhysicalDeviceFeatures2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceFeatures2-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceFeatures2-pFeatures-parameter", + "text": " pFeatures must be a valid pointer to a VkPhysicalDeviceFeatures2 structure" + } + ] + }, + "VkPhysicalDeviceFeatures2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkPhysicalDeviceFeatures2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2" + } + ] + }, + "VkPhysicalDeviceVariablePointerFeatures": { + "(VK_VERSION_1_1,VK_KHR_variable_pointers)": [ + { + "vuid": "VUID-VkPhysicalDeviceVariablePointerFeatures-variablePointers-01431", + "text": " If variablePointers is enabled then variablePointersStorageBuffer must also be enabled." + }, + { + "vuid": "VUID-VkPhysicalDeviceVariablePointerFeatures-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES" + } + ] + }, + "VkPhysicalDeviceMultiviewFeatures": { + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580", + "text": " If multiviewGeometryShader is enabled then multiview must also be enabled." + }, + { + "vuid": "VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581", + "text": " If multiviewTessellationShader is enabled then multiview must also be enabled." + }, + { + "vuid": "VUID-VkPhysicalDeviceMultiviewFeatures-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES" + } + ] + }, + "VkPhysicalDevice16BitStorageFeatures": { + "(VK_VERSION_1_1,VK_KHR_16bit_storage)": [ + { + "vuid": "VUID-VkPhysicalDevice16BitStorageFeatures-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES" + } + ] + }, + "VkPhysicalDeviceSamplerYcbcrConversionFeatures": { + "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkPhysicalDeviceSamplerYcbcrConversionFeatures-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES" + } + ] + }, + "VkPhysicalDeviceProtectedMemoryFeatures": { + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-VkPhysicalDeviceProtectedMemoryFeatures-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES" + } + ] + }, + "VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT": { + "(VK_EXT_blend_operation_advanced)": [ + { + "vuid": "VUID-VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT" + } + ] + }, + "VkPhysicalDeviceShaderDrawParameterFeatures": { + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-VkPhysicalDeviceShaderDrawParameterFeatures-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES" + } + ] + }, + "VkPhysicalDeviceDescriptorIndexingFeaturesEXT": { + "(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-VkPhysicalDeviceDescriptorIndexingFeaturesEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT" + } + ] + }, + "VkPhysicalDevicePushDescriptorPropertiesKHR": { + "(VK_KHR_push_descriptor)": [ + { + "vuid": "VUID-VkPhysicalDevicePushDescriptorPropertiesKHR-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR" + } + ] + }, + "VkPhysicalDeviceMultiviewProperties": { + "(VK_VERSION_1_1,VK_KHR_multiview)": [ + { + "vuid": "VUID-VkPhysicalDeviceMultiviewProperties-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES" + } + ] + }, + "VkPhysicalDeviceDiscardRectanglePropertiesEXT": { + "(VK_EXT_discard_rectangles)": [ + { + "vuid": "VUID-VkPhysicalDeviceDiscardRectanglePropertiesEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT" + } + ] + }, + "VkPhysicalDeviceSampleLocationsPropertiesEXT": { + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-VkPhysicalDeviceSampleLocationsPropertiesEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT" + } + ] + }, + "VkPhysicalDeviceExternalMemoryHostPropertiesEXT": { + "(VK_EXT_external_memory_host)": [ + { + "vuid": "VUID-VkPhysicalDeviceExternalMemoryHostPropertiesEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT" + } + ] + }, + "VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX": { + "(VK_NVX_multiview_per_view_attributes)": [ + { + "vuid": "VUID-VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX" + } + ] + }, + "VkPhysicalDevicePointClippingProperties": { + "(VK_VERSION_1_1,VK_KHR_maintenance2)": [ + { + "vuid": "VUID-VkPhysicalDevicePointClippingProperties-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES" + } + ] + }, + "VkPhysicalDeviceSubgroupProperties": { + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-VkPhysicalDeviceSubgroupProperties-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES" + } + ] + }, + "VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT": { + "(VK_EXT_blend_operation_advanced)": [ + { + "vuid": "VUID-VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT" + } + ] + }, + "VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT": { + "(VK_EXT_vertex_attribute_divisor)": [ + { + "vuid": "VUID-VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT" + } + ] + }, + "VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT": { + "(VK_EXT_sampler_filter_minmax)": [ + { + "vuid": "VUID-VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT" + } + ] + }, + "VkPhysicalDeviceProtectedMemoryProperties": { + "(VK_VERSION_1_1)": [ + { + "vuid": "VUID-VkPhysicalDeviceProtectedMemoryProperties-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES" + } + ] + }, + "VkPhysicalDeviceMaintenance3Properties": { + "(VK_VERSION_1_1,VK_KHR_maintenance3)": [ + { + "vuid": "VUID-VkPhysicalDeviceMaintenance3Properties-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES" + } + ] + }, + "VkPhysicalDeviceDescriptorIndexingPropertiesEXT": { + "(VK_EXT_descriptor_indexing)": [ + { + "vuid": "VUID-VkPhysicalDeviceDescriptorIndexingPropertiesEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT" + } + ] + }, + "VkPhysicalDeviceConservativeRasterizationPropertiesEXT": { + "(VK_EXT_conservative_rasterization)": [ + { + "vuid": "VUID-VkPhysicalDeviceConservativeRasterizationPropertiesEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT" + } + ] + }, + "VkPhysicalDeviceShaderCorePropertiesAMD": { + "(VK_AMD_shader_core_properties)": [ + { + "vuid": "VUID-VkPhysicalDeviceShaderCorePropertiesAMD-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD" + } + ] + }, + "vkGetPhysicalDeviceMultisamplePropertiesEXT": { + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-samples-parameter", + "text": " samples must be a valid VkSampleCountFlagBits value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-pMultisampleProperties-parameter", + "text": " pMultisampleProperties must be a valid pointer to a VkMultisamplePropertiesEXT structure" + } + ] + }, + "VkMultisamplePropertiesEXT": { + "(VK_EXT_sample_locations)": [ + { + "vuid": "VUID-VkMultisamplePropertiesEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT" + }, + { + "vuid": "VUID-VkMultisamplePropertiesEXT-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "vkGetPhysicalDeviceFormatProperties": { + "core": [ + { + "vuid": "VUID-vkGetPhysicalDeviceFormatProperties-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceFormatProperties-format-parameter", + "text": " format must be a valid VkFormat value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceFormatProperties-pFormatProperties-parameter", + "text": " pFormatProperties must be a valid pointer to a VkFormatProperties structure" + } + ] + }, + "vkGetPhysicalDeviceFormatProperties2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceFormatProperties2-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceFormatProperties2-format-parameter", + "text": " format must be a valid VkFormat value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceFormatProperties2-pFormatProperties-parameter", + "text": " pFormatProperties must be a valid pointer to a VkFormatProperties2 structure" + } + ] + }, + "VkFormatProperties2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkFormatProperties2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2" + }, + { + "vuid": "VUID-VkFormatProperties2-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "vkGetPhysicalDeviceImageFormatProperties": { + "core": [ + { + "vuid": "VUID-vkGetPhysicalDeviceImageFormatProperties-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceImageFormatProperties-format-parameter", + "text": " format must be a valid VkFormat value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceImageFormatProperties-type-parameter", + "text": " type must be a valid VkImageType value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceImageFormatProperties-tiling-parameter", + "text": " tiling must be a valid VkImageTiling value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceImageFormatProperties-usage-parameter", + "text": " usage must be a valid combination of VkImageUsageFlagBits values" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceImageFormatProperties-usage-requiredbitmask", + "text": " usage must not be 0" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceImageFormatProperties-flags-parameter", + "text": " flags must be a valid combination of VkImageCreateFlagBits values" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceImageFormatProperties-pImageFormatProperties-parameter", + "text": " pImageFormatProperties must be a valid pointer to a VkImageFormatProperties structure" + } + ] + }, + "vkGetPhysicalDeviceExternalImageFormatPropertiesNV": { + "(VK_NV_external_memory_capabilities)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-format-parameter", + "text": " format must be a valid VkFormat value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-type-parameter", + "text": " type must be a valid VkImageType value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-tiling-parameter", + "text": " tiling must be a valid VkImageTiling value" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-parameter", + "text": " usage must be a valid combination of VkImageUsageFlagBits values" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-requiredbitmask", + "text": " usage must not be 0" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-flags-parameter", + "text": " flags must be a valid combination of VkImageCreateFlagBits values" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-externalHandleType-parameter", + "text": " externalHandleType must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-pExternalImageFormatProperties-parameter", + "text": " pExternalImageFormatProperties must be a valid pointer to a VkExternalImageFormatPropertiesNV structure" + } + ] + }, + "vkGetPhysicalDeviceImageFormatProperties2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-01868", + "text": " If the pNext chain of pImageFormatProperties contains an instance of VkAndroidHardwareBufferUsageANDROID, the pNext chain of pImageFormatInfo must contain an instance of VkPhysicalDeviceExternalImageFormatInfo with handleType set to VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID." + } + ], + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatInfo-parameter", + "text": " pImageFormatInfo must be a valid pointer to a valid VkPhysicalDeviceImageFormatInfo2 structure" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatProperties-parameter", + "text": " pImageFormatProperties must be a valid pointer to a VkImageFormatProperties2 structure" + } + ] + }, + "VkPhysicalDeviceImageFormatInfo2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkPhysicalDeviceImageFormatInfo2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2" + }, + { + "vuid": "VUID-VkPhysicalDeviceImageFormatInfo2-pNext-pNext", + "text": " pNext must be NULL or a pointer to a valid instance of VkPhysicalDeviceExternalImageFormatInfo" + }, + { + "vuid": "VUID-VkPhysicalDeviceImageFormatInfo2-format-parameter", + "text": " format must be a valid VkFormat value" + }, + { + "vuid": "VUID-VkPhysicalDeviceImageFormatInfo2-type-parameter", + "text": " type must be a valid VkImageType value" + }, + { + "vuid": "VUID-VkPhysicalDeviceImageFormatInfo2-tiling-parameter", + "text": " tiling must be a valid VkImageTiling value" + }, + { + "vuid": "VUID-VkPhysicalDeviceImageFormatInfo2-usage-parameter", + "text": " usage must be a valid combination of VkImageUsageFlagBits values" + }, + { + "vuid": "VUID-VkPhysicalDeviceImageFormatInfo2-usage-requiredbitmask", + "text": " usage must not be 0" + }, + { + "vuid": "VUID-VkPhysicalDeviceImageFormatInfo2-flags-parameter", + "text": " flags must be a valid combination of VkImageCreateFlagBits values" + } + ] + }, + "VkImageFormatProperties2": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)": [ + { + "vuid": "VUID-VkImageFormatProperties2-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2" + }, + { + "vuid": "VUID-VkImageFormatProperties2-pNext-pNext", + "text": " 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, VkSamplerYcbcrConversionImageFormatProperties, or VkTextureLODGatherFormatPropertiesAMD" + }, + { + "vuid": "VUID-VkImageFormatProperties2-sType-unique", + "text": " Each sType member in the pNext chain must be unique" + } + ] + }, + "VkPhysicalDeviceExternalImageFormatInfo": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)": [ + { + "vuid": "VUID-VkPhysicalDeviceExternalImageFormatInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO" + }, + { + "vuid": "VUID-VkPhysicalDeviceExternalImageFormatInfo-handleType-parameter", + "text": " If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value" + } + ] + }, + "VkExternalImageFormatProperties": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)": [ + { + "vuid": "VUID-VkExternalImageFormatProperties-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES" + } + ] + }, + "VkSamplerYcbcrConversionImageFormatProperties": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [ + { + "vuid": "VUID-VkSamplerYcbcrConversionImageFormatProperties-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES" + } + ] + }, + "VkAndroidHardwareBufferUsageANDROID": { + "(VK_VERSION_1_1,VK_KHR_get_physical_device_properties2)+(VK_ANDROID_external_memory_android_hardware_buffer)": [ + { + "vuid": "VUID-VkAndroidHardwareBufferUsageANDROID-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID" + } + ] + }, + "vkGetPhysicalDeviceExternalBufferProperties": { + "(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceExternalBufferProperties-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferInfo-parameter", + "text": " pExternalBufferInfo must be a valid pointer to a valid VkPhysicalDeviceExternalBufferInfo structure" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferProperties-parameter", + "text": " pExternalBufferProperties must be a valid pointer to a VkExternalBufferProperties structure" + } + ] + }, + "VkPhysicalDeviceExternalBufferInfo": { + "(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)": [ + { + "vuid": "VUID-VkPhysicalDeviceExternalBufferInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO" + }, + { + "vuid": "VUID-VkPhysicalDeviceExternalBufferInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkPhysicalDeviceExternalBufferInfo-flags-parameter", + "text": " flags must be a valid combination of VkBufferCreateFlagBits values" + }, + { + "vuid": "VUID-VkPhysicalDeviceExternalBufferInfo-usage-parameter", + "text": " usage must be a valid combination of VkBufferUsageFlagBits values" + }, + { + "vuid": "VUID-VkPhysicalDeviceExternalBufferInfo-usage-requiredbitmask", + "text": " usage must not be 0" + }, + { + "vuid": "VUID-VkPhysicalDeviceExternalBufferInfo-handleType-parameter", + "text": " handleType must be a valid VkExternalMemoryHandleTypeFlagBits value" + } + ] + }, + "VkExternalBufferProperties": { + "(VK_VERSION_1_1,VK_KHR_external_memory_capabilities)": [ + { + "vuid": "VUID-VkExternalBufferProperties-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES" + }, + { + "vuid": "VUID-VkExternalBufferProperties-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "vkGetPhysicalDeviceExternalSemaphoreProperties": { + "(VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreInfo-parameter", + "text": " pExternalSemaphoreInfo must be a valid pointer to a valid VkPhysicalDeviceExternalSemaphoreInfo structure" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreProperties-parameter", + "text": " pExternalSemaphoreProperties must be a valid pointer to a VkExternalSemaphoreProperties structure" + } + ] + }, + "VkPhysicalDeviceExternalSemaphoreInfo": { + "(VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities)": [ + { + "vuid": "VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO" + }, + { + "vuid": "VUID-VkPhysicalDeviceExternalSemaphoreInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkPhysicalDeviceExternalSemaphoreInfo-handleType-parameter", + "text": " handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value" + } + ] + }, + "VkExternalSemaphoreProperties": { + "(VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities)": [ + { + "vuid": "VUID-VkExternalSemaphoreProperties-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES" + }, + { + "vuid": "VUID-VkExternalSemaphoreProperties-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "vkGetPhysicalDeviceExternalFenceProperties": { + "(VK_VERSION_1_1,VK_KHR_external_fence_capabilities)": [ + { + "vuid": "VUID-vkGetPhysicalDeviceExternalFenceProperties-physicalDevice-parameter", + "text": " physicalDevice must be a valid VkPhysicalDevice handle" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceInfo-parameter", + "text": " pExternalFenceInfo must be a valid pointer to a valid VkPhysicalDeviceExternalFenceInfo structure" + }, + { + "vuid": "VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceProperties-parameter", + "text": " pExternalFenceProperties must be a valid pointer to a VkExternalFenceProperties structure" + } + ] + }, + "VkPhysicalDeviceExternalFenceInfo": { + "(VK_VERSION_1_1,VK_KHR_external_fence_capabilities)": [ + { + "vuid": "VUID-VkPhysicalDeviceExternalFenceInfo-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO" + }, + { + "vuid": "VUID-VkPhysicalDeviceExternalFenceInfo-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkPhysicalDeviceExternalFenceInfo-handleType-parameter", + "text": " handleType must be a valid VkExternalFenceHandleTypeFlagBits value" + } + ] + }, + "VkExternalFenceProperties": { + "(VK_VERSION_1_1,VK_KHR_external_fence_capabilities)": [ + { + "vuid": "VUID-VkExternalFenceProperties-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES" + }, + { + "vuid": "VUID-VkExternalFenceProperties-pNext-pNext", + "text": " pNext must be NULL" + } + ] + }, + "vkSetDebugUtilsObjectNameEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-vkSetDebugUtilsObjectNameEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-parameter", + "text": " pNameInfo must be a valid pointer to a valid VkDebugUtilsObjectNameInfoEXT structure" + } + ] + }, + "VkDebugUtilsObjectNameInfoEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-VkDebugUtilsObjectNameInfoEXT-objectType-01905", + "text": " objectType must not be VK_OBJECT_TYPE_UNKNOWN" + }, + { + "vuid": "VUID-VkDebugUtilsObjectNameInfoEXT-objectHandle-01906", + "text": " objectHandle must not be VK_NULL_HANDLE" + }, + { + "vuid": "VUID-VkDebugUtilsObjectNameInfoEXT-objectHandle-01907", + "text": " objectHandle must be a Vulkan object of the type associated with objectType as defined in &amp;lt;&amp;lt;debugging-object-types&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkDebugUtilsObjectNameInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT" + }, + { + "vuid": "VUID-VkDebugUtilsObjectNameInfoEXT-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDebugUtilsObjectNameInfoEXT-objectType-parameter", + "text": " objectType must be a valid VkObjectType value" + }, + { + "vuid": "VUID-VkDebugUtilsObjectNameInfoEXT-pObjectName-parameter", + "text": " If pObjectName is not NULL, pObjectName must be a null-terminated UTF-8 string" + } + ] + }, + "vkSetDebugUtilsObjectTagEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-vkSetDebugUtilsObjectTagEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkSetDebugUtilsObjectTagEXT-pTagInfo-parameter", + "text": " pTagInfo must be a valid pointer to a valid VkDebugUtilsObjectTagInfoEXT structure" + } + ] + }, + "VkDebugUtilsObjectTagInfoEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-VkDebugUtilsObjectTagInfoEXT-objectType-01908", + "text": " objectType must not be VK_OBJECT_TYPE_UNKNOWN" + }, + { + "vuid": "VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01909", + "text": " objectHandle must not be VK_NULL_HANDLE" + }, + { + "vuid": "VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01910", + "text": " objectHandle must be a Vulkan object of the type associated with objectType as defined in &amp;lt;&amp;lt;debugging-object-types&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkDebugUtilsObjectTagInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT" + }, + { + "vuid": "VUID-VkDebugUtilsObjectTagInfoEXT-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDebugUtilsObjectTagInfoEXT-objectType-parameter", + "text": " objectType must be a valid VkObjectType value" + }, + { + "vuid": "VUID-VkDebugUtilsObjectTagInfoEXT-pTag-parameter", + "text": " pTag must be a valid pointer to an array of tagSize bytes" + }, + { + "vuid": "VUID-VkDebugUtilsObjectTagInfoEXT-tagSize-arraylength", + "text": " tagSize must be greater than 0" + } + ] + }, + "vkQueueBeginDebugUtilsLabelEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-vkQueueBeginDebugUtilsLabelEXT-queue-parameter", + "text": " queue must be a valid VkQueue handle" + }, + { + "vuid": "VUID-vkQueueBeginDebugUtilsLabelEXT-pLabelInfo-parameter", + "text": " pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure" + } + ] + }, + "VkDebugUtilsLabelEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-VkDebugUtilsLabelEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT" + }, + { + "vuid": "VUID-VkDebugUtilsLabelEXT-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDebugUtilsLabelEXT-pLabelName-parameter", + "text": " pLabelName must be a null-terminated UTF-8 string" + } + ] + }, + "vkQueueEndDebugUtilsLabelEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-vkQueueEndDebugUtilsLabelEXT-None-01911", + "text": " There must be an outstanding vkQueueBeginDebugUtilsLabelEXT command prior to the vkQueueEndDebugUtilsLabelEXT on the queue" + }, + { + "vuid": "VUID-vkQueueEndDebugUtilsLabelEXT-queue-parameter", + "text": " queue must be a valid VkQueue handle" + } + ] + }, + "vkQueueInsertDebugUtilsLabelEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-vkQueueInsertDebugUtilsLabelEXT-queue-parameter", + "text": " queue must be a valid VkQueue handle" + }, + { + "vuid": "VUID-vkQueueInsertDebugUtilsLabelEXT-pLabelInfo-parameter", + "text": " pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure" + } + ] + }, + "vkCmdBeginDebugUtilsLabelEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdBeginDebugUtilsLabelEXT-pLabelInfo-parameter", + "text": " pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure" + }, + { + "vuid": "VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + } + ] + }, + "vkCmdEndDebugUtilsLabelEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01912", + "text": " There must be an outstanding vkCmdBeginDebugUtilsLabelEXT command prior to the vkCmdEndDebugUtilsLabelEXT on the queue that commandBuffer is submitted to" + }, + { + "vuid": "VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01913", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + } + ] + }, + "vkCmdInsertDebugUtilsLabelEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdInsertDebugUtilsLabelEXT-pLabelInfo-parameter", + "text": " pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure" + }, + { + "vuid": "VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + } + ] + }, + "vkCreateDebugUtilsMessengerEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-vkCreateDebugUtilsMessengerEXT-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkCreateDebugUtilsMessengerEXT-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkDebugUtilsMessengerCreateInfoEXT structure" + }, + { + "vuid": "VUID-vkCreateDebugUtilsMessengerEXT-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateDebugUtilsMessengerEXT-pMessenger-parameter", + "text": " pMessenger must be a valid pointer to a VkDebugUtilsMessengerEXT handle" + } + ] + }, + "VkDebugUtilsMessengerCreateInfoEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-01914", + "text": " pfnUserCallback must be a valid PFN_vkDebugUtilsMessengerCallbackEXT" + }, + { + "vuid": "VUID-VkDebugUtilsMessengerCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkDebugUtilsMessengerCreateInfoEXT-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-parameter", + "text": " messageSeverity must be a valid combination of VkDebugUtilsMessageSeverityFlagBitsEXT values" + }, + { + "vuid": "VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-requiredbitmask", + "text": " messageSeverity must not be 0" + }, + { + "vuid": "VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-parameter", + "text": " messageType must be a valid combination of VkDebugUtilsMessageTypeFlagBitsEXT values" + }, + { + "vuid": "VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-requiredbitmask", + "text": " messageType must not be 0" + } + ] + }, + "VkDebugUtilsMessengerCallbackDataEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-VkDebugUtilsMessengerCallbackDataEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT" + }, + { + "vuid": "VUID-VkDebugUtilsMessengerCallbackDataEXT-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDebugUtilsMessengerCallbackDataEXT-flags-zerobitmask", + "text": " flags must be 0" + }, + { + "vuid": "VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessageIdName-parameter", + "text": " If pMessageIdName is not NULL, pMessageIdName must be a null-terminated UTF-8 string" + }, + { + "vuid": "VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessage-parameter", + "text": " pMessage must be a null-terminated UTF-8 string" + }, + { + "vuid": "VUID-VkDebugUtilsMessengerCallbackDataEXT-objectCount-arraylength", + "text": " objectCount must be greater than 0" + } + ] + }, + "vkSubmitDebugUtilsMessageEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-vkSubmitDebugUtilsMessageEXT-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkSubmitDebugUtilsMessageEXT-messageSeverity-parameter", + "text": " messageSeverity must be a valid VkDebugUtilsMessageSeverityFlagBitsEXT value" + }, + { + "vuid": "VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-parameter", + "text": " messageTypes must be a valid combination of VkDebugUtilsMessageTypeFlagBitsEXT values" + }, + { + "vuid": "VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-requiredbitmask", + "text": " messageTypes must not be 0" + }, + { + "vuid": "VUID-vkSubmitDebugUtilsMessageEXT-pCallbackData-parameter", + "text": " pCallbackData must be a valid pointer to a valid VkDebugUtilsMessengerCallbackDataEXT structure" + } + ] + }, + "vkDestroyDebugUtilsMessengerEXT": { + "(VK_EXT_debug_utils)": [ + { + "vuid": "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01915", + "text": " If VkAllocationCallbacks were provided when messenger was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01916", + "text": " If no VkAllocationCallbacks were provided when messenger was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyDebugUtilsMessengerEXT-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parameter", + "text": " messenger must be a valid VkDebugUtilsMessengerEXT handle" + }, + { + "vuid": "VUID-vkDestroyDebugUtilsMessengerEXT-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent", + "text": " messenger must have been created, allocated, or retrieved from instance" + } + ] + }, + "vkDebugMarkerSetObjectNameEXT": { + "(VK_EXT_debug_marker)": [ + { + "vuid": "VUID-vkDebugMarkerSetObjectNameEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDebugMarkerSetObjectNameEXT-pNameInfo-parameter", + "text": " pNameInfo must be a valid pointer to a valid VkDebugMarkerObjectNameInfoEXT structure" + } + ] + }, + "VkDebugMarkerObjectNameInfoEXT": { + "(VK_EXT_debug_marker)": [ + { + "vuid": "VUID-VkDebugMarkerObjectNameInfoEXT-objectType-01490", + "text": " objectType must not be VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT" + }, + { + "vuid": "VUID-VkDebugMarkerObjectNameInfoEXT-object-01491", + "text": " object must not be VK_NULL_HANDLE" + }, + { + "vuid": "VUID-VkDebugMarkerObjectNameInfoEXT-object-01492", + "text": " object must be a Vulkan object of the type associated with objectType as defined in &amp;lt;&amp;lt;debug-report-object-types&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkDebugMarkerObjectNameInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT" + }, + { + "vuid": "VUID-VkDebugMarkerObjectNameInfoEXT-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDebugMarkerObjectNameInfoEXT-objectType-parameter", + "text": " objectType must be a valid VkDebugReportObjectTypeEXT value" + }, + { + "vuid": "VUID-VkDebugMarkerObjectNameInfoEXT-pObjectName-parameter", + "text": " pObjectName must be a null-terminated UTF-8 string" + } + ] + }, + "vkDebugMarkerSetObjectTagEXT": { + "(VK_EXT_debug_marker)": [ + { + "vuid": "VUID-vkDebugMarkerSetObjectTagEXT-device-parameter", + "text": " device must be a valid VkDevice handle" + }, + { + "vuid": "VUID-vkDebugMarkerSetObjectTagEXT-pTagInfo-parameter", + "text": " pTagInfo must be a valid pointer to a valid VkDebugMarkerObjectTagInfoEXT structure" + } + ] + }, + "VkDebugMarkerObjectTagInfoEXT": { + "(VK_EXT_debug_marker)": [ + { + "vuid": "VUID-VkDebugMarkerObjectTagInfoEXT-objectType-01493", + "text": " objectType must not be VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT" + }, + { + "vuid": "VUID-VkDebugMarkerObjectTagInfoEXT-object-01494", + "text": " object must not be VK_NULL_HANDLE" + }, + { + "vuid": "VUID-VkDebugMarkerObjectTagInfoEXT-object-01495", + "text": " object must be a Vulkan object of the type associated with objectType as defined in &amp;lt;&amp;lt;debug-report-object-types&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-VkDebugMarkerObjectTagInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT" + }, + { + "vuid": "VUID-VkDebugMarkerObjectTagInfoEXT-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDebugMarkerObjectTagInfoEXT-objectType-parameter", + "text": " objectType must be a valid VkDebugReportObjectTypeEXT value" + }, + { + "vuid": "VUID-VkDebugMarkerObjectTagInfoEXT-pTag-parameter", + "text": " pTag must be a valid pointer to an array of tagSize bytes" + }, + { + "vuid": "VUID-VkDebugMarkerObjectTagInfoEXT-tagSize-arraylength", + "text": " tagSize must be greater than 0" + } + ] + }, + "vkCmdDebugMarkerBeginEXT": { + "(VK_EXT_debug_marker)": [ + { + "vuid": "VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdDebugMarkerBeginEXT-pMarkerInfo-parameter", + "text": " pMarkerInfo must be a valid pointer to a valid VkDebugMarkerMarkerInfoEXT structure" + }, + { + "vuid": "VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + } + ] + }, + "VkDebugMarkerMarkerInfoEXT": { + "(VK_EXT_debug_marker)": [ + { + "vuid": "VUID-VkDebugMarkerMarkerInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT" + }, + { + "vuid": "VUID-VkDebugMarkerMarkerInfoEXT-pNext-pNext", + "text": " pNext must be NULL" + }, + { + "vuid": "VUID-VkDebugMarkerMarkerInfoEXT-pMarkerName-parameter", + "text": " pMarkerName must be a null-terminated UTF-8 string" + } + ] + }, + "vkCmdDebugMarkerEndEXT": { + "(VK_EXT_debug_marker)": [ + { + "vuid": "VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01239", + "text": " There must be an outstanding vkCmdDebugMarkerBeginEXT command prior to the vkCmdDebugMarkerEndEXT on the queue that commandBuffer is submitted to" + }, + { + "vuid": "VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01240", + "text": " 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." + }, + { + "vuid": "VUID-vkCmdDebugMarkerEndEXT-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdDebugMarkerEndEXT-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDebugMarkerEndEXT-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + } + ] + }, + "vkCmdDebugMarkerInsertEXT": { + "(VK_EXT_debug_marker)": [ + { + "vuid": "VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-parameter", + "text": " commandBuffer must be a valid VkCommandBuffer handle" + }, + { + "vuid": "VUID-vkCmdDebugMarkerInsertEXT-pMarkerInfo-parameter", + "text": " pMarkerInfo must be a valid pointer to a valid VkDebugMarkerMarkerInfoEXT structure" + }, + { + "vuid": "VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-recording", + "text": " commandBuffer must be in the &amp;lt;&amp;lt;commandbuffers-lifecycle, recording state&amp;gt;&amp;gt;" + }, + { + "vuid": "VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-cmdpool", + "text": " The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations" + } + ] + }, + "vkCreateDebugReportCallbackEXT": { + "(VK_EXT_debug_report)": [ + { + "vuid": "VUID-vkCreateDebugReportCallbackEXT-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkCreateDebugReportCallbackEXT-pCreateInfo-parameter", + "text": " pCreateInfo must be a valid pointer to a valid VkDebugReportCallbackCreateInfoEXT structure" + }, + { + "vuid": "VUID-vkCreateDebugReportCallbackEXT-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkCreateDebugReportCallbackEXT-pCallback-parameter", + "text": " pCallback must be a valid pointer to a VkDebugReportCallbackEXT handle" + } + ] + }, + "VkDebugReportCallbackCreateInfoEXT": { + "(VK_EXT_debug_report)": [ + { + "vuid": "VUID-VkDebugReportCallbackCreateInfoEXT-pfnCallback-01385", + "text": " pfnCallback must be a valid PFN_vkDebugReportCallbackEXT" + }, + { + "vuid": "VUID-VkDebugReportCallbackCreateInfoEXT-sType-sType", + "text": " sType must be VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT" + }, + { + "vuid": "VUID-VkDebugReportCallbackCreateInfoEXT-flags-parameter", + "text": " flags must be a valid combination of VkDebugReportFlagBitsEXT values" + } + ] + }, + "vkDebugReportMessageEXT": { + "(VK_EXT_debug_report)": [ + { + "vuid": "VUID-vkDebugReportMessageEXT-object-01241", + "text": " object must be a Vulkan object or VK_NULL_HANDLE" + }, + { + "vuid": "VUID-vkDebugReportMessageEXT-objectType-01498", + "text": " 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 &amp;lt;&amp;lt;debug-report-object-types&amp;gt;&amp;gt;." + }, + { + "vuid": "VUID-vkDebugReportMessageEXT-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkDebugReportMessageEXT-flags-parameter", + "text": " flags must be a valid combination of VkDebugReportFlagBitsEXT values" + }, + { + "vuid": "VUID-vkDebugReportMessageEXT-flags-requiredbitmask", + "text": " flags must not be 0" + }, + { + "vuid": "VUID-vkDebugReportMessageEXT-objectType-parameter", + "text": " objectType must be a valid VkDebugReportObjectTypeEXT value" + }, + { + "vuid": "VUID-vkDebugReportMessageEXT-pLayerPrefix-parameter", + "text": " pLayerPrefix must be a null-terminated UTF-8 string" + }, + { + "vuid": "VUID-vkDebugReportMessageEXT-pMessage-parameter", + "text": " pMessage must be a null-terminated UTF-8 string" + } + ] + }, + "vkDestroyDebugReportCallbackEXT": { + "(VK_EXT_debug_report)": [ + { + "vuid": "VUID-vkDestroyDebugReportCallbackEXT-instance-01242", + "text": " If VkAllocationCallbacks were provided when callback was created, a compatible set of callbacks must be provided here" + }, + { + "vuid": "VUID-vkDestroyDebugReportCallbackEXT-instance-01243", + "text": " If no VkAllocationCallbacks were provided when callback was created, pAllocator must be NULL" + }, + { + "vuid": "VUID-vkDestroyDebugReportCallbackEXT-instance-parameter", + "text": " instance must be a valid VkInstance handle" + }, + { + "vuid": "VUID-vkDestroyDebugReportCallbackEXT-callback-parameter", + "text": " callback must be a valid VkDebugReportCallbackEXT handle" + }, + { + "vuid": "VUID-vkDestroyDebugReportCallbackEXT-pAllocator-parameter", + "text": " If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure" + }, + { + "vuid": "VUID-vkDestroyDebugReportCallbackEXT-callback-parent", + "text": " callback must have been created, allocated, or retrieved from instance" + } + ] + } + } +} \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/scripts/vk.xml vulkan-1.1.73+dfsg/scripts/vk.xml --- vulkan-1.1.70+dfsg1/scripts/vk.xml 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/vk.xml 2018-04-27 11:24:19.000000000 +0000 @@ -24,7 +24,8 @@ material which is registered by Khronos, such as tags used by extension and layer authors. The authoritative public version of vk.xml is maintained in the master branch of the Khronos Vulkan GitHub project. The authoritative -private version is maintained in the 1.0 branch of the member gitlab server. +private version is maintained in the master branch of the member gitlab +server. @@ -136,7 +137,7 @@ // Vulkan 1.1 version number #define VK_API_VERSION_1_1 VK_MAKE_VERSION(1, 1, 0)// Patch version should always be set to 0 // Version of this file -#define VK_HEADER_VERSION 70 +#define VK_HEADER_VERSION 73
#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object; @@ -156,6 +157,7 @@ struct ANativeWindow; + struct AHardwareBuffer; typedef uint32_t VkSampleMask; typedef uint32_t VkBool32; @@ -293,6 +295,7 @@ typedef VkFlags VkDebugUtilsMessengerCreateFlagsEXT; typedef VkFlags VkDebugUtilsMessengerCallbackDataFlagsEXT; typedef VkFlags VkPipelineRasterizationConservativeStateCreateFlagsEXT; + typedef VkFlags VkDescriptorBindingFlagsEXT; Types which can be void pointers or class pointers, selected at compile time VK_DEFINE_HANDLE(VkInstance) @@ -424,6 +427,7 @@ + Extensions @@ -1406,7 +1410,7 @@ uint32_t maxGeometryOutputVerticesmax number of vertices that can be emitted in geometry stage uint32_t maxGeometryTotalOutputComponentsmax total number of components (all vertices) written in geometry stage fragment stage limits - uint32_t maxFragmentInputComponentsmax number of input compontents read in fragment stage + uint32_t maxFragmentInputComponentsmax number of input components read in fragment stage uint32_t maxFragmentOutputAttachmentsmax number of output attachments written in fragment stage uint32_t maxFragmentDualSrcAttachmentsmax number of output attachments written when using dual source blending uint32_t maxFragmentCombinedOutputResourcesmax total number of storage buffers, storage images and output buffers @@ -1573,7 +1577,7 @@ VkStructureType sType - const void* pNext + const void* pNext VkRect2D srcRectRectangle within the presentable image to read pixel data from when presenting to the display. VkRect2D dstRectRectangle within the current display mode's visible region to display srcRectangle in. VkBool32 persistentFor smart displays, use buffered mode. If the display properties member "persistentMode" is VK_FALSE, this member must always be VK_FALSE. @@ -1686,7 +1690,7 @@ VkStructureType sType - const void* pNext + const void* pNext VkRasterizationOrderAMD rasterizationOrderRasterization order to use for the pipeline @@ -1713,17 +1717,17 @@ VkStructureType sType - const void* pNext + const void* pNext VkBool32 dedicatedAllocationWhether this image uses a dedicated allocation VkStructureType sType - const void* pNext + const void* pNext VkBool32 dedicatedAllocationWhether this buffer uses a dedicated allocation VkStructureType sType - const void* pNext + const void* pNext VkImage imageImage that this allocation will be bound to VkBuffer bufferBuffer that this allocation will be bound to @@ -1757,7 +1761,7 @@ VkStructureType sType - const void* pNext + const void* pNext uint32_t acquireCount const VkDeviceMemory* pAcquireSyncs const uint64_t* pAcquireKeys @@ -1935,7 +1939,7 @@ VkStructureType sType - const void* pNext + const void* pNext uint32_t swapchainCountCopy of VkPresentInfoKHR::swapchainCount const VkPresentRegionKHR* pRegionsThe regions that have changed @@ -1963,7 +1967,7 @@ VkStructureType sType - const void* pNext + const void* pNext VkExternalMemoryHandleTypeFlagBits handleType @@ -2059,7 +2063,7 @@ VkStructureType sType - const void* pNext + const void* pNext uint32_t acquireCount const VkDeviceMemory* pAcquireSyncs const uint64_t* pAcquireKeys @@ -2106,7 +2110,7 @@ VkStructureType sType - const void* pNext + const void* pNext uint32_t waitSemaphoreValuesCount const uint64_t* pWaitSemaphoreValues uint32_t signalSemaphoreValuesCount @@ -2259,7 +2263,7 @@ VkStructureType sType - const void* pNext + const void* pNext VkMemoryAllocateFlags flags uint32_t deviceMask @@ -2298,7 +2302,7 @@ VkStructureType sType - const void* pNext + const void* pNext uint32_t deviceMask uint32_t deviceRenderAreaCount const VkRect2D* pDeviceRenderAreas @@ -2306,13 +2310,13 @@ VkStructureType sType - const void* pNext + const void* pNext uint32_t deviceMask VkStructureType sType - const void* pNext + const void* pNext uint32_t waitSemaphoreCount const uint32_t* pWaitSemaphoreDeviceIndices uint32_t commandBufferCount @@ -2323,7 +2327,7 @@ VkStructureType sType - const void* pNext + const void* pNext uint32_t resourceDeviceIndex uint32_t memoryDeviceIndex @@ -2336,12 +2340,12 @@ VkStructureType sType - const void* pNext + const void* pNext VkSwapchainKHR swapchain VkStructureType sType - const void* pNext + const void* pNext VkSwapchainKHR swapchain uint32_t imageIndex @@ -2356,21 +2360,21 @@ VkStructureType sType - const void* pNext + const void* pNext uint32_t swapchainCount const uint32_t* pDeviceMasks VkDeviceGroupPresentModeFlagBitsKHR mode VkStructureType sType - const void* pNext + const void* pNext uint32_t physicalDeviceCount const VkPhysicalDevice* pPhysicalDevices VkStructureType sType - const void* pNext + const void* pNext VkDeviceGroupPresentModeFlagsKHR modes @@ -2426,7 +2430,7 @@ VkStructureType sType - const void* pNext + const void* pNext uint32_t swapchainCountCopy of VkPresentInfoKHR::swapchainCount const VkPresentTimeGOOGLE* pTimesThe earliest times to present images @@ -2452,7 +2456,7 @@ VkStructureType sType - const void* pNext + const void* pNext VkBool32 viewportWScalingEnable uint32_t viewportCount const VkViewportWScalingNV* pViewportWScalings @@ -2602,7 +2606,7 @@ VkStructureType sType - const void* pNext + const void* pNext VkSamplerYcbcrConversion conversion @@ -2621,13 +2625,13 @@ VkStructureType sType - const void* pNext + const void* pNext VkImageAspectFlagBits planeAspect VkStructureType sType - const void* pNext + const void* pNext VkImageAspectFlagBits planeAspect @@ -2903,10 +2907,27 @@ VkBool32 conservativePointAndLineRasterizationtrue if conservative rasterization also applies to points and lines VkBool32 degenerateTrianglesRasterizedtrue if degenerate triangles (those with zero area after snap) are rasterized VkBool32 degenerateLinesRasterizedtrue if degenerate lines (those with zero length after snap) are rasterized - VkBool32 fullyCoveredFragmentShaderInputVariabletrue if the implementation supports the FullyCoveredEXT SPIR-V builtin fragment shader input - variable + VkBool32 fullyCoveredFragmentShaderInputVariabletrue if the implementation supports the FullyCoveredEXT SPIR-V builtin fragment shader input variable VkBool32 conservativeRasterizationPostDepthCoveragetrue if the implementation supports both conservative rasterization and post depth coverage sample coverage mask + + VkStructureType sType + void* pNextPointer to next structure + uint32_t shaderEngineCountnumber of shader engines + uint32_t shaderArraysPerEngineCountnumber of shader arrays + uint32_t computeUnitsPerShaderArraynumber of CUs per shader array + uint32_t simdPerComputeUnitnumber of SIMDs per compute unit + uint32_t wavefrontsPerSimdnumber of wavefront slots in each SIMD + uint32_t wavefrontSizenumber of threads per wavefront + uint32_t sgprsPerSimdnumber of physical SGPRs per SIMD + uint32_t minSgprAllocationminimum number of SGPRs that can be allocated by a wave + uint32_t maxSgprAllocationnumber of available SGPRs + uint32_t sgprAllocationGranularitySGPRs are allocated in groups of this size + uint32_t vgprsPerSimdnumber of physical VGPRs per SIMD + uint32_t minVgprAllocationminimum number of VGPRs that can be allocated by a wave + uint32_t maxVgprAllocationnumber of available VGPRs + uint32_t vgprAllocationGranularityVGPRs are allocated in groups of this size + VkStructureType sType const void* pNext @@ -2914,13 +2935,81 @@ VkConservativeRasterizationModeEXT conservativeRasterizationMode float extraPrimitiveOverestimationSize + + VkStructureType sType + void* pNext + VkBool32 shaderInputAttachmentArrayDynamicIndexing + VkBool32 shaderUniformTexelBufferArrayDynamicIndexing + VkBool32 shaderStorageTexelBufferArrayDynamicIndexing + VkBool32 shaderUniformBufferArrayNonUniformIndexing + VkBool32 shaderSampledImageArrayNonUniformIndexing + VkBool32 shaderStorageBufferArrayNonUniformIndexing + VkBool32 shaderStorageImageArrayNonUniformIndexing + VkBool32 shaderInputAttachmentArrayNonUniformIndexing + VkBool32 shaderUniformTexelBufferArrayNonUniformIndexing + VkBool32 shaderStorageTexelBufferArrayNonUniformIndexing + VkBool32 descriptorBindingUniformBufferUpdateAfterBind + VkBool32 descriptorBindingSampledImageUpdateAfterBind + VkBool32 descriptorBindingStorageImageUpdateAfterBind + VkBool32 descriptorBindingStorageBufferUpdateAfterBind + VkBool32 descriptorBindingUniformTexelBufferUpdateAfterBind + VkBool32 descriptorBindingStorageTexelBufferUpdateAfterBind + VkBool32 descriptorBindingUpdateUnusedWhilePending + VkBool32 descriptorBindingPartiallyBound + VkBool32 descriptorBindingVariableDescriptorCount + VkBool32 runtimeDescriptorArray + + + VkStructureType sType + void* pNext + uint32_t maxUpdateAfterBindDescriptorsInAllPools + VkBool32 shaderUniformBufferArrayNonUniformIndexingNative + VkBool32 shaderSampledImageArrayNonUniformIndexingNative + VkBool32 shaderStorageBufferArrayNonUniformIndexingNative + VkBool32 shaderStorageImageArrayNonUniformIndexingNative + VkBool32 shaderInputAttachmentArrayNonUniformIndexingNative + VkBool32 robustBufferAccessUpdateAfterBind + VkBool32 quadDivergentImplicitLod + uint32_t maxPerStageDescriptorUpdateAfterBindSamplers + uint32_t maxPerStageDescriptorUpdateAfterBindUniformBuffers + uint32_t maxPerStageDescriptorUpdateAfterBindStorageBuffers + uint32_t maxPerStageDescriptorUpdateAfterBindSampledImages + uint32_t maxPerStageDescriptorUpdateAfterBindStorageImages + uint32_t maxPerStageDescriptorUpdateAfterBindInputAttachments + uint32_t maxPerStageUpdateAfterBindResources + uint32_t maxDescriptorSetUpdateAfterBindSamplers + uint32_t maxDescriptorSetUpdateAfterBindUniformBuffers + uint32_t maxDescriptorSetUpdateAfterBindUniformBuffersDynamic + uint32_t maxDescriptorSetUpdateAfterBindStorageBuffers + uint32_t maxDescriptorSetUpdateAfterBindStorageBuffersDynamic + uint32_t maxDescriptorSetUpdateAfterBindSampledImages + uint32_t maxDescriptorSetUpdateAfterBindStorageImages + uint32_t maxDescriptorSetUpdateAfterBindInputAttachments + + + VkStructureType sType + const void* pNext + uint32_t bindingCount + const VkDescriptorBindingFlagsEXT* pBindingFlags + + + VkStructureType sType + const void* pNext + uint32_t descriptorSetCount + const uint32_t* pDescriptorCounts + + + VkStructureType sType + void* pNext + uint32_t maxVariableDescriptorCount + uint32_t binding uint32_t divisor VkStructureType sType - const void* pNext + const void* pNext uint32_t vertexBindingDivisorCount const VkVertexInputBindingDivisorDescriptionEXT* pVertexBindingDivisors @@ -2929,6 +3018,44 @@ void* pNext uint32_t maxVertexAttribDivisormax value of vertex attribute divisor + + VkStructureType sType + const void* pNext + struct AHardwareBuffer* buffer + + + VkStructureType sType + void* pNext + uint64_t androidHardwareBufferUsage + + + VkStructureType sType + void* pNext + VkDeviceSize allocationSize + uint32_t memoryTypeBits + + + VkStructureType sType + const void* pNext + VkDeviceMemory memory + + + VkStructureType sType + void* pNext + VkFormat format + uint64_t externalFormat + VkFormatFeatureFlags formatFeatures + VkComponentMapping samplerYcbcrConversionComponents + VkSamplerYcbcrModelConversion suggestedYcbcrModel + VkSamplerYcbcrRange suggestedYcbcrRange + VkChromaLocation suggestedXChromaOffset + VkChromaLocation suggestedYChromaOffset + + + VkStructureType sType + void* pNext + uint64_t externalFormat + Vulkan enumerant (token) definitions @@ -3996,6 +4123,12 @@ + + + + + + @@ -4482,7 +4615,7 @@ VkDescriptorSetLayout descriptorSetLayout const VkAllocationCallbacks* pAllocator - + VkResult vkCreateDescriptorPool VkDevice device const VkDescriptorPoolCreateInfo* pCreateInfo @@ -5488,7 +5621,7 @@ const VkAllocationCallbacks* pAllocator VkFence* pFence - + VkResult vkGetSwapchainCounterEXT VkDevice device VkSwapchainKHR swapchain @@ -5862,6 +5995,18 @@ VkDeviceSize dstOffset uint32_t marker + + VkResult vkGetAndroidHardwareBufferPropertiesANDROID + VkDevice device + const struct AHardwareBuffer* buffer + VkAndroidHardwareBufferPropertiesANDROID* pProperties + + + VkResult vkGetMemoryAndroidHardwareBufferANDROID + VkDevice device + const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo + struct AHardwareBuffer** pBuffer + @@ -6088,13 +6233,15 @@ - + + + @@ -6114,7 +6261,7 @@ - + @@ -6407,7 +6554,7 @@ - + @@ -6572,7 +6719,7 @@ - + @@ -7100,7 +7247,7 @@ - + @@ -7285,12 +7432,10 @@ - + - - - - + + @@ -7826,10 +7971,25 @@ - + - - + + + + + + + + + + + + + + + + + @@ -8211,10 +8371,23 @@ - + - - + + + + + + + + + + + + + + + @@ -8376,10 +8549,12 @@ - + - - + + + + @@ -8453,5 +8628,24 @@ + + + + + + + + + + + + + + + + + + + diff -Nru vulkan-1.1.70+dfsg1/scripts/vuid_mapping.py vulkan-1.1.73+dfsg/scripts/vuid_mapping.py --- vulkan-1.1.70+dfsg1/scripts/vuid_mapping.py 2018-03-09 17:41:56.000000000 +0000 +++ vulkan-1.1.73+dfsg/scripts/vuid_mapping.py 2018-04-27 11:24:19.000000000 +0000 @@ -601,6 +601,30 @@ 'vkSubmitDebugUtilsMessageEXT' : 545, 'VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT' : 546, 'VkPipelineVertexInputDivisorStateCreateInfoEXT' : 547, +'VkExternalFormatANDROID' : 548, +'VkImportAndroidHardwareBufferInfoANDROID' : 549, +'VkMemoryGetAndroidHardwareBufferInfoANDROID' : 550, +'vkCmdEndDebugUtilsLabelEXT' : 551, +'vkDestroyDebugUtilsMessengerEXT' : 552, +'vkGetAndroidHardwareBufferPropertiesANDROID' : 553, +'vkQueueEndDebugUtilsLabelEXT' : 554, +'VkAndroidHardwareBufferUsageANDROID' : 555, +'VkAndroidHardwareBufferPropertiesANDROID' : 556, +'vkGetMemoryAndroidHardwareBufferANDROID' : 557, +'VkAndroidHardwareBufferFormatPropertiesANDROID' : 558, +'vkCmdBeginDebugUtilsLabelEXT' : 559, +'vkCmdInsertDebugUtilsLabelEXT' : 560, +'vkQueueBeginDebugUtilsLabelEXT' : 561, +'vkQueueInsertDebugUtilsLabelEXT' : 562, +'vkSetDebugUtilsObjectNameEXT' : 563, +'vkSetDebugUtilsObjectTagEXT' : 564, +'VkDescriptorSetLayoutBindingFlagsCreateInfoEXT' : 565, +'VkDescriptorSetVariableDescriptorCountAllocateInfoEXT' : 566, +'VkDescriptorSetVariableDescriptorCountLayoutSupportEXT' : 567, +'VkPhysicalDeviceDescriptorIndexingFeaturesEXT' : 568, +'VkPhysicalDeviceDescriptorIndexingPropertiesEXT' : 569, +'VkPhysicalDeviceShaderCorePropertiesAMD' : 570, +'VkVertexInputBindingDivisorDescriptionEXT' : 571, ### ADD New func/struct mappings above this line } # Mapping of params to unique IDs @@ -1129,6 +1153,17 @@ 'messageTypes' : 521, 'vertexBindingDivisorCount' : 522, 'pVertexBindingDivisors' : 523, +'formatFeatures' : 524, +'suggestedYcbcrModel' : 525, +'suggestedYcbcrRange' : 526, +'suggestedXChromaOffset' : 527, +'suggestedYChromaOffset' : 528, +'pMessageIdName' : 529, +'pLabelInfo' : 530, +'messenger' : 531, +'pCallbackData' : 532, +'pBindingFlags' : 533, +'pDescriptorCounts' : 534, ### ADD New implicit param mappings above this line } diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/appveyor.yml vulkan-1.1.73+dfsg/submodules/googletest/appveyor.yml --- vulkan-1.1.70+dfsg1/submodules/googletest/appveyor.yml 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/appveyor.yml 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,99 @@ +version: '{build}' + +os: Visual Studio 2015 + +environment: + matrix: + - compiler: msvc-15-seh + generator: "Visual Studio 15 2017" + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + + - compiler: msvc-15-seh + generator: "Visual Studio 15 2017 Win64" + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + enabled_on_pr: yes + + - compiler: msvc-14-seh + generator: "Visual Studio 14 2015" + enabled_on_pr: yes + + - compiler: msvc-14-seh + generator: "Visual Studio 14 2015 Win64" + + - compiler: gcc-5.3.0-posix + generator: "MinGW Makefiles" + cxx_path: 'C:\mingw-w64\i686-5.3.0-posix-dwarf-rt_v4-rev0\mingw32\bin' + + - compiler: gcc-6.3.0-posix + generator: "MinGW Makefiles" + cxx_path: 'C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin' + +configuration: + - Debug + +build: + verbosity: minimal + +install: +- ps: | + Write-Output "Compiler: $env:compiler" + Write-Output "Generator: $env:generator" + if (-not (Test-Path env:APPVEYOR_PULL_REQUEST_NUMBER)) { + Write-Output "This is *NOT* a pull request build" + } else { + Write-Output "This is a pull request build" + if (-not (Test-Path env:enabled_on_pr) -or $env:enabled_on_pr -ne "yes") { + Write-Output "PR builds are *NOT* explicitly enabled" + } + } + + # git bash conflicts with MinGW makefiles + if ($env:generator -eq "MinGW Makefiles") { + $env:path = $env:path.replace("C:\Program Files\Git\usr\bin;", "") + if ($env:cxx_path -ne "") { + $env:path += ";$env:cxx_path" + } + } + +build_script: +- ps: | + # Only enable some builds for pull requests, the AppVeyor queue is too long. + if ((Test-Path env:APPVEYOR_PULL_REQUEST_NUMBER) -And (-not (Test-Path env:enabled_on_pr) -or $env:enabled_on_pr -ne "yes")) { + return + } + md _build -Force | Out-Null + cd _build + + $conf = if ($env:generator -eq "MinGW Makefiles") {"-DCMAKE_BUILD_TYPE=$env:configuration"} else {"-DCMAKE_CONFIGURATION_TYPES=Debug;Release"} + # Disable test for MinGW (gtest tests fail, gmock tests can not build) + $gtest_build_tests = if ($env:generator -eq "MinGW Makefiles") {"-Dgtest_build_tests=OFF"} else {"-Dgtest_build_tests=ON"} + $gmock_build_tests = if ($env:generator -eq "MinGW Makefiles") {"-Dgmock_build_tests=OFF"} else {"-Dgmock_build_tests=ON"} + & cmake -G "$env:generator" $conf -Dgtest_build_samples=ON $gtest_build_tests $gmock_build_tests .. + if ($LastExitCode -ne 0) { + throw "Exec: $ErrorMessage" + } + $cmake_parallel = if ($env:generator -eq "MinGW Makefiles") {"-j2"} else {"/m"} + & cmake --build . --config $env:configuration -- $cmake_parallel + if ($LastExitCode -ne 0) { + throw "Exec: $ErrorMessage" + } + +test_script: +- ps: | + # Only enable some builds for pull requests, the AppVeyor queue is too long. + if ((Test-Path env:APPVEYOR_PULL_REQUEST_NUMBER) -And (-not (Test-Path env:enabled_on_pr) -or $env:enabled_on_pr -ne "yes")) { + return + } + if ($env:generator -eq "MinGW Makefiles") { + return # No test available for MinGW + } + & ctest -C $env:configuration --timeout 600 --output-on-failure + if ($LastExitCode -ne 0) { + throw "Exec: $ErrorMessage" + } + +artifacts: + - path: '_build/CMakeFiles/*.log' + name: logs + - path: '_build/Testing/**/*.xml' + name: test_results diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/BUILD.bazel vulkan-1.1.73+dfsg/submodules/googletest/BUILD.bazel --- vulkan-1.1.70+dfsg1/submodules/googletest/BUILD.bazel 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/BUILD.bazel 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,175 @@ +# Copyright 2017 Google Inc. +# All Rights Reserved. +# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Author: misterg@google.com (Gennadiy Civil) +# +# Bazel Build for Google C++ Testing Framework(Google Test) + +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +config_setting( + name = "windows", + values = { "cpu": "x64_windows" }, +) + +config_setting( + name = "windows_msvc", + values = {"cpu": "x64_windows_msvc"}, +) + +config_setting( + name = "has_absl", + values = {"define": "absl=1"}, +) + + +# Google Test including Google Mock +cc_library( + name = "gtest", + srcs = glob( + include = [ + "googletest/src/*.cc", + "googletest/src/*.h", + "googletest/include/gtest/**/*.h", + "googlemock/src/*.cc", + "googlemock/include/gmock/**/*.h", + ], + exclude = [ + "googletest/src/gtest-all.cc", + "googletest/src/gtest_main.cc", + "googlemock/src/gmock-all.cc", + "googlemock/src/gmock_main.cc", + ], + ), + hdrs =glob([ + "googletest/include/gtest/*.h", + "googlemock/include/gmock/*.h", + ]), + copts = select( + { + ":windows": [], + ":windows_msvc": [], + "//conditions:default": ["-pthread"], + }, + ), + includes = [ + "googlemock", + "googlemock/include", + "googletest", + "googletest/include", + ], + linkopts = select({ + ":windows": [], + ":windows_msvc": [], + "//conditions:default": [ + "-pthread", + ], + }), + defines = select ({ + ":has_absl": [ + "GTEST_HAS_ABSL=1", + ], + "//conditions:default": [], + } + ), + deps = select ({ + ":has_absl": [ + "@com_google_absl//absl/types:optional", + "@com_google_absl//absl/strings" + ], + "//conditions:default": [], + } + ) +) + +cc_library( + name = "gtest_main", + srcs = [ + "googlemock/src/gmock_main.cc", + ], + deps = [":gtest"], +) + +# The following rules build samples of how to use gTest. +cc_library( + name = "gtest_sample_lib", + srcs = [ + "googletest/samples/sample1.cc", + "googletest/samples/sample2.cc", + "googletest/samples/sample4.cc", + ], + hdrs = [ + "googletest/samples/prime_tables.h", + "googletest/samples/sample1.h", + "googletest/samples/sample2.h", + "googletest/samples/sample3-inl.h", + "googletest/samples/sample4.h", + ], +) + +cc_test( + name = "gtest_samples", + size = "small", + #All Samples except: + #sample9 ( main ) + #sample10 (main and takes a command line option and needs to be separate) + srcs = [ + "googletest/samples/sample1_unittest.cc", + "googletest/samples/sample2_unittest.cc", + "googletest/samples/sample3_unittest.cc", + "googletest/samples/sample4_unittest.cc", + "googletest/samples/sample5_unittest.cc", + "googletest/samples/sample6_unittest.cc", + "googletest/samples/sample7_unittest.cc", + "googletest/samples/sample8_unittest.cc", + ], + deps = [ + "gtest_sample_lib", + ":gtest_main", + ], +) + +cc_test( + name = "sample9_unittest", + size = "small", + srcs = ["googletest/samples/sample9_unittest.cc"], + deps = [":gtest"], +) + +cc_test( + name = "sample10_unittest", + size = "small", + srcs = ["googletest/samples/sample10_unittest.cc"], + deps = [ + ":gtest", + ], +) diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/ci/build-linux-autotools.sh vulkan-1.1.73+dfsg/submodules/googletest/ci/build-linux-autotools.sh --- vulkan-1.1.70+dfsg1/submodules/googletest/ci/build-linux-autotools.sh 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/ci/build-linux-autotools.sh 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# Copyright 2017 Google Inc. +# All Rights Reserved. +# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +set -e + +. ci/get-nprocessors.sh + +# Create the configuration script +autoreconf -i + +# Run in a subdirectory to keep the sources clean +mkdir build || true +cd build +../configure + +make -j ${NPROCESSORS:-2} diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/ci/build-linux-bazel.sh vulkan-1.1.73+dfsg/submodules/googletest/ci/build-linux-bazel.sh --- vulkan-1.1.70+dfsg1/submodules/googletest/ci/build-linux-bazel.sh 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/ci/build-linux-bazel.sh 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# Copyright 2017 Google Inc. +# All Rights Reserved. +# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +set -e + +bazel build --curses=no //...:all +bazel test --curses=no //...:all +bazel test --curses=no //...:all --define absl=1 diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/ci/env-linux.sh vulkan-1.1.73+dfsg/submodules/googletest/ci/env-linux.sh --- vulkan-1.1.70+dfsg1/submodules/googletest/ci/env-linux.sh 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/ci/env-linux.sh 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# Copyright 2017 Google Inc. +# All Rights Reserved. +# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# +# This file should be sourced, and not executed as a standalone script. +# + +# TODO() - we can check if this is being sourced using $BASH_VERSION and $BASH_SOURCE[0] != ${0}. + +if [ "${TRAVIS_OS_NAME}" = "linux" ]; then + if [ "$CXX" = "g++" ]; then export CXX="g++-4.9" CC="gcc-4.9"; fi + if [ "$CXX" = "clang++" ]; then export CXX="clang++-3.7" CC="clang-3.7"; fi +fi diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/ci/env-osx.sh vulkan-1.1.73+dfsg/submodules/googletest/ci/env-osx.sh --- vulkan-1.1.70+dfsg1/submodules/googletest/ci/env-osx.sh 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/ci/env-osx.sh 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# Copyright 2017 Google Inc. +# All Rights Reserved. +# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# +# This file should be sourced, and not executed as a standalone script. +# + +# TODO() - we can check if this is being sourced using $BASH_VERSION and $BASH_SOURCE[0] != ${0}. + +if [ "${TRAVIS_OS_NAME}" = "linux" ]; then + if [ "$CXX" = "clang++" ]; then export CXX="clang++-3.7" CC="clang-3.7"; fi +fi diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/ci/get-nprocessors.sh vulkan-1.1.73+dfsg/submodules/googletest/ci/get-nprocessors.sh --- vulkan-1.1.70+dfsg1/submodules/googletest/ci/get-nprocessors.sh 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/ci/get-nprocessors.sh 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# Copyright 2017 Google Inc. +# All Rights Reserved. +# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This file is typically sourced by another script. +# if possible, ask for the precise number of processors, +# otherwise take 2 processors as reasonable default; see +# https://docs.travis-ci.com/user/speeding-up-the-build/#Makefile-optimization +if [ -x /usr/bin/getconf ]; then + NPROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN) +else + NPROCESSORS=2 +fi + +# as of 2017-09-04 Travis CI reports 32 processors, but GCC build +# crashes if parallelized too much (maybe memory consumption problem), +# so limit to 4 processors for the time being. +if [ $NPROCESSORS -gt 4 ] ; then + echo "$0:Note: Limiting processors to use by make from $NPROCESSORS to 4." + NPROCESSORS=4 +fi diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/ci/install-linux.sh vulkan-1.1.73+dfsg/submodules/googletest/ci/install-linux.sh --- vulkan-1.1.70+dfsg1/submodules/googletest/ci/install-linux.sh 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/ci/install-linux.sh 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# Copyright 2017 Google Inc. +# All Rights Reserved. +# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +set -eu + +if [ "${TRAVIS_OS_NAME}" != linux ]; then + echo "Not a Linux build; skipping installation" + exit 0 +fi + + +if [ "${TRAVIS_SUDO}" = "true" ]; then + echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | \ + sudo tee /etc/apt/sources.list.d/bazel.list + curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add - + sudo apt-get update && sudo apt-get install -y bazel gcc-4.9 g++-4.9 clang-3.7 +elif [ "${CXX}" = "clang++" ]; then + # Use ccache, assuming $HOME/bin is in the path, which is true in the Travis build environment. + ln -sf /usr/bin/ccache $HOME/bin/${CXX}; + ln -sf /usr/bin/ccache $HOME/bin/${CC}; +fi diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/ci/install-osx.sh vulkan-1.1.73+dfsg/submodules/googletest/ci/install-osx.sh --- vulkan-1.1.70+dfsg1/submodules/googletest/ci/install-osx.sh 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/ci/install-osx.sh 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# Copyright 2017 Google Inc. +# All Rights Reserved. +# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +set -eu + +if [ "${TRAVIS_OS_NAME}" != "osx" ]; then + echo "Not a macOS build; skipping installation" + exit 0 +fi + +brew install ccache diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/ci/log-config.sh vulkan-1.1.73+dfsg/submodules/googletest/ci/log-config.sh --- vulkan-1.1.70+dfsg1/submodules/googletest/ci/log-config.sh 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/ci/log-config.sh 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +# Copyright 2017 Google Inc. +# All Rights Reserved. +# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +set -e + +# ccache on OS X needs installation first +# reset ccache statistics +ccache --zero-stats + +echo PATH=${PATH} + +echo "Compiler configuration:" +echo CXX=${CXX} +echo CC=${CC} +echo CXXFLAGS=${CXXFLAGS} + +echo "C++ compiler version:" +${CXX} --version || echo "${CXX} does not seem to support the --version flag" +${CXX} -v || echo "${CXX} does not seem to support the -v flag" + +echo "C compiler version:" +${CC} --version || echo "${CXX} does not seem to support the --version flag" +${CC} -v || echo "${CXX} does not seem to support the -v flag" diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/ci/travis.sh vulkan-1.1.73+dfsg/submodules/googletest/ci/travis.sh --- vulkan-1.1.70+dfsg1/submodules/googletest/ci/travis.sh 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/ci/travis.sh 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,36 @@ +#!/usr/bin/env sh +set -evx + +. ci/get-nprocessors.sh + +# if possible, ask for the precise number of processors, +# otherwise take 2 processors as reasonable default; see +# https://docs.travis-ci.com/user/speeding-up-the-build/#Makefile-optimization +if [ -x /usr/bin/getconf ]; then + NPROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN) +else + NPROCESSORS=2 +fi +# as of 2017-09-04 Travis CI reports 32 processors, but GCC build +# crashes if parallelized too much (maybe memory consumption problem), +# so limit to 4 processors for the time being. +if [ $NPROCESSORS -gt 4 ] ; then + echo "$0:Note: Limiting processors to use by make from $NPROCESSORS to 4." + NPROCESSORS=4 +fi +# Tell make to use the processors. No preceding '-' required. +MAKEFLAGS="j${NPROCESSORS}" +export MAKEFLAGS + +env | sort + +mkdir build || true +cd build +cmake -Dgtest_build_samples=ON \ + -Dgtest_build_tests=ON \ + -Dgmock_build_tests=ON \ + -DCMAKE_CXX_FLAGS=$CXX_FLAGS \ + -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ + .. +make +CTEST_OUTPUT_ON_FAILURE=1 make test diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/CMakeLists.txt vulkan-1.1.73+dfsg/submodules/googletest/CMakeLists.txt --- vulkan-1.1.70+dfsg1/submodules/googletest/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/CMakeLists.txt 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 2.6.4) + +if (POLICY CMP0048) + cmake_policy(SET CMP0048 NEW) +endif (POLICY CMP0048) + +project( googletest-distribution ) + +enable_testing() + +include(CMakeDependentOption) +if (CMAKE_VERSION VERSION_LESS 2.8.5) + set(CMAKE_INSTALL_BINDIR "bin" CACHE STRING "User executables (bin)") + set(CMAKE_INSTALL_LIBDIR "lib${LIB_SUFFIX}" CACHE STRING "Object code libraries (lib)") + set(CMAKE_INSTALL_INCLUDEDIR "include" CACHE STRING "C header files (include)") + mark_as_advanced(CMAKE_INSTALL_BINDIR CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_INCLUDEDIR) +else() + include(GNUInstallDirs) +endif() + +option(BUILD_GTEST "Builds the googletest subproject" OFF) + +#Note that googlemock target already builds googletest +option(BUILD_GMOCK "Builds the googlemock subproject" ON) + +cmake_dependent_option(INSTALL_GTEST "Enable installation of googletest. (Projects embedding googletest may want to turn this OFF.)" ON "BUILD_GTEST OR BUILD_GMOCK" OFF) +cmake_dependent_option(INSTALL_GMOCK "Enable installation of googlemock. (Projects embedding googlemock may want to turn this OFF.)" ON "BUILD_GMOCK" OFF) + +if(BUILD_GMOCK) + add_subdirectory( googlemock ) +elseif(BUILD_GTEST) + add_subdirectory( googletest ) +endif() diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/configure.ac vulkan-1.1.73+dfsg/submodules/googletest/configure.ac --- vulkan-1.1.70+dfsg1/submodules/googletest/configure.ac 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/configure.ac 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,16 @@ +AC_INIT([Google C++ Mocking and Testing Frameworks], + [1.8.0], + [googlemock@googlegroups.com], + [googletest]) + +# Provide various options to initialize the Autoconf and configure processes. +AC_PREREQ([2.59]) +AC_CONFIG_SRCDIR([./README.md]) +AC_CONFIG_AUX_DIR([build-aux]) +AC_CONFIG_FILES([Makefile]) +AC_CONFIG_SUBDIRS([googletest googlemock]) + +AM_INIT_AUTOMAKE + +# Output the generated files. No further autoconf macros may be used. +AC_OUTPUT diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/CONTRIBUTING.md vulkan-1.1.73+dfsg/submodules/googletest/CONTRIBUTING.md --- vulkan-1.1.70+dfsg1/submodules/googletest/CONTRIBUTING.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/CONTRIBUTING.md 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,160 @@ +# How to become a contributor and submit your own code + +## Contributor License Agreements + +We'd love to accept your patches! Before we can take them, we +have to jump a couple of legal hurdles. + +Please fill out either the individual or corporate Contributor License Agreement +(CLA). + + * If you are an individual writing original source code and you're sure you + own the intellectual property, then you'll need to sign an + [individual CLA](https://developers.google.com/open-source/cla/individual). + * If you work for a company that wants to allow you to contribute your work, + then you'll need to sign a + [corporate CLA](https://developers.google.com/open-source/cla/corporate). + +Follow either of the two links above to access the appropriate CLA and +instructions for how to sign and return it. Once we receive it, we'll be able to +accept your pull requests. + +## Contributing A Patch + +1. Submit an issue describing your proposed change to the + [issue tracker](https://github.com/google/googletest). +1. Please don't mix more than one logical change per submittal, + because it makes the history hard to follow. If you want to make a + change that doesn't have a corresponding issue in the issue + tracker, please create one. +1. Also, coordinate with team members that are listed on the issue in + question. This ensures that work isn't being duplicated and + communicating your plan early also generally leads to better + patches. +1. If your proposed change is accepted, and you haven't already done so, sign a + Contributor License Agreement (see details above). +1. Fork the desired repo, develop and test your code changes. +1. Ensure that your code adheres to the existing style in the sample to which + you are contributing. +1. Ensure that your code has an appropriate set of unit tests which all pass. +1. Submit a pull request. + +If you are a Googler, it is preferable to first create an internal change and +have it reviewed and submitted, and then create an upstreaming pull +request here. + +## The Google Test and Google Mock Communities ## + +The Google Test community exists primarily through the +[discussion group](http://groups.google.com/group/googletestframework) +and the GitHub repository. +Likewise, the Google Mock community exists primarily through their own +[discussion group](http://groups.google.com/group/googlemock). +You are definitely encouraged to contribute to the +discussion and you can also help us to keep the effectiveness of the +group high by following and promoting the guidelines listed here. + +### Please Be Friendly ### + +Showing courtesy and respect to others is a vital part of the Google +culture, and we strongly encourage everyone participating in Google +Test development to join us in accepting nothing less. Of course, +being courteous is not the same as failing to constructively disagree +with each other, but it does mean that we should be respectful of each +other when enumerating the 42 technical reasons that a particular +proposal may not be the best choice. There's never a reason to be +antagonistic or dismissive toward anyone who is sincerely trying to +contribute to a discussion. + +Sure, C++ testing is serious business and all that, but it's also +a lot of fun. Let's keep it that way. Let's strive to be one of the +friendliest communities in all of open source. + +As always, discuss Google Test in the official GoogleTest discussion group. +You don't have to actually submit code in order to sign up. Your participation +itself is a valuable contribution. + +## Style + +To keep the source consistent, readable, diffable and easy to merge, +we use a fairly rigid coding style, as defined by the [google-styleguide](https://github.com/google/styleguide) project. All patches will be expected +to conform to the style outlined [here](https://google.github.io/styleguide/cppguide.html). + +## Requirements for Contributors ### + +If you plan to contribute a patch, you need to build Google Test, +Google Mock, and their own tests from a git checkout, which has +further requirements: + + * [Python](https://www.python.org/) v2.3 or newer (for running some of + the tests and re-generating certain source files from templates) + * [CMake](https://cmake.org/) v2.6.4 or newer + * [GNU Build System](https://en.wikipedia.org/wiki/GNU_Build_System) + including automake (>= 1.9), autoconf (>= 2.59), and + libtool / libtoolize. + +## Developing Google Test ## + +This section discusses how to make your own changes to Google Test. + +### Testing Google Test Itself ### + +To make sure your changes work as intended and don't break existing +functionality, you'll want to compile and run Google Test's own tests. +For that you can use CMake: + + mkdir mybuild + cd mybuild + cmake -Dgtest_build_tests=ON ${GTEST_DIR} + +Make sure you have Python installed, as some of Google Test's tests +are written in Python. If the cmake command complains about not being +able to find Python (`Could NOT find PythonInterp (missing: +PYTHON_EXECUTABLE)`), try telling it explicitly where your Python +executable can be found: + + cmake -DPYTHON_EXECUTABLE=path/to/python -Dgtest_build_tests=ON ${GTEST_DIR} + +Next, you can build Google Test and all of its own tests. On \*nix, +this is usually done by 'make'. To run the tests, do + + make test + +All tests should pass. + +### Regenerating Source Files ## + +Some of Google Test's source files are generated from templates (not +in the C++ sense) using a script. +For example, the +file include/gtest/internal/gtest-type-util.h.pump is used to generate +gtest-type-util.h in the same directory. + +You don't need to worry about regenerating the source files +unless you need to modify them. You would then modify the +corresponding `.pump` files and run the '[pump.py](googletest/scripts/pump.py)' +generator script. See the [Pump Manual](googletest/docs/PumpManual.md). + +## Developing Google Mock ### + +This section discusses how to make your own changes to Google Mock. + +#### Testing Google Mock Itself #### + +To make sure your changes work as intended and don't break existing +functionality, you'll want to compile and run Google Test's own tests. +For that you'll need Autotools. First, make sure you have followed +the instructions above to configure Google Mock. +Then, create a build output directory and enter it. Next, + + ${GMOCK_DIR}/configure # try --help for more info + +Once you have successfully configured Google Mock, the build steps are +standard for GNU-style OSS packages. + + make # Standard makefile following GNU conventions + make check # Builds and runs all tests - all should pass. + +Note that when building your project against Google Mock, you are building +against Google Test as well. There is no need to configure Google Test +separately. diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/CHANGES vulkan-1.1.73+dfsg/submodules/googletest/googlemock/CHANGES --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/CHANGES 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/CHANGES 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,126 @@ +Changes for 1.7.0: + +* All new improvements in Google Test 1.7.0. +* New feature: matchers DoubleNear(), FloatNear(), + NanSensitiveDoubleNear(), NanSensitiveFloatNear(), + UnorderedElementsAre(), UnorderedElementsAreArray(), WhenSorted(), + WhenSortedBy(), IsEmpty(), and SizeIs(). +* Improvement: Google Mock can now be built as a DLL. +* Improvement: when compiled by a C++11 compiler, matchers AllOf() + and AnyOf() can accept an arbitrary number of matchers. +* Improvement: when compiled by a C++11 compiler, matchers + ElementsAreArray() can accept an initializer list. +* Improvement: when exceptions are enabled, a mock method with no + default action now throws instead crashing the test. +* Improvement: added class testing::StringMatchResultListener to aid + definition of composite matchers. +* Improvement: function return types used in MOCK_METHOD*() macros can + now contain unprotected commas. +* Improvement (potentially breaking): EXPECT_THAT() and ASSERT_THAT() + are now more strict in ensuring that the value type and the matcher + type are compatible, catching potential bugs in tests. +* Improvement: Pointee() now works on an optional. +* Improvement: the ElementsAreArray() matcher can now take a vector or + iterator range as input, and makes a copy of its input elements + before the conversion to a Matcher. +* Improvement: the Google Mock Generator can now generate mocks for + some class templates. +* Bug fix: mock object destruction triggerred by another mock object's + destruction no longer hangs. +* Improvement: Google Mock Doctor works better with newer Clang and + GCC now. +* Compatibility fixes. +* Bug/warning fixes. + +Changes for 1.6.0: + +* Compilation is much faster and uses much less memory, especially + when the constructor and destructor of a mock class are moved out of + the class body. +* New matchers: Pointwise(), Each(). +* New actions: ReturnPointee() and ReturnRefOfCopy(). +* CMake support. +* Project files for Visual Studio 2010. +* AllOf() and AnyOf() can handle up-to 10 arguments now. +* Google Mock doctor understands Clang error messages now. +* SetArgPointee<> now accepts string literals. +* gmock_gen.py handles storage specifier macros and template return + types now. +* Compatibility fixes. +* Bug fixes and implementation clean-ups. +* Potentially incompatible changes: disables the harmful 'make install' + command in autotools. + +Potentially breaking changes: + +* The description string for MATCHER*() changes from Python-style + interpolation to an ordinary C++ string expression. +* SetArgumentPointee is deprecated in favor of SetArgPointee. +* Some non-essential project files for Visual Studio 2005 are removed. + +Changes for 1.5.0: + + * New feature: Google Mock can be safely used in multi-threaded tests + on platforms having pthreads. + * New feature: function for printing a value of arbitrary type. + * New feature: function ExplainMatchResult() for easy definition of + composite matchers. + * The new matcher API lets user-defined matchers generate custom + explanations more directly and efficiently. + * Better failure messages all around. + * NotNull() and IsNull() now work with smart pointers. + * Field() and Property() now work when the matcher argument is a pointer + passed by reference. + * Regular expression matchers on all platforms. + * Added GCC 4.0 support for Google Mock Doctor. + * Added gmock_all_test.cc for compiling most Google Mock tests + in a single file. + * Significantly cleaned up compiler warnings. + * Bug fixes, better test coverage, and implementation clean-ups. + + Potentially breaking changes: + + * Custom matchers defined using MatcherInterface or MakePolymorphicMatcher() + need to be updated after upgrading to Google Mock 1.5.0; matchers defined + using MATCHER or MATCHER_P* aren't affected. + * Dropped support for 'make install'. + +Changes for 1.4.0 (we skipped 1.2.* and 1.3.* to match the version of +Google Test): + + * Works in more environments: Symbian and minGW, Visual C++ 7.1. + * Lighter weight: comes with our own implementation of TR1 tuple (no + more dependency on Boost!). + * New feature: --gmock_catch_leaked_mocks for detecting leaked mocks. + * New feature: ACTION_TEMPLATE for defining templatized actions. + * New feature: the .After() clause for specifying expectation order. + * New feature: the .With() clause for specifying inter-argument + constraints. + * New feature: actions ReturnArg(), ReturnNew(...), and + DeleteArg(). + * New feature: matchers Key(), Pair(), Args<...>(), AllArgs(), IsNull(), + and Contains(). + * New feature: utility class MockFunction, useful for checkpoints, etc. + * New feature: functions Value(x, m) and SafeMatcherCast(m). + * New feature: copying a mock object is rejected at compile time. + * New feature: a script for fusing all Google Mock and Google Test + source files for easy deployment. + * Improved the Google Mock doctor to diagnose more diseases. + * Improved the Google Mock generator script. + * Compatibility fixes for Mac OS X and gcc. + * Bug fixes and implementation clean-ups. + +Changes for 1.1.0: + + * New feature: ability to use Google Mock with any testing framework. + * New feature: macros for easily defining new matchers + * New feature: macros for easily defining new actions. + * New feature: more container matchers. + * New feature: actions for accessing function arguments and throwing + exceptions. + * Improved the Google Mock doctor script for diagnosing compiler errors. + * Bug fixes and implementation clean-ups. + +Changes for 1.0.0: + + * Initial Open Source release of Google Mock diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/cmake/gmock_main.pc.in vulkan-1.1.73+dfsg/submodules/googletest/googlemock/cmake/gmock_main.pc.in --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/cmake/gmock_main.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/cmake/gmock_main.pc.in 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,9 @@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + +Name: gmock_main +Description: GoogleMock (with main() function) +Version: @PROJECT_VERSION@ +URL: https://github.com/google/googletest +Libs: -L${libdir} -lgmock_main @CMAKE_THREAD_LIBS_INIT@ +Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/cmake/gmock.pc.in vulkan-1.1.73+dfsg/submodules/googletest/googlemock/cmake/gmock.pc.in --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/cmake/gmock.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/cmake/gmock.pc.in 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,9 @@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + +Name: gmock +Description: GoogleMock (without main() function) +Version: @PROJECT_VERSION@ +URL: https://github.com/google/googletest +Libs: -L${libdir} -lgmock @CMAKE_THREAD_LIBS_INIT@ +Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/CMakeLists.txt vulkan-1.1.73+dfsg/submodules/googletest/googlemock/CMakeLists.txt --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/CMakeLists.txt 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,242 @@ +######################################################################## +# CMake build script for Google Mock. +# +# To run the tests for Google Mock itself on Linux, use 'make test' or +# ctest. You can select which tests to run using 'ctest -R regex'. +# For more options, run 'ctest --help'. + +# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to +# make it prominent in the GUI. +option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF) + +option(gmock_build_tests "Build all of Google Mock's own tests." OFF) + +# A directory to find Google Test sources. +if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/gtest/CMakeLists.txt") + set(gtest_dir gtest) +else() + set(gtest_dir ../googletest) +endif() + +# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build(). +include("${gtest_dir}/cmake/hermetic_build.cmake" OPTIONAL) + +if (COMMAND pre_project_set_up_hermetic_build) + # Google Test also calls hermetic setup functions from add_subdirectory, + # although its changes will not affect things at the current scope. + pre_project_set_up_hermetic_build() +endif() + +######################################################################## +# +# Project-wide settings + +# Name of the project. +# +# CMake files in this project can refer to the root source directory +# as ${gmock_SOURCE_DIR} and to the root binary directory as +# ${gmock_BINARY_DIR}. +# Language "C" is required for find_package(Threads). +if (CMAKE_VERSION VERSION_LESS 3.0) + project(gmock CXX C) +else() + cmake_policy(SET CMP0048 NEW) + project(gmock VERSION 1.9.0 LANGUAGES CXX C) +endif() +cmake_minimum_required(VERSION 2.6.4) + +if (COMMAND set_up_hermetic_build) + set_up_hermetic_build() +endif() + +# Instructs CMake to process Google Test's CMakeLists.txt and add its +# targets to the current scope. We are placing Google Test's binary +# directory in a subdirectory of our own as VC compilation may break +# if they are the same (the default). +add_subdirectory("${gtest_dir}" "${gmock_BINARY_DIR}/gtest") + +# Although Google Test's CMakeLists.txt calls this function, the +# changes there don't affect the current scope. Therefore we have to +# call it again here. +config_compiler_and_linker() # from ${gtest_dir}/cmake/internal_utils.cmake + +# Adds Google Mock's and Google Test's header directories to the search path. +include_directories("${gmock_SOURCE_DIR}/include" + "${gmock_SOURCE_DIR}" + "${gtest_SOURCE_DIR}/include" + # This directory is needed to build directly from Google + # Test sources. + "${gtest_SOURCE_DIR}") + +# Summary of tuple support for Microsoft Visual Studio: +# Compiler version(MS) version(cmake) Support +# ---------- ----------- -------------- ----------------------------- +# <= VS 2010 <= 10 <= 1600 Use Google Tests's own tuple. +# VS 2012 11 1700 std::tr1::tuple + _VARIADIC_MAX=10 +# VS 2013 12 1800 std::tr1::tuple +# VS 2015 14 1900 std::tuple +# VS 2017 15 >= 1910 std::tuple +if (MSVC AND MSVC_VERSION EQUAL 1700) + add_definitions(/D _VARIADIC_MAX=10) +endif() + +######################################################################## +# +# Defines the gmock & gmock_main libraries. User tests should link +# with one of them. + +# Google Mock libraries. We build them using more strict warnings than what +# are used for other targets, to ensure that Google Mock can be compiled by +# a user aggressive about warnings. +if (MSVC) + cxx_library(gmock + "${cxx_strict}" + "${gtest_dir}/src/gtest-all.cc" + src/gmock-all.cc) + + cxx_library(gmock_main + "${cxx_strict}" + "${gtest_dir}/src/gtest-all.cc" + src/gmock-all.cc + src/gmock_main.cc) +else() + cxx_library(gmock "${cxx_strict}" src/gmock-all.cc) + target_link_libraries(gmock gtest) + cxx_library(gmock_main "${cxx_strict}" src/gmock_main.cc) + target_link_libraries(gmock_main gmock) +endif() + +# If the CMake version supports it, attach header directory information +# to the targets for when we are part of a parent build (ie being pulled +# in via add_subdirectory() rather than being a standalone build). +if (DEFINED CMAKE_VERSION AND NOT "${CMAKE_VERSION}" VERSION_LESS "2.8.11") + target_include_directories(gmock SYSTEM INTERFACE "${gmock_SOURCE_DIR}/include") + target_include_directories(gmock_main SYSTEM INTERFACE "${gmock_SOURCE_DIR}/include") +endif() + +######################################################################## +# +# Install rules +if(INSTALL_GMOCK) + install(TARGETS gmock gmock_main + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") + install(DIRECTORY "${gmock_SOURCE_DIR}/include/gmock" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + + # configure and install pkgconfig files + configure_file( + cmake/gmock.pc.in + "${CMAKE_BINARY_DIR}/gmock.pc" + @ONLY) + configure_file( + cmake/gmock_main.pc.in + "${CMAKE_BINARY_DIR}/gmock_main.pc" + @ONLY) + install(FILES "${CMAKE_BINARY_DIR}/gmock.pc" "${CMAKE_BINARY_DIR}/gmock_main.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") +endif() + +######################################################################## +# +# Google Mock's own tests. +# +# You can skip this section if you aren't interested in testing +# Google Mock itself. +# +# The tests are not built by default. To build them, set the +# gmock_build_tests option to ON. You can do it by running ccmake +# or specifying the -Dgmock_build_tests=ON flag when running cmake. + +if (gmock_build_tests) + # This must be set in the root directory for the tests to be run by + # 'make test' or ctest. + enable_testing() + + ############################################################ + # C++ tests built with standard compiler flags. + + cxx_test(gmock-actions_test gmock_main) + cxx_test(gmock-cardinalities_test gmock_main) + cxx_test(gmock_ex_test gmock_main) + cxx_test(gmock-generated-actions_test gmock_main) + cxx_test(gmock-generated-function-mockers_test gmock_main) + cxx_test(gmock-generated-internal-utils_test gmock_main) + cxx_test(gmock-generated-matchers_test gmock_main) + cxx_test(gmock-internal-utils_test gmock_main) + cxx_test(gmock-matchers_test gmock_main) + cxx_test(gmock-more-actions_test gmock_main) + cxx_test(gmock-nice-strict_test gmock_main) + cxx_test(gmock-port_test gmock_main) + cxx_test(gmock-spec-builders_test gmock_main) + cxx_test(gmock_link_test gmock_main test/gmock_link2_test.cc) + cxx_test(gmock_test gmock_main) + + if (DEFINED GTEST_HAS_PTHREAD) + cxx_test(gmock_stress_test gmock) + endif() + + # gmock_all_test is commented to save time building and running tests. + # Uncomment if necessary. + # cxx_test(gmock_all_test gmock_main) + + ############################################################ + # C++ tests built with non-standard compiler flags. + + if (MSVC) + cxx_library(gmock_main_no_exception "${cxx_no_exception}" + "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) + + cxx_library(gmock_main_no_rtti "${cxx_no_rtti}" + "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) + + if (MSVC_VERSION LESS 1600) # 1600 is Visual Studio 2010. + # Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that + # conflict with our own definitions. Therefore using our own tuple does not + # work on those compilers. + cxx_library(gmock_main_use_own_tuple "${cxx_use_own_tuple}" + "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) + + cxx_test_with_flags(gmock_use_own_tuple_test "${cxx_use_own_tuple}" + gmock_main_use_own_tuple test/gmock-spec-builders_test.cc) + endif() + else() + cxx_library(gmock_main_no_exception "${cxx_no_exception}" src/gmock_main.cc) + target_link_libraries(gmock_main_no_exception gmock) + + cxx_library(gmock_main_no_rtti "${cxx_no_rtti}" src/gmock_main.cc) + target_link_libraries(gmock_main_no_rtti gmock) + + cxx_library(gmock_main_use_own_tuple "${cxx_use_own_tuple}" src/gmock_main.cc) + target_link_libraries(gmock_main_use_own_tuple gmock) + endif() + cxx_test_with_flags(gmock-more-actions_no_exception_test "${cxx_no_exception}" + gmock_main_no_exception test/gmock-more-actions_test.cc) + + cxx_test_with_flags(gmock_no_rtti_test "${cxx_no_rtti}" + gmock_main_no_rtti test/gmock-spec-builders_test.cc) + + cxx_shared_library(shared_gmock_main "${cxx_default}" + "${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc) + + # Tests that a binary can be built with Google Mock as a shared library. On + # some system configurations, it may not possible to run the binary without + # knowing more details about the system configurations. We do not try to run + # this binary. To get a more robust shared library coverage, configure with + # -DBUILD_SHARED_LIBS=ON. + cxx_executable_with_flags(shared_gmock_test_ "${cxx_default}" + shared_gmock_main test/gmock-spec-builders_test.cc) + set_target_properties(shared_gmock_test_ + PROPERTIES + COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1") + + ############################################################ + # Python tests. + + cxx_executable(gmock_leak_test_ test gmock_main) + py_test(gmock_leak_test) + + cxx_executable(gmock_output_test_ test gmock) + py_test(gmock_output_test) +endif() diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/configure.ac vulkan-1.1.73+dfsg/submodules/googletest/googlemock/configure.ac --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/configure.ac 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/configure.ac 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,146 @@ +m4_include(../googletest/m4/acx_pthread.m4) + +AC_INIT([Google C++ Mocking Framework], + [1.8.0], + [googlemock@googlegroups.com], + [gmock]) + +# Provide various options to initialize the Autoconf and configure processes. +AC_PREREQ([2.59]) +AC_CONFIG_SRCDIR([./LICENSE]) +AC_CONFIG_AUX_DIR([build-aux]) +AC_CONFIG_HEADERS([build-aux/config.h]) +AC_CONFIG_FILES([Makefile]) +AC_CONFIG_FILES([scripts/gmock-config], [chmod +x scripts/gmock-config]) + +# Initialize Automake with various options. We require at least v1.9, prevent +# pedantic complaints about package files, and enable various distribution +# targets. +AM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects]) + +# Check for programs used in building Google Test. +AC_PROG_CC +AC_PROG_CXX +AC_LANG([C++]) +AC_PROG_LIBTOOL + +# TODO(chandlerc@google.com): Currently we aren't running the Python tests +# against the interpreter detected by AM_PATH_PYTHON, and so we condition +# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's +# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env" +# hashbang. +PYTHON= # We *do not* allow the user to specify a python interpreter +AC_PATH_PROG([PYTHON],[python],[:]) +AS_IF([test "$PYTHON" != ":"], + [AM_PYTHON_CHECK_VERSION([$PYTHON],[2.3],[:],[PYTHON=":"])]) +AM_CONDITIONAL([HAVE_PYTHON],[test "$PYTHON" != ":"]) + +# TODO(chandlerc@google.com) Check for the necessary system headers. + +# Configure pthreads. +AC_ARG_WITH([pthreads], + [AS_HELP_STRING([--with-pthreads], + [use pthreads (default is yes)])], + [with_pthreads=$withval], + [with_pthreads=check]) + +have_pthreads=no +AS_IF([test "x$with_pthreads" != "xno"], + [ACX_PTHREAD( + [], + [AS_IF([test "x$with_pthreads" != "xcheck"], + [AC_MSG_FAILURE( + [--with-pthreads was specified, but unable to be used])])]) + have_pthreads="$acx_pthread_ok"]) +AM_CONDITIONAL([HAVE_PTHREADS],[test "x$have_pthreads" == "xyes"]) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_LIBS) + +# GoogleMock currently has hard dependencies upon GoogleTest above and beyond +# running its own test suite, so we both provide our own version in +# a subdirectory and provide some logic to use a custom version or a system +# installed version. +AC_ARG_WITH([gtest], + [AS_HELP_STRING([--with-gtest], + [Specifies how to find the gtest package. If no + arguments are given, the default behavior, a + system installed gtest will be used if present, + and an internal version built otherwise. If a + path is provided, the gtest built or installed at + that prefix will be used.])], + [], + [with_gtest=yes]) +AC_ARG_ENABLE([external-gtest], + [AS_HELP_STRING([--disable-external-gtest], + [Disables any detection or use of a system + installed or user provided gtest. Any option to + '--with-gtest' is ignored. (Default is enabled.)]) + ], [], [enable_external_gtest=yes]) +AS_IF([test "x$with_gtest" == "xno"], + [AC_MSG_ERROR([dnl +Support for GoogleTest was explicitly disabled. Currently GoogleMock has a hard +dependency upon GoogleTest to build, please provide a version, or allow +GoogleMock to use any installed version and fall back upon its internal +version.])]) + +# Setup various GTEST variables. TODO(chandlerc@google.com): When these are +# used below, they should be used such that any pre-existing values always +# trump values we set them to, so that they can be used to selectively override +# details of the detection process. +AC_ARG_VAR([GTEST_CONFIG], + [The exact path of Google Test's 'gtest-config' script.]) +AC_ARG_VAR([GTEST_CPPFLAGS], + [C-like preprocessor flags for Google Test.]) +AC_ARG_VAR([GTEST_CXXFLAGS], + [C++ compile flags for Google Test.]) +AC_ARG_VAR([GTEST_LDFLAGS], + [Linker path and option flags for Google Test.]) +AC_ARG_VAR([GTEST_LIBS], + [Library linking flags for Google Test.]) +AC_ARG_VAR([GTEST_VERSION], + [The version of Google Test available.]) +HAVE_BUILT_GTEST="no" + +GTEST_MIN_VERSION="1.8.0" + +AS_IF([test "x${enable_external_gtest}" = "xyes"], + [# Begin filling in variables as we are able. + AS_IF([test "x${with_gtest}" != "xyes"], + [AS_IF([test -x "${with_gtest}/scripts/gtest-config"], + [GTEST_CONFIG="${with_gtest}/scripts/gtest-config"], + [GTEST_CONFIG="${with_gtest}/bin/gtest-config"]) + AS_IF([test -x "${GTEST_CONFIG}"], [], + [AC_MSG_ERROR([dnl +Unable to locate either a built or installed Google Test at '${with_gtest}'.]) + ])]) + + AS_IF([test -x "${GTEST_CONFIG}"], [], + [AC_PATH_PROG([GTEST_CONFIG], [gtest-config])]) + AS_IF([test -x "${GTEST_CONFIG}"], + [AC_MSG_CHECKING([for Google Test version >= ${GTEST_MIN_VERSION}]) + AS_IF([${GTEST_CONFIG} --min-version=${GTEST_MIN_VERSION}], + [AC_MSG_RESULT([yes]) + HAVE_BUILT_GTEST="yes"], + [AC_MSG_RESULT([no])])])]) + +AS_IF([test "x${HAVE_BUILT_GTEST}" = "xyes"], + [GTEST_CPPFLAGS=`${GTEST_CONFIG} --cppflags` + GTEST_CXXFLAGS=`${GTEST_CONFIG} --cxxflags` + GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags` + GTEST_LIBS=`${GTEST_CONFIG} --libs` + GTEST_VERSION=`${GTEST_CONFIG} --version`], + [ + # GTEST_CONFIG needs to be executable both in a Makefile environment and + # in a shell script environment, so resolve an absolute path for it here. + GTEST_CONFIG="`pwd -P`/../googletest/scripts/gtest-config" + GTEST_CPPFLAGS='-I$(top_srcdir)/../googletest/include' + GTEST_CXXFLAGS='-g' + GTEST_LDFLAGS='' + GTEST_LIBS='$(top_builddir)/../googletest/lib/libgtest.la' + GTEST_VERSION="${GTEST_MIN_VERSION}"]) + +# TODO(chandlerc@google.com) Check the types, structures, and other compiler +# and architecture characteristics. + +# Output the generated files. No further autoconf macros may be used. +AC_OUTPUT diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/CONTRIBUTORS vulkan-1.1.73+dfsg/submodules/googletest/googlemock/CONTRIBUTORS --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/CONTRIBUTORS 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/CONTRIBUTORS 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,40 @@ +# This file contains a list of people who've made non-trivial +# contribution to the Google C++ Mocking Framework project. People +# who commit code to the project are encouraged to add their names +# here. Please keep the list sorted by first names. + +Benoit Sigoure +Bogdan Piloca +Chandler Carruth +Dave MacLachlan +David Anderson +Dean Sturtevant +Gene Volovich +Hal Burch +Jeffrey Yasskin +Jim Keller +Joe Walnes +Jon Wray +Keir Mierle +Keith Ray +Kostya Serebryany +Lev Makhlis +Manuel Klimek +Mario Tanev +Mark Paskin +Markus Heule +Matthew Simmons +Mike Bland +Neal Norwitz +Nermin Ozkiranartli +Owen Carlsen +Paneendra Ba +Paul Menage +Piotr Kaminski +Russ Rufer +Sverre Sundsdal +Takeshi Yoshino +Vadim Berman +Vlad Losev +Wolfgang Klier +Zhanyong Wan diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/CheatSheet.md vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/CheatSheet.md --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/CheatSheet.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/CheatSheet.md 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,564 @@ + + +# Defining a Mock Class # + +## Mocking a Normal Class ## + +Given +``` +class Foo { + ... + virtual ~Foo(); + virtual int GetSize() const = 0; + virtual string Describe(const char* name) = 0; + virtual string Describe(int type) = 0; + virtual bool Process(Bar elem, int count) = 0; +}; +``` +(note that `~Foo()` **must** be virtual) we can define its mock as +``` +#include "gmock/gmock.h" + +class MockFoo : public Foo { + MOCK_CONST_METHOD0(GetSize, int()); + MOCK_METHOD1(Describe, string(const char* name)); + MOCK_METHOD1(Describe, string(int type)); + MOCK_METHOD2(Process, bool(Bar elem, int count)); +}; +``` + +To create a "nice" mock object which ignores all uninteresting calls, +or a "strict" mock object, which treats them as failures: +``` +NiceMock nice_foo; // The type is a subclass of MockFoo. +StrictMock strict_foo; // The type is a subclass of MockFoo. +``` + +## Mocking a Class Template ## + +To mock +``` +template +class StackInterface { + public: + ... + virtual ~StackInterface(); + virtual int GetSize() const = 0; + virtual void Push(const Elem& x) = 0; +}; +``` +(note that `~StackInterface()` **must** be virtual) just append `_T` to the `MOCK_*` macros: +``` +template +class MockStack : public StackInterface { + public: + ... + MOCK_CONST_METHOD0_T(GetSize, int()); + MOCK_METHOD1_T(Push, void(const Elem& x)); +}; +``` + +## Specifying Calling Conventions for Mock Functions ## + +If your mock function doesn't use the default calling convention, you +can specify it by appending `_WITH_CALLTYPE` to any of the macros +described in the previous two sections and supplying the calling +convention as the first argument to the macro. For example, +``` + MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Foo, bool(int n)); + MOCK_CONST_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, Bar, int(double x, double y)); +``` +where `STDMETHODCALLTYPE` is defined by `` on Windows. + +# Using Mocks in Tests # + +The typical flow is: + 1. Import the Google Mock names you need to use. All Google Mock names are in the `testing` namespace unless they are macros or otherwise noted. + 1. Create the mock objects. + 1. Optionally, set the default actions of the mock objects. + 1. Set your expectations on the mock objects (How will they be called? What wil they do?). + 1. Exercise code that uses the mock objects; if necessary, check the result using [Google Test](../../googletest/) assertions. + 1. When a mock objects is destructed, Google Mock automatically verifies that all expectations on it have been satisfied. + +Here is an example: +``` +using ::testing::Return; // #1 + +TEST(BarTest, DoesThis) { + MockFoo foo; // #2 + + ON_CALL(foo, GetSize()) // #3 + .WillByDefault(Return(1)); + // ... other default actions ... + + EXPECT_CALL(foo, Describe(5)) // #4 + .Times(3) + .WillRepeatedly(Return("Category 5")); + // ... other expectations ... + + EXPECT_EQ("good", MyProductionFunction(&foo)); // #5 +} // #6 +``` + +# Setting Default Actions # + +Google Mock has a **built-in default action** for any function that +returns `void`, `bool`, a numeric value, or a pointer. + +To customize the default action for functions with return type `T` globally: +``` +using ::testing::DefaultValue; + +// Sets the default value to be returned. T must be CopyConstructible. +DefaultValue::Set(value); +// Sets a factory. Will be invoked on demand. T must be MoveConstructible. +// T MakeT(); +DefaultValue::SetFactory(&MakeT); +// ... use the mocks ... +// Resets the default value. +DefaultValue::Clear(); +``` + +To customize the default action for a particular method, use `ON_CALL()`: +``` +ON_CALL(mock_object, method(matchers)) + .With(multi_argument_matcher) ? + .WillByDefault(action); +``` + +# Setting Expectations # + +`EXPECT_CALL()` sets **expectations** on a mock method (How will it be +called? What will it do?): +``` +EXPECT_CALL(mock_object, method(matchers)) + .With(multi_argument_matcher) ? + .Times(cardinality) ? + .InSequence(sequences) * + .After(expectations) * + .WillOnce(action) * + .WillRepeatedly(action) ? + .RetiresOnSaturation(); ? +``` + +If `Times()` is omitted, the cardinality is assumed to be: + + * `Times(1)` when there is neither `WillOnce()` nor `WillRepeatedly()`; + * `Times(n)` when there are `n WillOnce()`s but no `WillRepeatedly()`, where `n` >= 1; or + * `Times(AtLeast(n))` when there are `n WillOnce()`s and a `WillRepeatedly()`, where `n` >= 0. + +A method with no `EXPECT_CALL()` is free to be invoked _any number of times_, and the default action will be taken each time. + +# Matchers # + +A **matcher** matches a _single_ argument. You can use it inside +`ON_CALL()` or `EXPECT_CALL()`, or use it to validate a value +directly: + +| `EXPECT_THAT(value, matcher)` | Asserts that `value` matches `matcher`. | +|:------------------------------|:----------------------------------------| +| `ASSERT_THAT(value, matcher)` | The same as `EXPECT_THAT(value, matcher)`, except that it generates a **fatal** failure. | + +Built-in matchers (where `argument` is the function argument) are +divided into several categories: + +## Wildcard ## +|`_`|`argument` can be any value of the correct type.| +|:--|:-----------------------------------------------| +|`A()` or `An()`|`argument` can be any value of type `type`. | + +## Generic Comparison ## + +|`Eq(value)` or `value`|`argument == value`| +|:---------------------|:------------------| +|`Ge(value)` |`argument >= value`| +|`Gt(value)` |`argument > value` | +|`Le(value)` |`argument <= value`| +|`Lt(value)` |`argument < value` | +|`Ne(value)` |`argument != value`| +|`IsNull()` |`argument` is a `NULL` pointer (raw or smart).| +|`NotNull()` |`argument` is a non-null pointer (raw or smart).| +|`VariantWith(m)` |`argument` is `variant<>` that holds the alternative of +type T with a value matching `m`.| +|`Ref(variable)` |`argument` is a reference to `variable`.| +|`TypedEq(value)`|`argument` has type `type` and is equal to `value`. You may need to use this instead of `Eq(value)` when the mock function is overloaded.| + +Except `Ref()`, these matchers make a _copy_ of `value` in case it's +modified or destructed later. If the compiler complains that `value` +doesn't have a public copy constructor, try wrap it in `ByRef()`, +e.g. `Eq(ByRef(non_copyable_value))`. If you do that, make sure +`non_copyable_value` is not changed afterwards, or the meaning of your +matcher will be changed. + +## Floating-Point Matchers ## + +|`DoubleEq(a_double)`|`argument` is a `double` value approximately equal to `a_double`, treating two NaNs as unequal.| +|:-------------------|:----------------------------------------------------------------------------------------------| +|`FloatEq(a_float)` |`argument` is a `float` value approximately equal to `a_float`, treating two NaNs as unequal. | +|`NanSensitiveDoubleEq(a_double)`|`argument` is a `double` value approximately equal to `a_double`, treating two NaNs as equal. | +|`NanSensitiveFloatEq(a_float)`|`argument` is a `float` value approximately equal to `a_float`, treating two NaNs as equal. | + +The above matchers use ULP-based comparison (the same as used in +[Google Test](../../googletest/)). They +automatically pick a reasonable error bound based on the absolute +value of the expected value. `DoubleEq()` and `FloatEq()` conform to +the IEEE standard, which requires comparing two NaNs for equality to +return false. The `NanSensitive*` version instead treats two NaNs as +equal, which is often what a user wants. + +|`DoubleNear(a_double, max_abs_error)`|`argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as unequal.| +|:------------------------------------|:--------------------------------------------------------------------------------------------------------------------| +|`FloatNear(a_float, max_abs_error)` |`argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as unequal. | +|`NanSensitiveDoubleNear(a_double, max_abs_error)`|`argument` is a `double` value close to `a_double` (absolute error <= `max_abs_error`), treating two NaNs as equal. | +|`NanSensitiveFloatNear(a_float, max_abs_error)`|`argument` is a `float` value close to `a_float` (absolute error <= `max_abs_error`), treating two NaNs as equal. | + +## String Matchers ## + +The `argument` can be either a C string or a C++ string object: + +|`ContainsRegex(string)`|`argument` matches the given regular expression.| +|:----------------------|:-----------------------------------------------| +|`EndsWith(suffix)` |`argument` ends with string `suffix`. | +|`HasSubstr(string)` |`argument` contains `string` as a sub-string. | +|`MatchesRegex(string)` |`argument` matches the given regular expression with the match starting at the first character and ending at the last character.| +|`StartsWith(prefix)` |`argument` starts with string `prefix`. | +|`StrCaseEq(string)` |`argument` is equal to `string`, ignoring case. | +|`StrCaseNe(string)` |`argument` is not equal to `string`, ignoring case.| +|`StrEq(string)` |`argument` is equal to `string`. | +|`StrNe(string)` |`argument` is not equal to `string`. | + +`ContainsRegex()` and `MatchesRegex()` use the regular expression +syntax defined +[here](../../googletest/docs/AdvancedGuide.md#regular-expression-syntax). +`StrCaseEq()`, `StrCaseNe()`, `StrEq()`, and `StrNe()` work for wide +strings as well. + +## Container Matchers ## + +Most STL-style containers support `==`, so you can use +`Eq(expected_container)` or simply `expected_container` to match a +container exactly. If you want to write the elements in-line, +match them more flexibly, or get more informative messages, you can use: + +| `ContainerEq(container)` | The same as `Eq(container)` except that the failure message also includes which elements are in one container but not the other. | +|:-------------------------|:---------------------------------------------------------------------------------------------------------------------------------| +| `Contains(e)` | `argument` contains an element that matches `e`, which can be either a value or a matcher. | +| `Each(e)` | `argument` is a container where _every_ element matches `e`, which can be either a value or a matcher. | +| `ElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, where the i-th element matches `ei`, which can be a value or a matcher. 0 to 10 arguments are allowed. | +| `ElementsAreArray({ e0, e1, ..., en })`, `ElementsAreArray(array)`, or `ElementsAreArray(array, count)` | The same as `ElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, or C-style array. | +| `IsEmpty()` | `argument` is an empty container (`container.empty()`). | +| `Pointwise(m, container)` | `argument` contains the same number of elements as in `container`, and for all i, (the i-th element in `argument`, the i-th element in `container`) match `m`, which is a matcher on 2-tuples. E.g. `Pointwise(Le(), upper_bounds)` verifies that each element in `argument` doesn't exceed the corresponding element in `upper_bounds`. See more detail below. | +| `SizeIs(m)` | `argument` is a container whose size matches `m`. E.g. `SizeIs(2)` or `SizeIs(Lt(2))`. | +| `UnorderedElementsAre(e0, e1, ..., en)` | `argument` has `n + 1` elements, and under some permutation each element matches an `ei` (for a different `i`), which can be a value or a matcher. 0 to 10 arguments are allowed. | +| `UnorderedElementsAreArray({ e0, e1, ..., en })`, `UnorderedElementsAreArray(array)`, or `UnorderedElementsAreArray(array, count)` | The same as `UnorderedElementsAre()` except that the expected element values/matchers come from an initializer list, STL-style container, or C-style array. | +| `WhenSorted(m)` | When `argument` is sorted using the `<` operator, it matches container matcher `m`. E.g. `WhenSorted(ElementsAre(1, 2, 3))` verifies that `argument` contains elements `1`, `2`, and `3`, ignoring order. | +| `WhenSortedBy(comparator, m)` | The same as `WhenSorted(m)`, except that the given comparator instead of `<` is used to sort `argument`. E.g. `WhenSortedBy(std::greater(), ElementsAre(3, 2, 1))`. | + +Notes: + + * These matchers can also match: + 1. a native array passed by reference (e.g. in `Foo(const int (&a)[5])`), and + 1. an array passed as a pointer and a count (e.g. in `Bar(const T* buffer, int len)` -- see [Multi-argument Matchers](#Multiargument_Matchers.md)). + * The array being matched may be multi-dimensional (i.e. its elements can be arrays). + * `m` in `Pointwise(m, ...)` should be a matcher for `::testing::tuple` where `T` and `U` are the element type of the actual container and the expected container, respectively. For example, to compare two `Foo` containers where `Foo` doesn't support `operator==` but has an `Equals()` method, one might write: + +``` +using ::testing::get; +MATCHER(FooEq, "") { + return get<0>(arg).Equals(get<1>(arg)); +} +... +EXPECT_THAT(actual_foos, Pointwise(FooEq(), expected_foos)); +``` + +## Member Matchers ## + +|`Field(&class::field, m)`|`argument.field` (or `argument->field` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_.| +|:------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------| +|`Key(e)` |`argument.first` matches `e`, which can be either a value or a matcher. E.g. `Contains(Key(Le(5)))` can verify that a `map` contains a key `<= 5`.| +|`Pair(m1, m2)` |`argument` is an `std::pair` whose `first` field matches `m1` and `second` field matches `m2`. | +|`Property(&class::property, m)`|`argument.property()` (or `argument->property()` when `argument` is a plain pointer) matches matcher `m`, where `argument` is an object of type _class_.| + +## Matching the Result of a Function or Functor ## + +|`ResultOf(f, m)`|`f(argument)` matches matcher `m`, where `f` is a function or functor.| +|:---------------|:---------------------------------------------------------------------| + +## Pointer Matchers ## + +|`Pointee(m)`|`argument` (either a smart pointer or a raw pointer) points to a value that matches matcher `m`.| +|:-----------|:-----------------------------------------------------------------------------------------------| +|`WhenDynamicCastTo(m)`| when `argument` is passed through `dynamic_cast()`, it matches matcher `m`. | + +## Multiargument Matchers ## + +Technically, all matchers match a _single_ value. A "multi-argument" +matcher is just one that matches a _tuple_. The following matchers can +be used to match a tuple `(x, y)`: + +|`Eq()`|`x == y`| +|:-----|:-------| +|`Ge()`|`x >= y`| +|`Gt()`|`x > y` | +|`Le()`|`x <= y`| +|`Lt()`|`x < y` | +|`Ne()`|`x != y`| + +You can use the following selectors to pick a subset of the arguments +(or reorder them) to participate in the matching: + +|`AllArgs(m)`|Equivalent to `m`. Useful as syntactic sugar in `.With(AllArgs(m))`.| +|:-----------|:-------------------------------------------------------------------| +|`Args(m)`|The tuple of the `k` selected (using 0-based indices) arguments matches `m`, e.g. `Args<1, 2>(Eq())`.| + +## Composite Matchers ## + +You can make a matcher from one or more other matchers: + +|`AllOf(m1, m2, ..., mn)`|`argument` matches all of the matchers `m1` to `mn`.| +|:-----------------------|:---------------------------------------------------| +|`AnyOf(m1, m2, ..., mn)`|`argument` matches at least one of the matchers `m1` to `mn`.| +|`Not(m)` |`argument` doesn't match matcher `m`. | + +## Adapters for Matchers ## + +|`MatcherCast(m)`|casts matcher `m` to type `Matcher`.| +|:------------------|:--------------------------------------| +|`SafeMatcherCast(m)`| [safely casts](CookBook.md#casting-matchers) matcher `m` to type `Matcher`. | +|`Truly(predicate)` |`predicate(argument)` returns something considered by C++ to be true, where `predicate` is a function or functor.| + +## Matchers as Predicates ## + +|`Matches(m)(value)`|evaluates to `true` if `value` matches `m`. You can use `Matches(m)` alone as a unary functor.| +|:------------------|:---------------------------------------------------------------------------------------------| +|`ExplainMatchResult(m, value, result_listener)`|evaluates to `true` if `value` matches `m`, explaining the result to `result_listener`. | +|`Value(value, m)` |evaluates to `true` if `value` matches `m`. | + +## Defining Matchers ## + +| `MATCHER(IsEven, "") { return (arg % 2) == 0; }` | Defines a matcher `IsEven()` to match an even number. | +|:-------------------------------------------------|:------------------------------------------------------| +| `MATCHER_P(IsDivisibleBy, n, "") { *result_listener << "where the remainder is " << (arg % n); return (arg % n) == 0; }` | Defines a macher `IsDivisibleBy(n)` to match a number divisible by `n`. | +| `MATCHER_P2(IsBetween, a, b, std::string(negation ? "isn't" : "is") + " between " + PrintToString(a) + " and " + PrintToString(b)) { return a <= arg && arg <= b; }` | Defines a matcher `IsBetween(a, b)` to match a value in the range [`a`, `b`]. | + +**Notes:** + + 1. The `MATCHER*` macros cannot be used inside a function or class. + 1. The matcher body must be _purely functional_ (i.e. it cannot have any side effect, and the result must not depend on anything other than the value being matched and the matcher parameters). + 1. You can use `PrintToString(x)` to convert a value `x` of any type to a string. + +## Matchers as Test Assertions ## + +|`ASSERT_THAT(expression, m)`|Generates a [fatal failure](../../googletest/docs/Primer.md#assertions) if the value of `expression` doesn't match matcher `m`.| +|:---------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------| +|`EXPECT_THAT(expression, m)`|Generates a non-fatal failure if the value of `expression` doesn't match matcher `m`. | + +# Actions # + +**Actions** specify what a mock function should do when invoked. + +## Returning a Value ## + +|`Return()`|Return from a `void` mock function.| +|:---------|:----------------------------------| +|`Return(value)`|Return `value`. If the type of `value` is different to the mock function's return type, `value` is converted to the latter type at the time the expectation is set, not when the action is executed.| +|`ReturnArg()`|Return the `N`-th (0-based) argument.| +|`ReturnNew(a1, ..., ak)`|Return `new T(a1, ..., ak)`; a different object is created each time.| +|`ReturnNull()`|Return a null pointer. | +|`ReturnPointee(ptr)`|Return the value pointed to by `ptr`.| +|`ReturnRef(variable)`|Return a reference to `variable`. | +|`ReturnRefOfCopy(value)`|Return a reference to a copy of `value`; the copy lives as long as the action.| + +## Side Effects ## + +|`Assign(&variable, value)`|Assign `value` to variable.| +|:-------------------------|:--------------------------| +| `DeleteArg()` | Delete the `N`-th (0-based) argument, which must be a pointer. | +| `SaveArg(pointer)` | Save the `N`-th (0-based) argument to `*pointer`. | +| `SaveArgPointee(pointer)` | Save the value pointed to by the `N`-th (0-based) argument to `*pointer`. | +| `SetArgReferee(value)` | Assign value to the variable referenced by the `N`-th (0-based) argument. | +|`SetArgPointee(value)` |Assign `value` to the variable pointed by the `N`-th (0-based) argument.| +|`SetArgumentPointee(value)`|Same as `SetArgPointee(value)`. Deprecated. Will be removed in v1.7.0.| +|`SetArrayArgument(first, last)`|Copies the elements in source range [`first`, `last`) to the array pointed to by the `N`-th (0-based) argument, which can be either a pointer or an iterator. The action does not take ownership of the elements in the source range.| +|`SetErrnoAndReturn(error, value)`|Set `errno` to `error` and return `value`.| +|`Throw(exception)` |Throws the given exception, which can be any copyable value. Available since v1.1.0.| + +## Using a Function or a Functor as an Action ## + +|`Invoke(f)`|Invoke `f` with the arguments passed to the mock function, where `f` can be a global/static function or a functor.| +|:----------|:-----------------------------------------------------------------------------------------------------------------| +|`Invoke(object_pointer, &class::method)`|Invoke the {method on the object with the arguments passed to the mock function. | +|`InvokeWithoutArgs(f)`|Invoke `f`, which can be a global/static function or a functor. `f` must take no arguments. | +|`InvokeWithoutArgs(object_pointer, &class::method)`|Invoke the method on the object, which takes no arguments. | +|`InvokeArgument(arg1, arg2, ..., argk)`|Invoke the mock function's `N`-th (0-based) argument, which must be a function or a functor, with the `k` arguments.| + +The return value of the invoked function is used as the return value +of the action. + +When defining a function or functor to be used with `Invoke*()`, you can declare any unused parameters as `Unused`: +``` + double Distance(Unused, double x, double y) { return sqrt(x*x + y*y); } + ... + EXPECT_CALL(mock, Foo("Hi", _, _)).WillOnce(Invoke(Distance)); +``` + +In `InvokeArgument(...)`, if an argument needs to be passed by reference, wrap it inside `ByRef()`. For example, +``` + InvokeArgument<2>(5, string("Hi"), ByRef(foo)) +``` +calls the mock function's #2 argument, passing to it `5` and `string("Hi")` by value, and `foo` by reference. + +## Default Action ## + +|`DoDefault()`|Do the default action (specified by `ON_CALL()` or the built-in one).| +|:------------|:--------------------------------------------------------------------| + +**Note:** due to technical reasons, `DoDefault()` cannot be used inside a composite action - trying to do so will result in a run-time error. + +## Composite Actions ## + +|`DoAll(a1, a2, ..., an)`|Do all actions `a1` to `an` and return the result of `an` in each invocation. The first `n - 1` sub-actions must return void. | +|:-----------------------|:-----------------------------------------------------------------------------------------------------------------------------| +|`IgnoreResult(a)` |Perform action `a` and ignore its result. `a` must not return void. | +|`WithArg(a)` |Pass the `N`-th (0-based) argument of the mock function to action `a` and perform it. | +|`WithArgs(a)`|Pass the selected (0-based) arguments of the mock function to action `a` and perform it. | +|`WithoutArgs(a)` |Perform action `a` without any arguments. | + +## Defining Actions ## + +| `ACTION(Sum) { return arg0 + arg1; }` | Defines an action `Sum()` to return the sum of the mock function's argument #0 and #1. | +|:--------------------------------------|:---------------------------------------------------------------------------------------| +| `ACTION_P(Plus, n) { return arg0 + n; }` | Defines an action `Plus(n)` to return the sum of the mock function's argument #0 and `n`. | +| `ACTION_Pk(Foo, p1, ..., pk) { statements; }` | Defines a parameterized action `Foo(p1, ..., pk)` to execute the given `statements`. | + +The `ACTION*` macros cannot be used inside a function or class. + +# Cardinalities # + +These are used in `Times()` to specify how many times a mock function will be called: + +|`AnyNumber()`|The function can be called any number of times.| +|:------------|:----------------------------------------------| +|`AtLeast(n)` |The call is expected at least `n` times. | +|`AtMost(n)` |The call is expected at most `n` times. | +|`Between(m, n)`|The call is expected between `m` and `n` (inclusive) times.| +|`Exactly(n) or n`|The call is expected exactly `n` times. In particular, the call should never happen when `n` is 0.| + +# Expectation Order # + +By default, the expectations can be matched in _any_ order. If some +or all expectations must be matched in a given order, there are two +ways to specify it. They can be used either independently or +together. + +## The After Clause ## + +``` +using ::testing::Expectation; +... +Expectation init_x = EXPECT_CALL(foo, InitX()); +Expectation init_y = EXPECT_CALL(foo, InitY()); +EXPECT_CALL(foo, Bar()) + .After(init_x, init_y); +``` +says that `Bar()` can be called only after both `InitX()` and +`InitY()` have been called. + +If you don't know how many pre-requisites an expectation has when you +write it, you can use an `ExpectationSet` to collect them: + +``` +using ::testing::ExpectationSet; +... +ExpectationSet all_inits; +for (int i = 0; i < element_count; i++) { + all_inits += EXPECT_CALL(foo, InitElement(i)); +} +EXPECT_CALL(foo, Bar()) + .After(all_inits); +``` +says that `Bar()` can be called only after all elements have been +initialized (but we don't care about which elements get initialized +before the others). + +Modifying an `ExpectationSet` after using it in an `.After()` doesn't +affect the meaning of the `.After()`. + +## Sequences ## + +When you have a long chain of sequential expectations, it's easier to +specify the order using **sequences**, which don't require you to given +each expectation in the chain a different name. All expected
+calls
in the same sequence must occur in the order they are +specified. + +``` +using ::testing::Sequence; +Sequence s1, s2; +... +EXPECT_CALL(foo, Reset()) + .InSequence(s1, s2) + .WillOnce(Return(true)); +EXPECT_CALL(foo, GetSize()) + .InSequence(s1) + .WillOnce(Return(1)); +EXPECT_CALL(foo, Describe(A())) + .InSequence(s2) + .WillOnce(Return("dummy")); +``` +says that `Reset()` must be called before _both_ `GetSize()` _and_ +`Describe()`, and the latter two can occur in any order. + +To put many expectations in a sequence conveniently: +``` +using ::testing::InSequence; +{ + InSequence dummy; + + EXPECT_CALL(...)...; + EXPECT_CALL(...)...; + ... + EXPECT_CALL(...)...; +} +``` +says that all expected calls in the scope of `dummy` must occur in +strict order. The name `dummy` is irrelevant.) + +# Verifying and Resetting a Mock # + +Google Mock will verify the expectations on a mock object when it is destructed, or you can do it earlier: +``` +using ::testing::Mock; +... +// Verifies and removes the expectations on mock_obj; +// returns true iff successful. +Mock::VerifyAndClearExpectations(&mock_obj); +... +// Verifies and removes the expectations on mock_obj; +// also removes the default actions set by ON_CALL(); +// returns true iff successful. +Mock::VerifyAndClear(&mock_obj); +``` + +You can also tell Google Mock that a mock object can be leaked and doesn't +need to be verified: +``` +Mock::AllowLeak(&mock_obj); +``` + +# Mock Classes # + +Google Mock defines a convenient mock class template +``` +class MockFunction { + public: + MOCK_METHODn(Call, R(A1, ..., An)); +}; +``` +See this [recipe](CookBook.md#using-check-points) for one application of it. + +# Flags # + +| `--gmock_catch_leaked_mocks=0` | Don't report leaked mock objects as failures. | +|:-------------------------------|:----------------------------------------------| +| `--gmock_verbose=LEVEL` | Sets the default verbosity level (`info`, `warning`, or `error`) of Google Mock messages. | diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/CookBook.md vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/CookBook.md --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/CookBook.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/CookBook.md 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,3679 @@ + + +You can find recipes for using Google Mock here. If you haven't yet, +please read the [ForDummies](ForDummies.md) document first to make sure you understand +the basics. + +**Note:** Google Mock lives in the `testing` name space. For +readability, it is recommended to write `using ::testing::Foo;` once in +your file before using the name `Foo` defined by Google Mock. We omit +such `using` statements in this page for brevity, but you should do it +in your own code. + +# Creating Mock Classes # + +## Mocking Private or Protected Methods ## + +You must always put a mock method definition (`MOCK_METHOD*`) in a +`public:` section of the mock class, regardless of the method being +mocked being `public`, `protected`, or `private` in the base class. +This allows `ON_CALL` and `EXPECT_CALL` to reference the mock function +from outside of the mock class. (Yes, C++ allows a subclass to specify +a different access level than the base class on a virtual function.) +Example: + +``` +class Foo { + public: + ... + virtual bool Transform(Gadget* g) = 0; + + protected: + virtual void Resume(); + + private: + virtual int GetTimeOut(); +}; + +class MockFoo : public Foo { + public: + ... + MOCK_METHOD1(Transform, bool(Gadget* g)); + + // The following must be in the public section, even though the + // methods are protected or private in the base class. + MOCK_METHOD0(Resume, void()); + MOCK_METHOD0(GetTimeOut, int()); +}; +``` + +## Mocking Overloaded Methods ## + +You can mock overloaded functions as usual. No special attention is required: + +``` +class Foo { + ... + + // Must be virtual as we'll inherit from Foo. + virtual ~Foo(); + + // Overloaded on the types and/or numbers of arguments. + virtual int Add(Element x); + virtual int Add(int times, Element x); + + // Overloaded on the const-ness of this object. + virtual Bar& GetBar(); + virtual const Bar& GetBar() const; +}; + +class MockFoo : public Foo { + ... + MOCK_METHOD1(Add, int(Element x)); + MOCK_METHOD2(Add, int(int times, Element x); + + MOCK_METHOD0(GetBar, Bar&()); + MOCK_CONST_METHOD0(GetBar, const Bar&()); +}; +``` + +**Note:** if you don't mock all versions of the overloaded method, the +compiler will give you a warning about some methods in the base class +being hidden. To fix that, use `using` to bring them in scope: + +``` +class MockFoo : public Foo { + ... + using Foo::Add; + MOCK_METHOD1(Add, int(Element x)); + // We don't want to mock int Add(int times, Element x); + ... +}; +``` + +## Mocking Class Templates ## + +To mock a class template, append `_T` to the `MOCK_*` macros: + +``` +template +class StackInterface { + ... + // Must be virtual as we'll inherit from StackInterface. + virtual ~StackInterface(); + + virtual int GetSize() const = 0; + virtual void Push(const Elem& x) = 0; +}; + +template +class MockStack : public StackInterface { + ... + MOCK_CONST_METHOD0_T(GetSize, int()); + MOCK_METHOD1_T(Push, void(const Elem& x)); +}; +``` + +## Mocking Nonvirtual Methods ## + +Google Mock can mock non-virtual functions to be used in what we call _hi-perf +dependency injection_. + +In this case, instead of sharing a common base class with the real +class, your mock class will be _unrelated_ to the real class, but +contain methods with the same signatures. The syntax for mocking +non-virtual methods is the _same_ as mocking virtual methods: + +``` +// A simple packet stream class. None of its members is virtual. +class ConcretePacketStream { + public: + void AppendPacket(Packet* new_packet); + const Packet* GetPacket(size_t packet_number) const; + size_t NumberOfPackets() const; + ... +}; + +// A mock packet stream class. It inherits from no other, but defines +// GetPacket() and NumberOfPackets(). +class MockPacketStream { + public: + MOCK_CONST_METHOD1(GetPacket, const Packet*(size_t packet_number)); + MOCK_CONST_METHOD0(NumberOfPackets, size_t()); + ... +}; +``` + +Note that the mock class doesn't define `AppendPacket()`, unlike the +real class. That's fine as long as the test doesn't need to call it. + +Next, you need a way to say that you want to use +`ConcretePacketStream` in production code and to use `MockPacketStream` +in tests. Since the functions are not virtual and the two classes are +unrelated, you must specify your choice at _compile time_ (as opposed +to run time). + +One way to do it is to templatize your code that needs to use a packet +stream. More specifically, you will give your code a template type +argument for the type of the packet stream. In production, you will +instantiate your template with `ConcretePacketStream` as the type +argument. In tests, you will instantiate the same template with +`MockPacketStream`. For example, you may write: + +``` +template +void CreateConnection(PacketStream* stream) { ... } + +template +class PacketReader { + public: + void ReadPackets(PacketStream* stream, size_t packet_num); +}; +``` + +Then you can use `CreateConnection()` and +`PacketReader` in production code, and use +`CreateConnection()` and +`PacketReader` in tests. + +``` + MockPacketStream mock_stream; + EXPECT_CALL(mock_stream, ...)...; + .. set more expectations on mock_stream ... + PacketReader reader(&mock_stream); + ... exercise reader ... +``` + +## Mocking Free Functions ## + +It's possible to use Google Mock to mock a free function (i.e. a +C-style function or a static method). You just need to rewrite your +code to use an interface (abstract class). + +Instead of calling a free function (say, `OpenFile`) directly, +introduce an interface for it and have a concrete subclass that calls +the free function: + +``` +class FileInterface { + public: + ... + virtual bool Open(const char* path, const char* mode) = 0; +}; + +class File : public FileInterface { + public: + ... + virtual bool Open(const char* path, const char* mode) { + return OpenFile(path, mode); + } +}; +``` + +Your code should talk to `FileInterface` to open a file. Now it's +easy to mock out the function. + +This may seem much hassle, but in practice you often have multiple +related functions that you can put in the same interface, so the +per-function syntactic overhead will be much lower. + +If you are concerned about the performance overhead incurred by +virtual functions, and profiling confirms your concern, you can +combine this with the recipe for [mocking non-virtual methods](#mocking-nonvirtual-methods). + +## The Nice, the Strict, and the Naggy ## + +If a mock method has no `EXPECT_CALL` spec but is called, Google Mock +will print a warning about the "uninteresting call". The rationale is: + + * New methods may be added to an interface after a test is written. We shouldn't fail a test just because a method it doesn't know about is called. + * However, this may also mean there's a bug in the test, so Google Mock shouldn't be silent either. If the user believes these calls are harmless, they can add an `EXPECT_CALL()` to suppress the warning. + +However, sometimes you may want to suppress all "uninteresting call" +warnings, while sometimes you may want the opposite, i.e. to treat all +of them as errors. Google Mock lets you make the decision on a +per-mock-object basis. + +Suppose your test uses a mock class `MockFoo`: + +``` +TEST(...) { + MockFoo mock_foo; + EXPECT_CALL(mock_foo, DoThis()); + ... code that uses mock_foo ... +} +``` + +If a method of `mock_foo` other than `DoThis()` is called, it will be +reported by Google Mock as a warning. However, if you rewrite your +test to use `NiceMock` instead, the warning will be gone, +resulting in a cleaner test output: + +``` +using ::testing::NiceMock; + +TEST(...) { + NiceMock mock_foo; + EXPECT_CALL(mock_foo, DoThis()); + ... code that uses mock_foo ... +} +``` + +`NiceMock` is a subclass of `MockFoo`, so it can be used +wherever `MockFoo` is accepted. + +It also works if `MockFoo`'s constructor takes some arguments, as +`NiceMock` "inherits" `MockFoo`'s constructors: + +``` +using ::testing::NiceMock; + +TEST(...) { + NiceMock mock_foo(5, "hi"); // Calls MockFoo(5, "hi"). + EXPECT_CALL(mock_foo, DoThis()); + ... code that uses mock_foo ... +} +``` + +The usage of `StrictMock` is similar, except that it makes all +uninteresting calls failures: + +``` +using ::testing::StrictMock; + +TEST(...) { + StrictMock mock_foo; + EXPECT_CALL(mock_foo, DoThis()); + ... code that uses mock_foo ... + + // The test will fail if a method of mock_foo other than DoThis() + // is called. +} +``` + +There are some caveats though (I don't like them just as much as the +next guy, but sadly they are side effects of C++'s limitations): + + 1. `NiceMock` and `StrictMock` only work for mock methods defined using the `MOCK_METHOD*` family of macros **directly** in the `MockFoo` class. If a mock method is defined in a **base class** of `MockFoo`, the "nice" or "strict" modifier may not affect it, depending on the compiler. In particular, nesting `NiceMock` and `StrictMock` (e.g. `NiceMock >`) is **not** supported. + 1. The constructors of the base mock (`MockFoo`) cannot have arguments passed by non-const reference, which happens to be banned by the [Google C++ style guide](https://google.github.io/styleguide/cppguide.html). + 1. During the constructor or destructor of `MockFoo`, the mock object is _not_ nice or strict. This may cause surprises if the constructor or destructor calls a mock method on `this` object. (This behavior, however, is consistent with C++'s general rule: if a constructor or destructor calls a virtual method of `this` object, that method is treated as non-virtual. In other words, to the base class's constructor or destructor, `this` object behaves like an instance of the base class, not the derived class. This rule is required for safety. Otherwise a base constructor may use members of a derived class before they are initialized, or a base destructor may use members of a derived class after they have been destroyed.) + +Finally, you should be **very cautious** about when to use naggy or strict mocks, as they tend to make tests more brittle and harder to maintain. When you refactor your code without changing its externally visible behavior, ideally you should't need to update any tests. If your code interacts with a naggy mock, however, you may start to get spammed with warnings as the result of your change. Worse, if your code interacts with a strict mock, your tests may start to fail and you'll be forced to fix them. Our general recommendation is to use nice mocks (not yet the default) most of the time, use naggy mocks (the current default) when developing or debugging tests, and use strict mocks only as the last resort. + +## Simplifying the Interface without Breaking Existing Code ## + +Sometimes a method has a long list of arguments that is mostly +uninteresting. For example, + +``` +class LogSink { + public: + ... + virtual void send(LogSeverity severity, const char* full_filename, + const char* base_filename, int line, + const struct tm* tm_time, + const char* message, size_t message_len) = 0; +}; +``` + +This method's argument list is lengthy and hard to work with (let's +say that the `message` argument is not even 0-terminated). If we mock +it as is, using the mock will be awkward. If, however, we try to +simplify this interface, we'll need to fix all clients depending on +it, which is often infeasible. + +The trick is to re-dispatch the method in the mock class: + +``` +class ScopedMockLog : public LogSink { + public: + ... + virtual void send(LogSeverity severity, const char* full_filename, + const char* base_filename, int line, const tm* tm_time, + const char* message, size_t message_len) { + // We are only interested in the log severity, full file name, and + // log message. + Log(severity, full_filename, std::string(message, message_len)); + } + + // Implements the mock method: + // + // void Log(LogSeverity severity, + // const string& file_path, + // const string& message); + MOCK_METHOD3(Log, void(LogSeverity severity, const string& file_path, + const string& message)); +}; +``` + +By defining a new mock method with a trimmed argument list, we make +the mock class much more user-friendly. + +## Alternative to Mocking Concrete Classes ## + +Often you may find yourself using classes that don't implement +interfaces. In order to test your code that uses such a class (let's +call it `Concrete`), you may be tempted to make the methods of +`Concrete` virtual and then mock it. + +Try not to do that. + +Making a non-virtual function virtual is a big decision. It creates an +extension point where subclasses can tweak your class' behavior. This +weakens your control on the class because now it's harder to maintain +the class' invariants. You should make a function virtual only when +there is a valid reason for a subclass to override it. + +Mocking concrete classes directly is problematic as it creates a tight +coupling between the class and the tests - any small change in the +class may invalidate your tests and make test maintenance a pain. + +To avoid such problems, many programmers have been practicing "coding +to interfaces": instead of talking to the `Concrete` class, your code +would define an interface and talk to it. Then you implement that +interface as an adaptor on top of `Concrete`. In tests, you can easily +mock that interface to observe how your code is doing. + +This technique incurs some overhead: + + * You pay the cost of virtual function calls (usually not a problem). + * There is more abstraction for the programmers to learn. + +However, it can also bring significant benefits in addition to better +testability: + + * `Concrete`'s API may not fit your problem domain very well, as you may not be the only client it tries to serve. By designing your own interface, you have a chance to tailor it to your need - you may add higher-level functionalities, rename stuff, etc instead of just trimming the class. This allows you to write your code (user of the interface) in a more natural way, which means it will be more readable, more maintainable, and you'll be more productive. + * If `Concrete`'s implementation ever has to change, you don't have to rewrite everywhere it is used. Instead, you can absorb the change in your implementation of the interface, and your other code and tests will be insulated from this change. + +Some people worry that if everyone is practicing this technique, they +will end up writing lots of redundant code. This concern is totally +understandable. However, there are two reasons why it may not be the +case: + + * Different projects may need to use `Concrete` in different ways, so the best interfaces for them will be different. Therefore, each of them will have its own domain-specific interface on top of `Concrete`, and they will not be the same code. + * If enough projects want to use the same interface, they can always share it, just like they have been sharing `Concrete`. You can check in the interface and the adaptor somewhere near `Concrete` (perhaps in a `contrib` sub-directory) and let many projects use it. + +You need to weigh the pros and cons carefully for your particular +problem, but I'd like to assure you that the Java community has been +practicing this for a long time and it's a proven effective technique +applicable in a wide variety of situations. :-) + +## Delegating Calls to a Fake ## + +Some times you have a non-trivial fake implementation of an +interface. For example: + +``` +class Foo { + public: + virtual ~Foo() {} + virtual char DoThis(int n) = 0; + virtual void DoThat(const char* s, int* p) = 0; +}; + +class FakeFoo : public Foo { + public: + virtual char DoThis(int n) { + return (n > 0) ? '+' : + (n < 0) ? '-' : '0'; + } + + virtual void DoThat(const char* s, int* p) { + *p = strlen(s); + } +}; +``` + +Now you want to mock this interface such that you can set expectations +on it. However, you also want to use `FakeFoo` for the default +behavior, as duplicating it in the mock object is, well, a lot of +work. + +When you define the mock class using Google Mock, you can have it +delegate its default action to a fake class you already have, using +this pattern: + +``` +using ::testing::_; +using ::testing::Invoke; + +class MockFoo : public Foo { + public: + // Normal mock method definitions using Google Mock. + MOCK_METHOD1(DoThis, char(int n)); + MOCK_METHOD2(DoThat, void(const char* s, int* p)); + + // Delegates the default actions of the methods to a FakeFoo object. + // This must be called *before* the custom ON_CALL() statements. + void DelegateToFake() { + ON_CALL(*this, DoThis(_)) + .WillByDefault(Invoke(&fake_, &FakeFoo::DoThis)); + ON_CALL(*this, DoThat(_, _)) + .WillByDefault(Invoke(&fake_, &FakeFoo::DoThat)); + } + private: + FakeFoo fake_; // Keeps an instance of the fake in the mock. +}; +``` + +With that, you can use `MockFoo` in your tests as usual. Just remember +that if you don't explicitly set an action in an `ON_CALL()` or +`EXPECT_CALL()`, the fake will be called upon to do it: + +``` +using ::testing::_; + +TEST(AbcTest, Xyz) { + MockFoo foo; + foo.DelegateToFake(); // Enables the fake for delegation. + + // Put your ON_CALL(foo, ...)s here, if any. + + // No action specified, meaning to use the default action. + EXPECT_CALL(foo, DoThis(5)); + EXPECT_CALL(foo, DoThat(_, _)); + + int n = 0; + EXPECT_EQ('+', foo.DoThis(5)); // FakeFoo::DoThis() is invoked. + foo.DoThat("Hi", &n); // FakeFoo::DoThat() is invoked. + EXPECT_EQ(2, n); +} +``` + +**Some tips:** + + * If you want, you can still override the default action by providing your own `ON_CALL()` or using `.WillOnce()` / `.WillRepeatedly()` in `EXPECT_CALL()`. + * In `DelegateToFake()`, you only need to delegate the methods whose fake implementation you intend to use. + * The general technique discussed here works for overloaded methods, but you'll need to tell the compiler which version you mean. To disambiguate a mock function (the one you specify inside the parentheses of `ON_CALL()`), see the "Selecting Between Overloaded Functions" section on this page; to disambiguate a fake function (the one you place inside `Invoke()`), use a `static_cast` to specify the function's type. For instance, if class `Foo` has methods `char DoThis(int n)` and `bool DoThis(double x) const`, and you want to invoke the latter, you need to write `Invoke(&fake_, static_cast(&FakeFoo::DoThis))` instead of `Invoke(&fake_, &FakeFoo::DoThis)` (The strange-looking thing inside the angled brackets of `static_cast` is the type of a function pointer to the second `DoThis()` method.). + * Having to mix a mock and a fake is often a sign of something gone wrong. Perhaps you haven't got used to the interaction-based way of testing yet. Or perhaps your interface is taking on too many roles and should be split up. Therefore, **don't abuse this**. We would only recommend to do it as an intermediate step when you are refactoring your code. + +Regarding the tip on mixing a mock and a fake, here's an example on +why it may be a bad sign: Suppose you have a class `System` for +low-level system operations. In particular, it does file and I/O +operations. And suppose you want to test how your code uses `System` +to do I/O, and you just want the file operations to work normally. If +you mock out the entire `System` class, you'll have to provide a fake +implementation for the file operation part, which suggests that +`System` is taking on too many roles. + +Instead, you can define a `FileOps` interface and an `IOOps` interface +and split `System`'s functionalities into the two. Then you can mock +`IOOps` without mocking `FileOps`. + +## Delegating Calls to a Real Object ## + +When using testing doubles (mocks, fakes, stubs, and etc), sometimes +their behaviors will differ from those of the real objects. This +difference could be either intentional (as in simulating an error such +that you can test the error handling code) or unintentional. If your +mocks have different behaviors than the real objects by mistake, you +could end up with code that passes the tests but fails in production. + +You can use the _delegating-to-real_ technique to ensure that your +mock has the same behavior as the real object while retaining the +ability to validate calls. This technique is very similar to the +delegating-to-fake technique, the difference being that we use a real +object instead of a fake. Here's an example: + +``` +using ::testing::_; +using ::testing::AtLeast; +using ::testing::Invoke; + +class MockFoo : public Foo { + public: + MockFoo() { + // By default, all calls are delegated to the real object. + ON_CALL(*this, DoThis()) + .WillByDefault(Invoke(&real_, &Foo::DoThis)); + ON_CALL(*this, DoThat(_)) + .WillByDefault(Invoke(&real_, &Foo::DoThat)); + ... + } + MOCK_METHOD0(DoThis, ...); + MOCK_METHOD1(DoThat, ...); + ... + private: + Foo real_; +}; +... + + MockFoo mock; + + EXPECT_CALL(mock, DoThis()) + .Times(3); + EXPECT_CALL(mock, DoThat("Hi")) + .Times(AtLeast(1)); + ... use mock in test ... +``` + +With this, Google Mock will verify that your code made the right calls +(with the right arguments, in the right order, called the right number +of times, etc), and a real object will answer the calls (so the +behavior will be the same as in production). This gives you the best +of both worlds. + +## Delegating Calls to a Parent Class ## + +Ideally, you should code to interfaces, whose methods are all pure +virtual. In reality, sometimes you do need to mock a virtual method +that is not pure (i.e, it already has an implementation). For example: + +``` +class Foo { + public: + virtual ~Foo(); + + virtual void Pure(int n) = 0; + virtual int Concrete(const char* str) { ... } +}; + +class MockFoo : public Foo { + public: + // Mocking a pure method. + MOCK_METHOD1(Pure, void(int n)); + // Mocking a concrete method. Foo::Concrete() is shadowed. + MOCK_METHOD1(Concrete, int(const char* str)); +}; +``` + +Sometimes you may want to call `Foo::Concrete()` instead of +`MockFoo::Concrete()`. Perhaps you want to do it as part of a stub +action, or perhaps your test doesn't need to mock `Concrete()` at all +(but it would be oh-so painful to have to define a new mock class +whenever you don't need to mock one of its methods). + +The trick is to leave a back door in your mock class for accessing the +real methods in the base class: + +``` +class MockFoo : public Foo { + public: + // Mocking a pure method. + MOCK_METHOD1(Pure, void(int n)); + // Mocking a concrete method. Foo::Concrete() is shadowed. + MOCK_METHOD1(Concrete, int(const char* str)); + + // Use this to call Concrete() defined in Foo. + int FooConcrete(const char* str) { return Foo::Concrete(str); } +}; +``` + +Now, you can call `Foo::Concrete()` inside an action by: + +``` +using ::testing::_; +using ::testing::Invoke; +... + EXPECT_CALL(foo, Concrete(_)) + .WillOnce(Invoke(&foo, &MockFoo::FooConcrete)); +``` + +or tell the mock object that you don't want to mock `Concrete()`: + +``` +using ::testing::Invoke; +... + ON_CALL(foo, Concrete(_)) + .WillByDefault(Invoke(&foo, &MockFoo::FooConcrete)); +``` + +(Why don't we just write `Invoke(&foo, &Foo::Concrete)`? If you do +that, `MockFoo::Concrete()` will be called (and cause an infinite +recursion) since `Foo::Concrete()` is virtual. That's just how C++ +works.) + +# Using Matchers # + +## Matching Argument Values Exactly ## + +You can specify exactly which arguments a mock method is expecting: + +``` +using ::testing::Return; +... + EXPECT_CALL(foo, DoThis(5)) + .WillOnce(Return('a')); + EXPECT_CALL(foo, DoThat("Hello", bar)); +``` + +## Using Simple Matchers ## + +You can use matchers to match arguments that have a certain property: + +``` +using ::testing::Ge; +using ::testing::NotNull; +using ::testing::Return; +... + EXPECT_CALL(foo, DoThis(Ge(5))) // The argument must be >= 5. + .WillOnce(Return('a')); + EXPECT_CALL(foo, DoThat("Hello", NotNull())); + // The second argument must not be NULL. +``` + +A frequently used matcher is `_`, which matches anything: + +``` +using ::testing::_; +using ::testing::NotNull; +... + EXPECT_CALL(foo, DoThat(_, NotNull())); +``` + +## Combining Matchers ## + +You can build complex matchers from existing ones using `AllOf()`, +`AnyOf()`, and `Not()`: + +``` +using ::testing::AllOf; +using ::testing::Gt; +using ::testing::HasSubstr; +using ::testing::Ne; +using ::testing::Not; +... + // The argument must be > 5 and != 10. + EXPECT_CALL(foo, DoThis(AllOf(Gt(5), + Ne(10)))); + + // The first argument must not contain sub-string "blah". + EXPECT_CALL(foo, DoThat(Not(HasSubstr("blah")), + NULL)); +``` + +## Casting Matchers ## + +Google Mock matchers are statically typed, meaning that the compiler +can catch your mistake if you use a matcher of the wrong type (for +example, if you use `Eq(5)` to match a `string` argument). Good for +you! + +Sometimes, however, you know what you're doing and want the compiler +to give you some slack. One example is that you have a matcher for +`long` and the argument you want to match is `int`. While the two +types aren't exactly the same, there is nothing really wrong with +using a `Matcher` to match an `int` - after all, we can first +convert the `int` argument to a `long` before giving it to the +matcher. + +To support this need, Google Mock gives you the +`SafeMatcherCast(m)` function. It casts a matcher `m` to type +`Matcher`. To ensure safety, Google Mock checks that (let `U` be the +type `m` accepts): + + 1. Type `T` can be implicitly cast to type `U`; + 1. When both `T` and `U` are built-in arithmetic types (`bool`, integers, and floating-point numbers), the conversion from `T` to `U` is not lossy (in other words, any value representable by `T` can also be represented by `U`); and + 1. When `U` is a reference, `T` must also be a reference (as the underlying matcher may be interested in the address of the `U` value). + +The code won't compile if any of these conditions aren't met. + +Here's one example: + +``` +using ::testing::SafeMatcherCast; + +// A base class and a child class. +class Base { ... }; +class Derived : public Base { ... }; + +class MockFoo : public Foo { + public: + MOCK_METHOD1(DoThis, void(Derived* derived)); +}; +... + + MockFoo foo; + // m is a Matcher we got from somewhere. + EXPECT_CALL(foo, DoThis(SafeMatcherCast(m))); +``` + +If you find `SafeMatcherCast(m)` too limiting, you can use a similar +function `MatcherCast(m)`. The difference is that `MatcherCast` works +as long as you can `static_cast` type `T` to type `U`. + +`MatcherCast` essentially lets you bypass C++'s type system +(`static_cast` isn't always safe as it could throw away information, +for example), so be careful not to misuse/abuse it. + +## Selecting Between Overloaded Functions ## + +If you expect an overloaded function to be called, the compiler may +need some help on which overloaded version it is. + +To disambiguate functions overloaded on the const-ness of this object, +use the `Const()` argument wrapper. + +``` +using ::testing::ReturnRef; + +class MockFoo : public Foo { + ... + MOCK_METHOD0(GetBar, Bar&()); + MOCK_CONST_METHOD0(GetBar, const Bar&()); +}; +... + + MockFoo foo; + Bar bar1, bar2; + EXPECT_CALL(foo, GetBar()) // The non-const GetBar(). + .WillOnce(ReturnRef(bar1)); + EXPECT_CALL(Const(foo), GetBar()) // The const GetBar(). + .WillOnce(ReturnRef(bar2)); +``` + +(`Const()` is defined by Google Mock and returns a `const` reference +to its argument.) + +To disambiguate overloaded functions with the same number of arguments +but different argument types, you may need to specify the exact type +of a matcher, either by wrapping your matcher in `Matcher()`, or +using a matcher whose type is fixed (`TypedEq`, `An()`, +etc): + +``` +using ::testing::An; +using ::testing::Lt; +using ::testing::Matcher; +using ::testing::TypedEq; + +class MockPrinter : public Printer { + public: + MOCK_METHOD1(Print, void(int n)); + MOCK_METHOD1(Print, void(char c)); +}; + +TEST(PrinterTest, Print) { + MockPrinter printer; + + EXPECT_CALL(printer, Print(An())); // void Print(int); + EXPECT_CALL(printer, Print(Matcher(Lt(5)))); // void Print(int); + EXPECT_CALL(printer, Print(TypedEq('a'))); // void Print(char); + + printer.Print(3); + printer.Print(6); + printer.Print('a'); +} +``` + +## Performing Different Actions Based on the Arguments ## + +When a mock method is called, the _last_ matching expectation that's +still active will be selected (think "newer overrides older"). So, you +can make a method do different things depending on its argument values +like this: + +``` +using ::testing::_; +using ::testing::Lt; +using ::testing::Return; +... + // The default case. + EXPECT_CALL(foo, DoThis(_)) + .WillRepeatedly(Return('b')); + + // The more specific case. + EXPECT_CALL(foo, DoThis(Lt(5))) + .WillRepeatedly(Return('a')); +``` + +Now, if `foo.DoThis()` is called with a value less than 5, `'a'` will +be returned; otherwise `'b'` will be returned. + +## Matching Multiple Arguments as a Whole ## + +Sometimes it's not enough to match the arguments individually. For +example, we may want to say that the first argument must be less than +the second argument. The `With()` clause allows us to match +all arguments of a mock function as a whole. For example, + +``` +using ::testing::_; +using ::testing::Lt; +using ::testing::Ne; +... + EXPECT_CALL(foo, InRange(Ne(0), _)) + .With(Lt()); +``` + +says that the first argument of `InRange()` must not be 0, and must be +less than the second argument. + +The expression inside `With()` must be a matcher of type +`Matcher< ::testing::tuple >`, where `A1`, ..., `An` are the +types of the function arguments. + +You can also write `AllArgs(m)` instead of `m` inside `.With()`. The +two forms are equivalent, but `.With(AllArgs(Lt()))` is more readable +than `.With(Lt())`. + +You can use `Args(m)` to match the `n` selected arguments +(as a tuple) against `m`. For example, + +``` +using ::testing::_; +using ::testing::AllOf; +using ::testing::Args; +using ::testing::Lt; +... + EXPECT_CALL(foo, Blah(_, _, _)) + .With(AllOf(Args<0, 1>(Lt()), Args<1, 2>(Lt()))); +``` + +says that `Blah()` will be called with arguments `x`, `y`, and `z` where +`x < y < z`. + +As a convenience and example, Google Mock provides some matchers for +2-tuples, including the `Lt()` matcher above. See the [CheatSheet](CheatSheet.md) for +the complete list. + +Note that if you want to pass the arguments to a predicate of your own +(e.g. `.With(Args<0, 1>(Truly(&MyPredicate)))`), that predicate MUST be +written to take a `::testing::tuple` as its argument; Google Mock will pass the `n` selected arguments as _one_ single tuple to the predicate. + +## Using Matchers as Predicates ## + +Have you noticed that a matcher is just a fancy predicate that also +knows how to describe itself? Many existing algorithms take predicates +as arguments (e.g. those defined in STL's `` header), and +it would be a shame if Google Mock matchers are not allowed to +participate. + +Luckily, you can use a matcher where a unary predicate functor is +expected by wrapping it inside the `Matches()` function. For example, + +``` +#include +#include + +std::vector v; +... +// How many elements in v are >= 10? +const int count = count_if(v.begin(), v.end(), Matches(Ge(10))); +``` + +Since you can build complex matchers from simpler ones easily using +Google Mock, this gives you a way to conveniently construct composite +predicates (doing the same using STL's `` header is just +painful). For example, here's a predicate that's satisfied by any +number that is >= 0, <= 100, and != 50: + +``` +Matches(AllOf(Ge(0), Le(100), Ne(50))) +``` + +## Using Matchers in Google Test Assertions ## + +Since matchers are basically predicates that also know how to describe +themselves, there is a way to take advantage of them in +[Google Test](../../googletest/) assertions. It's +called `ASSERT_THAT` and `EXPECT_THAT`: + +``` + ASSERT_THAT(value, matcher); // Asserts that value matches matcher. + EXPECT_THAT(value, matcher); // The non-fatal version. +``` + +For example, in a Google Test test you can write: + +``` +#include "gmock/gmock.h" + +using ::testing::AllOf; +using ::testing::Ge; +using ::testing::Le; +using ::testing::MatchesRegex; +using ::testing::StartsWith; +... + + EXPECT_THAT(Foo(), StartsWith("Hello")); + EXPECT_THAT(Bar(), MatchesRegex("Line \\d+")); + ASSERT_THAT(Baz(), AllOf(Ge(5), Le(10))); +``` + +which (as you can probably guess) executes `Foo()`, `Bar()`, and +`Baz()`, and verifies that: + + * `Foo()` returns a string that starts with `"Hello"`. + * `Bar()` returns a string that matches regular expression `"Line \\d+"`. + * `Baz()` returns a number in the range [5, 10]. + +The nice thing about these macros is that _they read like +English_. They generate informative messages too. For example, if the +first `EXPECT_THAT()` above fails, the message will be something like: + +``` +Value of: Foo() + Actual: "Hi, world!" +Expected: starts with "Hello" +``` + +**Credit:** The idea of `(ASSERT|EXPECT)_THAT` was stolen from the +[Hamcrest](https://github.com/hamcrest/) project, which adds +`assertThat()` to JUnit. + +## Using Predicates as Matchers ## + +Google Mock provides a built-in set of matchers. In case you find them +lacking, you can use an arbitray unary predicate function or functor +as a matcher - as long as the predicate accepts a value of the type +you want. You do this by wrapping the predicate inside the `Truly()` +function, for example: + +``` +using ::testing::Truly; + +int IsEven(int n) { return (n % 2) == 0 ? 1 : 0; } +... + + // Bar() must be called with an even number. + EXPECT_CALL(foo, Bar(Truly(IsEven))); +``` + +Note that the predicate function / functor doesn't have to return +`bool`. It works as long as the return value can be used as the +condition in statement `if (condition) ...`. + +## Matching Arguments that Are Not Copyable ## + +When you do an `EXPECT_CALL(mock_obj, Foo(bar))`, Google Mock saves +away a copy of `bar`. When `Foo()` is called later, Google Mock +compares the argument to `Foo()` with the saved copy of `bar`. This +way, you don't need to worry about `bar` being modified or destroyed +after the `EXPECT_CALL()` is executed. The same is true when you use +matchers like `Eq(bar)`, `Le(bar)`, and so on. + +But what if `bar` cannot be copied (i.e. has no copy constructor)? You +could define your own matcher function and use it with `Truly()`, as +the previous couple of recipes have shown. Or, you may be able to get +away from it if you can guarantee that `bar` won't be changed after +the `EXPECT_CALL()` is executed. Just tell Google Mock that it should +save a reference to `bar`, instead of a copy of it. Here's how: + +``` +using ::testing::Eq; +using ::testing::ByRef; +using ::testing::Lt; +... + // Expects that Foo()'s argument == bar. + EXPECT_CALL(mock_obj, Foo(Eq(ByRef(bar)))); + + // Expects that Foo()'s argument < bar. + EXPECT_CALL(mock_obj, Foo(Lt(ByRef(bar)))); +``` + +Remember: if you do this, don't change `bar` after the +`EXPECT_CALL()`, or the result is undefined. + +## Validating a Member of an Object ## + +Often a mock function takes a reference to object as an argument. When +matching the argument, you may not want to compare the entire object +against a fixed object, as that may be over-specification. Instead, +you may need to validate a certain member variable or the result of a +certain getter method of the object. You can do this with `Field()` +and `Property()`. More specifically, + +``` +Field(&Foo::bar, m) +``` + +is a matcher that matches a `Foo` object whose `bar` member variable +satisfies matcher `m`. + +``` +Property(&Foo::baz, m) +``` + +is a matcher that matches a `Foo` object whose `baz()` method returns +a value that satisfies matcher `m`. + +For example: + +| Expression | Description | +|:-----------------------------|:-----------------------------------| +| `Field(&Foo::number, Ge(3))` | Matches `x` where `x.number >= 3`. | +| `Property(&Foo::name, StartsWith("John "))` | Matches `x` where `x.name()` starts with `"John "`. | + +Note that in `Property(&Foo::baz, ...)`, method `baz()` must take no +argument and be declared as `const`. + +BTW, `Field()` and `Property()` can also match plain pointers to +objects. For instance, + +``` +Field(&Foo::number, Ge(3)) +``` + +matches a plain pointer `p` where `p->number >= 3`. If `p` is `NULL`, +the match will always fail regardless of the inner matcher. + +What if you want to validate more than one members at the same time? +Remember that there is `AllOf()`. + +## Validating the Value Pointed to by a Pointer Argument ## + +C++ functions often take pointers as arguments. You can use matchers +like `IsNull()`, `NotNull()`, and other comparison matchers to match a +pointer, but what if you want to make sure the value _pointed to_ by +the pointer, instead of the pointer itself, has a certain property? +Well, you can use the `Pointee(m)` matcher. + +`Pointee(m)` matches a pointer iff `m` matches the value the pointer +points to. For example: + +``` +using ::testing::Ge; +using ::testing::Pointee; +... + EXPECT_CALL(foo, Bar(Pointee(Ge(3)))); +``` + +expects `foo.Bar()` to be called with a pointer that points to a value +greater than or equal to 3. + +One nice thing about `Pointee()` is that it treats a `NULL` pointer as +a match failure, so you can write `Pointee(m)` instead of + +``` + AllOf(NotNull(), Pointee(m)) +``` + +without worrying that a `NULL` pointer will crash your test. + +Also, did we tell you that `Pointee()` works with both raw pointers +**and** smart pointers (`linked_ptr`, `shared_ptr`, `scoped_ptr`, and +etc)? + +What if you have a pointer to pointer? You guessed it - you can use +nested `Pointee()` to probe deeper inside the value. For example, +`Pointee(Pointee(Lt(3)))` matches a pointer that points to a pointer +that points to a number less than 3 (what a mouthful...). + +## Testing a Certain Property of an Object ## + +Sometimes you want to specify that an object argument has a certain +property, but there is no existing matcher that does this. If you want +good error messages, you should define a matcher. If you want to do it +quick and dirty, you could get away with writing an ordinary function. + +Let's say you have a mock function that takes an object of type `Foo`, +which has an `int bar()` method and an `int baz()` method, and you +want to constrain that the argument's `bar()` value plus its `baz()` +value is a given number. Here's how you can define a matcher to do it: + +``` +using ::testing::MatcherInterface; +using ::testing::MatchResultListener; + +class BarPlusBazEqMatcher : public MatcherInterface { + public: + explicit BarPlusBazEqMatcher(int expected_sum) + : expected_sum_(expected_sum) {} + + virtual bool MatchAndExplain(const Foo& foo, + MatchResultListener* listener) const { + return (foo.bar() + foo.baz()) == expected_sum_; + } + + virtual void DescribeTo(::std::ostream* os) const { + *os << "bar() + baz() equals " << expected_sum_; + } + + virtual void DescribeNegationTo(::std::ostream* os) const { + *os << "bar() + baz() does not equal " << expected_sum_; + } + private: + const int expected_sum_; +}; + +inline Matcher BarPlusBazEq(int expected_sum) { + return MakeMatcher(new BarPlusBazEqMatcher(expected_sum)); +} + +... + + EXPECT_CALL(..., DoThis(BarPlusBazEq(5)))...; +``` + +## Matching Containers ## + +Sometimes an STL container (e.g. list, vector, map, ...) is passed to +a mock function and you may want to validate it. Since most STL +containers support the `==` operator, you can write +`Eq(expected_container)` or simply `expected_container` to match a +container exactly. + +Sometimes, though, you may want to be more flexible (for example, the +first element must be an exact match, but the second element can be +any positive number, and so on). Also, containers used in tests often +have a small number of elements, and having to define the expected +container out-of-line is a bit of a hassle. + +You can use the `ElementsAre()` or `UnorderedElementsAre()` matcher in +such cases: + +``` +using ::testing::_; +using ::testing::ElementsAre; +using ::testing::Gt; +... + + MOCK_METHOD1(Foo, void(const vector& numbers)); +... + + EXPECT_CALL(mock, Foo(ElementsAre(1, Gt(0), _, 5))); +``` + +The above matcher says that the container must have 4 elements, which +must be 1, greater than 0, anything, and 5 respectively. + +If you instead write: + +``` +using ::testing::_; +using ::testing::Gt; +using ::testing::UnorderedElementsAre; +... + + MOCK_METHOD1(Foo, void(const vector& numbers)); +... + + EXPECT_CALL(mock, Foo(UnorderedElementsAre(1, Gt(0), _, 5))); +``` + +It means that the container must have 4 elements, which under some +permutation must be 1, greater than 0, anything, and 5 respectively. + +`ElementsAre()` and `UnorderedElementsAre()` are overloaded to take 0 +to 10 arguments. If more are needed, you can place them in a C-style +array and use `ElementsAreArray()` or `UnorderedElementsAreArray()` +instead: + +``` +using ::testing::ElementsAreArray; +... + + // ElementsAreArray accepts an array of element values. + const int expected_vector1[] = { 1, 5, 2, 4, ... }; + EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector1))); + + // Or, an array of element matchers. + Matcher expected_vector2 = { 1, Gt(2), _, 3, ... }; + EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector2))); +``` + +In case the array needs to be dynamically created (and therefore the +array size cannot be inferred by the compiler), you can give +`ElementsAreArray()` an additional argument to specify the array size: + +``` +using ::testing::ElementsAreArray; +... + int* const expected_vector3 = new int[count]; + ... fill expected_vector3 with values ... + EXPECT_CALL(mock, Foo(ElementsAreArray(expected_vector3, count))); +``` + +**Tips:** + + * `ElementsAre*()` can be used to match _any_ container that implements the STL iterator pattern (i.e. it has a `const_iterator` type and supports `begin()/end()`), not just the ones defined in STL. It will even work with container types yet to be written - as long as they follows the above pattern. + * You can use nested `ElementsAre*()` to match nested (multi-dimensional) containers. + * If the container is passed by pointer instead of by reference, just write `Pointee(ElementsAre*(...))`. + * The order of elements _matters_ for `ElementsAre*()`. Therefore don't use it with containers whose element order is undefined (e.g. `hash_map`). + +## Sharing Matchers ## + +Under the hood, a Google Mock matcher object consists of a pointer to +a ref-counted implementation object. Copying matchers is allowed and +very efficient, as only the pointer is copied. When the last matcher +that references the implementation object dies, the implementation +object will be deleted. + +Therefore, if you have some complex matcher that you want to use again +and again, there is no need to build it every time. Just assign it to a +matcher variable and use that variable repeatedly! For example, + +``` + Matcher in_range = AllOf(Gt(5), Le(10)); + ... use in_range as a matcher in multiple EXPECT_CALLs ... +``` + +# Setting Expectations # + +## Knowing When to Expect ## + +`ON_CALL` is likely the single most under-utilized construct in Google Mock. + +There are basically two constructs for defining the behavior of a mock object: `ON_CALL` and `EXPECT_CALL`. The difference? `ON_CALL` defines what happens when a mock method is called, but _doesn't imply any expectation on the method being called._ `EXPECT_CALL` not only defines the behavior, but also sets an expectation that _the method will be called with the given arguments, for the given number of times_ (and _in the given order_ when you specify the order too). + +Since `EXPECT_CALL` does more, isn't it better than `ON_CALL`? Not really. Every `EXPECT_CALL` adds a constraint on the behavior of the code under test. Having more constraints than necessary is _baaad_ - even worse than not having enough constraints. + +This may be counter-intuitive. How could tests that verify more be worse than tests that verify less? Isn't verification the whole point of tests? + +The answer, lies in _what_ a test should verify. **A good test verifies the contract of the code.** If a test over-specifies, it doesn't leave enough freedom to the implementation. As a result, changing the implementation without breaking the contract (e.g. refactoring and optimization), which should be perfectly fine to do, can break such tests. Then you have to spend time fixing them, only to see them broken again the next time the implementation is changed. + +Keep in mind that one doesn't have to verify more than one property in one test. In fact, **it's a good style to verify only one thing in one test.** If you do that, a bug will likely break only one or two tests instead of dozens (which case would you rather debug?). If you are also in the habit of giving tests descriptive names that tell what they verify, you can often easily guess what's wrong just from the test log itself. + +So use `ON_CALL` by default, and only use `EXPECT_CALL` when you actually intend to verify that the call is made. For example, you may have a bunch of `ON_CALL`s in your test fixture to set the common mock behavior shared by all tests in the same group, and write (scarcely) different `EXPECT_CALL`s in different `TEST_F`s to verify different aspects of the code's behavior. Compared with the style where each `TEST` has many `EXPECT_CALL`s, this leads to tests that are more resilient to implementational changes (and thus less likely to require maintenance) and makes the intent of the tests more obvious (so they are easier to maintain when you do need to maintain them). + +If you are bothered by the "Uninteresting mock function call" message printed when a mock method without an `EXPECT_CALL` is called, you may use a `NiceMock` instead to suppress all such messages for the mock object, or suppress the message for specific methods by adding `EXPECT_CALL(...).Times(AnyNumber())`. DO NOT suppress it by blindly adding an `EXPECT_CALL(...)`, or you'll have a test that's a pain to maintain. + +## Ignoring Uninteresting Calls ## + +If you are not interested in how a mock method is called, just don't +say anything about it. In this case, if the method is ever called, +Google Mock will perform its default action to allow the test program +to continue. If you are not happy with the default action taken by +Google Mock, you can override it using `DefaultValue::Set()` +(described later in this document) or `ON_CALL()`. + +Please note that once you expressed interest in a particular mock +method (via `EXPECT_CALL()`), all invocations to it must match some +expectation. If this function is called but the arguments don't match +any `EXPECT_CALL()` statement, it will be an error. + +## Disallowing Unexpected Calls ## + +If a mock method shouldn't be called at all, explicitly say so: + +``` +using ::testing::_; +... + EXPECT_CALL(foo, Bar(_)) + .Times(0); +``` + +If some calls to the method are allowed, but the rest are not, just +list all the expected calls: + +``` +using ::testing::AnyNumber; +using ::testing::Gt; +... + EXPECT_CALL(foo, Bar(5)); + EXPECT_CALL(foo, Bar(Gt(10))) + .Times(AnyNumber()); +``` + +A call to `foo.Bar()` that doesn't match any of the `EXPECT_CALL()` +statements will be an error. + +## Understanding Uninteresting vs Unexpected Calls ## + +_Uninteresting_ calls and _unexpected_ calls are different concepts in Google Mock. _Very_ different. + +A call `x.Y(...)` is **uninteresting** if there's _not even a single_ `EXPECT_CALL(x, Y(...))` set. In other words, the test isn't interested in the `x.Y()` method at all, as evident in that the test doesn't care to say anything about it. + +A call `x.Y(...)` is **unexpected** if there are some `EXPECT_CALL(x, Y(...))s` set, but none of them matches the call. Put another way, the test is interested in the `x.Y()` method (therefore it _explicitly_ sets some `EXPECT_CALL` to verify how it's called); however, the verification fails as the test doesn't expect this particular call to happen. + +**An unexpected call is always an error,** as the code under test doesn't behave the way the test expects it to behave. + +**By default, an uninteresting call is not an error,** as it violates no constraint specified by the test. (Google Mock's philosophy is that saying nothing means there is no constraint.) However, it leads to a warning, as it _might_ indicate a problem (e.g. the test author might have forgotten to specify a constraint). + +In Google Mock, `NiceMock` and `StrictMock` can be used to make a mock class "nice" or "strict". How does this affect uninteresting calls and unexpected calls? + +A **nice mock** suppresses uninteresting call warnings. It is less chatty than the default mock, but otherwise is the same. If a test fails with a default mock, it will also fail using a nice mock instead. And vice versa. Don't expect making a mock nice to change the test's result. + +A **strict mock** turns uninteresting call warnings into errors. So making a mock strict may change the test's result. + +Let's look at an example: + +``` +TEST(...) { + NiceMock mock_registry; + EXPECT_CALL(mock_registry, GetDomainOwner("google.com")) + .WillRepeatedly(Return("Larry Page")); + + // Use mock_registry in code under test. + ... &mock_registry ... +} +``` + +The sole `EXPECT_CALL` here says that all calls to `GetDomainOwner()` must have `"google.com"` as the argument. If `GetDomainOwner("yahoo.com")` is called, it will be an unexpected call, and thus an error. Having a nice mock doesn't change the severity of an unexpected call. + +So how do we tell Google Mock that `GetDomainOwner()` can be called with some other arguments as well? The standard technique is to add a "catch all" `EXPECT_CALL`: + +``` + EXPECT_CALL(mock_registry, GetDomainOwner(_)) + .Times(AnyNumber()); // catches all other calls to this method. + EXPECT_CALL(mock_registry, GetDomainOwner("google.com")) + .WillRepeatedly(Return("Larry Page")); +``` + +Remember that `_` is the wildcard matcher that matches anything. With this, if `GetDomainOwner("google.com")` is called, it will do what the second `EXPECT_CALL` says; if it is called with a different argument, it will do what the first `EXPECT_CALL` says. + +Note that the order of the two `EXPECT_CALLs` is important, as a newer `EXPECT_CALL` takes precedence over an older one. + +For more on uninteresting calls, nice mocks, and strict mocks, read ["The Nice, the Strict, and the Naggy"](#the-nice-the-strict-and-the-naggy). + +## Expecting Ordered Calls ## + +Although an `EXPECT_CALL()` statement defined earlier takes precedence +when Google Mock tries to match a function call with an expectation, +by default calls don't have to happen in the order `EXPECT_CALL()` +statements are written. For example, if the arguments match the +matchers in the third `EXPECT_CALL()`, but not those in the first two, +then the third expectation will be used. + +If you would rather have all calls occur in the order of the +expectations, put the `EXPECT_CALL()` statements in a block where you +define a variable of type `InSequence`: + +``` + using ::testing::_; + using ::testing::InSequence; + + { + InSequence s; + + EXPECT_CALL(foo, DoThis(5)); + EXPECT_CALL(bar, DoThat(_)) + .Times(2); + EXPECT_CALL(foo, DoThis(6)); + } +``` + +In this example, we expect a call to `foo.DoThis(5)`, followed by two +calls to `bar.DoThat()` where the argument can be anything, which are +in turn followed by a call to `foo.DoThis(6)`. If a call occurred +out-of-order, Google Mock will report an error. + +## Expecting Partially Ordered Calls ## + +Sometimes requiring everything to occur in a predetermined order can +lead to brittle tests. For example, we may care about `A` occurring +before both `B` and `C`, but aren't interested in the relative order +of `B` and `C`. In this case, the test should reflect our real intent, +instead of being overly constraining. + +Google Mock allows you to impose an arbitrary DAG (directed acyclic +graph) on the calls. One way to express the DAG is to use the +[After](CheatSheet.md#the-after-clause) clause of `EXPECT_CALL`. + +Another way is via the `InSequence()` clause (not the same as the +`InSequence` class), which we borrowed from jMock 2. It's less +flexible than `After()`, but more convenient when you have long chains +of sequential calls, as it doesn't require you to come up with +different names for the expectations in the chains. Here's how it +works: + +If we view `EXPECT_CALL()` statements as nodes in a graph, and add an +edge from node A to node B wherever A must occur before B, we can get +a DAG. We use the term "sequence" to mean a directed path in this +DAG. Now, if we decompose the DAG into sequences, we just need to know +which sequences each `EXPECT_CALL()` belongs to in order to be able to +reconstruct the original DAG. + +So, to specify the partial order on the expectations we need to do two +things: first to define some `Sequence` objects, and then for each +`EXPECT_CALL()` say which `Sequence` objects it is part +of. Expectations in the same sequence must occur in the order they are +written. For example, + +``` + using ::testing::Sequence; + + Sequence s1, s2; + + EXPECT_CALL(foo, A()) + .InSequence(s1, s2); + EXPECT_CALL(bar, B()) + .InSequence(s1); + EXPECT_CALL(bar, C()) + .InSequence(s2); + EXPECT_CALL(foo, D()) + .InSequence(s2); +``` + +specifies the following DAG (where `s1` is `A -> B`, and `s2` is `A -> +C -> D`): + +``` + +---> B + | + A ---| + | + +---> C ---> D +``` + +This means that A must occur before B and C, and C must occur before +D. There's no restriction about the order other than these. + +## Controlling When an Expectation Retires ## + +When a mock method is called, Google Mock only consider expectations +that are still active. An expectation is active when created, and +becomes inactive (aka _retires_) when a call that has to occur later +has occurred. For example, in + +``` + using ::testing::_; + using ::testing::Sequence; + + Sequence s1, s2; + + EXPECT_CALL(log, Log(WARNING, _, "File too large.")) // #1 + .Times(AnyNumber()) + .InSequence(s1, s2); + EXPECT_CALL(log, Log(WARNING, _, "Data set is empty.")) // #2 + .InSequence(s1); + EXPECT_CALL(log, Log(WARNING, _, "User not found.")) // #3 + .InSequence(s2); +``` + +as soon as either #2 or #3 is matched, #1 will retire. If a warning +`"File too large."` is logged after this, it will be an error. + +Note that an expectation doesn't retire automatically when it's +saturated. For example, + +``` +using ::testing::_; +... + EXPECT_CALL(log, Log(WARNING, _, _)); // #1 + EXPECT_CALL(log, Log(WARNING, _, "File too large.")); // #2 +``` + +says that there will be exactly one warning with the message `"File +too large."`. If the second warning contains this message too, #2 will +match again and result in an upper-bound-violated error. + +If this is not what you want, you can ask an expectation to retire as +soon as it becomes saturated: + +``` +using ::testing::_; +... + EXPECT_CALL(log, Log(WARNING, _, _)); // #1 + EXPECT_CALL(log, Log(WARNING, _, "File too large.")) // #2 + .RetiresOnSaturation(); +``` + +Here #2 can be used only once, so if you have two warnings with the +message `"File too large."`, the first will match #2 and the second +will match #1 - there will be no error. + +# Using Actions # + +## Returning References from Mock Methods ## + +If a mock function's return type is a reference, you need to use +`ReturnRef()` instead of `Return()` to return a result: + +``` +using ::testing::ReturnRef; + +class MockFoo : public Foo { + public: + MOCK_METHOD0(GetBar, Bar&()); +}; +... + + MockFoo foo; + Bar bar; + EXPECT_CALL(foo, GetBar()) + .WillOnce(ReturnRef(bar)); +``` + +## Returning Live Values from Mock Methods ## + +The `Return(x)` action saves a copy of `x` when the action is +_created_, and always returns the same value whenever it's +executed. Sometimes you may want to instead return the _live_ value of +`x` (i.e. its value at the time when the action is _executed_.). + +If the mock function's return type is a reference, you can do it using +`ReturnRef(x)`, as shown in the previous recipe ("Returning References +from Mock Methods"). However, Google Mock doesn't let you use +`ReturnRef()` in a mock function whose return type is not a reference, +as doing that usually indicates a user error. So, what shall you do? + +You may be tempted to try `ByRef()`: + +``` +using testing::ByRef; +using testing::Return; + +class MockFoo : public Foo { + public: + MOCK_METHOD0(GetValue, int()); +}; +... + int x = 0; + MockFoo foo; + EXPECT_CALL(foo, GetValue()) + .WillRepeatedly(Return(ByRef(x))); + x = 42; + EXPECT_EQ(42, foo.GetValue()); +``` + +Unfortunately, it doesn't work here. The above code will fail with error: + +``` +Value of: foo.GetValue() + Actual: 0 +Expected: 42 +``` + +The reason is that `Return(value)` converts `value` to the actual +return type of the mock function at the time when the action is +_created_, not when it is _executed_. (This behavior was chosen for +the action to be safe when `value` is a proxy object that references +some temporary objects.) As a result, `ByRef(x)` is converted to an +`int` value (instead of a `const int&`) when the expectation is set, +and `Return(ByRef(x))` will always return 0. + +`ReturnPointee(pointer)` was provided to solve this problem +specifically. It returns the value pointed to by `pointer` at the time +the action is _executed_: + +``` +using testing::ReturnPointee; +... + int x = 0; + MockFoo foo; + EXPECT_CALL(foo, GetValue()) + .WillRepeatedly(ReturnPointee(&x)); // Note the & here. + x = 42; + EXPECT_EQ(42, foo.GetValue()); // This will succeed now. +``` + +## Combining Actions ## + +Want to do more than one thing when a function is called? That's +fine. `DoAll()` allow you to do sequence of actions every time. Only +the return value of the last action in the sequence will be used. + +``` +using ::testing::DoAll; + +class MockFoo : public Foo { + public: + MOCK_METHOD1(Bar, bool(int n)); +}; +... + + EXPECT_CALL(foo, Bar(_)) + .WillOnce(DoAll(action_1, + action_2, + ... + action_n)); +``` + +## Mocking Side Effects ## + +Sometimes a method exhibits its effect not via returning a value but +via side effects. For example, it may change some global state or +modify an output argument. To mock side effects, in general you can +define your own action by implementing `::testing::ActionInterface`. + +If all you need to do is to change an output argument, the built-in +`SetArgPointee()` action is convenient: + +``` +using ::testing::SetArgPointee; + +class MockMutator : public Mutator { + public: + MOCK_METHOD2(Mutate, void(bool mutate, int* value)); + ... +}; +... + + MockMutator mutator; + EXPECT_CALL(mutator, Mutate(true, _)) + .WillOnce(SetArgPointee<1>(5)); +``` + +In this example, when `mutator.Mutate()` is called, we will assign 5 +to the `int` variable pointed to by argument #1 +(0-based). + +`SetArgPointee()` conveniently makes an internal copy of the +value you pass to it, removing the need to keep the value in scope and +alive. The implication however is that the value must have a copy +constructor and assignment operator. + +If the mock method also needs to return a value as well, you can chain +`SetArgPointee()` with `Return()` using `DoAll()`: + +``` +using ::testing::_; +using ::testing::Return; +using ::testing::SetArgPointee; + +class MockMutator : public Mutator { + public: + ... + MOCK_METHOD1(MutateInt, bool(int* value)); +}; +... + + MockMutator mutator; + EXPECT_CALL(mutator, MutateInt(_)) + .WillOnce(DoAll(SetArgPointee<0>(5), + Return(true))); +``` + +If the output argument is an array, use the +`SetArrayArgument(first, last)` action instead. It copies the +elements in source range `[first, last)` to the array pointed to by +the `N`-th (0-based) argument: + +``` +using ::testing::NotNull; +using ::testing::SetArrayArgument; + +class MockArrayMutator : public ArrayMutator { + public: + MOCK_METHOD2(Mutate, void(int* values, int num_values)); + ... +}; +... + + MockArrayMutator mutator; + int values[5] = { 1, 2, 3, 4, 5 }; + EXPECT_CALL(mutator, Mutate(NotNull(), 5)) + .WillOnce(SetArrayArgument<0>(values, values + 5)); +``` + +This also works when the argument is an output iterator: + +``` +using ::testing::_; +using ::testing::SetArrayArgument; + +class MockRolodex : public Rolodex { + public: + MOCK_METHOD1(GetNames, void(std::back_insert_iterator >)); + ... +}; +... + + MockRolodex rolodex; + vector names; + names.push_back("George"); + names.push_back("John"); + names.push_back("Thomas"); + EXPECT_CALL(rolodex, GetNames(_)) + .WillOnce(SetArrayArgument<0>(names.begin(), names.end())); +``` + +## Changing a Mock Object's Behavior Based on the State ## + +If you expect a call to change the behavior of a mock object, you can use `::testing::InSequence` to specify different behaviors before and after the call: + +``` +using ::testing::InSequence; +using ::testing::Return; + +... + { + InSequence seq; + EXPECT_CALL(my_mock, IsDirty()) + .WillRepeatedly(Return(true)); + EXPECT_CALL(my_mock, Flush()); + EXPECT_CALL(my_mock, IsDirty()) + .WillRepeatedly(Return(false)); + } + my_mock.FlushIfDirty(); +``` + +This makes `my_mock.IsDirty()` return `true` before `my_mock.Flush()` is called and return `false` afterwards. + +If the behavior change is more complex, you can store the effects in a variable and make a mock method get its return value from that variable: + +``` +using ::testing::_; +using ::testing::SaveArg; +using ::testing::Return; + +ACTION_P(ReturnPointee, p) { return *p; } +... + int previous_value = 0; + EXPECT_CALL(my_mock, GetPrevValue()) + .WillRepeatedly(ReturnPointee(&previous_value)); + EXPECT_CALL(my_mock, UpdateValue(_)) + .WillRepeatedly(SaveArg<0>(&previous_value)); + my_mock.DoSomethingToUpdateValue(); +``` + +Here `my_mock.GetPrevValue()` will always return the argument of the last `UpdateValue()` call. + +## Setting the Default Value for a Return Type ## + +If a mock method's return type is a built-in C++ type or pointer, by +default it will return 0 when invoked. Also, in C++ 11 and above, a mock +method whose return type has a default constructor will return a default-constructed +value by default. You only need to specify an +action if this default value doesn't work for you. + +Sometimes, you may want to change this default value, or you may want +to specify a default value for types Google Mock doesn't know +about. You can do this using the `::testing::DefaultValue` class +template: + +``` +class MockFoo : public Foo { + public: + MOCK_METHOD0(CalculateBar, Bar()); +}; +... + + Bar default_bar; + // Sets the default return value for type Bar. + DefaultValue::Set(default_bar); + + MockFoo foo; + + // We don't need to specify an action here, as the default + // return value works for us. + EXPECT_CALL(foo, CalculateBar()); + + foo.CalculateBar(); // This should return default_bar. + + // Unsets the default return value. + DefaultValue::Clear(); +``` + +Please note that changing the default value for a type can make you +tests hard to understand. We recommend you to use this feature +judiciously. For example, you may want to make sure the `Set()` and +`Clear()` calls are right next to the code that uses your mock. + +## Setting the Default Actions for a Mock Method ## + +You've learned how to change the default value of a given +type. However, this may be too coarse for your purpose: perhaps you +have two mock methods with the same return type and you want them to +have different behaviors. The `ON_CALL()` macro allows you to +customize your mock's behavior at the method level: + +``` +using ::testing::_; +using ::testing::AnyNumber; +using ::testing::Gt; +using ::testing::Return; +... + ON_CALL(foo, Sign(_)) + .WillByDefault(Return(-1)); + ON_CALL(foo, Sign(0)) + .WillByDefault(Return(0)); + ON_CALL(foo, Sign(Gt(0))) + .WillByDefault(Return(1)); + + EXPECT_CALL(foo, Sign(_)) + .Times(AnyNumber()); + + foo.Sign(5); // This should return 1. + foo.Sign(-9); // This should return -1. + foo.Sign(0); // This should return 0. +``` + +As you may have guessed, when there are more than one `ON_CALL()` +statements, the news order take precedence over the older ones. In +other words, the **last** one that matches the function arguments will +be used. This matching order allows you to set up the common behavior +in a mock object's constructor or the test fixture's set-up phase and +specialize the mock's behavior later. + +## Using Functions/Methods/Functors as Actions ## + +If the built-in actions don't suit you, you can easily use an existing +function, method, or functor as an action: + +``` +using ::testing::_; +using ::testing::Invoke; + +class MockFoo : public Foo { + public: + MOCK_METHOD2(Sum, int(int x, int y)); + MOCK_METHOD1(ComplexJob, bool(int x)); +}; + +int CalculateSum(int x, int y) { return x + y; } + +class Helper { + public: + bool ComplexJob(int x); +}; +... + + MockFoo foo; + Helper helper; + EXPECT_CALL(foo, Sum(_, _)) + .WillOnce(Invoke(CalculateSum)); + EXPECT_CALL(foo, ComplexJob(_)) + .WillOnce(Invoke(&helper, &Helper::ComplexJob)); + + foo.Sum(5, 6); // Invokes CalculateSum(5, 6). + foo.ComplexJob(10); // Invokes helper.ComplexJob(10); +``` + +The only requirement is that the type of the function, etc must be +_compatible_ with the signature of the mock function, meaning that the +latter's arguments can be implicitly converted to the corresponding +arguments of the former, and the former's return type can be +implicitly converted to that of the latter. So, you can invoke +something whose type is _not_ exactly the same as the mock function, +as long as it's safe to do so - nice, huh? + +## Invoking a Function/Method/Functor Without Arguments ## + +`Invoke()` is very useful for doing actions that are more complex. It +passes the mock function's arguments to the function or functor being +invoked such that the callee has the full context of the call to work +with. If the invoked function is not interested in some or all of the +arguments, it can simply ignore them. + +Yet, a common pattern is that a test author wants to invoke a function +without the arguments of the mock function. `Invoke()` allows her to +do that using a wrapper function that throws away the arguments before +invoking an underlining nullary function. Needless to say, this can be +tedious and obscures the intent of the test. + +`InvokeWithoutArgs()` solves this problem. It's like `Invoke()` except +that it doesn't pass the mock function's arguments to the +callee. Here's an example: + +``` +using ::testing::_; +using ::testing::InvokeWithoutArgs; + +class MockFoo : public Foo { + public: + MOCK_METHOD1(ComplexJob, bool(int n)); +}; + +bool Job1() { ... } +... + + MockFoo foo; + EXPECT_CALL(foo, ComplexJob(_)) + .WillOnce(InvokeWithoutArgs(Job1)); + + foo.ComplexJob(10); // Invokes Job1(). +``` + +## Invoking an Argument of the Mock Function ## + +Sometimes a mock function will receive a function pointer or a functor +(in other words, a "callable") as an argument, e.g. + +``` +class MockFoo : public Foo { + public: + MOCK_METHOD2(DoThis, bool(int n, bool (*fp)(int))); +}; +``` + +and you may want to invoke this callable argument: + +``` +using ::testing::_; +... + MockFoo foo; + EXPECT_CALL(foo, DoThis(_, _)) + .WillOnce(...); + // Will execute (*fp)(5), where fp is the + // second argument DoThis() receives. +``` + +Arghh, you need to refer to a mock function argument but your version +of C++ has no lambdas, so you have to define your own action. :-( +Or do you really? + +Well, Google Mock has an action to solve _exactly_ this problem: + +``` + InvokeArgument(arg_1, arg_2, ..., arg_m) +``` + +will invoke the `N`-th (0-based) argument the mock function receives, +with `arg_1`, `arg_2`, ..., and `arg_m`. No matter if the argument is +a function pointer or a functor, Google Mock handles them both. + +With that, you could write: + +``` +using ::testing::_; +using ::testing::InvokeArgument; +... + EXPECT_CALL(foo, DoThis(_, _)) + .WillOnce(InvokeArgument<1>(5)); + // Will execute (*fp)(5), where fp is the + // second argument DoThis() receives. +``` + +What if the callable takes an argument by reference? No problem - just +wrap it inside `ByRef()`: + +``` +... + MOCK_METHOD1(Bar, bool(bool (*fp)(int, const Helper&))); +... +using ::testing::_; +using ::testing::ByRef; +using ::testing::InvokeArgument; +... + + MockFoo foo; + Helper helper; + ... + EXPECT_CALL(foo, Bar(_)) + .WillOnce(InvokeArgument<0>(5, ByRef(helper))); + // ByRef(helper) guarantees that a reference to helper, not a copy of it, + // will be passed to the callable. +``` + +What if the callable takes an argument by reference and we do **not** +wrap the argument in `ByRef()`? Then `InvokeArgument()` will _make a +copy_ of the argument, and pass a _reference to the copy_, instead of +a reference to the original value, to the callable. This is especially +handy when the argument is a temporary value: + +``` +... + MOCK_METHOD1(DoThat, bool(bool (*f)(const double& x, const string& s))); +... +using ::testing::_; +using ::testing::InvokeArgument; +... + + MockFoo foo; + ... + EXPECT_CALL(foo, DoThat(_)) + .WillOnce(InvokeArgument<0>(5.0, string("Hi"))); + // Will execute (*f)(5.0, string("Hi")), where f is the function pointer + // DoThat() receives. Note that the values 5.0 and string("Hi") are + // temporary and dead once the EXPECT_CALL() statement finishes. Yet + // it's fine to perform this action later, since a copy of the values + // are kept inside the InvokeArgument action. +``` + +## Ignoring an Action's Result ## + +Sometimes you have an action that returns _something_, but you need an +action that returns `void` (perhaps you want to use it in a mock +function that returns `void`, or perhaps it needs to be used in +`DoAll()` and it's not the last in the list). `IgnoreResult()` lets +you do that. For example: + +``` +using ::testing::_; +using ::testing::Invoke; +using ::testing::Return; + +int Process(const MyData& data); +string DoSomething(); + +class MockFoo : public Foo { + public: + MOCK_METHOD1(Abc, void(const MyData& data)); + MOCK_METHOD0(Xyz, bool()); +}; +... + + MockFoo foo; + EXPECT_CALL(foo, Abc(_)) + // .WillOnce(Invoke(Process)); + // The above line won't compile as Process() returns int but Abc() needs + // to return void. + .WillOnce(IgnoreResult(Invoke(Process))); + + EXPECT_CALL(foo, Xyz()) + .WillOnce(DoAll(IgnoreResult(Invoke(DoSomething)), + // Ignores the string DoSomething() returns. + Return(true))); +``` + +Note that you **cannot** use `IgnoreResult()` on an action that already +returns `void`. Doing so will lead to ugly compiler errors. + +## Selecting an Action's Arguments ## + +Say you have a mock function `Foo()` that takes seven arguments, and +you have a custom action that you want to invoke when `Foo()` is +called. Trouble is, the custom action only wants three arguments: + +``` +using ::testing::_; +using ::testing::Invoke; +... + MOCK_METHOD7(Foo, bool(bool visible, const string& name, int x, int y, + const map, double>& weight, + double min_weight, double max_wight)); +... + +bool IsVisibleInQuadrant1(bool visible, int x, int y) { + return visible && x >= 0 && y >= 0; +} +... + + EXPECT_CALL(mock, Foo(_, _, _, _, _, _, _)) + .WillOnce(Invoke(IsVisibleInQuadrant1)); // Uh, won't compile. :-( +``` + +To please the compiler God, you can to define an "adaptor" that has +the same signature as `Foo()` and calls the custom action with the +right arguments: + +``` +using ::testing::_; +using ::testing::Invoke; + +bool MyIsVisibleInQuadrant1(bool visible, const string& name, int x, int y, + const map, double>& weight, + double min_weight, double max_wight) { + return IsVisibleInQuadrant1(visible, x, y); +} +... + + EXPECT_CALL(mock, Foo(_, _, _, _, _, _, _)) + .WillOnce(Invoke(MyIsVisibleInQuadrant1)); // Now it works. +``` + +But isn't this awkward? + +Google Mock provides a generic _action adaptor_, so you can spend your +time minding more important business than writing your own +adaptors. Here's the syntax: + +``` + WithArgs(action) +``` + +creates an action that passes the arguments of the mock function at +the given indices (0-based) to the inner `action` and performs +it. Using `WithArgs`, our original example can be written as: + +``` +using ::testing::_; +using ::testing::Invoke; +using ::testing::WithArgs; +... + EXPECT_CALL(mock, Foo(_, _, _, _, _, _, _)) + .WillOnce(WithArgs<0, 2, 3>(Invoke(IsVisibleInQuadrant1))); + // No need to define your own adaptor. +``` + +For better readability, Google Mock also gives you: + + * `WithoutArgs(action)` when the inner `action` takes _no_ argument, and + * `WithArg(action)` (no `s` after `Arg`) when the inner `action` takes _one_ argument. + +As you may have realized, `InvokeWithoutArgs(...)` is just syntactic +sugar for `WithoutArgs(Invoke(...))`. + +Here are more tips: + + * The inner action used in `WithArgs` and friends does not have to be `Invoke()` -- it can be anything. + * You can repeat an argument in the argument list if necessary, e.g. `WithArgs<2, 3, 3, 5>(...)`. + * You can change the order of the arguments, e.g. `WithArgs<3, 2, 1>(...)`. + * The types of the selected arguments do _not_ have to match the signature of the inner action exactly. It works as long as they can be implicitly converted to the corresponding arguments of the inner action. For example, if the 4-th argument of the mock function is an `int` and `my_action` takes a `double`, `WithArg<4>(my_action)` will work. + +## Ignoring Arguments in Action Functions ## + +The selecting-an-action's-arguments recipe showed us one way to make a +mock function and an action with incompatible argument lists fit +together. The downside is that wrapping the action in +`WithArgs<...>()` can get tedious for people writing the tests. + +If you are defining a function, method, or functor to be used with +`Invoke*()`, and you are not interested in some of its arguments, an +alternative to `WithArgs` is to declare the uninteresting arguments as +`Unused`. This makes the definition less cluttered and less fragile in +case the types of the uninteresting arguments change. It could also +increase the chance the action function can be reused. For example, +given + +``` + MOCK_METHOD3(Foo, double(const string& label, double x, double y)); + MOCK_METHOD3(Bar, double(int index, double x, double y)); +``` + +instead of + +``` +using ::testing::_; +using ::testing::Invoke; + +double DistanceToOriginWithLabel(const string& label, double x, double y) { + return sqrt(x*x + y*y); +} + +double DistanceToOriginWithIndex(int index, double x, double y) { + return sqrt(x*x + y*y); +} +... + + EXEPCT_CALL(mock, Foo("abc", _, _)) + .WillOnce(Invoke(DistanceToOriginWithLabel)); + EXEPCT_CALL(mock, Bar(5, _, _)) + .WillOnce(Invoke(DistanceToOriginWithIndex)); +``` + +you could write + +``` +using ::testing::_; +using ::testing::Invoke; +using ::testing::Unused; + +double DistanceToOrigin(Unused, double x, double y) { + return sqrt(x*x + y*y); +} +... + + EXEPCT_CALL(mock, Foo("abc", _, _)) + .WillOnce(Invoke(DistanceToOrigin)); + EXEPCT_CALL(mock, Bar(5, _, _)) + .WillOnce(Invoke(DistanceToOrigin)); +``` + +## Sharing Actions ## + +Just like matchers, a Google Mock action object consists of a pointer +to a ref-counted implementation object. Therefore copying actions is +also allowed and very efficient. When the last action that references +the implementation object dies, the implementation object will be +deleted. + +If you have some complex action that you want to use again and again, +you may not have to build it from scratch every time. If the action +doesn't have an internal state (i.e. if it always does the same thing +no matter how many times it has been called), you can assign it to an +action variable and use that variable repeatedly. For example: + +``` + Action set_flag = DoAll(SetArgPointee<0>(5), + Return(true)); + ... use set_flag in .WillOnce() and .WillRepeatedly() ... +``` + +However, if the action has its own state, you may be surprised if you +share the action object. Suppose you have an action factory +`IncrementCounter(init)` which creates an action that increments and +returns a counter whose initial value is `init`, using two actions +created from the same expression and using a shared action will +exihibit different behaviors. Example: + +``` + EXPECT_CALL(foo, DoThis()) + .WillRepeatedly(IncrementCounter(0)); + EXPECT_CALL(foo, DoThat()) + .WillRepeatedly(IncrementCounter(0)); + foo.DoThis(); // Returns 1. + foo.DoThis(); // Returns 2. + foo.DoThat(); // Returns 1 - Blah() uses a different + // counter than Bar()'s. +``` + +versus + +``` + Action increment = IncrementCounter(0); + + EXPECT_CALL(foo, DoThis()) + .WillRepeatedly(increment); + EXPECT_CALL(foo, DoThat()) + .WillRepeatedly(increment); + foo.DoThis(); // Returns 1. + foo.DoThis(); // Returns 2. + foo.DoThat(); // Returns 3 - the counter is shared. +``` + +# Misc Recipes on Using Google Mock # + +## Mocking Methods That Use Move-Only Types ## + +C++11 introduced move-only types. A move-only-typed value can be moved from one object to another, but cannot be copied. `std::unique_ptr` is probably the most commonly used move-only type. + +Mocking a method that takes and/or returns move-only types presents some challenges, but nothing insurmountable. This recipe shows you how you can do it. + +Let’s say we are working on a fictional project that lets one post and share snippets called “buzzesâ€. Your code uses these types: + +``` +enum class AccessLevel { kInternal, kPublic }; + +class Buzz { + public: + explicit Buzz(AccessLevel access) { … } + ... +}; + +class Buzzer { + public: + virtual ~Buzzer() {} + virtual std::unique_ptr MakeBuzz(const std::string& text) = 0; + virtual bool ShareBuzz(std::unique_ptr buzz, Time timestamp) = 0; + ... +}; +``` + +A `Buzz` object represents a snippet being posted. A class that implements the `Buzzer` interface is capable of creating and sharing `Buzz`. Methods in `Buzzer` may return a `unique_ptr` or take a `unique_ptr`. Now we need to mock `Buzzer` in our tests. + +To mock a method that returns a move-only type, you just use the familiar `MOCK_METHOD` syntax as usual: + +``` +class MockBuzzer : public Buzzer { + public: + MOCK_METHOD1(MakeBuzz, std::unique_ptr(const std::string& text)); + … +}; +``` + +However, if you attempt to use the same `MOCK_METHOD` pattern to mock a method that takes a move-only parameter, you’ll get a compiler error currently: + +``` + // Does NOT compile! + MOCK_METHOD2(ShareBuzz, bool(std::unique_ptr buzz, Time timestamp)); +``` + +While it’s highly desirable to make this syntax just work, it’s not trivial and the work hasn’t been done yet. Fortunately, there is a trick you can apply today to get something that works nearly as well as this. + +The trick, is to delegate the `ShareBuzz()` method to a mock method (let’s call it `DoShareBuzz()`) that does not take move-only parameters: + +``` +class MockBuzzer : public Buzzer { + public: + MOCK_METHOD1(MakeBuzz, std::unique_ptr(const std::string& text)); + MOCK_METHOD2(DoShareBuzz, bool(Buzz* buzz, Time timestamp)); + bool ShareBuzz(std::unique_ptr buzz, Time timestamp) { + return DoShareBuzz(buzz.get(), timestamp); + } +}; +``` + +Note that there's no need to define or declare `DoShareBuzz()` in a base class. You only need to define it as a `MOCK_METHOD` in the mock class. + +Now that we have the mock class defined, we can use it in tests. In the following code examples, we assume that we have defined a `MockBuzzer` object named `mock_buzzer_`: + +``` + MockBuzzer mock_buzzer_; +``` + +First let’s see how we can set expectations on the `MakeBuzz()` method, which returns a `unique_ptr`. + +As usual, if you set an expectation without an action (i.e. the `.WillOnce()` or `.WillRepeated()` clause), when that expectation fires, the default action for that method will be taken. Since `unique_ptr<>` has a default constructor that returns a null `unique_ptr`, that’s what you’ll get if you don’t specify an action: + +``` + // Use the default action. + EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")); + + // Triggers the previous EXPECT_CALL. + EXPECT_EQ(nullptr, mock_buzzer_.MakeBuzz("hello")); +``` + +If you are not happy with the default action, you can tweak it. Depending on what you need, you may either tweak the default action for a specific (mock object, mock method) combination using `ON_CALL()`, or you may tweak the default action for all mock methods that return a specific type. The usage of `ON_CALL()` is similar to `EXPECT_CALL()`, so we’ll skip it and just explain how to do the latter (tweaking the default action for a specific return type). You do this via the `DefaultValue<>::SetFactory()` and `DefaultValue<>::Clear()` API: + +``` + // Sets the default action for return type std::unique_ptr to + // creating a new Buzz every time. + DefaultValue>::SetFactory( + [] { return MakeUnique(AccessLevel::kInternal); }); + + // When this fires, the default action of MakeBuzz() will run, which + // will return a new Buzz object. + EXPECT_CALL(mock_buzzer_, MakeBuzz("hello")).Times(AnyNumber()); + + auto buzz1 = mock_buzzer_.MakeBuzz("hello"); + auto buzz2 = mock_buzzer_.MakeBuzz("hello"); + EXPECT_NE(nullptr, buzz1); + EXPECT_NE(nullptr, buzz2); + EXPECT_NE(buzz1, buzz2); + + // Resets the default action for return type std::unique_ptr, + // to avoid interfere with other tests. + DefaultValue>::Clear(); +``` + +What if you want the method to do something other than the default action? If you just need to return a pre-defined move-only value, you can use the `Return(ByMove(...))` action: + +``` + // When this fires, the unique_ptr<> specified by ByMove(...) will + // be returned. + EXPECT_CALL(mock_buzzer_, MakeBuzz("world")) + .WillOnce(Return(ByMove(MakeUnique(AccessLevel::kInternal)))); + + EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("world")); +``` + +Note that `ByMove()` is essential here - if you drop it, the code won’t compile. + +Quiz time! What do you think will happen if a `Return(ByMove(...))` action is performed more than once (e.g. you write `….WillRepeatedly(Return(ByMove(...)));`)? Come think of it, after the first time the action runs, the source value will be consumed (since it’s a move-only value), so the next time around, there’s no value to move from -- you’ll get a run-time error that `Return(ByMove(...))` can only be run once. + +If you need your mock method to do more than just moving a pre-defined value, remember that you can always use `Invoke()` to call a lambda or a callable object, which can do pretty much anything you want: + +``` + EXPECT_CALL(mock_buzzer_, MakeBuzz("x")) + .WillRepeatedly(Invoke([](const std::string& text) { + return std::make_unique(AccessLevel::kInternal); + })); + + EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("x")); + EXPECT_NE(nullptr, mock_buzzer_.MakeBuzz("x")); +``` + +Every time this `EXPECT_CALL` fires, a new `unique_ptr` will be created and returned. You cannot do this with `Return(ByMove(...))`. + +Now there’s one topic we haven’t covered: how do you set expectations on `ShareBuzz()`, which takes a move-only-typed parameter? The answer is you don’t. Instead, you set expectations on the `DoShareBuzz()` mock method (remember that we defined a `MOCK_METHOD` for `DoShareBuzz()`, not `ShareBuzz()`): + +``` + EXPECT_CALL(mock_buzzer_, DoShareBuzz(NotNull(), _)); + + // When one calls ShareBuzz() on the MockBuzzer like this, the call is + // forwarded to DoShareBuzz(), which is mocked. Therefore this statement + // will trigger the above EXPECT_CALL. + mock_buzzer_.ShareBuzz(MakeUnique(AccessLevel::kInternal), + ::base::Now()); +``` + +Some of you may have spotted one problem with this approach: the `DoShareBuzz()` mock method differs from the real `ShareBuzz()` method in that it cannot take ownership of the buzz parameter - `ShareBuzz()` will always delete buzz after `DoShareBuzz()` returns. What if you need to save the buzz object somewhere for later use when `ShareBuzz()` is called? Indeed, you'd be stuck. + +Another problem with the `DoShareBuzz()` we had is that it can surprise people reading or maintaining the test, as one would expect that `DoShareBuzz()` has (logically) the same contract as `ShareBuzz()`. + +Fortunately, these problems can be fixed with a bit more code. Let's try to get it right this time: + +``` +class MockBuzzer : public Buzzer { + public: + MockBuzzer() { + // Since DoShareBuzz(buzz, time) is supposed to take ownership of + // buzz, define a default behavior for DoShareBuzz(buzz, time) to + // delete buzz. + ON_CALL(*this, DoShareBuzz(_, _)) + .WillByDefault(Invoke([](Buzz* buzz, Time timestamp) { + delete buzz; + return true; + })); + } + + MOCK_METHOD1(MakeBuzz, std::unique_ptr(const std::string& text)); + + // Takes ownership of buzz. + MOCK_METHOD2(DoShareBuzz, bool(Buzz* buzz, Time timestamp)); + bool ShareBuzz(std::unique_ptr buzz, Time timestamp) { + return DoShareBuzz(buzz.release(), timestamp); + } +}; +``` + +Now, the mock `DoShareBuzz()` method is free to save the buzz argument for later use if this is what you want: + +``` + std::unique_ptr intercepted_buzz; + EXPECT_CALL(mock_buzzer_, DoShareBuzz(NotNull(), _)) + .WillOnce(Invoke([&intercepted_buzz](Buzz* buzz, Time timestamp) { + // Save buzz in intercepted_buzz for analysis later. + intercepted_buzz.reset(buzz); + return false; + })); + + mock_buzzer_.ShareBuzz(std::make_unique(AccessLevel::kInternal), + Now()); + EXPECT_NE(nullptr, intercepted_buzz); +``` + +Using the tricks covered in this recipe, you are now able to mock methods that take and/or return move-only types. Put your newly-acquired power to good use - when you design a new API, you can now feel comfortable using `unique_ptrs` as appropriate, without fearing that doing so will compromise your tests. + +## Making the Compilation Faster ## + +Believe it or not, the _vast majority_ of the time spent on compiling +a mock class is in generating its constructor and destructor, as they +perform non-trivial tasks (e.g. verification of the +expectations). What's more, mock methods with different signatures +have different types and thus their constructors/destructors need to +be generated by the compiler separately. As a result, if you mock many +different types of methods, compiling your mock class can get really +slow. + +If you are experiencing slow compilation, you can move the definition +of your mock class' constructor and destructor out of the class body +and into a `.cpp` file. This way, even if you `#include` your mock +class in N files, the compiler only needs to generate its constructor +and destructor once, resulting in a much faster compilation. + +Let's illustrate the idea using an example. Here's the definition of a +mock class before applying this recipe: + +``` +// File mock_foo.h. +... +class MockFoo : public Foo { + public: + // Since we don't declare the constructor or the destructor, + // the compiler will generate them in every translation unit + // where this mock class is used. + + MOCK_METHOD0(DoThis, int()); + MOCK_METHOD1(DoThat, bool(const char* str)); + ... more mock methods ... +}; +``` + +After the change, it would look like: + +``` +// File mock_foo.h. +... +class MockFoo : public Foo { + public: + // The constructor and destructor are declared, but not defined, here. + MockFoo(); + virtual ~MockFoo(); + + MOCK_METHOD0(DoThis, int()); + MOCK_METHOD1(DoThat, bool(const char* str)); + ... more mock methods ... +}; +``` +and +``` +// File mock_foo.cpp. +#include "path/to/mock_foo.h" + +// The definitions may appear trivial, but the functions actually do a +// lot of things through the constructors/destructors of the member +// variables used to implement the mock methods. +MockFoo::MockFoo() {} +MockFoo::~MockFoo() {} +``` + +## Forcing a Verification ## + +When it's being destroyed, your friendly mock object will automatically +verify that all expectations on it have been satisfied, and will +generate [Google Test](../../googletest/) failures +if not. This is convenient as it leaves you with one less thing to +worry about. That is, unless you are not sure if your mock object will +be destroyed. + +How could it be that your mock object won't eventually be destroyed? +Well, it might be created on the heap and owned by the code you are +testing. Suppose there's a bug in that code and it doesn't delete the +mock object properly - you could end up with a passing test when +there's actually a bug. + +Using a heap checker is a good idea and can alleviate the concern, but +its implementation may not be 100% reliable. So, sometimes you do want +to _force_ Google Mock to verify a mock object before it is +(hopefully) destructed. You can do this with +`Mock::VerifyAndClearExpectations(&mock_object)`: + +``` +TEST(MyServerTest, ProcessesRequest) { + using ::testing::Mock; + + MockFoo* const foo = new MockFoo; + EXPECT_CALL(*foo, ...)...; + // ... other expectations ... + + // server now owns foo. + MyServer server(foo); + server.ProcessRequest(...); + + // In case that server's destructor will forget to delete foo, + // this will verify the expectations anyway. + Mock::VerifyAndClearExpectations(foo); +} // server is destroyed when it goes out of scope here. +``` + +**Tip:** The `Mock::VerifyAndClearExpectations()` function returns a +`bool` to indicate whether the verification was successful (`true` for +yes), so you can wrap that function call inside a `ASSERT_TRUE()` if +there is no point going further when the verification has failed. + +## Using Check Points ## + +Sometimes you may want to "reset" a mock object at various check +points in your test: at each check point, you verify that all existing +expectations on the mock object have been satisfied, and then you set +some new expectations on it as if it's newly created. This allows you +to work with a mock object in "phases" whose sizes are each +manageable. + +One such scenario is that in your test's `SetUp()` function, you may +want to put the object you are testing into a certain state, with the +help from a mock object. Once in the desired state, you want to clear +all expectations on the mock, such that in the `TEST_F` body you can +set fresh expectations on it. + +As you may have figured out, the `Mock::VerifyAndClearExpectations()` +function we saw in the previous recipe can help you here. Or, if you +are using `ON_CALL()` to set default actions on the mock object and +want to clear the default actions as well, use +`Mock::VerifyAndClear(&mock_object)` instead. This function does what +`Mock::VerifyAndClearExpectations(&mock_object)` does and returns the +same `bool`, **plus** it clears the `ON_CALL()` statements on +`mock_object` too. + +Another trick you can use to achieve the same effect is to put the +expectations in sequences and insert calls to a dummy "check-point" +function at specific places. Then you can verify that the mock +function calls do happen at the right time. For example, if you are +exercising code: + +``` +Foo(1); +Foo(2); +Foo(3); +``` + +and want to verify that `Foo(1)` and `Foo(3)` both invoke +`mock.Bar("a")`, but `Foo(2)` doesn't invoke anything. You can write: + +``` +using ::testing::MockFunction; + +TEST(FooTest, InvokesBarCorrectly) { + MyMock mock; + // Class MockFunction has exactly one mock method. It is named + // Call() and has type F. + MockFunction check; + { + InSequence s; + + EXPECT_CALL(mock, Bar("a")); + EXPECT_CALL(check, Call("1")); + EXPECT_CALL(check, Call("2")); + EXPECT_CALL(mock, Bar("a")); + } + Foo(1); + check.Call("1"); + Foo(2); + check.Call("2"); + Foo(3); +} +``` + +The expectation spec says that the first `Bar("a")` must happen before +check point "1", the second `Bar("a")` must happen after check point "2", +and nothing should happen between the two check points. The explicit +check points make it easy to tell which `Bar("a")` is called by which +call to `Foo()`. + +## Mocking Destructors ## + +Sometimes you want to make sure a mock object is destructed at the +right time, e.g. after `bar->A()` is called but before `bar->B()` is +called. We already know that you can specify constraints on the order +of mock function calls, so all we need to do is to mock the destructor +of the mock function. + +This sounds simple, except for one problem: a destructor is a special +function with special syntax and special semantics, and the +`MOCK_METHOD0` macro doesn't work for it: + +``` + MOCK_METHOD0(~MockFoo, void()); // Won't compile! +``` + +The good news is that you can use a simple pattern to achieve the same +effect. First, add a mock function `Die()` to your mock class and call +it in the destructor, like this: + +``` +class MockFoo : public Foo { + ... + // Add the following two lines to the mock class. + MOCK_METHOD0(Die, void()); + virtual ~MockFoo() { Die(); } +}; +``` + +(If the name `Die()` clashes with an existing symbol, choose another +name.) Now, we have translated the problem of testing when a `MockFoo` +object dies to testing when its `Die()` method is called: + +``` + MockFoo* foo = new MockFoo; + MockBar* bar = new MockBar; + ... + { + InSequence s; + + // Expects *foo to die after bar->A() and before bar->B(). + EXPECT_CALL(*bar, A()); + EXPECT_CALL(*foo, Die()); + EXPECT_CALL(*bar, B()); + } +``` + +And that's that. + +## Using Google Mock and Threads ## + +**IMPORTANT NOTE:** What we describe in this recipe is **ONLY** true on +platforms where Google Mock is thread-safe. Currently these are only +platforms that support the pthreads library (this includes Linux and Mac). +To make it thread-safe on other platforms we only need to implement +some synchronization operations in `"gtest/internal/gtest-port.h"`. + +In a **unit** test, it's best if you could isolate and test a piece of +code in a single-threaded context. That avoids race conditions and +dead locks, and makes debugging your test much easier. + +Yet many programs are multi-threaded, and sometimes to test something +we need to pound on it from more than one thread. Google Mock works +for this purpose too. + +Remember the steps for using a mock: + + 1. Create a mock object `foo`. + 1. Set its default actions and expectations using `ON_CALL()` and `EXPECT_CALL()`. + 1. The code under test calls methods of `foo`. + 1. Optionally, verify and reset the mock. + 1. Destroy the mock yourself, or let the code under test destroy it. The destructor will automatically verify it. + +If you follow the following simple rules, your mocks and threads can +live happily together: + + * Execute your _test code_ (as opposed to the code being tested) in _one_ thread. This makes your test easy to follow. + * Obviously, you can do step #1 without locking. + * When doing step #2 and #5, make sure no other thread is accessing `foo`. Obvious too, huh? + * #3 and #4 can be done either in one thread or in multiple threads - anyway you want. Google Mock takes care of the locking, so you don't have to do any - unless required by your test logic. + +If you violate the rules (for example, if you set expectations on a +mock while another thread is calling its methods), you get undefined +behavior. That's not fun, so don't do it. + +Google Mock guarantees that the action for a mock function is done in +the same thread that called the mock function. For example, in + +``` + EXPECT_CALL(mock, Foo(1)) + .WillOnce(action1); + EXPECT_CALL(mock, Foo(2)) + .WillOnce(action2); +``` + +if `Foo(1)` is called in thread 1 and `Foo(2)` is called in thread 2, +Google Mock will execute `action1` in thread 1 and `action2` in thread +2. + +Google Mock does _not_ impose a sequence on actions performed in +different threads (doing so may create deadlocks as the actions may +need to cooperate). This means that the execution of `action1` and +`action2` in the above example _may_ interleave. If this is a problem, +you should add proper synchronization logic to `action1` and `action2` +to make the test thread-safe. + + +Also, remember that `DefaultValue` is a global resource that +potentially affects _all_ living mock objects in your +program. Naturally, you won't want to mess with it from multiple +threads or when there still are mocks in action. + +## Controlling How Much Information Google Mock Prints ## + +When Google Mock sees something that has the potential of being an +error (e.g. a mock function with no expectation is called, a.k.a. an +uninteresting call, which is allowed but perhaps you forgot to +explicitly ban the call), it prints some warning messages, including +the arguments of the function and the return value. Hopefully this +will remind you to take a look and see if there is indeed a problem. + +Sometimes you are confident that your tests are correct and may not +appreciate such friendly messages. Some other times, you are debugging +your tests or learning about the behavior of the code you are testing, +and wish you could observe every mock call that happens (including +argument values and the return value). Clearly, one size doesn't fit +all. + +You can control how much Google Mock tells you using the +`--gmock_verbose=LEVEL` command-line flag, where `LEVEL` is a string +with three possible values: + + * `info`: Google Mock will print all informational messages, warnings, and errors (most verbose). At this setting, Google Mock will also log any calls to the `ON_CALL/EXPECT_CALL` macros. + * `warning`: Google Mock will print both warnings and errors (less verbose). This is the default. + * `error`: Google Mock will print errors only (least verbose). + +Alternatively, you can adjust the value of that flag from within your +tests like so: + +``` + ::testing::FLAGS_gmock_verbose = "error"; +``` + +Now, judiciously use the right flag to enable Google Mock serve you better! + +## Gaining Super Vision into Mock Calls ## + +You have a test using Google Mock. It fails: Google Mock tells you +that some expectations aren't satisfied. However, you aren't sure why: +Is there a typo somewhere in the matchers? Did you mess up the order +of the `EXPECT_CALL`s? Or is the code under test doing something +wrong? How can you find out the cause? + +Won't it be nice if you have X-ray vision and can actually see the +trace of all `EXPECT_CALL`s and mock method calls as they are made? +For each call, would you like to see its actual argument values and +which `EXPECT_CALL` Google Mock thinks it matches? + +You can unlock this power by running your test with the +`--gmock_verbose=info` flag. For example, given the test program: + +``` +using testing::_; +using testing::HasSubstr; +using testing::Return; + +class MockFoo { + public: + MOCK_METHOD2(F, void(const string& x, const string& y)); +}; + +TEST(Foo, Bar) { + MockFoo mock; + EXPECT_CALL(mock, F(_, _)).WillRepeatedly(Return()); + EXPECT_CALL(mock, F("a", "b")); + EXPECT_CALL(mock, F("c", HasSubstr("d"))); + + mock.F("a", "good"); + mock.F("a", "b"); +} +``` + +if you run it with `--gmock_verbose=info`, you will see this output: + +``` +[ RUN ] Foo.Bar + +foo_test.cc:14: EXPECT_CALL(mock, F(_, _)) invoked +foo_test.cc:15: EXPECT_CALL(mock, F("a", "b")) invoked +foo_test.cc:16: EXPECT_CALL(mock, F("c", HasSubstr("d"))) invoked +foo_test.cc:14: Mock function call matches EXPECT_CALL(mock, F(_, _))... + Function call: F(@0x7fff7c8dad40"a", @0x7fff7c8dad10"good") +foo_test.cc:15: Mock function call matches EXPECT_CALL(mock, F("a", "b"))... + Function call: F(@0x7fff7c8dada0"a", @0x7fff7c8dad70"b") +foo_test.cc:16: Failure +Actual function call count doesn't match EXPECT_CALL(mock, F("c", HasSubstr("d")))... + Expected: to be called once + Actual: never called - unsatisfied and active +[ FAILED ] Foo.Bar +``` + +Suppose the bug is that the `"c"` in the third `EXPECT_CALL` is a typo +and should actually be `"a"`. With the above message, you should see +that the actual `F("a", "good")` call is matched by the first +`EXPECT_CALL`, not the third as you thought. From that it should be +obvious that the third `EXPECT_CALL` is written wrong. Case solved. + +## Running Tests in Emacs ## + +If you build and run your tests in Emacs, the source file locations of +Google Mock and [Google Test](../../googletest/) +errors will be highlighted. Just press `` on one of them and +you'll be taken to the offending line. Or, you can just type `C-x `` +to jump to the next error. + +To make it even easier, you can add the following lines to your +`~/.emacs` file: + +``` +(global-set-key "\M-m" 'compile) ; m is for make +(global-set-key [M-down] 'next-error) +(global-set-key [M-up] '(lambda () (interactive) (next-error -1))) +``` + +Then you can type `M-m` to start a build, or `M-up`/`M-down` to move +back and forth between errors. + +## Fusing Google Mock Source Files ## + +Google Mock's implementation consists of dozens of files (excluding +its own tests). Sometimes you may want them to be packaged up in +fewer files instead, such that you can easily copy them to a new +machine and start hacking there. For this we provide an experimental +Python script `fuse_gmock_files.py` in the `scripts/` directory +(starting with release 1.2.0). Assuming you have Python 2.4 or above +installed on your machine, just go to that directory and run +``` +python fuse_gmock_files.py OUTPUT_DIR +``` + +and you should see an `OUTPUT_DIR` directory being created with files +`gtest/gtest.h`, `gmock/gmock.h`, and `gmock-gtest-all.cc` in it. +These three files contain everything you need to use Google Mock (and +Google Test). Just copy them to anywhere you want and you are ready +to write tests and use mocks. You can use the +[scrpts/test/Makefile](../scripts/test/Makefile) file as an example on how to compile your tests +against them. + +# Extending Google Mock # + +## Writing New Matchers Quickly ## + +The `MATCHER*` family of macros can be used to define custom matchers +easily. The syntax: + +``` +MATCHER(name, description_string_expression) { statements; } +``` + +will define a matcher with the given name that executes the +statements, which must return a `bool` to indicate if the match +succeeds. Inside the statements, you can refer to the value being +matched by `arg`, and refer to its type by `arg_type`. + +The description string is a `string`-typed expression that documents +what the matcher does, and is used to generate the failure message +when the match fails. It can (and should) reference the special +`bool` variable `negation`, and should evaluate to the description of +the matcher when `negation` is `false`, or that of the matcher's +negation when `negation` is `true`. + +For convenience, we allow the description string to be empty (`""`), +in which case Google Mock will use the sequence of words in the +matcher name as the description. + +For example: +``` +MATCHER(IsDivisibleBy7, "") { return (arg % 7) == 0; } +``` +allows you to write +``` + // Expects mock_foo.Bar(n) to be called where n is divisible by 7. + EXPECT_CALL(mock_foo, Bar(IsDivisibleBy7())); +``` +or, +``` +using ::testing::Not; +... + EXPECT_THAT(some_expression, IsDivisibleBy7()); + EXPECT_THAT(some_other_expression, Not(IsDivisibleBy7())); +``` +If the above assertions fail, they will print something like: +``` + Value of: some_expression + Expected: is divisible by 7 + Actual: 27 +... + Value of: some_other_expression + Expected: not (is divisible by 7) + Actual: 21 +``` +where the descriptions `"is divisible by 7"` and `"not (is divisible +by 7)"` are automatically calculated from the matcher name +`IsDivisibleBy7`. + +As you may have noticed, the auto-generated descriptions (especially +those for the negation) may not be so great. You can always override +them with a string expression of your own: +``` +MATCHER(IsDivisibleBy7, std::string(negation ? "isn't" : "is") + + " divisible by 7") { + return (arg % 7) == 0; +} +``` + +Optionally, you can stream additional information to a hidden argument +named `result_listener` to explain the match result. For example, a +better definition of `IsDivisibleBy7` is: +``` +MATCHER(IsDivisibleBy7, "") { + if ((arg % 7) == 0) + return true; + + *result_listener << "the remainder is " << (arg % 7); + return false; +} +``` + +With this definition, the above assertion will give a better message: +``` + Value of: some_expression + Expected: is divisible by 7 + Actual: 27 (the remainder is 6) +``` + +You should let `MatchAndExplain()` print _any additional information_ +that can help a user understand the match result. Note that it should +explain why the match succeeds in case of a success (unless it's +obvious) - this is useful when the matcher is used inside +`Not()`. There is no need to print the argument value itself, as +Google Mock already prints it for you. + +**Notes:** + + 1. The type of the value being matched (`arg_type`) is determined by the context in which you use the matcher and is supplied to you by the compiler, so you don't need to worry about declaring it (nor can you). This allows the matcher to be polymorphic. For example, `IsDivisibleBy7()` can be used to match any type where the value of `(arg % 7) == 0` can be implicitly converted to a `bool`. In the `Bar(IsDivisibleBy7())` example above, if method `Bar()` takes an `int`, `arg_type` will be `int`; if it takes an `unsigned long`, `arg_type` will be `unsigned long`; and so on. + 1. Google Mock doesn't guarantee when or how many times a matcher will be invoked. Therefore the matcher logic must be _purely functional_ (i.e. it cannot have any side effect, and the result must not depend on anything other than the value being matched and the matcher parameters). This requirement must be satisfied no matter how you define the matcher (e.g. using one of the methods described in the following recipes). In particular, a matcher can never call a mock function, as that will affect the state of the mock object and Google Mock. + +## Writing New Parameterized Matchers Quickly ## + +Sometimes you'll want to define a matcher that has parameters. For that you +can use the macro: +``` +MATCHER_P(name, param_name, description_string) { statements; } +``` +where the description string can be either `""` or a string expression +that references `negation` and `param_name`. + +For example: +``` +MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } +``` +will allow you to write: +``` + EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); +``` +which may lead to this message (assuming `n` is 10): +``` + Value of: Blah("a") + Expected: has absolute value 10 + Actual: -9 +``` + +Note that both the matcher description and its parameter are +printed, making the message human-friendly. + +In the matcher definition body, you can write `foo_type` to +reference the type of a parameter named `foo`. For example, in the +body of `MATCHER_P(HasAbsoluteValue, value)` above, you can write +`value_type` to refer to the type of `value`. + +Google Mock also provides `MATCHER_P2`, `MATCHER_P3`, ..., up to +`MATCHER_P10` to support multi-parameter matchers: +``` +MATCHER_Pk(name, param_1, ..., param_k, description_string) { statements; } +``` + +Please note that the custom description string is for a particular +**instance** of the matcher, where the parameters have been bound to +actual values. Therefore usually you'll want the parameter values to +be part of the description. Google Mock lets you do that by +referencing the matcher parameters in the description string +expression. + +For example, +``` + using ::testing::PrintToString; + MATCHER_P2(InClosedRange, low, hi, + std::string(negation ? "isn't" : "is") + " in range [" + + PrintToString(low) + ", " + PrintToString(hi) + "]") { + return low <= arg && arg <= hi; + } + ... + EXPECT_THAT(3, InClosedRange(4, 6)); +``` +would generate a failure that contains the message: +``` + Expected: is in range [4, 6] +``` + +If you specify `""` as the description, the failure message will +contain the sequence of words in the matcher name followed by the +parameter values printed as a tuple. For example, +``` + MATCHER_P2(InClosedRange, low, hi, "") { ... } + ... + EXPECT_THAT(3, InClosedRange(4, 6)); +``` +would generate a failure that contains the text: +``` + Expected: in closed range (4, 6) +``` + +For the purpose of typing, you can view +``` +MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } +``` +as shorthand for +``` +template +FooMatcherPk +Foo(p1_type p1, ..., pk_type pk) { ... } +``` + +When you write `Foo(v1, ..., vk)`, the compiler infers the types of +the parameters `v1`, ..., and `vk` for you. If you are not happy with +the result of the type inference, you can specify the types by +explicitly instantiating the template, as in `Foo(5, false)`. +As said earlier, you don't get to (or need to) specify +`arg_type` as that's determined by the context in which the matcher +is used. + +You can assign the result of expression `Foo(p1, ..., pk)` to a +variable of type `FooMatcherPk`. This can be +useful when composing matchers. Matchers that don't have a parameter +or have only one parameter have special types: you can assign `Foo()` +to a `FooMatcher`-typed variable, and assign `Foo(p)` to a +`FooMatcherP`-typed variable. + +While you can instantiate a matcher template with reference types, +passing the parameters by pointer usually makes your code more +readable. If, however, you still want to pass a parameter by +reference, be aware that in the failure message generated by the +matcher you will see the value of the referenced object but not its +address. + +You can overload matchers with different numbers of parameters: +``` +MATCHER_P(Blah, a, description_string_1) { ... } +MATCHER_P2(Blah, a, b, description_string_2) { ... } +``` + +While it's tempting to always use the `MATCHER*` macros when defining +a new matcher, you should also consider implementing +`MatcherInterface` or using `MakePolymorphicMatcher()` instead (see +the recipes that follow), especially if you need to use the matcher a +lot. While these approaches require more work, they give you more +control on the types of the value being matched and the matcher +parameters, which in general leads to better compiler error messages +that pay off in the long run. They also allow overloading matchers +based on parameter types (as opposed to just based on the number of +parameters). + +## Writing New Monomorphic Matchers ## + +A matcher of argument type `T` implements +`::testing::MatcherInterface` and does two things: it tests whether a +value of type `T` matches the matcher, and can describe what kind of +values it matches. The latter ability is used for generating readable +error messages when expectations are violated. + +The interface looks like this: + +``` +class MatchResultListener { + public: + ... + // Streams x to the underlying ostream; does nothing if the ostream + // is NULL. + template + MatchResultListener& operator<<(const T& x); + + // Returns the underlying ostream. + ::std::ostream* stream(); +}; + +template +class MatcherInterface { + public: + virtual ~MatcherInterface(); + + // Returns true iff the matcher matches x; also explains the match + // result to 'listener'. + virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; + + // Describes this matcher to an ostream. + virtual void DescribeTo(::std::ostream* os) const = 0; + + // Describes the negation of this matcher to an ostream. + virtual void DescribeNegationTo(::std::ostream* os) const; +}; +``` + +If you need a custom matcher but `Truly()` is not a good option (for +example, you may not be happy with the way `Truly(predicate)` +describes itself, or you may want your matcher to be polymorphic as +`Eq(value)` is), you can define a matcher to do whatever you want in +two steps: first implement the matcher interface, and then define a +factory function to create a matcher instance. The second step is not +strictly needed but it makes the syntax of using the matcher nicer. + +For example, you can define a matcher to test whether an `int` is +divisible by 7 and then use it like this: +``` +using ::testing::MakeMatcher; +using ::testing::Matcher; +using ::testing::MatcherInterface; +using ::testing::MatchResultListener; + +class DivisibleBy7Matcher : public MatcherInterface { + public: + virtual bool MatchAndExplain(int n, MatchResultListener* listener) const { + return (n % 7) == 0; + } + + virtual void DescribeTo(::std::ostream* os) const { + *os << "is divisible by 7"; + } + + virtual void DescribeNegationTo(::std::ostream* os) const { + *os << "is not divisible by 7"; + } +}; + +inline Matcher DivisibleBy7() { + return MakeMatcher(new DivisibleBy7Matcher); +} +... + + EXPECT_CALL(foo, Bar(DivisibleBy7())); +``` + +You may improve the matcher message by streaming additional +information to the `listener` argument in `MatchAndExplain()`: + +``` +class DivisibleBy7Matcher : public MatcherInterface { + public: + virtual bool MatchAndExplain(int n, + MatchResultListener* listener) const { + const int remainder = n % 7; + if (remainder != 0) { + *listener << "the remainder is " << remainder; + } + return remainder == 0; + } + ... +}; +``` + +Then, `EXPECT_THAT(x, DivisibleBy7());` may general a message like this: +``` +Value of: x +Expected: is divisible by 7 + Actual: 23 (the remainder is 2) +``` + +## Writing New Polymorphic Matchers ## + +You've learned how to write your own matchers in the previous +recipe. Just one problem: a matcher created using `MakeMatcher()` only +works for one particular type of arguments. If you want a +_polymorphic_ matcher that works with arguments of several types (for +instance, `Eq(x)` can be used to match a `value` as long as `value` == +`x` compiles -- `value` and `x` don't have to share the same type), +you can learn the trick from `"gmock/gmock-matchers.h"` but it's a bit +involved. + +Fortunately, most of the time you can define a polymorphic matcher +easily with the help of `MakePolymorphicMatcher()`. Here's how you can +define `NotNull()` as an example: + +``` +using ::testing::MakePolymorphicMatcher; +using ::testing::MatchResultListener; +using ::testing::NotNull; +using ::testing::PolymorphicMatcher; + +class NotNullMatcher { + public: + // To implement a polymorphic matcher, first define a COPYABLE class + // that has three members MatchAndExplain(), DescribeTo(), and + // DescribeNegationTo(), like the following. + + // In this example, we want to use NotNull() with any pointer, so + // MatchAndExplain() accepts a pointer of any type as its first argument. + // In general, you can define MatchAndExplain() as an ordinary method or + // a method template, or even overload it. + template + bool MatchAndExplain(T* p, + MatchResultListener* /* listener */) const { + return p != NULL; + } + + // Describes the property of a value matching this matcher. + void DescribeTo(::std::ostream* os) const { *os << "is not NULL"; } + + // Describes the property of a value NOT matching this matcher. + void DescribeNegationTo(::std::ostream* os) const { *os << "is NULL"; } +}; + +// To construct a polymorphic matcher, pass an instance of the class +// to MakePolymorphicMatcher(). Note the return type. +inline PolymorphicMatcher NotNull() { + return MakePolymorphicMatcher(NotNullMatcher()); +} +... + + EXPECT_CALL(foo, Bar(NotNull())); // The argument must be a non-NULL pointer. +``` + +**Note:** Your polymorphic matcher class does **not** need to inherit from +`MatcherInterface` or any other class, and its methods do **not** need +to be virtual. + +Like in a monomorphic matcher, you may explain the match result by +streaming additional information to the `listener` argument in +`MatchAndExplain()`. + +## Writing New Cardinalities ## + +A cardinality is used in `Times()` to tell Google Mock how many times +you expect a call to occur. It doesn't have to be exact. For example, +you can say `AtLeast(5)` or `Between(2, 4)`. + +If the built-in set of cardinalities doesn't suit you, you are free to +define your own by implementing the following interface (in namespace +`testing`): + +``` +class CardinalityInterface { + public: + virtual ~CardinalityInterface(); + + // Returns true iff call_count calls will satisfy this cardinality. + virtual bool IsSatisfiedByCallCount(int call_count) const = 0; + + // Returns true iff call_count calls will saturate this cardinality. + virtual bool IsSaturatedByCallCount(int call_count) const = 0; + + // Describes self to an ostream. + virtual void DescribeTo(::std::ostream* os) const = 0; +}; +``` + +For example, to specify that a call must occur even number of times, +you can write + +``` +using ::testing::Cardinality; +using ::testing::CardinalityInterface; +using ::testing::MakeCardinality; + +class EvenNumberCardinality : public CardinalityInterface { + public: + virtual bool IsSatisfiedByCallCount(int call_count) const { + return (call_count % 2) == 0; + } + + virtual bool IsSaturatedByCallCount(int call_count) const { + return false; + } + + virtual void DescribeTo(::std::ostream* os) const { + *os << "called even number of times"; + } +}; + +Cardinality EvenNumber() { + return MakeCardinality(new EvenNumberCardinality); +} +... + + EXPECT_CALL(foo, Bar(3)) + .Times(EvenNumber()); +``` + +## Writing New Actions Quickly ## + +If the built-in actions don't work for you, and you find it +inconvenient to use `Invoke()`, you can use a macro from the `ACTION*` +family to quickly define a new action that can be used in your code as +if it's a built-in action. + +By writing +``` +ACTION(name) { statements; } +``` +in a namespace scope (i.e. not inside a class or function), you will +define an action with the given name that executes the statements. +The value returned by `statements` will be used as the return value of +the action. Inside the statements, you can refer to the K-th +(0-based) argument of the mock function as `argK`. For example: +``` +ACTION(IncrementArg1) { return ++(*arg1); } +``` +allows you to write +``` +... WillOnce(IncrementArg1()); +``` + +Note that you don't need to specify the types of the mock function +arguments. Rest assured that your code is type-safe though: +you'll get a compiler error if `*arg1` doesn't support the `++` +operator, or if the type of `++(*arg1)` isn't compatible with the mock +function's return type. + +Another example: +``` +ACTION(Foo) { + (*arg2)(5); + Blah(); + *arg1 = 0; + return arg0; +} +``` +defines an action `Foo()` that invokes argument #2 (a function pointer) +with 5, calls function `Blah()`, sets the value pointed to by argument +#1 to 0, and returns argument #0. + +For more convenience and flexibility, you can also use the following +pre-defined symbols in the body of `ACTION`: + +| `argK_type` | The type of the K-th (0-based) argument of the mock function | +|:------------|:-------------------------------------------------------------| +| `args` | All arguments of the mock function as a tuple | +| `args_type` | The type of all arguments of the mock function as a tuple | +| `return_type` | The return type of the mock function | +| `function_type` | The type of the mock function | + +For example, when using an `ACTION` as a stub action for mock function: +``` +int DoSomething(bool flag, int* ptr); +``` +we have: + +| **Pre-defined Symbol** | **Is Bound To** | +|:-----------------------|:----------------| +| `arg0` | the value of `flag` | +| `arg0_type` | the type `bool` | +| `arg1` | the value of `ptr` | +| `arg1_type` | the type `int*` | +| `args` | the tuple `(flag, ptr)` | +| `args_type` | the type `::testing::tuple` | +| `return_type` | the type `int` | +| `function_type` | the type `int(bool, int*)` | + +## Writing New Parameterized Actions Quickly ## + +Sometimes you'll want to parameterize an action you define. For that +we have another macro +``` +ACTION_P(name, param) { statements; } +``` + +For example, +``` +ACTION_P(Add, n) { return arg0 + n; } +``` +will allow you to write +``` +// Returns argument #0 + 5. +... WillOnce(Add(5)); +``` + +For convenience, we use the term _arguments_ for the values used to +invoke the mock function, and the term _parameters_ for the values +used to instantiate an action. + +Note that you don't need to provide the type of the parameter either. +Suppose the parameter is named `param`, you can also use the +Google-Mock-defined symbol `param_type` to refer to the type of the +parameter as inferred by the compiler. For example, in the body of +`ACTION_P(Add, n)` above, you can write `n_type` for the type of `n`. + +Google Mock also provides `ACTION_P2`, `ACTION_P3`, and etc to support +multi-parameter actions. For example, +``` +ACTION_P2(ReturnDistanceTo, x, y) { + double dx = arg0 - x; + double dy = arg1 - y; + return sqrt(dx*dx + dy*dy); +} +``` +lets you write +``` +... WillOnce(ReturnDistanceTo(5.0, 26.5)); +``` + +You can view `ACTION` as a degenerated parameterized action where the +number of parameters is 0. + +You can also easily define actions overloaded on the number of parameters: +``` +ACTION_P(Plus, a) { ... } +ACTION_P2(Plus, a, b) { ... } +``` + +## Restricting the Type of an Argument or Parameter in an ACTION ## + +For maximum brevity and reusability, the `ACTION*` macros don't ask +you to provide the types of the mock function arguments and the action +parameters. Instead, we let the compiler infer the types for us. + +Sometimes, however, we may want to be more explicit about the types. +There are several tricks to do that. For example: +``` +ACTION(Foo) { + // Makes sure arg0 can be converted to int. + int n = arg0; + ... use n instead of arg0 here ... +} + +ACTION_P(Bar, param) { + // Makes sure the type of arg1 is const char*. + ::testing::StaticAssertTypeEq(); + + // Makes sure param can be converted to bool. + bool flag = param; +} +``` +where `StaticAssertTypeEq` is a compile-time assertion in Google Test +that verifies two types are the same. + +## Writing New Action Templates Quickly ## + +Sometimes you want to give an action explicit template parameters that +cannot be inferred from its value parameters. `ACTION_TEMPLATE()` +supports that and can be viewed as an extension to `ACTION()` and +`ACTION_P*()`. + +The syntax: +``` +ACTION_TEMPLATE(ActionName, + HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), + AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } +``` + +defines an action template that takes _m_ explicit template parameters +and _n_ value parameters, where _m_ is between 1 and 10, and _n_ is +between 0 and 10. `name_i` is the name of the i-th template +parameter, and `kind_i` specifies whether it's a `typename`, an +integral constant, or a template. `p_i` is the name of the i-th value +parameter. + +Example: +``` +// DuplicateArg(output) converts the k-th argument of the mock +// function to type T and copies it to *output. +ACTION_TEMPLATE(DuplicateArg, + // Note the comma between int and k: + HAS_2_TEMPLATE_PARAMS(int, k, typename, T), + AND_1_VALUE_PARAMS(output)) { + *output = T(::testing::get(args)); +} +``` + +To create an instance of an action template, write: +``` + ActionName(v1, ..., v_n) +``` +where the `t`s are the template arguments and the +`v`s are the value arguments. The value argument +types are inferred by the compiler. For example: +``` +using ::testing::_; +... + int n; + EXPECT_CALL(mock, Foo(_, _)) + .WillOnce(DuplicateArg<1, unsigned char>(&n)); +``` + +If you want to explicitly specify the value argument types, you can +provide additional template arguments: +``` + ActionName(v1, ..., v_n) +``` +where `u_i` is the desired type of `v_i`. + +`ACTION_TEMPLATE` and `ACTION`/`ACTION_P*` can be overloaded on the +number of value parameters, but not on the number of template +parameters. Without the restriction, the meaning of the following is +unclear: + +``` + OverloadedAction(x); +``` + +Are we using a single-template-parameter action where `bool` refers to +the type of `x`, or a two-template-parameter action where the compiler +is asked to infer the type of `x`? + +## Using the ACTION Object's Type ## + +If you are writing a function that returns an `ACTION` object, you'll +need to know its type. The type depends on the macro used to define +the action and the parameter types. The rule is relatively simple: + +| **Given Definition** | **Expression** | **Has Type** | +|:---------------------|:---------------|:-------------| +| `ACTION(Foo)` | `Foo()` | `FooAction` | +| `ACTION_TEMPLATE(Foo, HAS_m_TEMPLATE_PARAMS(...), AND_0_VALUE_PARAMS())` | `Foo()` | `FooAction` | +| `ACTION_P(Bar, param)` | `Bar(int_value)` | `BarActionP` | +| `ACTION_TEMPLATE(Bar, HAS_m_TEMPLATE_PARAMS(...), AND_1_VALUE_PARAMS(p1))` | `Bar(int_value)` | `FooActionP` | +| `ACTION_P2(Baz, p1, p2)` | `Baz(bool_value, int_value)` | `BazActionP2` | +| `ACTION_TEMPLATE(Baz, HAS_m_TEMPLATE_PARAMS(...), AND_2_VALUE_PARAMS(p1, p2))`| `Baz(bool_value, int_value)` | `FooActionP2` | +| ... | ... | ... | + +Note that we have to pick different suffixes (`Action`, `ActionP`, +`ActionP2`, and etc) for actions with different numbers of value +parameters, or the action definitions cannot be overloaded on the +number of them. + +## Writing New Monomorphic Actions ## + +While the `ACTION*` macros are very convenient, sometimes they are +inappropriate. For example, despite the tricks shown in the previous +recipes, they don't let you directly specify the types of the mock +function arguments and the action parameters, which in general leads +to unoptimized compiler error messages that can baffle unfamiliar +users. They also don't allow overloading actions based on parameter +types without jumping through some hoops. + +An alternative to the `ACTION*` macros is to implement +`::testing::ActionInterface`, where `F` is the type of the mock +function in which the action will be used. For example: + +``` +template class ActionInterface { + public: + virtual ~ActionInterface(); + + // Performs the action. Result is the return type of function type + // F, and ArgumentTuple is the tuple of arguments of F. + // + // For example, if F is int(bool, const string&), then Result would + // be int, and ArgumentTuple would be ::testing::tuple. + virtual Result Perform(const ArgumentTuple& args) = 0; +}; + +using ::testing::_; +using ::testing::Action; +using ::testing::ActionInterface; +using ::testing::MakeAction; + +typedef int IncrementMethod(int*); + +class IncrementArgumentAction : public ActionInterface { + public: + virtual int Perform(const ::testing::tuple& args) { + int* p = ::testing::get<0>(args); // Grabs the first argument. + return *p++; + } +}; + +Action IncrementArgument() { + return MakeAction(new IncrementArgumentAction); +} +... + + EXPECT_CALL(foo, Baz(_)) + .WillOnce(IncrementArgument()); + + int n = 5; + foo.Baz(&n); // Should return 5 and change n to 6. +``` + +## Writing New Polymorphic Actions ## + +The previous recipe showed you how to define your own action. This is +all good, except that you need to know the type of the function in +which the action will be used. Sometimes that can be a problem. For +example, if you want to use the action in functions with _different_ +types (e.g. like `Return()` and `SetArgPointee()`). + +If an action can be used in several types of mock functions, we say +it's _polymorphic_. The `MakePolymorphicAction()` function template +makes it easy to define such an action: + +``` +namespace testing { + +template +PolymorphicAction MakePolymorphicAction(const Impl& impl); + +} // namespace testing +``` + +As an example, let's define an action that returns the second argument +in the mock function's argument list. The first step is to define an +implementation class: + +``` +class ReturnSecondArgumentAction { + public: + template + Result Perform(const ArgumentTuple& args) const { + // To get the i-th (0-based) argument, use ::testing::get(args). + return ::testing::get<1>(args); + } +}; +``` + +This implementation class does _not_ need to inherit from any +particular class. What matters is that it must have a `Perform()` +method template. This method template takes the mock function's +arguments as a tuple in a **single** argument, and returns the result of +the action. It can be either `const` or not, but must be invokable +with exactly one template argument, which is the result type. In other +words, you must be able to call `Perform(args)` where `R` is the +mock function's return type and `args` is its arguments in a tuple. + +Next, we use `MakePolymorphicAction()` to turn an instance of the +implementation class into the polymorphic action we need. It will be +convenient to have a wrapper for this: + +``` +using ::testing::MakePolymorphicAction; +using ::testing::PolymorphicAction; + +PolymorphicAction ReturnSecondArgument() { + return MakePolymorphicAction(ReturnSecondArgumentAction()); +} +``` + +Now, you can use this polymorphic action the same way you use the +built-in ones: + +``` +using ::testing::_; + +class MockFoo : public Foo { + public: + MOCK_METHOD2(DoThis, int(bool flag, int n)); + MOCK_METHOD3(DoThat, string(int x, const char* str1, const char* str2)); +}; +... + + MockFoo foo; + EXPECT_CALL(foo, DoThis(_, _)) + .WillOnce(ReturnSecondArgument()); + EXPECT_CALL(foo, DoThat(_, _, _)) + .WillOnce(ReturnSecondArgument()); + ... + foo.DoThis(true, 5); // Will return 5. + foo.DoThat(1, "Hi", "Bye"); // Will return "Hi". +``` + +## Teaching Google Mock How to Print Your Values ## + +When an uninteresting or unexpected call occurs, Google Mock prints the +argument values and the stack trace to help you debug. Assertion +macros like `EXPECT_THAT` and `EXPECT_EQ` also print the values in +question when the assertion fails. Google Mock and Google Test do this using +Google Test's user-extensible value printer. + +This printer knows how to print built-in C++ types, native arrays, STL +containers, and any type that supports the `<<` operator. For other +types, it prints the raw bytes in the value and hopes that you the +user can figure it out. +[Google Test's advanced guide](../../googletest/docs/AdvancedGuide.md#teaching-google-test-how-to-print-your-values) +explains how to extend the printer to do a better job at +printing your particular type than to dump the bytes. diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/DesignDoc.md vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/DesignDoc.md --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/DesignDoc.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/DesignDoc.md 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,280 @@ +This page discusses the design of new Google Mock features. + + + +# Macros for Defining Actions # + +## Problem ## + +Due to the lack of closures in C++, it currently requires some +non-trivial effort to define a custom action in Google Mock. For +example, suppose you want to "increment the value pointed to by the +second argument of the mock function and return it", you could write: + +``` +int IncrementArg1(Unused, int* p, Unused) { + return ++(*p); +} + +... WillOnce(Invoke(IncrementArg1)); +``` + +There are several things unsatisfactory about this approach: + + * Even though the action only cares about the second argument of the mock function, its definition needs to list other arguments as dummies. This is tedious. + * The defined action is usable only in mock functions that takes exactly 3 arguments - an unnecessary restriction. + * To use the action, one has to say `Invoke(IncrementArg1)`, which isn't as nice as `IncrementArg1()`. + +The latter two problems can be overcome using `MakePolymorphicAction()`, +but it requires much more boilerplate code: + +``` +class IncrementArg1Action { + public: + template + Result Perform(const ArgumentTuple& args) const { + return ++(*tr1::get<1>(args)); + } +}; + +PolymorphicAction IncrementArg1() { + return MakePolymorphicAction(IncrementArg1Action()); +} + +... WillOnce(IncrementArg1()); +``` + +Our goal is to allow defining custom actions with the least amount of +boiler-plate C++ requires. + +## Solution ## + +We propose to introduce a new macro: +``` +ACTION(name) { statements; } +``` + +Using this in a namespace scope will define an action with the given +name that executes the statements. Inside the statements, you can +refer to the K-th (0-based) argument of the mock function as `argK`. +For example: +``` +ACTION(IncrementArg1) { return ++(*arg1); } +``` +allows you to write +``` +... WillOnce(IncrementArg1()); +``` + +Note that you don't need to specify the types of the mock function +arguments, as brevity is a top design goal here. Rest assured that +your code is still type-safe though: you'll get a compiler error if +`*arg1` doesn't support the `++` operator, or if the type of +`++(*arg1)` isn't compatible with the mock function's return type. + +Another example: +``` +ACTION(Foo) { + (*arg2)(5); + Blah(); + *arg1 = 0; + return arg0; +} +``` +defines an action `Foo()` that invokes argument #2 (a function pointer) +with 5, calls function `Blah()`, sets the value pointed to by argument +#1 to 0, and returns argument #0. + +For more convenience and flexibility, you can also use the following +pre-defined symbols in the body of `ACTION`: + +| `argK_type` | The type of the K-th (0-based) argument of the mock function | +|:------------|:-------------------------------------------------------------| +| `args` | All arguments of the mock function as a tuple | +| `args_type` | The type of all arguments of the mock function as a tuple | +| `return_type` | The return type of the mock function | +| `function_type` | The type of the mock function | + +For example, when using an `ACTION` as a stub action for mock function: +``` +int DoSomething(bool flag, int* ptr); +``` +we have: +| **Pre-defined Symbol** | **Is Bound To** | +|:-----------------------|:----------------| +| `arg0` | the value of `flag` | +| `arg0_type` | the type `bool` | +| `arg1` | the value of `ptr` | +| `arg1_type` | the type `int*` | +| `args` | the tuple `(flag, ptr)` | +| `args_type` | the type `std::tr1::tuple` | +| `return_type` | the type `int` | +| `function_type` | the type `int(bool, int*)` | + +## Parameterized actions ## + +Sometimes you'll want to parameterize the action. For that we propose +another macro +``` +ACTION_P(name, param) { statements; } +``` + +For example, +``` +ACTION_P(Add, n) { return arg0 + n; } +``` +will allow you to write +``` +// Returns argument #0 + 5. +... WillOnce(Add(5)); +``` + +For convenience, we use the term _arguments_ for the values used to +invoke the mock function, and the term _parameters_ for the values +used to instantiate an action. + +Note that you don't need to provide the type of the parameter either. +Suppose the parameter is named `param`, you can also use the +Google-Mock-defined symbol `param_type` to refer to the type of the +parameter as inferred by the compiler. + +We will also provide `ACTION_P2`, `ACTION_P3`, and etc to support +multi-parameter actions. For example, +``` +ACTION_P2(ReturnDistanceTo, x, y) { + double dx = arg0 - x; + double dy = arg1 - y; + return sqrt(dx*dx + dy*dy); +} +``` +lets you write +``` +... WillOnce(ReturnDistanceTo(5.0, 26.5)); +``` + +You can view `ACTION` as a degenerated parameterized action where the +number of parameters is 0. + +## Advanced Usages ## + +### Overloading Actions ### + +You can easily define actions overloaded on the number of parameters: +``` +ACTION_P(Plus, a) { ... } +ACTION_P2(Plus, a, b) { ... } +``` + +### Restricting the Type of an Argument or Parameter ### + +For maximum brevity and reusability, the `ACTION*` macros don't let +you specify the types of the mock function arguments and the action +parameters. Instead, we let the compiler infer the types for us. + +Sometimes, however, we may want to be more explicit about the types. +There are several tricks to do that. For example: +``` +ACTION(Foo) { + // Makes sure arg0 can be converted to int. + int n = arg0; + ... use n instead of arg0 here ... +} + +ACTION_P(Bar, param) { + // Makes sure the type of arg1 is const char*. + ::testing::StaticAssertTypeEq(); + + // Makes sure param can be converted to bool. + bool flag = param; +} +``` +where `StaticAssertTypeEq` is a compile-time assertion we plan to add to +Google Test (the name is chosen to match `static_assert` in C++0x). + +### Using the ACTION Object's Type ### + +If you are writing a function that returns an `ACTION` object, you'll +need to know its type. The type depends on the macro used to define +the action and the parameter types. The rule is relatively simple: +| **Given Definition** | **Expression** | **Has Type** | +|:---------------------|:---------------|:-------------| +| `ACTION(Foo)` | `Foo()` | `FooAction` | +| `ACTION_P(Bar, param)` | `Bar(int_value)` | `BarActionP` | +| `ACTION_P2(Baz, p1, p2)` | `Baz(bool_value, int_value)` | `BazActionP2` | +| ... | ... | ... | + +Note that we have to pick different suffixes (`Action`, `ActionP`, +`ActionP2`, and etc) for actions with different numbers of parameters, +or the action definitions cannot be overloaded on the number of +parameters. + +## When to Use ## + +While the new macros are very convenient, please also consider other +means of implementing actions (e.g. via `ActionInterface` or +`MakePolymorphicAction()`), especially if you need to use the defined +action a lot. While the other approaches require more work, they give +you more control on the types of the mock function arguments and the +action parameters, which in general leads to better compiler error +messages that pay off in the long run. They also allow overloading +actions based on parameter types, as opposed to just the number of +parameters. + +## Related Work ## + +As you may have realized, the `ACTION*` macros resemble closures (also +known as lambda expressions or anonymous functions). Indeed, both of +them seek to lower the syntactic overhead for defining a function. + +C++0x will support lambdas, but they are not part of C++ right now. +Some non-standard libraries (most notably BLL or Boost Lambda Library) +try to alleviate this problem. However, they are not a good choice +for defining actions as: + + * They are non-standard and not widely installed. Google Mock only depends on standard libraries and `tr1::tuple`, which is part of the new C++ standard and comes with gcc 4+. We want to keep it that way. + * They are not trivial to learn. + * They will become obsolete when C++0x's lambda feature is widely supported. We don't want to make our users use a dying library. + * Since they are based on operators, they are rather ad hoc: you cannot use statements, and you cannot pass the lambda arguments to a function, for example. + * They have subtle semantics that easily confuses new users. For example, in expression `_1++ + foo++`, `foo` will be incremented only once where the expression is evaluated, while `_1` will be incremented every time the unnamed function is invoked. This is far from intuitive. + +`ACTION*` avoid all these problems. + +## Future Improvements ## + +There may be a need for composing `ACTION*` definitions (i.e. invoking +another `ACTION` inside the definition of one `ACTION*`). We are not +sure we want it yet, as one can get a similar effect by putting +`ACTION` definitions in function templates and composing the function +templates. We'll revisit this based on user feedback. + +The reason we don't allow `ACTION*()` inside a function body is that +the current C++ standard doesn't allow function-local types to be used +to instantiate templates. The upcoming C++0x standard will lift this +restriction. Once this feature is widely supported by compilers, we +can revisit the implementation and add support for using `ACTION*()` +inside a function. + +C++0x will also support lambda expressions. When they become +available, we may want to support using lambdas as actions. + +# Macros for Defining Matchers # + +Once the macros for defining actions are implemented, we plan to do +the same for matchers: + +``` +MATCHER(name) { statements; } +``` + +where you can refer to the value being matched as `arg`. For example, +given: + +``` +MATCHER(IsPositive) { return arg > 0; } +``` + +you can use `IsPositive()` as a matcher that matches a value iff it is +greater than 0. + +We will also add `MATCHER_P`, `MATCHER_P2`, and etc for parameterized +matchers. \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/Documentation.md vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/Documentation.md --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/Documentation.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/Documentation.md 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,15 @@ +This page lists all documentation markdown files for Google Mock **(the +current git version)** +-- **if you use a former version of Google Mock, please read the +documentation for that specific version instead (e.g. by checking out +the respective git branch/tag).** + + * [ForDummies](ForDummies.md) -- start here if you are new to Google Mock. + * [CheatSheet](CheatSheet.md) -- a quick reference. + * [CookBook](CookBook.md) -- recipes for doing various tasks using Google Mock. + * [FrequentlyAskedQuestions](FrequentlyAskedQuestions.md) -- check here before asking a question on the mailing list. + +To contribute code to Google Mock, read: + + * [CONTRIBUTING](../CONTRIBUTING.md) -- read this _before_ writing your first patch. + * [Pump Manual](../../googletest/docs/PumpManual.md) -- how we generate some of Google Mock's source files. diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/ForDummies.md vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/ForDummies.md --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/ForDummies.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/ForDummies.md 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,447 @@ + + +(**Note:** If you get compiler errors that you don't understand, be sure to consult [Google Mock Doctor](FrequentlyAskedQuestions.md#how-am-i-supposed-to-make-sense-of-these-horrible-template-errors).) + +# What Is Google C++ Mocking Framework? # +When you write a prototype or test, often it's not feasible or wise to rely on real objects entirely. A **mock object** implements the same interface as a real object (so it can be used as one), but lets you specify at run time how it will be used and what it should do (which methods will be called? in which order? how many times? with what arguments? what will they return? etc). + +**Note:** It is easy to confuse the term _fake objects_ with mock objects. Fakes and mocks actually mean very different things in the Test-Driven Development (TDD) community: + + * **Fake** objects have working implementations, but usually take some shortcut (perhaps to make the operations less expensive), which makes them not suitable for production. An in-memory file system would be an example of a fake. + * **Mocks** are objects pre-programmed with _expectations_, which form a specification of the calls they are expected to receive. + +If all this seems too abstract for you, don't worry - the most important thing to remember is that a mock allows you to check the _interaction_ between itself and code that uses it. The difference between fakes and mocks will become much clearer once you start to use mocks. + +**Google C++ Mocking Framework** (or **Google Mock** for short) is a library (sometimes we also call it a "framework" to make it sound cool) for creating mock classes and using them. It does to C++ what [jMock](http://www.jmock.org/) and [EasyMock](http://www.easymock.org/) do to Java. + +Using Google Mock involves three basic steps: + + 1. Use some simple macros to describe the interface you want to mock, and they will expand to the implementation of your mock class; + 1. Create some mock objects and specify its expectations and behavior using an intuitive syntax; + 1. Exercise code that uses the mock objects. Google Mock will catch any violation of the expectations as soon as it arises. + +# Why Google Mock? # +While mock objects help you remove unnecessary dependencies in tests and make them fast and reliable, using mocks manually in C++ is _hard_: + + * Someone has to implement the mocks. The job is usually tedious and error-prone. No wonder people go great distances to avoid it. + * The quality of those manually written mocks is a bit, uh, unpredictable. You may see some really polished ones, but you may also see some that were hacked up in a hurry and have all sorts of ad-hoc restrictions. + * The knowledge you gained from using one mock doesn't transfer to the next. + +In contrast, Java and Python programmers have some fine mock frameworks, which automate the creation of mocks. As a result, mocking is a proven effective technique and widely adopted practice in those communities. Having the right tool absolutely makes the difference. + +Google Mock was built to help C++ programmers. It was inspired by [jMock](http://www.jmock.org/) and [EasyMock](http://www.easymock.org/), but designed with C++'s specifics in mind. It is your friend if any of the following problems is bothering you: + + * You are stuck with a sub-optimal design and wish you had done more prototyping before it was too late, but prototyping in C++ is by no means "rapid". + * Your tests are slow as they depend on too many libraries or use expensive resources (e.g. a database). + * Your tests are brittle as some resources they use are unreliable (e.g. the network). + * You want to test how your code handles a failure (e.g. a file checksum error), but it's not easy to cause one. + * You need to make sure that your module interacts with other modules in the right way, but it's hard to observe the interaction; therefore you resort to observing the side effects at the end of the action, which is awkward at best. + * You want to "mock out" your dependencies, except that they don't have mock implementations yet; and, frankly, you aren't thrilled by some of those hand-written mocks. + +We encourage you to use Google Mock as: + + * a _design_ tool, for it lets you experiment with your interface design early and often. More iterations lead to better designs! + * a _testing_ tool to cut your tests' outbound dependencies and probe the interaction between your module and its collaborators. + +# Getting Started # +Using Google Mock is easy! Inside your C++ source file, just `#include` `"gtest/gtest.h"` and `"gmock/gmock.h"`, and you are ready to go. + +# A Case for Mock Turtles # +Let's look at an example. Suppose you are developing a graphics program that relies on a LOGO-like API for drawing. How would you test that it does the right thing? Well, you can run it and compare the screen with a golden screen snapshot, but let's admit it: tests like this are expensive to run and fragile (What if you just upgraded to a shiny new graphics card that has better anti-aliasing? Suddenly you have to update all your golden images.). It would be too painful if all your tests are like this. Fortunately, you learned about Dependency Injection and know the right thing to do: instead of having your application talk to the drawing API directly, wrap the API in an interface (say, `Turtle`) and code to that interface: + +``` +class Turtle { + ... + virtual ~Turtle() {} + virtual void PenUp() = 0; + virtual void PenDown() = 0; + virtual void Forward(int distance) = 0; + virtual void Turn(int degrees) = 0; + virtual void GoTo(int x, int y) = 0; + virtual int GetX() const = 0; + virtual int GetY() const = 0; +}; +``` + +(Note that the destructor of `Turtle` **must** be virtual, as is the case for **all** classes you intend to inherit from - otherwise the destructor of the derived class will not be called when you delete an object through a base pointer, and you'll get corrupted program states like memory leaks.) + +You can control whether the turtle's movement will leave a trace using `PenUp()` and `PenDown()`, and control its movement using `Forward()`, `Turn()`, and `GoTo()`. Finally, `GetX()` and `GetY()` tell you the current position of the turtle. + +Your program will normally use a real implementation of this interface. In tests, you can use a mock implementation instead. This allows you to easily check what drawing primitives your program is calling, with what arguments, and in which order. Tests written this way are much more robust (they won't break because your new machine does anti-aliasing differently), easier to read and maintain (the intent of a test is expressed in the code, not in some binary images), and run _much, much faster_. + +# Writing the Mock Class # +If you are lucky, the mocks you need to use have already been implemented by some nice people. If, however, you find yourself in the position to write a mock class, relax - Google Mock turns this task into a fun game! (Well, almost.) + +## How to Define It ## +Using the `Turtle` interface as example, here are the simple steps you need to follow: + + 1. Derive a class `MockTurtle` from `Turtle`. + 1. Take a _virtual_ function of `Turtle` (while it's possible to [mock non-virtual methods using templates](CookBook.md#mocking-nonvirtual-methods), it's much more involved). Count how many arguments it has. + 1. In the `public:` section of the child class, write `MOCK_METHODn();` (or `MOCK_CONST_METHODn();` if you are mocking a `const` method), where `n` is the number of the arguments; if you counted wrong, shame on you, and a compiler error will tell you so. + 1. Now comes the fun part: you take the function signature, cut-and-paste the _function name_ as the _first_ argument to the macro, and leave what's left as the _second_ argument (in case you're curious, this is the _type of the function_). + 1. Repeat until all virtual functions you want to mock are done. + +After the process, you should have something like: + +``` +#include "gmock/gmock.h" // Brings in Google Mock. +class MockTurtle : public Turtle { + public: + ... + MOCK_METHOD0(PenUp, void()); + MOCK_METHOD0(PenDown, void()); + MOCK_METHOD1(Forward, void(int distance)); + MOCK_METHOD1(Turn, void(int degrees)); + MOCK_METHOD2(GoTo, void(int x, int y)); + MOCK_CONST_METHOD0(GetX, int()); + MOCK_CONST_METHOD0(GetY, int()); +}; +``` + +You don't need to define these mock methods somewhere else - the `MOCK_METHOD*` macros will generate the definitions for you. It's that simple! Once you get the hang of it, you can pump out mock classes faster than your source-control system can handle your check-ins. + +**Tip:** If even this is too much work for you, you'll find the +`gmock_gen.py` tool in Google Mock's `scripts/generator/` directory (courtesy of the [cppclean](http://code.google.com/p/cppclean/) project) useful. This command-line +tool requires that you have Python 2.4 installed. You give it a C++ file and the name of an abstract class defined in it, +and it will print the definition of the mock class for you. Due to the +complexity of the C++ language, this script may not always work, but +it can be quite handy when it does. For more details, read the [user documentation](../scripts/generator/README). + +## Where to Put It ## +When you define a mock class, you need to decide where to put its definition. Some people put it in a `*_test.cc`. This is fine when the interface being mocked (say, `Foo`) is owned by the same person or team. Otherwise, when the owner of `Foo` changes it, your test could break. (You can't really expect `Foo`'s maintainer to fix every test that uses `Foo`, can you?) + +So, the rule of thumb is: if you need to mock `Foo` and it's owned by others, define the mock class in `Foo`'s package (better, in a `testing` sub-package such that you can clearly separate production code and testing utilities), and put it in a `mock_foo.h`. Then everyone can reference `mock_foo.h` from their tests. If `Foo` ever changes, there is only one copy of `MockFoo` to change, and only tests that depend on the changed methods need to be fixed. + +Another way to do it: you can introduce a thin layer `FooAdaptor` on top of `Foo` and code to this new interface. Since you own `FooAdaptor`, you can absorb changes in `Foo` much more easily. While this is more work initially, carefully choosing the adaptor interface can make your code easier to write and more readable (a net win in the long run), as you can choose `FooAdaptor` to fit your specific domain much better than `Foo` does. + +# Using Mocks in Tests # +Once you have a mock class, using it is easy. The typical work flow is: + + 1. Import the Google Mock names from the `testing` namespace such that you can use them unqualified (You only have to do it once per file. Remember that namespaces are a good idea and good for your health.). + 1. Create some mock objects. + 1. Specify your expectations on them (How many times will a method be called? With what arguments? What should it do? etc.). + 1. Exercise some code that uses the mocks; optionally, check the result using Google Test assertions. If a mock method is called more than expected or with wrong arguments, you'll get an error immediately. + 1. When a mock is destructed, Google Mock will automatically check whether all expectations on it have been satisfied. + +Here's an example: + +``` +#include "path/to/mock-turtle.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +using ::testing::AtLeast; // #1 + +TEST(PainterTest, CanDrawSomething) { + MockTurtle turtle; // #2 + EXPECT_CALL(turtle, PenDown()) // #3 + .Times(AtLeast(1)); + + Painter painter(&turtle); // #4 + + EXPECT_TRUE(painter.DrawCircle(0, 0, 10)); +} // #5 + +int main(int argc, char** argv) { + // The following line must be executed to initialize Google Mock + // (and Google Test) before running the tests. + ::testing::InitGoogleMock(&argc, argv); + return RUN_ALL_TESTS(); +} +``` + +As you might have guessed, this test checks that `PenDown()` is called at least once. If the `painter` object didn't call this method, your test will fail with a message like this: + +``` +path/to/my_test.cc:119: Failure +Actual function call count doesn't match this expectation: +Actually: never called; +Expected: called at least once. +``` + +**Tip 1:** If you run the test from an Emacs buffer, you can hit `` on the line number displayed in the error message to jump right to the failed expectation. + +**Tip 2:** If your mock objects are never deleted, the final verification won't happen. Therefore it's a good idea to use a heap leak checker in your tests when you allocate mocks on the heap. + +**Important note:** Google Mock requires expectations to be set **before** the mock functions are called, otherwise the behavior is **undefined**. In particular, you mustn't interleave `EXPECT_CALL()`s and calls to the mock functions. + +This means `EXPECT_CALL()` should be read as expecting that a call will occur _in the future_, not that a call has occurred. Why does Google Mock work like that? Well, specifying the expectation beforehand allows Google Mock to report a violation as soon as it arises, when the context (stack trace, etc) is still available. This makes debugging much easier. + +Admittedly, this test is contrived and doesn't do much. You can easily achieve the same effect without using Google Mock. However, as we shall reveal soon, Google Mock allows you to do _much more_ with the mocks. + +## Using Google Mock with Any Testing Framework ## +If you want to use something other than Google Test (e.g. [CppUnit](http://sourceforge.net/projects/cppunit/) or +[CxxTest](http://cxxtest.tigris.org/)) as your testing framework, just change the `main()` function in the previous section to: +``` +int main(int argc, char** argv) { + // The following line causes Google Mock to throw an exception on failure, + // which will be interpreted by your testing framework as a test failure. + ::testing::GTEST_FLAG(throw_on_failure) = true; + ::testing::InitGoogleMock(&argc, argv); + ... whatever your testing framework requires ... +} +``` + +This approach has a catch: it makes Google Mock throw an exception +from a mock object's destructor sometimes. With some compilers, this +sometimes causes the test program to crash. You'll still be able to +notice that the test has failed, but it's not a graceful failure. + +A better solution is to use Google Test's +[event listener API](../../googletest/docs/AdvancedGuide.md#extending-google-test-by-handling-test-events) +to report a test failure to your testing framework properly. You'll need to +implement the `OnTestPartResult()` method of the event listener interface, but it +should be straightforward. + +If this turns out to be too much work, we suggest that you stick with +Google Test, which works with Google Mock seamlessly (in fact, it is +technically part of Google Mock.). If there is a reason that you +cannot use Google Test, please let us know. + +# Setting Expectations # +The key to using a mock object successfully is to set the _right expectations_ on it. If you set the expectations too strict, your test will fail as the result of unrelated changes. If you set them too loose, bugs can slip through. You want to do it just right such that your test can catch exactly the kind of bugs you intend it to catch. Google Mock provides the necessary means for you to do it "just right." + +## General Syntax ## +In Google Mock we use the `EXPECT_CALL()` macro to set an expectation on a mock method. The general syntax is: + +``` +EXPECT_CALL(mock_object, method(matchers)) + .Times(cardinality) + .WillOnce(action) + .WillRepeatedly(action); +``` + +The macro has two arguments: first the mock object, and then the method and its arguments. Note that the two are separated by a comma (`,`), not a period (`.`). (Why using a comma? The answer is that it was necessary for technical reasons.) + +The macro can be followed by some optional _clauses_ that provide more information about the expectation. We'll discuss how each clause works in the coming sections. + +This syntax is designed to make an expectation read like English. For example, you can probably guess that + +``` +using ::testing::Return; +... +EXPECT_CALL(turtle, GetX()) + .Times(5) + .WillOnce(Return(100)) + .WillOnce(Return(150)) + .WillRepeatedly(Return(200)); +``` + +says that the `turtle` object's `GetX()` method will be called five times, it will return 100 the first time, 150 the second time, and then 200 every time. Some people like to call this style of syntax a Domain-Specific Language (DSL). + +**Note:** Why do we use a macro to do this? It serves two purposes: first it makes expectations easily identifiable (either by `grep` or by a human reader), and second it allows Google Mock to include the source file location of a failed expectation in messages, making debugging easier. + +## Matchers: What Arguments Do We Expect? ## +When a mock function takes arguments, we must specify what arguments we are expecting; for example: + +``` +// Expects the turtle to move forward by 100 units. +EXPECT_CALL(turtle, Forward(100)); +``` + +Sometimes you may not want to be too specific (Remember that talk about tests being too rigid? Over specification leads to brittle tests and obscures the intent of tests. Therefore we encourage you to specify only what's necessary - no more, no less.). If you care to check that `Forward()` will be called but aren't interested in its actual argument, write `_` as the argument, which means "anything goes": + +``` +using ::testing::_; +... +// Expects the turtle to move forward. +EXPECT_CALL(turtle, Forward(_)); +``` + +`_` is an instance of what we call **matchers**. A matcher is like a predicate and can test whether an argument is what we'd expect. You can use a matcher inside `EXPECT_CALL()` wherever a function argument is expected. + +A list of built-in matchers can be found in the [CheatSheet](CheatSheet.md). For example, here's the `Ge` (greater than or equal) matcher: + +``` +using ::testing::Ge; +... +EXPECT_CALL(turtle, Forward(Ge(100))); +``` + +This checks that the turtle will be told to go forward by at least 100 units. + +## Cardinalities: How Many Times Will It Be Called? ## +The first clause we can specify following an `EXPECT_CALL()` is `Times()`. We call its argument a **cardinality** as it tells _how many times_ the call should occur. It allows us to repeat an expectation many times without actually writing it as many times. More importantly, a cardinality can be "fuzzy", just like a matcher can be. This allows a user to express the intent of a test exactly. + +An interesting special case is when we say `Times(0)`. You may have guessed - it means that the function shouldn't be called with the given arguments at all, and Google Mock will report a Google Test failure whenever the function is (wrongfully) called. + +We've seen `AtLeast(n)` as an example of fuzzy cardinalities earlier. For the list of built-in cardinalities you can use, see the [CheatSheet](CheatSheet.md). + +The `Times()` clause can be omitted. **If you omit `Times()`, Google Mock will infer the cardinality for you.** The rules are easy to remember: + + * If **neither** `WillOnce()` **nor** `WillRepeatedly()` is in the `EXPECT_CALL()`, the inferred cardinality is `Times(1)`. + * If there are `n WillOnce()`'s but **no** `WillRepeatedly()`, where `n` >= 1, the cardinality is `Times(n)`. + * If there are `n WillOnce()`'s and **one** `WillRepeatedly()`, where `n` >= 0, the cardinality is `Times(AtLeast(n))`. + +**Quick quiz:** what do you think will happen if a function is expected to be called twice but actually called four times? + +## Actions: What Should It Do? ## +Remember that a mock object doesn't really have a working implementation? We as users have to tell it what to do when a method is invoked. This is easy in Google Mock. + +First, if the return type of a mock function is a built-in type or a pointer, the function has a **default action** (a `void` function will just return, a `bool` function will return `false`, and other functions will return 0). In addition, in C++ 11 and above, a mock function whose return type is default-constructible (i.e. has a default constructor) has a default action of returning a default-constructed value. If you don't say anything, this behavior will be used. + +Second, if a mock function doesn't have a default action, or the default action doesn't suit you, you can specify the action to be taken each time the expectation matches using a series of `WillOnce()` clauses followed by an optional `WillRepeatedly()`. For example, + +``` +using ::testing::Return; +... +EXPECT_CALL(turtle, GetX()) + .WillOnce(Return(100)) + .WillOnce(Return(200)) + .WillOnce(Return(300)); +``` + +This says that `turtle.GetX()` will be called _exactly three times_ (Google Mock inferred this from how many `WillOnce()` clauses we've written, since we didn't explicitly write `Times()`), and will return 100, 200, and 300 respectively. + +``` +using ::testing::Return; +... +EXPECT_CALL(turtle, GetY()) + .WillOnce(Return(100)) + .WillOnce(Return(200)) + .WillRepeatedly(Return(300)); +``` + +says that `turtle.GetY()` will be called _at least twice_ (Google Mock knows this as we've written two `WillOnce()` clauses and a `WillRepeatedly()` while having no explicit `Times()`), will return 100 the first time, 200 the second time, and 300 from the third time on. + +Of course, if you explicitly write a `Times()`, Google Mock will not try to infer the cardinality itself. What if the number you specified is larger than there are `WillOnce()` clauses? Well, after all `WillOnce()`s are used up, Google Mock will do the _default_ action for the function every time (unless, of course, you have a `WillRepeatedly()`.). + +What can we do inside `WillOnce()` besides `Return()`? You can return a reference using `ReturnRef(variable)`, or invoke a pre-defined function, among [others](CheatSheet.md#actions). + +**Important note:** The `EXPECT_CALL()` statement evaluates the action clause only once, even though the action may be performed many times. Therefore you must be careful about side effects. The following may not do what you want: + +``` +int n = 100; +EXPECT_CALL(turtle, GetX()) +.Times(4) +.WillRepeatedly(Return(n++)); +``` + +Instead of returning 100, 101, 102, ..., consecutively, this mock function will always return 100 as `n++` is only evaluated once. Similarly, `Return(new Foo)` will create a new `Foo` object when the `EXPECT_CALL()` is executed, and will return the same pointer every time. If you want the side effect to happen every time, you need to define a custom action, which we'll teach in the [CookBook](CookBook.md). + +Time for another quiz! What do you think the following means? + +``` +using ::testing::Return; +... +EXPECT_CALL(turtle, GetY()) +.Times(4) +.WillOnce(Return(100)); +``` + +Obviously `turtle.GetY()` is expected to be called four times. But if you think it will return 100 every time, think twice! Remember that one `WillOnce()` clause will be consumed each time the function is invoked and the default action will be taken afterwards. So the right answer is that `turtle.GetY()` will return 100 the first time, but **return 0 from the second time on**, as returning 0 is the default action for `int` functions. + +## Using Multiple Expectations ## +So far we've only shown examples where you have a single expectation. More realistically, you're going to specify expectations on multiple mock methods, which may be from multiple mock objects. + +By default, when a mock method is invoked, Google Mock will search the expectations in the **reverse order** they are defined, and stop when an active expectation that matches the arguments is found (you can think of it as "newer rules override older ones."). If the matching expectation cannot take any more calls, you will get an upper-bound-violated failure. Here's an example: + +``` +using ::testing::_; +... +EXPECT_CALL(turtle, Forward(_)); // #1 +EXPECT_CALL(turtle, Forward(10)) // #2 + .Times(2); +``` + +If `Forward(10)` is called three times in a row, the third time it will be an error, as the last matching expectation (#2) has been saturated. If, however, the third `Forward(10)` call is replaced by `Forward(20)`, then it would be OK, as now #1 will be the matching expectation. + +**Side note:** Why does Google Mock search for a match in the _reverse_ order of the expectations? The reason is that this allows a user to set up the default expectations in a mock object's constructor or the test fixture's set-up phase and then customize the mock by writing more specific expectations in the test body. So, if you have two expectations on the same method, you want to put the one with more specific matchers **after** the other, or the more specific rule would be shadowed by the more general one that comes after it. + +## Ordered vs Unordered Calls ## +By default, an expectation can match a call even though an earlier expectation hasn't been satisfied. In other words, the calls don't have to occur in the order the expectations are specified. + +Sometimes, you may want all the expected calls to occur in a strict order. To say this in Google Mock is easy: + +``` +using ::testing::InSequence; +... +TEST(FooTest, DrawsLineSegment) { + ... + { + InSequence dummy; + + EXPECT_CALL(turtle, PenDown()); + EXPECT_CALL(turtle, Forward(100)); + EXPECT_CALL(turtle, PenUp()); + } + Foo(); +} +``` + +By creating an object of type `InSequence`, all expectations in its scope are put into a _sequence_ and have to occur _sequentially_. Since we are just relying on the constructor and destructor of this object to do the actual work, its name is really irrelevant. + +In this example, we test that `Foo()` calls the three expected functions in the order as written. If a call is made out-of-order, it will be an error. + +(What if you care about the relative order of some of the calls, but not all of them? Can you specify an arbitrary partial order? The answer is ... yes! If you are impatient, the details can be found in the [CookBook](CookBook.md#expecting-partially-ordered-calls).) + +## All Expectations Are Sticky (Unless Said Otherwise) ## +Now let's do a quick quiz to see how well you can use this mock stuff already. How would you test that the turtle is asked to go to the origin _exactly twice_ (you want to ignore any other instructions it receives)? + +After you've come up with your answer, take a look at ours and compare notes (solve it yourself first - don't cheat!): + +``` +using ::testing::_; +... +EXPECT_CALL(turtle, GoTo(_, _)) // #1 + .Times(AnyNumber()); +EXPECT_CALL(turtle, GoTo(0, 0)) // #2 + .Times(2); +``` + +Suppose `turtle.GoTo(0, 0)` is called three times. In the third time, Google Mock will see that the arguments match expectation #2 (remember that we always pick the last matching expectation). Now, since we said that there should be only two such calls, Google Mock will report an error immediately. This is basically what we've told you in the "Using Multiple Expectations" section above. + +This example shows that **expectations in Google Mock are "sticky" by default**, in the sense that they remain active even after we have reached their invocation upper bounds. This is an important rule to remember, as it affects the meaning of the spec, and is **different** to how it's done in many other mocking frameworks (Why'd we do that? Because we think our rule makes the common cases easier to express and understand.). + +Simple? Let's see if you've really understood it: what does the following code say? + +``` +using ::testing::Return; +... +for (int i = n; i > 0; i--) { + EXPECT_CALL(turtle, GetX()) + .WillOnce(Return(10*i)); +} +``` + +If you think it says that `turtle.GetX()` will be called `n` times and will return 10, 20, 30, ..., consecutively, think twice! The problem is that, as we said, expectations are sticky. So, the second time `turtle.GetX()` is called, the last (latest) `EXPECT_CALL()` statement will match, and will immediately lead to an "upper bound exceeded" error - this piece of code is not very useful! + +One correct way of saying that `turtle.GetX()` will return 10, 20, 30, ..., is to explicitly say that the expectations are _not_ sticky. In other words, they should _retire_ as soon as they are saturated: + +``` +using ::testing::Return; +... +for (int i = n; i > 0; i--) { + EXPECT_CALL(turtle, GetX()) + .WillOnce(Return(10*i)) + .RetiresOnSaturation(); +} +``` + +And, there's a better way to do it: in this case, we expect the calls to occur in a specific order, and we line up the actions to match the order. Since the order is important here, we should make it explicit using a sequence: + +``` +using ::testing::InSequence; +using ::testing::Return; +... +{ + InSequence s; + + for (int i = 1; i <= n; i++) { + EXPECT_CALL(turtle, GetX()) + .WillOnce(Return(10*i)) + .RetiresOnSaturation(); + } +} +``` + +By the way, the other situation where an expectation may _not_ be sticky is when it's in a sequence - as soon as another expectation that comes after it in the sequence has been used, it automatically retires (and will never be used to match any call). + +## Uninteresting Calls ## +A mock object may have many methods, and not all of them are that interesting. For example, in some tests we may not care about how many times `GetX()` and `GetY()` get called. + +In Google Mock, if you are not interested in a method, just don't say anything about it. If a call to this method occurs, you'll see a warning in the test output, but it won't be a failure. + +# What Now? # +Congratulations! You've learned enough about Google Mock to start using it. Now, you might want to join the [googlemock](http://groups.google.com/group/googlemock) discussion group and actually write some tests using Google Mock - it will be fun. Hey, it may even be addictive - you've been warned. + +Then, if you feel like increasing your mock quotient, you should move on to the [CookBook](CookBook.md). You can learn many advanced features of Google Mock there -- and advance your level of enjoyment and testing bliss. diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/FrequentlyAskedQuestions.md vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/FrequentlyAskedQuestions.md --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/FrequentlyAskedQuestions.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/FrequentlyAskedQuestions.md 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,628 @@ + + +Please send your questions to the +[googlemock](http://groups.google.com/group/googlemock) discussion +group. If you need help with compiler errors, make sure you have +tried [Google Mock Doctor](#How_am_I_supposed_to_make_sense_of_these_horrible_template_error.md) first. + +## When I call a method on my mock object, the method for the real object is invoked instead. What's the problem? ## + +In order for a method to be mocked, it must be _virtual_, unless you use the [high-perf dependency injection technique](CookBook.md#mocking-nonvirtual-methods). + +## I wrote some matchers. After I upgraded to a new version of Google Mock, they no longer compile. What's going on? ## + +After version 1.4.0 of Google Mock was released, we had an idea on how +to make it easier to write matchers that can generate informative +messages efficiently. We experimented with this idea and liked what +we saw. Therefore we decided to implement it. + +Unfortunately, this means that if you have defined your own matchers +by implementing `MatcherInterface` or using `MakePolymorphicMatcher()`, +your definitions will no longer compile. Matchers defined using the +`MATCHER*` family of macros are not affected. + +Sorry for the hassle if your matchers are affected. We believe it's +in everyone's long-term interest to make this change sooner than +later. Fortunately, it's usually not hard to migrate an existing +matcher to the new API. Here's what you need to do: + +If you wrote your matcher like this: +``` +// Old matcher definition that doesn't work with the latest +// Google Mock. +using ::testing::MatcherInterface; +... +class MyWonderfulMatcher : public MatcherInterface { + public: + ... + virtual bool Matches(MyType value) const { + // Returns true if value matches. + return value.GetFoo() > 5; + } + ... +}; +``` + +you'll need to change it to: +``` +// New matcher definition that works with the latest Google Mock. +using ::testing::MatcherInterface; +using ::testing::MatchResultListener; +... +class MyWonderfulMatcher : public MatcherInterface { + public: + ... + virtual bool MatchAndExplain(MyType value, + MatchResultListener* listener) const { + // Returns true if value matches. + return value.GetFoo() > 5; + } + ... +}; +``` +(i.e. rename `Matches()` to `MatchAndExplain()` and give it a second +argument of type `MatchResultListener*`.) + +If you were also using `ExplainMatchResultTo()` to improve the matcher +message: +``` +// Old matcher definition that doesn't work with the lastest +// Google Mock. +using ::testing::MatcherInterface; +... +class MyWonderfulMatcher : public MatcherInterface { + public: + ... + virtual bool Matches(MyType value) const { + // Returns true if value matches. + return value.GetFoo() > 5; + } + + virtual void ExplainMatchResultTo(MyType value, + ::std::ostream* os) const { + // Prints some helpful information to os to help + // a user understand why value matches (or doesn't match). + *os << "the Foo property is " << value.GetFoo(); + } + ... +}; +``` + +you should move the logic of `ExplainMatchResultTo()` into +`MatchAndExplain()`, using the `MatchResultListener` argument where +the `::std::ostream` was used: +``` +// New matcher definition that works with the latest Google Mock. +using ::testing::MatcherInterface; +using ::testing::MatchResultListener; +... +class MyWonderfulMatcher : public MatcherInterface { + public: + ... + virtual bool MatchAndExplain(MyType value, + MatchResultListener* listener) const { + // Returns true if value matches. + *listener << "the Foo property is " << value.GetFoo(); + return value.GetFoo() > 5; + } + ... +}; +``` + +If your matcher is defined using `MakePolymorphicMatcher()`: +``` +// Old matcher definition that doesn't work with the latest +// Google Mock. +using ::testing::MakePolymorphicMatcher; +... +class MyGreatMatcher { + public: + ... + bool Matches(MyType value) const { + // Returns true if value matches. + return value.GetBar() < 42; + } + ... +}; +... MakePolymorphicMatcher(MyGreatMatcher()) ... +``` + +you should rename the `Matches()` method to `MatchAndExplain()` and +add a `MatchResultListener*` argument (the same as what you need to do +for matchers defined by implementing `MatcherInterface`): +``` +// New matcher definition that works with the latest Google Mock. +using ::testing::MakePolymorphicMatcher; +using ::testing::MatchResultListener; +... +class MyGreatMatcher { + public: + ... + bool MatchAndExplain(MyType value, + MatchResultListener* listener) const { + // Returns true if value matches. + return value.GetBar() < 42; + } + ... +}; +... MakePolymorphicMatcher(MyGreatMatcher()) ... +``` + +If your polymorphic matcher uses `ExplainMatchResultTo()` for better +failure messages: +``` +// Old matcher definition that doesn't work with the latest +// Google Mock. +using ::testing::MakePolymorphicMatcher; +... +class MyGreatMatcher { + public: + ... + bool Matches(MyType value) const { + // Returns true if value matches. + return value.GetBar() < 42; + } + ... +}; +void ExplainMatchResultTo(const MyGreatMatcher& matcher, + MyType value, + ::std::ostream* os) { + // Prints some helpful information to os to help + // a user understand why value matches (or doesn't match). + *os << "the Bar property is " << value.GetBar(); +} +... MakePolymorphicMatcher(MyGreatMatcher()) ... +``` + +you'll need to move the logic inside `ExplainMatchResultTo()` to +`MatchAndExplain()`: +``` +// New matcher definition that works with the latest Google Mock. +using ::testing::MakePolymorphicMatcher; +using ::testing::MatchResultListener; +... +class MyGreatMatcher { + public: + ... + bool MatchAndExplain(MyType value, + MatchResultListener* listener) const { + // Returns true if value matches. + *listener << "the Bar property is " << value.GetBar(); + return value.GetBar() < 42; + } + ... +}; +... MakePolymorphicMatcher(MyGreatMatcher()) ... +``` + +For more information, you can read these +[two](CookBook.md#writing-new-monomorphic-matchers) +[recipes](CookBook.md#writing-new-polymorphic-matchers) +from the cookbook. As always, you +are welcome to post questions on `googlemock@googlegroups.com` if you +need any help. + +## When using Google Mock, do I have to use Google Test as the testing framework? I have my favorite testing framework and don't want to switch. ## + +Google Mock works out of the box with Google Test. However, it's easy +to configure it to work with any testing framework of your choice. +[Here](ForDummies.md#using-google-mock-with-any-testing-framework) is how. + +## How am I supposed to make sense of these horrible template errors? ## + +If you are confused by the compiler errors gcc threw at you, +try consulting the _Google Mock Doctor_ tool first. What it does is to +scan stdin for gcc error messages, and spit out diagnoses on the +problems (we call them diseases) your code has. + +To "install", run command: +``` +alias gmd='/scripts/gmock_doctor.py' +``` + +To use it, do: +``` + 2>&1 | gmd +``` + +For example: +``` +make my_test 2>&1 | gmd +``` + +Or you can run `gmd` and copy-n-paste gcc's error messages to it. + +## Can I mock a variadic function? ## + +You cannot mock a variadic function (i.e. a function taking ellipsis +(`...`) arguments) directly in Google Mock. + +The problem is that in general, there is _no way_ for a mock object to +know how many arguments are passed to the variadic method, and what +the arguments' types are. Only the _author of the base class_ knows +the protocol, and we cannot look into their head. + +Therefore, to mock such a function, the _user_ must teach the mock +object how to figure out the number of arguments and their types. One +way to do it is to provide overloaded versions of the function. + +Ellipsis arguments are inherited from C and not really a C++ feature. +They are unsafe to use and don't work with arguments that have +constructors or destructors. Therefore we recommend to avoid them in +C++ as much as possible. + +## MSVC gives me warning C4301 or C4373 when I define a mock method with a const parameter. Why? ## + +If you compile this using Microsoft Visual C++ 2005 SP1: +``` +class Foo { + ... + virtual void Bar(const int i) = 0; +}; + +class MockFoo : public Foo { + ... + MOCK_METHOD1(Bar, void(const int i)); +}; +``` +You may get the following warning: +``` +warning C4301: 'MockFoo::Bar': overriding virtual function only differs from 'Foo::Bar' by const/volatile qualifier +``` + +This is a MSVC bug. The same code compiles fine with gcc ,for +example. If you use Visual C++ 2008 SP1, you would get the warning: +``` +warning C4373: 'MockFoo::Bar': virtual function overrides 'Foo::Bar', previous versions of the compiler did not override when parameters only differed by const/volatile qualifiers +``` + +In C++, if you _declare_ a function with a `const` parameter, the +`const` modifier is _ignored_. Therefore, the `Foo` base class above +is equivalent to: +``` +class Foo { + ... + virtual void Bar(int i) = 0; // int or const int? Makes no difference. +}; +``` + +In fact, you can _declare_ Bar() with an `int` parameter, and _define_ +it with a `const int` parameter. The compiler will still match them +up. + +Since making a parameter `const` is meaningless in the method +_declaration_, we recommend to remove it in both `Foo` and `MockFoo`. +That should workaround the VC bug. + +Note that we are talking about the _top-level_ `const` modifier here. +If the function parameter is passed by pointer or reference, declaring +the _pointee_ or _referee_ as `const` is still meaningful. For +example, the following two declarations are _not_ equivalent: +``` +void Bar(int* p); // Neither p nor *p is const. +void Bar(const int* p); // p is not const, but *p is. +``` + +## I have a huge mock class, and Microsoft Visual C++ runs out of memory when compiling it. What can I do? ## + +We've noticed that when the `/clr` compiler flag is used, Visual C++ +uses 5~6 times as much memory when compiling a mock class. We suggest +to avoid `/clr` when compiling native C++ mocks. + +## I can't figure out why Google Mock thinks my expectations are not satisfied. What should I do? ## + +You might want to run your test with +`--gmock_verbose=info`. This flag lets Google Mock print a trace +of every mock function call it receives. By studying the trace, +you'll gain insights on why the expectations you set are not met. + +## How can I assert that a function is NEVER called? ## + +``` +EXPECT_CALL(foo, Bar(_)) + .Times(0); +``` + +## I have a failed test where Google Mock tells me TWICE that a particular expectation is not satisfied. Isn't this redundant? ## + +When Google Mock detects a failure, it prints relevant information +(the mock function arguments, the state of relevant expectations, and +etc) to help the user debug. If another failure is detected, Google +Mock will do the same, including printing the state of relevant +expectations. + +Sometimes an expectation's state didn't change between two failures, +and you'll see the same description of the state twice. They are +however _not_ redundant, as they refer to _different points in time_. +The fact they are the same _is_ interesting information. + +## I get a heap check failure when using a mock object, but using a real object is fine. What can be wrong? ## + +Does the class (hopefully a pure interface) you are mocking have a +virtual destructor? + +Whenever you derive from a base class, make sure its destructor is +virtual. Otherwise Bad Things will happen. Consider the following +code: + +``` +class Base { + public: + // Not virtual, but should be. + ~Base() { ... } + ... +}; + +class Derived : public Base { + public: + ... + private: + std::string value_; +}; + +... + Base* p = new Derived; + ... + delete p; // Surprise! ~Base() will be called, but ~Derived() will not + // - value_ is leaked. +``` + +By changing `~Base()` to virtual, `~Derived()` will be correctly +called when `delete p` is executed, and the heap checker +will be happy. + +## The "newer expectations override older ones" rule makes writing expectations awkward. Why does Google Mock do that? ## + +When people complain about this, often they are referring to code like: + +``` +// foo.Bar() should be called twice, return 1 the first time, and return +// 2 the second time. However, I have to write the expectations in the +// reverse order. This sucks big time!!! +EXPECT_CALL(foo, Bar()) + .WillOnce(Return(2)) + .RetiresOnSaturation(); +EXPECT_CALL(foo, Bar()) + .WillOnce(Return(1)) + .RetiresOnSaturation(); +``` + +The problem is that they didn't pick the **best** way to express the test's +intent. + +By default, expectations don't have to be matched in _any_ particular +order. If you want them to match in a certain order, you need to be +explicit. This is Google Mock's (and jMock's) fundamental philosophy: it's +easy to accidentally over-specify your tests, and we want to make it +harder to do so. + +There are two better ways to write the test spec. You could either +put the expectations in sequence: + +``` +// foo.Bar() should be called twice, return 1 the first time, and return +// 2 the second time. Using a sequence, we can write the expectations +// in their natural order. +{ + InSequence s; + EXPECT_CALL(foo, Bar()) + .WillOnce(Return(1)) + .RetiresOnSaturation(); + EXPECT_CALL(foo, Bar()) + .WillOnce(Return(2)) + .RetiresOnSaturation(); +} +``` + +or you can put the sequence of actions in the same expectation: + +``` +// foo.Bar() should be called twice, return 1 the first time, and return +// 2 the second time. +EXPECT_CALL(foo, Bar()) + .WillOnce(Return(1)) + .WillOnce(Return(2)) + .RetiresOnSaturation(); +``` + +Back to the original questions: why does Google Mock search the +expectations (and `ON_CALL`s) from back to front? Because this +allows a user to set up a mock's behavior for the common case early +(e.g. in the mock's constructor or the test fixture's set-up phase) +and customize it with more specific rules later. If Google Mock +searches from front to back, this very useful pattern won't be +possible. + +## Google Mock prints a warning when a function without EXPECT\_CALL is called, even if I have set its behavior using ON\_CALL. Would it be reasonable not to show the warning in this case? ## + +When choosing between being neat and being safe, we lean toward the +latter. So the answer is that we think it's better to show the +warning. + +Often people write `ON_CALL`s in the mock object's +constructor or `SetUp()`, as the default behavior rarely changes from +test to test. Then in the test body they set the expectations, which +are often different for each test. Having an `ON_CALL` in the set-up +part of a test doesn't mean that the calls are expected. If there's +no `EXPECT_CALL` and the method is called, it's possibly an error. If +we quietly let the call go through without notifying the user, bugs +may creep in unnoticed. + +If, however, you are sure that the calls are OK, you can write + +``` +EXPECT_CALL(foo, Bar(_)) + .WillRepeatedly(...); +``` + +instead of + +``` +ON_CALL(foo, Bar(_)) + .WillByDefault(...); +``` + +This tells Google Mock that you do expect the calls and no warning should be +printed. + +Also, you can control the verbosity using the `--gmock_verbose` flag. +If you find the output too noisy when debugging, just choose a less +verbose level. + +## How can I delete the mock function's argument in an action? ## + +If you find yourself needing to perform some action that's not +supported by Google Mock directly, remember that you can define your own +actions using +[MakeAction()](CookBook.md#writing-new-actions) or +[MakePolymorphicAction()](CookBook.md#writing_new_polymorphic_actions), +or you can write a stub function and invoke it using +[Invoke()](CookBook.md#using-functions_methods_functors). + +## MOCK\_METHODn()'s second argument looks funny. Why don't you use the MOCK\_METHODn(Method, return\_type, arg\_1, ..., arg\_n) syntax? ## + +What?! I think it's beautiful. :-) + +While which syntax looks more natural is a subjective matter to some +extent, Google Mock's syntax was chosen for several practical advantages it +has. + +Try to mock a function that takes a map as an argument: +``` +virtual int GetSize(const map& m); +``` + +Using the proposed syntax, it would be: +``` +MOCK_METHOD1(GetSize, int, const map& m); +``` + +Guess what? You'll get a compiler error as the compiler thinks that +`const map& m` are **two**, not one, arguments. To work +around this you can use `typedef` to give the map type a name, but +that gets in the way of your work. Google Mock's syntax avoids this +problem as the function's argument types are protected inside a pair +of parentheses: +``` +// This compiles fine. +MOCK_METHOD1(GetSize, int(const map& m)); +``` + +You still need a `typedef` if the return type contains an unprotected +comma, but that's much rarer. + +Other advantages include: + 1. `MOCK_METHOD1(Foo, int, bool)` can leave a reader wonder whether the method returns `int` or `bool`, while there won't be such confusion using Google Mock's syntax. + 1. The way Google Mock describes a function type is nothing new, although many people may not be familiar with it. The same syntax was used in C, and the `function` library in `tr1` uses this syntax extensively. Since `tr1` will become a part of the new version of STL, we feel very comfortable to be consistent with it. + 1. The function type syntax is also used in other parts of Google Mock's API (e.g. the action interface) in order to make the implementation tractable. A user needs to learn it anyway in order to utilize Google Mock's more advanced features. We'd as well stick to the same syntax in `MOCK_METHOD*`! + +## My code calls a static/global function. Can I mock it? ## + +You can, but you need to make some changes. + +In general, if you find yourself needing to mock a static function, +it's a sign that your modules are too tightly coupled (and less +flexible, less reusable, less testable, etc). You are probably better +off defining a small interface and call the function through that +interface, which then can be easily mocked. It's a bit of work +initially, but usually pays for itself quickly. + +This Google Testing Blog +[post](http://googletesting.blogspot.com/2008/06/defeat-static-cling.html) +says it excellently. Check it out. + +## My mock object needs to do complex stuff. It's a lot of pain to specify the actions. Google Mock sucks! ## + +I know it's not a question, but you get an answer for free any way. :-) + +With Google Mock, you can create mocks in C++ easily. And people might be +tempted to use them everywhere. Sometimes they work great, and +sometimes you may find them, well, a pain to use. So, what's wrong in +the latter case? + +When you write a test without using mocks, you exercise the code and +assert that it returns the correct value or that the system is in an +expected state. This is sometimes called "state-based testing". + +Mocks are great for what some call "interaction-based" testing: +instead of checking the system state at the very end, mock objects +verify that they are invoked the right way and report an error as soon +as it arises, giving you a handle on the precise context in which the +error was triggered. This is often more effective and economical to +do than state-based testing. + +If you are doing state-based testing and using a test double just to +simulate the real object, you are probably better off using a fake. +Using a mock in this case causes pain, as it's not a strong point for +mocks to perform complex actions. If you experience this and think +that mocks suck, you are just not using the right tool for your +problem. Or, you might be trying to solve the wrong problem. :-) + +## I got a warning "Uninteresting function call encountered - default action taken.." Should I panic? ## + +By all means, NO! It's just an FYI. + +What it means is that you have a mock function, you haven't set any +expectations on it (by Google Mock's rule this means that you are not +interested in calls to this function and therefore it can be called +any number of times), and it is called. That's OK - you didn't say +it's not OK to call the function! + +What if you actually meant to disallow this function to be called, but +forgot to write `EXPECT_CALL(foo, Bar()).Times(0)`? While +one can argue that it's the user's fault, Google Mock tries to be nice and +prints you a note. + +So, when you see the message and believe that there shouldn't be any +uninteresting calls, you should investigate what's going on. To make +your life easier, Google Mock prints the function name and arguments +when an uninteresting call is encountered. + +## I want to define a custom action. Should I use Invoke() or implement the action interface? ## + +Either way is fine - you want to choose the one that's more convenient +for your circumstance. + +Usually, if your action is for a particular function type, defining it +using `Invoke()` should be easier; if your action can be used in +functions of different types (e.g. if you are defining +`Return(value)`), `MakePolymorphicAction()` is +easiest. Sometimes you want precise control on what types of +functions the action can be used in, and implementing +`ActionInterface` is the way to go here. See the implementation of +`Return()` in `include/gmock/gmock-actions.h` for an example. + +## I'm using the set-argument-pointee action, and the compiler complains about "conflicting return type specified". What does it mean? ## + +You got this error as Google Mock has no idea what value it should return +when the mock method is called. `SetArgPointee()` says what the +side effect is, but doesn't say what the return value should be. You +need `DoAll()` to chain a `SetArgPointee()` with a `Return()`. + +See this [recipe](CookBook.md#mocking_side_effects) for more details and an example. + + +## My question is not in your FAQ! ## + +If you cannot find the answer to your question in this FAQ, there are +some other resources you can use: + + 1. read other [documentation](Documentation.md), + 1. search the mailing list [archive](http://groups.google.com/group/googlemock/topics), + 1. ask it on [googlemock@googlegroups.com](mailto:googlemock@googlegroups.com) and someone will answer it (to prevent spam, we require you to join the [discussion group](http://groups.google.com/group/googlemock) before you can post.). + +Please note that creating an issue in the +[issue tracker](https://github.com/google/googletest/issues) is _not_ +a good way to get your answer, as it is monitored infrequently by a +very small number of people. + +When asking a question, it's helpful to provide as much of the +following information as possible (people cannot help you if there's +not enough information in your question): + + * the version (or the revision number if you check out from SVN directly) of Google Mock you use (Google Mock is under active development, so it's possible that your problem has been solved in a later version), + * your operating system, + * the name and version of your compiler, + * the complete command line flags you give to your compiler, + * the complete compiler error messages (if the question is about compilation), + * the _actual_ code (ideally, a minimal but complete program) that has the problem you encounter. diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/KnownIssues.md vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/KnownIssues.md --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/docs/KnownIssues.md 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/docs/KnownIssues.md 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,19 @@ +As any non-trivial software system, Google Mock has some known limitations and problems. We are working on improving it, and welcome your help! The follow is a list of issues we know about. + + + +## README contains outdated information on Google Mock's compatibility with other testing frameworks ## + +The `README` file in release 1.1.0 still says that Google Mock only works with Google Test. Actually, you can configure Google Mock to work with any testing framework you choose. + +## Tests failing on machines using Power PC CPUs (e.g. some Macs) ## + +`gmock_output_test` and `gmock-printers_test` are known to fail with Power PC CPUs. This is due to portability issues with these tests, and is not an indication of problems in Google Mock itself. You can safely ignore them. + +## Failed to resolve libgtest.so.0 in tests when built against installed Google Test ## + +This only applies if you manually built and installed Google Test, and then built a Google Mock against it (either explicitly, or because gtest-config was in your path post-install). In this situation, Libtool has a known issue with certain systems' ldconfig setup: + +http://article.gmane.org/gmane.comp.sysutils.automake.general/9025 + +This requires a manual run of "sudo ldconfig" after the "sudo make install" for Google Test before any binaries which link against it can be executed. This isn't a bug in our install, but we should at least have documented it or hacked a work-around into our install. We should have one of these solutions in our next release. \ No newline at end of file diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-actions.h vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-actions.h --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-actions.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-actions.h 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,1206 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used actions. + +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ + +#ifndef _WIN32_WCE +# include +#endif + +#include +#include + +#include "gmock/internal/gmock-internal-utils.h" +#include "gmock/internal/gmock-port.h" + +#if GTEST_LANG_CXX11 // Defined by gtest-port.h via gmock-port.h. +#include +#include +#endif // GTEST_LANG_CXX11 + +namespace testing { + +// To implement an action Foo, define: +// 1. a class FooAction that implements the ActionInterface interface, and +// 2. a factory function that creates an Action object from a +// const FooAction*. +// +// The two-level delegation design follows that of Matcher, providing +// consistency for extension developers. It also eases ownership +// management as Action objects can now be copied like plain values. + +namespace internal { + +template +class ActionAdaptor; + +// BuiltInDefaultValueGetter::Get() returns a +// default-constructed T value. BuiltInDefaultValueGetter::Get() crashes with an error. +// +// This primary template is used when kDefaultConstructible is true. +template +struct BuiltInDefaultValueGetter { + static T Get() { return T(); } +}; +template +struct BuiltInDefaultValueGetter { + static T Get() { + Assert(false, __FILE__, __LINE__, + "Default action undefined for the function return type."); + return internal::Invalid(); + // The above statement will never be reached, but is required in + // order for this function to compile. + } +}; + +// BuiltInDefaultValue::Get() returns the "built-in" default value +// for type T, which is NULL when T is a raw pointer type, 0 when T is +// a numeric type, false when T is bool, or "" when T is string or +// std::string. In addition, in C++11 and above, it turns a +// default-constructed T value if T is default constructible. For any +// other type T, the built-in default T value is undefined, and the +// function will abort the process. +template +class BuiltInDefaultValue { + public: +#if GTEST_LANG_CXX11 + // This function returns true iff type T has a built-in default value. + static bool Exists() { + return ::std::is_default_constructible::value; + } + + static T Get() { + return BuiltInDefaultValueGetter< + T, ::std::is_default_constructible::value>::Get(); + } + +#else // GTEST_LANG_CXX11 + // This function returns true iff type T has a built-in default value. + static bool Exists() { + return false; + } + + static T Get() { + return BuiltInDefaultValueGetter::Get(); + } + +#endif // GTEST_LANG_CXX11 +}; + +// This partial specialization says that we use the same built-in +// default value for T and const T. +template +class BuiltInDefaultValue { + public: + static bool Exists() { return BuiltInDefaultValue::Exists(); } + static T Get() { return BuiltInDefaultValue::Get(); } +}; + +// This partial specialization defines the default values for pointer +// types. +template +class BuiltInDefaultValue { + public: + static bool Exists() { return true; } + static T* Get() { return NULL; } +}; + +// The following specializations define the default values for +// specific types we care about. +#define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \ + template <> \ + class BuiltInDefaultValue { \ + public: \ + static bool Exists() { return true; } \ + static type Get() { return value; } \ + } + +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, ); // NOLINT +#if GTEST_HAS_GLOBAL_STRING +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::string, ""); +#endif // GTEST_HAS_GLOBAL_STRING +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, ""); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\0'); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed char, '\0'); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(char, '\0'); + +// There's no need for a default action for signed wchar_t, as that +// type is the same as wchar_t for gcc, and invalid for MSVC. +// +// There's also no need for a default action for unsigned wchar_t, as +// that type is the same as unsigned int for gcc, and invalid for +// MSVC. +#if GMOCK_WCHAR_T_IS_NATIVE_ +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(wchar_t, 0U); // NOLINT +#endif + +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned short, 0U); // NOLINT +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed short, 0); // NOLINT +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned int, 0U); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed int, 0); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long, 0UL); // NOLINT +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long, 0L); // NOLINT +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(UInt64, 0); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(Int64, 0); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(float, 0); +GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(double, 0); + +#undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_ + +} // namespace internal + +// When an unexpected function call is encountered, Google Mock will +// let it return a default value if the user has specified one for its +// return type, or if the return type has a built-in default value; +// otherwise Google Mock won't know what value to return and will have +// to abort the process. +// +// The DefaultValue class allows a user to specify the +// default value for a type T that is both copyable and publicly +// destructible (i.e. anything that can be used as a function return +// type). The usage is: +// +// // Sets the default value for type T to be foo. +// DefaultValue::Set(foo); +template +class DefaultValue { + public: + // Sets the default value for type T; requires T to be + // copy-constructable and have a public destructor. + static void Set(T x) { + delete producer_; + producer_ = new FixedValueProducer(x); + } + + // Provides a factory function to be called to generate the default value. + // This method can be used even if T is only move-constructible, but it is not + // limited to that case. + typedef T (*FactoryFunction)(); + static void SetFactory(FactoryFunction factory) { + delete producer_; + producer_ = new FactoryValueProducer(factory); + } + + // Unsets the default value for type T. + static void Clear() { + delete producer_; + producer_ = NULL; + } + + // Returns true iff the user has set the default value for type T. + static bool IsSet() { return producer_ != NULL; } + + // Returns true if T has a default return value set by the user or there + // exists a built-in default value. + static bool Exists() { + return IsSet() || internal::BuiltInDefaultValue::Exists(); + } + + // Returns the default value for type T if the user has set one; + // otherwise returns the built-in default value. Requires that Exists() + // is true, which ensures that the return value is well-defined. + static T Get() { + return producer_ == NULL ? + internal::BuiltInDefaultValue::Get() : producer_->Produce(); + } + + private: + class ValueProducer { + public: + virtual ~ValueProducer() {} + virtual T Produce() = 0; + }; + + class FixedValueProducer : public ValueProducer { + public: + explicit FixedValueProducer(T value) : value_(value) {} + virtual T Produce() { return value_; } + + private: + const T value_; + GTEST_DISALLOW_COPY_AND_ASSIGN_(FixedValueProducer); + }; + + class FactoryValueProducer : public ValueProducer { + public: + explicit FactoryValueProducer(FactoryFunction factory) + : factory_(factory) {} + virtual T Produce() { return factory_(); } + + private: + const FactoryFunction factory_; + GTEST_DISALLOW_COPY_AND_ASSIGN_(FactoryValueProducer); + }; + + static ValueProducer* producer_; +}; + +// This partial specialization allows a user to set default values for +// reference types. +template +class DefaultValue { + public: + // Sets the default value for type T&. + static void Set(T& x) { // NOLINT + address_ = &x; + } + + // Unsets the default value for type T&. + static void Clear() { + address_ = NULL; + } + + // Returns true iff the user has set the default value for type T&. + static bool IsSet() { return address_ != NULL; } + + // Returns true if T has a default return value set by the user or there + // exists a built-in default value. + static bool Exists() { + return IsSet() || internal::BuiltInDefaultValue::Exists(); + } + + // Returns the default value for type T& if the user has set one; + // otherwise returns the built-in default value if there is one; + // otherwise aborts the process. + static T& Get() { + return address_ == NULL ? + internal::BuiltInDefaultValue::Get() : *address_; + } + + private: + static T* address_; +}; + +// This specialization allows DefaultValue::Get() to +// compile. +template <> +class DefaultValue { + public: + static bool Exists() { return true; } + static void Get() {} +}; + +// Points to the user-set default value for type T. +template +typename DefaultValue::ValueProducer* DefaultValue::producer_ = NULL; + +// Points to the user-set default value for type T&. +template +T* DefaultValue::address_ = NULL; + +// Implement this interface to define an action for function type F. +template +class ActionInterface { + public: + typedef typename internal::Function::Result Result; + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + ActionInterface() {} + virtual ~ActionInterface() {} + + // Performs the action. This method is not const, as in general an + // action can have side effects and be stateful. For example, a + // get-the-next-element-from-the-collection action will need to + // remember the current element. + virtual Result Perform(const ArgumentTuple& args) = 0; + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionInterface); +}; + +// An Action is a copyable and IMMUTABLE (except by assignment) +// object that represents an action to be taken when a mock function +// of type F is called. The implementation of Action is just a +// linked_ptr to const ActionInterface, so copying is fairly cheap. +// Don't inherit from Action! +// +// You can view an object implementing ActionInterface as a +// concrete action (including its current state), and an Action +// object as a handle to it. +template +class Action { + public: + typedef typename internal::Function::Result Result; + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + // Constructs a null Action. Needed for storing Action objects in + // STL containers. + Action() : impl_(NULL) {} + + // Constructs an Action from its implementation. A NULL impl is + // used to represent the "do-default" action. + explicit Action(ActionInterface* impl) : impl_(impl) {} + + // Copy constructor. + Action(const Action& action) : impl_(action.impl_) {} + + // This constructor allows us to turn an Action object into an + // Action, as long as F's arguments can be implicitly converted + // to Func's and Func's return type can be implicitly converted to + // F's. + template + explicit Action(const Action& action); + + // Returns true iff this is the DoDefault() action. + bool IsDoDefault() const { return impl_.get() == NULL; } + + // Performs the action. Note that this method is const even though + // the corresponding method in ActionInterface is not. The reason + // is that a const Action means that it cannot be re-bound to + // another concrete action, not that the concrete action it binds to + // cannot change state. (Think of the difference between a const + // pointer and a pointer to const.) + Result Perform(const ArgumentTuple& args) const { + internal::Assert( + !IsDoDefault(), __FILE__, __LINE__, + "You are using DoDefault() inside a composite action like " + "DoAll() or WithArgs(). This is not supported for technical " + "reasons. Please instead spell out the default action, or " + "assign the default action to an Action variable and use " + "the variable in various places."); + return impl_->Perform(args); + } + + private: + template + friend class internal::ActionAdaptor; + + internal::linked_ptr > impl_; +}; + +// The PolymorphicAction class template makes it easy to implement a +// polymorphic action (i.e. an action that can be used in mock +// functions of than one type, e.g. Return()). +// +// To define a polymorphic action, a user first provides a COPYABLE +// implementation class that has a Perform() method template: +// +// class FooAction { +// public: +// template +// Result Perform(const ArgumentTuple& args) const { +// // Processes the arguments and returns a result, using +// // tr1::get(args) to get the N-th (0-based) argument in the tuple. +// } +// ... +// }; +// +// Then the user creates the polymorphic action using +// MakePolymorphicAction(object) where object has type FooAction. See +// the definition of Return(void) and SetArgumentPointee(value) for +// complete examples. +template +class PolymorphicAction { + public: + explicit PolymorphicAction(const Impl& impl) : impl_(impl) {} + + template + operator Action() const { + return Action(new MonomorphicImpl(impl_)); + } + + private: + template + class MonomorphicImpl : public ActionInterface { + public: + typedef typename internal::Function::Result Result; + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} + + virtual Result Perform(const ArgumentTuple& args) { + return impl_.template Perform(args); + } + + private: + Impl impl_; + + GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); + }; + + Impl impl_; + + GTEST_DISALLOW_ASSIGN_(PolymorphicAction); +}; + +// Creates an Action from its implementation and returns it. The +// created Action object owns the implementation. +template +Action MakeAction(ActionInterface* impl) { + return Action(impl); +} + +// Creates a polymorphic action from its implementation. This is +// easier to use than the PolymorphicAction constructor as it +// doesn't require you to explicitly write the template argument, e.g. +// +// MakePolymorphicAction(foo); +// vs +// PolymorphicAction(foo); +template +inline PolymorphicAction MakePolymorphicAction(const Impl& impl) { + return PolymorphicAction(impl); +} + +namespace internal { + +// Allows an Action object to pose as an Action, as long as F2 +// and F1 are compatible. +template +class ActionAdaptor : public ActionInterface { + public: + typedef typename internal::Function::Result Result; + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + explicit ActionAdaptor(const Action& from) : impl_(from.impl_) {} + + virtual Result Perform(const ArgumentTuple& args) { + return impl_->Perform(args); + } + + private: + const internal::linked_ptr > impl_; + + GTEST_DISALLOW_ASSIGN_(ActionAdaptor); +}; + +// Helper struct to specialize ReturnAction to execute a move instead of a copy +// on return. Useful for move-only types, but could be used on any type. +template +struct ByMoveWrapper { + explicit ByMoveWrapper(T value) : payload(internal::move(value)) {} + T payload; +}; + +// Implements the polymorphic Return(x) action, which can be used in +// any function that returns the type of x, regardless of the argument +// types. +// +// Note: The value passed into Return must be converted into +// Function::Result when this action is cast to Action rather than +// when that action is performed. This is important in scenarios like +// +// MOCK_METHOD1(Method, T(U)); +// ... +// { +// Foo foo; +// X x(&foo); +// EXPECT_CALL(mock, Method(_)).WillOnce(Return(x)); +// } +// +// In the example above the variable x holds reference to foo which leaves +// scope and gets destroyed. If copying X just copies a reference to foo, +// that copy will be left with a hanging reference. If conversion to T +// makes a copy of foo, the above code is safe. To support that scenario, we +// need to make sure that the type conversion happens inside the EXPECT_CALL +// statement, and conversion of the result of Return to Action is a +// good place for that. +// +template +class ReturnAction { + public: + // Constructs a ReturnAction object from the value to be returned. + // 'value' is passed by value instead of by const reference in order + // to allow Return("string literal") to compile. + explicit ReturnAction(R value) : value_(new R(internal::move(value))) {} + + // This template type conversion operator allows Return(x) to be + // used in ANY function that returns x's type. + template + operator Action() const { + // Assert statement belongs here because this is the best place to verify + // conditions on F. It produces the clearest error messages + // in most compilers. + // Impl really belongs in this scope as a local class but can't + // because MSVC produces duplicate symbols in different translation units + // in this case. Until MS fixes that bug we put Impl into the class scope + // and put the typedef both here (for use in assert statement) and + // in the Impl class. But both definitions must be the same. + typedef typename Function::Result Result; + GTEST_COMPILE_ASSERT_( + !is_reference::value, + use_ReturnRef_instead_of_Return_to_return_a_reference); + return Action(new Impl(value_)); + } + + private: + // Implements the Return(x) action for a particular function type F. + template + class Impl : public ActionInterface { + public: + typedef typename Function::Result Result; + typedef typename Function::ArgumentTuple ArgumentTuple; + + // The implicit cast is necessary when Result has more than one + // single-argument constructor (e.g. Result is std::vector) and R + // has a type conversion operator template. In that case, value_(value) + // won't compile as the compiler doesn't known which constructor of + // Result to call. ImplicitCast_ forces the compiler to convert R to + // Result without considering explicit constructors, thus resolving the + // ambiguity. value_ is then initialized using its copy constructor. + explicit Impl(const linked_ptr& value) + : value_before_cast_(*value), + value_(ImplicitCast_(value_before_cast_)) {} + + virtual Result Perform(const ArgumentTuple&) { return value_; } + + private: + GTEST_COMPILE_ASSERT_(!is_reference::value, + Result_cannot_be_a_reference_type); + // We save the value before casting just in case it is being cast to a + // wrapper type. + R value_before_cast_; + Result value_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl); + }; + + // Partially specialize for ByMoveWrapper. This version of ReturnAction will + // move its contents instead. + template + class Impl, F> : public ActionInterface { + public: + typedef typename Function::Result Result; + typedef typename Function::ArgumentTuple ArgumentTuple; + + explicit Impl(const linked_ptr& wrapper) + : performed_(false), wrapper_(wrapper) {} + + virtual Result Perform(const ArgumentTuple&) { + GTEST_CHECK_(!performed_) + << "A ByMove() action should only be performed once."; + performed_ = true; + return internal::move(wrapper_->payload); + } + + private: + bool performed_; + const linked_ptr wrapper_; + + GTEST_DISALLOW_ASSIGN_(Impl); + }; + + const linked_ptr value_; + + GTEST_DISALLOW_ASSIGN_(ReturnAction); +}; + +// Implements the ReturnNull() action. +class ReturnNullAction { + public: + // Allows ReturnNull() to be used in any pointer-returning function. In C++11 + // this is enforced by returning nullptr, and in non-C++11 by asserting a + // pointer type on compile time. + template + static Result Perform(const ArgumentTuple&) { +#if GTEST_LANG_CXX11 + return nullptr; +#else + GTEST_COMPILE_ASSERT_(internal::is_pointer::value, + ReturnNull_can_be_used_to_return_a_pointer_only); + return NULL; +#endif // GTEST_LANG_CXX11 + } +}; + +// Implements the Return() action. +class ReturnVoidAction { + public: + // Allows Return() to be used in any void-returning function. + template + static void Perform(const ArgumentTuple&) { + CompileAssertTypesEqual(); + } +}; + +// Implements the polymorphic ReturnRef(x) action, which can be used +// in any function that returns a reference to the type of x, +// regardless of the argument types. +template +class ReturnRefAction { + public: + // Constructs a ReturnRefAction object from the reference to be returned. + explicit ReturnRefAction(T& ref) : ref_(ref) {} // NOLINT + + // This template type conversion operator allows ReturnRef(x) to be + // used in ANY function that returns a reference to x's type. + template + operator Action() const { + typedef typename Function::Result Result; + // Asserts that the function return type is a reference. This + // catches the user error of using ReturnRef(x) when Return(x) + // should be used, and generates some helpful error message. + GTEST_COMPILE_ASSERT_(internal::is_reference::value, + use_Return_instead_of_ReturnRef_to_return_a_value); + return Action(new Impl(ref_)); + } + + private: + // Implements the ReturnRef(x) action for a particular function type F. + template + class Impl : public ActionInterface { + public: + typedef typename Function::Result Result; + typedef typename Function::ArgumentTuple ArgumentTuple; + + explicit Impl(T& ref) : ref_(ref) {} // NOLINT + + virtual Result Perform(const ArgumentTuple&) { + return ref_; + } + + private: + T& ref_; + + GTEST_DISALLOW_ASSIGN_(Impl); + }; + + T& ref_; + + GTEST_DISALLOW_ASSIGN_(ReturnRefAction); +}; + +// Implements the polymorphic ReturnRefOfCopy(x) action, which can be +// used in any function that returns a reference to the type of x, +// regardless of the argument types. +template +class ReturnRefOfCopyAction { + public: + // Constructs a ReturnRefOfCopyAction object from the reference to + // be returned. + explicit ReturnRefOfCopyAction(const T& value) : value_(value) {} // NOLINT + + // This template type conversion operator allows ReturnRefOfCopy(x) to be + // used in ANY function that returns a reference to x's type. + template + operator Action() const { + typedef typename Function::Result Result; + // Asserts that the function return type is a reference. This + // catches the user error of using ReturnRefOfCopy(x) when Return(x) + // should be used, and generates some helpful error message. + GTEST_COMPILE_ASSERT_( + internal::is_reference::value, + use_Return_instead_of_ReturnRefOfCopy_to_return_a_value); + return Action(new Impl(value_)); + } + + private: + // Implements the ReturnRefOfCopy(x) action for a particular function type F. + template + class Impl : public ActionInterface { + public: + typedef typename Function::Result Result; + typedef typename Function::ArgumentTuple ArgumentTuple; + + explicit Impl(const T& value) : value_(value) {} // NOLINT + + virtual Result Perform(const ArgumentTuple&) { + return value_; + } + + private: + T value_; + + GTEST_DISALLOW_ASSIGN_(Impl); + }; + + const T value_; + + GTEST_DISALLOW_ASSIGN_(ReturnRefOfCopyAction); +}; + +// Implements the polymorphic DoDefault() action. +class DoDefaultAction { + public: + // This template type conversion operator allows DoDefault() to be + // used in any function. + template + operator Action() const { return Action(NULL); } +}; + +// Implements the Assign action to set a given pointer referent to a +// particular value. +template +class AssignAction { + public: + AssignAction(T1* ptr, T2 value) : ptr_(ptr), value_(value) {} + + template + void Perform(const ArgumentTuple& /* args */) const { + *ptr_ = value_; + } + + private: + T1* const ptr_; + const T2 value_; + + GTEST_DISALLOW_ASSIGN_(AssignAction); +}; + +#if !GTEST_OS_WINDOWS_MOBILE + +// Implements the SetErrnoAndReturn action to simulate return from +// various system calls and libc functions. +template +class SetErrnoAndReturnAction { + public: + SetErrnoAndReturnAction(int errno_value, T result) + : errno_(errno_value), + result_(result) {} + template + Result Perform(const ArgumentTuple& /* args */) const { + errno = errno_; + return result_; + } + + private: + const int errno_; + const T result_; + + GTEST_DISALLOW_ASSIGN_(SetErrnoAndReturnAction); +}; + +#endif // !GTEST_OS_WINDOWS_MOBILE + +// Implements the SetArgumentPointee(x) action for any function +// whose N-th argument (0-based) is a pointer to x's type. The +// template parameter kIsProto is true iff type A is ProtocolMessage, +// proto2::Message, or a sub-class of those. +template +class SetArgumentPointeeAction { + public: + // Constructs an action that sets the variable pointed to by the + // N-th function argument to 'value'. + explicit SetArgumentPointeeAction(const A& value) : value_(value) {} + + template + void Perform(const ArgumentTuple& args) const { + CompileAssertTypesEqual(); + *::testing::get(args) = value_; + } + + private: + const A value_; + + GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction); +}; + +template +class SetArgumentPointeeAction { + public: + // Constructs an action that sets the variable pointed to by the + // N-th function argument to 'proto'. Both ProtocolMessage and + // proto2::Message have the CopyFrom() method, so the same + // implementation works for both. + explicit SetArgumentPointeeAction(const Proto& proto) : proto_(new Proto) { + proto_->CopyFrom(proto); + } + + template + void Perform(const ArgumentTuple& args) const { + CompileAssertTypesEqual(); + ::testing::get(args)->CopyFrom(*proto_); + } + + private: + const internal::linked_ptr proto_; + + GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction); +}; + +// Implements the InvokeWithoutArgs(f) action. The template argument +// FunctionImpl is the implementation type of f, which can be either a +// function pointer or a functor. InvokeWithoutArgs(f) can be used as an +// Action as long as f's type is compatible with F (i.e. f can be +// assigned to a tr1::function). +template +class InvokeWithoutArgsAction { + public: + // The c'tor makes a copy of function_impl (either a function + // pointer or a functor). + explicit InvokeWithoutArgsAction(FunctionImpl function_impl) + : function_impl_(function_impl) {} + + // Allows InvokeWithoutArgs(f) to be used as any action whose type is + // compatible with f. + template + Result Perform(const ArgumentTuple&) { return function_impl_(); } + + private: + FunctionImpl function_impl_; + + GTEST_DISALLOW_ASSIGN_(InvokeWithoutArgsAction); +}; + +// Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action. +template +class InvokeMethodWithoutArgsAction { + public: + InvokeMethodWithoutArgsAction(Class* obj_ptr, MethodPtr method_ptr) + : obj_ptr_(obj_ptr), method_ptr_(method_ptr) {} + + template + Result Perform(const ArgumentTuple&) const { + return (obj_ptr_->*method_ptr_)(); + } + + private: + Class* const obj_ptr_; + const MethodPtr method_ptr_; + + GTEST_DISALLOW_ASSIGN_(InvokeMethodWithoutArgsAction); +}; + +// Implements the IgnoreResult(action) action. +template +class IgnoreResultAction { + public: + explicit IgnoreResultAction(const A& action) : action_(action) {} + + template + operator Action() const { + // Assert statement belongs here because this is the best place to verify + // conditions on F. It produces the clearest error messages + // in most compilers. + // Impl really belongs in this scope as a local class but can't + // because MSVC produces duplicate symbols in different translation units + // in this case. Until MS fixes that bug we put Impl into the class scope + // and put the typedef both here (for use in assert statement) and + // in the Impl class. But both definitions must be the same. + typedef typename internal::Function::Result Result; + + // Asserts at compile time that F returns void. + CompileAssertTypesEqual(); + + return Action(new Impl(action_)); + } + + private: + template + class Impl : public ActionInterface { + public: + typedef typename internal::Function::Result Result; + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + explicit Impl(const A& action) : action_(action) {} + + virtual void Perform(const ArgumentTuple& args) { + // Performs the action and ignores its result. + action_.Perform(args); + } + + private: + // Type OriginalFunction is the same as F except that its return + // type is IgnoredValue. + typedef typename internal::Function::MakeResultIgnoredValue + OriginalFunction; + + const Action action_; + + GTEST_DISALLOW_ASSIGN_(Impl); + }; + + const A action_; + + GTEST_DISALLOW_ASSIGN_(IgnoreResultAction); +}; + +// A ReferenceWrapper object represents a reference to type T, +// which can be either const or not. It can be explicitly converted +// from, and implicitly converted to, a T&. Unlike a reference, +// ReferenceWrapper can be copied and can survive template type +// inference. This is used to support by-reference arguments in the +// InvokeArgument(...) action. The idea was from "reference +// wrappers" in tr1, which we don't have in our source tree yet. +template +class ReferenceWrapper { + public: + // Constructs a ReferenceWrapper object from a T&. + explicit ReferenceWrapper(T& l_value) : pointer_(&l_value) {} // NOLINT + + // Allows a ReferenceWrapper object to be implicitly converted to + // a T&. + operator T&() const { return *pointer_; } + private: + T* pointer_; +}; + +// Allows the expression ByRef(x) to be printed as a reference to x. +template +void PrintTo(const ReferenceWrapper& ref, ::std::ostream* os) { + T& value = ref; + UniversalPrinter::Print(value, os); +} + +// Does two actions sequentially. Used for implementing the DoAll(a1, +// a2, ...) action. +template +class DoBothAction { + public: + DoBothAction(Action1 action1, Action2 action2) + : action1_(action1), action2_(action2) {} + + // This template type conversion operator allows DoAll(a1, ..., a_n) + // to be used in ANY function of compatible type. + template + operator Action() const { + return Action(new Impl(action1_, action2_)); + } + + private: + // Implements the DoAll(...) action for a particular function type F. + template + class Impl : public ActionInterface { + public: + typedef typename Function::Result Result; + typedef typename Function::ArgumentTuple ArgumentTuple; + typedef typename Function::MakeResultVoid VoidResult; + + Impl(const Action& action1, const Action& action2) + : action1_(action1), action2_(action2) {} + + virtual Result Perform(const ArgumentTuple& args) { + action1_.Perform(args); + return action2_.Perform(args); + } + + private: + const Action action1_; + const Action action2_; + + GTEST_DISALLOW_ASSIGN_(Impl); + }; + + Action1 action1_; + Action2 action2_; + + GTEST_DISALLOW_ASSIGN_(DoBothAction); +}; + +} // namespace internal + +// An Unused object can be implicitly constructed from ANY value. +// This is handy when defining actions that ignore some or all of the +// mock function arguments. For example, given +// +// MOCK_METHOD3(Foo, double(const string& label, double x, double y)); +// MOCK_METHOD3(Bar, double(int index, double x, double y)); +// +// instead of +// +// double DistanceToOriginWithLabel(const string& label, double x, double y) { +// return sqrt(x*x + y*y); +// } +// double DistanceToOriginWithIndex(int index, double x, double y) { +// return sqrt(x*x + y*y); +// } +// ... +// EXPECT_CALL(mock, Foo("abc", _, _)) +// .WillOnce(Invoke(DistanceToOriginWithLabel)); +// EXPECT_CALL(mock, Bar(5, _, _)) +// .WillOnce(Invoke(DistanceToOriginWithIndex)); +// +// you could write +// +// // We can declare any uninteresting argument as Unused. +// double DistanceToOrigin(Unused, double x, double y) { +// return sqrt(x*x + y*y); +// } +// ... +// EXPECT_CALL(mock, Foo("abc", _, _)).WillOnce(Invoke(DistanceToOrigin)); +// EXPECT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin)); +typedef internal::IgnoredValue Unused; + +// This constructor allows us to turn an Action object into an +// Action, as long as To's arguments can be implicitly converted +// to From's and From's return type cann be implicitly converted to +// To's. +template +template +Action::Action(const Action& from) + : impl_(new internal::ActionAdaptor(from)) {} + +// Creates an action that returns 'value'. 'value' is passed by value +// instead of const reference - otherwise Return("string literal") +// will trigger a compiler error about using array as initializer. +template +internal::ReturnAction Return(R value) { + return internal::ReturnAction(internal::move(value)); +} + +// Creates an action that returns NULL. +inline PolymorphicAction ReturnNull() { + return MakePolymorphicAction(internal::ReturnNullAction()); +} + +// Creates an action that returns from a void function. +inline PolymorphicAction Return() { + return MakePolymorphicAction(internal::ReturnVoidAction()); +} + +// Creates an action that returns the reference to a variable. +template +inline internal::ReturnRefAction ReturnRef(R& x) { // NOLINT + return internal::ReturnRefAction(x); +} + +// Creates an action that returns the reference to a copy of the +// argument. The copy is created when the action is constructed and +// lives as long as the action. +template +inline internal::ReturnRefOfCopyAction ReturnRefOfCopy(const R& x) { + return internal::ReturnRefOfCopyAction(x); +} + +// Modifies the parent action (a Return() action) to perform a move of the +// argument instead of a copy. +// Return(ByMove()) actions can only be executed once and will assert this +// invariant. +template +internal::ByMoveWrapper ByMove(R x) { + return internal::ByMoveWrapper(internal::move(x)); +} + +// Creates an action that does the default action for the give mock function. +inline internal::DoDefaultAction DoDefault() { + return internal::DoDefaultAction(); +} + +// Creates an action that sets the variable pointed by the N-th +// (0-based) function argument to 'value'. +template +PolymorphicAction< + internal::SetArgumentPointeeAction< + N, T, internal::IsAProtocolMessage::value> > +SetArgPointee(const T& x) { + return MakePolymorphicAction(internal::SetArgumentPointeeAction< + N, T, internal::IsAProtocolMessage::value>(x)); +} + +#if !((GTEST_GCC_VER_ && GTEST_GCC_VER_ < 40000) || GTEST_OS_SYMBIAN) +// This overload allows SetArgPointee() to accept a string literal. +// GCC prior to the version 4.0 and Symbian C++ compiler cannot distinguish +// this overload from the templated version and emit a compile error. +template +PolymorphicAction< + internal::SetArgumentPointeeAction > +SetArgPointee(const char* p) { + return MakePolymorphicAction(internal::SetArgumentPointeeAction< + N, const char*, false>(p)); +} + +template +PolymorphicAction< + internal::SetArgumentPointeeAction > +SetArgPointee(const wchar_t* p) { + return MakePolymorphicAction(internal::SetArgumentPointeeAction< + N, const wchar_t*, false>(p)); +} +#endif + +// The following version is DEPRECATED. +template +PolymorphicAction< + internal::SetArgumentPointeeAction< + N, T, internal::IsAProtocolMessage::value> > +SetArgumentPointee(const T& x) { + return MakePolymorphicAction(internal::SetArgumentPointeeAction< + N, T, internal::IsAProtocolMessage::value>(x)); +} + +// Creates an action that sets a pointer referent to a given value. +template +PolymorphicAction > Assign(T1* ptr, T2 val) { + return MakePolymorphicAction(internal::AssignAction(ptr, val)); +} + +#if !GTEST_OS_WINDOWS_MOBILE + +// Creates an action that sets errno and returns the appropriate error. +template +PolymorphicAction > +SetErrnoAndReturn(int errval, T result) { + return MakePolymorphicAction( + internal::SetErrnoAndReturnAction(errval, result)); +} + +#endif // !GTEST_OS_WINDOWS_MOBILE + +// Various overloads for InvokeWithoutArgs(). + +// Creates an action that invokes 'function_impl' with no argument. +template +PolymorphicAction > +InvokeWithoutArgs(FunctionImpl function_impl) { + return MakePolymorphicAction( + internal::InvokeWithoutArgsAction(function_impl)); +} + +// Creates an action that invokes the given method on the given object +// with no argument. +template +PolymorphicAction > +InvokeWithoutArgs(Class* obj_ptr, MethodPtr method_ptr) { + return MakePolymorphicAction( + internal::InvokeMethodWithoutArgsAction( + obj_ptr, method_ptr)); +} + +// Creates an action that performs an_action and throws away its +// result. In other words, it changes the return type of an_action to +// void. an_action MUST NOT return void, or the code won't compile. +template +inline internal::IgnoreResultAction IgnoreResult(const A& an_action) { + return internal::IgnoreResultAction(an_action); +} + +// Creates a reference wrapper for the given L-value. If necessary, +// you can explicitly specify the type of the reference. For example, +// suppose 'derived' is an object of type Derived, ByRef(derived) +// would wrap a Derived&. If you want to wrap a const Base& instead, +// where Base is a base class of Derived, just write: +// +// ByRef(derived) +template +inline internal::ReferenceWrapper ByRef(T& l_value) { // NOLINT + return internal::ReferenceWrapper(l_value); +} + +} // namespace testing + +#endif // GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-cardinalities.h vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-cardinalities.h --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-cardinalities.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-cardinalities.h 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,147 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used cardinalities. More +// cardinalities can be defined by the user implementing the +// CardinalityInterface interface if necessary. + +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ + +#include +#include // NOLINT +#include "gmock/internal/gmock-port.h" +#include "gtest/gtest.h" + +namespace testing { + +// To implement a cardinality Foo, define: +// 1. a class FooCardinality that implements the +// CardinalityInterface interface, and +// 2. a factory function that creates a Cardinality object from a +// const FooCardinality*. +// +// The two-level delegation design follows that of Matcher, providing +// consistency for extension developers. It also eases ownership +// management as Cardinality objects can now be copied like plain values. + +// The implementation of a cardinality. +class CardinalityInterface { + public: + virtual ~CardinalityInterface() {} + + // Conservative estimate on the lower/upper bound of the number of + // calls allowed. + virtual int ConservativeLowerBound() const { return 0; } + virtual int ConservativeUpperBound() const { return INT_MAX; } + + // Returns true iff call_count calls will satisfy this cardinality. + virtual bool IsSatisfiedByCallCount(int call_count) const = 0; + + // Returns true iff call_count calls will saturate this cardinality. + virtual bool IsSaturatedByCallCount(int call_count) const = 0; + + // Describes self to an ostream. + virtual void DescribeTo(::std::ostream* os) const = 0; +}; + +// A Cardinality is a copyable and IMMUTABLE (except by assignment) +// object that specifies how many times a mock function is expected to +// be called. The implementation of Cardinality is just a linked_ptr +// to const CardinalityInterface, so copying is fairly cheap. +// Don't inherit from Cardinality! +class GTEST_API_ Cardinality { + public: + // Constructs a null cardinality. Needed for storing Cardinality + // objects in STL containers. + Cardinality() {} + + // Constructs a Cardinality from its implementation. + explicit Cardinality(const CardinalityInterface* impl) : impl_(impl) {} + + // Conservative estimate on the lower/upper bound of the number of + // calls allowed. + int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); } + int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); } + + // Returns true iff call_count calls will satisfy this cardinality. + bool IsSatisfiedByCallCount(int call_count) const { + return impl_->IsSatisfiedByCallCount(call_count); + } + + // Returns true iff call_count calls will saturate this cardinality. + bool IsSaturatedByCallCount(int call_count) const { + return impl_->IsSaturatedByCallCount(call_count); + } + + // Returns true iff call_count calls will over-saturate this + // cardinality, i.e. exceed the maximum number of allowed calls. + bool IsOverSaturatedByCallCount(int call_count) const { + return impl_->IsSaturatedByCallCount(call_count) && + !impl_->IsSatisfiedByCallCount(call_count); + } + + // Describes self to an ostream + void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } + + // Describes the given actual call count to an ostream. + static void DescribeActualCallCountTo(int actual_call_count, + ::std::ostream* os); + + private: + internal::linked_ptr impl_; +}; + +// Creates a cardinality that allows at least n calls. +GTEST_API_ Cardinality AtLeast(int n); + +// Creates a cardinality that allows at most n calls. +GTEST_API_ Cardinality AtMost(int n); + +// Creates a cardinality that allows any number of calls. +GTEST_API_ Cardinality AnyNumber(); + +// Creates a cardinality that allows between min and max calls. +GTEST_API_ Cardinality Between(int min, int max); + +// Creates a cardinality that allows exactly n calls. +GTEST_API_ Cardinality Exactly(int n); + +// Creates a cardinality from its implementation. +inline Cardinality MakeCardinality(const CardinalityInterface* c) { + return Cardinality(c); +} + +} // namespace testing + +#endif // GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-actions.h vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-actions.h --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-actions.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-actions.h 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,2377 @@ +// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! + +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used variadic actions. + +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ + +#include "gmock/gmock-actions.h" +#include "gmock/internal/gmock-port.h" + +namespace testing { +namespace internal { + +// InvokeHelper knows how to unpack an N-tuple and invoke an N-ary +// function or method with the unpacked values, where F is a function +// type that takes N arguments. +template +class InvokeHelper; + +template +class InvokeHelper > { + public: + template + static R Invoke(Function function, const ::testing::tuple<>&) { + return function(); + } + + template + static R InvokeMethod(Class* obj_ptr, + MethodPtr method_ptr, + const ::testing::tuple<>&) { + return (obj_ptr->*method_ptr)(); + } +}; + +template +class InvokeHelper > { + public: + template + static R Invoke(Function function, const ::testing::tuple& args) { + return function(get<0>(args)); + } + + template + static R InvokeMethod(Class* obj_ptr, + MethodPtr method_ptr, + const ::testing::tuple& args) { + return (obj_ptr->*method_ptr)(get<0>(args)); + } +}; + +template +class InvokeHelper > { + public: + template + static R Invoke(Function function, const ::testing::tuple& args) { + return function(get<0>(args), get<1>(args)); + } + + template + static R InvokeMethod(Class* obj_ptr, + MethodPtr method_ptr, + const ::testing::tuple& args) { + return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args)); + } +}; + +template +class InvokeHelper > { + public: + template + static R Invoke(Function function, const ::testing::tuple& args) { + return function(get<0>(args), get<1>(args), get<2>(args)); + } + + template + static R InvokeMethod(Class* obj_ptr, + MethodPtr method_ptr, + const ::testing::tuple& args) { + return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), + get<2>(args)); + } +}; + +template +class InvokeHelper > { + public: + template + static R Invoke(Function function, const ::testing::tuple& args) { + return function(get<0>(args), get<1>(args), get<2>(args), + get<3>(args)); + } + + template + static R InvokeMethod(Class* obj_ptr, + MethodPtr method_ptr, + const ::testing::tuple& args) { + return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), + get<2>(args), get<3>(args)); + } +}; + +template +class InvokeHelper > { + public: + template + static R Invoke(Function function, const ::testing::tuple& args) { + return function(get<0>(args), get<1>(args), get<2>(args), + get<3>(args), get<4>(args)); + } + + template + static R InvokeMethod(Class* obj_ptr, + MethodPtr method_ptr, + const ::testing::tuple& args) { + return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), + get<2>(args), get<3>(args), get<4>(args)); + } +}; + +template +class InvokeHelper > { + public: + template + static R Invoke(Function function, const ::testing::tuple& args) { + return function(get<0>(args), get<1>(args), get<2>(args), + get<3>(args), get<4>(args), get<5>(args)); + } + + template + static R InvokeMethod(Class* obj_ptr, + MethodPtr method_ptr, + const ::testing::tuple& args) { + return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), + get<2>(args), get<3>(args), get<4>(args), get<5>(args)); + } +}; + +template +class InvokeHelper > { + public: + template + static R Invoke(Function function, const ::testing::tuple& args) { + return function(get<0>(args), get<1>(args), get<2>(args), + get<3>(args), get<4>(args), get<5>(args), get<6>(args)); + } + + template + static R InvokeMethod(Class* obj_ptr, + MethodPtr method_ptr, + const ::testing::tuple& args) { + return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), + get<2>(args), get<3>(args), get<4>(args), get<5>(args), + get<6>(args)); + } +}; + +template +class InvokeHelper > { + public: + template + static R Invoke(Function function, const ::testing::tuple& args) { + return function(get<0>(args), get<1>(args), get<2>(args), + get<3>(args), get<4>(args), get<5>(args), get<6>(args), + get<7>(args)); + } + + template + static R InvokeMethod(Class* obj_ptr, + MethodPtr method_ptr, + const ::testing::tuple& args) { + return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), + get<2>(args), get<3>(args), get<4>(args), get<5>(args), + get<6>(args), get<7>(args)); + } +}; + +template +class InvokeHelper > { + public: + template + static R Invoke(Function function, const ::testing::tuple& args) { + return function(get<0>(args), get<1>(args), get<2>(args), + get<3>(args), get<4>(args), get<5>(args), get<6>(args), + get<7>(args), get<8>(args)); + } + + template + static R InvokeMethod(Class* obj_ptr, + MethodPtr method_ptr, + const ::testing::tuple& args) { + return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), + get<2>(args), get<3>(args), get<4>(args), get<5>(args), + get<6>(args), get<7>(args), get<8>(args)); + } +}; + +template +class InvokeHelper > { + public: + template + static R Invoke(Function function, const ::testing::tuple& args) { + return function(get<0>(args), get<1>(args), get<2>(args), + get<3>(args), get<4>(args), get<5>(args), get<6>(args), + get<7>(args), get<8>(args), get<9>(args)); + } + + template + static R InvokeMethod(Class* obj_ptr, + MethodPtr method_ptr, + const ::testing::tuple& args) { + return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), + get<2>(args), get<3>(args), get<4>(args), get<5>(args), + get<6>(args), get<7>(args), get<8>(args), get<9>(args)); + } +}; + +// An INTERNAL macro for extracting the type of a tuple field. It's +// subject to change without notice - DO NOT USE IN USER CODE! +#define GMOCK_FIELD_(Tuple, N) \ + typename ::testing::tuple_element::type + +// SelectArgs::type is the +// type of an n-ary function whose i-th (1-based) argument type is the +// k{i}-th (0-based) field of ArgumentTuple, which must be a tuple +// type, and whose return type is Result. For example, +// SelectArgs, 0, 3>::type +// is int(bool, long). +// +// SelectArgs::Select(args) +// returns the selected fields (k1, k2, ..., k_n) of args as a tuple. +// For example, +// SelectArgs, 2, 0>::Select( +// ::testing::make_tuple(true, 'a', 2.5)) +// returns tuple (2.5, true). +// +// The numbers in list k1, k2, ..., k_n must be >= 0, where n can be +// in the range [0, 10]. Duplicates are allowed and they don't have +// to be in an ascending or descending order. + +template +class SelectArgs { + public: + typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), + GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), + GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), + GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7), + GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9), + GMOCK_FIELD_(ArgumentTuple, k10)); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& args) { + return SelectedArgs(get(args), get(args), get(args), + get(args), get(args), get(args), get(args), + get(args), get(args), get(args)); + } +}; + +template +class SelectArgs { + public: + typedef Result type(); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& /* args */) { + return SelectedArgs(); + } +}; + +template +class SelectArgs { + public: + typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1)); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& args) { + return SelectedArgs(get(args)); + } +}; + +template +class SelectArgs { + public: + typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), + GMOCK_FIELD_(ArgumentTuple, k2)); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& args) { + return SelectedArgs(get(args), get(args)); + } +}; + +template +class SelectArgs { + public: + typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), + GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3)); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& args) { + return SelectedArgs(get(args), get(args), get(args)); + } +}; + +template +class SelectArgs { + public: + typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), + GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), + GMOCK_FIELD_(ArgumentTuple, k4)); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& args) { + return SelectedArgs(get(args), get(args), get(args), + get(args)); + } +}; + +template +class SelectArgs { + public: + typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), + GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), + GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5)); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& args) { + return SelectedArgs(get(args), get(args), get(args), + get(args), get(args)); + } +}; + +template +class SelectArgs { + public: + typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), + GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), + GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), + GMOCK_FIELD_(ArgumentTuple, k6)); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& args) { + return SelectedArgs(get(args), get(args), get(args), + get(args), get(args), get(args)); + } +}; + +template +class SelectArgs { + public: + typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), + GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), + GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), + GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7)); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& args) { + return SelectedArgs(get(args), get(args), get(args), + get(args), get(args), get(args), get(args)); + } +}; + +template +class SelectArgs { + public: + typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), + GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), + GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), + GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7), + GMOCK_FIELD_(ArgumentTuple, k8)); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& args) { + return SelectedArgs(get(args), get(args), get(args), + get(args), get(args), get(args), get(args), + get(args)); + } +}; + +template +class SelectArgs { + public: + typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), + GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), + GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), + GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7), + GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9)); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& args) { + return SelectedArgs(get(args), get(args), get(args), + get(args), get(args), get(args), get(args), + get(args), get(args)); + } +}; + +#undef GMOCK_FIELD_ + +// Implements the WithArgs action. +template +class WithArgsAction { + public: + explicit WithArgsAction(const InnerAction& action) : action_(action) {} + + template + operator Action() const { return MakeAction(new Impl(action_)); } + + private: + template + class Impl : public ActionInterface { + public: + typedef typename Function::Result Result; + typedef typename Function::ArgumentTuple ArgumentTuple; + + explicit Impl(const InnerAction& action) : action_(action) {} + + virtual Result Perform(const ArgumentTuple& args) { + return action_.Perform(SelectArgs::Select(args)); + } + + private: + typedef typename SelectArgs::type InnerFunctionType; + + Action action_; + }; + + const InnerAction action_; + + GTEST_DISALLOW_ASSIGN_(WithArgsAction); +}; + +// A macro from the ACTION* family (defined later in this file) +// defines an action that can be used in a mock function. Typically, +// these actions only care about a subset of the arguments of the mock +// function. For example, if such an action only uses the second +// argument, it can be used in any mock function that takes >= 2 +// arguments where the type of the second argument is compatible. +// +// Therefore, the action implementation must be prepared to take more +// arguments than it needs. The ExcessiveArg type is used to +// represent those excessive arguments. In order to keep the compiler +// error messages tractable, we define it in the testing namespace +// instead of testing::internal. However, this is an INTERNAL TYPE +// and subject to change without notice, so a user MUST NOT USE THIS +// TYPE DIRECTLY. +struct ExcessiveArg {}; + +// A helper class needed for implementing the ACTION* macros. +template +class ActionHelper { + public: + static Result Perform(Impl* impl, const ::testing::tuple<>& args) { + return impl->template gmock_PerformImpl<>(args, ExcessiveArg(), + ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), + ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), + ExcessiveArg()); + } + + template + static Result Perform(Impl* impl, const ::testing::tuple& args) { + return impl->template gmock_PerformImpl(args, get<0>(args), + ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), + ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), + ExcessiveArg()); + } + + template + static Result Perform(Impl* impl, const ::testing::tuple& args) { + return impl->template gmock_PerformImpl(args, get<0>(args), + get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), + ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), + ExcessiveArg()); + } + + template + static Result Perform(Impl* impl, const ::testing::tuple& args) { + return impl->template gmock_PerformImpl(args, get<0>(args), + get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(), + ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), + ExcessiveArg()); + } + + template + static Result Perform(Impl* impl, const ::testing::tuple& args) { + return impl->template gmock_PerformImpl(args, get<0>(args), + get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(), + ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), + ExcessiveArg()); + } + + template + static Result Perform(Impl* impl, const ::testing::tuple& args) { + return impl->template gmock_PerformImpl(args, + get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), + ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), + ExcessiveArg()); + } + + template + static Result Perform(Impl* impl, const ::testing::tuple& args) { + return impl->template gmock_PerformImpl(args, + get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), + get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), + ExcessiveArg()); + } + + template + static Result Perform(Impl* impl, const ::testing::tuple& args) { + return impl->template gmock_PerformImpl(args, + get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), + get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(), + ExcessiveArg()); + } + + template + static Result Perform(Impl* impl, const ::testing::tuple& args) { + return impl->template gmock_PerformImpl(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), + get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(), + ExcessiveArg()); + } + + template + static Result Perform(Impl* impl, const ::testing::tuple& args) { + return impl->template gmock_PerformImpl(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), + get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args), + ExcessiveArg()); + } + + template + static Result Perform(Impl* impl, const ::testing::tuple& args) { + return impl->template gmock_PerformImpl(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), + get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args), + get<9>(args)); + } +}; + +} // namespace internal + +// Various overloads for Invoke(). + +// WithArgs(an_action) creates an action that passes +// the selected arguments of the mock function to an_action and +// performs it. It serves as an adaptor between actions with +// different argument lists. C++ doesn't support default arguments for +// function templates, so we have to overload it. +template +inline internal::WithArgsAction +WithArgs(const InnerAction& action) { + return internal::WithArgsAction(action); +} + +template +inline internal::WithArgsAction +WithArgs(const InnerAction& action) { + return internal::WithArgsAction(action); +} + +template +inline internal::WithArgsAction +WithArgs(const InnerAction& action) { + return internal::WithArgsAction(action); +} + +template +inline internal::WithArgsAction +WithArgs(const InnerAction& action) { + return internal::WithArgsAction(action); +} + +template +inline internal::WithArgsAction +WithArgs(const InnerAction& action) { + return internal::WithArgsAction(action); +} + +template +inline internal::WithArgsAction +WithArgs(const InnerAction& action) { + return internal::WithArgsAction(action); +} + +template +inline internal::WithArgsAction +WithArgs(const InnerAction& action) { + return internal::WithArgsAction(action); +} + +template +inline internal::WithArgsAction +WithArgs(const InnerAction& action) { + return internal::WithArgsAction(action); +} + +template +inline internal::WithArgsAction +WithArgs(const InnerAction& action) { + return internal::WithArgsAction(action); +} + +template +inline internal::WithArgsAction +WithArgs(const InnerAction& action) { + return internal::WithArgsAction(action); +} + +// Creates an action that does actions a1, a2, ..., sequentially in +// each invocation. +template +inline internal::DoBothAction +DoAll(Action1 a1, Action2 a2) { + return internal::DoBothAction(a1, a2); +} + +template +inline internal::DoBothAction > +DoAll(Action1 a1, Action2 a2, Action3 a3) { + return DoAll(a1, DoAll(a2, a3)); +} + +template +inline internal::DoBothAction > > +DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) { + return DoAll(a1, DoAll(a2, a3, a4)); +} + +template +inline internal::DoBothAction > > > +DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) { + return DoAll(a1, DoAll(a2, a3, a4, a5)); +} + +template +inline internal::DoBothAction > > > > +DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) { + return DoAll(a1, DoAll(a2, a3, a4, a5, a6)); +} + +template +inline internal::DoBothAction > > > > > +DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, + Action7 a7) { + return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7)); +} + +template +inline internal::DoBothAction > > > > > > +DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, + Action7 a7, Action8 a8) { + return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8)); +} + +template +inline internal::DoBothAction > > > > > > > +DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, + Action7 a7, Action8 a8, Action9 a9) { + return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9)); +} + +template +inline internal::DoBothAction > > > > > > > > +DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, + Action7 a7, Action8 a8, Action9 a9, Action10 a10) { + return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10)); +} + +} // namespace testing + +// The ACTION* family of macros can be used in a namespace scope to +// define custom actions easily. The syntax: +// +// ACTION(name) { statements; } +// +// will define an action with the given name that executes the +// statements. The value returned by the statements will be used as +// the return value of the action. Inside the statements, you can +// refer to the K-th (0-based) argument of the mock function by +// 'argK', and refer to its type by 'argK_type'. For example: +// +// ACTION(IncrementArg1) { +// arg1_type temp = arg1; +// return ++(*temp); +// } +// +// allows you to write +// +// ...WillOnce(IncrementArg1()); +// +// You can also refer to the entire argument tuple and its type by +// 'args' and 'args_type', and refer to the mock function type and its +// return type by 'function_type' and 'return_type'. +// +// Note that you don't need to specify the types of the mock function +// arguments. However rest assured that your code is still type-safe: +// you'll get a compiler error if *arg1 doesn't support the ++ +// operator, or if the type of ++(*arg1) isn't compatible with the +// mock function's return type, for example. +// +// Sometimes you'll want to parameterize the action. For that you can use +// another macro: +// +// ACTION_P(name, param_name) { statements; } +// +// For example: +// +// ACTION_P(Add, n) { return arg0 + n; } +// +// will allow you to write: +// +// ...WillOnce(Add(5)); +// +// Note that you don't need to provide the type of the parameter +// either. If you need to reference the type of a parameter named +// 'foo', you can write 'foo_type'. For example, in the body of +// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type +// of 'n'. +// +// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support +// multi-parameter actions. +// +// For the purpose of typing, you can view +// +// ACTION_Pk(Foo, p1, ..., pk) { ... } +// +// as shorthand for +// +// template +// FooActionPk Foo(p1_type p1, ..., pk_type pk) { ... } +// +// In particular, you can provide the template type arguments +// explicitly when invoking Foo(), as in Foo(5, false); +// although usually you can rely on the compiler to infer the types +// for you automatically. You can assign the result of expression +// Foo(p1, ..., pk) to a variable of type FooActionPk. This can be useful when composing actions. +// +// You can also overload actions with different numbers of parameters: +// +// ACTION_P(Plus, a) { ... } +// ACTION_P2(Plus, a, b) { ... } +// +// While it's tempting to always use the ACTION* macros when defining +// a new action, you should also consider implementing ActionInterface +// or using MakePolymorphicAction() instead, especially if you need to +// use the action a lot. While these approaches require more work, +// they give you more control on the types of the mock function +// arguments and the action parameters, which in general leads to +// better compiler error messages that pay off in the long run. They +// also allow overloading actions based on parameter types (as opposed +// to just based on the number of parameters). +// +// CAVEAT: +// +// ACTION*() can only be used in a namespace scope. The reason is +// that C++ doesn't yet allow function-local types to be used to +// instantiate templates. The up-coming C++0x standard will fix this. +// Once that's done, we'll consider supporting using ACTION*() inside +// a function. +// +// MORE INFORMATION: +// +// To learn more about using these macros, please search for 'ACTION' +// on https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md + +// An internal macro needed for implementing ACTION*(). +#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\ + const args_type& args GTEST_ATTRIBUTE_UNUSED_, \ + arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_, \ + arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_, \ + arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_, \ + arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_, \ + arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_, \ + arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_, \ + arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_, \ + arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_, \ + arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_, \ + arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_ + +// Sometimes you want to give an action explicit template parameters +// that cannot be inferred from its value parameters. ACTION() and +// ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that +// and can be viewed as an extension to ACTION() and ACTION_P*(). +// +// The syntax: +// +// ACTION_TEMPLATE(ActionName, +// HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), +// AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } +// +// defines an action template that takes m explicit template +// parameters and n value parameters. name_i is the name of the i-th +// template parameter, and kind_i specifies whether it's a typename, +// an integral constant, or a template. p_i is the name of the i-th +// value parameter. +// +// Example: +// +// // DuplicateArg(output) converts the k-th argument of the mock +// // function to type T and copies it to *output. +// ACTION_TEMPLATE(DuplicateArg, +// HAS_2_TEMPLATE_PARAMS(int, k, typename, T), +// AND_1_VALUE_PARAMS(output)) { +// *output = T(::testing::get(args)); +// } +// ... +// int n; +// EXPECT_CALL(mock, Foo(_, _)) +// .WillOnce(DuplicateArg<1, unsigned char>(&n)); +// +// To create an instance of an action template, write: +// +// ActionName(v1, ..., v_n) +// +// where the ts are the template arguments and the vs are the value +// arguments. The value argument types are inferred by the compiler. +// If you want to explicitly specify the value argument types, you can +// provide additional template arguments: +// +// ActionName(v1, ..., v_n) +// +// where u_i is the desired type of v_i. +// +// ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the +// number of value parameters, but not on the number of template +// parameters. Without the restriction, the meaning of the following +// is unclear: +// +// OverloadedAction(x); +// +// Are we using a single-template-parameter action where 'bool' refers +// to the type of x, or are we using a two-template-parameter action +// where the compiler is asked to infer the type of x? +// +// Implementation notes: +// +// GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and +// GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for +// implementing ACTION_TEMPLATE. The main trick we use is to create +// new macro invocations when expanding a macro. For example, we have +// +// #define ACTION_TEMPLATE(name, template_params, value_params) +// ... GMOCK_INTERNAL_DECL_##template_params ... +// +// which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...) +// to expand to +// +// ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ... +// +// Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the +// preprocessor will continue to expand it to +// +// ... typename T ... +// +// This technique conforms to the C++ standard and is portable. It +// allows us to implement action templates using O(N) code, where N is +// the maximum number of template/value parameters supported. Without +// using it, we'd have to devote O(N^2) amount of code to implement all +// combinations of m and n. + +// Declares the template parameters. +#define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0 +#define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \ + name1) kind0 name0, kind1 name1 +#define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2) kind0 name0, kind1 name1, kind2 name2 +#define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \ + kind3 name3 +#define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \ + kind2 name2, kind3 name3, kind4 name4 +#define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \ + kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5 +#define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ + name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \ + kind5 name5, kind6 name6 +#define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ + kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \ + kind4 name4, kind5 name5, kind6 name6, kind7 name7 +#define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ + kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \ + kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \ + kind8 name8 +#define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \ + name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ + name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \ + kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \ + kind6 name6, kind7 name7, kind8 name8, kind9 name9 + +// Lists the template parameters. +#define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0 +#define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \ + name1) name0, name1 +#define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2) name0, name1, name2 +#define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2, kind3, name3) name0, name1, name2, name3 +#define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \ + name4 +#define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \ + name2, name3, name4, name5 +#define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ + name6) name0, name1, name2, name3, name4, name5, name6 +#define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ + kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7 +#define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ + kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ + kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \ + name6, name7, name8 +#define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \ + name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ + name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \ + name3, name4, name5, name6, name7, name8, name9 + +// Declares the types of value parameters. +#define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS() +#define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type +#define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \ + typename p0##_type, typename p1##_type +#define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \ + typename p0##_type, typename p1##_type, typename p2##_type +#define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \ + typename p0##_type, typename p1##_type, typename p2##_type, \ + typename p3##_type +#define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \ + typename p0##_type, typename p1##_type, typename p2##_type, \ + typename p3##_type, typename p4##_type +#define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \ + typename p0##_type, typename p1##_type, typename p2##_type, \ + typename p3##_type, typename p4##_type, typename p5##_type +#define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ + p6) , typename p0##_type, typename p1##_type, typename p2##_type, \ + typename p3##_type, typename p4##_type, typename p5##_type, \ + typename p6##_type +#define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ + p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \ + typename p3##_type, typename p4##_type, typename p5##_type, \ + typename p6##_type, typename p7##_type +#define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ + p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \ + typename p3##_type, typename p4##_type, typename p5##_type, \ + typename p6##_type, typename p7##_type, typename p8##_type +#define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ + p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \ + typename p2##_type, typename p3##_type, typename p4##_type, \ + typename p5##_type, typename p6##_type, typename p7##_type, \ + typename p8##_type, typename p9##_type + +// Initializes the value parameters. +#define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\ + () +#define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\ + (p0##_type gmock_p0) : p0(gmock_p0) +#define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\ + (p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), p1(gmock_p1) +#define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\ + (p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) +#define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\ + (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3) +#define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\ + (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), \ + p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) +#define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\ + (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, \ + p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) +#define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\ + (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ + p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) +#define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\ + (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ + p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), \ + p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ + p7(gmock_p7) +#define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7, p8)\ + (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ + p6##_type gmock_p6, p7##_type gmock_p7, \ + p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ + p8(gmock_p8) +#define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7, p8, p9)\ + (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ + p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ + p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ + p8(gmock_p8), p9(gmock_p9) + +// Declares the fields for storing the value parameters. +#define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS() +#define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0; +#define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \ + p1##_type p1; +#define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \ + p1##_type p1; p2##_type p2; +#define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \ + p1##_type p1; p2##_type p2; p3##_type p3; +#define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \ + p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; +#define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \ + p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ + p5##_type p5; +#define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ + p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ + p5##_type p5; p6##_type p6; +#define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ + p5##_type p5; p6##_type p6; p7##_type p7; +#define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \ + p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; +#define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \ + p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \ + p9##_type p9; + +// Lists the value parameters. +#define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS() +#define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0 +#define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1 +#define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2 +#define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3 +#define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \ + p2, p3, p4 +#define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \ + p1, p2, p3, p4, p5 +#define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ + p6) p0, p1, p2, p3, p4, p5, p6 +#define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7) p0, p1, p2, p3, p4, p5, p6, p7 +#define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8 +#define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 + +// Lists the value parameter types. +#define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS() +#define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type +#define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \ + p1##_type +#define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \ + p1##_type, p2##_type +#define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \ + p0##_type, p1##_type, p2##_type, p3##_type +#define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \ + p0##_type, p1##_type, p2##_type, p3##_type, p4##_type +#define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \ + p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type +#define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ + p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \ + p6##_type +#define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ + p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ + p5##_type, p6##_type, p7##_type +#define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ + p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ + p5##_type, p6##_type, p7##_type, p8##_type +#define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ + p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ + p5##_type, p6##_type, p7##_type, p8##_type, p9##_type + +// Declares the value parameters. +#define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS() +#define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0 +#define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \ + p1##_type p1 +#define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \ + p1##_type p1, p2##_type p2 +#define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \ + p1##_type p1, p2##_type p2, p3##_type p3 +#define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \ + p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4 +#define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \ + p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ + p5##_type p5 +#define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ + p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ + p5##_type p5, p6##_type p6 +#define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ + p5##_type p5, p6##_type p6, p7##_type p7 +#define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ + p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8 +#define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ + p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ + p9##_type p9 + +// The suffix of the class template implementing the action template. +#define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS() +#define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P +#define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2 +#define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3 +#define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4 +#define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5 +#define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6 +#define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7 +#define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7) P8 +#define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7, p8) P9 +#define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ + p7, p8, p9) P10 + +// The name of the class template implementing the action template. +#define GMOCK_ACTION_CLASS_(name, value_params)\ + GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params) + +#define ACTION_TEMPLATE(name, template_params, value_params)\ + template \ + class GMOCK_ACTION_CLASS_(name, value_params) {\ + public:\ + explicit GMOCK_ACTION_CLASS_(name, value_params)\ + GMOCK_INTERNAL_INIT_##value_params {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template \ + return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ + arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ + arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ + arg9_type arg9) const;\ + GMOCK_INTERNAL_DEFN_##value_params\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(\ + new gmock_Impl(GMOCK_INTERNAL_LIST_##value_params));\ + }\ + GMOCK_INTERNAL_DEFN_##value_params\ + private:\ + GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\ + };\ + template \ + inline GMOCK_ACTION_CLASS_(name, value_params)<\ + GMOCK_INTERNAL_LIST_##template_params\ + GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ + GMOCK_INTERNAL_DECL_##value_params) {\ + return GMOCK_ACTION_CLASS_(name, value_params)<\ + GMOCK_INTERNAL_LIST_##template_params\ + GMOCK_INTERNAL_LIST_TYPE_##value_params>(\ + GMOCK_INTERNAL_LIST_##value_params);\ + }\ + template \ + template \ + template \ + typename ::testing::internal::Function::Result\ + GMOCK_ACTION_CLASS_(name, value_params)<\ + GMOCK_INTERNAL_LIST_##template_params\ + GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl::\ + gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +#define ACTION(name)\ + class name##Action {\ + public:\ + name##Action() {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + gmock_Impl() {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template \ + return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ + arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ + arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ + arg9_type arg9) const;\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(new gmock_Impl());\ + }\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##Action);\ + };\ + inline name##Action name() {\ + return name##Action();\ + }\ + template \ + template \ + typename ::testing::internal::Function::Result\ + name##Action::gmock_Impl::gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +#define ACTION_P(name, p0)\ + template \ + class name##ActionP {\ + public:\ + explicit name##ActionP(p0##_type gmock_p0) : p0(gmock_p0) {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + explicit gmock_Impl(p0##_type gmock_p0) : p0(gmock_p0) {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template \ + return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ + arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ + arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ + arg9_type arg9) const;\ + p0##_type p0;\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(new gmock_Impl(p0));\ + }\ + p0##_type p0;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##ActionP);\ + };\ + template \ + inline name##ActionP name(p0##_type p0) {\ + return name##ActionP(p0);\ + }\ + template \ + template \ + template \ + typename ::testing::internal::Function::Result\ + name##ActionP::gmock_Impl::gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +#define ACTION_P2(name, p0, p1)\ + template \ + class name##ActionP2 {\ + public:\ + name##ActionP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ + p1(gmock_p1) {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ + p1(gmock_p1) {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template \ + return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ + arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ + arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ + arg9_type arg9) const;\ + p0##_type p0;\ + p1##_type p1;\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(new gmock_Impl(p0, p1));\ + }\ + p0##_type p0;\ + p1##_type p1;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##ActionP2);\ + };\ + template \ + inline name##ActionP2 name(p0##_type p0, \ + p1##_type p1) {\ + return name##ActionP2(p0, p1);\ + }\ + template \ + template \ + template \ + typename ::testing::internal::Function::Result\ + name##ActionP2::gmock_Impl::gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +#define ACTION_P3(name, p0, p1, p2)\ + template \ + class name##ActionP3 {\ + public:\ + name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template \ + return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ + arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ + arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ + arg9_type arg9) const;\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(new gmock_Impl(p0, p1, p2));\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##ActionP3);\ + };\ + template \ + inline name##ActionP3 name(p0##_type p0, \ + p1##_type p1, p2##_type p2) {\ + return name##ActionP3(p0, p1, p2);\ + }\ + template \ + template \ + template \ + typename ::testing::internal::Function::Result\ + name##ActionP3::gmock_Impl::gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +#define ACTION_P4(name, p0, p1, p2, p3)\ + template \ + class name##ActionP4 {\ + public:\ + name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \ + p2(gmock_p2), p3(gmock_p3) {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3) {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template \ + return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ + arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ + arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ + arg9_type arg9) const;\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(new gmock_Impl(p0, p1, p2, p3));\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##ActionP4);\ + };\ + template \ + inline name##ActionP4 name(p0##_type p0, p1##_type p1, p2##_type p2, \ + p3##_type p3) {\ + return name##ActionP4(p0, p1, \ + p2, p3);\ + }\ + template \ + template \ + template \ + typename ::testing::internal::Function::Result\ + name##ActionP4::gmock_Impl::gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +#define ACTION_P5(name, p0, p1, p2, p3, p4)\ + template \ + class name##ActionP5 {\ + public:\ + name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3, \ + p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4) {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), \ + p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template \ + return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ + arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ + arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ + arg9_type arg9) const;\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4));\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##ActionP5);\ + };\ + template \ + inline name##ActionP5 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ + p4##_type p4) {\ + return name##ActionP5(p0, p1, p2, p3, p4);\ + }\ + template \ + template \ + template \ + typename ::testing::internal::Function::Result\ + name##ActionP5::gmock_Impl::gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +#define ACTION_P6(name, p0, p1, p2, p3, p4, p5)\ + template \ + class name##ActionP6 {\ + public:\ + name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ + p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, \ + p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template \ + return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ + arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ + arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ + arg9_type arg9) const;\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5));\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##ActionP6);\ + };\ + template \ + inline name##ActionP6 name(p0##_type p0, p1##_type p1, p2##_type p2, \ + p3##_type p3, p4##_type p4, p5##_type p5) {\ + return name##ActionP6(p0, p1, p2, p3, p4, p5);\ + }\ + template \ + template \ + template \ + typename ::testing::internal::Function::Result\ + name##ActionP6::gmock_Impl::gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +#define ACTION_P7(name, p0, p1, p2, p3, p4, p5, p6)\ + template \ + class name##ActionP7 {\ + public:\ + name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ + p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \ + p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \ + p6(gmock_p6) {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ + p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template \ + return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ + arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ + arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ + arg9_type arg9) const;\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5, \ + p6));\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##ActionP7);\ + };\ + template \ + inline name##ActionP7 name(p0##_type p0, p1##_type p1, \ + p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ + p6##_type p6) {\ + return name##ActionP7(p0, p1, p2, p3, p4, p5, p6);\ + }\ + template \ + template \ + template \ + typename ::testing::internal::Function::Result\ + name##ActionP7::gmock_Impl::gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +#define ACTION_P8(name, p0, p1, p2, p3, p4, p5, p6, p7)\ + template \ + class name##ActionP8 {\ + public:\ + name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ + p5##_type gmock_p5, p6##_type gmock_p6, \ + p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ + p7(gmock_p7) {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ + p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), \ + p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), \ + p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template \ + return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ + arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ + arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ + arg9_type arg9) const;\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + p7##_type p7;\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5, \ + p6, p7));\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + p7##_type p7;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##ActionP8);\ + };\ + template \ + inline name##ActionP8 name(p0##_type p0, \ + p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ + p6##_type p6, p7##_type p7) {\ + return name##ActionP8(p0, p1, p2, p3, p4, p5, \ + p6, p7);\ + }\ + template \ + template \ + template \ + typename ::testing::internal::Function::Result\ + name##ActionP8::gmock_Impl::gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +#define ACTION_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)\ + template \ + class name##ActionP9 {\ + public:\ + name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ + p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ + p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ + p8(gmock_p8) {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ + p6##_type gmock_p6, p7##_type gmock_p7, \ + p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ + p7(gmock_p7), p8(gmock_p8) {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template \ + return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ + arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ + arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ + arg9_type arg9) const;\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + p7##_type p7;\ + p8##_type p8;\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5, \ + p6, p7, p8));\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + p7##_type p7;\ + p8##_type p8;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##ActionP9);\ + };\ + template \ + inline name##ActionP9 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ + p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \ + p8##_type p8) {\ + return name##ActionP9(p0, p1, p2, \ + p3, p4, p5, p6, p7, p8);\ + }\ + template \ + template \ + template \ + typename ::testing::internal::Function::Result\ + name##ActionP9::gmock_Impl::gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +#define ACTION_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)\ + template \ + class name##ActionP10 {\ + public:\ + name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ + p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ + p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \ + p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ + p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ + p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ + p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ + p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template \ + return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ + arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ + arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ + arg9_type arg9) const;\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + p7##_type p7;\ + p8##_type p8;\ + p9##_type p9;\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(new gmock_Impl(p0, p1, p2, p3, p4, p5, \ + p6, p7, p8, p9));\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + p7##_type p7;\ + p8##_type p8;\ + p9##_type p9;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##ActionP10);\ + };\ + template \ + inline name##ActionP10 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ + p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ + p9##_type p9) {\ + return name##ActionP10(p0, \ + p1, p2, p3, p4, p5, p6, p7, p8, p9);\ + }\ + template \ + template \ + template \ + typename ::testing::internal::Function::Result\ + name##ActionP10::gmock_Impl::gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +namespace testing { + + +// The ACTION*() macros trigger warning C4100 (unreferenced formal +// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in +// the macro definition, as the warnings are generated when the macro +// is expanded and macro expansion cannot contain #pragma. Therefore +// we suppress them here. +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable:4100) +#endif + +// Various overloads for InvokeArgument(). +// +// The InvokeArgument(a1, a2, ..., a_k) action invokes the N-th +// (0-based) argument, which must be a k-ary callable, of the mock +// function, with arguments a1, a2, ..., a_k. +// +// Notes: +// +// 1. The arguments are passed by value by default. If you need to +// pass an argument by reference, wrap it inside ByRef(). For +// example, +// +// InvokeArgument<1>(5, string("Hello"), ByRef(foo)) +// +// passes 5 and string("Hello") by value, and passes foo by +// reference. +// +// 2. If the callable takes an argument by reference but ByRef() is +// not used, it will receive the reference to a copy of the value, +// instead of the original value. For example, when the 0-th +// argument of the mock function takes a const string&, the action +// +// InvokeArgument<0>(string("Hello")) +// +// makes a copy of the temporary string("Hello") object and passes a +// reference of the copy, instead of the original temporary object, +// to the callable. This makes it easy for a user to define an +// InvokeArgument action from temporary values and have it performed +// later. + +namespace internal { +namespace invoke_argument { + +// Appears in InvokeArgumentAdl's argument list to help avoid +// accidental calls to user functions of the same name. +struct AdlTag {}; + +// InvokeArgumentAdl - a helper for InvokeArgument. +// The basic overloads are provided here for generic functors. +// Overloads for other custom-callables are provided in the +// internal/custom/callback-actions.h header. + +template +R InvokeArgumentAdl(AdlTag, F f) { + return f(); +} +template +R InvokeArgumentAdl(AdlTag, F f, A1 a1) { + return f(a1); +} +template +R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2) { + return f(a1, a2); +} +template +R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3) { + return f(a1, a2, a3); +} +template +R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4) { + return f(a1, a2, a3, a4); +} +template +R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { + return f(a1, a2, a3, a4, a5); +} +template +R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { + return f(a1, a2, a3, a4, a5, a6); +} +template +R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, + A7 a7) { + return f(a1, a2, a3, a4, a5, a6, a7); +} +template +R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, + A7 a7, A8 a8) { + return f(a1, a2, a3, a4, a5, a6, a7, a8); +} +template +R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, + A7 a7, A8 a8, A9 a9) { + return f(a1, a2, a3, a4, a5, a6, a7, a8, a9); +} +template +R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, + A7 a7, A8 a8, A9 a9, A10 a10) { + return f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); +} +} // namespace invoke_argument +} // namespace internal + +ACTION_TEMPLATE(InvokeArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_0_VALUE_PARAMS()) { + using internal::invoke_argument::InvokeArgumentAdl; + return InvokeArgumentAdl( + internal::invoke_argument::AdlTag(), + ::testing::get(args)); +} + +ACTION_TEMPLATE(InvokeArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_1_VALUE_PARAMS(p0)) { + using internal::invoke_argument::InvokeArgumentAdl; + return InvokeArgumentAdl( + internal::invoke_argument::AdlTag(), + ::testing::get(args), p0); +} + +ACTION_TEMPLATE(InvokeArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_2_VALUE_PARAMS(p0, p1)) { + using internal::invoke_argument::InvokeArgumentAdl; + return InvokeArgumentAdl( + internal::invoke_argument::AdlTag(), + ::testing::get(args), p0, p1); +} + +ACTION_TEMPLATE(InvokeArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_3_VALUE_PARAMS(p0, p1, p2)) { + using internal::invoke_argument::InvokeArgumentAdl; + return InvokeArgumentAdl( + internal::invoke_argument::AdlTag(), + ::testing::get(args), p0, p1, p2); +} + +ACTION_TEMPLATE(InvokeArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_4_VALUE_PARAMS(p0, p1, p2, p3)) { + using internal::invoke_argument::InvokeArgumentAdl; + return InvokeArgumentAdl( + internal::invoke_argument::AdlTag(), + ::testing::get(args), p0, p1, p2, p3); +} + +ACTION_TEMPLATE(InvokeArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) { + using internal::invoke_argument::InvokeArgumentAdl; + return InvokeArgumentAdl( + internal::invoke_argument::AdlTag(), + ::testing::get(args), p0, p1, p2, p3, p4); +} + +ACTION_TEMPLATE(InvokeArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) { + using internal::invoke_argument::InvokeArgumentAdl; + return InvokeArgumentAdl( + internal::invoke_argument::AdlTag(), + ::testing::get(args), p0, p1, p2, p3, p4, p5); +} + +ACTION_TEMPLATE(InvokeArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) { + using internal::invoke_argument::InvokeArgumentAdl; + return InvokeArgumentAdl( + internal::invoke_argument::AdlTag(), + ::testing::get(args), p0, p1, p2, p3, p4, p5, p6); +} + +ACTION_TEMPLATE(InvokeArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) { + using internal::invoke_argument::InvokeArgumentAdl; + return InvokeArgumentAdl( + internal::invoke_argument::AdlTag(), + ::testing::get(args), p0, p1, p2, p3, p4, p5, p6, p7); +} + +ACTION_TEMPLATE(InvokeArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) { + using internal::invoke_argument::InvokeArgumentAdl; + return InvokeArgumentAdl( + internal::invoke_argument::AdlTag(), + ::testing::get(args), p0, p1, p2, p3, p4, p5, p6, p7, p8); +} + +ACTION_TEMPLATE(InvokeArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) { + using internal::invoke_argument::InvokeArgumentAdl; + return InvokeArgumentAdl( + internal::invoke_argument::AdlTag(), + ::testing::get(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); +} + +// Various overloads for ReturnNew(). +// +// The ReturnNew(a1, a2, ..., a_k) action returns a pointer to a new +// instance of type T, constructed on the heap with constructor arguments +// a1, a2, ..., and a_k. The caller assumes ownership of the returned value. +ACTION_TEMPLATE(ReturnNew, + HAS_1_TEMPLATE_PARAMS(typename, T), + AND_0_VALUE_PARAMS()) { + return new T(); +} + +ACTION_TEMPLATE(ReturnNew, + HAS_1_TEMPLATE_PARAMS(typename, T), + AND_1_VALUE_PARAMS(p0)) { + return new T(p0); +} + +ACTION_TEMPLATE(ReturnNew, + HAS_1_TEMPLATE_PARAMS(typename, T), + AND_2_VALUE_PARAMS(p0, p1)) { + return new T(p0, p1); +} + +ACTION_TEMPLATE(ReturnNew, + HAS_1_TEMPLATE_PARAMS(typename, T), + AND_3_VALUE_PARAMS(p0, p1, p2)) { + return new T(p0, p1, p2); +} + +ACTION_TEMPLATE(ReturnNew, + HAS_1_TEMPLATE_PARAMS(typename, T), + AND_4_VALUE_PARAMS(p0, p1, p2, p3)) { + return new T(p0, p1, p2, p3); +} + +ACTION_TEMPLATE(ReturnNew, + HAS_1_TEMPLATE_PARAMS(typename, T), + AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) { + return new T(p0, p1, p2, p3, p4); +} + +ACTION_TEMPLATE(ReturnNew, + HAS_1_TEMPLATE_PARAMS(typename, T), + AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) { + return new T(p0, p1, p2, p3, p4, p5); +} + +ACTION_TEMPLATE(ReturnNew, + HAS_1_TEMPLATE_PARAMS(typename, T), + AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) { + return new T(p0, p1, p2, p3, p4, p5, p6); +} + +ACTION_TEMPLATE(ReturnNew, + HAS_1_TEMPLATE_PARAMS(typename, T), + AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) { + return new T(p0, p1, p2, p3, p4, p5, p6, p7); +} + +ACTION_TEMPLATE(ReturnNew, + HAS_1_TEMPLATE_PARAMS(typename, T), + AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) { + return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8); +} + +ACTION_TEMPLATE(ReturnNew, + HAS_1_TEMPLATE_PARAMS(typename, T), + AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) { + return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); +} + +#ifdef _MSC_VER +# pragma warning(pop) +#endif + +} // namespace testing + +// Include any custom actions added by the local installation. +// We must include this header at the end to make sure it can use the +// declarations from this file. +#include "gmock/internal/custom/gmock-generated-actions.h" + +#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-actions.h.pump vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-actions.h.pump --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-actions.h.pump 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-actions.h.pump 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,794 @@ +$$ -*- mode: c++; -*- +$$ This is a Pump source file. Please use Pump to convert it to +$$ gmock-generated-actions.h. +$$ +$var n = 10 $$ The maximum arity we support. +$$}} This meta comment fixes auto-indentation in editors. +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used variadic actions. + +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ + +#include "gmock/gmock-actions.h" +#include "gmock/internal/gmock-port.h" + +namespace testing { +namespace internal { + +// InvokeHelper knows how to unpack an N-tuple and invoke an N-ary +// function or method with the unpacked values, where F is a function +// type that takes N arguments. +template +class InvokeHelper; + + +$range i 0..n +$for i [[ +$range j 1..i +$var types = [[$for j [[, typename A$j]]]] +$var as = [[$for j, [[A$j]]]] +$var args = [[$if i==0 [[]] $else [[ args]]]] +$var gets = [[$for j, [[get<$(j - 1)>(args)]]]] +template +class InvokeHelper > { + public: + template + static R Invoke(Function function, const ::testing::tuple<$as>&$args) { + return function($gets); + } + + template + static R InvokeMethod(Class* obj_ptr, + MethodPtr method_ptr, + const ::testing::tuple<$as>&$args) { + return (obj_ptr->*method_ptr)($gets); + } +}; + + +]] +// An INTERNAL macro for extracting the type of a tuple field. It's +// subject to change without notice - DO NOT USE IN USER CODE! +#define GMOCK_FIELD_(Tuple, N) \ + typename ::testing::tuple_element::type + +$range i 1..n + +// SelectArgs::type is the +// type of an n-ary function whose i-th (1-based) argument type is the +// k{i}-th (0-based) field of ArgumentTuple, which must be a tuple +// type, and whose return type is Result. For example, +// SelectArgs, 0, 3>::type +// is int(bool, long). +// +// SelectArgs::Select(args) +// returns the selected fields (k1, k2, ..., k_n) of args as a tuple. +// For example, +// SelectArgs, 2, 0>::Select( +// ::testing::make_tuple(true, 'a', 2.5)) +// returns tuple (2.5, true). +// +// The numbers in list k1, k2, ..., k_n must be >= 0, where n can be +// in the range [0, $n]. Duplicates are allowed and they don't have +// to be in an ascending or descending order. + +template +class SelectArgs { + public: + typedef Result type($for i, [[GMOCK_FIELD_(ArgumentTuple, k$i)]]); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& args) { + return SelectedArgs($for i, [[get(args)]]); + } +}; + + +$for i [[ +$range j 1..n +$range j1 1..i-1 +template +class SelectArgs { + public: + typedef Result type($for j1, [[GMOCK_FIELD_(ArgumentTuple, k$j1)]]); + typedef typename Function::ArgumentTuple SelectedArgs; + static SelectedArgs Select(const ArgumentTuple& [[]] +$if i == 1 [[/* args */]] $else [[args]]) { + return SelectedArgs($for j1, [[get(args)]]); + } +}; + + +]] +#undef GMOCK_FIELD_ + +$var ks = [[$for i, [[k$i]]]] + +// Implements the WithArgs action. +template +class WithArgsAction { + public: + explicit WithArgsAction(const InnerAction& action) : action_(action) {} + + template + operator Action() const { return MakeAction(new Impl(action_)); } + + private: + template + class Impl : public ActionInterface { + public: + typedef typename Function::Result Result; + typedef typename Function::ArgumentTuple ArgumentTuple; + + explicit Impl(const InnerAction& action) : action_(action) {} + + virtual Result Perform(const ArgumentTuple& args) { + return action_.Perform(SelectArgs::Select(args)); + } + + private: + typedef typename SelectArgs::type InnerFunctionType; + + Action action_; + }; + + const InnerAction action_; + + GTEST_DISALLOW_ASSIGN_(WithArgsAction); +}; + +// A macro from the ACTION* family (defined later in this file) +// defines an action that can be used in a mock function. Typically, +// these actions only care about a subset of the arguments of the mock +// function. For example, if such an action only uses the second +// argument, it can be used in any mock function that takes >= 2 +// arguments where the type of the second argument is compatible. +// +// Therefore, the action implementation must be prepared to take more +// arguments than it needs. The ExcessiveArg type is used to +// represent those excessive arguments. In order to keep the compiler +// error messages tractable, we define it in the testing namespace +// instead of testing::internal. However, this is an INTERNAL TYPE +// and subject to change without notice, so a user MUST NOT USE THIS +// TYPE DIRECTLY. +struct ExcessiveArg {}; + +// A helper class needed for implementing the ACTION* macros. +template +class ActionHelper { + public: +$range i 0..n +$for i + +[[ +$var template = [[$if i==0 [[]] $else [[ +$range j 0..i-1 + template <$for j, [[typename A$j]]> +]]]] +$range j 0..i-1 +$var As = [[$for j, [[A$j]]]] +$var as = [[$for j, [[get<$j>(args)]]]] +$range k 1..n-i +$var eas = [[$for k, [[ExcessiveArg()]]]] +$var arg_list = [[$if (i==0) | (i==n) [[$as$eas]] $else [[$as, $eas]]]] +$template + static Result Perform(Impl* impl, const ::testing::tuple<$As>& args) { + return impl->template gmock_PerformImpl<$As>(args, $arg_list); + } + +]] +}; + +} // namespace internal + +// Various overloads for Invoke(). + +// WithArgs(an_action) creates an action that passes +// the selected arguments of the mock function to an_action and +// performs it. It serves as an adaptor between actions with +// different argument lists. C++ doesn't support default arguments for +// function templates, so we have to overload it. + +$range i 1..n +$for i [[ +$range j 1..i +template <$for j [[int k$j, ]]typename InnerAction> +inline internal::WithArgsAction +WithArgs(const InnerAction& action) { + return internal::WithArgsAction(action); +} + + +]] +// Creates an action that does actions a1, a2, ..., sequentially in +// each invocation. +$range i 2..n +$for i [[ +$range j 2..i +$var types = [[$for j, [[typename Action$j]]]] +$var Aas = [[$for j [[, Action$j a$j]]]] + +template +$range k 1..i-1 + +inline $for k [[internal::DoBothAction]] + +DoAll(Action1 a1$Aas) { +$if i==2 [[ + + return internal::DoBothAction(a1, a2); +]] $else [[ +$range j2 2..i + + return DoAll(a1, DoAll($for j2, [[a$j2]])); +]] + +} + +]] + +} // namespace testing + +// The ACTION* family of macros can be used in a namespace scope to +// define custom actions easily. The syntax: +// +// ACTION(name) { statements; } +// +// will define an action with the given name that executes the +// statements. The value returned by the statements will be used as +// the return value of the action. Inside the statements, you can +// refer to the K-th (0-based) argument of the mock function by +// 'argK', and refer to its type by 'argK_type'. For example: +// +// ACTION(IncrementArg1) { +// arg1_type temp = arg1; +// return ++(*temp); +// } +// +// allows you to write +// +// ...WillOnce(IncrementArg1()); +// +// You can also refer to the entire argument tuple and its type by +// 'args' and 'args_type', and refer to the mock function type and its +// return type by 'function_type' and 'return_type'. +// +// Note that you don't need to specify the types of the mock function +// arguments. However rest assured that your code is still type-safe: +// you'll get a compiler error if *arg1 doesn't support the ++ +// operator, or if the type of ++(*arg1) isn't compatible with the +// mock function's return type, for example. +// +// Sometimes you'll want to parameterize the action. For that you can use +// another macro: +// +// ACTION_P(name, param_name) { statements; } +// +// For example: +// +// ACTION_P(Add, n) { return arg0 + n; } +// +// will allow you to write: +// +// ...WillOnce(Add(5)); +// +// Note that you don't need to provide the type of the parameter +// either. If you need to reference the type of a parameter named +// 'foo', you can write 'foo_type'. For example, in the body of +// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type +// of 'n'. +// +// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P$n to support +// multi-parameter actions. +// +// For the purpose of typing, you can view +// +// ACTION_Pk(Foo, p1, ..., pk) { ... } +// +// as shorthand for +// +// template +// FooActionPk Foo(p1_type p1, ..., pk_type pk) { ... } +// +// In particular, you can provide the template type arguments +// explicitly when invoking Foo(), as in Foo(5, false); +// although usually you can rely on the compiler to infer the types +// for you automatically. You can assign the result of expression +// Foo(p1, ..., pk) to a variable of type FooActionPk. This can be useful when composing actions. +// +// You can also overload actions with different numbers of parameters: +// +// ACTION_P(Plus, a) { ... } +// ACTION_P2(Plus, a, b) { ... } +// +// While it's tempting to always use the ACTION* macros when defining +// a new action, you should also consider implementing ActionInterface +// or using MakePolymorphicAction() instead, especially if you need to +// use the action a lot. While these approaches require more work, +// they give you more control on the types of the mock function +// arguments and the action parameters, which in general leads to +// better compiler error messages that pay off in the long run. They +// also allow overloading actions based on parameter types (as opposed +// to just based on the number of parameters). +// +// CAVEAT: +// +// ACTION*() can only be used in a namespace scope. The reason is +// that C++ doesn't yet allow function-local types to be used to +// instantiate templates. The up-coming C++0x standard will fix this. +// Once that's done, we'll consider supporting using ACTION*() inside +// a function. +// +// MORE INFORMATION: +// +// To learn more about using these macros, please search for 'ACTION' +// on https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md + +$range i 0..n +$range k 0..n-1 + +// An internal macro needed for implementing ACTION*(). +#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\ + const args_type& args GTEST_ATTRIBUTE_UNUSED_ +$for k [[, \ + arg$k[[]]_type arg$k GTEST_ATTRIBUTE_UNUSED_]] + + +// Sometimes you want to give an action explicit template parameters +// that cannot be inferred from its value parameters. ACTION() and +// ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that +// and can be viewed as an extension to ACTION() and ACTION_P*(). +// +// The syntax: +// +// ACTION_TEMPLATE(ActionName, +// HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), +// AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } +// +// defines an action template that takes m explicit template +// parameters and n value parameters. name_i is the name of the i-th +// template parameter, and kind_i specifies whether it's a typename, +// an integral constant, or a template. p_i is the name of the i-th +// value parameter. +// +// Example: +// +// // DuplicateArg(output) converts the k-th argument of the mock +// // function to type T and copies it to *output. +// ACTION_TEMPLATE(DuplicateArg, +// HAS_2_TEMPLATE_PARAMS(int, k, typename, T), +// AND_1_VALUE_PARAMS(output)) { +// *output = T(::testing::get(args)); +// } +// ... +// int n; +// EXPECT_CALL(mock, Foo(_, _)) +// .WillOnce(DuplicateArg<1, unsigned char>(&n)); +// +// To create an instance of an action template, write: +// +// ActionName(v1, ..., v_n) +// +// where the ts are the template arguments and the vs are the value +// arguments. The value argument types are inferred by the compiler. +// If you want to explicitly specify the value argument types, you can +// provide additional template arguments: +// +// ActionName(v1, ..., v_n) +// +// where u_i is the desired type of v_i. +// +// ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the +// number of value parameters, but not on the number of template +// parameters. Without the restriction, the meaning of the following +// is unclear: +// +// OverloadedAction(x); +// +// Are we using a single-template-parameter action where 'bool' refers +// to the type of x, or are we using a two-template-parameter action +// where the compiler is asked to infer the type of x? +// +// Implementation notes: +// +// GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and +// GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for +// implementing ACTION_TEMPLATE. The main trick we use is to create +// new macro invocations when expanding a macro. For example, we have +// +// #define ACTION_TEMPLATE(name, template_params, value_params) +// ... GMOCK_INTERNAL_DECL_##template_params ... +// +// which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...) +// to expand to +// +// ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ... +// +// Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the +// preprocessor will continue to expand it to +// +// ... typename T ... +// +// This technique conforms to the C++ standard and is portable. It +// allows us to implement action templates using O(N) code, where N is +// the maximum number of template/value parameters supported. Without +// using it, we'd have to devote O(N^2) amount of code to implement all +// combinations of m and n. + +// Declares the template parameters. + +$range j 1..n +$for j [[ +$range m 0..j-1 +#define GMOCK_INTERNAL_DECL_HAS_$j[[]] +_TEMPLATE_PARAMS($for m, [[kind$m, name$m]]) $for m, [[kind$m name$m]] + + +]] + +// Lists the template parameters. + +$for j [[ +$range m 0..j-1 +#define GMOCK_INTERNAL_LIST_HAS_$j[[]] +_TEMPLATE_PARAMS($for m, [[kind$m, name$m]]) $for m, [[name$m]] + + +]] + +// Declares the types of value parameters. + +$for i [[ +$range j 0..i-1 +#define GMOCK_INTERNAL_DECL_TYPE_AND_$i[[]] +_VALUE_PARAMS($for j, [[p$j]]) $for j [[, typename p$j##_type]] + + +]] + +// Initializes the value parameters. + +$for i [[ +$range j 0..i-1 +#define GMOCK_INTERNAL_INIT_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]])\ + ($for j, [[p$j##_type gmock_p$j]])$if i>0 [[ : ]]$for j, [[p$j(gmock_p$j)]] + + +]] + +// Declares the fields for storing the value parameters. + +$for i [[ +$range j 0..i-1 +#define GMOCK_INTERNAL_DEFN_AND_$i[[]] +_VALUE_PARAMS($for j, [[p$j]]) $for j [[p$j##_type p$j; ]] + + +]] + +// Lists the value parameters. + +$for i [[ +$range j 0..i-1 +#define GMOCK_INTERNAL_LIST_AND_$i[[]] +_VALUE_PARAMS($for j, [[p$j]]) $for j, [[p$j]] + + +]] + +// Lists the value parameter types. + +$for i [[ +$range j 0..i-1 +#define GMOCK_INTERNAL_LIST_TYPE_AND_$i[[]] +_VALUE_PARAMS($for j, [[p$j]]) $for j [[, p$j##_type]] + + +]] + +// Declares the value parameters. + +$for i [[ +$range j 0..i-1 +#define GMOCK_INTERNAL_DECL_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]]) [[]] +$for j, [[p$j##_type p$j]] + + +]] + +// The suffix of the class template implementing the action template. +$for i [[ + + +$range j 0..i-1 +#define GMOCK_INTERNAL_COUNT_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]]) [[]] +$if i==1 [[P]] $elif i>=2 [[P$i]] +]] + + +// The name of the class template implementing the action template. +#define GMOCK_ACTION_CLASS_(name, value_params)\ + GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params) + +$range k 0..n-1 + +#define ACTION_TEMPLATE(name, template_params, value_params)\ + template \ + class GMOCK_ACTION_CLASS_(name, value_params) {\ + public:\ + explicit GMOCK_ACTION_CLASS_(name, value_params)\ + GMOCK_INTERNAL_INIT_##value_params {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template <$for k, [[typename arg$k[[]]_type]]>\ + return_type gmock_PerformImpl(const args_type& args[[]] +$for k [[, arg$k[[]]_type arg$k]]) const;\ + GMOCK_INTERNAL_DEFN_##value_params\ + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(\ + new gmock_Impl(GMOCK_INTERNAL_LIST_##value_params));\ + }\ + GMOCK_INTERNAL_DEFN_##value_params\ + private:\ + GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\ + };\ + template \ + inline GMOCK_ACTION_CLASS_(name, value_params)<\ + GMOCK_INTERNAL_LIST_##template_params\ + GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ + GMOCK_INTERNAL_DECL_##value_params) {\ + return GMOCK_ACTION_CLASS_(name, value_params)<\ + GMOCK_INTERNAL_LIST_##template_params\ + GMOCK_INTERNAL_LIST_TYPE_##value_params>(\ + GMOCK_INTERNAL_LIST_##value_params);\ + }\ + template \ + template \ + template \ + typename ::testing::internal::Function::Result\ + GMOCK_ACTION_CLASS_(name, value_params)<\ + GMOCK_INTERNAL_LIST_##template_params\ + GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl::\ + gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const + +$for i + +[[ +$var template = [[$if i==0 [[]] $else [[ +$range j 0..i-1 + + template <$for j, [[typename p$j##_type]]>\ +]]]] +$var class_name = [[name##Action[[$if i==0 [[]] $elif i==1 [[P]] + $else [[P$i]]]]]] +$range j 0..i-1 +$var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] +$var param_types_and_names = [[$for j, [[p$j##_type p$j]]]] +$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(gmock_p$j)]]]]]] +$var param_field_decls = [[$for j +[[ + + p$j##_type p$j;\ +]]]] +$var param_field_decls2 = [[$for j +[[ + + p$j##_type p$j;\ +]]]] +$var params = [[$for j, [[p$j]]]] +$var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]] +$var typename_arg_types = [[$for k, [[typename arg$k[[]]_type]]]] +$var arg_types_and_names = [[$for k, [[arg$k[[]]_type arg$k]]]] +$var macro_name = [[$if i==0 [[ACTION]] $elif i==1 [[ACTION_P]] + $else [[ACTION_P$i]]]] + +#define $macro_name(name$for j [[, p$j]])\$template + class $class_name {\ + public:\ + [[$if i==1 [[explicit ]]]]$class_name($ctor_param_list)$inits {}\ + template \ + class gmock_Impl : public ::testing::ActionInterface {\ + public:\ + typedef F function_type;\ + typedef typename ::testing::internal::Function::Result return_type;\ + typedef typename ::testing::internal::Function::ArgumentTuple\ + args_type;\ + [[$if i==1 [[explicit ]]]]gmock_Impl($ctor_param_list)$inits {}\ + virtual return_type Perform(const args_type& args) {\ + return ::testing::internal::ActionHelper::\ + Perform(this, args);\ + }\ + template <$typename_arg_types>\ + return_type gmock_PerformImpl(const args_type& args, [[]] +$arg_types_and_names) const;\$param_field_decls + private:\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template operator ::testing::Action() const {\ + return ::testing::Action(new gmock_Impl($params));\ + }\$param_field_decls2 + private:\ + GTEST_DISALLOW_ASSIGN_($class_name);\ + };\$template + inline $class_name$param_types name($param_types_and_names) {\ + return $class_name$param_types($params);\ + }\$template + template \ + template <$typename_arg_types>\ + typename ::testing::internal::Function::Result\ + $class_name$param_types::gmock_Impl::gmock_PerformImpl(\ + GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const +]] +$$ } // This meta comment fixes auto-indentation in Emacs. It won't +$$ // show up in the generated code. + + +namespace testing { + + +// The ACTION*() macros trigger warning C4100 (unreferenced formal +// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in +// the macro definition, as the warnings are generated when the macro +// is expanded and macro expansion cannot contain #pragma. Therefore +// we suppress them here. +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable:4100) +#endif + +// Various overloads for InvokeArgument(). +// +// The InvokeArgument(a1, a2, ..., a_k) action invokes the N-th +// (0-based) argument, which must be a k-ary callable, of the mock +// function, with arguments a1, a2, ..., a_k. +// +// Notes: +// +// 1. The arguments are passed by value by default. If you need to +// pass an argument by reference, wrap it inside ByRef(). For +// example, +// +// InvokeArgument<1>(5, string("Hello"), ByRef(foo)) +// +// passes 5 and string("Hello") by value, and passes foo by +// reference. +// +// 2. If the callable takes an argument by reference but ByRef() is +// not used, it will receive the reference to a copy of the value, +// instead of the original value. For example, when the 0-th +// argument of the mock function takes a const string&, the action +// +// InvokeArgument<0>(string("Hello")) +// +// makes a copy of the temporary string("Hello") object and passes a +// reference of the copy, instead of the original temporary object, +// to the callable. This makes it easy for a user to define an +// InvokeArgument action from temporary values and have it performed +// later. + +namespace internal { +namespace invoke_argument { + +// Appears in InvokeArgumentAdl's argument list to help avoid +// accidental calls to user functions of the same name. +struct AdlTag {}; + +// InvokeArgumentAdl - a helper for InvokeArgument. +// The basic overloads are provided here for generic functors. +// Overloads for other custom-callables are provided in the +// internal/custom/callback-actions.h header. + +$range i 0..n +$for i +[[ +$range j 1..i + +template +R InvokeArgumentAdl(AdlTag, F f[[$for j [[, A$j a$j]]]]) { + return f([[$for j, [[a$j]]]]); +} +]] + +} // namespace invoke_argument +} // namespace internal + +$range i 0..n +$for i [[ +$range j 0..i-1 + +ACTION_TEMPLATE(InvokeArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]])) { + using internal::invoke_argument::InvokeArgumentAdl; + return InvokeArgumentAdl( + internal::invoke_argument::AdlTag(), + ::testing::get(args)$for j [[, p$j]]); +} + +]] + +// Various overloads for ReturnNew(). +// +// The ReturnNew(a1, a2, ..., a_k) action returns a pointer to a new +// instance of type T, constructed on the heap with constructor arguments +// a1, a2, ..., and a_k. The caller assumes ownership of the returned value. +$range i 0..n +$for i [[ +$range j 0..i-1 +$var ps = [[$for j, [[p$j]]]] + +ACTION_TEMPLATE(ReturnNew, + HAS_1_TEMPLATE_PARAMS(typename, T), + AND_$i[[]]_VALUE_PARAMS($ps)) { + return new T($ps); +} + +]] + +#ifdef _MSC_VER +# pragma warning(pop) +#endif + +} // namespace testing + +// Include any custom callback actions added by the local installation. +// We must include this header at the end to make sure it can use the +// declarations from this file. +#include "gmock/internal/custom/gmock-generated-actions.h" + +#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,1095 @@ +// This file was GENERATED by command: +// pump.py gmock-generated-function-mockers.h.pump +// DO NOT EDIT BY HAND!!! + +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements function mockers of various arities. + +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ + +#include "gmock/gmock-spec-builders.h" +#include "gmock/internal/gmock-internal-utils.h" + +#if GTEST_HAS_STD_FUNCTION_ +# include +#endif + +namespace testing { +namespace internal { + +template +class FunctionMockerBase; + +// Note: class FunctionMocker really belongs to the ::testing +// namespace. However if we define it in ::testing, MSVC will +// complain when classes in ::testing::internal declare it as a +// friend class template. To workaround this compiler bug, we define +// FunctionMocker in ::testing::internal and import it into ::testing. +template +class FunctionMocker; + +template +class FunctionMocker : public + internal::FunctionMockerBase { + public: + typedef R F(); + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + MockSpec& With() { + return this->current_spec(); + } + + R Invoke() { + // Even though gcc and MSVC don't enforce it, 'this->' is required + // by the C++ standard [14.6.4] here, as the base class type is + // dependent on the template argument (and thus shouldn't be + // looked into when resolving InvokeWith). + return this->InvokeWith(ArgumentTuple()); + } +}; + +template +class FunctionMocker : public + internal::FunctionMockerBase { + public: + typedef R F(A1); + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + MockSpec& With(const Matcher& m1) { + this->current_spec().SetMatchers(::testing::make_tuple(m1)); + return this->current_spec(); + } + + R Invoke(A1 a1) { + // Even though gcc and MSVC don't enforce it, 'this->' is required + // by the C++ standard [14.6.4] here, as the base class type is + // dependent on the template argument (and thus shouldn't be + // looked into when resolving InvokeWith). + return this->InvokeWith(ArgumentTuple(a1)); + } +}; + +template +class FunctionMocker : public + internal::FunctionMockerBase { + public: + typedef R F(A1, A2); + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + MockSpec& With(const Matcher& m1, const Matcher& m2) { + this->current_spec().SetMatchers(::testing::make_tuple(m1, m2)); + return this->current_spec(); + } + + R Invoke(A1 a1, A2 a2) { + // Even though gcc and MSVC don't enforce it, 'this->' is required + // by the C++ standard [14.6.4] here, as the base class type is + // dependent on the template argument (and thus shouldn't be + // looked into when resolving InvokeWith). + return this->InvokeWith(ArgumentTuple(a1, a2)); + } +}; + +template +class FunctionMocker : public + internal::FunctionMockerBase { + public: + typedef R F(A1, A2, A3); + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + MockSpec& With(const Matcher& m1, const Matcher& m2, + const Matcher& m3) { + this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3)); + return this->current_spec(); + } + + R Invoke(A1 a1, A2 a2, A3 a3) { + // Even though gcc and MSVC don't enforce it, 'this->' is required + // by the C++ standard [14.6.4] here, as the base class type is + // dependent on the template argument (and thus shouldn't be + // looked into when resolving InvokeWith). + return this->InvokeWith(ArgumentTuple(a1, a2, a3)); + } +}; + +template +class FunctionMocker : public + internal::FunctionMockerBase { + public: + typedef R F(A1, A2, A3, A4); + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + MockSpec& With(const Matcher& m1, const Matcher& m2, + const Matcher& m3, const Matcher& m4) { + this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4)); + return this->current_spec(); + } + + R Invoke(A1 a1, A2 a2, A3 a3, A4 a4) { + // Even though gcc and MSVC don't enforce it, 'this->' is required + // by the C++ standard [14.6.4] here, as the base class type is + // dependent on the template argument (and thus shouldn't be + // looked into when resolving InvokeWith). + return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4)); + } +}; + +template +class FunctionMocker : public + internal::FunctionMockerBase { + public: + typedef R F(A1, A2, A3, A4, A5); + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + MockSpec& With(const Matcher& m1, const Matcher& m2, + const Matcher& m3, const Matcher& m4, const Matcher& m5) { + this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5)); + return this->current_spec(); + } + + R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { + // Even though gcc and MSVC don't enforce it, 'this->' is required + // by the C++ standard [14.6.4] here, as the base class type is + // dependent on the template argument (and thus shouldn't be + // looked into when resolving InvokeWith). + return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5)); + } +}; + +template +class FunctionMocker : public + internal::FunctionMockerBase { + public: + typedef R F(A1, A2, A3, A4, A5, A6); + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + MockSpec& With(const Matcher& m1, const Matcher& m2, + const Matcher& m3, const Matcher& m4, const Matcher& m5, + const Matcher& m6) { + this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5, + m6)); + return this->current_spec(); + } + + R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { + // Even though gcc and MSVC don't enforce it, 'this->' is required + // by the C++ standard [14.6.4] here, as the base class type is + // dependent on the template argument (and thus shouldn't be + // looked into when resolving InvokeWith). + return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6)); + } +}; + +template +class FunctionMocker : public + internal::FunctionMockerBase { + public: + typedef R F(A1, A2, A3, A4, A5, A6, A7); + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + MockSpec& With(const Matcher& m1, const Matcher& m2, + const Matcher& m3, const Matcher& m4, const Matcher& m5, + const Matcher& m6, const Matcher& m7) { + this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5, + m6, m7)); + return this->current_spec(); + } + + R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) { + // Even though gcc and MSVC don't enforce it, 'this->' is required + // by the C++ standard [14.6.4] here, as the base class type is + // dependent on the template argument (and thus shouldn't be + // looked into when resolving InvokeWith). + return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7)); + } +}; + +template +class FunctionMocker : public + internal::FunctionMockerBase { + public: + typedef R F(A1, A2, A3, A4, A5, A6, A7, A8); + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + MockSpec& With(const Matcher& m1, const Matcher& m2, + const Matcher& m3, const Matcher& m4, const Matcher& m5, + const Matcher& m6, const Matcher& m7, const Matcher& m8) { + this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5, + m6, m7, m8)); + return this->current_spec(); + } + + R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) { + // Even though gcc and MSVC don't enforce it, 'this->' is required + // by the C++ standard [14.6.4] here, as the base class type is + // dependent on the template argument (and thus shouldn't be + // looked into when resolving InvokeWith). + return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8)); + } +}; + +template +class FunctionMocker : public + internal::FunctionMockerBase { + public: + typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9); + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + MockSpec& With(const Matcher& m1, const Matcher& m2, + const Matcher& m3, const Matcher& m4, const Matcher& m5, + const Matcher& m6, const Matcher& m7, const Matcher& m8, + const Matcher& m9) { + this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5, + m6, m7, m8, m9)); + return this->current_spec(); + } + + R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) { + // Even though gcc and MSVC don't enforce it, 'this->' is required + // by the C++ standard [14.6.4] here, as the base class type is + // dependent on the template argument (and thus shouldn't be + // looked into when resolving InvokeWith). + return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8, a9)); + } +}; + +template +class FunctionMocker : public + internal::FunctionMockerBase { + public: + typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + MockSpec& With(const Matcher& m1, const Matcher& m2, + const Matcher& m3, const Matcher& m4, const Matcher& m5, + const Matcher& m6, const Matcher& m7, const Matcher& m8, + const Matcher& m9, const Matcher& m10) { + this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5, + m6, m7, m8, m9, m10)); + return this->current_spec(); + } + + R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, + A10 a10) { + // Even though gcc and MSVC don't enforce it, 'this->' is required + // by the C++ standard [14.6.4] here, as the base class type is + // dependent on the template argument (and thus shouldn't be + // looked into when resolving InvokeWith). + return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10)); + } +}; + +} // namespace internal + +// The style guide prohibits "using" statements in a namespace scope +// inside a header file. However, the FunctionMocker class template +// is meant to be defined in the ::testing namespace. The following +// line is just a trick for working around a bug in MSVC 8.0, which +// cannot handle it if we define FunctionMocker in ::testing. +using internal::FunctionMocker; + +// GMOCK_RESULT_(tn, F) expands to the result type of function type F. +// We define this as a variadic macro in case F contains unprotected +// commas (the same reason that we use variadic macros in other places +// in this file). +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_RESULT_(tn, ...) \ + tn ::testing::internal::Function<__VA_ARGS__>::Result + +// The type of argument N of the given function type. +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_ARG_(tn, N, ...) \ + tn ::testing::internal::Function<__VA_ARGS__>::Argument##N + +// The matcher type for argument N of the given function type. +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_MATCHER_(tn, N, ...) \ + const ::testing::Matcher& + +// The variable for mocking the given method. +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_MOCKER_(arity, constness, Method) \ + GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__) + +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_METHOD0_(tn, constness, ct, Method, ...) \ + GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ + ) constness { \ + GTEST_COMPILE_ASSERT_((::testing::tuple_size< \ + tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \ + == 0), \ + this_method_does_not_take_0_arguments); \ + GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method); \ + return GMOCK_MOCKER_(0, constness, Method).Invoke(); \ + } \ + ::testing::MockSpec<__VA_ARGS__>& \ + gmock_##Method() constness { \ + GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this); \ + return GMOCK_MOCKER_(0, constness, Method).With(); \ + } \ + mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(0, constness, \ + Method) + +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_METHOD1_(tn, constness, ct, Method, ...) \ + GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ + GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1) constness { \ + GTEST_COMPILE_ASSERT_((::testing::tuple_size< \ + tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \ + == 1), \ + this_method_does_not_take_1_argument); \ + GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method); \ + return GMOCK_MOCKER_(1, constness, Method).Invoke(gmock_a1); \ + } \ + ::testing::MockSpec<__VA_ARGS__>& \ + gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1) constness { \ + GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this); \ + return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1); \ + } \ + mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(1, constness, \ + Method) + +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_METHOD2_(tn, constness, ct, Method, ...) \ + GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ + GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2) constness { \ + GTEST_COMPILE_ASSERT_((::testing::tuple_size< \ + tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \ + == 2), \ + this_method_does_not_take_2_arguments); \ + GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method); \ + return GMOCK_MOCKER_(2, constness, Method).Invoke(gmock_a1, gmock_a2); \ + } \ + ::testing::MockSpec<__VA_ARGS__>& \ + gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness { \ + GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this); \ + return GMOCK_MOCKER_(2, constness, Method).With(gmock_a1, gmock_a2); \ + } \ + mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(2, constness, \ + Method) + +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_METHOD3_(tn, constness, ct, Method, ...) \ + GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ + GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3) constness { \ + GTEST_COMPILE_ASSERT_((::testing::tuple_size< \ + tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \ + == 3), \ + this_method_does_not_take_3_arguments); \ + GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method); \ + return GMOCK_MOCKER_(3, constness, Method).Invoke(gmock_a1, gmock_a2, \ + gmock_a3); \ + } \ + ::testing::MockSpec<__VA_ARGS__>& \ + gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3) constness { \ + GMOCK_MOCKER_(3, constness, Method).RegisterOwner(this); \ + return GMOCK_MOCKER_(3, constness, Method).With(gmock_a1, gmock_a2, \ + gmock_a3); \ + } \ + mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(3, constness, \ + Method) + +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_METHOD4_(tn, constness, ct, Method, ...) \ + GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ + GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness { \ + GTEST_COMPILE_ASSERT_((::testing::tuple_size< \ + tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \ + == 4), \ + this_method_does_not_take_4_arguments); \ + GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method); \ + return GMOCK_MOCKER_(4, constness, Method).Invoke(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4); \ + } \ + ::testing::MockSpec<__VA_ARGS__>& \ + gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4) constness { \ + GMOCK_MOCKER_(4, constness, Method).RegisterOwner(this); \ + return GMOCK_MOCKER_(4, constness, Method).With(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4); \ + } \ + mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(4, constness, \ + Method) + +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_METHOD5_(tn, constness, ct, Method, ...) \ + GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ + GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \ + GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5) constness { \ + GTEST_COMPILE_ASSERT_((::testing::tuple_size< \ + tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \ + == 5), \ + this_method_does_not_take_5_arguments); \ + GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method); \ + return GMOCK_MOCKER_(5, constness, Method).Invoke(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4, gmock_a5); \ + } \ + ::testing::MockSpec<__VA_ARGS__>& \ + gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \ + GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5) constness { \ + GMOCK_MOCKER_(5, constness, Method).RegisterOwner(this); \ + return GMOCK_MOCKER_(5, constness, Method).With(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4, gmock_a5); \ + } \ + mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(5, constness, \ + Method) + +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_METHOD6_(tn, constness, ct, Method, ...) \ + GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ + GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \ + GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \ + GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6) constness { \ + GTEST_COMPILE_ASSERT_((::testing::tuple_size< \ + tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \ + == 6), \ + this_method_does_not_take_6_arguments); \ + GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method); \ + return GMOCK_MOCKER_(6, constness, Method).Invoke(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4, gmock_a5, gmock_a6); \ + } \ + ::testing::MockSpec<__VA_ARGS__>& \ + gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \ + GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \ + GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6) constness { \ + GMOCK_MOCKER_(6, constness, Method).RegisterOwner(this); \ + return GMOCK_MOCKER_(6, constness, Method).With(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4, gmock_a5, gmock_a6); \ + } \ + mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(6, constness, \ + Method) + +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_METHOD7_(tn, constness, ct, Method, ...) \ + GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ + GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \ + GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \ + GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ + GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness { \ + GTEST_COMPILE_ASSERT_((::testing::tuple_size< \ + tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \ + == 7), \ + this_method_does_not_take_7_arguments); \ + GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method); \ + return GMOCK_MOCKER_(7, constness, Method).Invoke(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7); \ + } \ + ::testing::MockSpec<__VA_ARGS__>& \ + gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \ + GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \ + GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \ + GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7) constness { \ + GMOCK_MOCKER_(7, constness, Method).RegisterOwner(this); \ + return GMOCK_MOCKER_(7, constness, Method).With(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7); \ + } \ + mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(7, constness, \ + Method) + +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_METHOD8_(tn, constness, ct, Method, ...) \ + GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ + GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \ + GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \ + GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ + GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \ + GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8) constness { \ + GTEST_COMPILE_ASSERT_((::testing::tuple_size< \ + tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \ + == 8), \ + this_method_does_not_take_8_arguments); \ + GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method); \ + return GMOCK_MOCKER_(8, constness, Method).Invoke(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \ + } \ + ::testing::MockSpec<__VA_ARGS__>& \ + gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \ + GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \ + GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \ + GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \ + GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8) constness { \ + GMOCK_MOCKER_(8, constness, Method).RegisterOwner(this); \ + return GMOCK_MOCKER_(8, constness, Method).With(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \ + } \ + mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(8, constness, \ + Method) + +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_METHOD9_(tn, constness, ct, Method, ...) \ + GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ + GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \ + GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \ + GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ + GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \ + GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8, \ + GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9) constness { \ + GTEST_COMPILE_ASSERT_((::testing::tuple_size< \ + tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \ + == 9), \ + this_method_does_not_take_9_arguments); \ + GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method); \ + return GMOCK_MOCKER_(9, constness, Method).Invoke(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, \ + gmock_a9); \ + } \ + ::testing::MockSpec<__VA_ARGS__>& \ + gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \ + GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \ + GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \ + GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \ + GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \ + GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9) constness { \ + GMOCK_MOCKER_(9, constness, Method).RegisterOwner(this); \ + return GMOCK_MOCKER_(9, constness, Method).With(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, \ + gmock_a9); \ + } \ + mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(9, constness, \ + Method) + +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_METHOD10_(tn, constness, ct, Method, ...) \ + GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ + GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \ + GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \ + GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ + GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \ + GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8, \ + GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9, \ + GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness { \ + GTEST_COMPILE_ASSERT_((::testing::tuple_size< \ + tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \ + == 10), \ + this_method_does_not_take_10_arguments); \ + GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method); \ + return GMOCK_MOCKER_(10, constness, Method).Invoke(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \ + gmock_a10); \ + } \ + ::testing::MockSpec<__VA_ARGS__>& \ + gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \ + GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \ + GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ + GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \ + GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \ + GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \ + GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \ + GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \ + GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9, \ + GMOCK_MATCHER_(tn, 10, \ + __VA_ARGS__) gmock_a10) constness { \ + GMOCK_MOCKER_(10, constness, Method).RegisterOwner(this); \ + return GMOCK_MOCKER_(10, constness, Method).With(gmock_a1, gmock_a2, \ + gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \ + gmock_a10); \ + } \ + mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(10, constness, \ + Method) + +#define MOCK_METHOD0(m, ...) GMOCK_METHOD0_(, , , m, __VA_ARGS__) +#define MOCK_METHOD1(m, ...) GMOCK_METHOD1_(, , , m, __VA_ARGS__) +#define MOCK_METHOD2(m, ...) GMOCK_METHOD2_(, , , m, __VA_ARGS__) +#define MOCK_METHOD3(m, ...) GMOCK_METHOD3_(, , , m, __VA_ARGS__) +#define MOCK_METHOD4(m, ...) GMOCK_METHOD4_(, , , m, __VA_ARGS__) +#define MOCK_METHOD5(m, ...) GMOCK_METHOD5_(, , , m, __VA_ARGS__) +#define MOCK_METHOD6(m, ...) GMOCK_METHOD6_(, , , m, __VA_ARGS__) +#define MOCK_METHOD7(m, ...) GMOCK_METHOD7_(, , , m, __VA_ARGS__) +#define MOCK_METHOD8(m, ...) GMOCK_METHOD8_(, , , m, __VA_ARGS__) +#define MOCK_METHOD9(m, ...) GMOCK_METHOD9_(, , , m, __VA_ARGS__) +#define MOCK_METHOD10(m, ...) GMOCK_METHOD10_(, , , m, __VA_ARGS__) + +#define MOCK_CONST_METHOD0(m, ...) GMOCK_METHOD0_(, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD1(m, ...) GMOCK_METHOD1_(, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD2(m, ...) GMOCK_METHOD2_(, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD3(m, ...) GMOCK_METHOD3_(, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD4(m, ...) GMOCK_METHOD4_(, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD5(m, ...) GMOCK_METHOD5_(, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD6(m, ...) GMOCK_METHOD6_(, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD7(m, ...) GMOCK_METHOD7_(, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD8(m, ...) GMOCK_METHOD8_(, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD9(m, ...) GMOCK_METHOD9_(, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD10(m, ...) GMOCK_METHOD10_(, const, , m, __VA_ARGS__) + +#define MOCK_METHOD0_T(m, ...) GMOCK_METHOD0_(typename, , , m, __VA_ARGS__) +#define MOCK_METHOD1_T(m, ...) GMOCK_METHOD1_(typename, , , m, __VA_ARGS__) +#define MOCK_METHOD2_T(m, ...) GMOCK_METHOD2_(typename, , , m, __VA_ARGS__) +#define MOCK_METHOD3_T(m, ...) GMOCK_METHOD3_(typename, , , m, __VA_ARGS__) +#define MOCK_METHOD4_T(m, ...) GMOCK_METHOD4_(typename, , , m, __VA_ARGS__) +#define MOCK_METHOD5_T(m, ...) GMOCK_METHOD5_(typename, , , m, __VA_ARGS__) +#define MOCK_METHOD6_T(m, ...) GMOCK_METHOD6_(typename, , , m, __VA_ARGS__) +#define MOCK_METHOD7_T(m, ...) GMOCK_METHOD7_(typename, , , m, __VA_ARGS__) +#define MOCK_METHOD8_T(m, ...) GMOCK_METHOD8_(typename, , , m, __VA_ARGS__) +#define MOCK_METHOD9_T(m, ...) GMOCK_METHOD9_(typename, , , m, __VA_ARGS__) +#define MOCK_METHOD10_T(m, ...) GMOCK_METHOD10_(typename, , , m, __VA_ARGS__) + +#define MOCK_CONST_METHOD0_T(m, ...) \ + GMOCK_METHOD0_(typename, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD1_T(m, ...) \ + GMOCK_METHOD1_(typename, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD2_T(m, ...) \ + GMOCK_METHOD2_(typename, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD3_T(m, ...) \ + GMOCK_METHOD3_(typename, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD4_T(m, ...) \ + GMOCK_METHOD4_(typename, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD5_T(m, ...) \ + GMOCK_METHOD5_(typename, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD6_T(m, ...) \ + GMOCK_METHOD6_(typename, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD7_T(m, ...) \ + GMOCK_METHOD7_(typename, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD8_T(m, ...) \ + GMOCK_METHOD8_(typename, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD9_T(m, ...) \ + GMOCK_METHOD9_(typename, const, , m, __VA_ARGS__) +#define MOCK_CONST_METHOD10_T(m, ...) \ + GMOCK_METHOD10_(typename, const, , m, __VA_ARGS__) + +#define MOCK_METHOD0_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD0_(, , ct, m, __VA_ARGS__) +#define MOCK_METHOD1_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD1_(, , ct, m, __VA_ARGS__) +#define MOCK_METHOD2_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD2_(, , ct, m, __VA_ARGS__) +#define MOCK_METHOD3_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD3_(, , ct, m, __VA_ARGS__) +#define MOCK_METHOD4_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD4_(, , ct, m, __VA_ARGS__) +#define MOCK_METHOD5_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD5_(, , ct, m, __VA_ARGS__) +#define MOCK_METHOD6_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD6_(, , ct, m, __VA_ARGS__) +#define MOCK_METHOD7_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD7_(, , ct, m, __VA_ARGS__) +#define MOCK_METHOD8_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD8_(, , ct, m, __VA_ARGS__) +#define MOCK_METHOD9_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD9_(, , ct, m, __VA_ARGS__) +#define MOCK_METHOD10_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD10_(, , ct, m, __VA_ARGS__) + +#define MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD0_(, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD1_(, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD2_(, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD3_(, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD4_(, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD5_(, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD6_(, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD7_(, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD8_(, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD9_(, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD10_(, const, ct, m, __VA_ARGS__) + +#define MOCK_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD0_(typename, , ct, m, __VA_ARGS__) +#define MOCK_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD1_(typename, , ct, m, __VA_ARGS__) +#define MOCK_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD2_(typename, , ct, m, __VA_ARGS__) +#define MOCK_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD3_(typename, , ct, m, __VA_ARGS__) +#define MOCK_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD4_(typename, , ct, m, __VA_ARGS__) +#define MOCK_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD5_(typename, , ct, m, __VA_ARGS__) +#define MOCK_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD6_(typename, , ct, m, __VA_ARGS__) +#define MOCK_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD7_(typename, , ct, m, __VA_ARGS__) +#define MOCK_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD8_(typename, , ct, m, __VA_ARGS__) +#define MOCK_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD9_(typename, , ct, m, __VA_ARGS__) +#define MOCK_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD10_(typename, , ct, m, __VA_ARGS__) + +#define MOCK_CONST_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD0_(typename, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD1_(typename, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD2_(typename, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD3_(typename, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD4_(typename, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD5_(typename, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD6_(typename, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD7_(typename, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD8_(typename, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD9_(typename, const, ct, m, __VA_ARGS__) +#define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD10_(typename, const, ct, m, __VA_ARGS__) + +// A MockFunction class has one mock method whose type is F. It is +// useful when you just want your test code to emit some messages and +// have Google Mock verify the right messages are sent (and perhaps at +// the right times). For example, if you are exercising code: +// +// Foo(1); +// Foo(2); +// Foo(3); +// +// and want to verify that Foo(1) and Foo(3) both invoke +// mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write: +// +// TEST(FooTest, InvokesBarCorrectly) { +// MyMock mock; +// MockFunction check; +// { +// InSequence s; +// +// EXPECT_CALL(mock, Bar("a")); +// EXPECT_CALL(check, Call("1")); +// EXPECT_CALL(check, Call("2")); +// EXPECT_CALL(mock, Bar("a")); +// } +// Foo(1); +// check.Call("1"); +// Foo(2); +// check.Call("2"); +// Foo(3); +// } +// +// The expectation spec says that the first Bar("a") must happen +// before check point "1", the second Bar("a") must happen after check +// point "2", and nothing should happen between the two check +// points. The explicit check points make it easy to tell which +// Bar("a") is called by which call to Foo(). +// +// MockFunction can also be used to exercise code that accepts +// std::function callbacks. To do so, use AsStdFunction() method +// to create std::function proxy forwarding to original object's Call. +// Example: +// +// TEST(FooTest, RunsCallbackWithBarArgument) { +// MockFunction callback; +// EXPECT_CALL(callback, Call("bar")).WillOnce(Return(1)); +// Foo(callback.AsStdFunction()); +// } +template +class MockFunction; + +template +class MockFunction { + public: + MockFunction() {} + + MOCK_METHOD0_T(Call, R()); + +#if GTEST_HAS_STD_FUNCTION_ + std::function AsStdFunction() { + return [this]() -> R { + return this->Call(); + }; + } +#endif // GTEST_HAS_STD_FUNCTION_ + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); +}; + +template +class MockFunction { + public: + MockFunction() {} + + MOCK_METHOD1_T(Call, R(A0)); + +#if GTEST_HAS_STD_FUNCTION_ + std::function AsStdFunction() { + return [this](A0 a0) -> R { + return this->Call(a0); + }; + } +#endif // GTEST_HAS_STD_FUNCTION_ + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); +}; + +template +class MockFunction { + public: + MockFunction() {} + + MOCK_METHOD2_T(Call, R(A0, A1)); + +#if GTEST_HAS_STD_FUNCTION_ + std::function AsStdFunction() { + return [this](A0 a0, A1 a1) -> R { + return this->Call(a0, a1); + }; + } +#endif // GTEST_HAS_STD_FUNCTION_ + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); +}; + +template +class MockFunction { + public: + MockFunction() {} + + MOCK_METHOD3_T(Call, R(A0, A1, A2)); + +#if GTEST_HAS_STD_FUNCTION_ + std::function AsStdFunction() { + return [this](A0 a0, A1 a1, A2 a2) -> R { + return this->Call(a0, a1, a2); + }; + } +#endif // GTEST_HAS_STD_FUNCTION_ + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); +}; + +template +class MockFunction { + public: + MockFunction() {} + + MOCK_METHOD4_T(Call, R(A0, A1, A2, A3)); + +#if GTEST_HAS_STD_FUNCTION_ + std::function AsStdFunction() { + return [this](A0 a0, A1 a1, A2 a2, A3 a3) -> R { + return this->Call(a0, a1, a2, a3); + }; + } +#endif // GTEST_HAS_STD_FUNCTION_ + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); +}; + +template +class MockFunction { + public: + MockFunction() {} + + MOCK_METHOD5_T(Call, R(A0, A1, A2, A3, A4)); + +#if GTEST_HAS_STD_FUNCTION_ + std::function AsStdFunction() { + return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) -> R { + return this->Call(a0, a1, a2, a3, a4); + }; + } +#endif // GTEST_HAS_STD_FUNCTION_ + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); +}; + +template +class MockFunction { + public: + MockFunction() {} + + MOCK_METHOD6_T(Call, R(A0, A1, A2, A3, A4, A5)); + +#if GTEST_HAS_STD_FUNCTION_ + std::function AsStdFunction() { + return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) -> R { + return this->Call(a0, a1, a2, a3, a4, a5); + }; + } +#endif // GTEST_HAS_STD_FUNCTION_ + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); +}; + +template +class MockFunction { + public: + MockFunction() {} + + MOCK_METHOD7_T(Call, R(A0, A1, A2, A3, A4, A5, A6)); + +#if GTEST_HAS_STD_FUNCTION_ + std::function AsStdFunction() { + return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) -> R { + return this->Call(a0, a1, a2, a3, a4, a5, a6); + }; + } +#endif // GTEST_HAS_STD_FUNCTION_ + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); +}; + +template +class MockFunction { + public: + MockFunction() {} + + MOCK_METHOD8_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7)); + +#if GTEST_HAS_STD_FUNCTION_ + std::function AsStdFunction() { + return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) -> R { + return this->Call(a0, a1, a2, a3, a4, a5, a6, a7); + }; + } +#endif // GTEST_HAS_STD_FUNCTION_ + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); +}; + +template +class MockFunction { + public: + MockFunction() {} + + MOCK_METHOD9_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8)); + +#if GTEST_HAS_STD_FUNCTION_ + std::function AsStdFunction() { + return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, + A8 a8) -> R { + return this->Call(a0, a1, a2, a3, a4, a5, a6, a7, a8); + }; + } +#endif // GTEST_HAS_STD_FUNCTION_ + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); +}; + +template +class MockFunction { + public: + MockFunction() {} + + MOCK_METHOD10_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)); + +#if GTEST_HAS_STD_FUNCTION_ + std::function AsStdFunction() { + return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, + A8 a8, A9 a9) -> R { + return this->Call(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); + }; + } +#endif // GTEST_HAS_STD_FUNCTION_ + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); +}; + +} // namespace testing + +#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,291 @@ +$$ -*- mode: c++; -*- +$$ This is a Pump source file. Please use Pump to convert it to +$$ gmock-generated-function-mockers.h. +$$ +$var n = 10 $$ The maximum arity we support. +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements function mockers of various arities. + +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ + +#include "gmock/gmock-spec-builders.h" +#include "gmock/internal/gmock-internal-utils.h" + +#if GTEST_HAS_STD_FUNCTION_ +# include +#endif + +namespace testing { +namespace internal { + +template +class FunctionMockerBase; + +// Note: class FunctionMocker really belongs to the ::testing +// namespace. However if we define it in ::testing, MSVC will +// complain when classes in ::testing::internal declare it as a +// friend class template. To workaround this compiler bug, we define +// FunctionMocker in ::testing::internal and import it into ::testing. +template +class FunctionMocker; + + +$range i 0..n +$for i [[ +$range j 1..i +$var typename_As = [[$for j [[, typename A$j]]]] +$var As = [[$for j, [[A$j]]]] +$var as = [[$for j, [[a$j]]]] +$var Aas = [[$for j, [[A$j a$j]]]] +$var ms = [[$for j, [[m$j]]]] +$var matchers = [[$for j, [[const Matcher& m$j]]]] +template +class FunctionMocker : public + internal::FunctionMockerBase { + public: + typedef R F($As); + typedef typename internal::Function::ArgumentTuple ArgumentTuple; + + MockSpec& With($matchers) { + +$if i >= 1 [[ + this->current_spec().SetMatchers(::testing::make_tuple($ms)); + +]] + return this->current_spec(); + } + + R Invoke($Aas) { + // Even though gcc and MSVC don't enforce it, 'this->' is required + // by the C++ standard [14.6.4] here, as the base class type is + // dependent on the template argument (and thus shouldn't be + // looked into when resolving InvokeWith). + return this->InvokeWith(ArgumentTuple($as)); + } +}; + + +]] +} // namespace internal + +// The style guide prohibits "using" statements in a namespace scope +// inside a header file. However, the FunctionMocker class template +// is meant to be defined in the ::testing namespace. The following +// line is just a trick for working around a bug in MSVC 8.0, which +// cannot handle it if we define FunctionMocker in ::testing. +using internal::FunctionMocker; + +// GMOCK_RESULT_(tn, F) expands to the result type of function type F. +// We define this as a variadic macro in case F contains unprotected +// commas (the same reason that we use variadic macros in other places +// in this file). +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_RESULT_(tn, ...) \ + tn ::testing::internal::Function<__VA_ARGS__>::Result + +// The type of argument N of the given function type. +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_ARG_(tn, N, ...) \ + tn ::testing::internal::Function<__VA_ARGS__>::Argument##N + +// The matcher type for argument N of the given function type. +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_MATCHER_(tn, N, ...) \ + const ::testing::Matcher& + +// The variable for mocking the given method. +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_MOCKER_(arity, constness, Method) \ + GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__) + + +$for i [[ +$range j 1..i +$var arg_as = [[$for j, \ + [[GMOCK_ARG_(tn, $j, __VA_ARGS__) gmock_a$j]]]] +$var as = [[$for j, [[gmock_a$j]]]] +$var matcher_as = [[$for j, \ + [[GMOCK_MATCHER_(tn, $j, __VA_ARGS__) gmock_a$j]]]] +// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! +#define GMOCK_METHOD$i[[]]_(tn, constness, ct, Method, ...) \ + GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ + $arg_as) constness { \ + GTEST_COMPILE_ASSERT_((::testing::tuple_size< \ + tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value == $i), \ + this_method_does_not_take_$i[[]]_argument[[$if i != 1 [[s]]]]); \ + GMOCK_MOCKER_($i, constness, Method).SetOwnerAndName(this, #Method); \ + return GMOCK_MOCKER_($i, constness, Method).Invoke($as); \ + } \ + ::testing::MockSpec<__VA_ARGS__>& \ + gmock_##Method($matcher_as) constness { \ + GMOCK_MOCKER_($i, constness, Method).RegisterOwner(this); \ + return GMOCK_MOCKER_($i, constness, Method).With($as); \ + } \ + mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_($i, constness, Method) + + +]] +$for i [[ +#define MOCK_METHOD$i(m, ...) GMOCK_METHOD$i[[]]_(, , , m, __VA_ARGS__) + +]] + + +$for i [[ +#define MOCK_CONST_METHOD$i(m, ...) GMOCK_METHOD$i[[]]_(, const, , m, __VA_ARGS__) + +]] + + +$for i [[ +#define MOCK_METHOD$i[[]]_T(m, ...) GMOCK_METHOD$i[[]]_(typename, , , m, __VA_ARGS__) + +]] + + +$for i [[ +#define MOCK_CONST_METHOD$i[[]]_T(m, ...) \ + GMOCK_METHOD$i[[]]_(typename, const, , m, __VA_ARGS__) + +]] + + +$for i [[ +#define MOCK_METHOD$i[[]]_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD$i[[]]_(, , ct, m, __VA_ARGS__) + +]] + + +$for i [[ +#define MOCK_CONST_METHOD$i[[]]_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD$i[[]]_(, const, ct, m, __VA_ARGS__) + +]] + + +$for i [[ +#define MOCK_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD$i[[]]_(typename, , ct, m, __VA_ARGS__) + +]] + + +$for i [[ +#define MOCK_CONST_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, ...) \ + GMOCK_METHOD$i[[]]_(typename, const, ct, m, __VA_ARGS__) + +]] + +// A MockFunction class has one mock method whose type is F. It is +// useful when you just want your test code to emit some messages and +// have Google Mock verify the right messages are sent (and perhaps at +// the right times). For example, if you are exercising code: +// +// Foo(1); +// Foo(2); +// Foo(3); +// +// and want to verify that Foo(1) and Foo(3) both invoke +// mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write: +// +// TEST(FooTest, InvokesBarCorrectly) { +// MyMock mock; +// MockFunction check; +// { +// InSequence s; +// +// EXPECT_CALL(mock, Bar("a")); +// EXPECT_CALL(check, Call("1")); +// EXPECT_CALL(check, Call("2")); +// EXPECT_CALL(mock, Bar("a")); +// } +// Foo(1); +// check.Call("1"); +// Foo(2); +// check.Call("2"); +// Foo(3); +// } +// +// The expectation spec says that the first Bar("a") must happen +// before check point "1", the second Bar("a") must happen after check +// point "2", and nothing should happen between the two check +// points. The explicit check points make it easy to tell which +// Bar("a") is called by which call to Foo(). +// +// MockFunction can also be used to exercise code that accepts +// std::function callbacks. To do so, use AsStdFunction() method +// to create std::function proxy forwarding to original object's Call. +// Example: +// +// TEST(FooTest, RunsCallbackWithBarArgument) { +// MockFunction callback; +// EXPECT_CALL(callback, Call("bar")).WillOnce(Return(1)); +// Foo(callback.AsStdFunction()); +// } +template +class MockFunction; + + +$for i [[ +$range j 0..i-1 +$var ArgTypes = [[$for j, [[A$j]]]] +$var ArgNames = [[$for j, [[a$j]]]] +$var ArgDecls = [[$for j, [[A$j a$j]]]] +template +class MockFunction { + public: + MockFunction() {} + + MOCK_METHOD$i[[]]_T(Call, R($ArgTypes)); + +#if GTEST_HAS_STD_FUNCTION_ + std::function AsStdFunction() { + return [this]($ArgDecls) -> R { + return this->Call($ArgNames); + }; + } +#endif // GTEST_HAS_STD_FUNCTION_ + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); +}; + + +]] +} // namespace testing + +#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-matchers.h vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-matchers.h --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-matchers.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-matchers.h 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,2191 @@ +// This file was GENERATED by command: +// pump.py gmock-generated-matchers.h.pump +// DO NOT EDIT BY HAND!!! + +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used variadic matchers. + +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ + +#include +#include +#include +#include +#include "gmock/gmock-matchers.h" + +namespace testing { +namespace internal { + +// The type of the i-th (0-based) field of Tuple. +#define GMOCK_FIELD_TYPE_(Tuple, i) \ + typename ::testing::tuple_element::type + +// TupleFields is for selecting fields from a +// tuple of type Tuple. It has two members: +// +// type: a tuple type whose i-th field is the ki-th field of Tuple. +// GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple. +// +// For example, in class TupleFields, 2, 0>, we have: +// +// type is tuple, and +// GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true). + +template +class TupleFields; + +// This generic version is used when there are 10 selectors. +template +class TupleFields { + public: + typedef ::testing::tuple type; + static type GetSelectedFields(const Tuple& t) { + return type(get(t), get(t), get(t), get(t), get(t), + get(t), get(t), get(t), get(t), get(t)); + } +}; + +// The following specialization is used for 0 ~ 9 selectors. + +template +class TupleFields { + public: + typedef ::testing::tuple<> type; + static type GetSelectedFields(const Tuple& /* t */) { + return type(); + } +}; + +template +class TupleFields { + public: + typedef ::testing::tuple type; + static type GetSelectedFields(const Tuple& t) { + return type(get(t)); + } +}; + +template +class TupleFields { + public: + typedef ::testing::tuple type; + static type GetSelectedFields(const Tuple& t) { + return type(get(t), get(t)); + } +}; + +template +class TupleFields { + public: + typedef ::testing::tuple type; + static type GetSelectedFields(const Tuple& t) { + return type(get(t), get(t), get(t)); + } +}; + +template +class TupleFields { + public: + typedef ::testing::tuple type; + static type GetSelectedFields(const Tuple& t) { + return type(get(t), get(t), get(t), get(t)); + } +}; + +template +class TupleFields { + public: + typedef ::testing::tuple type; + static type GetSelectedFields(const Tuple& t) { + return type(get(t), get(t), get(t), get(t), get(t)); + } +}; + +template +class TupleFields { + public: + typedef ::testing::tuple type; + static type GetSelectedFields(const Tuple& t) { + return type(get(t), get(t), get(t), get(t), get(t), + get(t)); + } +}; + +template +class TupleFields { + public: + typedef ::testing::tuple type; + static type GetSelectedFields(const Tuple& t) { + return type(get(t), get(t), get(t), get(t), get(t), + get(t), get(t)); + } +}; + +template +class TupleFields { + public: + typedef ::testing::tuple type; + static type GetSelectedFields(const Tuple& t) { + return type(get(t), get(t), get(t), get(t), get(t), + get(t), get(t), get(t)); + } +}; + +template +class TupleFields { + public: + typedef ::testing::tuple type; + static type GetSelectedFields(const Tuple& t) { + return type(get(t), get(t), get(t), get(t), get(t), + get(t), get(t), get(t), get(t)); + } +}; + +#undef GMOCK_FIELD_TYPE_ + +// Implements the Args() matcher. +template +class ArgsMatcherImpl : public MatcherInterface { + public: + // ArgsTuple may have top-level const or reference modifiers. + typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple; + typedef typename internal::TupleFields::type SelectedArgs; + typedef Matcher MonomorphicInnerMatcher; + + template + explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher) + : inner_matcher_(SafeMatcherCast(inner_matcher)) {} + + virtual bool MatchAndExplain(ArgsTuple args, + MatchResultListener* listener) const { + const SelectedArgs& selected_args = GetSelectedArgs(args); + if (!listener->IsInterested()) + return inner_matcher_.Matches(selected_args); + + PrintIndices(listener->stream()); + *listener << "are " << PrintToString(selected_args); + + StringMatchResultListener inner_listener; + const bool match = inner_matcher_.MatchAndExplain(selected_args, + &inner_listener); + PrintIfNotEmpty(inner_listener.str(), listener->stream()); + return match; + } + + virtual void DescribeTo(::std::ostream* os) const { + *os << "are a tuple "; + PrintIndices(os); + inner_matcher_.DescribeTo(os); + } + + virtual void DescribeNegationTo(::std::ostream* os) const { + *os << "are a tuple "; + PrintIndices(os); + inner_matcher_.DescribeNegationTo(os); + } + + private: + static SelectedArgs GetSelectedArgs(ArgsTuple args) { + return TupleFields::GetSelectedFields(args); + } + + // Prints the indices of the selected fields. + static void PrintIndices(::std::ostream* os) { + *os << "whose fields ("; + const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 }; + for (int i = 0; i < 10; i++) { + if (indices[i] < 0) + break; + + if (i >= 1) + *os << ", "; + + *os << "#" << indices[i]; + } + *os << ") "; + } + + const MonomorphicInnerMatcher inner_matcher_; + + GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl); +}; + +template +class ArgsMatcher { + public: + explicit ArgsMatcher(const InnerMatcher& inner_matcher) + : inner_matcher_(inner_matcher) {} + + template + operator Matcher() const { + return MakeMatcher(new ArgsMatcherImpl(inner_matcher_)); + } + + private: + const InnerMatcher inner_matcher_; + + GTEST_DISALLOW_ASSIGN_(ArgsMatcher); +}; + +// A set of metafunctions for computing the result type of AllOf. +// AllOf(m1, ..., mN) returns +// AllOfResultN::type. + +// Although AllOf isn't defined for one argument, AllOfResult1 is defined +// to simplify the implementation. +template +struct AllOfResult1 { + typedef M1 type; +}; + +template +struct AllOfResult2 { + typedef BothOfMatcher< + typename AllOfResult1::type, + typename AllOfResult1::type + > type; +}; + +template +struct AllOfResult3 { + typedef BothOfMatcher< + typename AllOfResult1::type, + typename AllOfResult2::type + > type; +}; + +template +struct AllOfResult4 { + typedef BothOfMatcher< + typename AllOfResult2::type, + typename AllOfResult2::type + > type; +}; + +template +struct AllOfResult5 { + typedef BothOfMatcher< + typename AllOfResult2::type, + typename AllOfResult3::type + > type; +}; + +template +struct AllOfResult6 { + typedef BothOfMatcher< + typename AllOfResult3::type, + typename AllOfResult3::type + > type; +}; + +template +struct AllOfResult7 { + typedef BothOfMatcher< + typename AllOfResult3::type, + typename AllOfResult4::type + > type; +}; + +template +struct AllOfResult8 { + typedef BothOfMatcher< + typename AllOfResult4::type, + typename AllOfResult4::type + > type; +}; + +template +struct AllOfResult9 { + typedef BothOfMatcher< + typename AllOfResult4::type, + typename AllOfResult5::type + > type; +}; + +template +struct AllOfResult10 { + typedef BothOfMatcher< + typename AllOfResult5::type, + typename AllOfResult5::type + > type; +}; + +// A set of metafunctions for computing the result type of AnyOf. +// AnyOf(m1, ..., mN) returns +// AnyOfResultN::type. + +// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined +// to simplify the implementation. +template +struct AnyOfResult1 { + typedef M1 type; +}; + +template +struct AnyOfResult2 { + typedef EitherOfMatcher< + typename AnyOfResult1::type, + typename AnyOfResult1::type + > type; +}; + +template +struct AnyOfResult3 { + typedef EitherOfMatcher< + typename AnyOfResult1::type, + typename AnyOfResult2::type + > type; +}; + +template +struct AnyOfResult4 { + typedef EitherOfMatcher< + typename AnyOfResult2::type, + typename AnyOfResult2::type + > type; +}; + +template +struct AnyOfResult5 { + typedef EitherOfMatcher< + typename AnyOfResult2::type, + typename AnyOfResult3::type + > type; +}; + +template +struct AnyOfResult6 { + typedef EitherOfMatcher< + typename AnyOfResult3::type, + typename AnyOfResult3::type + > type; +}; + +template +struct AnyOfResult7 { + typedef EitherOfMatcher< + typename AnyOfResult3::type, + typename AnyOfResult4::type + > type; +}; + +template +struct AnyOfResult8 { + typedef EitherOfMatcher< + typename AnyOfResult4::type, + typename AnyOfResult4::type + > type; +}; + +template +struct AnyOfResult9 { + typedef EitherOfMatcher< + typename AnyOfResult4::type, + typename AnyOfResult5::type + > type; +}; + +template +struct AnyOfResult10 { + typedef EitherOfMatcher< + typename AnyOfResult5::type, + typename AnyOfResult5::type + > type; +}; + +} // namespace internal + +// Args(a_matcher) matches a tuple if the selected +// fields of it matches a_matcher. C++ doesn't support default +// arguments for function templates, so we have to overload it. +template +inline internal::ArgsMatcher +Args(const InnerMatcher& matcher) { + return internal::ArgsMatcher(matcher); +} + +template +inline internal::ArgsMatcher +Args(const InnerMatcher& matcher) { + return internal::ArgsMatcher(matcher); +} + +template +inline internal::ArgsMatcher +Args(const InnerMatcher& matcher) { + return internal::ArgsMatcher(matcher); +} + +template +inline internal::ArgsMatcher +Args(const InnerMatcher& matcher) { + return internal::ArgsMatcher(matcher); +} + +template +inline internal::ArgsMatcher +Args(const InnerMatcher& matcher) { + return internal::ArgsMatcher(matcher); +} + +template +inline internal::ArgsMatcher +Args(const InnerMatcher& matcher) { + return internal::ArgsMatcher(matcher); +} + +template +inline internal::ArgsMatcher +Args(const InnerMatcher& matcher) { + return internal::ArgsMatcher(matcher); +} + +template +inline internal::ArgsMatcher +Args(const InnerMatcher& matcher) { + return internal::ArgsMatcher(matcher); +} + +template +inline internal::ArgsMatcher +Args(const InnerMatcher& matcher) { + return internal::ArgsMatcher(matcher); +} + +template +inline internal::ArgsMatcher +Args(const InnerMatcher& matcher) { + return internal::ArgsMatcher(matcher); +} + +template +inline internal::ArgsMatcher +Args(const InnerMatcher& matcher) { + return internal::ArgsMatcher(matcher); +} + +// ElementsAre(e_1, e_2, ... e_n) matches an STL-style container with +// n elements, where the i-th element in the container must +// match the i-th argument in the list. Each argument of +// ElementsAre() can be either a value or a matcher. We support up to +// 10 arguments. +// +// The use of DecayArray in the implementation allows ElementsAre() +// to accept string literals, whose type is const char[N], but we +// want to treat them as const char*. +// +// NOTE: Since ElementsAre() cares about the order of the elements, it +// must not be used with containers whose elements's order is +// undefined (e.g. hash_map). + +inline internal::ElementsAreMatcher< + ::testing::tuple<> > +ElementsAre() { + typedef ::testing::tuple<> Args; + return internal::ElementsAreMatcher(Args()); +} + +template +inline internal::ElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type> > +ElementsAre(const T1& e1) { + typedef ::testing::tuple< + typename internal::DecayArray::type> Args; + return internal::ElementsAreMatcher(Args(e1)); +} + +template +inline internal::ElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +ElementsAre(const T1& e1, const T2& e2) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::ElementsAreMatcher(Args(e1, e2)); +} + +template +inline internal::ElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +ElementsAre(const T1& e1, const T2& e2, const T3& e3) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::ElementsAreMatcher(Args(e1, e2, e3)); +} + +template +inline internal::ElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::ElementsAreMatcher(Args(e1, e2, e3, e4)); +} + +template +inline internal::ElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, + const T5& e5) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::ElementsAreMatcher(Args(e1, e2, e3, e4, e5)); +} + +template +inline internal::ElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, + const T5& e5, const T6& e6) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::ElementsAreMatcher(Args(e1, e2, e3, e4, e5, e6)); +} + +template +inline internal::ElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, + const T5& e5, const T6& e6, const T7& e7) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::ElementsAreMatcher(Args(e1, e2, e3, e4, e5, e6, e7)); +} + +template +inline internal::ElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, + const T5& e5, const T6& e6, const T7& e7, const T8& e8) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::ElementsAreMatcher(Args(e1, e2, e3, e4, e5, e6, e7, + e8)); +} + +template +inline internal::ElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, + const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::ElementsAreMatcher(Args(e1, e2, e3, e4, e5, e6, e7, + e8, e9)); +} + +template +inline internal::ElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, + const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, + const T10& e10) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::ElementsAreMatcher(Args(e1, e2, e3, e4, e5, e6, e7, + e8, e9, e10)); +} + +// UnorderedElementsAre(e_1, e_2, ..., e_n) is an ElementsAre extension +// that matches n elements in any order. We support up to n=10 arguments. + +inline internal::UnorderedElementsAreMatcher< + ::testing::tuple<> > +UnorderedElementsAre() { + typedef ::testing::tuple<> Args; + return internal::UnorderedElementsAreMatcher(Args()); +} + +template +inline internal::UnorderedElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type> > +UnorderedElementsAre(const T1& e1) { + typedef ::testing::tuple< + typename internal::DecayArray::type> Args; + return internal::UnorderedElementsAreMatcher(Args(e1)); +} + +template +inline internal::UnorderedElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +UnorderedElementsAre(const T1& e1, const T2& e2) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::UnorderedElementsAreMatcher(Args(e1, e2)); +} + +template +inline internal::UnorderedElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::UnorderedElementsAreMatcher(Args(e1, e2, e3)); +} + +template +inline internal::UnorderedElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::UnorderedElementsAreMatcher(Args(e1, e2, e3, e4)); +} + +template +inline internal::UnorderedElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, + const T5& e5) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::UnorderedElementsAreMatcher(Args(e1, e2, e3, e4, e5)); +} + +template +inline internal::UnorderedElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, + const T5& e5, const T6& e6) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::UnorderedElementsAreMatcher(Args(e1, e2, e3, e4, e5, + e6)); +} + +template +inline internal::UnorderedElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, + const T5& e5, const T6& e6, const T7& e7) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::UnorderedElementsAreMatcher(Args(e1, e2, e3, e4, e5, + e6, e7)); +} + +template +inline internal::UnorderedElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, + const T5& e5, const T6& e6, const T7& e7, const T8& e8) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::UnorderedElementsAreMatcher(Args(e1, e2, e3, e4, e5, + e6, e7, e8)); +} + +template +inline internal::UnorderedElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, + const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::UnorderedElementsAreMatcher(Args(e1, e2, e3, e4, e5, + e6, e7, e8, e9)); +} + +template +inline internal::UnorderedElementsAreMatcher< + ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> > +UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, + const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, + const T10& e10) { + typedef ::testing::tuple< + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type, + typename internal::DecayArray::type> Args; + return internal::UnorderedElementsAreMatcher(Args(e1, e2, e3, e4, e5, + e6, e7, e8, e9, e10)); +} + +// AllOf(m1, m2, ..., mk) matches any value that matches all of the given +// sub-matchers. AllOf is called fully qualified to prevent ADL from firing. + +template +inline typename internal::AllOfResult2::type +AllOf(M1 m1, M2 m2) { + return typename internal::AllOfResult2::type( + m1, + m2); +} + +template +inline typename internal::AllOfResult3::type +AllOf(M1 m1, M2 m2, M3 m3) { + return typename internal::AllOfResult3::type( + m1, + ::testing::AllOf(m2, m3)); +} + +template +inline typename internal::AllOfResult4::type +AllOf(M1 m1, M2 m2, M3 m3, M4 m4) { + return typename internal::AllOfResult4::type( + ::testing::AllOf(m1, m2), + ::testing::AllOf(m3, m4)); +} + +template +inline typename internal::AllOfResult5::type +AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) { + return typename internal::AllOfResult5::type( + ::testing::AllOf(m1, m2), + ::testing::AllOf(m3, m4, m5)); +} + +template +inline typename internal::AllOfResult6::type +AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) { + return typename internal::AllOfResult6::type( + ::testing::AllOf(m1, m2, m3), + ::testing::AllOf(m4, m5, m6)); +} + +template +inline typename internal::AllOfResult7::type +AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) { + return typename internal::AllOfResult7::type( + ::testing::AllOf(m1, m2, m3), + ::testing::AllOf(m4, m5, m6, m7)); +} + +template +inline typename internal::AllOfResult8::type +AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) { + return typename internal::AllOfResult8::type( + ::testing::AllOf(m1, m2, m3, m4), + ::testing::AllOf(m5, m6, m7, m8)); +} + +template +inline typename internal::AllOfResult9::type +AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) { + return typename internal::AllOfResult9::type( + ::testing::AllOf(m1, m2, m3, m4), + ::testing::AllOf(m5, m6, m7, m8, m9)); +} + +template +inline typename internal::AllOfResult10::type +AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) { + return typename internal::AllOfResult10::type( + ::testing::AllOf(m1, m2, m3, m4, m5), + ::testing::AllOf(m6, m7, m8, m9, m10)); +} + +// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given +// sub-matchers. AnyOf is called fully qualified to prevent ADL from firing. + +template +inline typename internal::AnyOfResult2::type +AnyOf(M1 m1, M2 m2) { + return typename internal::AnyOfResult2::type( + m1, + m2); +} + +template +inline typename internal::AnyOfResult3::type +AnyOf(M1 m1, M2 m2, M3 m3) { + return typename internal::AnyOfResult3::type( + m1, + ::testing::AnyOf(m2, m3)); +} + +template +inline typename internal::AnyOfResult4::type +AnyOf(M1 m1, M2 m2, M3 m3, M4 m4) { + return typename internal::AnyOfResult4::type( + ::testing::AnyOf(m1, m2), + ::testing::AnyOf(m3, m4)); +} + +template +inline typename internal::AnyOfResult5::type +AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) { + return typename internal::AnyOfResult5::type( + ::testing::AnyOf(m1, m2), + ::testing::AnyOf(m3, m4, m5)); +} + +template +inline typename internal::AnyOfResult6::type +AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) { + return typename internal::AnyOfResult6::type( + ::testing::AnyOf(m1, m2, m3), + ::testing::AnyOf(m4, m5, m6)); +} + +template +inline typename internal::AnyOfResult7::type +AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) { + return typename internal::AnyOfResult7::type( + ::testing::AnyOf(m1, m2, m3), + ::testing::AnyOf(m4, m5, m6, m7)); +} + +template +inline typename internal::AnyOfResult8::type +AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) { + return typename internal::AnyOfResult8::type( + ::testing::AnyOf(m1, m2, m3, m4), + ::testing::AnyOf(m5, m6, m7, m8)); +} + +template +inline typename internal::AnyOfResult9::type +AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) { + return typename internal::AnyOfResult9::type( + ::testing::AnyOf(m1, m2, m3, m4), + ::testing::AnyOf(m5, m6, m7, m8, m9)); +} + +template +inline typename internal::AnyOfResult10::type +AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) { + return typename internal::AnyOfResult10::type( + ::testing::AnyOf(m1, m2, m3, m4, m5), + ::testing::AnyOf(m6, m7, m8, m9, m10)); +} + +} // namespace testing + + +// The MATCHER* family of macros can be used in a namespace scope to +// define custom matchers easily. +// +// Basic Usage +// =========== +// +// The syntax +// +// MATCHER(name, description_string) { statements; } +// +// defines a matcher with the given name that executes the statements, +// which must return a bool to indicate if the match succeeds. Inside +// the statements, you can refer to the value being matched by 'arg', +// and refer to its type by 'arg_type'. +// +// The description string documents what the matcher does, and is used +// to generate the failure message when the match fails. Since a +// MATCHER() is usually defined in a header file shared by multiple +// C++ source files, we require the description to be a C-string +// literal to avoid possible side effects. It can be empty, in which +// case we'll use the sequence of words in the matcher name as the +// description. +// +// For example: +// +// MATCHER(IsEven, "") { return (arg % 2) == 0; } +// +// allows you to write +// +// // Expects mock_foo.Bar(n) to be called where n is even. +// EXPECT_CALL(mock_foo, Bar(IsEven())); +// +// or, +// +// // Verifies that the value of some_expression is even. +// EXPECT_THAT(some_expression, IsEven()); +// +// If the above assertion fails, it will print something like: +// +// Value of: some_expression +// Expected: is even +// Actual: 7 +// +// where the description "is even" is automatically calculated from the +// matcher name IsEven. +// +// Argument Type +// ============= +// +// Note that the type of the value being matched (arg_type) is +// determined by the context in which you use the matcher and is +// supplied to you by the compiler, so you don't need to worry about +// declaring it (nor can you). This allows the matcher to be +// polymorphic. For example, IsEven() can be used to match any type +// where the value of "(arg % 2) == 0" can be implicitly converted to +// a bool. In the "Bar(IsEven())" example above, if method Bar() +// takes an int, 'arg_type' will be int; if it takes an unsigned long, +// 'arg_type' will be unsigned long; and so on. +// +// Parameterizing Matchers +// ======================= +// +// Sometimes you'll want to parameterize the matcher. For that you +// can use another macro: +// +// MATCHER_P(name, param_name, description_string) { statements; } +// +// For example: +// +// MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } +// +// will allow you to write: +// +// EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); +// +// which may lead to this message (assuming n is 10): +// +// Value of: Blah("a") +// Expected: has absolute value 10 +// Actual: -9 +// +// Note that both the matcher description and its parameter are +// printed, making the message human-friendly. +// +// In the matcher definition body, you can write 'foo_type' to +// reference the type of a parameter named 'foo'. For example, in the +// body of MATCHER_P(HasAbsoluteValue, value) above, you can write +// 'value_type' to refer to the type of 'value'. +// +// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to +// support multi-parameter matchers. +// +// Describing Parameterized Matchers +// ================================= +// +// The last argument to MATCHER*() is a string-typed expression. The +// expression can reference all of the matcher's parameters and a +// special bool-typed variable named 'negation'. When 'negation' is +// false, the expression should evaluate to the matcher's description; +// otherwise it should evaluate to the description of the negation of +// the matcher. For example, +// +// using testing::PrintToString; +// +// MATCHER_P2(InClosedRange, low, hi, +// string(negation ? "is not" : "is") + " in range [" + +// PrintToString(low) + ", " + PrintToString(hi) + "]") { +// return low <= arg && arg <= hi; +// } +// ... +// EXPECT_THAT(3, InClosedRange(4, 6)); +// EXPECT_THAT(3, Not(InClosedRange(2, 4))); +// +// would generate two failures that contain the text: +// +// Expected: is in range [4, 6] +// ... +// Expected: is not in range [2, 4] +// +// If you specify "" as the description, the failure message will +// contain the sequence of words in the matcher name followed by the +// parameter values printed as a tuple. For example, +// +// MATCHER_P2(InClosedRange, low, hi, "") { ... } +// ... +// EXPECT_THAT(3, InClosedRange(4, 6)); +// EXPECT_THAT(3, Not(InClosedRange(2, 4))); +// +// would generate two failures that contain the text: +// +// Expected: in closed range (4, 6) +// ... +// Expected: not (in closed range (2, 4)) +// +// Types of Matcher Parameters +// =========================== +// +// For the purpose of typing, you can view +// +// MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } +// +// as shorthand for +// +// template +// FooMatcherPk +// Foo(p1_type p1, ..., pk_type pk) { ... } +// +// When you write Foo(v1, ..., vk), the compiler infers the types of +// the parameters v1, ..., and vk for you. If you are not happy with +// the result of the type inference, you can specify the types by +// explicitly instantiating the template, as in Foo(5, +// false). As said earlier, you don't get to (or need to) specify +// 'arg_type' as that's determined by the context in which the matcher +// is used. You can assign the result of expression Foo(p1, ..., pk) +// to a variable of type FooMatcherPk. This +// can be useful when composing matchers. +// +// While you can instantiate a matcher template with reference types, +// passing the parameters by pointer usually makes your code more +// readable. If, however, you still want to pass a parameter by +// reference, be aware that in the failure message generated by the +// matcher you will see the value of the referenced object but not its +// address. +// +// Explaining Match Results +// ======================== +// +// Sometimes the matcher description alone isn't enough to explain why +// the match has failed or succeeded. For example, when expecting a +// long string, it can be very helpful to also print the diff between +// the expected string and the actual one. To achieve that, you can +// optionally stream additional information to a special variable +// named result_listener, whose type is a pointer to class +// MatchResultListener: +// +// MATCHER_P(EqualsLongString, str, "") { +// if (arg == str) return true; +// +// *result_listener << "the difference: " +/// << DiffStrings(str, arg); +// return false; +// } +// +// Overloading Matchers +// ==================== +// +// You can overload matchers with different numbers of parameters: +// +// MATCHER_P(Blah, a, description_string1) { ... } +// MATCHER_P2(Blah, a, b, description_string2) { ... } +// +// Caveats +// ======= +// +// When defining a new matcher, you should also consider implementing +// MatcherInterface or using MakePolymorphicMatcher(). These +// approaches require more work than the MATCHER* macros, but also +// give you more control on the types of the value being matched and +// the matcher parameters, which may leads to better compiler error +// messages when the matcher is used wrong. They also allow +// overloading matchers based on parameter types (as opposed to just +// based on the number of parameters). +// +// MATCHER*() can only be used in a namespace scope. The reason is +// that C++ doesn't yet allow function-local types to be used to +// instantiate templates. The up-coming C++0x standard will fix this. +// Once that's done, we'll consider supporting using MATCHER*() inside +// a function. +// +// More Information +// ================ +// +// To learn more about using these macros, please search for 'MATCHER' +// on https://github.com/google/googletest/blob/master/googlemock/docs/ +// CookBook.md + +#define MATCHER(name, description)\ + class name##Matcher {\ + public:\ + template \ + class gmock_Impl : public ::testing::MatcherInterface {\ + public:\ + gmock_Impl()\ + {}\ + virtual bool MatchAndExplain(\ + arg_type arg, ::testing::MatchResultListener* result_listener) const;\ + virtual void DescribeTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(false);\ + }\ + virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(true);\ + }\ + private:\ + ::testing::internal::string FormatDescription(bool negation) const {\ + const ::testing::internal::string gmock_description = (description);\ + if (!gmock_description.empty()) {\ + return gmock_description;\ + }\ + return ::testing::internal::FormatMatcherDescription(\ + negation, #name, \ + ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ + ::testing::tuple<>()));\ + }\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template \ + operator ::testing::Matcher() const {\ + return ::testing::Matcher(\ + new gmock_Impl());\ + }\ + name##Matcher() {\ + }\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##Matcher);\ + };\ + inline name##Matcher name() {\ + return name##Matcher();\ + }\ + template \ + bool name##Matcher::gmock_Impl::MatchAndExplain(\ + arg_type arg, \ + ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ + const + +#define MATCHER_P(name, p0, description)\ + template \ + class name##MatcherP {\ + public:\ + template \ + class gmock_Impl : public ::testing::MatcherInterface {\ + public:\ + explicit gmock_Impl(p0##_type gmock_p0)\ + : p0(gmock_p0) {}\ + virtual bool MatchAndExplain(\ + arg_type arg, ::testing::MatchResultListener* result_listener) const;\ + virtual void DescribeTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(false);\ + }\ + virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(true);\ + }\ + p0##_type p0;\ + private:\ + ::testing::internal::string FormatDescription(bool negation) const {\ + const ::testing::internal::string gmock_description = (description);\ + if (!gmock_description.empty()) {\ + return gmock_description;\ + }\ + return ::testing::internal::FormatMatcherDescription(\ + negation, #name, \ + ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ + ::testing::tuple(p0)));\ + }\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template \ + operator ::testing::Matcher() const {\ + return ::testing::Matcher(\ + new gmock_Impl(p0));\ + }\ + explicit name##MatcherP(p0##_type gmock_p0) : p0(gmock_p0) {\ + }\ + p0##_type p0;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##MatcherP);\ + };\ + template \ + inline name##MatcherP name(p0##_type p0) {\ + return name##MatcherP(p0);\ + }\ + template \ + template \ + bool name##MatcherP::gmock_Impl::MatchAndExplain(\ + arg_type arg, \ + ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ + const + +#define MATCHER_P2(name, p0, p1, description)\ + template \ + class name##MatcherP2 {\ + public:\ + template \ + class gmock_Impl : public ::testing::MatcherInterface {\ + public:\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\ + : p0(gmock_p0), p1(gmock_p1) {}\ + virtual bool MatchAndExplain(\ + arg_type arg, ::testing::MatchResultListener* result_listener) const;\ + virtual void DescribeTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(false);\ + }\ + virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(true);\ + }\ + p0##_type p0;\ + p1##_type p1;\ + private:\ + ::testing::internal::string FormatDescription(bool negation) const {\ + const ::testing::internal::string gmock_description = (description);\ + if (!gmock_description.empty()) {\ + return gmock_description;\ + }\ + return ::testing::internal::FormatMatcherDescription(\ + negation, #name, \ + ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ + ::testing::tuple(p0, p1)));\ + }\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template \ + operator ::testing::Matcher() const {\ + return ::testing::Matcher(\ + new gmock_Impl(p0, p1));\ + }\ + name##MatcherP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ + p1(gmock_p1) {\ + }\ + p0##_type p0;\ + p1##_type p1;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##MatcherP2);\ + };\ + template \ + inline name##MatcherP2 name(p0##_type p0, \ + p1##_type p1) {\ + return name##MatcherP2(p0, p1);\ + }\ + template \ + template \ + bool name##MatcherP2::gmock_Impl::MatchAndExplain(\ + arg_type arg, \ + ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ + const + +#define MATCHER_P3(name, p0, p1, p2, description)\ + template \ + class name##MatcherP3 {\ + public:\ + template \ + class gmock_Impl : public ::testing::MatcherInterface {\ + public:\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\ + : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ + virtual bool MatchAndExplain(\ + arg_type arg, ::testing::MatchResultListener* result_listener) const;\ + virtual void DescribeTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(false);\ + }\ + virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(true);\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + private:\ + ::testing::internal::string FormatDescription(bool negation) const {\ + const ::testing::internal::string gmock_description = (description);\ + if (!gmock_description.empty()) {\ + return gmock_description;\ + }\ + return ::testing::internal::FormatMatcherDescription(\ + negation, #name, \ + ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ + ::testing::tuple(p0, p1, \ + p2)));\ + }\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template \ + operator ::testing::Matcher() const {\ + return ::testing::Matcher(\ + new gmock_Impl(p0, p1, p2));\ + }\ + name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##MatcherP3);\ + };\ + template \ + inline name##MatcherP3 name(p0##_type p0, \ + p1##_type p1, p2##_type p2) {\ + return name##MatcherP3(p0, p1, p2);\ + }\ + template \ + template \ + bool name##MatcherP3::gmock_Impl::MatchAndExplain(\ + arg_type arg, \ + ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ + const + +#define MATCHER_P4(name, p0, p1, p2, p3, description)\ + template \ + class name##MatcherP4 {\ + public:\ + template \ + class gmock_Impl : public ::testing::MatcherInterface {\ + public:\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3)\ + : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3) {}\ + virtual bool MatchAndExplain(\ + arg_type arg, ::testing::MatchResultListener* result_listener) const;\ + virtual void DescribeTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(false);\ + }\ + virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(true);\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + private:\ + ::testing::internal::string FormatDescription(bool negation) const {\ + const ::testing::internal::string gmock_description = (description);\ + if (!gmock_description.empty()) {\ + return gmock_description;\ + }\ + return ::testing::internal::FormatMatcherDescription(\ + negation, #name, \ + ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ + ::testing::tuple(p0, p1, p2, p3)));\ + }\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template \ + operator ::testing::Matcher() const {\ + return ::testing::Matcher(\ + new gmock_Impl(p0, p1, p2, p3));\ + }\ + name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \ + p2(gmock_p2), p3(gmock_p3) {\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##MatcherP4);\ + };\ + template \ + inline name##MatcherP4 name(p0##_type p0, p1##_type p1, p2##_type p2, \ + p3##_type p3) {\ + return name##MatcherP4(p0, \ + p1, p2, p3);\ + }\ + template \ + template \ + bool name##MatcherP4::gmock_Impl::MatchAndExplain(\ + arg_type arg, \ + ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ + const + +#define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\ + template \ + class name##MatcherP5 {\ + public:\ + template \ + class gmock_Impl : public ::testing::MatcherInterface {\ + public:\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4)\ + : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ + p4(gmock_p4) {}\ + virtual bool MatchAndExplain(\ + arg_type arg, ::testing::MatchResultListener* result_listener) const;\ + virtual void DescribeTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(false);\ + }\ + virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(true);\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + private:\ + ::testing::internal::string FormatDescription(bool negation) const {\ + const ::testing::internal::string gmock_description = (description);\ + if (!gmock_description.empty()) {\ + return gmock_description;\ + }\ + return ::testing::internal::FormatMatcherDescription(\ + negation, #name, \ + ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ + ::testing::tuple(p0, p1, p2, p3, p4)));\ + }\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template \ + operator ::testing::Matcher() const {\ + return ::testing::Matcher(\ + new gmock_Impl(p0, p1, p2, p3, p4));\ + }\ + name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3, \ + p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4) {\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##MatcherP5);\ + };\ + template \ + inline name##MatcherP5 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ + p4##_type p4) {\ + return name##MatcherP5(p0, p1, p2, p3, p4);\ + }\ + template \ + template \ + bool name##MatcherP5::gmock_Impl::MatchAndExplain(\ + arg_type arg, \ + ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ + const + +#define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\ + template \ + class name##MatcherP6 {\ + public:\ + template \ + class gmock_Impl : public ::testing::MatcherInterface {\ + public:\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\ + : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ + p4(gmock_p4), p5(gmock_p5) {}\ + virtual bool MatchAndExplain(\ + arg_type arg, ::testing::MatchResultListener* result_listener) const;\ + virtual void DescribeTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(false);\ + }\ + virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(true);\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + private:\ + ::testing::internal::string FormatDescription(bool negation) const {\ + const ::testing::internal::string gmock_description = (description);\ + if (!gmock_description.empty()) {\ + return gmock_description;\ + }\ + return ::testing::internal::FormatMatcherDescription(\ + negation, #name, \ + ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ + ::testing::tuple(p0, p1, p2, p3, p4, p5)));\ + }\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template \ + operator ::testing::Matcher() const {\ + return ::testing::Matcher(\ + new gmock_Impl(p0, p1, p2, p3, p4, p5));\ + }\ + name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ + p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##MatcherP6);\ + };\ + template \ + inline name##MatcherP6 name(p0##_type p0, p1##_type p1, p2##_type p2, \ + p3##_type p3, p4##_type p4, p5##_type p5) {\ + return name##MatcherP6(p0, p1, p2, p3, p4, p5);\ + }\ + template \ + template \ + bool name##MatcherP6::gmock_Impl::MatchAndExplain(\ + arg_type arg, \ + ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ + const + +#define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\ + template \ + class name##MatcherP7 {\ + public:\ + template \ + class gmock_Impl : public ::testing::MatcherInterface {\ + public:\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ + p6##_type gmock_p6)\ + : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ + p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\ + virtual bool MatchAndExplain(\ + arg_type arg, ::testing::MatchResultListener* result_listener) const;\ + virtual void DescribeTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(false);\ + }\ + virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(true);\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + private:\ + ::testing::internal::string FormatDescription(bool negation) const {\ + const ::testing::internal::string gmock_description = (description);\ + if (!gmock_description.empty()) {\ + return gmock_description;\ + }\ + return ::testing::internal::FormatMatcherDescription(\ + negation, #name, \ + ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ + ::testing::tuple(p0, p1, p2, p3, p4, p5, \ + p6)));\ + }\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template \ + operator ::testing::Matcher() const {\ + return ::testing::Matcher(\ + new gmock_Impl(p0, p1, p2, p3, p4, p5, p6));\ + }\ + name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ + p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \ + p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \ + p6(gmock_p6) {\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##MatcherP7);\ + };\ + template \ + inline name##MatcherP7 name(p0##_type p0, p1##_type p1, \ + p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ + p6##_type p6) {\ + return name##MatcherP7(p0, p1, p2, p3, p4, p5, p6);\ + }\ + template \ + template \ + bool name##MatcherP7::gmock_Impl::MatchAndExplain(\ + arg_type arg, \ + ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ + const + +#define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\ + template \ + class name##MatcherP8 {\ + public:\ + template \ + class gmock_Impl : public ::testing::MatcherInterface {\ + public:\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ + p6##_type gmock_p6, p7##_type gmock_p7)\ + : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ + p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\ + virtual bool MatchAndExplain(\ + arg_type arg, ::testing::MatchResultListener* result_listener) const;\ + virtual void DescribeTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(false);\ + }\ + virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(true);\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + p7##_type p7;\ + private:\ + ::testing::internal::string FormatDescription(bool negation) const {\ + const ::testing::internal::string gmock_description = (description);\ + if (!gmock_description.empty()) {\ + return gmock_description;\ + }\ + return ::testing::internal::FormatMatcherDescription(\ + negation, #name, \ + ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ + ::testing::tuple(p0, p1, p2, \ + p3, p4, p5, p6, p7)));\ + }\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template \ + operator ::testing::Matcher() const {\ + return ::testing::Matcher(\ + new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7));\ + }\ + name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ + p5##_type gmock_p5, p6##_type gmock_p6, \ + p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ + p7(gmock_p7) {\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + p7##_type p7;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##MatcherP8);\ + };\ + template \ + inline name##MatcherP8 name(p0##_type p0, \ + p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ + p6##_type p6, p7##_type p7) {\ + return name##MatcherP8(p0, p1, p2, p3, p4, p5, \ + p6, p7);\ + }\ + template \ + template \ + bool name##MatcherP8::gmock_Impl::MatchAndExplain(\ + arg_type arg, \ + ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ + const + +#define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\ + template \ + class name##MatcherP9 {\ + public:\ + template \ + class gmock_Impl : public ::testing::MatcherInterface {\ + public:\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ + p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\ + : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ + p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ + p8(gmock_p8) {}\ + virtual bool MatchAndExplain(\ + arg_type arg, ::testing::MatchResultListener* result_listener) const;\ + virtual void DescribeTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(false);\ + }\ + virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(true);\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + p7##_type p7;\ + p8##_type p8;\ + private:\ + ::testing::internal::string FormatDescription(bool negation) const {\ + const ::testing::internal::string gmock_description = (description);\ + if (!gmock_description.empty()) {\ + return gmock_description;\ + }\ + return ::testing::internal::FormatMatcherDescription(\ + negation, #name, \ + ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ + ::testing::tuple(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\ + }\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template \ + operator ::testing::Matcher() const {\ + return ::testing::Matcher(\ + new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7, p8));\ + }\ + name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ + p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ + p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ + p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ + p8(gmock_p8) {\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + p7##_type p7;\ + p8##_type p8;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##MatcherP9);\ + };\ + template \ + inline name##MatcherP9 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ + p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \ + p8##_type p8) {\ + return name##MatcherP9(p0, p1, p2, \ + p3, p4, p5, p6, p7, p8);\ + }\ + template \ + template \ + bool name##MatcherP9::gmock_Impl::MatchAndExplain(\ + arg_type arg, \ + ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ + const + +#define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\ + template \ + class name##MatcherP10 {\ + public:\ + template \ + class gmock_Impl : public ::testing::MatcherInterface {\ + public:\ + gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ + p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ + p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ + p9##_type gmock_p9)\ + : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ + p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ + p8(gmock_p8), p9(gmock_p9) {}\ + virtual bool MatchAndExplain(\ + arg_type arg, ::testing::MatchResultListener* result_listener) const;\ + virtual void DescribeTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(false);\ + }\ + virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(true);\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + p7##_type p7;\ + p8##_type p8;\ + p9##_type p9;\ + private:\ + ::testing::internal::string FormatDescription(bool negation) const {\ + const ::testing::internal::string gmock_description = (description);\ + if (!gmock_description.empty()) {\ + return gmock_description;\ + }\ + return ::testing::internal::FormatMatcherDescription(\ + negation, #name, \ + ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ + ::testing::tuple(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\ + }\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template \ + operator ::testing::Matcher() const {\ + return ::testing::Matcher(\ + new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\ + }\ + name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \ + p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ + p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ + p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \ + p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ + p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {\ + }\ + p0##_type p0;\ + p1##_type p1;\ + p2##_type p2;\ + p3##_type p3;\ + p4##_type p4;\ + p5##_type p5;\ + p6##_type p6;\ + p7##_type p7;\ + p8##_type p8;\ + p9##_type p9;\ + private:\ + GTEST_DISALLOW_ASSIGN_(name##MatcherP10);\ + };\ + template \ + inline name##MatcherP10 name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ + p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ + p9##_type p9) {\ + return name##MatcherP10(p0, \ + p1, p2, p3, p4, p5, p6, p7, p8, p9);\ + }\ + template \ + template \ + bool name##MatcherP10::gmock_Impl::MatchAndExplain(\ + arg_type arg, \ + ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ + const + +#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-matchers.h.pump vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-matchers.h.pump --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-matchers.h.pump 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-matchers.h.pump 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,673 @@ +$$ -*- mode: c++; -*- +$$ This is a Pump source file. Please use Pump to convert it to +$$ gmock-generated-actions.h. +$$ +$var n = 10 $$ The maximum arity we support. +$$ }} This line fixes auto-indentation of the following code in Emacs. +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used variadic matchers. + +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ + +#include +#include +#include +#include +#include "gmock/gmock-matchers.h" + +namespace testing { +namespace internal { + +$range i 0..n-1 + +// The type of the i-th (0-based) field of Tuple. +#define GMOCK_FIELD_TYPE_(Tuple, i) \ + typename ::testing::tuple_element::type + +// TupleFields is for selecting fields from a +// tuple of type Tuple. It has two members: +// +// type: a tuple type whose i-th field is the ki-th field of Tuple. +// GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple. +// +// For example, in class TupleFields, 2, 0>, we have: +// +// type is tuple, and +// GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true). + +template +class TupleFields; + +// This generic version is used when there are $n selectors. +template +class TupleFields { + public: + typedef ::testing::tuple<$for i, [[GMOCK_FIELD_TYPE_(Tuple, k$i)]]> type; + static type GetSelectedFields(const Tuple& t) { + return type($for i, [[get(t)]]); + } +}; + +// The following specialization is used for 0 ~ $(n-1) selectors. + +$for i [[ +$$ }}} +$range j 0..i-1 +$range k 0..n-1 + +template +class TupleFields { + public: + typedef ::testing::tuple<$for j, [[GMOCK_FIELD_TYPE_(Tuple, k$j)]]> type; + static type GetSelectedFields(const Tuple& $if i==0 [[/* t */]] $else [[t]]) { + return type($for j, [[get(t)]]); + } +}; + +]] + +#undef GMOCK_FIELD_TYPE_ + +// Implements the Args() matcher. + +$var ks = [[$for i, [[k$i]]]] +template +class ArgsMatcherImpl : public MatcherInterface { + public: + // ArgsTuple may have top-level const or reference modifiers. + typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple; + typedef typename internal::TupleFields::type SelectedArgs; + typedef Matcher MonomorphicInnerMatcher; + + template + explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher) + : inner_matcher_(SafeMatcherCast(inner_matcher)) {} + + virtual bool MatchAndExplain(ArgsTuple args, + MatchResultListener* listener) const { + const SelectedArgs& selected_args = GetSelectedArgs(args); + if (!listener->IsInterested()) + return inner_matcher_.Matches(selected_args); + + PrintIndices(listener->stream()); + *listener << "are " << PrintToString(selected_args); + + StringMatchResultListener inner_listener; + const bool match = inner_matcher_.MatchAndExplain(selected_args, + &inner_listener); + PrintIfNotEmpty(inner_listener.str(), listener->stream()); + return match; + } + + virtual void DescribeTo(::std::ostream* os) const { + *os << "are a tuple "; + PrintIndices(os); + inner_matcher_.DescribeTo(os); + } + + virtual void DescribeNegationTo(::std::ostream* os) const { + *os << "are a tuple "; + PrintIndices(os); + inner_matcher_.DescribeNegationTo(os); + } + + private: + static SelectedArgs GetSelectedArgs(ArgsTuple args) { + return TupleFields::GetSelectedFields(args); + } + + // Prints the indices of the selected fields. + static void PrintIndices(::std::ostream* os) { + *os << "whose fields ("; + const int indices[$n] = { $ks }; + for (int i = 0; i < $n; i++) { + if (indices[i] < 0) + break; + + if (i >= 1) + *os << ", "; + + *os << "#" << indices[i]; + } + *os << ") "; + } + + const MonomorphicInnerMatcher inner_matcher_; + + GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl); +}; + +template +class ArgsMatcher { + public: + explicit ArgsMatcher(const InnerMatcher& inner_matcher) + : inner_matcher_(inner_matcher) {} + + template + operator Matcher() const { + return MakeMatcher(new ArgsMatcherImpl(inner_matcher_)); + } + + private: + const InnerMatcher inner_matcher_; + + GTEST_DISALLOW_ASSIGN_(ArgsMatcher); +}; + +// A set of metafunctions for computing the result type of AllOf. +// AllOf(m1, ..., mN) returns +// AllOfResultN::type. + +// Although AllOf isn't defined for one argument, AllOfResult1 is defined +// to simplify the implementation. +template +struct AllOfResult1 { + typedef M1 type; +}; + +$range i 1..n + +$range i 2..n +$for i [[ +$range j 2..i +$var m = i/2 +$range k 1..m +$range t m+1..i + +template +struct AllOfResult$i { + typedef BothOfMatcher< + typename AllOfResult$m<$for k, [[M$k]]>::type, + typename AllOfResult$(i-m)<$for t, [[M$t]]>::type + > type; +}; + +]] + +// A set of metafunctions for computing the result type of AnyOf. +// AnyOf(m1, ..., mN) returns +// AnyOfResultN::type. + +// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined +// to simplify the implementation. +template +struct AnyOfResult1 { + typedef M1 type; +}; + +$range i 1..n + +$range i 2..n +$for i [[ +$range j 2..i +$var m = i/2 +$range k 1..m +$range t m+1..i + +template +struct AnyOfResult$i { + typedef EitherOfMatcher< + typename AnyOfResult$m<$for k, [[M$k]]>::type, + typename AnyOfResult$(i-m)<$for t, [[M$t]]>::type + > type; +}; + +]] + +} // namespace internal + +// Args(a_matcher) matches a tuple if the selected +// fields of it matches a_matcher. C++ doesn't support default +// arguments for function templates, so we have to overload it. + +$range i 0..n +$for i [[ +$range j 1..i +template <$for j [[int k$j, ]]typename InnerMatcher> +inline internal::ArgsMatcher +Args(const InnerMatcher& matcher) { + return internal::ArgsMatcher(matcher); +} + + +]] +// ElementsAre(e_1, e_2, ... e_n) matches an STL-style container with +// n elements, where the i-th element in the container must +// match the i-th argument in the list. Each argument of +// ElementsAre() can be either a value or a matcher. We support up to +// $n arguments. +// +// The use of DecayArray in the implementation allows ElementsAre() +// to accept string literals, whose type is const char[N], but we +// want to treat them as const char*. +// +// NOTE: Since ElementsAre() cares about the order of the elements, it +// must not be used with containers whose elements's order is +// undefined (e.g. hash_map). + +$range i 0..n +$for i [[ + +$range j 1..i + +$if i>0 [[ + +template <$for j, [[typename T$j]]> +]] + +inline internal::ElementsAreMatcher< + ::testing::tuple< +$for j, [[ + + typename internal::DecayArray::type]]> > +ElementsAre($for j, [[const T$j& e$j]]) { + typedef ::testing::tuple< +$for j, [[ + + typename internal::DecayArray::type]]> Args; + return internal::ElementsAreMatcher(Args($for j, [[e$j]])); +} + +]] + +// UnorderedElementsAre(e_1, e_2, ..., e_n) is an ElementsAre extension +// that matches n elements in any order. We support up to n=$n arguments. + +$range i 0..n +$for i [[ + +$range j 1..i + +$if i>0 [[ + +template <$for j, [[typename T$j]]> +]] + +inline internal::UnorderedElementsAreMatcher< + ::testing::tuple< +$for j, [[ + + typename internal::DecayArray::type]]> > +UnorderedElementsAre($for j, [[const T$j& e$j]]) { + typedef ::testing::tuple< +$for j, [[ + + typename internal::DecayArray::type]]> Args; + return internal::UnorderedElementsAreMatcher(Args($for j, [[e$j]])); +} + +]] + +// AllOf(m1, m2, ..., mk) matches any value that matches all of the given +// sub-matchers. AllOf is called fully qualified to prevent ADL from firing. + +$range i 2..n +$for i [[ +$range j 1..i +$var m = i/2 +$range k 1..m +$range t m+1..i + +template <$for j, [[typename M$j]]> +inline typename internal::AllOfResult$i<$for j, [[M$j]]>::type +AllOf($for j, [[M$j m$j]]) { + return typename internal::AllOfResult$i<$for j, [[M$j]]>::type( + $if m == 1 [[m1]] $else [[::testing::AllOf($for k, [[m$k]])]], + $if m+1 == i [[m$i]] $else [[::testing::AllOf($for t, [[m$t]])]]); +} + +]] + +// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given +// sub-matchers. AnyOf is called fully qualified to prevent ADL from firing. + +$range i 2..n +$for i [[ +$range j 1..i +$var m = i/2 +$range k 1..m +$range t m+1..i + +template <$for j, [[typename M$j]]> +inline typename internal::AnyOfResult$i<$for j, [[M$j]]>::type +AnyOf($for j, [[M$j m$j]]) { + return typename internal::AnyOfResult$i<$for j, [[M$j]]>::type( + $if m == 1 [[m1]] $else [[::testing::AnyOf($for k, [[m$k]])]], + $if m+1 == i [[m$i]] $else [[::testing::AnyOf($for t, [[m$t]])]]); +} + +]] + +} // namespace testing +$$ } // This Pump meta comment fixes auto-indentation in Emacs. It will not +$$ // show up in the generated code. + + +// The MATCHER* family of macros can be used in a namespace scope to +// define custom matchers easily. +// +// Basic Usage +// =========== +// +// The syntax +// +// MATCHER(name, description_string) { statements; } +// +// defines a matcher with the given name that executes the statements, +// which must return a bool to indicate if the match succeeds. Inside +// the statements, you can refer to the value being matched by 'arg', +// and refer to its type by 'arg_type'. +// +// The description string documents what the matcher does, and is used +// to generate the failure message when the match fails. Since a +// MATCHER() is usually defined in a header file shared by multiple +// C++ source files, we require the description to be a C-string +// literal to avoid possible side effects. It can be empty, in which +// case we'll use the sequence of words in the matcher name as the +// description. +// +// For example: +// +// MATCHER(IsEven, "") { return (arg % 2) == 0; } +// +// allows you to write +// +// // Expects mock_foo.Bar(n) to be called where n is even. +// EXPECT_CALL(mock_foo, Bar(IsEven())); +// +// or, +// +// // Verifies that the value of some_expression is even. +// EXPECT_THAT(some_expression, IsEven()); +// +// If the above assertion fails, it will print something like: +// +// Value of: some_expression +// Expected: is even +// Actual: 7 +// +// where the description "is even" is automatically calculated from the +// matcher name IsEven. +// +// Argument Type +// ============= +// +// Note that the type of the value being matched (arg_type) is +// determined by the context in which you use the matcher and is +// supplied to you by the compiler, so you don't need to worry about +// declaring it (nor can you). This allows the matcher to be +// polymorphic. For example, IsEven() can be used to match any type +// where the value of "(arg % 2) == 0" can be implicitly converted to +// a bool. In the "Bar(IsEven())" example above, if method Bar() +// takes an int, 'arg_type' will be int; if it takes an unsigned long, +// 'arg_type' will be unsigned long; and so on. +// +// Parameterizing Matchers +// ======================= +// +// Sometimes you'll want to parameterize the matcher. For that you +// can use another macro: +// +// MATCHER_P(name, param_name, description_string) { statements; } +// +// For example: +// +// MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } +// +// will allow you to write: +// +// EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); +// +// which may lead to this message (assuming n is 10): +// +// Value of: Blah("a") +// Expected: has absolute value 10 +// Actual: -9 +// +// Note that both the matcher description and its parameter are +// printed, making the message human-friendly. +// +// In the matcher definition body, you can write 'foo_type' to +// reference the type of a parameter named 'foo'. For example, in the +// body of MATCHER_P(HasAbsoluteValue, value) above, you can write +// 'value_type' to refer to the type of 'value'. +// +// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P$n to +// support multi-parameter matchers. +// +// Describing Parameterized Matchers +// ================================= +// +// The last argument to MATCHER*() is a string-typed expression. The +// expression can reference all of the matcher's parameters and a +// special bool-typed variable named 'negation'. When 'negation' is +// false, the expression should evaluate to the matcher's description; +// otherwise it should evaluate to the description of the negation of +// the matcher. For example, +// +// using testing::PrintToString; +// +// MATCHER_P2(InClosedRange, low, hi, +// string(negation ? "is not" : "is") + " in range [" + +// PrintToString(low) + ", " + PrintToString(hi) + "]") { +// return low <= arg && arg <= hi; +// } +// ... +// EXPECT_THAT(3, InClosedRange(4, 6)); +// EXPECT_THAT(3, Not(InClosedRange(2, 4))); +// +// would generate two failures that contain the text: +// +// Expected: is in range [4, 6] +// ... +// Expected: is not in range [2, 4] +// +// If you specify "" as the description, the failure message will +// contain the sequence of words in the matcher name followed by the +// parameter values printed as a tuple. For example, +// +// MATCHER_P2(InClosedRange, low, hi, "") { ... } +// ... +// EXPECT_THAT(3, InClosedRange(4, 6)); +// EXPECT_THAT(3, Not(InClosedRange(2, 4))); +// +// would generate two failures that contain the text: +// +// Expected: in closed range (4, 6) +// ... +// Expected: not (in closed range (2, 4)) +// +// Types of Matcher Parameters +// =========================== +// +// For the purpose of typing, you can view +// +// MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } +// +// as shorthand for +// +// template +// FooMatcherPk +// Foo(p1_type p1, ..., pk_type pk) { ... } +// +// When you write Foo(v1, ..., vk), the compiler infers the types of +// the parameters v1, ..., and vk for you. If you are not happy with +// the result of the type inference, you can specify the types by +// explicitly instantiating the template, as in Foo(5, +// false). As said earlier, you don't get to (or need to) specify +// 'arg_type' as that's determined by the context in which the matcher +// is used. You can assign the result of expression Foo(p1, ..., pk) +// to a variable of type FooMatcherPk. This +// can be useful when composing matchers. +// +// While you can instantiate a matcher template with reference types, +// passing the parameters by pointer usually makes your code more +// readable. If, however, you still want to pass a parameter by +// reference, be aware that in the failure message generated by the +// matcher you will see the value of the referenced object but not its +// address. +// +// Explaining Match Results +// ======================== +// +// Sometimes the matcher description alone isn't enough to explain why +// the match has failed or succeeded. For example, when expecting a +// long string, it can be very helpful to also print the diff between +// the expected string and the actual one. To achieve that, you can +// optionally stream additional information to a special variable +// named result_listener, whose type is a pointer to class +// MatchResultListener: +// +// MATCHER_P(EqualsLongString, str, "") { +// if (arg == str) return true; +// +// *result_listener << "the difference: " +/// << DiffStrings(str, arg); +// return false; +// } +// +// Overloading Matchers +// ==================== +// +// You can overload matchers with different numbers of parameters: +// +// MATCHER_P(Blah, a, description_string1) { ... } +// MATCHER_P2(Blah, a, b, description_string2) { ... } +// +// Caveats +// ======= +// +// When defining a new matcher, you should also consider implementing +// MatcherInterface or using MakePolymorphicMatcher(). These +// approaches require more work than the MATCHER* macros, but also +// give you more control on the types of the value being matched and +// the matcher parameters, which may leads to better compiler error +// messages when the matcher is used wrong. They also allow +// overloading matchers based on parameter types (as opposed to just +// based on the number of parameters). +// +// MATCHER*() can only be used in a namespace scope. The reason is +// that C++ doesn't yet allow function-local types to be used to +// instantiate templates. The up-coming C++0x standard will fix this. +// Once that's done, we'll consider supporting using MATCHER*() inside +// a function. +// +// More Information +// ================ +// +// To learn more about using these macros, please search for 'MATCHER' +// on https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md + +$range i 0..n +$for i + +[[ +$var macro_name = [[$if i==0 [[MATCHER]] $elif i==1 [[MATCHER_P]] + $else [[MATCHER_P$i]]]] +$var class_name = [[name##Matcher[[$if i==0 [[]] $elif i==1 [[P]] + $else [[P$i]]]]]] +$range j 0..i-1 +$var template = [[$if i==0 [[]] $else [[ + + template <$for j, [[typename p$j##_type]]>\ +]]]] +$var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] +$var impl_ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] +$var impl_inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(gmock_p$j)]]]]]] +$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(gmock_p$j)]]]]]] +$var params = [[$for j, [[p$j]]]] +$var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]] +$var param_types_and_names = [[$for j, [[p$j##_type p$j]]]] +$var param_field_decls = [[$for j +[[ + + p$j##_type p$j;\ +]]]] +$var param_field_decls2 = [[$for j +[[ + + p$j##_type p$j;\ +]]]] + +#define $macro_name(name$for j [[, p$j]], description)\$template + class $class_name {\ + public:\ + template \ + class gmock_Impl : public ::testing::MatcherInterface {\ + public:\ + [[$if i==1 [[explicit ]]]]gmock_Impl($impl_ctor_param_list)\ + $impl_inits {}\ + virtual bool MatchAndExplain(\ + arg_type arg, ::testing::MatchResultListener* result_listener) const;\ + virtual void DescribeTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(false);\ + }\ + virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ + *gmock_os << FormatDescription(true);\ + }\$param_field_decls + private:\ + ::testing::internal::string FormatDescription(bool negation) const {\ + const ::testing::internal::string gmock_description = (description);\ + if (!gmock_description.empty()) {\ + return gmock_description;\ + }\ + return ::testing::internal::FormatMatcherDescription(\ + negation, #name, \ + ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ + ::testing::tuple<$for j, [[p$j##_type]]>($for j, [[p$j]])));\ + }\ + GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ + };\ + template \ + operator ::testing::Matcher() const {\ + return ::testing::Matcher(\ + new gmock_Impl($params));\ + }\ + [[$if i==1 [[explicit ]]]]$class_name($ctor_param_list)$inits {\ + }\$param_field_decls2 + private:\ + GTEST_DISALLOW_ASSIGN_($class_name);\ + };\$template + inline $class_name$param_types name($param_types_and_names) {\ + return $class_name$param_types($params);\ + }\$template + template \ + bool $class_name$param_types::gmock_Impl::MatchAndExplain(\ + arg_type arg, \ + ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ + const +]] + + +#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-nice-strict.h vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-nice-strict.h --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-nice-strict.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-nice-strict.h 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,397 @@ +// This file was GENERATED by command: +// pump.py gmock-generated-nice-strict.h.pump +// DO NOT EDIT BY HAND!!! + +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Implements class templates NiceMock, NaggyMock, and StrictMock. +// +// Given a mock class MockFoo that is created using Google Mock, +// NiceMock is a subclass of MockFoo that allows +// uninteresting calls (i.e. calls to mock methods that have no +// EXPECT_CALL specs), NaggyMock is a subclass of MockFoo +// that prints a warning when an uninteresting call occurs, and +// StrictMock is a subclass of MockFoo that treats all +// uninteresting calls as errors. +// +// Currently a mock is naggy by default, so MockFoo and +// NaggyMock behave like the same. However, we will soon +// switch the default behavior of mocks to be nice, as that in general +// leads to more maintainable tests. When that happens, MockFoo will +// stop behaving like NaggyMock and start behaving like +// NiceMock. +// +// NiceMock, NaggyMock, and StrictMock "inherit" the constructors of +// their respective base class, with up-to 10 arguments. Therefore +// you can write NiceMock(5, "a") to construct a nice mock +// where MockFoo has a constructor that accepts (int, const char*), +// for example. +// +// A known limitation is that NiceMock, NaggyMock, +// and StrictMock only works for mock methods defined using +// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class. +// If a mock method is defined in a base class of MockFoo, the "nice" +// or "strict" modifier may not affect it, depending on the compiler. +// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT +// supported. +// +// Another known limitation is that the constructors of the base mock +// cannot have arguments passed by non-const reference, which are +// banned by the Google C++ style guide anyway. + +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ + +#include "gmock/gmock-spec-builders.h" +#include "gmock/internal/gmock-port.h" + +namespace testing { + +template +class NiceMock : public MockClass { + public: + // We don't factor out the constructor body to a common method, as + // we have to avoid a possible clash with members of MockClass. + NiceMock() { + ::testing::Mock::AllowUninterestingCalls( + internal::ImplicitCast_(this)); + } + + // C++ doesn't (yet) allow inheritance of constructors, so we have + // to define it for each arity. + template + explicit NiceMock(const A1& a1) : MockClass(a1) { + ::testing::Mock::AllowUninterestingCalls( + internal::ImplicitCast_(this)); + } + template + NiceMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { + ::testing::Mock::AllowUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NiceMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) { + ::testing::Mock::AllowUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NiceMock(const A1& a1, const A2& a2, const A3& a3, + const A4& a4) : MockClass(a1, a2, a3, a4) { + ::testing::Mock::AllowUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5) : MockClass(a1, a2, a3, a4, a5) { + ::testing::Mock::AllowUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) { + ::testing::Mock::AllowUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5, + a6, a7) { + ::testing::Mock::AllowUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1, + a2, a3, a4, a5, a6, a7, a8) { + ::testing::Mock::AllowUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6, const A7& a7, const A8& a8, + const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) { + ::testing::Mock::AllowUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, + const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) { + ::testing::Mock::AllowUninterestingCalls( + internal::ImplicitCast_(this)); + } + + virtual ~NiceMock() { + ::testing::Mock::UnregisterCallReaction( + internal::ImplicitCast_(this)); + } + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock); +}; + +template +class NaggyMock : public MockClass { + public: + // We don't factor out the constructor body to a common method, as + // we have to avoid a possible clash with members of MockClass. + NaggyMock() { + ::testing::Mock::WarnUninterestingCalls( + internal::ImplicitCast_(this)); + } + + // C++ doesn't (yet) allow inheritance of constructors, so we have + // to define it for each arity. + template + explicit NaggyMock(const A1& a1) : MockClass(a1) { + ::testing::Mock::WarnUninterestingCalls( + internal::ImplicitCast_(this)); + } + template + NaggyMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { + ::testing::Mock::WarnUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NaggyMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) { + ::testing::Mock::WarnUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NaggyMock(const A1& a1, const A2& a2, const A3& a3, + const A4& a4) : MockClass(a1, a2, a3, a4) { + ::testing::Mock::WarnUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5) : MockClass(a1, a2, a3, a4, a5) { + ::testing::Mock::WarnUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) { + ::testing::Mock::WarnUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5, + a6, a7) { + ::testing::Mock::WarnUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1, + a2, a3, a4, a5, a6, a7, a8) { + ::testing::Mock::WarnUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6, const A7& a7, const A8& a8, + const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) { + ::testing::Mock::WarnUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, + const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) { + ::testing::Mock::WarnUninterestingCalls( + internal::ImplicitCast_(this)); + } + + virtual ~NaggyMock() { + ::testing::Mock::UnregisterCallReaction( + internal::ImplicitCast_(this)); + } + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(NaggyMock); +}; + +template +class StrictMock : public MockClass { + public: + // We don't factor out the constructor body to a common method, as + // we have to avoid a possible clash with members of MockClass. + StrictMock() { + ::testing::Mock::FailUninterestingCalls( + internal::ImplicitCast_(this)); + } + + // C++ doesn't (yet) allow inheritance of constructors, so we have + // to define it for each arity. + template + explicit StrictMock(const A1& a1) : MockClass(a1) { + ::testing::Mock::FailUninterestingCalls( + internal::ImplicitCast_(this)); + } + template + StrictMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { + ::testing::Mock::FailUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + StrictMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) { + ::testing::Mock::FailUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + StrictMock(const A1& a1, const A2& a2, const A3& a3, + const A4& a4) : MockClass(a1, a2, a3, a4) { + ::testing::Mock::FailUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5) : MockClass(a1, a2, a3, a4, a5) { + ::testing::Mock::FailUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) { + ::testing::Mock::FailUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5, + a6, a7) { + ::testing::Mock::FailUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1, + a2, a3, a4, a5, a6, a7, a8) { + ::testing::Mock::FailUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6, const A7& a7, const A8& a8, + const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) { + ::testing::Mock::FailUninterestingCalls( + internal::ImplicitCast_(this)); + } + + template + StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, + const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, + const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) { + ::testing::Mock::FailUninterestingCalls( + internal::ImplicitCast_(this)); + } + + virtual ~StrictMock() { + ::testing::Mock::UnregisterCallReaction( + internal::ImplicitCast_(this)); + } + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock); +}; + +// The following specializations catch some (relatively more common) +// user errors of nesting nice and strict mocks. They do NOT catch +// all possible errors. + +// These specializations are declared but not defined, as NiceMock, +// NaggyMock, and StrictMock cannot be nested. + +template +class NiceMock >; +template +class NiceMock >; +template +class NiceMock >; + +template +class NaggyMock >; +template +class NaggyMock >; +template +class NaggyMock >; + +template +class StrictMock >; +template +class StrictMock >; +template +class StrictMock >; + +} // namespace testing + +#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-nice-strict.h.pump vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-nice-strict.h.pump --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-generated-nice-strict.h.pump 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-generated-nice-strict.h.pump 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,161 @@ +$$ -*- mode: c++; -*- +$$ This is a Pump source file. Please use Pump to convert it to +$$ gmock-generated-nice-strict.h. +$$ +$var n = 10 $$ The maximum arity we support. +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Implements class templates NiceMock, NaggyMock, and StrictMock. +// +// Given a mock class MockFoo that is created using Google Mock, +// NiceMock is a subclass of MockFoo that allows +// uninteresting calls (i.e. calls to mock methods that have no +// EXPECT_CALL specs), NaggyMock is a subclass of MockFoo +// that prints a warning when an uninteresting call occurs, and +// StrictMock is a subclass of MockFoo that treats all +// uninteresting calls as errors. +// +// Currently a mock is naggy by default, so MockFoo and +// NaggyMock behave like the same. However, we will soon +// switch the default behavior of mocks to be nice, as that in general +// leads to more maintainable tests. When that happens, MockFoo will +// stop behaving like NaggyMock and start behaving like +// NiceMock. +// +// NiceMock, NaggyMock, and StrictMock "inherit" the constructors of +// their respective base class, with up-to $n arguments. Therefore +// you can write NiceMock(5, "a") to construct a nice mock +// where MockFoo has a constructor that accepts (int, const char*), +// for example. +// +// A known limitation is that NiceMock, NaggyMock, +// and StrictMock only works for mock methods defined using +// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class. +// If a mock method is defined in a base class of MockFoo, the "nice" +// or "strict" modifier may not affect it, depending on the compiler. +// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT +// supported. +// +// Another known limitation is that the constructors of the base mock +// cannot have arguments passed by non-const reference, which are +// banned by the Google C++ style guide anyway. + +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ + +#include "gmock/gmock-spec-builders.h" +#include "gmock/internal/gmock-port.h" + +namespace testing { + +$range kind 0..2 +$for kind [[ + +$var clazz=[[$if kind==0 [[NiceMock]] + $elif kind==1 [[NaggyMock]] + $else [[StrictMock]]]] + +$var method=[[$if kind==0 [[AllowUninterestingCalls]] + $elif kind==1 [[WarnUninterestingCalls]] + $else [[FailUninterestingCalls]]]] + +template +class $clazz : public MockClass { + public: + // We don't factor out the constructor body to a common method, as + // we have to avoid a possible clash with members of MockClass. + $clazz() { + ::testing::Mock::$method( + internal::ImplicitCast_(this)); + } + + // C++ doesn't (yet) allow inheritance of constructors, so we have + // to define it for each arity. + template + explicit $clazz(const A1& a1) : MockClass(a1) { + ::testing::Mock::$method( + internal::ImplicitCast_(this)); + } + +$range i 2..n +$for i [[ +$range j 1..i + template <$for j, [[typename A$j]]> + $clazz($for j, [[const A$j& a$j]]) : MockClass($for j, [[a$j]]) { + ::testing::Mock::$method( + internal::ImplicitCast_(this)); + } + + +]] + virtual ~$clazz() { + ::testing::Mock::UnregisterCallReaction( + internal::ImplicitCast_(this)); + } + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_($clazz); +}; + +]] + +// The following specializations catch some (relatively more common) +// user errors of nesting nice and strict mocks. They do NOT catch +// all possible errors. + +// These specializations are declared but not defined, as NiceMock, +// NaggyMock, and StrictMock cannot be nested. + +template +class NiceMock >; +template +class NiceMock >; +template +class NiceMock >; + +template +class NaggyMock >; +template +class NaggyMock >; +template +class NaggyMock >; + +template +class StrictMock >; +template +class StrictMock >; +template +class StrictMock >; + +} // namespace testing + +#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock.h vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock.h --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock.h 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,95 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Google Mock - a framework for writing C++ mock classes. +// +// This is the main header file a user should include. + +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_H_ + +// This file implements the following syntax: +// +// ON_CALL(mock_object.Method(...)) +// .With(...) ? +// .WillByDefault(...); +// +// where With() is optional and WillByDefault() must appear exactly +// once. +// +// EXPECT_CALL(mock_object.Method(...)) +// .With(...) ? +// .Times(...) ? +// .InSequence(...) * +// .WillOnce(...) * +// .WillRepeatedly(...) ? +// .RetiresOnSaturation() ? ; +// +// where all clauses are optional and WillOnce() can be repeated. + +#include "gmock/gmock-actions.h" +#include "gmock/gmock-cardinalities.h" +#include "gmock/gmock-generated-actions.h" +#include "gmock/gmock-generated-function-mockers.h" +#include "gmock/gmock-generated-matchers.h" +#include "gmock/gmock-generated-nice-strict.h" +#include "gmock/gmock-matchers.h" +#include "gmock/gmock-more-actions.h" +#include "gmock/gmock-more-matchers.h" +#include "gmock/internal/gmock-internal-utils.h" + +namespace testing { + +// Declares Google Mock flags that we want a user to use programmatically. +GMOCK_DECLARE_bool_(catch_leaked_mocks); +GMOCK_DECLARE_string_(verbose); +GMOCK_DECLARE_int32_(default_mock_behavior); + +// Initializes Google Mock. This must be called before running the +// tests. In particular, it parses the command line for the flags +// that Google Mock recognizes. Whenever a Google Mock flag is seen, +// it is removed from argv, and *argc is decremented. +// +// No value is returned. Instead, the Google Mock flag variables are +// updated. +// +// Since Google Test is needed for Google Mock to work, this function +// also initializes Google Test and parses its flags, if that hasn't +// been done. +GTEST_API_ void InitGoogleMock(int* argc, char** argv); + +// This overloaded version can be used in Windows programs compiled in +// UNICODE mode. +GTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv); + +} // namespace testing + +#endif // GMOCK_INCLUDE_GMOCK_GMOCK_H_ diff -Nru vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-matchers.h vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-matchers.h --- vulkan-1.1.70+dfsg1/submodules/googletest/googlemock/include/gmock/gmock-matchers.h 1970-01-01 00:00:00.000000000 +0000 +++ vulkan-1.1.73+dfsg/submodules/googletest/googlemock/include/gmock/gmock-matchers.h 2018-04-27 11:46:12.000000000 +0000 @@ -0,0 +1,5133 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used argument matchers. More +// matchers can be defined by the user implementing the +// MatcherInterface interface if necessary. + +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ + +#include +#include +#include +#include +#include // NOLINT +#include +#include +#include +#include +#include "gtest/gtest.h" +#include "gmock/internal/gmock-internal-utils.h" +#include "gmock/internal/gmock-port.h" + +#if GTEST_HAS_STD_INITIALIZER_LIST_ +# include // NOLINT -- must be after gtest.h +#endif + +namespace testing { + +// To implement a matcher Foo for type T, define: +// 1. a class FooMatcherImpl that implements the +// MatcherInterface interface, and +// 2. a factory function that creates a Matcher object from a +// FooMatcherImpl*. +// +// The two-level delegation design makes it possible to allow a user +// to write "v" instead of "Eq(v)" where a Matcher is expected, which +// is impossible if we pass matchers by pointers. It also eases +// ownership management as Matcher objects can now be copied like +// plain values. + +// MatchResultListener is an abstract class. Its << operator can be +// used by a matcher to explain why a value matches or doesn't match. +// +// TODO(wan@google.com): add method +// bool InterestedInWhy(bool result) const; +// to indicate whether the listener is interested in why the match +// result is 'result'. +class MatchResultListener { + public: + // Creates a listener object with the given underlying ostream. The + // listener does not own the ostream, and does not dereference it + // in the constructor or destructor. + explicit MatchResultListener(::std::ostream* os) : stream_(os) {} + virtual ~MatchResultListener() = 0; // Makes this class abstract. + + // Streams x to the underlying ostream; does nothing if the ostream + // is NULL. + template + MatchResultListener& operator<<(const T& x) { + if (stream_ != NULL) + *stream_ << x; + return *this; + } + + // Returns the underlying ostream. + ::std::ostream* stream() { return stream_; } + + // Returns true iff the listener is interested in an explanation of + // the match result. A matcher's MatchAndExplain() method can use + // this information to avoid generating the explanation when no one + // intends to hear it. + bool IsInterested() const { return stream_ != NULL; } + + private: + ::std::ostream* const stream_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener); +}; + +inline MatchResultListener::~MatchResultListener() { +} + +// An instance of a subclass of this knows how to describe itself as a +// matcher. +class MatcherDescriberInterface { + public: + virtual ~MatcherDescriberInterface() {} + + // Describes this matcher to an ostream. The function should print + // a verb phrase that describes the property a value matching this + // matcher should have. The subject of the verb phrase is the value + // being matched. For example, the DescribeTo() method of the Gt(7) + // matcher prints "is greater than 7". + virtual void DescribeTo(::std::ostream* os) const = 0; + + // Describes the negation of this matcher to an ostream. For + // example, if the description of this matcher is "is greater than + // 7", the negated description could be "is not greater than 7". + // You are not required to override this when implementing + // MatcherInterface, but it is highly advised so that your matcher + // can produce good error messages. + virtual void DescribeNegationTo(::std::ostream* os) const { + *os << "not ("; + DescribeTo(os); + *os << ")"; + } +}; + +// The implementation of a matcher. +template +class MatcherInterface : public MatcherDescriberInterface { + public: + // Returns true iff the matcher matches x; also explains the match + // result to 'listener' if necessary (see the next paragraph), in + // the form of a non-restrictive relative clause ("which ...", + // "whose ...", etc) that describes x. For example, the + // MatchAndExplain() method of the Pointee(...) matcher should + // generate an explanation like "which points to ...". + // + // Implementations of MatchAndExplain() should add an explanation of + // the match result *if and only if* they can provide additional + // information that's not already present (or not obvious) in the + // print-out of x and the matcher's description. Whether the match + // succeeds is not a factor in deciding whether an explanation is + // needed, as sometimes the caller needs to print a failure message + // when the match succeeds (e.g. when the matcher is used inside + // Not()). + // + // For example, a "has at least 10 elements" matcher should explain + // what the actual element count is, regardless of the match result, + // as it is useful information to the reader; on the other hand, an + // "is empty" matcher probably only needs to explain what the actual + // size is when the match fails, as it's redundant to say that the + // size is 0 when the value is already known to be empty. + // + // You should override this method when defining a new matcher. + // + // It's the responsibility of the caller (Google Mock) to guarantee + // that 'listener' is not NULL. This helps to simplify a matcher's + // implementation when it doesn't care about the performance, as it + // can talk to 'listener' without checking its validity first. + // However, in order to implement dummy listeners efficiently, + // listener->stream() may be NULL. + virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; + + // Inherits these methods from MatcherDescriberInterface: + // virtual void DescribeTo(::std::ostream* os) const = 0; + // virtual void DescribeNegationTo(::std::ostream* os) const; +}; + +namespace internal { + +// Converts a MatcherInterface to a MatcherInterface. +template +class MatcherInterfaceAdapter : public MatcherInterface { + public: + explicit MatcherInterfaceAdapter(const MatcherInterface* impl) + : impl_(impl) {} + virtual ~MatcherInterfaceAdapter() { delete impl_; } + + virtual void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } + + virtual void DescribeNegationTo(::std::ostream* os) const { + impl_->DescribeNegationTo(os); + } + + virtual bool MatchAndExplain(const T& x, + MatchResultListener* listener) const { + return impl_->MatchAndExplain(x, listener); + } + + private: + const MatcherInterface* const impl_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(MatcherInterfaceAdapter); +}; + +} // namespace internal + +// A match result listener that stores the explanation in a string. +class StringMatchResultListener : public MatchResultListener { + public: + StringMatchResultListener() : MatchResultListener(&ss_) {} + + // Returns the explanation accumulated so far. + std::string str() const { return ss_.str(); } + + // Clears the explanation accumulated so far. + void Clear() { ss_.str(""); } + + private: + ::std::stringstream ss_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener); +}; + +namespace internal { + +struct AnyEq { + template + bool operator()(const A& a, const B& b) const { return a == b; } +}; +struct AnyNe { + template + bool operator()(const A& a, const B& b) const { return a != b; } +}; +struct AnyLt { + template + bool operator()(const A& a, const B& b) const { return a < b; } +}; +struct AnyGt { + template + bool operator()(const A& a, const B& b) const { return a > b; } +}; +struct AnyLe { + template + bool operator()(const A& a, const B& b) const { return a <= b; } +}; +struct AnyGe { + template + bool operator()(const A& a, const B& b) const { return a >= b; } +}; + +// A match result listener that ignores the explanation. +class DummyMatchResultListener : public MatchResultListener { + public: + DummyMatchResultListener() : MatchResultListener(NULL) {} + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener); +}; + +// A match result listener that forwards the explanation to a given +// ostream. The difference between this and MatchResultListener is +// that the former is concrete. +class StreamMatchResultListener : public MatchResultListener { + public: + explicit StreamMatchResultListener(::std::ostream* os) + : MatchResultListener(os) {} + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener); +}; + +// An internal class for implementing Matcher, which will derive +// from it. We put functionalities common to all Matcher +// specializations here to avoid code duplication. +template +class MatcherBase { + public: + // Returns true iff the matcher matches x; also explains the match + // result to 'listener'. + bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x, + MatchResultListener* listener) const { + return impl_->MatchAndExplain(x, listener); + } + + // Returns true iff this matcher matches x. + bool Matches(T x) const { + DummyMatchResultListener dummy; + return MatchAndExplain(x, &dummy); + } + + // Describes this matcher to an ostream. + void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } + + // Describes the negation of this matcher to an ostream. + void DescribeNegationTo(::std::ostream* os) const { + impl_->DescribeNegationTo(os); + } + + // Explains why x matches, or doesn't match, the matcher. + void ExplainMatchResultTo(T x, ::std::ostream* os) const { + StreamMatchResultListener listener(os); + MatchAndExplain(x, &listener); + } + + // Returns the describer for this matcher object; retains ownership + // of the describer, which is only guaranteed to be alive when + // this matcher object is alive. + const MatcherDescriberInterface* GetDescriber() const { + return impl_.get(); + } + + protected: + MatcherBase() {} + + // Constructs a matcher from its implementation. + explicit MatcherBase(const MatcherInterface* impl) + : impl_(impl) {} + + template + explicit MatcherBase( + const MatcherInterface* impl, + typename internal::EnableIf< + !internal::IsSame::value>::type* = + NULL) + : impl_(new internal::MatcherInterfaceAdapter(impl)) {} + + virtual ~MatcherBase() {} + + private: + // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar + // interfaces. The former dynamically allocates a chunk of memory + // to hold the reference count, while the latter tracks all + // references using a circular linked list without allocating + // memory. It has been observed that linked_ptr performs better in + // typical scenarios. However, shared_ptr can out-perform + // linked_ptr when there are many more uses of the copy constructor + // than the default constructor. + // + // If performance becomes a problem, we should see if using + // shared_ptr helps. + ::testing::internal::linked_ptr > impl_; +}; + +} // namespace internal + +// A Matcher is a copyable and IMMUTABLE (except by assignment) +// object that can check whether a value of type T matches. The +// implementation of Matcher is just a linked_ptr to const +// MatcherInterface, so copying is fairly cheap. Don't inherit +// from Matcher! +template +class Matcher : public internal::MatcherBase { + public: + // Constructs a null matcher. Needed for storing Matcher objects in STL + // containers. A default-constructed matcher is not yet initialized. You + // cannot use it until a valid value has been assigned to it. + explicit Matcher() {} // NOLINT + + // Constructs a matcher from its implementation. + explicit Matcher(const MatcherInterface* impl) + : internal::MatcherBase(impl) {} + + template + explicit Matcher(const MatcherInterface* impl, + typename internal::EnableIf::value>::type* = NULL) + : internal::MatcherBase(impl) {} + + // Implicit constructor here allows people to write + // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes + Matcher(T value); // NOLINT +}; + +// The following two specializations allow the user to write str +// instead of Eq(str) and "foo" instead of Eq("foo") when a std::string +// matcher is expected. +template <> +class GTEST_API_ Matcher + : public internal::MatcherBase { + public: + Matcher() {} + + explicit Matcher(const MatcherInterface* impl) + : internal::MatcherBase(impl) {} + + // Allows the user to write str instead of Eq(str) sometimes, where + // str is a std::string object. + Matcher(const std::string& s); // NOLINT + +#if GTEST_HAS_GLOBAL_STRING + // Allows the user to write str instead of Eq(str) sometimes, where + // str is a ::string object. + Matcher(const ::string& s); // NOLINT +#endif // GTEST_HAS_GLOBAL_STRING + + // Allows the user to write "foo" instead of Eq("foo") sometimes. + Matcher(const char* s); // NOLINT +}; + +template <> +class GTEST_API_ Matcher + : public internal::MatcherBase { + public: + Matcher() {} + + explicit Matcher(const MatcherInterface* impl) + : internal::MatcherBase(impl) {} + + // Allows the user to write str instead of Eq(str) sometimes, where + // str is a string object. + Matcher(const std::string& s); // NOLINT + +#if GTEST_HAS_GLOBAL_STRING + // Allows the user to write str instead of Eq(str) sometimes, where + // str is a ::string object. + Matcher(const ::string& s); // NOLINT +#endif // GTEST_HAS_GLOBAL_STRING + + // Allows the user to write "foo" instead of Eq("foo") sometimes. + Matcher(const char* s); // NOLINT +}; + +#if GTEST_HAS_GLOBAL_STRING +// The following two specializations allow the user to write str +// instead of Eq(str) and "foo" instead of Eq("foo") when a ::string +// matcher is expected. +template <> +class GTEST_API_ Matcher + : public internal::MatcherBase { + public: + Matcher() {} + + explicit Matcher(const MatcherInterface* impl) + : internal::MatcherBase(impl) {} + + // Allows the user to write str instead of Eq(str) sometimes, where + // str is a std::string object. + Matcher(const std::string& s); // NOLINT + + // Allows the user to write str instead of Eq(str) sometimes, where + // str is a ::string object. + Matcher(const ::string& s); // NOLINT + + // Allows the user to write "foo" instead of Eq("foo") sometimes. + Matcher(const char* s); // NOLINT +}; + +}; + +template <> +class GTEST_API_ Matcher + : public internal::MatcherBase { + public: + Matcher() {} + + explicit Matcher(const MatcherInterface* impl) + : internal::MatcherBase(impl) {} + + // Allows the user to write str instead of Eq(str) sometimes, where + // str is a string object. + Matcher(const internal::string& s); // NOLINT + + // Allows the user to write "foo" instead of Eq("foo") sometimes. + Matcher(const char* s); // NOLINT + + // Allows the user to pass StringPieces directly. + Matcher(StringPiece s); // NOLINT +}; +#endif // GTEST_HAS_STRING_PIECE_ + +// The PolymorphicMatcher class template makes it easy to implement a +// polymorphic matcher (i.e. a matcher that can match values of more +// than one type, e.g. Eq(n) and NotNull()). +// +// To define a polymorphic matcher, a user should provide an Impl +// class that has a DescribeTo() method and a DescribeNegationTo() +// method, and define a member function (or member function template) +// +// bool MatchAndExplain(const Value& value, +// MatchResultListener* listener) const; +// +// See the definition of NotNull() for a complete example. +template +class PolymorphicMatcher { + public: + explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} + + // Returns a mutable reference to the underlying matcher + // implementation object. + Impl& mutable_impl() { return impl_; } + + // Returns an immutable reference to the underlying matcher + // implementation object. + const Impl& impl() const { return impl_; } + + template + operator Matcher() const { + return Matcher(new MonomorphicImpl(impl_)); + } + + private: + template + class MonomorphicImpl : public MatcherInterface { + public: + explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} + + virtual void DescribeTo(::std::ostream* os) const { + impl_.DescribeTo(os); + } + + virtual void DescribeNegationTo(::std::ostream* os) const { + impl_.DescribeNegationTo(os); + } + + virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { + return impl_.MatchAndExplain(x, listener); + } + + private: + const Impl impl_; + + GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); + }; + + Impl impl_; + + GTEST_DISALLOW_ASSIGN_(PolymorphicMatcher); +}; + +// Creates a matcher from its implementation. This is easier to use +// than the Matcher constructor as it doesn't require you to +// explicitly write the template argument, e.g. +// +// MakeMatcher(foo); +// vs +// Matcher(foo); +template +inline Matcher MakeMatcher(const MatcherInterface* impl) { + return Matcher(impl); +} + +// Creates a polymorphic matcher from its implementation. This is +// easier to use than the PolymorphicMatcher constructor as it +// doesn't require you to explicitly write the template argument, e.g. +// +// MakePolymorphicMatcher(foo); +// vs +// PolymorphicMatcher(foo); +template +inline PolymorphicMatcher MakePolymorphicMatcher(const Impl& impl) { + return PolymorphicMatcher(impl); +} + +// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION +// and MUST NOT BE USED IN USER CODE!!! +namespace internal { + +// The MatcherCastImpl class template is a helper for implementing +// MatcherCast(). We need this helper in order to partially +// specialize the implementation of MatcherCast() (C++ allows +// class/struct templates to be partially specialized, but not +// function templates.). + +// This general version is used when MatcherCast()'s argument is a +// polymorphic matcher (i.e. something that can be converted to a +// Matcher but is not one yet; for example, Eq(value)) or a value (for +// example, "hello"). +template +class MatcherCastImpl { + public: + static Matcher Cast(const M& polymorphic_matcher_or_value) { + // M can be a polymorphic matcher, in which case we want to use + // its conversion operator to create Matcher. Or it can be a value + // that should be passed to the Matcher's constructor. + // + // We can't call Matcher(polymorphic_matcher_or_value) when M is a + // polymorphic matcher because it'll be ambiguous if T has an implicit + // constructor from M (this usually happens when T has an implicit + // constructor from any type). + // + // It won't work to unconditionally implict_cast + // polymorphic_matcher_or_value to Matcher because it won't trigger + // a user-defined conversion from M to T if one exists (assuming M is + // a value). + return CastImpl( + polymorphic_matcher_or_value, + BooleanConstant< + internal::ImplicitlyConvertible >::value>(), + BooleanConstant< + internal::ImplicitlyConvertible::value>()); + } + + private: + template + static Matcher CastImpl(const M& polymorphic_matcher_or_value, + BooleanConstant /* convertible_to_matcher */, + BooleanConstant) { + // M is implicitly convertible to Matcher, which means that either + // M is a polymorphic matcher or Matcher has an implicit constructor + // from M. In both cases using the implicit conversion will produce a + // matcher. + // + // Even if T has an implicit constructor from M, it won't be called because + // creating Matcher would require a chain of two user-defined conversions + // (first to create T from M and then to create Matcher from T). + return polymorphic_matcher_or_value; + } + + // M can't be implicitly converted to Matcher, so M isn't a polymorphic + // matcher. It's a value of a type implicitly convertible to T. Use direct + // initialization to create a matcher. + static Matcher CastImpl( + const M& value, BooleanConstant /* convertible_to_matcher */, + BooleanConstant /* convertible_to_T */) { + return Matcher(ImplicitCast_(value)); + } + + // M can't be implicitly converted to either Matcher or T. Attempt to use + // polymorphic matcher Eq(value) in this case. + // + // Note that we first attempt to perform an implicit cast on the value and + // only fall back to the polymorphic Eq() matcher afterwards because the + // latter calls bool operator==(const Lhs& lhs, const Rhs& rhs) in the end + // which might be undefined even when Rhs is implicitly convertible to Lhs + // (e.g. std::pair vs. std::pair). + // + // We don't define this method inline as we need the declaration of Eq(). + static Matcher CastImpl( + const M& value, BooleanConstant /* convertible_to_matcher */, + BooleanConstant /* convertible_to_T */); +}; + +// This more specialized version is used when MatcherCast()'s argument +// is already a Matcher. This only compiles when type T can be +// statically converted to type U. +template +class MatcherCastImpl > { + public: + static Matcher Cast(const Matcher& source_matcher) { + return Matcher(new Impl(source_matcher)); + } + + private: + class Impl : public MatcherInterface { + public: + explicit Impl(const Matcher& source_matcher) + : source_matcher_(source_matcher) {} + + // We delegate the matching logic to the source matcher. + virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { +#if GTEST_LANG_CXX11 + using FromType = typename std::remove_cv::type>::type>::type; + using ToType = typename std::remove_cv::type>::type>::type; + // Do not allow implicitly converting base*/& to derived*/&. + static_assert( + // Do not trigger if only one of them is a pointer. That implies a + // regular conversion and not a down_cast. + (std::is_pointer::type>::value != + std::is_pointer::type>::value) || + std::is_same::value || + !std::is_base_of::value, + "Can't implicitly convert from to "); +#endif // GTEST_LANG_CXX11 + + return source_matcher_.MatchAndExplain(static_cast(x), listener); + } + + virtual void DescribeTo(::std::ostream* os) const { + source_matcher_.DescribeTo(os); + } + + virtual void DescribeNegationTo(::std::ostream* os) const { + source_matcher_.DescribeNegationTo(os); + } + + private: + const Matcher source_matcher_; + + GTEST_DISALLOW_ASSIGN_(Impl); + }; +}; + +// This even more specialized version is used for efficiently casting +// a matcher to its own type. +template +class MatcherCastImpl > { + public: + static Matcher Cast(const Matcher& matcher) { return matcher; } +}; + +} // namespace internal + +// In order to be safe and clear, casting between different matcher +// types is done explicitly via MatcherCast(m), which takes a +// matcher m and returns a Matcher. It compiles only when T can be +// statically converted to the argument type of m. +template +inline Matcher MatcherCast(const M& matcher) { + return internal::MatcherCastImpl::Cast(matcher); +} + +// Implements SafeMatcherCast(). +// +// We use an intermediate class to do the actual safe casting as Nokia's +// Symbian compiler cannot decide between +// template ... (M) and +// template ... (const Matcher&) +// for function templates but can for member function templates. +template +class SafeMatcherCastImpl { + public: + // This overload handles polymorphic matchers and values only since + // monomorphic matchers are handled by the next one. + template + static inline Matcher Cast(const M& polymorphic_matcher_or_value) { + return internal::MatcherCastImpl::Cast(polymorphic_matcher_or_value); + } + + // This overload handles monomorphic matchers. + // + // In general, if type T can be implicitly converted to type U, we can + // safely convert a Matcher to a Matcher (i.e. Matcher is + // contravariant): just keep a copy of the original Matcher, convert the + // argument from type T to U, and then pass it to the underlying Matcher. + // The only exception is when U is a reference and T is not, as the + // underlying Matcher may be interested in the argument's address, which + // is not preserved in the conversion from T to U. + template + static inline Matcher Cast(const Matcher& matcher) { + // Enforce that T can be implicitly converted to U. + GTEST_COMPILE_ASSERT_((internal::ImplicitlyConvertible::value), + T_must_be_implicitly_convertible_to_U); + // Enforce that we are not converting a non-reference type T to a reference + // type U. + GTEST_COMPILE_ASSERT_( + internal::is_reference::value || !internal::is_reference::value, + cannot_convert_non_reference_arg_to_reference); + // In case both T and U are arithmetic types, enforce that the + // conversion is not lossy. + typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T) RawT; + typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U) RawU; + const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther; + const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther; + GTEST_COMPILE_ASSERT_( + kTIsOther || kUIsOther || + (internal::LosslessArithmeticConvertible::value), + conversion_of_arithmetic_types_must_be_lossless); + return MatcherCast(matcher); + } +}; + +template +inline Matcher SafeMatcherCast(const M& polymorphic_matcher) { + return SafeMatcherCastImpl::Cast(polymorphic_matcher); +} + +// A() returns a matcher that matches any value of type T. +template +Matcher A(); + +// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION +// and MUST NOT BE USED IN USER CODE!!! +namespace internal { + +// If the explanation is not empty, prints it to the ostream. +inline void PrintIfNotEmpty(const std::string& explanation, + ::std::ostream* os) { + if (explanation != "" && os != NULL) { + *os << ", " << explanation; + } +} + +// Returns true if the given type name is easy to read by a human. +// This is used to decide whether printing the type of a value might +// be helpful. +inline bool IsReadableTypeName(const std::string& type_name) { + // We consider a type name readable if it's short or doesn't contain + // a template or function type. + return (type_name.length() <= 20 || + type_name.find_first_of("<(") == std::string::npos); +} + +// Matches the value against the given matcher, prints the value and explains +// the match result to the listener. Returns the match result. +// 'listener' must not be NULL. +// Value cannot be passed by const reference, because some matchers take a +// non-const argument. +template +bool MatchPrintAndExplain(Value& value, const Matcher& matcher, + MatchResultListener* listener) { + if (!listener->IsInterested()) { + // If the listener is not interested, we do not need to construct the + // inner explanation. + return matcher.Matches(value); + } + + StringMatchResultListener inner_listener; + const bool match = matcher.MatchAndExplain(value, &inner_listener); + + UniversalPrint(value, listener->stream()); +#if GTEST_HAS_RTTI + const std::string& type_name = GetTypeName(); + if (IsReadableTypeName(type_name)) + *listener->stream() << " (of type " << type_name << ")"; +#endif + PrintIfNotEmpty(inner_listener.str(), listener->stream()); + + return match; +} + +// An internal helper class for doing compile-time loop on a tuple's +// fields. +template +class TuplePrefix { + public: + // TuplePrefix::Matches(matcher_tuple, value_tuple) returns true + // iff the first N fields of matcher_tuple matches the first N + // fields of value_tuple, respectively. + template + static bool Matches(const MatcherTuple& matcher_tuple, + const ValueTuple& value_tuple) { + return TuplePrefix::Matches(matcher_tuple, value_tuple) + && get(matcher_tuple).Matches(get(value_tuple)); + } + + // TuplePrefix::ExplainMatchFailuresTo(matchers, values, os) + // describes failures in matching the first N fields of matchers + // against the first N fields of values. If there is no failure, + // nothing will be streamed to os. + template + static void ExplainMatchFailuresTo(const MatcherTuple& matchers, + const ValueTuple& values, + ::std::ostream* os) { + // First, describes failures in the first N - 1 fields. + TuplePrefix::ExplainMatchFailuresTo(matchers, values, os); + + // Then describes the failure (if any) in the (N - 1)-th (0-based) + // field. + typename tuple_element::type matcher = + get(matchers); + typedef typename tuple_element::type Value; + Value value = get(values); + StringMatchResultListener listener; + if (!matcher.MatchAndExplain(value, &listener)) { + // TODO(wan): include in the message the name of the parameter + // as used in MOCK_METHOD*() when possible. + *os << " Expected arg #" << N - 1 << ": "; + get(matchers).DescribeTo(os); + *os << "\n Actual: "; + // We remove the reference in type Value to prevent the + // universal printer from printing the address of value, which + // isn't interesting to the user most of the time. The + // matcher's MatchAndExplain() method handles the case when + // the address is interesting. + internal::UniversalPrint(value, os); + PrintIfNotEmpty(listener.str(), os); + *os << "\n"; + } + } +}; + +// The base case. +template <> +class TuplePrefix<0> { + public: + template + static bool Matches(const MatcherTuple& /* matcher_tuple */, + const ValueTuple& /* value_tuple */) { + return true; + } + + template + static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */, + const ValueTuple& /* values */, + ::std::ostream* /* os */) {} +}; + +// TupleMatches(matcher_tuple, value_tuple) returns true iff all +// matchers in matcher_tuple match the corresponding fields in +// value_tuple. It is a compiler error if matcher_tuple and +// value_tuple have different number of fields or incompatible field +// types. +template +bool TupleMatches(const MatcherTuple& matcher_tuple, + const ValueTuple& value_tuple) { + // Makes sure that matcher_tuple and value_tuple have the same + // number of fields. + GTEST_COMPILE_ASSERT_(tuple_size::value == + tuple_size::value, + matcher_and_value_have_different_numbers_of_fields); + return TuplePrefix::value>:: + Matches(matcher_tuple, value_tuple); +} + +// Describes failures in matching matchers against values. If there +// is no failure, nothing will be streamed to os. +template +void ExplainMatchFailureTupleTo(const MatcherTuple& matchers, + const ValueTuple& values, + ::std::ostream* os) { + TuplePrefix::value>::ExplainMatchFailuresTo( + matchers, values, os); +} + +// TransformTupleValues and its helper. +// +// TransformTupleValuesHelper hides the internal machinery that +// TransformTupleValues uses to implement a tuple traversal. +template +class TransformTupleValuesHelper { + private: + typedef ::testing::tuple_size TupleSize; + + public: + // For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'. + // Returns the final value of 'out' in case the caller needs it. + static OutIter Run(Func f, const Tuple& t, OutIter out) { + return IterateOverTuple()(f, t, out); + } + + private: + template + struct IterateOverTuple { + OutIter operator() (Func f, const Tup& t, OutIter out) const { + *out++ = f(::testing::get(t)); + return IterateOverTuple()(f, t, out); + } + }; + template + struct IterateOverTuple { + OutIter operator() (Func /* f */, const Tup& /* t */, OutIter out) const { + return out; + } + }; +}; + +// Successively invokes 'f(element)' on each element of the tuple 't', +// appending each result to the 'out' iterator. Returns the final value +// of 'out'. +template +OutIter TransformTupleValues(Func f, const Tuple& t, OutIter out) { + return TransformTupleValuesHelper::Run(f, t, out); +} + +// Implements A(). +template +class AnyMatcherImpl : public MatcherInterface { + public: + virtual bool MatchAndExplain( + T /* x */, MatchResultListener* /* listener */) const { return true; } + virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; } + virtual void DescribeNegationTo(::std::ostream* os) const { + // This is mostly for completeness' safe, as it's not very useful + // to write Not(A()). However we cannot completely rule out + // such a possibility, and it doesn't hurt to be prepared. + *os << "never matches"; + } +}; + +// Implements _, a matcher that matches any value of any +// type. This is a polymorphic matcher, so we need a template type +// conversion operator to make it appearing as a Matcher for any +// type T. +class AnythingMatcher { + public: + template + operator Matcher() const { return A(); } +}; + +// Implements a matcher that compares a given value with a +// pre-supplied value using one of the ==, <=, <, etc, operators. The +// two values being compared don't have to have the same type. +// +// The matcher defined here is polymorphic (for example, Eq(5) can be +// used to match an int, a short, a double, etc). Therefore we use +// a template type conversion operator in the implementation. +// +// The following template definition assumes that the Rhs parameter is +// a "bare" type (i.e. neither 'const T' nor 'T&'). +template +class ComparisonBase { + public: + explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {} + template + operator Matcher() const { + return MakeMatcher(new Impl(rhs_)); + } + + private: + template + class Impl : public MatcherInterface { + public: + explicit Impl(const Rhs& rhs) : rhs_(rhs) {} + virtual bool MatchAndExplain( + Lhs lhs, MatchResultListener* /* listener */) const { + return Op()(lhs, rhs_); + } + virtual void DescribeTo(::std::ostream* os) const { + *os << D::Desc() << " "; + UniversalPrint(rhs_, os); + } + virtual void DescribeNegationTo(::std::ostream* os) const { + *os << D::NegatedDesc() << " "; + UniversalPrint(rhs_, os); + } + private: + Rhs rhs_; + GTEST_DISALLOW_ASSIGN_(Impl); + }; + Rhs rhs_; + GTEST_DISALLOW_ASSIGN_(ComparisonBase); +}; + +template +class EqMatcher : public ComparisonBase, Rhs, AnyEq> { + public: + explicit EqMatcher(const Rhs& rhs) + : ComparisonBase, Rhs, AnyEq>(rhs) { } + static const char* Desc() { return "is equal to"; } + static const char* NegatedDesc() { return "isn't equal to"; } +}; +template +class NeMatcher : public ComparisonBase, Rhs, AnyNe> { + public: + explicit NeMatcher(const Rhs& rhs) + : ComparisonBase, Rhs, AnyNe>(rhs) { } + static const char* Desc() { return "isn't equal to"; } + static const char* NegatedDesc() { return "is equal to"; } +}; +template +class LtMatcher : public ComparisonBase, Rhs, AnyLt> { + public: + explicit LtMatcher(const Rhs& rhs) + : ComparisonBase, Rhs, AnyLt>(rhs) { } + static const char* Desc() { return "is <"; } + static const char* NegatedDesc() { return "isn't <"; } +}; +template +class GtMatcher : public ComparisonBase, Rhs, AnyGt> { + public: + explicit GtMatcher(const Rhs& rhs) + : ComparisonBase, Rhs, AnyGt>(rhs) { } + static const char* Desc() { return "is >"; } + static const char* NegatedDesc() { return "isn't >"; } +}; +template +class LeMatcher : public ComparisonBase, Rhs, AnyLe> { + public: + explicit LeMatcher(const Rhs& rhs) + : ComparisonBase, Rhs, AnyLe>(rhs) { } + static const char* Desc() { return "is <="; } + static const char* NegatedDesc() { return "isn't <="; } +}; +template +class GeMatcher : public ComparisonBase, Rhs, AnyGe> { + public: + explicit GeMatcher(const Rhs& rhs) + : ComparisonBase, Rhs, AnyGe>(rhs) { } + static const char* Desc() { return "is >="; } + static const char* NegatedDesc() { return "isn't >="; } +}; + +// Implements the polymorphic IsNull() matcher, which matches any raw or smart +// pointer that is NULL. +class IsNullMatcher { + public: + template + bool MatchAndExplain(const Pointer& p, + MatchResultListener* /* listener */) const { +#if GTEST_LANG_CXX11 + return p == nullptr; +#else // GTEST_LANG_CXX11 + return GetRawPointer(p) == NULL; +#endif // GTEST_LANG_CXX11 + } + + void DescribeTo(::std::ostream* os) const { *os << "is NULL"; } + void DescribeNegationTo(::std::ostream* os) const { + *os << "isn't NULL"; + } +}; + +// Implements the polymorphic NotNull() matcher, which matches any raw or smart +// pointer that is not NULL. +class NotNullMatcher { + public: + template + bool MatchAndExplain(const Pointer& p, + MatchResultListener* /* listener */) const { +#if GTEST_LANG_CXX11 + return p != nullptr; +#else // GTEST_LANG_CXX11 + return GetRawPointer(p) != NULL; +#endif // GTEST_LANG_CXX11 + } + + void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; } + void DescribeNegationTo(::std::ostream* os) const { + *os << "is NULL"; + } +}; + +// Ref(variable) matches any argument that is a reference to +// 'variable'. This matcher is polymorphic as it can match any +// super type of the type of 'variable'. +// +// The RefMatcher template class implements Ref(variable). It can +// only be instantiated with a reference type. This prevents a user +// from mistakenly using Ref(x) to match a non-reference function +// argument. For example, the following will righteously cause a +// compiler error: +// +// int n; +// Matcher m1 = Ref(n); // This won't compile. +// Matcher m2 = Ref(n); // This will compile. +template +class RefMatcher; + +template +class RefMatcher { + // Google Mock is a generic framework and thus needs to support + // mocking any function types, including those that take non-const + // reference arguments. Therefore the template parameter T (and + // Super below) can be instantiated to either a const type or a + // non-const type. + public: + // RefMatcher() takes a T& instead of const T&, as we want the + // compiler to catch using Ref(const_value) as a matcher for a + // non-const reference. + explicit RefMatcher(T& x) : object_(x) {} // NOLINT + + template + operator Matcher() const { + // By passing object_ (type T&) to Impl(), which expects a Super&, + // we make sure that Super is a super type of T. In particular, + // this catches using Ref(const_value) as a matcher for a + // non-const reference, as you cannot implicitly convert a const + // reference to a non-const reference. + return MakeMatcher(new Impl(object_)); + } + + private: + template + class Impl : public MatcherInterface { + public: + explicit Impl(Super& x) : object_(x) {} // NOLINT + + // MatchAndExplain() takes a Super& (as opposed to const Super&) + // in order to match the interface MatcherInterface. + virtual bool MatchAndExplain( + Super& x, MatchResultListener* listener) const { + *listener << "which is located @" << static_cast(&x); + return &x == &object_; + } + + virtual void DescribeTo(::std::ostream* os) const { + *os << "references the variable "; + UniversalPrinter::Print(object_, os); + } + + virtual void DescribeNegationTo(::std::ostream* os) const { + *os << "does not reference the variable "; + UniversalPrinter::Print(object_, os); + } + + private: + const Super& object_; + + GTEST_DISALLOW_ASSIGN_(Impl); + }; + + T& object_; + + GTEST_DISALLOW_ASSIGN_(RefMatcher); +}; + +// Polymorphic helper functions for narrow and wide string matchers. +inline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) { + return String::CaseInsensitiveCStringEquals(lhs, rhs); +} + +inline bool CaseInsensitiveCStringEquals(const wchar_t* lhs, + const wchar_t* rhs) { + return String::CaseInsensitiveWideCStringEquals(lhs, rhs); +} + +// String comparison for narrow or wide strings that can have embedded NUL +// characters. +template +bool CaseInsensitiveStringEquals(const StringType& s1, + const StringType& s2) { + // Are the heads equal? + if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) { + return false; + } + + // Skip the equal heads. + const typename StringType::value_type nul = 0; + const size_t i1 = s1.find(nul), i2 = s2.find(nul); + + // Are we at the end of either s1 or s2? + if (i1 == StringType::npos || i2 == StringType::npos) { + return i1 == i2; + } + + // Are the tails equal? + return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1)); +} + +// String matchers. + +// Implements equality-based string matchers like StrEq, StrCaseNe, and etc. +template +class StrEqualityMatcher { + public: + StrEqualityMatcher(const StringType& str, bool expect_eq, + bool case_sensitive) + : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {} + + // Accepts pointer types, particularly: + // const char* + // char* + // const wchar_t* + // wchar_t* + template + bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { + if (s == NULL) { + return !expect_eq_; + } + return MatchAndExplain(StringType(s), listener); + } + + // Matches anything that can convert to StringType. + // + // This is a template, not just a plain function with const StringType&, + // because StringPiece has some interfering non-explicit constructors. + template + bool MatchAndExplain(const MatcheeStringType& s, + MatchResultListener* /* listener */) const { + const StringType& s2(s); + const bool eq = case_sensitive_ ? s2 == string_ : + CaseInsensitiveStringEquals(s2, string_); + return expect_eq_ == eq; + } + + void DescribeTo(::std::ostream* os) const { + DescribeToHelper(expect_eq_, os); + } + + void DescribeNegationTo(::std::ostream* os) const { + DescribeToHelper(!expect_eq_, os); + } + + private: + void DescribeToHelper(bool expect_eq, ::std::ostream* os) const { + *os << (expect_eq ? "is " : "isn't "); + *os << "equal to "; + if (!case_sensitive_) { + *os << "(ignoring case) "; + } + UniversalPrint(string_, os); + } + + const StringType string_; + const bool expect_eq_; + const bool case_sensitive_; + + GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher); +}; + +// Implements the polymorphic HasSubstr(substring) matcher, which +// can be used as a Matcher as long as T can be converted to a +// string. +template +class HasSubstrMatcher { + public: + explicit HasSubstrMatcher(const StringType& substring) + : substring_(substring) {} + + // Accepts pointer types, particularly: + // const char* + // char* + // const wchar_t* + // wchar_t* + template + bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { + return s != NULL && MatchAndExplain(StringType(s), listener); + } + + // Matches anything that can convert to StringType. + // + // This is a template, not just a plain function with const StringType&, + // because StringPiece has some interfering non-explicit constructors. + template + bool MatchAndExplain(const MatcheeStringType& s, + MatchResultListener* /* listener */) const { + const StringType& s2(s); + return s2.find(substring_) != StringType::npos; + } + + // Describes what this matcher matches. + void DescribeTo(::std::ostream* os) const { + *os << "has substring "; + UniversalPrint(substring_, os); + } + + void DescribeNegationTo(::std::ostream* os) const { + *os << "has no substring "; + UniversalPrint(substring_, os); + } + + private: + const StringType substring_; + + GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher); +}; + +// Implements the polymorphic StartsWith(substring) matcher, which +// can be used as a Matcher as long as T can be converted to a +// string. +template +class StartsWithMatcher { + public: + explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) { + } + + // Accepts pointer types, particularly: + // const char* + // char* + // const wchar_t* + // wchar_t* + template + bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { + return s != NULL && MatchAndExplain(StringType(s), listener); + } + + // Matches anything that can convert to StringType. + // + // This is a template, not just a plain function with const StringType&, + // because StringPiece has some interfering non-explicit constructors. + template + bool MatchAndExplain(const MatcheeStringType& s, + MatchResultListener* /* listener */) const { + const StringType& s2(s); + return s2.length() >= prefix_.length() && + s2.substr(0, prefix_.length()) == prefix_; + } + + void DescribeTo(::std::ostream* os) const { + *os << "starts with "; + UniversalPrint(prefix_, os); + } + + void DescribeNegationTo(::std::ostream* os) const { + *os << "doesn't start with "; + UniversalPrint(prefix_, os); + } + + private: + const StringType prefix_; + + GTEST_DISALLOW_ASSIGN_(StartsWithMatcher); +}; + +// Implements the polymorphic EndsWith(substring) matcher, which +// can be used as a Matcher as long as T can be converted to a +// string. +template +class EndsWithMatcher { + public: + explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {} + + // Accepts pointer types, particularly: + // const char* + // char* + // const wchar_t* + // wchar_t* + template + bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { + return s != NULL && MatchAndExplain(StringType(s), listener); + } + + // Matches anything that can convert to StringType. + // + // This is a template, not just a plain function with const StringType&, + // because StringPiece has some interfering non-explicit constructors. + template + bool MatchAndExplain(const MatcheeStringType& s, + MatchResultListener* /* listener */) const { + const StringType& s2(s); + return s2.length() >= suffix_.length() && + s2.substr(s2.length() - suffix_.length()) == suffix_; + } + + void DescribeTo(::std::ostream* os) const { + *os << "ends with "; + UniversalPrint(suffix_, os); + } + + void DescribeNegationTo(::std::ostream* os) const { + *os << "doesn't end with "; + UniversalPrint(suffix_, os); + } + + private: + const StringType suffix_; + + GTEST_DISALLOW_ASSIGN_(EndsWithMatcher); +}; + +// Implements polymorphic matchers MatchesRegex(regex) and +// ContainsRegex(regex), which can be used as a Matcher as long as +// T can be converted to a string. +class MatchesRegexMatcher { + public: + MatchesRegexMatcher(const RE* regex, bool full_match) + : regex_(regex), full_match_(full_match) {} + + // Accepts pointer types, particularly: + // const char* + // char* + // const wchar_t* + // wchar_t* + template + bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { + return s != NULL && MatchAndExplain(std::string(s), listener); + } + + // Matches anything that can convert to std::string. + // + // This is a template, not just a plain function with const std::string&, + // because absl::string_view has some interfering non-explicit constructors. + template + bool MatchAndExplain(const MatcheeStringType& s, + MatchResultListener* /* listener */) const { + const std::string& s2(s); + return full_match_ ? RE::FullMatch(s2, *regex_) : + RE::PartialMatch(s2, *regex_); + } + + void DescribeTo(::std::ostream* os) const { + *os << (full_match_ ? "matches" : "contains") + << " regular expression "; + UniversalPrinter::Print(regex_->pattern(), os); + } + + void DescribeNegationTo(::std::ostream* os) const { + *os << "doesn't " << (full_match_ ? "match" : "contain") + << " regular expression "; + UniversalPrinter::Print(regex_->pattern(), os); + } + + private: + const internal::linked_ptr regex_; + const bool full_match_; + + GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher); +}; + +// Implements a matcher that compares the two fields of a 2-tuple +// using one of the ==, <=, <, etc, operators. The two fields being +// compared don't have to have the same type. +// +// The matcher defined here is polymorphic (for example, Eq() can be +// used to match a tuple, a tuple, +// etc). Therefore we use a template type conversion operator in the +// implementation. +template +class PairMatchBase { + public: + template + operator Matcher< ::testing::tuple >() const { + return MakeMatcher(new Impl< ::testing::tuple >); + } + template + operator Matcher&>() const { + return MakeMatcher(new Impl&>); + } + + private: + static ::std::ostream& GetDesc(::std::ostream& os) { // NOLINT + return os << D::Desc(); + } + + template + class Impl : public MatcherInterface { + public: + virtual bool MatchAndExplain( + Tuple args, + MatchResultListener* /* listener */) const { + return Op()(::testing::get<0>(args), ::testing::get<1>(args)); + } + virtual void DescribeTo(::std::ostream* os) const { + *os << "are " << GetDesc; + } + virtual void DescribeNegationTo(::std::ostream* os) const { + *os << "aren't " << GetDesc; + } + }; +}; + +class Eq2Matcher : public PairMatchBase { + public: + static const char* Desc() { return "an equal pair"; } +}; +class Ne2Matcher : public PairMatchBase { + public: + static const char* Desc() { return "an unequal pair"; } +}; +class Lt2Matcher : public PairMatchBase { + public: + static const char* Desc() { return "a pair where the first < the second"; } +}; +class Gt2Matcher : public PairMatchBase { + public: + static const char* Desc() { return "a pair where the first > the second"; } +}; +class Le2Matcher : public PairMatchBase { + public: + static const char* Desc() { return "a pair where the first <= the second"; } +}; +class Ge2Matcher : public PairMatchBase { + public: + static const char* Desc() { return "a pair where the first >= the second"; } +}; + +// Implements the Not(...) matcher for a particular argument type T. +// We do not nest it inside the NotMatcher class template, as that +// will prevent different instantiations of NotMatcher from sharing +// the same NotMatcherImpl class. +template +class NotMatcherImpl : public MatcherInterface { + public: + explicit NotMatcherImpl(const Matcher& matcher) + : matcher_(matcher) {} + + virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { + return !matcher_.MatchAndExplain(x, listener); + } + + virtual void DescribeTo(::std::ostream* os) const { + matcher_.DescribeNegationTo(os); + } + + virtual void DescribeNegationTo(::std::ostream* os) const { + matcher_.DescribeTo(os); + } + + private: + const Matcher matcher_; + + GTEST_DISALLOW_ASSIGN_(NotMatcherImpl); +}; + +// Implements the Not(m) matcher, which matches a value that doesn't +// match matcher m. +template +class NotMatcher { + public: + explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {} + + // This template type conversion operator allows Not(m) to be used + // to match any type m can match. + template + operator Matcher() const { + return Matcher(new NotMatcherImpl(SafeMatcherCast(matcher_))); + } + + private: + InnerMatcher matcher_; + + GTEST_DISALLOW_ASSIGN_(NotMatcher); +}; + +// Implements the AllOf(m1, m2) matcher for a particular argument type +// T. We do not nest it inside the BothOfMatcher class template, as +// that will prevent different instantiations of BothOfMatcher from +// sharing the same BothOfMatcherImpl class. +template +class BothOfMatcherImpl : public MatcherInterface { + public: + BothOfMatcherImpl(const Matcher& matcher1, const Matcher& matcher2) + : matcher1_(matcher1), matcher2_(matcher2) {} + + virtual void DescribeTo(::std::ostream* os) const { + *os << "("; + matcher1_.DescribeTo(os); + *os << ") and ("; + matcher2_.DescribeTo(os); + *os << ")"; + } + + virtual void DescribeNegationTo(::std::ostream* os) const { + *os << "("; + matcher1_.DescribeNegationTo(os); + *os << ") or ("; + matcher2_.DescribeNegationTo(os); + *os << ")"; + } + + virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { + // If either matcher1_ or matcher2_ doesn't match x, we only need + // to explain why one of them fails. + StringMatchResultListener listener1; + if (!matcher1_.MatchAndExplain(x, &listener1)) { + *listener << listener1.str(); + return false; + } + + StringMatchResultListener listener2; + if (!matcher2_.MatchAndExplain(x, &listener2)) { + *listener << listener2.str(); + return false; + } + + // Otherwise we need to explain why *both* of them match. + const std::string s1 = listener1.str(); + const std::string s2 = listener2.str(); + + if (s1 == "") { + *listener << s2; + } else { + *listener << s1; + if (s2 != "") { + *listener << ", and " << s2; + } + } + return true; + } + + private: + const Matcher matcher1_; + const Matcher matcher2_; + + GTEST_DISALLOW_ASSIGN_(BothOfMatcherImpl); +}; + +#if GTEST_LANG_CXX11 +// MatcherList provides mechanisms for storing a variable number of matchers in +// a list structure (ListType) and creating a combining matcher from such a +// list. +// The template is defined recursively using the following template parameters: +// * kSize is the length of the MatcherList. +// * Head is the type of the first matcher of the list. +// * Tail denotes the types of the remaining matchers of the list. +template +struct MatcherList { + typedef MatcherList MatcherListTail; + typedef ::std::pair ListType; + + // BuildList stores variadic type values in a nested pair structure. + // Example: + // MatcherList<3, int, string, float>::BuildList(5, "foo", 2.0) will return + // the corresponding result of type pair>. + static ListType BuildList(const Head& matcher, const Tail&... tail) { + return ListType(matcher, MatcherListTail::BuildList(tail...)); + } + + // CreateMatcher creates a Matcher from a given list of matchers (built + // by BuildList()). CombiningMatcher is used to combine the matchers of the + // list. CombiningMatcher must implement MatcherInterface and have a + // constructor taking two Matchers as input. + template class CombiningMatcher> + static Matcher CreateMatcher(const ListType& matchers) { + return Matcher(new CombiningMatcher( + SafeMatcherCast(matchers.first), + MatcherListTail::template CreateMatcher( + matchers.second))); + } +}; + +// The following defines the base case for the recursive definition of +// MatcherList. +template +struct MatcherList<2, Matcher1, Matcher2> { + typedef ::std::pair ListType; + + static ListType BuildList(const Matcher1& matcher1, + const Matcher2& matcher2) { + return ::std::pair(matcher1, matcher2); + } + + template class CombiningMatcher> + static Matcher CreateMatcher(const ListType& matchers) { + return Matcher(new CombiningMatcher( + SafeMatcherCast(matchers.first), + SafeMatcherCast(matchers.second))); + } +}; + +// VariadicMatcher is used for the variadic implementation of +// AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...). +// CombiningMatcher is used to recursively combine the provided matchers +// (of type Args...). +template